From a627597bca5ef22bea9eb6995965f58232b69b52 Mon Sep 17 00:00:00 2001 From: James Hush Date: Tue, 3 Feb 2026 16:25:07 +0800 Subject: [PATCH] Fix StopAsyncIteration in parse_telephony_websocket Handle WebSocket disconnections gracefully when telephony providers send fewer messages than expected. Adds explicit StopAsyncIteration handling for both first and second message retrieval. Co-Authored-By: Claude Sonnet 4.5 --- src/pipecat/runner/utils.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/pipecat/runner/utils.py b/src/pipecat/runner/utils.py index f54453d93..2a56bb0f4 100644 --- a/src/pipecat/runner/utils.py +++ b/src/pipecat/runner/utils.py @@ -147,19 +147,28 @@ async def parse_telephony_websocket(websocket: WebSocket): try: # First message - first_message_raw = await start_data.__anext__() - logger.trace(f"First message: {first_message_raw}") try: - first_message = json.loads(first_message_raw) - except json.JSONDecodeError: - first_message = {} + first_message_raw = await start_data.__anext__() + logger.trace(f"First message: {first_message_raw}") + try: + first_message = json.loads(first_message_raw) + except json.JSONDecodeError: + first_message = {} + except StopAsyncIteration: + logger.error("WebSocket closed without sending any messages") + raise ValueError("WebSocket closed before receiving telephony handshake messages") # Second message - second_message_raw = await start_data.__anext__() - logger.trace(f"Second message: {second_message_raw}") try: - second_message = json.loads(second_message_raw) - except json.JSONDecodeError: + second_message_raw = await start_data.__anext__() + logger.trace(f"Second message: {second_message_raw}") + try: + second_message = json.loads(second_message_raw) + except json.JSONDecodeError: + second_message = {} + except StopAsyncIteration: + # Only one message received - use it for detection + logger.warning("Only received one WebSocket message, expected two") second_message = {} # Try auto-detection on both messages