42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
import asyncio
|
|
import json
|
|
import websockets
|
|
|
|
SESSIONS = {}
|
|
|
|
async def handler(ws):
|
|
session_id = None
|
|
try:
|
|
async for msg in ws:
|
|
try:
|
|
data = json.loads(msg)
|
|
except Exception:
|
|
continue
|
|
t = data.get('type')
|
|
if t == 'join':
|
|
session_id = data.get('sessionId') or 'default'
|
|
SESSIONS.setdefault(session_id, set()).add(ws)
|
|
await ws.send(json.dumps({'type':'joined','sessionId':session_id}))
|
|
elif t == 'state':
|
|
sid = data.get('sessionId') or session_id or 'default'
|
|
payload = data.get('payload')
|
|
for peer in list(SESSIONS.get(sid, set())):
|
|
if peer is not ws:
|
|
try:
|
|
await peer.send(json.dumps({'type':'state','payload':payload}))
|
|
except Exception:
|
|
pass
|
|
elif t == 'ping':
|
|
await ws.send(json.dumps({'type':'pong'}))
|
|
finally:
|
|
if session_id and ws in SESSIONS.get(session_id, set()):
|
|
SESSIONS[session_id].discard(ws)
|
|
|
|
async def main():
|
|
print('Starting BLS relay on ws://0.0.0.0:8787')
|
|
async with websockets.serve(handler, '0.0.0.0', 8787, ping_interval=20, ping_timeout=20):
|
|
await asyncio.Future()
|
|
|
|
if __name__ == '__main__':
|
|
asyncio.run(main())
|