tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

limiter.js (1034B)


      1 'use strict';
      2 
      3 const kDone = Symbol('kDone');
      4 const kRun = Symbol('kRun');
      5 
      6 /**
      7 * A very simple job queue with adjustable concurrency. Adapted from
      8 * https://github.com/STRML/async-limiter
      9 */
     10 class Limiter {
     11  /**
     12   * Creates a new `Limiter`.
     13   *
     14   * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed
     15   *     to run concurrently
     16   */
     17  constructor(concurrency) {
     18    this[kDone] = () => {
     19      this.pending--;
     20      this[kRun]();
     21    };
     22    this.concurrency = concurrency || Infinity;
     23    this.jobs = [];
     24    this.pending = 0;
     25  }
     26 
     27  /**
     28   * Adds a job to the queue.
     29   *
     30   * @param {Function} job The job to run
     31   * @public
     32   */
     33  add(job) {
     34    this.jobs.push(job);
     35    this[kRun]();
     36  }
     37 
     38  /**
     39   * Removes a job from the queue and runs it if possible.
     40   *
     41   * @private
     42   */
     43  [kRun]() {
     44    if (this.pending === this.concurrency) return;
     45 
     46    if (this.jobs.length) {
     47      const job = this.jobs.shift();
     48 
     49      this.pending++;
     50      job(this[kDone]);
     51    }
     52  }
     53 }
     54 
     55 module.exports = Limiter;