conductor crate
Status
Implemented (Tasks 1-3) — 2026-03-30
Purpose
Top-level builder API for railscale. Users call Conductor::tcp() or Conductor::sock() to construct a proxy pipeline without touching lower-level carriages/train_track types.
API
Conductor::tcp("0.0.0.0:8080")
.route_tcp("127.0.0.1:3000")
.replace_header(b"Host", b"localhost")
.run().awaitConductor::tcp(addr)→TcpBuilderConductor::sock(path)→SockBuilder- Both builders share
builder_methods!macro:route_tcp,route_sock,replace_header,record(metrics-full only) TcpBuilderadditionally hasroute_dynamic()— routes based on HTTP routing keySockBuilder::run()panics if no route configured (no dynamic routing for unix sockets)
Internals
Configstruct holds headers + route + optional record_pathConfig::matchers()converts headers toVec<(Finder<'static>, Bytes)>Routeenum:Tcp(String)|Sock(String)|Dynamic- Each
run()constructs atrain_track::Pipelinewith appropriate source/router
Features
| Feature | Effect |
|---|---|
metrics-minimal (default) | Enables OTel metrics in carriages/train_track |
metrics-full | Adds recorder support (record() builder method, RecorderHandle) |
metrics-erased | Erased metrics variant |
Files
conductor/Cargo.toml— deps: carriages, train_track (path), bytes/memchr/tracing/tokio (workspace)conductor/src/lib.rs— entire implementationconductor/src/router.rs— deleted (was empty leftover)
Gotchas
Finder::new()requires&[u8], notVec<u8>— use&namenotname.clone()- cargo can cache stale carriages lib.rs: if
SockSource/TcpOverSockRouterappear missing despite being in source,touch carriages/src/lib.rsto invalidate SockSourceandTcpOverSockRouterwere added tocarriages/src/lib.rsin the same working-tree batch — they exist in working tree but not in the committed version (as of 2026-03-30)