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.
|
|
'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 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. * * @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;
|