@commandkit/ratelimit 0.0.0-dev.20260317060555

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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +801 -0
  3. package/dist/api.d.ts +79 -0
  4. package/dist/api.js +266 -0
  5. package/dist/augmentation.d.ts +11 -0
  6. package/dist/augmentation.js +8 -0
  7. package/dist/configure.d.ts +28 -0
  8. package/dist/configure.js +85 -0
  9. package/dist/constants.d.ts +17 -0
  10. package/dist/constants.js +21 -0
  11. package/dist/directive/use-ratelimit-directive.d.ts +22 -0
  12. package/dist/directive/use-ratelimit-directive.js +38 -0
  13. package/dist/directive/use-ratelimit.d.ts +14 -0
  14. package/dist/directive/use-ratelimit.js +169 -0
  15. package/dist/engine/RateLimitEngine.d.ts +48 -0
  16. package/dist/engine/RateLimitEngine.js +137 -0
  17. package/dist/engine/algorithms/fixed-window.d.ts +44 -0
  18. package/dist/engine/algorithms/fixed-window.js +198 -0
  19. package/dist/engine/algorithms/leaky-bucket.d.ts +48 -0
  20. package/dist/engine/algorithms/leaky-bucket.js +119 -0
  21. package/dist/engine/algorithms/sliding-window.d.ts +45 -0
  22. package/dist/engine/algorithms/sliding-window.js +127 -0
  23. package/dist/engine/algorithms/token-bucket.d.ts +47 -0
  24. package/dist/engine/algorithms/token-bucket.js +118 -0
  25. package/dist/engine/violations.d.ts +55 -0
  26. package/dist/engine/violations.js +106 -0
  27. package/dist/errors.d.ts +21 -0
  28. package/dist/errors.js +28 -0
  29. package/dist/index.d.ts +31 -0
  30. package/dist/index.js +53 -0
  31. package/dist/plugin.d.ts +140 -0
  32. package/dist/plugin.js +796 -0
  33. package/dist/providers/fallback.d.ts +7 -0
  34. package/dist/providers/fallback.js +11 -0
  35. package/dist/providers/memory.d.ts +6 -0
  36. package/dist/providers/memory.js +11 -0
  37. package/dist/providers/redis.d.ts +7 -0
  38. package/dist/providers/redis.js +11 -0
  39. package/dist/runtime.d.ts +45 -0
  40. package/dist/runtime.js +67 -0
  41. package/dist/storage/fallback.d.ts +180 -0
  42. package/dist/storage/fallback.js +261 -0
  43. package/dist/storage/memory.d.ts +146 -0
  44. package/dist/storage/memory.js +304 -0
  45. package/dist/storage/redis.d.ts +130 -0
  46. package/dist/storage/redis.js +243 -0
  47. package/dist/types.d.ts +296 -0
  48. package/dist/types.js +40 -0
  49. package/dist/utils/config.d.ts +34 -0
  50. package/dist/utils/config.js +105 -0
  51. package/dist/utils/keys.d.ts +102 -0
  52. package/dist/utils/keys.js +304 -0
  53. package/dist/utils/locking.d.ts +17 -0
  54. package/dist/utils/locking.js +60 -0
  55. package/dist/utils/time.d.ts +23 -0
  56. package/dist/utils/time.js +72 -0
  57. package/package.json +65 -0
