@splashcodex/api-key-manager 1.0.0 → 3.0.0

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.js CHANGED
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  /**
3
- * Universal ApiKeyManager v2.0
4
- * Implements: Rotation, Circuit Breaker, Persistence, Exponential Backoff
3
+ * Universal ApiKeyManager v3.0
4
+ * Implements: Rotation, Circuit Breaker, Persistence, Exponential Backoff, Strategies,
5
+ * Event Emitter, Fallback, execute(), Timeout, Auto-Retry, Provider Tags,
6
+ * Health Checks, Bulkhead/Concurrency
5
7
  * Gemini-Specific: finishReason handling, Safety blocks, RECITATION detection
6
8
  */
7
9
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.ApiKeyManager = void 0;
10
+ exports.ApiKeyManager = exports.LatencyStrategy = exports.WeightedStrategy = exports.StandardStrategy = exports.AllKeysExhaustedError = exports.BulkheadRejectionError = exports.TimeoutError = void 0;
11
+ const events_1 = require("events");
12
+ // ─── Config ──────────────────────────────────────────────────────────────────
9
13
  const CONFIG = {
10
14
  MAX_CONSECUTIVE_FAILURES: 5,
11
15
  COOLDOWN_TRANSIENT: 60 * 1000, // 1 minute
@@ -23,32 +27,136 @@ const ERROR_PATTERNS = {
23
27
  isTransient: /500|502|503|504|internal|unavailable|deadline|timeout|overloaded/i,
24
28
  isBadRequest: /400|invalid.?argument|failed.?precondition|malformed|not.?found|404/i,
25
29
  };
26
- class ApiKeyManager {
30
+ // ─── Custom Errors ───────────────────────────────────────────────────────────
31
+ class TimeoutError extends Error {
32
+ constructor(ms) {
33
+ super(`Request timed out after ${ms}ms`);
34
+ this.name = 'TimeoutError';
35
+ }
36
+ }
37
+ exports.TimeoutError = TimeoutError;
38
+ class BulkheadRejectionError extends Error {
39
+ constructor() {
40
+ super('Bulkhead capacity exceeded — too many concurrent requests');
41
+ this.name = 'BulkheadRejectionError';
42
+ }
43
+ }
44
+ exports.BulkheadRejectionError = BulkheadRejectionError;
45
+ class AllKeysExhaustedError extends Error {
46
+ constructor() {
47
+ super('All API keys exhausted — no healthy keys available');
48
+ this.name = 'AllKeysExhaustedError';
49
+ }
50
+ }
51
+ exports.AllKeysExhaustedError = AllKeysExhaustedError;
52
+ /**
53
+ * Standard Strategy: Least Failed > Least Recently Used
54
+ */
55
+ class StandardStrategy {
56
+ next(candidates) {
57
+ candidates.sort((a, b) => {
58
+ if (a.failCount !== b.failCount)
59
+ return a.failCount - b.failCount;
60
+ return a.lastUsed - b.lastUsed;
61
+ });
62
+ return candidates[0] || null;
63
+ }
64
+ }
65
+ exports.StandardStrategy = StandardStrategy;
66
+ /**
67
+ * Weighted Strategy: Probabilistic selection based on weight
68
+ * Higher weight = Higher chance of selection
69
+ */
70
+ class WeightedStrategy {
71
+ next(candidates) {
72
+ if (candidates.length === 0)
73
+ return null;
74
+ const totalWeight = candidates.reduce((sum, k) => sum + k.weight, 0);
75
+ let random = Math.random() * totalWeight;
76
+ for (const key of candidates) {
77
+ random -= key.weight;
78
+ if (random <= 0)
79
+ return key;
80
+ }
81
+ return candidates[0]; // Fallback
82
+ }
83
+ }
84
+ exports.WeightedStrategy = WeightedStrategy;
85
+ /**
86
+ * Latency Strategy: Pick lowest average latency
87
+ */
88
+ class LatencyStrategy {
89
+ next(candidates) {
90
+ if (candidates.length === 0)
91
+ return null;
92
+ candidates.sort((a, b) => a.averageLatency - b.averageLatency);
93
+ return candidates[0];
94
+ }
95
+ }
96
+ exports.LatencyStrategy = LatencyStrategy;
97
+ // ─── Main Class ──────────────────────────────────────────────────────────────
98
+ class ApiKeyManager extends events_1.EventEmitter {
27
99
  keys = [];
28
100
  storageKey = 'api_rotation_state_v2';
29
- // Simplified Storage interface for Node.js environment
30
101
  storage;
31
- constructor(initialKeys, storage) {
32
- // Simple in-memory storage mock if none provided (for testing/Node)
33
- this.storage = storage || {
102
+ strategy;
103
+ fallbackFn;
104
+ // Bulkhead state
105
+ maxConcurrency;
106
+ activeCalls = 0;
107
+ // Health check state
108
+ healthCheckFn;
109
+ healthCheckInterval;
110
+ /**
111
+ * Constructor supports both legacy positional args and new options object.
112
+ *
113
+ * @example Legacy (v1/v2 — still works):
114
+ * new ApiKeyManager(['key1', 'key2'], storage, strategy)
115
+ *
116
+ * @example New (v3):
117
+ * new ApiKeyManager(keys, { storage, strategy, fallbackFn, concurrency })
118
+ */
119
+ constructor(initialKeys, storageOrOptions, strategy) {
120
+ super();
121
+ // Detect if second arg is options object or legacy storage
122
+ let options = {};
123
+ if (storageOrOptions && typeof storageOrOptions === 'object' && ('storage' in storageOrOptions || 'strategy' in storageOrOptions || 'fallbackFn' in storageOrOptions || 'concurrency' in storageOrOptions)) {
124
+ // New v3 options object
125
+ options = storageOrOptions;
126
+ }
127
+ else {
128
+ // Legacy positional args
129
+ options = {
130
+ storage: storageOrOptions,
131
+ strategy: strategy,
132
+ };
133
+ }
134
+ this.storage = options.storage || {
34
135
  getItem: () => null,
35
136
  setItem: () => { },
36
137
  };
37
- // 1. Sanitize & Deduplicate Keys "Even Better"
38
- const uniqueKeys = new Set();
39
- initialKeys.forEach(rawKey => {
40
- // Handle comma-separated keys if they appear in a single string
41
- const parts = rawKey.split(',').map(s => s.trim()).filter(s => s.length > 0);
42
- parts.forEach(p => uniqueKeys.add(p));
138
+ this.strategy = options.strategy || new StandardStrategy();
139
+ this.fallbackFn = options.fallbackFn;
140
+ this.maxConcurrency = options.concurrency || Infinity;
141
+ // Normalize input to objects
142
+ let inputKeys = [];
143
+ if (initialKeys.length > 0 && typeof initialKeys[0] === 'string') {
144
+ inputKeys = initialKeys.flatMap(k => k.split(',').map(s => ({ key: s.trim(), weight: 1.0, provider: 'default' })));
145
+ }
146
+ else {
147
+ inputKeys = initialKeys;
148
+ }
149
+ // Deduplicate
150
+ const uniqueMap = new Map();
151
+ inputKeys.forEach(k => {
152
+ if (k.key.length > 0)
153
+ uniqueMap.set(k.key, { weight: k.weight ?? 1.0, provider: k.provider ?? 'default' });
43
154
  });
44
- // 2. Warn about duplicates/empty
45
- const sanitizedCount = uniqueKeys.size;
46
- const rawLength = initialKeys.length; // Might be misleading if split happened, but roughly
47
- if (sanitizedCount < rawLength) {
48
- console.warn(`[ApiKeyManager] Optimized key pool: Removed ${rawLength - sanitizedCount} duplicate/empty keys.`);
155
+ if (uniqueMap.size < inputKeys.length) {
156
+ console.warn(`[ApiKeyManager] Removed ${inputKeys.length - uniqueMap.size} duplicate/empty keys.`);
49
157
  }
50
- this.keys = Array.from(uniqueKeys).map(k => ({
51
- key: k,
158
+ this.keys = Array.from(uniqueMap.entries()).map(([key, meta]) => ({
159
+ key,
52
160
  failCount: 0,
53
161
  failedAt: null,
54
162
  isQuotaError: false,
@@ -58,23 +166,31 @@ class ApiKeyManager {
58
166
  totalRequests: 0,
59
167
  halfOpenTestTime: null,
60
168
  customCooldown: null,
169
+ weight: meta.weight,
170
+ averageLatency: 0,
171
+ totalLatency: 0,
172
+ latencySamples: 0,
173
+ provider: meta.provider,
61
174
  }));
62
175
  this.loadState();
63
176
  }
177
+ // ─── Error Classification ────────────────────────────────────────────────
64
178
  /**
65
179
  * CLASSIFIES an error to determine handling strategy
66
180
  */
67
181
  classifyError(error, finishReason) {
68
182
  const status = error?.status || error?.response?.status;
69
183
  const message = error?.message || error?.error?.message || String(error);
70
- // 1. Check finishReason first (for 200 responses with content issues)
71
- if (finishReason === 'SAFETY') {
184
+ // 1. Check finishReason first
185
+ if (finishReason === 'SAFETY')
72
186
  return { type: 'SAFETY', retryable: false, cooldownMs: 0, markKeyFailed: false, markKeyDead: false };
73
- }
74
- if (finishReason === 'RECITATION') {
187
+ if (finishReason === 'RECITATION')
75
188
  return { type: 'RECITATION', retryable: false, cooldownMs: 0, markKeyFailed: false, markKeyDead: false };
189
+ // 2. Check timeout
190
+ if (error instanceof TimeoutError || error?.name === 'TimeoutError') {
191
+ return { type: 'TIMEOUT', retryable: true, cooldownMs: CONFIG.COOLDOWN_TRANSIENT, markKeyFailed: true, markKeyDead: false };
76
192
  }
77
- // 2. Check HTTP status codes
193
+ // 3. Check HTTP status codes
78
194
  if (status === 403 || ERROR_PATTERNS.isAuthError.test(message)) {
79
195
  return { type: 'AUTH', retryable: false, cooldownMs: Infinity, markKeyFailed: true, markKeyDead: true };
80
196
  }
@@ -96,95 +212,95 @@ class ApiKeyManager {
96
212
  }
97
213
  return { type: 'UNKNOWN', retryable: true, cooldownMs: CONFIG.COOLDOWN_TRANSIENT, markKeyFailed: true, markKeyDead: false };
98
214
  }
99
- /**
100
- * Parses Retry-After header from error response
101
- */
102
215
  parseRetryAfter(error) {
103
216
  const retryAfter = error?.response?.headers?.['retry-after'] ||
104
217
  error?.headers?.['retry-after'] ||
105
218
  error?.retryAfter;
106
219
  if (!retryAfter)
107
220
  return null;
108
- // If it's a number (seconds)
109
221
  const seconds = parseInt(retryAfter, 10);
110
222
  if (!isNaN(seconds))
111
223
  return seconds * 1000;
112
- // If it's a date string
113
224
  const date = Date.parse(retryAfter);
114
225
  if (!isNaN(date))
115
226
  return Math.max(0, date - Date.now());
116
227
  return null;
117
228
  }
118
- /**
119
- * HEALTH CHECK
120
- * Determines if a key is usable based on Circuit Breaker logic
121
- */
229
+ // ─── Cooldown ────────────────────────────────────────────────────────────
122
230
  isOnCooldown(k) {
123
- // Dead keys are NEVER usable
124
231
  if (k.circuitState === 'DEAD')
125
232
  return true;
126
233
  const now = Date.now();
127
234
  if (k.circuitState === 'OPEN') {
128
- // Check if ready for HALF_OPEN test
129
235
  if (k.halfOpenTestTime && now >= k.halfOpenTestTime) {
130
236
  k.circuitState = 'HALF_OPEN';
237
+ this.emit('circuitHalfOpen', k.key);
131
238
  return false;
132
239
  }
133
240
  return true;
134
241
  }
135
- // Additional safeguard for custom cooldowns
136
- if (k.failedAt && k.customCooldown) {
137
- if (now - k.failedAt < k.customCooldown)
138
- return true;
139
- }
140
- // Standard cooldown check
141
242
  if (k.failedAt) {
243
+ if (k.customCooldown && now - k.failedAt < k.customCooldown)
244
+ return true;
142
245
  const cooldown = k.isQuotaError ? CONFIG.COOLDOWN_QUOTA : CONFIG.COOLDOWN_TRANSIENT;
143
246
  if (now - k.failedAt < cooldown)
144
247
  return true;
145
248
  }
146
249
  return false;
147
250
  }
148
- /**
149
- * CORE ROTATION LOGIC
150
- * Returns the best available key
151
- */
251
+ // ─── Key Selection ───────────────────────────────────────────────────────
152
252
  getKey() {
153
253
  // 1. Filter out dead and cooling down keys
154
254
  const candidates = this.keys.filter(k => k.circuitState !== 'DEAD' && !this.isOnCooldown(k));
155
255
  if (candidates.length === 0) {
156
256
  // FALLBACK: Return oldest failed key (excluding DEAD)
157
257
  const nonDead = this.keys.filter(k => k.circuitState !== 'DEAD');
158
- if (nonDead.length === 0)
159
- return null; // All keys are dead!
258
+ if (nonDead.length === 0) {
259
+ this.emit('allKeysExhausted');
260
+ return null;
261
+ }
160
262
  return nonDead.sort((a, b) => (a.failedAt || 0) - (b.failedAt || 0))[0]?.key || null;
161
263
  }
162
- // 2. Sort candidates: Pristine > Fewest Failures > Least Recently Used
163
- candidates.sort((a, b) => {
164
- if (a.failCount !== b.failCount)
165
- return a.failCount - b.failCount;
166
- return a.lastUsed - b.lastUsed;
167
- });
168
- const selected = candidates[0];
169
- selected.lastUsed = Date.now();
170
- this.saveState();
171
- return selected.key;
264
+ // 2. Delegate to Strategy
265
+ const selected = this.strategy.next(candidates);
266
+ if (selected) {
267
+ selected.lastUsed = Date.now();
268
+ this.saveState();
269
+ return selected.key;
270
+ }
271
+ return null;
172
272
  }
173
273
  /**
174
- * Get count of healthy (non-DEAD) keys
274
+ * Get a key filtered by provider tag
175
275
  */
276
+ getKeyByProvider(provider) {
277
+ const candidates = this.keys.filter(k => k.provider === provider && k.circuitState !== 'DEAD' && !this.isOnCooldown(k));
278
+ if (candidates.length === 0)
279
+ return null;
280
+ const selected = this.strategy.next(candidates);
281
+ if (selected) {
282
+ selected.lastUsed = Date.now();
283
+ this.saveState();
284
+ return selected.key;
285
+ }
286
+ return null;
287
+ }
176
288
  getKeyCount() {
177
289
  return this.keys.filter(k => k.circuitState !== 'DEAD').length;
178
290
  }
291
+ // ─── Mark Success / Failed ───────────────────────────────────────────────
179
292
  /**
180
- * FEEDBACK LOOP: Success
293
+ * Mark success AND update latency stats
294
+ * @param durationMs Duration of the request in milliseconds
181
295
  */
182
- markSuccess(key) {
296
+ markSuccess(key, durationMs) {
183
297
  const k = this.keys.find(x => x.key === key);
184
298
  if (!k)
185
299
  return;
186
- if (k.circuitState !== 'CLOSED' && k.circuitState !== 'DEAD') {
300
+ const wasRecovering = k.circuitState !== 'CLOSED' && k.circuitState !== 'DEAD';
301
+ if (wasRecovering) {
187
302
  console.log(`[Key Recovered] ...${key.slice(-4)}`);
303
+ this.emit('keyRecovered', key);
188
304
  }
189
305
  k.circuitState = 'CLOSED';
190
306
  k.failCount = 0;
@@ -193,20 +309,17 @@ class ApiKeyManager {
193
309
  k.customCooldown = null;
194
310
  k.successCount++;
195
311
  k.totalRequests++;
312
+ if (durationMs !== undefined) {
313
+ k.totalLatency += durationMs;
314
+ k.latencySamples++;
315
+ k.averageLatency = k.totalLatency / k.latencySamples;
316
+ }
196
317
  this.saveState();
197
318
  }
198
- /**
199
- * FEEDBACK LOOP: Failure
200
- * Enhanced with error classification
201
- */
202
319
  markFailed(key, classification) {
203
320
  const k = this.keys.find(x => x.key === key);
204
- if (!k)
205
- return;
206
- // Don't modify DEAD keys
207
- if (k.circuitState === 'DEAD')
321
+ if (!k || k.circuitState === 'DEAD')
208
322
  return;
209
- // If this error shouldn't mark the key as failed, skip
210
323
  if (!classification.markKeyFailed)
211
324
  return;
212
325
  k.failedAt = Date.now();
@@ -214,27 +327,26 @@ class ApiKeyManager {
214
327
  k.totalRequests++;
215
328
  k.isQuotaError = classification.type === 'QUOTA';
216
329
  k.customCooldown = classification.cooldownMs || null;
217
- // Permanent death for auth errors
218
330
  if (classification.markKeyDead) {
219
331
  k.circuitState = 'DEAD';
220
- console.error(`[Key DEAD] ...${key.slice(-4)} - Permanently removed from rotation`);
221
- this.saveState();
222
- return;
223
- }
224
- // State Transitions
225
- if (k.circuitState === 'HALF_OPEN') {
226
- k.circuitState = 'OPEN';
227
- k.halfOpenTestTime = Date.now() + CONFIG.HALF_OPEN_TEST_DELAY;
332
+ console.error(`[Key DEAD] ...${key.slice(-4)} - Permanently removed`);
333
+ this.emit('keyDead', key);
228
334
  }
229
- else if (k.failCount >= CONFIG.MAX_CONSECUTIVE_FAILURES || classification.type === 'QUOTA') {
230
- k.circuitState = 'OPEN';
231
- k.halfOpenTestTime = Date.now() + (classification.cooldownMs || CONFIG.HALF_OPEN_TEST_DELAY);
335
+ else {
336
+ // State Transitions
337
+ if (k.circuitState === 'HALF_OPEN') {
338
+ k.circuitState = 'OPEN';
339
+ k.halfOpenTestTime = Date.now() + CONFIG.HALF_OPEN_TEST_DELAY;
340
+ this.emit('circuitOpen', key);
341
+ }
342
+ else if (k.failCount >= CONFIG.MAX_CONSECUTIVE_FAILURES || classification.type === 'QUOTA') {
343
+ k.circuitState = 'OPEN';
344
+ k.halfOpenTestTime = Date.now() + (classification.cooldownMs || CONFIG.HALF_OPEN_TEST_DELAY);
345
+ this.emit('circuitOpen', key);
346
+ }
232
347
  }
233
348
  this.saveState();
234
349
  }
235
- /**
236
- * Legacy markFailed for backward compatibility
237
- */
238
350
  markFailedLegacy(key, isQuota = false) {
239
351
  this.markFailed(key, {
240
352
  type: isQuota ? 'QUOTA' : 'TRANSIENT',
@@ -244,19 +356,14 @@ class ApiKeyManager {
244
356
  markKeyDead: false,
245
357
  });
246
358
  }
247
- /**
248
- * Calculate backoff delay with jitter
249
- */
359
+ // ─── Backoff ─────────────────────────────────────────────────────────────
250
360
  calculateBackoff(attempt) {
251
361
  const exponential = CONFIG.BASE_BACKOFF * Math.pow(2, attempt);
252
362
  const capped = Math.min(exponential, CONFIG.MAX_BACKOFF);
253
363
  const jitter = Math.random() * 1000;
254
364
  return capped + jitter;
255
365
  }
256
- // ... inside class ...
257
- /**
258
- * Get health statistics
259
- */
366
+ // ─── Stats ───────────────────────────────────────────────────────────────
260
367
  getStats() {
261
368
  const total = this.keys.length;
262
369
  const dead = this.keys.filter(k => k.circuitState === 'DEAD').length;
@@ -264,10 +371,149 @@ class ApiKeyManager {
264
371
  const healthy = total - dead - cooling;
265
372
  return { total, healthy, cooling, dead };
266
373
  }
267
- // Helper for testing
268
- _getKeys() {
269
- return this.keys;
374
+ _getKeys() { return this.keys; }
375
+ // ─── execute() Wrapper ───────────────────────────────────────────────────
376
+ /**
377
+ * Wraps the entire API call lifecycle into a single method.
378
+ *
379
+ * @example
380
+ * const result = await manager.execute(
381
+ * (key) => fetch(`https://api.example.com?key=${key}`),
382
+ * { maxRetries: 3, timeoutMs: 5000 }
383
+ * );
384
+ */
385
+ async execute(fn, options) {
386
+ const maxRetries = options?.maxRetries ?? 0;
387
+ const timeoutMs = options?.timeoutMs;
388
+ const finishReason = options?.finishReason;
389
+ // Bulkhead check
390
+ if (this.activeCalls >= this.maxConcurrency) {
391
+ this.emit('bulkheadRejected');
392
+ throw new BulkheadRejectionError();
393
+ }
394
+ this.activeCalls++;
395
+ try {
396
+ return await this._executeWithRetry(fn, maxRetries, timeoutMs, finishReason);
397
+ }
398
+ finally {
399
+ this.activeCalls--;
400
+ }
401
+ }
402
+ async _executeWithRetry(fn, maxRetries, timeoutMs, finishReason) {
403
+ let lastError;
404
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
405
+ const key = this.getKey();
406
+ if (!key) {
407
+ // All keys exhausted — try fallback
408
+ if (this.fallbackFn) {
409
+ this.emit('fallback', 'all keys exhausted');
410
+ return this.fallbackFn();
411
+ }
412
+ throw new AllKeysExhaustedError();
413
+ }
414
+ try {
415
+ const start = Date.now();
416
+ let result;
417
+ if (timeoutMs) {
418
+ result = await this._executeWithTimeout(fn, key, timeoutMs);
419
+ }
420
+ else {
421
+ result = await fn(key);
422
+ }
423
+ const duration = Date.now() - start;
424
+ this.markSuccess(key, duration);
425
+ this.emit('executeSuccess', key, duration);
426
+ return result;
427
+ }
428
+ catch (error) {
429
+ lastError = error;
430
+ const classification = this.classifyError(error, finishReason);
431
+ this.markFailed(key, classification);
432
+ this.emit('executeFailed', key, error);
433
+ if (!classification.retryable || attempt >= maxRetries) {
434
+ // Non-retryable or out of retries
435
+ if (this.fallbackFn && attempt >= maxRetries) {
436
+ this.emit('fallback', 'max retries exceeded');
437
+ return this.fallbackFn();
438
+ }
439
+ throw error;
440
+ }
441
+ // Retry with backoff
442
+ const delay = this.calculateBackoff(attempt);
443
+ this.emit('retry', key, attempt + 1, delay);
444
+ await this._sleep(delay);
445
+ }
446
+ }
447
+ // Should not reach here, but safety net
448
+ throw lastError;
449
+ }
450
+ async _executeWithTimeout(fn, key, timeoutMs) {
451
+ const controller = new AbortController();
452
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
453
+ try {
454
+ const result = await Promise.race([
455
+ fn(key, controller.signal),
456
+ new Promise((_, reject) => {
457
+ controller.signal.addEventListener('abort', () => {
458
+ reject(new TimeoutError(timeoutMs));
459
+ });
460
+ })
461
+ ]);
462
+ return result;
463
+ }
464
+ finally {
465
+ clearTimeout(timer);
466
+ }
467
+ }
468
+ _sleep(ms) {
469
+ return new Promise(resolve => setTimeout(resolve, ms));
470
+ }
471
+ // ─── Health Checks ───────────────────────────────────────────────────────
472
+ /**
473
+ * Set a health check function that tests if a key is operational
474
+ */
475
+ setHealthCheck(fn) {
476
+ this.healthCheckFn = fn;
477
+ }
478
+ /**
479
+ * Start periodic health checks
480
+ * @param intervalMs How often to run health checks (default: 60s)
481
+ */
482
+ startHealthChecks(intervalMs = 60_000) {
483
+ this.stopHealthChecks(); // Clear any existing interval
484
+ this.healthCheckInterval = setInterval(() => this._runHealthChecks(), intervalMs);
485
+ }
486
+ /**
487
+ * Stop periodic health checks
488
+ */
489
+ stopHealthChecks() {
490
+ if (this.healthCheckInterval) {
491
+ clearInterval(this.healthCheckInterval);
492
+ this.healthCheckInterval = undefined;
493
+ }
494
+ }
495
+ async _runHealthChecks() {
496
+ if (!this.healthCheckFn)
497
+ return;
498
+ // Check non-DEAD keys that are in OPEN or HALF_OPEN state
499
+ const keysToCheck = this.keys.filter(k => k.circuitState === 'OPEN' || k.circuitState === 'HALF_OPEN');
500
+ for (const k of keysToCheck) {
501
+ try {
502
+ const healthy = await this.healthCheckFn(k.key);
503
+ if (healthy) {
504
+ this.markSuccess(k.key);
505
+ this.emit('healthCheckPassed', k.key);
506
+ }
507
+ else {
508
+ this.emit('healthCheckFailed', k.key, new Error('Health check returned false'));
509
+ }
510
+ }
511
+ catch (error) {
512
+ this.emit('healthCheckFailed', k.key, error);
513
+ }
514
+ }
270
515
  }
516
+ // ─── Persistence ─────────────────────────────────────────────────────────
271
517
  saveState() {
272
518
  if (!this.storage)
273
519
  return;
@@ -282,6 +528,11 @@ class ApiKeyManager {
282
528
  successCount: k.successCount,
283
529
  totalRequests: k.totalRequests,
284
530
  customCooldown: k.customCooldown,
531
+ weight: k.weight,
532
+ averageLatency: k.averageLatency,
533
+ totalLatency: k.totalLatency,
534
+ latencySamples: k.latencySamples,
535
+ provider: k.provider
285
536
  }
286
537
  }), {});
287
538
  this.storage.setItem(this.storageKey, JSON.stringify(state));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}