backnforth/server.py

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())