@yildizpay/http-adapter 3.6.1 → 3.8.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.
@@ -9,35 +9,52 @@ class CircuitBreaker {
9
9
  this.failureCount = 0;
10
10
  this.successCount = 0;
11
11
  this.nextAttemptAt = 0;
12
+ this.halfOpenProbeInFlight = false;
12
13
  this.failureThreshold = options?.failureThreshold ?? 5;
13
14
  this.resetTimeoutMs = options?.resetTimeoutMs ?? 60000;
14
15
  this.successThreshold = options?.successThreshold ?? 1;
15
16
  this.isFailurePredicate = options?.isFailure ?? (() => true);
16
17
  }
18
+ observe(observer) {
19
+ this.observer = observer;
20
+ return this;
21
+ }
17
22
  getState() {
18
- if (this.state === circuit_state_enum_1.CircuitState.OPEN) {
19
- if (Date.now() >= this.nextAttemptAt) {
20
- this.transitionTo(circuit_state_enum_1.CircuitState.HALF_OPEN);
21
- }
23
+ if (this.state === circuit_state_enum_1.CircuitState.OPEN && Date.now() >= this.nextAttemptAt) {
24
+ this.transitionTo(circuit_state_enum_1.CircuitState.HALF_OPEN);
22
25
  }
23
26
  return this.state;
24
27
  }
25
28
  async execute(operation) {
26
29
  const currentState = this.getState();
27
30
  if (currentState === circuit_state_enum_1.CircuitState.OPEN) {
28
- throw new circuit_breaker_open_exception_1.CircuitBreakerOpenException();
31
+ throw new circuit_breaker_open_exception_1.CircuitBreakerOpenException(this.nextAttemptAt);
32
+ }
33
+ if (currentState === circuit_state_enum_1.CircuitState.HALF_OPEN) {
34
+ if (this.halfOpenProbeInFlight) {
35
+ this.observer?.onProbeRejected?.();
36
+ throw new circuit_breaker_open_exception_1.CircuitBreakerOpenException(0, 'Circuit Breaker is HALF_OPEN. A probe request is already in flight.');
37
+ }
38
+ this.halfOpenProbeInFlight = true;
29
39
  }
30
40
  try {
31
41
  const result = await operation();
32
42
  this.recordSuccess();
43
+ this.observer?.onSuccess?.();
33
44
  return result;
34
45
  }
35
46
  catch (error) {
36
47
  if (this.isFailurePredicate(error)) {
37
48
  this.recordFailure();
49
+ this.observer?.onFailure?.(error);
38
50
  }
39
51
  throw error;
40
52
  }
53
+ finally {
54
+ if (this.state === circuit_state_enum_1.CircuitState.HALF_OPEN) {
55
+ this.halfOpenProbeInFlight = false;
56
+ }
57
+ }
41
58
  }
42
59
  recordSuccess() {
43
60
  if (this.state === circuit_state_enum_1.CircuitState.HALF_OPEN) {
@@ -62,21 +79,13 @@ class CircuitBreaker {
62
79
  }
63
80
  }
64
81
  transitionTo(newState) {
82
+ const previousState = this.state;
65
83
  this.state = newState;
66
- if (newState === circuit_state_enum_1.CircuitState.OPEN) {
67
- this.failureCount = 0;
68
- this.successCount = 0;
69
- this.nextAttemptAt = Date.now() + this.resetTimeoutMs;
70
- }
71
- else if (newState === circuit_state_enum_1.CircuitState.HALF_OPEN) {
72
- this.failureCount = 0;
73
- this.successCount = 0;
74
- }
75
- else {
76
- this.failureCount = 0;
77
- this.successCount = 0;
78
- this.nextAttemptAt = 0;
79
- }
84
+ this.failureCount = 0;
85
+ this.successCount = 0;
86
+ this.halfOpenProbeInFlight = false;
87
+ this.nextAttemptAt = newState === circuit_state_enum_1.CircuitState.OPEN ? Date.now() + this.resetTimeoutMs : 0;
88
+ this.observer?.onStateChange?.(previousState, newState);
80
89
  }
81
90
  }
82
91
  exports.CircuitBreaker = CircuitBreaker;
@@ -1 +1 @@
1
- {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/resilience/circuit-breaker/circuit-breaker.ts"],"names":[],"mappings":";;;AAAA,6DAAoD;AAEpD,oGAA8F;AAM9F,MAAa,cAAc;IAWzB,YAAY,OAA+B;QAVnC,UAAK,GAAiB,iCAAY,CAAC,MAAM,CAAC;QAC1C,iBAAY,GAAW,CAAC,CAAC;QACzB,iBAAY,GAAW,CAAC,CAAC;QACzB,kBAAa,GAAW,CAAC,CAAC;QAQhC,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC;QACvD,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,GAAG,OAAO,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IAMM,QAAQ;QACb,IAAI,IAAI,CAAC,KAAK,KAAK,iCAAY,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC,YAAY,CAAC,iCAAY,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAMM,KAAK,CAAC,OAAO,CAAI,SAA2B;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAErC,IAAI,YAAY,KAAK,iCAAY,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,IAAI,4DAA2B,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,KAAK,KAAK,iCAAY,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,iCAAY,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,CAAC;YAGN,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,KAAK,KAAK,iCAAY,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,iCAAY,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YAEN,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,iCAAY,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,QAAsB;QACzC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,QAAQ,KAAK,iCAAY,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QACxD,CAAC;aAAM,IAAI,QAAQ,KAAK,iCAAY,CAAC,SAAS,EAAE,CAAC;YAC/C,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AA9FD,wCA8FC"}
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/resilience/circuit-breaker/circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { RetryPolicy } from '../contracts/retry-policy.contract';
2
+ import { HttpAdapterObserver } from '../observability/http-adapter-observer';
2
3
  export declare class RetryExecutor {
3
4
  private readonly policy;
4
- constructor(policy: RetryPolicy);
5
+ private readonly observer?;
6
+ constructor(policy: RetryPolicy, observer?: HttpAdapterObserver | undefined);
5
7
  execute<T>(operation: () => Promise<T>): Promise<T>;
6
8
  }
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RetryExecutor = void 0;
4
+ const base_adapter_exception_1 = require("../exceptions/base-adapter.exception");
4
5
  class RetryExecutor {
5
- constructor(policy) {
6
+ constructor(policy, observer) {
6
7
  this.policy = policy;
8
+ this.observer = observer;
7
9
  }
8
10
  async execute(operation) {
9
11
  let attempt = 1;
@@ -17,6 +19,9 @@ class RetryExecutor {
17
19
  if (attempt >= this.policy.maxAttempts)
18
20
  throw err;
19
21
  const delay = this.policy.backoffMs(attempt);
22
+ if (this.observer?.onRetry && err instanceof base_adapter_exception_1.BaseAdapterException) {
23
+ this.observer.onRetry(attempt, err, delay);
24
+ }
20
25
  await new Promise((resolve) => setTimeout(resolve, delay));
21
26
  attempt++;
22
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"retry-executor.js","sourceRoot":"","sources":["../../src/resilience/retry-executor.ts"],"names":[],"mappings":";;;AAYA,MAAa,aAAa;IAMxB,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAYpD,KAAK,CAAC,OAAO,CAAI,SAA2B;QAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBAEH,OAAO,MAAM,SAAS,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBAEb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC;gBAGzC,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;oBAAE,MAAM,GAAG,CAAC;gBAGlD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAG7C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAE3D,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA1CD,sCA0CC"}
1
+ {"version":3,"file":"retry-executor.js","sourceRoot":"","sources":["../../src/resilience/retry-executor.ts"],"names":[],"mappings":";;;AACA,iFAA4E;AAa5E,MAAa,aAAa;IAOxB,YACmB,MAAmB,EACnB,QAA8B;QAD9B,WAAM,GAAN,MAAM,CAAa;QACnB,aAAQ,GAAR,QAAQ,CAAsB;IAC9C,CAAC;IAYJ,KAAK,CAAC,OAAO,CAAI,SAA2B;QAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,MAAM,SAAS,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC;gBAEzC,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;oBAAE,MAAM,GAAG,CAAC;gBAElD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE7C,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,GAAG,YAAY,6CAAoB,EAAE,CAAC;oBAClE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC7C,CAAC;gBAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAE3D,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA7CD,sCA6CC"}