brass-runtime 1.16.1 → 1.18.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 (123) hide show
  1. package/README.md +40 -8
  2. package/dist/agent/cli/main.cjs +31 -32
  3. package/dist/agent/cli/main.js +3 -4
  4. package/dist/agent/cli/main.mjs +3 -4
  5. package/dist/agent/index.cjs +4 -5
  6. package/dist/agent/index.d.ts +1 -1
  7. package/dist/agent/index.js +3 -4
  8. package/dist/agent/index.mjs +3 -4
  9. package/dist/{chunk-GYM3LLGS.mjs → chunk-2QNREG6K.mjs} +188 -5
  10. package/dist/{chunk-4ROBZFL6.cjs → chunk-2SLT3X6G.cjs} +6 -8
  11. package/dist/{chunk-KZJQ723N.cjs → chunk-3PFZGP23.cjs} +13 -15
  12. package/dist/{chunk-AVNQLJ5V.js → chunk-3PHU7FWS.js} +528 -23
  13. package/dist/{chunk-CIZFIMK5.js → chunk-4YQHPIWJ.js} +60 -11
  14. package/dist/chunk-5XADBMSU.cjs +33 -0
  15. package/dist/{chunk-DNFJLJMW.mjs → chunk-6MLAZPBL.mjs} +48 -24
  16. package/dist/chunk-7TKI527D.cjs +123 -0
  17. package/dist/{chunk-AGR5B2BC.cjs → chunk-7TXQJFZX.cjs} +564 -12
  18. package/dist/{chunk-RKGKFN2A.js → chunk-AADFFVYS.js} +1 -1
  19. package/dist/{chunk-52PPNNI4.cjs → chunk-AJMKZXRB.cjs} +2 -2
  20. package/dist/{chunk-3AYM6WPJ.js → chunk-BG5RNEA2.js} +20 -299
  21. package/dist/{chunk-2HQTDLHF.mjs → chunk-ELLF55ER.mjs} +555 -3
  22. package/dist/{chunk-EOC4UHBS.mjs → chunk-G5JTCFMI.mjs} +2 -2
  23. package/dist/chunk-H5GYX7RZ.js +6126 -0
  24. package/dist/{chunk-C3MDXTRZ.js → chunk-HCJ4S3YB.js} +48 -24
  25. package/dist/{chunk-6IXXWIUM.js → chunk-IBRHSH5H.js} +555 -3
  26. package/dist/{chunk-Q2I37RP3.cjs → chunk-IFRBVMWJ.cjs} +44 -323
  27. package/dist/{chunk-52OB2ROS.js → chunk-ITG6I7ZS.js} +2 -4
  28. package/dist/chunk-ITZQ526U.mjs +33 -0
  29. package/dist/{chunk-7JIJOVCT.js → chunk-JH4GI3DW.js} +2 -4
  30. package/dist/{chunk-76YMRMH2.cjs → chunk-KHACHFBQ.cjs} +583 -78
  31. package/dist/{chunk-MT3OWDPC.mjs → chunk-KRYP6CAE.mjs} +60 -11
  32. package/dist/chunk-KTGDLBLD.mjs +123 -0
  33. package/dist/{chunk-ENKODRU3.cjs → chunk-LXBU5E77.cjs} +143 -94
  34. package/dist/{chunk-PD4EJTQC.cjs → chunk-N6QNSTWD.cjs} +5 -5
  35. package/dist/{chunk-HLWLMW2F.mjs → chunk-OI4ESUMC.mjs} +9 -11
  36. package/dist/{chunk-EJ6BPYVR.mjs → chunk-OT2TESZU.mjs} +1 -1
  37. package/dist/{chunk-BABBZK4Y.js → chunk-PSEU65ND.js} +9 -11
  38. package/dist/{chunk-DNFO2EIZ.mjs → chunk-QCOLAHU3.mjs} +528 -23
  39. package/dist/{chunk-KH4SYAOS.mjs → chunk-QZ6QFJNM.mjs} +20 -299
  40. package/dist/{chunk-MBEJI5HF.mjs → chunk-R6WDSZA6.mjs} +2 -4
  41. package/dist/{chunk-FHQGHPMO.mjs → chunk-RREBJX2S.mjs} +2 -4
  42. package/dist/{chunk-5QC7LRZ3.js → chunk-S4HHFUYP.js} +2 -2
  43. package/dist/{chunk-GLE2WY7Z.cjs → chunk-SSQJKDN3.cjs} +194 -11
  44. package/dist/{chunk-CZIVE6NT.cjs → chunk-UUMKZJRJ.cjs} +48 -24
  45. package/dist/chunk-VIFA4DPN.cjs +6126 -0
  46. package/dist/chunk-W6WR37HN.js +33 -0
  47. package/dist/{chunk-FH2X7BVP.js → chunk-XSAHV5HQ.js} +188 -5
  48. package/dist/chunk-YM3EDNYD.js +123 -0
  49. package/dist/{chunk-VN44DYYT.cjs → chunk-YTX2JYYP.cjs} +18 -20
  50. package/dist/chunk-Z3PSSXP3.mjs +6126 -0
  51. package/dist/core/index.cjs +31 -9
  52. package/dist/core/index.d.ts +19 -152
  53. package/dist/core/index.js +80 -58
  54. package/dist/core/index.mjs +80 -58
  55. package/dist/defaultClient-DhpCQW9m.d.ts +1623 -0
  56. package/dist/{effect-DIUHZ9IN.d.ts → effect-CtUDl5M5.d.ts} +1 -1
  57. package/dist/http/index.cjs +202 -59
  58. package/dist/http/index.d.ts +55 -819
  59. package/dist/http/index.js +216 -73
  60. package/dist/http/index.mjs +216 -73
  61. package/dist/http/testing.cjs +31 -10
  62. package/dist/http/testing.d.ts +16 -5
  63. package/dist/http/testing.js +29 -8
  64. package/dist/http/testing.mjs +29 -8
  65. package/dist/index.cjs +110 -88
  66. package/dist/index.d.ts +9 -8
  67. package/dist/index.js +81 -59
  68. package/dist/index.mjs +81 -59
  69. package/dist/{schedule-CK3Ml_7p.d.ts → layer-BalPI6cN.d.ts} +176 -2
  70. package/dist/observability/index.cjs +22 -7
  71. package/dist/observability/index.d.ts +32 -8
  72. package/dist/observability/index.js +21 -6
  73. package/dist/observability/index.mjs +21 -6
  74. package/dist/perf/cli.cjs +26 -28
  75. package/dist/perf/cli.js +11 -13
  76. package/dist/perf/cli.mjs +11 -13
  77. package/dist/perf/index.cjs +13 -15
  78. package/dist/perf/index.js +11 -13
  79. package/dist/perf/index.mjs +11 -13
  80. package/dist/schema/index.cjs +2 -2
  81. package/dist/schema/index.js +1 -1
  82. package/dist/schema/index.mjs +1 -1
  83. package/dist/{server-GJPg8ZSG.d.ts → server-C1zVmqE6.d.ts} +16 -5
  84. package/dist/{stream-B4oK9JFP.d.ts → stream-Bb4FTejt.d.ts} +1 -1
  85. package/dist/{tracer-Hwt1cl7h.d.ts → tracer-DzfuE6um.d.ts} +2 -2
  86. package/dist/{tracing-DqbTKGcf.d.ts → tracing-BABA5arE.d.ts} +1 -1
  87. package/docs/README.md +4 -0
  88. package/docs/ai/PUBLIC_API.md +31 -7
  89. package/docs/articles/brass-runtime-http-observability.md +467 -0
  90. package/docs/framework-integrations.md +38 -0
  91. package/docs/frameworks/angular.md +204 -0
  92. package/docs/frameworks/express.md +183 -0
  93. package/docs/frameworks/fastify.md +173 -0
  94. package/docs/frameworks/nestjs.md +335 -0
  95. package/docs/frameworks/nextjs.md +202 -0
  96. package/docs/frameworks/react.md +183 -0
  97. package/docs/frameworks/vanilla.md +280 -0
  98. package/docs/guides/layers.md +130 -0
  99. package/docs/http-recipes.md +31 -1
  100. package/docs/http.md +50 -1
  101. package/docs/nestjs.md +6 -0
  102. package/docs/observability-framework-examples.md +12 -0
  103. package/docs/observability.md +239 -0
  104. package/docs/performance-profiler.md +6 -2
  105. package/docs/recipes/layers.md +46 -2
  106. package/docs/recipes/testing.md +25 -0
  107. package/package.json +4 -1
  108. package/dist/chunk-3LOYJFRR.cjs +0 -300
  109. package/dist/chunk-3Y2RIUMM.js +0 -300
  110. package/dist/chunk-5EC274J5.cjs +0 -2874
  111. package/dist/chunk-5VRJNBLZ.mjs +0 -2874
  112. package/dist/chunk-62AZW6UT.cjs +0 -313
  113. package/dist/chunk-74ZTY6CP.js +0 -2871
  114. package/dist/chunk-7CMJS3QE.mjs +0 -2871
  115. package/dist/chunk-A2OM6NEH.mjs +0 -194
  116. package/dist/chunk-B33ICAKP.js +0 -313
  117. package/dist/chunk-JF5WGYJJ.cjs +0 -194
  118. package/dist/chunk-KN32XNTH.mjs +0 -313
  119. package/dist/chunk-KQLYONSE.cjs +0 -2871
  120. package/dist/chunk-L2SYFEBS.js +0 -194
  121. package/dist/chunk-MIIYDLGM.js +0 -2874
  122. package/dist/chunk-PWC3RBQE.mjs +0 -300
  123. package/dist/client-CZHU674n.d.ts +0 -820
