import asyncio from fastapi import APIRouter, WebSocket, WebSocketDisconnect from server.services.downloads import downloads from server.services.live import live from server.services.sessions import sessions router = APIRouter() def _payload() -> dict: profile = sessions.snapshot() return { "downloads": downloads.snapshot(), "profile": profile["profile"] if profile else None, } @router.websocket("/api/live") async def live_socket(websocket: WebSocket): await websocket.accept() seen = -1 try: while True: revision = await asyncio.to_thread(live.wait, seen, 20) if revision != seen: seen = revision await websocket.send_json(_payload()) else: await websocket.send_json({"type": "ping"}) except WebSocketDisconnect: return