@emmvish/stable-request 1.7.3 → 1.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.
Files changed (55) hide show
  1. package/README.md +335 -0
  2. package/dist/core/stable-api-gateway.d.ts +2 -2
  3. package/dist/core/stable-api-gateway.d.ts.map +1 -1
  4. package/dist/core/stable-api-gateway.js +58 -4
  5. package/dist/core/stable-api-gateway.js.map +1 -1
  6. package/dist/core/stable-request.d.ts +2 -2
  7. package/dist/core/stable-request.d.ts.map +1 -1
  8. package/dist/core/stable-request.js +35 -5
  9. package/dist/core/stable-request.js.map +1 -1
  10. package/dist/core/stable-workflow.d.ts.map +1 -1
  11. package/dist/core/stable-workflow.js +15 -3
  12. package/dist/core/stable-workflow.js.map +1 -1
  13. package/dist/index.d.ts +3 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/types/index.d.ts +232 -0
  18. package/dist/types/index.d.ts.map +1 -1
  19. package/dist/utilities/cache-manager.d.ts +19 -0
  20. package/dist/utilities/cache-manager.d.ts.map +1 -1
  21. package/dist/utilities/cache-manager.js +38 -2
  22. package/dist/utilities/cache-manager.js.map +1 -1
  23. package/dist/utilities/circuit-breaker.d.ts +22 -0
  24. package/dist/utilities/circuit-breaker.d.ts.map +1 -1
  25. package/dist/utilities/circuit-breaker.js +65 -1
  26. package/dist/utilities/circuit-breaker.js.map +1 -1
  27. package/dist/utilities/concurrency-limiter.d.ts +26 -0
  28. package/dist/utilities/concurrency-limiter.d.ts.map +1 -1
  29. package/dist/utilities/concurrency-limiter.js +74 -4
  30. package/dist/utilities/concurrency-limiter.js.map +1 -1
  31. package/dist/utilities/execute-branch-workflow.d.ts.map +1 -1
  32. package/dist/utilities/execute-branch-workflow.js +18 -12
  33. package/dist/utilities/execute-branch-workflow.js.map +1 -1
  34. package/dist/utilities/execute-concurrently.d.ts.map +1 -1
  35. package/dist/utilities/execute-concurrently.js +5 -6
  36. package/dist/utilities/execute-concurrently.js.map +1 -1
  37. package/dist/utilities/execute-phase.d.ts.map +1 -1
  38. package/dist/utilities/execute-phase.js +11 -5
  39. package/dist/utilities/execute-phase.js.map +1 -1
  40. package/dist/utilities/execute-sequentially.d.ts.map +1 -1
  41. package/dist/utilities/execute-sequentially.js +5 -6
  42. package/dist/utilities/execute-sequentially.js.map +1 -1
  43. package/dist/utilities/index.d.ts +4 -3
  44. package/dist/utilities/index.d.ts.map +1 -1
  45. package/dist/utilities/index.js +4 -3
  46. package/dist/utilities/index.js.map +1 -1
  47. package/dist/utilities/metrics-aggregator.d.ts +51 -0
  48. package/dist/utilities/metrics-aggregator.d.ts.map +1 -0
  49. package/dist/utilities/metrics-aggregator.js +311 -0
  50. package/dist/utilities/metrics-aggregator.js.map +1 -0
  51. package/dist/utilities/rate-limiter.d.ts +19 -0
  52. package/dist/utilities/rate-limiter.d.ts.map +1 -1
  53. package/dist/utilities/rate-limiter.js +56 -3
  54. package/dist/utilities/rate-limiter.js.map +1 -1
  55. package/package.json +1 -1
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Metrics Aggregator - Extracts and computes all metrics from workflow results
3
+ */
4
+ export class MetricsAggregator {
5
+ /**
6
+ * Extract comprehensive workflow metrics
7
+ */
8
+ static extractWorkflowMetrics(result) {
9
+ const skippedPhases = result.phases.filter(p => p.skipped).length;
10
+ const failedPhases = result.phases.filter(p => !p.success && !p.skipped).length;
11
+ const phaseReplays = result.executionHistory.filter((record, index, arr) => arr.filter(r => r.phaseId === record.phaseId).length > 1).length;
12
+ const throughput = result.executionTime > 0
13
+ ? (result.totalRequests / (result.executionTime / 1000))
14
+ : 0;
15
+ const metrics = {
16
+ workflowId: result.workflowId,
17
+ success: result.success,
18
+ executionTime: result.executionTime,
19
+ timestamp: result.timestamp,
20
+ totalPhases: result.totalPhases,
21
+ completedPhases: result.completedPhases,
22
+ skippedPhases: skippedPhases,
23
+ failedPhases: failedPhases,
24
+ phaseCompletionRate: result.totalPhases > 0
25
+ ? (result.completedPhases / result.totalPhases) * 100
26
+ : 0,
27
+ averagePhaseExecutionTime: result.phases.length > 0
28
+ ? result.phases.reduce((sum, p) => sum + p.executionTime, 0) / result.phases.length
29
+ : 0,
30
+ totalRequests: result.totalRequests,
31
+ successfulRequests: result.successfulRequests,
32
+ failedRequests: result.failedRequests,
33
+ requestSuccessRate: result.totalRequests > 0
34
+ ? (result.successfulRequests / result.totalRequests) * 100
35
+ : 0,
36
+ requestFailureRate: result.totalRequests > 0
37
+ ? (result.failedRequests / result.totalRequests) * 100
38
+ : 0,
39
+ terminatedEarly: result.terminatedEarly || false,
40
+ terminationReason: result.terminationReason,
41
+ totalPhaseReplays: phaseReplays,
42
+ totalPhaseSkips: skippedPhases,
43
+ throughput: throughput
44
+ };
45
+ // Add branch metrics if available
46
+ if (result.branches && result.branches.length > 0) {
47
+ const completedBranches = result.branches.filter(b => !b.skipped && b.success).length;
48
+ const failedBranches = result.branches.filter(b => !b.success && !b.skipped).length;
49
+ metrics.totalBranches = result.branches.length;
50
+ metrics.completedBranches = completedBranches;
51
+ metrics.failedBranches = failedBranches;
52
+ metrics.branchSuccessRate = result.branches.length > 0
53
+ ? (completedBranches / result.branches.length) * 100
54
+ : 0;
55
+ }
56
+ return metrics;
57
+ }
58
+ /**
59
+ * Extract branch metrics
60
+ */
61
+ static extractBranchMetrics(branch) {
62
+ const failedPhases = branch.phaseResults.filter(p => !p.success && !p.skipped).length;
63
+ const totalRequests = branch.phaseResults.reduce((sum, p) => sum + p.totalRequests, 0);
64
+ const successfulRequests = branch.phaseResults.reduce((sum, p) => sum + p.successfulRequests, 0);
65
+ const failedRequests = branch.phaseResults.reduce((sum, p) => sum + p.failedRequests, 0);
66
+ return {
67
+ branchId: branch.branchId,
68
+ branchIndex: branch.branchIndex,
69
+ executionNumber: branch.executionNumber,
70
+ success: branch.success,
71
+ executionTime: branch.executionTime,
72
+ skipped: branch.skipped || false,
73
+ totalPhases: branch.phaseResults.length,
74
+ completedPhases: branch.completedPhases,
75
+ failedPhases: failedPhases,
76
+ phaseCompletionRate: branch.phaseResults.length > 0
77
+ ? (branch.completedPhases / branch.phaseResults.length) * 100
78
+ : 0,
79
+ totalRequests: totalRequests,
80
+ successfulRequests: successfulRequests,
81
+ failedRequests: failedRequests,
82
+ requestSuccessRate: totalRequests > 0
83
+ ? (successfulRequests / totalRequests) * 100
84
+ : 0,
85
+ hasDecision: !!branch.decision,
86
+ decisionAction: branch.decision?.action,
87
+ error: branch.error
88
+ };
89
+ }
90
+ /**
91
+ * Extract phase metrics
92
+ */
93
+ static extractPhaseMetrics(phase) {
94
+ return {
95
+ phaseId: phase.phaseId,
96
+ phaseIndex: phase.phaseIndex,
97
+ workflowId: phase.workflowId,
98
+ branchId: phase.branchId,
99
+ executionNumber: phase.executionNumber || 0,
100
+ success: phase.success,
101
+ skipped: phase.skipped || false,
102
+ executionTime: phase.executionTime,
103
+ timestamp: phase.timestamp,
104
+ totalRequests: phase.totalRequests,
105
+ successfulRequests: phase.successfulRequests,
106
+ failedRequests: phase.failedRequests,
107
+ requestSuccessRate: phase.totalRequests > 0
108
+ ? (phase.successfulRequests / phase.totalRequests) * 100
109
+ : 0,
110
+ requestFailureRate: phase.totalRequests > 0
111
+ ? (phase.failedRequests / phase.totalRequests) * 100
112
+ : 0,
113
+ hasDecision: !!phase.decision,
114
+ decisionAction: phase.decision?.action,
115
+ targetPhaseId: phase.decision?.targetPhaseId,
116
+ replayCount: phase.decision?.replayCount,
117
+ error: phase.error
118
+ };
119
+ }
120
+ /**
121
+ * Extract request group metrics
122
+ */
123
+ static extractRequestGroupMetrics(responses) {
124
+ const groupMap = new Map();
125
+ // Group responses by groupId
126
+ responses.forEach(response => {
127
+ const groupId = response.groupId || 'default';
128
+ if (!groupMap.has(groupId)) {
129
+ groupMap.set(groupId, []);
130
+ }
131
+ groupMap.get(groupId).push(response);
132
+ });
133
+ // Calculate metrics for each group
134
+ return Array.from(groupMap.entries()).map(([groupId, groupResponses]) => {
135
+ const successfulRequests = groupResponses.filter(r => r.success).length;
136
+ const failedRequests = groupResponses.filter(r => !r.success).length;
137
+ const totalRequests = groupResponses.length;
138
+ return {
139
+ groupId,
140
+ totalRequests,
141
+ successfulRequests,
142
+ failedRequests,
143
+ successRate: totalRequests > 0 ? (successfulRequests / totalRequests) * 100 : 0,
144
+ failureRate: totalRequests > 0 ? (failedRequests / totalRequests) * 100 : 0,
145
+ requestIds: groupResponses.map(r => r.requestId)
146
+ };
147
+ });
148
+ }
149
+ /**
150
+ * Extract individual request metrics
151
+ */
152
+ static extractRequestMetrics(responses) {
153
+ return responses.map(response => ({
154
+ requestId: response.requestId,
155
+ groupId: response.groupId,
156
+ success: response.success,
157
+ hasError: !!response.error,
158
+ errorMessage: response.error
159
+ }));
160
+ }
161
+ /**
162
+ * Extract circuit breaker dashboard metrics
163
+ */
164
+ static extractCircuitBreakerMetrics(circuitBreaker) {
165
+ const state = circuitBreaker.getState();
166
+ const now = Date.now();
167
+ const timeSinceLastStateChange = now - state.lastStateChangeTime;
168
+ const timeUntilRecovery = state.openUntil ? Math.max(0, state.openUntil - now) : null;
169
+ return {
170
+ state: state.state,
171
+ isHealthy: state.state !== 'OPEN',
172
+ totalRequests: state.totalRequests,
173
+ successfulRequests: state.successfulRequests,
174
+ failedRequests: state.failedRequests,
175
+ failurePercentage: state.failurePercentage,
176
+ stateTransitions: state.stateTransitions,
177
+ lastStateChangeTime: state.lastStateChangeTime,
178
+ timeSinceLastStateChange: timeSinceLastStateChange,
179
+ openCount: state.openCount,
180
+ totalOpenDuration: state.totalOpenDuration,
181
+ averageOpenDuration: state.averageOpenDuration,
182
+ isCurrentlyOpen: state.state === 'OPEN',
183
+ openUntil: state.openUntil,
184
+ timeUntilRecovery: timeUntilRecovery,
185
+ recoveryAttempts: state.recoveryAttempts,
186
+ successfulRecoveries: state.successfulRecoveries,
187
+ failedRecoveries: state.failedRecoveries,
188
+ recoverySuccessRate: state.recoverySuccessRate,
189
+ config: {
190
+ failureThresholdPercentage: state.config.failureThresholdPercentage,
191
+ minimumRequests: state.config.minimumRequests,
192
+ recoveryTimeoutMs: state.config.recoveryTimeoutMs,
193
+ successThresholdPercentage: state.config.successThresholdPercentage,
194
+ halfOpenMaxRequests: state.config.halfOpenMaxRequests
195
+ }
196
+ };
197
+ }
198
+ /**
199
+ * Extract cache dashboard metrics
200
+ */
201
+ static extractCacheMetrics(cache) {
202
+ const stats = cache.getStats();
203
+ const now = Date.now();
204
+ return {
205
+ isEnabled: true,
206
+ currentSize: stats.size,
207
+ maxSize: stats.maxSize,
208
+ validEntries: stats.validEntries,
209
+ expiredEntries: stats.expiredEntries,
210
+ utilizationPercentage: stats.utilizationPercentage,
211
+ totalRequests: stats.totalRequests,
212
+ hits: stats.hits,
213
+ misses: stats.misses,
214
+ hitRate: stats.hitRate,
215
+ missRate: stats.missRate,
216
+ sets: stats.sets,
217
+ evictions: stats.evictions,
218
+ expirations: stats.expirations,
219
+ averageGetTime: stats.averageGetTime,
220
+ averageSetTime: stats.averageSetTime,
221
+ averageCacheAge: stats.averageCacheAge,
222
+ oldestEntryAge: stats.oldestEntry ? now - stats.oldestEntry : null,
223
+ newestEntryAge: stats.newestEntry ? now - stats.newestEntry : null,
224
+ networkRequestsSaved: stats.hits,
225
+ cacheEfficiency: stats.hitRate
226
+ };
227
+ }
228
+ /**
229
+ * Extract rate limiter dashboard metrics
230
+ */
231
+ static extractRateLimiterMetrics(rateLimiter) {
232
+ const state = rateLimiter.getState();
233
+ const averageRequestRate = state.completedRequests > 0
234
+ ? state.totalRequests / (state.windowMs / 1000)
235
+ : 0;
236
+ return {
237
+ maxRequests: state.maxRequests,
238
+ windowMs: state.windowMs,
239
+ availableTokens: state.availableTokens,
240
+ queueLength: state.queueLength,
241
+ requestsInCurrentWindow: state.requestsInCurrentWindow,
242
+ totalRequests: state.totalRequests,
243
+ completedRequests: state.completedRequests,
244
+ throttledRequests: state.throttledRequests,
245
+ throttleRate: state.throttleRate,
246
+ currentRequestRate: state.currentRequestRate,
247
+ peakRequestRate: state.peakRequestRate,
248
+ averageRequestRate: averageRequestRate,
249
+ peakQueueLength: state.peakQueueLength,
250
+ averageQueueWaitTime: state.averageQueueWaitTime,
251
+ isThrottling: state.queueLength > 0 || state.availableTokens === 0,
252
+ utilizationPercentage: (state.requestsInCurrentWindow / state.maxRequests) * 100
253
+ };
254
+ }
255
+ /**
256
+ * Extract concurrency limiter dashboard metrics
257
+ */
258
+ static extractConcurrencyLimiterMetrics(concurrencyLimiter) {
259
+ const state = concurrencyLimiter.getState();
260
+ return {
261
+ limit: state.limit,
262
+ running: state.running,
263
+ queueLength: state.queueLength,
264
+ utilizationPercentage: state.utilizationPercentage,
265
+ totalRequests: state.totalRequests,
266
+ completedRequests: state.completedRequests,
267
+ failedRequests: state.failedRequests,
268
+ queuedRequests: state.queuedRequests,
269
+ successRate: state.successRate,
270
+ peakConcurrency: state.peakConcurrency,
271
+ averageConcurrency: state.running, // Current as average approximation
272
+ concurrencyUtilization: state.utilizationPercentage,
273
+ peakQueueLength: state.peakQueueLength,
274
+ averageQueueWaitTime: state.averageQueueWaitTime,
275
+ averageExecutionTime: state.averageExecutionTime,
276
+ isAtCapacity: state.running >= state.limit,
277
+ hasQueuedRequests: state.queueLength > 0
278
+ };
279
+ }
280
+ /**
281
+ * Aggregate all metrics from a workflow result
282
+ */
283
+ static aggregateSystemMetrics(workflowResult, circuitBreaker, cache, rateLimiter, concurrencyLimiter) {
284
+ // Extract all responses from phases
285
+ const allResponses = workflowResult.phases.flatMap(phase => phase.responses);
286
+ const metrics = {
287
+ workflow: this.extractWorkflowMetrics(workflowResult),
288
+ branches: workflowResult.branches
289
+ ? workflowResult.branches.map(b => this.extractBranchMetrics(b))
290
+ : [],
291
+ phases: workflowResult.phases.map(p => this.extractPhaseMetrics(p)),
292
+ requestGroups: this.extractRequestGroupMetrics(allResponses),
293
+ requests: this.extractRequestMetrics(allResponses)
294
+ };
295
+ // Add optional utility metrics
296
+ if (circuitBreaker) {
297
+ metrics.circuitBreaker = this.extractCircuitBreakerMetrics(circuitBreaker);
298
+ }
299
+ if (cache) {
300
+ metrics.cache = this.extractCacheMetrics(cache);
301
+ }
302
+ if (rateLimiter) {
303
+ metrics.rateLimiter = this.extractRateLimiterMetrics(rateLimiter);
304
+ }
305
+ if (concurrencyLimiter) {
306
+ metrics.concurrencyLimiter = this.extractConcurrencyLimiterMetrics(concurrencyLimiter);
307
+ }
308
+ return metrics;
309
+ }
310
+ }
311
+ //# sourceMappingURL=metrics-aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-aggregator.js","sourceRoot":"","sources":["../../src/utilities/metrics-aggregator.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,14 @@ export declare class RateLimiter {
4
4
  private tokens;
