import asyncio from ws.connection import IConnection import json class MsgIo: def __init__(self, key, send): self.key = key self.sender = send self.receiver = None def set_recv_handler(self, handler): self.receiver = handler async def on_recv(self, data): print("MessageHandler {}".format(data)) if self.receiver is not None: await self.receiver(data[self.key]) async def send(self, data): return await self.sender({self.key: data}) def can_key(self, key): return self.key == key def get_key(self): return self.key class Value: def __init__(self, initial=None): self.value = initial self.has_changed = True def set(self, value): self.has_changed = self.value != value self.value = value def is_changed(self): return self.has_changed def get(self): self.has_changed = False return self.value class MessageDispatcher(IConnection): def __init__(self): self.msg_handlers: MsgIo = [] self.state = None def msgio_get(self, key): obj = MsgIo(key, self.send) if key not in self.msg_handlers: self.msg_handlers.append(obj) return obj return None def on_connect(self, loop): self.state = asyncio.Queue(loop=loop) def on_disconnect(self): pass async def on_recv(self, data): d = json.loads(data) for key_req in d.keys(): for h in self.msg_handlers: if h.can_key(key_req): await h.on_recv(d) async def on_send(self): return await self.state.get() async def send(self, data): await self.state.put(data)