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..c313dc0 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';