2022-08-29 16:22:57 +03:00
|
|
|
/**
|
|
|
|
* A promise that can be resolved or rejected from outside.
|
|
|
|
*/
|
2023-06-05 03:30:48 +03:00
|
|
|
export type ControllablePromise<T = unknown> = Promise<T> & {
|
2021-04-08 12:19:38 +03:00
|
|
|
resolve(val: T): void
|
2021-11-23 00:03:59 +03:00
|
|
|
reject(err?: unknown): void
|
2021-04-08 12:19:38 +03:00
|
|
|
}
|
|
|
|
|
2022-08-29 16:22:57 +03:00
|
|
|
/**
|
|
|
|
* Creates a promise that can be resolved or rejected from outside.
|
|
|
|
*/
|
2023-06-05 03:30:48 +03:00
|
|
|
export function createControllablePromise<T = unknown>(): ControllablePromise<T> {
|
|
|
|
let _resolve: ControllablePromise<T>['resolve']
|
|
|
|
let _reject: ControllablePromise<T>['reject']
|
2021-04-08 12:19:38 +03:00
|
|
|
const promise = new Promise<T>((resolve, reject) => {
|
|
|
|
_resolve = resolve
|
|
|
|
_reject = reject
|
|
|
|
})
|
2023-06-05 03:30:48 +03:00
|
|
|
// ts doesn't like this, but it's fine
|
|
|
|
|
|
|
|
;(promise as ControllablePromise<T>).resolve = _resolve!
|
|
|
|
;(promise as ControllablePromise<T>).reject = _reject!
|
|
|
|
|
2021-04-08 12:19:38 +03:00
|
|
|
return promise as ControllablePromise<T>
|
|
|
|
}
|