2017-08-11 03:43:20 +00:00
|
|
|
function createMutex(doWork) {
|
2018-05-14 15:06:49 +00:00
|
|
|
const mutex = Object.create(null);
|
2017-08-11 03:43:20 +00:00
|
|
|
|
2018-04-04 19:06:17 +00:00
|
|
|
return (key, payload, callback) => {
|
2017-08-11 03:43:20 +00:00
|
|
|
if (mutex[key]) {
|
2018-02-18 02:00:56 +00:00
|
|
|
mutex[key].push(callback);
|
2017-08-11 03:43:20 +00:00
|
|
|
} else {
|
2018-04-04 19:06:17 +00:00
|
|
|
mutex[key] = [callback];
|
2017-08-11 03:43:20 +00:00
|
|
|
|
2018-04-04 19:06:17 +00:00
|
|
|
doWork(payload, (error, value) => {
|
2017-11-08 18:14:46 +00:00
|
|
|
mutex[key].forEach(callback => {
|
2018-02-18 02:00:56 +00:00
|
|
|
callback(error, value);
|
|
|
|
});
|
2018-04-04 19:06:17 +00:00
|
|
|
|
|
|
|
delete mutex[key];
|
2018-02-18 02:00:56 +00:00
|
|
|
});
|
2017-08-11 03:43:20 +00:00
|
|
|
}
|
2018-02-18 02:00:56 +00:00
|
|
|
};
|
2017-08-11 03:43:20 +00:00
|
|
|
}
|
|
|
|
|
2018-02-18 02:00:56 +00:00
|
|
|
module.exports = createMutex;
|