UNPKG

@jbagatta/johnny-locke

Version:

A robust, strongly-consistent distributed locking library that provides atomic operations across multiple processes

59 lines 2.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getLockObjLuaScript = exports.tryWriteLockLuaScript = exports.tryAcquireLockLuaScript = exports.redisPubSubChannel = exports.lockObjKey = void 0; const lockIdField = 'lockId'; const lockStatusField = 'lockStatus'; const lockObjKeyPrefix = 'data-store.'; const lockObjKey = (key) => `${lockObjKeyPrefix}${key}`; exports.lockObjKey = lockObjKey; const redisPubSubChannel = (namespace) => `redis-distributed-lock-notify:${namespace}`; exports.redisPubSubChannel = redisPubSubChannel; // KEYS[1] = namespacedKey // objKey = data-store.namespacedKey // ARGV[1] = lockId // ARGV[2] = lockTimeoutMs exports.tryAcquireLockLuaScript = ` \ local exists = redis.call('EXISTS', KEYS[1]) \ local objKey = '${lockObjKeyPrefix}' .. KEYS[1] \ local lockObj = redis.call('GET', objKey) \ if (exists == 0 or redis.call('HGET', KEYS[1], '${lockStatusField}') ~= 'locked') then \ redis.call('HSET', KEYS[1], '${lockIdField}', ARGV[1]) \ redis.call('PEXPIRE', KEYS[1], ARGV[2]) \ redis.call('HSET', KEYS[1], '${lockStatusField}', 'locked') \ return {ARGV[1], 'locked', lockObj} \ else \ local lockId = redis.call('HGET', KEYS[1], '${lockIdField}') \ local lockStatus = redis.call('HGET', KEYS[1], '${lockStatusField}') \ return {lockId, lockStatus, lockObj} \ end \ `; // KEYS[1] = namespacedKey // objKey = data-store.namespacedKey // ARGV[1] = lockId // ARGV[2] = lockObj // ARGV[3] = objectExpiryMs exports.tryWriteLockLuaScript = ` \ local exists = redis.call('EXISTS', KEYS[1]) \ if (exists == 1 and redis.call('HGET', KEYS[1], '${lockIdField}') == ARGV[1]) then \ local objKey = '${lockObjKeyPrefix}' .. KEYS[1] \ redis.call('SET', objKey, ARGV[2]) \ if (ARGV[3] == '-1') then \ redis.call('PERSIST', objKey) \ else \ redis.call('PEXPIRE', objKey, ARGV[3]) \ end \ redis.call('HSET', KEYS[1], '${lockStatusField}', 'unlocked') \ return true \ else \ return false \ end \ `; // KEYS[1] = namespacedKey // objKey = data-store.namespacedKey exports.getLockObjLuaScript = ` \ local objKey = '${lockObjKeyPrefix}' .. KEYS[1] \ local lockObj = redis.call('GET', objKey) \ local lockStatus = redis.call('HGET', KEYS[1], '${lockStatusField}') \ return {lockStatus, lockObj} \ `; //# sourceMappingURL=data-model.js.map