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