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,285 @@
1
+ # 📦 Modules — brass-runtime
2
+
3
+ This document describes the current and planned modules in **brass-runtime**, how they relate to each other, and how users are expected to navigate them.
4
+
5
+ The structure intentionally mirrors the mental model of **ZIO**:
6
+ - a small, principled **core**
7
+ - optional, layered **modules**
8
+ - everything expressed in terms of typed effects and structured concurrency
9
+
10
+ ---
11
+
12
+ ## Core modules (foundation)
13
+
14
+ These modules form the **runtime kernel**. Everything else builds on top of them.
15
+
16
+ ### `runtime`
17
+ **Status:** ✅ stable
18
+
19
+ Responsible for executing effects.
20
+
21
+ Contents:
22
+ - `Scheduler` — cooperative, deterministic task scheduler
23
+ - task queue, microtask flushing
24
+ - fairness and explicit async boundaries
25
+
26
+ You almost never interact with this directly as a user.
27
+
28
+ ---
29
+
30
+ ### `asyncEffect` / `types`
31
+ **Status:** ✅ stable
32
+
33
+ The heart of the system.
34
+
35
+ Key types:
36
+ - `Effect<R, E, A>`
37
+ - `Async<R, E, A>`
38
+ - `Exit<E, A>`
39
+
40
+ Capabilities:
41
+ - sync + async algebra (no Promises in semantics)
42
+ - `map`, `flatMap`, `fold`, etc.
43
+ - explicit async registration via callbacks
44
+
45
+ This is the **semantic core** of brass.
46
+
47
+ ---
48
+
49
+ ### `fiber`
50
+ **Status:** ✅ stable
51
+
52
+ Lightweight fibers with structured lifecycle.
53
+
54
+ Features:
55
+ - `Fiber<E, A>` abstraction
56
+ - cooperative interruption
57
+ - `join`, `interrupt`
58
+ - LIFO finalizers
59
+
60
+ Fibers are always run under a `Scope`.
61
+
62
+ ---
63
+
64
+ ### `scope`
65
+ **Status:** ✅ stable
66
+
67
+ Structured concurrency and resource safety.
68
+
69
+ Features:
70
+ - parent / child scopes
71
+ - deterministic cleanup
72
+ - `addFinalizer`, `close`
73
+ - used by fibers, streams, HTTP, resources
74
+
75
+ Scopes ensure:
76
+ > no leaks, no zombies, no forgotten cleanup
77
+
78
+ ---
79
+
80
+ ### `resource`
81
+ **Status:** ✅ stable
82
+
83
+ Resource-safe acquisition.
84
+
85
+ API:
86
+ - `acquireRelease`
87
+ - `fromResource`
88
+
89
+ Ties resource lifetimes to scopes.
90
+
91
+ ---
92
+
93
+ ## Concurrency combinators
94
+
95
+ ### `concurrency`
96
+ **Status:** ✅ stable
97
+
98
+ High-level structured concurrency.
99
+
100
+ Includes:
101
+ - `race`
102
+ - `zipPar`
103
+ - `collectAllPar`
104
+ - `fork`
105
+
106
+ Semantics:
107
+ - loser fibers are interrupted
108
+ - errors propagate deterministically
109
+ - scopes are respected
110
+
111
+ ---
112
+
113
+ ## Stream modules (ZStream-like)
114
+
115
+ ### `stream`
116
+ **Status:** 🚧 active
117
+
118
+ Pull-based, resource-safe streams.
119
+
120
+ Key ideas:
121
+ - `Pull<R, E, A>`
122
+ - `ZStream<R, E, A>`
123
+ - explicit backpressure
124
+ - scope-aware
125
+
126
+ Includes:
127
+ - constructors (`fromArray`, `fromPull`, `empty`)
128
+ - transformations (`map`, `filter`)
129
+ - execution (`runCollect`, `collectStream`)
130
+
131
+ ---
132
+
133
+ ### `buffer`
134
+ **Status:** 🚧 active
135
+
136
+ Stream buffering with backpressure.
137
+
138
+ Features:
139
+ - bounded buffers
140
+ - backpressure vs dropping modes
141
+ - deterministic cleanup
142
+
143
+ This is the foundation for:
144
+ - pipelines
145
+ - async boundaries in streams
146
+ - future hubs
147
+
148
+ ---
149
+
150
+ ### Planned stream modules
151
+ **Status:** ⏳ planned
152
+
153
+ - `pipeline` — ZPipeline-style transformations
154
+ - `sink` — consumers / reducers
155
+ - `hub` — broadcast / pub-sub streams
156
+ - `channel` — low-level streaming algebra
157
+
158
+ ---
159
+
160
+ ## HTTP module
161
+
162
+ ### `http`
163
+ **Status:** ✅ usable / evolving
164
+
165
+ ZIO-HTTP–inspired client built on brass runtime.
166
+
167
+ Layers:
168
+ - **wire layer**: `HttpClient = Request => Async<_, HttpError, HttpWireResponse>`
169
+ - **middleware**: request/response transforms
170
+ - **DX layer**: ergonomic helpers (`getJson`, `postJson`, etc.)
171
+
172
+ Key concepts:
173
+ - fully lazy
174
+ - cancelable via fibers
175
+ - no Promises in core semantics
176
+ - middleware-style composition (`withMeta`, logging, retries, auth)
177
+
178
+ Submodules:
179
+ - `client.ts` — low-level HTTP execution
180
+ - `httpClient.ts` — DX + helpers
181
+ - `withMeta` — response enrichment middleware
182
+
183
+ Example usage:
184
+ ```ts
185
+ const http = httpClientBuilder({ baseUrl }).withMeta();
186
+
187
+ const post = await toPromise(http.getJson<Post>("/posts/1"), {});
188
+ ```
189
+
190
+ ---
191
+
192
+ ## Interop modules
193
+
194
+ ### `promise`
195
+ **Status:** ✅ stable
196
+
197
+ Interop with Promise-based APIs.
198
+
199
+ Includes:
200
+ - `toPromise` — await effects externally
201
+ - `fromPromiseAbortable`
202
+ - `tryPromiseAbortable`
203
+
204
+ Important:
205
+ > Promises are **interop only**, never a runtime primitive.
206
+
207
+ ---
208
+
209
+ ## Examples module
210
+
211
+ ### `examples`
212
+ **Status:** ✅ maintained
213
+
214
+ Executable documentation.
215
+
216
+ Covers:
217
+ - fibers & interruption
218
+ - scopes & finalizers
219
+ - abortable promises
220
+ - streams + buffering
221
+ - HTTP usage
222
+
223
+ If you’re new:
224
+ 👉 start here.
225
+
226
+ ---
227
+
228
+ ## How to navigate the project
229
+
230
+ ### If you want to…
231
+
232
+ **Understand the runtime**
233
+ - `asyncEffect`
234
+ - `scheduler`
235
+ - `fiber`
236
+ - `scope`
237
+
238
+ **Use effects**
239
+ - `map`, `flatMap`, `fold`
240
+ - `toPromise` (interop only)
241
+
242
+ **Do concurrency**
243
+ - `race`
244
+ - `zipPar`
245
+ - `fork`
246
+
247
+ **Work with streams**
248
+ - `stream`
249
+ - `buffer`
250
+
251
+ **Call HTTP**
252
+ - `http/client`
253
+ - `http/httpClient`
254
+ - middleware like `withMeta`
255
+
256
+ ---
257
+
258
+ ## Design philosophy
259
+
260
+ - Explicit > implicit
261
+ - Structured > ad-hoc
262
+ - Lazy by default
263
+ - Cancellation is cooperative and visible
264
+ - No hidden async semantics
265
+
266
+ brass is not trying to be “easy first” — it’s trying to be **correct first**.
267
+
268
+ ---
269
+
270
+ ## Future directions
271
+
272
+ - Public API stabilization
273
+ - Docs site (mdbook / Docusaurus)
274
+ - ZIO-style module layering (`Layer`-like)
275
+ - Metrics & tracing middleware
276
+ - Typed errors across HTTP + streams
277
+
278
+ ---
279
+
280
+ If you want:
281
+ - a **diagram** of module dependencies
282
+ - a **shorter npm-facing version**
283
+ - or a **ZIO comparison table**
284
+
285
+ say the word.
package/docs/nestjs.md ADDED
@@ -0,0 +1,6 @@
1
+ # NestJS integration
2
+
3
+ The NestJS recipe now lives at [`docs/frameworks/nestjs.md`](./frameworks/nestjs.md).
4
+
5
+ This file is kept as a compatibility pointer for older links.
6
+
@@ -0,0 +1,31 @@
1
+ # Observability collector smoke
2
+
3
+ This smoke test sends one metric payload, one trace payload, and one log payload
4
+ to a real OpenTelemetry Collector over OTLP/HTTP.
5
+
6
+ Start the collector:
7
+
8
+ ```bash
9
+ docker compose -f docker-compose.observability.yml up
10
+ ```
11
+
12
+ In another shell:
13
+
14
+ ```bash
15
+ npm run build:ts
16
+ npm run smoke:observability:collector
17
+ ```
18
+
19
+ The collector config is `docs/otel-collector-smoke.yaml` and uses the debug
20
+ exporter, so accepted telemetry is printed in the collector logs.
21
+
22
+ Useful environment variables:
23
+
24
+ ```bash
25
+ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
26
+ OTEL_SERVICE_NAME=brass-observability-smoke
27
+ BRASS_OBSERVABILITY_EXPORT_TIMEOUT_MS=5000
28
+ ```
29
+
30
+ The smoke intentionally uses the public built package from `dist` so it checks
31
+ the same CJS/ESM package surface that users consume after a build.
@@ -0,0 +1,110 @@
1
+ # Observability framework examples
2
+
3
+ These examples show how to seed Brass runtime traces from inbound HTTP headers,
4
+ create a request span, emit structured logs, expose Prometheus metrics, and
5
+ flush OTLP metrics/traces.
6
+
7
+ They use optional framework dependencies so the runtime package does not force
8
+ Express, Fastify, or Nest into normal installs.
9
+
10
+ For production-style integration recipes across React, Next.js, Angular,
11
+ Express, Fastify, and Nest, see
12
+ [`docs/framework-integrations.md`](./framework-integrations.md).
13
+
14
+ ## Express
15
+
16
+ ```bash
17
+ npm install --save-dev express
18
+ npm run example:observability:express
19
+ ```
20
+
21
+ Try it:
22
+
23
+ ```bash
24
+ curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
25
+ http://localhost:3000/users/42
26
+
27
+ curl http://localhost:3000/metrics
28
+ ```
29
+
30
+ Source: `src/examples/observabilityExpress.ts`.
31
+
32
+ ## Fastify
33
+
34
+ ```bash
35
+ npm install --save-dev fastify
36
+ npm run example:observability:fastify
37
+ ```
38
+
39
+ Try it:
40
+
41
+ ```bash
42
+ curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
43
+ http://localhost:3001/users/42
44
+
45
+ curl http://localhost:3001/metrics
46
+ ```
47
+
48
+ Source: `src/examples/observabilityFastify.ts`.
49
+
50
+ ## Nest
51
+
52
+ ```bash
53
+ npm install --save-dev @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata rxjs
54
+ npm run example:observability:nest
55
+ ```
56
+
57
+ Try it:
58
+
59
+ ```bash
60
+ curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
61
+ http://localhost:3002/users/42
62
+
63
+ curl http://localhost:3002/metrics
64
+ ```
65
+
66
+ Source: `src/examples/observabilityNest.ts`.
67
+
68
+ For a production-style Nest module with DI tokens, Grafana/OTLP configuration,
69
+ an observed Brass HTTP client, and shutdown wiring, see
70
+ [`docs/frameworks/nestjs.md`](./frameworks/nestjs.md).
71
+
72
+ ## What the examples demonstrate
73
+
74
+ - `makeObservabilityFromEnv(process.env)` for deployment-style setup.
75
+ - `makeOtlpOptions(...)` for collector endpoint configuration without adding
76
+ vendor-specific code to Brass.
77
+ - `withHttpObservability(...)` around the Brass HTTP client for outbound
78
+ metrics, spans, logs, policy context, and trace propagation.
79
+ - Framework-specific request adapters:
80
+ - `makeExpressRequestObservabilityContext`
81
+ - `makeFastifyRequestObservabilityContext`
82
+ - W3C `traceparent` extraction from inbound headers.
83
+ - `ctx.withRequestSpan(...)` around request work.
84
+ - `logEffect(...)` with redaction of sensitive fields like `authorization`.
85
+ - `/metrics` endpoint using the Prometheus exporter.
86
+ - OTLP export through a fake local `fetch` that prints payload sizes.
87
+
88
+ ## Benchmark
89
+
90
+ Run only the observability overhead benchmark:
91
+
92
+ ```bash
93
+ npm run benchmark:observability
94
+ npm run benchmark:observability:budget
95
+ ```
96
+
97
+ Or include it in the full benchmark suite:
98
+
99
+ ```bash
100
+ npm run benchmark
101
+ ```
102
+
103
+ The benchmark source is `src/benchmarks/observability-overhead.bench.ts` and
104
+ measures:
105
+
106
+ - baseline `asyncSucceed`
107
+ - `withSpan` start/end overhead
108
+ - `logEffect` structured sink overhead
109
+ - composed span + event + log overhead
110
+ - OTLP trace flush for 25 spans