From f7a7e757371053c19ccf14dce27fa2ec25ebcb2c Mon Sep 17 00:00:00 2001 From: Adir Amsalem Date: Sat, 14 Mar 2026 16:42:03 +0200 Subject: [PATCH] fix: resolve pending Phase-2 waits on WebSocket disconnect Extract _resolve_pending_waits() from _handle_error() and also call it in _receive_messages() finally block so that WS disconnects during the initial-state phase surface immediately instead of timing out after 30s. --- decart/realtime/webrtc_connection.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/decart/realtime/webrtc_connection.py b/decart/realtime/webrtc_connection.py index 746d1f5..ecbf98d 100644 --- a/decart/realtime/webrtc_connection.py +++ b/decart/realtime/webrtc_connection.py @@ -285,7 +285,7 @@ async def _receive_messages(self) -> None: if self._on_error: self._on_error(e) finally: - # WS loop exited (clean close or error) — signal disconnected so manager can reconnect + self._resolve_pending_waits("WebSocket disconnected") await self._set_state("disconnected") async def _handle_message(self, data: dict) -> None: @@ -368,23 +368,24 @@ def _handle_set_image_ack(self, message: SetImageAckMessage) -> None: result["error"] = message.error event.set() - def _handle_error(self, message: ErrorMessage) -> None: - logger.error(f"Received error from server: {message.error}") - error = WebRTCError(message.error) - - # Fail-fast: resolve any pending Phase-2 waits so they surface the - # real server error instead of timing out after 30 s. + def _resolve_pending_waits(self, error_message: str) -> None: if self._pending_image_set: event, result = self._pending_image_set result["success"] = False - result["error"] = message.error + result["error"] = error_message event.set() for _prompt, (event, result) in list(self._pending_prompts.items()): result["success"] = False - result["error"] = message.error + result["error"] = error_message event.set() + def _handle_error(self, message: ErrorMessage) -> None: + logger.error(f"Received error from server: {message.error}") + error = WebRTCError(message.error) + + self._resolve_pending_waits(message.error) + if self._on_error: self._on_error(error)