export interface SerialTaskQueue { enqueue(task: () => Promise): Promise; idle(): Promise; } /** * Runs asynchronous tasks one at a time in enqueue order. A rejected task is * returned to its caller but does not poison the queue for later work. */ export function createSerialTaskQueue(): SerialTaskQueue { let tail: Promise = Promise.resolve(); return { enqueue(task: () => Promise): Promise { const result = tail.then(task); tail = result.then( () => undefined, () => undefined, ); return result; }, idle(): Promise { return tail; }, }; }