function createMutex(doWork) { const mutex = {}; return function(key, payload, callback) { if (mutex[key]) { mutex[key].push(callback); } else { mutex[key] = [ function() { delete mutex[key]; }, callback ]; doWork(payload, function(error, value) { mutex[key].forEach(callback => { callback(error, value); }); }); } }; } module.exports = createMutex;