From 27560d7eee42495ba53e471101e119f7ffab4785 Mon Sep 17 00:00:00 2001 From: Mostafa Roshdy Date: Thu, 26 Mar 2026 22:44:25 +0200 Subject: [PATCH] fix(streaming): reject connect promise on socket error or close Ensures the StreamingTranscriber.connect() promise does not hang indefinitely if the WebSocket fails to initialize. - Added reject() calls to onerror and onclose handlers. - Added reject() to onmessage if an application-level error is received. - Fixes issue where DNS failures (ENOTFOUND) cause the process to hang or crash without a catchable error. --- src/services/streaming/service.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/services/streaming/service.ts b/src/services/streaming/service.ts index 5cefccf..3a5b4f9 100644 --- a/src/services/streaming/service.ts +++ b/src/services/streaming/service.ts @@ -199,7 +199,7 @@ export class StreamingTranscriber { } connect() { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { if (this.socket) { throw new Error("Already connected"); } @@ -226,6 +226,11 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c this.socket.onopen = () => {}; this.socket.onclose = ({ code, reason }: CloseEvent) => { + reject( + new Error( + `Connection closed before session started. Code: ${code}, Reason: ${reason}`, + ), + ); if (!reason) { if (code in StreamingErrorMessages) { reason = StreamingErrorMessages[code as StreamingErrorTypeCodes]; @@ -235,8 +240,9 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c }; this.socket.onerror = (event: ErrorEvent) => { - if (event.error) this.listeners.error?.(event.error as Error); - else this.listeners.error?.(new Error(event.message)); + const error = event.error || new Error(event.message); + reject(error); + this.listeners.error?.(error); }; this.socket.onmessage = ({ data }: MessageEvent) => {