Skip to content

Commit

Permalink
chore: add support for AbortSignal.any and match behavior of combineA…
Browse files Browse the repository at this point in the history
…bortSignal to it
  • Loading branch information
Jack-Works committed Mar 13, 2024
1 parent fb0751f commit f77a11e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
5 changes: 5 additions & 0 deletions .changeset/grumpy-files-brake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@masknet/kit": patch
---

add support for AbortSignal.any and match behavior of combineAbortSignal to it
21 changes: 15 additions & 6 deletions src/web/combineAbortSignal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,22 @@ export type HasNonNullableAbortSignal<T extends unknown[]> = false extends (
export function combineAbortSignal<T extends (AbortSignal | undefined | null)[]>(
..._: T
): HasNonNullableAbortSignal<T> extends true ? AbortSignal : AbortSignal | undefined {
const args: (AbortSignal | undefined | null)[] = _.filter(Boolean)
if (args.length === 0) return undefined!
if (args.length === 1) return args[0] ?? undefined!
const signals = _.filter<AbortSignal>(Boolean as any)
if (signals.length === 0) return undefined!
if (signals.length === 1) return signals[0] ?? undefined!

if (AbortSignal.any) return AbortSignal.any(signals)

const aborted = signals.find((x) => x.aborted)
if (aborted) return aborted

const controller = new AbortController()
const abort = () => controller.abort()
for (const each of args) {
each!.addEventListener('abort', abort, { signal: controller.signal })
const abort = () => controller.abort(signals.find((x) => x.aborted)?.reason)
for (const signal of signals) {
signal.addEventListener('abort', abort, { signal: controller.signal })
}
return controller.signal
}
declare var AbortSignal: {
any?(iterable: Iterable<AbortSignal>): AbortSignal
}

0 comments on commit f77a11e

Please sign in to comment.