From d09a0b90e41edf04aa26f48eee2d770d076540f6 Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Sat, 11 Apr 2026 01:40:40 +0300 Subject: [PATCH] fix(ws): fetch status eagerly on new WebSocket connection Instead of waiting for the next poll cycle, new clients now get the current playback status immediately on connect by calling get_status_func if no cached status is available yet. --- media_server/services/websocket_manager.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/media_server/services/websocket_manager.py b/media_server/services/websocket_manager.py index a36280f..3e9518b 100644 --- a/media_server/services/websocket_manager.py +++ b/media_server/services/websocket_manager.py @@ -19,6 +19,7 @@ class ConnectionManager: self._active_connections: set[WebSocket] = set() self._lock = asyncio.Lock() self._last_status: dict[str, Any] | None = None + self._get_status_func: Callable[[], Coroutine[Any, Any, Any]] | None = None self._broadcast_task: asyncio.Task | None = None self._poll_interval: float = 0.5 # Internal poll interval for change detection self._position_broadcast_interval: float = 5.0 # Send position updates every 5s during playback @@ -39,9 +40,17 @@ class ConnectionManager: ) # Send current status immediately upon connection - if self._last_status: + status = self._last_status + if not status and self._get_status_func: try: - await websocket.send_json({"type": "status", "data": self._last_status}) + result = await self._get_status_func() + status = result.model_dump() + self._last_status = status + except Exception as e: + logger.debug("Failed to fetch initial status: %s", e) + if status: + try: + await websocket.send_json({"type": "status", "data": status}) except Exception as e: logger.debug("Failed to send initial status: %s", e) @@ -251,6 +260,7 @@ class ConnectionManager: if self._running: return + self._get_status_func = get_status_func self._running = True self._broadcast_task = asyncio.create_task( self._status_monitor_loop(get_status_func)