class Semaphore { private _count: number; private _queue: Function[]; constructor(count: number) { this._count = count; this._queue = []; } public tryAcquire(): boolean { if (this._count > 0) { this._count--; return true; } return false; } public acquire(): Promise { return new Promise((resolve, reject) => { if (this._count > 0) { this._count--; resolve(); } else { this._queue.push(resolve); } }); } public release(): void { if (this._queue.length > 0) { // @ts-ignore this._queue.shift()(); } else { this._count++; } } } export default Semaphore;