@nxtedition/scheduler 4.1.3 → 4.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -45,6 +45,34 @@ await scheduler.run(() => importantWork(), 'high')
45
45
  await scheduler.run(() => backgroundWork(), Scheduler.LOW)
46
46
  ```
47
47
 
48
+ ### Per-Priority Concurrency
49
+
50
+ Concurrency can be configured per priority to reserve capacity for higher-priority work. A task at priority `p` is admitted on the fast path only when total running tasks are below that priority's cap; otherwise the task queues. The overall `max` is always a hard ceiling.
51
+
52
+ ```js
53
+ // At most 100 concurrent tasks total. Background work (low/lowest) is held
54
+ // to a small fraction so interactive (normal/high) traffic isn't queued behind
55
+ // a flood of batch jobs.
56
+ const scheduler = new Scheduler({
57
+ concurrency: { max: 100, low: 20, lowest: 5 },
58
+ })
59
+ ```
60
+
61
+ Unspecified priorities default to `max`. Each per-priority value is capped at `max`.
62
+
63
+ #### Starvation prevention
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.
66
+
67
+ In `SharedArrayBuffer` mode, the second constructor argument carries per-priority limits (the buffer carries `max` across workers):
68
+
69
+ ```js
70
+ const sharedState = Scheduler.makeSharedState(100) // global max=100
71
+ const scheduler = new Scheduler(sharedState, {
72
+ concurrency: { low: 20, lowest: 5 }, // per-worker caps
73
+ })
74
+ ```
75
+
48
76
  ### Low-Level API
49
77
 
50
78
  For more control, use `acquire` / `release` directly:
@@ -132,10 +160,26 @@ const { running, pending, deferred, queues } = scheduler.stats
132
160
 
133
161
  ## API
134
162
 
135
- ### `new Scheduler(opts)`
136
-
137
- - `opts.concurrency` — max concurrent tasks (default: `Infinity`)
138
- - `opts` may also be a `SharedArrayBuffer` created by `Scheduler.makeSharedState()`
163
+ ### `new Scheduler(opts, options?)`
164
+
165
+ - `opts.concurrency` — concurrency configuration (default: `Infinity`). Either a number (the overall max) or an object with `max` and per-priority caps:
166
+
167
+ ```ts
168
+ type ConcurrencyOptions =
169
+ | number
170
+ | {
171
+ max?: number
172
+ highest?: number
173
+ higher?: number
174
+ high?: number
175
+ normal?: number
176
+ low?: number
177
+ lower?: number
178
+ lowest?: number
179
+ }
180
+ ```
181
+
182
+ - `opts` may also be a `SharedArrayBuffer` created by `Scheduler.makeSharedState()`. In that case, an optional second argument `{ concurrency }` may carry per-priority caps (the buffer's `max` is always the global ceiling).
139
183
 
140
184
  ### `scheduler.run(fn, priority?, opaque?): Promise<T>`
141
185
 
@@ -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;AAC9D,OAAO,EAA4B,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAQ3E,qBAAa,OAAQ,SAAQ,KAAK;;IAChC,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,OAAO,CAAI;IAInB,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM;IAW9C,IAAI,KAAK;;;;;;MAMR;IAED,IAAI,eAAe,WAElB;gBAEW,IAAI,EAAE,iBAAiB,GAAG;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE;IAyBjE,MAAM,CAAC,QAAQ,GAAE,QAAuB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAUpE,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;IA6BV,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAqGnC"}
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;AAC9D,OAAO,EAAuC,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAQtF,qBAAa,OAAQ,SAAQ,KAAK;;IAChC,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,OAAO,CAAI;IAInB,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM;IAW9C,IAAI,KAAK;;;;;;MAMR;IAED,IAAI,eAAe,WAElB;gBAEW,IAAI,EAAE,iBAAiB,GAAG;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE;IAyBjE,MAAM,CAAC,QAAQ,GAAE,QAAuB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAUpE,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;IA6BV,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAsGnC"}
package/lib/limiter.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Transform } from 'node:stream';
2
- import { FastQueue, parsePriority, Queue } from "./queue.js";
2
+ import { FastQueue, NO_LIMITS, parsePriority, Queue } from "./queue.js";
3
3
  const LIMIT_INDEX = 0;
4
4
  const TOKENS_INDEX = 16; // separate cache line to avoid false sharing
5
5
  const REFILL_INDEX = 32; // separate cache line to avoid false sharing
@@ -114,7 +114,7 @@ export class Limiter extends Queue {
114
114
  }
115
115
  try {
116
116
  while (this.pending > 0 && this.stateView[TOKENS_INDEX] > 0) {
117
- let queue = this.getNextQueue();
117
+ let queue = this.getNextQueue(NO_LIMITS, 0);
118
118
  if (queue == null || queue.cnt === 0) {
119
119
  break;
120
120
  }
@@ -146,7 +146,8 @@ export class Limiter extends Queue {
146
146
  this.pending -= 1;
147
147
  if (queue.cnt === 0) {
148
148
  queue.idx = 0;
149
- queue.arr.length = 0;
149
+ // See scheduler.ts: `arr = []` beats `length = 0` in V8 on this hot path.
150
+ queue.arr = [];
150
151
  }
151
152
  else if (queue.idx > 1024) {
152
153
  queue.arr.splice(0, queue.idx);
@@ -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
@@ -6,6 +6,7 @@ export declare class FastQueue {
6
6
  export type NumberPriority = -3 | -2 | -1 | 0 | 1 | 2 | 3;
7
7
  export type Priority = NumberPriority | 'lowest' | 'lower' | 'low' | 'normal' | 'high' | 'higher' | 'highest';
8
8
  export declare function parsePriority(p: string | number): NumberPriority;
9
+ export declare const NO_LIMITS: number[];
9
10
  export declare class Queue {
10
11
  static readonly LOWEST = -3;
11
12
  static readonly LOWER = -2;
@@ -16,6 +17,6 @@ export declare class Queue {
16
17
  static readonly HIGHEST = 3;
17
18
  private counter;
18
19
  protected queues: FastQueue[];
19
- protected getNextQueue(): FastQueue | null;
20
+ protected getNextQueue(limits: number[], running: number): FastQueue | null;
20
21
  }
21
22
  //# sourceMappingURL=queue.d.ts.map
@@ -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;CACzB;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;AAID,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;IAGnB,SAAS,CAAC,MAAM,cAQf;IAED,SAAS,CAAC,YAAY;CAqCvB"}
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;CACzB;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;AAOD,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;IAGnB,SAAS,CAAC,MAAM,cAQf;IAaD,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM;CA2CzD"}
package/lib/queue.js CHANGED
@@ -45,6 +45,18 @@ export function parsePriority(p) {
45
45
  }
46
46
  }
47
47
  const maxInt = 2147483647;
48
+ // Sentinel limits array for callers that don't enforce per-priority caps.
49
+ // `running < NO_LIMITS[n]` is always true for any non-negative running count,
50
+ // so passing this acts as "no filter".
51
+ export const NO_LIMITS = [
52
+ Number.MAX_SAFE_INTEGER,
53
+ Number.MAX_SAFE_INTEGER,
54
+ Number.MAX_SAFE_INTEGER,
55
+ Number.MAX_SAFE_INTEGER,
56
+ Number.MAX_SAFE_INTEGER,
57
+ Number.MAX_SAFE_INTEGER,
58
+ Number.MAX_SAFE_INTEGER,
59
+ ];
48
60
  export class Queue {
49
61
  static LOWEST = -3;
50
62
  static LOWER = -2;
@@ -64,7 +76,18 @@ export class Queue {
64
76
  new FastQueue(), // 5 higher
65
77
  new FastQueue(), // 6 highest
66
78
  ];
67
- getNextQueue() {
79
+ // Pick the next queue to dispatch from.
80
+ //
81
+ // Fairness: a counter-driven lottery selects a starting priority — highest 50% of
82
+ // the time, biased exponentially toward lower priorities (lowest ~0.78%). This
83
+ // prevents lower priorities from being indefinitely starved by higher ones.
84
+ //
85
+ // Limit enforcement: per-priority caps are checked via `running < limits[idx]`.
86
+ // The lottery-selected queue, however, BYPASSES its limit when non-empty —
87
+ // otherwise a queue at its cap could never drain even when fairness gives it a
88
+ // turn, defeating starvation prevention. Use `running = -1` to bypass limits on
89
+ // every queue (e.g. when the local worker has nothing running).
90
+ getNextQueue(limits, running) {
68
91
  this.counter = (this.counter + 1) & maxInt;
69
92
  let idx = this.queues.length - 1;
70
93
  if (this.counter & 0b0000001) {
@@ -88,15 +111,20 @@ export class Queue {
88
111
  else if (this.counter & 0b1000000) {
89
112
  idx = 0; // lowest: 0.78%
90
113
  }
91
- for (let n = idx; n >= 0; n--) {
114
+ // Lottery-selected queue: bypass its limit (starvation prevention).
115
+ const preferred = this.queues[idx];
116
+ if (preferred.cnt > 0) {
117
+ return preferred;
118
+ }
119
+ for (let n = idx - 1; n >= 0; n--) {
92
120
  const q = this.queues[n];
93
- if (q.cnt > 0) {
121
+ if (q.cnt > 0 && running < limits[n]) {
94
122
  return q;
95
123
  }
96
124
  }
97
125
  for (let n = this.queues.length - 1; n > idx; n--) {
98
126
  const q = this.queues[n];
99
- if (q.cnt > 0) {
127
+ if (q.cnt > 0 && running < limits[n]) {
100
128
  return q;
101
129
  }
102
130
  }
package/lib/queue.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,14 @@
1
1
  import { Queue, type Priority } from './queue.ts';
2
+ export type ConcurrencyOptions = number | {
3
+ max?: number;
4
+ highest?: number;
5
+ higher?: number;
6
+ high?: number;
7
+ normal?: number;
8
+ low?: number;
9
+ lower?: number;
10
+ lowest?: number;
11
+ };
2
12
  export declare class Scheduler extends Queue {
3
13
  #private;
4
14
  private stateView;
@@ -15,14 +25,16 @@ export declare class Scheduler extends Queue {
15
25
  count: number;
16
26
  }[];
17
27
  };
18
- constructor(opts: SharedArrayBuffer | {
19
- concurrency?: number;
28
+ constructor(optsOrArrayBuffer: SharedArrayBuffer | {
29
+ concurrency?: ConcurrencyOptions;
30
+ }, options?: {
31
+ concurrency?: ConcurrencyOptions;
20
32
  });
21
33
  run<T>(fn: () => PromiseLike<T> | T, priority?: Priority): Promise<T>;
22
34
  run<T, U>(fn: (opaque: U) => PromiseLike<T> | T, priority: Priority, opaque: U): Promise<T>;
23
35
  acquire(fn: () => unknown, priority?: Priority): boolean;
24
36
  acquire<U>(fn: (opaque: U) => unknown, priority: Priority | undefined, opaque: U): boolean;
25
- tryAcquire(): boolean;
37
+ tryAcquire(priority?: Priority): boolean;
26
38
  release: () => void;
27
39
  }
28
40
  //# sourceMappingURL=scheduler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAc3E,qBAAa,SAAU,SAAQ,KAAK;;IAClC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAGjC,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,SAAS,CAAQ;IAmBzB,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM;IAc1C,IAAI,WAAW,WAGd;IAED,IAAI,KAAK;;;;;;MAMR;gBAEW,IAAI,EAAE,iBAAiB,GAAG;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IA8B9D,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;IAkB3F,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;IA4B1F,UAAU,IAAI,OAAO;IA2BrB,OAAO,aA6DN;CACF"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,EAAuB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAchG,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;AAoCL,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;IAmBzB,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM;IAc1C,IAAI,WAAW,WAGd;IAED,IAAI,KAAK;;;;;;MAMR;gBAGC,iBAAiB,EAAE,iBAAiB,GAAG;QAAE,WAAW,CAAC,EAAE,kBAAkB,CAAA;KAAE,EAC3E,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,kBAAkB,CAAA;KAAE;IAkChD,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;IAmB3F,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;IA4B1F,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO;IAkCxC,OAAO,aA2EN;CACF"}
package/lib/scheduler.js CHANGED
@@ -3,10 +3,41 @@ const RUNNING_INDEX = 0;
3
3
  const CONCURRENCY_INDEX = 16; // separate cache line to avoid false sharing
4
4
  const MAGIC_INDEX = 8; // within first cache line, between RUNNING and CONCURRENCY
5
5
  const SCHEDULER_MAGIC = 0x5ca4edde; // sanity-check sentinel written by makeSharedState
6
+ // Per-priority limit keys, ordered to match `Queue.queues` (lowest=0, normal=3, highest=6).
7
+ const PRIORITY_KEYS = ['lowest', 'lower', 'low', 'normal', 'high', 'higher', 'highest'];
8
+ function validateLimit(name, value) {
9
+ if (value === Infinity) {
10
+ return Number.MAX_SAFE_INTEGER;
11
+ }
12
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
13
+ throw new Error(`Invalid concurrency.${name}`);
14
+ }
15
+ return value;
16
+ }
17
+ // Build a 7-element limits array indexed by `priority + 3`. Each entry is capped by `max`
18
+ // so a single comparison `running < limits[idx]` enforces both per-priority and overall caps.
19
+ function buildLimits(opts, sharedMax = Number.MAX_SAFE_INTEGER) {
20
+ const cfg = typeof opts === 'number' ? { max: opts } : (opts ?? {});
21
+ const max = Math.min(cfg.max == null ? Number.MAX_SAFE_INTEGER : validateLimit('max', cfg.max), sharedMax);
22
+ const limits = PRIORITY_KEYS.map((key) => {
23
+ const v = cfg[key];
24
+ if (v == null) {
25
+ return max;
26
+ }
27
+ return Math.min(validateLimit(key, v), max);
28
+ });
29
+ return { max, limits };
30
+ }
6
31
  export class Scheduler extends Queue {
7
32
  stateView;
8
33
  shared;
9
- #concurrency; // MAX_SAFE_INTEGER = unlimited; cached to avoid repeated getter + array read
34
+ // Indexed by `priority + 3` (lowest=0, normal=3, highest=6); each entry already
35
+ // includes the overall `max` ceiling so #tryAcquire only needs one comparison.
36
+ #concurrency;
37
+ // Overall ceiling, enforced by the dispatch loop independently of per-priority
38
+ // caps. The lottery in getNextQueue may bypass per-priority limits to avoid
39
+ // starving capped queues, but max is a hard cap.
40
+ #max;
10
41
  running = 0;
11
42
  pending = 0;
12
43
  releasing = false;
@@ -52,38 +83,40 @@ export class Scheduler extends Queue {
52
83
  queues: this.queues.map((q) => ({ count: q.cnt })),
53
84
  };
54
85
  }
55
- constructor(opts) {
86
+ constructor(optsOrArrayBuffer, options) {
56
87
  super();
57
- if (opts instanceof SharedArrayBuffer) {
58
- if (opts.byteLength !== 128) {
88
+ if (optsOrArrayBuffer instanceof SharedArrayBuffer) {
89
+ const state = optsOrArrayBuffer;
90
+ if (state.byteLength !== 128) {
59
91
  throw new Error('Invalid SharedArrayBuffer size');
60
92
  }
61
- if (new Int32Array(opts)[MAGIC_INDEX] !== SCHEDULER_MAGIC) {
93
+ if (new Int32Array(state)[MAGIC_INDEX] !== SCHEDULER_MAGIC) {
62
94
  throw new Error('Invalid SharedArrayBuffer: not created by Scheduler.makeSharedState');
63
95
  }
64
- this.stateView = new Int32Array(opts);
96
+ this.stateView = new Int32Array(state);
65
97
  this.shared = true;
66
- const sc = Atomics.load(this.stateView, CONCURRENCY_INDEX);
67
- this.#concurrency = sc < 0 ? Number.MAX_SAFE_INTEGER : sc;
98
+ const sm = Atomics.load(this.stateView, CONCURRENCY_INDEX);
99
+ const sharedMax = sm < 0 ? Number.MAX_SAFE_INTEGER : sm;
100
+ const built = buildLimits(options?.concurrency, sharedMax);
101
+ this.#concurrency = built.limits;
102
+ this.#max = built.max;
68
103
  }
69
104
  else {
70
- let concurrency = opts?.concurrency ?? Infinity;
71
- if (concurrency === Infinity) {
72
- concurrency = -1;
73
- }
74
- else if (!Number.isInteger(concurrency) || concurrency < 0) {
75
- throw new Error('Invalid concurrency');
76
- }
105
+ const opts = optsOrArrayBuffer;
106
+ const { limits, max } = buildLimits(opts?.concurrency);
77
107
  this.stateView = new Int32Array(64);
78
- Atomics.store(this.stateView, CONCURRENCY_INDEX, concurrency);
108
+ // Persist `max` so the public `concurrency` getter still reflects the overall ceiling.
109
+ Atomics.store(this.stateView, CONCURRENCY_INDEX, max === Number.MAX_SAFE_INTEGER ? -1 : max);
79
110
  this.shared = false;
80
- this.#concurrency = concurrency < 0 ? Number.MAX_SAFE_INTEGER : concurrency;
111
+ this.#concurrency = limits;
112
+ this.#max = max;
81
113
  }
82
114
  }
83
115
  run(fn, priority = Queue.NORMAL, opaque) {
84
116
  return new Promise((resolve, reject) => {
85
117
  const ctx = { resolve, reject, fn, opaque };
86
- if (this.tryAcquire()) {
118
+ const p = parsePriority(priority);
119
+ if (this.#tryAcquire(p)) {
87
120
  // Fast path: slot available immediately — call #runTask directly.
88
121
  this.#runTask(ctx);
89
122
  }
@@ -96,12 +129,12 @@ export class Scheduler extends Queue {
96
129
  acquire(fn, priority = Queue.NORMAL, opaque) {
97
130
  const p = priority == null ? Queue.NORMAL : parsePriority(priority);
98
131
  const queue = this.queues[p + 3];
99
- if (this.tryAcquire()) {
132
+ if (this.#tryAcquire(p)) {
100
133
  try {
101
134
  fn(opaque);
102
135
  }
103
136
  catch (err) {
104
- // Balance the counter we incremented in tryAcquire() before propagating.
137
+ // Balance the counter we incremented in #tryAcquire() before propagating.
105
138
  this.release();
106
139
  throw err;
107
140
  }
@@ -112,7 +145,12 @@ export class Scheduler extends Queue {
112
145
  this.pending += 1;
113
146
  return false;
114
147
  }
115
- tryAcquire() {
148
+ tryAcquire(priority) {
149
+ const p = priority == null ? Queue.NORMAL : parsePriority(priority);
150
+ return this.#tryAcquire(p);
151
+ }
152
+ #tryAcquire(priority) {
153
+ const limit = this.#concurrency[priority + 3];
116
154
  if (this.shared) {
117
155
  // In shared-buffer mode, other workers may hold global slots so we guarantee at least one
118
156
  // local job runs regardless (starvation prevention). Not applicable to non-shared mode where
@@ -123,7 +161,7 @@ export class Scheduler extends Queue {
123
161
  return true;
124
162
  }
125
163
  // We use non-atomic access here as an optimization and treat the concurrency limit as a soft limit.
126
- if (this.stateView[RUNNING_INDEX] < this.#concurrency) {
164
+ if (this.stateView[RUNNING_INDEX] < limit) {
127
165
  Atomics.add(this.stateView, RUNNING_INDEX, 1);
128
166
  this.running += 1;
129
167
  return true;
@@ -131,7 +169,7 @@ export class Scheduler extends Queue {
131
169
  return false;
132
170
  }
133
171
  // Non-shared: JS is single-threaded, no atomics needed.
134
- if (this.running < this.#concurrency) {
172
+ if (this.running < limit) {
135
173
  this.running += 1;
136
174
  return true;
137
175
  }
@@ -151,13 +189,24 @@ export class Scheduler extends Queue {
151
189
  if (this.pending === 0 || this.releasing) {
152
190
  return;
153
191
  }
154
- const c = this.#concurrency; // cache for loop
192
+ const limits = this.#concurrency;
193
+ const max = this.#max;
155
194
  try {
156
195
  this.releasing = true;
157
- while (this.pending > 0 && (this.running === 0 || running < c)) {
158
- const queue = this.getNextQueue();
196
+ while (this.pending > 0) {
197
+ // Hard cap: max is enforced here so it can't be bypassed by the lottery's
198
+ // per-priority override below. The `this.running > 0` guard preserves the
199
+ // local-starvation exception (a worker with nothing running locally still
200
+ // dispatches one task even if global running has reached max).
201
+ if (this.running > 0 && running >= max) {
202
+ break;
203
+ }
204
+ // Starvation prevention: if this worker has nothing running locally, dispatch
205
+ // regardless of per-priority limits. Pass running=-1 as the bypass sentinel
206
+ // so getNextQueue's scan accepts any non-empty queue.
207
+ const queue = this.getNextQueue(limits, this.running === 0 ? -1 : running);
159
208
  if (queue == null) {
160
- throw new Error('Invariant violation: pending > 0 but no tasks in queues');
209
+ break;
161
210
  }
162
211
  const fn = queue.arr[queue.idx];
163
212
  queue.arr[queue.idx++] = null;
@@ -166,7 +215,10 @@ export class Scheduler extends Queue {
166
215
  queue.cnt -= 1;
167
216
  if (queue.cnt === 0) {
168
217
  queue.idx = 0;
169
- queue.arr.length = 0;
218
+ // `queue.arr = []` is faster than `arr.length = 0` in V8: truncation walks
219
+ // the elements area to clear refs, while reassigning drops the old backing
220
+ // store and lets GC reclaim it. ~5-10% faster on the drain hot path.
221
+ queue.arr = [];
170
222
  }
171
223
  else if (queue.idx > 1024) {
172
224
  queue.arr.splice(0, queue.idx);
@@ -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",
3
+ "version": "4.1.4",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -33,5 +33,5 @@
33
33
  "tsd": "^0.33.0",
34
34
  "typescript": "^5.9.3"
35
35
  },
36
- "gitHead": "7c9c7457c885c644c7a1e70ef894d4727ce240d6"
36
+ "gitHead": "088f6e6d615d4eeee0b2e317c9011dfa57308cc9"
37
37
  }