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