All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.2.0 - 2026-05-30
First public release on crates.io and GitHub.
- Range-aware backend selection: prefer upstreams whose trace range covers the requested block, falling back to least-connections.
- Automatic failover and reconnection with inline de-duplication of replayed blocks, so persistent client connections survive upstream outages.
- Structured logging via
tracing, controllable with theRUST_LOGenvironment variable (defaults toinfo). - Graceful shutdown on
SIGINTandSIGTERM, with a bounded drain period (shutdown_grace_ms) and WebSocket close frames sent to connected clients. - Configuration validation with clear, actionable errors (
config testand at startup), including detection of zero intervals and duplicate endpoints. - Connection backpressure (
max_connections), client handshake timeout (handshake_timeout_ms), optional idle timeout (idle_timeout_ms), and a configurable maximum WebSocket message size (max_message_bytes). - Optional HTTP health/metrics endpoint (
metrics_port) exposing/health,/ready, and Prometheus/metrics. - Staleness detection: upstreams that stop advancing their chain state are flagged and deprioritized for routing.
- Capped exponential backoff for upstream monitoring reconnects.
cargo-denysupply-chain configuration and CI (advisories, bans, licenses, sources), an MSRV check, dependency caching, and a tag-triggered release workflow (crates.io publish, cross-platform binaries, GHCR image).- Community health files:
CONTRIBUTING.md,SECURITY.md,CODE_OF_CONDUCT.md, issue templates, and a pull-request template.
- Build on the pure-Rust
rs_abieosbackend (rust-backend): fleet-router now compiles on Linux, macOS, and Windows (x86_64 and arm64) with no C/C++ toolchain,clang, orlibclang. - The CLI
--versionnow derives fromCargo.toml(CARGO_PKG_VERSION). - The connection counter is now an atomic, decremented synchronously and underflow-safely when a connection ends.
- Block-number arithmetic uses saturating operations to avoid overflow on adversarial upstream data.
- During failover, only duplicate block frames are dropped; status results and head keep-alives are always forwarded so clients never stall.
- Client frames that cannot be forwarded during a failover window are buffered and replayed after reconnect instead of being silently dropped.
- The published crate now ships only the files needed to build and run the
binary (
includeinCargo.toml);Cargo.lockis committed for reproducible builds. - Canonical default listen port reconciled to
17000across the sample config, Docker assets, and documentation. - The runtime Docker image runs as a non-root user and declares a
HEALTHCHECK.
config initno longer panics when the target path is not writable; it reports a clear error instead.- Upstream handshake now skips leading control frames and retries against another upstream instead of dropping the client on an unexpected first frame.