@@ -1,313 +0,0 @@
1
- import {
2
- Scope
3
- } from "./chunk-A2OM6NEH.mjs";
4
- import {
5
- unsafeGetCurrentRuntime
6
- } from "./chunk-GYM3LLGS.mjs";
7
- import {
8
- Cause,
9
- Exit,
10
- asyncEffect,
11
- asyncFail,
12
- asyncFold,
13
- asyncSucceed,
14
- unit
15
- } from "./chunk-36I3M4UC.mjs";
16
-
17
- // src/core/runtime/resource.ts
18
- function bracket(acquire, use, release) {
19
- return asyncEffect((env, cb) => {
20
- const runtime = unsafeGetCurrentRuntime();
21
- const scope = new 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(Exit.failCause(Cause.interrupt()));
42
- };
43
- });
44
- }
45
- function safeRelease(release, resource2, exit) {
46
- return asyncFold(
47
- (() => {
48
- try {
49
- return release(resource2, exit);
50
- } catch {
51
- return unit();
52
- }
53
- })(),
54
- () => unit(),
55
- () => unit()
56
- );
57
- }
58
- function ensuring(effect, finalizer) {
59
- return asyncEffect((env, cb) => {
60
- const runtime = unsafeGetCurrentRuntime();
61
- const fiber = runtime.fork(effect);
62
- fiber.join((exit) => {
63
- const fin = asyncFold(
64
- (() => {
65
- try {
66
- return finalizer(exit);
67
- } catch {
68
- return unit();
69
- }
70
- })(),
71
- () => unit(),
72
- () => unit()
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 = asyncEffect((env, cb) => {
134
- const runtime = unsafeGetCurrentRuntime();
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 asyncEffect((_env, cb) => {
160
- const runtime = unsafeGetCurrentRuntime();
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 = asyncFold(
174
- m.release(resources[i], exit),
175
- () => unit(),
176
- () => unit()
177
- );
178
- runtime.fork(releaseEff).join(() => resolve());
179
- });
180
- } catch {
181
- }
182
- }
183
- }
184
-
185
- // src/core/runtime/circuitBreaker.ts
186
- function makeCircuitBreaker(config = {}) {
187
- const failureThreshold = config.failureThreshold ?? 5;
188
- const resetTimeoutMs = config.resetTimeoutMs ?? 3e4;
189
- const successThreshold = config.successThreshold ?? 1;
190
- const isFailure = 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
- onStateChange?.(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 asyncFail({
258
- _tag: "CircuitBreakerOpen",
259
- openSince: openedAt,
260
- failures: consecutiveFailures
261
- });
262
- }
263
- return asyncFold(
264
- effect,
265
- (error) => {
266
- onFailure(error);
267
- return asyncFail(error);
268
- },
269
- (value) => {
270
- onSuccess();
271
- return asyncSucceed(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
- export {
300
- bracket,
301
- ensuring,
302
- resource,
303
- makeResource,
304
- resourceSucceed,
305
- resourceFromManaged,
306
- useResource,
307
- resourceAll,
308
- Resource,
309
- managed,
310
- useManaged,
311
- managedAll,
312
- makeCircuitBreaker
313
- };