Skip to content

Commit a041ee0

Browse files
authored
Remove AbortSignal.any usage (#1700)
1 parent ad65abe commit a041ee0

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

.changeset/twenty-spiders-joke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"livekit-client": patch
3+
---
4+
5+
Remove AbortSignal.any usage

src/api/SignalClient.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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();

src/api/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export function parseSignalResponse(value: ArrayBuffer | string) {
3333
}
3434

3535
export function getAbortReasonAsString(
36-
signal: AbortSignal | unknown,
36+
signal: AbortSignal | Error | unknown,
3737
defaultMessage = 'Unknown reason',
3838
) {
3939
if (!(signal instanceof AbortSignal)) {

0 commit comments

Comments
 (0)