mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-03-22 03:08:23 +00:00
39 lines
1011 B
TypeScript
39 lines
1011 B
TypeScript
/**
|
|
* Runs async work over items with a fixed concurrency limit.
|
|
*
|
|
* Note: if `worker` throws, this function rejects. Callers should handle
|
|
* expected per-item errors inside the worker and return a typed result.
|
|
*/
|
|
export async function runWithConcurrencyLimit<T, R>(
|
|
items: T[],
|
|
concurrencyLimit: number,
|
|
worker: (item: T, index: number) => Promise<R>,
|
|
): Promise<R[]> {
|
|
if (items.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
const normalizedConcurrency = Math.max(1, Math.floor(concurrencyLimit));
|
|
const results = new Array<R>(items.length);
|
|
let currentIndex = 0;
|
|
|
|
const runWorker = async () => {
|
|
while (currentIndex < items.length) {
|
|
const assignedIndex = currentIndex;
|
|
currentIndex += 1;
|
|
results[assignedIndex] = await worker(
|
|
items[assignedIndex],
|
|
assignedIndex,
|
|
);
|
|
}
|
|
};
|
|
|
|
const workers = Array.from(
|
|
{ length: Math.min(normalizedConcurrency, items.length) },
|
|
() => runWorker(),
|
|
);
|
|
|
|
await Promise.all(workers);
|
|
return results;
|
|
}
|