const processQueues = new Map>(); export async function withProcessQueue( key: string, operation: () => Promise, ): Promise { const previous = processQueues.get(key) ?? Promise.resolve(); let release = () => {}; const gate = new Promise((resolve) => { release = resolve; }); const tail = previous.catch(() => {}).then(() => gate); processQueues.set(key, tail); await previous.catch(() => {}); try { return await operation(); } finally { release(); if (processQueues.get(key) === tail) processQueues.delete(key); } }