murlock 4.4.0 → 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 +44 -3
- package/dist/decorators/murlock.decorator.js +4 -0
- package/dist/decorators/murlock.decorator.js.map +1 -1
- package/dist/interfaces/murlock-options.interface.d.ts +3 -0
- package/dist/lua/extend.lua +9 -0
- package/dist/murlock.service.d.ts +3 -0
- package/dist/murlock.service.js +53 -3
- package/dist/murlock.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
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
|
|
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, //
|
|
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
|
|
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
|
|
|
@@ -177,6 +177,10 @@ function MurLock(releaseTime, waitOrKeyParam, ...keyParams) {
|
|
|
177
177
|
const value = Reflect.getMetadata(key, originalMethod);
|
|
178
178
|
Reflect.defineMetadata(key, value, wrapped);
|
|
179
179
|
}
|
|
180
|
+
Object.defineProperty(wrapped, 'name', {
|
|
181
|
+
value: propertyKey,
|
|
182
|
+
configurable: true,
|
|
183
|
+
});
|
|
180
184
|
descriptor.value = wrapped;
|
|
181
185
|
return descriptor;
|
|
182
186
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"murlock.decorator.js","sourceRoot":"","sources":["../../lib/decorators/murlock.decorator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"murlock.decorator.js","sourceRoot":"","sources":["../../lib/decorators/murlock.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -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[];
|
|
@@ -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>;
|
package/dist/murlock.service.js
CHANGED
|
@@ -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.
|
|
199
|
-
|
|
200
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,0CAAuC;AACvC,+BAA4B;AAC5B,iCAAsD;AACtD,mDAAwD;AACxD,6CAAgD;AAEhD,mCAAuC;AAMhC,IAAM,cAAc,sBAApB,MAAM,cAAc;
|
|
1
|
+
{"version":3,"file":"murlock.service.js","sourceRoot":"","sources":["../lib/murlock.service.ts"],"names":[],"mappings":"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"}
|