/** * Similar to Deferred object, which is also a promise itself (instead of deferred.promise). */ export interface DeferredPromise extends Promise { resolve: (a?: T) => void reject: (err?: Error) => void /** * Can be overridden. * Otherwise will reject with "Aborted" or "Aborted: $reason" on abort(). * * @experimental */ abort: (reason?: string) => void /** * Rejects the promise with `new Error('Aborted: $reason')`. * * @experimental */ rejectAborted: (reason?: string) => void } /* eslint-disable @typescript-eslint/promise-function-async */ /** * Returns DeferredPromise - a Promise that has .resolve() and .reject() methods. */ export function pDefer(): DeferredPromise { let resolve: any let reject: any const promise = new Promise((_resolve, _reject) => { resolve = _resolve reject = _reject }) as DeferredPromise promise.resolve = resolve promise.reject = reject promise.rejectAborted = reason => reject(new Error(['Aborted', reason].filter(Boolean).join(': '))) promise.abort = reason => promise.rejectAborted(reason) return promise }