@@ -274,6 +274,7 @@ export class StreamSfuClient {
274
274
this . signalWs = createWebSocketSignalChannel ( {
275
275
tag : this . tag ,
276
276
endpoint : `${ this . credentials . server . ws_endpoint } ?${ new URLSearchParams ( params ) . toString ( ) } ` ,
277
+ tracer : this . tracer ,
277
278
onMessage : ( message ) => {
278
279
this . lastMessageTimestamp = new Date ( ) ;
279
280
this . scheduleConnectionCheck ( ) ;
@@ -285,10 +286,14 @@ export class StreamSfuClient {
285
286
} ,
286
287
} ) ;
287
288
289
+ let timeoutId : NodeJS . Timeout ;
288
290
this . signalReady = makeSafePromise (
289
291
Promise . race < WebSocket > ( [
290
292
new Promise ( ( resolve , reject ) => {
293
+ let didOpen = false ;
291
294
const onOpen = ( ) => {
295
+ didOpen = true ;
296
+ clearTimeout ( timeoutId ) ;
292
297
this . signalWs . removeEventListener ( 'open' , onOpen ) ;
293
298
resolve ( this . signalWs ) ;
294
299
} ;
@@ -298,28 +303,28 @@ export class StreamSfuClient {
298
303
this . signalWs . addEventListener ( 'close' , ( e ) => {
299
304
this . handleWebSocketClose ( e ) ;
300
305
// Normally, this shouldn't have any effect, because WS should never emit 'close'
301
- // before emitting 'open'. However, strager things have happened, and we don't
302
- // want to leave signalReady in pending state.
303
- reject (
304
- new Error ( `SFU WS closed or connection can't be established` ) ,
305
- ) ;
306
+ // before emitting 'open'. However, stranger things have happened, and we don't
307
+ // want to leave signalReady in a pending state.
308
+ const message = didOpen
309
+ ? `SFU WS closed: ${ e . code } ${ e . reason } `
310
+ : `SFU WS connection can't be established: ${ e . code } ${ e . reason } ` ;
311
+ this . tracer ?. trace ( 'signal.close' , message ) ;
312
+ clearTimeout ( timeoutId ) ;
313
+ reject ( new Error ( message ) ) ;
306
314
} ) ;
307
315
} ) ,
308
316
309
317
new Promise ( ( resolve , reject ) => {
310
- setTimeout (
311
- ( ) => reject ( new Error ( 'SFU WS connection timed out' ) ) ,
312
- this . joinResponseTimeout ,
313
- ) ;
318
+ timeoutId = setTimeout ( ( ) => {
319
+ const message = `SFU WS connection failed to open after ${ this . joinResponseTimeout } ms` ;
320
+ this . tracer ?. trace ( 'signal.timeout' , message ) ;
321
+ reject ( new Error ( message ) ) ;
322
+ } , this . joinResponseTimeout ) ;
314
323
} ) ,
315
324
] ) ,
316
325
) ;
317
326
} ;
318
327
319
- private cleanUpWebSocket = ( ) => {
320
- this . signalWs . removeEventListener ( 'close' , this . handleWebSocketClose ) ;
321
- } ;
322
-
323
328
get isHealthy ( ) {
324
329
return (
325
330
this . signalWs . readyState === WebSocket . OPEN &&
@@ -343,7 +348,7 @@ export class StreamSfuClient {
343
348
if ( this . signalWs . readyState === WebSocket . OPEN ) {
344
349
this . logger ( 'debug' , `Closing SFU WS connection: ${ code } - ${ reason } ` ) ;
345
350
this . signalWs . close ( code , `js-client: ${ reason } ` ) ;
346
- this . cleanUpWebSocket ( ) ;
351
+ this . signalWs . removeEventListener ( 'close' , this . handleWebSocketClose ) ;
347
352
}
348
353
this . dispose ( ) ;
349
354
} ;
0 commit comments