dynamic-throttled-queue 2.2.0 → 2.3.0-rc.0a1a3b6
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 +7 -4
- package/dist/adaptive-rate.d.ts +48 -0
- package/dist/adaptive-rate.js +231 -0
- package/dist/adaptive-rate.js.map +1 -0
- package/dist/dynamic-throttled-queue.d.ts +1 -1
- package/dist/dynamic-throttled-queue.js +8 -3
- package/dist/dynamic-throttled-queue.js.map +1 -1
- package/dist/scheduler.d.ts +2 -2
- package/dist/scheduler.js +117 -242
- package/dist/scheduler.js.map +1 -1
- package/package.json +1 -1
- package/dist/rate-controller.d.ts +0 -22
- package/dist/rate-controller.js +0 -43
- package/dist/rate-controller.js.map +0 -1
package/README.md
CHANGED
|
@@ -99,10 +99,11 @@ throttle.stop(); // halt processing
|
|
|
99
99
|
|
|
100
100
|
| State | Pending work and enqueue | Active work | Scheduling and lifecycle operations |
|
|
101
101
|
| ----- | ------------------------ | ----------- | ----------------------------------- |
|
|
102
|
-
| Running | Pending work can start; new callbacks are accepted. | Continues normally. | `pause()` retains work and stops new starts. `stop()` retains work and clears timers. `abort()` is terminal. |
|
|
102
|
+
| Running | Pending work can start; new callbacks are accepted. | Continues normally. | `pause()` retains work and stops new starts. `stop()` retains work and clears timers. `abort()` is terminal. A rate strategy failure moves the queue to Failed. |
|
|
103
103
|
| Paused | Pending work, newly enqueued callbacks, and retries are retained but do not start. | Continues and settles normally. | `resume()` restarts pacing at the current rate and begins a fresh adaptive-rate observation window. Delayed retries freeze their remaining delay and continue only after resume. `pause()` is idempotent. `stop()` clears the paused state. |
|
|
104
104
|
| Stopped | Pending work is retained. A later enqueue restarts scheduling. | Continues and settles normally. | Delayed retries freeze their remaining delay; the later enqueue resumes them. `pause()` and `resume()` are no-ops. `stop()` is idempotent. |
|
|
105
105
|
| Aborted | Pending work is discarded and future enqueues throw. | Receives the shared abort signal and may finish cooperatively. | `pause()`, `resume()`, `stop()`, and `abort()` do not restart scheduling; `abort()` is idempotent. |
|
|
106
|
+
| Failed | Pending work is discarded and future enqueues throw the strategy error. | Continues and settles without retries or accounting. The shared signal is not aborted. | Terminal. `pause()`, `resume()`, `stop()`, and `abort()` are no-ops. |
|
|
106
107
|
|
|
107
108
|
While paused, callback outcomes do not contribute to adaptive-rate adjustment. A failed active callback may still create a configured retry, but that retry remains pending until `resume()`.
|
|
108
109
|
|
|
@@ -112,9 +113,11 @@ In settled timing, `pause()` discards the in-progress observation window rather
|
|
|
112
113
|
|
|
113
114
|
`abort()` is terminal and idempotent. It clears scheduler timers, discards pending callbacks, and aborts the one shared signal supplied to active callbacks. Future enqueue attempts throw. Cancellation is cooperative: callbacks that ignore the signal can continue running, but their later success or failure does not retry work or affect adaptive-rate accounting.
|
|
114
115
|
|
|
115
|
-
|
|
116
|
+
A queue fails when `rateStrategy` throws or returns a malformed decision. The queue clears its timers, discards pending callbacks and delayed retries, and reports `state: "failed"`. The original error is still rethrown where the decision ran: an uncaught exception from the adaptive-rate timer, or an unhandled rejection when a slow asynchronous callback completes a settled-timing window. Pending `waitForIdle()` promises reject with that error immediately, even while callbacks are still active; later `waitForIdle()` calls reject with it and later enqueues throw it. Unlike `abort()`, failure does not wait for active callbacks to settle. Create a new queue to resume work.
|
|
116
117
|
|
|
117
|
-
`
|
|
118
|
+
`getState()` returns a frozen `QueueState` snapshot. Each call is independent; mutations to the returned object do not affect the queue. Fields: `rate` (current rate), `pending` (queued + delayed retries), `active` (callbacks executing), `state` (`"running"` | `"paused"` | `"stopped"` | `"aborted"` | `"failed"`), and monotonic lifetime counters `started`, `succeeded`, `failed`, `retried`, `rateIncreases`, `rateDecreases`. `started`/`succeeded`/`failed` count callback attempts: a retry is a new attempt; a failure is counted even when a later retry succeeds. `retried` increments only when another attempt is actually scheduled. Rate-direction counters match applied rate changes and `onRateChange` notifications exactly. Counters do not change for settlements after `abort()` or a strategy failure.
|
|
119
|
+
|
|
120
|
+
`waitForIdle()` returns a `Promise<void>` that resolves once all pending callbacks, active executions, and delayed retries have reached a terminal outcome. If the queue is already idle the promise resolves immediately. Each call is one-shot: a later enqueue does not affect a promise that has already resolved. Multiple simultaneous callers all resolve at the same idle transition without retaining waiter state. A callback failure that triggers a retry never exposes a transient idle transition between the failed attempt and the retry. `stop()` retains pending work, so existing waiters remain pending until that work completes after a later enqueue resumes the queue. `abort()` discards pending work, so waiters resolve as soon as no callback is active: immediately when none is running, otherwise when the last active callback settles. Post-abort settlements do not create new retry work. A paused queue resolves waiters only when both pending and active work are zero. A failed queue rejects every waiter with the strategy error at once, without waiting for active callbacks.
|
|
118
121
|
|
|
119
122
|
## Examples
|
|
120
123
|
|
|
@@ -260,7 +263,7 @@ createThrottledQueue({ min_rpi: 1, max_rpi: 10, interval: 1000, rateStrategy: li
|
|
|
260
263
|
|
|
261
264
|
A `RateStrategy` receives a frozen observation with `currentRate`, `minRate`, `maxRate`, `errorCount`, `errorThreshold`, `hasPendingWork`, and `wasBackedOff`; it returns `{ nextRate, shouldBackOff }`. Every queue starts at the midpoint of its configured range. The queue clamps finite integer `nextRate` values to its bounds. `shouldBackOff` requests a pause, which the queue performs only when `back_off` is `true`.
|
|
262
265
|
|
|
263
|
-
Strategies must return a finite integer `nextRate` and a boolean `shouldBackOff`. A malformed decision or a strategy exception
|
|
266
|
+
Strategies must return a finite integer `nextRate` and a boolean `shouldBackOff`. A malformed decision or a strategy exception fails that queue permanently: see [Lifecycle](#lifecycle) for what the failed state discards, rejects and rethrows. Create a new queue instance to resume work.
|
|
264
267
|
|
|
265
268
|
### Backoff
|
|
266
269
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AdjustmentTiming, RateFailureOutcome, RateOutcomeClassifier, RateStrategy } from "./dynamic-throttled-queue.js";
|
|
2
|
+
/**
|
|
3
|
+
* Whether callbacks may start. `open` allows paced starts, `held` blocks starts until the module
|
|
4
|
+
* reopens them, and `idle` means the module is not observing and waits for `start()`.
|
|
5
|
+
*/
|
|
6
|
+
export type Pacing = "idle" | "open" | "held";
|
|
7
|
+
/** Reports how one started callback settled: `undefined` for success, otherwise the failure. */
|
|
8
|
+
export type SettlementReporter = (outcome: RateFailureOutcome | undefined) => void;
|
|
9
|
+
export type AdaptiveRateOptions = {
|
|
10
|
+
min_rpi: number;
|
|
11
|
+
max_rpi: number;
|
|
12
|
+
interval: number;
|
|
13
|
+
errors_per_interval: number;
|
|
14
|
+
back_off: boolean;
|
|
15
|
+
adjustmentTiming: AdjustmentTiming;
|
|
16
|
+
rateStrategy: RateStrategy;
|
|
17
|
+
rateOutcomeClassifier?: RateOutcomeClassifier;
|
|
18
|
+
onRateChange?: (rate: number) => void;
|
|
19
|
+
};
|
|
20
|
+
export type AdaptiveRateHost = {
|
|
21
|
+
/** Whether accepted work is waiting to start. */
|
|
22
|
+
hasPendingWork: () => boolean;
|
|
23
|
+
/** Begins fresh pacing: the next paced start is one spacing from now. */
|
|
24
|
+
resumeStarts: () => void;
|
|
25
|
+
/** Cancels the next paced start, or reschedules it `deferBy` ms beyond one spacing from now. */
|
|
26
|
+
holdStarts: (deferBy?: number) => void;
|
|
27
|
+
/** Observation ended: cancel the next paced start. */
|
|
28
|
+
idle: () => void;
|
|
29
|
+
/** The rate strategy failed; the host must call `stop()`. The error is rethrown after this returns. */
|
|
30
|
+
failed: (error: unknown) => void;
|
|
31
|
+
};
|
|
32
|
+
export type AdaptiveRate = {
|
|
33
|
+
readonly rate: number;
|
|
34
|
+
readonly rateIncreases: number;
|
|
35
|
+
readonly rateDecreases: number;
|
|
36
|
+
readonly pacing: Pacing;
|
|
37
|
+
/** Ends a pause, then begins observing if idle and work is pending. */
|
|
38
|
+
start: () => void;
|
|
39
|
+
/** Reports that every queued callback has started. */
|
|
40
|
+
drained: () => void;
|
|
41
|
+
/** Ends observation. Settled timing discards its in-progress window. */
|
|
42
|
+
stop: () => void;
|
|
43
|
+
/** Stops and discards the observation. Settlements are ignored until `start()` or `stop()`. */
|
|
44
|
+
pause: () => void;
|
|
45
|
+
/** Reports a callback start. Call the returned reporter once when that callback settles. */
|
|
46
|
+
started: () => SettlementReporter;
|
|
47
|
+
};
|
|
48
|
+
export declare function createAdaptiveRate(options: AdaptiveRateOptions, host: AdaptiveRateHost): AdaptiveRate;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
const ignoreSettlement = () => { };
|
|
2
|
+
function validateDecision(decision) {
|
|
3
|
+
if (typeof decision !== "object" || decision === null) {
|
|
4
|
+
throw new TypeError("rate strategy must return a decision object");
|
|
5
|
+
}
|
|
6
|
+
const candidate = decision;
|
|
7
|
+
if (!Number.isFinite(candidate.nextRate) || !Number.isInteger(candidate.nextRate)) {
|
|
8
|
+
throw new TypeError("rate strategy must return a finite integer nextRate");
|
|
9
|
+
}
|
|
10
|
+
if (typeof candidate.shouldBackOff !== "boolean") {
|
|
11
|
+
throw new TypeError("rate strategy must return a boolean shouldBackOff");
|
|
12
|
+
}
|
|
13
|
+
return candidate;
|
|
14
|
+
}
|
|
15
|
+
/** Decides every interval from the outcomes that settled during it, whenever those callbacks started. */
|
|
16
|
+
function intervalTiming(context) {
|
|
17
|
+
let tick;
|
|
18
|
+
let run = 0;
|
|
19
|
+
function adjust() {
|
|
20
|
+
tick = undefined;
|
|
21
|
+
const current = run;
|
|
22
|
+
const hold = context.decide();
|
|
23
|
+
if (current !== run)
|
|
24
|
+
return;
|
|
25
|
+
if (hold)
|
|
26
|
+
context.hold(context.interval);
|
|
27
|
+
else if (context.pacing === "held")
|
|
28
|
+
context.reopen();
|
|
29
|
+
tick = setTimeout(adjust, context.interval);
|
|
30
|
+
}
|
|
31
|
+
function stop() {
|
|
32
|
+
clearTimeout(tick);
|
|
33
|
+
tick = undefined;
|
|
34
|
+
run++;
|
|
35
|
+
context.idle();
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
start() {
|
|
39
|
+
context.resume();
|
|
40
|
+
tick = setTimeout(adjust, context.interval);
|
|
41
|
+
},
|
|
42
|
+
started: () => context.record,
|
|
43
|
+
drained: stop,
|
|
44
|
+
stop,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Decides once every callback that started during one collection interval has settled. */
|
|
48
|
+
function settledTiming(context) {
|
|
49
|
+
let timer;
|
|
50
|
+
let window = 0;
|
|
51
|
+
let collecting = false;
|
|
52
|
+
let outstanding = 0;
|
|
53
|
+
function open() {
|
|
54
|
+
timer = undefined;
|
|
55
|
+
if (!context.hasPendingWork()) {
|
|
56
|
+
context.idle();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
window++;
|
|
60
|
+
collecting = true;
|
|
61
|
+
outstanding = 0;
|
|
62
|
+
context.resume();
|
|
63
|
+
timer = setTimeout(close, context.interval);
|
|
64
|
+
}
|
|
65
|
+
function close() {
|
|
66
|
+
timer = undefined;
|
|
67
|
+
collecting = false;
|
|
68
|
+
context.hold();
|
|
69
|
+
if (outstanding === 0)
|
|
70
|
+
finish();
|
|
71
|
+
}
|
|
72
|
+
function finish() {
|
|
73
|
+
const current = window;
|
|
74
|
+
const hold = context.decide();
|
|
75
|
+
if (current !== window)
|
|
76
|
+
return;
|
|
77
|
+
if (hold)
|
|
78
|
+
timer = setTimeout(endBackoff, context.interval);
|
|
79
|
+
else
|
|
80
|
+
open();
|
|
81
|
+
}
|
|
82
|
+
function endBackoff() {
|
|
83
|
+
timer = undefined;
|
|
84
|
+
context.endBackoff();
|
|
85
|
+
if (context.hasPendingWork())
|
|
86
|
+
open();
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
start: open,
|
|
90
|
+
started() {
|
|
91
|
+
if (!collecting)
|
|
92
|
+
return ignoreSettlement;
|
|
93
|
+
const startedIn = window;
|
|
94
|
+
outstanding++;
|
|
95
|
+
return outcome => {
|
|
96
|
+
if (startedIn !== window)
|
|
97
|
+
return;
|
|
98
|
+
context.record(outcome);
|
|
99
|
+
outstanding--;
|
|
100
|
+
if (!collecting && outstanding === 0)
|
|
101
|
+
finish();
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
drained() { },
|
|
105
|
+
stop() {
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
timer = undefined;
|
|
108
|
+
collecting = false;
|
|
109
|
+
window++;
|
|
110
|
+
context.idle();
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function createAdaptiveRate(options, host) {
|
|
115
|
+
const { min_rpi, max_rpi, errors_per_interval, back_off, rateStrategy, rateOutcomeClassifier, onRateChange } = options;
|
|
116
|
+
let rate = Math.ceil((max_rpi + min_rpi) / 2);
|
|
117
|
+
let rateIncreases = 0;
|
|
118
|
+
let rateDecreases = 0;
|
|
119
|
+
let errorCount = 0;
|
|
120
|
+
let wasBackedOff = false;
|
|
121
|
+
let ignoringSettlements = false;
|
|
122
|
+
let pacing = "idle";
|
|
123
|
+
function isRateReducing(outcome) {
|
|
124
|
+
try {
|
|
125
|
+
return rateOutcomeClassifier?.(outcome) ?? true;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function applyRate(next) {
|
|
132
|
+
if (next === rate)
|
|
133
|
+
return;
|
|
134
|
+
if (next > rate)
|
|
135
|
+
rateIncreases++;
|
|
136
|
+
else
|
|
137
|
+
rateDecreases++;
|
|
138
|
+
rate = next;
|
|
139
|
+
onRateChange?.(rate);
|
|
140
|
+
}
|
|
141
|
+
function decide() {
|
|
142
|
+
const observation = Object.freeze({
|
|
143
|
+
currentRate: rate,
|
|
144
|
+
minRate: min_rpi,
|
|
145
|
+
maxRate: max_rpi,
|
|
146
|
+
errorCount,
|
|
147
|
+
errorThreshold: errors_per_interval,
|
|
148
|
+
hasPendingWork: host.hasPendingWork(),
|
|
149
|
+
wasBackedOff,
|
|
150
|
+
});
|
|
151
|
+
let decision;
|
|
152
|
+
try {
|
|
153
|
+
decision = validateDecision(rateStrategy(observation));
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
host.failed(error);
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
const hold = back_off && decision.shouldBackOff;
|
|
160
|
+
errorCount = 0;
|
|
161
|
+
wasBackedOff = hold;
|
|
162
|
+
applyRate(Math.min(max_rpi, Math.max(min_rpi, decision.nextRate)));
|
|
163
|
+
return hold;
|
|
164
|
+
}
|
|
165
|
+
const context = {
|
|
166
|
+
interval: options.interval,
|
|
167
|
+
get pacing() {
|
|
168
|
+
return pacing;
|
|
169
|
+
},
|
|
170
|
+
hasPendingWork: host.hasPendingWork,
|
|
171
|
+
record(outcome) {
|
|
172
|
+
if (!ignoringSettlements && outcome && isRateReducing(outcome))
|
|
173
|
+
errorCount++;
|
|
174
|
+
},
|
|
175
|
+
decide,
|
|
176
|
+
resume() {
|
|
177
|
+
pacing = "open";
|
|
178
|
+
host.resumeStarts();
|
|
179
|
+
},
|
|
180
|
+
hold(deferBy) {
|
|
181
|
+
pacing = "held";
|
|
182
|
+
host.holdStarts(deferBy);
|
|
183
|
+
},
|
|
184
|
+
reopen() {
|
|
185
|
+
pacing = "open";
|
|
186
|
+
},
|
|
187
|
+
endBackoff() {
|
|
188
|
+
wasBackedOff = false;
|
|
189
|
+
},
|
|
190
|
+
idle() {
|
|
191
|
+
wasBackedOff = false;
|
|
192
|
+
pacing = "idle";
|
|
193
|
+
host.idle();
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
const timing = options.adjustmentTiming === "settled" ? settledTiming(context) : intervalTiming(context);
|
|
197
|
+
return {
|
|
198
|
+
get rate() {
|
|
199
|
+
return rate;
|
|
200
|
+
},
|
|
201
|
+
get rateIncreases() {
|
|
202
|
+
return rateIncreases;
|
|
203
|
+
},
|
|
204
|
+
get rateDecreases() {
|
|
205
|
+
return rateDecreases;
|
|
206
|
+
},
|
|
207
|
+
get pacing() {
|
|
208
|
+
return pacing;
|
|
209
|
+
},
|
|
210
|
+
start() {
|
|
211
|
+
ignoringSettlements = false;
|
|
212
|
+
if (pacing !== "idle" || !host.hasPendingWork())
|
|
213
|
+
return;
|
|
214
|
+
timing.start();
|
|
215
|
+
},
|
|
216
|
+
drained() {
|
|
217
|
+
timing.drained();
|
|
218
|
+
},
|
|
219
|
+
stop() {
|
|
220
|
+
ignoringSettlements = false;
|
|
221
|
+
timing.stop();
|
|
222
|
+
},
|
|
223
|
+
pause() {
|
|
224
|
+
timing.stop();
|
|
225
|
+
errorCount = 0;
|
|
226
|
+
ignoringSettlements = true;
|
|
227
|
+
},
|
|
228
|
+
started: () => timing.started(),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=adaptive-rate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptive-rate.js","sourceRoot":"","sources":["../src/adaptive-rate.ts"],"names":[],"mappings":"AAmFA,MAAM,gBAAgB,GAAuB,GAAG,EAAE,GAAE,CAAC,CAAC;AAEtD,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,SAAS,GAAG,QAAgC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,SAAS,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yGAAyG;AACzG,SAAS,cAAc,CAAC,OAAsB;IAC5C,IAAI,IAA+C,CAAC;IACpD,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,SAAS,MAAM;QACb,IAAI,GAAG,SAAS,CAAC;QACjB,MAAM,OAAO,GAAG,GAAG,CAAC;QACpB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,OAAO,KAAK,GAAG;YAAE,OAAO;QAC5B,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;aACpC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACrD,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS,IAAI;QACX,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,GAAG,SAAS,CAAC;QACjB,GAAG,EAAE,CAAC;QACN,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAED,OAAO;QACL,KAAK;YACH,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM;QAC7B,OAAO,EAAE,IAAI;QACb,IAAI;KACL,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,SAAS,aAAa,CAAC,OAAsB;IAC3C,IAAI,KAAgD,CAAC;IACrD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,SAAS,IAAI;QACX,KAAK,GAAG,SAAS,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,EAAE,CAAC;QACT,UAAU,GAAG,IAAI,CAAC;QAClB,WAAW,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS,KAAK;QACZ,KAAK,GAAG,SAAS,CAAC;QAClB,UAAU,GAAG,KAAK,CAAC;QACnB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,WAAW,KAAK,CAAC;YAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,SAAS,MAAM;QACb,MAAM,OAAO,GAAG,MAAM,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO;QAC/B,IAAI,IAAI;YAAE,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;;YACtD,IAAI,EAAE,CAAC;IACd,CAAC;IAED,SAAS,UAAU;QACjB,KAAK,GAAG,SAAS,CAAC;QAClB,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,cAAc,EAAE;YAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,OAAO;YACL,IAAI,CAAC,UAAU;gBAAE,OAAO,gBAAgB,CAAC;YACzC,MAAM,SAAS,GAAG,MAAM,CAAC;YACzB,WAAW,EAAE,CAAC;YACd,OAAO,OAAO,CAAC,EAAE;gBACf,IAAI,SAAS,KAAK,MAAM;oBAAE,OAAO;gBACjC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxB,WAAW,EAAE,CAAC;gBACd,IAAI,CAAC,UAAU,IAAI,WAAW,KAAK,CAAC;oBAAE,MAAM,EAAE,CAAC;YACjD,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,KAAI,CAAC;QACZ,IAAI;YACF,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,SAAS,CAAC;YAClB,UAAU,GAAG,KAAK,CAAC;YACnB,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B,EAAE,IAAsB;IACrF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACvH,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,MAAM,GAAW,MAAM,CAAC;IAE5B,SAAS,cAAc,CAAC,OAA2B;QACjD,IAAI,CAAC;YACH,OAAO,qBAAqB,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;QAClD,CAAC;QACD,MAAM,CAAC;YACL,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,SAAS,CAAC,IAAY;QAC7B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,IAAI,IAAI,GAAG,IAAI;YAAE,aAAa,EAAE,CAAC;;YAC5B,aAAa,EAAE,CAAC;QACrB,IAAI,GAAG,IAAI,CAAC;QACZ,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,SAAS,MAAM;QACb,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;YAChC,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;YAChB,UAAU;YACV,cAAc,EAAE,mBAAmB;YACnC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;YACrC,YAAY;SACb,CAAC,CAAC;QACH,IAAI,QAA8B,CAAC;QACnC,IAAI,CAAC;YACH,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC;QAChD,UAAU,GAAG,CAAC,CAAC;QACf,YAAY,GAAG,IAAI,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAkB;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,MAAM;YACR,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,MAAM,CAAC,OAAO;YACZ,IAAI,CAAC,mBAAmB,IAAI,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC;gBAAE,UAAU,EAAE,CAAC;QAC/E,CAAC;QACD,MAAM;QACN,MAAM;YACJ,MAAM,GAAG,MAAM,CAAC;YAChB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,OAAO;YACV,MAAM,GAAG,MAAM,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM;YACJ,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;QACD,UAAU;YACR,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,IAAI;YACF,YAAY,GAAG,KAAK,CAAC;YACrB,MAAM,GAAG,MAAM,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;KACF,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAEzG,OAAO;QACL,IAAI,IAAI;YACN,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,aAAa;YACf,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,aAAa;YACf,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,MAAM;YACR,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK;YACH,mBAAmB,GAAG,KAAK,CAAC;YAC5B,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBAAE,OAAO;YACxD,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,OAAO;YACL,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,IAAI;YACF,mBAAmB,GAAG,KAAK,CAAC;YAC5B,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,KAAK;YACH,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,UAAU,GAAG,CAAC,CAAC;YACf,mBAAmB,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE;KAChC,CAAC;AACJ,CAAC"}
|
|
@@ -71,7 +71,7 @@ export type ThrottleOptions = {
|
|
|
71
71
|
onRateChange?: (rate: number) => void;
|
|
72
72
|
};
|
|
73
73
|
export type ThrottleFn = (callback: ThrottleCallback) => void;
|
|
74
|
-
export type QueueLifecycleState = "running" | "paused" | "stopped" | "aborted";
|
|
74
|
+
export type QueueLifecycleState = "running" | "paused" | "stopped" | "aborted" | "failed";
|
|
75
75
|
export type QueueState = Readonly<{
|
|
76
76
|
rate: number;
|
|
77
77
|
pending: number;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createRateController } from "./rate-controller.js";
|
|
2
1
|
import { createScheduler } from "./scheduler.js";
|
|
3
2
|
const adjustmentTimings = new Set(["interval", "settled"]);
|
|
4
3
|
export const linear = ({ minRate, maxRate, currentRate, errorCount, errorThreshold, hasPendingWork, wasBackedOff, }) => {
|
|
@@ -71,10 +70,16 @@ export function createThrottledQueue(options) {
|
|
|
71
70
|
throw new Error("adjustmentTiming must be either interval or settled");
|
|
72
71
|
}
|
|
73
72
|
validateRetryBackoff(options.retryBackoff);
|
|
74
|
-
return createScheduler(options,
|
|
73
|
+
return createScheduler(options, {
|
|
75
74
|
min_rpi,
|
|
76
75
|
max_rpi,
|
|
76
|
+
interval,
|
|
77
77
|
errors_per_interval,
|
|
78
|
-
|
|
78
|
+
back_off: options.back_off ?? false,
|
|
79
|
+
adjustmentTiming: options.adjustmentTiming ?? "interval",
|
|
80
|
+
rateStrategy: options.rateStrategy ?? linear,
|
|
81
|
+
rateOutcomeClassifier: options.rateOutcomeClassifier,
|
|
82
|
+
onRateChange: options.onRateChange,
|
|
83
|
+
});
|
|
79
84
|
}
|
|
80
85
|
//# sourceMappingURL=dynamic-throttled-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-throttled-queue.js","sourceRoot":"","sources":["../src/dynamic-throttled-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dynamic-throttled-queue.js","sourceRoot":"","sources":["../src/dynamic-throttled-queue.ts"],"names":[],"mappings":"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"}
|
package/dist/scheduler.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
+
import type { AdaptiveRateOptions } from "./adaptive-rate.js";
|
|
1
2
|
import type { ThrottleHandle, ThrottleOptions } from "./dynamic-throttled-queue.js";
|
|
2
|
-
|
|
3
|
-
export declare function createScheduler(options: ThrottleOptions, rateController: RateController): ThrottleHandle;
|
|
3
|
+
export declare function createScheduler(options: ThrottleOptions, adaptiveRateOptions: AdaptiveRateOptions): ThrottleHandle;
|
package/dist/scheduler.js
CHANGED
|
@@ -1,27 +1,23 @@
|
|
|
1
|
+
import { createAdaptiveRate } from "./adaptive-rate.js";
|
|
1
2
|
import { calculateRetryDelay } from "./retry-backoff.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
/** The state each event leads to. An event missing from the current state's row is a no-op. */
|
|
4
|
+
const lifecycleTransitions = {
|
|
5
|
+
running: { pause: "paused", stop: "stopped", abort: "aborted", fail: "failed" },
|
|
6
|
+
paused: { resume: "running", stop: "stopped", abort: "aborted" },
|
|
7
|
+
stopped: { restart: "running", abort: "aborted" },
|
|
8
|
+
aborted: {},
|
|
9
|
+
failed: {},
|
|
10
|
+
};
|
|
11
|
+
export function createScheduler(options, adaptiveRateOptions) {
|
|
12
|
+
const { interval, evenly_spaced = true, retry = 0, retryBackoff, concurrency, maxQueueSize, compact_threshold = 512, retryClassifier, } = options;
|
|
10
13
|
let last_called = 0;
|
|
11
14
|
let timeout;
|
|
12
|
-
let dynTimeout;
|
|
13
15
|
let active_count = 0;
|
|
14
|
-
let
|
|
15
|
-
let isStopped = false;
|
|
16
|
-
let isAborted = false;
|
|
17
|
-
let hasStrategyFailure = false;
|
|
16
|
+
let lifecycle = { state: "running" };
|
|
18
17
|
let cnt_started = 0;
|
|
19
18
|
let cnt_succeeded = 0;
|
|
20
19
|
let cnt_failed = 0;
|
|
21
20
|
let cnt_retried = 0;
|
|
22
|
-
let cnt_rateIncreases = 0;
|
|
23
|
-
let cnt_rateDecreases = 0;
|
|
24
|
-
let strategyFailure;
|
|
25
21
|
const abortController = new AbortController();
|
|
26
22
|
const max_concurrency = concurrency ?? Infinity;
|
|
27
23
|
const max_queue_size = maxQueueSize ?? Infinity;
|
|
@@ -29,20 +25,41 @@ export function createScheduler(options, rateController) {
|
|
|
29
25
|
const delayedRetries = [];
|
|
30
26
|
let head = 0;
|
|
31
27
|
let reserved_count = 0;
|
|
32
|
-
let observationWindow;
|
|
33
|
-
let nextObservationWindow = 0;
|
|
34
|
-
let collectingSettledWindow = false;
|
|
35
|
-
let settledOutstanding = 0;
|
|
36
28
|
const idleWaiters = [];
|
|
29
|
+
const adaptiveRate = createAdaptiveRate(adaptiveRateOptions, {
|
|
30
|
+
hasPendingWork: () => queue.length > head,
|
|
31
|
+
resumeStarts() {
|
|
32
|
+
last_called = Date.now();
|
|
33
|
+
clearTimeout(timeout);
|
|
34
|
+
timeout = setTimeout(dequeue, spacing());
|
|
35
|
+
},
|
|
36
|
+
holdStarts(deferBy) {
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
timeout = deferBy === undefined ? undefined : setTimeout(dequeue, spacing() + deferBy);
|
|
39
|
+
},
|
|
40
|
+
idle() {
|
|
41
|
+
clearTimeout(timeout);
|
|
42
|
+
timeout = undefined;
|
|
43
|
+
if (head >= queue.length) {
|
|
44
|
+
queue.length = 0;
|
|
45
|
+
head = 0;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
failed(error) {
|
|
49
|
+
transition("fail", error);
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
function spacing() {
|
|
53
|
+
return evenly_spaced ? interval / adaptiveRate.rate : interval;
|
|
54
|
+
}
|
|
37
55
|
function isIdle() {
|
|
38
56
|
return active_count === 0 && queue.length <= head && delayedRetries.length === 0;
|
|
39
57
|
}
|
|
40
58
|
function notifyIdle() {
|
|
41
59
|
if (!isIdle())
|
|
42
60
|
return;
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
resolve();
|
|
61
|
+
for (const waiter of idleWaiters.splice(0))
|
|
62
|
+
waiter.resolve();
|
|
46
63
|
}
|
|
47
64
|
function releaseDelayedRetry(delayedRetry) {
|
|
48
65
|
const index = delayedRetries.indexOf(delayedRetry);
|
|
@@ -50,8 +67,7 @@ export function createScheduler(options, rateController) {
|
|
|
50
67
|
return;
|
|
51
68
|
delayedRetries.splice(index, 1);
|
|
52
69
|
queue.push(delayedRetry.item);
|
|
53
|
-
|
|
54
|
-
start();
|
|
70
|
+
start();
|
|
55
71
|
}
|
|
56
72
|
function startDelayedRetry(delayedRetry) {
|
|
57
73
|
delayedRetry.due = Date.now() + delayedRetry.remaining;
|
|
@@ -79,71 +95,47 @@ export function createScheduler(options, rateController) {
|
|
|
79
95
|
function scheduleDelayedRetry(item, delay) {
|
|
80
96
|
const delayedRetry = { item, remaining: delay };
|
|
81
97
|
delayedRetries.push(delayedRetry);
|
|
82
|
-
if (
|
|
98
|
+
if (lifecycle.state === "running")
|
|
83
99
|
startDelayedRetry(delayedRetry);
|
|
84
100
|
}
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
clearTimeout(timeout);
|
|
89
|
-
timeout = undefined;
|
|
90
|
-
clearTimeout(dynTimeout);
|
|
91
|
-
dynTimeout = undefined;
|
|
92
|
-
if (head >= queue.length) {
|
|
93
|
-
queue.length = 0;
|
|
94
|
-
head = 0;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
function discardSettledWindow() {
|
|
98
|
-
observationWindow = undefined;
|
|
99
|
-
collectingSettledWindow = false;
|
|
100
|
-
settledOutstanding = 0;
|
|
101
|
-
}
|
|
102
|
-
function stop() {
|
|
103
|
-
isStopped = true;
|
|
104
|
-
isPaused = false;
|
|
105
|
-
freezeDelayedRetries();
|
|
106
|
-
halt();
|
|
107
|
-
discardSettledWindow();
|
|
108
|
-
}
|
|
109
|
-
function pause() {
|
|
110
|
-
if (isAborted || isStopped || isPaused)
|
|
111
|
-
return;
|
|
112
|
-
isPaused = true;
|
|
113
|
-
rateController.clearObservation();
|
|
114
|
-
freezeDelayedRetries();
|
|
115
|
-
halt();
|
|
116
|
-
discardSettledWindow();
|
|
117
|
-
}
|
|
118
|
-
function resume() {
|
|
119
|
-
if (!isPaused)
|
|
120
|
-
return;
|
|
121
|
-
isPaused = false;
|
|
122
|
-
resumeDelayedRetries();
|
|
123
|
-
if (queue.length > head)
|
|
124
|
-
start();
|
|
125
|
-
}
|
|
126
|
-
function abort() {
|
|
127
|
-
if (isAborted)
|
|
128
|
-
return;
|
|
129
|
-
isAborted = true;
|
|
130
|
-
halt();
|
|
131
|
-
discardSettledWindow();
|
|
132
|
-
freezeDelayedRetries();
|
|
101
|
+
function discardPendingWork() {
|
|
102
|
+
for (const delayedRetry of delayedRetries)
|
|
103
|
+
clearTimeout(delayedRetry.timeout);
|
|
133
104
|
delayedRetries.length = 0;
|
|
134
105
|
queue.length = 0;
|
|
135
106
|
head = 0;
|
|
136
107
|
reserved_count = 0;
|
|
137
|
-
abortController.abort();
|
|
138
108
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
109
|
+
/** Moves the lifecycle for `event` and runs the cleanup that entering the new state requires. */
|
|
110
|
+
function transition(event, error) {
|
|
111
|
+
const next = lifecycleTransitions[lifecycle.state][event];
|
|
112
|
+
if (next === undefined)
|
|
113
|
+
return;
|
|
114
|
+
lifecycle = next === "failed" ? { state: next, error } : { state: next };
|
|
115
|
+
switch (next) {
|
|
116
|
+
case "running":
|
|
117
|
+
resumeDelayedRetries();
|
|
118
|
+
adaptiveRate.start();
|
|
119
|
+
return;
|
|
120
|
+
case "paused":
|
|
121
|
+
freezeDelayedRetries();
|
|
122
|
+
adaptiveRate.pause();
|
|
123
|
+
return;
|
|
124
|
+
case "stopped":
|
|
125
|
+
freezeDelayedRetries();
|
|
126
|
+
adaptiveRate.stop();
|
|
127
|
+
return;
|
|
128
|
+
case "aborted":
|
|
129
|
+
adaptiveRate.stop();
|
|
130
|
+
discardPendingWork();
|
|
131
|
+
abortController.abort();
|
|
132
|
+
notifyIdle();
|
|
133
|
+
return;
|
|
134
|
+
case "failed":
|
|
135
|
+
adaptiveRate.stop();
|
|
136
|
+
discardPendingWork();
|
|
137
|
+
for (const waiter of idleWaiters.splice(0))
|
|
138
|
+
waiter.reject(error);
|
|
147
139
|
}
|
|
148
140
|
}
|
|
149
141
|
function isRetryable(item, outcome) {
|
|
@@ -156,23 +148,19 @@ export function createScheduler(options, rateController) {
|
|
|
156
148
|
return true;
|
|
157
149
|
}
|
|
158
150
|
}
|
|
159
|
-
function handleResult(item, outcome) {
|
|
160
|
-
if (
|
|
151
|
+
function handleResult(item, outcome, reportSettlement) {
|
|
152
|
+
if (lifecycle.state === "aborted" || lifecycle.state === "failed")
|
|
161
153
|
return;
|
|
162
154
|
if (outcome)
|
|
163
155
|
cnt_failed++;
|
|
164
156
|
else
|
|
165
157
|
cnt_succeeded++;
|
|
166
|
-
if (!isPaused && (!usesSettledTiming || item.observationWindow === observationWindow)) {
|
|
167
|
-
rateController.recordCompletion(isRateReducing(outcome));
|
|
168
|
-
}
|
|
169
158
|
if (isRetryable(item, outcome)) {
|
|
170
159
|
cnt_retried++;
|
|
171
160
|
const retryItem = { fn: item.fn, retries: item.retries - 1 };
|
|
172
161
|
if (retryBackoff === undefined) {
|
|
173
162
|
queue.push(retryItem);
|
|
174
|
-
|
|
175
|
-
start();
|
|
163
|
+
start();
|
|
176
164
|
}
|
|
177
165
|
else {
|
|
178
166
|
const retryIndex = retry - item.retries + 1;
|
|
@@ -181,24 +169,17 @@ export function createScheduler(options, rateController) {
|
|
|
181
169
|
}
|
|
182
170
|
else
|
|
183
171
|
reserved_count--;
|
|
172
|
+
reportSettlement(outcome);
|
|
184
173
|
}
|
|
185
|
-
function handleSettlement(item, outcome, resume = false) {
|
|
174
|
+
function handleSettlement(item, outcome, reportSettlement, resume = false) {
|
|
186
175
|
active_count--;
|
|
187
|
-
handleResult(item, outcome);
|
|
188
|
-
if (
|
|
189
|
-
settledOutstanding--;
|
|
190
|
-
if (!collectingSettledWindow && settledOutstanding === 0)
|
|
191
|
-
finishSettledWindow();
|
|
192
|
-
}
|
|
193
|
-
if (resume && isRunning && !skippedLast && queue.length > head && (!usesSettledTiming || collectingSettledWindow))
|
|
176
|
+
handleResult(item, outcome, reportSettlement);
|
|
177
|
+
if (resume && adaptiveRate.pacing === "open" && queue.length > head)
|
|
194
178
|
dequeue();
|
|
195
179
|
notifyIdle();
|
|
196
180
|
}
|
|
197
181
|
function execute(item) {
|
|
198
|
-
|
|
199
|
-
item.observationWindow = observationWindow;
|
|
200
|
-
settledOutstanding++;
|
|
201
|
-
}
|
|
182
|
+
const reportSettlement = adaptiveRate.started();
|
|
202
183
|
cnt_started++;
|
|
203
184
|
active_count++;
|
|
204
185
|
let result;
|
|
@@ -206,24 +187,24 @@ export function createScheduler(options, rateController) {
|
|
|
206
187
|
result = item.fn({ signal: abortController.signal });
|
|
207
188
|
}
|
|
208
189
|
catch (error) {
|
|
209
|
-
handleSettlement(item, { kind: "thrown", error });
|
|
190
|
+
handleSettlement(item, { kind: "thrown", error }, reportSettlement);
|
|
210
191
|
return;
|
|
211
192
|
}
|
|
212
193
|
if (result instanceof Promise) {
|
|
213
|
-
void result.then(value => handleSettlement(item, value === false ? { kind: "returned-false" } : undefined, true), (error) => handleSettlement(item, { kind: "rejected", error }, true));
|
|
194
|
+
void result.then(value => handleSettlement(item, value === false ? { kind: "returned-false" } : undefined, reportSettlement, true), (error) => handleSettlement(item, { kind: "rejected", error }, reportSettlement, true));
|
|
214
195
|
return;
|
|
215
196
|
}
|
|
216
|
-
handleSettlement(item, result === false ? { kind: "returned-false" } : undefined);
|
|
197
|
+
handleSettlement(item, result === false ? { kind: "returned-false" } : undefined, reportSettlement);
|
|
217
198
|
}
|
|
218
199
|
function dequeue() {
|
|
219
|
-
const threshold = last_called +
|
|
200
|
+
const threshold = last_called + spacing();
|
|
220
201
|
const now = Date.now();
|
|
221
202
|
if (now < threshold) {
|
|
222
203
|
clearTimeout(timeout);
|
|
223
204
|
timeout = setTimeout(dequeue, threshold - now);
|
|
224
205
|
return;
|
|
225
206
|
}
|
|
226
|
-
const end = Math.min(head +
|
|
207
|
+
const end = Math.min(head + (evenly_spaced ? 1 : adaptiveRate.rate), queue.length);
|
|
227
208
|
let started = 0;
|
|
228
209
|
while (head < end && active_count < max_concurrency) {
|
|
229
210
|
const item = queue[head++];
|
|
@@ -235,160 +216,54 @@ export function createScheduler(options, rateController) {
|
|
|
235
216
|
queue.splice(0, head);
|
|
236
217
|
head = 0;
|
|
237
218
|
}
|
|
238
|
-
if (head >= queue.length
|
|
239
|
-
|
|
219
|
+
if (head >= queue.length)
|
|
220
|
+
adaptiveRate.drained();
|
|
221
|
+
if (adaptiveRate.pacing !== "open" || active_count >= max_concurrency)
|
|
240
222
|
return;
|
|
241
|
-
|
|
242
|
-
if (active_count >= max_concurrency)
|
|
243
|
-
return;
|
|
244
|
-
timeout = setTimeout(dequeue, dyn_interval);
|
|
245
|
-
}
|
|
246
|
-
function applyRate(newRpi) {
|
|
247
|
-
if (newRpi === current_rpi)
|
|
248
|
-
return;
|
|
249
|
-
if (newRpi > current_rpi)
|
|
250
|
-
cnt_rateIncreases++;
|
|
251
|
-
else
|
|
252
|
-
cnt_rateDecreases++;
|
|
253
|
-
current_rpi = newRpi;
|
|
254
|
-
onRateChange?.(current_rpi);
|
|
255
|
-
if (evenly_spaced)
|
|
256
|
-
dyn_interval = interval / current_rpi;
|
|
257
|
-
else
|
|
258
|
-
dyn_requests_per_interval = current_rpi;
|
|
259
|
-
}
|
|
260
|
-
function adjustRate() {
|
|
261
|
-
dynTimeout = undefined;
|
|
262
|
-
const wasSkipped = skippedLast;
|
|
263
|
-
skippedLast = false;
|
|
264
|
-
let decision;
|
|
265
|
-
try {
|
|
266
|
-
decision = rateController.observe({ hasPendingWork: queue.length > head, wasBackedOff: wasSkipped });
|
|
267
|
-
}
|
|
268
|
-
catch (error) {
|
|
269
|
-
hasStrategyFailure = true;
|
|
270
|
-
strategyFailure = error;
|
|
271
|
-
halt();
|
|
272
|
-
throw error;
|
|
273
|
-
}
|
|
274
|
-
applyRate(decision.rate);
|
|
275
|
-
if (decision.shouldBackOff && back_off) {
|
|
276
|
-
clearTimeout(timeout);
|
|
277
|
-
skippedLast = true;
|
|
278
|
-
timeout = setTimeout(dequeue, dyn_interval + interval);
|
|
279
|
-
}
|
|
280
|
-
if (isRunning)
|
|
281
|
-
dynTimeout = setTimeout(adjustRate, interval);
|
|
282
|
-
}
|
|
283
|
-
function finishSettledWindow() {
|
|
284
|
-
if (observationWindow === undefined || isPaused || isStopped || isAborted)
|
|
285
|
-
return;
|
|
286
|
-
const wasSkipped = skippedLast;
|
|
287
|
-
skippedLast = false;
|
|
288
|
-
let decision;
|
|
289
|
-
try {
|
|
290
|
-
decision = rateController.observe({ hasPendingWork: queue.length > head, wasBackedOff: wasSkipped });
|
|
291
|
-
}
|
|
292
|
-
catch (error) {
|
|
293
|
-
hasStrategyFailure = true;
|
|
294
|
-
strategyFailure = error;
|
|
295
|
-
halt();
|
|
296
|
-
discardSettledWindow();
|
|
297
|
-
throw error;
|
|
298
|
-
}
|
|
299
|
-
observationWindow = undefined;
|
|
300
|
-
applyRate(decision.rate);
|
|
301
|
-
if (decision.shouldBackOff && back_off) {
|
|
302
|
-
skippedLast = true;
|
|
303
|
-
timeout = setTimeout(resumeSettledScheduling, interval);
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
if (queue.length > head)
|
|
307
|
-
beginSettledWindow();
|
|
308
|
-
else
|
|
309
|
-
halt();
|
|
310
|
-
}
|
|
311
|
-
function closeSettledWindow() {
|
|
312
|
-
dynTimeout = undefined;
|
|
313
|
-
collectingSettledWindow = false;
|
|
314
|
-
clearTimeout(timeout);
|
|
315
|
-
timeout = undefined;
|
|
316
|
-
if (settledOutstanding === 0)
|
|
317
|
-
finishSettledWindow();
|
|
318
|
-
}
|
|
319
|
-
function resumeSettledScheduling() {
|
|
320
|
-
skippedLast = false;
|
|
321
|
-
beginSettledWindow();
|
|
322
|
-
}
|
|
323
|
-
function beginSettledWindow() {
|
|
324
|
-
if (isAborted || isPaused || isStopped || skippedLast || queue.length <= head)
|
|
325
|
-
return;
|
|
326
|
-
isRunning = true;
|
|
327
|
-
collectingSettledWindow = true;
|
|
328
|
-
observationWindow = nextObservationWindow++;
|
|
329
|
-
last_called = Date.now();
|
|
330
|
-
clearTimeout(timeout);
|
|
331
|
-
timeout = setTimeout(dequeue, dyn_interval);
|
|
332
|
-
clearTimeout(dynTimeout);
|
|
333
|
-
dynTimeout = setTimeout(closeSettledWindow, interval);
|
|
223
|
+
timeout = setTimeout(dequeue, spacing());
|
|
334
224
|
}
|
|
335
225
|
function start() {
|
|
336
|
-
if (
|
|
337
|
-
|
|
338
|
-
if (skippedLast)
|
|
339
|
-
return;
|
|
340
|
-
if (usesSettledTiming) {
|
|
341
|
-
beginSettledWindow();
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
isRunning = true;
|
|
345
|
-
last_called = Date.now();
|
|
346
|
-
clearTimeout(timeout);
|
|
347
|
-
timeout = setTimeout(dequeue, dyn_interval);
|
|
348
|
-
if (!dynTimeout)
|
|
349
|
-
dynTimeout = setTimeout(adjustRate, interval);
|
|
226
|
+
if (lifecycle.state === "running")
|
|
227
|
+
adaptiveRate.start();
|
|
350
228
|
}
|
|
351
229
|
function enqueue(callback) {
|
|
352
|
-
if (
|
|
230
|
+
if (lifecycle.state === "aborted")
|
|
353
231
|
throw new Error("Cannot enqueue work after the queue has been aborted");
|
|
354
|
-
if (
|
|
355
|
-
throw
|
|
232
|
+
if (lifecycle.state === "failed")
|
|
233
|
+
throw lifecycle.error;
|
|
356
234
|
if (reserved_count >= max_queue_size)
|
|
357
235
|
throw new Error("Cannot enqueue work: maxQueueSize has been reached");
|
|
358
236
|
reserved_count++;
|
|
359
237
|
queue.push({ fn: callback, retries: retry });
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
resumeDelayedRetries();
|
|
364
|
-
if (!isRunning && !isPaused)
|
|
238
|
+
if (lifecycle.state === "stopped")
|
|
239
|
+
transition("restart");
|
|
240
|
+
else
|
|
365
241
|
start();
|
|
366
242
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
if (
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
enqueue.waitForIdle = async () => isIdle() ? Promise.resolve() : new Promise(resolve => { idleWaiters.push(resolve); });
|
|
243
|
+
enqueue.pause = () => transition("pause");
|
|
244
|
+
enqueue.resume = () => transition("resume");
|
|
245
|
+
enqueue.stop = () => transition("stop");
|
|
246
|
+
enqueue.abort = () => transition("abort");
|
|
247
|
+
enqueue.waitForIdle = async () => {
|
|
248
|
+
if (lifecycle.state === "failed")
|
|
249
|
+
throw lifecycle.error;
|
|
250
|
+
if (isIdle())
|
|
251
|
+
return;
|
|
252
|
+
const waiter = Promise.withResolvers();
|
|
253
|
+
idleWaiters.push(waiter);
|
|
254
|
+
return waiter.promise;
|
|
255
|
+
};
|
|
381
256
|
enqueue.getState = () => Object.freeze({
|
|
382
|
-
rate:
|
|
257
|
+
rate: adaptiveRate.rate,
|
|
383
258
|
pending: queue.length - head + delayedRetries.length,
|
|
384
259
|
active: active_count,
|
|
385
|
-
state:
|
|
260
|
+
state: lifecycle.state,
|
|
386
261
|
started: cnt_started,
|
|
387
262
|
succeeded: cnt_succeeded,
|
|
388
263
|
failed: cnt_failed,
|
|
389
264
|
retried: cnt_retried,
|
|
390
|
-
rateIncreases:
|
|
391
|
-
rateDecreases:
|
|
265
|
+
rateIncreases: adaptiveRate.rateIncreases,
|
|
266
|
+
rateDecreases: adaptiveRate.rateDecreases,
|
|
392
267
|
});
|
|
393
268
|
Object.defineProperty(enqueue, "pending", { get: () => queue.length - head + delayedRetries.length });
|
|
394
269
|
return enqueue;
|
package/dist/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": "dynamic-throttled-queue",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0-rc.0a1a3b6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Dynamically throttles arbitrary code to execute between a minimum and maximum number of times per interval. Best for making throttled API requests.",
|
|
6
6
|
"files": [
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { RateStrategy } from "./dynamic-throttled-queue.js";
|
|
2
|
-
type RateControllerOptions = {
|
|
3
|
-
min_rpi: number;
|
|
4
|
-
max_rpi: number;
|
|
5
|
-
errors_per_interval: number;
|
|
6
|
-
};
|
|
7
|
-
type Observation = {
|
|
8
|
-
hasPendingWork: boolean;
|
|
9
|
-
wasBackedOff: boolean;
|
|
10
|
-
};
|
|
11
|
-
export type RateDecision = {
|
|
12
|
-
rate: number;
|
|
13
|
-
shouldBackOff: boolean;
|
|
14
|
-
};
|
|
15
|
-
export type RateController = {
|
|
16
|
-
readonly rate: number;
|
|
17
|
-
clearObservation: () => void;
|
|
18
|
-
recordCompletion: (isRateReducing: boolean) => void;
|
|
19
|
-
observe: (observation: Observation) => RateDecision;
|
|
20
|
-
};
|
|
21
|
-
export declare function createRateController(options: RateControllerOptions, strategy: RateStrategy): RateController;
|
|
22
|
-
export {};
|
package/dist/rate-controller.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
function validateDecision(decision) {
|
|
2
|
-
if (typeof decision !== "object" || decision === null) {
|
|
3
|
-
throw new TypeError("rate strategy must return a decision object");
|
|
4
|
-
}
|
|
5
|
-
const candidate = decision;
|
|
6
|
-
if (!Number.isFinite(candidate.nextRate) || !Number.isInteger(candidate.nextRate)) {
|
|
7
|
-
throw new TypeError("rate strategy must return a finite integer nextRate");
|
|
8
|
-
}
|
|
9
|
-
if (typeof candidate.shouldBackOff !== "boolean") {
|
|
10
|
-
throw new TypeError("rate strategy must return a boolean shouldBackOff");
|
|
11
|
-
}
|
|
12
|
-
return candidate;
|
|
13
|
-
}
|
|
14
|
-
export function createRateController(options, strategy) {
|
|
15
|
-
let rate = Math.ceil((options.max_rpi + options.min_rpi) / 2);
|
|
16
|
-
let errorCount = 0;
|
|
17
|
-
return {
|
|
18
|
-
get rate() {
|
|
19
|
-
return rate;
|
|
20
|
-
},
|
|
21
|
-
clearObservation() {
|
|
22
|
-
errorCount = 0;
|
|
23
|
-
},
|
|
24
|
-
recordCompletion(isRateReducing) {
|
|
25
|
-
if (isRateReducing)
|
|
26
|
-
errorCount++;
|
|
27
|
-
},
|
|
28
|
-
observe(observation) {
|
|
29
|
-
const decision = validateDecision(strategy(Object.freeze({
|
|
30
|
-
currentRate: rate,
|
|
31
|
-
minRate: options.min_rpi,
|
|
32
|
-
maxRate: options.max_rpi,
|
|
33
|
-
errorCount,
|
|
34
|
-
errorThreshold: options.errors_per_interval,
|
|
35
|
-
...observation,
|
|
36
|
-
})));
|
|
37
|
-
rate = Math.min(options.max_rpi, Math.max(options.min_rpi, decision.nextRate));
|
|
38
|
-
errorCount = 0;
|
|
39
|
-
return { rate, shouldBackOff: decision.shouldBackOff };
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=rate-controller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rate-controller.js","sourceRoot":"","sources":["../src/rate-controller.ts"],"names":[],"mappings":"AAyBA,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,SAAS,GAAG,QAAgC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,SAAS,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA8B,EAAE,QAAsB;IACzF,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO;QACL,IAAI,IAAI;YACN,OAAO,IAAI,CAAC;QACd,CAAC;QACD,gBAAgB;YACd,UAAU,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,gBAAgB,CAAC,cAAuB;YACtC,IAAI,cAAc;gBAAE,UAAU,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,WAAwB;YAC9B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBACvD,WAAW,EAAE,IAAI;gBACjB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU;gBACV,cAAc,EAAE,OAAO,CAAC,mBAAmB;gBAC3C,GAAG,WAAW;aACf,CAAC,CAAC,CAAC,CAAC;YACL,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/E,UAAU,GAAG,CAAC,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
|