@@ -299,16 +299,13 @@ export class SignalClient {
299299
300300 return new Promise < JoinResponse | ReconnectResponse | undefined > ( async ( resolve , reject ) => {
301301 try {
302- const timeoutAbortController = new AbortController ( ) ;
303-
304- const signals = abortSignal
305- ? [ timeoutAbortController . signal , abortSignal ]
306- : [ timeoutAbortController . signal ] ;
307-
308- const combinedAbort = AbortSignal . any ( signals ) ;
309-
310- const abortHandler = async ( event : Event ) => {
311- const target = event . currentTarget ;
302+ let alreadyAborted = false ;
303+ const abortHandler = async ( eventOrError : Event | Error ) => {
304+ if ( alreadyAborted ) {
305+ return ;
306+ }
307+ alreadyAborted = true ;
308+ const target = eventOrError instanceof Event ? eventOrError . currentTarget : eventOrError ;
312309 const reason = getAbortReasonAsString ( target , 'Abort handler called' ) ;
313310 // send leave if we have an active stream writer (connection is open)
314311 if ( this . streamWriter && ! this . isDisconnected ) {
@@ -321,14 +318,19 @@ export class SignalClient {
321318 } else {
322319 this . close ( ) ;
323320 }
324- clearTimeout ( wsTimeout ) ;
321+ cleanupAbortHandlers ( ) ;
325322 reject ( target instanceof AbortSignal ? target . reason : target ) ;
326323 } ;
327324
328- combinedAbort . addEventListener ( 'abort' , abortHandler ) ;
325+ abortSignal ?. addEventListener ( 'abort' , abortHandler ) ;
326+
327+ const cleanupAbortHandlers = ( ) => {
328+ clearTimeout ( wsTimeout ) ;
329+ abortSignal ?. removeEventListener ( 'abort' , abortHandler ) ;
330+ } ;
329331
330332 const wsTimeout = setTimeout ( ( ) => {
331- timeoutAbortController . abort (
333+ abortHandler (
332334 new ConnectionError (
333335 'room connection has timed out (signal)' ,
334336 ConnectionErrorReason . ServerUnreachable ,
@@ -451,8 +453,9 @@ export class SignalClient {
451453 handleSignalConnected ( connection , firstMessageToProcess ) ;
452454 resolve ( validation . response ) ;
453455 } catch ( e ) {
454- clearTimeout ( wsTimeout ) ;
455456 reject ( e ) ;
457+ } finally {
458+ cleanupAbortHandlers ( ) ;
456459 }
457460 } finally {
458461 unlock ( ) ;
0 commit comments