/** * A promise that can be resolved or rejected from outside. */ export type ControllablePromise = Promise & { resolve(val: T): void reject(err?: unknown): void } /** * Creates a promise that can be resolved or rejected from outside. */ export function createControllablePromise(): ControllablePromise { let _resolve: ControllablePromise['resolve'] let _reject: ControllablePromise['reject'] const promise = new Promise((resolve, reject) => { _resolve = resolve _reject = reject }) // ts doesn't like this, but it's fine ;(promise as ControllablePromise).resolve = _resolve! ;(promise as ControllablePromise).reject = _reject! return promise as ControllablePromise }