UNPKG

@hortemo/semaphore

Version:

A minimal FIFO semaphore for JS/TS.

42 lines (41 loc) 1.09 kB
// src/index.ts var Semaphore = class { /** * Create a semaphore. * * @param permits Non-negative initial permit count. * @throws {Error} If `permits` is not a non-negative integer. */ constructor(permits) { this._waitQueue = []; if (!Number.isInteger(permits) || permits < 0) { throw new Error("Semaphore: 'permits' must be a non-negative integer"); } this._permits = permits; } /** Resolve with a {@link Releaser} when a permit is available. Call it once to return the permit. */ acquire() { return new Promise((resolve) => { this._waitQueue.push(() => { let released = false; resolve(() => { if (released) return; released = true; this._permits++; this._dispatch(); }); }); this._dispatch(); }); } /** Try to grant permits to the wait queue while any are available. */ _dispatch() { while (this._permits > 0 && this._waitQueue.length > 0) { this._permits--; this._waitQueue.shift()(); } } }; export { Semaphore as default };