@workglow/storage 0.0.57 → 0.0.59
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 +1266 -121
- package/dist/browser.js.map +15 -10
- package/dist/bun.js +2132 -267
- package/dist/bun.js.map +20 -13
- package/dist/common-server.d.ts +4 -0
- package/dist/common-server.d.ts.map +1 -1
- package/dist/common.d.ts +2 -0
- package/dist/common.d.ts.map +1 -1
- package/dist/limiter/IRateLimiterStorage.d.ts +81 -0
- package/dist/limiter/IRateLimiterStorage.d.ts.map +1 -0
- package/dist/limiter/InMemoryRateLimiterStorage.d.ts +32 -0
- package/dist/limiter/InMemoryRateLimiterStorage.d.ts.map +1 -0
- package/dist/limiter/IndexedDbRateLimiterStorage.d.ts +52 -0
- package/dist/limiter/IndexedDbRateLimiterStorage.d.ts.map +1 -0
- package/dist/limiter/PostgresRateLimiterStorage.d.ts +54 -0
- package/dist/limiter/PostgresRateLimiterStorage.d.ts.map +1 -0
- package/dist/limiter/SqliteRateLimiterStorage.d.ts +53 -0
- package/dist/limiter/SqliteRateLimiterStorage.d.ts.map +1 -0
- package/dist/limiter/SupabaseRateLimiterStorage.d.ts +53 -0
- package/dist/limiter/SupabaseRateLimiterStorage.d.ts.map +1 -0
- package/dist/node.js +2132 -267
- package/dist/node.js.map +20 -13
- package/dist/queue/IQueueStorage.d.ts +72 -1
- package/dist/queue/IQueueStorage.d.ts.map +1 -1
- package/dist/queue/InMemoryQueueStorage.d.ts +44 -11
- package/dist/queue/InMemoryQueueStorage.d.ts.map +1 -1
- package/dist/queue/IndexedDbQueueStorage.d.ts +70 -5
- package/dist/queue/IndexedDbQueueStorage.d.ts.map +1 -1
- package/dist/queue/PostgresQueueStorage.d.ts +80 -8
- package/dist/queue/PostgresQueueStorage.d.ts.map +1 -1
- package/dist/queue/SqliteQueueStorage.d.ts +90 -34
- package/dist/queue/SqliteQueueStorage.d.ts.map +1 -1
- package/dist/queue/SupabaseQueueStorage.d.ts +98 -4
- package/dist/queue/SupabaseQueueStorage.d.ts.map +1 -1
- package/dist/tabular/ITabularRepository.d.ts +18 -0
- package/dist/tabular/ITabularRepository.d.ts.map +1 -1
- package/dist/tabular/InMemoryTabularRepository.d.ts +9 -1
- package/dist/tabular/InMemoryTabularRepository.d.ts.map +1 -1
- package/dist/tabular/SqliteTabularRepository.d.ts.map +1 -1
- package/dist/tabular/SupabaseTabularRepository.d.ts +21 -1
- package/dist/tabular/SupabaseTabularRepository.d.ts.map +1 -1
- package/dist/tabular/TabularRepository.d.ts +10 -1
- package/dist/tabular/TabularRepository.d.ts.map +1 -1
- package/dist/util/PollingSubscriptionManager.d.ts +112 -0
- package/dist/util/PollingSubscriptionManager.d.ts.map +1 -0
- package/package.json +5 -5
package/dist/common-server.d.ts
CHANGED
|
@@ -16,8 +16,12 @@ export * from "./kv/SupabaseKvRepository";
|
|
|
16
16
|
export * from "./queue/PostgresQueueStorage";
|
|
17
17
|
export * from "./queue/SqliteQueueStorage";
|
|
18
18
|
export * from "./queue/SupabaseQueueStorage";
|
|
19
|
+
export * from "./limiter/PostgresRateLimiterStorage";
|
|
20
|
+
export * from "./limiter/SqliteRateLimiterStorage";
|
|
21
|
+
export * from "./limiter/SupabaseRateLimiterStorage";
|
|
19
22
|
export * from "./kv/IndexedDbKvRepository";
|
|
20
23
|
export * from "./queue/IndexedDbQueueStorage";
|
|
21
24
|
export * from "./tabular/IndexedDbTabularRepository";
|
|
25
|
+
export * from "./limiter/IndexedDbRateLimiterStorage";
|
|
22
26
|
export * from "./util/IndexedDbTable";
|
|
23
27
|
//# sourceMappingURL=common-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-server.d.ts","sourceRoot":"","sources":["../src/common-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,UAAU,CAAC;AAEzB,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"common-server.d.ts","sourceRoot":"","sources":["../src/common-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,UAAU,CAAC;AAEzB,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uBAAuB,CAAC"}
|
package/dist/common.d.ts
CHANGED
|
@@ -13,4 +13,6 @@ export * from "./kv/KvRepository";
|
|
|
13
13
|
export * from "./kv/KvViaTabularRepository";
|
|
14
14
|
export * from "./queue/InMemoryQueueStorage";
|
|
15
15
|
export * from "./queue/IQueueStorage";
|
|
16
|
+
export * from "./limiter/IRateLimiterStorage";
|
|
17
|
+
export * from "./limiter/InMemoryRateLimiterStorage";
|
|
16
18
|
//# sourceMappingURL=common.d.ts.map
|
package/dist/common.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { PrefixColumn } from "../queue/IQueueStorage";
|
|
7
|
+
export declare const RATE_LIMITER_STORAGE: import("@workglow/util").ServiceToken<IRateLimiterStorage>;
|
|
8
|
+
/**
|
|
9
|
+
* Options for configuring rate limiter storage with prefix filters.
|
|
10
|
+
*/
|
|
11
|
+
export interface RateLimiterStorageOptions {
|
|
12
|
+
/** The prefix column definitions for this storage */
|
|
13
|
+
readonly prefixes?: readonly PrefixColumn[];
|
|
14
|
+
/** The values for each prefix column */
|
|
15
|
+
readonly prefixValues?: Readonly<Record<string, string | number>>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Record of a job execution for rate limiting tracking.
|
|
19
|
+
*/
|
|
20
|
+
export interface ExecutionRecord {
|
|
21
|
+
readonly id?: unknown;
|
|
22
|
+
readonly queue_name: string;
|
|
23
|
+
readonly executed_at: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Record of the next available time for a queue.
|
|
27
|
+
*/
|
|
28
|
+
export interface NextAvailableRecord {
|
|
29
|
+
readonly queue_name: string;
|
|
30
|
+
readonly next_available_at: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Interface defining the storage operations for a rate limiter.
|
|
34
|
+
* This separates the storage concerns from the rate limiting logic.
|
|
35
|
+
*/
|
|
36
|
+
export interface IRateLimiterStorage {
|
|
37
|
+
/**
|
|
38
|
+
* Sets up the database schema and tables.
|
|
39
|
+
* This method should be called before using the storage.
|
|
40
|
+
* For production use, database setup should be done via migrations.
|
|
41
|
+
*/
|
|
42
|
+
setupDatabase(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Records a job execution for rate limiting tracking.
|
|
45
|
+
* @param queueName - The name of the queue
|
|
46
|
+
*/
|
|
47
|
+
recordExecution(queueName: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Gets the count of executions within a time window.
|
|
50
|
+
* @param queueName - The name of the queue
|
|
51
|
+
* @param windowStartTime - The start of the time window (ISO string)
|
|
52
|
+
* @returns The count of executions within the window
|
|
53
|
+
*/
|
|
54
|
+
getExecutionCount(queueName: string, windowStartTime: string): Promise<number>;
|
|
55
|
+
/**
|
|
56
|
+
* Gets the oldest execution time within the window, offset by a count.
|
|
57
|
+
* Used to calculate when the rate limit will allow the next execution.
|
|
58
|
+
* @param queueName - The name of the queue
|
|
59
|
+
* @param offset - The offset (typically maxExecutions - 1)
|
|
60
|
+
* @returns The execution time or undefined if not enough executions
|
|
61
|
+
*/
|
|
62
|
+
getOldestExecutionAtOffset(queueName: string, offset: number): Promise<string | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* Gets the next available time for a queue.
|
|
65
|
+
* @param queueName - The name of the queue
|
|
66
|
+
* @returns The next available time or undefined if not set
|
|
67
|
+
*/
|
|
68
|
+
getNextAvailableTime(queueName: string): Promise<string | undefined>;
|
|
69
|
+
/**
|
|
70
|
+
* Sets the next available time for a queue.
|
|
71
|
+
* @param queueName - The name of the queue
|
|
72
|
+
* @param nextAvailableAt - The next available time (ISO string)
|
|
73
|
+
*/
|
|
74
|
+
setNextAvailableTime(queueName: string, nextAvailableAt: string): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Clears all rate limit entries for a queue.
|
|
77
|
+
* @param queueName - The name of the queue
|
|
78
|
+
*/
|
|
79
|
+
clear(queueName: string): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=IRateLimiterStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IRateLimiterStorage.d.ts","sourceRoot":"","sources":["../../src/limiter/IRateLimiterStorage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,eAAO,MAAM,oBAAoB,4DAAiE,CAAC;AAEnG;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,wCAAwC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;CACnE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD;;;;;OAKG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/E;;;;;;OAMG;IACH,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAE3F;;;;OAIG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAErE;;;;OAIG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhF;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { IRateLimiterStorage, RateLimiterStorageOptions } from "./IRateLimiterStorage";
|
|
7
|
+
export declare const IN_MEMORY_RATE_LIMITER_STORAGE: import("@workglow/util").ServiceToken<IRateLimiterStorage>;
|
|
8
|
+
/**
|
|
9
|
+
* In-memory implementation of rate limiter storage.
|
|
10
|
+
* Manages execution records and next available times for rate limiting.
|
|
11
|
+
*/
|
|
12
|
+
export declare class InMemoryRateLimiterStorage implements IRateLimiterStorage {
|
|
13
|
+
/** The prefix values for filtering */
|
|
14
|
+
protected readonly prefixValues: Readonly<Record<string, string | number>>;
|
|
15
|
+
/** Execution records keyed by a composite of prefix values and queue name */
|
|
16
|
+
private readonly executions;
|
|
17
|
+
/** Next available times keyed by a composite of prefix values and queue name */
|
|
18
|
+
private readonly nextAvailableTimes;
|
|
19
|
+
constructor(options?: RateLimiterStorageOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Creates a storage key from the queue name and prefix values.
|
|
22
|
+
*/
|
|
23
|
+
private makeKey;
|
|
24
|
+
setupDatabase(): Promise<void>;
|
|
25
|
+
recordExecution(queueName: string): Promise<void>;
|
|
26
|
+
getExecutionCount(queueName: string, windowStartTime: string): Promise<number>;
|
|
27
|
+
getOldestExecutionAtOffset(queueName: string, offset: number): Promise<string | undefined>;
|
|
28
|
+
getNextAvailableTime(queueName: string): Promise<string | undefined>;
|
|
29
|
+
setNextAvailableTime(queueName: string, nextAvailableAt: string): Promise<void>;
|
|
30
|
+
clear(queueName: string): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=InMemoryRateLimiterStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryRateLimiterStorage.d.ts","sourceRoot":"","sources":["../../src/limiter/InMemoryRateLimiterStorage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,eAAO,MAAM,8BAA8B,4DAE1C,CAAC;AAUF;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,mBAAmB;IACpE,sCAAsC;IACtC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IAE3E,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAEvE,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgC;gBAEvD,OAAO,CAAC,EAAE,yBAAyB;IAI/C;;OAEG;IACH,OAAO,CAAC,OAAO;IAQF,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9E,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IASjB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAOpE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMrD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { MigrationOptions } from "../util/IndexedDbTable";
|
|
7
|
+
import type { PrefixColumn } from "../queue/IQueueStorage";
|
|
8
|
+
import { IRateLimiterStorage, RateLimiterStorageOptions } from "./IRateLimiterStorage";
|
|
9
|
+
export declare const INDEXED_DB_RATE_LIMITER_STORAGE: import("@workglow/util").ServiceToken<IRateLimiterStorage>;
|
|
10
|
+
/**
|
|
11
|
+
* Extended options for IndexedDB rate limiter storage including prefix support.
|
|
12
|
+
*/
|
|
13
|
+
export interface IndexedDbRateLimiterStorageOptions extends RateLimiterStorageOptions, MigrationOptions {
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* IndexedDB implementation of rate limiter storage.
|
|
17
|
+
* Manages execution records and next available times for rate limiting.
|
|
18
|
+
*/
|
|
19
|
+
export declare class IndexedDbRateLimiterStorage implements IRateLimiterStorage {
|
|
20
|
+
private executionDb;
|
|
21
|
+
private nextAvailableDb;
|
|
22
|
+
private readonly executionTableName;
|
|
23
|
+
private readonly nextAvailableTableName;
|
|
24
|
+
private readonly migrationOptions;
|
|
25
|
+
/** The prefix column definitions */
|
|
26
|
+
protected readonly prefixes: readonly PrefixColumn[];
|
|
27
|
+
/** The prefix values for filtering */
|
|
28
|
+
protected readonly prefixValues: Readonly<Record<string, string | number>>;
|
|
29
|
+
constructor(options?: IndexedDbRateLimiterStorageOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Gets prefix column names for use in indexes.
|
|
32
|
+
*/
|
|
33
|
+
private getPrefixColumnNames;
|
|
34
|
+
/**
|
|
35
|
+
* Checks if a record matches the current prefix values.
|
|
36
|
+
*/
|
|
37
|
+
private matchesPrefixes;
|
|
38
|
+
/**
|
|
39
|
+
* Gets prefix values as an array in column order for index key construction.
|
|
40
|
+
*/
|
|
41
|
+
private getPrefixKeyValues;
|
|
42
|
+
private getExecutionDb;
|
|
43
|
+
private getNextAvailableDb;
|
|
44
|
+
setupDatabase(): Promise<void>;
|
|
45
|
+
recordExecution(queueName: string): Promise<void>;
|
|
46
|
+
getExecutionCount(queueName: string, windowStartTime: string): Promise<number>;
|
|
47
|
+
getOldestExecutionAtOffset(queueName: string, offset: number): Promise<string | undefined>;
|
|
48
|
+
getNextAvailableTime(queueName: string): Promise<string | undefined>;
|
|
49
|
+
setNextAvailableTime(queueName: string, nextAvailableAt: string): Promise<void>;
|
|
50
|
+
clear(queueName: string): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=IndexedDbRateLimiterStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedDbRateLimiterStorage.d.ts","sourceRoot":"","sources":["../../src/limiter/IndexedDbRateLimiterStorage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAGL,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,eAAO,MAAM,+BAA+B,4DAE3C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kCACf,SAAQ,yBAAyB,EAAE,gBAAgB;CAAG;AAqBxD;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,mBAAmB;IACrE,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,oCAAoC;IACpC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IACrD,sCAAsC;IACtC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;gBAE/D,OAAO,GAAE,kCAAuC;IAgB5D;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAIZ,cAAc;YAMd,kBAAkB;IAMnB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC9B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkC9E,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAoCjB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAsBpE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4CrD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Pool } from "pg";
|
|
7
|
+
import type { PrefixColumn } from "../queue/IQueueStorage";
|
|
8
|
+
import { IRateLimiterStorage, RateLimiterStorageOptions } from "./IRateLimiterStorage";
|
|
9
|
+
export declare const POSTGRES_RATE_LIMITER_STORAGE: import("@workglow/util").ServiceToken<IRateLimiterStorage>;
|
|
10
|
+
/**
|
|
11
|
+
* PostgreSQL implementation of rate limiter storage.
|
|
12
|
+
* Manages execution records and next available times for rate limiting.
|
|
13
|
+
*/
|
|
14
|
+
export declare class PostgresRateLimiterStorage implements IRateLimiterStorage {
|
|
15
|
+
protected readonly db: Pool;
|
|
16
|
+
/** The prefix column definitions */
|
|
17
|
+
protected readonly prefixes: readonly PrefixColumn[];
|
|
18
|
+
/** The prefix values for filtering */
|
|
19
|
+
protected readonly prefixValues: Readonly<Record<string, string | number>>;
|
|
20
|
+
/** The table name for execution tracking */
|
|
21
|
+
protected readonly executionTableName: string;
|
|
22
|
+
/** The table name for next available times */
|
|
23
|
+
protected readonly nextAvailableTableName: string;
|
|
24
|
+
constructor(db: Pool, options?: RateLimiterStorageOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Gets the SQL column type for a prefix column.
|
|
27
|
+
*/
|
|
28
|
+
private getPrefixColumnType;
|
|
29
|
+
/**
|
|
30
|
+
* Builds the prefix columns SQL for CREATE TABLE.
|
|
31
|
+
*/
|
|
32
|
+
private buildPrefixColumnsSql;
|
|
33
|
+
/**
|
|
34
|
+
* Builds prefix column names for use in queries.
|
|
35
|
+
*/
|
|
36
|
+
private getPrefixColumnNames;
|
|
37
|
+
/**
|
|
38
|
+
* Builds WHERE clause conditions for prefix filtering.
|
|
39
|
+
* @param startParam - The starting parameter number for parameterized queries
|
|
40
|
+
*/
|
|
41
|
+
private buildPrefixWhereClause;
|
|
42
|
+
/**
|
|
43
|
+
* Gets prefix values as an array in column order.
|
|
44
|
+
*/
|
|
45
|
+
private getPrefixParamValues;
|
|
46
|
+
setupDatabase(): Promise<void>;
|
|
47
|
+
recordExecution(queueName: string): Promise<void>;
|
|
48
|
+
getExecutionCount(queueName: string, windowStartTime: string): Promise<number>;
|
|
49
|
+
getOldestExecutionAtOffset(queueName: string, offset: number): Promise<string | undefined>;
|
|
50
|
+
getNextAvailableTime(queueName: string): Promise<string | undefined>;
|
|
51
|
+
setNextAvailableTime(queueName: string, nextAvailableAt: string): Promise<void>;
|
|
52
|
+
clear(queueName: string): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=PostgresRateLimiterStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresRateLimiterStorage.d.ts","sourceRoot":"","sources":["../../src/limiter/PostgresRateLimiterStorage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,eAAO,MAAM,6BAA6B,4DAEzC,CAAC;AAEF;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,mBAAmB;IAWlE,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI;IAV7B,oCAAoC;IACpC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IACrD,sCAAsC;IACtC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IAC3E,4CAA4C;IAC5C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAC9C,8CAA8C;IAC9C,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;gBAG7B,EAAE,EAAE,IAAI,EAC3B,OAAO,CAAC,EAAE,yBAAyB;IAgBrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAIf,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC9B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe9E,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAmBjB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiBpE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAYrD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Sqlite } from "@workglow/sqlite";
|
|
7
|
+
import type { PrefixColumn } from "../queue/IQueueStorage";
|
|
8
|
+
import { IRateLimiterStorage, RateLimiterStorageOptions } from "./IRateLimiterStorage";
|
|
9
|
+
export declare const SQLITE_RATE_LIMITER_STORAGE: import("@workglow/util").ServiceToken<IRateLimiterStorage>;
|
|
10
|
+
/**
|
|
11
|
+
* SQLite implementation of rate limiter storage.
|
|
12
|
+
* Manages execution records and next available times for rate limiting.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SqliteRateLimiterStorage implements IRateLimiterStorage {
|
|
15
|
+
protected readonly db: Sqlite.Database;
|
|
16
|
+
/** The prefix column definitions */
|
|
17
|
+
protected readonly prefixes: readonly PrefixColumn[];
|
|
18
|
+
/** The prefix values for filtering */
|
|
19
|
+
protected readonly prefixValues: Readonly<Record<string, string | number>>;
|
|
20
|
+
/** The table name for execution tracking */
|
|
21
|
+
protected readonly executionTableName: string;
|
|
22
|
+
/** The table name for next available times */
|
|
23
|
+
protected readonly nextAvailableTableName: string;
|
|
24
|
+
constructor(db: Sqlite.Database, options?: RateLimiterStorageOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Gets the SQL column type for a prefix column (SQLite uses TEXT for uuid).
|
|
27
|
+
*/
|
|
28
|
+
private getPrefixColumnType;
|
|
29
|
+
/**
|
|
30
|
+
* Builds the prefix columns SQL for CREATE TABLE.
|
|
31
|
+
*/
|
|
32
|
+
private buildPrefixColumnsSql;
|
|
33
|
+
/**
|
|
34
|
+
* Builds prefix column names for use in queries.
|
|
35
|
+
*/
|
|
36
|
+
private getPrefixColumnNames;
|
|
37
|
+
/**
|
|
38
|
+
* Builds WHERE clause conditions for prefix filtering.
|
|
39
|
+
*/
|
|
40
|
+
private buildPrefixWhereClause;
|
|
41
|
+
/**
|
|
42
|
+
* Gets prefix values as an array in column order.
|
|
43
|
+
*/
|
|
44
|
+
private getPrefixParamValues;
|
|
45
|
+
setupDatabase(): Promise<void>;
|
|
46
|
+
recordExecution(queueName: string): Promise<void>;
|
|
47
|
+
getExecutionCount(queueName: string, windowStartTime: string): Promise<number>;
|
|
48
|
+
getOldestExecutionAtOffset(queueName: string, offset: number): Promise<string | undefined>;
|
|
49
|
+
getNextAvailableTime(queueName: string): Promise<string | undefined>;
|
|
50
|
+
setNextAvailableTime(queueName: string, nextAvailableAt: string): Promise<void>;
|
|
51
|
+
clear(queueName: string): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=SqliteRateLimiterStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqliteRateLimiterStorage.d.ts","sourceRoot":"","sources":["../../src/limiter/SqliteRateLimiterStorage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,eAAO,MAAM,2BAA2B,4DAEvC,CAAC;AAEF;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAWhE,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ;IAVxC,oCAAoC;IACpC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IACrD,sCAAsC;IACtC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IAC3E,4CAA4C;IAC5C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAC9C,8CAA8C;IAC9C,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;gBAG7B,EAAE,EAAE,MAAM,CAAC,QAAQ,EACtC,OAAO,CAAC,EAAE,yBAAyB;IAgBrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAIf,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc9E,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiBjB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAepE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWrD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
7
|
+
import type { PrefixColumn } from "../queue/IQueueStorage";
|
|
8
|
+
import { IRateLimiterStorage, RateLimiterStorageOptions } from "./IRateLimiterStorage";
|
|
9
|
+
export declare const SUPABASE_RATE_LIMITER_STORAGE: import("@workglow/util").ServiceToken<IRateLimiterStorage>;
|
|
10
|
+
/**
|
|
11
|
+
* Supabase implementation of rate limiter storage.
|
|
12
|
+
* Manages execution records and next available times for rate limiting.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SupabaseRateLimiterStorage implements IRateLimiterStorage {
|
|
15
|
+
protected readonly client: SupabaseClient;
|
|
16
|
+
/** The prefix column definitions */
|
|
17
|
+
protected readonly prefixes: readonly PrefixColumn[];
|
|
18
|
+
/** The prefix values for filtering */
|
|
19
|
+
protected readonly prefixValues: Readonly<Record<string, string | number>>;
|
|
20
|
+
/** The table name for execution tracking */
|
|
21
|
+
protected readonly executionTableName: string;
|
|
22
|
+
/** The table name for next available times */
|
|
23
|
+
protected readonly nextAvailableTableName: string;
|
|
24
|
+
constructor(client: SupabaseClient, options?: RateLimiterStorageOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Gets the SQL column type for a prefix column (Supabase supports UUID natively).
|
|
27
|
+
*/
|
|
28
|
+
private getPrefixColumnType;
|
|
29
|
+
/**
|
|
30
|
+
* Builds the prefix columns SQL for CREATE TABLE.
|
|
31
|
+
*/
|
|
32
|
+
private buildPrefixColumnsSql;
|
|
33
|
+
/**
|
|
34
|
+
* Builds prefix column names for use in queries.
|
|
35
|
+
*/
|
|
36
|
+
private getPrefixColumnNames;
|
|
37
|
+
/**
|
|
38
|
+
* Applies prefix filters to a Supabase query builder.
|
|
39
|
+
*/
|
|
40
|
+
private applyPrefixFilters;
|
|
41
|
+
/**
|
|
42
|
+
* Gets prefix values as an object for inserts.
|
|
43
|
+
*/
|
|
44
|
+
private getPrefixInsertValues;
|
|
45
|
+
setupDatabase(): Promise<void>;
|
|
46
|
+
recordExecution(queueName: string): Promise<void>;
|
|
47
|
+
getExecutionCount(queueName: string, windowStartTime: string): Promise<number>;
|
|
48
|
+
getOldestExecutionAtOffset(queueName: string, offset: number): Promise<string | undefined>;
|
|
49
|
+
getNextAvailableTime(queueName: string): Promise<string | undefined>;
|
|
50
|
+
setNextAvailableTime(queueName: string, nextAvailableAt: string): Promise<void>;
|
|
51
|
+
clear(queueName: string): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=SupabaseRateLimiterStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseRateLimiterStorage.d.ts","sourceRoot":"","sources":["../../src/limiter/SupabaseRateLimiterStorage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,eAAO,MAAM,6BAA6B,4DAEzC,CAAC;AAEF;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,mBAAmB;IAWlE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc;IAV3C,oCAAoC;IACpC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IACrD,sCAAsC;IACtC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IAC3E,4CAA4C;IAC5C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAC9C,8CAA8C;IAC9C,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;gBAG7B,MAAM,EAAE,cAAc,EACzC,OAAO,CAAC,EAAE,yBAAyB;IAgBrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQhB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAmD9B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe9E,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiBjB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAmBpE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcrD"}
|