cancelable-promise
Version:
A simple cancelable promise
1 lines • 11.5 kB
Source Map (JSON)
{"version":3,"file":"CancelablePromise.mjs","names":["toStringTag","Symbol","CancelablePromiseInternal","constructor","executor","internals","defaultInternals","promise","Promise","resolve","reject","onCancel","onCancelList","push","cancel","bind","then","onfulfilled","onrejected","makeCancelable","createCallback","catch","finally","onfinally","runWhenCanceled","filter","callback","isCanceled","callbacks","err","console","error","CancelablePromise","all","iterable","makeAllCancelable","allSettled","any","race","value","cancelable","reason","isCancelablePromise","onResult","arg","result","resolvable"],"sources":["../src/CancelablePromise.ts"],"sourcesContent":["const toStringTag: typeof Symbol.toStringTag =\n typeof Symbol !== 'undefined' ? Symbol.toStringTag : ('@@toStringTag' as any);\n\nclass CancelablePromiseInternal<T = any> {\n #internals: Internals;\n #promise: Promise<T>;\n\n [toStringTag] = 'CancelablePromise';\n\n constructor({\n executor = () => {},\n internals = defaultInternals(),\n promise = new Promise<T>((resolve, reject) =>\n executor(resolve, reject, (onCancel) => {\n internals.onCancelList.push(onCancel);\n })\n ),\n }: {\n executor?: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void\n ) => void;\n internals?: Internals;\n promise?: Promise<T>;\n }) {\n this.cancel = this.cancel.bind(this);\n this.#internals = internals;\n this.#promise =\n promise ||\n new Promise<T>((resolve, reject) =>\n executor(resolve, reject, (onCancel) => {\n internals.onCancelList.push(onCancel);\n })\n );\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?:\n | ((\n value: T\n ) => TResult1 | PromiseLike<TResult1> | CancelablePromise<TResult1>)\n | undefined\n | null,\n onrejected?:\n | ((\n reason: any\n ) => TResult2 | PromiseLike<TResult2> | CancelablePromise<TResult2>)\n | undefined\n | null\n ): CancelablePromise<TResult1 | TResult2> {\n return makeCancelable<TResult1 | TResult2>(\n this.#promise.then(\n createCallback(onfulfilled, this.#internals),\n createCallback(onrejected, this.#internals)\n ),\n this.#internals\n );\n }\n\n catch<TResult = never>(\n onrejected?:\n | ((\n reason: any\n ) => TResult | PromiseLike<TResult> | CancelablePromise<TResult>)\n | undefined\n | null\n ): CancelablePromise<T | TResult> {\n return makeCancelable<T | TResult>(\n this.#promise.catch(createCallback(onrejected, this.#internals)),\n this.#internals\n );\n }\n\n finally(\n onfinally?: (() => void) | undefined | null,\n runWhenCanceled?: boolean\n ): CancelablePromise<T> {\n if (runWhenCanceled) {\n this.#internals.onCancelList.push(onfinally);\n }\n return makeCancelable<T>(\n this.#promise.finally(\n createCallback(() => {\n if (onfinally) {\n if (runWhenCanceled) {\n this.#internals.onCancelList =\n this.#internals.onCancelList.filter(\n (callback) => callback !== onfinally\n );\n }\n return onfinally();\n }\n }, this.#internals)\n ),\n this.#internals\n );\n }\n\n cancel(): void {\n this.#internals.isCanceled = true;\n const callbacks = this.#internals.onCancelList;\n this.#internals.onCancelList = [];\n for (const callback of callbacks) {\n if (typeof callback === 'function') {\n try {\n callback();\n } catch (err) {\n console.error(err);\n }\n }\n }\n }\n\n isCanceled(): boolean {\n return this.#internals.isCanceled === true;\n }\n}\n\nexport class CancelablePromise<T = any> extends CancelablePromiseInternal<T> {\n static all = function all(iterable: any) {\n return makeAllCancelable(iterable, Promise.all(iterable));\n } as CancelablePromiseOverloads['all'];\n\n static allSettled = function allSettled(iterable: any) {\n return makeAllCancelable(iterable, Promise.allSettled(iterable));\n } as CancelablePromiseOverloads['allSettled'];\n\n static any = function any(iterable: any) {\n return makeAllCancelable(iterable, Promise.any(iterable));\n } as CancelablePromiseOverloads['any'];\n\n static race = function race(iterable) {\n return makeAllCancelable(iterable, Promise.race(iterable));\n } as CancelablePromiseOverloads['race'];\n\n static resolve = function resolve(value) {\n return cancelable(Promise.resolve(value));\n } as CancelablePromiseOverloads['resolve'];\n\n static reject = function reject(reason) {\n return cancelable(Promise.reject(reason));\n } as CancelablePromiseOverloads['reject'];\n\n static isCancelable = isCancelablePromise;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void\n ) => void\n ) {\n super({ executor });\n }\n}\n\nexport default CancelablePromise;\n\nexport function cancelable<T = any>(promise: Promise<T>): CancelablePromise<T> {\n return makeCancelable(promise, defaultInternals());\n}\n\nexport function isCancelablePromise(promise: any): boolean {\n return (\n promise instanceof CancelablePromise ||\n promise instanceof CancelablePromiseInternal\n );\n}\n\nfunction createCallback(onResult: any, internals: Internals) {\n if (onResult) {\n return (arg?: any) => {\n if (!internals.isCanceled) {\n const result = onResult(arg);\n if (isCancelablePromise(result)) {\n internals.onCancelList.push(result.cancel);\n }\n return result;\n }\n return arg;\n };\n }\n}\n\nfunction makeCancelable<T>(promise: Promise<T>, internals: Internals) {\n return new CancelablePromiseInternal<T>({\n internals,\n promise,\n }) as CancelablePromise<T>;\n}\n\nfunction makeAllCancelable(iterable: any, promise: Promise<any>) {\n const internals = defaultInternals();\n internals.onCancelList.push(() => {\n for (const resolvable of iterable) {\n if (isCancelablePromise(resolvable)) {\n resolvable.cancel();\n }\n }\n });\n return new CancelablePromiseInternal({ internals, promise });\n}\n\nfunction defaultInternals(): Internals {\n return { isCanceled: false, onCancelList: [] };\n}\n\ninterface Internals {\n isCanceled: boolean;\n onCancelList: any[];\n}\n\ninterface CancelablePromiseOverloads {\n all<T extends readonly unknown[] | []>(\n values: T\n ): CancelablePromise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;\n\n allSettled<T extends readonly unknown[] | []>(\n values: T\n ): CancelablePromise<{\n -readonly [P in keyof T]: PromiseSettledResult<Awaited<T[P]>>;\n }>;\n\n allSettled<T>(\n values: Iterable<T | PromiseLike<T> | CancelablePromise<T>>\n ): CancelablePromise<PromiseSettledResult<Awaited<T>>[]>;\n\n any<T extends readonly unknown[] | []>(\n values: T\n ): CancelablePromise<Awaited<T[number]>>;\n\n any<T>(\n values: Iterable<T | PromiseLike<T> | CancelablePromise<T>>\n ): CancelablePromise<Awaited<T>>;\n\n race<T extends readonly unknown[] | []>(\n values: T\n ): CancelablePromise<Awaited<T[number]>>;\n\n resolve(): CancelablePromise<void>;\n\n resolve<T>(\n value: T | PromiseLike<T> | CancelablePromise<T>\n ): CancelablePromise<T>;\n\n reject<T = never>(reason?: any): CancelablePromise<T>;\n}\n"],"mappings":"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"}