5
5
  private lastRefillTime;
6
6
  private readonly queue;
7
+ private totalRequests;
8
+ private throttledRequests;
9
+ private completedRequests;
10
+ private peakQueueLength;
11
+ private totalQueueWaitTime;
12
+ private peakRequestRate;
13
+ private requestsInCurrentWindow;
14
+ private windowStartTime;
7
15
  constructor(maxRequests: number, windowMs: number);
8
16
  private refillTokens;
9
17
  private acquire;
@@ -16,6 +24,17 @@ export declare class RateLimiter {
16
24
  queueLength: number;
17
25
  maxRequests: number;
18
26
  windowMs: number;
27
+ totalRequests: number;
28
+ throttledRequests: number;
29
+ completedRequests: number;
30
+ throttleRate: number;
31
+ peakQueueLength: number;
32
+ averageQueueWaitTime: number;
33
+ peakRequestRate: number;
34
+ currentRequestRate: number;
35
+ requestsInCurrentWindow: number;
19
36
  };
20
37
  }
38
+ export declare function getGlobalRateLimiter(maxRequests?: number, windowMs?: number): RateLimiter;
39
+ export declare function resetGlobalRateLimiter(): void;
21
40
  //# sourceMappingURL=rate-limiter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utilities/rate-limiter.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;gBAEnC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAOjD,OAAO,CAAC,YAAY;YAWN,OAAO;IAcrB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;IAcd,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAK5C,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAI/D,QAAQ;;;;;;CASX"}
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utilities/rate-limiter.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,uBAAuB,CAAa;IAC5C,OAAO,CAAC,eAAe,CAAsB;gBAEjC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAOjD,OAAO,CAAC,YAAY;YAaN,OAAO;IAwBrB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;IAcd,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAY5C,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAI/D,QAAQ;;;;;;;;;;;;;;;CA0BX;AAID,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAKzF;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -4,6 +4,14 @@ export class RateLimiter {
4
4
  tokens;
5
5
  lastRefillTime;
6
6
  queue = [];
7
+ totalRequests = 0;
8
+ throttledRequests = 0;
9
+ completedRequests = 0;
10
+ peakQueueLength = 0;
11
+ totalQueueWaitTime = 0;
12
+ peakRequestRate = 0;
13
+ requestsInCurrentWindow = 0;
14
+ windowStartTime = Date.now();
7
15
  constructor(maxRequests, windowMs) {
8
16
  this.maxRequests = Math.max(1, Math.floor(maxRequests));
9
17
  this.windowMs = Math.max(100, windowMs);
@@ -17,16 +25,27 @@ export class RateLimiter {
17
25
  const windowsPassed = Math.floor(elapsed / this.windowMs);
18
26
  this.tokens = Math.min(this.maxRequests, this.tokens + (windowsPassed * this.maxRequests));
19
27
  this.lastRefillTime = now;
28
+ this.requestsInCurrentWindow = 0;
29
+ this.windowStartTime = now;
20
30
  }
21
31
  }
22
32
  async acquire() {
33
+ this.totalRequests++;
23
34
  this.refillTokens();
24
35
  if (this.tokens > 0) {
25
36
  this.tokens--;
37
+ this.requestsInCurrentWindow++;
38
+ this.peakRequestRate = Math.max(this.peakRequestRate, this.requestsInCurrentWindow);
26
39
  return Promise.resolve();
27
40
  }
41
+ this.throttledRequests++;
42
+ const queueStartTime = Date.now();
28
43
  return new Promise((resolve) => {
29
- this.queue.push(resolve);
44
+ this.queue.push(() => {
45
+ this.totalQueueWaitTime += (Date.now() - queueStartTime);
46
+ resolve();
47
+ });
48
+ this.peakQueueLength = Math.max(this.peakQueueLength, this.queue.length);
30
49
  this.scheduleRefill();
31
50
  });
32
51
  }
@@ -54,19 +73,53 @@ export class RateLimiter {
54
73
  }
55
74
  async execute(fn) {
56
75
  await this.acquire();
57
- return fn();
76
+ try {
77
+ const result = await fn();
78
+ this.completedRequests++;
79
+ return result;
80
+ }
81
+ catch (error) {
82
+ this.completedRequests++;
83
+ throw error;
84
+ }
58
85
  }
59
86
  async executeAll(fns) {
60
87
  return Promise.all(fns.map(fn => this.execute(fn)));
61
88
  }
62
89
  getState() {
63
90
  this.refillTokens();
91
+ const throttleRate = this.totalRequests > 0
92
+ ? (this.throttledRequests / this.totalRequests) * 100
93
+ : 0;
94
+ const averageQueueWaitTime = this.throttledRequests > 0
95
+ ? this.totalQueueWaitTime / this.throttledRequests
96
+ : 0;
97
+ const currentRate = this.requestsInCurrentWindow / ((Date.now() - this.windowStartTime) / 1000);
64
98
  return {
65
99
  availableTokens: this.tokens,
66
100
  queueLength: this.queue.length,
67
101
  maxRequests: this.maxRequests,
68
- windowMs: this.windowMs
102
+ windowMs: this.windowMs,
103
+ totalRequests: this.totalRequests,
104
+ throttledRequests: this.throttledRequests,
105
+ completedRequests: this.completedRequests,
106
+ throttleRate: throttleRate,
107
+ peakQueueLength: this.peakQueueLength,
108
+ averageQueueWaitTime: averageQueueWaitTime,
109
+ peakRequestRate: this.peakRequestRate,
110
+ currentRequestRate: currentRate,
111
+ requestsInCurrentWindow: this.requestsInCurrentWindow
69
112
  };
70
113
  }
71
114
  }
