diff --git a/crates/tor-chanmgr/src/factory.rs b/crates/tor-chanmgr/src/factory.rs index 5f19e6383..fdc4da836 100644 --- a/crates/tor-chanmgr/src/factory.rs +++ b/crates/tor-chanmgr/src/factory.rs @@ -1,6 +1,8 @@ //! Traits and code to define different mechanisms for building Channels to //! different kinds of targets. +use std::sync::Arc; + use async_trait::async_trait; use futures::{AsyncRead, AsyncWrite}; use tor_linkspec::{HasChanMethod, OwnedChanTarget, TransportId}; @@ -136,3 +138,17 @@ impl ChannelFactory for RegistryAsFactory { factory.connect_via_transport(target).await } } + +#[async_trait] +impl<'a> ChannelFactory for Arc<(dyn ChannelFactory + Send + Sync + 'a)> { + async fn connect_via_transport(&self, target: &OwnedChanTarget) -> crate::Result { + self.as_ref().connect_via_transport(target).await + } +} + +#[async_trait] +impl<'a> ChannelFactory for Box<(dyn ChannelFactory + Send + Sync + 'a)> { + async fn connect_via_transport(&self, target: &OwnedChanTarget) -> crate::Result { + self.as_ref().connect_via_transport(target).await + } +} diff --git a/crates/tor-chanmgr/src/lib.rs b/crates/tor-chanmgr/src/lib.rs index 174800a64..131b4e484 100644 --- a/crates/tor-chanmgr/src/lib.rs +++ b/crates/tor-chanmgr/src/lib.rs @@ -79,6 +79,7 @@ mod mgr; mod testing; use educe::Educe; +use factory::ChannelFactory; use futures::select_biased; use futures::task::SpawnExt; use futures::StreamExt; @@ -111,12 +112,14 @@ use tor_rtcompat::scheduler::{TaskHandle, TaskSchedule}; /// get one if it exists. pub struct ChanMgr { /// Internal channel manager object that does the actual work. - mgr: mgr::AbstractChanMgr< - builder::TimeoutChannelFactory>>, - >, + mgr: mgr::AbstractChanMgr>, /// Stream of [`ConnStatus`] events. bootstrap_status: event::ConnStatusEvents, + + /// This currently isn't actually used, but we're keeping a PhantomData here + /// since probably we'll want it again, sooner or later. + runtime: std::marker::PhantomData R>, } /// Description of how we got a channel. @@ -189,15 +192,20 @@ impl ChanMgr { config: &ChannelConfig, dormancy: Dormancy, netparams: &NetParameters, - ) -> Self { + ) -> Self + where + R: 'static, + { let (sender, receiver) = event::channel(); let transport = builder::DefaultTransport::new(runtime.clone()); let builder = builder::ChanBuilder::new(runtime.clone(), transport, sender); let builder = builder::TimeoutChannelFactory::new(runtime, builder); + let builder: Box = Box::new(builder); let mgr = mgr::AbstractChanMgr::new(builder, config, dormancy, netparams); ChanMgr { mgr, bootstrap_status: receiver, + runtime: std::marker::PhantomData, } }