From 27332b484094e26a123a1dfe8bb614c35ce1022a Mon Sep 17 00:00:00 2001 From: Oliver Lazoroski Date: Mon, 20 Jan 2025 15:21:52 +0100 Subject: [PATCH] fix: improved error handling when connecting to an SFU (#1648) Make sure we bubble the potential errors coming out of the initial SFU signal server connection establishment. --------- Co-authored-by: Matvei Andrienko --- packages/client/src/StreamSfuClient.ts | 13 ++++++++++--- packages/client/src/rtc/signal.ts | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/client/src/StreamSfuClient.ts b/packages/client/src/StreamSfuClient.ts index 0434cc6fce..d3d2b21f18 100644 --- a/packages/client/src/StreamSfuClient.ts +++ b/packages/client/src/StreamSfuClient.ts @@ -227,16 +227,23 @@ export class StreamSfuClient { }, }); - this.signalWs.addEventListener('close', this.handleWebSocketClose); - this.signalReady = makeSafePromise( Promise.race([ - new Promise((resolve) => { + new Promise((resolve, reject) => { const onOpen = () => { this.signalWs.removeEventListener('open', onOpen); resolve(this.signalWs); }; + this.signalWs.addEventListener('open', onOpen); + + this.signalWs.addEventListener('close', () => { + this.handleWebSocketClose(); + // Normally, this shouldn't have any effect, because WS should never emit 'close' + // before emitting 'open'. However, strager things have happened, and we don't + // want to leave signalReady in pending state. + reject(new Error('SFU WS closed unexpectedly')); + }); }), new Promise((resolve, reject) => { diff --git a/packages/client/src/rtc/signal.ts b/packages/client/src/rtc/signal.ts index 5d4e68e959..4803b0d73d 100644 --- a/packages/client/src/rtc/signal.ts +++ b/packages/client/src/rtc/signal.ts @@ -9,6 +9,7 @@ export const createWebSocketSignalChannel = (opts: { }) => { const { endpoint, onMessage, logTag } = opts; const logger = getLogger(['SfuClientWS', logTag]); + logger('debug', 'Creating signaling WS channel:', endpoint); const ws = new WebSocket(endpoint); ws.binaryType = 'arraybuffer'; // do we need this?