/** The rejection reason when `.cancel()` is called. It includes a `.isCanceled` property for convenience. */ export class CancelError extends Error { readonly name: 'CancelError'; readonly isCanceled: true; constructor(reason?: string); } /** Accepts a function that is called when the promise is canceled. You're not required to call this function. You can call this function multiple times to add multiple cancel handlers. */ export interface OnCancelFunction { (cancelHandler: () => void): void; shouldReject: boolean; } // eslint-disable-next-line @typescript-eslint/naming-convention export default class PCancelable extends Promise { /** Convenience method to make your promise-returning or async function cancelable. @param fn - A promise-returning function. The function you specify will have `onCancel` appended to its parameters. @example ``` import PCancelable from 'p-cancelable'; const fn = PCancelable.fn((input, onCancel) => { const job = new Job(); onCancel(() => { job.cleanup(); }); return job.start(); //=> Promise }); const cancelablePromise = fn('input'); //=> PCancelable // … cancelablePromise.cancel(); ``` */ static fn( userFn: (onCancel: OnCancelFunction) => PromiseLike ): () => PCancelable; static fn( userFn: ( argument1: Agument1Type, onCancel: OnCancelFunction ) => PromiseLike ): (argument1: Agument1Type) => PCancelable; static fn( userFn: ( argument1: Agument1Type, argument2: Agument2Type, onCancel: OnCancelFunction ) => PromiseLike ): ( argument1: Agument1Type, argument2: Agument2Type ) => PCancelable; static fn( userFn: ( argument1: Agument1Type, argument2: Agument2Type, argument3: Agument3Type, onCancel: OnCancelFunction ) => PromiseLike ): ( argument1: Agument1Type, argument2: Agument2Type, argument3: Agument3Type ) => PCancelable; static fn( userFn: ( argument1: Agument1Type, argument2: Agument2Type, argument3: Agument3Type, argument4: Agument4Type, onCancel: OnCancelFunction ) => PromiseLike ): ( argument1: Agument1Type, argument2: Agument2Type, argument3: Agument3Type, argument4: Agument4Type ) => PCancelable; static fn< Agument1Type, Agument2Type, Agument3Type, Agument4Type, Agument5Type, ReturnType, >( userFn: ( argument1: Agument1Type, argument2: Agument2Type, argument3: Agument3Type, argument4: Agument4Type, argument5: Agument5Type, onCancel: OnCancelFunction ) => PromiseLike ): ( argument1: Agument1Type, argument2: Agument2Type, argument3: Agument3Type, argument4: Agument4Type, argument5: Agument5Type ) => PCancelable; static fn( userFn: (...arguments: unknown[]) => PromiseLike ): (...arguments: unknown[]) => PCancelable; /** Whether the promise is canceled. */ readonly isCanceled: boolean; /** Cancel the promise and optionally provide a reason. The cancellation is synchronous. Calling it after the promise has settled or multiple times does nothing. @param reason - The cancellation reason to reject the promise with. */ cancel: (reason?: string) => void; /** Create a promise that can be canceled. Can be constructed in the same was as a [`Promise` constructor](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise), but with an appended `onCancel` parameter in `executor`. `PCancelable` is a subclass of `Promise`. Cancelling will reject the promise with `CancelError`. To avoid that, set `onCancel.shouldReject` to `false`. @example ``` import PCancelable from 'p-cancelable'; const cancelablePromise = new PCancelable((resolve, reject, onCancel) => { const job = new Job(); onCancel.shouldReject = false; onCancel(() => { job.stop(); }); job.on('finish', resolve); }); cancelablePromise.cancel(); // Doesn't throw an error ``` */ constructor( executor: ( resolve: (value?: ValueType | PromiseLike) => void, reject: (reason?: unknown) => void, onCancel: OnCancelFunction ) => void ); }