@nxtedition/scheduler 4.1.11 → 4.1.12
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 +34 -10
- package/lib/limiter.d.ts.map +1 -1
- package/lib/limiter.js +177 -47
- package/lib/limiter.js.map +1 -1
- package/lib/queue.d.ts +4 -0
- package/lib/queue.d.ts.map +1 -1
- package/lib/queue.js +55 -42
- package/lib/queue.js.map +1 -1
- package/lib/scheduler.d.ts.map +1 -1
- package/lib/scheduler.js +123 -21
- package/lib/scheduler.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -62,7 +62,7 @@ Unspecified priorities inherit the cap from the priority just below them — cap
|
|
|
62
62
|
|
|
63
63
|
#### Starvation prevention
|
|
64
64
|
|
|
65
|
-
Per-priority caps act as backpressure: when running tasks exceed a priority's cap, new tasks at that priority queue. If higher-priority tasks keep arriving, the capped queue could be starved indefinitely. To prevent that, the dispatch loop's fairness lottery (already used to give lower priorities a turn under uniform concurrency) **bypasses per-priority caps** when it picks a queued priority — so a fully-capped queue still drains slowly. The overall `max` is still respected.
|
|
65
|
+
Per-priority caps act as backpressure: when running tasks exceed a priority's cap, new tasks at that priority queue. If higher-priority tasks keep arriving, the capped queue could be starved indefinitely. To prevent that, the dispatch loop's fairness lottery (already used to give lower priorities a turn under uniform concurrency) **bypasses per-priority caps** when it picks a queued priority — so a fully-capped queue still drains slowly. The overall `max` is still respected. When the lottery picks an empty tier, its share goes to the highest-priority backlogged queue (within caps), so unused tiers never inflate lower-priority throughput.
|
|
66
66
|
|
|
67
67
|
In `SharedArrayBuffer` mode, the second constructor argument carries per-priority limits (the buffer carries `max` across workers):
|
|
68
68
|
|
|
@@ -79,9 +79,9 @@ For more control, use `acquire` / `release` directly:
|
|
|
79
79
|
|
|
80
80
|
```js
|
|
81
81
|
scheduler.acquire(
|
|
82
|
-
(opaque) => {
|
|
82
|
+
async (opaque) => {
|
|
83
83
|
try {
|
|
84
|
-
doWork(opaque)
|
|
84
|
+
await doWork(opaque)
|
|
85
85
|
} finally {
|
|
86
86
|
scheduler.release()
|
|
87
87
|
}
|
|
@@ -91,6 +91,8 @@ scheduler.acquire(
|
|
|
91
91
|
)
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
**Error contract:** if `fn` throws **synchronously**, the scheduler releases the slot itself (the error propagates to the `acquire()` caller on the fast path, and surfaces as a deferred uncaught exception when thrown from a queued dispatch). Do **not** also call `release()` on the synchronous-throw path — a `try`/`finally` around _synchronous_ work would double-release and free a slot belonging to some other in-flight task. With an `async` callback as above the `finally` is correct: a rejecting async function does not throw synchronously, so the slot is yours to release exactly once.
|
|
95
|
+
|
|
94
96
|
### Multi-Worker Coordination
|
|
95
97
|
|
|
96
98
|
Share a concurrency limit across worker threads using `SharedArrayBuffer`:
|
|
@@ -186,23 +188,35 @@ const { running, pending, queues } = scheduler.stats
|
|
|
186
188
|
|
|
187
189
|
### `scheduler.run(fn, priority?, opaque?): Promise<T>`
|
|
188
190
|
|
|
189
|
-
Execute `fn` within the scheduler. Returns a promise that resolves with the return value of `fn
|
|
191
|
+
Execute `fn` within the scheduler. Returns a promise that resolves with the return value of `fn` (thenables are assimilated via `Promise.resolve`). After the scheduler has been disposed, `run()` rejects with `Error('Scheduler is disposed')` instead of hanging; with an overall concurrency of `0` (which could never dispatch anything) it rejects with `Error('Scheduler concurrency is 0')`.
|
|
190
192
|
|
|
191
193
|
### `scheduler.acquire(fn, priority?, opaque?): boolean`
|
|
192
194
|
|
|
193
|
-
Low-level task acquisition. Returns `true` if a slot was available and `fn` ran synchronously, or `false` if the task was queued (also `false` if the scheduler has been disposed). You **must** call `scheduler.release()` when `fn` completes.
|
|
195
|
+
Low-level task acquisition. Returns `true` if a slot was available and `fn` ran synchronously, or `false` if the task was queued (also `false` if the scheduler has been disposed). The fast path additionally requires that nothing is queued at the same priority, preserving FIFO order within a priority; a fresh task can still start ahead of work queued at a _different_ priority while a freed slot is in flight (a deliberate latency trade-off, bounded to a microtask in shared mode). You **must** call `scheduler.release()` when `fn` completes — except when `fn` throws synchronously, in which case the scheduler has already released the slot (see the Low-Level API example).
|
|
196
|
+
|
|
197
|
+
### `scheduler.tryAcquire(priority?): boolean`
|
|
198
|
+
|
|
199
|
+
Non-blocking. Takes a slot and returns `true` only if one is free at the given priority **and** nothing is queued at that priority (mirroring `limiter.tryConsume`); otherwise returns `false` without queuing. A successful `tryAcquire` must be paired with `release()`.
|
|
194
200
|
|
|
195
201
|
### `scheduler.release(): void`
|
|
196
202
|
|
|
197
203
|
Signal task completion. Dequeues the next pending task if concurrency allows.
|
|
198
204
|
|
|
205
|
+
### `scheduler.concurrency`
|
|
206
|
+
|
|
207
|
+
The overall concurrency ceiling (`Infinity` when unlimited). In shared mode this is the buffer's global `max`; a per-instance `options.concurrency.max` is enforced but not reflected here.
|
|
208
|
+
|
|
209
|
+
### `scheduler.stats`
|
|
210
|
+
|
|
211
|
+
`{ running, pending, queues, shared }` — locally running tasks, locally queued tasks, per-priority queue counts, and (shared mode only) the global `{ running, waiters }` counters. Allocates fresh objects on every read; poll accordingly.
|
|
212
|
+
|
|
199
213
|
### `Scheduler.makeSharedState(concurrency): SharedArrayBuffer`
|
|
200
214
|
|
|
201
|
-
Create shared state for cross-worker scheduling.
|
|
215
|
+
Create shared state for cross-worker scheduling. `concurrency` must be `Infinity` or a non-negative integer that fits in a signed 32-bit integer (≤ 2,147,483,647) — the counter is stored as `Int32`.
|
|
202
216
|
|
|
203
217
|
### `scheduler[Symbol.dispose]()`
|
|
204
218
|
|
|
205
|
-
Disposes the scheduler: releases any global slots it still holds (shared mode), drops the reference to a pending shared-mode `Atomics.waitAsync`, and makes all further calls inert (`acquire` / `tryAcquire` return `false`; `run` rejects). Use when abandoning a shared-mode Scheduler with tasks still queued so the instance and its parked wait can be garbage-collected (it is otherwise kept alive until process exit so its held slots can be released). Works with `using`.
|
|
219
|
+
Disposes the scheduler: releases any global slots it still holds (shared mode), rejects queued `run()` promises with `Error('Scheduler is disposed')`, drops the reference to a pending shared-mode `Atomics.waitAsync`, and makes all further calls inert (`acquire` / `tryAcquire` return `false`; `run` rejects). Use when abandoning a shared-mode Scheduler with tasks still queued so the instance and its parked wait can be garbage-collected (it is otherwise kept alive until process exit so its held slots can be released). Works with `using`. Note that slots held by still-in-flight tasks are returned to the shared pool immediately — until those tasks actually finish, other workers can transiently admit more than `max` (the limit is soft by design).
|
|
206
220
|
|
|
207
221
|
### `parsePriority(value): number`
|
|
208
222
|
|
|
@@ -216,7 +230,7 @@ Parse a string or number into a normalized priority value.
|
|
|
216
230
|
|
|
217
231
|
> Previously exported as `Throttle`. The `Throttle` alias is retained for backward compatibility but is **deprecated** — prefer `Limiter`.
|
|
218
232
|
|
|
219
|
-
Tokens refill automatically: the constructor starts an internal
|
|
233
|
+
Tokens refill automatically: the constructor starts an internal timer, and refills are also triggered lazily from `consume()` / `tryConsume()`. There is no manual refill step. While work is queued the timer holds the event loop open (so a script never exits with queued callbacks silently dropped); an idle limiter does not keep the process alive.
|
|
220
234
|
|
|
221
235
|
### Basic
|
|
222
236
|
|
|
@@ -284,7 +298,7 @@ const ran = limiter.consume(
|
|
|
284
298
|
)
|
|
285
299
|
```
|
|
286
300
|
|
|
287
|
-
`consume` returns `true` if the callback ran immediately (tokens were available and nothing was queued ahead of it), or `false` if it was queued.
|
|
301
|
+
`consume` returns `true` if the callback ran immediately (tokens were available and nothing was queued ahead of it — the call refills the bucket from elapsed time first, so an idle or freshly created limiter answers `true` when the credit covers the request), or `false` if it was queued. Note the boundary is not airtight: a `false` (queued) task can still run synchronously _within_ the same call when the drain the call triggers reaches it immediately.
|
|
288
302
|
|
|
289
303
|
## API
|
|
290
304
|
|
|
@@ -297,12 +311,22 @@ const ran = limiter.consume(
|
|
|
297
311
|
|
|
298
312
|
Consume `bytes` tokens, running `fn(opaque)` when they are available. Returns `true` if `fn` ran immediately, `false` if it was queued. `opaque` is passed through to `fn` on both paths.
|
|
299
313
|
|
|
300
|
-
`bytes` must be a non-negative integer no larger than 2,147,483,647 (the signed Int32 max — tokens are tracked as `Int32`); negative, non-integer, `NaN`, `Infinity`, and out-of-range values throw (a negative or wrapping value would otherwise _add_ tokens via `Atomics.sub` and corrupt the shared bucket). A `bytes` of `0` consumes no tokens and never waits on the bucket. It runs immediately, returning `true`, only when nothing is queued at all (`pending === 0`); otherwise `consume` returns `false`, but
|
|
314
|
+
`bytes` must be a non-negative integer no larger than 2,147,483,647 (the signed Int32 max — tokens are tracked as `Int32`); negative, non-integer, `NaN`, `Infinity`, and out-of-range values throw (a negative or wrapping value would otherwise _add_ tokens via `Atomics.sub` and corrupt the shared bucket). A `bytes` of `0` consumes no tokens and never waits on the bucket. It runs immediately, returning `true`, only when nothing is queued at all (`pending === 0`); otherwise `consume` returns `false`, but once it reaches the front of its priority queue it drains regardless of the token balance — even while the bucket is empty or in debt. Queued behind token-starved work at the same priority it waits its turn like any other task (FIFO head-of-line; a different, unblocked priority queue can drain it sooner).
|
|
315
|
+
|
|
316
|
+
**Starvation guard:** a queued task larger than the instantaneous token balance could otherwise starve under sustained traffic — smaller tasks would keep spending each refill's credit first. Any queue whose front item makes no progress for ~1 second is force-admitted into token debt; the negative balance is repaid by subsequent refills before anything else drains, so the long-run rate still holds (the trade-off is a transient burst, at most one stalled item per queue per second). The same mechanism bounds the wait for a request larger than `tokensPerSecond` (the bucket's capacity, which it could never fit): it is admitted once the bucket fills **or** the ~1s stall guard fires, whichever comes first — i.e. it is throttled, not dropped or stalled forever. In shared mode the guard is per-instance best-effort: other workers may keep consuming the shared bucket.
|
|
301
317
|
|
|
302
318
|
### `limiter.tryConsume(bytes): boolean`
|
|
303
319
|
|
|
304
320
|
Non-blocking. Consumes `bytes` and returns `true` only if enough tokens are available right now and nothing is queued; otherwise returns `false` without queuing.
|
|
305
321
|
|
|
322
|
+
### `limiter.tokensPerSecond`
|
|
323
|
+
|
|
324
|
+
The configured rate (and bucket capacity).
|
|
325
|
+
|
|
326
|
+
### `limiter.stats`
|
|
327
|
+
|
|
328
|
+
`{ tokens, pending, queues }` — current token balance (negative while in debt), queued tasks, and per-priority queue counts. Allocates fresh objects on every read.
|
|
329
|
+
|
|
306
330
|
### `limiter.stream(priority?, options?): Transform`
|
|
307
331
|
|
|
308
332
|
Returns a `Transform` stream that rate-limits data passing through it. Each chunk consumes `chunk.length` tokens; a chunk with no non-negative-integer `length` (e.g. in `objectMode`) is treated as weightless (0 tokens) — it never waits on tokens, though it still preserves the limiter's queue ordering (if other work is already queued, it drains in turn rather than jumping ahead). `options` is forwarded to the underlying `Transform` (e.g. `objectMode`, `highWaterMark`). Destroying the stream while a chunk is still queued in the limiter does not push into the dead stream.
|
package/lib/limiter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limiter.d.ts","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"limiter.d.ts","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAuC,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAqCtF,qBAAa,OAAQ,SAAQ,KAAK;;IAChC,OAAO,CAAC,SAAS,CAAY;IAO7B,OAAO,CAAC,OAAO,CAAI;IAoBnB,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM;IAS9C,IAAI,KAAK;;;;;;MAMR;IAED,IAAI,eAAe,WAElB;gBAEW,IAAI,EAAE,iBAAiB,GAAG;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE;IA6BjE,MAAM,CAAC,QAAQ,GAAE,QAAuB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IA8BpE,OAAO,CAAC,EAAE,EAAE,MAAM,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO;IACvE,OAAO,CAAC,CAAC,EACP,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,EAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,MAAM,EAAE,CAAC,GACR,OAAO;IAyEV,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAqQnC"}
|
package/lib/limiter.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Transform } from 'node:stream';
|
|
2
|
+
import { types } from 'node:util';
|
|
2
3
|
import { FastQueue, NO_LIMITS, parsePriority, Queue } from "./queue.js";
|
|
3
4
|
const LIMIT_INDEX = 0;
|
|
4
5
|
const TOKENS_INDEX = 16; // separate cache line to avoid false sharing
|
|
@@ -10,6 +11,16 @@ const LIMITER_MAGIC = 0x4c494d54; // ASCII "LIMT" — sanity-check sentinel writ
|
|
|
10
11
|
// value on store and silently breaks the bucket (it can never accrue), so reject it up
|
|
11
12
|
// front rather than fail mysteriously at runtime.
|
|
12
13
|
const MAX_TOKENS = 0x7fffffff; // 2_147_483_647
|
|
14
|
+
// Anti-starvation: a queue whose front item has sat undispatched for this many
|
|
15
|
+
// consecutive timer ticks (~1s at the 100ms cadence) is force-admitted into token
|
|
16
|
+
// debt. Without this, any front item larger than the instantaneous token balance
|
|
17
|
+
// starves indefinitely under saturation — the fallback scan spends every tick's
|
|
18
|
+
// fresh credit on smaller items from other queues, so the balance never reaches the
|
|
19
|
+
// big item (measured: a 600-of-1000-capacity item never ran during 5s of competing
|
|
20
|
+
// 100-byte traffic). The resulting negative balance throttles subsequent dispatches
|
|
21
|
+
// until the debt is repaid, so long-run rate conformance is preserved; the trade-off
|
|
22
|
+
// is a transient burst of at most one stalled front per queue per ~1s.
|
|
23
|
+
const STALL_TICKS = 10;
|
|
13
24
|
function validateRate(tokensPerSecond) {
|
|
14
25
|
if (tokensPerSecond == null ||
|
|
15
26
|
!Number.isInteger(tokensPerSecond) ||
|
|
@@ -21,6 +32,11 @@ function validateRate(tokensPerSecond) {
|
|
|
21
32
|
}
|
|
22
33
|
export class Limiter extends Queue {
|
|
23
34
|
stateView;
|
|
35
|
+
// True when stateView is backed by a SharedArrayBuffer (cross-worker bucket).
|
|
36
|
+
// Non-shared limiters are single-threaded, so the hot token decrement can use a
|
|
37
|
+
// plain write instead of a lock-prefixed Atomics RMW. Cold paths (#refill credit,
|
|
38
|
+
// force-through) keep Atomics unconditionally for simplicity.
|
|
39
|
+
#shared;
|
|
24
40
|
pending = 0;
|
|
25
41
|
#refillTimer;
|
|
26
42
|
// True while #refillTimer is scheduled to fire. Without this guard every #refill
|
|
@@ -29,6 +45,16 @@ export class Limiter extends Queue {
|
|
|
29
45
|
// postpones the deadline — under sustained consume() traffic the timer would
|
|
30
46
|
// never fire at its intended 100ms cadence.
|
|
31
47
|
#timerArmed = true;
|
|
48
|
+
// True while #refillTimer is ref'd (holding the event loop open). While pending > 0
|
|
49
|
+
// the timer is the ONLY thing that will ever service the queue, so it must keep the
|
|
50
|
+
// process alive — an unref'd timer let scripts exit mid-backlog with queued
|
|
51
|
+
// callbacks silently dropped (the README pipeline example truncated its output).
|
|
52
|
+
// When the queue is empty the timer is unref'd again so an idle limiter never
|
|
53
|
+
// pins the process.
|
|
54
|
+
#timerReffed = false;
|
|
55
|
+
// True when some queue's stall counter crossed STALL_TICKS at the last timer tick.
|
|
56
|
+
// Lets the drain loop skip the per-iteration stalled-queue scan in the common case.
|
|
57
|
+
#hasStalled = false;
|
|
32
58
|
static makeSharedState(tokensPerSecond) {
|
|
33
59
|
validateRate(tokensPerSecond);
|
|
34
60
|
const stateBuffer = new SharedArrayBuffer(192); // 3 cache lines, one per field
|
|
@@ -49,7 +75,10 @@ export class Limiter extends Queue {
|
|
|
49
75
|
}
|
|
50
76
|
constructor(opts) {
|
|
51
77
|
super();
|
|
52
|
-
|
|
78
|
+
// util.types.isSharedArrayBuffer instead of instanceof: a SAB from another realm
|
|
79
|
+
// (vm context, jest sandbox) fails instanceof and would fall through to the
|
|
80
|
+
// options branch with a misleading 'Invalid tokensPerSecond' error.
|
|
81
|
+
if (types.isSharedArrayBuffer(opts)) {
|
|
53
82
|
if (opts.byteLength !== 192) {
|
|
54
83
|
throw new Error('Invalid SharedArrayBuffer size');
|
|
55
84
|
}
|
|
@@ -57,18 +86,23 @@ export class Limiter extends Queue {
|
|
|
57
86
|
throw new Error('Invalid SharedArrayBuffer: not created by Limiter.makeSharedState');
|
|
58
87
|
}
|
|
59
88
|
this.stateView = new Int32Array(opts);
|
|
89
|
+
this.#shared = true;
|
|
60
90
|
}
|
|
61
91
|
else {
|
|
62
92
|
const tokensPerSecond = validateRate(opts?.tokensPerSecond);
|
|
63
93
|
this.stateView = new Int32Array(64);
|
|
64
94
|
Atomics.store(this.stateView, LIMIT_INDEX, tokensPerSecond);
|
|
95
|
+
this.#shared = false;
|
|
65
96
|
}
|
|
66
97
|
this.#refillTimer = setTimeout(() => {
|
|
67
98
|
this.#timerArmed = false;
|
|
68
|
-
this.#refill();
|
|
99
|
+
this.#refill(true);
|
|
69
100
|
}, 100).unref();
|
|
70
101
|
}
|
|
71
102
|
stream(priority = Queue.NORMAL, options) {
|
|
103
|
+
// Parse once per stream instead of per chunk — consume() takes the cheap
|
|
104
|
+
// numeric path for an already-parsed priority.
|
|
105
|
+
const p = parsePriority(priority);
|
|
72
106
|
return new Transform({
|
|
73
107
|
...options,
|
|
74
108
|
// `chunk` is typed `unknown`, not `Buffer`: in object mode it can be any value —
|
|
@@ -81,13 +115,24 @@ export class Limiter extends Queue {
|
|
|
81
115
|
// this callback later is harmless — a destroyed Transform drops the push, no `data`.
|
|
82
116
|
transform: (chunk, _encoding, callback) => {
|
|
83
117
|
const len = chunk?.length;
|
|
84
|
-
|
|
118
|
+
// Clamp to MAX_TOKENS: a (pathological) length above the Int32 bound must not
|
|
119
|
+
// make consume() throw synchronously out of transform and wedge the stream.
|
|
120
|
+
const bytes = typeof len === 'number' && Number.isInteger(len) && len >= 0
|
|
121
|
+
? len <= MAX_TOKENS
|
|
122
|
+
? len
|
|
123
|
+
: MAX_TOKENS
|
|
124
|
+
: 0;
|
|
85
125
|
// eslint-disable-next-line typescript-eslint/no-unsafe-argument
|
|
86
|
-
this.consume((chunk) => callback(null, chunk), bytes,
|
|
126
|
+
this.consume((chunk) => callback(null, chunk), bytes, p, chunk);
|
|
87
127
|
},
|
|
88
128
|
});
|
|
89
129
|
}
|
|
90
130
|
consume(fn, bytes, priority = Queue.NORMAL, opaque) {
|
|
131
|
+
if (typeof fn !== 'function') {
|
|
132
|
+
// Validate up front: a queued non-function would otherwise detonate later
|
|
133
|
+
// inside the drain loop, surfacing as an unattributable deferred error.
|
|
134
|
+
throw new Error('Invalid fn');
|
|
135
|
+
}
|
|
91
136
|
// bytes must be a non-negative Int32 integer: it is applied to Atomics.sub on an
|
|
92
137
|
// Int32Array, so a negative value (or one that wraps past the Int32 max) *adds*
|
|
93
138
|
// tokens — corrupting the shared bucket for every worker — and NaN/Infinity can never
|
|
@@ -99,15 +144,31 @@ export class Limiter extends Queue {
|
|
|
99
144
|
if (priority == null) {
|
|
100
145
|
priority = Queue.NORMAL;
|
|
101
146
|
}
|
|
102
|
-
if (this.pending === 0
|
|
103
|
-
|
|
104
|
-
|
|
147
|
+
if (this.pending === 0) {
|
|
148
|
+
if (this.#tryConsumeTokens(bytes)) {
|
|
149
|
+
fn(opaque);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
// The stored balance is stale until a refill credits elapsed time — without
|
|
153
|
+
// this, the first consume on a fresh/idle limiter always queued (and then ran
|
|
154
|
+
// synchronously from the queued-path #refill below while still returning
|
|
155
|
+
// false, breaking the documented "true if fn ran immediately" contract).
|
|
156
|
+
// With pending === 0 the refill's drain loop is a no-op, so this only
|
|
157
|
+
// advances the clock; ordering is unaffected.
|
|
158
|
+
this.#refill();
|
|
159
|
+
if (this.#tryConsumeTokens(bytes)) {
|
|
160
|
+
fn(opaque);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
105
163
|
}
|
|
106
164
|
const p = parsePriority(priority);
|
|
107
165
|
const queue = this.queues[p + 3];
|
|
108
166
|
this.pending += 1;
|
|
109
167
|
queue.arr.push(fn, bytes, opaque);
|
|
110
168
|
queue.cnt += 1;
|
|
169
|
+
if (queue.cnt === 1) {
|
|
170
|
+
this.nonEmptyMask |= 1 << queue.i;
|
|
171
|
+
}
|
|
111
172
|
// Only attempt a synchronous credit + drain when it can matter:
|
|
112
173
|
// - first backlog item (pending === 1): nothing has attempted a drain for it
|
|
113
174
|
// yet, and tokens may have accrued since the last refill;
|
|
@@ -150,23 +211,49 @@ export class Limiter extends Queue {
|
|
|
150
211
|
// oversized requests only make progress via the queued drain loop in #refill(), which
|
|
151
212
|
// forces them through into debt once the bucket is full. This keeps tryConsume() a
|
|
152
213
|
// true non-blocking poll and never grants more than the bucket can hold on the fast path.
|
|
153
|
-
|
|
214
|
+
const tokens = this.stateView[TOKENS_INDEX];
|
|
215
|
+
if (tokens < bytes) {
|
|
154
216
|
return false;
|
|
155
217
|
}
|
|
156
|
-
|
|
218
|
+
if (this.#shared) {
|
|
219
|
+
Atomics.sub(this.stateView, TOKENS_INDEX, bytes);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
// Single-threaded: a plain write avoids the lock-prefixed RMW on the hottest path.
|
|
223
|
+
this.stateView[TOKENS_INDEX] = tokens - bytes;
|
|
224
|
+
}
|
|
157
225
|
return true;
|
|
158
226
|
}
|
|
159
|
-
|
|
227
|
+
// fromTimer is true only for the 100ms cadence timer callback: stall bookkeeping
|
|
228
|
+
// ticks on the timer (not on consume-triggered drains) so its time base is real
|
|
229
|
+
// elapsed time, independent of traffic volume.
|
|
230
|
+
#refill(fromTimer = false) {
|
|
231
|
+
if (fromTimer && this.pending > 0) {
|
|
232
|
+
// A queue with items whose front didn't dispatch since the last tick is
|
|
233
|
+
// stalling (every dispatch from a queue resets its counter in the drain
|
|
234
|
+
// loop below). Crossing STALL_TICKS arms the force-through in the drain.
|
|
235
|
+
for (let p = 0; p < this.queues.length; p++) {
|
|
236
|
+
const q = this.queues[p];
|
|
237
|
+
if (q.cnt > 0 && ++q.stall >= STALL_TICKS) {
|
|
238
|
+
this.#hasStalled = true;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
160
242
|
const rate = this.tokensPerSecond;
|
|
161
243
|
const currentToken = this.stateView[TOKENS_INDEX];
|
|
162
244
|
const refillTime = this.stateView[REFILL_INDEX];
|
|
163
245
|
// performance.now() | 0 is integer ms since process start, kept in Int32 range so it
|
|
164
246
|
// matches REFILL_INDEX's Int32 storage. Date.now() (~1.74 trillion) would overflow Int32.
|
|
247
|
+
// `|| 1` wherever a value is stored as the anchor: 0 doubles as the never-anchored
|
|
248
|
+
// sentinel below, and a real clock reading of 0 (process's first ms, or the Int32
|
|
249
|
+
// wrap passing through 0) written as an anchor would re-trigger the fill-to-capacity
|
|
250
|
+
// first-refill branch on every subsequent call. A 1ms skew is far below the
|
|
251
|
+
// limiter's 100ms granularity.
|
|
165
252
|
const now = performance.now() | 0;
|
|
166
253
|
if (refillTime === 0) {
|
|
167
254
|
// First refill anchors the clock and fills the bucket to capacity. CAS so that when
|
|
168
255
|
// multiple workers race the very first refill, only one of them performs the fill.
|
|
169
|
-
if (Atomics.compareExchange(this.stateView, REFILL_INDEX, 0, now) === 0) {
|
|
256
|
+
if (Atomics.compareExchange(this.stateView, REFILL_INDEX, 0, now || 1) === 0) {
|
|
170
257
|
const fill = rate - currentToken;
|
|
171
258
|
if (fill > 0) {
|
|
172
259
|
Atomics.add(this.stateView, TOKENS_INDEX, fill);
|
|
@@ -180,7 +267,7 @@ export class Limiter extends Queue {
|
|
|
180
267
|
// Negative elapsed = the Int32 ms counter wrapped (~24.8 days); room <= 0 = the
|
|
181
268
|
// bucket is already at/over capacity (a full bucket cannot bank time). Either way,
|
|
182
269
|
// re-anchor the clock to now and drop the carried fraction without crediting.
|
|
183
|
-
Atomics.compareExchange(this.stateView, REFILL_INDEX, refillTime, now);
|
|
270
|
+
Atomics.compareExchange(this.stateView, REFILL_INDEX, refillTime, now || 1);
|
|
184
271
|
}
|
|
185
272
|
else {
|
|
186
273
|
// Tokens accrue at `rate` per 1000ms. Credit only whole tokens and advance the
|
|
@@ -198,16 +285,20 @@ export class Limiter extends Queue {
|
|
|
198
285
|
// Bucket fills this tick: clamp to capacity and snap the clock to now —
|
|
199
286
|
// overflow time cannot be banked.
|
|
200
287
|
granted = room;
|
|
201
|
-
newRefillTime = now;
|
|
288
|
+
newRefillTime = now || 1;
|
|
202
289
|
}
|
|
203
290
|
else {
|
|
204
291
|
// floor(granted * 1000 / rate) <= elapsedMs, so the clock never passes now;
|
|
205
292
|
// the un-advanced remainder (worth < one token) carries forward.
|
|
206
|
-
newRefillTime = refillTime + Math.floor((granted * 1000) / rate);
|
|
293
|
+
newRefillTime = refillTime + Math.floor((granted * 1000) / rate) || 1;
|
|
207
294
|
}
|
|
208
295
|
// Gate the credit on the REFILL CAS so concurrent refills across workers never
|
|
209
296
|
// double-count the same elapsed window: only the winner advances the clock and
|
|
210
|
-
// adds tokens.
|
|
297
|
+
// adds tokens. NB: the credit below is a separate atomic op — a worker
|
|
298
|
+
// descheduled here for >= room/rate seconds while another worker completes a
|
|
299
|
+
// full refill can transiently push tokens above capacity (bounded by `rate`,
|
|
300
|
+
// self-correcting on the next refill via the room <= 0 re-anchor). Accepted as
|
|
301
|
+
// the over-grant mirror of the documented brief-debt soft-limit race.
|
|
211
302
|
if (Atomics.compareExchange(this.stateView, REFILL_INDEX, refillTime, newRefillTime) ===
|
|
212
303
|
refillTime) {
|
|
213
304
|
Atomics.add(this.stateView, TOKENS_INDEX, granted);
|
|
@@ -225,45 +316,70 @@ export class Limiter extends Queue {
|
|
|
225
316
|
// the whole debt-repayment window. When nothing else fits, the scan below returns
|
|
226
317
|
// promptly (it never force-dispatches unless the bucket is full), so this does not spin.
|
|
227
318
|
while (this.pending > 0) {
|
|
228
|
-
let queue =
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
319
|
+
let queue = null;
|
|
320
|
+
// Anti-starvation force-through (see STALL_TICKS): the highest-priority queue
|
|
321
|
+
// whose front has been blocked for >= STALL_TICKS timer ticks dispatches into
|
|
322
|
+
// debt, regardless of the current balance. Without this, the fallback scan
|
|
323
|
+
// below spends every tick's fresh credit on smaller items so a large front
|
|
324
|
+
// never sees enough tokens — and an oversized (> capacity) front could only
|
|
325
|
+
// ever force through via the bucket-completely-full branch, which sustained
|
|
326
|
+
// traffic postpones indefinitely.
|
|
327
|
+
if (this.#hasStalled) {
|
|
328
|
+
this.#hasStalled = false;
|
|
238
329
|
for (let p = this.queues.length - 1; p >= 0; p--) {
|
|
239
330
|
const q = this.queues[p];
|
|
240
|
-
if (q.cnt
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
highest = q;
|
|
245
|
-
}
|
|
246
|
-
if (this.#tryConsumeTokens(q.arr[q.idx + 1])) {
|
|
331
|
+
if (q.cnt > 0 && q.stall >= STALL_TICKS) {
|
|
332
|
+
if (!this.#tryConsumeTokens(q.arr[q.idx + 1])) {
|
|
333
|
+
Atomics.sub(this.stateView, TOKENS_INDEX, q.arr[q.idx + 1]);
|
|
334
|
+
}
|
|
247
335
|
queue = q;
|
|
248
336
|
break;
|
|
249
337
|
}
|
|
250
338
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
339
|
+
}
|
|
340
|
+
if (queue == null) {
|
|
341
|
+
queue = this.getNextQueue(NO_LIMITS, 0);
|
|
342
|
+
if (queue == null || queue.cnt === 0) {
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
if (!this.#tryConsumeTokens(queue.arr[queue.idx + 1])) {
|
|
346
|
+
// The preferred queue's front task doesn't fit; scan all queues from
|
|
347
|
+
// highest to lowest priority for any task whose byte requirement fits
|
|
348
|
+
// within available tokens (starvation prevention).
|
|
349
|
+
queue = null;
|
|
350
|
+
let highest = null;
|
|
351
|
+
for (let p = this.queues.length - 1; p >= 0; p--) {
|
|
352
|
+
const q = this.queues[p];
|
|
353
|
+
if (q.cnt === 0) {
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
if (highest === null) {
|
|
357
|
+
highest = q;
|
|
358
|
+
}
|
|
359
|
+
if (this.#tryConsumeTokens(q.arr[q.idx + 1])) {
|
|
360
|
+
queue = q;
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
261
363
|
}
|
|
262
|
-
|
|
263
|
-
|
|
364
|
+
if (queue == null) {
|
|
365
|
+
// Nothing fits the tokens available right now. If the bucket is already full
|
|
366
|
+
// (at capacity — it can never hold more), every remaining task is larger than
|
|
367
|
+
// the bucket can ever cover, so waiting is pointless and they would stall
|
|
368
|
+
// forever. Force the highest-priority such task through into debt; the
|
|
369
|
+
// tokens < 0 result drops out of this loop and subsequent refills repay the
|
|
370
|
+
// debt before anything else drains — the correct throttle for an over-large unit.
|
|
371
|
+
if (highest !== null && this.stateView[TOKENS_INDEX] >= this.stateView[LIMIT_INDEX]) {
|
|
372
|
+
Atomics.sub(this.stateView, TOKENS_INDEX, highest.arr[highest.idx + 1]);
|
|
373
|
+
queue = highest;
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
264
378
|
}
|
|
265
379
|
}
|
|
266
380
|
}
|
|
381
|
+
// Dispatching from a queue means its front is making progress.
|
|
382
|
+
queue.stall = 0;
|
|
267
383
|
const fn = queue.arr[queue.idx];
|
|
268
384
|
const opaque = queue.arr[queue.idx + 2];
|
|
269
385
|
queue.arr[queue.idx++] = null;
|
|
@@ -272,6 +388,7 @@ export class Limiter extends Queue {
|
|
|
272
388
|
queue.cnt -= 1;
|
|
273
389
|
this.pending -= 1;
|
|
274
390
|
if (queue.cnt === 0) {
|
|
391
|
+
this.nonEmptyMask &= ~(1 << queue.i);
|
|
275
392
|
queue.idx = 0;
|
|
276
393
|
// See scheduler.ts: `arr = []` beats `length = 0` in V8 on this hot path.
|
|
277
394
|
queue.arr = [];
|
|
@@ -297,9 +414,22 @@ export class Limiter extends Queue {
|
|
|
297
414
|
}
|
|
298
415
|
}
|
|
299
416
|
finally {
|
|
300
|
-
if (this.pending > 0
|
|
301
|
-
this.#timerArmed
|
|
302
|
-
|
|
417
|
+
if (this.pending > 0) {
|
|
418
|
+
if (!this.#timerArmed) {
|
|
419
|
+
this.#timerArmed = true;
|
|
420
|
+
this.#refillTimer.refresh();
|
|
421
|
+
}
|
|
422
|
+
// While work is queued the timer is the only thing guaranteed to service
|
|
423
|
+
// it — hold the event loop open or a script with nothing else pending
|
|
424
|
+
// exits mid-backlog, silently dropping the queued callbacks.
|
|
425
|
+
if (!this.#timerReffed) {
|
|
426
|
+
this.#timerReffed = true;
|
|
427
|
+
this.#refillTimer.ref();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
else if (this.#timerReffed) {
|
|
431
|
+
this.#timerReffed = false;
|
|
432
|
+
this.#refillTimer.unref();
|
|
303
433
|
}
|
|
304
434
|
}
|
|
305
435
|
}
|
package/lib/limiter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limiter.js","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"limiter.js","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"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"}
|
package/lib/queue.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ export declare class FastQueue {
|
|
|
2
2
|
idx: number;
|
|
3
3
|
cnt: number;
|
|
4
4
|
arr: Array<unknown>;
|
|
5
|
+
stall: number;
|
|
6
|
+
readonly i: number;
|
|
7
|
+
constructor(i: number);
|
|
5
8
|
}
|
|
6
9
|
export type NumberPriority = -3 | -2 | -1 | 0 | 1 | 2 | 3;
|
|
7
10
|
export type Priority = NumberPriority | 'lowest' | 'lower' | 'low' | 'normal' | 'high' | 'higher' | 'highest';
|
|
@@ -16,6 +19,7 @@ export declare class Queue {
|
|
|
16
19
|
static readonly HIGHER = 2;
|
|
17
20
|
static readonly HIGHEST = 3;
|
|
18
21
|
private counter;
|
|
22
|
+
protected nonEmptyMask: number;
|
|
19
23
|
protected queues: FastQueue[];
|
|
20
24
|
protected getNextQueue(limits: number[], running: number): FastQueue | null;
|
|
21
25
|
}
|
package/lib/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAS;IACpB,GAAG,SAAI;IACP,GAAG,SAAI;IACP,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAK;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAS;IACpB,GAAG,SAAI;IACP,GAAG,SAAI;IACP,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAK;IAIxB,KAAK,SAAI;IAGT,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;gBACN,CAAC,EAAE,MAAM;CAGtB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAEzD,MAAM,MAAM,QAAQ,GAChB,cAAc,GACd,QAAQ,GACR,OAAO,GACP,KAAK,GACL,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,SAAS,CAAA;AAEb,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,CA8BhE;AAsBD,eAAO,MAAM,SAAS,EAAE,MAAM,EAQ7B,CAAA;AAED,qBAAa,KAAK;IAChB,MAAM,CAAC,QAAQ,CAAC,MAAM,MAAK;IAC3B,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAK;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAK;IACxB,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAI;IAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAI;IACxB,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAI;IAC1B,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAI;IAE3B,OAAO,CAAC,OAAO,CAAI;IAKnB,SAAS,CAAC,YAAY,SAAI;IAG1B,SAAS,CAAC,MAAM,cAQf;IAaD,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM;CAiCzD"}
|
package/lib/queue.js
CHANGED
|
@@ -2,6 +2,16 @@ export class FastQueue {
|
|
|
2
2
|
idx = 0;
|
|
3
3
|
cnt = 0;
|
|
4
4
|
arr = [];
|
|
5
|
+
// Consecutive Limiter timer ticks during which this queue had items but dispatched
|
|
6
|
+
// nothing (front blocked on tokens). Unused by Scheduler. See Limiter's
|
|
7
|
+
// anti-starvation force-through.
|
|
8
|
+
stall = 0;
|
|
9
|
+
// This queue's index in Queue.queues (priority + 3), so dequeue sites can update
|
|
10
|
+
// the owner's nonEmptyMask without searching.
|
|
11
|
+
i;
|
|
12
|
+
constructor(i) {
|
|
13
|
+
this.i = i;
|
|
14
|
+
}
|
|
5
15
|
}
|
|
6
16
|
export function parsePriority(p) {
|
|
7
17
|
if (typeof p === 'number') {
|
|
@@ -45,6 +55,20 @@ export function parsePriority(p) {
|
|
|
45
55
|
}
|
|
46
56
|
}
|
|
47
57
|
const maxInt = 2147483647;
|
|
58
|
+
// Lottery tier for each value of (counter & 127): the lowest set bit among bits 0..6
|
|
59
|
+
// picks the tier (bit0 → highest=6, bit1 → 5, …, bit6 → lowest=0); no bit set → 6.
|
|
60
|
+
// Precomputed so the hot dispatch path does one table load instead of a branch chain.
|
|
61
|
+
const TIER = new Uint8Array(128);
|
|
62
|
+
for (let v = 0; v < 128; v++) {
|
|
63
|
+
let idx = 6;
|
|
64
|
+
for (let b = 0; b < 7; b++) {
|
|
65
|
+
if (v & (1 << b)) {
|
|
66
|
+
idx = 6 - b;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
TIER[v] = idx;
|
|
71
|
+
}
|
|
48
72
|
// Sentinel limits array for callers that don't enforce per-priority caps.
|
|
49
73
|
// `running < NO_LIMITS[n]` is always true for any non-negative running count,
|
|
50
74
|
// so passing this acts as "no filter".
|
|
@@ -66,15 +90,19 @@ export class Queue {
|
|
|
66
90
|
static HIGHER = 2;
|
|
67
91
|
static HIGHEST = 3;
|
|
68
92
|
counter = 0;
|
|
93
|
+
// Bit n is set while queues[n] is non-empty. Maintained by subclasses at the
|
|
94
|
+
// 0 ↔ non-0 cnt transitions (enqueue/dequeue/clear), which are rare relative to
|
|
95
|
+
// dispatches, so getNextQueue can skip empty tiers without touching their objects.
|
|
96
|
+
nonEmptyMask = 0;
|
|
69
97
|
// Queues are stored in order of priority, so index == priority + 3
|
|
70
98
|
queues = [
|
|
71
|
-
new FastQueue(), // 0 lowest
|
|
72
|
-
new FastQueue(), // 1 lower
|
|
73
|
-
new FastQueue(), // 2 low
|
|
74
|
-
new FastQueue(), // 3 normal
|
|
75
|
-
new FastQueue(), // 4 high
|
|
76
|
-
new FastQueue(), // 5 higher
|
|
77
|
-
new FastQueue(), // 6 highest
|
|
99
|
+
new FastQueue(0), // 0 lowest
|
|
100
|
+
new FastQueue(1), // 1 lower
|
|
101
|
+
new FastQueue(2), // 2 low
|
|
102
|
+
new FastQueue(3), // 3 normal
|
|
103
|
+
new FastQueue(4), // 4 high
|
|
104
|
+
new FastQueue(5), // 5 higher
|
|
105
|
+
new FastQueue(6), // 6 highest
|
|
78
106
|
];
|
|
79
107
|
// Pick the next queue to dispatch from.
|
|
80
108
|
//
|
|
@@ -88,45 +116,30 @@ export class Queue {
|
|
|
88
116
|
// turn, defeating starvation prevention. Use `running = -1` to bypass limits on
|
|
89
117
|
// every queue (e.g. when the local worker has nothing running).
|
|
90
118
|
getNextQueue(limits, running) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
idx = 6; // highest: 50%
|
|
95
|
-
}
|
|
96
|
-
else if (this.counter & 0b0000010) {
|
|
97
|
-
idx = 5; // higher: 25%
|
|
98
|
-
}
|
|
99
|
-
else if (this.counter & 0b0000100) {
|
|
100
|
-
idx = 4; // high: 12.5%
|
|
101
|
-
}
|
|
102
|
-
else if (this.counter & 0b0001000) {
|
|
103
|
-
idx = 3; // normal: 6.25%
|
|
104
|
-
}
|
|
105
|
-
else if (this.counter & 0b0010000) {
|
|
106
|
-
idx = 2; // low: 3.125%
|
|
107
|
-
}
|
|
108
|
-
else if (this.counter & 0b0100000) {
|
|
109
|
-
idx = 1; // lower: 1.5625%
|
|
110
|
-
}
|
|
111
|
-
else if (this.counter & 0b1000000) {
|
|
112
|
-
idx = 0; // lowest: 0.78%
|
|
119
|
+
const mask = this.nonEmptyMask;
|
|
120
|
+
if (mask === 0) {
|
|
121
|
+
return null;
|
|
113
122
|
}
|
|
123
|
+
this.counter = (this.counter + 1) & maxInt;
|
|
124
|
+
const idx = TIER[this.counter & 127];
|
|
114
125
|
// Lottery-selected queue: bypass its limit (starvation prevention).
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return preferred;
|
|
118
|
-
}
|
|
119
|
-
for (let n = idx - 1; n >= 0; n--) {
|
|
120
|
-
const q = this.queues[n];
|
|
121
|
-
if (q.cnt > 0 && running < limits[n]) {
|
|
122
|
-
return q;
|
|
123
|
-
}
|
|
126
|
+
if (mask & (1 << idx)) {
|
|
127
|
+
return this.queues[idx];
|
|
124
128
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
// Preferred tier empty: highest-first scan over the NON-EMPTY tiers only (with
|
|
130
|
+
// limit checks), so an empty tier's lottery mass reverts to the most important
|
|
131
|
+
// backlogged work. Scanning downward first instead would hand every empty middle
|
|
132
|
+
// tier's share to LOWER priorities — measured at ~44-47% of dispatch slots going
|
|
133
|
+
// to a backlogged 'low'/'normal' tier while 'highest' was backlogged, versus the
|
|
134
|
+
// ~3-6% the documented exponential bias promises. Iterating set bits via clz32
|
|
135
|
+
// visits only populated tiers (usually one) instead of all seven queue objects.
|
|
136
|
+
let m = mask;
|
|
137
|
+
while (m !== 0) {
|
|
138
|
+
const n = 31 - Math.clz32(m);
|
|
139
|
+
if (running < limits[n]) {
|
|
140
|
+
return this.queues[n];
|
|
129
141
|
}
|
|
142
|
+
m &= ~(1 << n);
|
|
130
143
|
}
|
|
131
144
|
return null;
|
|
132
145
|
}
|
package/lib/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IACpB,GAAG,GAAG,CAAC,CAAA;IACP,GAAG,GAAG,CAAC,CAAA;IACP,GAAG,GAAmB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IACpB,GAAG,GAAG,CAAC,CAAA;IACP,GAAG,GAAG,CAAC,CAAA;IACP,GAAG,GAAmB,EAAE,CAAA;IACxB,mFAAmF;IACnF,wEAAwE;IACxE,iCAAiC;IACjC,KAAK,GAAG,CAAC,CAAA;IACT,iFAAiF;IACjF,8CAA8C;IACrC,CAAC,CAAQ;IAClB,YAAY,CAAS;QACnB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IACZ,CAAC;CACF;AAcD,MAAM,UAAU,aAAa,CAAC,CAAkB;IAC9C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,gBAAgB;IAClB,CAAC;SAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,CAAA;IACX,CAAC;SAAM,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC,CAAA;IACX,CAAC;SAAM,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC,CAAA;IACX,CAAC;SAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAA;IACV,CAAC;SAAM,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,CAAC,CAAA;IACV,CAAC;SAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAA;IACV,CAAC;SAAM,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAA;IACV,CAAC;SAAM,CAAC;QACN,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACf,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,CAAA;IACV,CAAC;SAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC,CAAA;IACX,CAAC;SAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,CAAA;IACV,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAmB,CAAA;IACxC,CAAC;AACH,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAA;AAEzB,qFAAqF;AACrF,mFAAmF;AACnF,sFAAsF;AACtF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7B,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACjB,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YACX,MAAK;QACP,CAAC;IACH,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;AACf,CAAC;AAED,0EAA0E;AAC1E,8EAA8E;AAC9E,uCAAuC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAa;IACjC,MAAM,CAAC,gBAAgB;IACvB,MAAM,CAAC,gBAAgB;IACvB,MAAM,CAAC,gBAAgB;IACvB,MAAM,CAAC,gBAAgB;IACvB,MAAM,CAAC,gBAAgB;IACvB,MAAM,CAAC,gBAAgB;IACvB,MAAM,CAAC,gBAAgB;CACxB,CAAA;AAED,MAAM,OAAO,KAAK;IAChB,MAAM,CAAU,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAU,KAAK,GAAG,CAAC,CAAC,CAAA;IAC1B,MAAM,CAAU,GAAG,GAAG,CAAC,CAAC,CAAA;IACxB,MAAM,CAAU,MAAM,GAAG,CAAC,CAAA;IAC1B,MAAM,CAAU,IAAI,GAAG,CAAC,CAAA;IACxB,MAAM,CAAU,MAAM,GAAG,CAAC,CAAA;IAC1B,MAAM,CAAU,OAAO,GAAG,CAAC,CAAA;IAEnB,OAAO,GAAG,CAAC,CAAA;IAEnB,6EAA6E;IAC7E,gFAAgF;IAChF,mFAAmF;IACzE,YAAY,GAAG,CAAC,CAAA;IAE1B,mEAAmE;IACzD,MAAM,GAAG;QACjB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW;QAC7B,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU;QAC5B,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ;QAC1B,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW;QAC7B,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS;QAC3B,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW;QAC7B,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY;KAC/B,CAAA;IAED,wCAAwC;IACxC,EAAE;IACF,kFAAkF;IAClF,+EAA+E;IAC/E,4EAA4E;IAC5E,EAAE;IACF,gFAAgF;IAChF,2EAA2E;IAC3E,+EAA+E;IAC/E,gFAAgF;IAChF,gEAAgE;IACtD,YAAY,CAAC,MAAgB,EAAE,OAAe;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAA;QAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,MAAM,CAAA;QAE1C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAA;QAEpC,oEAAoE;QACpE,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;QAED,+EAA+E;QAC/E,+EAA+E;QAC/E,iFAAiF;QACjF,iFAAiF;QACjF,iFAAiF;QACjF,+EAA+E;QAC/E,gFAAgF;QAChF,IAAI,CAAC,GAAG,IAAI,CAAA;QACZ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC5B,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACvB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAChB,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC"}
|
package/lib/scheduler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,EAAuB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAmChG,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN;IACE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAoGL,QAAA,MAAM,OAAO,eAA4B,CAAA;AAQzC,qBAAa,SAAU,SAAQ,KAAK;;IAClC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IASjC,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,SAAS,CAAQ;IAQzB,OAAO,CAAC,IAAI,CAAQ;IA2BpB,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM;IAmB1C,IAAI,WAAW,WAGd;IAED,IAAI,KAAK;;;;;;;;;;MAYR;gBAGC,iBAAiB,EAAE,iBAAiB,GAAG;QAAE,WAAW,CAAC,EAAE,kBAAkB,CAAA;KAAE,EAC3E,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,kBAAkB,CAAA;KAAE;IAyDhD,CAAC,OAAO,CAAC;IAuCT,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IACrE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA4C3F,OAAO,CAAC,EAAE,EAAE,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO;IACxD,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO;IA2H1F,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO;IAwHxC,OAAO,aAsCL;IAEF,CAAC,MAAM,CAAC,OAAO,CAAC;CA8BjB"}
|
package/lib/scheduler.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { types } from 'node:util';
|
|
1
2
|
import { FastQueue, parsePriority, Queue } from "./queue.js";
|
|
2
3
|
// Layout of the 128-byte (32 × Int32) shared state buffer:
|
|
3
4
|
//
|
|
@@ -17,6 +18,12 @@ const MAGIC_INDEX = 8;
|
|
|
17
18
|
const CONCURRENCY_INDEX = 16;
|
|
18
19
|
const WAITERS_INDEX = 24;
|
|
19
20
|
const SCHEDULER_MAGIC = 0x5ca4edde; // sanity-check sentinel written by makeSharedState
|
|
21
|
+
// CONCURRENCY is stored in an Int32 slot. A finite value above this would silently
|
|
22
|
+
// wrap on store (2**31 → -2147483648 → "unlimited", 2**32 → 0 → permanent hang), so
|
|
23
|
+
// values that don't fit are either rejected (makeSharedState) or reported as
|
|
24
|
+
// Infinity by the `concurrency` getter (non-shared mode, where the real limit is
|
|
25
|
+
// still enforced via #limits/#max as ordinary numbers).
|
|
26
|
+
const MAX_INT32 = 0x7fffffff;
|
|
20
27
|
// Per-priority limit keys, ordered to match `Queue.queues` (lowest=0, normal=3, highest=6).
|
|
21
28
|
const PRIORITY_KEYS = ['lowest', 'lower', 'low', 'normal', 'high', 'higher', 'highest'];
|
|
22
29
|
// Reject anything that isn't a literal config object — Map/Date/Array/class instances all
|
|
@@ -141,7 +148,13 @@ export class Scheduler extends Queue {
|
|
|
141
148
|
try {
|
|
142
149
|
const result = fn(opaque);
|
|
143
150
|
if (result != null && typeof result.then === 'function') {
|
|
144
|
-
|
|
151
|
+
// Promise.resolve assimilates the thenable: identity for native promises (no
|
|
152
|
+
// hot-path allocation), and for user thenables it restores the Promises/A+
|
|
153
|
+
// guarantees raw .then lacks — a then() that returns undefined no longer
|
|
154
|
+
// TypeErrors the chain, a thenable that calls its callback twice can no
|
|
155
|
+
// longer double-release the slot, and release is chained off a real promise
|
|
156
|
+
// instead of whatever object the thenable's then() happened to return.
|
|
157
|
+
void Promise.resolve(result).then(resolve, reject).then(this.release);
|
|
145
158
|
}
|
|
146
159
|
else {
|
|
147
160
|
resolve(result);
|
|
@@ -157,7 +170,10 @@ export class Scheduler extends Queue {
|
|
|
157
170
|
if (concurrency === Infinity) {
|
|
158
171
|
concurrency = -1;
|
|
159
172
|
}
|
|
160
|
-
else if (concurrency == null ||
|
|
173
|
+
else if (concurrency == null ||
|
|
174
|
+
!Number.isInteger(concurrency) ||
|
|
175
|
+
concurrency < 0 ||
|
|
176
|
+
concurrency > MAX_INT32) {
|
|
161
177
|
throw new Error('Invalid concurrency');
|
|
162
178
|
}
|
|
163
179
|
const stateBuffer = new SharedArrayBuffer(128); // 2 cache lines, one per field
|
|
@@ -188,7 +204,10 @@ export class Scheduler extends Queue {
|
|
|
188
204
|
if (options != null && !isPlainObject(options)) {
|
|
189
205
|
throw new Error('Invalid options');
|
|
190
206
|
}
|
|
191
|
-
|
|
207
|
+
// util.types.isSharedArrayBuffer instead of instanceof: a SAB from another realm
|
|
208
|
+
// (vm context, jest sandbox) fails instanceof and would fall into the options
|
|
209
|
+
// branch with a misleading 'Invalid options' error.
|
|
210
|
+
if (types.isSharedArrayBuffer(optsOrArrayBuffer)) {
|
|
192
211
|
const state = optsOrArrayBuffer;
|
|
193
212
|
if (state.byteLength !== 128) {
|
|
194
213
|
throw new Error('Invalid SharedArrayBuffer size');
|
|
@@ -216,7 +235,9 @@ export class Scheduler extends Queue {
|
|
|
216
235
|
const { limits, max } = buildLimits(opts?.concurrency);
|
|
217
236
|
this.stateView = new Int32Array(64);
|
|
218
237
|
// Persist `max` so the public `concurrency` getter still reflects the overall ceiling.
|
|
219
|
-
|
|
238
|
+
// Values that don't fit Int32 are effectively unlimited — report them as Infinity
|
|
239
|
+
// (-1 sentinel) instead of letting the store wrap to garbage.
|
|
240
|
+
Atomics.store(this.stateView, CONCURRENCY_INDEX, max > MAX_INT32 ? -1 : max);
|
|
220
241
|
this.shared = false;
|
|
221
242
|
this.#limits = limits;
|
|
222
243
|
this.#max = max;
|
|
@@ -264,6 +285,11 @@ export class Scheduler extends Queue {
|
|
|
264
285
|
}
|
|
265
286
|
}
|
|
266
287
|
run(fn, priority = Queue.NORMAL, opaque) {
|
|
288
|
+
if (typeof fn !== 'function') {
|
|
289
|
+
// Validate up front: a queued non-function would otherwise detonate later
|
|
290
|
+
// inside the dispatch loop, mis-attributed to whoever triggered the drain.
|
|
291
|
+
throw new Error('Invalid fn');
|
|
292
|
+
}
|
|
267
293
|
return new Promise((resolve, reject) => {
|
|
268
294
|
// After dispose/exit the scheduler is inert: #tryAcquire returns false and
|
|
269
295
|
// acquire() refuses to queue, so without this guard the returned promise would
|
|
@@ -273,10 +299,21 @@ export class Scheduler extends Queue {
|
|
|
273
299
|
reject(new Error('Scheduler is disposed'));
|
|
274
300
|
return;
|
|
275
301
|
}
|
|
302
|
+
// A hard cap of 0 can never dispatch anything (even the lottery bypass is
|
|
303
|
+
// gated on running < max), so the promise would hang forever. Fail fast,
|
|
304
|
+
// mirroring the disposed-scheduler rejection above.
|
|
305
|
+
if (this.#max === 0) {
|
|
306
|
+
reject(new Error('Scheduler concurrency is 0'));
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
276
309
|
const ctx = { resolve, reject, fn, opaque };
|
|
277
310
|
const p = parsePriority(priority);
|
|
278
|
-
if (this.#tryAcquire(p)) {
|
|
279
|
-
// Fast path:
|
|
311
|
+
if (this.queues[p + 3].cnt === 0 && this.#tryAcquire(p)) {
|
|
312
|
+
// Fast path: nothing queued ahead of us at this priority and a slot is
|
|
313
|
+
// available immediately — call #runTask directly. The same-priority gate
|
|
314
|
+
// preserves FIFO within a priority: without it a fresh task could overtake
|
|
315
|
+
// work queued at the same priority during the (shared-mode) microtask window
|
|
316
|
+
// between a remote release and the parked waiter's wakeup.
|
|
280
317
|
this.#runTask(ctx);
|
|
281
318
|
}
|
|
282
319
|
else {
|
|
@@ -287,6 +324,11 @@ export class Scheduler extends Queue {
|
|
|
287
324
|
});
|
|
288
325
|
}
|
|
289
326
|
acquire(fn, priority = Queue.NORMAL, opaque) {
|
|
327
|
+
if (typeof fn !== 'function') {
|
|
328
|
+
// Validate up front: a queued non-function would otherwise detonate later
|
|
329
|
+
// inside the dispatch loop, mis-attributed to whoever triggered the drain.
|
|
330
|
+
throw new Error('Invalid fn');
|
|
331
|
+
}
|
|
290
332
|
if (this.dead) {
|
|
291
333
|
return false;
|
|
292
334
|
}
|
|
@@ -300,7 +342,8 @@ export class Scheduler extends Queue {
|
|
|
300
342
|
// A fresh read taken after the failed check would match the post-release
|
|
301
343
|
// value and park forever on a queue nobody will ever notify.
|
|
302
344
|
const expected = this.shared ? this.stateView[RUNNING_INDEX] : 0;
|
|
303
|
-
|
|
345
|
+
// Same-priority FIFO gate: see run().
|
|
346
|
+
if (this.queues[p + 3].cnt === 0 && this.#tryAcquire(p)) {
|
|
304
347
|
try {
|
|
305
348
|
fn(opaque);
|
|
306
349
|
}
|
|
@@ -314,19 +357,35 @@ export class Scheduler extends Queue {
|
|
|
314
357
|
const queue = this.queues[p + 3];
|
|
315
358
|
queue.arr.push(fn, opaque);
|
|
316
359
|
queue.cnt += 1;
|
|
360
|
+
if (queue.cnt === 1) {
|
|
361
|
+
this.nonEmptyMask |= 1 << queue.i;
|
|
362
|
+
}
|
|
317
363
|
this.pending += 1;
|
|
318
364
|
if (this.shared) {
|
|
319
|
-
this.#maybeWait(expected);
|
|
365
|
+
const fresh = this.#maybeWait(expected);
|
|
366
|
+
if (fresh !== -1) {
|
|
367
|
+
this.#schedule(fresh);
|
|
368
|
+
}
|
|
320
369
|
}
|
|
321
370
|
return false;
|
|
322
371
|
}
|
|
372
|
+
// Park a waiter on RUNNING when this instance has queued work that only a remote
|
|
373
|
+
// release can unblock. Returns -1 when parked (or when waiting is not applicable:
|
|
374
|
+
// non-shared, nothing pending, already parked, cap 0); otherwise returns a fresh
|
|
375
|
+
// RUNNING value the caller must re-dispatch with (#schedule) instead of parking.
|
|
376
|
+
//
|
|
377
|
+
// We park even while local tasks are running: a local release does drive
|
|
378
|
+
// #schedule directly, but capacity freed by a REMOTE release is only ever
|
|
379
|
+
// observed through this waiter — refusing to park while this.running > 0 left
|
|
380
|
+
// the backlog serialized behind the slowest local task (and hung forever behind
|
|
381
|
+
// an unbounded one) while free shared slots sat idle.
|
|
323
382
|
#maybeWait(expected) {
|
|
324
|
-
if (!this.shared || this.
|
|
325
|
-
return;
|
|
383
|
+
if (!this.shared || this.pending === 0 || this.#waitPromise) {
|
|
384
|
+
return -1;
|
|
326
385
|
}
|
|
327
386
|
// No point waiting when global cap is 0 — value can never drop to enable dispatch.
|
|
328
387
|
if (this.#max === 0) {
|
|
329
|
-
return;
|
|
388
|
+
return -1;
|
|
330
389
|
}
|
|
331
390
|
// Bump WAITERS BEFORE waitAsync so any concurrent release that already
|
|
332
391
|
// decremented RUNNING will observe us — a release that misses our increment
|
|
@@ -335,6 +394,18 @@ export class Scheduler extends Queue {
|
|
|
335
394
|
// pair the decrement in the .then; the cost is one wasted atomic pair on
|
|
336
395
|
// the rare not-equal path.
|
|
337
396
|
Atomics.add(this.stateView, WAITERS_INDEX, 1);
|
|
397
|
+
// ABA guard: `expected` predates the caller's failed capacity check. A remote
|
|
398
|
+
// release in between skipped notify (WAITERS was 0) — and if a remote acquire
|
|
399
|
+
// then restored RUNNING to exactly `expected`, waitAsync would park on a value
|
|
400
|
+
// that already changed, with the missed release's capacity unconsumed. Re-read
|
|
401
|
+
// AFTER the WAITERS increment: from this point any release will notify us, so
|
|
402
|
+
// an unchanged read is safe to park on, and a changed read means capacity may
|
|
403
|
+
// be free — hand it back to the caller for a dispatch pass instead of parking.
|
|
404
|
+
const current = this.stateView[RUNNING_INDEX];
|
|
405
|
+
if (current !== expected) {
|
|
406
|
+
Atomics.sub(this.stateView, WAITERS_INDEX, 1);
|
|
407
|
+
return current;
|
|
408
|
+
}
|
|
338
409
|
// Atomics.waitAsync does not keep the Node event loop alive on its own. Callers
|
|
339
410
|
// with idle workers (running===0 and tasks queued) need an external keep-alive
|
|
340
411
|
// (their own setTimeout, setInterval, HTTP server, etc.) until notify wakes us.
|
|
@@ -342,18 +413,28 @@ export class Scheduler extends Queue {
|
|
|
342
413
|
this.#waitPromise = (async ? value : Promise.resolve(value)).then(() => {
|
|
343
414
|
// If [kOnExit] already fired (Node still drains the microtask queue
|
|
344
415
|
// after process.on('exit')), it has already drained WAITERS for us and
|
|
345
|
-
// any further state mutation would corrupt shared counters.
|
|
416
|
+
// any further state mutation would corrupt shared counters. But we must
|
|
417
|
+
// forward the wakeup: Atomics.waitAsync cannot be cancelled, so a
|
|
418
|
+
// disposed instance's waiter stays in the (FIFO) wait set and a
|
|
419
|
+
// notify(1) aimed at a live waiter parked behind it would otherwise be
|
|
420
|
+
// swallowed here, stranding that waiter's queue forever. Re-notifying
|
|
421
|
+
// re-targets the wakeup to the next waiter; when none is parked it is a
|
|
422
|
+
// harmless no-op.
|
|
346
423
|
if (this.dead) {
|
|
424
|
+
Atomics.notify(this.stateView, RUNNING_INDEX, 1);
|
|
347
425
|
return;
|
|
348
426
|
}
|
|
349
427
|
Atomics.sub(this.stateView, WAITERS_INDEX, 1);
|
|
350
428
|
this.#waitPromise = null;
|
|
351
429
|
this.#schedule(this.stateView[RUNNING_INDEX]);
|
|
352
430
|
});
|
|
431
|
+
return -1;
|
|
353
432
|
}
|
|
354
433
|
tryAcquire(priority) {
|
|
355
434
|
const p = priority == null ? Queue.NORMAL : parsePriority(priority);
|
|
356
|
-
|
|
435
|
+
// Same-priority FIFO gate (see run()): refuse a slot that work queued at this
|
|
436
|
+
// priority is already waiting for, mirroring Limiter.tryConsume's pending check.
|
|
437
|
+
return this.queues[p + 3].cnt === 0 && this.#tryAcquire(p);
|
|
357
438
|
}
|
|
358
439
|
#tryAcquire(priority) {
|
|
359
440
|
if (this.dead) {
|
|
@@ -389,13 +470,21 @@ export class Scheduler extends Queue {
|
|
|
389
470
|
// Hard cap on global concurrency. getNextQueue's lottery bypasses per-priority
|
|
390
471
|
// limits to prevent starvation and would otherwise push running above max.
|
|
391
472
|
if (running >= max) {
|
|
392
|
-
|
|
393
|
-
|
|
473
|
+
// #maybeWait returns a fresh RUNNING value (instead of parking) when the
|
|
474
|
+
// counter changed under us — loop back and retry the dispatch with it.
|
|
475
|
+
running = this.#maybeWait(running);
|
|
476
|
+
if (running === -1) {
|
|
477
|
+
break;
|
|
478
|
+
}
|
|
479
|
+
continue;
|
|
394
480
|
}
|
|
395
481
|
const queue = this.getNextQueue(limits, running);
|
|
396
482
|
if (queue == null) {
|
|
397
|
-
this.#maybeWait(running);
|
|
398
|
-
|
|
483
|
+
running = this.#maybeWait(running);
|
|
484
|
+
if (running === -1) {
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
continue;
|
|
399
488
|
}
|
|
400
489
|
const fn = queue.arr[queue.idx];
|
|
401
490
|
queue.arr[queue.idx++] = null;
|
|
@@ -403,6 +492,7 @@ export class Scheduler extends Queue {
|
|
|
403
492
|
queue.arr[queue.idx++] = null;
|
|
404
493
|
queue.cnt -= 1;
|
|
405
494
|
if (queue.cnt === 0) {
|
|
495
|
+
this.nonEmptyMask &= ~(1 << queue.i);
|
|
406
496
|
queue.idx = 0;
|
|
407
497
|
// `queue.arr = []` is faster than `arr.length = 0` in V8: truncation walks
|
|
408
498
|
// the elements area to clear refs, while reassigning drops the old backing
|
|
@@ -422,10 +512,16 @@ export class Scheduler extends Queue {
|
|
|
422
512
|
fn(opaque);
|
|
423
513
|
}
|
|
424
514
|
catch (err) {
|
|
425
|
-
// Balance the counter we just incremented
|
|
426
|
-
//
|
|
515
|
+
// Balance the counter we just incremented (this.releasing=true keeps the
|
|
516
|
+
// nested release() from re-entering this dispatch loop), then isolate the
|
|
517
|
+
// failure exactly like Limiter's drain: surface it asynchronously and keep
|
|
518
|
+
// dispatching. Propagating from here would abort the loop — and when the
|
|
519
|
+
// thrower didn't release a slot first, no future release is coming, so the
|
|
520
|
+
// remaining backlog (and any queued run() promises) would strand forever.
|
|
427
521
|
this.release();
|
|
428
|
-
|
|
522
|
+
queueMicrotask(() => {
|
|
523
|
+
throw err;
|
|
524
|
+
});
|
|
429
525
|
}
|
|
430
526
|
// Re-read running after fn() in case it synchronously called release().
|
|
431
527
|
// Plain Int32Array load: same soft-limit relaxation as #tryAcquire — a
|
|
@@ -473,7 +569,12 @@ export class Scheduler extends Queue {
|
|
|
473
569
|
else {
|
|
474
570
|
running = this.shared ? this.stateView[RUNNING_INDEX] : this.running;
|
|
475
571
|
}
|
|
476
|
-
|
|
572
|
+
// Skip the (non-inlined) #schedule call entirely when nothing is queued —
|
|
573
|
+
// measurably cheaper on the no-backlog acquire/release hot path, and
|
|
574
|
+
// semantically identical (#schedule with pending === 0 is a no-op).
|
|
575
|
+
if (this.pending !== 0) {
|
|
576
|
+
this.#schedule(running);
|
|
577
|
+
}
|
|
477
578
|
};
|
|
478
579
|
[Symbol.dispose]() {
|
|
479
580
|
if (this.dead) {
|
|
@@ -498,6 +599,7 @@ export class Scheduler extends Queue {
|
|
|
498
599
|
queue.idx = 0;
|
|
499
600
|
queue.cnt = 0;
|
|
500
601
|
}
|
|
602
|
+
this.nonEmptyMask = 0;
|
|
501
603
|
// Drop our reference to the parked waitAsync chain and remove the strong ref that the
|
|
502
604
|
// exit registry holds, so the instance — and the .then closure capturing it — can be
|
|
503
605
|
// garbage-collected without waiting for process exit. Cleanup already ran above, so
|
package/lib/scheduler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxtedition/scheduler",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -32,5 +32,5 @@
|
|
|
32
32
|
"tsd": "^0.33.0",
|
|
33
33
|
"typescript": "^5.9.3"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "c9f2526dc870597de119b8ec5083f97901d4a2e2"
|
|
36
36
|
}
|