| 18 | } |
| 19 | |
| 20 | export class CancelablePromise<T> implements Promise<T> { |
| 21 | private _isResolved: boolean |
| 22 | private _isRejected: boolean |
| 23 | private _isCancelled: boolean |
| 24 | readonly cancelHandlers: (() => void)[] |
| 25 | readonly promise: Promise<T> |
| 26 | private _resolve?: (value: T | PromiseLike<T>) => void |
| 27 | private _reject?: (reason?: unknown) => void |
| 28 | |
| 29 | constructor( |
| 30 | executor: ( |
| 31 | resolve: (value: T | PromiseLike<T>) => void, |
| 32 | reject: (reason?: unknown) => void, |
| 33 | onCancel: OnCancel, |
| 34 | ) => void, |
| 35 | ) { |
| 36 | this._isResolved = false |
| 37 | this._isRejected = false |
| 38 | this._isCancelled = false |
| 39 | this.cancelHandlers = [] |
| 40 | this.promise = new Promise<T>((resolve, reject) => { |
| 41 | this._resolve = resolve |
| 42 | this._reject = reject |
| 43 | |
| 44 | const onResolve = (value: T | PromiseLike<T>): void => { |
| 45 | if (this._isResolved || this._isRejected || this._isCancelled) { |
| 46 | return |
| 47 | } |
| 48 | this._isResolved = true |
| 49 | if (this._resolve) this._resolve(value) |
| 50 | } |
| 51 | |
| 52 | const onReject = (reason?: unknown): void => { |
| 53 | if (this._isResolved || this._isRejected || this._isCancelled) { |
| 54 | return |
| 55 | } |
| 56 | this._isRejected = true |
| 57 | if (this._reject) this._reject(reason) |
| 58 | } |
| 59 | |
| 60 | const onCancel = (cancelHandler: () => void): void => { |
| 61 | if (this._isResolved || this._isRejected || this._isCancelled) { |
| 62 | return |
| 63 | } |
| 64 | this.cancelHandlers.push(cancelHandler) |
| 65 | } |
| 66 | |
| 67 | Object.defineProperty(onCancel, 'isResolved', { |
| 68 | get: (): boolean => this._isResolved, |
| 69 | }) |
| 70 | |
| 71 | Object.defineProperty(onCancel, 'isRejected', { |
| 72 | get: (): boolean => this._isRejected, |
| 73 | }) |
| 74 | |
| 75 | Object.defineProperty(onCancel, 'isCancelled', { |
| 76 | get: (): boolean => this._isCancelled, |
| 77 | }) |
nothing calls this directly
no outgoing calls
no test coverage detected