async function pool(items, limit, worker) { const results = []; const running = new Set(); for (const item of items) { const p = Promise.resolve().then(() => worker(item)); results.push(p); running.add(p); p.finally(() => running.delete(p)); if (running.size >= limit) await Promise.race(running); } return Promise.all(results); }