export interface Deferred { promise: Promise; resolve: (value: T) => void; reject: (error: unknown) => void; } export function deferred(): Deferred { let resolve!: (value: T) => void; let reject!: (error: unknown) => void; const promise = new Promise((promiseResolve, promiseReject) => { resolve = promiseResolve; reject = promiseReject; }); return { promise, resolve, reject }; } export async function waitForAsyncWork(assertion: () => void): Promise { let lastError: unknown; for (let attempt = 0; attempt < 20; attempt += 1) { try { assertion(); return; } catch (error) { lastError = error; await Promise.resolve(); } } assertion(); if (lastError instanceof Error) throw lastError; throw new Error("Timed out waiting for async test work."); }