• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import * as os from 'node:os';
2// availableParallelism available only since node v19, for older versions use
3// cpus() cpus() can return an empty list if /proc is not mounted, use 1 in
4// this case
5/* c8 ignore start */
6const defLimit = 'availableParallelism' in os
7    ? Math.max(1, os.availableParallelism() - 1)
8    : Math.max(1, os.cpus().length - 1);
9export const callLimit = (queue, { limit = defLimit, rejectLate } = {}) => new Promise((res, rej) => {
10    let active = 0;
11    let current = 0;
12    const results = [];
13    // Whether or not we rejected, distinct from the rejection just in case the rejection itself is falsey
14    let rejected = false;
15    let rejection;
16    const reject = (er) => {
17        if (rejected)
18            return;
19        rejected = true;
20        rejection ??= er;
21        if (!rejectLate)
22            rej(rejection);
23    };
24    let resolved = false;
25    const resolve = () => {
26        if (resolved || active > 0)
27            return;
28        resolved = true;
29        res(results);
30    };
31    const run = () => {
32        const c = current++;
33        if (c >= queue.length)
34            return rejected ? reject() : resolve();
35        active++;
36        const step = queue[c];
37        /* c8 ignore start */
38        if (!step)
39            throw new Error('walked off queue');
40        /* c8 ignore stop */
41        results[c] = step()
42            .then(result => {
43            active--;
44            results[c] = result;
45            return result;
46        }, er => {
47            active--;
48            reject(er);
49        })
50            .then(result => {
51            if (rejected && active === 0)
52                return rej(rejection);
53            run();
54            return result;
55        });
56    };
57    for (let i = 0; i < limit; i++)
58        run();
59});
60//# sourceMappingURL=index.js.map