@emmvish/stable-request 2.7.2 → 2.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.
- package/README.md +1 -1
- package/dist/core/stable-scheduler.d.ts +11 -1
- package/dist/core/stable-scheduler.d.ts.map +1 -1
- package/dist/core/stable-scheduler.js +161 -8
- package/dist/core/stable-scheduler.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stable-runner/index.js +24 -5
- package/dist/stable-runner/index.js.map +1 -1
- package/dist/types/index.d.ts +127 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utilities/cache-manager.d.ts +6 -0
- package/dist/utilities/cache-manager.d.ts.map +1 -1
- package/dist/utilities/cache-manager.js +66 -1
- package/dist/utilities/cache-manager.js.map +1 -1
- package/dist/utilities/circuit-breaker.d.ts +7 -1
- package/dist/utilities/circuit-breaker.d.ts.map +1 -1
- package/dist/utilities/circuit-breaker.js +83 -0
- package/dist/utilities/circuit-breaker.js.map +1 -1
- package/dist/utilities/concurrency-limiter.d.ts +9 -1
- package/dist/utilities/concurrency-limiter.d.ts.map +1 -1
- package/dist/utilities/concurrency-limiter.js +61 -2
- package/dist/utilities/concurrency-limiter.js.map +1 -1
- package/dist/utilities/function-cache-manager.d.ts +6 -0
- package/dist/utilities/function-cache-manager.d.ts.map +1 -1
- package/dist/utilities/function-cache-manager.js +60 -3
- package/dist/utilities/function-cache-manager.js.map +1 -1
- package/dist/utilities/rate-limiter.d.ts +9 -1
- package/dist/utilities/rate-limiter.d.ts.map +1 -1
- package/dist/utilities/rate-limiter.js +70 -3
- package/dist/utilities/rate-limiter.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,12 +12,74 @@ export class RateLimiter {
|
|
|
12
12
|
peakRequestRate = 0;
|
|
13
13
|
requestsInCurrentWindow = 0;
|
|
14
14
|
windowStartTime = Date.now();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
persistence;
|
|
16
|
+
initialized = false;
|
|
17
|
+
constructor(maxRequestsOrConfig, windowMs, persistence) {
|
|
18
|
+
if (typeof maxRequestsOrConfig === 'object') {
|
|
19
|
+
this.maxRequests = Math.max(1, Math.floor(maxRequestsOrConfig.maxRequests));
|
|
20
|
+
this.windowMs = Math.max(100, maxRequestsOrConfig.windowMs);
|
|
21
|
+
this.persistence = maxRequestsOrConfig.persistence;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.maxRequests = Math.max(1, Math.floor(maxRequestsOrConfig));
|
|
25
|
+
this.windowMs = Math.max(100, windowMs);
|
|
26
|
+
this.persistence = persistence;
|
|
27
|
+
}
|
|
18
28
|
this.tokens = this.maxRequests;
|
|
19
29
|
this.lastRefillTime = Date.now();
|
|
20
30
|
}
|
|
31
|
+
async initialize() {
|
|
32
|
+
if (this.initialized)
|
|
33
|
+
return;
|
|
34
|
+
if (this.persistence?.load) {
|
|
35
|
+
try {
|
|
36
|
+
const persistedState = await this.persistence.load();
|
|
37
|
+
if (persistedState) {
|
|
38
|
+
this.restoreState(persistedState);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.warn('stable-request: Unable to load rate limiter state from persistence.');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
this.initialized = true;
|
|
46
|
+
}
|
|
47
|
+
restoreState(persistedState) {
|
|
48
|
+
this.tokens = persistedState.tokens;
|
|
49
|
+
this.lastRefillTime = persistedState.lastRefillTime;
|
|
50
|
+
this.totalRequests = persistedState.totalRequests;
|
|
51
|
+
this.throttledRequests = persistedState.throttledRequests;
|
|
52
|
+
this.completedRequests = persistedState.completedRequests;
|
|
53
|
+
this.peakQueueLength = persistedState.peakQueueLength;
|
|
54
|
+
this.totalQueueWaitTime = persistedState.totalQueueWaitTime;
|
|
55
|
+
this.peakRequestRate = persistedState.peakRequestRate;
|
|
56
|
+
this.requestsInCurrentWindow = persistedState.requestsInCurrentWindow;
|
|
57
|
+
this.windowStartTime = persistedState.windowStartTime;
|
|
58
|
+
}
|
|
59
|
+
getPersistedState() {
|
|
60
|
+
return {
|
|
61
|
+
tokens: this.tokens,
|
|
62
|
+
lastRefillTime: this.lastRefillTime,
|
|
63
|
+
totalRequests: this.totalRequests,
|
|
64
|
+
throttledRequests: this.throttledRequests,
|
|
65
|
+
completedRequests: this.completedRequests,
|
|
66
|
+
peakQueueLength: this.peakQueueLength,
|
|
67
|
+
totalQueueWaitTime: this.totalQueueWaitTime,
|
|
68
|
+
peakRequestRate: this.peakRequestRate,
|
|
69
|
+
requestsInCurrentWindow: this.requestsInCurrentWindow,
|
|
70
|
+
windowStartTime: this.windowStartTime
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async persistState() {
|
|
74
|
+
if (this.persistence?.store) {
|
|
75
|
+
try {
|
|
76
|
+
await this.persistence.store(this.getPersistedState());
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.warn('stable-request: Unable to store rate limiter state to persistence.');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
21
83
|
refillTokens() {
|
|
22
84
|
const now = Date.now();
|
|
23
85
|
const elapsed = now - this.lastRefillTime;
|
|
@@ -36,6 +98,7 @@ export class RateLimiter {
|
|
|
36
98
|
this.tokens--;
|
|
37
99
|
this.requestsInCurrentWindow++;
|
|
38
100
|
this.peakRequestRate = Math.max(this.peakRequestRate, this.requestsInCurrentWindow);
|
|
101
|
+
this.persistState();
|
|
39
102
|
return Promise.resolve();
|
|
40
103
|
}
|
|
41
104
|
this.throttledRequests++;
|
|
@@ -46,6 +109,7 @@ export class RateLimiter {
|
|
|
46
109
|
resolve();
|
|
47
110
|
});
|
|
48
111
|
this.peakQueueLength = Math.max(this.peakQueueLength, this.queue.length);
|
|
112
|
+
this.persistState();
|
|
49
113
|
this.scheduleRefill();
|
|
50
114
|
});
|
|
51
115
|
}
|
|
@@ -70,16 +134,19 @@ export class RateLimiter {
|
|
|
70
134
|
if (this.queue.length > 0) {
|
|
71
135
|
this.scheduleRefill();
|
|
72
136
|
}
|
|
137
|
+
this.persistState();
|
|
73
138
|
}
|
|
74
139
|
async execute(fn) {
|
|
75
140
|
await this.acquire();
|
|
76
141
|
try {
|
|
77
142
|
const result = await fn();
|
|
78
143
|
this.completedRequests++;
|
|
144
|
+
this.persistState();
|
|
79
145
|
return result;
|
|
80
146
|
}
|
|
81
147
|
catch (error) {
|
|
82
148
|
this.completedRequests++;
|
|
149
|
+
this.persistState();
|
|
83
150
|
throw error;
|
|
84
151
|
}
|
|
85
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utilities/rate-limiter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utilities/rate-limiter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emmvish/stable-request",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "A production-grade Workflow Execution Engine for Node.js that transforms unreliable API calls into resilient, observable, and sophisticated multi-phase workflows with intelligent retry strategies, circuit breakers, and advanced execution patterns.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|