redeye-breaker 0.1.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.
@@ -0,0 +1,577 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CircuitBreaker = exports.StoreUnavailableError = void 0;
4
+ const types_1 = require("./types");
5
+ /**
6
+ * Thrown in distributed mode when the backing store is unreachable and
7
+ * `failOpenOnStoreError` is `false`. Distinguishable from a downstream
8
+ * failure so callers (and metrics) can tell "the dependency failed" apart
9
+ * from "we couldn't tell whether the dependency is healthy."
10
+ */
11
+ class StoreUnavailableError extends Error {
12
+ constructor(operation, cause) {
13
+ super(`Circuit breaker store unavailable for operation: ${operation}`);
14
+ this.name = 'StoreUnavailableError';
15
+ this.cause = cause;
16
+ }
17
+ }
18
+ exports.StoreUnavailableError = StoreUnavailableError;
19
+ const noopLogger = { warn: () => { }, log: () => { } };
20
+ /**
21
+ * A circuit breaker with an optional distributed mode.
22
+ *
23
+ * Local mode (default) tracks failures per-process in memory. Distributed
24
+ * mode (pass a `store`) persists state through the store so a failure burst
25
+ * trips the breaker for every instance sharing it.
26
+ *
27
+ * When the store implements the optional `recordFailureAtomic` and
28
+ * `claimTrial` methods (as `RedisStore` does), distributed mode gets exact
29
+ * failure counts and real single-trial half-open behavior instead of
30
+ * best-effort approximations. See the README for the full reliability
31
+ * model and the handful of tradeoffs that are fundamental to any
32
+ * distributed system (store TTL trust, clock skew on informational
33
+ * timestamps, etc.) rather than fixable engineering gaps.
34
+ */
35
+ class CircuitBreaker {
36
+ constructor(options = {}) {
37
+ this.warnedCapabilities = new Set();
38
+ this.metrics = new Map();
39
+ // local mode state
40
+ this.failures = new Map();
41
+ this.lastFailureTime = new Map();
42
+ this.openOperations = new Set();
43
+ this.openCounts = new Map();
44
+ this.trialInProgress = new Set();
45
+ this.trialClaimedAt = new Map();
46
+ this.errorRates = new Map();
47
+ this.sampleCounts = new Map();
48
+ const resetTimeout = options.resetTimeout ?? 60000;
49
+ this.options = {
50
+ strategy: options.strategy ?? 'consecutive',
51
+ failureThreshold: options.failureThreshold ?? 5,
52
+ errorRateThreshold: options.errorRateThreshold ?? 0.5,
53
+ minimumCalls: options.minimumCalls ?? 10,
54
+ errorRateDecay: options.errorRateDecay ?? 0.9,
55
+ resetTimeout,
56
+ monitorInterval: options.monitorInterval ?? 5000,
57
+ timeout: options.timeout,
58
+ trialTimeout: options.trialTimeout ?? Math.min(options.timeout ?? 10000, resetTimeout),
59
+ backoffMultiplier: options.backoffMultiplier ?? 2,
60
+ maxResetTimeout: options.maxResetTimeout ?? resetTimeout * 8,
61
+ jitter: options.jitter ?? 0.1,
62
+ onStateChange: options.onStateChange,
63
+ store: options.store,
64
+ failOpenOnStoreError: options.failOpenOnStoreError ?? true,
65
+ onStoreError: options.onStoreError,
66
+ logger: options.logger ?? noopLogger,
67
+ };
68
+ this.distributed = !!options.store;
69
+ this.monitorHandle = setInterval(() => this.monitor(), this.options.monitorInterval);
70
+ this.monitorHandle.unref?.();
71
+ }
72
+ /** Stops the local-mode monitor interval. Call this when the breaker is no longer needed. */
73
+ destroy() {
74
+ clearInterval(this.monitorHandle);
75
+ }
76
+ async execute(operation, fn) {
77
+ return this.distributed ? this.executeDistributed(operation, fn) : this.executeLocal(operation, fn);
78
+ }
79
+ /**
80
+ * Synchronous, best-effort, read-only check (never claims a trial slot).
81
+ * In distributed mode this cannot await the store, so it always returns
82
+ * `true` — use `canExecuteAsync` there.
83
+ */
84
+ canExecute(operation) {
85
+ return this.distributed ? true : this.peekLocalGate(operation);
86
+ }
87
+ /**
88
+ * Async, store-aware, read-only check (never claims a trial slot — use
89
+ * `execute` for that). Honors `failOpenOnStoreError`. Because it's
90
+ * read-only, a `true` result is advisory: another caller (or `execute`
91
+ * itself, immediately after) can still claim the only trial slot first.
92
+ */
93
+ async canExecuteAsync(operation) {
94
+ if (!this.distributed)
95
+ return this.peekLocalGate(operation);
96
+ const gate = await this.gateDistributed(operation, false);
97
+ return gate.allowed;
98
+ }
99
+ recordFailure(operation) {
100
+ if (this.distributed) {
101
+ if (this.options.strategy === 'errorRate') {
102
+ void this.recordOutcomeDistributed(operation, false);
103
+ }
104
+ else {
105
+ void this.recordFailureDistributedCounting(operation);
106
+ }
107
+ }
108
+ else if (this.options.strategy === 'errorRate') {
109
+ this.recordRateOutcomeLocal(operation, false);
110
+ }
111
+ else {
112
+ this.recordFailureLocalCounting(operation);
113
+ }
114
+ }
115
+ recordSuccess(operation) {
116
+ if (this.distributed) {
117
+ void this.closeDistributed(operation);
118
+ }
119
+ else {
120
+ this.resetLocal(operation);
121
+ }
122
+ }
123
+ async getState(operation) {
124
+ if (this.distributed) {
125
+ return (await this.safeGet(operation)) ?? { ...types_1.CLOSED_STATE };
126
+ }
127
+ const failures = this.failures.get(operation) ?? 0;
128
+ const lastFailure = this.lastFailureTime.get(operation) ?? 0;
129
+ const openCount = this.openCounts.get(operation) ?? 0;
130
+ const errorRate = this.errorRates.get(operation) ?? 0;
131
+ const sampleCount = this.sampleCounts.get(operation) ?? 0;
132
+ return { failures, lastFailure, isOpen: this.openOperations.has(operation), openCount, errorRate, sampleCount };
133
+ }
134
+ async reset(operation) {
135
+ if (this.distributed) {
136
+ const prior = await this.safeGet(operation);
137
+ await this.safeDelMain(operation);
138
+ await this.safeDelTrial(operation);
139
+ if (prior?.isOpen) {
140
+ this.options.onStateChange?.('closed', operation);
141
+ }
142
+ this.options.logger.log(`Circuit breaker reset for operation: ${operation}`);
143
+ }
144
+ else {
145
+ this.resetLocal(operation);
146
+ }
147
+ }
148
+ /** Per-instance call counters for `operation`. In distributed mode this reflects only calls this instance handled — export it via your own metrics system and aggregate across instances, the same way you would any per-process Prometheus counter. */
149
+ getMetrics(operation) {
150
+ const m = this.metrics.get(operation);
151
+ return m ? { ...m } : (0, types_1.emptyMetrics)();
152
+ }
153
+ getAllMetrics() {
154
+ const result = {};
155
+ for (const [operation, m] of this.metrics.entries())
156
+ result[operation] = { ...m };
157
+ return result;
158
+ }
159
+ metricsFor(operation) {
160
+ let m = this.metrics.get(operation);
161
+ if (!m) {
162
+ m = (0, types_1.emptyMetrics)();
163
+ this.metrics.set(operation, m);
164
+ }
165
+ return m;
166
+ }
167
+ // ---- backoff / jitter -------------------------------------------------
168
+ effectiveResetTimeout(openCount) {
169
+ const backed = this.options.resetTimeout * Math.pow(this.options.backoffMultiplier, openCount);
170
+ const capped = Math.min(backed, this.options.maxResetTimeout);
171
+ if (!this.options.jitter)
172
+ return capped;
173
+ const delta = capped * this.options.jitter;
174
+ return capped + (Math.random() * 2 - 1) * delta;
175
+ }
176
+ // ---- distributed mode -----------------------------------------------
177
+ key(operation) {
178
+ return `circuit_breaker:${operation}`;
179
+ }
180
+ trialKey(operation) {
181
+ return `circuit_breaker:${operation}:trial`;
182
+ }
183
+ stateTtlSeconds(openCount) {
184
+ // A generous safety-net TTL, decoupled from the actual gating decision
185
+ // (which uses lastFailure + effectiveResetTimeout below) so early
186
+ // eviction degrades gracefully rather than being the sole correctness
187
+ // mechanism. See README limitation on store TTL trust.
188
+ return Math.max(1, Math.ceil((this.effectiveResetTimeout(openCount) * 3) / 1000));
189
+ }
190
+ trialTtlSeconds() {
191
+ return Math.max(1, Math.ceil(this.options.trialTimeout / 1000));
192
+ }
193
+ reportStoreError(error, operation) {
194
+ this.metricsFor(operation).totalStoreErrors++;
195
+ this.options.logger.warn(`Circuit breaker store error for operation: ${operation}: ${error?.message ?? error}`);
196
+ this.options.onStoreError?.(error, operation);
197
+ }
198
+ warnMissingCapability(capability) {
199
+ if (this.warnedCapabilities.has(capability))
200
+ return;
201
+ this.warnedCapabilities.add(capability);
202
+ this.options.logger.warn(`Store does not implement ${capability}(); falling back to best-effort distributed semantics for this capability. See README limitations.`);
203
+ }
204
+ async safeGet(operation) {
205
+ try {
206
+ return await this.options.store.get(this.key(operation));
207
+ }
208
+ catch (error) {
209
+ this.reportStoreError(error, operation);
210
+ return null;
211
+ }
212
+ }
213
+ async safeSet(operation, state, ttlSeconds) {
214
+ try {
215
+ await this.options.store.set(this.key(operation), state, ttlSeconds);
216
+ }
217
+ catch (error) {
218
+ this.reportStoreError(error, operation);
219
+ }
220
+ }
221
+ /** Deletes the main state key for `operation`. Best-effort: logged, never thrown. */
222
+ async safeDelMain(operation) {
223
+ try {
224
+ await this.options.store.del(this.key(operation));
225
+ }
226
+ catch (error) {
227
+ this.reportStoreError(error, operation);
228
+ }
229
+ }
230
+ /** Deletes the trial-claim key for `operation`, releasing it early instead of waiting for its TTL. Best-effort. */
231
+ async safeDelTrial(operation) {
232
+ try {
233
+ await this.options.store.del(this.trialKey(operation));
234
+ }
235
+ catch (error) {
236
+ this.reportStoreError(error, operation);
237
+ }
238
+ }
239
+ async closeDistributed(operation) {
240
+ await this.safeSet(operation, { ...types_1.CLOSED_STATE }, this.stateTtlSeconds(0));
241
+ }
242
+ /**
243
+ * Determines whether a call is allowed through in distributed mode.
244
+ * `claim: true` (used by `execute`) attempts to atomically claim the
245
+ * single half-open trial slot when eligible. `claim: false` (used by
246
+ * `canExecuteAsync`) is read-only and never claims.
247
+ */
248
+ async gateDistributed(operation, claim) {
249
+ let state;
250
+ try {
251
+ state = await this.options.store.get(this.key(operation));
252
+ }
253
+ catch (error) {
254
+ this.reportStoreError(error, operation);
255
+ if (this.options.failOpenOnStoreError)
256
+ return { allowed: true, isTrial: false };
257
+ throw new StoreUnavailableError(operation, error);
258
+ }
259
+ if (!state?.isOpen)
260
+ return { allowed: true, isTrial: false };
261
+ const effective = this.effectiveResetTimeout(state.openCount ?? 0);
262
+ if (Date.now() - state.lastFailure < effective) {
263
+ return { allowed: false, isTrial: false };
264
+ }
265
+ if (!claim)
266
+ return { allowed: true, isTrial: false };
267
+ if (this.options.store.claimTrial) {
268
+ try {
269
+ const claimed = await this.options.store.claimTrial(this.trialKey(operation), this.trialTtlSeconds());
270
+ return { allowed: claimed, isTrial: claimed };
271
+ }
272
+ catch (error) {
273
+ this.reportStoreError(error, operation);
274
+ if (!this.options.failOpenOnStoreError)
275
+ throw new StoreUnavailableError(operation, error);
276
+ // Can't confirm exclusivity — fail open on the trial itself rather than deadlocking forever.
277
+ return { allowed: true, isTrial: true };
278
+ }
279
+ }
280
+ this.warnMissingCapability('claimTrial');
281
+ return { allowed: true, isTrial: true };
282
+ }
283
+ async executeDistributed(operation, fn) {
284
+ const metrics = this.metricsFor(operation);
285
+ metrics.totalCalls++;
286
+ const gate = await this.gateDistributed(operation, true);
287
+ if (!gate.allowed) {
288
+ metrics.totalRejections++;
289
+ throw new Error(`Circuit breaker is open for operation: ${operation}`);
290
+ }
291
+ try {
292
+ const result = await this.executeWithTimeout(fn);
293
+ metrics.totalSuccesses++;
294
+ if (gate.isTrial) {
295
+ await this.closeDistributed(operation);
296
+ await this.safeDelTrial(operation);
297
+ }
298
+ else if (this.options.strategy === 'errorRate') {
299
+ await this.recordOutcomeDistributed(operation, true);
300
+ }
301
+ else {
302
+ await this.closeDistributed(operation);
303
+ }
304
+ return result;
305
+ }
306
+ catch (error) {
307
+ metrics.totalFailures++;
308
+ if (gate.isTrial) {
309
+ await this.reopenAfterFailedTrialDistributed(operation);
310
+ await this.safeDelTrial(operation);
311
+ }
312
+ else if (this.options.strategy === 'errorRate') {
313
+ await this.recordOutcomeDistributed(operation, false);
314
+ }
315
+ else {
316
+ await this.recordFailureDistributedCounting(operation);
317
+ }
318
+ throw error;
319
+ }
320
+ }
321
+ async recordFailureDistributedCounting(operation) {
322
+ if (this.options.store.recordFailureAtomic) {
323
+ try {
324
+ const next = await this.options.store.recordFailureAtomic(this.key(operation), {
325
+ ttlSeconds: this.stateTtlSeconds(0),
326
+ failureThreshold: this.options.failureThreshold,
327
+ now: Date.now(),
328
+ });
329
+ this.options.logger.warn(`Recorded failure for operation: ${operation}, total failures: ${next.failures}`);
330
+ if (next.isOpen && next.failures === this.options.failureThreshold) {
331
+ this.options.logger.warn(`Circuit breaker opened for operation: ${operation}`);
332
+ this.options.onStateChange?.('open', operation);
333
+ }
334
+ return;
335
+ }
336
+ catch (error) {
337
+ this.reportStoreError(error, operation);
338
+ // fall through to non-atomic fallback below
339
+ }
340
+ }
341
+ else {
342
+ this.warnMissingCapability('recordFailureAtomic');
343
+ }
344
+ const current = (await this.safeGet(operation)) ?? { ...types_1.CLOSED_STATE };
345
+ const next = {
346
+ failures: current.failures + 1,
347
+ lastFailure: Date.now(),
348
+ isOpen: current.failures + 1 >= this.options.failureThreshold,
349
+ openCount: 0,
350
+ errorRate: current.errorRate ?? 0,
351
+ sampleCount: current.sampleCount ?? 0,
352
+ };
353
+ await this.safeSet(operation, next, this.stateTtlSeconds(0));
354
+ this.options.logger.warn(`Recorded failure for operation: ${operation}, total failures: ${next.failures}`);
355
+ if (next.isOpen && !current.isOpen) {
356
+ this.options.logger.warn(`Circuit breaker opened for operation: ${operation}`);
357
+ this.options.onStateChange?.('open', operation);
358
+ }
359
+ }
360
+ /**
361
+ * `strategy: 'errorRate'` counterpart to `recordFailureDistributedCounting`
362
+ * — called on every closed-phase call (success or failure), not just
363
+ * failures, since the rate needs both to be meaningful.
364
+ */
365
+ async recordOutcomeDistributed(operation, success) {
366
+ if (this.options.store.recordOutcomeAtomic) {
367
+ try {
368
+ const next = await this.options.store.recordOutcomeAtomic(this.key(operation), {
369
+ success,
370
+ decay: this.options.errorRateDecay,
371
+ minimumCalls: this.options.minimumCalls,
372
+ errorRateThreshold: this.options.errorRateThreshold,
373
+ ttlSeconds: this.stateTtlSeconds(0),
374
+ now: Date.now(),
375
+ });
376
+ if (next.openedNow) {
377
+ this.options.logger.warn(`Circuit breaker opened for operation: ${operation} (error rate ${(next.errorRate * 100).toFixed(1)}% over ${next.sampleCount} calls)`);
378
+ this.options.onStateChange?.('open', operation);
379
+ }
380
+ return;
381
+ }
382
+ catch (error) {
383
+ this.reportStoreError(error, operation);
384
+ // fall through to non-atomic fallback below
385
+ }
386
+ }
387
+ else {
388
+ this.warnMissingCapability('recordOutcomeAtomic');
389
+ }
390
+ const current = (await this.safeGet(operation)) ?? { ...types_1.CLOSED_STATE };
391
+ const decay = this.options.errorRateDecay;
392
+ const errorRate = (current.errorRate ?? 0) * decay + (success ? 0 : 1) * (1 - decay);
393
+ const sampleCount = (current.sampleCount ?? 0) + 1;
394
+ const isOpen = sampleCount >= this.options.minimumCalls && errorRate >= this.options.errorRateThreshold;
395
+ const next = {
396
+ failures: current.failures,
397
+ lastFailure: Date.now(),
398
+ isOpen,
399
+ openCount: current.openCount ?? 0,
400
+ errorRate,
401
+ sampleCount,
402
+ };
403
+ await this.safeSet(operation, next, this.stateTtlSeconds(0));
404
+ if (isOpen && !current.isOpen) {
405
+ this.options.logger.warn(`Circuit breaker opened for operation: ${operation} (error rate ${(errorRate * 100).toFixed(1)}% over ${sampleCount} calls)`);
406
+ this.options.onStateChange?.('open', operation);
407
+ }
408
+ }
409
+ async reopenAfterFailedTrialDistributed(operation) {
410
+ const current = (await this.safeGet(operation)) ?? { ...types_1.CLOSED_STATE, isOpen: true };
411
+ const openCount = (current.openCount ?? 0) + 1;
412
+ const next = {
413
+ failures: Math.max(current.failures, this.options.failureThreshold),
414
+ lastFailure: Date.now(),
415
+ isOpen: true,
416
+ openCount,
417
+ errorRate: current.errorRate ?? 0,
418
+ sampleCount: current.sampleCount ?? 0,
419
+ };
420
+ await this.safeSet(operation, next, this.stateTtlSeconds(openCount));
421
+ this.options.logger.warn(`Half-open trial failed for operation: ${operation}; backing off (attempt ${openCount + 1})`);
422
+ }
423
+ // ---- local mode -------------------------------------------------------
424
+ async executeLocal(operation, fn) {
425
+ const metrics = this.metricsFor(operation);
426
+ metrics.totalCalls++;
427
+ const gate = this.claimLocalGate(operation);
428
+ if (!gate.allowed) {
429
+ metrics.totalRejections++;
430
+ throw new Error(`Circuit breaker is open for operation: ${operation}`);
431
+ }
432
+ try {
433
+ const result = await this.executeWithTimeout(fn);
434
+ metrics.totalSuccesses++;
435
+ if (gate.isTrial) {
436
+ this.resetLocal(operation);
437
+ }
438
+ else if (this.options.strategy === 'errorRate') {
439
+ this.recordRateOutcomeLocal(operation, true);
440
+ }
441
+ else {
442
+ this.resetLocal(operation);
443
+ }
444
+ return result;
445
+ }
446
+ catch (error) {
447
+ metrics.totalFailures++;
448
+ if (gate.isTrial) {
449
+ this.reopenAfterFailedTrialLocal(operation);
450
+ }
451
+ else if (this.options.strategy === 'errorRate') {
452
+ this.recordRateOutcomeLocal(operation, false);
453
+ }
454
+ else {
455
+ this.recordFailureLocalCounting(operation);
456
+ }
457
+ throw error;
458
+ }
459
+ }
460
+ /** Read-only gate check — never claims the trial slot. Used by `canExecute`. */
461
+ peekLocalGate(operation) {
462
+ if (!this.openOperations.has(operation))
463
+ return true;
464
+ const openCount = this.openCounts.get(operation) ?? 0;
465
+ const lastFailure = this.lastFailureTime.get(operation) ?? 0;
466
+ const effective = this.effectiveResetTimeout(openCount);
467
+ if (Date.now() - lastFailure < effective) {
468
+ this.options.logger.warn(`Circuit breaker open for operation: ${operation}`);
469
+ return false;
470
+ }
471
+ return true;
472
+ }
473
+ /** Gate check used by `execute` — claims the exclusive trial slot when eligible. */
474
+ claimLocalGate(operation) {
475
+ if (!this.openOperations.has(operation))
476
+ return { allowed: true, isTrial: false };
477
+ const openCount = this.openCounts.get(operation) ?? 0;
478
+ const lastFailure = this.lastFailureTime.get(operation) ?? 0;
479
+ const effective = this.effectiveResetTimeout(openCount);
480
+ if (Date.now() - lastFailure < effective) {
481
+ this.options.logger.warn(`Circuit breaker open for operation: ${operation}`);
482
+ return { allowed: false, isTrial: false };
483
+ }
484
+ if (this.trialInProgress.has(operation)) {
485
+ // Another in-flight call already claimed the trial; stay blocked until it resolves.
486
+ return { allowed: false, isTrial: false };
487
+ }
488
+ this.trialInProgress.add(operation);
489
+ this.trialClaimedAt.set(operation, Date.now());
490
+ return { allowed: true, isTrial: true };
491
+ }
492
+ recordFailureLocalCounting(operation) {
493
+ const failures = (this.failures.get(operation) ?? 0) + 1;
494
+ this.failures.set(operation, failures);
495
+ this.lastFailureTime.set(operation, Date.now());
496
+ this.options.logger.warn(`Recorded failure for operation: ${operation}, total failures: ${failures}`);
497
+ if (failures >= this.options.failureThreshold && !this.openOperations.has(operation)) {
498
+ this.openOperations.add(operation);
499
+ this.openCounts.set(operation, 0);
500
+ this.options.logger.warn(`Circuit breaker opened for operation: ${operation}`);
501
+ this.options.onStateChange?.('open', operation);
502
+ }
503
+ }
504
+ /** `strategy: 'errorRate'` counterpart to `recordFailureLocalCounting` — called on every closed-phase call, not just failures. */
505
+ recordRateOutcomeLocal(operation, success) {
506
+ const decay = this.options.errorRateDecay;
507
+ const rate = (this.errorRates.get(operation) ?? 0) * decay + (success ? 0 : 1) * (1 - decay);
508
+ const count = (this.sampleCounts.get(operation) ?? 0) + 1;
509
+ this.errorRates.set(operation, rate);
510
+ this.sampleCounts.set(operation, count);
511
+ if (count >= this.options.minimumCalls && rate >= this.options.errorRateThreshold && !this.openOperations.has(operation)) {
512
+ this.openOperations.add(operation);
513
+ this.openCounts.set(operation, 0);
514
+ this.lastFailureTime.set(operation, Date.now());
515
+ this.options.logger.warn(`Circuit breaker opened for operation: ${operation} (error rate ${(rate * 100).toFixed(1)}% over ${count} calls)`);
516
+ this.options.onStateChange?.('open', operation);
517
+ }
518
+ }
519
+ reopenAfterFailedTrialLocal(operation) {
520
+ this.trialInProgress.delete(operation);
521
+ this.trialClaimedAt.delete(operation);
522
+ const openCount = (this.openCounts.get(operation) ?? 0) + 1;
523
+ this.openCounts.set(operation, openCount);
524
+ this.lastFailureTime.set(operation, Date.now());
525
+ this.options.logger.warn(`Half-open trial failed for operation: ${operation}; backing off (attempt ${openCount + 1})`);
526
+ }
527
+ resetLocal(operation) {
528
+ const wasOpen = this.openOperations.has(operation);
529
+ this.failures.delete(operation);
530
+ this.lastFailureTime.delete(operation);
531
+ this.openOperations.delete(operation);
532
+ this.openCounts.delete(operation);
533
+ this.trialInProgress.delete(operation);
534
+ this.trialClaimedAt.delete(operation);
535
+ this.errorRates.delete(operation);
536
+ this.sampleCounts.delete(operation);
537
+ if (wasOpen) {
538
+ this.options.onStateChange?.('closed', operation);
539
+ }
540
+ this.options.logger.log(`Circuit breaker reset for operation: ${operation}`);
541
+ }
542
+ /**
543
+ * Safety net only: force-releases a trial claim that's been held far
544
+ * longer than `trialTimeout` should ever allow, which can only happen if
545
+ * the wrapped function never settles (no timeout configured and it hangs
546
+ * forever). Without this, a single hung call would permanently wedge the
547
+ * breaker open with no way to ever attempt another trial.
548
+ */
549
+ monitor() {
550
+ const now = Date.now();
551
+ const staleBound = Math.max(this.options.trialTimeout, 1000) * 3;
552
+ for (const [operation, claimedAt] of this.trialClaimedAt.entries()) {
553
+ if (now - claimedAt > staleBound) {
554
+ this.trialInProgress.delete(operation);
555
+ this.trialClaimedAt.delete(operation);
556
+ this.options.logger.warn(`Circuit breaker trial for operation: ${operation} appears stuck (wrapped function never settled); force-releasing after ${staleBound}ms. Consider configuring a timeout.`);
557
+ }
558
+ }
559
+ }
560
+ // ---- shared -------------------------------------------------------------
561
+ executeWithTimeout(fn) {
562
+ if (!this.options.timeout)
563
+ return fn();
564
+ return new Promise((resolve, reject) => {
565
+ const timer = setTimeout(() => reject(new Error(`Operation timed out after ${this.options.timeout}ms`)), this.options.timeout);
566
+ fn().then((value) => {
567
+ clearTimeout(timer);
568
+ resolve(value);
569
+ }, (error) => {
570
+ clearTimeout(timer);
571
+ reject(error);
572
+ });
573
+ });
574
+ }
575
+ }
576
+ exports.CircuitBreaker = CircuitBreaker;
577
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { CircuitBreaker, StoreUnavailableError } from './circuit-breaker';
2
+ export type { CircuitBreakerOptions, CircuitBreakerState, CircuitMetrics, CircuitState, BreakerLogger } from './circuit-breaker';
3
+ export type { Store } from './store';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjI,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StoreUnavailableError = exports.CircuitBreaker = void 0;
4
+ var circuit_breaker_1 = require("./circuit-breaker");
5
+ Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return circuit_breaker_1.CircuitBreaker; } });
6
+ Object.defineProperty(exports, "StoreUnavailableError", { enumerable: true, get: function () { return circuit_breaker_1.StoreUnavailableError; } });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAA0E;AAAjE,iHAAA,cAAc,OAAA;AAAE,wHAAA,qBAAqB,OAAA"}