From 0315f00ad935ae7a1c7c135bc3a127e1c6263296 Mon Sep 17 00:00:00 2001 From: davidliu Date: Mon, 13 Apr 2026 23:20:25 +0900 Subject: [PATCH 1/2] fix: Shims for AbortSignal.timeout and AbortSignal.any to handle usages in livekit-client --- .changeset/moody-poets-smoke.md | 5 +++++ src/index.tsx | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 .changeset/moody-poets-smoke.md diff --git a/.changeset/moody-poets-smoke.md b/.changeset/moody-poets-smoke.md new file mode 100644 index 0000000..9553d9b --- /dev/null +++ b/.changeset/moody-poets-smoke.md @@ -0,0 +1,5 @@ +--- +'@livekit/react-native': patch +--- + +Shims for AbortSignal.timeout and AbortSignal.any to handle usages in `livekit-client` diff --git a/src/index.tsx b/src/index.tsx index fc9e660..51dc12f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -58,6 +58,7 @@ export function registerGlobals(options?: RegisterGlobalsOptions) { shimArrayAt(); shimCryptoUuid(); shimWebstreams(); + shimAbortSignal(); setupNativeEvents(); } @@ -152,6 +153,41 @@ function shimWebstreams() { } } +function shimAbortSignal() { + // @ts-expect-error: AbortSignal.any isn't defined in RN. + if (typeof AbortSignal.any === "undefined") { + // @ts-expect-error: AbortSignal.any isn't defined in RN. + AbortSignal.any = function (signals: AbortSignal[]): AbortSignal { + const controller = new AbortController() + + // If any signal is already aborted, abort immediately + for (const signal of signals) { + if (signal.aborted) { + controller.abort() + return controller.signal + } + } + + // Listen for abort events on all signals + const abortHandler = () => controller.abort() + for (const signal of signals) { + signal.addEventListener("abort", abortHandler) + } + + return controller.signal + } + } + + // @ts-expect-error: AbortSignal.timeout isn't defined in RN. + if (typeof AbortSignal.timeout === "undefined") { + // @ts-expect-error: AbortSignal.timeout isn't defined in RN. + AbortSignal.timeout = function (ms: number): AbortSignal { + const controller = new AbortController() + setTimeout(() => controller.abort(), ms) + return controller.signal + } + } +} export * from './hooks'; export * from './components/BarVisualizer'; export * from './components/LiveKitRoom'; From 9a1508523357c26725030c981a6d3248de03ad6b Mon Sep 17 00:00:00 2001 From: davidliu Date: Tue, 14 Apr 2026 18:29:52 +0900 Subject: [PATCH 2/2] lint fix --- src/index.tsx | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 51dc12f..c313dc0 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -155,37 +155,37 @@ function shimWebstreams() { function shimAbortSignal() { // @ts-expect-error: AbortSignal.any isn't defined in RN. - if (typeof AbortSignal.any === "undefined") { + if (typeof AbortSignal.any === 'undefined') { // @ts-expect-error: AbortSignal.any isn't defined in RN. AbortSignal.any = function (signals: AbortSignal[]): AbortSignal { - const controller = new AbortController() - + const controller = new AbortController(); + // If any signal is already aborted, abort immediately for (const signal of signals) { if (signal.aborted) { - controller.abort() - return controller.signal + controller.abort(); + return controller.signal; } } - + // Listen for abort events on all signals - const abortHandler = () => controller.abort() + const abortHandler = () => controller.abort(); for (const signal of signals) { - signal.addEventListener("abort", abortHandler) + signal.addEventListener('abort', abortHandler); } - - return controller.signal - } + + return controller.signal; + }; } // @ts-expect-error: AbortSignal.timeout isn't defined in RN. - if (typeof AbortSignal.timeout === "undefined") { + if (typeof AbortSignal.timeout === 'undefined') { // @ts-expect-error: AbortSignal.timeout isn't defined in RN. AbortSignal.timeout = function (ms: number): AbortSignal { - const controller = new AbortController() - setTimeout(() => controller.abort(), ms) - return controller.signal - } + const controller = new AbortController(); + setTimeout(() => controller.abort(), ms); + return controller.signal; + }; } } export * from './hooks';