var _ = require('lodash'); var locks = {}; var Lock = function () { this.taken = false; this.queue = []; }; Lock.prototype.free = function () { if (this.queue.length > 0) { var f = this.queue.shift(); f(this); } else { this.taken = false; } }; Lock.get = function (key, callback) { if (_.isUndefined(locks[key])) { locks[key] = new Lock(); } var lock = locks[key]; if (lock.taken) { lock.queue.push(callback); } else { lock.taken = true; callback(lock); } }; module.exports = Lock;