@hortemo/semaphore
Version:
A minimal FIFO semaphore for JS/TS.
42 lines (41 loc) • 1.09 kB
JavaScript
// 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
};