mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-30 02:01:35 +00:00
Implement Send everywhere (#458)
This commit is contained in:
@ -129,7 +129,7 @@ enum PeerState<D, M> where M: StreamMuxer {
|
||||
// TODO: stronger Future type
|
||||
Pending {
|
||||
/// Future that produces the muxer.
|
||||
future: Box<Future<Item = ((D, M), Multiaddr), Error = IoError>>,
|
||||
future: Box<Future<Item = ((D, M), Multiaddr), Error = IoError> + Send>,
|
||||
/// All the tasks to notify when `future` resolves.
|
||||
notify: FnvHashMap<usize, task::Task>,
|
||||
},
|
||||
@ -164,15 +164,19 @@ where
|
||||
|
||||
impl<T, D, M> Transport for ConnectionReuse<T, D, M>
|
||||
where
|
||||
T: Transport + 'static, // TODO: 'static :(
|
||||
T: Transport + Send + 'static, // TODO: 'static :(
|
||||
T::Dial: Send,
|
||||
T::MultiaddrFuture: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T: Transport<Output = (D, M)> + Clone + 'static, // TODO: 'static :(
|
||||
M: StreamMuxer + 'static,
|
||||
D: Clone + 'static,
|
||||
M: Send + Sync + StreamMuxer + 'static,
|
||||
D: Send + Clone + 'static,
|
||||
T: Clone,
|
||||
{
|
||||
type Output = (D, ConnectionReuseSubstream<T, D, M>);
|
||||
type MultiaddrFuture = future::FutureResult<Multiaddr, IoError>;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError>>;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError> + Send>;
|
||||
type ListenerUpgrade = FutureResult<(Self::Output, Self::MultiaddrFuture), IoError>;
|
||||
type Dial = ConnectionReuseDial<T, D, M>;
|
||||
|
||||
@ -245,10 +249,14 @@ where
|
||||
|
||||
impl<T, D, M> MuxedTransport for ConnectionReuse<T, D, M>
|
||||
where
|
||||
T: Transport + 'static, // TODO: 'static :(
|
||||
T: Transport + Send + 'static, // TODO: 'static :(
|
||||
T::Dial: Send,
|
||||
T::MultiaddrFuture: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T: Transport<Output = (D, M)> + Clone + 'static, // TODO: 'static :(
|
||||
M: StreamMuxer + 'static,
|
||||
D: Clone + 'static,
|
||||
M: Send + Sync + StreamMuxer + 'static,
|
||||
D: Send + Clone + 'static,
|
||||
T: Clone,
|
||||
{
|
||||
type Incoming = ConnectionReuseIncoming<T, D, M>;
|
||||
@ -305,10 +313,10 @@ where
|
||||
impl<T, D, M> Future for ConnectionReuseDial<T, D, M>
|
||||
where
|
||||
T: Transport<Output = (D, M)> + Clone,
|
||||
M: StreamMuxer + 'static,
|
||||
D: Clone + 'static,
|
||||
<T as Transport>::Dial: 'static,
|
||||
<T as Transport>::MultiaddrFuture: 'static,
|
||||
M: Send + StreamMuxer + 'static,
|
||||
D: Send + Clone + 'static,
|
||||
<T as Transport>::Dial: Send + 'static,
|
||||
<T as Transport>::MultiaddrFuture: Send + 'static,
|
||||
{
|
||||
type Item = ((D, ConnectionReuseSubstream<T, D, M>), FutureResult<Multiaddr, IoError>);
|
||||
type Error = IoError;
|
||||
@ -471,7 +479,7 @@ where
|
||||
/// Identifier for this listener. Used to determine which connections were opened by it.
|
||||
listener_id: u64,
|
||||
/// Opened connections that need to be upgraded.
|
||||
current_upgrades: FuturesUnordered<Box<Future<Item = (T::Output, Multiaddr), Error = IoError>>>,
|
||||
current_upgrades: FuturesUnordered<Box<Future<Item = (T::Output, Multiaddr), Error = IoError> + Send>>,
|
||||
|
||||
/// Shared between the whole connection reuse mechanism.
|
||||
shared: Arc<Mutex<Shared<T, D, M>>>,
|
||||
@ -484,7 +492,7 @@ where
|
||||
M: StreamMuxer,
|
||||
D: Clone,
|
||||
L: Stream<Item = Lu, Error = IoError>,
|
||||
Lu: Future<Item = (T::Output, Multiaddr), Error = IoError> + 'static,
|
||||
Lu: Future<Item = (T::Output, Multiaddr), Error = IoError> + Send + 'static,
|
||||
{
|
||||
type Item = FutureResult<((D, ConnectionReuseSubstream<T, D, M>), FutureResult<Multiaddr, IoError>), IoError>;
|
||||
type Error = IoError;
|
||||
|
@ -41,7 +41,7 @@ pub fn swarm<T, H, F>(
|
||||
) -> (SwarmController<T, F::Future>, SwarmEvents<T, F::Future, H>)
|
||||
where
|
||||
T: MuxedTransport + Clone + 'static, // TODO: 'static :-/
|
||||
H: FnMut(T::Output, Box<Future<Item = Multiaddr, Error = IoError>>) -> F,
|
||||
H: FnMut(T::Output, Box<Future<Item = Multiaddr, Error = IoError> + Send>) -> F,
|
||||
F: IntoFuture<Item = (), Error = IoError>,
|
||||
{
|
||||
let shared = Arc::new(Mutex::new(Shared {
|
||||
@ -105,6 +105,11 @@ where
|
||||
impl<T, F> SwarmController<T, F>
|
||||
where
|
||||
T: MuxedTransport + Clone + 'static, // TODO: 'static :-/
|
||||
T::Dial: Send,
|
||||
T::MultiaddrFuture: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T::Output: Send,
|
||||
F: 'static,
|
||||
{
|
||||
/// Asks the swarm to dial the node with the given multiaddress. The connection is then
|
||||
@ -119,6 +124,8 @@ where
|
||||
-> Result<impl Future<Item = (), Error = IoError>, Multiaddr>
|
||||
where
|
||||
Du: Transport + 'static, // TODO: 'static :-/
|
||||
Du::Dial: Send,
|
||||
Du::MultiaddrFuture: Send,
|
||||
Du::Output: Into<T::Output>,
|
||||
{
|
||||
self.dial_then(multiaddr, transport, |v| v)
|
||||
@ -132,8 +139,10 @@ where
|
||||
-> Result<impl Future<Item = (), Error = IoError>, Multiaddr>
|
||||
where
|
||||
Du: Transport + 'static, // TODO: 'static :-/
|
||||
Du::Dial: Send,
|
||||
Du::MultiaddrFuture: Send,
|
||||
Du::Output: Into<T::Output>,
|
||||
TThen: FnOnce(Result<(), IoError>) -> Result<(), IoError> + 'static,
|
||||
TThen: FnOnce(Result<(), IoError>) -> Result<(), IoError> + Send + 'static,
|
||||
{
|
||||
trace!("Swarm dialing {}", multiaddr);
|
||||
|
||||
@ -148,12 +157,12 @@ where
|
||||
let mut then = Box::new(move |val: Result<(), IoError>| {
|
||||
let then = then.take().expect("The Boxed FnMut should only be called once");
|
||||
then(val);
|
||||
}) as Box<FnMut(_)>;
|
||||
}) as Box<FnMut(_) + Send>;
|
||||
|
||||
let dial = dial.then(|result| {
|
||||
match result {
|
||||
Ok((output, client_addr)) => {
|
||||
let client_addr = Box::new(client_addr) as Box<Future<Item = _, Error = _>>;
|
||||
let client_addr = Box::new(client_addr) as Box<Future<Item = _, Error = _> + Send>;
|
||||
Ok((output.into(), then, client_addr))
|
||||
}
|
||||
Err(err) => {
|
||||
@ -206,12 +215,12 @@ where
|
||||
let listener = Box::new(
|
||||
listener.map(|f| {
|
||||
let f = f.map(|(out, maf)| {
|
||||
(out, Box::new(maf) as Box<Future<Item = Multiaddr, Error = IoError>>)
|
||||
(out, Box::new(maf) as Box<Future<Item = Multiaddr, Error = IoError> + Send>)
|
||||
});
|
||||
|
||||
Box::new(f) as Box<Future<Item = _, Error = _>>
|
||||
Box::new(f) as Box<Future<Item = _, Error = _> + Send>
|
||||
}),
|
||||
) as Box<Stream<Item = _, Error = _>>;
|
||||
) as Box<Stream<Item = _, Error = _> + Send>;
|
||||
shared.listeners.push((new_addr.clone(), listener.into_future()));
|
||||
if let Some(task) = shared.task_to_notify.take() {
|
||||
task.notify();
|
||||
@ -242,7 +251,9 @@ where
|
||||
impl<T, H, If, F> Stream for SwarmEvents<T, F, H>
|
||||
where
|
||||
T: MuxedTransport + Clone + 'static, // TODO: 'static :-/,
|
||||
H: FnMut(T::Output, Box<Future<Item = Multiaddr, Error = IoError>>) -> If,
|
||||
T::MultiaddrFuture: Send,
|
||||
T::IncomingUpgrade: Send,
|
||||
H: FnMut(T::Output, Box<Future<Item = Multiaddr, Error = IoError> + Send>) -> If,
|
||||
If: IntoFuture<Future = F, Item = (), Error = IoError>,
|
||||
F: Future<Item = (), Error = IoError> + 'static, // TODO: 'static :-/
|
||||
{
|
||||
@ -259,7 +270,7 @@ where
|
||||
debug!("Swarm received new multiplexed incoming connection");
|
||||
shared.next_incoming = self.transport.clone().next_incoming();
|
||||
let connec = connec.map(|(out, maf)| {
|
||||
(out, Box::new(maf) as Box<Future<Item = Multiaddr, Error = IoError>>)
|
||||
(out, Box::new(maf) as Box<Future<Item = Multiaddr, Error = IoError> + Send>)
|
||||
});
|
||||
shared.listeners_upgrade.push(Box::new(connec) as Box<_>);
|
||||
}
|
||||
@ -393,21 +404,21 @@ struct Shared<T, F> where T: MuxedTransport + 'static {
|
||||
StreamFuture<
|
||||
Box<
|
||||
Stream<
|
||||
Item = Box<Future<Item = (T::Output, Box<Future<Item = Multiaddr, Error = IoError>>), Error = IoError>>,
|
||||
Item = Box<Future<Item = (T::Output, Box<Future<Item = Multiaddr, Error = IoError> + Send>), Error = IoError> + Send>,
|
||||
Error = IoError,
|
||||
>,
|
||||
> + Send,
|
||||
>,
|
||||
>,
|
||||
)>,
|
||||
|
||||
/// Futures that upgrade an incoming listening connection to a full connection.
|
||||
listeners_upgrade:
|
||||
Vec<Box<Future<Item = (T::Output, Box<Future<Item = Multiaddr, Error = IoError>>), Error = IoError>>>,
|
||||
Vec<Box<Future<Item = (T::Output, Box<Future<Item = Multiaddr, Error = IoError> + Send>), Error = IoError> + Send>>,
|
||||
|
||||
/// Futures that dial a remote address.
|
||||
///
|
||||
/// Contains the address we dial, so that we can cancel it if necessary.
|
||||
dialers: Vec<(Multiaddr, Box<Future<Item = (T::Output, Box<FnMut(Result<(), IoError>)>, Box<Future<Item = Multiaddr, Error = IoError>>), Error = IoError>>)>,
|
||||
dialers: Vec<(Multiaddr, Box<Future<Item = (T::Output, Box<FnMut(Result<(), IoError>) + Send>, Box<Future<Item = Multiaddr, Error = IoError> + Send>), Error = IoError> + Send>)>,
|
||||
|
||||
/// List of futures produced by the swarm closure. Must be processed to the end.
|
||||
to_process: Vec<F>,
|
||||
|
@ -40,15 +40,18 @@ pub struct AndThen<T, C> {
|
||||
impl<T, C, F, O, Maf> Transport for AndThen<T, C>
|
||||
where
|
||||
T: Transport + 'static,
|
||||
C: FnOnce(T::Output, Endpoint, T::MultiaddrFuture) -> F + Clone + 'static,
|
||||
F: Future<Item = (O, Maf), Error = IoError> + 'static,
|
||||
T::Dial: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
C: FnOnce(T::Output, Endpoint, T::MultiaddrFuture) -> F + Clone + Send + 'static,
|
||||
F: Future<Item = (O, Maf), Error = IoError> + Send + 'static,
|
||||
Maf: Future<Item = Multiaddr, Error = IoError> + 'static,
|
||||
{
|
||||
type Output = O;
|
||||
type MultiaddrFuture = Maf;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError>>;
|
||||
type ListenerUpgrade = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Dial = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError> + Send>;
|
||||
type ListenerUpgrade = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
type Dial = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
#[inline]
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), (Self, Multiaddr)> {
|
||||
@ -116,12 +119,17 @@ where
|
||||
impl<T, C, F, O, Maf> MuxedTransport for AndThen<T, C>
|
||||
where
|
||||
T: MuxedTransport + 'static,
|
||||
C: FnOnce(T::Output, Endpoint, T::MultiaddrFuture) -> F + Clone + 'static,
|
||||
F: Future<Item = (O, Maf), Error = IoError> + 'static,
|
||||
T::Dial: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T::Incoming: Send,
|
||||
T::IncomingUpgrade: Send,
|
||||
C: FnOnce(T::Output, Endpoint, T::MultiaddrFuture) -> F + Clone + Send + 'static,
|
||||
F: Future<Item = (O, Maf), Error = IoError> + Send + 'static,
|
||||
Maf: Future<Item = Multiaddr, Error = IoError> + 'static,
|
||||
{
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError>>;
|
||||
type IncomingUpgrade = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError> + Send>;
|
||||
type IncomingUpgrade = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
#[inline]
|
||||
fn next_incoming(self) -> Self::Incoming {
|
||||
@ -134,7 +142,7 @@ where
|
||||
upgrade(connection, Endpoint::Listener, client_addr)
|
||||
});
|
||||
|
||||
Box::new(future) as Box<Future<Item = _, Error = _>>
|
||||
Box::new(future) as Box<Future<Item = _, Error = _> + Send>
|
||||
});
|
||||
|
||||
Box::new(future) as Box<_>
|
||||
|
@ -85,26 +85,26 @@ impl<A, B> MuxedTransport for OrTransport<A, B>
|
||||
where
|
||||
A: MuxedTransport,
|
||||
B: MuxedTransport,
|
||||
A::Incoming: 'static, // TODO: meh :-/
|
||||
B::Incoming: 'static, // TODO: meh :-/
|
||||
A::IncomingUpgrade: 'static, // TODO: meh :-/
|
||||
B::IncomingUpgrade: 'static, // TODO: meh :-/
|
||||
A::Incoming: Send + 'static, // TODO: meh :-/
|
||||
B::Incoming: Send + 'static, // TODO: meh :-/
|
||||
A::IncomingUpgrade: Send + 'static, // TODO: meh :-/
|
||||
B::IncomingUpgrade: Send + 'static, // TODO: meh :-/
|
||||
A::Output: 'static, // TODO: meh :-/
|
||||
B::Output: 'static, // TODO: meh :-/
|
||||
{
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError>>;
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError> + Send>;
|
||||
type IncomingUpgrade =
|
||||
Box<Future<Item = (EitherOutput<A::Output, B::Output>, Self::MultiaddrFuture), Error = IoError>>;
|
||||
Box<Future<Item = (EitherOutput<A::Output, B::Output>, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
#[inline]
|
||||
fn next_incoming(self) -> Self::Incoming {
|
||||
let first = self.0.next_incoming().map(|out| {
|
||||
let fut = out.map(move |(v, addr)| (EitherOutput::First(v), future::Either::A(addr)));
|
||||
Box::new(fut) as Box<Future<Item = _, Error = _>>
|
||||
Box::new(fut) as Box<Future<Item = _, Error = _> + Send>
|
||||
});
|
||||
let second = self.1.next_incoming().map(|out| {
|
||||
let fut = out.map(move |(v, addr)| (EitherOutput::Second(v), future::Either::B(addr)));
|
||||
Box::new(fut) as Box<Future<Item = _, Error = _>>
|
||||
Box::new(fut) as Box<Future<Item = _, Error = _> + Send>
|
||||
});
|
||||
let future = first.select(second).map(|(i, _)| i).map_err(|(e, _)| e);
|
||||
Box::new(future) as Box<_>
|
||||
|
@ -42,13 +42,16 @@ impl<T, F> Map<T, F> {
|
||||
impl<T, F, D> Transport for Map<T, F>
|
||||
where
|
||||
T: Transport + 'static, // TODO: 'static :-/
|
||||
F: FnOnce(T::Output, Endpoint) -> D + Clone + 'static, // TODO: 'static :-/
|
||||
T::Dial: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
F: FnOnce(T::Output, Endpoint) -> D + Clone + Send + 'static, // TODO: 'static :-/
|
||||
{
|
||||
type Output = D;
|
||||
type MultiaddrFuture = T::MultiaddrFuture;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError>>;
|
||||
type ListenerUpgrade = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Dial = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError> + Send>;
|
||||
type ListenerUpgrade = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
type Dial = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), (Self, Multiaddr)> {
|
||||
let map = self.map;
|
||||
@ -91,10 +94,15 @@ where
|
||||
impl<T, F, D> MuxedTransport for Map<T, F>
|
||||
where
|
||||
T: MuxedTransport + 'static, // TODO: 'static :-/
|
||||
F: FnOnce(T::Output, Endpoint) -> D + Clone + 'static, // TODO: 'static :-/
|
||||
T::Dial: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T::Incoming: Send,
|
||||
T::IncomingUpgrade: Send,
|
||||
F: FnOnce(T::Output, Endpoint) -> D + Clone + Send + 'static, // TODO: 'static :-/
|
||||
{
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError>>;
|
||||
type IncomingUpgrade = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError> + Send>;
|
||||
type IncomingUpgrade = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
fn next_incoming(self) -> Self::Incoming {
|
||||
let map = self.map;
|
||||
|
@ -41,13 +41,14 @@ impl<T, F> MapErrDial<T, F> {
|
||||
impl<T, F> Transport for MapErrDial<T, F>
|
||||
where
|
||||
T: Transport + 'static, // TODO: 'static :-/
|
||||
F: FnOnce(IoError, Multiaddr) -> IoError + Clone + 'static, // TODO: 'static :-/
|
||||
T::Dial: Send,
|
||||
F: FnOnce(IoError, Multiaddr) -> IoError + Clone + Send + 'static, // TODO: 'static :-/
|
||||
{
|
||||
type Output = T::Output;
|
||||
type MultiaddrFuture = T::MultiaddrFuture;
|
||||
type Listener = T::Listener;
|
||||
type ListenerUpgrade = T::ListenerUpgrade;
|
||||
type Dial = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Dial = Box<Future<Item = (Self::Output, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), (Self, Multiaddr)> {
|
||||
match self.transport.listen_on(addr) {
|
||||
@ -77,7 +78,8 @@ where
|
||||
impl<T, F> MuxedTransport for MapErrDial<T, F>
|
||||
where
|
||||
T: MuxedTransport + 'static, // TODO: 'static :-/
|
||||
F: FnOnce(IoError, Multiaddr) -> IoError + Clone + 'static, // TODO: 'static :-/
|
||||
T::Dial: Send,
|
||||
F: FnOnce(IoError, Multiaddr) -> IoError + Clone + Send + 'static, // TODO: 'static :-/
|
||||
{
|
||||
type Incoming = T::Incoming;
|
||||
type IncomingUpgrade = T::IncomingUpgrade;
|
||||
|
@ -50,12 +50,12 @@ impl<T> Clone for Dialer<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: IntoBuf + 'static> Transport for Dialer<T> {
|
||||
impl<T: IntoBuf + Send + 'static> Transport for Dialer<T> {
|
||||
type Output = Channel<T>;
|
||||
type Listener = Box<Stream<Item=Self::ListenerUpgrade, Error=io::Error>>;
|
||||
type Listener = Box<Stream<Item=Self::ListenerUpgrade, Error=io::Error> + Send>;
|
||||
type ListenerUpgrade = FutureResult<(Self::Output, Self::MultiaddrFuture), io::Error>;
|
||||
type MultiaddrFuture = FutureResult<Multiaddr, io::Error>;
|
||||
type Dial = Box<Future<Item=(Self::Output, Self::MultiaddrFuture), Error=io::Error>>;
|
||||
type Dial = Box<Future<Item=(Self::Output, Self::MultiaddrFuture), Error=io::Error> + Send>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), (Self, Multiaddr)> {
|
||||
Err((self, addr))
|
||||
@ -93,12 +93,12 @@ impl<T> Clone for Listener<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: IntoBuf + 'static> Transport for Listener<T> {
|
||||
impl<T: IntoBuf + Send + 'static> Transport for Listener<T> {
|
||||
type Output = Channel<T>;
|
||||
type Listener = Box<Stream<Item=Self::ListenerUpgrade, Error=io::Error>>;
|
||||
type Listener = Box<Stream<Item=Self::ListenerUpgrade, Error=io::Error> + Send>;
|
||||
type ListenerUpgrade = FutureResult<(Self::Output, Self::MultiaddrFuture), io::Error>;
|
||||
type MultiaddrFuture = FutureResult<Multiaddr, io::Error>;
|
||||
type Dial = Box<Future<Item=(Self::Output, Self::MultiaddrFuture), Error=io::Error>>;
|
||||
type Dial = Box<Future<Item=(Self::Output, Self::MultiaddrFuture), Error=io::Error> + Send>;
|
||||
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), (Self, Multiaddr)> {
|
||||
if !is_memory_addr(&addr) {
|
||||
@ -200,12 +200,12 @@ mod tests {
|
||||
#[derive(Clone)]
|
||||
struct Echo(mpsc::UnboundedSender<()>);
|
||||
|
||||
impl<Maf: 'static> ConnectionUpgrade<memory::Channel<Bytes>, Maf> for Echo {
|
||||
impl<Maf: Send + 'static> ConnectionUpgrade<memory::Channel<Bytes>, Maf> for Echo {
|
||||
type NamesIter = iter::Once<(Bytes, ())>;
|
||||
type UpgradeIdentifier = ();
|
||||
type Output = ();
|
||||
type MultiaddrFuture = Maf;
|
||||
type Future = Box<Future<Item=(Self::Output, Self::MultiaddrFuture), Error=io::Error>>;
|
||||
type Future = Box<Future<Item=(Self::Output, Self::MultiaddrFuture), Error=io::Error> + Send>;
|
||||
|
||||
fn protocol_names(&self) -> Self::NamesIter {
|
||||
iter::once(("/echo/1.0.0".into(), ()))
|
||||
|
@ -47,8 +47,15 @@ impl<T, C> UpgradedNode<T, C> {
|
||||
impl<'a, T, C> UpgradedNode<T, C>
|
||||
where
|
||||
T: Transport + 'a,
|
||||
T::Output: AsyncRead + AsyncWrite,
|
||||
C: ConnectionUpgrade<T::Output, T::MultiaddrFuture> + 'a,
|
||||
T::Dial: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T::MultiaddrFuture: Send,
|
||||
T::Output: Send + AsyncRead + AsyncWrite,
|
||||
C: ConnectionUpgrade<T::Output, T::MultiaddrFuture> + Send + 'a,
|
||||
C::NamesIter: Send,
|
||||
C::Future: Send,
|
||||
C::UpgradeIdentifier: Send,
|
||||
{
|
||||
/// Returns a reference to the inner `Transport`.
|
||||
#[inline]
|
||||
@ -65,7 +72,7 @@ where
|
||||
pub fn dial(
|
||||
self,
|
||||
addr: Multiaddr,
|
||||
) -> Result<Box<Future<Item = (C::Output, C::MultiaddrFuture), Error = IoError> + 'a>, (Self, Multiaddr)>
|
||||
) -> Result<Box<Future<Item = (C::Output, C::MultiaddrFuture), Error = IoError> + Send + 'a>, (Self, Multiaddr)>
|
||||
where
|
||||
C::NamesIter: Clone, // TODO: not elegant
|
||||
{
|
||||
@ -101,13 +108,15 @@ where
|
||||
self,
|
||||
) -> Box<
|
||||
Future<
|
||||
Item = Box<Future<Item = (C::Output, C::MultiaddrFuture), Error = IoError> + 'a>,
|
||||
Item = Box<Future<Item = (C::Output, C::MultiaddrFuture), Error = IoError> + Send + 'a>,
|
||||
Error = IoError,
|
||||
>
|
||||
+ 'a,
|
||||
+ Send + 'a,
|
||||
>
|
||||
where
|
||||
T: MuxedTransport,
|
||||
T::Incoming: Send,
|
||||
T::IncomingUpgrade: Send,
|
||||
C::NamesIter: Clone, // TODO: not elegant
|
||||
C: Clone,
|
||||
{
|
||||
@ -119,7 +128,7 @@ where
|
||||
apply(connection, upgrade, Endpoint::Listener, client_addr)
|
||||
});
|
||||
|
||||
Box::new(future) as Box<Future<Item = _, Error = _>>
|
||||
Box::new(future) as Box<Future<Item = _, Error = _> + Send>
|
||||
});
|
||||
|
||||
Box::new(future) as Box<_>
|
||||
@ -138,9 +147,10 @@ where
|
||||
(
|
||||
Box<
|
||||
Stream<
|
||||
Item = Box<Future<Item = (C::Output, C::MultiaddrFuture), Error = IoError> + 'a>,
|
||||
Item = Box<Future<Item = (C::Output, C::MultiaddrFuture), Error = IoError> + Send + 'a>,
|
||||
Error = IoError,
|
||||
>
|
||||
+ Send
|
||||
+ 'a,
|
||||
>,
|
||||
Multiaddr,
|
||||
@ -187,17 +197,22 @@ where
|
||||
impl<T, C> Transport for UpgradedNode<T, C>
|
||||
where
|
||||
T: Transport + 'static,
|
||||
T::Output: AsyncRead + AsyncWrite,
|
||||
C: ConnectionUpgrade<T::Output, T::MultiaddrFuture> + 'static,
|
||||
T::Dial: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T::MultiaddrFuture: Send,
|
||||
T::Output: Send + AsyncRead + AsyncWrite,
|
||||
C: ConnectionUpgrade<T::Output, T::MultiaddrFuture> + Clone + Send + 'static,
|
||||
C::MultiaddrFuture: Future<Item = Multiaddr, Error = IoError>,
|
||||
C::NamesIter: Clone, // TODO: not elegant
|
||||
C: Clone,
|
||||
C::NamesIter: Clone + Send,
|
||||
C::Future: Send,
|
||||
C::UpgradeIdentifier: Send,
|
||||
{
|
||||
type Output = C::Output;
|
||||
type MultiaddrFuture = C::MultiaddrFuture;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError>>;
|
||||
type ListenerUpgrade = Box<Future<Item = (C::Output, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Dial = Box<Future<Item = (C::Output, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Listener = Box<Stream<Item = Self::ListenerUpgrade, Error = IoError> + Send>;
|
||||
type ListenerUpgrade = Box<Future<Item = (C::Output, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
type Dial = Box<Future<Item = (C::Output, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
#[inline]
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), (Self, Multiaddr)> {
|
||||
@ -218,14 +233,21 @@ where
|
||||
impl<T, C> MuxedTransport for UpgradedNode<T, C>
|
||||
where
|
||||
T: MuxedTransport + 'static,
|
||||
T::Output: AsyncRead + AsyncWrite,
|
||||
C: ConnectionUpgrade<T::Output, T::MultiaddrFuture> + 'static,
|
||||
T::Dial: Send,
|
||||
T::Listener: Send,
|
||||
T::ListenerUpgrade: Send,
|
||||
T::MultiaddrFuture: Send,
|
||||
T::Output: Send + AsyncRead + AsyncWrite,
|
||||
T::Incoming: Send,
|
||||
T::IncomingUpgrade: Send,
|
||||
C: ConnectionUpgrade<T::Output, T::MultiaddrFuture> + Clone + Send + 'static,
|
||||
C::MultiaddrFuture: Future<Item = Multiaddr, Error = IoError>,
|
||||
C::NamesIter: Clone, // TODO: not elegant
|
||||
C: Clone,
|
||||
C::NamesIter: Clone + Send,
|
||||
C::Future: Send,
|
||||
C::UpgradeIdentifier: Send,
|
||||
{
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError>>;
|
||||
type IncomingUpgrade = Box<Future<Item = (C::Output, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Incoming = Box<Future<Item = Self::IncomingUpgrade, Error = IoError> + Send>;
|
||||
type IncomingUpgrade = Box<Future<Item = (C::Output, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
#[inline]
|
||||
fn next_incoming(self) -> Self::Incoming {
|
||||
|
@ -101,10 +101,17 @@ impl<T> UniqueConnec<T> {
|
||||
#[inline]
|
||||
pub fn dial<S, F, Du>(&self, swarm: &SwarmController<S, F>, multiaddr: &Multiaddr,
|
||||
transport: Du) -> UniqueConnecFuture<T>
|
||||
where T: Clone + 'static, // TODO: 'static :-/
|
||||
where T: Clone + Send + 'static, // TODO: 'static :-/
|
||||
Du: Transport + 'static, // TODO: 'static :-/
|
||||
Du::Output: Into<S::Output>,
|
||||
Du::Dial: Send,
|
||||
Du::MultiaddrFuture: Send,
|
||||
S: Clone + MuxedTransport,
|
||||
S::Dial: Send,
|
||||
S::Listener: Send,
|
||||
S::ListenerUpgrade: Send,
|
||||
S::Output: Send,
|
||||
S::MultiaddrFuture: Send,
|
||||
F: 'static,
|
||||
{
|
||||
self.dial_inner(swarm, multiaddr, transport, true)
|
||||
@ -115,10 +122,17 @@ impl<T> UniqueConnec<T> {
|
||||
#[inline]
|
||||
pub fn dial_if_empty<S, F, Du>(&self, swarm: &SwarmController<S, F>, multiaddr: &Multiaddr,
|
||||
transport: Du) -> UniqueConnecFuture<T>
|
||||
where T: Clone + 'static, // TODO: 'static :-/
|
||||
where T: Clone + Send + 'static, // TODO: 'static :-/
|
||||
Du: Transport + 'static, // TODO: 'static :-/
|
||||
Du::Output: Into<S::Output>,
|
||||
Du::Dial: Send,
|
||||
Du::MultiaddrFuture: Send,
|
||||
S: Clone + MuxedTransport,
|
||||
S::Dial: Send,
|
||||
S::Listener: Send,
|
||||
S::ListenerUpgrade: Send,
|
||||
S::Output: Send,
|
||||
S::MultiaddrFuture: Send,
|
||||
F: 'static,
|
||||
{
|
||||
self.dial_inner(swarm, multiaddr, transport, false)
|
||||
@ -127,10 +141,17 @@ impl<T> UniqueConnec<T> {
|
||||
/// Inner implementation of `dial_*`.
|
||||
fn dial_inner<S, F, Du>(&self, swarm: &SwarmController<S, F>, multiaddr: &Multiaddr,
|
||||
transport: Du, dial_if_err: bool) -> UniqueConnecFuture<T>
|
||||
where T: Clone + 'static, // TODO: 'static :-/
|
||||
where T: Clone + Send + 'static, // TODO: 'static :-/
|
||||
Du: Transport + 'static, // TODO: 'static :-/
|
||||
Du::Output: Into<S::Output>,
|
||||
Du::Dial: Send,
|
||||
Du::MultiaddrFuture: Send,
|
||||
S: Clone + MuxedTransport,
|
||||
S::Dial: Send,
|
||||
S::Listener: Send,
|
||||
S::ListenerUpgrade: Send,
|
||||
S::Output: Send,
|
||||
S::MultiaddrFuture: Send,
|
||||
F: 'static,
|
||||
{
|
||||
let mut inner = self.inner.lock();
|
||||
|
@ -64,18 +64,21 @@ pub struct LoopUpg<Inner> {
|
||||
impl<State, Socket, Inner, Out, AddrFut> ConnectionUpgrade<(State, Socket), AddrFut>
|
||||
for LoopUpg<Inner>
|
||||
where
|
||||
State: 'static,
|
||||
Socket: AsyncRead + AsyncWrite + 'static,
|
||||
State: Send + 'static,
|
||||
Socket: AsyncRead + AsyncWrite + Send + 'static,
|
||||
Inner: ConnectionUpgrade<
|
||||
(State, Socket),
|
||||
AddrFut,
|
||||
Output = Loop<State, Socket, Out>,
|
||||
MultiaddrFuture = AddrFut,
|
||||
> + Clone
|
||||
+ Send
|
||||
+ 'static,
|
||||
Inner::NamesIter: Clone + 'static,
|
||||
AddrFut: 'static,
|
||||
Out: 'static,
|
||||
Inner::NamesIter: Clone + Send + 'static,
|
||||
Inner::UpgradeIdentifier: Send,
|
||||
Inner::Future: Send,
|
||||
AddrFut: Send + 'static,
|
||||
Out: Send + 'static,
|
||||
{
|
||||
type NamesIter = Inner::NamesIter;
|
||||
type UpgradeIdentifier = Inner::UpgradeIdentifier;
|
||||
@ -86,7 +89,7 @@ where
|
||||
|
||||
type Output = Out;
|
||||
type MultiaddrFuture = AddrFut;
|
||||
type Future = Box<Future<Item = (Out, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Future = Box<Future<Item = (Out, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
fn upgrade(
|
||||
self,
|
||||
|
@ -39,9 +39,9 @@ pub struct Map<U, F> {
|
||||
impl<C, U, F, O, Maf> ConnectionUpgrade<C, Maf> for Map<U, F>
|
||||
where
|
||||
U: ConnectionUpgrade<C, Maf>,
|
||||
U::Future: 'static, // TODO: 'static :(
|
||||
U::Future: Send + 'static, // TODO: 'static :(
|
||||
C: AsyncRead + AsyncWrite,
|
||||
F: FnOnce(U::Output) -> O + 'static, // TODO: 'static :(
|
||||
F: FnOnce(U::Output) -> O + Send + 'static, // TODO: 'static :(
|
||||
{
|
||||
type NamesIter = U::NamesIter;
|
||||
type UpgradeIdentifier = U::UpgradeIdentifier;
|
||||
@ -52,7 +52,7 @@ where
|
||||
|
||||
type Output = O;
|
||||
type MultiaddrFuture = U::MultiaddrFuture;
|
||||
type Future = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Future = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
fn upgrade(
|
||||
self,
|
||||
|
@ -42,11 +42,11 @@ pub struct MapAddr<U, F> {
|
||||
impl<C, U, F, O, Maf> ConnectionUpgrade<C, Maf> for MapAddr<U, F>
|
||||
where
|
||||
U: ConnectionUpgrade<C, Maf>,
|
||||
U::Future: 'static, // TODO: 'static :(
|
||||
U::MultiaddrFuture: Future<Item = Multiaddr, Error = IoError> + 'static, // TODO: 'static :(
|
||||
U::Output: 'static, // TODO: 'static :(
|
||||
U::Future: Send + 'static, // TODO: 'static :(
|
||||
U::MultiaddrFuture: Future<Item = Multiaddr, Error = IoError> + Send + 'static, // TODO: 'static :(
|
||||
U::Output: Send + 'static, // TODO: 'static :(
|
||||
C: AsyncRead + AsyncWrite,
|
||||
F: FnOnce(U::Output, &Multiaddr) -> O + 'static, // TODO: 'static :(
|
||||
F: FnOnce(U::Output, &Multiaddr) -> O + Send + 'static, // TODO: 'static :(
|
||||
{
|
||||
type NamesIter = U::NamesIter;
|
||||
type UpgradeIdentifier = U::UpgradeIdentifier;
|
||||
@ -57,7 +57,7 @@ where
|
||||
|
||||
type Output = O;
|
||||
type MultiaddrFuture = future::FutureResult<Multiaddr, IoError>;
|
||||
type Future = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError>>;
|
||||
type Future = Box<Future<Item = (O, Self::MultiaddrFuture), Error = IoError> + Send>;
|
||||
|
||||
fn upgrade(
|
||||
self,
|
||||
|
Reference in New Issue
Block a user