From 48d92e71300ad86c13f9e36693e34658d99b3270 Mon Sep 17 00:00:00 2001 From: Gabriela Moldovan Date: Wed, 17 Jun 2026 13:11:11 +0000 Subject: [PATCH 1/6] proto: Make the stream module pub --- crates/tor-proto/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/tor-proto/src/lib.rs b/crates/tor-proto/src/lib.rs index 5fd2ae6cba..692379d3cb 100644 --- a/crates/tor-proto/src/lib.rs +++ b/crates/tor-proto/src/lib.rs @@ -66,7 +66,7 @@ mod congestion; mod crypto; pub mod memquota; pub mod peer; -mod stream; +pub mod stream; pub(crate) mod streammap; pub(crate) mod tunnel; mod util; -- GitLab From f25e067851399ef9258af5e16d26c91972ff9e56 Mon Sep 17 00:00:00 2001 From: Gabriela Moldovan Date: Wed, 17 Jun 2026 13:13:31 +0000 Subject: [PATCH 2/6] proto: Re-export the Incoming* types from tor_proto::stream These will replace the pub re-exports from `tor_proto::client::stream`. This reorg is needed because currently, the only public export of the incoming stream types is from `tor_proto::client::stream`, but these aren't actually client specific: relays will use them too, for implementing exit, DNS and directory streams. So it makes more sense to export them from the top-level stream module instead. --- crates/tor-proto/src/stream.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/tor-proto/src/stream.rs b/crates/tor-proto/src/stream.rs index d47724ba1f..41528bf33b 100644 --- a/crates/tor-proto/src/stream.rs +++ b/crates/tor-proto/src/stream.rs @@ -30,6 +30,12 @@ use crate::stream::flow_ctrl::xon_xoff::reader::XonXoffReaderCtrl; use crate::stream::raw::StreamReceiver; use crate::{ClientTunnel, Error, HopLocation, Result}; +#[cfg(any(feature = "hs-service", feature = "relay"))] +pub use incoming::{ + IncomingStream, IncomingStreamRequest, IncomingStreamRequestContext, + IncomingStreamRequestDisposition, IncomingStreamRequestFilter, +}; + use std::pin::Pin; use std::sync::Arc; -- GitLab From 8d061089d198a740b5b2b4861508a2eb03d5d295 Mon Sep 17 00:00:00 2001 From: Gabriela Moldovan Date: Wed, 17 Jun 2026 13:17:08 +0000 Subject: [PATCH 3/6] proto: Re-export StreamReceiver from tor_proto::stream This will soon replace the re-export from `tor_proto::client::stream`. --- crates/tor-proto/src/stream.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/tor-proto/src/stream.rs b/crates/tor-proto/src/stream.rs index 41528bf33b..8f559113b4 100644 --- a/crates/tor-proto/src/stream.rs +++ b/crates/tor-proto/src/stream.rs @@ -27,7 +27,6 @@ use flow_ctrl::state::StreamRateLimit; use crate::memquota::StreamAccount; use crate::stream::flow_ctrl::xon_xoff::reader::XonXoffReaderCtrl; -use crate::stream::raw::StreamReceiver; use crate::{ClientTunnel, Error, HopLocation, Result}; #[cfg(any(feature = "hs-service", feature = "relay"))] @@ -36,6 +35,8 @@ pub use incoming::{ IncomingStreamRequestDisposition, IncomingStreamRequestFilter, }; +pub use raw::StreamReceiver; + use std::pin::Pin; use std::sync::Arc; -- GitLab From d4d1bee82cde95a30c71b940cc05f9d2b0016281 Mon Sep 17 00:00:00 2001 From: Gabriela Moldovan Date: Wed, 17 Jun 2026 13:20:56 +0000 Subject: [PATCH 4/6] proto: Add crate-level exports for two extra stream types For convenience. This will soon replace a corresponding re-export from `tor_proto::client::stream`. --- crates/tor-proto/src/stream.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/tor-proto/src/stream.rs b/crates/tor-proto/src/stream.rs index 8f559113b4..1b9240a301 100644 --- a/crates/tor-proto/src/stream.rs +++ b/crates/tor-proto/src/stream.rs @@ -37,6 +37,10 @@ pub use incoming::{ pub use raw::StreamReceiver; +#[cfg_attr(docsrs, doc(cfg(any(feature = "hs-service", feature = "relay"))))] +#[cfg(any(feature = "hs-service", feature = "relay"))] +pub(crate) use incoming::{InboundDataCmdChecker, IncomingCmdChecker, StreamReqInfo}; + use std::pin::Pin; use std::sync::Arc; -- GitLab From d305c6c0a201703ce14fbcfdce1864aeda9cc8dc Mon Sep 17 00:00:00 2001 From: Gabriela Moldovan Date: Wed, 17 Jun 2026 13:31:26 +0000 Subject: [PATCH 5/6] proto: Add crate-level exports for two extra stream types (fmt) --- crates/tor-circmgr/src/tunnel.rs | 6 ++---- crates/tor-hsrproxy/src/proxy.rs | 3 ++- crates/tor-hsservice/src/rend_handshake.rs | 10 +++++----- crates/tor-hsservice/src/req.rs | 2 +- crates/tor-proto/semver.md | 1 + crates/tor-proto/src/client.rs | 10 +++------- crates/tor-proto/src/client/reactor/circuit.rs | 6 +++--- crates/tor-proto/src/client/reactor/control.rs | 2 +- crates/tor-proto/src/client/stream.rs | 13 ------------- crates/tor-proto/src/client/stream/data.rs | 2 +- crates/tor-proto/src/client/stream/resolve.rs | 2 +- examples/axum/axum-hello-world/src/main.rs | 2 +- .../hyper-examples/src/bin/hyper-http-hs-example.rs | 2 +- 13 files changed, 22 insertions(+), 39 deletions(-) create mode 100644 crates/tor-proto/semver.md diff --git a/crates/tor-circmgr/src/tunnel.rs b/crates/tor-circmgr/src/tunnel.rs index c11fd30c21..2dd2fa00f0 100644 --- a/crates/tor-circmgr/src/tunnel.rs +++ b/crates/tor-circmgr/src/tunnel.rs @@ -467,11 +467,9 @@ impl ServiceOnionServiceDataTunnel { allow_commands: &'a [tor_cell::relaycell::RelayCmd], hop: TargetHop, filter: FILT, - ) -> Result< - impl futures::Stream + use<'a, FILT>, - > + ) -> Result + use<'a, FILT>> where - FILT: tor_proto::client::stream::IncomingStreamRequestFilter, + FILT: tor_proto::stream::IncomingStreamRequestFilter, { self.tunnel_ref() .allow_stream_requests(allow_commands, hop, filter) diff --git a/crates/tor-hsrproxy/src/proxy.rs b/crates/tor-hsrproxy/src/proxy.rs index 031819d9f6..655a453913 100644 --- a/crates/tor-hsrproxy/src/proxy.rs +++ b/crates/tor-hsrproxy/src/proxy.rs @@ -16,7 +16,8 @@ use tor_cell::relaycell::msg as relaymsg; use tor_error::{ErrorKind, HasKind, debug_report}; use tor_hsservice::{HsNickname, RendRequest, StreamRequest}; use tor_log_ratelim::log_ratelim; -use tor_proto::client::stream::{DataStream, IncomingStreamRequest}; +use tor_proto::client::stream::DataStream; +use tor_proto::stream::IncomingStreamRequest; use tor_rtcompat::{Runtime, SpawnExt as _}; use crate::config::{ diff --git a/crates/tor-hsservice/src/rend_handshake.rs b/crates/tor-hsservice/src/rend_handshake.rs index c4e6f9141f..d62a414f01 100644 --- a/crates/tor-hsservice/src/rend_handshake.rs +++ b/crates/tor-hsservice/src/rend_handshake.rs @@ -14,7 +14,7 @@ use tor_proto::{ self, hs_ntor::{self, HsNtorHkdfKeyGenerator}, }, - client::stream::{IncomingStream, IncomingStreamRequestFilter}, + stream::{IncomingStream, IncomingStreamRequestFilter}, }; /// An error produced while trying to process an introduction request we have @@ -215,15 +215,15 @@ pub(crate) struct RequestFilter { impl IncomingStreamRequestFilter for RequestFilter { fn disposition( &mut self, - _ctx: &tor_proto::client::stream::IncomingStreamRequestContext<'_>, + _ctx: &tor_proto::stream::IncomingStreamRequestContext<'_>, circ: &tor_proto::circuit::CircHopSyncView<'_>, - ) -> tor_proto::Result { + ) -> tor_proto::Result { if circ.n_open_streams() >= self.max_concurrent_streams { // TODO: We may want to have a way to send back an END message as // well and not tear down the circuit. - Ok(tor_proto::client::stream::IncomingStreamRequestDisposition::CloseCircuit) + Ok(tor_proto::stream::IncomingStreamRequestDisposition::CloseCircuit) } else { - Ok(tor_proto::client::stream::IncomingStreamRequestDisposition::Accept) + Ok(tor_proto::stream::IncomingStreamRequestDisposition::Accept) } } } diff --git a/crates/tor-hsservice/src/req.rs b/crates/tor-hsservice/src/req.rs index 1a1667b338..2bc3231415 100644 --- a/crates/tor-hsservice/src/req.rs +++ b/crates/tor-hsservice/src/req.rs @@ -9,7 +9,7 @@ use tor_cell::relaycell::msg::{Connected, End, Introduce2}; use tor_circmgr::ServiceOnionServiceDataTunnel; use tor_hscrypto::Subcredential; use tor_keymgr::ArtiPath; -use tor_proto::client::stream::{IncomingStream, IncomingStreamRequest}; +use tor_proto::stream::{IncomingStream, IncomingStreamRequest}; /// Request to complete an introduction/rendezvous handshake. /// diff --git a/crates/tor-proto/semver.md b/crates/tor-proto/semver.md new file mode 100644 index 0000000000..bead3289c1 --- /dev/null +++ b/crates/tor-proto/semver.md @@ -0,0 +1 @@ +BREAKING: Many stream-related types are now exported from `tor_proto::stream` rather than `tor_proto::client::stream` diff --git a/crates/tor-proto/src/client.rs b/crates/tor-proto/src/client.rs index 725026d65c..16a3c2196c 100644 --- a/crates/tor-proto/src/client.rs +++ b/crates/tor-proto/src/client.rs @@ -25,7 +25,6 @@ pub use crate::client::circuit::padding::{ }; use crate::client::stream::{ DataStream, OutboundDataCmdChecker, ResolveCmdChecker, ResolveStream, StreamParameters, - StreamReceiver, }; use crate::congestion::sendme::StreamRecvWindow; use crate::crypto::cell::HopNum; @@ -33,7 +32,7 @@ use crate::memquota::{SpecificAccount as _, StreamAccount}; use crate::stream::STREAM_READER_BUFFER; use crate::stream::cmdcheck::AnyCmdChecker; use crate::stream::flow_ctrl::xon_xoff::reader::XonXoffReaderCtrl; -use crate::stream::{RECV_WINDOW_INIT, StreamComponents, StreamTarget, Tunnel}; +use crate::stream::{RECV_WINDOW_INIT, StreamComponents, StreamReceiver, StreamTarget, Tunnel}; use crate::{Error, ResolveError, Result}; use circuit::{ClientCirc, Path}; use reactor::{CtrlCmd, CtrlMsg, FlowCtrlMsg, MetaCellHandler}; @@ -47,10 +46,7 @@ use tor_memquota::derive_deftly_template_HasMemoryCost; use tor_memquota::mq_queue::{ChannelSpec as _, MpscSpec}; #[cfg(feature = "hs-service")] -use crate::stream::incoming::StreamReqInfo; - -#[cfg(feature = "hs-service")] -use crate::client::stream::{IncomingCmdChecker, IncomingStream}; +use crate::stream::{IncomingCmdChecker, IncomingStream, StreamReqInfo}; #[cfg(feature = "send-control-msg")] use msghandler::{MsgHandler, UserMsgHandler}; @@ -260,7 +256,7 @@ impl ClientTunnel { filter: FILT, ) -> Result + use<'a, FILT>> where - FILT: crate::client::stream::IncomingStreamRequestFilter + 'a, + FILT: crate::stream::IncomingStreamRequestFilter + 'a, { use futures::stream::StreamExt; diff --git a/crates/tor-proto/src/client/reactor/circuit.rs b/crates/tor-proto/src/client/reactor/circuit.rs index 95290a2bb3..0eed8f0382 100644 --- a/crates/tor-proto/src/client/reactor/circuit.rs +++ b/crates/tor-proto/src/client/reactor/circuit.rs @@ -70,7 +70,7 @@ use extender::HandshakeAuxDataHandler; #[cfg(feature = "hs-service")] use { crate::circuit::CircHopSyncView, - crate::client::stream::{InboundDataCmdChecker, IncomingStreamRequest}, + crate::stream::{InboundDataCmdChecker, IncomingStreamRequest}, tor_cell::relaycell::msg::Begin, }; @@ -882,9 +882,9 @@ impl Circuit { let req = IncomingStreamRequest::Begin(begin); { - use crate::client::stream::IncomingStreamRequestDisposition::*; + use crate::stream::IncomingStreamRequestDisposition::*; - let ctx = crate::client::stream::IncomingStreamRequestContext { request: &req }; + let ctx = crate::stream::IncomingStreamRequestContext { request: &req }; // IMPORTANT: super::syncview::CircHopSyncView::n_open_streams() (called via disposition() below) // accesses the stream map mutexes! // diff --git a/crates/tor-proto/src/client/reactor/control.rs b/crates/tor-proto/src/client/reactor/control.rs index a3c732a1ff..5f23a428dd 100644 --- a/crates/tor-proto/src/client/reactor/control.rs +++ b/crates/tor-proto/src/client/reactor/control.rs @@ -32,7 +32,7 @@ use tracing::{debug, trace}; #[cfg(feature = "hs-service")] use { crate::client::reactor::IncomingStreamRequestHandler, - crate::client::stream::IncomingStreamRequestFilter, crate::stream::incoming::StreamReqSender, + crate::stream::IncomingStreamRequestFilter, crate::stream::incoming::StreamReqSender, }; #[cfg(test)] diff --git a/crates/tor-proto/src/client/stream.rs b/crates/tor-proto/src/client/stream.rs index 5045869c72..5f2e5a21cc 100644 --- a/crates/tor-proto/src/client/stream.rs +++ b/crates/tor-proto/src/client/stream.rs @@ -15,25 +15,12 @@ mod data; mod params; mod resolve; -#[cfg(feature = "hs-service")] -#[cfg_attr(docsrs, doc(cfg(feature = "hs-service")))] -pub(crate) use crate::stream::incoming::IncomingCmdChecker; pub use data::{DataReader, DataStream, DataWriter}; -// TODO(relay): stop reexporting these from here -#[cfg(feature = "hs-service")] -pub use crate::stream::incoming::{ - IncomingStream, IncomingStreamRequest, IncomingStreamRequestContext, - IncomingStreamRequestDisposition, IncomingStreamRequestFilter, -}; -pub use crate::stream::raw::StreamReceiver; pub use params::StreamParameters; pub use resolve::ResolveStream; pub(crate) use {data::OutboundDataCmdChecker, resolve::ResolveCmdChecker}; -#[cfg(feature = "hs-service")] -pub(crate) use crate::stream::incoming::InboundDataCmdChecker; - pub use tor_cell::relaycell::msg::IpVersionPreference; #[cfg(feature = "stream-ctrl")] diff --git a/crates/tor-proto/src/client/stream/data.rs b/crates/tor-proto/src/client/stream/data.rs index acca16210b..aeead40014 100644 --- a/crates/tor-proto/src/client/stream/data.rs +++ b/crates/tor-proto/src/client/stream/data.rs @@ -33,8 +33,8 @@ use std::sync::{Mutex, Weak}; use educe::Educe; use crate::client::ClientTunnel; -use crate::client::stream::StreamReceiver; use crate::memquota::StreamAccount; +use crate::stream::StreamReceiver; use crate::stream::StreamTarget; use crate::stream::cmdcheck::{AnyCmdChecker, CmdChecker, StreamStatus}; use crate::stream::flow_ctrl::state::StreamRateLimit; diff --git a/crates/tor-proto/src/client/stream/resolve.rs b/crates/tor-proto/src/client/stream/resolve.rs index 10f36fa1ca..5dd66af96e 100644 --- a/crates/tor-proto/src/client/stream/resolve.rs +++ b/crates/tor-proto/src/client/stream/resolve.rs @@ -1,7 +1,7 @@ //! Declare a type for streams that do hostname lookups -use crate::client::stream::StreamReceiver; use crate::memquota::StreamAccount; +use crate::stream::StreamReceiver; use crate::stream::cmdcheck::{AnyCmdChecker, CmdChecker, StreamStatus}; use crate::{Error, Result}; diff --git a/examples/axum/axum-hello-world/src/main.rs b/examples/axum/axum-hello-world/src/main.rs index 962d478932..418ebf014f 100644 --- a/examples/axum/axum-hello-world/src/main.rs +++ b/examples/axum/axum-hello-world/src/main.rs @@ -13,7 +13,7 @@ use safelog::{DisplayRedacted as _, sensitive}; use tor_cell::relaycell::msg::Connected; use tor_hsservice::StreamRequest; use tor_hsservice::config::OnionServiceConfigBuilder; -use tor_proto::client::stream::IncomingStreamRequest; +use tor_proto::stream::IncomingStreamRequest; #[tokio::main] async fn main() { diff --git a/examples/hyper-examples/src/bin/hyper-http-hs-example.rs b/examples/hyper-examples/src/bin/hyper-http-hs-example.rs index 7368f88a6a..b788b43e03 100644 --- a/examples/hyper-examples/src/bin/hyper-http-hs-example.rs +++ b/examples/hyper-examples/src/bin/hyper-http-hs-example.rs @@ -15,7 +15,7 @@ use safelog::{DisplayRedacted, sensitive}; use tor_cell::relaycell::msg::Connected; use tor_hsservice::StreamRequest; use tor_hsservice::config::OnionServiceConfigBuilder; -use tor_proto::client::stream::IncomingStreamRequest; +use tor_proto::stream::IncomingStreamRequest; struct WebHandler { shutdown: CancellationToken, -- GitLab From c72b89fd162ec6a801e8b82edc694e7e4f16fb4d Mon Sep 17 00:00:00 2001 From: Gabriela Moldovan Date: Wed, 17 Jun 2026 13:37:26 +0000 Subject: [PATCH 6/6] proto: Update tests to use the new stream exports The tests don't compile otherwise. --- crates/tor-proto/src/circuit/reactor.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/tor-proto/src/circuit/reactor.rs b/crates/tor-proto/src/circuit/reactor.rs index fbcc6c6b69..fde23cbcb6 100644 --- a/crates/tor-proto/src/circuit/reactor.rs +++ b/crates/tor-proto/src/circuit/reactor.rs @@ -601,7 +601,7 @@ pub(crate) mod test { use chanmsg::AnyChanMsg; #[cfg(feature = "hs-service")] - use crate::client::stream::IncomingStreamRequestFilter; + use crate::stream::IncomingStreamRequestFilter; pub(crate) fn rmsg_to_ccmsg( id: Option, @@ -629,10 +629,10 @@ pub(crate) mod test { impl IncomingStreamRequestFilter for AllowAllStreamsFilter { fn disposition( &mut self, - _ctx: &crate::client::stream::IncomingStreamRequestContext<'_>, + _ctx: &crate::stream::IncomingStreamRequestContext<'_>, _circ: &crate::circuit::CircHopSyncView<'_>, - ) -> crate::Result { - Ok(crate::client::stream::IncomingStreamRequestDisposition::Accept) + ) -> crate::Result { + Ok(crate::stream::IncomingStreamRequestDisposition::Accept) } } } -- GitLab