UNPKG

await-semaphore

Version:
60 lines 1.52 kB
"use strict"; 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