mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-24 23:31:33 +00:00
Add an Error associated type to transports (#835)
* Add an Error associated type to transports * Improve raw swarm a bit * Rename map_other to map * Use source() instead of cause() * RawSwarmIncErr -> IncomingError
This commit is contained in:
@ -23,6 +23,7 @@
|
||||
use futures::{future, prelude::*, stream, AndThen, MapErr};
|
||||
use libp2p_core::{
|
||||
Multiaddr, PeerId, PublicKey, muxing, Transport,
|
||||
transport::{TransportError, upgrade::TransportUpgradeError},
|
||||
upgrade::{self, OutboundUpgradeApply, UpgradeError}
|
||||
};
|
||||
use protocol::{RemoteInfo, IdentifyProtocolConfig};
|
||||
@ -59,38 +60,32 @@ impl<TTrans> IdentifyTransport<TTrans> {
|
||||
impl<TTrans, TMuxer> Transport for IdentifyTransport<TTrans>
|
||||
where
|
||||
TTrans: Transport<Output = TMuxer>,
|
||||
TTrans::Error: 'static,
|
||||
TMuxer: muxing::StreamMuxer + Send + Sync + 'static, // TODO: remove unnecessary bounds
|
||||
TMuxer::Substream: Send + Sync + 'static, // TODO: remove unnecessary bounds
|
||||
{
|
||||
type Output = (PeerId, TMuxer);
|
||||
type Listener = stream::Empty<(Self::ListenerUpgrade, Multiaddr), IoError>;
|
||||
type ListenerUpgrade = future::Empty<Self::Output, IoError>;
|
||||
type Error = TransportUpgradeError<TTrans::Error, IoError>; // TODO: better than IoError
|
||||
type Listener = stream::Empty<(Self::ListenerUpgrade, Multiaddr), Self::Error>;
|
||||
type ListenerUpgrade = future::Empty<Self::Output, Self::Error>;
|
||||
type Dial = AndThen<
|
||||
TTrans::Dial,
|
||||
MapErr<IdRetriever<TMuxer>, fn(UpgradeError<IoError>) -> IoError>,
|
||||
fn(TMuxer) -> MapErr<IdRetriever<TMuxer>, fn(UpgradeError<IoError>) -> IoError>
|
||||
MapErr<TTrans::Dial, fn(TTrans::Error) -> Self::Error>,
|
||||
MapErr<IdRetriever<TMuxer>, fn(UpgradeError<IoError>) -> Self::Error>,
|
||||
fn(TMuxer) -> MapErr<IdRetriever<TMuxer>, fn(UpgradeError<IoError>) -> Self::Error>
|
||||
>;
|
||||
|
||||
#[inline]
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), (Self, Multiaddr)> {
|
||||
Err((self, addr))
|
||||
fn listen_on(self, addr: Multiaddr) -> Result<(Self::Listener, Multiaddr), TransportError<Self::Error>> {
|
||||
Err(TransportError::MultiaddrNotSupported(addr))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, (Self, Multiaddr)> {
|
||||
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
|
||||
// We dial a first time the node.
|
||||
let dial = match self.transport.dial(addr.clone()) {
|
||||
Ok(d) => d,
|
||||
Err((transport, addr)) => {
|
||||
let id = IdentifyTransport {
|
||||
transport,
|
||||
};
|
||||
return Err((id, addr));
|
||||
}
|
||||
};
|
||||
|
||||
Ok(dial.and_then(|muxer| {
|
||||
IdRetriever::new(muxer, IdentifyProtocolConfig).map_err(|e| e.into_io_error())
|
||||
let dial = self.transport.dial(addr)
|
||||
.map_err(|err| err.map(TransportUpgradeError::Transport))?;
|
||||
Ok(dial.map_err::<fn(_) -> _, _>(TransportUpgradeError::Transport).and_then(|muxer| {
|
||||
IdRetriever::new(muxer, IdentifyProtocolConfig).map_err(TransportUpgradeError::Upgrade)
|
||||
}))
|
||||
}
|
||||
|
||||
|
@ -260,8 +260,7 @@ mod tests {
|
||||
use self::libp2p_tcp::TcpConfig;
|
||||
use futures::{Future, Stream};
|
||||
use libp2p_core::{PublicKey, Transport, upgrade::{apply_outbound, apply_inbound}};
|
||||
use std::sync::mpsc;
|
||||
use std::thread;
|
||||
use std::{io, sync::mpsc, thread};
|
||||
|
||||
#[test]
|
||||
fn correct_transfer() {
|
||||
@ -284,7 +283,8 @@ mod tests {
|
||||
.map_err(|(err, _)| err)
|
||||
.and_then(|(client, _)| client.unwrap().0)
|
||||
.and_then(|socket| {
|
||||
apply_inbound(socket, IdentifyProtocolConfig).map_err(|e| e.into_io_error())
|
||||
apply_inbound(socket, IdentifyProtocolConfig)
|
||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))
|
||||
})
|
||||
.and_then(|sender| {
|
||||
sender.send(
|
||||
@ -308,9 +308,10 @@ mod tests {
|
||||
let transport = TcpConfig::new();
|
||||
|
||||
let future = transport.dial(rx.recv().unwrap())
|
||||
.unwrap_or_else(|_| panic!())
|
||||
.unwrap()
|
||||
.and_then(|socket| {
|
||||
apply_outbound(socket, IdentifyProtocolConfig).map_err(|e| e.into_io_error())
|
||||
apply_outbound(socket, IdentifyProtocolConfig)
|
||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))
|
||||
})
|
||||
.and_then(|RemoteInfo { info, observed_addr, .. }| {
|
||||
assert_eq!(observed_addr, "/ip4/100.101.102.103/tcp/5000".parse().unwrap());
|
||||
|
Reference in New Issue
Block a user