dynamic-throttled-queue 2.2.1-rc.b3d1777 → 2.3.0-rc.120625e
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 +2 -2
- package/dist/adaptive-rate.js +1 -7
- package/dist/adaptive-rate.js.map +1 -1
- package/dist/dynamic-throttled-queue.d.ts +1 -1
- package/dist/pending-work.d.ts +50 -0
- package/dist/pending-work.js +132 -0
- package/dist/pending-work.js.map +1 -0
- package/dist/scheduler.js +90 -158
- package/dist/scheduler.js.map +1 -1
- package/package.json +1 -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
|
|
package/dist/adaptive-rate.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export type AdaptiveRateHost = {
|
|
|
26
26
|
holdStarts: (deferBy?: number) => void;
|
|
27
27
|
/** Observation ended: cancel the next paced start. */
|
|
28
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;
|
|
29
31
|
};
|
|
30
32
|
export type AdaptiveRate = {
|
|
31
33
|
readonly rate: number;
|
|
@@ -42,7 +44,5 @@ export type AdaptiveRate = {
|
|
|
42
44
|
pause: () => void;
|
|
43
45
|
/** Reports a callback start. Call the returned reporter once when that callback settles. */
|
|
44
46
|
started: () => SettlementReporter;
|
|
45
|
-
/** Throws the strategy failure that permanently halted adaptive rate, if one occurred. */
|
|
46
|
-
throwIfFailed: () => void;
|
|
47
47
|
};
|
|
48
48
|
export declare function createAdaptiveRate(options: AdaptiveRateOptions, host: AdaptiveRateHost): AdaptiveRate;
|
package/dist/adaptive-rate.js
CHANGED
|
@@ -120,7 +120,6 @@ export function createAdaptiveRate(options, host) {
|
|
|
120
120
|
let wasBackedOff = false;
|
|
121
121
|
let ignoringSettlements = false;
|
|
122
122
|
let pacing = "idle";
|
|
123
|
-
let failure;
|
|
124
123
|
function isRateReducing(outcome) {
|
|
125
124
|
try {
|
|
126
125
|
return rateOutcomeClassifier?.(outcome) ?? true;
|
|
@@ -154,8 +153,7 @@ export function createAdaptiveRate(options, host) {
|
|
|
154
153
|
decision = validateDecision(rateStrategy(observation));
|
|
155
154
|
}
|
|
156
155
|
catch (error) {
|
|
157
|
-
|
|
158
|
-
timing.stop();
|
|
156
|
+
host.failed(error);
|
|
159
157
|
throw error;
|
|
160
158
|
}
|
|
161
159
|
const hold = back_off && decision.shouldBackOff;
|
|
@@ -228,10 +226,6 @@ export function createAdaptiveRate(options, host) {
|
|
|
228
226
|
ignoringSettlements = true;
|
|
229
227
|
},
|
|
230
228
|
started: () => timing.started(),
|
|
231
|
-
throwIfFailed() {
|
|
232
|
-
if (failure)
|
|
233
|
-
throw failure.error;
|
|
234
|
-
},
|
|
235
229
|
};
|
|
236
230
|
}
|
|
237
231
|
//# sourceMappingURL=adaptive-rate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adaptive-rate.js","sourceRoot":"","sources":["../src/adaptive-rate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"adaptive-rate.js","sourceRoot":"","sources":["../src/adaptive-rate.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type PendingWorkOptions = {
|
|
2
|
+
/** Most items that may hold a reservation at once, counting queued, held and active items. */
|
|
3
|
+
capacity: number;
|
|
4
|
+
/** Dead queue slots tolerated before the queue compacts. */
|
|
5
|
+
compactThreshold: number;
|
|
6
|
+
};
|
|
7
|
+
export type PendingWorkHost = {
|
|
8
|
+
/** A retry joined the queue, either straight from `settle` or once its delay elapsed. */
|
|
9
|
+
retryQueued: () => void;
|
|
10
|
+
};
|
|
11
|
+
/** How an ended attempt continues: queued again now, or held for `delay` ms first. */
|
|
12
|
+
export type Retry<T> = Readonly<{
|
|
13
|
+
item: T;
|
|
14
|
+
delay?: number;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Accepted work that has not reached a terminal outcome: queued items in FIFO order, retries held
|
|
18
|
+
* for a delay, and active items that have started but not settled. Each item keeps one capacity
|
|
19
|
+
* reservation from `accept` until it settles without a retry.
|
|
20
|
+
*/
|
|
21
|
+
export type PendingWork<T> = {
|
|
22
|
+
/** Items that can start now. Held retries are not queued until their delay elapses. */
|
|
23
|
+
readonly queued: number;
|
|
24
|
+
/** Queued items plus held retries. */
|
|
25
|
+
readonly pending: number;
|
|
26
|
+
/** Items taken that have not settled. */
|
|
27
|
+
readonly active: number;
|
|
28
|
+
/** Reserves capacity and queues `item`. Throws when every reservation is taken. */
|
|
29
|
+
accept: (item: T) => void;
|
|
30
|
+
/** Makes the oldest queued item active and returns it, or `undefined` when nothing is queued. */
|
|
31
|
+
take: () => T | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Ends one active item. `decide` runs once the item no longer counts as active but still holds its
|
|
34
|
+
* reservation; returning a retry keeps that reservation, returning nothing releases it. `observe`
|
|
35
|
+
* runs after the retry is placed and before idle is checked: work it accepts keeps idle waiters
|
|
36
|
+
* pending, and `fail` called from inside it rejects them.
|
|
37
|
+
*/
|
|
38
|
+
settle: (decide?: () => Retry<T> | undefined, observe?: () => void) => void;
|
|
39
|
+
/** Stops held-retry delays from elapsing, keeping each one's remaining time. */
|
|
40
|
+
freeze: () => void;
|
|
41
|
+
/** Resumes held-retry delays from their remaining time. Retries held while frozen wait for this. */
|
|
42
|
+
thaw: () => void;
|
|
43
|
+
/** Drops queued items and held retries. Active items still settle, and idle waits for them. */
|
|
44
|
+
discard: () => void;
|
|
45
|
+
/** Drops queued items and held retries, and rejects current idle waiters with `error`. */
|
|
46
|
+
fail: (error: unknown) => void;
|
|
47
|
+
/** Resolves once nothing is queued, held or active. */
|
|
48
|
+
whenIdle: () => Promise<void>;
|
|
49
|
+
};
|
|
50
|
+
export declare function createPendingWork<T>(options: PendingWorkOptions, host: PendingWorkHost): PendingWork<T>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
export function createPendingWork(options, host) {
|
|
2
|
+
const { capacity, compactThreshold } = options;
|
|
3
|
+
const queue = [];
|
|
4
|
+
let head = 0;
|
|
5
|
+
const held = [];
|
|
6
|
+
let frozen = false;
|
|
7
|
+
let active = 0;
|
|
8
|
+
/** Items between leaving `active` and having their retry placed; they keep their reservation. */
|
|
9
|
+
let deciding = 0;
|
|
10
|
+
const idleWaiters = [];
|
|
11
|
+
function queued() {
|
|
12
|
+
return queue.length - head;
|
|
13
|
+
}
|
|
14
|
+
function pending() {
|
|
15
|
+
return queued() + held.length;
|
|
16
|
+
}
|
|
17
|
+
function isIdle() {
|
|
18
|
+
return active === 0 && pending() === 0;
|
|
19
|
+
}
|
|
20
|
+
function notifyIdle() {
|
|
21
|
+
if (!isIdle())
|
|
22
|
+
return;
|
|
23
|
+
for (const waiter of idleWaiters.splice(0))
|
|
24
|
+
waiter.resolve();
|
|
25
|
+
}
|
|
26
|
+
function releaseHeld(retry) {
|
|
27
|
+
held.splice(held.indexOf(retry), 1);
|
|
28
|
+
queue.push(retry.item);
|
|
29
|
+
host.retryQueued();
|
|
30
|
+
}
|
|
31
|
+
function startHeld(retry) {
|
|
32
|
+
retry.due = Date.now() + retry.remaining;
|
|
33
|
+
retry.timeout = setTimeout(() => releaseHeld(retry), retry.remaining);
|
|
34
|
+
}
|
|
35
|
+
function hold(item, delay) {
|
|
36
|
+
const retry = { item, remaining: delay, due: 0 };
|
|
37
|
+
held.push(retry);
|
|
38
|
+
if (!frozen)
|
|
39
|
+
startHeld(retry);
|
|
40
|
+
}
|
|
41
|
+
function drop() {
|
|
42
|
+
for (const retry of held)
|
|
43
|
+
clearTimeout(retry.timeout);
|
|
44
|
+
held.length = 0;
|
|
45
|
+
queue.length = 0;
|
|
46
|
+
head = 0;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
get queued() {
|
|
50
|
+
return queued();
|
|
51
|
+
},
|
|
52
|
+
get pending() {
|
|
53
|
+
return pending();
|
|
54
|
+
},
|
|
55
|
+
get active() {
|
|
56
|
+
return active;
|
|
57
|
+
},
|
|
58
|
+
accept(item) {
|
|
59
|
+
if (pending() + active + deciding >= capacity)
|
|
60
|
+
throw new Error("Cannot enqueue work: maxQueueSize has been reached");
|
|
61
|
+
queue.push(item);
|
|
62
|
+
},
|
|
63
|
+
take() {
|
|
64
|
+
if (head === queue.length)
|
|
65
|
+
return undefined;
|
|
66
|
+
const item = queue[head++];
|
|
67
|
+
active++;
|
|
68
|
+
if (head === queue.length) {
|
|
69
|
+
queue.length = 0;
|
|
70
|
+
head = 0;
|
|
71
|
+
}
|
|
72
|
+
else if (head > compactThreshold && head > queue.length / 2) {
|
|
73
|
+
queue.splice(0, head);
|
|
74
|
+
head = 0;
|
|
75
|
+
}
|
|
76
|
+
return item;
|
|
77
|
+
},
|
|
78
|
+
settle(decide, observe) {
|
|
79
|
+
active--;
|
|
80
|
+
deciding++;
|
|
81
|
+
let retry;
|
|
82
|
+
try {
|
|
83
|
+
retry = decide?.();
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
deciding--;
|
|
87
|
+
}
|
|
88
|
+
if (retry?.delay !== undefined)
|
|
89
|
+
hold(retry.item, retry.delay);
|
|
90
|
+
else if (retry) {
|
|
91
|
+
queue.push(retry.item);
|
|
92
|
+
host.retryQueued();
|
|
93
|
+
}
|
|
94
|
+
observe?.();
|
|
95
|
+
notifyIdle();
|
|
96
|
+
},
|
|
97
|
+
freeze() {
|
|
98
|
+
frozen = true;
|
|
99
|
+
for (const retry of held) {
|
|
100
|
+
if (retry.timeout === undefined)
|
|
101
|
+
continue;
|
|
102
|
+
clearTimeout(retry.timeout);
|
|
103
|
+
retry.timeout = undefined;
|
|
104
|
+
retry.remaining = Math.max(0, retry.due - Date.now());
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
thaw() {
|
|
108
|
+
frozen = false;
|
|
109
|
+
for (const retry of held) {
|
|
110
|
+
if (retry.timeout === undefined)
|
|
111
|
+
startHeld(retry);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
discard() {
|
|
115
|
+
drop();
|
|
116
|
+
notifyIdle();
|
|
117
|
+
},
|
|
118
|
+
fail(error) {
|
|
119
|
+
drop();
|
|
120
|
+
for (const waiter of idleWaiters.splice(0))
|
|
121
|
+
waiter.reject(error);
|
|
122
|
+
},
|
|
123
|
+
async whenIdle() {
|
|
124
|
+
if (isIdle())
|
|
125
|
+
return;
|
|
126
|
+
const waiter = Promise.withResolvers();
|
|
127
|
+
idleWaiters.push(waiter);
|
|
128
|
+
return waiter.promise;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=pending-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-work.js","sourceRoot":"","sources":["../src/pending-work.ts"],"names":[],"mappings":"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"}
|
package/dist/scheduler.js
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import { createAdaptiveRate } from "./adaptive-rate.js";
|
|
2
|
+
import { createPendingWork } from "./pending-work.js";
|
|
2
3
|
import { calculateRetryDelay } from "./retry-backoff.js";
|
|
4
|
+
/** The state each event leads to. An event missing from the current state's row is a no-op. */
|
|
5
|
+
const lifecycleTransitions = {
|
|
6
|
+
running: { pause: "paused", stop: "stopped", abort: "aborted", fail: "failed" },
|
|
7
|
+
paused: { resume: "running", stop: "stopped", abort: "aborted" },
|
|
8
|
+
stopped: { restart: "running", abort: "aborted" },
|
|
9
|
+
aborted: {},
|
|
10
|
+
failed: {},
|
|
11
|
+
};
|
|
3
12
|
export function createScheduler(options, adaptiveRateOptions) {
|
|
4
13
|
const { interval, evenly_spaced = true, retry = 0, retryBackoff, concurrency, maxQueueSize, compact_threshold = 512, retryClassifier, } = options;
|
|
5
14
|
let last_called = 0;
|
|
6
15
|
let timeout;
|
|
7
|
-
let
|
|
8
|
-
let isPaused = false;
|
|
9
|
-
let isStopped = false;
|
|
10
|
-
let isAborted = false;
|
|
16
|
+
let lifecycle = { state: "running" };
|
|
11
17
|
let cnt_started = 0;
|
|
12
18
|
let cnt_succeeded = 0;
|
|
13
19
|
let cnt_failed = 0;
|
|
14
20
|
let cnt_retried = 0;
|
|
15
21
|
const abortController = new AbortController();
|
|
16
22
|
const max_concurrency = concurrency ?? Infinity;
|
|
17
|
-
const
|
|
18
|
-
const queue = [];
|
|
19
|
-
const delayedRetries = [];
|
|
20
|
-
let head = 0;
|
|
21
|
-
let reserved_count = 0;
|
|
22
|
-
const idleWaiters = [];
|
|
23
|
+
const work = createPendingWork({ capacity: maxQueueSize ?? Infinity, compactThreshold: compact_threshold }, { retryQueued: start });
|
|
23
24
|
const adaptiveRate = createAdaptiveRate(adaptiveRateOptions, {
|
|
24
|
-
hasPendingWork: () =>
|
|
25
|
+
hasPendingWork: () => work.queued > 0,
|
|
25
26
|
resumeStarts() {
|
|
26
27
|
last_called = Date.now();
|
|
27
28
|
clearTimeout(timeout);
|
|
@@ -34,94 +35,43 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
34
35
|
idle() {
|
|
35
36
|
clearTimeout(timeout);
|
|
36
37
|
timeout = undefined;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
38
|
+
},
|
|
39
|
+
failed(error) {
|
|
40
|
+
transition("fail", error);
|
|
41
41
|
},
|
|
42
42
|
});
|
|
43
43
|
function spacing() {
|
|
44
44
|
return evenly_spaced ? interval / adaptiveRate.rate : interval;
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (!isIdle())
|
|
51
|
-
return;
|
|
52
|
-
const waiters = idleWaiters.splice(0);
|
|
53
|
-
for (const resolve of waiters)
|
|
54
|
-
resolve();
|
|
55
|
-
}
|
|
56
|
-
function releaseDelayedRetry(delayedRetry) {
|
|
57
|
-
const index = delayedRetries.indexOf(delayedRetry);
|
|
58
|
-
if (index < 0)
|
|
46
|
+
/** Moves the lifecycle for `event` and runs the cleanup that entering the new state requires. */
|
|
47
|
+
function transition(event, error) {
|
|
48
|
+
const next = lifecycleTransitions[lifecycle.state][event];
|
|
49
|
+
if (next === undefined)
|
|
59
50
|
return;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
for (const delayedRetry of delayedRetries) {
|
|
83
|
-
if (delayedRetry.timeout === undefined)
|
|
84
|
-
startDelayedRetry(delayedRetry);
|
|
51
|
+
lifecycle = next === "failed" ? { state: next, error } : { state: next };
|
|
52
|
+
switch (next) {
|
|
53
|
+
case "running":
|
|
54
|
+
work.thaw();
|
|
55
|
+
adaptiveRate.start();
|
|
56
|
+
return;
|
|
57
|
+
case "paused":
|
|
58
|
+
work.freeze();
|
|
59
|
+
adaptiveRate.pause();
|
|
60
|
+
return;
|
|
61
|
+
case "stopped":
|
|
62
|
+
work.freeze();
|
|
63
|
+
adaptiveRate.stop();
|
|
64
|
+
return;
|
|
65
|
+
case "aborted":
|
|
66
|
+
adaptiveRate.stop();
|
|
67
|
+
work.discard();
|
|
68
|
+
abortController.abort();
|
|
69
|
+
return;
|
|
70
|
+
case "failed":
|
|
71
|
+
adaptiveRate.stop();
|
|
72
|
+
work.fail(error);
|
|
85
73
|
}
|
|
86
74
|
}
|
|
87
|
-
function scheduleDelayedRetry(item, delay) {
|
|
88
|
-
const delayedRetry = { item, remaining: delay };
|
|
89
|
-
delayedRetries.push(delayedRetry);
|
|
90
|
-
if (!isPaused && !isStopped)
|
|
91
|
-
startDelayedRetry(delayedRetry);
|
|
92
|
-
}
|
|
93
|
-
function stop() {
|
|
94
|
-
isStopped = true;
|
|
95
|
-
isPaused = false;
|
|
96
|
-
freezeDelayedRetries();
|
|
97
|
-
adaptiveRate.stop();
|
|
98
|
-
}
|
|
99
|
-
function pause() {
|
|
100
|
-
if (isAborted || isStopped || isPaused)
|
|
101
|
-
return;
|
|
102
|
-
isPaused = true;
|
|
103
|
-
freezeDelayedRetries();
|
|
104
|
-
adaptiveRate.pause();
|
|
105
|
-
}
|
|
106
|
-
function resume() {
|
|
107
|
-
if (!isPaused)
|
|
108
|
-
return;
|
|
109
|
-
isPaused = false;
|
|
110
|
-
resumeDelayedRetries();
|
|
111
|
-
start();
|
|
112
|
-
}
|
|
113
|
-
function abort() {
|
|
114
|
-
if (isAborted)
|
|
115
|
-
return;
|
|
116
|
-
isAborted = true;
|
|
117
|
-
adaptiveRate.stop();
|
|
118
|
-
freezeDelayedRetries();
|
|
119
|
-
delayedRetries.length = 0;
|
|
120
|
-
queue.length = 0;
|
|
121
|
-
head = 0;
|
|
122
|
-
reserved_count = 0;
|
|
123
|
-
abortController.abort();
|
|
124
|
-
}
|
|
125
75
|
function isRetryable(item, outcome) {
|
|
126
76
|
if (!outcome || item.retries === 0)
|
|
127
77
|
return false;
|
|
@@ -132,40 +82,33 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
132
82
|
return true;
|
|
133
83
|
}
|
|
134
84
|
}
|
|
135
|
-
function
|
|
136
|
-
if (
|
|
85
|
+
function nextAttempt(item, outcome) {
|
|
86
|
+
if (!isRetryable(item, outcome))
|
|
87
|
+
return undefined;
|
|
88
|
+
cnt_retried++;
|
|
89
|
+
const retryItem = { fn: item.fn, retries: item.retries - 1 };
|
|
90
|
+
if (retryBackoff === undefined)
|
|
91
|
+
return { item: retryItem };
|
|
92
|
+
return { item: retryItem, delay: calculateRetryDelay(retryBackoff, retry - item.retries + 1) };
|
|
93
|
+
}
|
|
94
|
+
function handleSettlement(item, outcome, reportSettlement, resume = false) {
|
|
95
|
+
if (lifecycle.state === "aborted" || lifecycle.state === "failed") {
|
|
96
|
+
work.settle();
|
|
137
97
|
return;
|
|
98
|
+
}
|
|
138
99
|
if (outcome)
|
|
139
100
|
cnt_failed++;
|
|
140
101
|
else
|
|
141
102
|
cnt_succeeded++;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
start();
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
const retryIndex = retry - item.retries + 1;
|
|
151
|
-
scheduleDelayedRetry(retryItem, calculateRetryDelay(retryBackoff, retryIndex));
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else
|
|
155
|
-
reserved_count--;
|
|
156
|
-
reportSettlement(outcome);
|
|
157
|
-
}
|
|
158
|
-
function handleSettlement(item, outcome, reportSettlement, resume = false) {
|
|
159
|
-
active_count--;
|
|
160
|
-
handleResult(item, outcome, reportSettlement);
|
|
161
|
-
if (resume && adaptiveRate.pacing === "open" && queue.length > head)
|
|
162
|
-
dequeue();
|
|
163
|
-
notifyIdle();
|
|
103
|
+
work.settle(() => nextAttempt(item, outcome), () => {
|
|
104
|
+
reportSettlement(outcome);
|
|
105
|
+
if (resume && adaptiveRate.pacing === "open" && work.queued > 0)
|
|
106
|
+
dequeue();
|
|
107
|
+
});
|
|
164
108
|
}
|
|
165
109
|
function execute(item) {
|
|
166
110
|
const reportSettlement = adaptiveRate.started();
|
|
167
111
|
cnt_started++;
|
|
168
|
-
active_count++;
|
|
169
112
|
let result;
|
|
170
113
|
try {
|
|
171
114
|
result = item.fn({ signal: abortController.signal });
|
|
@@ -188,62 +131,51 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
188
131
|
timeout = setTimeout(dequeue, threshold - now);
|
|
189
132
|
return;
|
|
190
133
|
}
|
|
191
|
-
const
|
|
134
|
+
const batch = Math.min(evenly_spaced ? 1 : adaptiveRate.rate, work.queued);
|
|
192
135
|
let started = 0;
|
|
193
|
-
while (
|
|
194
|
-
const item =
|
|
136
|
+
while (started < batch && work.active < max_concurrency) {
|
|
137
|
+
const item = work.take();
|
|
138
|
+
if (item === undefined)
|
|
139
|
+
break;
|
|
195
140
|
if (started++ === 0)
|
|
196
141
|
last_called = Date.now();
|
|
197
142
|
execute(item);
|
|
198
143
|
}
|
|
199
|
-
if (
|
|
200
|
-
queue.splice(0, head);
|
|
201
|
-
head = 0;
|
|
202
|
-
}
|
|
203
|
-
if (head >= queue.length)
|
|
144
|
+
if (work.queued === 0)
|
|
204
145
|
adaptiveRate.drained();
|
|
205
|
-
if (adaptiveRate.pacing !== "open" ||
|
|
146
|
+
if (adaptiveRate.pacing !== "open" || work.active >= max_concurrency)
|
|
206
147
|
return;
|
|
207
148
|
timeout = setTimeout(dequeue, spacing());
|
|
208
149
|
}
|
|
209
150
|
function start() {
|
|
210
|
-
if (
|
|
211
|
-
|
|
212
|
-
adaptiveRate.start();
|
|
151
|
+
if (lifecycle.state === "running")
|
|
152
|
+
adaptiveRate.start();
|
|
213
153
|
}
|
|
214
154
|
function enqueue(callback) {
|
|
215
|
-
if (
|
|
155
|
+
if (lifecycle.state === "aborted")
|
|
216
156
|
throw new Error("Cannot enqueue work after the queue has been aborted");
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return "paused";
|
|
235
|
-
return "running";
|
|
236
|
-
}
|
|
237
|
-
enqueue.pause = pause;
|
|
238
|
-
enqueue.resume = resume;
|
|
239
|
-
enqueue.stop = stop;
|
|
240
|
-
enqueue.abort = abort;
|
|
241
|
-
enqueue.waitForIdle = async () => isIdle() ? Promise.resolve() : new Promise(resolve => { idleWaiters.push(resolve); });
|
|
157
|
+
if (lifecycle.state === "failed")
|
|
158
|
+
throw lifecycle.error;
|
|
159
|
+
work.accept({ fn: callback, retries: retry });
|
|
160
|
+
if (lifecycle.state === "stopped")
|
|
161
|
+
transition("restart");
|
|
162
|
+
else
|
|
163
|
+
start();
|
|
164
|
+
}
|
|
165
|
+
enqueue.pause = () => transition("pause");
|
|
166
|
+
enqueue.resume = () => transition("resume");
|
|
167
|
+
enqueue.stop = () => transition("stop");
|
|
168
|
+
enqueue.abort = () => transition("abort");
|
|
169
|
+
enqueue.waitForIdle = async () => {
|
|
170
|
+
if (lifecycle.state === "failed")
|
|
171
|
+
throw lifecycle.error;
|
|
172
|
+
return work.whenIdle();
|
|
173
|
+
};
|
|
242
174
|
enqueue.getState = () => Object.freeze({
|
|
243
175
|
rate: adaptiveRate.rate,
|
|
244
|
-
pending:
|
|
245
|
-
active:
|
|
246
|
-
state:
|
|
176
|
+
pending: work.pending,
|
|
177
|
+
active: work.active,
|
|
178
|
+
state: lifecycle.state,
|
|
247
179
|
started: cnt_started,
|
|
248
180
|
succeeded: cnt_succeeded,
|
|
249
181
|
failed: cnt_failed,
|
|
@@ -251,7 +183,7 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
251
183
|
rateIncreases: adaptiveRate.rateIncreases,
|
|
252
184
|
rateDecreases: adaptiveRate.rateDecreases,
|
|
253
185
|
});
|
|
254
|
-
Object.defineProperty(enqueue, "pending", { get: () =>
|
|
186
|
+
Object.defineProperty(enqueue, "pending", { get: () => work.pending });
|
|
255
187
|
return enqueue;
|
|
256
188
|
}
|
|
257
189
|
//# sourceMappingURL=scheduler.js.map
|
package/dist/scheduler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,2BAA2B;AAGxD,OAAO,EAAE,mBAAmB,EAAE,2BAA2B;
|
|
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.120625e",
|
|
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": [
|