murlock 4.4.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -295,13 +295,45 @@ When blocking mode is enabled:
295
295
  - Each retry will wait for the specified `wait` time
296
296
  - Redis errors will be logged but won't stop the retry process
297
297
 
298
+ ## Auto-Extend (Watchdog)
299
+
300
+ A lock is created with a fixed TTL (`releaseTime`). If your operation runs **longer** than `releaseTime`, the lock would normally expire while the work is still in progress — at which point another instance could acquire the same lock and break mutual exclusion (and the original holder would then fail to release it).
301
+
302
+ Enable `autoExtend` to start a watchdog that periodically extends the lock's TTL (only while *this* instance still owns it) for as long as the wrapped operation runs:
303
+
304
+ ```typescript
305
+ @Module({
306
+ imports: [
307
+ MurLockModule.forRoot({
308
+ redisOptions: { url: 'redis://localhost:6379' },
309
+ wait: 1000,
310
+ maxAttempts: 3,
311
+ logLevel: 'log',
312
+ autoExtend: true, // keep the lock alive while the operation runs
313
+ extendInterval: 1000, // optional; defaults to releaseTime / 3
314
+ }),
315
+ ],
316
+ })
317
+ export class AppModule {}
318
+ ```
319
+
320
+ Behavior:
321
+
322
+ - The TTL is refreshed every `extendInterval` ms (default: `Math.floor(releaseTime / 3)`).
323
+ - Extension is ownership-checked: if the lock is lost (e.g. it expired before the first refresh, or was taken over), the watchdog stops and logs a warning.
324
+ - The watchdog timer is `unref`'d, so it never keeps your process alive on its own.
325
+ - Defaults to `false`, so existing behavior is unchanged.
326
+
327
+ > **Tip:** This is especially valuable together with `blocking: true`. Blocking mode makes callers queue until the lock frees, but if the current holder runs longer than `releaseTime` the lock still expires underneath it. `autoExtend` keeps the holder's lock valid for the full duration of its work, so "wait for the previous execution to finish" actually holds even for long-running operations.
328
+
298
329
  ## Redis Connection Handling
299
330
 
300
331
  MurLock includes robust Redis connection handling:
301
332
 
302
333
  - **Automatic Reconnection**: Implements a reconnection strategy with exponential backoff
303
334
  - **Connection Events**: Logs connection status changes (ready, reconnecting, end)
304
- - **Fail-Fast Option**: Can be configured to exit the application on Redis connection failures
335
+ - **Fail-Fast Option**: Can be configured to throw during startup if the **initial** Redis connection fails
336
+ - **Custom Error Handling**: Provide an `onRedisError` callback to react to runtime Redis errors (alerting, custom fail-fast, etc.)
305
337
 
306
338
  ```typescript
307
339
  @Module({
@@ -317,13 +349,19 @@ MurLock includes robust Redis connection handling:
317
349
  },
318
350
  },
319
351
  },
320
- failFastOnRedisError: true, // Exit application on Redis connection failure
352
+ failFastOnRedisError: true, // Throw on startup if the initial connection fails
353
+ onRedisError: (err) => {
354
+ // Optional: custom handling for runtime Redis errors
355
+ console.error('Redis error:', err.message);
356
+ },
321
357
  }),
322
358
  ],
323
359
  })
324
360
  export class AppModule {}
325
361
  ```
326
362
 
363
+ > **Note (v5 behavior change):** Runtime Redis `error` events no longer terminate the process. Previously, with `failFastOnRedisError: true`, *any* runtime Redis error (including transient network blips) would call `process.exit(1)`, taking the whole application down mid-request. Now `failFastOnRedisError` applies only to the initial connection attempt; runtime errors are logged, recovery is handled by the reconnect strategy, and you can opt into custom handling via `onRedisError`.
364
+
327
365
  ## Using Custom Lock Key
328
366
 
329
367
  By default, murlock use class and method name prefix for example Userservice:createUser:{userId}. By setting lockKeyPrefix as 'custom' you can define by yourself manually.
@@ -476,8 +514,11 @@ Here are the customizable options for `MurLockModule`, allowing you to tailor it
476
514
  - **lockKeyPrefix (optional)**: Specifies how lock keys are prefixed, allowing for greater flexibility:
