export type Resolve = (value: T | PromiseLike) => void; export type Reject = (reason?: unknown) => void; /** Lets lifecycle code outside the executor settle a promise exactly once. */ export class ControlledPromise { readonly promise: Promise; settled = false; resolve!: Resolve; reject!: Reject; constructor() { this.promise = new Promise((resolve, reject) => { this.resolve = (value) => { if (this.settled) { return; } this.settled = true; resolve(value); }; this.reject = (reason) => { if (this.settled) { return; } this.settled = true; reject(reason); }; }); } }