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.
55 lines
1.0 KiB
55 lines
1.0 KiB
'use strict'; |
|
|
|
const kDone = Symbol('kDone'); |
|
const kRun = Symbol('kRun'); |
|
|
|
/** |
|
* A very simple job queue with adjustable concurrency. Adapted from |
|
* https://github.com/STRML/async-limiter |
|
*/ |
|
class Limiter { |
|
/** |
|
* Creates a new `Limiter`. |
|
* |
|
* @param {Number} [concurrency=Infinity] The maximum number of jobs allowed |
|
* to run concurrently |
|
*/ |
|
constructor(concurrency) { |
|
this[kDone] = () => { |
|
this.pending--; |
|
this[kRun](); |
|
}; |
|
this.concurrency = concurrency || Infinity; |
|
this.jobs = []; |
|
this.pending = 0; |
|
} |
|
|
|
/** |
|
* Adds a job to the queue. |
|
* |
|
* @param {Function} job The job to run |
|
* @public |
|
*/ |
|
add(job) { |
|
this.jobs.push(job); |
|
this[kRun](); |
|
} |
|
|
|
/** |
|
* Removes a job from the queue and runs it if possible. |
|
* |
|
* @private |
|
*/ |
|
[kRun]() { |
|
if (this.pending === this.concurrency) return; |
|
|
|
if (this.jobs.length) { |
|
const job = this.jobs.shift(); |
|
|
|
this.pending++; |
|
job(this[kDone]); |
|
} |
|
} |
|
} |
|
|
|
module.exports = Limiter;
|
|
|