Reconnection logic

This commit is contained in:
Tony Garnock-Jones 2019-06-23 15:11:42 +01:00
parent ab54b0234f
commit f6b7667155
4 changed files with 33 additions and 19 deletions

17
chat.py
View File

@ -40,13 +40,14 @@ with conn.turn() as t:
S.Endpoint(t, S.Observe(Says(S.CAPTURE, S.CAPTURE)),
on_msg=lambda t, who, what: print(who, 'said', repr(what)))
async def reconnect(loop):
while conn:
did_connect = await conn.main(loop, on_connected=lambda: print('-'*50, 'Connected'))
if did_connect:
print('-'*50, 'Disconnected')
else:
await asyncio.sleep(2)
async def on_connected():
print('-'*50, 'Connected')
async def on_disconnected(did_connect):
if did_connect:
print('-'*50, 'Disconnected')
else:
await asyncio.sleep(2)
return bool(conn)
def accept_input():
global conn
@ -62,7 +63,7 @@ def accept_input():
loop = asyncio.get_event_loop()
loop.set_debug(True)
threading.Thread(target=accept_input, daemon=True).start()
loop.run_until_complete(reconnect(loop))
loop.run_until_complete(conn.reconnecting_main(loop, on_connected, on_disconnected))
loop.stop()
loop.run_forever()
loop.close()

View File

@ -23,17 +23,18 @@ with conn.turn() as t:
on_add=add_uplink,
on_del=del_uplink)
async def reconnect(loop):
while conn:
did_connect = await conn.main(loop, on_connected=lambda: print('-'*50, 'Connected'))
if did_connect:
print('-'*50, 'Disconnected')
else:
await asyncio.sleep(2)
async def on_connected():
print('-'*50, 'Connected')
async def on_disconnected(did_connect):
if did_connect:
print('-'*50, 'Disconnected')
else:
await asyncio.sleep(2)
return True
loop = asyncio.get_event_loop()
loop.set_debug(True)
loop.run_until_complete(reconnect(loop))
loop.run_until_complete(conn.reconnecting_main(loop, on_connected, on_disconnected))
loop.stop()
loop.run_forever()
loop.close()

View File

@ -5,7 +5,7 @@ except ImportError:
setup(
name="mini-syndicate",
version="0.0.2",
version="0.0.3",
author="Tony Garnock-Jones",
author_email="tonyg@leastfixedpoint.com",
license="GNU General Public License v3 or later (GPLv3+)",

View File

@ -206,6 +206,18 @@ class Connection(object):
def _disconnect(self):
raise Exception('subclassresponsibility')
async def reconnecting_main(self, loop, on_connected=None, on_disconnected=None):
should_run = True
while should_run:
did_connect = await self.main(loop, on_connected=on_connected)
if on_disconnected:
should_run = await on_disconnected(did_connect)
else:
if did_connect:
pass # Reconnect immediately
else:
asyncio.sleep(2)
@classmethod
def from_url(cls, s):
return url.connection_from_url(s)
@ -258,7 +270,7 @@ class _StreamConnection(Connection, asyncio.Protocol):
return False
try:
if on_connected: on_connected()
if on_connected: await on_connected()
await self.stop_signal
return True
finally:
@ -336,7 +348,7 @@ class WebsocketConnection(Connection):
try:
async with websockets.connect(self.url) as ws:
if on_connected: on_connected()
if on_connected: await on_connected()
self.ws = ws
self._on_connected()
try: