@claude-flow/cli 3.0.0-alpha.79 → 3.0.0-alpha.80

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 (41) hide show
  1. package/dist/src/index.d.ts +10 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +6 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/mcp-client.d.ts.map +1 -1
  6. package/dist/src/mcp-client.js +2 -0
  7. package/dist/src/mcp-client.js.map +1 -1
  8. package/dist/src/mcp-tools/claims-tools.d.ts +12 -0
  9. package/dist/src/mcp-tools/claims-tools.d.ts.map +1 -0
  10. package/dist/src/mcp-tools/claims-tools.js +732 -0
  11. package/dist/src/mcp-tools/claims-tools.js.map +1 -0
  12. package/dist/src/mcp-tools/index.d.ts +1 -0
  13. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  14. package/dist/src/mcp-tools/index.js +1 -0
  15. package/dist/src/mcp-tools/index.js.map +1 -1
  16. package/dist/src/production/circuit-breaker.d.ts +101 -0
  17. package/dist/src/production/circuit-breaker.d.ts.map +1 -0
  18. package/dist/src/production/circuit-breaker.js +241 -0
  19. package/dist/src/production/circuit-breaker.js.map +1 -0
  20. package/dist/src/production/error-handler.d.ts +92 -0
  21. package/dist/src/production/error-handler.d.ts.map +1 -0
  22. package/dist/src/production/error-handler.js +299 -0
  23. package/dist/src/production/error-handler.js.map +1 -0
  24. package/dist/src/production/index.d.ts +23 -0
  25. package/dist/src/production/index.d.ts.map +1 -0
  26. package/dist/src/production/index.js +18 -0
  27. package/dist/src/production/index.js.map +1 -0
  28. package/dist/src/production/monitoring.d.ts +161 -0
  29. package/dist/src/production/monitoring.d.ts.map +1 -0
  30. package/dist/src/production/monitoring.js +356 -0
  31. package/dist/src/production/monitoring.js.map +1 -0
  32. package/dist/src/production/rate-limiter.d.ts +80 -0
  33. package/dist/src/production/rate-limiter.d.ts.map +1 -0
  34. package/dist/src/production/rate-limiter.js +201 -0
  35. package/dist/src/production/rate-limiter.js.map +1 -0
  36. package/dist/src/production/retry.d.ts +48 -0
  37. package/dist/src/production/retry.d.ts.map +1 -0
  38. package/dist/src/production/retry.js +179 -0
  39. package/dist/src/production/retry.js.map +1 -0
  40. package/dist/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Production Monitoring and Observability
3
+ *
4
+ * Provides monitoring hooks for:
5
+ * - Request/response metrics
6
+ * - Error tracking
7
+ * - Performance monitoring
8
+ * - Health checks
9
+ * - Alerting
10
+ *
11
+ * @module @claude-flow/cli/production/monitoring
12
+ */
13
+ // ============================================================================
14
+ // Default Configuration
15
+ // ============================================================================
16
+ const DEFAULT_CONFIG = {
17
+ enabled: true,
18
+ retentionMs: 3600000, // 1 hour
19
+ maxMetrics: 100000,
20
+ samplingRate: 1.0,
21
+ alertThresholds: {
22
+ 'error_rate': { warning: 0.05, critical: 0.1 },
23
+ 'response_time_ms': { warning: 1000, critical: 5000 },
24
+ 'active_requests': { warning: 100, critical: 500 },
25
+ },
26
+ healthCheckIntervalMs: 30000,
27
+ globalLabels: {},
28
+ };
29
+ // ============================================================================
30
+ // Monitoring Implementation
31
+ // ============================================================================
32
+ export class MonitoringHooks {
33
+ config;
34
+ metrics = [];
35
+ responseTimes = [];
36
+ alerts = [];
37
+ healthStatus;
38
+ startTime = Date.now();
39
+ activeRequests = 0;
40
+ requestCount = 0;
41
+ errorCount = 0;
42
+ healthChecks = new Map();
43
+ constructor(config = {}) {
44
+ this.config = { ...DEFAULT_CONFIG, ...config };
45
+ this.healthStatus = {
46
+ healthy: true,
47
+ checks: {},
48
+ timestamp: Date.now(),
49
+ };
50
+ }
51
+ // ============================================================================
52
+ // Metrics Collection
53
+ // ============================================================================
54
+ /**
55
+ * Record a counter metric
56
+ */
57
+ counter(name, value = 1, labels = {}) {
58
+ this.recordMetric(name, 'counter', value, labels);
59
+ }
60
+ /**
61
+ * Record a gauge metric
62
+ */
63
+ gauge(name, value, labels = {}) {
64
+ this.recordMetric(name, 'gauge', value, labels);
65
+ }
66
+ /**
67
+ * Record a histogram metric
68
+ */
69
+ histogram(name, value, labels = {}) {
70
+ this.recordMetric(name, 'histogram', value, labels);
71
+ }
72
+ /**
73
+ * Record a metric event
74
+ */
75
+ recordMetric(name, type, value, labels) {
76
+ if (!this.config.enabled)
77
+ return;
78
+ // Apply sampling
79
+ if (Math.random() > this.config.samplingRate)
80
+ return;
81
+ const event = {
82
+ name,
83
+ type,
84
+ value,
85
+ labels: { ...this.config.globalLabels, ...labels },
86
+ timestamp: Date.now(),
87
+ };
88
+ this.metrics.push(event);
89
+ // Check alerts
90
+ this.checkAlerts(name, value);
91
+ // Cleanup old metrics
92
+ this.cleanupMetrics();
93
+ }
94
+ // ============================================================================
95
+ // Request Tracking
96
+ // ============================================================================
97
+ /**
98
+ * Start tracking a request
99
+ */
100
+ startRequest(requestId) {
101
+ this.activeRequests++;
102
+ this.requestCount++;
103
+ const startTime = Date.now();
104
+ this.counter('request_started', 1, { requestId });
105
+ // Return end function
106
+ return () => {
107
+ this.activeRequests--;
108
+ const duration = Date.now() - startTime;
109
+ this.responseTimes.push(duration);
110
+ this.histogram('response_time_ms', duration, { requestId });
111
+ // Keep only last 1000 response times
112
+ if (this.responseTimes.length > 1000) {
113
+ this.responseTimes = this.responseTimes.slice(-1000);
114
+ }
115
+ };
116
+ }
117
+ /**
118
+ * Record an error
119
+ */
120
+ recordError(error, labels = {}) {
121
+ this.errorCount++;
122
+ this.counter('error', 1, {
123
+ ...labels,
124
+ errorType: error.name,
125
+ errorMessage: error.message.slice(0, 100),
126
+ });
127
+ }
128
+ // ============================================================================
129
+ // Health Checks
130
+ // ============================================================================
131
+ /**
132
+ * Register a health check
133
+ */
134
+ registerHealthCheck(name, check) {
135
+ this.healthChecks.set(name, check);
136
+ }
137
+ /**
138
+ * Run all health checks
139
+ */
140
+ async runHealthChecks() {
141
+ const checks = {};
142
+ let allHealthy = true;
143
+ for (const [name, check] of this.healthChecks) {
144
+ const startTime = Date.now();
145
+ try {
146
+ const result = await check();
147
+ checks[name] = {
148
+ status: result.healthy ? 'healthy' : 'unhealthy',
149
+ message: result.message,
150
+ lastCheck: Date.now(),
151
+ responseTimeMs: Date.now() - startTime,
152
+ };
153
+ if (!result.healthy)
154
+ allHealthy = false;
155
+ }
156
+ catch (error) {
157
+ checks[name] = {
158
+ status: 'unhealthy',
159
+ message: error.message,
160
+ lastCheck: Date.now(),
161
+ responseTimeMs: Date.now() - startTime,
162
+ };
163
+ allHealthy = false;
164
+ }
165
+ }
166
+ this.healthStatus = {
167
+ healthy: allHealthy,
168
+ checks,
169
+ timestamp: Date.now(),
170
+ };
171
+ return this.healthStatus;
172
+ }
173
+ /**
174
+ * Get current health status
175
+ */
176
+ getHealthStatus() {
177
+ return this.healthStatus;
178
+ }
179
+ // ============================================================================
180
+ // Performance Metrics
181
+ // ============================================================================
182
+ /**
183
+ * Get performance metrics
184
+ */
185
+ getPerformanceMetrics() {
186
+ const sortedTimes = [...this.responseTimes].sort((a, b) => a - b);
187
+ const count = sortedTimes.length;
188
+ const percentile = (p) => {
189
+ if (count === 0)
190
+ return 0;
191
+ const index = Math.ceil(count * p) - 1;
192
+ return sortedTimes[Math.min(index, count - 1)];
193
+ };
194
+ const avgResponseTime = count > 0
195
+ ? sortedTimes.reduce((a, b) => a + b, 0) / count
196
+ : 0;
197
+ return {
198
+ requestCount: this.requestCount,
199
+ errorCount: this.errorCount,
200
+ errorRate: this.requestCount > 0 ? this.errorCount / this.requestCount : 0,
201
+ avgResponseTimeMs: Math.round(avgResponseTime),
202
+ p50ResponseTimeMs: percentile(0.5),
203
+ p95ResponseTimeMs: percentile(0.95),
204
+ p99ResponseTimeMs: percentile(0.99),
205
+ activeRequests: this.activeRequests,
206
+ uptime: Date.now() - this.startTime,
207
+ };
208
+ }
209
+ // ============================================================================
210
+ // Alerting
211
+ // ============================================================================
212
+ /**
213
+ * Get active alerts
214
+ */
215
+ getAlerts(level) {
216
+ let filtered = this.alerts.filter(a => !a.acknowledged);
217
+ if (level) {
218
+ filtered = filtered.filter(a => a.level === level);
219
+ }
220
+ return filtered;
221
+ }
222
+ /**
223
+ * Acknowledge an alert
224
+ */
225
+ acknowledgeAlert(alertId) {
226
+ const alert = this.alerts.find(a => a.id === alertId);
227
+ if (alert) {
228
+ alert.acknowledged = true;
229
+ return true;
230
+ }
231
+ return false;
232
+ }
233
+ /**
234
+ * Clear all alerts
235
+ */
236
+ clearAlerts() {
237
+ this.alerts = [];
238
+ }
239
+ // ============================================================================
240
+ // Data Export
241
+ // ============================================================================
242
+ /**
243
+ * Get metrics for a specific name
244
+ */
245
+ getMetrics(name, since) {
246
+ let filtered = this.metrics.filter(m => m.name === name);
247
+ if (since) {
248
+ filtered = filtered.filter(m => m.timestamp >= since);
249
+ }
250
+ return filtered;
251
+ }
252
+ /**
253
+ * Get all metrics summary
254
+ */
255
+ getMetricsSummary() {
256
+ const summary = {};
257
+ for (const metric of this.metrics) {
258
+ if (!summary[metric.name]) {
259
+ summary[metric.name] = { count: 0, sum: 0, lastValue: 0 };
260
+ }
261
+ summary[metric.name].count++;
262
+ summary[metric.name].sum += metric.value;
263
+ summary[metric.name].lastValue = metric.value;
264
+ }
265
+ const result = {};
266
+ for (const [name, data] of Object.entries(summary)) {
267
+ result[name] = {
268
+ count: data.count,
269
+ lastValue: data.lastValue,
270
+ avgValue: data.count > 0 ? data.sum / data.count : 0,
271
+ };
272
+ }
273
+ return result;
274
+ }
275
+ /**
276
+ * Reset all metrics
277
+ */
278
+ reset() {
279
+ this.metrics = [];
280
+ this.responseTimes = [];
281
+ this.alerts = [];
282
+ this.requestCount = 0;
283
+ this.errorCount = 0;
284
+ this.activeRequests = 0;
285
+ this.startTime = Date.now();
286
+ }
287
+ // ============================================================================
288
+ // Private Methods
289
+ // ============================================================================
290
+ checkAlerts(name, value) {
291
+ const thresholds = this.config.alertThresholds[name];
292
+ if (!thresholds)
293
+ return;
294
+ let level = null;
295
+ let threshold = 0;
296
+ if (value >= thresholds.critical) {
297
+ level = 'critical';
298
+ threshold = thresholds.critical;
299
+ }
300
+ else if (value >= thresholds.warning) {
301
+ level = 'warning';
302
+ threshold = thresholds.warning;
303
+ }
304
+ if (level) {
305
+ // Check if we already have a recent alert for this metric
306
+ const recentAlert = this.alerts.find(a => a.metric === name &&
307
+ !a.acknowledged &&
308
+ Date.now() - a.timestamp < 60000);
309
+ if (!recentAlert) {
310
+ this.alerts.push({
311
+ id: `alert_${Date.now()}_${Math.random().toString(36).substring(7)}`,
312
+ level,
313
+ metric: name,
314
+ message: `${name} exceeded ${level} threshold: ${value} >= ${threshold}`,
315
+ value,
316
+ threshold,
317
+ timestamp: Date.now(),
318
+ acknowledged: false,
319
+ });
320
+ }
321
+ }
322
+ }
323
+ cleanupMetrics() {
324
+ const now = Date.now();
325
+ const cutoff = now - this.config.retentionMs;
326
+ // Remove old metrics
327
+ this.metrics = this.metrics.filter(m => m.timestamp > cutoff);
328
+ // Limit total metrics
329
+ if (this.metrics.length > this.config.maxMetrics) {
330
+ this.metrics = this.metrics.slice(-this.config.maxMetrics);
331
+ }
332
+ // Remove old acknowledged alerts
333
+ this.alerts = this.alerts.filter(a => !a.acknowledged || Date.now() - a.timestamp < 300000);
334
+ }
335
+ }
336
+ // ============================================================================
337
+ // Convenience Functions
338
+ // ============================================================================
339
+ let defaultMonitor = null;
340
+ /**
341
+ * Create or get the default monitor
342
+ */
343
+ export function createMonitor(config) {
344
+ if (!defaultMonitor) {
345
+ defaultMonitor = new MonitoringHooks(config);
346
+ }
347
+ return defaultMonitor;
348
+ }
349
+ /**
350
+ * Get the default monitor
351
+ */
352
+ export function getMonitor() {
353
+ return createMonitor();
354
+ }
355
+ export default MonitoringHooks;
356
+ //# sourceMappingURL=monitoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring.js","sourceRoot":"","sources":["../../../src/production/monitoring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Production Rate Limiting
3
+ *
4
+ * Provides token bucket rate limiting with:
5
+ * - Per-operation limits
6
+ * - Per-user/agent limits
7
+ * - Burst allowance
8
+ * - Sliding window tracking
9
+ *
10
+ * @module @claude-flow/cli/production/rate-limiter
11
+ */
12
+ export interface RateLimiterConfig {
13
+ maxRequests: number;
14
+ windowMs: number;
15
+ burstMultiplier: number;
16
+ whitelist: string[];
17
+ operationLimits: Record<string, {
18
+ maxRequests: number;
19
+ windowMs: number;
20
+ }>;
21
+ perUserLimits: boolean;
22
+ maxTrackedUsers: number;
23
+ }
24
+ export interface RateLimitResult {
25
+ allowed: boolean;
26
+ remaining: number;
27
+ resetAt: number;
28
+ retryAfterMs?: number;
29
+ }
30
+ export declare class RateLimiter {
31
+ private config;
32
+ private buckets;
33
+ private globalBucket;
34
+ constructor(config?: Partial<RateLimiterConfig>);
35
+ /**
36
+ * Check if a request is allowed
37
+ */
38
+ check(operation: string, userId?: string): RateLimitResult;
39
+ /**
40
+ * Consume a token (use after successful request)
41
+ */
42
+ consume(operation: string, userId?: string): boolean;
43
+ /**
44
+ * Get current rate limit status
45
+ */
46
+ getStatus(operation: string, userId?: string): {
47
+ current: number;
48
+ limit: number;
49
+ remaining: number;
50
+ resetAt: number;
51
+ };
52
+ /**
53
+ * Reset limits for a specific key
54
+ */
55
+ reset(operation: string, userId?: string): void;
56
+ /**
57
+ * Reset all limits
58
+ */
59
+ resetAll(): void;
60
+ /**
61
+ * Get statistics
62
+ */
63
+ getStats(): {
64
+ totalBuckets: number;
65
+ activeUsers: number;
66
+ mostLimitedOperations: Array<{
67
+ operation: string;
68
+ requests: number;
69
+ }>;
70
+ };
71
+ private getLimits;
72
+ private createBucket;
73
+ private cleanupBuckets;
74
+ }
75
+ /**
76
+ * Create a rate limiter with default config
77
+ */
78
+ export declare function createRateLimiter(config?: Partial<RateLimiterConfig>): RateLimiter;
79
+ export default RateLimiter;
80
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/production/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,iBAAiB;IAEhC,WAAW,EAAE,MAAM,CAAC;IAEpB,QAAQ,EAAE,MAAM,CAAC;IAEjB,eAAe,EAAE,MAAM,CAAC;IAExB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE3E,aAAa,EAAE,OAAO,CAAC;IAEvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAsBD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,YAAY,CAAc;gBAEtB,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAKnD;;OAEG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,eAAe;IAqDlB;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAKpD;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;QAC7C,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB;IA+BD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ/C;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;OAEG;IACH,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,qBAAqB,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACvE;IA4BD,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,cAAc;CAuBvB;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAElF;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Production Rate Limiting
3
+ *
4
+ * Provides token bucket rate limiting with:
5
+ * - Per-operation limits
6
+ * - Per-user/agent limits
7
+ * - Burst allowance
8
+ * - Sliding window tracking
9
+ *
10
+ * @module @claude-flow/cli/production/rate-limiter
11
+ */
12
+ // ============================================================================
13
+ // Rate Limiter
14
+ // ============================================================================
15
+ const DEFAULT_CONFIG = {
16
+ maxRequests: 100,
17
+ windowMs: 60000, // 1 minute
18
+ burstMultiplier: 1.5,
19
+ whitelist: [],
20
+ operationLimits: {},
21
+ perUserLimits: true,
22
+ maxTrackedUsers: 10000,
23
+ };
24
+ export class RateLimiter {
25
+ config;
26
+ buckets = new Map();
27
+ globalBucket;
28
+ constructor(config = {}) {
29
+ this.config = { ...DEFAULT_CONFIG, ...config };
30
+ this.globalBucket = this.createBucket();
31
+ }
32
+ /**
33
+ * Check if a request is allowed
34
+ */
35
+ check(operation, userId) {
36
+ // Check whitelist
37
+ if (this.config.whitelist.includes(operation)) {
38
+ return { allowed: true, remaining: Infinity, resetAt: 0 };
39
+ }
40
+ // Get limits for this operation
41
+ const limits = this.getLimits(operation);
42
+ const now = Date.now();
43
+ // Get or create bucket
44
+ const bucketKey = userId && this.config.perUserLimits
45
+ ? `${operation}:${userId}`
46
+ : `global:${operation}`;
47
+ let bucket = this.buckets.get(bucketKey);
48
+ if (!bucket) {
49
+ bucket = this.createBucket();
50
+ this.buckets.set(bucketKey, bucket);
51
+ this.cleanupBuckets();
52
+ }
53
+ // Clean old requests from sliding window
54
+ bucket.requests = bucket.requests.filter(t => t > now - limits.windowMs);
55
+ // Calculate remaining
56
+ const maxWithBurst = Math.floor(limits.maxRequests * this.config.burstMultiplier);
57
+ const remaining = maxWithBurst - bucket.requests.length;
58
+ if (remaining <= 0) {
59
+ // Rate limited
60
+ const oldestRequest = bucket.requests[0];
61
+ const resetAt = oldestRequest + limits.windowMs;
62
+ const retryAfterMs = resetAt - now;
63
+ return {
64
+ allowed: false,
65
+ remaining: 0,
66
+ resetAt,
67
+ retryAfterMs: Math.max(0, retryAfterMs),
68
+ };
69
+ }
70
+ // Allow request
71
+ bucket.requests.push(now);
72
+ return {
73
+ allowed: true,
74
+ remaining: remaining - 1,
75
+ resetAt: now + limits.windowMs,
76
+ };
77
+ }
78
+ /**
79
+ * Consume a token (use after successful request)
80
+ */
81
+ consume(operation, userId) {
82
+ const result = this.check(operation, userId);
83
+ return result.allowed;
84
+ }
85
+ /**
86
+ * Get current rate limit status
87
+ */
88
+ getStatus(operation, userId) {
89
+ const limits = this.getLimits(operation);
90
+ const bucketKey = userId && this.config.perUserLimits
91
+ ? `${operation}:${userId}`
92
+ : `global:${operation}`;
93
+ const bucket = this.buckets.get(bucketKey);
94
+ const now = Date.now();
95
+ if (!bucket) {
96
+ return {
97
+ current: 0,
98
+ limit: limits.maxRequests,
99
+ remaining: limits.maxRequests,
100
+ resetAt: now + limits.windowMs,
101
+ };
102
+ }
103
+ // Clean old requests
104
+ const validRequests = bucket.requests.filter(t => t > now - limits.windowMs);
105
+ return {
106
+ current: validRequests.length,
107
+ limit: limits.maxRequests,
108
+ remaining: Math.max(0, limits.maxRequests - validRequests.length),
109
+ resetAt: validRequests.length > 0
110
+ ? validRequests[0] + limits.windowMs
111
+ : now + limits.windowMs,
112
+ };
113
+ }
114
+ /**
115
+ * Reset limits for a specific key
116
+ */
117
+ reset(operation, userId) {
118
+ const bucketKey = userId && this.config.perUserLimits
119
+ ? `${operation}:${userId}`
120
+ : `global:${operation}`;
121
+ this.buckets.delete(bucketKey);
122
+ }
123
+ /**
124
+ * Reset all limits
125
+ */
126
+ resetAll() {
127
+ this.buckets.clear();
128
+ this.globalBucket = this.createBucket();
129
+ }
130
+ /**
131
+ * Get statistics
132
+ */
133
+ getStats() {
134
+ const operationCounts = new Map();
135
+ const users = new Set();
136
+ for (const [key, bucket] of this.buckets) {
137
+ const [operation, userId] = key.split(':');
138
+ if (userId)
139
+ users.add(userId);
140
+ const current = operationCounts.get(operation) || 0;
141
+ operationCounts.set(operation, current + bucket.requests.length);
142
+ }
143
+ const mostLimited = Array.from(operationCounts.entries())
144
+ .map(([operation, requests]) => ({ operation, requests }))
145
+ .sort((a, b) => b.requests - a.requests)
146
+ .slice(0, 10);
147
+ return {
148
+ totalBuckets: this.buckets.size,
149
+ activeUsers: users.size,
150
+ mostLimitedOperations: mostLimited,
151
+ };
152
+ }
153
+ // ============================================================================
154
+ // Private Methods
155
+ // ============================================================================
156
+ getLimits(operation) {
157
+ return this.config.operationLimits[operation] || {
158
+ maxRequests: this.config.maxRequests,
159
+ windowMs: this.config.windowMs,
160
+ };
161
+ }
162
+ createBucket() {
163
+ return {
164
+ tokens: this.config.maxRequests,
165
+ lastRefill: Date.now(),
166
+ requests: [],
167
+ };
168
+ }
169
+ cleanupBuckets() {
170
+ // Limit number of tracked buckets
171
+ if (this.buckets.size > this.config.maxTrackedUsers) {
172
+ const now = Date.now();
173
+ const toDelete = [];
174
+ // Find buckets with no recent requests
175
+ for (const [key, bucket] of this.buckets) {
176
+ const recent = bucket.requests.filter(t => t > now - this.config.windowMs * 2);
177
+ if (recent.length === 0) {
178
+ toDelete.push(key);
179
+ }
180
+ }
181
+ // Delete stale buckets
182
+ for (const key of toDelete) {
183
+ this.buckets.delete(key);
184
+ if (this.buckets.size <= this.config.maxTrackedUsers * 0.8) {
185
+ break;
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ // ============================================================================
192
+ // Convenience Functions
193
+ // ============================================================================
194
+ /**
195
+ * Create a rate limiter with default config
196
+ */
197
+ export function createRateLimiter(config) {
198
+ return new RateLimiter(config);
199
+ }
200
+ export default RateLimiter;
201
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/production/rate-limiter.ts"],"names":[],"mappings":"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"}