dreadlocks
Dread-free locks that drive consistency.
Summary
Dreadlocks allows you to create deadlocks on a set of keys. There is no limitation as to what key can
be, it could be an Object
, an Array
, a String
, or anything that can be a key in Map
.
- Create and use keys to identify objects:
const key1 = {};
- Create key sets for keys involved in each task:
const keySet = [key1, key2, key3]
- Lock these key sets
Dread.lock(keySet).then(task)
- Release these key sets once you're done.
Dread.release(keySet)
Perks
- Respects
FIFO
(first-in-first-out) flow:- Iterates on queue item 0 to n then back to 0.
- Reverts index to 0 on each performed lock.
- Reverts index to 0 on each performed release.
- Uses
Map
so you can use anything as a key.- Although of course, use of
strings
are the most encouraged.
- Although of course, use of
- Uses
setInterval
for periodic checks and processing of queue.new Dreadlock(interval)
accepts custominterval
in ms,4
by default; 1000/4 =250 checks/s
Use Cases:
- Database consistency & transactions.
- Ensuring order in execution of tasks that wish to modify possibly similar objects or entities.
API
Constructor
new Dreadlocks({ defaultLockTimeout = Infinity })
Construct an instance of Dreadlock. You can also set a default timeout to wait for a lock.
Methods
#lock(keyset[], { lockTimeout = this.defaultLockTimeout } = {})
keyset
array of keys to locklockTimeout
timeout in ms for the lock to be obtained
Return a Promise
which will resolve when the lock is obtained, or reject when the
timeout is reached.
#release(keyset[])
keyset
array of keys to release
Properties
#size
Current size of instance Map
Usage:
Install
npm install dreadlocks --save
yarn add dreadlocks
const Dreadlock = require('dreadlocks');
Create instance
const Dread = new Dreadlock();
Lock your keys anywhere in your code:
const keySet1 = ['key1', 'key2', 'key3'];
Dread.lock(keySet1)
.then(() => {
console.log('Working with keySet1.');
// Use your keySet1 keys here
console.log('Done with keySet1.');
return Dread.release(keySet1);
})
.then(() => {
console.log('keySet1 released.');
});
const keySet2 = ['key1', 'key4', 'key5'];
Dread.lock(keySet2)
.then(() => {
console.log('Working with keySet2.');
// Use your keySet2 keys here
console.log('Done with keySet2.');
return Dread.release(keySet2);
})
.then(() => {
console.log('keySet2 released.');
});
See the magic:
Working with keySet1.
Done with keySet1.
keySet1 released.
Working with keySet2.
Done with keySet2.
keySet2 released.
LICENSE