es-toolkit
Version:
A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.
35 lines (31 loc) • 776 B
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
class Semaphore {
capacity;
available;
deferredTasks = [];
constructor(capacity) {
this.capacity = capacity;
this.available = capacity;
}
async acquire() {
if (this.available > 0) {
this.available--;
return;
}
return new Promise(resolve => {
this.deferredTasks.push(resolve);
});
}
release() {
const deferredTask = this.deferredTasks.shift();
if (deferredTask != null) {
deferredTask();
return;
}
if (this.available < this.capacity) {
this.available++;
}
}
}
exports.Semaphore = Semaphore;