1"use strict"; 2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 if (k2 === undefined) k2 = k; 4 var desc = Object.getOwnPropertyDescriptor(m, k); 5 if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 desc = { enumerable: true, get: function() { return m[k]; } }; 7 } 8 Object.defineProperty(o, k2, desc); 9}) : (function(o, m, k, k2) { 10 if (k2 === undefined) k2 = k; 11 o[k2] = m[k]; 12})); 13var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 14 Object.defineProperty(o, "default", { enumerable: true, value: v }); 15}) : function(o, v) { 16 o["default"] = v; 17}); 18var __importStar = (this && this.__importStar) || function (mod) { 19 if (mod && mod.__esModule) return mod; 20 var result = {}; 21 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 22 __setModuleDefault(result, mod); 23 return result; 24}; 25Object.defineProperty(exports, "__esModule", { value: true }); 26exports.callLimit = void 0; 27const os = __importStar(require("node:os")); 28// availableParallelism available only since node v19, for older versions use 29// cpus() cpus() can return an empty list if /proc is not mounted, use 1 in 30// this case 31/* c8 ignore start */ 32const defLimit = 'availableParallelism' in os 33 ? Math.max(1, os.availableParallelism() - 1) 34 : Math.max(1, os.cpus().length - 1); 35const callLimit = (queue, { limit = defLimit, rejectLate } = {}) => new Promise((res, rej) => { 36 let active = 0; 37 let current = 0; 38 const results = []; 39 // Whether or not we rejected, distinct from the rejection just in case the rejection itself is falsey 40 let rejected = false; 41 let rejection; 42 const reject = (er) => { 43 if (rejected) 44 return; 45 rejected = true; 46 rejection ??= er; 47 if (!rejectLate) 48 rej(rejection); 49 }; 50 let resolved = false; 51 const resolve = () => { 52 if (resolved || active > 0) 53 return; 54 resolved = true; 55 res(results); 56 }; 57 const run = () => { 58 const c = current++; 59 if (c >= queue.length) 60 return rejected ? reject() : resolve(); 61 active++; 62 const step = queue[c]; 63 /* c8 ignore start */ 64 if (!step) 65 throw new Error('walked off queue'); 66 /* c8 ignore stop */ 67 results[c] = step() 68 .then(result => { 69 active--; 70 results[c] = result; 71 return result; 72 }, er => { 73 active--; 74 reject(er); 75 }) 76 .then(result => { 77 if (rejected && active === 0) 78 return rej(rejection); 79 run(); 80 return result; 81 }); 82 }; 83 for (let i = 0; i < limit; i++) 84 run(); 85}); 86exports.callLimit = callLimit; 87//# sourceMappingURL=index.js.map