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;
 |