From 44f7aa140af7b761fc3f7d76f0412b5c070e1d80 Mon Sep 17 00:00:00 2001 From: Darius Clark Date: Fri, 25 Nov 2022 14:54:51 -0500 Subject: [PATCH] feat: Implement Quic-v1 transport Notes: - This is only compatible with v1 so likelihood of connecting to go-libp2p and go-ipfs/kubo peers via quic will unlikely to work until draft-29 is supported in rust-libp2p (see https://github.com/libp2p/rust-libp2p/issues/3133) - DCuTR will not work with quic-v1 at this time so unless port mapping/UPNP is used (coming later), we wont be able to utilize quic-v1 with hole punching, but should work fine with relay (see https://github.com/libp2p/rust-libp2p/issues/2883) Closes #10 --- src/p2p/transport.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/p2p/transport.rs b/src/p2p/transport.rs index 65e23d560..1e7d7fd9f 100644 --- a/src/p2p/transport.rs +++ b/src/p2p/transport.rs @@ -7,8 +7,11 @@ use libp2p::dns::TokioDnsConfig; use libp2p::identity; use libp2p::mplex::MplexConfig; use libp2p::noise::{self, NoiseConfig}; +use libp2p::quic::tokio::Transport as TokioQuicTransport; +use libp2p::quic::Config as QuicConfig; use libp2p::relay::v2::client::transport::ClientTransport; -use libp2p::tcp::{Config as GenTcpConfig, tokio::Transport as TokioTcpTransport}; +use libp2p::swarm::derive_prelude::EitherOutput; +use libp2p::tcp::{tokio::Transport as TokioTcpTransport, Config as GenTcpConfig}; use libp2p::yamux::YamuxConfig; use libp2p::{PeerId, Transport}; use std::io::{self, Error, ErrorKind}; @@ -65,6 +68,10 @@ pub fn build_transport( .nodelay(no_delay) .port_reuse(port_reuse); + let mut quic_config = QuicConfig::new(&keypair); + quic_config.handshake_timeout = Duration::from_secs(1); + let quic_transport = TokioQuicTransport::new(quic_config); + let tcp_transport = TokioTcpTransport::new(tcp_config.clone()); let ws_transport = libp2p::websocket::WsConfig::new(TokioTcpTransport::new(tcp_config)); @@ -100,5 +107,12 @@ pub fn build_transport( .boxed(), }; + let transport = OrTransport::new(quic_transport, transport) + .map(|either_output, _| match either_output { + EitherOutput::First((peer_id, muxer)) => (peer_id, StreamMuxerBox::new(muxer)), + EitherOutput::Second((peer_id, muxer)) => (peer_id, StreamMuxerBox::new(muxer)), + }) + .boxed(); + Ok(transport) }