Files
NapCatQQ/.pnpm-store/v3/files/28/15c98faa62f95f6773c6665c2eb291e92635578b173b95e99831ad8182f6e7a7a6b29f519ecdd0a99a8a7658fbc46f330d09f7cb5372b6a6073efa4e410489
TanTan e311ca3275
Build NapCat Artifacts / Windows Loader Test (push) Canceled after 0s
Build NapCat Artifacts / Type Check & Test (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Framework (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Shell (push) Canceled after 0s
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

71 lines
1.8 KiB
Plaintext

import type { AbortSignalWithReason } from './types'
export const assertFunction: (
func: unknown,
expected: string,
) => asserts func is (...args: unknown[]) => unknown = (
func: unknown,
expected: string,
) => {
if (typeof func !== 'function') {
throw new TypeError(`${expected} is not a function`)
}
}
export const noop = () => {}
export const catchRejection = <T>(
promise: Promise<T>,
onError = noop,
): Promise<T> => {
promise.catch(onError)
return promise
}
export const addAbortSignalListener = (
abortSignal: AbortSignal,
callback: (evt: Event) => void,
) => {
abortSignal.addEventListener('abort', callback, { once: true })
return () => abortSignal.removeEventListener('abort', callback)
}
/**
* Calls `abortController.abort(reason)` and patches `signal.reason`.
* if it is not supported.
*
* At the time of writing `signal.reason` is available in FF chrome, edge node 17 and deno.
* @param abortController
* @param reason
* @returns
* @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/reason
*/
export const abortControllerWithReason = <T>(
abortController: AbortController,
reason: T,
): void => {
type Consumer<T> = (val: T) => void
const signal = abortController.signal as AbortSignalWithReason<T>
if (signal.aborted) {
return
}
// Patch `reason` if necessary.
// - We use defineProperty here because reason is a getter of `AbortSignal.__proto__`.
// - We need to patch 'reason' before calling `.abort()` because listeners to the 'abort'
// event are are notified immediately.
if (!('reason' in signal)) {
Object.defineProperty(signal, 'reason', {
enumerable: true,
value: reason,
configurable: true,
writable: true,
})
}
;(abortController.abort as Consumer<typeof reason>)(reason)
}