brass-runtime 1.16.0 → 1.17.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 (219) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +287 -23
  3. package/dist/agent/cli/main.cjs +38 -38
  4. package/dist/agent/cli/main.js +6 -6
  5. package/dist/agent/cli/main.mjs +6 -6
  6. package/dist/agent/index.cjs +7 -7
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +6 -6
  9. package/dist/agent/index.mjs +6 -6
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3Y2RIUMM.js +300 -0
  15. package/dist/{chunk-7XOPAB5Q.js → chunk-4P2HHGAX.mjs} +83 -5
  16. package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
  17. package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
  18. package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
  19. package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
  20. package/dist/chunk-5QC7LRZ3.js +229 -0
  21. package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
  22. package/dist/chunk-62AZW6UT.cjs +313 -0
  23. package/dist/chunk-6IXXWIUM.js +683 -0
  24. package/dist/chunk-6RY2FFN4.mjs +2024 -0
  25. package/dist/chunk-74ZTY6CP.js +2871 -0
  26. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  27. package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
  28. package/dist/chunk-7X3K5RMS.js +2024 -0
  29. package/dist/chunk-7ZPEZ57L.cjs +2024 -0
  30. package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
  31. package/dist/chunk-AGR5B2BC.cjs +683 -0
  32. package/dist/chunk-B33ICAKP.js +313 -0
  33. package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
  34. package/dist/{chunk-F5EUMJL7.mjs → chunk-BKK77SBA.js} +83 -5
  35. package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
  36. package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
  37. package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
  38. package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
  39. package/dist/chunk-EOC4UHBS.mjs +229 -0
  40. package/dist/chunk-F6XWZQY4.cjs +777 -0
  41. package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
  42. package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
  43. package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
  44. package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
  45. package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
  46. package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
  47. package/dist/chunk-KN32XNTH.mjs +313 -0
  48. package/dist/chunk-KQLYONSE.cjs +2871 -0
  49. package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
  50. package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
  51. package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
  52. package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
  53. package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
  54. package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
  55. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  56. package/dist/chunk-PD4EJTQC.cjs +229 -0
  57. package/dist/chunk-PWC3RBQE.mjs +300 -0
  58. package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
  59. package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
  60. package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
  61. package/dist/chunk-SK7UZRNI.mjs +777 -0
  62. package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
  63. package/dist/chunk-UB4B6OFY.js +370 -0
  64. package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
  65. package/dist/chunk-VWIPB6I5.js +777 -0
  66. package/dist/{chunk-JNFRRJYH.cjs → chunk-WBGRHGBP.cjs} +270 -192
  67. package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
  68. package/dist/core/index.cjs +135 -9
  69. package/dist/core/index.d.ts +238 -33
  70. package/dist/core/index.js +155 -29
  71. package/dist/core/index.mjs +155 -29
  72. package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
  73. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  74. package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
  75. package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
  76. package/dist/http/index.cjs +324 -2986
  77. package/dist/http/index.d.ts +54 -68
  78. package/dist/http/index.js +238 -2900
  79. package/dist/http/index.mjs +238 -2900
  80. package/dist/http/testing.cjs +14 -12
  81. package/dist/http/testing.d.ts +5 -4
  82. package/dist/http/testing.js +10 -8
  83. package/dist/http/testing.mjs +10 -8
  84. package/dist/index.cjs +423 -255
  85. package/dist/index.d.ts +87 -69
  86. package/dist/index.js +301 -133
  87. package/dist/index.mjs +301 -133
  88. package/dist/observability/index.cjs +18 -531
  89. package/dist/observability/index.d.ts +81 -8
  90. package/dist/observability/index.js +25 -538
  91. package/dist/observability/index.mjs +25 -538
  92. package/dist/perf/cli.cjs +401 -0
  93. package/dist/perf/cli.d.ts +1 -0
  94. package/dist/perf/cli.js +401 -0
  95. package/dist/perf/cli.mjs +401 -0
  96. package/dist/perf/index.cjs +141 -0
  97. package/dist/perf/index.d.ts +483 -0
  98. package/dist/perf/index.js +141 -0
  99. package/dist/perf/index.mjs +141 -0
  100. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  101. package/dist/schema/index.cjs +6 -2
  102. package/dist/schema/index.d.ts +3 -1
  103. package/dist/schema/index.js +5 -1
  104. package/dist/schema/index.mjs +5 -1
  105. package/dist/{server-C8hDXA74.d.ts → server-D6JZ15_e.d.ts} +16 -4
  106. package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  107. package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
  108. package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
  109. package/docs/ARCHITECTURE.md +292 -0
  110. package/docs/README.md +65 -0
  111. package/docs/adr/0001-ai-context-pack.md +32 -0
  112. package/docs/agent-apply-mode.md +104 -0
  113. package/docs/agent-approvals.md +110 -0
  114. package/docs/agent-batch.md +185 -0
  115. package/docs/agent-boundaries.md +112 -0
  116. package/docs/agent-chat-sessions.md +160 -0
  117. package/docs/agent-ci.md +17 -0
  118. package/docs/agent-cli.md +405 -0
  119. package/docs/agent-config.md +480 -0
  120. package/docs/agent-context-discovery.md +159 -0
  121. package/docs/agent-copilot-like-dx.md +126 -0
  122. package/docs/agent-declarative-optimized-planning.md +138 -0
  123. package/docs/agent-dx.md +224 -0
  124. package/docs/agent-env-files.md +126 -0
  125. package/docs/agent-follow-up-context.md +43 -0
  126. package/docs/agent-global-usage.md +180 -0
  127. package/docs/agent-init.md +109 -0
  128. package/docs/agent-install-and-configure.md +516 -0
  129. package/docs/agent-language-workspace-ux.md +99 -0
  130. package/docs/agent-llm-adapters.md +123 -0
  131. package/docs/agent-local-install.md +190 -0
  132. package/docs/agent-local-tests.md +51 -0
  133. package/docs/agent-observability.md +155 -0
  134. package/docs/agent-patch-quality-loop.md +162 -0
  135. package/docs/agent-presets.md +22 -0
  136. package/docs/agent-project-commands.md +237 -0
  137. package/docs/agent-project-intelligence.md +156 -0
  138. package/docs/agent-redaction.md +18 -0
  139. package/docs/agent-release-readiness.md +76 -0
  140. package/docs/agent-rollback-safety.md +162 -0
  141. package/docs/agent-rollback.md +23 -0
  142. package/docs/agent-run-artifacts.md +16 -0
  143. package/docs/agent-vscode-auto-discovery.md +137 -0
  144. package/docs/agent-vscode-batch-runner.md +100 -0
  145. package/docs/agent-vscode-chat-layout.md +90 -0
  146. package/docs/agent-vscode-clean-install.md +147 -0
  147. package/docs/agent-vscode-code-actions.md +70 -0
  148. package/docs/agent-vscode-diff-preview.md +45 -0
  149. package/docs/agent-vscode-inline-assist.md +56 -0
  150. package/docs/agent-vscode-install.md +186 -0
  151. package/docs/agent-vscode-model-setup.md +97 -0
  152. package/docs/agent-vscode-patch-preview.md +92 -0
  153. package/docs/agent-vscode-problems.md +79 -0
  154. package/docs/agent-vscode-project-dashboard.md +106 -0
  155. package/docs/agent-vscode-run-history.md +92 -0
  156. package/docs/agent-vscode-ux.md +73 -0
  157. package/docs/ai/INVARIANTS.md +84 -0
  158. package/docs/ai/PROJECT_MAP.md +338 -0
  159. package/docs/ai/PUBLIC_API.md +339 -0
  160. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  161. package/docs/api-polish.md +37 -0
  162. package/docs/cancellation.md +162 -0
  163. package/docs/coverage.md +46 -0
  164. package/docs/framework-integrations.md +38 -0
  165. package/docs/frameworks/angular.md +153 -0
  166. package/docs/frameworks/express.md +125 -0
  167. package/docs/frameworks/fastify.md +124 -0
  168. package/docs/frameworks/nestjs.md +282 -0
  169. package/docs/frameworks/nextjs.md +147 -0
  170. package/docs/frameworks/react.md +139 -0
  171. package/docs/frameworks/vanilla.md +224 -0
  172. package/docs/getting-started.md +159 -0
  173. package/docs/guides/README.md +40 -0
  174. package/docs/guides/circuit-breaker.md +89 -0
  175. package/docs/guides/error-handling.md +91 -0
  176. package/docs/guides/getting-started.md +107 -0
  177. package/docs/guides/layers.md +189 -0
  178. package/docs/guides/metrics.md +101 -0
  179. package/docs/guides/resource-management.md +141 -0
  180. package/docs/guides/retry.md +215 -0
  181. package/docs/guides/semaphore.md +66 -0
  182. package/docs/guides/streams.md +117 -0
  183. package/docs/guides/supervisors.md +98 -0
  184. package/docs/guides/testing.md +162 -0
  185. package/docs/guides/tracing.md +71 -0
  186. package/docs/http-recipes.md +399 -0
  187. package/docs/http.md +749 -0
  188. package/docs/modules.md +285 -0
  189. package/docs/nestjs.md +6 -0
  190. package/docs/observability-collector-smoke.md +31 -0
  191. package/docs/observability-framework-examples.md +110 -0
  192. package/docs/observability.md +649 -0
  193. package/docs/otel-collector-smoke.yaml +27 -0
  194. package/docs/performance-profiler.md +199 -0
  195. package/docs/production-readiness.md +73 -0
  196. package/docs/recipes/README.md +12 -0
  197. package/docs/recipes/http-server.md +45 -0
  198. package/docs/recipes/layers.md +44 -0
  199. package/docs/recipes/performance.md +47 -0
  200. package/docs/recipes/runtime.md +41 -0
  201. package/docs/recipes/testing.md +41 -0
  202. package/docs/release.md +53 -0
  203. package/docs/wasm-bounded-queues.md +44 -0
  204. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  205. package/docs/wasm-fiber-engine.md +117 -0
  206. package/docs/wasm-scheduler-state-machine.md +122 -0
  207. package/docs/wasm-stream-chunks.md +54 -0
  208. package/package.json +22 -2
  209. package/dist/chunk-45F7OKGT.cjs +0 -104
  210. package/dist/chunk-7V4KY4RL.mjs +0 -104
  211. package/dist/chunk-DJQ7OMMB.cjs +0 -144
  212. package/dist/chunk-GOV47PPB.mjs +0 -552
  213. package/dist/chunk-JF4XXPZ5.cjs +0 -552
  214. package/dist/chunk-KCPT2D6G.js +0 -552
  215. package/dist/chunk-NOYZIMUJ.mjs +0 -144
  216. package/dist/chunk-PNVFW245.js +0 -144
  217. package/dist/chunk-ROJC3NBJ.js +0 -104
  218. package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
  219. package/dist/schedule-Fque9Abz.d.ts +0 -70
