Skip to content

Commit 399c502

Browse files
authored
fix: resolve pending waits when WebSocket disconnects (#38)
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.
1 parent 3bb4129 commit 399c502

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

decart/realtime/webrtc_connection.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ async def _receive_messages(self) -> None:
285285
if self._on_error:
286286
self._on_error(e)
287287
finally:
288-
# WS loop exited (clean close or error) — signal disconnected so manager can reconnect
288+
self._resolve_pending_waits("WebSocket disconnected")
289289
await self._set_state("disconnected")
290290

291291
async def _handle_message(self, data: dict) -> None:
@@ -368,23 +368,24 @@ def _handle_set_image_ack(self, message: SetImageAckMessage) -> None:
368368
result["error"] = message.error
369369
event.set()
370370

371-
def _handle_error(self, message: ErrorMessage) -> None:
372-
logger.error(f"Received error from server: {message.error}")
373-
error = WebRTCError(message.error)
374-
375-
# Fail-fast: resolve any pending Phase-2 waits so they surface the
376-
# real server error instead of timing out after 30 s.
371+
def _resolve_pending_waits(self, error_message: str) -> None:
377372
if self._pending_image_set:
378373
event, result = self._pending_image_set
379374
result["success"] = False
380-
result["error"] = message.error
375+
result["error"] = error_message
381376
event.set()
382377

383378
for _prompt, (event, result) in list(self._pending_prompts.items()):
384379
result["success"] = False
385-
result["error"] = message.error
380+
result["error"] = error_message
386381
event.set()
387382

383+
def _handle_error(self, message: ErrorMessage) -> None:
384+
logger.error(f"Received error from server: {message.error}")
385+
error = WebRTCError(message.error)
386+
387+
self._resolve_pending_waits(message.error)
388+
388389
if self._on_error:
389390
self._on_error(error)
390391

0 commit comments

Comments
 (0)