Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / drive-store / utils / parallelRunners.ts
blobf2408f7bfb1dac04680d4dede9ae90d503a730ab
1 import runInQueue from '@proton/shared/lib/helpers/runInQueue';
3 export const DEFAULT_PARALLEL_CALL_LIMIT = 5;
5 export function createAsyncQueue<T>(parallelCallLimit: number = DEFAULT_PARALLEL_CALL_LIMIT) {
6     const queue: (() => Promise<T>)[] = [];
7     let currentLoad = 0;
9     const run = () => {
10         if (queue.length === 0 || currentLoad >= parallelCallLimit) {
11             return;
12         }
14         currentLoad += 1;
15         const nextTask = queue.shift();
17         nextTask!()
18             .catch((e: Error) => {
19                 console.warn(e);
20             })
21             .finally(() => {
22                 currentLoad -= 1;
23                 run();
24             });
25     };
27     const addToQueue = (task: () => Promise<T>) => {
28         queue.push(task);
29         run();
30     };
32     const clearQueue = () => {
33         queue.length = 0;
34     };
36     return {
37         addToQueue,
38         clearQueue,
39     };
42 export function runInQueueAbortable<T extends () => Promise<R>, R>(
43     tasks: T[],
44     parallelCallLimit: number = DEFAULT_PARALLEL_CALL_LIMIT,
45     signal?: AbortSignal
46 ) {
47     const result = runInQueue(tasks, parallelCallLimit);
49     signal?.addEventListener('abort', () => {
50         tasks.length = 0;
51     });
53     return result;