@defai.digital/provider-domain 13.4.10 → 13.5.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,KAAK,4BAA4B,IAAI,oBAAoB,EACzD,KAAK,2BAA2B,IAAI,mBAAmB,EACvD,KAAK,2BAA2B,IAAI,mBAAmB,EAKxD,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,KAAK,4BAA4B,IAAI,oBAAoB,EACzD,KAAK,2BAA2B,IAAI,mBAAmB,EACvD,KAAK,2BAA2B,IAAI,mBAAmB,EAKxD,MAAM,0BAA0B,CAAC;AAQlC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,QAAQ,IAAI,mBAAmB,CAAC;IAEhC,kCAAkC;IAClC,UAAU,IAAI,OAAO,CAAC;IAEtB,kCAAkC;IAClC,aAAa,IAAI,IAAI,CAAC;IAEtB,8BAA8B;IAC9B,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC,kCAAkC;IAClC,SAAS,IAAI,IAAI,CAAC;IAElB,oCAAoC;IACpC,UAAU,IAAI,IAAI,CAAC;IAEnB,wBAAwB;IACxB,SAAS,IAAI,mBAAmB,EAAE,CAAC;IAEnC,gCAAgC;IAChC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAExE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM,GACzC,cAAc,CAyKhB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAAE,MAAM;aACZ,UAAU,EAAE,MAAM;gBADlB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM;IAMjB,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB;CAO5D"}
|
package/dist/circuit-breaker.js
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* - INV-CB-003: Half-open allows limited requests for recovery testing
|
|
11
11
|
*/
|
|
12
12
|
import { createDefaultProviderCircuitBreakerConfig as createDefaultCircuitBreakerConfig, createInitialProviderCircuitBreakerState as createInitialCircuitBreakerState, ProviderCircuitBreakerErrorCodes as CircuitBreakerErrorCodes, } from '@defai.digital/contracts';
|
|
13
|
+
/**
|
|
14
|
+
* Maximum number of events to retain in memory
|
|
15
|
+
* INV-CB-004: Event buffer is bounded to prevent memory leaks
|
|
16
|
+
*/
|
|
17
|
+
const MAX_EVENTS = 1000;
|
|
13
18
|
/**
|
|
14
19
|
* Creates a circuit breaker for a provider
|
|
15
20
|
*/
|
|
@@ -18,16 +23,29 @@ export function createCircuitBreaker(providerId, config = {}) {
|
|
|
18
23
|
let state = createInitialCircuitBreakerState();
|
|
19
24
|
const events = [];
|
|
20
25
|
const listeners = [];
|
|
21
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Emit a circuit breaker event
|
|
28
|
+
* INV-CB-005: Events must have correct state values BEFORE being emitted to listeners
|
|
29
|
+
* @param previousStateOverride - Override for previousState (for state transitions)
|
|
30
|
+
* @param currentStateOverride - Override for currentState (for state transitions)
|
|
31
|
+
*/
|
|
32
|
+
function emitEvent(type, details, previousStateOverride, currentStateOverride) {
|
|
22
33
|
const event = {
|
|
23
34
|
eventId: crypto.randomUUID(),
|
|
24
35
|
type,
|
|
25
36
|
providerId,
|
|
26
37
|
timestamp: new Date().toISOString(),
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
// INV-CB-005: Set state values before emitting, not after
|
|
39
|
+
previousState: previousStateOverride ?? state.state,
|
|
40
|
+
currentState: currentStateOverride ?? state.state,
|
|
29
41
|
details,
|
|
30
42
|
};
|
|
43
|
+
// INV-CB-004: Evict oldest events when buffer is full to prevent memory leak
|
|
44
|
+
if (events.length >= MAX_EVENTS) {
|
|
45
|
+
// Remove oldest 10% of events to avoid frequent evictions
|
|
46
|
+
const evictCount = Math.max(1, Math.floor(MAX_EVENTS * 0.1));
|
|
47
|
+
events.splice(0, evictCount);
|
|
48
|
+
}
|
|
31
49
|
events.push(event);
|
|
32
50
|
listeners.forEach((listener) => { listener(event); });
|
|
33
51
|
}
|
|
@@ -39,26 +57,23 @@ export function createCircuitBreaker(providerId, config = {}) {
|
|
|
39
57
|
state: newState,
|
|
40
58
|
lastTransitionTime: now,
|
|
41
59
|
};
|
|
60
|
+
// INV-CB-005: Pass correct state values to emitEvent so listeners receive correct values
|
|
42
61
|
if (newState === 'open') {
|
|
43
62
|
state.nextAttemptTime = new Date(Date.now() + cfg.resetTimeoutMs).toISOString();
|
|
44
|
-
emitEvent('circuit.opened', { failureCount: state.failureCount });
|
|
63
|
+
emitEvent('circuit.opened', { failureCount: state.failureCount }, previousState, newState);
|
|
45
64
|
}
|
|
46
65
|
else if (newState === 'halfOpen') {
|
|
47
66
|
state.successCount = 0;
|
|
48
67
|
state.nextAttemptTime = undefined;
|
|
49
|
-
emitEvent('circuit.halfOpen');
|
|
68
|
+
emitEvent('circuit.halfOpen', undefined, previousState, newState);
|
|
50
69
|
}
|
|
51
70
|
else if (newState === 'closed') {
|
|
52
71
|
state.failureCount = 0;
|
|
53
72
|
state.successCount = 0;
|
|
54
73
|
state.nextAttemptTime = undefined;
|
|
55
|
-
emitEvent('circuit.closed');
|
|
56
|
-
}
|
|
57
|
-
const stateEvent = events[events.length - 1];
|
|
58
|
-
if (stateEvent) {
|
|
59
|
-
stateEvent.previousState = previousState;
|
|
60
|
-
stateEvent.currentState = newState;
|
|
74
|
+
emitEvent('circuit.closed', undefined, previousState, newState);
|
|
61
75
|
}
|
|
76
|
+
// Note: Removed post-emit mutation - state values are now set correctly before emit
|
|
62
77
|
}
|
|
63
78
|
function shouldAttemptReset() {
|
|
64
79
|
if (state.state !== 'open' || !state.nextAttemptTime)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAML,yCAAyC,IAAI,iCAAiC,EAC9E,wCAAwC,IAAI,gCAAgC,EAC5E,gCAAgC,IAAI,wBAAwB,GAC7D,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,uBAAuB,IAAI,eAAe,EAC/C,KAAK,sBAAsB,IAAI,cAAc,EAC7C,KAAK,sBAAsB,IAAI,cAAc,EAM9C,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,uBAAuB,IAAI,eAAe,EAC/C,KAAK,sBAAsB,IAAI,cAAc,EAC7C,KAAK,sBAAsB,IAAI,cAAc,EAM9C,MAAM,0BAA0B,CAAC;AAQlC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,QAAQ,IAAI,cAAc,CAAC;IAE3B,oDAAoD;IACpD,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAErC,qDAAqD;IACrD,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAErC,0CAA0C;IAC1C,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C,+CAA+C;IAC/C,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAErC,qDAAqD;IACrD,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjD,wBAAwB;IACxB,SAAS,IAAI,cAAc,EAAE,CAAC;IAE9B,6BAA6B;IAC7B,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAErE;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,WAAW,CAqOb;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAErB,IAAI,EAAE,MAAM;aACZ,UAAU,EAAE,MAAM;aAClB,YAAY,CAAC,EAAE,MAAM;gBAFrB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA,EACrC,OAAO,CAAC,EAAE,MAAM;IAMlB,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc;IAQ1E,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc;CAQ1D"}
|
package/dist/rate-limiter.js
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* - INV-RL-003: Strategy applied when limit reached
|
|
11
11
|
*/
|
|
12
12
|
import { createDefaultProviderRateLimitConfig as createDefaultRateLimitConfig, createInitialProviderRateLimitState as createInitialRateLimitState, ProviderRateLimitErrorCodes as RateLimitErrorCodes, } from '@defai.digital/contracts';
|
|
13
|
+
/**
|
|
14
|
+
* Maximum number of events to retain in memory
|
|
15
|
+
* INV-RL-004: Event buffer is bounded to prevent memory leaks
|
|
16
|
+
*/
|
|
17
|
+
const MAX_EVENTS = 1000;
|
|
13
18
|
/**
|
|
14
19
|
* Creates a rate limiter for a provider
|
|
15
20
|
*/
|
|
@@ -29,6 +34,12 @@ export function createRateLimiter(providerId, config = {}) {
|
|
|
29
34
|
timestamp: new Date().toISOString(),
|
|
30
35
|
details,
|
|
31
36
|
};
|
|
37
|
+
// INV-RL-004: Evict oldest events when buffer is full to prevent memory leak
|
|
38
|
+
if (events.length >= MAX_EVENTS) {
|
|
39
|
+
// Remove oldest 10% of events to avoid frequent evictions
|
|
40
|
+
const evictCount = Math.max(1, Math.floor(MAX_EVENTS * 0.1));
|
|
41
|
+
events.splice(0, evictCount);
|
|
42
|
+
}
|
|
32
43
|
events.push(event);
|
|
33
44
|
listeners.forEach((listener) => { listener(event); });
|
|
34
45
|
}
|
|
@@ -84,6 +95,27 @@ export function createRateLimiter(providerId, config = {}) {
|
|
|
84
95
|
consecutiveLimits,
|
|
85
96
|
});
|
|
86
97
|
}
|
|
98
|
+
// INV-RL-005: Local function to calculate wait time, avoiding 'this' binding issues
|
|
99
|
+
// This allows waitForTokens to work correctly when destructured or passed as callback
|
|
100
|
+
function calculateWaitTime(tokens = 1) {
|
|
101
|
+
refillTokens();
|
|
102
|
+
updateState();
|
|
103
|
+
// Check if blocked
|
|
104
|
+
if (internalState.nextAllowedTime) {
|
|
105
|
+
const blockWait = new Date(internalState.nextAllowedTime).getTime() - Date.now();
|
|
106
|
+
if (blockWait > 0)
|
|
107
|
+
return blockWait;
|
|
108
|
+
}
|
|
109
|
+
// Calculate time to refill needed tokens
|
|
110
|
+
if (internalState.requestTokens >= 1 && internalState.outputTokens >= tokens) {
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
const requestsNeeded = Math.max(0, 1 - internalState.requestTokens);
|
|
114
|
+
const tokensNeeded = Math.max(0, tokens - internalState.outputTokens);
|
|
115
|
+
const requestRefillTime = (requestsNeeded / cfg.requestsPerMinute) * 60000;
|
|
116
|
+
const tokenRefillTime = (tokensNeeded / cfg.tokensPerMinute) * 60000;
|
|
117
|
+
return Math.max(requestRefillTime, tokenRefillTime);
|
|
118
|
+
}
|
|
87
119
|
return {
|
|
88
120
|
getState() {
|
|
89
121
|
refillTokens();
|
|
@@ -127,29 +159,15 @@ export function createRateLimiter(providerId, config = {}) {
|
|
|
127
159
|
return false;
|
|
128
160
|
},
|
|
129
161
|
async waitForTokens(tokens = 1) {
|
|
130
|
-
|
|
162
|
+
// INV-RL-005: Use local function call instead of 'this' to avoid
|
|
163
|
+
// binding issues when method is destructured or passed as callback
|
|
164
|
+
const waitTime = calculateWaitTime(tokens);
|
|
131
165
|
if (waitTime > 0) {
|
|
132
166
|
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
133
167
|
}
|
|
134
168
|
},
|
|
135
169
|
getWaitTime(tokens = 1) {
|
|
136
|
-
|
|
137
|
-
updateState();
|
|
138
|
-
// Check if blocked
|
|
139
|
-
if (internalState.nextAllowedTime) {
|
|
140
|
-
const blockWait = new Date(internalState.nextAllowedTime).getTime() - Date.now();
|
|
141
|
-
if (blockWait > 0)
|
|
142
|
-
return blockWait;
|
|
143
|
-
}
|
|
144
|
-
// Calculate time to refill needed tokens
|
|
145
|
-
if (internalState.requestTokens >= 1 && internalState.outputTokens >= tokens) {
|
|
146
|
-
return 0;
|
|
147
|
-
}
|
|
148
|
-
const requestsNeeded = Math.max(0, 1 - internalState.requestTokens);
|
|
149
|
-
const tokensNeeded = Math.max(0, tokens - internalState.outputTokens);
|
|
150
|
-
const requestRefillTime = (requestsNeeded / cfg.requestsPerMinute) * 60000;
|
|
151
|
-
const tokenRefillTime = (tokensNeeded / cfg.tokensPerMinute) * 60000;
|
|
152
|
-
return Math.max(requestRefillTime, tokenRefillTime);
|
|
170
|
+
return calculateWaitTime(tokens);
|
|
153
171
|
},
|
|
154
172
|
recordExternalLimit(retryAfterMs) {
|
|
155
173
|
const backoffTime = retryAfterMs ?? cfg.backoffBaseMs;
|
package/dist/rate-limiter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAML,oCAAoC,IAAI,4BAA4B,EACpE,mCAAmC,IAAI,2BAA2B,EAClE,2BAA2B,IAAI,mBAAmB,GACnD,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defai.digital/provider-domain",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.5.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Provider resilience domain for AutomatosX - circuit breaker, rate limiting, health monitoring",
|
|
6
6
|
"license": "BUSL-1.1",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"access": "public"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@defai.digital/contracts": "13.
|
|
35
|
+
"@defai.digital/contracts": "13.5.2"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsc --build",
|