mirror of
https://github.com/obra/superpowers.git
synced 2026-04-22 01:19:04 +08:00
Vendor node_modules into the repo so the brainstorm server works immediately on fresh plugin installs without needing npm at runtime.
56 lines
1.0 KiB
JavaScript
56 lines
1.0 KiB
JavaScript
'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;
|