await-semaphore
Version:
Awaitable semaphore/mutex
60 lines • 1.52 kB
JavaScript
;
class Semaphore {
constructor(count) {
this.tasks = [];
this.count = count;
}
sched() {
if (this.count > 0 && this.tasks.length > 0) {
this.count--;
let next = this.tasks.shift();
if (next === undefined) {
throw "Unexpected undefined value in tasks list";
}
next();
}
}
acquire() {
return new Promise((res, rej) => {
var task = () => {
var released = false;
res(() => {
if (!released) {
released = true;
this.count++;
this.sched();
}
});
};
this.tasks.push(task);
if (process && process.nextTick) {
process.nextTick(this.sched.bind(this));
}
else {
setImmediate(this.sched.bind(this));
}
});
}
use(f) {
return this.acquire()
.then(release => {
return f()
.then((res) => {
release();
return res;
})
.catch((err) => {
release();
throw err;
});
});
}
}
exports.Semaphore = Semaphore;
class Mutex extends Semaphore {
constructor() {
super(1);
}
}
exports.Mutex = Mutex;
//# sourceMappingURL=index.js.map