# Python subscription to CodeB Signal WebSocket events (ops dashboards). # European Digital Identity Wallet-enabled tenants use the same signalling. # [realtime-events-cookbook 2026-07-23] # pip install websockets # # Endpoint: wss:///signal.ashx?room=&name= # Server event names verified in signal.ashx (partial): # welcome, peer-joined, peer-left, mode-changed, ring, ring-cancelled, # ring-cleared, dial-result, office-call-result, office-call-answered, # office-call-timeout, office-registered, sfu-answer, # sfu-subscribe-answer, sfu-offer-failed, sfu-subscribe-failed, # signal, breakout-list, breakout-assigned, breakout-end, # breakout-rejected, knock, knock-pending, dup-ip-warning, denied, # pong, error. import asyncio, json, os import websockets TENANT_HOST = os.environ.get("CODEB_TENANT_HOST", "phone.example.tld") ROOM = os.environ.get("ROOM", "lobby") NAME = os.environ.get("NAME", "ops-dashboard") async def run(): backoff = 1.0 while True: url = f"wss://{TENANT_HOST}/signal.ashx?room={ROOM}&name={NAME}" try: async with websockets.connect(url, ping_interval=20, ping_timeout=20) as ws: backoff = 1.0 print("[ws] open") async for raw in ws: try: msg = json.loads(raw) except Exception: continue t = msg.get("type") if t == "welcome": print(f"[welcome] room={msg.get('room')} mode={msg.get('mode')}") elif t == "peer-joined": print("[peer-joined]", (msg.get("peer") or {}).get("name")) elif t == "peer-left": print("[peer-left]", (msg.get("peer") or {}).get("name")) elif t == "mode-changed": print("[mode-changed]", msg.get("mode")) elif t == "error": print("[server error]", msg.get("message")) else: print("[event]", t) except Exception as e: print(f"[ws] closed ({e}); retry in {backoff:.1f}s") await asyncio.sleep(backoff) backoff = min(30.0, backoff * 2) if __name__ == "__main__": asyncio.run(run())