export interface WorkQueueItem { next: () => Promise; resolve(v: unknown): void; reject(e: unknown): void; } export async function processWorkQueue(queue?: Array, queueDelay = 200) { while (queue && queue.length > 0) { const v = queue.shift(); if (v) { try { const ret = await v.next(); v.resolve(ret); } catch (e) { v.reject(e); } } } setTimeout(() => processWorkQueue(queue, queueDelay), queueDelay); } export const barrierQueue = async (queue: Array, then: () => Promise): Promise => { return new Promise((resolve, reject) => { queue.push({ next: then, resolve, reject, }); }); };