brass-runtime 1.16.0 → 1.16.1
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.
- package/CHANGELOG.md +17 -0
- package/README.md +283 -18
- package/dist/agent/cli/main.cjs +38 -38
- package/dist/agent/cli/main.js +6 -6
- package/dist/agent/cli/main.mjs +6 -6
- package/dist/agent/index.cjs +7 -7
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +6 -6
- package/dist/agent/index.mjs +6 -6
- package/dist/chunk-2HQTDLHF.mjs +683 -0
- package/dist/chunk-36I3M4UC.mjs +370 -0
- package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
- package/dist/chunk-3LOYJFRR.cjs +300 -0
- package/dist/chunk-3Y2RIUMM.js +300 -0
- package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
- package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
- package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
- package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
- package/dist/chunk-5QC7LRZ3.js +229 -0
- package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
- package/dist/chunk-62AZW6UT.cjs +313 -0
- package/dist/chunk-6IXXWIUM.js +683 -0
- package/dist/chunk-74ZTY6CP.js +2871 -0
- package/dist/chunk-76YMRMH2.cjs +777 -0
- package/dist/chunk-7CMJS3QE.mjs +2871 -0
- package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
- package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
- package/dist/chunk-AGR5B2BC.cjs +683 -0
- package/dist/chunk-AVNQLJ5V.js +777 -0
- package/dist/chunk-B33ICAKP.js +313 -0
- package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
- package/dist/chunk-BABBZK4Y.js +2024 -0
- package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
- package/dist/{chunk-F5EUMJL7.mjs → chunk-CIZFIMK5.js} +55 -5
- package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
- package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
- package/dist/chunk-DNFO2EIZ.mjs +777 -0
- package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
- package/dist/{chunk-JNFRRJYH.cjs → chunk-ENKODRU3.cjs} +242 -192
- package/dist/chunk-EOC4UHBS.mjs +229 -0
- package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
- package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
- package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
- package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
- package/dist/chunk-HLWLMW2F.mjs +2024 -0
- package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
- package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
- package/dist/chunk-KN32XNTH.mjs +313 -0
- package/dist/chunk-KQLYONSE.cjs +2871 -0
- package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
- package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
- package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
- package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
- package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
- package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
- package/dist/{chunk-7XOPAB5Q.js → chunk-MT3OWDPC.mjs} +55 -5
- package/dist/chunk-MVGUEJ5Z.cjs +370 -0
- package/dist/chunk-PD4EJTQC.cjs +229 -0
- package/dist/chunk-PWC3RBQE.mjs +300 -0
- package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
- package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
- package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
- package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
- package/dist/chunk-UB4B6OFY.js +370 -0
- package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
- package/dist/chunk-VN44DYYT.cjs +2024 -0
- package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
- package/dist/core/index.cjs +135 -9
- package/dist/core/index.d.ts +238 -33
- package/dist/core/index.js +155 -29
- package/dist/core/index.mjs +155 -29
- package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
- package/dist/effectRunner-CFLC32IK.cjs +8 -0
- package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
- package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
- package/dist/http/index.cjs +324 -2986
- package/dist/http/index.d.ts +54 -68
- package/dist/http/index.js +238 -2900
- package/dist/http/index.mjs +238 -2900
- package/dist/http/testing.cjs +14 -12
- package/dist/http/testing.d.ts +5 -4
- package/dist/http/testing.js +10 -8
- package/dist/http/testing.mjs +10 -8
- package/dist/index.cjs +423 -255
- package/dist/index.d.ts +87 -69
- package/dist/index.js +301 -133
- package/dist/index.mjs +301 -133
- package/dist/observability/index.cjs +16 -531
- package/dist/observability/index.d.ts +81 -8
- package/dist/observability/index.js +23 -538
- package/dist/observability/index.mjs +23 -538
- package/dist/perf/cli.cjs +401 -0
- package/dist/perf/cli.d.ts +1 -0
- package/dist/perf/cli.js +401 -0
- package/dist/perf/cli.mjs +401 -0
- package/dist/perf/index.cjs +141 -0
- package/dist/perf/index.d.ts +483 -0
- package/dist/perf/index.js +141 -0
- package/dist/perf/index.mjs +141 -0
- package/dist/schedule-CK3Ml_7p.d.ts +259 -0
- package/dist/schema/index.cjs +6 -2
- package/dist/schema/index.d.ts +3 -1
- package/dist/schema/index.js +5 -1
- package/dist/schema/index.mjs +5 -1
- package/dist/{server-C8hDXA74.d.ts → server-GJPg8ZSG.d.ts} +4 -3
- package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
- package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
- package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
- package/docs/ARCHITECTURE.md +292 -0
- package/docs/README.md +63 -0
- package/docs/adr/0001-ai-context-pack.md +32 -0
- package/docs/agent-apply-mode.md +104 -0
- package/docs/agent-approvals.md +110 -0
- package/docs/agent-batch.md +185 -0
- package/docs/agent-boundaries.md +112 -0
- package/docs/agent-chat-sessions.md +160 -0
- package/docs/agent-ci.md +17 -0
- package/docs/agent-cli.md +405 -0
- package/docs/agent-config.md +480 -0
- package/docs/agent-context-discovery.md +159 -0
- package/docs/agent-copilot-like-dx.md +126 -0
- package/docs/agent-declarative-optimized-planning.md +138 -0
- package/docs/agent-dx.md +224 -0
- package/docs/agent-env-files.md +126 -0
- package/docs/agent-follow-up-context.md +43 -0
- package/docs/agent-global-usage.md +180 -0
- package/docs/agent-init.md +109 -0
- package/docs/agent-install-and-configure.md +516 -0
- package/docs/agent-language-workspace-ux.md +99 -0
- package/docs/agent-llm-adapters.md +123 -0
- package/docs/agent-local-install.md +190 -0
- package/docs/agent-local-tests.md +51 -0
- package/docs/agent-observability.md +155 -0
- package/docs/agent-patch-quality-loop.md +162 -0
- package/docs/agent-presets.md +22 -0
- package/docs/agent-project-commands.md +237 -0
- package/docs/agent-project-intelligence.md +156 -0
- package/docs/agent-redaction.md +18 -0
- package/docs/agent-release-readiness.md +76 -0
- package/docs/agent-rollback-safety.md +162 -0
- package/docs/agent-rollback.md +23 -0
- package/docs/agent-run-artifacts.md +16 -0
- package/docs/agent-vscode-auto-discovery.md +137 -0
- package/docs/agent-vscode-batch-runner.md +100 -0
- package/docs/agent-vscode-chat-layout.md +90 -0
- package/docs/agent-vscode-clean-install.md +147 -0
- package/docs/agent-vscode-code-actions.md +70 -0
- package/docs/agent-vscode-diff-preview.md +45 -0
- package/docs/agent-vscode-inline-assist.md +56 -0
- package/docs/agent-vscode-install.md +186 -0
- package/docs/agent-vscode-model-setup.md +97 -0
- package/docs/agent-vscode-patch-preview.md +92 -0
- package/docs/agent-vscode-problems.md +79 -0
- package/docs/agent-vscode-project-dashboard.md +106 -0
- package/docs/agent-vscode-run-history.md +92 -0
- package/docs/agent-vscode-ux.md +73 -0
- package/docs/ai/INVARIANTS.md +84 -0
- package/docs/ai/PROJECT_MAP.md +338 -0
- package/docs/ai/PUBLIC_API.md +336 -0
- package/docs/ai/VALIDATION_MATRIX.md +67 -0
- package/docs/api-polish.md +37 -0
- package/docs/cancellation.md +162 -0
- package/docs/coverage.md +46 -0
- package/docs/getting-started.md +159 -0
- package/docs/guides/README.md +40 -0
- package/docs/guides/circuit-breaker.md +89 -0
- package/docs/guides/error-handling.md +91 -0
- package/docs/guides/getting-started.md +107 -0
- package/docs/guides/layers.md +189 -0
- package/docs/guides/metrics.md +101 -0
- package/docs/guides/resource-management.md +141 -0
- package/docs/guides/retry.md +215 -0
- package/docs/guides/semaphore.md +66 -0
- package/docs/guides/streams.md +117 -0
- package/docs/guides/supervisors.md +98 -0
- package/docs/guides/testing.md +162 -0
- package/docs/guides/tracing.md +71 -0
- package/docs/http-recipes.md +399 -0
- package/docs/http.md +749 -0
- package/docs/modules.md +285 -0
- package/docs/observability-collector-smoke.md +31 -0
- package/docs/observability-framework-examples.md +98 -0
- package/docs/observability.md +542 -0
- package/docs/otel-collector-smoke.yaml +27 -0
- package/docs/performance-profiler.md +199 -0
- package/docs/production-readiness.md +73 -0
- package/docs/recipes/README.md +12 -0
- package/docs/recipes/http-server.md +45 -0
- package/docs/recipes/layers.md +44 -0
- package/docs/recipes/performance.md +47 -0
- package/docs/recipes/runtime.md +41 -0
- package/docs/recipes/testing.md +41 -0
- package/docs/release.md +53 -0
- package/docs/wasm-bounded-queues.md +44 -0
- package/docs/wasm-engine-observability-benchmarks.md +85 -0
- package/docs/wasm-fiber-engine.md +117 -0
- package/docs/wasm-scheduler-state-machine.md +122 -0
- package/docs/wasm-stream-chunks.md +54 -0
- package/package.json +22 -2
- package/dist/chunk-45F7OKGT.cjs +0 -104
- package/dist/chunk-7V4KY4RL.mjs +0 -104
- package/dist/chunk-DJQ7OMMB.cjs +0 -144
- package/dist/chunk-GOV47PPB.mjs +0 -552
- package/dist/chunk-JF4XXPZ5.cjs +0 -552
- package/dist/chunk-KCPT2D6G.js +0 -552
- package/dist/chunk-NOYZIMUJ.mjs +0 -144
- package/dist/chunk-PNVFW245.js +0 -144
- package/dist/chunk-ROJC3NBJ.js +0 -104
- package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
- package/dist/schedule-Fque9Abz.d.ts +0 -70
package/docs/modules.md
ADDED
|
@@ -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.
|
|
@@ -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,98 @@
|
|
|
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
|
+
## Express
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install --save-dev express
|
|
14
|
+
npm run example:observability:express
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Try it:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
|
|
21
|
+
http://localhost:3000/users/42
|
|
22
|
+
|
|
23
|
+
curl http://localhost:3000/metrics
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Source: `src/examples/observabilityExpress.ts`.
|
|
27
|
+
|
|
28
|
+
## Fastify
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install --save-dev fastify
|
|
32
|
+
npm run example:observability:fastify
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Try it:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
|
|
39
|
+
http://localhost:3001/users/42
|
|
40
|
+
|
|
41
|
+
curl http://localhost:3001/metrics
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Source: `src/examples/observabilityFastify.ts`.
|
|
45
|
+
|
|
46
|
+
## Nest
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm install --save-dev @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata rxjs
|
|
50
|
+
npm run example:observability:nest
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Try it:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
|
|
57
|
+
http://localhost:3002/users/42
|
|
58
|
+
|
|
59
|
+
curl http://localhost:3002/metrics
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Source: `src/examples/observabilityNest.ts`.
|
|
63
|
+
|
|
64
|
+
## What the examples demonstrate
|
|
65
|
+
|
|
66
|
+
- `makeObservabilityFromEnv(process.env)` for deployment-style setup.
|
|
67
|
+
- Framework-specific request adapters:
|
|
68
|
+
- `makeExpressRequestObservabilityContext`
|
|
69
|
+
- `makeFastifyRequestObservabilityContext`
|
|
70
|
+
- W3C `traceparent` extraction from inbound headers.
|
|
71
|
+
- `ctx.withRequestSpan(...)` around request work.
|
|
72
|
+
- `logEffect(...)` with redaction of sensitive fields like `authorization`.
|
|
73
|
+
- `/metrics` endpoint using the Prometheus exporter.
|
|
74
|
+
- OTLP export through a fake local `fetch` that prints payload sizes.
|
|
75
|
+
|
|
76
|
+
## Benchmark
|
|
77
|
+
|
|
78
|
+
Run only the observability overhead benchmark:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
npm run benchmark:observability
|
|
82
|
+
npm run benchmark:observability:budget
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Or include it in the full benchmark suite:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm run benchmark
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The benchmark source is `src/benchmarks/observability-overhead.bench.ts` and
|
|
92
|
+
measures:
|
|
93
|
+
|
|
94
|
+
- baseline `asyncSucceed`
|
|
95
|
+
- `withSpan` start/end overhead
|
|
96
|
+
- `logEffect` structured sink overhead
|
|
97
|
+
- composed span + event + log overhead
|
|
98
|
+
- OTLP trace flush for 25 spans
|