2.0.3 • Published 5 years ago
mongo-distributed-locks v2.0.3
mongo-distributed-locks
Node.js distributed locking based on Mongodb.
Commands
# Add to project
$ npm i mongo-distributed-locksUsage
const DLocks = require('mongo-distributed-locks');
async function takeFee({ userId, fee }) {
let user = await User.findOne({ _id: userId });
user.balance -= fee;
return user.save();
}
function takeFeeWithLock(params) {
return DLocks.exec({
resource: 'createPayment',
id: params.userId,
fn: takeFee.bind(null, params)
});
}
function doWork() {
let userId = 'userId';
// current user balance is 60
return Promise.all([
takeFeeWithLock({ userId, fee: 10 }),
takeFeeWithLock({ userId, fee: 25 })
]);
// current user balance is 25
}
async function manageLockManually() {
let userId = 'userId';
let lock = await DLocks.lock({
resource: 'user',
id: userId
});
// current user balance is 60
try {
await takeFee({ userId, fee: 10 });
await takeFee({ userId, fee: 25 });
// current user balance is 25
}
finally {
await DLocks.unlock(lock);
}
}API
static registerLoggerErrorFn(loggerErrorFn) Registers logger error function (
DLockscan log a few error messages), if not providedconsole.erroris used`.loggerErrorFn- logger error function. Example of usage:DLocks.registerLoggerErrorFn(logger.error.bind(logger));
static exec({ resource, id, fn }) Creates a
DLocksinstance and executes itsexecmethod. Shortcut forlet instance = new DLocks(params); instance.exec();.resource- operation: createPayment, or resource: user name.id- id of the locking resource.fn- function that does some operation on the locking resource.
static lock({ resource, id, fn }) Locks resource and returns
lockobject. This method can be helpful when you need to manage lock manually. Accepts the same parameters as staticexec.unlock(lock) Unlocks the previously locked resource.
lock- previously generatedlockobject.
Author
Alexander Mac
License
Licensed under the MIT license.