477
515
  - **Default**: Uses class and method names as prefixes, e.g., `Userservice:createUser:{userId}`.
478
516
  - **Custom**: Set this to 'custom' to define lock keys manually in your service methods, allowing for specific lock key constructions beyond the standard naming.
479
- - **failFastOnRedisError (optional)**: When set to `true`, the application will exit with code 1 if a Redis connection error occurs. Defaults to `false`.
517
+ - **failFastOnRedisError (optional)**: When set to `true`, the application will throw during startup (`onModuleInit`) if the **initial** Redis connection fails. Defaults to `false`. **Note (behavior change):** this option no longer terminates the process on *runtime* Redis errors (e.g. transient network blips). Runtime errors are logged and recovery is handled by the reconnect strategy. Use `onRedisError` for custom runtime handling.
480
518
  - **blocking (optional)**: When set to `true`, the lock acquisition will retry indefinitely until successful. Defaults to `false`.
519
+ - **autoExtend (optional)**: When set to `true`, MurLock keeps the lock alive while the wrapped operation is still running by periodically extending its TTL (a "watchdog"). This prevents the lock from expiring mid-execution when an operation runs longer than `releaseTime`, which would otherwise let another instance acquire the same lock and break mutual exclusion. Defaults to `false`.
520
+ - **extendInterval (optional)**: Interval in milliseconds between watchdog TTL extensions. Only used when `autoExtend` is `true`. Defaults to one third of the lock's `releaseTime` (`Math.floor(releaseTime / 3)`), guaranteeing at least two refresh attempts before the TTL would expire.
521
+ - **onRedisError (optional)**: Callback `(error: Error) => void` invoked when the Redis client emits a runtime `error` event. Use it to plug in custom alerting or fail-fast behavior.
481
522
 
482
523
  ### MurLockService
483
524
 
@@ -8,6 +8,9 @@ export interface MurLockModuleOptions {
8
8
  lockKeyPrefix?: 'default' | 'custom';
9
9
  failFastOnRedisError?: boolean;
10
10
  blocking?: boolean;
11
+ autoExtend?: boolean;
12
+ extendInterval?: number;
13
+ onRedisError?: (error: Error) => void;
11
14
  }
