@defai.digital/cross-cutting 13.1.11 → 13.1.13

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/index.d.ts CHANGED
@@ -10,5 +10,6 @@ export { createDeadLetterQueue, createInMemoryDeadLetterStorage, DeadLetterQueue
10
10
  export { createSagaManager, defineSaga, SagaError, type SagaManager, type SagaStepExecutor, type CompensationExecutor, } from './saga-manager.js';
11
11
  export { createIdempotencyManager, createInMemoryIdempotencyStorage, withIdempotency, IdempotencyError, type IdempotencyManager, type IdempotencyStorage, } from './idempotency-manager.js';
12
12
  export { createRetentionManager, createInMemoryRetentionStore, createInMemoryArchiver, RetentionError, type RetentionManager, type RetentionStore, type RetentionEntry, type DataArchiver, } from './retention-manager.js';
13
+ export { createRateLimiterRegistry, RateLimiterRegistryError, RateLimiterRegistryErrorCodes, DEFAULT_PROVIDER_RATE_LIMITS, type RateLimiterRegistry, type RateLimitAcquireResult, type RateLimiterStats, type ProviderRateLimitConfig, type SessionQuotaConfig, type RateLimiterRegistryConfig, type BackoffStrategy, } from './rate-limiter-registry.js';
13
14
  export type { IdempotencyCheckResult, DLQStats, SagaResult, RetentionPolicy, RetentionRunResult, RetentionSummary, } from '@defai.digital/contracts';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,oBAAoB,EACpB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,eAAe,EACf,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EACV,sBAAsB,EACtB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,oBAAoB,EACpB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,eAAe,EACf,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,4BAA4B,EAC5B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,eAAe,GACrB,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EACV,sBAAsB,EACtB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -14,4 +14,6 @@ export { createSagaManager, defineSaga, SagaError, } from './saga-manager.js';
14
14
  export { createIdempotencyManager, createInMemoryIdempotencyStorage, withIdempotency, IdempotencyError, } from './idempotency-manager.js';
15
15
  // Retention Manager
16
16
  export { createRetentionManager, createInMemoryRetentionStore, createInMemoryArchiver, RetentionError, } from './retention-manager.js';
17
+ // Rate Limiter Registry
18
+ export { createRateLimiterRegistry, RateLimiterRegistryError, RateLimiterRegistryErrorCodes, DEFAULT_PROVIDER_RATE_LIMITS, } from './rate-limiter-registry.js';
17
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oBAAoB;AACpB,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,oBAAoB,EACpB,YAAY,GAGb,MAAM,wBAAwB,CAAC;AAEhC,eAAe;AACf,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,SAAS,GAIV,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,eAAe,EACf,gBAAgB,GAGjB,MAAM,0BAA0B,CAAC;AAElC,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,cAAc,GAKf,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oBAAoB;AACpB,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,oBAAoB,EACpB,YAAY,GAGb,MAAM,wBAAwB,CAAC;AAEhC,eAAe;AACf,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,SAAS,GAIV,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,eAAe,EACf,gBAAgB,GAGjB,MAAM,0BAA0B,CAAC;AAElC,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,cAAc,GAKf,MAAM,wBAAwB,CAAC;AAEhC,wBAAwB;AACxB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,4BAA4B,GAQ7B,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Rate Limiter Registry
3
+ *
4
+ * Centralized rate limiting with per-provider isolation.
5
+ * Replaces global rate limiting with provider-scoped token buckets.
6
+ *
7
+ * Features:
8
+ * - Per-provider rate limiters with configurable limits
9
+ * - Session-level quota tracking (optional)
10
+ * - Burst support with token bucket algorithm
11
+ * - Queue management with timeout
12
+ *
13
+ * INV-RATE-001: Rate limiters MUST be scoped per provider
14
+ * INV-RATE-002: Session-level quotas MUST not exceed provider limits
15
+ */
16
+ /**
17
+ * Backoff strategies for rate limiting
18
+ */
19
+ export type BackoffStrategy = 'linear' | 'exponential' | 'fibonacci';
20
+ /**
21
+ * Rate limit configuration for a provider
22
+ */
23
+ export interface ProviderRateLimitConfig {
24
+ /** Maximum requests per minute */
25
+ requestsPerMinute: number;
26
+ /** Maximum tokens per minute (optional) */
27
+ tokensPerMinute?: number;
28
+ /** Burst multiplier (1.0 = no burst) */
29
+ burstMultiplier: number;
30
+ /** Maximum concurrent requests */
31
+ maxConcurrent: number;
32
+ /** Backoff strategy */
33
+ backoffStrategy: BackoffStrategy;
34
+ /** Initial backoff delay in ms */
35
+ initialBackoffMs: number;
36
+ /** Maximum backoff delay in ms */
37
+ maxBackoffMs: number;
38
+ /** Queue size */
39
+ queueSize: number;
40
+ /** Queue timeout in ms */
41
+ queueTimeoutMs: number;
42
+ }
43
+ /**
44
+ * Session quota configuration
45
+ */
46
+ export interface SessionQuotaConfig {
47
+ /** Maximum requests per session */
48
+ maxRequestsPerSession?: number;
49
+ /** Maximum tokens per session */
50
+ maxTokensPerSession?: number;
51
+ /** Session timeout in ms */
52
+ sessionTimeoutMs: number;
53
+ /** Warn threshold (0-1) */
54
+ warnThreshold: number;
55
+ }
56
+ /**
57
+ * Rate limiter registry configuration
58
+ */
59
+ export interface RateLimiterRegistryConfig {
60
+ /** Per-provider configurations */
61
+ providers: Record<string, Partial<ProviderRateLimitConfig>>;
62
+ /** Session quota (optional) */
63
+ sessionQuota: SessionQuotaConfig | undefined;
64
+ /** Global fallback configuration */
65
+ globalFallback: Partial<ProviderRateLimitConfig>;
66
+ /** Enable per-provider isolation */
67
+ enableProviderIsolation: boolean;
68
+ /** Enable session-level tracking */
69
+ enableSessionTracking: boolean;
70
+ }
71
+ /**
72
+ * Acquire result from rate limiter
73
+ */
74
+ export interface RateLimitAcquireResult {
75
+ acquired: boolean;
76
+ waitedMs?: number;
77
+ reason?: 'limit-exceeded' | 'queue-full' | 'timeout' | 'session-quota-exceeded';
78
+ retryAfterMs?: number;
79
+ providerId?: string;
80
+ queuePosition?: number;
81
+ }
82
+ /**
83
+ * Rate limiter statistics
84
+ */
85
+ export interface RateLimiterStats {
86
+ providerId: string;
87
+ requestsAllowed: number;
88
+ requestsRejected: number;
89
+ queueSize: number;
90
+ availableCapacity: number;
91
+ nextRefillMs: number;
92
+ windowStart: string;
93
+ }
94
+ /**
95
+ * Session usage tracking
96
+ */
97
+ interface SessionUsage {
98
+ sessionId: string;
99
+ requestCount: number;
100
+ tokenCount: number;
101
+ startedAt: number;
102
+ lastActivityAt: number;
103
+ }
104
+ /**
105
+ * Default provider-specific rate limits
106
+ * Based on typical API limits for each provider
107
+ */
108
+ export declare const DEFAULT_PROVIDER_RATE_LIMITS: Record<string, Partial<ProviderRateLimitConfig>>;
109
+ /**
110
+ * Rate Limiter Registry interface
111
+ */
112
+ export interface RateLimiterRegistry {
113
+ /**
114
+ * Acquire rate limit capacity for a provider
115
+ * @param providerId - The provider to acquire capacity for
116
+ * @param tokens - Number of tokens to acquire (default: 1)
117
+ * @param sessionId - Optional session ID for session-level tracking
118
+ */
119
+ acquire(providerId: string, tokens?: number, sessionId?: string): Promise<RateLimitAcquireResult>;
120
+ /**
121
+ * Try to acquire capacity without waiting
122
+ */
123
+ tryAcquire(providerId: string, tokens?: number): boolean;
124
+ /**
125
+ * Get statistics for a specific provider
126
+ */
127
+ getProviderStats(providerId: string): RateLimiterStats;
128
+ /**
129
+ * Get statistics for all providers
130
+ */
131
+ getAllStats(): RateLimiterStats[];
132
+ /**
133
+ * Get session usage
134
+ */
135
+ getSessionUsage(sessionId: string): SessionUsage | undefined;
136
+ /**
137
+ * Reset a specific provider's rate limiter
138
+ */
139
+ resetProvider(providerId: string): void;
140
+ /**
141
+ * Reset all rate limiters
142
+ */
143
+ resetAll(): void;
144
+ /**
145
+ * Check if a provider is configured
146
+ */
147
+ hasProvider(providerId: string): boolean;
148
+ /**
149
+ * Get the configuration for a provider
150
+ */
151
+ getProviderConfig(providerId: string): ProviderRateLimitConfig;
152
+ }
153
+ /**
154
+ * Creates a rate limiter registry with per-provider isolation
155
+ */
156
+ export declare function createRateLimiterRegistry(config?: Partial<RateLimiterRegistryConfig>): RateLimiterRegistry;
157
+ export declare class RateLimiterRegistryError extends Error {
158
+ readonly code: string;
159
+ readonly providerId?: string | undefined;
160
+ readonly retryAfterMs?: number | undefined;
161
+ constructor(code: string, message: string, providerId?: string | undefined, retryAfterMs?: number | undefined);
162
+ static providerNotConfigured(providerId: string): RateLimiterRegistryError;
163
+ static rateLimited(providerId: string, retryAfterMs: number): RateLimiterRegistryError;
164
+ static sessionQuotaExceeded(sessionId: string): RateLimiterRegistryError;
165
+ }
166
+ export declare const RateLimiterRegistryErrorCodes: {
167
+ readonly PROVIDER_NOT_CONFIGURED: "PROVIDER_NOT_CONFIGURED";
168
+ readonly RATE_LIMITED: "RATE_LIMITED";
169
+ readonly QUEUE_FULL: "QUEUE_FULL";
170
+ readonly QUEUE_TIMEOUT: "QUEUE_TIMEOUT";
171
+ readonly SESSION_QUOTA_EXCEEDED: "SESSION_QUOTA_EXCEEDED";
172
+ };
173
+ export {};
174
+ //# sourceMappingURL=rate-limiter-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter-registry.d.ts","sourceRoot":"","sources":["../src/rate-limiter-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,408 @@
1
+ /**
2
+ * Rate Limiter Registry
3
+ *
4
+ * Centralized rate limiting with per-provider isolation.
5
+ * Replaces global rate limiting with provider-scoped token buckets.
6
+ *
7
+ * Features:
8
+ * - Per-provider rate limiters with configurable limits
9
+ * - Session-level quota tracking (optional)
10
+ * - Burst support with token bucket algorithm
11
+ * - Queue management with timeout
12
+ *
13
+ * INV-RATE-001: Rate limiters MUST be scoped per provider
14
+ * INV-RATE-002: Session-level quotas MUST not exceed provider limits
15
+ */
16
+ import { RATE_LIMIT_RPM_DEFAULT, RATE_LIMIT_TPM_DEFAULT, LIMIT_QUEUE_SIZE, CIRCUIT_QUEUE_TIMEOUT, } from '@defai.digital/contracts';
17
+ // =============================================================================
18
+ // CONSTANTS
19
+ // =============================================================================
20
+ const DEFAULT_PROVIDER_CONFIG = {
21
+ requestsPerMinute: RATE_LIMIT_RPM_DEFAULT,
22
+ tokensPerMinute: RATE_LIMIT_TPM_DEFAULT,
23
+ burstMultiplier: 1.5,
24
+ maxConcurrent: 5,
25
+ backoffStrategy: 'exponential',
26
+ initialBackoffMs: 1000,
27
+ maxBackoffMs: 30000,
28
+ queueSize: LIMIT_QUEUE_SIZE,
29
+ queueTimeoutMs: CIRCUIT_QUEUE_TIMEOUT,
30
+ };
31
+ /**
32
+ * Default provider-specific rate limits
33
+ * Based on typical API limits for each provider
34
+ */
35
+ export const DEFAULT_PROVIDER_RATE_LIMITS = {
36
+ claude: {
37
+ requestsPerMinute: 60,
38
+ tokensPerMinute: 100000,
39
+ maxConcurrent: 3,
40
+ },
41
+ gemini: {
42
+ requestsPerMinute: 300,
43
+ tokensPerMinute: 1000000,
44
+ burstMultiplier: 2.0,
45
+ maxConcurrent: 10,
46
+ },
47
+ codex: {
48
+ requestsPerMinute: 60,
49
+ tokensPerMinute: 150000,
50
+ maxConcurrent: 5,
51
+ },
52
+ qwen: {
53
+ requestsPerMinute: 120,
54
+ tokensPerMinute: 200000,
55
+ maxConcurrent: 5,
56
+ },
57
+ glm: {
58
+ requestsPerMinute: 60,
59
+ tokensPerMinute: 100000,
60
+ maxConcurrent: 3,
61
+ backoffStrategy: 'linear',
62
+ },
63
+ grok: {
64
+ requestsPerMinute: 60,
65
+ tokensPerMinute: 100000,
66
+ maxConcurrent: 3,
67
+ },
68
+ };
69
+ const TOKEN_WINDOW_MS = 60000; // 1 minute
70
+ const CHECK_INTERVAL_MS = 100; // Queue check interval
71
+ /**
72
+ * Creates a rate limiter for a single provider
73
+ */
74
+ function createProviderRateLimiter(providerId, config) {
75
+ // Token bucket state
76
+ let tokens = config.requestsPerMinute * config.burstMultiplier;
77
+ const maxTokens = config.requestsPerMinute * config.burstMultiplier;
78
+ const refillRate = config.requestsPerMinute / 60000; // tokens per ms
79
+ let lastRefillTime = Date.now();
80
+ // LLM token tracking
81
+ let llmTokensUsed = 0;
82
+ let llmTokenWindowStart = Date.now();
83
+ // Statistics
84
+ let requestsAllowed = 0;
85
+ let requestsRejected = 0;
86
+ const windowStart = new Date().toISOString();
87
+ // Queue
88
+ const queue = [];
89
+ let processingQueue = false;
90
+ function refillTokens() {
91
+ const now = Date.now();
92
+ const elapsed = now - lastRefillTime;
93
+ const refill = elapsed * refillRate;
94
+ tokens = Math.min(maxTokens, tokens + refill);
95
+ lastRefillTime = now;
96
+ // Reset LLM token window if minute elapsed
97
+ if (config.tokensPerMinute && now - llmTokenWindowStart >= TOKEN_WINDOW_MS) {
98
+ llmTokensUsed = 0;
99
+ llmTokenWindowStart = now;
100
+ }
101
+ }
102
+ function calculateWaitTime(requestTokens) {
103
+ if (tokens >= requestTokens)
104
+ return 0;
105
+ const deficit = requestTokens - tokens;
106
+ return Math.ceil(deficit / refillRate);
107
+ }
108
+ function processQueue() {
109
+ if (processingQueue || queue.length === 0)
110
+ return;
111
+ processingQueue = true;
112
+ const processNext = () => {
113
+ if (queue.length === 0) {
114
+ processingQueue = false;
115
+ return;
116
+ }
117
+ const request = queue[0];
118
+ if (!request) {
119
+ processingQueue = false;
120
+ return;
121
+ }
122
+ const now = Date.now();
123
+ // Check timeout
124
+ if (now - request.enqueuedAt >= config.queueTimeoutMs) {
125
+ queue.shift();
126
+ request.resolve({
127
+ acquired: false,
128
+ reason: 'timeout',
129
+ providerId,
130
+ });
131
+ setTimeout(processNext, 0);
132
+ return;
133
+ }
134
+ refillTokens();
135
+ if (tokens >= request.tokens) {
136
+ queue.shift();
137
+ tokens -= request.tokens;
138
+ requestsAllowed++;
139
+ request.resolve({
140
+ acquired: true,
141
+ waitedMs: now - request.enqueuedAt,
142
+ providerId,
143
+ });
144
+ setTimeout(processNext, 0);
145
+ }
146
+ else {
147
+ // Wait for tokens
148
+ const waitTime = calculateWaitTime(request.tokens);
149
+ setTimeout(processNext, Math.min(waitTime, CHECK_INTERVAL_MS));
150
+ }
151
+ };
152
+ processNext();
153
+ }
154
+ return {
155
+ async acquire(requestTokens = 1, sessionId) {
156
+ refillTokens();
157
+ // Check LLM token limit
158
+ if (config.tokensPerMinute && llmTokensUsed >= config.tokensPerMinute) {
159
+ const retryAfterMs = TOKEN_WINDOW_MS - (Date.now() - llmTokenWindowStart);
160
+ requestsRejected++;
161
+ return {
162
+ acquired: false,
163
+ reason: 'limit-exceeded',
164
+ retryAfterMs,
165
+ providerId,
166
+ };
167
+ }
168
+ // Try immediate acquisition
169
+ if (tokens >= requestTokens && queue.length === 0) {
170
+ tokens -= requestTokens;
171
+ requestsAllowed++;
172
+ return { acquired: true, waitedMs: 0, providerId };
173
+ }
174
+ // Check queue capacity
175
+ if (queue.length >= config.queueSize) {
176
+ requestsRejected++;
177
+ return { acquired: false, reason: 'queue-full', providerId };
178
+ }
179
+ // Queue the request
180
+ return new Promise((resolve) => {
181
+ queue.push({
182
+ tokens: requestTokens,
183
+ resolve,
184
+ enqueuedAt: Date.now(),
185
+ sessionId,
186
+ });
187
+ processQueue();
188
+ });
189
+ },
190
+ tryAcquire(requestTokens = 1) {
191
+ refillTokens();
192
+ // Check LLM token limit
193
+ if (config.tokensPerMinute && llmTokensUsed >= config.tokensPerMinute) {
194
+ requestsRejected++;
195
+ return false;
196
+ }
197
+ if (tokens >= requestTokens && queue.length === 0) {
198
+ tokens -= requestTokens;
199
+ requestsAllowed++;
200
+ return true;
201
+ }
202
+ requestsRejected++;
203
+ return false;
204
+ },
205
+ getStats() {
206
+ refillTokens();
207
+ return {
208
+ providerId,
209
+ requestsAllowed,
210
+ requestsRejected,
211
+ queueSize: queue.length,
212
+ availableCapacity: tokens,
213
+ nextRefillMs: tokens >= maxTokens ? 0 : Math.ceil((maxTokens - tokens) / refillRate),
214
+ windowStart,
215
+ };
216
+ },
217
+ reset() {
218
+ tokens = maxTokens;
219
+ lastRefillTime = Date.now();
220
+ llmTokensUsed = 0;
221
+ llmTokenWindowStart = Date.now();
222
+ requestsAllowed = 0;
223
+ requestsRejected = 0;
224
+ // Clear queue
225
+ while (queue.length > 0) {
226
+ const request = queue.shift();
227
+ if (request) {
228
+ request.resolve({ acquired: false, reason: 'timeout', providerId });
229
+ }
230
+ }
231
+ },
232
+ };
233
+ }
234
+ /**
235
+ * Creates a rate limiter registry with per-provider isolation
236
+ */
237
+ export function createRateLimiterRegistry(config) {
238
+ const cfg = {
239
+ providers: { ...DEFAULT_PROVIDER_RATE_LIMITS, ...config?.providers },
240
+ sessionQuota: config?.sessionQuota,
241
+ globalFallback: { ...DEFAULT_PROVIDER_CONFIG, ...config?.globalFallback },
242
+ enableProviderIsolation: config?.enableProviderIsolation ?? true,
243
+ enableSessionTracking: config?.enableSessionTracking ?? false,
244
+ };
245
+ // Provider rate limiters
246
+ const limiters = new Map();
247
+ // Session tracking
248
+ const sessions = new Map();
249
+ // Cleanup interval for expired sessions
250
+ // Note: In a long-running process, this interval would need to be cleared
251
+ // when the registry is no longer needed to prevent memory leaks.
252
+ if (cfg.enableSessionTracking && cfg.sessionQuota) {
253
+ setInterval(() => {
254
+ const now = Date.now();
255
+ const timeout = cfg.sessionQuota.sessionTimeoutMs;
256
+ for (const [sessionId, usage] of sessions) {
257
+ if (now - usage.lastActivityAt > timeout) {
258
+ sessions.delete(sessionId);
259
+ }
260
+ }
261
+ }, 60000); // Cleanup every minute
262
+ }
263
+ function getProviderConfig(providerId) {
264
+ const providerCfg = cfg.providers[providerId];
265
+ return { ...DEFAULT_PROVIDER_CONFIG, ...cfg.globalFallback, ...providerCfg };
266
+ }
267
+ function getLimiter(providerId) {
268
+ if (!limiters.has(providerId)) {
269
+ const providerConfig = getProviderConfig(providerId);
270
+ limiters.set(providerId, createProviderRateLimiter(providerId, providerConfig));
271
+ }
272
+ return limiters.get(providerId);
273
+ }
274
+ function checkSessionQuota(sessionId) {
275
+ if (!cfg.enableSessionTracking || !cfg.sessionQuota) {
276
+ return null;
277
+ }
278
+ const usage = sessions.get(sessionId);
279
+ if (!usage) {
280
+ return null;
281
+ }
282
+ const quota = cfg.sessionQuota;
283
+ // Check request limit
284
+ if (quota.maxRequestsPerSession && usage.requestCount >= quota.maxRequestsPerSession) {
285
+ return {
286
+ acquired: false,
287
+ reason: 'session-quota-exceeded',
288
+ };
289
+ }
290
+ // Check token limit
291
+ if (quota.maxTokensPerSession && usage.tokenCount >= quota.maxTokensPerSession) {
292
+ return {
293
+ acquired: false,
294
+ reason: 'session-quota-exceeded',
295
+ };
296
+ }
297
+ return null;
298
+ }
299
+ function updateSessionUsage(sessionId, tokens) {
300
+ if (!cfg.enableSessionTracking) {
301
+ return;
302
+ }
303
+ const now = Date.now();
304
+ const usage = sessions.get(sessionId);
305
+ if (usage) {
306
+ usage.requestCount++;
307
+ usage.tokenCount += tokens;
308
+ usage.lastActivityAt = now;
309
+ }
310
+ else {
311
+ sessions.set(sessionId, {
312
+ sessionId,
313
+ requestCount: 1,
314
+ tokenCount: tokens,
315
+ startedAt: now,
316
+ lastActivityAt: now,
317
+ });
318
+ }
319
+ }
320
+ return {
321
+ async acquire(providerId, tokens = 1, sessionId) {
322
+ // Check session quota first
323
+ if (sessionId) {
324
+ const quotaResult = checkSessionQuota(sessionId);
325
+ if (quotaResult) {
326
+ return quotaResult;
327
+ }
328
+ }
329
+ // Acquire from provider limiter
330
+ const limiter = getLimiter(providerId);
331
+ const result = await limiter.acquire(tokens, sessionId);
332
+ // Update session usage on success
333
+ if (result.acquired && sessionId) {
334
+ updateSessionUsage(sessionId, tokens);
335
+ }
336
+ return result;
337
+ },
338
+ tryAcquire(providerId, tokens = 1) {
339
+ const limiter = getLimiter(providerId);
340
+ return limiter.tryAcquire(tokens);
341
+ },
342
+ getProviderStats(providerId) {
343
+ const limiter = getLimiter(providerId);
344
+ return limiter.getStats();
345
+ },
346
+ getAllStats() {
347
+ const stats = [];
348
+ for (const [, limiter] of limiters) {
349
+ stats.push(limiter.getStats());
350
+ }
351
+ return stats;
352
+ },
353
+ getSessionUsage(sessionId) {
354
+ return sessions.get(sessionId);
355
+ },
356
+ resetProvider(providerId) {
357
+ const limiter = limiters.get(providerId);
358
+ if (limiter) {
359
+ limiter.reset();
360
+ }
361
+ },
362
+ resetAll() {
363
+ for (const [, limiter] of limiters) {
364
+ limiter.reset();
365
+ }
366
+ sessions.clear();
367
+ },
368
+ hasProvider(providerId) {
369
+ return providerId in cfg.providers || providerId in DEFAULT_PROVIDER_RATE_LIMITS;
370
+ },
371
+ getProviderConfig,
372
+ };
373
+ }
374
+ // =============================================================================
375
+ // ERROR CLASS
376
+ // =============================================================================
377
+ export class RateLimiterRegistryError extends Error {
378
+ code;
379
+ providerId;
380
+ retryAfterMs;
381
+ constructor(code, message, providerId, retryAfterMs) {
382
+ super(message);
383
+ this.code = code;
384
+ this.providerId = providerId;
385
+ this.retryAfterMs = retryAfterMs;
386
+ this.name = 'RateLimiterRegistryError';
387
+ }
388
+ static providerNotConfigured(providerId) {
389
+ return new RateLimiterRegistryError('PROVIDER_NOT_CONFIGURED', `Provider ${providerId} is not configured`, providerId);
390
+ }
391
+ static rateLimited(providerId, retryAfterMs) {
392
+ return new RateLimiterRegistryError('RATE_LIMITED', `Rate limit exceeded for ${providerId}. Retry after ${retryAfterMs}ms`, providerId, retryAfterMs);
393
+ }
394
+ static sessionQuotaExceeded(sessionId) {
395
+ return new RateLimiterRegistryError('SESSION_QUOTA_EXCEEDED', `Session quota exceeded for ${sessionId}`);
396
+ }
397
+ }
398
+ // =============================================================================
399
+ // EXPORTS
400
+ // =============================================================================
401
+ export const RateLimiterRegistryErrorCodes = {
402
+ PROVIDER_NOT_CONFIGURED: 'PROVIDER_NOT_CONFIGURED',
403
+ RATE_LIMITED: 'RATE_LIMITED',
404
+ QUEUE_FULL: 'QUEUE_FULL',
405
+ QUEUE_TIMEOUT: 'QUEUE_TIMEOUT',
406
+ SESSION_QUOTA_EXCEEDED: 'SESSION_QUOTA_EXCEEDED',
407
+ };
408
+ //# sourceMappingURL=rate-limiter-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter-registry.js","sourceRoot":"","sources":["../src/rate-limiter-registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defai.digital/cross-cutting",
3
- "version": "13.1.11",
3
+ "version": "13.1.13",
4
4
  "type": "module",
5
5
  "description": "Cross-cutting concerns for AutomatosX - DLQ, Saga, Retention, Idempotency",
6
6
  "license": "Apache-2.0",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@defai.digital/contracts": "13.1.11"
35
+ "@defai.digital/contracts": "13.1.13"
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsc --build",