[workspace] members = ["connectrpc", "connectrpc-codegen", "connectrpc-build", "connectrpc-health", "connectrpc-reflection", "conformance", "examples/eliza", "examples/middleware", "examples/mtls-identity", "examples/multiservice", "examples/streaming-tour", "examples/wasm-client", "tests/streaming", "benches/rpc", "benches/rpc-tonic"] # benches/rpc-grpc-rust needs the grpc-rust codegen toolchain (protoc 35.1 + # a cmake-built C++ plugin); it is built on demand by the bench drivers, not CI. exclude = ["benches/rpc-grpc-rust"] resolver = "2" [workspace.package] edition = "2024" rust-version = "1.88" license = "Apache-2.0" repository = "https://github.com/connectrpc/connect-rust" keywords = ["connectrpc", "grpc", "rpc", "protobuf", "tower"] categories = ["network-programming", "web-programming::http-server", "web-programming::http-client"] [workspace.dependencies] # Core HTTP types http = "1" http-body = "1" http-body-util = "0.1" bytes = { version = "1.6.1", features = ["serde"] } # Tower service abstraction tower = { version = "0.5", features = ["util"] } tower-http = { version = "0.6", features = ["catch-panic"] } # Async runtime tokio = "1" tokio-stream = "0.1" tokio-util = "0.7" futures = "0.3" pin-project = "1" sync_wrapper = "1" async-trait = "0.1" # Protobuf. The 0.9.x floor is hard rather than a preference, for two reasons. # 0.9.0 widens `types::put_len_delimited_header` and the # `map_codec::field_len` accumulator to `u64`, so code emitted by a 0.8.x # codegen does not compile against a 0.9 runtime; and the codegen paths call # `buffa_codegen::decode_request` and `tooling_decode_options`, which arrived # in 0.9.1. The regen baseline for the checked-in generated code is the buffa # version in Cargo.lock, not this floor; bump the lock and regenerate together # (see CONTRIBUTING.md), and raise the floor only when generated code needs it. # (connectrpc-build also sources the generated `mod.rs` `#[allow(...)]` list # from `buffa_codegen::ALLOW_LINTS`.) # NOTE: the `connectrpc` crate pins `buffa` directly (not `workspace = true`) # so its `json` cargo feature can gate `buffa/json` for proto-only builds — # keep that floor aligned with this one when bumping. buffa = { version = "0.9.2", features = ["json"] } buffa-types = { version = "0.9.2", features = ["json"] } buffa-codegen = { version = "0.9.2" } # `reflect` is needed for `DescriptorPool`, which backs connectrpc-reflection. buffa-descriptor = { version = "0.9.2", features = ["reflect"] } # Serialization serde = { version = "1", features = ["derive"] } serde_json = "1" # Compression flate2 = { version = "1.0", default-features = false, features = ["zlib-rs"] } zstd = "0.13" # Error handling thiserror = "2" anyhow = "1" # Utilities percent-encoding = "2.3" base64 = "0.22" tracing = "0.1" tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } # HTTP server/client # 0.4.15: the header-list-size tests expect its GOAWAY on oversized header lists. h2 = "0.4.15" # `CloseReason::HeaderReadTimeout` needs `hyper::Error::is_timeout` to cover # the HTTP/1.1 header-read timeout (1.6); hyper-util 0.1.20 needs 1.8. hyper = "1.8" # `ConnectionClosed::error` relies on the auto connection's `Interrupted` # "Cancelled" error for a shutdown before protocol detection (checked in # 0.1.19 and 0.1.20). hyper-util = "0.1.20" # TLS rustls = "0.23" rustls-pemfile = "2" rustls-pki-types = "1" tokio-rustls = "0.26" # No crypto provider feature here — tokio-rustls already pulls in aws-lc-rs. # Enabling a second provider (ring) would make rustls's builder() panic at # runtime because it can't auto-detect which one to use. hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "tls12"] } # Framework integration axum = { version = "0.8", default-features = false, features = ["http2"] } # OS types libc = "0.2" # Code generation utilities heck = "0.5" proc-macro2 = "1" quote = "1" syn = { version = "2", features = ["full"] } prettyplease = "0.2" # Dev dependencies tempfile = "3" rcgen = "0.14" [workspace.lints.rust] dead_code = "warn" explicit_outlives_requirements = "warn" unused_imports = "warn" unused_lifetimes = "warn" # Generated trait methods return `ServiceResult>`; impls # intentionally refine to a concrete body type (e.g. `ServiceResult`). refining_impl_trait = { level = "allow", priority = -1 } [workspace.lints.clippy] dbg_macro = "warn" uninlined_format_args = "warn"