@@ -0,0 +1,313 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunkJF5WGYJJcjs = require('./chunk-JF5WGYJJ.cjs');
4
+
5
+
6
+ var _chunkGLE2WY7Zcjs = require('./chunk-GLE2WY7Z.cjs');
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ var _chunkMVGUEJ5Zcjs = require('./chunk-MVGUEJ5Z.cjs');
16
+
17
+ // src/core/runtime/resource.ts
18
+ function bracket(acquire, use, release) {
19
+ return _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (env, cb) => {
20
+ const runtime = _chunkGLE2WY7Zcjs.unsafeGetCurrentRuntime.call(void 0, );
21
+ const scope = new (0, _chunkJF5WGYJJcjs.Scope)(runtime);
22
+ const acquireFiber = scope.fork(acquire);
23
+ acquireFiber.join((acquireExit) => {
24
+ if (acquireExit._tag === "Failure") {
25
+ scope.close(acquireExit);
26
+ cb(acquireExit);
27
+ return;
28
+ }
29
+ const resource2 = acquireExit.value;
30
+ const useFiber = scope.fork(use(resource2));
31
+ useFiber.join((useExit) => {
32
+ const releaseEffect = safeRelease(release, resource2, useExit);
33
+ const releaseFiber = runtime.fork(releaseEffect);
34
+ releaseFiber.join(() => {
35
+ scope.close(useExit);
36
+ cb(useExit);
37
+ });
38
+ });
39
+ });
40
+ return () => {
41
+ scope.close(_chunkMVGUEJ5Zcjs.Exit.failCause(_chunkMVGUEJ5Zcjs.Cause.interrupt()));
42
+ };
43
+ });
44
+ }
45
+ function safeRelease(release, resource2, exit) {
46
+ return _chunkMVGUEJ5Zcjs.asyncFold.call(void 0,
47
+ (() => {
48
+ try {
49
+ return release(resource2, exit);
50
+ } catch (e) {
51
+ return _chunkMVGUEJ5Zcjs.unit.call(void 0, );
52
+ }
53
+ })(),
54
+ () => _chunkMVGUEJ5Zcjs.unit.call(void 0, ),
55
+ () => _chunkMVGUEJ5Zcjs.unit.call(void 0, )
56
+ );
57
+ }
58
+ function ensuring(effect, finalizer) {
59
+ return _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (env, cb) => {
60
+ const runtime = _chunkGLE2WY7Zcjs.unsafeGetCurrentRuntime.call(void 0, );
61
+ const fiber = runtime.fork(effect);
62
+ fiber.join((exit) => {
63
+ const fin = _chunkMVGUEJ5Zcjs.asyncFold.call(void 0,
64
+ (() => {
65
+ try {
66
+ return finalizer(exit);
67
+ } catch (e2) {
68
+ return _chunkMVGUEJ5Zcjs.unit.call(void 0, );
69
+ }
70
+ })(),
71
+ () => _chunkMVGUEJ5Zcjs.unit.call(void 0, ),
72
+ () => _chunkMVGUEJ5Zcjs.unit.call(void 0, )
73
+ );
74
+ runtime.fork(fin).join(() => {
75
+ cb(exit);
76
+ });
77
+ });
78
+ return () => {
79
+ fiber.interrupt();
80
+ };
81
+ });
82
+ }
83
+ function resource(acquire, release) {
84
+ return makeResourceFromUse((body) => bracket(acquire, body, release));
85
+ }
86
+ var makeResource = resource;
87
+ function resourceSucceed(value) {
88
+ return makeResourceFromUse((body) => body(value));
89
+ }
90
+ function resourceFromManaged(m) {
91
+ return makeResourceFromUse((body) => useManaged(m, body));
92
+ }
93
+ function useResource(res, body) {
94
+ return res.use(body);
95
+ }
96
+ function resourceAll(resources) {
97
+ const build = (index) => {
98
+ if (index >= resources.length) return resourceSucceed([]);
99
+ return resources[index].flatMap(
100
+ (head) => build(index + 1).map((tail) => [head, ...tail])
101
+ );
102
+ };
103
+ return build(0).map((values) => values);
104
+ }
105
+ var Resource = Object.freeze({
106
+ make: resource,
107
+ succeed: resourceSucceed,
108
+ fromManaged: resourceFromManaged,
109
+ all: resourceAll,
110
+ use: useResource
111
+ });
112
+ function makeResourceFromUse(use) {
113
+ const self = {
114
+ _tag: "Resource",
115
+ use,
116
+ map: (f) => makeResourceFromUse((body) => self.use((a) => body(f(a)))),
117
+ flatMap: (f) => makeResourceFromUse((body) => self.use((a) => f(a).use(body))),
118
+ zip: (that) => self.flatMap((a) => that.map((b) => [a, b]))
119
+ };
120
+ return self;
121
+ }
122
+ function managed(acquire, release) {
123
+ return {
124
+ _tag: "Managed",
125
+ acquire,
126
+ release: (resource2, exit) => release(resource2, exit)
127
+ };
128
+ }
129
+ function useManaged(m, body) {
130
+ return bracket(m.acquire, body, m.release);
131
+ }
132
+ function managedAll(manageds) {
133
+ const acquire = _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (env, cb) => {
134
+ const runtime = _chunkGLE2WY7Zcjs.unsafeGetCurrentRuntime.call(void 0, );
135
+ const resources = [];
136
+ let i = 0;
137
+ const acquireNext = () => {
138
+ if (i >= manageds.length) {
139
+ cb({ _tag: "Success", value: resources });
140
+ return;
141
+ }
142
+ const m = manageds[i];
143
+ const fiber = runtime.fork(m.acquire);
144
+ fiber.join((exit) => {
145
+ if (exit._tag === "Failure") {
146
+ releaseAcquired(runtime, manageds, resources, exit).then(() => {
147
+ cb(exit);
148
+ });
149
+ return;
150
+ }
151
+ resources.push(exit.value);
152
+ i++;
153
+ acquireNext();
154
+ });
155
+ };
156
+ acquireNext();
157
+ });
158
+ const release = (resources, exit) => {
159
+ return _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (_env, cb) => {
160
+ const runtime = _chunkGLE2WY7Zcjs.unsafeGetCurrentRuntime.call(void 0, );
161
+ releaseAcquired(runtime, manageds, resources, exit).then(() => {
162
+ cb({ _tag: "Success", value: void 0 });
163
+ });
164
+ });
165
+ };
166
+ return { _tag: "Managed", acquire, release };
167
+ }
168
+ async function releaseAcquired(runtime, manageds, resources, exit) {
169
+ for (let i = resources.length - 1; i >= 0; i--) {
170
+ try {
171
+ const m = manageds[i];
172
+ await new Promise((resolve) => {
173
+ const releaseEff = _chunkMVGUEJ5Zcjs.asyncFold.call(void 0,
174
+ m.release(resources[i], exit),
175
+ () => _chunkMVGUEJ5Zcjs.unit.call(void 0, ),
176
+ () => _chunkMVGUEJ5Zcjs.unit.call(void 0, )
177
+ );
178
+ runtime.fork(releaseEff).join(() => resolve());
179
+ });
180
+ } catch (e3) {
181
+ }
182
+ }
183
+ }
184
+
185
+ // src/core/runtime/circuitBreaker.ts
186
+ function makeCircuitBreaker(config = {}) {
187
+ const failureThreshold = _nullishCoalesce(config.failureThreshold, () => ( 5));
188
+ const resetTimeoutMs = _nullishCoalesce(config.resetTimeoutMs, () => ( 3e4));
189
+ const successThreshold = _nullishCoalesce(config.successThreshold, () => ( 1));
190
+ const isFailure = _nullishCoalesce(config.isFailure, () => ( (() => true)));
191
+ const onStateChange = config.onStateChange;
192
+ let currentState = "closed";
193
+ let consecutiveFailures = 0;
194
+ let consecutiveSuccesses = 0;
195
+ let openedAt = 0;
196
+ let totalRequests = 0;
197
+ let totalFailures = 0;
198
+ let totalSuccesses = 0;
199
+ let totalRejected = 0;
200
+ let lastFailureTime = null;
201
+ let lastSuccessTime = null;
202
+ const transition = (to) => {
203
+ if (currentState === to) return;
204
+ const from = currentState;
205
+ currentState = to;
206
+ _optionalChain([onStateChange, 'optionalCall', _ => _(from, to)]);
207
+ };
208
+ const onSuccess = () => {
209
+ totalSuccesses++;
210
+ lastSuccessTime = Date.now();
211
+ consecutiveFailures = 0;
212
+ if (currentState === "half-open") {
213
+ consecutiveSuccesses++;
214
+ if (consecutiveSuccesses >= successThreshold) {
215
+ consecutiveSuccesses = 0;
216
+ transition("closed");
217
+ }
218
+ }
219
+ };
220
+ const onFailure = (error) => {
221
+ if (!isFailure(error)) {
222
+ onSuccess();
223
+ return;
224
+ }
225
+ totalFailures++;
226
+ lastFailureTime = Date.now();
227
+ consecutiveSuccesses = 0;
228
+ consecutiveFailures++;
229
+ if (currentState === "half-open") {
230
+ openedAt = Date.now();
231
+ transition("open");
232
+ } else if (currentState === "closed" && consecutiveFailures >= failureThreshold) {
233
+ openedAt = Date.now();
234
+ transition("open");
235
+ }
236
+ };
237
+ const shouldAllow = () => {
238
+ switch (currentState) {
239
+ case "closed":
240
+ return true;
241
+ case "open": {
242
+ const elapsed = Date.now() - openedAt;
243
+ if (elapsed >= resetTimeoutMs) {
244
+ transition("half-open");
245
+ return true;
246
+ }
247
+ return false;
248
+ }
249
+ case "half-open":
250
+ return true;
251
+ }
252
+ };
253
+ const protect = (effect) => {
254
+ totalRequests++;
255
+ if (!shouldAllow()) {
256
+ totalRejected++;
257
+ return _chunkMVGUEJ5Zcjs.asyncFail.call(void 0, {
258
+ _tag: "CircuitBreakerOpen",
259
+ openSince: openedAt,
260
+ failures: consecutiveFailures
261
+ });
262
+ }
263
+ return _chunkMVGUEJ5Zcjs.asyncFold.call(void 0,
264
+ effect,
265
+ (error) => {
266
+ onFailure(error);
267
+ return _chunkMVGUEJ5Zcjs.asyncFail.call(void 0, error);
268
+ },
269
+ (value) => {
270
+ onSuccess();
271
+ return _chunkMVGUEJ5Zcjs.asyncSucceed.call(void 0, value);
272
+ }
273
+ );
274
+ };
275
+ const stats = () => ({
276
+ state: currentState,
277
+ failures: consecutiveFailures,
278
+ successes: consecutiveSuccesses,
279
+ totalRequests,
280
+ totalFailures,
281
+ totalSuccesses,
282
+ totalRejected,
283
+ lastFailureTime,
284
+ lastSuccessTime
285
+ });
286
+ const reset = () => {
287
+ consecutiveFailures = 0;
288
+ consecutiveSuccesses = 0;
289
+ transition("closed");
290
+ };
291
+ return {
292
+ state: () => currentState,
293
+ protect,
294
+ stats,
295
+ reset
296
+ };
297
+ }
298
+
299
+
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ exports.bracket = bracket; exports.ensuring = ensuring; exports.resource = resource; exports.makeResource = makeResource; exports.resourceSucceed = resourceSucceed; exports.resourceFromManaged = resourceFromManaged; exports.useResource = useResource; exports.resourceAll = resourceAll; exports.Resource = Resource; exports.managed = managed; exports.useManaged = useManaged; exports.managedAll = managedAll; exports.makeCircuitBreaker = makeCircuitBreaker;