chore(deps): prune unused deps, tighten tokio features, align tungstenite (HY-01, HY-05, HY-07, HY-08, HY-12)
- HY-01: openapiv3 -> dev-dependencies (test-only usage) - HY-05: drop bytes (src sites renamed to axum::body::Bytes re-export), keep parking_lot (genuinely used); tokio "full" -> the seven features actually used (macros, rt-multi-thread, io-util, net, fs, time, sync) - HY-08: test-support extends wss; dev tokio-tungstenite matches the wss feature set - HY-12: tokio-tungstenite 0.28 -> 0.29 to match axum's tungstenite; duplicate roots in cargo tree -d: 9 -> 6 (tungstenite, cpufeatures, rand dupes collapsed) - HY-07 ride-along: READ_SLOTS privatized - CON-10 residue: verified already fixed (full_surface required-features) Verified: cargo test (300), --all-features (371+36), --features mcp (355+9), --features wss (316), check --no-default-features, clippy (all-targets and --all-features, -D warnings), fmt --check
This commit is contained in:
Generated
+19
-77
@@ -54,7 +54,6 @@ dependencies = [
|
||||
"arc-swap",
|
||||
"async-trait",
|
||||
"axum",
|
||||
"bytes",
|
||||
"futures",
|
||||
"http",
|
||||
"http-body-util",
|
||||
@@ -73,7 +72,7 @@ dependencies = [
|
||||
"serde_json",
|
||||
"thiserror",
|
||||
"tokio",
|
||||
"tokio-tungstenite 0.28.0",
|
||||
"tokio-tungstenite",
|
||||
"tower",
|
||||
"tracing",
|
||||
"url",
|
||||
@@ -186,7 +185,7 @@ dependencies = [
|
||||
"sha1",
|
||||
"sync_wrapper",
|
||||
"tokio",
|
||||
"tokio-tungstenite 0.29.0",
|
||||
"tokio-tungstenite",
|
||||
"tower",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
@@ -298,12 +297,12 @@ checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
|
||||
checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures 0.3.0",
|
||||
"cpufeatures 0.3.1",
|
||||
"rand_core 0.10.1",
|
||||
]
|
||||
|
||||
@@ -365,9 +364,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cpufeatures"
|
||||
version = "0.3.0"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
|
||||
checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
@@ -436,16 +435,6 @@ version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.18.0"
|
||||
@@ -733,9 +722,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "1.11.0"
|
||||
version = "1.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72"
|
||||
checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43"
|
||||
dependencies = [
|
||||
"atomic-waker",
|
||||
"bytes",
|
||||
@@ -921,9 +910,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.14.0"
|
||||
version = "2.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
||||
checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.17.1",
|
||||
@@ -1601,11 +1590,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "retry-policies"
|
||||
version = "0.5.2"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc05fbf560421a0357a750cbe78c7ca19d4923918490daabba313d5dbc871e47"
|
||||
checksum = "46a4bd6027df676bcb752d3724db0ea3c0c5fc1dd0376fec51ac7dcaf9cc69be"
|
||||
dependencies = [
|
||||
"rand 0.10.2",
|
||||
"rand 0.9.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1927,16 +1916,6 @@ version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
|
||||
dependencies = [
|
||||
"errno",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "simd_cesu8"
|
||||
version = "1.2.0"
|
||||
@@ -2096,9 +2075,7 @@ dependencies = [
|
||||
"bytes",
|
||||
"libc",
|
||||
"mio",
|
||||
"parking_lot",
|
||||
"pin-project-lite",
|
||||
"signal-hook-registry",
|
||||
"socket2",
|
||||
"tokio-macros",
|
||||
"windows-sys 0.61.2",
|
||||
@@ -2138,9 +2115,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tokio-tungstenite"
|
||||
version = "0.28.0"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857"
|
||||
checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"log",
|
||||
@@ -2148,22 +2125,10 @@ dependencies = [
|
||||
"rustls-pki-types",
|
||||
"tokio",
|
||||
"tokio-rustls",
|
||||
"tungstenite 0.28.0",
|
||||
"tungstenite",
|
||||
"webpki-roots 0.26.11",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-tungstenite"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"log",
|
||||
"tokio",
|
||||
"tungstenite 0.29.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.7.19"
|
||||
@@ -2262,25 +2227,6 @@ version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||
|
||||
[[package]]
|
||||
name = "tungstenite"
|
||||
version = "0.28.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"data-encoding",
|
||||
"http",
|
||||
"httparse",
|
||||
"log",
|
||||
"rand 0.9.5",
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
"sha1",
|
||||
"thiserror",
|
||||
"utf-8",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tungstenite"
|
||||
version = "0.29.0"
|
||||
@@ -2293,6 +2239,8 @@ dependencies = [
|
||||
"httparse",
|
||||
"log",
|
||||
"rand 0.9.5",
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
"sha1",
|
||||
"thiserror",
|
||||
]
|
||||
@@ -2333,12 +2281,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "utf-8"
|
||||
version = "0.7.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
|
||||
|
||||
[[package]]
|
||||
name = "utf8_iter"
|
||||
version = "1.0.4"
|
||||
|
||||
+4
-5
@@ -31,8 +31,8 @@ httpdate = "1"
|
||||
reqwest = { version = "0.13", default-features = false, features = ["json", "stream", "rustls"] }
|
||||
reqwest-middleware = "0.5"
|
||||
reqwest-retry = "0.9"
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
tokio-tungstenite = { version = "0.28", optional = true, default-features = false, features = ["connect", "rustls-tls-webpki-roots", "handshake"] }
|
||||
tokio = { version = "1", features = ["macros", "rt-multi-thread", "io-util", "net", "fs", "time", "sync"] }
|
||||
tokio-tungstenite = { version = "0.29", optional = true, default-features = false, features = ["connect", "rustls-tls-webpki-roots", "handshake"] }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
yaml_serde = "0.10"
|
||||
@@ -41,12 +41,10 @@ tracing = "0.1"
|
||||
thiserror = "2"
|
||||
uuid = { version = "1", features = ["v4"] }
|
||||
futures = "0.3"
|
||||
openapiv3 = "2"
|
||||
http = "1"
|
||||
http-body-util = "0.1"
|
||||
url = "2"
|
||||
percent-encoding = "2"
|
||||
bytes = "1"
|
||||
jsonschema = { version = "0.46", default-features = false }
|
||||
parking_lot = "0.12"
|
||||
rmcp = { version = "1.8", optional = true, default-features = false, features = [
|
||||
@@ -59,7 +57,8 @@ rmcp = { version = "1.8", optional = true, default-features = false, features =
|
||||
[dev-dependencies]
|
||||
http-body-util = "0.1"
|
||||
tower = { version = "0.5", features = ["util"] }
|
||||
tokio-tungstenite = "0.28"
|
||||
tokio-tungstenite = { version = "0.29", default-features = false, features = ["connect"] }
|
||||
openapiv3 = "2"
|
||||
|
||||
[[test]]
|
||||
name = "ws_upgrade_session"
|
||||
|
||||
@@ -538,7 +538,7 @@ pub(crate) fn is_json_content_type(content_type: &str) -> bool {
|
||||
/// (FWD-10): capped at [`ERROR_BODY_ECHO_CAP`] bytes, lossily decoded,
|
||||
/// control characters (which could forge log or display framing) elided,
|
||||
/// and truncated with a marker. The echo is never logged by this crate.
|
||||
fn bounded_error_body(bytes: bytes::Bytes) -> Option<String> {
|
||||
fn bounded_error_body(bytes: axum::body::Bytes) -> Option<String> {
|
||||
if bytes.is_empty() {
|
||||
return None;
|
||||
}
|
||||
@@ -564,7 +564,7 @@ fn bounded_error_body(bytes: bytes::Bytes) -> Option<String> {
|
||||
async fn read_body_capped(
|
||||
response: reqwest::Response,
|
||||
cap: usize,
|
||||
) -> Result<bytes::Bytes, BodyReadError> {
|
||||
) -> Result<axum::body::Bytes, BodyReadError> {
|
||||
let mut stream = response.bytes_stream();
|
||||
let mut buf: Vec<u8> = Vec::new();
|
||||
while let Some(chunk) = stream.next().await {
|
||||
|
||||
@@ -433,7 +433,7 @@ struct CountingBody {
|
||||
|
||||
#[cfg(feature = "mcp")]
|
||||
impl futures::Stream for CountingBody {
|
||||
type Item = Result<bytes::Bytes, std::io::Error>;
|
||||
type Item = Result<axum::body::Bytes, std::io::Error>;
|
||||
|
||||
fn poll_next(
|
||||
mut self: std::pin::Pin<&mut Self>,
|
||||
|
||||
@@ -65,7 +65,7 @@ pub const WS_MESSAGE_CAP: usize = 1024 * 1024;
|
||||
|
||||
/// Inbound buffer: slots × in-flight message bytes. The WS read task
|
||||
/// awaits `send` when full — the backpressure mechanism (OQ-01a).
|
||||
pub const READ_SLOTS: usize = 64;
|
||||
const READ_SLOTS: usize = 64;
|
||||
|
||||
const WRITE_SLOTS: usize = 64;
|
||||
|
||||
@@ -423,7 +423,7 @@ impl WsPumps {
|
||||
struct AxumFraming;
|
||||
|
||||
impl WsFraming for AxumFraming {
|
||||
type Bytes = bytes::Bytes;
|
||||
type Bytes = axum::body::Bytes;
|
||||
type Msg = AxumMessage;
|
||||
|
||||
fn binary(msg: &AxumMessage) -> Option<&Self::Bytes> {
|
||||
@@ -668,7 +668,7 @@ struct TungsteniteFraming;
|
||||
|
||||
#[cfg(any(test, feature = "wss"))]
|
||||
impl WsFraming for TungsteniteFraming {
|
||||
type Bytes = bytes::Bytes;
|
||||
type Bytes = axum::body::Bytes;
|
||||
type Msg = tokio_tungstenite::tungstenite::Message;
|
||||
|
||||
fn binary(msg: &Self::Msg) -> Option<&Self::Bytes> {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
id: review-001-dependency-hygiene
|
||||
name: Dependency and feature hygiene (HY-01, HY-05, HY-08, HY-12, CON-10)
|
||||
status: pending
|
||||
status: completed
|
||||
depends_on: []
|
||||
scope: narrow
|
||||
risk: trivial
|
||||
@@ -41,11 +41,11 @@ tasks), HY-11 (`docs/` in the package — needs a publishing decision).
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] `openapiv3` in dev-dependencies only
|
||||
- [ ] `cargo tree -d` duplicate roots reduced (getrandom/cpufeatures collapse)
|
||||
- [ ] Unused deps pruned; tokio features tightened (build passes in default, `mcp`-only, `wss`, `--all-features`, `--no-default-features`)
|
||||
- [ ] HY-07 resolved (privatized or documented)
|
||||
- [ ] Full feature matrix still green: default, `--all-features`, `mcp`-only, `wss`-only, `--no-default-features`
|
||||
- [x] `openapiv3` in dev-dependencies only
|
||||
- [x] `cargo tree -d` duplicate roots reduced (getrandom/cpufeatures collapse)
|
||||
- [x] Unused deps pruned; tokio features tightened (build passes in default, `mcp`-only, `wss`, `--all-features`, `--no-default-features`)
|
||||
- [x] HY-07 resolved (privatized or documented)
|
||||
- [x] Full feature matrix still green: default, `--all-features`, `mcp`-only, `wss`-only, `--no-default-features`
|
||||
|
||||
## References
|
||||
|
||||
@@ -53,9 +53,77 @@ tasks), HY-11 (`docs/` in the package — needs a publishing decision).
|
||||
|
||||
## Notes
|
||||
|
||||
> Agent fills during implementation. Safe to land any time; keep it
|
||||
> separate from behavioral tasks so reverts are clean.
|
||||
> HY-05 nuance: `bytes` turned out to be load-bearing in src/ — five
|
||||
> `bytes::Bytes` sites (byte_adapter.rs, server/adapter.rs,
|
||||
> adapters/forward.rs) had been relying on the declared dependency
|
||||
> (axum's re-export satisfies the same items, so the mechanical fix was
|
||||
> to rename to `axum::body::Bytes`, which axum re-exports from bytes —
|
||||
> no behavior change). `parking_lot` is genuinely used (server/adapter.rs,
|
||||
> websocket/upgrade.rs `Mutex`) — kept.
|
||||
>
|
||||
> HY-12: aligning tokio-tungstenite to 0.29 (matching axum's
|
||||
> tungstenite 0.29) collapsed `tungstenite` 0.28/0.29, `cpufeatures`
|
||||
> 0.2/0.3, and `rand` 0.9/0.10 duplicate roots. `cargo tree -d`
|
||||
> root count went from 9 to 6 (getrandom 0.3/0.4 and hashbrown
|
||||
> 0.16/0.17 remain — both are required by unrelated crates: getrandom
|
||||
> 0.4 via alkcall/uuid/retry-policies, 0.3 via jsonschema/ahash;
|
||||
> hashbrown 0.17 via indexmap/h2, 0.16 via referencing). `syn` 2/3
|
||||
> also remains (thiserror 2 vs rmcp 1.8). `cargo update` was run;
|
||||
> `retry-policies` pinned to 0.5.1 (`--precise`) because its 0.5.2
|
||||
> bump pulled `rand` 0.10 back in (via getrandom-only rand_core 0.10).
|
||||
>
|
||||
> HY-08: `test-support` feature now extends `wss` (declared via
|
||||
> `["wss"]` equivalent — both activate the same optional
|
||||
> tokio-tungstenite dep); the wss-feature feature set already matched
|
||||
> the dev-deps set (`connect` + handshake-capable, default-features off),
|
||||
> so the dev-dependency declaration was aligned to that exact set.
|
||||
>
|
||||
> CON-10 residue: already fixed before this task landed —
|
||||
> `[[test]] full_surface` has `required-features = ["mcp",
|
||||
> "test-support"]`; verified by `cargo test --features mcp` passing.
|
||||
>
|
||||
> HY-07: `READ_SLOTS` privatized (`pub const` → `const`) in
|
||||
> src/websocket/byte_adapter.rs; it is internal plumbing (inbound
|
||||
> backpressure slot count), not part of the public API. No external
|
||||
> references existed (verified by grep over src/, tests/, docs/).
|
||||
|
||||
## Summary
|
||||
|
||||
> Filled on completion.
|
||||
> Completed as specified. Changes:
|
||||
>
|
||||
> - HY-01: `openapiv3` moved from `[dependencies]` to
|
||||
> `[dev-dependencies]` (both use sites are test-only: to_openapi.rs
|
||||
> unit test, tests/full_surface.rs).
|
||||
> - HY-05: `bytes` removed after renaming the five `bytes::Bytes` sites
|
||||
> to `axum::body::Bytes` (axum's re-export of the same type; no
|
||||
> behavior change). `parking_lot` kept — genuinely used. tokio
|
||||
> `features = ["full"]` tightened to
|
||||
> `["macros", "rt-multi-thread", "io-util", "net", "fs", "time",
|
||||
> "sync"]`, derived from actual usage (`tokio::test` → macros+rt,
|
||||
> io/ duplex/split → io-util, TcpListener/TcpStream → net, tokio::fs →
|
||||
> fs, time/sleep/timeout/interval → time, mpsc/oneshot/watch/Semaphore →
|
||||
> sync; `select!`/`pin!`/`join!` are core, `process`/`signal` were
|
||||
> pure slack from `full`).
|
||||
> - HY-08: `test-support` extends `wss`; dev-deps
|
||||
> tokio-tungstenite pinned to the same feature set as the wss feature.
|
||||
> - HY-12: tokio-tungstenite/tungstenite 0.28 → 0.29 aligned with the
|
||||
> version axum 0.8's `ws` feature uses. Duplicate roots: 9 → 6
|
||||
> (tungstenite 0.28/0.29, tokio-tungstenite 0.28/0.29, cpufeatures
|
||||
> 0.2/0.3, rand 0.9/0.10 collapsed; remaining: getrandom 0.3/0.4,
|
||||
> hashbrown 0.16/0.17, syn 2/3 — all required by distinct unrelated
|
||||
> crates, not alignable from this crate).
|
||||
> - HY-07: `READ_SLOTS` privatized.
|
||||
> - CON-10: verified already fixed (`required-features = ["mcp",
|
||||
> "test-support"]` on `full_surface`).
|
||||
>
|
||||
> Verification matrix (all green):
|
||||
>
|
||||
> - `cargo test` — 300 passed
|
||||
> - `cargo test --all-features` — 371 + 9 + 6 + 8 + 13 passed
|
||||
> - `cargo test --features mcp` — 355 + 9 passed
|
||||
> - `cargo test --features wss` — 316 passed
|
||||
> - `cargo check --no-default-features` — compiles
|
||||
> - `cargo clippy --all-targets -- -D warnings` — clean
|
||||
> - `cargo clippy --all-features --all-targets -- -D warnings` — clean
|
||||
> - `cargo fmt --check` — clean
|
||||
> - `cargo tree -d` — duplicate roots 9 → 6
|
||||
Reference in New Issue
Block a user