34 lines
877 B
Python
34 lines
877 B
Python
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
|