feat(build): feature-sided builds — server/client sides independently selectable (ADR-039 Amendment 1)
Split the feature graph so consumers pulling only the import adapters (from_openapi / from_jsonschema / from_mcp) no longer compile the axum / hyper server stack, and server-only deployments no longer compile reqwest. One crate, one import path — sides cut by features, not by a crate split. Feature graph: - server (default): axum host, gateway, WS upgrade, to_openapi, to_mcp - client (default): client host, forward, from_jsonschema, from_openapi - openapi: shared OpenAPISpec model (implied by both sides) - mcp: from_mcp needs client, to_mcp needs server - wss: tungstenite transport (from_wss); tungstenite half of the shared WS↔byte-stream adapter - h2/http1: hyper protocol features; imply server Wire-contract neutral: gateway endpoints, ALPNs, and all public API shapes unchanged; defaults keep both sides on. Supporting changes: - forward.rs drops its axum::body::Bytes type leak (bytes crate types) - bounded_join + error-echo caps move to input_validation (usable by both sides; openapi_spec no longer imports from forward) - byte_adapter: axum flavor compiles under server, tungstenite under wss; the generic pumps stay shared (WS-11) - input_validation / openapi_spec import-only internals gated to the side that consumes them - http-body-util moves to dev-dependencies (was test-only) - integration-test required-features updated for the new sides - from_wss unit tests (axum producer harness) gated to server Verified: cargo test (defaults, 453) and --all-features (575) pass; lean side builds (client / server / client,mcp / client,wss / server,wss / openapi-only) build clean with zero warnings; clippy -D warnings clean across all feature combinations; fmt clean.
This commit is contained in:
@@ -138,6 +138,30 @@ concerns that make splitting them counterproductive:
|
||||
argument is weaker — but the current design (ADR-036, ADR-023)
|
||||
has them sharing the mapping.
|
||||
|
||||
## Amendment 1: feature-sided builds (`server` / `client`)
|
||||
|
||||
The colocation decision stands — one crate, one import path — but the
|
||||
"the compile cost is paid once per workspace" mitigation proved
|
||||
insufficient: a consumer that only imports (consumer side) was forced
|
||||
to compile the axum/hyper server stack, and vice versa. The feature
|
||||
graph now sides the crate without splitting it:
|
||||
|
||||
- `server` (default) — the axum `Router` host, the gateway routes,
|
||||
the WS upgrade path, `to_openapi`, `to_mcp` (with `mcp`).
|
||||
- `client` (default) — the outbound client host, the `from_*` import
|
||||
adapters (`from_wss` additionally needs `wss`).
|
||||
- `openapi` — the shared `OpenAPISpec` document model (implied by
|
||||
both sides; `from_openapi` needs it, `to_openapi` needs it).
|
||||
- `mcp` — `from_mcp` requires `client`, `to_mcp` requires `server`.
|
||||
- `wss` — the tungstenite WS transport (`from_wss`; the tungstenite
|
||||
flavor of the shared WS↔byte-stream adapter).
|
||||
- `h2` / `http1` — hyper protocol features; imply `server`.
|
||||
|
||||
Default features keep both sides on (zero behavior change); lean
|
||||
builds use `default-features = false` + the side they need. The
|
||||
wire contract (gateway endpoints, ALPNs) is untouched — this is a
|
||||
dependency-graph change, not a surface change.
|
||||
|
||||
## References
|
||||
|
||||
- [ADR-003](003-crate-decomposition.md) — crate decomposition (this
|
||||
|
||||
Reference in New Issue
Block a user