diff options
| author | 2021-12-30 09:51:00 +0100 | |
|---|---|---|
| committer | 2022-01-11 00:00:22 +0100 | |
| commit | bcb77d979d817e1e609adb4d007bbbcc3f61efbd (patch) | |
| tree | 093c5a2914ee0f6e1ec559b3b98725190fee7285 /ttun/pubsub.py | |
| download | client-bcb77d979d817e1e609adb4d007bbbcc3f61efbd.tar.gz client-bcb77d979d817e1e609adb4d007bbbcc3f61efbd.tar.bz2 client-bcb77d979d817e1e609adb4d007bbbcc3f61efbd.zip | |
Prepare for githubv1.0.0
Diffstat (limited to 'ttun/pubsub.py')
| -rw-r--r-- | ttun/pubsub.py | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/ttun/pubsub.py b/ttun/pubsub.py new file mode 100644 index 0000000..5d155ea --- /dev/null +++ b/ttun/pubsub.py | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | import asyncio | ||
| 2 | from contextlib import contextmanager | ||
| 3 | from typing import Any, Generator, Iterator | ||
| 4 | |||
| 5 | |||
| 6 | class PubSub: | ||
| 7 | _instance = None | ||
| 8 | |||
| 9 | def __init__(self): | ||
| 10 | self.queues: list[asyncio.Queue] = [] | ||
| 11 | |||
| 12 | @classmethod | ||
| 13 | def instance(cls) -> 'PubSub': | ||
| 14 | if cls._instance == None: | ||
| 15 | cls._instance = cls() | ||
| 16 | return cls._instance | ||
| 17 | |||
| 18 | @classmethod | ||
| 19 | @contextmanager | ||
| 20 | def subscribe(cls) -> Iterator[asyncio.Queue]: | ||
| 21 | queue = asyncio.Queue() | ||
| 22 | |||
| 23 | instance = cls.instance() | ||
| 24 | instance.queues.append(queue) | ||
| 25 | |||
| 26 | try: | ||
| 27 | yield queue | ||
| 28 | finally: | ||
| 29 | instance.queues.remove(queue) | ||
| 30 | del queue | ||
| 31 | |||
| 32 | @classmethod | ||
| 33 | async def publish(cls, msg: Any): | ||
| 34 | for queue in cls.instance().queues: | ||
| 35 | await queue.put(msg) | ||
