mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-23 23:01:33 +00:00
{core,swarm}/: Don't require Transport: Clone
and take &mut
(#2529)
Previously `libp2p-swarm` required a `Transport` to be `Clone`. Methods on `Transport`, e.g. `Transport::dial` would take ownership, requiring e.g. a `Clone::clone` before calling `Transport::dial`. The requirement of `Transport` to be `Clone` is no longer needed in `libp2p-swarm`. E.g. concurrent dialing can be done without a clone per dial. This commit removes the requirement of `Clone` for `Transport` in `libp2p-swarm`. As a follow-up methods on `Transport` no longer take ownership, but instead a mutable reference (`&mut self`). On the one hand this simplifies `libp2p-swarm`, on the other it simplifies implementations of `Transport`.
This commit is contained in:
@ -497,7 +497,10 @@ where
|
||||
type ListenerUpgrade = EitherFuture<A::ListenerUpgrade, B::ListenerUpgrade>;
|
||||
type Dial = EitherFuture<A::Dial, B::Dial>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
use TransportError::*;
|
||||
match self {
|
||||
EitherTransport::Left(a) => match a.listen_on(addr) {
|
||||
@ -513,7 +516,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
use TransportError::*;
|
||||
match self {
|
||||
EitherTransport::Left(a) => match a.dial(addr) {
|
||||
@ -529,7 +532,10 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>>
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
|
@ -70,10 +70,12 @@ pub use self::upgrade::Upgrade;
|
||||
/// by a [`Transport`] through an upgrade mechanism that is initiated via
|
||||
/// [`upgrade`](Transport::upgrade).
|
||||
///
|
||||
/// > **Note**: The methods of this trait use `self` and not `&self` or `&mut self`. In other
|
||||
/// > words, listening or dialing consumes the transport object. This has been designed
|
||||
/// > so that you would implement this trait on `&Foo` or `&mut Foo` instead of directly
|
||||
/// > on `Foo`.
|
||||
/// Note for implementors: Futures returned by [`Transport::dial`] should only
|
||||
/// do work once polled for the first time. E.g. in the case of TCP, connecting
|
||||
/// to the remote should not happen immediately on [`Transport::dial`] but only
|
||||
/// once the returned [`Future`] is polled. The caller of [`Transport::dial`]
|
||||
/// may call the method multiple times with a set of addresses, racing a subset
|
||||
/// of the returned dials to success concurrently.
|
||||
pub trait Transport {
|
||||
/// The result of a connection setup process, including protocol upgrades.
|
||||
///
|
||||
@ -118,7 +120,7 @@ pub trait Transport {
|
||||
///
|
||||
/// Returning an error from the stream is considered fatal. The listener can also report
|
||||
/// non-fatal errors by producing a [`ListenerEvent::Error`].
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>>
|
||||
fn listen_on(&mut self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>>
|
||||
where
|
||||
Self: Sized;
|
||||
|
||||
@ -126,7 +128,7 @@ pub trait Transport {
|
||||
///
|
||||
/// If [`TransportError::MultiaddrNotSupported`] is returned, it may be desirable to
|
||||
/// try an alternative [`Transport`], if available.
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>>
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>>
|
||||
where
|
||||
Self: Sized;
|
||||
|
||||
@ -135,7 +137,10 @@ pub trait Transport {
|
||||
/// This option is needed for NAT and firewall hole punching.
|
||||
///
|
||||
/// See [`ConnectedPoint::Dialer`](crate::connection::ConnectedPoint::Dialer) for related option.
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>>
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>>
|
||||
where
|
||||
Self: Sized;
|
||||
|
||||
@ -147,7 +152,7 @@ pub trait Transport {
|
||||
/// Boxes the transport, including custom transport errors.
|
||||
fn boxed(self) -> boxed::Boxed<Self::Output>
|
||||
where
|
||||
Self: Transport + Sized + Clone + Send + Sync + 'static,
|
||||
Self: Transport + Sized + Send + Sync + 'static,
|
||||
Self::Dial: Send + 'static,
|
||||
Self::Listener: Send + 'static,
|
||||
Self::ListenerUpgrade: Send + 'static,
|
||||
@ -160,7 +165,7 @@ pub trait Transport {
|
||||
fn map<F, O>(self, f: F) -> map::Map<Self, F>
|
||||
where
|
||||
Self: Sized,
|
||||
F: FnOnce(Self::Output, ConnectedPoint) -> O + Clone,
|
||||
F: FnOnce(Self::Output, ConnectedPoint) -> O,
|
||||
{
|
||||
map::Map::new(self, f)
|
||||
}
|
||||
@ -169,7 +174,7 @@ pub trait Transport {
|
||||
fn map_err<F, E>(self, f: F) -> map_err::MapErr<Self, F>
|
||||
where
|
||||
Self: Sized,
|
||||
F: FnOnce(Self::Error) -> E + Clone,
|
||||
F: FnOnce(Self::Error) -> E,
|
||||
{
|
||||
map_err::MapErr::new(self, f)
|
||||
}
|
||||
@ -198,7 +203,7 @@ pub trait Transport {
|
||||
fn and_then<C, F, O>(self, f: C) -> and_then::AndThen<Self, C>
|
||||
where
|
||||
Self: Sized,
|
||||
C: FnOnce(Self::Output, ConnectedPoint) -> F + Clone,
|
||||
C: FnOnce(Self::Output, ConnectedPoint) -> F,
|
||||
F: TryFuture<Ok = O>,
|
||||
<F as TryFuture>::Error: Error + 'static,
|
||||
{
|
||||
|
@ -53,7 +53,10 @@ where
|
||||
type ListenerUpgrade = AndThenFuture<T::ListenerUpgrade, C, F>;
|
||||
type Dial = AndThenFuture<T::Dial, C, F>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let listener = self
|
||||
.transport
|
||||
.listen_on(addr)
|
||||
@ -64,12 +67,12 @@ where
|
||||
// `stream` can only produce an `Err` if `listening_stream` produces an `Err`.
|
||||
let stream = AndThenStream {
|
||||
stream: listener,
|
||||
fun: self.fun,
|
||||
fun: self.fun.clone(),
|
||||
};
|
||||
Ok(stream)
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let dialed_fut = self
|
||||
.transport
|
||||
.dial(addr.clone())
|
||||
@ -77,7 +80,7 @@ where
|
||||
let future = AndThenFuture {
|
||||
inner: Either::Left(Box::pin(dialed_fut)),
|
||||
args: Some((
|
||||
self.fun,
|
||||
self.fun.clone(),
|
||||
ConnectedPoint::Dialer {
|
||||
address: addr,
|
||||
role_override: Endpoint::Dialer,
|
||||
@ -88,7 +91,10 @@ where
|
||||
Ok(future)
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let dialed_fut = self
|
||||
.transport
|
||||
.dial_as_listener(addr.clone())
|
||||
@ -96,7 +102,7 @@ where
|
||||
let future = AndThenFuture {
|
||||
inner: Either::Left(Box::pin(dialed_fut)),
|
||||
args: Some((
|
||||
self.fun,
|
||||
self.fun.clone(),
|
||||
ConnectedPoint::Dialer {
|
||||
address: addr,
|
||||
role_override: Endpoint::Listener,
|
||||
|
@ -21,19 +21,19 @@
|
||||
use crate::transport::{ListenerEvent, Transport, TransportError};
|
||||
use futures::prelude::*;
|
||||
use multiaddr::Multiaddr;
|
||||
use std::{error::Error, fmt, io, pin::Pin, sync::Arc};
|
||||
use std::{error::Error, fmt, io, pin::Pin};
|
||||
|
||||
/// Creates a new [`Boxed`] transport from the given transport.
|
||||
pub fn boxed<T>(transport: T) -> Boxed<T::Output>
|
||||
where
|
||||
T: Transport + Clone + Send + Sync + 'static,
|
||||
T: Transport + Send + Sync + 'static,
|
||||
T::Error: Send + Sync,
|
||||
T::Dial: Send + 'static,
|
||||
T::Listener: Send + 'static,
|
||||
T::ListenerUpgrade: Send + 'static,
|
||||
{
|
||||
Boxed {
|
||||
inner: Arc::new(transport) as Arc<_>,
|
||||
inner: Box::new(transport) as Box<_>,
|
||||
}
|
||||
}
|
||||
|
||||
@ -41,7 +41,7 @@ where
|
||||
/// and `ListenerUpgrade` futures are `Box`ed and only the `Output`
|
||||
/// and `Error` types are captured in type variables.
|
||||
pub struct Boxed<O> {
|
||||
inner: Arc<dyn Abstract<O> + Send + Sync>,
|
||||
inner: Box<dyn Abstract<O> + Send + Sync>,
|
||||
}
|
||||
|
||||
type Dial<O> = Pin<Box<dyn Future<Output = io::Result<O>> + Send>>;
|
||||
@ -50,22 +50,22 @@ type Listener<O> =
|
||||
type ListenerUpgrade<O> = Pin<Box<dyn Future<Output = io::Result<O>> + Send>>;
|
||||
|
||||
trait Abstract<O> {
|
||||
fn listen_on(&self, addr: Multiaddr) -> Result<Listener<O>, TransportError<io::Error>>;
|
||||
fn dial(&self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>>;
|
||||
fn dial_as_listener(&self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>>;
|
||||
fn listen_on(&mut self, addr: Multiaddr) -> Result<Listener<O>, TransportError<io::Error>>;
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>>;
|
||||
fn dial_as_listener(&mut self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>>;
|
||||
fn address_translation(&self, server: &Multiaddr, observed: &Multiaddr) -> Option<Multiaddr>;
|
||||
}
|
||||
|
||||
impl<T, O> Abstract<O> for T
|
||||
where
|
||||
T: Transport<Output = O> + Clone + 'static,
|
||||
T: Transport<Output = O> + 'static,
|
||||
T::Error: Send + Sync,
|
||||
T::Dial: Send + 'static,
|
||||
T::Listener: Send + 'static,
|
||||
T::ListenerUpgrade: Send + 'static,
|
||||
{
|
||||
fn listen_on(&self, addr: Multiaddr) -> Result<Listener<O>, TransportError<io::Error>> {
|
||||
let listener = Transport::listen_on(self.clone(), addr).map_err(|e| e.map(box_err))?;
|
||||
fn listen_on(&mut self, addr: Multiaddr) -> Result<Listener<O>, TransportError<io::Error>> {
|
||||
let listener = Transport::listen_on(self, addr).map_err(|e| e.map(box_err))?;
|
||||
let fut = listener
|
||||
.map_ok(|event| {
|
||||
event
|
||||
@ -79,15 +79,15 @@ where
|
||||
Ok(Box::pin(fut))
|
||||
}
|
||||
|
||||
fn dial(&self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>> {
|
||||
let fut = Transport::dial(self.clone(), addr)
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>> {
|
||||
let fut = Transport::dial(self, addr)
|
||||
.map(|r| r.map_err(box_err))
|
||||
.map_err(|e| e.map(box_err))?;
|
||||
Ok(Box::pin(fut) as Dial<_>)
|
||||
}
|
||||
|
||||
fn dial_as_listener(&self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>> {
|
||||
let fut = Transport::dial_as_listener(self.clone(), addr)
|
||||
fn dial_as_listener(&mut self, addr: Multiaddr) -> Result<Dial<O>, TransportError<io::Error>> {
|
||||
let fut = Transport::dial_as_listener(self, addr)
|
||||
.map(|r| r.map_err(box_err))
|
||||
.map_err(|e| e.map(box_err))?;
|
||||
Ok(Box::pin(fut) as Dial<_>)
|
||||
@ -104,14 +104,6 @@ impl<O> fmt::Debug for Boxed<O> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<O> Clone for Boxed<O> {
|
||||
fn clone(&self) -> Self {
|
||||
Boxed {
|
||||
inner: self.inner.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<O> Transport for Boxed<O> {
|
||||
type Output = O;
|
||||
type Error = io::Error;
|
||||
@ -119,15 +111,21 @@ impl<O> Transport for Boxed<O> {
|
||||
type ListenerUpgrade = ListenerUpgrade<O>;
|
||||
type Dial = Dial<O>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
self.inner.listen_on(addr)
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
self.inner.dial(addr)
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
self.inner.dial_as_listener(addr)
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,10 @@ where
|
||||
type ListenerUpgrade = EitherFuture<A::ListenerUpgrade, B::ListenerUpgrade>;
|
||||
type Dial = EitherFuture<A::Dial, B::Dial>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let addr = match self.0.listen_on(addr) {
|
||||
Ok(listener) => return Ok(EitherListenStream::First(listener)),
|
||||
Err(TransportError::MultiaddrNotSupported(addr)) => addr,
|
||||
@ -63,7 +66,7 @@ where
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let addr = match self.0.dial(addr) {
|
||||
Ok(connec) => return Ok(EitherFuture::First(connec)),
|
||||
Err(TransportError::MultiaddrNotSupported(addr)) => addr,
|
||||
@ -83,7 +86,10 @@ where
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let addr = match self.0.dial_as_listener(addr) {
|
||||
Ok(connec) => return Ok(EitherFuture::First(connec)),
|
||||
Err(TransportError::MultiaddrNotSupported(addr)) => addr,
|
||||
|
@ -62,15 +62,21 @@ impl<TOut> Transport for DummyTransport<TOut> {
|
||||
type ListenerUpgrade = futures::future::Pending<Result<Self::Output, io::Error>>;
|
||||
type Dial = futures::future::Pending<Result<Self::Output, io::Error>>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,14 @@ impl<T, F> Map<T, F> {
|
||||
pub(crate) fn new(transport: T, fun: F) -> Self {
|
||||
Map { transport, fun }
|
||||
}
|
||||
|
||||
pub fn inner(&self) -> &T {
|
||||
&self.transport
|
||||
}
|
||||
|
||||
pub fn inner_mut(&mut self) -> &mut T {
|
||||
&mut self.transport
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, F, D> Transport for Map<T, F>
|
||||
@ -50,15 +58,18 @@ where
|
||||
type ListenerUpgrade = MapFuture<T::ListenerUpgrade, F>;
|
||||
type Dial = MapFuture<T::Dial, F>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let stream = self.transport.listen_on(addr)?;
|
||||
Ok(MapStream {
|
||||
stream,
|
||||
fun: self.fun,
|
||||
fun: self.fun.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let future = self.transport.dial(addr.clone())?;
|
||||
let p = ConnectedPoint::Dialer {
|
||||
address: addr,
|
||||
@ -66,11 +77,14 @@ where
|
||||
};
|
||||
Ok(MapFuture {
|
||||
inner: future,
|
||||
args: Some((self.fun, p)),
|
||||
args: Some((self.fun.clone(), p)),
|
||||
})
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let future = self.transport.dial_as_listener(addr.clone())?;
|
||||
let p = ConnectedPoint::Dialer {
|
||||
address: addr,
|
||||
@ -78,7 +92,7 @@ where
|
||||
};
|
||||
Ok(MapFuture {
|
||||
inner: future,
|
||||
args: Some((self.fun, p)),
|
||||
args: Some((self.fun.clone(), p)),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -49,16 +49,19 @@ where
|
||||
type ListenerUpgrade = MapErrListenerUpgrade<T, F>;
|
||||
type Dial = MapErrDial<T, F>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let map = self.map;
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let map = self.map.clone();
|
||||
match self.transport.listen_on(addr) {
|
||||
Ok(stream) => Ok(MapErrListener { inner: stream, map }),
|
||||
Err(err) => Err(err.map(map)),
|
||||
}
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let map = self.map;
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let map = self.map.clone();
|
||||
match self.transport.dial(addr) {
|
||||
Ok(future) => Ok(MapErrDial {
|
||||
inner: future,
|
||||
@ -68,8 +71,11 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let map = self.map;
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let map = self.map.clone();
|
||||
match self.transport.dial_as_listener(addr) {
|
||||
Ok(future) => Ok(MapErrDial {
|
||||
inner: future,
|
||||
|
@ -169,7 +169,10 @@ impl Transport for MemoryTransport {
|
||||
type ListenerUpgrade = Ready<Result<Self::Output, Self::Error>>;
|
||||
type Dial = DialFuture;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let port = if let Ok(port) = parse_memory_addr(&addr) {
|
||||
port
|
||||
} else {
|
||||
@ -191,7 +194,7 @@ impl Transport for MemoryTransport {
|
||||
Ok(listener)
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<DialFuture, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<DialFuture, TransportError<Self::Error>> {
|
||||
let port = if let Ok(port) = parse_memory_addr(&addr) {
|
||||
if let Some(port) = NonZeroU64::new(port) {
|
||||
port
|
||||
@ -205,7 +208,10 @@ impl Transport for MemoryTransport {
|
||||
DialFuture::new(port).ok_or(TransportError::Other(MemoryTransportError::Unreachable))
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<DialFuture, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<DialFuture, TransportError<Self::Error>> {
|
||||
self.dial(addr)
|
||||
}
|
||||
|
||||
@ -408,7 +414,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn listening_twice() {
|
||||
let transport = MemoryTransport::default();
|
||||
let mut transport = MemoryTransport::default();
|
||||
assert!(transport
|
||||
.listen_on("/memory/1639174018481".parse().unwrap())
|
||||
.is_ok());
|
||||
@ -435,7 +441,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn port_not_in_use() {
|
||||
let transport = MemoryTransport::default();
|
||||
let mut transport = MemoryTransport::default();
|
||||
assert!(transport
|
||||
.dial("/memory/810172461024613".parse().unwrap())
|
||||
.is_err());
|
||||
@ -457,7 +463,7 @@ mod tests {
|
||||
let t1_addr: Multiaddr = format!("/memory/{}", rand_port).parse().unwrap();
|
||||
let cloned_t1_addr = t1_addr.clone();
|
||||
|
||||
let t1 = MemoryTransport::default();
|
||||
let mut t1 = MemoryTransport::default();
|
||||
|
||||
let listener = async move {
|
||||
let listener = t1.listen_on(t1_addr.clone()).unwrap();
|
||||
@ -478,7 +484,7 @@ mod tests {
|
||||
|
||||
// Setup dialer.
|
||||
|
||||
let t2 = MemoryTransport::default();
|
||||
let mut t2 = MemoryTransport::default();
|
||||
let dialer = async move {
|
||||
let mut socket = t2.dial(cloned_t1_addr).unwrap().await.unwrap();
|
||||
socket.write_all(&msg).await.unwrap();
|
||||
@ -495,7 +501,7 @@ mod tests {
|
||||
Protocol::Memory(rand::random::<u64>().saturating_add(1)).into();
|
||||
let listener_addr_cloned = listener_addr.clone();
|
||||
|
||||
let listener_transport = MemoryTransport::default();
|
||||
let mut listener_transport = MemoryTransport::default();
|
||||
|
||||
let listener = async move {
|
||||
let mut listener = listener_transport.listen_on(listener_addr.clone()).unwrap();
|
||||
@ -530,7 +536,7 @@ mod tests {
|
||||
Protocol::Memory(rand::random::<u64>().saturating_add(1)).into();
|
||||
let listener_addr_cloned = listener_addr.clone();
|
||||
|
||||
let listener_transport = MemoryTransport::default();
|
||||
let mut listener_transport = MemoryTransport::default();
|
||||
|
||||
let listener = async move {
|
||||
let mut listener = listener_transport.listen_on(listener_addr.clone()).unwrap();
|
||||
|
@ -59,24 +59,30 @@ where
|
||||
type ListenerUpgrade = T::ListenerUpgrade;
|
||||
type Dial = T::Dial;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
if let Some(inner) = self.0 {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
if let Some(inner) = self.0.as_mut() {
|
||||
inner.listen_on(addr)
|
||||
} else {
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
if let Some(inner) = self.0 {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
if let Some(inner) = self.0.as_mut() {
|
||||
inner.dial(addr)
|
||||
} else {
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
if let Some(inner) = self.0 {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
if let Some(inner) = self.0.as_mut() {
|
||||
inner.dial_as_listener(addr)
|
||||
} else {
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
|
@ -84,7 +84,10 @@ where
|
||||
type ListenerUpgrade = Timeout<InnerTrans::ListenerUpgrade>;
|
||||
type Dial = Timeout<InnerTrans::Dial>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let listener = self
|
||||
.inner
|
||||
.listen_on(addr)
|
||||
@ -98,7 +101,7 @@ where
|
||||
Ok(listener)
|
||||
}
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let dial = self
|
||||
.inner
|
||||
.dial(addr)
|
||||
@ -109,7 +112,10 @@ where
|
||||
})
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let dial = self
|
||||
.inner
|
||||
.dial_as_listener(addr)
|
||||
|
@ -294,7 +294,7 @@ impl<T> Multiplexed<T> {
|
||||
/// the [`StreamMuxer`] and custom transport errors.
|
||||
pub fn boxed<M>(self) -> super::Boxed<(PeerId, StreamMuxerBox)>
|
||||
where
|
||||
T: Transport<Output = (PeerId, M)> + Sized + Clone + Send + Sync + 'static,
|
||||
T: Transport<Output = (PeerId, M)> + Sized + Send + Sync + 'static,
|
||||
T::Dial: Send + 'static,
|
||||
T::Listener: Send + 'static,
|
||||
T::ListenerUpgrade: Send + 'static,
|
||||
@ -335,15 +335,21 @@ where
|
||||
type ListenerUpgrade = T::ListenerUpgrade;
|
||||
type Dial = T::Dial;
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
self.0.dial(addr)
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
self.0.dial_as_listener(addr)
|
||||
}
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
self.0.listen_on(addr)
|
||||
}
|
||||
|
||||
@ -385,36 +391,42 @@ where
|
||||
type ListenerUpgrade = ListenerUpgradeFuture<T::ListenerUpgrade, U, C>;
|
||||
type Dial = DialUpgradeFuture<T::Dial, U, C>;
|
||||
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let future = self
|
||||
.inner
|
||||
.dial(addr)
|
||||
.map_err(|err| err.map(TransportUpgradeError::Transport))?;
|
||||
Ok(DialUpgradeFuture {
|
||||
future: Box::pin(future),
|
||||
upgrade: future::Either::Left(Some(self.upgrade)),
|
||||
upgrade: future::Either::Left(Some(self.upgrade.clone())),
|
||||
})
|
||||
}
|
||||
|
||||
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
fn dial_as_listener(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
let future = self
|
||||
.inner
|
||||
.dial_as_listener(addr)
|
||||
.map_err(|err| err.map(TransportUpgradeError::Transport))?;
|
||||
Ok(DialUpgradeFuture {
|
||||
future: Box::pin(future),
|
||||
upgrade: future::Either::Left(Some(self.upgrade)),
|
||||
upgrade: future::Either::Left(Some(self.upgrade.clone())),
|
||||
})
|
||||
}
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
fn listen_on(
|
||||
&mut self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Self::Listener, TransportError<Self::Error>> {
|
||||
let stream = self
|
||||
.inner
|
||||
.listen_on(addr)
|
||||
.map_err(|err| err.map(TransportUpgradeError::Transport))?;
|
||||
Ok(ListenerStream {
|
||||
stream: Box::pin(stream),
|
||||
upgrade: self.upgrade,
|
||||
upgrade: self.upgrade.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user