Files
2026-02-13 22:02:30 +01:00

31 lines
879 B
JavaScript

async function runParallel(inputs, cb, opts) {
const errors = [];
const tasks = /* @__PURE__ */ new Set();
function queueNext() {
const route = inputs.values().next().value;
if (!route) {
return;
}
inputs.delete(route);
const task = (opts.interval ? new Promise((resolve) => setTimeout(resolve, opts.interval)) : Promise.resolve()).then(() => cb(route)).catch((error) => {
console.error(error);
errors.push(error);
});
tasks.add(task);
return task.then(() => {
tasks.delete(task);
if (inputs.size > 0) {
return refillQueue();
}
});
}
function refillQueue() {
const workers = Math.min(opts.concurrency - tasks.size, inputs.size);
return Promise.all(Array.from({ length: workers }, () => queueNext()));
}
await refillQueue();
return { errors };
}
export { runParallel as r };