better-lock 3.3.0 → 4.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 +57 -10
- package/dist/async_context.d.ts +27 -0
- package/dist/async_context.js +58 -0
- package/dist/async_context.js.map +1 -0
- package/dist/better_lock.d.ts +21 -1
- package/dist/better_lock.js +157 -36
- package/dist/better_lock.js.map +1 -1
- package/dist/errors.d.ts +11 -0
- package/dist/errors.js +19 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/internals.d.ts +10 -0
- package/dist/internals.js +9 -0
- package/dist/internals.js.map +1 -1
- package/dist/options.d.ts +21 -0
- package/package.json +1 -1
- package/spec/async_context.spec.ts +379 -0
- package/src/async_context.ts +86 -0
- package/src/better_lock.ts +174 -42
- package/src/errors.ts +28 -0
- package/src/index.ts +5 -1
- package/src/internals.ts +12 -0
- package/src/options.ts +24 -0
package/README.md
CHANGED
|
@@ -9,6 +9,8 @@ A (better) node.js lock library.
|
|
|
9
9
|
- Queue and execution timeouts
|
|
10
10
|
- Queue size limit
|
|
11
11
|
- Lock on multiple keys
|
|
12
|
+
- Reentrancy, with deadlock prevention (Node.js)
|
|
13
|
+
- Executors run in the caller's async context, preserving `AsyncLocalStorage` stores (Node.js)
|
|
12
14
|
- Extended stack traces
|
|
13
15
|
- Promise and callback interface
|
|
14
16
|
- JSDoc annotations
|
|
@@ -42,6 +44,9 @@ Extended stack traces are enabled by default when the runtime supports `Error.ca
|
|
|
42
44
|
In browsers without that API, Better Lock automatically skips stack extension and otherwise works
|
|
43
45
|
normally.
|
|
44
46
|
|
|
47
|
+
[Async context](#async-context) and [reentrancy](#reentrancy) require Node.js `async_hooks`, so they are unavailable in
|
|
48
|
+
browsers. See [Runtime support](#runtime-support).
|
|
49
|
+
|
|
45
50
|
### Documentation
|
|
46
51
|
|
|
47
52
|
Full docs: <https://panta82.github.io/better-lock/>
|
|
@@ -150,15 +155,13 @@ lock.acquire(
|
|
|
150
155
|
);
|
|
151
156
|
```
|
|
152
157
|
|
|
153
|
-
You can see a bunch more usage examples in the spec file, [here](spec/better_lock.spec.ts);
|
|
154
|
-
|
|
155
158
|
### API
|
|
156
159
|
|
|
157
160
|
- `new BetterLock(options)`
|
|
158
161
|
Create a new instance of `BetterLock`. Options should match interface `BetterLockOptions`. See below for details.
|
|
159
162
|
|
|
160
163
|
- `BetterLock.acquire([key], executor, [callback], [jobOptions])`
|
|
161
|
-
The main method you'll want to call. For each `key`, given `executor` will be called only one at a time. If you don't provide `callback`, it will return a promise that will be resolved with whatever `executor` returns.
|
|
164
|
+
The main method you'll want to call. For each `key`, given `executor` will be called only one at a time. If you don't provide `callback`, it will return a promise that will be resolved with whatever `executor` returns. If the caller already holds the keys, the executor runs without waiting (see [Reentrancy](#reentrancy)).
|
|
162
165
|
|
|
163
166
|
- `key`: Arbitrary string under which to lock. It allows you to use the same lock instance for multiple parallel concerns. Eg. this might be a database record id or filename.
|
|
164
167
|
- `executor`: Function that will be called within the lock. This function should have one of two forms.
|
|
@@ -172,7 +175,7 @@ You can see a bunch more usage examples in the spec file, [here](spec/better_loc
|
|
|
172
175
|
an error, the lock will resolve/callback with the provided failureResult value (for example, a `null`).
|
|
173
176
|
|
|
174
177
|
- `BetterLock.canAcquire([key])`
|
|
175
|
-
Returns true if given key can be acquired.
|
|
178
|
+
Returns true if the given key can be acquired immediately: nothing holds it and nothing waits for it, or the caller already holds it and reentrancy is allowed.
|
|
176
179
|
|
|
177
180
|
- `BetterLock.abort([key])`
|
|
178
181
|
Abort all jobs for a given key (or from the default job queue, if no key is given). Job executors will not be called. Callbacks will be called with `JobAbortedError`. Currently executing job will not be interrupted.
|
|
@@ -206,6 +209,9 @@ Most commonly used options are:
|
|
|
206
209
|
- `queue_size`
|
|
207
210
|
Max queue size for waiting jobs.
|
|
208
211
|
|
|
212
|
+
- `reentrancy`
|
|
213
|
+
`'allow'` (default) or `'error'`. What to do when the caller already holds all the requested keys. See [Reentrancy](#reentrancy).
|
|
214
|
+
|
|
209
215
|
Default options are a static member `DEFAULT_OPTIONS` on the `BetterLock` class. During runtime, you can change the defaults like this:
|
|
210
216
|
|
|
211
217
|
```javascript
|
|
@@ -214,6 +220,47 @@ import BetterLock from 'better-lock';
|
|
|
214
220
|
BetterLock.DEFAULT_OPTIONS.wait_timeout = 1000;
|
|
215
221
|
```
|
|
216
222
|
|
|
223
|
+
### Reentrancy
|
|
224
|
+
|
|
225
|
+
Reentrancy means you can re-take the same lock from within the lock. This uses node's [AsyncLocalStorage](https://beta.docs.nodejs.org/async_context#class-asynclocalstorage) under the hood.
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
const lock = new BetterLock();
|
|
229
|
+
|
|
230
|
+
async function saveUser(user) {
|
|
231
|
+
return lock.acquire(user.id, () => db.save(user));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async function renameUser(id, name) {
|
|
235
|
+
return lock.acquire(id, async () => {
|
|
236
|
+
const user = await db.load(id);
|
|
237
|
+
user.name = name;
|
|
238
|
+
// Holds `id` already, so this doesn't wait
|
|
239
|
+
return saveUser(user);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
If you use multi-keys, the reentrancy will only work if you already hold _all_ the requested keys. Otherwise, the acquire fails with `BetterLockReentrancyError` (passed to the callback, or rejected from the promise), to prevent deadlocks. `acquireOr` passes it on too, instead of returning `failureResult`.
|
|
245
|
+
|
|
246
|
+
Reentrant acquire works transparently. You'll get an immediate callback in the next tick, without taking any extra slots. `canAcquire(key)` returns true. If `lock_condition` rejects the key, nothing is locked, so there is nothing to reenter.
|
|
247
|
+
|
|
248
|
+
### Async context
|
|
249
|
+
|
|
250
|
+
Executors and callbacks run in the async context of the `acquire` call. If you use `AsyncLocalStorage` (eg. for request ids in logs), code inside the executor sees the store of whoever called `acquire`, even if it had to wait for another caller to release the lock.
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
const requestContext = new AsyncLocalStorage();
|
|
254
|
+
|
|
255
|
+
requestContext.run({ requestId: 1 }, () => lock.acquire(() => slowTask()));
|
|
256
|
+
requestContext.run({ requestId: 2 }, () =>
|
|
257
|
+
lock.acquire(() => {
|
|
258
|
+
// Runs after request 1 releases the lock, but still sees request 2's store
|
|
259
|
+
console.log(requestContext.getStore().requestId); // 2
|
|
260
|
+
})
|
|
261
|
+
);
|
|
262
|
+
```
|
|
263
|
+
|
|
217
264
|
### When to use
|
|
218
265
|
|
|
219
266
|
This library is a good fit if:
|
|
@@ -223,15 +270,15 @@ This library is a good fit if:
|
|
|
223
270
|
- You like good error messages, with full stack traces.
|
|
224
271
|
- You like good types, either through typescript or JSDoc comments
|
|
225
272
|
|
|
226
|
-
The library is not a good fit if
|
|
273
|
+
The library is not a good fit if you need a **shared lock between different processes**. BetterLock is single process only.
|
|
227
274
|
|
|
228
|
-
|
|
229
|
-
The library doesn't currently use node's new `AsyncLocalStorage` API, so it doesn't support reentrancy. You are safe from deadlocks when calling with multiple keys, because the keys are enqueued synchronously. But you should not call `lock.acquire` from within an executor function or its sub-calls (or make sure you know what you're doing).
|
|
275
|
+
### Change log
|
|
230
276
|
|
|
231
|
-
|
|
232
|
-
This library is a single process only. If you need to coordinate multiple apps or services, you need a different library.
|
|
277
|
+
#### **4.0.0** (_2026/11/09_)
|
|
233
278
|
|
|
234
|
-
|
|
279
|
+
- Added **reentrancy**, You can now acquire the same lock again from within the lock. Set `options.reentrancy` to `"error"` to fail with `BetterLockReentrancyError` instead of re-locking the keys.
|
|
280
|
+
- Executors and callbacks run in the async context of their `acquire` call, so `AsyncLocalStorage` stores no longer leak from the previous lock holder.
|
|
281
|
+
- Both features require `process.getBuiltinModule` (Node.js 20.16+ or 22.3+). In other runtimes, the lock behaves as before.
|
|
235
282
|
|
|
236
283
|
#### **3.3.0** (_2026/08/25_)
|
|
237
284
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { LockJob } from './internals';
|
|
2
|
+
/**
|
|
3
|
+
* The subset of Node.js AsyncResource we use. Declared locally, so the package (and its type declarations)
|
|
4
|
+
* don't depend on Node.js types and keep working in browsers.
|
|
5
|
+
*/
|
|
6
|
+
export interface IAsyncResource {
|
|
7
|
+
runInAsyncScope<TResult>(fn: (...args: any[]) => TResult, thisArg?: any, ...args: any[]): TResult;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Jobs whose executors are currently running, in the current async context. Jobs from all lock instances
|
|
11
|
+
* share one list; a job only ever matches the queues of the lock that created it.
|
|
12
|
+
*/
|
|
13
|
+
declare type IHeldJobs = ReadonlyArray<LockJob<any>>;
|
|
14
|
+
/**
|
|
15
|
+
* Capture the current async context, so a job can later run in it. Undefined if the runtime doesn't support it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function captureAsyncContext(): IAsyncResource | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Jobs that are executing in the current async context (the caller is inside their executors).
|
|
20
|
+
* Ended jobs can still be listed here (eg. detached work that outlived its job), so check `ended_at`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getHeldJobs(): IHeldJobs | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Run fn with the given job added to the jobs held in the current async context.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runHoldingJob<TResult>(job: LockJob<any>, fn: () => TResult): TResult;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runHoldingJob = exports.getHeldJobs = exports.captureAsyncContext = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Look up Node.js async_hooks at runtime, without a static import, so bundlers and browsers never see it.
|
|
6
|
+
* Requires Node.js 20.16+ or 22.3+. Returns undefined everywhere else.
|
|
7
|
+
*/
|
|
8
|
+
function lookupAsyncHooks() {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
try {
|
|
11
|
+
var asyncHooks_1 = (_b = (_a = globalThis.process) === null || _a === void 0 ? void 0 : _a.getBuiltinModule) === null || _b === void 0 ? void 0 : _b.call(_a, 'node:async_hooks');
|
|
12
|
+
if (asyncHooks_1 &&
|
|
13
|
+
typeof asyncHooks_1.AsyncResource === 'function' &&
|
|
14
|
+
typeof asyncHooks_1.AsyncLocalStorage === 'function') {
|
|
15
|
+
return asyncHooks_1;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
// Unsupported runtime
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
var asyncHooks = lookupAsyncHooks();
|
|
24
|
+
var lockContext = asyncHooks
|
|
25
|
+
? new asyncHooks.AsyncLocalStorage()
|
|
26
|
+
: undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Capture the current async context, so a job can later run in it. Undefined if the runtime doesn't support it.
|
|
29
|
+
*/
|
|
30
|
+
function captureAsyncContext() {
|
|
31
|
+
return asyncHooks ? new asyncHooks.AsyncResource('BetterLock') : undefined;
|
|
32
|
+
}
|
|
33
|
+
exports.captureAsyncContext = captureAsyncContext;
|
|
34
|
+
/**
|
|
35
|
+
* Jobs that are executing in the current async context (the caller is inside their executors).
|
|
36
|
+
* Ended jobs can still be listed here (eg. detached work that outlived its job), so check `ended_at`.
|
|
37
|
+
*/
|
|
38
|
+
function getHeldJobs() {
|
|
39
|
+
return lockContext ? lockContext.getStore() : undefined;
|
|
40
|
+
}
|
|
41
|
+
exports.getHeldJobs = getHeldJobs;
|
|
42
|
+
/**
|
|
43
|
+
* Run fn with the given job added to the jobs held in the current async context.
|
|
44
|
+
*/
|
|
45
|
+
function runHoldingJob(job, fn) {
|
|
46
|
+
if (!lockContext) {
|
|
47
|
+
return fn();
|
|
48
|
+
}
|
|
49
|
+
return lockContext.run(withHeldJob(lockContext.getStore(), job), fn);
|
|
50
|
+
}
|
|
51
|
+
exports.runHoldingJob = runHoldingJob;
|
|
52
|
+
function withHeldJob(heldJobs, job) {
|
|
53
|
+
// Drop ended jobs, so the list doesn't grow when each executor schedules the next acquire
|
|
54
|
+
var result = heldJobs ? heldJobs.filter(function (heldJob) { return !heldJob.ended_at; }) : [];
|
|
55
|
+
result.push(job);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=async_context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async_context.js","sourceRoot":"","sources":["../src/async_context.ts"],"names":[],"mappings":";;;AA6BA;;;GAGG;AACH,SAAS,gBAAgB;;IACvB,IAAI;QACF,IAAM,YAAU,GAAG,MAAA,MAAC,UAAkB,CAAC,OAAO,0CAAE,gBAAgB,mDAAG,kBAAkB,CAAC,CAAC;QACvF,IACE,YAAU;YACV,OAAO,YAAU,CAAC,aAAa,KAAK,UAAU;YAC9C,OAAO,YAAU,CAAC,iBAAiB,KAAK,UAAU,EAClD;YACA,OAAO,YAAU,CAAC;SACnB;KACF;IAAC,OAAO,GAAG,EAAE;QACZ,sBAAsB;KACvB;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,IAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;AAEtC,IAAM,WAAW,GAA8C,UAAU;IACvE,CAAC,CAAC,IAAI,UAAU,CAAC,iBAAiB,EAAa;IAC/C,CAAC,CAAC,SAAS,CAAC;AAEd;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC;AAFD,kDAEC;AAED;;;GAGG;AACH,SAAgB,WAAW;IACzB,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAFD,kCAEC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAU,GAAiB,EAAE,EAAiB;IACzE,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,EAAE,EAAE,CAAC;KACb;IACD,OAAO,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AALD,sCAKC;AAED,SAAS,WAAW,CAAC,QAA+B,EAAE,GAAiB;IACrE,0FAA0F;IAC1F,IAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAA,OAAO,IAAI,OAAA,CAAC,OAAO,CAAC,QAAQ,EAAjB,CAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/better_lock.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ export declare class BetterLock {
|
|
|
11
11
|
private readonly options;
|
|
12
12
|
private readonly log;
|
|
13
13
|
private readonly queues;
|
|
14
|
+
/**
|
|
15
|
+
* Reentrant jobs that haven't started executing yet. They are not in any key queue, so we track them here for abort().
|
|
16
|
+
*/
|
|
17
|
+
private readonly pendingReentrantJobs;
|
|
14
18
|
/**
|
|
15
19
|
* Create a better lock instance
|
|
16
20
|
*/
|
|
@@ -20,9 +24,20 @@ export declare class BetterLock {
|
|
|
20
24
|
*/
|
|
21
25
|
private getQueue;
|
|
22
26
|
/**
|
|
23
|
-
* Returns true if the caller can *immediately* acquire the lock. There is nothing holding the key and nothing in the queue
|
|
27
|
+
* Returns true if the caller can *immediately* acquire the lock. There is nothing holding the key and nothing in the queue,
|
|
28
|
+
* or the caller already holds the key and reentrancy is allowed.
|
|
24
29
|
*/
|
|
25
30
|
canAcquire(key?: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* True if the given queue's key is held by a job that is executing in the caller's async context.
|
|
33
|
+
* Ended jobs don't count, so detached work that outlives its job doesn't skip the lock.
|
|
34
|
+
*/
|
|
35
|
+
private isHeldByCaller;
|
|
36
|
+
/**
|
|
37
|
+
* Find which of the given keys the caller already holds, and the jobs holding them.
|
|
38
|
+
* Returns null if the caller holds none of them.
|
|
39
|
+
*/
|
|
40
|
+
private findHeldKeys;
|
|
26
41
|
private normalizeAndValidateKey;
|
|
27
42
|
acquire<TResult extends IValidResult>(executor: IPromiseExecutor<TResult>, jobOptions?: ILockJobOptions): Promise<TResult>;
|
|
28
43
|
acquire<TResult extends IValidResult>(executor: ICallbackExecutor<TResult>, jobOptions?: ILockJobOptions): Promise<TResult>;
|
|
@@ -30,6 +45,10 @@ export declare class BetterLock {
|
|
|
30
45
|
acquire<TResult extends IValidResult>(key: ILockKey | Array<ILockKey>, executor: IPromiseExecutor<TResult>, jobOptions?: ILockJobOptions): Promise<TResult>;
|
|
31
46
|
acquire<TResult extends IValidResult>(key: ILockKey | Array<ILockKey>, executor: ICallbackExecutor<TResult>, jobOptions?: ILockJobOptions): Promise<TResult>;
|
|
32
47
|
acquire<TResult extends IValidResult>(key: ILockKey | Array<ILockKey>, executor: ICallbackExecutor<TResult>, callback: ICallback<TResult>, jobOptions?: ILockJobOptions): void;
|
|
48
|
+
/**
|
|
49
|
+
* Add job to its key queues and start waiting for the keys
|
|
50
|
+
*/
|
|
51
|
+
private enqueueJob;
|
|
33
52
|
acquireOr<TResult extends IValidResult>(failureResult: TResult, executor: IPromiseExecutor<TResult>, jobOptions?: ILockJobOptions): Promise<TResult>;
|
|
34
53
|
acquireOr<TResult extends IValidResult>(failureResult: TResult, executor: ICallbackExecutor<TResult>, jobOptions?: ILockJobOptions): Promise<TResult>;
|
|
35
54
|
acquireOr<TResult extends IValidResult>(failureResult: TResult, executor: ICallbackExecutor<TResult>, callback: ICallback<TResult>, jobOptions?: ILockJobOptions): void;
|
|
@@ -51,6 +70,7 @@ export declare class BetterLock {
|
|
|
51
70
|
* @param [key]
|
|
52
71
|
*/
|
|
53
72
|
abort(key?: ILockKey): void;
|
|
73
|
+
private removePendingReentrantJob;
|
|
54
74
|
/**
|
|
55
75
|
* Abort all pending jobs from all queues.
|
|
56
76
|
* Currently executing jobs will not be interrupted.
|
package/dist/better_lock.js
CHANGED
|
@@ -10,6 +10,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.BetterLock = void 0;
|
|
13
|
+
var async_context_1 = require("./async_context");
|
|
13
14
|
var errors_1 = require("./errors");
|
|
14
15
|
var internals_1 = require("./internals");
|
|
15
16
|
var tools = require("./tools");
|
|
@@ -21,6 +22,10 @@ var BetterLock = /** @class */ (function () {
|
|
|
21
22
|
* Create a better lock instance
|
|
22
23
|
*/
|
|
23
24
|
function BetterLock(options) {
|
|
25
|
+
/**
|
|
26
|
+
* Reentrant jobs that haven't started executing yet. They are not in any key queue, so we track them here for abort().
|
|
27
|
+
*/
|
|
28
|
+
this.pendingReentrantJobs = [];
|
|
24
29
|
this.options = tools.assign({}, [BetterLock.DEFAULT_OPTIONS, options]);
|
|
25
30
|
this.log = tools.makeLog(this.options.name, this.options.log);
|
|
26
31
|
this.queues = {};
|
|
@@ -39,11 +44,43 @@ var BetterLock = /** @class */ (function () {
|
|
|
39
44
|
return queue;
|
|
40
45
|
};
|
|
41
46
|
/**
|
|
42
|
-
* Returns true if the caller can *immediately* acquire the lock. There is nothing holding the key and nothing in the queue
|
|
47
|
+
* Returns true if the caller can *immediately* acquire the lock. There is nothing holding the key and nothing in the queue,
|
|
48
|
+
* or the caller already holds the key and reentrancy is allowed.
|
|
43
49
|
*/
|
|
44
50
|
BetterLock.prototype.canAcquire = function (key) {
|
|
45
51
|
var queue = this.getQueue(key);
|
|
46
|
-
|
|
52
|
+
if (!queue.active && !queue.jobs.length) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
return this.options.reentrancy !== 'error' && this.isHeldByCaller(queue, (0, async_context_1.getHeldJobs)());
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* True if the given queue's key is held by a job that is executing in the caller's async context.
|
|
59
|
+
* Ended jobs don't count, so detached work that outlives its job doesn't skip the lock.
|
|
60
|
+
*/
|
|
61
|
+
BetterLock.prototype.isHeldByCaller = function (queue, heldJobs) {
|
|
62
|
+
var holder = queue.active;
|
|
63
|
+
return !!(heldJobs && holder && !holder.ended_at && heldJobs.indexOf(holder) >= 0);
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Find which of the given keys the caller already holds, and the jobs holding them.
|
|
67
|
+
* Returns null if the caller holds none of them.
|
|
68
|
+
*/
|
|
69
|
+
BetterLock.prototype.findHeldKeys = function (keys) {
|
|
70
|
+
var heldJobs = (0, async_context_1.getHeldJobs)();
|
|
71
|
+
if (!heldJobs || !keys.length) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
var holders = [];
|
|
75
|
+
var heldKeys = [];
|
|
76
|
+
for (var i = 0; i < keys.length; i++) {
|
|
77
|
+
var queue = this.getQueue(keys[i]);
|
|
78
|
+
if (this.isHeldByCaller(queue, heldJobs)) {
|
|
79
|
+
holders.push(queue.active);
|
|
80
|
+
heldKeys.push(keys[i]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return holders.length ? { holders: holders, heldKeys: heldKeys } : null;
|
|
47
84
|
};
|
|
48
85
|
BetterLock.prototype.normalizeAndValidateKey = function (key) {
|
|
49
86
|
if (key === undefined) {
|
|
@@ -65,6 +102,10 @@ var BetterLock = /** @class */ (function () {
|
|
|
65
102
|
* Acquire the lock for given key or list of keys. If waiting on a list, keys will be acquired in order,
|
|
66
103
|
* as they become free. Any deadlock prevention must be handled by the caller.
|
|
67
104
|
*
|
|
105
|
+
* If the caller already holds all the keys (it runs inside an executor holding them), the executor runs
|
|
106
|
+
* without waiting. If it holds only some of the keys, or the "reentrancy" option is set to "error", the
|
|
107
|
+
* callback (or the promise) gets BetterLockReentrancyError. Reentrancy requires Node.js AsyncLocalStorage.
|
|
108
|
+
*
|
|
68
109
|
* Once the lock is acquired, we will call the executor function, with a "done" method.
|
|
69
110
|
* You must call "done" to release the lock. Alternatively, return a Promise; lock will be released
|
|
70
111
|
* once promise resolves or rejects.
|
|
@@ -77,7 +118,6 @@ var BetterLock = /** @class */ (function () {
|
|
|
77
118
|
* @param jobOptions Options to be applied on this job only
|
|
78
119
|
*/
|
|
79
120
|
BetterLock.prototype.acquire = function (key, executor, callback, jobOptions) {
|
|
80
|
-
var _this = this;
|
|
81
121
|
if (tools.isFunction(key)) {
|
|
82
122
|
// Presume we weren't given a key (first form)
|
|
83
123
|
jobOptions = callback;
|
|
@@ -124,7 +164,22 @@ var BetterLock = /** @class */ (function () {
|
|
|
124
164
|
if (!tools.isFunction(callback)) {
|
|
125
165
|
throw new errors_1.BetterLockInvalidArgumentError(this.options.name, 'callback', 'a function', callback);
|
|
126
166
|
}
|
|
167
|
+
// Invalid arguments throw above. Reentrancy errors depend on where acquire is called from,
|
|
168
|
+
// so they are reported like other lock errors: through the callback or promise.
|
|
169
|
+
var held = this.findHeldKeys(keys);
|
|
170
|
+
if (held &&
|
|
171
|
+
// Waiting for the remaining keys while holding these could deadlock
|
|
172
|
+
(held.heldKeys.length < keys.length || effectiveJobOptions.reentrancy === 'error')) {
|
|
173
|
+
var err_1 = new errors_1.BetterLockReentrancyError(this.options.name, keys, held.heldKeys);
|
|
174
|
+
this.log(err_1.message);
|
|
175
|
+
// Never call back synchronously from acquire
|
|
176
|
+
setTimeout(function () { return callback(err_1); }, 0);
|
|
177
|
+
return callback.promise;
|
|
178
|
+
}
|
|
179
|
+
var reentrantHolders = held ? held.holders : null;
|
|
127
180
|
var job = new internals_1.LockJob(keys, executor, callback, effectiveJobOptions);
|
|
181
|
+
// Executor and callback will run in the caller's async context, not the context of whoever releases the lock
|
|
182
|
+
job.async_context = (0, async_context_1.captureAsyncContext)();
|
|
128
183
|
// Set incoming stack
|
|
129
184
|
if (effectiveJobOptions.extend_stack_traces &&
|
|
130
185
|
typeof Error.captureStackTrace === 'function') {
|
|
@@ -132,10 +187,26 @@ var BetterLock = /** @class */ (function () {
|
|
|
132
187
|
Error.captureStackTrace(tempErr, this.acquire);
|
|
133
188
|
job.incoming_stack = tempErr.stack;
|
|
134
189
|
}
|
|
135
|
-
|
|
190
|
+
if (reentrantHolders) {
|
|
191
|
+
// The caller holds all the keys. Run without entering the queues.
|
|
192
|
+
job.reentrant_holders = reentrantHolders;
|
|
193
|
+
this.pendingReentrantJobs.push(job);
|
|
194
|
+
this.log("Reentering ".concat(job));
|
|
195
|
+
this.executeJob(job);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
this.enqueueJob(job);
|
|
199
|
+
}
|
|
200
|
+
return callback.promise;
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Add job to its key queues and start waiting for the keys
|
|
204
|
+
*/
|
|
205
|
+
BetterLock.prototype.enqueueJob = function (job) {
|
|
206
|
+
var _this = this;
|
|
136
207
|
var queuesToUpdate = [];
|
|
137
|
-
for (var i = 0; i < keys.length; i++) {
|
|
138
|
-
var queue = this.getQueue(keys[i]);
|
|
208
|
+
for (var i = 0; i < job.keys.length; i++) {
|
|
209
|
+
var queue = this.getQueue(job.keys[i]);
|
|
139
210
|
queue.jobs.push(job);
|
|
140
211
|
queuesToUpdate.push(queue);
|
|
141
212
|
}
|
|
@@ -154,7 +225,6 @@ var BetterLock = /** @class */ (function () {
|
|
|
154
225
|
// Special case. We are given empty list of keys. We will immediately execute jobs like this.
|
|
155
226
|
this.executeJob(job);
|
|
156
227
|
}
|
|
157
|
-
return callback.promise;
|
|
158
228
|
};
|
|
159
229
|
/**
|
|
160
230
|
* The same as acquire, except if the lock can't be acquired (the executor never gets called), instead of throwing
|
|
@@ -241,14 +311,27 @@ var BetterLock = /** @class */ (function () {
|
|
|
241
311
|
if (job.executed_at || job.ended_at) {
|
|
242
312
|
return;
|
|
243
313
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
//
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
314
|
+
if (job.reentrant_holders) {
|
|
315
|
+
_this.removePendingReentrantJob(job);
|
|
316
|
+
if (job.reentrant_holders.some(function (holder) { return holder.ended_at; })) {
|
|
317
|
+
// The holder released the keys before this job could start (eg. the reentrant acquire wasn't awaited).
|
|
318
|
+
// Wait for the keys like any other job.
|
|
319
|
+
_this.log("".concat(job, " is no longer reentrant because its holder has ended"));
|
|
320
|
+
job.reentrant_holders = null;
|
|
321
|
+
_this.enqueueJob(job);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
// Validate this job is holding all queues it needs
|
|
327
|
+
for (var i = 0; i < job.keys.length; i++) {
|
|
328
|
+
var queue = _this.getQueue(job.keys[i]);
|
|
329
|
+
if (queue.active !== job) {
|
|
330
|
+
// This should never happen
|
|
331
|
+
return _this.endJob(job, [
|
|
332
|
+
new errors_1.BetterLockInternalError(_this.options.name, "Corrupted wait queue state for ".concat(queue.key)),
|
|
333
|
+
]);
|
|
334
|
+
}
|
|
252
335
|
}
|
|
253
336
|
}
|
|
254
337
|
// Mark job as having started executing
|
|
@@ -264,27 +347,41 @@ var BetterLock = /** @class */ (function () {
|
|
|
264
347
|
_this.log("Done called for ".concat(job));
|
|
265
348
|
_this.endJob(job, args);
|
|
266
349
|
};
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
350
|
+
var runExecutor = function () {
|
|
351
|
+
if (job.executor.length > 0) {
|
|
352
|
+
// Callback interface
|
|
353
|
+
job.executor(lockDone);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
// Promise interface
|
|
357
|
+
var executorResult;
|
|
358
|
+
try {
|
|
359
|
+
executorResult = job.executor();
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
// Error thrown directly from executor
|
|
363
|
+
lockDone(err);
|
|
364
|
+
}
|
|
365
|
+
// Promise sniffing
|
|
366
|
+
if (_this.options.promise_tester(executorResult)) {
|
|
367
|
+
executorResult.then(function (res) { return lockDone(null, res); }, function (err) { return lockDone(err); });
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
// "promise" is just some random value. We don't have to wait
|
|
371
|
+
lockDone(null, executorResult);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
if (!job.async_context) {
|
|
375
|
+
// No async context support in this runtime
|
|
376
|
+
runExecutor();
|
|
280
377
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
378
|
+
else if (job.reentrant_holders) {
|
|
379
|
+
// The caller's context already records the holders
|
|
380
|
+
job.async_context.runInAsyncScope(runExecutor);
|
|
284
381
|
}
|
|
285
382
|
else {
|
|
286
|
-
//
|
|
287
|
-
|
|
383
|
+
// Restore the caller's context first, then record this job as holding its keys inside it
|
|
384
|
+
job.async_context.runInAsyncScope(function () { return (0, async_context_1.runHoldingJob)(job, runExecutor); });
|
|
288
385
|
}
|
|
289
386
|
}, 0);
|
|
290
387
|
};
|
|
@@ -297,6 +394,7 @@ var BetterLock = /** @class */ (function () {
|
|
|
297
394
|
this.endJob(job, [new errors_1.BetterLockExecutionTimeoutError(this.options.name, job)]);
|
|
298
395
|
};
|
|
299
396
|
BetterLock.prototype.endJob = function (job, callbackArgs) {
|
|
397
|
+
var _a;
|
|
300
398
|
var _this = this;
|
|
301
399
|
if (job.ended_at) {
|
|
302
400
|
this.log("WARNING: ".concat(job, " is trying to end, but it has already ended at ").concat(job.ended_at.toISOString(), ". Called with arguments: ").concat(callbackArgs));
|
|
@@ -307,9 +405,14 @@ var BetterLock = /** @class */ (function () {
|
|
|
307
405
|
clearTimeout(job.execution_timeout_id);
|
|
308
406
|
job.execution_timeout_id = null;
|
|
309
407
|
job.ended_at = new Date();
|
|
408
|
+
// Reentrant jobs never enter key queues, so they have nothing to release
|
|
409
|
+
var keysToRelease = job.reentrant_holders ? [] : job.keys;
|
|
410
|
+
if (job.reentrant_holders) {
|
|
411
|
+
this.removePendingReentrantJob(job);
|
|
412
|
+
}
|
|
310
413
|
var queuesToUpdate = [];
|
|
311
|
-
for (var i = 0; i <
|
|
312
|
-
var queue = this.getQueue(
|
|
414
|
+
for (var i = 0; i < keysToRelease.length; i++) {
|
|
415
|
+
var queue = this.getQueue(keysToRelease[i]);
|
|
313
416
|
queuesToUpdate.push(queue);
|
|
314
417
|
if (queue.active === job) {
|
|
315
418
|
// This job was holding on the queue's key
|
|
@@ -330,7 +433,12 @@ var BetterLock = /** @class */ (function () {
|
|
|
330
433
|
}
|
|
331
434
|
// Call the callback
|
|
332
435
|
try {
|
|
333
|
-
job.
|
|
436
|
+
if (job.async_context) {
|
|
437
|
+
(_a = job.async_context).runInAsyncScope.apply(_a, __spreadArray([job.callback, null], callbackArgs, false));
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
job.callback.apply(null, callbackArgs);
|
|
441
|
+
}
|
|
334
442
|
}
|
|
335
443
|
finally {
|
|
336
444
|
// Whatever happens, schedule a queue update
|
|
@@ -353,6 +461,18 @@ var BetterLock = /** @class */ (function () {
|
|
|
353
461
|
// If we have a job holding this queue that hasn't been executed yet, abort it as well
|
|
354
462
|
this.endJob(queue.active, [new errors_1.BetterLockJobAbortedError(this.options.name, queue.active)]);
|
|
355
463
|
}
|
|
464
|
+
// Reentrant jobs for this key that haven't started yet
|
|
465
|
+
this.pendingReentrantJobs.slice().forEach(function (job) {
|
|
466
|
+
if (job.keys.some(function (jobKey) { return _this.getQueue(jobKey) === queue; })) {
|
|
467
|
+
_this.endJob(job, [new errors_1.BetterLockJobAbortedError(_this.options.name, job)]);
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
};
|
|
471
|
+
BetterLock.prototype.removePendingReentrantJob = function (job) {
|
|
472
|
+
var index = this.pendingReentrantJobs.indexOf(job);
|
|
473
|
+
if (index >= 0) {
|
|
474
|
+
this.pendingReentrantJobs.splice(index, 1);
|
|
475
|
+
}
|
|
356
476
|
};
|
|
357
477
|
/**
|
|
358
478
|
* Abort all pending jobs from all queues.
|
|
@@ -371,6 +491,7 @@ var BetterLock = /** @class */ (function () {
|
|
|
371
491
|
BetterLock.DEFAULT_OPTIONS = {
|
|
372
492
|
extend_stack_traces: true,
|
|
373
493
|
promise_tester: function (p) { return p && typeof p.then === 'function'; },
|
|
494
|
+
reentrancy: 'allow',
|
|
374
495
|
};
|
|
375
496
|
return BetterLock;
|
|
376
497
|
}());
|
package/dist/better_lock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better_lock.js","sourceRoot":"","sources":["../src/better_lock.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"better_lock.js","sourceRoot":"","sources":["../src/better_lock.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -44,4 +44,15 @@ export declare class BetterLockJobAbortedError extends BetterLockError {
|
|
|
44
44
|
keys: string[];
|
|
45
45
|
constructor(lockName: any, job: any);
|
|
46
46
|
}
|
|
47
|
+
export declare class BetterLockReentrancyError extends BetterLockError {
|
|
48
|
+
/**
|
|
49
|
+
* Keys requested by the rejected acquire call
|
|
50
|
+
*/
|
|
51
|
+
keys: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Requested keys that the caller already holds
|
|
54
|
+
*/
|
|
55
|
+
held_keys: string[];
|
|
56
|
+
constructor(lockName: any, keys: string[], heldKeys: string[]);
|
|
57
|
+
}
|
|
47
58
|
export declare function isAcquisitionFailureError(err: any): boolean;
|