use crate::error::{NetworkError, Result};
use libp2p::{
core::upgrade,
identity::Keypair,
yamux, PeerId, Transport,
};
use std::time::Duration;
pub fn build_transport(
keypair: &Keypair,
) -> Result<libp2p::core::transport::Boxed<(PeerId, libp2p::core::muxing::StreamMuxerBox)>> {
let tcp = libp2p::tcp::tokio::Transport::new(libp2p::tcp::Config::default().nodelay(true));
let tls_config = libp2p::tls::Config::new(keypair)
.map_err(|e| NetworkError::Transport(format!("Failed to create TLS config: {}", e)))?;
let yamux_config = yamux::Config::default();
let tcp_transport = tcp
.upgrade(upgrade::Version::V1Lazy)
.authenticate(tls_config)
.multiplex(yamux_config)
.timeout(Duration::from_secs(20));
let quic = libp2p::quic::tokio::Transport::new(libp2p::quic::Config::new(keypair));
let transport = libp2p::dns::tokio::Transport::system(
tcp_transport.or_transport(quic)
)
.map_err(|e| NetworkError::Transport(format!("Failed to create DNS transport: {}", e)))?
.map(|either, _| match either {
futures::future::Either::Left((peer_id, muxer)) => (peer_id, libp2p::core::muxing::StreamMuxerBox::new(muxer)),
futures::future::Either::Right((peer_id, muxer)) => (peer_id, libp2p::core::muxing::StreamMuxerBox::new(muxer)),
});
Ok(transport.boxed())
}
pub fn build_development_transport(
keypair: &Keypair,
) -> Result<libp2p::core::transport::Boxed<(PeerId, libp2p::core::muxing::StreamMuxerBox)>> {
let tcp = libp2p::tcp::tokio::Transport::new(libp2p::tcp::Config::default().nodelay(true));
let tls_config = libp2p::tls::Config::new(keypair)
.map_err(|e| NetworkError::Transport(format!("Failed to create TLS config: {}", e)))?;
let yamux_config = yamux::Config::default();
let transport = tcp
.upgrade(upgrade::Version::V1Lazy)
.authenticate(tls_config)
.multiplex(yamux_config)
.timeout(Duration::from_secs(20))
.boxed();
Ok(transport)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transport_creation() {
let keypair = Keypair::generate_ed25519();
let transport = build_transport(&keypair);
assert!(transport.is_ok());
}
#[test]
fn test_development_transport_creation() {
let keypair = Keypair::generate_ed25519();
let transport = build_development_transport(&keypair);
assert!(transport.is_ok());
}
}