You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.1 KiB
57 lines
1.1 KiB
'use strict'; |
|
const pTry = require('p-try'); |
|
|
|
const pLimit = concurrency => { |
|
if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) { |
|
return Promise.reject(new TypeError('Expected `concurrency` to be a number from 1 and up')); |
|
} |
|
|
|
const queue = []; |
|
let activeCount = 0; |
|
|
|
const next = () => { |
|
activeCount--; |
|
|
|
if (queue.length > 0) { |
|
queue.shift()(); |
|
} |
|
}; |
|
|
|
const run = (fn, resolve, ...args) => { |
|
activeCount++; |
|
|
|
const result = pTry(fn, ...args); |
|
|
|
resolve(result); |
|
|
|
result.then(next, next); |
|
}; |
|
|
|
const enqueue = (fn, resolve, ...args) => { |
|
if (activeCount < concurrency) { |
|
run(fn, resolve, ...args); |
|
} else { |
|
queue.push(run.bind(null, fn, resolve, ...args)); |
|
} |
|
}; |
|
|
|
const generator = (fn, ...args) => new Promise(resolve => enqueue(fn, resolve, ...args)); |
|
Object.defineProperties(generator, { |
|
activeCount: { |
|
get: () => activeCount |
|
}, |
|
pendingCount: { |
|
get: () => queue.length |
|
}, |
|
clearQueue: { |
|
value: () => { |
|
queue.length = 0; |
|
} |
|
} |
|
}); |
|
|
|
return generator; |
|
}; |
|
|
|
module.exports = pLimit; |
|
module.exports.default = pLimit;
|
|
|