From 7a86c40cf1881212073d5e93a72bb3f0cbf95389 Mon Sep 17 00:00:00 2001 From: Andrew Stoltz Date: Sun, 14 Jun 2026 13:03:14 -0500 Subject: [PATCH] =?UTF-8?q?fix(telephony):=20ARI=20receive=20timeout=2045s?= =?UTF-8?q?->3600s=20=E2=80=94=20the=20real=20false-abort=20root=20cause?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cancelling ClientWebSocket.ReceiveAsync via CancellationToken ABORTS the socket (a half-read WS frame can't resume). The per-iteration iterationCts.CancelAfter(WebSocketReceiveTimeoutSeconds) therefore aborted a healthy idle ARI WebSocket every 45s (state=Aborted), not the keepalive pong (proven: loop persisted after pong-timeout 15s->3600s). A large receive timeout lets ReceiveAsync block harmlessly while the PBX is idle; real drops still surface immediately as WebSocketException -> reconnect. Proper code fix (stop using CancelAfter on the receive) tracked separately. Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/telephony/telephony.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/telephony/telephony.yaml b/apps/telephony/telephony.yaml index 2f084df..b59d2fd 100644 --- a/apps/telephony/telephony.yaml +++ b/apps/telephony/telephony.yaml @@ -65,7 +65,7 @@ data: "MaxReconnectDelaySeconds": 60, "WebSocketKeepAliveIntervalSeconds": 30, "WebSocketKeepAliveTimeoutSeconds": 3600, - "WebSocketReceiveTimeoutSeconds": 45 + "WebSocketReceiveTimeoutSeconds": 3600 }, "Sip": { "Domain": "10.0.56.207",