package/dist/api.d.ts ADDED
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Public rate limit helpers.
3
+ *
4
+ * Used by handlers and admin tools to inspect, reset, and manage exemptions.
5
+ */
6
+ import type { CommandKitEnvironment, Context } from 'commandkit';
7
+ import type { RateLimitExemptionGrantParams, RateLimitExemptionInfo, RateLimitExemptionListParams, RateLimitExemptionRevokeParams, RateLimitScope, RateLimitStoreValue } from './types';
8
+ /**
9
+ * Parameters for resetting a single key or scope-derived key.
10
+ */
11
+ export interface ResetRateLimitParams {
12
+ key?: string;
13
+ scope?: RateLimitScope;
14
+ userId?: string;
15
+ guildId?: string;
16
+ channelId?: string;
17
+ commandName?: string;
18
+ keyPrefix?: string;
19
+ }
20
+ /**
21
+ * Parameters for batch resets by scope, prefix, or pattern.
22
+ */
23
+ export interface ResetAllRateLimitsParams {
24
+ scope?: RateLimitScope;
25
+ userId?: string;
26
+ guildId?: string;
27
+ channelId?: string;
28
+ commandName?: string;
29
+ keyPrefix?: string;
30
+ pattern?: string;
31
+ prefix?: string;
32
+ }
33
+ /**
34
+ * Read aggregated rate limit info stored on a CommandKit env or context.
35
+ *
36
+ * @param envOrCtx - CommandKit environment or context holding the rate-limit store.
37
+ * @returns Aggregated rate-limit info or null when no store is present.
38
+ */
39
+ export declare function getRateLimitInfo(envOrCtx: CommandKitEnvironment | Context | null | undefined): RateLimitStoreValue | null;
40
+ /**
41
+ * Reset a single key and its violation/window variants to keep state consistent.
42
+ *
43
+ * @param params - Reset parameters for a single key or scope-derived key.
44
+ * @returns Resolves when deletes and reset hooks (if any) complete.
45
+ * @throws Error when required scope identifiers are missing.
46
+ */
47
+ export declare function resetRateLimit(params: ResetRateLimitParams): Promise<void>;
48
+ /**
49
+ * Reset multiple keys by scope, command name, prefix, or pattern for bulk cleanup.
50
+ *
51
+ * @param params - Batch reset parameters, defaulting to an empty config.
52
+ * @returns Resolves when all matching keys are deleted.
53
+ * @throws Error when the storage backend lacks required delete helpers.
54
+ * @throws Error when scope identifiers are missing for scope-based resets.
55
+ */
56
+ export declare function resetAllRateLimits(params?: ResetAllRateLimitsParams): Promise<void>;
57
+ /**
58
+ * Grant a temporary exemption for a scope/id pair.
59
+ *
60
+ * @param params - Exemption scope, id, and duration.
61
+ * @returns Resolves when the exemption key is written.
62
+ * @throws Error when duration is missing or non-positive.
63
+ */
64
+ export declare function grantRateLimitExemption(params: RateLimitExemptionGrantParams): Promise<void>;
65
+ /**
66
+ * Revoke a temporary exemption for a scope/id pair.
67
+ *
68
+ * @param params - Exemption scope and id to revoke.
69
+ * @returns Resolves when the exemption key is removed.
70
+ */
71
+ export declare function revokeRateLimitExemption(params: RateLimitExemptionRevokeParams): Promise<void>;
72
+ /**
73
+ * List exemptions by scope and/or id for admin/reporting.
74
+ *
75
+ * @param params - Optional scope/id filters and limits.
76
+ * @returns Exemption info entries that match the requested filters.
77
+ * @throws Error when scope is required but missing or listing is unsupported.
78
+ */
79
+ export declare function listRateLimitExemptions(params?: RateLimitExemptionListParams): Promise<RateLimitExemptionInfo[]>;
package/dist/api.js ADDED
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ /**
3
+ * Public rate limit helpers.
4
+ *
5
+ * Used by handlers and admin tools to inspect, reset, and manage exemptions.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.getRateLimitInfo = getRateLimitInfo;
9
+ exports.resetRateLimit = resetRateLimit;
10
+ exports.resetAllRateLimits = resetAllRateLimits;
11
+ exports.grantRateLimitExemption = grantRateLimitExemption;
12
+ exports.revokeRateLimitExemption = revokeRateLimitExemption;
13
+ exports.listRateLimitExemptions = listRateLimitExemptions;
14
+ const constants_1 = require("./constants");
15
+ const runtime_1 = require("./runtime");
16
+ const keys_1 = require("./utils/keys");
17
+ const time_1 = require("./utils/time");
18
+ /**
19
+ * Read aggregated rate limit info stored on a CommandKit env or context.
20
+ *
21
+ * @param envOrCtx - CommandKit environment or context holding the rate-limit store.
22
+ * @returns Aggregated rate-limit info or null when no store is present.
23
+ */
24
+ function getRateLimitInfo(envOrCtx) {
25
+ if (!envOrCtx)
26
+ return null;
27
+ const store = 'store' in envOrCtx ? envOrCtx.store : null;
28
+ if (!store)
29
+ return null;
30
+ return store.get(constants_1.RATELIMIT_STORE_KEY) ?? null;
31
+ }
32
+ /**
33
+ * Resolve the active storage or throw when none is configured.
34
+ *
35
+ * @returns Configured rate-limit storage.
36
+ * @throws Error when storage is not configured.
37
+ */
38
+ function getRequiredStorage() {
39
+ return getRuntimeStorage().storage;
40
+ }
41
+ /**
42
+ * Resolve runtime context plus the effective storage to use.
43
+ *
44
+ * @returns Runtime context (if any) and the resolved storage.
45
+ * @throws Error when storage is not configured.
46
+ */
47
+ function getRuntimeStorage() {
48
+ const runtime = (0, runtime_1.getRateLimitRuntime)();
49
+ const storage = runtime?.storage ?? (0, runtime_1.getRateLimitStorage)();
50
+ if (!storage) {
51
+ throw new Error('Rate limit storage not configured');
52
+ }
53
+ return { runtime, storage };
54
+ }
55
+ /**
56
+ * Normalize a prefix to include the window suffix marker.
57
+ *
58
+ * @param prefix - Base key prefix.
59
+ * @returns Prefix guaranteed to end with `w:`.
60
+ */
61
+ function toWindowPrefix(prefix) {
62
+ return prefix.endsWith(':') ? `${prefix}w:` : `${prefix}:w:`;
63
+ }
64
+ /**
65
+ * Reset a single key and its violation/window variants to keep state consistent.
66
+ *
67
+ * @param params - Reset parameters for a single key or scope-derived key.
68
+ * @returns Resolves when deletes and reset hooks (if any) complete.
69
+ * @throws Error when required scope identifiers are missing.
70
+ */
71
+ async function resetRateLimit(params) {
72
+ const storage = getRequiredStorage();
73
+ const hooks = (0, runtime_1.getRateLimitRuntime)()?.hooks;
74
+ if (params.key) {
75
+ await storage.delete(params.key);
76
+ await storage.delete(`violation:${params.key}`);
77
+ await deleteWindowVariants(storage, params.key);
78
+ if (hooks?.onReset) {
79
+ await hooks.onReset(params.key);
80
+ }
81
+ return;
82
+ }
83
+ if (!params.scope || !params.commandName) {
84
+ throw new Error('scope and commandName are required when key is not provided');
85
+ }
86
+ const prefix = (0, keys_1.buildScopePrefix)(params.scope, params.keyPrefix, {
87
+ userId: params.userId,
88
+ guildId: params.guildId,
89
+ channelId: params.channelId,
90
+ });
91
+ if (!prefix) {
92
+ throw new Error('Missing identifiers for scope');
93
+ }
94
+ const key = `${prefix}${params.commandName}`;
95
+ await storage.delete(key);
96
+ await storage.delete(`violation:${key}`);
97
+ await deleteWindowVariants(storage, key);
98
+ if (hooks?.onReset) {
99
+ await hooks.onReset(key);
100
+ }
101
+ }
102
+ /**
103
+ * Reset multiple keys by scope, command name, prefix, or pattern for bulk cleanup.
104
+ *
105
+ * @param params - Batch reset parameters, defaulting to an empty config.
106
+ * @returns Resolves when all matching keys are deleted.
107
+ * @throws Error when the storage backend lacks required delete helpers.
108
+ * @throws Error when scope identifiers are missing for scope-based resets.
109
+ */
110
+ async function resetAllRateLimits(params = {}) {
111
+ const storage = getRequiredStorage();
112
+ if (params.pattern) {
113
+ if (!storage.deleteByPattern) {
114
+ throw new Error('Storage does not support pattern deletes');
115
+ }
116
+ await storage.deleteByPattern(params.pattern);
117
+ await storage.deleteByPattern(`violation:${params.pattern}`);
118
+ await storage.deleteByPattern(`${params.pattern}:w:*`);
119
+ await storage.deleteByPattern(`violation:${params.pattern}:w:*`);
120
+ return;
121
+ }
122
+ if (params.prefix) {
123
+ if (!storage.deleteByPrefix) {
124
+ throw new Error('Storage does not support prefix deletes');
125
+ }
126
+ const windowPrefix = toWindowPrefix(params.prefix);
127
+ await storage.deleteByPrefix(params.prefix);
128
+ await storage.deleteByPrefix(`violation:${params.prefix}`);
129
+ await storage.deleteByPrefix(windowPrefix);
130
+ await storage.deleteByPrefix(`violation:${windowPrefix}`);
131
+ return;
132
+ }
133
+ if (params.commandName) {
134
+ if (!storage.deleteByPattern) {
135
+ throw new Error('Storage does not support pattern deletes');
136
+ }
137
+ const prefix = params.keyPrefix ?? '';
138
+ const pattern = `${prefix}*:${params.commandName}`;
139
+ await storage.deleteByPattern(pattern);
140
+ await storage.deleteByPattern(`violation:${pattern}`);
141
+ await storage.deleteByPattern(`${pattern}:w:*`);
142
+ await storage.deleteByPattern(`violation:${pattern}:w:*`);
143
+ return;
144
+ }
145
+ if (!params.scope) {
146
+ throw new Error('scope is required when commandName is not provided');
147
+ }
148
+ const scopePrefix = (0, keys_1.buildScopePrefix)(params.scope, params.keyPrefix, {
149
+ userId: params.userId,
150
+ guildId: params.guildId,
151
+ channelId: params.channelId,
152
+ });
153
+ if (!scopePrefix) {
154
+ throw new Error('Missing identifiers for scope');
155
+ }
156
+ if (!storage.deleteByPrefix) {
157
+ throw new Error('Storage does not support prefix deletes');
158
+ }
159
+ const windowPrefix = toWindowPrefix(scopePrefix);
160
+ await storage.deleteByPrefix(scopePrefix);
161
+ await storage.deleteByPrefix(`violation:${scopePrefix}`);
162
+ await storage.deleteByPrefix(windowPrefix);
163
+ await storage.deleteByPrefix(`violation:${windowPrefix}`);
164
+ }
165
+ /**
166
+ * Grant a temporary exemption for a scope/id pair.
167
+ *
168
+ * @param params - Exemption scope, id, and duration.
169
+ * @returns Resolves when the exemption key is written.
170
+ * @throws Error when duration is missing or non-positive.
171
+ */
172
+ async function grantRateLimitExemption(params) {
173
+ const { runtime, storage } = getRuntimeStorage();
174
+ const keyPrefix = params.keyPrefix ?? runtime?.keyPrefix;
175
+ const ttlMs = (0, time_1.resolveDuration)(params.duration, 0);
176
+ if (!ttlMs || ttlMs <= 0) {
177
+ throw new Error('duration must be a positive value');
178
+ }
179
+ const key = (0, keys_1.buildExemptionKey)(params.scope, params.id, keyPrefix);
180
+ await storage.set(key, true, ttlMs);
181
+ }
182
+ /**
183
+ * Revoke a temporary exemption for a scope/id pair.
184
+ *
185
+ * @param params - Exemption scope and id to revoke.
186
+ * @returns Resolves when the exemption key is removed.
187
+ */
188
+ async function revokeRateLimitExemption(params) {
189
+ const { runtime, storage } = getRuntimeStorage();
190
+ const keyPrefix = params.keyPrefix ?? runtime?.keyPrefix;
191
+ const key = (0, keys_1.buildExemptionKey)(params.scope, params.id, keyPrefix);
192
+ await storage.delete(key);
193
+ }
194
+ /**
195
+ * List exemptions by scope and/or id for admin/reporting.
196
+ *
197
+ * @param params - Optional scope/id filters and limits.
198
+ * @returns Exemption info entries that match the requested filters.
199
+ * @throws Error when scope is required but missing or listing is unsupported.
200
+ */
201
+ async function listRateLimitExemptions(params = {}) {
202
+ const { runtime, storage } = getRuntimeStorage();
203
+ const keyPrefix = params.keyPrefix ?? runtime?.keyPrefix;
204
+ if (params.id && !params.scope) {
205
+ throw new Error('scope is required when id is provided');
206
+ }
207
+ if (params.scope && params.id) {
208
+ const key = (0, keys_1.buildExemptionKey)(params.scope, params.id, keyPrefix);
209
+ const exists = await storage.get(key);
210
+ if (!exists)
211
+ return [];
212
+ const expiresInMs = storage.ttl ? await storage.ttl(key) : null;
213
+ return [
214
+ {
215
+ key,
216
+ scope: params.scope,
217
+ id: params.id,
218
+ expiresInMs,
219
+ },
220
+ ];
221
+ }
222
+ if (!storage.keysByPrefix) {
223
+ throw new Error('Storage does not support listing exemptions');
224
+ }
225
+ const prefix = (0, keys_1.buildExemptionPrefix)(keyPrefix, params.scope);
226
+ const keys = await storage.keysByPrefix(prefix);
227
+ const results = [];
228
+ for (const key of keys) {
229
+ const parsed = (0, keys_1.parseExemptionKey)(key, keyPrefix);
230
+ if (!parsed)
231
+ continue;
232
+ if (params.scope && parsed.scope !== params.scope)
233
+ continue;
234
+ const expiresInMs = storage.ttl ? await storage.ttl(key) : null;
235
+ results.push({
236
+ key,
237
+ scope: parsed.scope,
238
+ id: parsed.id,
239
+ expiresInMs,
240
+ });
241
+ if (params.limit && results.length >= params.limit) {
242
+ break;
243
+ }
244
+ }
245
+ return results;
246
+ }
247
+ /**
248
+ * Delete windowed variants for a base key using available storage helpers.
249
+ *
250
+ * @param storage - Storage driver to delete from.
251
+ * @param key - Base key to delete window variants for.
252
+ * @returns Resolves after window variants are removed.
253
+ */
254
+ async function deleteWindowVariants(storage, key) {
255
+ const prefix = `${key}:w:`;
256
+ if (storage.deleteByPrefix) {
257
+ await storage.deleteByPrefix(prefix);
258
+ await storage.deleteByPrefix(`violation:${prefix}`);
259
+ return;
260
+ }
261
+ if (storage.deleteByPattern) {
262
+ await storage.deleteByPattern(`${key}:w:*`);
263
+ await storage.deleteByPattern(`violation:${key}:w:*`);
264
+ }
265
+ }
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7QUF1REgsNENBT0M7QUErQ0Qsd0NBdUNDO0FBVUQsZ0RBZ0VDO0FBU0QsMERBYUM7QUFRRCw0REFPQztBQVNELDBEQW9EQztBQTdURCwyQ0FBa0Q7QUFDbEQsdUNBQXFFO0FBVXJFLHVDQUtzQjtBQUN0Qix1Q0FBK0M7QUE2Qi9DOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLFFBQTREO0lBRTVELElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsT0FBUSxLQUFLLENBQUMsR0FBRyxDQUFDLCtCQUFtQixDQUF5QixJQUFJLElBQUksQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQjtJQUN6QixPQUFPLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDO0FBQ3JDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCO0lBSXhCLE1BQU0sT0FBTyxHQUFHLElBQUEsNkJBQW1CLEdBQUUsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUEsNkJBQW1CLEdBQUUsQ0FBQztJQUMxRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxj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
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CommandKit metadata augmentation.
3
+ *
4
+ * Extends CommandKit metadata so commands can declare per-command limits.
5
+ */
6
+ import type { RateLimitCommandConfig } from './types';
7
+ declare module 'commandkit' {
8
+ interface CommandMetadata {
9
+ ratelimit?: RateLimitCommandConfig | boolean;
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * CommandKit metadata augmentation.
4
+ *
5
+ * Extends CommandKit metadata so commands can declare per-command limits.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVnbWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2F1Z21lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRyJ9
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Runtime configuration for the rate limit plugin.
3
+ *
4
+ * Mirrors configureAI so runtime options can be set outside commandkit.config
5
+ * before the plugin evaluates commands.
6
+ */
7
+ import type { RateLimitPluginOptions } from './types';
8
+ /**
9
+ * Returns true once configureRatelimit has been called.
10
+ *
11
+ * @returns True when runtime configuration has been initialized.
12
+ */
13
+ export declare function isRateLimitConfigured(): boolean;
14
+ /**
15
+ * Retrieves the current rate limit configuration.
16
+ *
17
+ * @returns The current in-memory rate limit config object.
18
+ */
19
+ export declare function getRateLimitConfig(): RateLimitPluginOptions;
20
+ /**
21
+ * Configures the rate limit plugin runtime options.
22
+ *
23
+ * Call this once during startup (for example in src/ratelimit.ts).
24
+ *
25
+ * @param config - Runtime options to merge into the active configuration.
26
+ * @returns Nothing; updates runtime state in place.
27
+ */
28
+ export declare function configureRatelimit(config?: RateLimitPluginOptions): void;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Runtime configuration for the rate limit plugin.
4
+ *
5
+ * Mirrors configureAI so runtime options can be set outside commandkit.config
6
+ * before the plugin evaluates commands.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.isRateLimitConfigured = isRateLimitConfigured;
10
+ exports.getRateLimitConfig = getRateLimitConfig;
11
+ exports.configureRatelimit = configureRatelimit;
12
+ const config_1 = require("./utils/config");
13
+ const runtime_1 = require("./runtime");
14
+ const rateLimitConfig = {};
15
+ let configured = false;
16
+ /**
17
+ * Normalize a storage config into a storage driver instance.
18
+ *
19
+ * @param config - Storage config or driver.
20
+ * @returns Storage driver instance or null when not configured.
21
+ */
22
+ function resolveStorage(config) {
23
+ if (!config)
24
+ return null;
25
+ if (typeof config === 'object' && 'driver' in config) {
26
+ return config.driver;
27
+ }
28
+ return config;
29
+ }
30
+ /**
31
+ * Apply updated config to the active runtime context.
32
+ *
33
+ * @param config - Runtime configuration updates.
34
+ * @returns Nothing; mutates the active runtime context when present.
35
+ */
36
+ function updateRuntime(config) {
37
+ const runtime = (0, runtime_1.getRateLimitRuntime)();
38
+ const storageOverride = config.storage
39
+ ? resolveStorage(config.storage)
40
+ : null;
41
+ if (storageOverride) {
42
+ (0, runtime_1.setRateLimitStorage)(storageOverride);
43
+ }
44
+ if (!runtime) {
45
+ return;
46
+ }
47
+ const nextRuntime = {
48
+ storage: storageOverride ?? runtime.storage,
49
+ keyPrefix: config.keyPrefix ?? runtime.keyPrefix,
50
+ defaultLimiter: config.defaultLimiter ?? runtime.defaultLimiter ?? config_1.DEFAULT_LIMITER,
51
+ limiters: config.limiters ?? runtime.limiters,
52
+ hooks: config.hooks ?? runtime.hooks,
53
+ };
54
+ (0, runtime_1.setRateLimitRuntime)(nextRuntime);
55
+ }
56
+ /**
57
+ * Returns true once configureRatelimit has been called.
58
+ *
59
+ * @returns True when runtime configuration has been initialized.
60
+ */
61
+ function isRateLimitConfigured() {
62
+ return configured;
63
+ }
64
+ /**
65
+ * Retrieves the current rate limit configuration.
66
+ *
67
+ * @returns The current in-memory rate limit config object.
68
+ */
69
+ function getRateLimitConfig() {
70
+ return rateLimitConfig;
71
+ }
72
+ /**
73
+ * Configures the rate limit plugin runtime options.
74
+ *
75
+ * Call this once during startup (for example in src/ratelimit.ts).
76
+ *
77
+ * @param config - Runtime options to merge into the active configuration.
78
+ * @returns Nothing; updates runtime state in place.
79
+ */
80
+ function configureRatelimit(config = {}) {
81
+ configured = true;
82
+ Object.assign(rateLimitConfig, config);
83
+ updateRuntime(config);
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZ3VyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBdUVILHNEQUVDO0FBT0QsZ0RBRUM7QUFVRCxnREFJQztBQTlGRCwyQ0FBaUQ7QUFDakQsdUNBSW1CO0FBUW5CLE1BQU0sZUFBZSxHQUEyQixFQUFFLENBQUM7QUFDbkQsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBRXZCOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQ3JCLE1BQThCO0lBRTlCLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3JELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxhQUFhLENBQUMsTUFBOEI7SUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBQSw2QkFBbUIsR0FBRSxDQUFDO0lBQ3RDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPO1FBQ3BDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRVQsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixJQUFBLDZCQUFtQixFQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUE0QjtRQUMzQyxPQUFPLEVBQUUsZUFBZSxJQUFJLE9BQU8sQ0FBQyxPQUFPO1FBQzNDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTO1FBQ2hELGNBQWMsRUFDWixNQUFNLENBQUMsY0FBYyxJQUFJLE9BQU8sQ0FBQyxjQUFjLElBQUksd0JBQWU7UUFDcEUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVE7UUFDN0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUs7S0FDckMsQ0FBQztJQUVGLElBQUEsNkJBQW1CLEVBQUMsV0FBVyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixxQkFBcUI7SUFDbkMsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixrQkFBa0I7SUFDaEMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxTQUFpQyxFQUFFO0lBQ3BFLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hCLENBQUMifQ==
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Rate limit constants shared across runtime and tests.
3
+ *
4
+ * Keeps key names consistent across storage, runtime, and docs.
5
+ */
6
+ /**
7
+ * Store key used to stash aggregated results in CommandKit envs.
8
+ *
9
+ * @default 'ratelimit'
10
+ */
11
+ export declare const RATELIMIT_STORE_KEY = "ratelimit";
12
+ /**
13
+ * Default prefix for storage keys; can be overridden per config.
14
+ *
15
+ * @default 'rl:'
16
+ */
17
+ export declare const DEFAULT_KEY_PREFIX = "rl:";
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Rate limit constants shared across runtime and tests.
4
+ *
5
+ * Keeps key names consistent across storage, runtime, and docs.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_KEY_PREFIX = exports.RATELIMIT_STORE_KEY = void 0;
9
+ /**
10
+ * Store key used to stash aggregated results in CommandKit envs.
11
+ *
12
+ * @default 'ratelimit'
13
+ */
14
+ exports.RATELIMIT_STORE_KEY = 'ratelimit';
15
+ /**
16
+ * Default prefix for storage keys; can be overridden per config.
17
+ *
18
+ * @default 'rl:'
19
+ */
20
+ exports.DEFAULT_KEY_PREFIX = 'rl:';
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUg7Ozs7R0FJRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBRS9DOzs7O0dBSUc7QUFDVSxRQUFBLGtCQUFrQixHQUFHLEtBQUssQ0FBQyJ9
@@ -0,0 +1,22 @@
1
+ import { CommonDirectiveTransformer, type CommonDirectiveTransformerOptions, type CompilerPluginRuntime } from 'commandkit';
2
+ /**
3
+ * Compiler plugin for the "use ratelimit" directive.
4
+ *
5
+ * @extends CommonDirectiveTransformer
6
+ */
7
+ export declare class UseRateLimitDirectivePlugin extends CommonDirectiveTransformer {
8
+ readonly name = "UseRateLimitDirectivePlugin";
9
+ /**
10
+ * Create the directive compiler plugin with optional overrides.
11
+ *
12
+ * @param options - Common directive transformer overrides.
13
+ */
14
+ constructor(options?: Partial<CommonDirectiveTransformerOptions>);
15
+ /**
16
+ * Activate the compiler plugin in the current build runtime.
17
+ *
18
+ * @param ctx - Compiler plugin runtime.
19
+ * @returns Resolves after activation completes.
20
+ */
21
+ activate(ctx: CompilerPluginRuntime): Promise<void>;
22
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UseRateLimitDirectivePlugin = void 0;
4
+ const commandkit_1 = require("commandkit");
5
+ /**
6
+ * Compiler plugin for the "use ratelimit" directive.
7
+ *
8
+ * @extends CommonDirectiveTransformer
9
+ */
10
+ class UseRateLimitDirectivePlugin extends commandkit_1.CommonDirectiveTransformer {
11
+ /**
12
+ * Create the directive compiler plugin with optional overrides.
13
+ *
14
+ * @param options - Common directive transformer overrides.
15
+ */
16
+ constructor(options) {
17
+ super({
18
+ enabled: true,
19
+ ...options,
20
+ directive: 'use ratelimit',
21
+ importPath: '@commandkit/ratelimit',
22
+ importName: '$ckitirl',
23
+ asyncOnly: true,
24
+ });
25
+ this.name = 'UseRateLimitDirectivePlugin';
26
+ }
27
+ /**
28
+ * Activate the compiler plugin in the current build runtime.
29
+ *
30
+ * @param ctx - Compiler plugin runtime.
31
+ * @returns Resolves after activation completes.
32
+ */
33
+ async activate(ctx) {
34
+ await super.activate(ctx);
35
+ }
36
+ }
37
+ exports.UseRateLimitDirectivePlugin = UseRateLimitDirectivePlugin;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXJhdGVsaW1pdC1kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlyZWN0aXZlL3VzZS1yYXRlbGltaXQtZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUlvQjtBQUVwQjs7OztHQUlHO0FBQ0gsTUFBYSwyQkFBNEIsU0FBUSx1Q0FBMEI7SUFHekU7Ozs7T0FJRztJQUNILFlBQW1CLE9BQW9EO1FBQ3JFLEtBQUssQ0FBQztZQUNKLE9BQU8sRUFBRSxJQUFJO1lBQ2IsR0FBRyxPQUFPO1lBQ1YsU0FBUyxFQUFFLGVBQWU7WUFDMUIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxVQUFVLEVBQUUsVUFBVTtZQUN0QixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFmVyxTQUFJLEdBQUcsNkJBQTZCLENBQUM7SUFnQnJELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBMEI7UUFDOUMsTUFBTSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQTVCRCxrRUE0QkMifQ==
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Runtime wrapper for the "use ratelimit" directive.
3
+ *
4
+ * Uses the runtime default limiter for arbitrary async functions.
5
+ * Throws RateLimitError when the call is limited.
6
+ */
7
+ import type { GenericFunction } from 'commandkit';
8
+ /**
9
+ * Wrapper symbol injected by the compiler plugin.
10
+ *
11
+ * @param fn - Generic function to wrap with runtime rate limiting.
12
+ * @returns Wrapped function that enforces the runtime default limiter.
13
+ */
14
+ export declare const $ckitirl: GenericFunction;