115
+ let globalRateLimiter = null;
116
+ export function getGlobalRateLimiter(maxRequests, windowMs) {
117
+ if (!globalRateLimiter && maxRequests !== undefined && windowMs !== undefined) {
118
+ globalRateLimiter = new RateLimiter(maxRequests, windowMs);
119
+ }
120
+ return globalRateLimiter;
121
+ }
122
+ export function resetGlobalRateLimiter() {
123
+ globalRateLimiter = null;
124
+ }
72
125
  //# sourceMappingURL=rate-limiter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utilities/rate-limiter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utilities/rate-limiter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACH,WAAW,CAAS;IACpB,QAAQ,CAAS;IAC1B,MAAM,CAAS;IACf,cAAc,CAAS;IACd,KAAK,GAAsB,EAAE,CAAC;IACvC,aAAa,GAAW,CAAC,CAAC;IAC1B,iBAAiB,GAAW,CAAC,CAAC;IAC9B,iBAAiB,GAAW,CAAC,CAAC;IAC9B,eAAe,GAAW,CAAC,CAAC;IAC5B,kBAAkB,GAAW,CAAC,CAAC;IAC/B,eAAe,GAAW,CAAC,CAAC;IAC5B,uBAAuB,GAAW,CAAC,CAAC;IACpC,eAAe,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7C,YAAY,WAAmB,EAAE,QAAgB;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;IAEO,YAAY;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAE1C,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAC3F,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;YAC1B,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAC/B,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAElC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjB,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;gBACzD,OAAO,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,cAAc;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAEpE,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,CAAC,EAAE,eAAe,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAEO,YAAY;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,MAAM,EAAE,CAAC;gBACd,IAAI,EAAE,CAAC;YACX,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,EAAoB;QACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAI,GAA4B;QAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC;YACvC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG;YACrD,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB;YAClD,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC;QAEhG,OAAO;YACH,eAAe,EAAE,IAAI,CAAC,MAAM;YAC5B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,oBAAoB,EAAE,oBAAoB;YAC1C,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,kBAAkB,EAAE,WAAW;YAC/B,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;SACxD,CAAC;IACN,CAAC;CACJ;AAED,IAAI,iBAAiB,GAAuB,IAAI,CAAC;AAEjD,MAAM,UAAU,oBAAoB,CAAC,WAAoB,EAAE,QAAiB;IACxE,IAAI,CAAC,iBAAiB,IAAI,WAAW,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5E,iBAAiB,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,iBAAkB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB;IAClC,iBAAiB,GAAG,IAAI,CAAC;AAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emmvish/stable-request",
3
- "version": "1.7.3",
3
+ "version": "1.8.0",
4
4
  "description": "A production-grade HTTP 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",