@emmvish/stable-infra 1.0.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 (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2520 -0
  3. package/dist/constants/index.d.ts +15 -0
  4. package/dist/constants/index.d.ts.map +1 -0
  5. package/dist/constants/index.js +136 -0
  6. package/dist/constants/index.js.map +1 -0
  7. package/dist/core/index.d.ts +8 -0
  8. package/dist/core/index.d.ts.map +1 -0
  9. package/dist/core/index.js +8 -0
  10. package/dist/core/index.js.map +1 -0
  11. package/dist/core/stable-api-gateway.d.ts +4 -0
  12. package/dist/core/stable-api-gateway.d.ts.map +1 -0
  13. package/dist/core/stable-api-gateway.js +146 -0
  14. package/dist/core/stable-api-gateway.js.map +1 -0
  15. package/dist/core/stable-buffer.d.ts +23 -0
  16. package/dist/core/stable-buffer.d.ts.map +1 -0
  17. package/dist/core/stable-buffer.js +127 -0
  18. package/dist/core/stable-buffer.js.map +1 -0
  19. package/dist/core/stable-function.d.ts +11 -0
  20. package/dist/core/stable-function.d.ts.map +1 -0
  21. package/dist/core/stable-function.js +355 -0
  22. package/dist/core/stable-function.js.map +1 -0
  23. package/dist/core/stable-request.d.ts +3 -0
  24. package/dist/core/stable-request.d.ts.map +1 -0
  25. package/dist/core/stable-request.js +313 -0
  26. package/dist/core/stable-request.js.map +1 -0
  27. package/dist/core/stable-scheduler.d.ts +71 -0
  28. package/dist/core/stable-scheduler.d.ts.map +1 -0
  29. package/dist/core/stable-scheduler.js +782 -0
  30. package/dist/core/stable-scheduler.js.map +1 -0
  31. package/dist/core/stable-workflow-graph.d.ts +3 -0
  32. package/dist/core/stable-workflow-graph.d.ts.map +1 -0
  33. package/dist/core/stable-workflow-graph.js +5 -0
  34. package/dist/core/stable-workflow-graph.js.map +1 -0
  35. package/dist/core/stable-workflow.d.ts +3 -0
  36. package/dist/core/stable-workflow.d.ts.map +1 -0
  37. package/dist/core/stable-workflow.js +374 -0
  38. package/dist/core/stable-workflow.js.map +1 -0
  39. package/dist/enums/index.d.ts +84 -0
  40. package/dist/enums/index.d.ts.map +1 -0
  41. package/dist/enums/index.js +99 -0
  42. package/dist/enums/index.js.map +1 -0
  43. package/dist/index.d.ts +5 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +4 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/stable-runner/index.d.ts +2 -0
  48. package/dist/stable-runner/index.d.ts.map +1 -0
  49. package/dist/stable-runner/index.js +324 -0
  50. package/dist/stable-runner/index.js.map +1 -0
  51. package/dist/types/index.d.ts +1482 -0
  52. package/dist/types/index.d.ts.map +1 -0
  53. package/dist/types/index.js +2 -0
  54. package/dist/types/index.js.map +1 -0
  55. package/dist/utilities/buffer-utils.d.ts +4 -0
  56. package/dist/utilities/buffer-utils.d.ts.map +1 -0
  57. package/dist/utilities/buffer-utils.js +13 -0
  58. package/dist/utilities/buffer-utils.js.map +1 -0
  59. package/dist/utilities/cache-manager.d.ts +54 -0
  60. package/dist/utilities/cache-manager.d.ts.map +1 -0
  61. package/dist/utilities/cache-manager.js +288 -0
  62. package/dist/utilities/cache-manager.js.map +1 -0
  63. package/dist/utilities/circuit-breaker.d.ts +78 -0
  64. package/dist/utilities/circuit-breaker.d.ts.map +1 -0
  65. package/dist/utilities/circuit-breaker.js +350 -0
  66. package/dist/utilities/circuit-breaker.js.map +1 -0
  67. package/dist/utilities/concurrency-limiter.d.ts +46 -0
  68. package/dist/utilities/concurrency-limiter.d.ts.map +1 -0
  69. package/dist/utilities/concurrency-limiter.js +172 -0
  70. package/dist/utilities/concurrency-limiter.js.map +1 -0
  71. package/dist/utilities/delay.d.ts +2 -0
  72. package/dist/utilities/delay.d.ts.map +1 -0
  73. package/dist/utilities/delay.js +8 -0
  74. package/dist/utilities/delay.js.map +1 -0
  75. package/dist/utilities/execute-branch-workflow.d.ts +3 -0
  76. package/dist/utilities/execute-branch-workflow.d.ts.map +1 -0
  77. package/dist/utilities/execute-branch-workflow.js +736 -0
  78. package/dist/utilities/execute-branch-workflow.js.map +1 -0
  79. package/dist/utilities/execute-concurrently.d.ts +3 -0
  80. package/dist/utilities/execute-concurrently.d.ts.map +1 -0
  81. package/dist/utilities/execute-concurrently.js +258 -0
  82. package/dist/utilities/execute-concurrently.js.map +1 -0
  83. package/dist/utilities/execute-gateway-item.d.ts +6 -0
  84. package/dist/utilities/execute-gateway-item.d.ts.map +1 -0
  85. package/dist/utilities/execute-gateway-item.js +129 -0
  86. package/dist/utilities/execute-gateway-item.js.map +1 -0
  87. package/dist/utilities/execute-non-linear-workflow.d.ts +3 -0
  88. package/dist/utilities/execute-non-linear-workflow.d.ts.map +1 -0
  89. package/dist/utilities/execute-non-linear-workflow.js +486 -0
  90. package/dist/utilities/execute-non-linear-workflow.js.map +1 -0
  91. package/dist/utilities/execute-phase.d.ts +3 -0
  92. package/dist/utilities/execute-phase.d.ts.map +1 -0
  93. package/dist/utilities/execute-phase.js +132 -0
  94. package/dist/utilities/execute-phase.js.map +1 -0
  95. package/dist/utilities/execute-sequentially.d.ts +3 -0
  96. package/dist/utilities/execute-sequentially.d.ts.map +1 -0
  97. package/dist/utilities/execute-sequentially.js +49 -0
  98. package/dist/utilities/execute-sequentially.js.map +1 -0
  99. package/dist/utilities/execute-with-persistence.d.ts +3 -0
  100. package/dist/utilities/execute-with-persistence.d.ts.map +1 -0
  101. package/dist/utilities/execute-with-persistence.js +60 -0
  102. package/dist/utilities/execute-with-persistence.js.map +1 -0
  103. package/dist/utilities/execute-with-timeout.d.ts +6 -0
  104. package/dist/utilities/execute-with-timeout.d.ts.map +1 -0
  105. package/dist/utilities/execute-with-timeout.js +28 -0
  106. package/dist/utilities/execute-with-timeout.js.map +1 -0
  107. package/dist/utilities/execute-workflow-graph.d.ts +3 -0
  108. package/dist/utilities/execute-workflow-graph.d.ts.map +1 -0
  109. package/dist/utilities/execute-workflow-graph.js +439 -0
  110. package/dist/utilities/execute-workflow-graph.js.map +1 -0
  111. package/dist/utilities/extract-common-request-config-options.d.ts +3 -0
  112. package/dist/utilities/extract-common-request-config-options.d.ts.map +1 -0
  113. package/dist/utilities/extract-common-request-config-options.js +12 -0
  114. package/dist/utilities/extract-common-request-config-options.js.map +1 -0
  115. package/dist/utilities/fn-exec.d.ts +3 -0
  116. package/dist/utilities/fn-exec.d.ts.map +1 -0
  117. package/dist/utilities/fn-exec.js +66 -0
  118. package/dist/utilities/fn-exec.js.map +1 -0
  119. package/dist/utilities/format-log-context.d.ts +3 -0
  120. package/dist/utilities/format-log-context.d.ts.map +1 -0
  121. package/dist/utilities/format-log-context.js +19 -0
  122. package/dist/utilities/format-log-context.js.map +1 -0
  123. package/dist/utilities/function-cache-manager.d.ts +32 -0
  124. package/dist/utilities/function-cache-manager.d.ts.map +1 -0
  125. package/dist/utilities/function-cache-manager.js +172 -0
  126. package/dist/utilities/function-cache-manager.js.map +1 -0
  127. package/dist/utilities/generate-axios-request-config.d.ts +12 -0
  128. package/dist/utilities/generate-axios-request-config.d.ts.map +1 -0
  129. package/dist/utilities/generate-axios-request-config.js +14 -0
  130. package/dist/utilities/generate-axios-request-config.js.map +1 -0
  131. package/dist/utilities/get-new-delay-time.d.ts +3 -0
  132. package/dist/utilities/get-new-delay-time.d.ts.map +1 -0
  133. package/dist/utilities/get-new-delay-time.js +26 -0
  134. package/dist/utilities/get-new-delay-time.js.map +1 -0
  135. package/dist/utilities/hash-utils.d.ts +4 -0
  136. package/dist/utilities/hash-utils.d.ts.map +1 -0
  137. package/dist/utilities/hash-utils.js +24 -0
  138. package/dist/utilities/hash-utils.js.map +1 -0
  139. package/dist/utilities/index.d.ts +37 -0
  140. package/dist/utilities/index.d.ts.map +1 -0
  141. package/dist/utilities/index.js +37 -0
  142. package/dist/utilities/index.js.map +1 -0
  143. package/dist/utilities/infrastructure-persistence.d.ts +14 -0
  144. package/dist/utilities/infrastructure-persistence.d.ts.map +1 -0
  145. package/dist/utilities/infrastructure-persistence.js +87 -0
  146. package/dist/utilities/infrastructure-persistence.js.map +1 -0
  147. package/dist/utilities/is-retryable-error.d.ts +4 -0
  148. package/dist/utilities/is-retryable-error.d.ts.map +1 -0
  149. package/dist/utilities/is-retryable-error.js +22 -0
  150. package/dist/utilities/is-retryable-error.js.map +1 -0
  151. package/dist/utilities/metrics-aggregator.d.ts +19 -0
  152. package/dist/utilities/metrics-aggregator.d.ts.map +1 -0
  153. package/dist/utilities/metrics-aggregator.js +300 -0
  154. package/dist/utilities/metrics-aggregator.js.map +1 -0
  155. package/dist/utilities/metrics-validator.d.ts +98 -0
  156. package/dist/utilities/metrics-validator.d.ts.map +1 -0
  157. package/dist/utilities/metrics-validator.js +324 -0
  158. package/dist/utilities/metrics-validator.js.map +1 -0
  159. package/dist/utilities/prepare-api-function-options.d.ts +3 -0
  160. package/dist/utilities/prepare-api-function-options.d.ts.map +1 -0
  161. package/dist/utilities/prepare-api-function-options.js +51 -0
  162. package/dist/utilities/prepare-api-function-options.js.map +1 -0
  163. package/dist/utilities/prepare-api-request-data.d.ts +3 -0
  164. package/dist/utilities/prepare-api-request-data.d.ts.map +1 -0
  165. package/dist/utilities/prepare-api-request-data.js +15 -0
  166. package/dist/utilities/prepare-api-request-data.js.map +1 -0
  167. package/dist/utilities/prepare-api-request-options.d.ts +3 -0
  168. package/dist/utilities/prepare-api-request-options.d.ts.map +1 -0
  169. package/dist/utilities/prepare-api-request-options.js +22 -0
  170. package/dist/utilities/prepare-api-request-options.js.map +1 -0
  171. package/dist/utilities/rate-limiter.d.ts +49 -0
  172. package/dist/utilities/rate-limiter.d.ts.map +1 -0
  173. package/dist/utilities/rate-limiter.js +197 -0
  174. package/dist/utilities/rate-limiter.js.map +1 -0
  175. package/dist/utilities/req-fn.d.ts +4 -0
  176. package/dist/utilities/req-fn.d.ts.map +1 -0
  177. package/dist/utilities/req-fn.js +94 -0
  178. package/dist/utilities/req-fn.js.map +1 -0
  179. package/dist/utilities/safely-execute-unknown-function.d.ts +2 -0
  180. package/dist/utilities/safely-execute-unknown-function.d.ts.map +1 -0
  181. package/dist/utilities/safely-execute-unknown-function.js +8 -0
  182. package/dist/utilities/safely-execute-unknown-function.js.map +1 -0
  183. package/dist/utilities/safely-stringify.d.ts +4 -0
  184. package/dist/utilities/safely-stringify.d.ts.map +1 -0
  185. package/dist/utilities/safely-stringify.js +13 -0
  186. package/dist/utilities/safely-stringify.js.map +1 -0
  187. package/dist/utilities/stable-buffer-replay.d.ts +3 -0
  188. package/dist/utilities/stable-buffer-replay.d.ts.map +1 -0
  189. package/dist/utilities/stable-buffer-replay.js +94 -0
  190. package/dist/utilities/stable-buffer-replay.js.map +1 -0
  191. package/dist/utilities/validate-trial-mode-probabilities.d.ts +3 -0
  192. package/dist/utilities/validate-trial-mode-probabilities.d.ts.map +1 -0
  193. package/dist/utilities/validate-trial-mode-probabilities.js +13 -0
  194. package/dist/utilities/validate-trial-mode-probabilities.js.map +1 -0
  195. package/dist/utilities/validate-workflow-graph.d.ts +7 -0
  196. package/dist/utilities/validate-workflow-graph.d.ts.map +1 -0
  197. package/dist/utilities/validate-workflow-graph.js +235 -0
  198. package/dist/utilities/validate-workflow-graph.js.map +1 -0
  199. package/dist/utilities/workflow-graph-builder.d.ts +37 -0
  200. package/dist/utilities/workflow-graph-builder.d.ts.map +1 -0
  201. package/dist/utilities/workflow-graph-builder.js +225 -0
  202. package/dist/utilities/workflow-graph-builder.js.map +1 -0
  203. package/package.json +63 -0
@@ -0,0 +1,197 @@
1
+ import { InfrastructurePersistenceCoordinator } from './infrastructure-persistence.js';
2
+ export class RateLimiter {
3
+ maxRequests;
4
+ windowMs;
5
+ tokens;
6
+ lastRefillTime;
7
+ queue = [];
8
+ totalRequests = 0;
9
+ throttledRequests = 0;
10
+ completedRequests = 0;
11
+ peakQueueLength = 0;
12
+ totalQueueWaitTime = 0;
13
+ peakRequestRate = 0;
14
+ requestsInCurrentWindow = 0;
15
+ windowStartTime = Date.now();
16
+ persistence;
17
+ persistenceCoordinator;
18
+ initialized = false;
19
+ constructor(maxRequestsOrConfig, windowMs, persistence) {
20
+ if (typeof maxRequestsOrConfig === 'object') {
21
+ this.maxRequests = Math.max(1, Math.floor(maxRequestsOrConfig.maxRequests));
22
+ this.windowMs = Math.max(100, maxRequestsOrConfig.windowMs);
23
+ this.persistence = maxRequestsOrConfig.persistence;
24
+ }
25
+ else {
26
+ this.maxRequests = Math.max(1, Math.floor(maxRequestsOrConfig));
27
+ this.windowMs = Math.max(100, windowMs);
28
+ this.persistence = persistence;
29
+ }
30
+ this.persistenceCoordinator = this.persistence
31
+ ? new InfrastructurePersistenceCoordinator(this.persistence, 'rate-limiter')
32
+ : undefined;
33
+ this.tokens = this.maxRequests;
34
+ this.lastRefillTime = Date.now();
35
+ }
36
+ async initialize() {
37
+ if (this.initialized)
38
+ return;
39
+ if (this.persistenceCoordinator) {
40
+ try {
41
+ const persistedState = await this.persistenceCoordinator.load();
42
+ if (persistedState) {
43
+ this.restoreState(persistedState);
44
+ }
45
+ }
46
+ catch (error) {
47
+ console.warn('stable-infra: Unable to load rate limiter state from persistence.');
48
+ }
49
+ }
50
+ this.initialized = true;
51
+ }
52
+ restoreState(persistedState) {
53
+ this.tokens = persistedState.tokens;
54
+ this.lastRefillTime = persistedState.lastRefillTime;
55
+ this.totalRequests = persistedState.totalRequests;
56
+ this.throttledRequests = persistedState.throttledRequests;
57
+ this.completedRequests = persistedState.completedRequests;
58
+ this.peakQueueLength = persistedState.peakQueueLength;
59
+ this.totalQueueWaitTime = persistedState.totalQueueWaitTime;
60
+ this.peakRequestRate = persistedState.peakRequestRate;
61
+ this.requestsInCurrentWindow = persistedState.requestsInCurrentWindow;
62
+ this.windowStartTime = persistedState.windowStartTime;
63
+ }
64
+ getPersistedState() {
65
+ return {
66
+ tokens: this.tokens,
67
+ lastRefillTime: this.lastRefillTime,
68
+ totalRequests: this.totalRequests,
69
+ throttledRequests: this.throttledRequests,
70
+ completedRequests: this.completedRequests,
71
+ peakQueueLength: this.peakQueueLength,
72
+ totalQueueWaitTime: this.totalQueueWaitTime,
73
+ peakRequestRate: this.peakRequestRate,
74
+ requestsInCurrentWindow: this.requestsInCurrentWindow,
75
+ windowStartTime: this.windowStartTime
76
+ };
77
+ }
78
+ async persistState() {
79
+ if (this.persistenceCoordinator) {
80
+ try {
81
+ await this.persistenceCoordinator.store(this.getPersistedState());
82
+ }
83
+ catch (error) {
84
+ console.warn('stable-infra: Unable to store rate limiter state to persistence.');
85
+ }
86
+ }
87
+ }
88
+ refillTokens() {
89
+ const now = Date.now();
90
+ const elapsed = now - this.lastRefillTime;
91
+ if (elapsed >= this.windowMs) {
92
+ const windowsPassed = Math.floor(elapsed / this.windowMs);
93
+ this.tokens = Math.min(this.maxRequests, this.tokens + (windowsPassed * this.maxRequests));
94
+ this.lastRefillTime = now;
95
+ this.requestsInCurrentWindow = 0;
96
+ this.windowStartTime = now;
97
+ }
98
+ }
99
+ async acquire() {
100
+ this.totalRequests++;
101
+ this.refillTokens();
102
+ if (this.tokens > 0) {
103
+ this.tokens--;
104
+ this.requestsInCurrentWindow++;
105
+ this.peakRequestRate = Math.max(this.peakRequestRate, this.requestsInCurrentWindow);
106
+ this.persistState();
107
+ return Promise.resolve();
108
+ }
109
+ this.throttledRequests++;
110
+ const queueStartTime = Date.now();
111
+ return new Promise((resolve) => {
112
+ this.queue.push(() => {
113
+ this.totalQueueWaitTime += (Date.now() - queueStartTime);
114
+ resolve();
115
+ });
116
+ this.peakQueueLength = Math.max(this.peakQueueLength, this.queue.length);
117
+ this.persistState();
118
+ this.scheduleRefill();
119
+ });
120
+ }
121
+ scheduleRefill() {
122
+ const now = Date.now();
123
+ const timeUntilRefill = this.windowMs - (now - this.lastRefillTime);
124
+ if (timeUntilRefill > 0) {
125
+ setTimeout(() => {
126
+ this.refillTokens();
127
+ this.processQueue();
128
+ }, timeUntilRefill);
129
+ }
130
+ }
131
+ processQueue() {
132
+ while (this.queue.length > 0 && this.tokens > 0) {
133
+ const next = this.queue.shift();
134
+ if (next) {
135
+ this.tokens--;
136
+ next();
137
+ }
138
+ }
139
+ if (this.queue.length > 0) {
140
+ this.scheduleRefill();
141
+ }
142
+ this.persistState();
143
+ }
144
+ async execute(fn) {
145
+ await this.acquire();
146
+ try {
147
+ const result = await fn();
148
+ this.completedRequests++;
149
+ this.persistState();
150
+ return result;
151
+ }
152
+ catch (error) {
153
+ this.completedRequests++;
154
+ this.persistState();
155
+ throw error;
156
+ }
157
+ }
158
+ async executeAll(fns) {
159
+ return Promise.all(fns.map(fn => this.execute(fn)));
160
+ }
161
+ getState() {
162
+ this.refillTokens();
163
+ const throttleRate = this.totalRequests > 0
164
+ ? (this.throttledRequests / this.totalRequests) * 100
165
+ : 0;
166
+ const averageQueueWaitTime = this.throttledRequests > 0
167
+ ? this.totalQueueWaitTime / this.throttledRequests
168
+ : 0;
169
+ const currentRate = this.requestsInCurrentWindow / ((Date.now() - this.windowStartTime) / 1000);
170
+ return {
171
+ availableTokens: this.tokens,
172
+ queueLength: this.queue.length,
173
+ maxRequests: this.maxRequests,
174
+ windowMs: this.windowMs,
175
+ totalRequests: this.totalRequests,
176
+ throttledRequests: this.throttledRequests,
177
+ completedRequests: this.completedRequests,
178
+ throttleRate: throttleRate,
179
+ peakQueueLength: this.peakQueueLength,
180
+ averageQueueWaitTime: averageQueueWaitTime,
181
+ peakRequestRate: this.peakRequestRate,
182
+ currentRequestRate: currentRate,
183
+ requestsInCurrentWindow: this.requestsInCurrentWindow
184
+ };
185
+ }
186
+ }
187
+ let globalRateLimiter = null;
188
+ export function getGlobalRateLimiter(maxRequests, windowMs) {
189
+ if (!globalRateLimiter && maxRequests !== undefined && windowMs !== undefined) {
190
+ globalRateLimiter = new RateLimiter(maxRequests, windowMs);
191
+ }
192
+ return globalRateLimiter;
193
+ }
194
+ export function resetGlobalRateLimiter() {
195
+ globalRateLimiter = null;
196
+ }
197
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utilities/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { ReqFnResponse, TRIAL_MODE_OPTIONS, CacheConfig, ExecutionContext } from '../types/index.js';
3
+ export declare function reqFn<RequestDataType = any, ResponseDataType = any>(reqData: AxiosRequestConfig<RequestDataType>, resReq?: boolean, maxSerializableChars?: number, trialMode?: TRIAL_MODE_OPTIONS, cacheConfig?: CacheConfig, executionContext?: ExecutionContext): Promise<ReqFnResponse<ResponseDataType>>;
4
+ //# sourceMappingURL=req-fn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"req-fn.d.ts","sourceRoot":"","sources":["../../src/utilities/req-fn.ts"],"names":[],"mappings":"AAAA,OAAc,EAAc,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAMrG,wBAAsB,KAAK,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG,EACvE,OAAO,EAAE,kBAAkB,CAAC,eAAe,CAAC,EAC5C,MAAM,UAAQ,EACd,oBAAoB,SAAO,EAC3B,SAAS,GAAE,kBAAuC,EAClD,WAAW,CAAC,EAAE,WAAW,EACzB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAqG1C"}
@@ -0,0 +1,94 @@
1
+ import axios from 'axios';
2
+ import { safelyStringify } from './safely-stringify.js';
3
+ import { isRetryableError } from './is-retryable-error.js';
4
+ import { getGlobalCacheManager } from './cache-manager.js';
5
+ import { formatLogContext } from './format-log-context.js';
6
+ export async function reqFn(reqData, resReq = false, maxSerializableChars = 1000, trialMode = { enabled: false }, cacheConfig, executionContext) {
7
+ const startTime = Date.now();
8
+ let stopTime = 0;
9
+ const timestamp = new Date(startTime).toISOString();
10
+ let cacheManager = null;
11
+ if (cacheConfig?.enabled) {
12
+ cacheManager = getGlobalCacheManager(cacheConfig);
13
+ const cached = cacheManager.get(reqData);
14
+ if (cached) {
15
+ return {
16
+ ok: true,
17
+ isRetryable: true,
18
+ data: resReq ? cached.data : undefined,
19
+ timestamp: new Date(cached.timestamp).toISOString(),
20
+ executionTime: 0,
21
+ statusCode: cached.status,
22
+ fromCache: true
23
+ };
24
+ }
25
+ }
26
+ try {
27
+ if (trialMode.enabled) {
28
+ const trialCondition = Math.random() <= (trialMode?.reqFailureProbability ?? 0);
29
+ if (trialCondition) {
30
+ console.error(`${formatLogContext(executionContext)}stable-infra: Request failed in trial mode.\nRequest data:\n`, safelyStringify(reqData, maxSerializableChars));
31
+ throw new Error('stable-infra: Request failed in trial mode.');
32
+ }
33
+ else {
34
+ stopTime = Date.now();
35
+ return {
36
+ ok: true,
37
+ isRetryable: true,
38
+ timestamp,
39
+ executionTime: stopTime - startTime,
40
+ statusCode: 200,
41
+ ...(resReq && { data: { trialMode } }),
42
+ fromCache: false
43
+ };
44
+ }
45
+ }
46
+ const res = await axios.request(reqData);
47
+ stopTime = Date.now();
48
+ if (cacheManager) {
49
+ cacheManager.set(reqData, res.data, res.status, res.statusText, res.headers);
50
+ }
51
+ return resReq
52
+ ? {
53
+ ok: true,
54
+ isRetryable: true,
55
+ data: res?.data,
56
+ timestamp,
57
+ executionTime: stopTime - startTime,
58
+ statusCode: res?.status || 200,
59
+ fromCache: false
60
+ }
61
+ : {
62
+ ok: true,
63
+ isRetryable: true,
64
+ timestamp,
65
+ executionTime: stopTime - startTime,
66
+ statusCode: res?.status || 200,
67
+ fromCache: false
68
+ };
69
+ }
70
+ catch (e) {
71
+ stopTime = Date.now();
72
+ if (axios.isCancel(e)) {
73
+ return {
74
+ ok: false,
75
+ error: 'stable-infra: Request was cancelled.',
76
+ isRetryable: false,
77
+ timestamp,
78
+ executionTime: stopTime - startTime,
79
+ statusCode: e?.response?.status || 0,
80
+ fromCache: false
81
+ };
82
+ }
83
+ return {
84
+ ok: false,
85
+ error: `stable-infra: ${e?.response?.data ?? e?.message}`,
86
+ isRetryable: isRetryableError(e, trialMode),
87
+ timestamp,
88
+ executionTime: stopTime - startTime,
89
+ statusCode: e?.response?.status || 0,
90
+ fromCache: false
91
+ };
92
+ }
93
+ }
94
+ //# sourceMappingURL=req-fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"req-fn.js","sourceRoot":"","sources":["../../src/utilities/req-fn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function safelyExecuteUnknownFunction(f: Function, ...args: any[]): Promise<any>;
2
+ //# sourceMappingURL=safely-execute-unknown-function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safely-execute-unknown-function.d.ts","sourceRoot":"","sources":["../../src/utilities/safely-execute-unknown-function.ts"],"names":[],"mappings":"AAAA,wBAAsB,4BAA4B,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,gBAM7E"}
@@ -0,0 +1,8 @@
1
+ export async function safelyExecuteUnknownFunction(f, ...args) {
2
+ const result = f(...args);
3
+ if (result instanceof Promise) {
4
+ await result;
5
+ }
6
+ return result;
7
+ }
8
+ //# sourceMappingURL=safely-execute-unknown-function.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safely-execute-unknown-function.js","sourceRoot":"","sources":["../../src/utilities/safely-execute-unknown-function.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,CAAW,EAAE,GAAG,IAAW;IAC5E,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function safelyStringify(data: {
2
+ [key: string]: any;
3
+ }, maxLength?: number): string;
4
+ //# sourceMappingURL=safely-stringify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safely-stringify.d.ts","sourceRoot":"","sources":["../../src/utilities/safely-stringify.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAAE,SAAS,SAAO,GAAG,MAAM,CAUtF"}
@@ -0,0 +1,13 @@
1
+ export function safelyStringify(data, maxLength = 1000) {
2
+ try {
3
+ const str = JSON.stringify(data);
4
+ if (maxLength < 0) {
5
+ maxLength = 1000;
6
+ }
7
+ return str.length > maxLength ? str.slice(0, maxLength) + '...' : str;
8
+ }
9
+ catch {
10
+ return '[Unserializable data]';
11
+ }
12
+ }
13
+ //# sourceMappingURL=safely-stringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safely-stringify.js","sourceRoot":"","sources":["../../src/utilities/safely-stringify.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,IAA4B,EAAE,SAAS,GAAG,IAAI;IAC5E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,uBAAuB,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StableBufferReplayOptions, StableBufferReplayResult } from '../types/index.js';
2
+ export declare function replayStableBufferTransactions(options: StableBufferReplayOptions): Promise<StableBufferReplayResult>;
3
+ //# sourceMappingURL=stable-buffer-replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-buffer-replay.d.ts","sourceRoot":"","sources":["../../src/utilities/stable-buffer-replay.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,yBAAyB,EACzB,wBAAwB,EAGzB,MAAM,mBAAmB,CAAC;AAsC3B,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CA8EnC"}
@@ -0,0 +1,94 @@
1
+ import { StableBuffer } from '../core/stable-buffer.js';
2
+ import { isStableBuffer } from './buffer-utils.js';
3
+ const resolveBuffer = (buffer, initialState) => {
4
+ if (isStableBuffer(buffer)) {
5
+ return buffer;
6
+ }
7
+ if (buffer && typeof buffer === 'object') {
8
+ return new StableBuffer({ initialState: buffer });
9
+ }
10
+ return new StableBuffer({ initialState: initialState ?? {} });
11
+ };
12
+ const resolveTimestamp = (value) => {
13
+ if (!value)
14
+ return 0;
15
+ const parsed = Date.parse(value);
16
+ return Number.isNaN(parsed) ? 0 : parsed;
17
+ };
18
+ const orderLogs = (logs) => {
19
+ return [...logs].sort((a, b) => {
20
+ const byStarted = resolveTimestamp(a.startedAt) - resolveTimestamp(b.startedAt);
21
+ if (byStarted !== 0)
22
+ return byStarted;
23
+ const byQueued = resolveTimestamp(a.queuedAt) - resolveTimestamp(b.queuedAt);
24
+ if (byQueued !== 0)
25
+ return byQueued;
26
+ return (a.transactionId || '').localeCompare(b.transactionId || '');
27
+ });
28
+ };
29
+ const resolveHookHandler = (handlerMap, hookName) => {
30
+ if (!hookName)
31
+ return undefined;
32
+ return handlerMap[hookName];
33
+ };
34
+ export async function replayStableBufferTransactions(options) {
35
+ const { logs, handlers, buffer, initialState, allowUnknownHooks = false, dedupe = true, activityFilter, sort = true, onApply, onSkip, onError } = options;
36
+ const resolvedBuffer = resolveBuffer(buffer, initialState);
37
+ const orderedLogs = sort ? orderLogs(logs) : logs;
38
+ const appliedIds = new Set();
39
+ let applied = 0;
40
+ let skipped = 0;
41
+ const errors = [];
42
+ for (const log of orderedLogs) {
43
+ if (activityFilter && !activityFilter(log)) {
44
+ skipped += 1;
45
+ onSkip?.(log, 'filtered');
46
+ continue;
47
+ }
48
+ if (dedupe && log.transactionId && appliedIds.has(log.transactionId)) {
49
+ skipped += 1;
50
+ onSkip?.(log, 'duplicate');
51
+ continue;
52
+ }
53
+ const handler = resolveHookHandler(handlers, log.hookName);
54
+ if (!handler) {
55
+ if (!allowUnknownHooks) {
56
+ const error = new Error(`No replay handler registered for hook '${log.hookName ?? 'unknown'}'`);
57
+ errors.push({ log, error });
58
+ onError?.(log, error);
59
+ continue;
60
+ }
61
+ skipped += 1;
62
+ onSkip?.(log, 'missing-handler');
63
+ continue;
64
+ }
65
+ const transactionOptions = {
66
+ activity: 'replay',
67
+ hookName: log.hookName,
68
+ hookParams: log.hookParams,
69
+ workflowId: log.workflowId,
70
+ branchId: log.branchId,
71
+ phaseId: log.phaseId,
72
+ requestId: log.requestId
73
+ };
74
+ try {
75
+ await resolvedBuffer.run((state) => handler(state, log), transactionOptions);
76
+ applied += 1;
77
+ if (dedupe && log.transactionId) {
78
+ appliedIds.add(log.transactionId);
79
+ }
80
+ onApply?.(log);
81
+ }
82
+ catch (error) {
83
+ errors.push({ log, error });
84
+ onError?.(log, error);
85
+ }
86
+ }
87
+ return {
88
+ buffer: resolvedBuffer,
89
+ applied,
90
+ skipped,
91
+ errors
92
+ };
93
+ }
94
+ //# sourceMappingURL=stable-buffer-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-buffer-replay.js","sourceRoot":"","sources":["../../src/utilities/stable-buffer-replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TRIAL_MODE_OPTIONS } from '../types/index.js';
2
+ export declare function validateTrialModeProbabilities(trialMode: TRIAL_MODE_OPTIONS): void;
3
+ //# sourceMappingURL=validate-trial-mode-probabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-trial-mode-probabilities.d.ts","sourceRoot":"","sources":["../../src/utilities/validate-trial-mode-probabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,kBAAkB,QAe3E"}
@@ -0,0 +1,13 @@
1
+ export function validateTrialModeProbabilities(trialMode) {
2
+ if (trialMode.enabled) {
3
+ const reqFailureProbability = trialMode.reqFailureProbability ?? 0;
4
+ const retryFailureProbability = trialMode.retryFailureProbability ?? 0;
5
+ if (reqFailureProbability < 0 || reqFailureProbability > 1) {
6
+ throw new Error('stable-infra: Unable to proceed as request failure probability must be between 0 and 1.');
7
+ }
8
+ if (retryFailureProbability < 0 || retryFailureProbability > 1) {
9
+ throw new Error('stable-infra: Unable to proceed as retry failure probability must be between 0 and 1.');
10
+ }
11
+ }
12
+ }
13
+ //# sourceMappingURL=validate-trial-mode-probabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-trial-mode-probabilities.js","sourceRoot":"","sources":["../../src/utilities/validate-trial-mode-probabilities.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,8BAA8B,CAAC,SAA6B;IAC1E,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,qBAAqB,GAAG,SAAS,CAAC,qBAAqB,IAAI,CAAC,CAAC;QACnE,MAAM,uBAAuB,GAAG,SAAS,CAAC,uBAAuB,IAAI,CAAC,CAAC;QACvE,IAAI,qBAAqB,GAAG,CAAC,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QACD,IAAI,uBAAuB,GAAG,CAAC,IAAI,uBAAuB,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { WorkflowGraph, WorkflowGraphValidationResult } from '../types/index.js';
2
+ export declare function validateWorkflowGraph<RequestDataType = any, ResponseDataType = any, FunctionArgsType extends any[] = any, FunctionReturnType = any>(graph: WorkflowGraph<RequestDataType, ResponseDataType, FunctionArgsType, FunctionReturnType>): WorkflowGraphValidationResult;
3
+ export declare function detectCycles<RequestDataType = any, ResponseDataType = any, FunctionArgsType extends any[] = any[], FunctionReturnType = any>(graph: WorkflowGraph<RequestDataType, ResponseDataType, FunctionArgsType, FunctionReturnType>): string[][];
4
+ export declare function detectUnreachableNodes<RequestDataType = any, ResponseDataType = any, FunctionArgsType extends any[] = any[], FunctionReturnType = any>(graph: WorkflowGraph<RequestDataType, ResponseDataType, FunctionArgsType, FunctionReturnType>): string[];
5
+ export declare function detectOrphanNodes<RequestDataType = any, ResponseDataType = any, FunctionArgsType extends any[] = any[], FunctionReturnType = any>(graph: WorkflowGraph<RequestDataType, ResponseDataType, FunctionArgsType, FunctionReturnType>): string[];
6
+ export declare function calculateGraphDepth<RequestDataType = any, ResponseDataType = any, FunctionArgsType extends any[] = any[], FunctionReturnType = any>(graph: WorkflowGraph<RequestDataType, ResponseDataType, FunctionArgsType, FunctionReturnType>): number;
7
+ //# sourceMappingURL=validate-workflow-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-workflow-graph.d.ts","sourceRoot":"","sources":["../../src/utilities/validate-workflow-graph.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,6BAA6B,EAE9B,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,qBAAqB,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG,EAAE,gBAAgB,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,kBAAkB,GAAG,GAAG,EACjJ,KAAK,EAAE,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,GAC5F,6BAA6B,CA0D/B;AAiED,wBAAgB,YAAY,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG,EAAE,gBAAgB,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,kBAAkB,GAAG,GAAG,EAC1I,KAAK,EAAE,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,GAC5F,MAAM,EAAE,EAAE,CAyCZ;AAED,wBAAgB,sBAAsB,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG,EAAE,gBAAgB,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,kBAAkB,GAAG,GAAG,EACpJ,KAAK,EAAE,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,GAC5F,MAAM,EAAE,CAoDV;AAED,wBAAgB,iBAAiB,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG,EAAE,gBAAgB,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,kBAAkB,GAAG,GAAG,EAC/I,KAAK,EAAE,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,GAC5F,MAAM,EAAE,CA+BV;AAED,wBAAgB,mBAAmB,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG,EAAE,gBAAgB,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,kBAAkB,GAAG,GAAG,EACjJ,KAAK,EAAE,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,GAC5F,MAAM,CA4BR"}