12
15
  export interface MurLockModuleAsyncOptions {
13
16
  imports?: any[];
@@ -0,0 +1,9 @@
1
+ local key = KEYS[1]
2
+ local clientId = ARGV[1]
3
+ local releaseTime = ARGV[2]
4
+
5
+ if redis.call("get", key) == clientId then
6
+ return redis.call("pexpire", key, releaseTime)
7
+ else
8
+ return 0
9
+ end
@@ -8,6 +8,7 @@ export declare class MurLockService implements OnModuleInit, OnApplicationShutdo
8
8
  private redisClient;
9
9
  private lockScript;
10
10
  private unlockScript;
11
+ private extendScript;
11
12
  constructor(options: MurLockModuleOptions, asyncStorageService: AsyncStorageService);
12
13
  onModuleInit(): Promise<void>;
13
14
  onApplicationShutdown(signal?: string): Promise<void>;
@@ -15,6 +16,8 @@ export declare class MurLockService implements OnModuleInit, OnApplicationShutdo
15
16
  private log;
16
17
  private lock;
17
18
  private unlock;
19
+ private extendLock;
20
+ private startWatchdog;
18
21
  private acquireLock;
19
22
  private releaseLock;
20
23
  runWithLock<R>(lockKey: string, releaseTime: number, fn: () => Promise<R>): Promise<R>;
@@ -41,6 +41,7 @@ let MurLockService = MurLockService_1 = class MurLockService {
41
41
  try {
42
42
  this.lockScript = yield (0, promises_1.readFile)((0, path_1.join)(__dirname, './lua/lock.lua'), 'utf8');
43
43
  this.unlockScript = yield (0, promises_1.readFile)((0, path_1.join)(__dirname, './lua/unlock.lua'), 'utf8');
44
+ this.extendScript = yield (0, promises_1.readFile)((0, path_1.join)(__dirname, './lua/extend.lua'), 'utf8');
44
45
  }
45
46
  catch (error) {
46
47
  throw new exceptions_1.MurLockException(`Failed to load Lua scripts: ${error.message}`);
@@ -74,6 +75,9 @@ let MurLockService = MurLockService_1 = class MurLockService {
74
75
  return new Promise((resolve) => setTimeout(resolve, ms));
75
76
  }
76
77
  log(level, message, context) {
78
+ if (this.options.logLevel === 'none') {
79
+ return;
80
+ }
77
81
  const levels = [
78
82
  'debug',
79
83
  'log',
@@ -145,6 +149,46 @@ let MurLockService = MurLockService_1 = class MurLockService {
145
149
  }
146
150
  });
147
151
  }
152
+ extendLock(lockKey, clientId, releaseTime) {
153
+ return __awaiter(this, void 0, void 0, function* () {
154
+ const result = yield this.redisClient.sendCommand([
155
+ 'EVAL',
156
+ this.extendScript,
157
+ '1',
158
+ lockKey,
159
+ clientId,
160
+ releaseTime.toString(),
161
+ ]);
162
+ return result === 1;
163
+ });
164
+ }
165
+ startWatchdog(lockKey, clientId, releaseTime) {
166
+ if (!this.options.autoExtend) {
167
+ return () => { };
168
+ }
169
+ const interval = this.options.extendInterval && this.options.extendInterval > 0
170
+ ? this.options.extendInterval
171
+ : Math.max(1, Math.floor(releaseTime / 3));
172
+ const timer = setInterval(() => __awaiter(this, void 0, void 0, function* () {
173
+ try {
174
+ const extended = yield this.extendLock(lockKey, clientId, releaseTime);
175
+ if (extended) {
176
+ this.log('debug', `Watchdog extended lock for key ${lockKey}`);
177
+ }
178
+ else {
179
+ this.log('warn', `Watchdog could not extend lock for key ${lockKey} (ownership lost); stopping watchdog.`);
180
+ clearInterval(timer);
181
+ }
182
+ }
183
+ catch (error) {
184
+ this.log('error', `Watchdog error while extending lock for key ${lockKey}: ${error.message}`);
185
+ }
186
+ }), interval);
187
+ if (typeof timer.unref === 'function') {
188
+ timer.unref();
189
+ }
190
+ return () => clearInterval(timer);
191
+ }
148
192
  acquireLock(lockKey, clientId, releaseTime, wait) {
149
193
  return __awaiter(this, void 0, void 0, function* () {
150
194
  let isLockSuccessful = false;
@@ -184,10 +228,12 @@ let MurLockService = MurLockService_1 = class MurLockService {
184
228
  this.asyncStorageService.setClientID('clientId', (0, utils_1.generateUuid)());
185
229
  const clientId = this.asyncStorageService.get('clientId');
186
230
  yield this.acquireLock(lockKey, clientId, releaseTime, wait);
231
+ const stopWatchdog = this.startWatchdog(lockKey, clientId, releaseTime);
187
232
  try {
188
233
  return yield operation();
189
234
  }
190
235
  finally {
236
+ stopWatchdog();
191
237
  yield this.releaseLock(lockKey, clientId);
192
238
  }
193
239
  });
@@ -195,9 +241,13 @@ let MurLockService = MurLockService_1 = class MurLockService {
195
241
  registerRedisErrorHandlers() {
196
242
  this.redisClient.on('error', (err) => {
197
243
  this.log('error', `MurLock Redis Client Error: ${err.message}`);
198
- if (this.options.failFastOnRedisError) {
199
- this.log('error', 'MurLock Redis entering fail-fast shutdown due to Redis error.');
200
- process.exit(1);
244
+ if (typeof this.options.onRedisError === 'function') {
245
+ try {
246
+ this.options.onRedisError(err);
247
+ }
248
+ catch (callbackError) {
249
+ this.log('error', `MurLock onRedisError callback threw: ${callbackError.message}`);
250
+ }
201
251
  }
202
252
  });
203
253
  this.redisClient.on('reconnecting', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"murlock.service.js","sourceRoot":"","sources":["../lib/murlock.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"murlock.service.js","sourceRoot":"","sources":["../lib/murlock.service.ts"],"names":[],"mappings":"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"}