var _ = require('lodash'); var $ = require('preconditions').singleton(); 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;