import asyncio import json import logging import websockets clients = {} vars = {} logging.basicConfig( format="%(asctime)s %(message)s", level=logging.INFO ) async def handshake(ws,data): project_id = data.get('project_id','') user = data.get('user') logging.info(f"{project_id} new user connected from {ws.host}:{ws.port}") if not clients.get(project_id): clients[project_id] = [] clients[project_id].append(ws) await get_variables(ws,project_id,user) return (project_id,user) async def get_variables(ws,project_id,user): for name,value in vars.get(project_id,{}).items(): if not name: continue await ws.send(json.dumps({"method":"set","name":name,"value":value})) async def set_variable(project_id,var): if not vars.get(project_id,''): vars[project_id] = {} vars[project_id][var.get('name','')] = var.get('value','') websockets.broadcast(clients.get(project_id,[]),json.dumps(var)) async def disconnect(project_id,ws): logging.info(f"disconnecting {ws.host}:{ws.port}") clients.get(project_id,[]).remove(ws) async def handler(ws, path): project_id = "" user = "" async for msg in ws: logging.info(f"< {user} - {msg}") try: data = json.loads(msg) method = data.get('method','') if method == 'handshake': project_id,user = await handshake(ws,data) if method in ['set','create']: await set_variable(project_id,data) finally: pass await disconnect(project_id,ws) async def main(): async with websockets.serve(handler, "", 9080, compression=None): await asyncio.Future() # run forever if __name__ == "__main__": asyncio.run(main())