diff --git a/chat.py b/chat.py index f00031f..71ecd74 100644 --- a/chat.py +++ b/chat.py @@ -29,6 +29,8 @@ def main(): @syndicate.relay.connect(args.address, sturdy.SturdyRef.decode(syndicate.parse(args.cap))) def on_connected(ds): + turn.on_stop(lambda: turn.stop(root_facet)) + me = 'user_' + str(random.randint(10, 1000)) turn.publish(ds, Present(me)) @@ -48,4 +50,3 @@ def main(): await f.loop.connect_read_pipe(lambda: asyncio.StreamReaderProtocol(reader), sys.stdin) while line := (await reader.readline()).decode('utf-8'): turn.external(f, lambda: turn.send(ds, Says(me, line.strip()))) - turn.external(f, lambda: turn.stop(root_facet)) diff --git a/syndicate/actor.py b/syndicate/actor.py index ef15d8a..0e07327 100644 --- a/syndicate/actor.py +++ b/syndicate/actor.py @@ -251,15 +251,20 @@ class Facet: task.cancel() task = None async def guarded_task(): + should_terminate_facet = True try: - await coro_fn(self) + if await coro_fn(self) is True: + should_terminate_facet = False except asyncio.CancelledError: pass except: import traceback traceback.print_exc() finally: - Turn.external(self, cancel_linked_task) + if should_terminate_facet: + Turn.external(self, lambda: Turn.active.stop()) + else: + Turn.external(self, cancel_linked_task) task = self.loop.create_task(guarded_task()) self.linked_tasks.append(task)