massive
Version:
A small query tool for Postgres that embraces json and makes life simpler
38 lines (28 loc) • 807 B
JavaScript
;
const EventEmitter = require('events').EventEmitter;
const Mutex = function ($p) {
this.$p = $p;
this.locked = false;
this.emitter = new EventEmitter();
};
Mutex.prototype.acquire = function () {
return this.$p(resolve => { // eslint-disable-line consistent-return
if (!this.locked) {
this.locked = true;
return resolve(this);
}
const attempt = () => { // eslint-disable-line consistent-return
if (!this.locked) {
this.locked = true;
this.emitter.removeListener('release', attempt);
return resolve(this);
}
};
this.emitter.on('release', attempt);
});
};
Mutex.prototype.release = function () {
this.locked = false;
setImmediate(() => this.emitter.emit('release'));
};
exports = module.exports = Mutex;