import invariant from 'assert'; export type Deferred = { resolve(arg1: T): void; reject(arg1: unknown): void; }; export function makeDeferredWithPromise(): { deferred: Deferred; promise: Promise; } { let deferred: Deferred | null | undefined; let promise = new Promise( ( resolve: (result: Promise | T) => void, reject: (error?: any) => void, ) => { deferred = {resolve, reject}; }, ); // Promise constructor callback executes synchronously, so this is defined invariant(deferred != null); return {deferred, promise}; }