dynamic-throttled-queue 2.3.0-rc.0a1a3b6 → 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/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 +38 -120
- package/dist/scheduler.js.map +1 -1
- package/package.json +1 -1
|
@@ -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,4 +1,5 @@
|
|
|
1
1
|
import { createAdaptiveRate } from "./adaptive-rate.js";
|
|
2
|
+
import { createPendingWork } from "./pending-work.js";
|
|
2
3
|
import { calculateRetryDelay } from "./retry-backoff.js";
|
|
3
4
|
/** The state each event leads to. An event missing from the current state's row is a no-op. */
|
|
4
5
|
const lifecycleTransitions = {
|
|
@@ -12,7 +13,6 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
12
13
|
const { interval, evenly_spaced = true, retry = 0, retryBackoff, concurrency, maxQueueSize, compact_threshold = 512, retryClassifier, } = options;
|
|
13
14
|
let last_called = 0;
|
|
14
15
|
let timeout;
|
|
15
|
-
let active_count = 0;
|
|
16
16
|
let lifecycle = { state: "running" };
|
|
17
17
|
let cnt_started = 0;
|
|
18
18
|
let cnt_succeeded = 0;
|
|
@@ -20,14 +20,9 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
20
20
|
let cnt_retried = 0;
|
|
21
21
|
const abortController = new AbortController();
|
|
22
22
|
const max_concurrency = concurrency ?? Infinity;
|
|
23
|
-
const
|
|
24
|
-
const queue = [];
|
|
25
|
-
const delayedRetries = [];
|
|
26
|
-
let head = 0;
|
|
27
|
-
let reserved_count = 0;
|
|
28
|
-
const idleWaiters = [];
|
|
23
|
+
const work = createPendingWork({ capacity: maxQueueSize ?? Infinity, compactThreshold: compact_threshold }, { retryQueued: start });
|
|
29
24
|
const adaptiveRate = createAdaptiveRate(adaptiveRateOptions, {
|
|
30
|
-
hasPendingWork: () =>
|
|
25
|
+
hasPendingWork: () => work.queued > 0,
|
|
31
26
|
resumeStarts() {
|
|
32
27
|
last_called = Date.now();
|
|
33
28
|
clearTimeout(timeout);
|
|
@@ -40,10 +35,6 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
40
35
|
idle() {
|
|
41
36
|
clearTimeout(timeout);
|
|
42
37
|
timeout = undefined;
|
|
43
|
-
if (head >= queue.length) {
|
|
44
|
-
queue.length = 0;
|
|
45
|
-
head = 0;
|
|
46
|
-
}
|
|
47
38
|
},
|
|
48
39
|
failed(error) {
|
|
49
40
|
transition("fail", error);
|
|
@@ -52,60 +43,6 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
52
43
|
function spacing() {
|
|
53
44
|
return evenly_spaced ? interval / adaptiveRate.rate : interval;
|
|
54
45
|
}
|
|
55
|
-
function isIdle() {
|
|
56
|
-
return active_count === 0 && queue.length <= head && delayedRetries.length === 0;
|
|
57
|
-
}
|
|
58
|
-
function notifyIdle() {
|
|
59
|
-
if (!isIdle())
|
|
60
|
-
return;
|
|
61
|
-
for (const waiter of idleWaiters.splice(0))
|
|
62
|
-
waiter.resolve();
|
|
63
|
-
}
|
|
64
|
-
function releaseDelayedRetry(delayedRetry) {
|
|
65
|
-
const index = delayedRetries.indexOf(delayedRetry);
|
|
66
|
-
if (index < 0)
|
|
67
|
-
return;
|
|
68
|
-
delayedRetries.splice(index, 1);
|
|
69
|
-
queue.push(delayedRetry.item);
|
|
70
|
-
start();
|
|
71
|
-
}
|
|
72
|
-
function startDelayedRetry(delayedRetry) {
|
|
73
|
-
delayedRetry.due = Date.now() + delayedRetry.remaining;
|
|
74
|
-
delayedRetry.timeout = setTimeout(() => {
|
|
75
|
-
releaseDelayedRetry(delayedRetry);
|
|
76
|
-
}, delayedRetry.remaining);
|
|
77
|
-
}
|
|
78
|
-
function freezeDelayedRetries() {
|
|
79
|
-
for (const delayedRetry of delayedRetries) {
|
|
80
|
-
if (delayedRetry.timeout === undefined)
|
|
81
|
-
continue;
|
|
82
|
-
if (delayedRetry.due === undefined)
|
|
83
|
-
continue;
|
|
84
|
-
clearTimeout(delayedRetry.timeout);
|
|
85
|
-
delayedRetry.timeout = undefined;
|
|
86
|
-
delayedRetry.remaining = Math.max(0, delayedRetry.due - Date.now());
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
function resumeDelayedRetries() {
|
|
90
|
-
for (const delayedRetry of delayedRetries) {
|
|
91
|
-
if (delayedRetry.timeout === undefined)
|
|
92
|
-
startDelayedRetry(delayedRetry);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function scheduleDelayedRetry(item, delay) {
|
|
96
|
-
const delayedRetry = { item, remaining: delay };
|
|
97
|
-
delayedRetries.push(delayedRetry);
|
|
98
|
-
if (lifecycle.state === "running")
|
|
99
|
-
startDelayedRetry(delayedRetry);
|
|
100
|
-
}
|
|
101
|
-
function discardPendingWork() {
|
|
102
|
-
for (const delayedRetry of delayedRetries)
|
|
103
|
-
clearTimeout(delayedRetry.timeout);
|
|
104
|
-
delayedRetries.length = 0;
|
|
105
|
-
queue.length = 0;
|
|
106
|
-
head = 0;
|
|
107
|
-
reserved_count = 0;
|
|
108
|
-
}
|
|
109
46
|
/** Moves the lifecycle for `event` and runs the cleanup that entering the new state requires. */
|
|
110
47
|
function transition(event, error) {
|
|
111
48
|
const next = lifecycleTransitions[lifecycle.state][event];
|
|
@@ -114,28 +51,25 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
114
51
|
lifecycle = next === "failed" ? { state: next, error } : { state: next };
|
|
115
52
|
switch (next) {
|
|
116
53
|
case "running":
|
|
117
|
-
|
|
54
|
+
work.thaw();
|
|
118
55
|
adaptiveRate.start();
|
|
119
56
|
return;
|
|
120
57
|
case "paused":
|
|
121
|
-
|
|
58
|
+
work.freeze();
|
|
122
59
|
adaptiveRate.pause();
|
|
123
60
|
return;
|
|
124
61
|
case "stopped":
|
|
125
|
-
|
|
62
|
+
work.freeze();
|
|
126
63
|
adaptiveRate.stop();
|
|
127
64
|
return;
|
|
128
65
|
case "aborted":
|
|
129
66
|
adaptiveRate.stop();
|
|
130
|
-
|
|
67
|
+
work.discard();
|
|
131
68
|
abortController.abort();
|
|
132
|
-
notifyIdle();
|
|
133
69
|
return;
|
|
134
70
|
case "failed":
|
|
135
71
|
adaptiveRate.stop();
|
|
136
|
-
|
|
137
|
-
for (const waiter of idleWaiters.splice(0))
|
|
138
|
-
waiter.reject(error);
|
|
72
|
+
work.fail(error);
|
|
139
73
|
}
|
|
140
74
|
}
|
|
141
75
|
function isRetryable(item, outcome) {
|
|
@@ -148,40 +82,33 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
148
82
|
return true;
|
|
149
83
|
}
|
|
150
84
|
}
|
|
151
|
-
function
|
|
152
|
-
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();
|
|
153
97
|
return;
|
|
98
|
+
}
|
|
154
99
|
if (outcome)
|
|
155
100
|
cnt_failed++;
|
|
156
101
|
else
|
|
157
102
|
cnt_succeeded++;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
start();
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
const retryIndex = retry - item.retries + 1;
|
|
167
|
-
scheduleDelayedRetry(retryItem, calculateRetryDelay(retryBackoff, retryIndex));
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else
|
|
171
|
-
reserved_count--;
|
|
172
|
-
reportSettlement(outcome);
|
|
173
|
-
}
|
|
174
|
-
function handleSettlement(item, outcome, reportSettlement, resume = false) {
|
|
175
|
-
active_count--;
|
|
176
|
-
handleResult(item, outcome, reportSettlement);
|
|
177
|
-
if (resume && adaptiveRate.pacing === "open" && queue.length > head)
|
|
178
|
-
dequeue();
|
|
179
|
-
notifyIdle();
|
|
103
|
+
work.settle(() => nextAttempt(item, outcome), () => {
|
|
104
|
+
reportSettlement(outcome);
|
|
105
|
+
if (resume && adaptiveRate.pacing === "open" && work.queued > 0)
|
|
106
|
+
dequeue();
|
|
107
|
+
});
|
|
180
108
|
}
|
|
181
109
|
function execute(item) {
|
|
182
110
|
const reportSettlement = adaptiveRate.started();
|
|
183
111
|
cnt_started++;
|
|
184
|
-
active_count++;
|
|
185
112
|
let result;
|
|
186
113
|
try {
|
|
187
114
|
result = item.fn({ signal: abortController.signal });
|
|
@@ -204,21 +131,19 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
204
131
|
timeout = setTimeout(dequeue, threshold - now);
|
|
205
132
|
return;
|
|
206
133
|
}
|
|
207
|
-
const
|
|
134
|
+
const batch = Math.min(evenly_spaced ? 1 : adaptiveRate.rate, work.queued);
|
|
208
135
|
let started = 0;
|
|
209
|
-
while (
|
|
210
|
-
const item =
|
|
136
|
+
while (started < batch && work.active < max_concurrency) {
|
|
137
|
+
const item = work.take();
|
|
138
|
+
if (item === undefined)
|
|
139
|
+
break;
|
|
211
140
|
if (started++ === 0)
|
|
212
141
|
last_called = Date.now();
|
|
213
142
|
execute(item);
|
|
214
143
|
}
|
|
215
|
-
if (
|
|
216
|
-
queue.splice(0, head);
|
|
217
|
-
head = 0;
|
|
218
|
-
}
|
|
219
|
-
if (head >= queue.length)
|
|
144
|
+
if (work.queued === 0)
|
|
220
145
|
adaptiveRate.drained();
|
|
221
|
-
if (adaptiveRate.pacing !== "open" ||
|
|
146
|
+
if (adaptiveRate.pacing !== "open" || work.active >= max_concurrency)
|
|
222
147
|
return;
|
|
223
148
|
timeout = setTimeout(dequeue, spacing());
|
|
224
149
|
}
|
|
@@ -231,10 +156,7 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
231
156
|
throw new Error("Cannot enqueue work after the queue has been aborted");
|
|
232
157
|
if (lifecycle.state === "failed")
|
|
233
158
|
throw lifecycle.error;
|
|
234
|
-
|
|
235
|
-
throw new Error("Cannot enqueue work: maxQueueSize has been reached");
|
|
236
|
-
reserved_count++;
|
|
237
|
-
queue.push({ fn: callback, retries: retry });
|
|
159
|
+
work.accept({ fn: callback, retries: retry });
|
|
238
160
|
if (lifecycle.state === "stopped")
|
|
239
161
|
transition("restart");
|
|
240
162
|
else
|
|
@@ -247,16 +169,12 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
247
169
|
enqueue.waitForIdle = async () => {
|
|
248
170
|
if (lifecycle.state === "failed")
|
|
249
171
|
throw lifecycle.error;
|
|
250
|
-
|
|
251
|
-
return;
|
|
252
|
-
const waiter = Promise.withResolvers();
|
|
253
|
-
idleWaiters.push(waiter);
|
|
254
|
-
return waiter.promise;
|
|
172
|
+
return work.whenIdle();
|
|
255
173
|
};
|
|
256
174
|
enqueue.getState = () => Object.freeze({
|
|
257
175
|
rate: adaptiveRate.rate,
|
|
258
|
-
pending:
|
|
259
|
-
active:
|
|
176
|
+
pending: work.pending,
|
|
177
|
+
active: work.active,
|
|
260
178
|
state: lifecycle.state,
|
|
261
179
|
started: cnt_started,
|
|
262
180
|
succeeded: cnt_succeeded,
|
|
@@ -265,7 +183,7 @@ export function createScheduler(options, adaptiveRateOptions) {
|
|
|
265
183
|
rateIncreases: adaptiveRate.rateIncreases,
|
|
266
184
|
rateDecreases: adaptiveRate.rateDecreases,
|
|
267
185
|
});
|
|
268
|
-
Object.defineProperty(enqueue, "pending", { get: () =>
|
|
186
|
+
Object.defineProperty(enqueue, "pending", { get: () => work.pending });
|
|
269
187
|
return enqueue;
|
|
270
188
|
}
|
|
271
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.0-rc.
|
|
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": [
|