forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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; |