Commit 945145c0016e68ab95bf0003dc41a937777aaf36
1 parent
fe3033bbf9
Exists in
master
mutex-common.js
Showing 1 changed file with 57 additions and 0 deletions Side-by-side Diff
lib/mutex-common.js
... | ... | @@ -0,0 +1,57 @@ |
1 | +const DEBUGMODE = (process.env.NODE_ENV !== 'production') || process.env.DEBUG_MUTEX; | |
2 | + | |
3 | +const locks = require('locks'); | |
4 | +const logger = require('komodo-sdk/logger'); | |
5 | + | |
6 | +const locksList = {}; | |
7 | +const lockBy = {}; | |
8 | + | |
9 | +exports.lock = function lock(lockName, label, cb) { | |
10 | + if (DEBUGMODE) logger.verbose('Locking MUTEX', { lockName, label }); | |
11 | + return new Promise((resolve) => { | |
12 | + if (!locksList[lockName]) { | |
13 | + locksList[lockName] = locks.createMutex(); | |
14 | + } | |
15 | + | |
16 | + locksList[lockName].lock(() => { | |
17 | + lockBy[lockName] = label; | |
18 | + if (DEBUGMODE) logger.verbose('MUTEX locked', { lockName, label }); | |
19 | + resolve(true); | |
20 | + if (typeof cb === 'function') cb(); | |
21 | + }); | |
22 | + }); | |
23 | +}; | |
24 | + | |
25 | +exports.tryLock = function tryLock(lockName, label) { | |
26 | + if (DEBUGMODE) logger.verbose('Trying to enter MUTEX if not locked', { lockName, label }); | |
27 | + | |
28 | + if (!locksList[lockName]) { | |
29 | + locksList[lockName] = locks.createMutex(); | |
30 | + } | |
31 | + | |
32 | + const result = locksList[lockName].tryLock(); | |
33 | + if (DEBUGMODE && result) logger.verbose('MUTEX entered', { lockName, label }); | |
34 | + if (DEBUGMODE && !result) logger.verbose('MUTEX not entered', { lockName, label }); | |
35 | + return result; | |
36 | +}; | |
37 | + | |
38 | + | |
39 | +exports.unlock = function unlock(lockName, label) { | |
40 | + if (DEBUGMODE) logger.verbose('Unlocking MUTEX', { lockName, label }); | |
41 | + | |
42 | + if (!locksList[lockName]) { | |
43 | + logger.warn('Try to unlock undefined MUTEX', { lockName, label }); | |
44 | + return; | |
45 | + } | |
46 | + | |
47 | + try { | |
48 | + if (locksList[lockName]) locksList[lockName].unlock(); | |
49 | + if (DEBUGMODE) logger.verbose('MUTEX unlocked', { lockName, label }); | |
50 | + } catch (e) { | |
51 | + logger.warn('Exception on unlocking MUTEX', { lockName, label, e }); | |
52 | + } | |
53 | +}; | |
54 | + | |
55 | +exports.getLockBy = function getLockBy(lockName) { | |
56 | + return lockBy[lockName]; | |
57 | +}; |