// Wraps an internal promise and provide public methods to resolve/reject the // internal promise. The internal promise is also publicly available so it can // be await-ed on. export class Deferred { private readonly internalPromise: Promise; private internalResolve!: (value?: T | PromiseLike) => void; private internalReject!: (reason?: any) => void; constructor() { this.internalPromise = new Promise((resolve, reject) => { this.internalResolve = resolve; this.internalReject = reject; }); } get promise(): Promise { return this.internalPromise; } resolve = (value?: T | PromiseLike): void => { this.internalResolve(value); }; reject = (reason?: any): void => { this.internalReject(reason); }; }