aboutsummaryrefslogtreecommitdiffstats
path: root/ttun/pubsub.py
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2021-12-30 09:51:00 +0100
committerGravatar Tom van der Lee <tom@vanderlee.io>2022-01-11 00:00:22 +0100
commitbcb77d979d817e1e609adb4d007bbbcc3f61efbd (patch)
tree093c5a2914ee0f6e1ec559b3b98725190fee7285 /ttun/pubsub.py
downloadclient-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.py35
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 @@
1import asyncio
2from contextlib import contextmanager
3from typing import Any, Generator, Iterator
4
5
6class 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)