@workglow/job-queue 0.2.25 → 0.2.27
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/browser.js +195 -32
- package/dist/browser.js.map +11 -11
- package/dist/bun.js +195 -32
- package/dist/bun.js.map +11 -11
- package/dist/job/JobQueueServer.d.ts.map +1 -1
- package/dist/job/JobQueueWorker.d.ts +7 -2
- package/dist/job/JobQueueWorker.d.ts.map +1 -1
- package/dist/limiter/CompositeLimiter.d.ts +17 -1
- package/dist/limiter/CompositeLimiter.d.ts.map +1 -1
- package/dist/limiter/ConcurrencyLimiter.d.ts +11 -1
- package/dist/limiter/ConcurrencyLimiter.d.ts.map +1 -1
- package/dist/limiter/DelayLimiter.d.ts +12 -1
- package/dist/limiter/DelayLimiter.d.ts.map +1 -1
- package/dist/limiter/EvenlySpacedRateLimiter.d.ts +18 -1
- package/dist/limiter/EvenlySpacedRateLimiter.d.ts.map +1 -1
- package/dist/limiter/ILimiter.d.ts +56 -0
- package/dist/limiter/ILimiter.d.ts.map +1 -1
- package/dist/limiter/NullLimiter.d.ts +6 -1
- package/dist/limiter/NullLimiter.d.ts.map +1 -1
- package/dist/limiter/RateLimiter.d.ts +42 -3
- package/dist/limiter/RateLimiter.d.ts.map +1 -1
- package/dist/node.js +195 -32
- package/dist/node.js.map +11 -11
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobQueueServer.d.ts","sourceRoot":"","sources":["../../src/job/JobQueueServer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"JobQueueServer.d.ts","sourceRoot":"","sources":["../../src/job/JobQueueServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,7 +118,11 @@ export declare class JobQueueWorker<Input, Output, QueueJob extends Job<Input, O
|
|
|
118
118
|
*/
|
|
119
119
|
stop(): Promise<this>;
|
|
120
120
|
/**
|
|
121
|
-
* Process a single job manually (useful for testing or manual control)
|
|
121
|
+
* Process a single job manually (useful for testing or manual control).
|
|
122
|
+
*
|
|
123
|
+
* Uses the atomic claim->acquire->release pattern: claim a job, then atomically
|
|
124
|
+
* reserve a limiter slot. If the limiter rejects (e.g. raced another worker
|
|
125
|
+
* to the last slot), the claimed job is released back to PENDING.
|
|
122
126
|
*/
|
|
123
127
|
processNext(): Promise<boolean>;
|
|
124
128
|
/**
|
|
@@ -152,6 +156,7 @@ export declare class JobQueueWorker<Input, Output, QueueJob extends Job<Input, O
|
|
|
152
156
|
* events).
|
|
153
157
|
*/
|
|
154
158
|
protected processJobs(): Promise<void>;
|
|
159
|
+
private getLimiterWakeDelay;
|
|
155
160
|
private getIdleDelay;
|
|
156
161
|
/**
|
|
157
162
|
* Wait for either a {@link notify} call or the given timeout,
|
|
@@ -172,7 +177,7 @@ export declare class JobQueueWorker<Input, Output, QueueJob extends Job<Input, O
|
|
|
172
177
|
/**
|
|
173
178
|
* Process a single job
|
|
174
179
|
*/
|
|
175
|
-
protected processSingleJob(job: Job<Input, Output
|
|
180
|
+
protected processSingleJob(job: Job<Input, Output>, limiterToken: unknown): Promise<void>;
|
|
176
181
|
/**
|
|
177
182
|
* Execute a job with the provided abort signal
|
|
178
183
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobQueueWorker.d.ts","sourceRoot":"","sources":["../../src/job/JobQueueWorker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAa,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,YAAY,EAMb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAGL,QAAQ,EAIT,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"JobQueueWorker.d.ts","sourceRoot":"","sources":["../../src/job/JobQueueWorker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAa,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,YAAY,EAMb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAGL,QAAQ,EAIT,MAAM,YAAY,CAAC;AAYpB;;GAEG;AACH,MAAM,MAAM,4BAA4B,CAAC,KAAK,EAAE,MAAM,IAAI;IACxD,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,KAAK,IAAI,CAAC;IACpD,YAAY,EAAE,CACZ,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KACpC,IAAI,CAAC;IACV,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,4BAA4B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,KAAK,EAAE,MAAM;IAClD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,qBAAa,cAAc,CACzB,KAAK,EACL,MAAM,EACN,QAAQ,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;IAExD,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IACzC,SAAS,CAAC,QAAQ,CAAC,MAAM,4DAAmE;IAE5F,SAAS,CAAC,OAAO,UAAS;IAE1B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IAEnE;;;OAGG;IACH,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,SAAS,CAA8C;IAE/D;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW,CAA8B;IAEjD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAa;IAExF;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAa;IAErE,YAAY,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,EAQ3F;IAED;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAQlC;IAED;;;;OAIG;IACI,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAO3C;IAED;;;;;OAKG;IACI,MAAM,IAAI,IAAI,CAWpB;IAED;;;OAGG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCjC;IAED;;;;;;OAMG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAY3C;IAED;;OAEG;IACI,SAAS,IAAI,OAAO,CAE1B;IAED;;OAEG;IACI,iBAAiB,IAAI,MAAM,CAEjC;IAED;;OAEG;IACI,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAIpD;IAMM,EAAE,CAAC,KAAK,SAAS,oBAAoB,EAC1C,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,4BAA4B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAC3D,IAAI,CAEN;IAEM,GAAG,CAAC,KAAK,SAAS,oBAAoB,EAC3C,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,4BAA4B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAC3D,IAAI,CAEN;IAMD;;OAEG;IACH,UAAgB,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAIpD;IAED;;;;;;;;;;;OAWG;IACH,UAAgB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA2D3C;YASa,mBAAmB;YAkBnB,YAAY;IAe1B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;;;;;;OAOG;IACH,UAAgB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAWpD;IAED;;OAEG;IACH,UAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EACvB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC,CAkGf;IAED;;OAEG;IACH,UAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAMxF;IAED;;;;;;;OAOG;IACH,UAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAW,EACpB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAW,GAC7C,OAAO,CAAC,IAAI,CAAC,CAGf;IAED;;OAEG;IACH,UAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnF;IAED;;OAEG;IACH,UAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/E;IAED;;OAEG;IACH,UAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAejE;IAED;;;;;;;;OAQG;IACH,UAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxE;IAED;;OAEG;IACH,UAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAkB/D;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,UAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzD;IAED;;OAEG;IACH,UAAgB,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAI3E;IAED;;OAEG;IACH,UAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBvE;IAED;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAQ/C;IAED;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEzC;IAED;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAErF;IAED;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAEjF;CACF"}
|
|
@@ -3,12 +3,28 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ILimiter } from "./ILimiter";
|
|
6
|
+
import { ILimiter, LimiterScope } from "./ILimiter";
|
|
7
7
|
export declare class CompositeLimiter implements ILimiter {
|
|
8
8
|
private limiters;
|
|
9
9
|
constructor(limiters?: ILimiter[]);
|
|
10
|
+
/**
|
|
11
|
+
* `"cluster"` only when EVERY child is cluster-scoped. A single process-scoped
|
|
12
|
+
* child means the composite as a whole can't enforce a cluster-wide limit.
|
|
13
|
+
*/
|
|
14
|
+
get scope(): LimiterScope;
|
|
10
15
|
addLimiter(limiter: ILimiter): void;
|
|
11
16
|
canProceed(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Atomic against the composite: acquires children sequentially and rolls
|
|
19
|
+
* back any successfully-acquired prefix if a later child rejects, so the
|
|
20
|
+
* "all-or-nothing" semantics hold under concurrency.
|
|
21
|
+
*
|
|
22
|
+
* The returned token is an array of per-child tokens (parallel to
|
|
23
|
+
* `this.limiters`) so {@link release} can free each child's specific slot
|
|
24
|
+
* — never "the most recent", which would race other acquirers.
|
|
25
|
+
*/
|
|
26
|
+
tryAcquire(): Promise<unknown | null>;
|
|
27
|
+
release(token: unknown): Promise<void>;
|
|
12
28
|
recordJobStart(): Promise<void>;
|
|
13
29
|
recordJobCompletion(): Promise<void>;
|
|
14
30
|
getNextAvailableTime(): Promise<Date>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/CompositeLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"CompositeLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/CompositeLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,QAAQ,CAAkB;IAElC,YAAY,QAAQ,GAAE,QAAQ,EAAO,EAEpC;IAED;;;OAGG;IACH,IAAW,KAAK,IAAI,YAAY,CAI/B;IAED,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAElC;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAOnC;IAED;;;;;;;;OAQG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAmB1C;IAEK,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3C;IAEK,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzC;IAEK,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAS1C;IAEK,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
|
@@ -3,17 +3,27 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ILimiter } from "./ILimiter";
|
|
6
|
+
import { ILimiter, LimiterScope } from "./ILimiter";
|
|
7
7
|
export declare const CONCURRENT_JOB_LIMITER: import("@workglow/util").ServiceToken<ILimiter>;
|
|
8
8
|
/**
|
|
9
9
|
* Concurrency limiter that limits the number of concurrent jobs.
|
|
10
10
|
*/
|
|
11
11
|
export declare class ConcurrencyLimiter implements ILimiter {
|
|
12
|
+
/** In-memory counter — not shared across processes. */
|
|
13
|
+
readonly scope: LimiterScope;
|
|
12
14
|
private currentRunningJobs;
|
|
13
15
|
private readonly maxConcurrentJobs;
|
|
14
16
|
private nextAllowedStartTime;
|
|
15
17
|
constructor(maxConcurrentJobs: number);
|
|
16
18
|
canProceed(): Promise<boolean>;
|
|
19
|
+
/** Sentinel token; ConcurrencyLimiter has no per-row identity, just a counter. */
|
|
20
|
+
private static readonly SENTINEL;
|
|
21
|
+
/**
|
|
22
|
+
* Atomic in JS's single-threaded sense: the read-then-increment runs without
|
|
23
|
+
* an `await` between them, so no other task can interleave.
|
|
24
|
+
*/
|
|
25
|
+
tryAcquire(): Promise<unknown | null>;
|
|
26
|
+
release(token: unknown): Promise<void>;
|
|
17
27
|
recordJobStart(): Promise<void>;
|
|
18
28
|
recordJobCompletion(): Promise<void>;
|
|
19
29
|
getNextAvailableTime(): Promise<Date>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConcurrencyLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/ConcurrencyLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ConcurrencyLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/ConcurrencyLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,sBAAsB,iDAA8D,CAAC;AAElG;;GAEG;AACH,qBAAa,kBAAmB,YAAW,QAAQ;IACjD,uDAAuD;IACvD,SAAgB,KAAK,EAAE,YAAY,CAAa;IAChD,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,oBAAoB,CAAoB;IAEhD,YAAY,iBAAiB,EAAE,MAAM,EAEpC;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAKnC;IAED,kFAAkF;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAEzE;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAS1C;IAEK,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3C;IAEK,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzC;IAEK,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEK,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;CACF"}
|
|
@@ -3,12 +3,23 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ILimiter } from "./ILimiter";
|
|
6
|
+
import { ILimiter, LimiterScope } from "./ILimiter";
|
|
7
7
|
export declare class DelayLimiter implements ILimiter {
|
|
8
8
|
private delayInMilliseconds;
|
|
9
|
+
/** In-memory state — not shared across processes. */
|
|
10
|
+
readonly scope: LimiterScope;
|
|
9
11
|
private nextAvailableTime;
|
|
12
|
+
/** Time of the most recent successful tryAcquire, used to undo on release. */
|
|
13
|
+
private lastAcquireBaseline;
|
|
10
14
|
constructor(delayInMilliseconds?: number);
|
|
11
15
|
canProceed(): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Token records the previous nextAvailableTime so release can roll back to
|
|
18
|
+
* exactly the state before this acquire — even if other acquires (or
|
|
19
|
+
* setNextAvailableTime calls) ran in between.
|
|
20
|
+
*/
|
|
21
|
+
tryAcquire(): Promise<unknown | null>;
|
|
22
|
+
release(token: unknown): Promise<void>;
|
|
12
23
|
recordJobStart(): Promise<void>;
|
|
13
24
|
recordJobCompletion(): Promise<void>;
|
|
14
25
|
getNextAvailableTime(): Promise<Date>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DelayLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/DelayLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"DelayLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/DelayLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,qBAAa,YAAa,YAAW,QAAQ;IAM/B,OAAO,CAAC,mBAAmB;IALvC,qDAAqD;IACrD,SAAgB,KAAK,EAAE,YAAY,CAAa;IAChD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB,CAAa;IACxC,YAAoB,mBAAmB,GAAE,MAAW,EAAI;IAElD,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAEnC;IAED;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAS1C;IAEK,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3C;IAEK,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzC;IAEK,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEK,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpD;IACK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ILimiter, RateLimiterOptions } from "./ILimiter";
|
|
6
|
+
import { ILimiter, LimiterScope, RateLimiterOptions } from "./ILimiter";
|
|
7
7
|
export declare const EVENLY_SPACED_JOB_RATE_LIMITER: import("@workglow/util").ServiceToken<ILimiter>;
|
|
8
8
|
/**
|
|
9
9
|
* Rate limiter that spreads requests evenly across a time window.
|
|
@@ -11,15 +11,32 @@ export declare const EVENLY_SPACED_JOB_RATE_LIMITER: import("@workglow/util").Se
|
|
|
11
11
|
* this limiter spaces out the requests evenly across the window.
|
|
12
12
|
*/
|
|
13
13
|
export declare class EvenlySpacedRateLimiter implements ILimiter {
|
|
14
|
+
/** In-memory per-instance state — not shared across processes. */
|
|
15
|
+
readonly scope: LimiterScope;
|
|
14
16
|
private readonly maxExecutions;
|
|
15
17
|
private readonly windowSizeMs;
|
|
16
18
|
private readonly idealInterval;
|
|
17
19
|
private nextAvailableTime;
|
|
18
20
|
private lastStartTime;
|
|
19
21
|
private durations;
|
|
22
|
+
/** Promise chain used to serialize concurrent {@link tryAcquire} callers. */
|
|
23
|
+
private acquireChain;
|
|
20
24
|
constructor({ maxExecutions, windowSizeInSeconds }: RateLimiterOptions);
|
|
21
25
|
/** Can we start a new job right now? */
|
|
22
26
|
canProceed(): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Atomic acquire: serialized by an internal promise chain so two concurrent
|
|
29
|
+
* acquirers cannot both observe `now >= nextAvailableTime` and both proceed.
|
|
30
|
+
* Returns a token capturing the prior `nextAvailableTime` so {@link release}
|
|
31
|
+
* can roll back to the exact state before this acquire.
|
|
32
|
+
*/
|
|
33
|
+
tryAcquire(): Promise<unknown | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Roll back the slot identified by `token`. Only undoes the advance if no
|
|
36
|
+
* later acquire moved the window forward — otherwise we'd undo someone
|
|
37
|
+
* else's reservation.
|
|
38
|
+
*/
|
|
39
|
+
release(token: unknown): Promise<void>;
|
|
23
40
|
/** Record that a job is starting now. */
|
|
24
41
|
recordJobStart(): Promise<void>;
|
|
25
42
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EvenlySpacedRateLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/EvenlySpacedRateLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"EvenlySpacedRateLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/EvenlySpacedRateLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,eAAO,MAAM,8BAA8B,iDAE1C,CAAC;AAEF;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,QAAQ;IACtD,kEAAkE;IAClE,SAAgB,KAAK,EAAE,YAAY,CAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,SAAS,CAAgB;IACjC,6EAA6E;IAC7E,OAAO,CAAC,YAAY,CAAuC;IAE3D,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,EAAE,kBAAkB,EAWrE;IAED,wCAAwC;IAClC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAGnC;IAED;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CA6B1C;IAED;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3C;IAED,yCAAyC;IACnC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAepC;IAED;;;;OAIG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOzC;IAEK,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEK,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;CACF"}
|
|
@@ -4,11 +4,67 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
export declare const JOB_LIMITER: import("@workglow/util").ServiceToken<ILimiter>;
|
|
7
|
+
/**
|
|
8
|
+
* Whether a limiter's state is shared across processes.
|
|
9
|
+
*
|
|
10
|
+
* - `"process"` — state lives in this process only. Multiple workers in the
|
|
11
|
+
* same process share it, but separate processes do not. The configured limit
|
|
12
|
+
* is multiplied by the number of processes.
|
|
13
|
+
* - `"cluster"` — state lives in shared storage (Postgres, Supabase, etc.)
|
|
14
|
+
* visible to every process in the cluster. The configured limit is enforced
|
|
15
|
+
* globally.
|
|
16
|
+
*/
|
|
17
|
+
export type LimiterScope = "process" | "cluster";
|
|
7
18
|
/**
|
|
8
19
|
* Interface for a job limiter.
|
|
20
|
+
*
|
|
21
|
+
* The atomic primitive is {@link tryAcquire}: it both checks whether a job may
|
|
22
|
+
* proceed and reserves the slot in a single uninterruptible step. Callers
|
|
23
|
+
* MUST use {@link tryAcquire}/{@link release} (not the legacy
|
|
24
|
+
* {@link canProceed}/{@link recordJobStart} pair) when correctness matters
|
|
25
|
+
* under concurrency.
|
|
9
26
|
*/
|
|
10
27
|
export interface ILimiter {
|
|
28
|
+
/**
|
|
29
|
+
* Whether this limiter's state is shared across processes. See
|
|
30
|
+
* {@link LimiterScope}. In-memory limiters MUST report `"process"` so users
|
|
31
|
+
* don't mistake them for cluster-safe.
|
|
32
|
+
*/
|
|
33
|
+
readonly scope: LimiterScope;
|
|
34
|
+
/**
|
|
35
|
+
* Atomic check-and-record. Returns an opaque, non-null token on success
|
|
36
|
+
* (the caller may proceed AND the reservation has been recorded). Returns
|
|
37
|
+
* `null` without side effects if the limiter is at capacity.
|
|
38
|
+
*
|
|
39
|
+
* The returned token MUST be passed to {@link release} to free the slot —
|
|
40
|
+
* otherwise rolling back the reservation under contention would race to
|
|
41
|
+
* delete some other worker's slot. Tokens are implementation-defined and
|
|
42
|
+
* callers must treat them as opaque.
|
|
43
|
+
*
|
|
44
|
+
* Implementations must be safe under concurrent callers — two parallel
|
|
45
|
+
* `tryAcquire()` calls with one slot remaining must result in exactly one
|
|
46
|
+
* non-null token and one `null`.
|
|
47
|
+
*/
|
|
48
|
+
tryAcquire(): Promise<unknown | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Release a slot previously reserved by {@link tryAcquire}. The token must
|
|
51
|
+
* be the value that {@link tryAcquire} returned for the slot being freed.
|
|
52
|
+
* Used when the caller cannot actually use the slot it acquired (e.g.
|
|
53
|
+
* claimed a job that vanished, executor failed before running, worker
|
|
54
|
+
* shut down).
|
|
55
|
+
*/
|
|
56
|
+
release(token: unknown): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Legacy non-binding "would tryAcquire succeed?" probe. SUBJECT TO RACES —
|
|
59
|
+
* do not use this followed by {@link recordJobStart} in production code; use
|
|
60
|
+
* {@link tryAcquire} instead. Retained for observability and tests.
|
|
61
|
+
*/
|
|
11
62
|
canProceed(): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Legacy "force-record an execution" hook. SUBJECT TO RACES when paired with
|
|
65
|
+
* {@link canProceed} — use {@link tryAcquire} instead. Retained for tests
|
|
66
|
+
* and external bookkeeping.
|
|
67
|
+
*/
|
|
12
68
|
recordJobStart(): Promise<void>;
|
|
13
69
|
recordJobCompletion(): Promise<void>;
|
|
14
70
|
getNextAvailableTime(): Promise<Date>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ILimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/ILimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,WAAW,iDAAmD,CAAC;AAE5E
|
|
1
|
+
{"version":3,"file":"ILimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/ILimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,WAAW,iDAAmD,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAE7B;;;;;;;;;;;;;OAaG;IACH,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAEtC;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC;;;;OAIG;IACH,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/B;;;;OAIG;IACH,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,6BAA8B,SAAQ,kBAAkB;IACvE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC"}
|
|
@@ -3,12 +3,17 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ILimiter } from "./ILimiter";
|
|
6
|
+
import { ILimiter, LimiterScope } from "./ILimiter";
|
|
7
7
|
export declare const NULL_JOB_LIMITER: import("@workglow/util").ServiceToken<ILimiter>;
|
|
8
8
|
/**
|
|
9
9
|
* Null limiter that does nothing.
|
|
10
10
|
*/
|
|
11
11
|
export declare class NullLimiter implements ILimiter {
|
|
12
|
+
readonly scope: LimiterScope;
|
|
13
|
+
/** Sentinel token — non-null so callers' truthy checks see it as a success. */
|
|
14
|
+
private static readonly SENTINEL;
|
|
15
|
+
tryAcquire(): Promise<unknown | null>;
|
|
16
|
+
release(_token: unknown): Promise<void>;
|
|
12
17
|
canProceed(): Promise<boolean>;
|
|
13
18
|
recordJobStart(): Promise<void>;
|
|
14
19
|
recordJobCompletion(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NullLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/NullLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"NullLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/NullLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,gBAAgB,iDAAwD,CAAC;AAEtF;;GAEG;AACH,qBAAa,WAAY,YAAW,QAAQ;IAC1C,SAAgB,KAAK,EAAE,YAAY,CAAa;IAEhD,+EAA+E;IAC/E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE5D,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAE1C;IAEK,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5C;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAEnC;IAEK,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzC;IAEK,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEK,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { IRateLimiterStorage } from "@workglow/storage";
|
|
7
|
-
import { ILimiter, RateLimiterWithBackoffOptions } from "./ILimiter";
|
|
7
|
+
import { ILimiter, LimiterScope, RateLimiterWithBackoffOptions } from "./ILimiter";
|
|
8
8
|
/**
|
|
9
9
|
* Base rate limiter implementation that uses a storage backend.
|
|
10
10
|
* Manages request counts and delays to control job execution.
|
|
@@ -18,7 +18,44 @@ export declare class RateLimiter implements ILimiter {
|
|
|
18
18
|
protected readonly initialBackoffDelay: number;
|
|
19
19
|
protected readonly backoffMultiplier: number;
|
|
20
20
|
protected readonly maxBackoffDelay: number;
|
|
21
|
+
/**
|
|
22
|
+
* Per-instance backoff hint set by the most recent failed {@link tryAcquire}.
|
|
23
|
+
* Exposed via {@link getNextAvailableTime} so this process's worker sleeps
|
|
24
|
+
* until the hint expires, but NOT written to storage so a parallel worker's
|
|
25
|
+
* {@link release} can't clobber it. Cross-process workers each maintain
|
|
26
|
+
* their own hint.
|
|
27
|
+
*/
|
|
28
|
+
protected localBackoffUntilMs: number;
|
|
21
29
|
constructor(storage: IRateLimiterStorage, queueName: string, { maxExecutions, windowSizeInSeconds, initialBackoffDelay, backoffMultiplier, maxBackoffDelay }: RateLimiterWithBackoffOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Inherits its scope from the underlying storage. Storage-backed RateLimiter
|
|
32
|
+
* is `"cluster"` for Postgres/Supabase, `"process"` for InMemory/IndexedDb/Sqlite.
|
|
33
|
+
*/
|
|
34
|
+
get scope(): LimiterScope;
|
|
35
|
+
/**
|
|
36
|
+
* Atomic check-and-record. Delegates to {@link IRateLimiterStorage.tryReserveExecution}
|
|
37
|
+
* which performs the count, next-available, and insert under a single
|
|
38
|
+
* critical section per backend (advisory xact lock for Postgres, BEGIN
|
|
39
|
+
* IMMEDIATE for SQLite, per-key promise mutex for in-memory).
|
|
40
|
+
*
|
|
41
|
+
* Returns the storage-assigned row id as an opaque token on success, or
|
|
42
|
+
* `null` on failure. The caller MUST pass the token to {@link release} to
|
|
43
|
+
* roll back — releasing without a token would race to delete the wrong
|
|
44
|
+
* worker's slot under contention.
|
|
45
|
+
*/
|
|
46
|
+
tryAcquire(): Promise<unknown | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Release the slot identified by `token` (a value returned from
|
|
49
|
+
* {@link tryAcquire}). Deletes the specific row by id — NOT the most recent
|
|
50
|
+
* — so two concurrent acquirers don't race to release each other's slots.
|
|
51
|
+
* Does NOT touch the shared storage `nextAvailableAt` sentinel; that field
|
|
52
|
+
* is reserved for explicit external pauses (e.g. cluster-wide rate-limit
|
|
53
|
+
* cool-down set via {@link setNextAvailableTime}), and clearing it here
|
|
54
|
+
* would clobber a parallel worker's failed-acquire backoff or a deliberate
|
|
55
|
+
* cluster-wide pause. Local per-instance backoff is cleared via
|
|
56
|
+
* {@link localBackoffUntilMs}.
|
|
57
|
+
*/
|
|
58
|
+
release(token: unknown): Promise<void>;
|
|
22
59
|
protected addJitter(base: number): number;
|
|
23
60
|
protected increaseBackoff(): void;
|
|
24
61
|
/**
|
|
@@ -32,8 +69,10 @@ export declare class RateLimiter implements ILimiter {
|
|
|
32
69
|
recordJobStart(): Promise<void>;
|
|
33
70
|
recordJobCompletion(): Promise<void>;
|
|
34
71
|
/**
|
|
35
|
-
* Retrieves the next available time for the specific queue.
|
|
36
|
-
*
|
|
72
|
+
* Retrieves the next available time for the specific queue. Returns the
|
|
73
|
+
* latest of: the rate-limit wall (oldest execution + window), any externally
|
|
74
|
+
* set storage sentinel (explicit pause), and this instance's local backoff
|
|
75
|
+
* hint from the most recent failed {@link tryAcquire}.
|
|
37
76
|
*/
|
|
38
77
|
getNextAvailableTime(): Promise<Date>;
|
|
39
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/RateLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../src/limiter/RateLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEnF;;;GAGG;AACH,qBAAa,WAAY,YAAW,QAAQ;IAiBxC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB;IAC/C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAjBtC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IACpD,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IACzC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAC3C;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAK;IAE1C,YACqB,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,MAAM,EACpC,EACE,aAAa,EACb,mBAAmB,EACnB,mBAA2B,EAC3B,iBAAqB,EACrB,eAAyB,EAC1B,EAAE,6BAA6B,EAwBjC;IAED;;;OAGG;IACH,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED;;;;;;;;;;OAUG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAoB1C;IAED;;;;;;;;;;OAUG;IACG,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3C;IAED,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxC;IAED,SAAS,CAAC,eAAe,IAAI,IAAI,CAKhC;IAED;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BnC;IAED;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBpC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzC;IAED;;;;;OAKG;IACG,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B1C;IAED;;;OAGG;IACG,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpD;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;CACF"}
|