@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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/rate-limiter-registry.d.ts +174 -0
- package/dist/rate-limiter-registry.d.ts.map +1 -0
- package/dist/rate-limiter-registry.js +408 -0
- package/dist/rate-limiter-registry.js.map +1 -0
- package/package.json +2 -2
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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.
|
|
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.
|
|
35
|
+
"@defai.digital/contracts": "13.1.13"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsc --build",
|