From f6b766715596aac55a1d347111591d80fa382ddf Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 23 Jun 2019 15:11:42 +0100 Subject: [PATCH] Reconnection logic --- chat.py | 17 +++++++++-------- ovlinfo.py | 17 +++++++++-------- setup.py | 2 +- syndicate/mini/core.py | 16 ++++++++++++++-- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/chat.py b/chat.py index 2e2f47c..3df4253 100644 --- a/chat.py +++ b/chat.py @@ -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() diff --git a/ovlinfo.py b/ovlinfo.py index f1e9c44..aa9d044 100644 --- a/ovlinfo.py +++ b/ovlinfo.py @@ -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() diff --git a/setup.py b/setup.py index c1d8040..f42cb96 100644 --- a/setup.py +++ b/setup.py @@ -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+)", diff --git a/syndicate/mini/core.py b/syndicate/mini/core.py index 7677f06..eb0cd94 100644 --- a/syndicate/mini/core.py +++ b/syndicate/mini/core.py @@ -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: