| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";class Semaphore {	/**	 * Creates an instance of Semaphore.	 *	 * @param {number} available the amount available number of "tasks"	 * in the Semaphore	 */	constructor(available) {		this.available = available;		/** @type {(function(): void)[]} */		this.waiters = [];		/** @private */		this._continue = this._continue.bind(this);	}	/**	 * @param {function(): void} callback function block to capture and run	 * @returns {void}	 */	acquire(callback) {		if (this.available > 0) {			this.available--;			callback();		} else {			this.waiters.push(callback);		}	}	release() {		this.available++;		if (this.waiters.length > 0) {			process.nextTick(this._continue);		}	}	_continue() {		if (this.available > 0) {			if (this.waiters.length > 0) {				this.available--;				const callback = this.waiters.pop();				callback();			}		}	}}module.exports = Semaphore;
 |