import asyncio import websockets import json clients = {} vars = {} async def handshake(ws,j): if not clients.get(j.get('project_id')): clients[j.get('project_id')] = {} clients[j.get('project_id')][j.get('user')] = ws print(f"{j.get('user')} connected from {ws.host}:{ws.port}") return(j.get('project_id'),j.get('user')) async def get_variables(websocket,project_id,user): for name,value in vars.get(project_id,{}).items(): if not name: continue await websocket.send(json.dumps({"method":"set","name":name,"value":value})) async def set_variable(project_id,user,var): if not vars.get(project_id,''): vars[project_id] = {} vars[project_id][var.get('name','')] = var.get('value','') data = json.dumps(var) for name,ws in clients.get(project_id,{}).items(): if name == user: continue print(f"> {name} - {data}") await ws.send(data) async def disconnect(project_id,user): print("disconnecting",user) clients.get(project_id,[]).pop(user) async def process(websocket, path): project_id = "" user = "" async for msg in websocket: print(f"< {user} - {msg}") try: data = json.loads(msg) method = data.get('method','') if method == 'handshake': project_id,user = await handshake(websocket,data) await get_variables(websocket,project_id,user) if method in ['set','create']: await set_variable(project_id,user,data) finally: pass await disconnect(project_id,user) start_server = websockets.serve(process, 'localhost', 5000, compression=None) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()