@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 +48 -4
- package/lib/limiter.d.ts.map +1 -1
- package/lib/limiter.js +4 -3
- package/lib/limiter.js.map +1 -1
- package/lib/queue.d.ts +2 -1
- package/lib/queue.d.ts.map +1 -1
- package/lib/queue.js +32 -4
- package/lib/queue.js.map +1 -1
- package/lib/scheduler.d.ts +15 -3
- package/lib/scheduler.d.ts.map +1 -1
- package/lib/scheduler.js +80 -28
- package/lib/scheduler.js.map +1 -1
- package/package.json +2 -2
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` —
|
|
138
|
-
|
|
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
|
|
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;AAC9D,OAAO,
|
|
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
|
-
|
|
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);
|
package/lib/limiter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limiter.js","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAA;
|
|
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
|
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;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;
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,MAAM,OAAO,SAAS;IACpB,GAAG,GAAG,CAAC,CAAA;IACP,GAAG,GAAG,CAAC,CAAA;IACP,GAAG,GAAmB,EAAE,CAAA;CACzB;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,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,mEAAmE;IACzD,MAAM,GAAG;QACjB,IAAI,SAAS,EAAE,EAAE,WAAW;QAC5B,IAAI,SAAS,EAAE,EAAE,UAAU;QAC3B,IAAI,SAAS,EAAE,EAAE,QAAQ;QACzB,IAAI,SAAS,EAAE,EAAE,WAAW;QAC5B,IAAI,SAAS,EAAE,EAAE,SAAS;QAC1B,IAAI,SAAS,EAAE,EAAE,WAAW;QAC5B,IAAI,SAAS,EAAE,EAAE,YAAY;KAC9B,CAAA;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
package/lib/scheduler.d.ts
CHANGED
|
@@ -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(
|
|
19
|
-
concurrency?:
|
|
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
|
package/lib/scheduler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,
|
|
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
|
-
|
|
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(
|
|
86
|
+
constructor(optsOrArrayBuffer, options) {
|
|
56
87
|
super();
|
|
57
|
-
if (
|
|
58
|
-
|
|
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(
|
|
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(
|
|
96
|
+
this.stateView = new Int32Array(state);
|
|
65
97
|
this.shared = true;
|
|
66
|
-
const
|
|
67
|
-
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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] <
|
|
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 <
|
|
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
|
|
192
|
+
const limits = this.#concurrency;
|
|
193
|
+
const max = this.#max;
|
|
155
194
|
try {
|
|
156
195
|
this.releasing = true;
|
|
157
|
-
while (this.pending > 0
|
|
158
|
-
|
|
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
|
-
|
|
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);
|
package/lib/scheduler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAsC,MAAM,YAAY,CAAA;AAEhG,MAAM,aAAa,GAAG,CAAC,CAAA;AACvB,MAAM,iBAAiB,GAAG,EAAE,CAAA,CAAC,6CAA6C;AAC1E,MAAM,WAAW,GAAG,CAAC,CAAA,CAAC,2DAA2D;AACjF,MAAM,eAAe,GAAG,UAAU,CAAA,CAAC,mDAAmD;AAsBtF,4FAA4F;AAC5F,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAA;AAEhG,SAAS,aAAa,CAAC,IAAY,EAAE,KAAc;IACjD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,gBAAgB,CAAA;IAChC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,0FAA0F;AAC1F,8FAA8F;AAC9F,SAAS,WAAW,CAAC,IAAoC,EAAE,SAAS,GAAG,MAAM,CAAC,gBAAgB;IAC5F,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAEnE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EACzE,SAAS,CACV,CAAA;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACvC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YACd,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IAC1B,SAAS,CAAY;IACZ,MAAM,CAAU;IACjC,gFAAgF;IAChF,+EAA+E;IAC/E,YAAY,CAAU;IACtB,+EAA+E;IAC/E,4EAA4E;IAC5E,iDAAiD;IACjD,IAAI,CAAQ;IAEJ,OAAO,GAAG,CAAC,CAAA;IACX,OAAO,GAAG,CAAC,CAAA;IACX,SAAS,GAAG,KAAK,CAAA;IAEzB,sEAAsE;IACtE,iFAAiF;IACjF,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAU,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;YACzB,IAAI,MAAM,IAAI,IAAI,IAAI,OAAQ,MAA+B,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAClF,KAAM,MAA+B,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAChF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,CAAA;gBACf,IAAI,CAAC,OAAO,EAAE,CAAA;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAA,CAAC,sEAAsE;YAClF,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;IACH,CAAC,CAAA;IAED,MAAM,CAAC,eAAe,CAAC,WAAmB;QACxC,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,WAAW,GAAG,CAAC,CAAC,CAAA;QAClB,CAAC;aAAM,IAAI,WAAW,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAA,CAAC,+BAA+B;QAC9E,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAA;QAC7C,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,eAAe,CAAC,CAAA;QACtD,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAA;QACxD,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,IAAI,WAAW;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAC3C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,KAAK;QACP,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SACnD,CAAA;IACH,CAAC;IAED,YACE,iBAA2E,EAC3E,OAA8C;QAE9C,KAAK,EAAE,CAAA;QAEP,IAAI,iBAAiB,YAAY,iBAAiB,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,iBAAiB,CAAA;YAE/B,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;YACnD,CAAC;YACD,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,eAAe,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;YACxF,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAElB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAA;YAC1D,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;YACvD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;YAC1D,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAA;YAChC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,iBAAiB,CAAA;YAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;YAEtD,IAAI,CAAC,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;YACnC,uFAAuF;YACvF,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,KAAK,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC5F,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YACnB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAA;YAC1B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACjB,CAAC;IACH,CAAC;IAID,GAAG,CACD,EAAsC,EACtC,WAAqB,KAAK,CAAC,MAAM,EACjC,MAAU;QAEV,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAY,CAAA;YACrD,MAAM,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;YACjC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxB,kEAAkE;gBAClE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,mDAAmD;gBACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAID,OAAO,CACL,EAA2B,EAC3B,WAAiC,KAAK,CAAC,MAAM,EAC7C,MAAU;QAEV,MAAM,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAEhC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,CAAA;YACZ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,0EAA0E;gBAC1E,IAAI,CAAC,OAAO,EAAE,CAAA;gBACd,MAAM,GAAG,CAAA;YACX,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC1B,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QAEd,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QAEjB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,UAAU,CAAC,QAAmB;QAC5B,MAAM,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACnE,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC;IAED,WAAW,CAAC,QAAwB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QAE7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,0FAA0F;YAC1F,6FAA6F;YAC7F,yCAAyC;YACzC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;gBAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;gBACjB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,oGAAoG;YACpG,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,KAAK,EAAE,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;gBAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;gBACjB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,wDAAwD;QACxD,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,GAAG,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,OAAe,CAAA;QACnB,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YACjB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QACrF,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAC/E,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;YACrB,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACxB,0EAA0E;gBAC1E,0EAA0E;gBAC1E,0EAA0E;gBAC1E,+DAA+D;gBAC/D,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;oBACvC,MAAK;gBACP,CAAC;gBACD,8EAA8E;gBAC9E,4EAA4E;gBAC5E,sDAAsD;gBACtD,MAAM,KAAK,GAAqB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;gBAE5F,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAClB,MAAK;gBACP,CAAC;gBAED,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAkC,CAAA;gBAChE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAA;gBAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACnC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAA;gBAC7B,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;gBAEd,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;oBACpB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;oBACb,2EAA2E;oBAC3E,2EAA2E;oBAC3E,qEAAqE;oBACrE,KAAK,CAAC,GAAG,GAAG,EAAE,CAAA;gBAChB,CAAC;qBAAM,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;oBAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;oBAC9B,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;gBACf,CAAC;gBAED,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;gBACjB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;gBAEjB,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;gBAC/C,CAAC;gBAED,IAAI,CAAC;oBACH,EAAE,CAAC,MAAM,CAAC,CAAA;gBACZ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,kFAAkF;oBAClF,kFAAkF;oBAClF,IAAI,CAAC,OAAO,EAAE,CAAA;oBACd,MAAM,GAAG,CAAA;gBACX,CAAC;gBAED,uEAAuE;gBACvE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;YAC/E,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;QACxB,CAAC;IACH,CAAC,CAAA;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxtedition/scheduler",
|
|
3
|
-
"version": "4.1.
|
|
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": "
|
|
36
|
+
"gitHead": "088f6e6d615d4eeee0b2e317c9011dfa57308cc9"
|
|
37
37
|
}
|