From 2ec54024742b5f8abdb1c2e09cf0b7bd934227d9 Mon Sep 17 00:00:00 2001 From: Victor Ermolaev <16148931+vnermolaev@users.noreply.github.com> Date: Mon, 13 Mar 2023 20:53:14 +0100 Subject: [PATCH] feat(swarm): enforce creation of `Swarm` via `SwarmBuilder` Mark constructors `Swarm::with_X_executor` as deprecated. Move the deprecated functionality to `SwarmBuilder::with_X_executor` Use `SwarmBuilder` throughout. Resolves #3186. Resolves #3107. Pull-Request: #3588. --- examples/chat-example/src/main.rs | 7 +++- .../distributed-key-value-store/src/main.rs | 6 +-- examples/file-sharing/src/network.rs | 7 ++-- examples/identify/src/main.rs | 5 ++- examples/ipfs-kad/src/main.rs | 4 +- examples/ipfs-private/src/main.rs | 6 +-- examples/ping-example/src/main.rs | 6 ++- examples/rendezvous/src/bin/rzv-discover.rs | 7 ++-- examples/rendezvous/src/bin/rzv-identify.rs | 7 ++-- examples/rendezvous/src/bin/rzv-register.rs | 7 ++-- examples/rendezvous/src/main.rs | 7 ++-- interop-tests/src/bin/ping.rs | 9 +++-- misc/metrics/examples/metrics/main.rs | 10 ++--- misc/multistream-select/tests/transport.rs | 13 +++++-- protocols/autonat/examples/autonat_client.rs | 5 ++- protocols/autonat/examples/autonat_server.rs | 5 ++- protocols/dcutr/tests/lib.rs | 5 ++- protocols/identify/src/behaviour.rs | 22 +++++++---- protocols/kad/src/behaviour/test.rs | 4 +- protocols/relay/Cargo.toml | 2 +- protocols/relay/examples/relay.rs | 4 +- protocols/relay/tests/lib.rs | 8 ++-- swarm-test/src/lib.rs | 5 ++- swarm/CHANGELOG.md | 4 ++ swarm/src/lib.rs | 38 +++++++++++++++++-- transports/pnet/tests/smoke.rs | 5 ++- transports/tls/tests/smoke.rs | 5 ++- transports/webrtc/examples/listen_ping.rs | 8 +--- 28 files changed, 142 insertions(+), 79 deletions(-) diff --git a/examples/chat-example/src/main.rs b/examples/chat-example/src/main.rs index c388bd6a..2e353cd7 100644 --- a/examples/chat-example/src/main.rs +++ b/examples/chat-example/src/main.rs @@ -48,7 +48,10 @@ use async_std::io; use futures::{prelude::*, select}; use libp2p::{ - gossipsub, identity, mdns, swarm::NetworkBehaviour, swarm::SwarmEvent, PeerId, Swarm, + gossipsub, identity, mdns, + swarm::NetworkBehaviour, + swarm::{SwarmBuilder, SwarmEvent}, + PeerId, }; use std::collections::hash_map::DefaultHasher; use std::error::Error; @@ -104,7 +107,7 @@ async fn main() -> Result<(), Box> { let mut swarm = { let mdns = mdns::async_io::Behaviour::new(mdns::Config::default(), local_peer_id)?; let behaviour = MyBehaviour { gossipsub, mdns }; - Swarm::with_async_std_executor(transport, behaviour, local_peer_id) + SwarmBuilder::with_async_std_executor(transport, behaviour, local_peer_id).build() }; // Read full lines from stdin diff --git a/examples/distributed-key-value-store/src/main.rs b/examples/distributed-key-value-store/src/main.rs index c2e73a85..9e8779b2 100644 --- a/examples/distributed-key-value-store/src/main.rs +++ b/examples/distributed-key-value-store/src/main.rs @@ -49,8 +49,8 @@ use libp2p::kad::{ }; use libp2p::{ development_transport, identity, mdns, - swarm::{NetworkBehaviour, SwarmEvent}, - PeerId, Swarm, + swarm::{NetworkBehaviour, SwarmBuilder, SwarmEvent}, + PeerId, }; use std::error::Error; @@ -98,7 +98,7 @@ async fn main() -> Result<(), Box> { let kademlia = Kademlia::new(local_peer_id, store); let mdns = mdns::async_io::Behaviour::new(mdns::Config::default(), local_peer_id)?; let behaviour = MyBehaviour { kademlia, mdns }; - Swarm::with_async_std_executor(transport, behaviour, local_peer_id) + SwarmBuilder::with_async_std_executor(transport, behaviour, local_peer_id).build() }; // Read full lines from stdin diff --git a/examples/file-sharing/src/network.rs b/examples/file-sharing/src/network.rs index 8704f5f6..f21ff952 100644 --- a/examples/file-sharing/src/network.rs +++ b/examples/file-sharing/src/network.rs @@ -15,7 +15,7 @@ use libp2p::{ }, multiaddr::Protocol, request_response::{self, ProtocolSupport, RequestId, ResponseChannel}, - swarm::{ConnectionHandlerUpgrErr, NetworkBehaviour, Swarm, SwarmEvent}, + swarm::{ConnectionHandlerUpgrErr, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent}, PeerId, }; @@ -47,7 +47,7 @@ pub async fn new( // Build the Swarm, connecting the lower layer transport logic with the // higher layer network behaviour logic. - let swarm = Swarm::with_threadpool_executor( + let swarm = SwarmBuilder::with_async_std_executor( libp2p::development_transport(id_keys).await?, ComposedBehaviour { kademlia: Kademlia::new(peer_id, MemoryStore::new(peer_id)), @@ -58,7 +58,8 @@ pub async fn new( ), }, peer_id, - ); + ) + .build(); let (command_sender, command_receiver) = mpsc::channel(0); let (event_sender, event_receiver) = mpsc::channel(0); diff --git a/examples/identify/src/main.rs b/examples/identify/src/main.rs index cd06ee0f..c20dfa57 100644 --- a/examples/identify/src/main.rs +++ b/examples/identify/src/main.rs @@ -40,7 +40,7 @@ use futures::prelude::*; use libp2p::{ core::{multiaddr::Multiaddr, upgrade::Version}, identify, identity, noise, - swarm::{Swarm, SwarmEvent}, + swarm::{SwarmBuilder, SwarmEvent}, tcp, yamux, PeerId, Transport, }; use std::error::Error; @@ -63,7 +63,8 @@ async fn main() -> Result<(), Box> { local_key.public(), )); - let mut swarm = Swarm::with_async_std_executor(transport, behaviour, local_peer_id); + let mut swarm = + SwarmBuilder::with_async_std_executor(transport, behaviour, local_peer_id).build(); // Tell the swarm to listen on all interfaces and a random, OS-assigned // port. diff --git a/examples/ipfs-kad/src/main.rs b/examples/ipfs-kad/src/main.rs index e088bba6..9799ca8d 100644 --- a/examples/ipfs-kad/src/main.rs +++ b/examples/ipfs-kad/src/main.rs @@ -28,7 +28,7 @@ use libp2p::kad::record::store::MemoryStore; use libp2p::kad::{GetClosestPeersError, Kademlia, KademliaConfig, KademliaEvent, QueryResult}; use libp2p::{ development_transport, identity, - swarm::{Swarm, SwarmEvent}, + swarm::{SwarmBuilder, SwarmEvent}, PeerId, }; use std::{env, error::Error, time::Duration}; @@ -66,7 +66,7 @@ async fn main() -> Result<(), Box> { behaviour.add_address(&peer.parse()?, "/dnsaddr/bootstrap.libp2p.io".parse()?); } - Swarm::with_async_std_executor(transport, behaviour, local_peer_id) + SwarmBuilder::with_async_std_executor(transport, behaviour, local_peer_id).build() }; // Order Kademlia to search for a peer. diff --git a/examples/ipfs-private/src/main.rs b/examples/ipfs-private/src/main.rs index 446fa5d2..fac77206 100644 --- a/examples/ipfs-private/src/main.rs +++ b/examples/ipfs-private/src/main.rs @@ -40,10 +40,10 @@ use libp2p::{ multiaddr::Protocol, noise, ping, pnet::{PnetConfig, PreSharedKey}, - swarm::{NetworkBehaviour, SwarmEvent}, + swarm::{NetworkBehaviour, SwarmBuilder, SwarmEvent}, tcp, yamux::YamuxConfig, - Multiaddr, PeerId, Swarm, Transport, + Multiaddr, PeerId, Transport, }; use std::{env, error::Error, fs, path::Path, str::FromStr, time::Duration}; @@ -199,7 +199,7 @@ async fn main() -> Result<(), Box> { println!("Subscribing to {gossipsub_topic:?}"); behaviour.gossipsub.subscribe(&gossipsub_topic).unwrap(); - Swarm::with_async_std_executor(transport, behaviour, local_peer_id) + SwarmBuilder::with_async_std_executor(transport, behaviour, local_peer_id).build() }; // Reach out to other nodes if specified diff --git a/examples/ping-example/src/main.rs b/examples/ping-example/src/main.rs index 29a16489..242f9592 100644 --- a/examples/ping-example/src/main.rs +++ b/examples/ping-example/src/main.rs @@ -43,7 +43,7 @@ use futures::prelude::*; use libp2p::{ identity, ping, - swarm::{keep_alive, NetworkBehaviour, Swarm, SwarmEvent}, + swarm::{keep_alive, NetworkBehaviour, SwarmBuilder, SwarmEvent}, Multiaddr, PeerId, }; use std::error::Error; @@ -56,7 +56,9 @@ async fn main() -> Result<(), Box> { let transport = libp2p::development_transport(local_key).await?; - let mut swarm = Swarm::with_async_std_executor(transport, Behaviour::default(), local_peer_id); + let mut swarm = + SwarmBuilder::with_async_std_executor(transport, Behaviour::default(), local_peer_id) + .build(); // Tell the swarm to listen on all interfaces and a random, OS-assigned // port. diff --git a/examples/rendezvous/src/bin/rzv-discover.rs b/examples/rendezvous/src/bin/rzv-discover.rs index a12cc307..e4ec21c3 100644 --- a/examples/rendezvous/src/bin/rzv-discover.rs +++ b/examples/rendezvous/src/bin/rzv-discover.rs @@ -24,7 +24,7 @@ use libp2p::{ identity, multiaddr::Protocol, noise, ping, rendezvous, - swarm::{keep_alive, NetworkBehaviour, Swarm, SwarmEvent}, + swarm::{keep_alive, NetworkBehaviour, SwarmBuilder, SwarmEvent}, tcp, yamux, Multiaddr, PeerId, Transport, }; use std::time::Duration; @@ -41,7 +41,7 @@ async fn main() { .parse() .unwrap(); - let mut swarm = Swarm::with_tokio_executor( + let mut swarm = SwarmBuilder::with_tokio_executor( tcp::tokio::Transport::default() .upgrade(Version::V1) .authenticate(noise::NoiseAuthenticated::xx(&key_pair).unwrap()) @@ -53,7 +53,8 @@ async fn main() { keep_alive: keep_alive::Behaviour, }, PeerId::from(key_pair.public()), - ); + ) + .build(); log::info!("Local peer id: {}", swarm.local_peer_id()); diff --git a/examples/rendezvous/src/bin/rzv-identify.rs b/examples/rendezvous/src/bin/rzv-identify.rs index 5e58bde9..2f07daf6 100644 --- a/examples/rendezvous/src/bin/rzv-identify.rs +++ b/examples/rendezvous/src/bin/rzv-identify.rs @@ -22,7 +22,7 @@ use futures::StreamExt; use libp2p::{ core::transport::upgrade::Version, identify, identity, noise, ping, rendezvous, - swarm::{keep_alive, NetworkBehaviour, Swarm, SwarmEvent}, + swarm::{keep_alive, NetworkBehaviour, SwarmBuilder, SwarmEvent}, tcp, yamux, Multiaddr, PeerId, Transport, }; use std::time::Duration; @@ -37,7 +37,7 @@ async fn main() { .parse() .unwrap(); - let mut swarm = Swarm::with_tokio_executor( + let mut swarm = SwarmBuilder::with_tokio_executor( tcp::tokio::Transport::default() .upgrade(Version::V1) .authenticate(noise::NoiseAuthenticated::xx(&key_pair).unwrap()) @@ -53,7 +53,8 @@ async fn main() { keep_alive: keep_alive::Behaviour, }, PeerId::from(key_pair.public()), - ); + ) + .build(); log::info!("Local peer id: {}", swarm.local_peer_id()); diff --git a/examples/rendezvous/src/bin/rzv-register.rs b/examples/rendezvous/src/bin/rzv-register.rs index 3923d9c7..4f93e466 100644 --- a/examples/rendezvous/src/bin/rzv-register.rs +++ b/examples/rendezvous/src/bin/rzv-register.rs @@ -22,7 +22,7 @@ use futures::StreamExt; use libp2p::{ core::transport::upgrade::Version, identity, noise, ping, rendezvous, - swarm::{keep_alive, AddressScore, NetworkBehaviour, Swarm, SwarmEvent}, + swarm::{keep_alive, AddressScore, NetworkBehaviour, SwarmBuilder, SwarmEvent}, tcp, yamux, Multiaddr, PeerId, Transport, }; use std::time::Duration; @@ -37,7 +37,7 @@ async fn main() { .parse() .unwrap(); - let mut swarm = Swarm::with_tokio_executor( + let mut swarm = SwarmBuilder::with_tokio_executor( tcp::tokio::Transport::default() .upgrade(Version::V1) .authenticate(noise::NoiseAuthenticated::xx(&key_pair).unwrap()) @@ -49,7 +49,8 @@ async fn main() { keep_alive: keep_alive::Behaviour, }, PeerId::from(key_pair.public()), - ); + ) + .build(); // In production the external address should be the publicly facing IP address of the rendezvous point. // This address is recorded in the registration entry by the rendezvous point. diff --git a/examples/rendezvous/src/main.rs b/examples/rendezvous/src/main.rs index d3f6ea77..a022ec22 100644 --- a/examples/rendezvous/src/main.rs +++ b/examples/rendezvous/src/main.rs @@ -40,7 +40,7 @@ use futures::StreamExt; use libp2p::{ core::transport::upgrade::Version, identify, identity, noise, ping, rendezvous, - swarm::{keep_alive, NetworkBehaviour, Swarm, SwarmEvent}, + swarm::{keep_alive, NetworkBehaviour, SwarmBuilder, SwarmEvent}, tcp, yamux, PeerId, Transport, }; use std::time::Duration; @@ -51,7 +51,7 @@ async fn main() { let key_pair = identity::Keypair::generate_ed25519(); - let mut swarm = Swarm::with_tokio_executor( + let mut swarm = SwarmBuilder::with_tokio_executor( tcp::tokio::Transport::default() .upgrade(Version::V1) .authenticate(noise::NoiseAuthenticated::xx(&key_pair).unwrap()) @@ -67,7 +67,8 @@ async fn main() { keep_alive: keep_alive::Behaviour, }, PeerId::from(key_pair.public()), - ); + ) + .build(); log::info!("Local peer id: {}", swarm.local_peer_id()); diff --git a/interop-tests/src/bin/ping.rs b/interop-tests/src/bin/ping.rs index 113f3bea..71cdf6e8 100644 --- a/interop-tests/src/bin/ping.rs +++ b/interop-tests/src/bin/ping.rs @@ -13,8 +13,8 @@ use libp2p::swarm::{keep_alive, NetworkBehaviour, SwarmEvent}; use libp2p::tls::TlsStream; use libp2p::websocket::WsConfig; use libp2p::{ - identity, mplex, noise, ping, quic, tcp, tls, webrtc, yamux, InboundUpgradeExt, Multiaddr, - OutboundUpgradeExt, PeerId, Swarm, Transport as _, + identity, mplex, noise, ping, quic, swarm::SwarmBuilder, tcp, tls, webrtc, yamux, + InboundUpgradeExt, Multiaddr, OutboundUpgradeExt, PeerId, Transport as _, }; use redis::AsyncCommands; @@ -78,14 +78,15 @@ async fn main() -> Result<()> { ), }; - let mut swarm = Swarm::with_tokio_executor( + let mut swarm = SwarmBuilder::with_tokio_executor( boxed_transport, Behaviour { ping: ping::Behaviour::new(ping::Config::new().with_interval(Duration::from_secs(1))), keep_alive: keep_alive::Behaviour, }, local_peer_id, - ); + ) + .build(); let mut conn = client.get_async_connection().await?; diff --git a/misc/metrics/examples/metrics/main.rs b/misc/metrics/examples/metrics/main.rs index 5e974ff0..9914a19a 100644 --- a/misc/metrics/examples/metrics/main.rs +++ b/misc/metrics/examples/metrics/main.rs @@ -58,10 +58,7 @@ use libp2p_identity::PeerId; use libp2p_metrics::{Metrics, Recorder}; use libp2p_noise as noise; use libp2p_ping as ping; -use libp2p_swarm::keep_alive; -use libp2p_swarm::NetworkBehaviour; -use libp2p_swarm::Swarm; -use libp2p_swarm::SwarmEvent; +use libp2p_swarm::{keep_alive, NetworkBehaviour, SwarmBuilder, SwarmEvent}; use libp2p_tcp as tcp; use libp2p_yamux as yamux; use log::info; @@ -79,7 +76,7 @@ fn main() -> Result<(), Box> { let local_pub_key = local_key.public(); info!("Local peer id: {local_peer_id:?}"); - let mut swarm = Swarm::without_executor( + let mut swarm = SwarmBuilder::without_executor( tcp::async_io::Transport::default() .upgrade(Version::V1) .authenticate(noise::NoiseAuthenticated::xx(&local_key)?) @@ -87,7 +84,8 @@ fn main() -> Result<(), Box> { .boxed(), Behaviour::new(local_pub_key), local_peer_id, - ); + ) + .build(); swarm.listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?; diff --git a/misc/multistream-select/tests/transport.rs b/misc/multistream-select/tests/transport.rs index f5eafbf9..e4517e27 100644 --- a/misc/multistream-select/tests/transport.rs +++ b/misc/multistream-select/tests/transport.rs @@ -29,7 +29,7 @@ use libp2p_identity as identity; use libp2p_identity::PeerId; use libp2p_mplex::MplexConfig; use libp2p_plaintext::PlainText2Config; -use libp2p_swarm::{dummy, Swarm, SwarmEvent}; +use libp2p_swarm::{dummy, SwarmBuilder, SwarmEvent}; use rand::random; use std::task::Poll; @@ -63,9 +63,14 @@ fn transport_upgrade() { let listen_addr = Multiaddr::from(Protocol::Memory(random::())); let mut dialer = - Swarm::with_async_std_executor(dialer_transport, dummy::Behaviour, dialer_id); - let mut listener = - Swarm::with_async_std_executor(listener_transport, dummy::Behaviour, listener_id); + SwarmBuilder::with_async_std_executor(dialer_transport, dummy::Behaviour, dialer_id) + .build(); + let mut listener = SwarmBuilder::with_async_std_executor( + listener_transport, + dummy::Behaviour, + listener_id, + ) + .build(); listener.listen_on(listen_addr).unwrap(); let (addr_sender, addr_receiver) = oneshot::channel(); diff --git a/protocols/autonat/examples/autonat_client.rs b/protocols/autonat/examples/autonat_client.rs index 46089379..9e09a6d5 100644 --- a/protocols/autonat/examples/autonat_client.rs +++ b/protocols/autonat/examples/autonat_client.rs @@ -38,7 +38,7 @@ use libp2p_identify as identify; use libp2p_identity as identity; use libp2p_identity::PeerId; use libp2p_noise as noise; -use libp2p_swarm::{NetworkBehaviour, Swarm, SwarmEvent}; +use libp2p_swarm::{NetworkBehaviour, SwarmBuilder, SwarmEvent}; use libp2p_tcp as tcp; use libp2p_yamux as yamux; use std::error::Error; @@ -76,7 +76,8 @@ async fn main() -> Result<(), Box> { let behaviour = Behaviour::new(local_key.public()); - let mut swarm = Swarm::with_async_std_executor(transport, behaviour, local_peer_id); + let mut swarm = + SwarmBuilder::with_async_std_executor(transport, behaviour, local_peer_id).build(); swarm.listen_on( Multiaddr::empty() .with(Protocol::Ip4(Ipv4Addr::UNSPECIFIED)) diff --git a/protocols/autonat/examples/autonat_server.rs b/protocols/autonat/examples/autonat_server.rs index d3f7fa59..22da0e8e 100644 --- a/protocols/autonat/examples/autonat_server.rs +++ b/protocols/autonat/examples/autonat_server.rs @@ -34,7 +34,7 @@ use libp2p_identify as identify; use libp2p_identity as identity; use libp2p_identity::PeerId; use libp2p_noise as noise; -use libp2p_swarm::{NetworkBehaviour, Swarm, SwarmEvent}; +use libp2p_swarm::{NetworkBehaviour, SwarmBuilder, SwarmEvent}; use libp2p_tcp as tcp; use libp2p_yamux as yamux; use std::error::Error; @@ -65,7 +65,8 @@ async fn main() -> Result<(), Box> { let behaviour = Behaviour::new(local_key.public()); - let mut swarm = Swarm::with_async_std_executor(transport, behaviour, local_peer_id); + let mut swarm = + SwarmBuilder::with_async_std_executor(transport, behaviour, local_peer_id).build(); swarm.listen_on( Multiaddr::empty() .with(Protocol::Ip4(Ipv4Addr::UNSPECIFIED)) diff --git a/protocols/dcutr/tests/lib.rs b/protocols/dcutr/tests/lib.rs index b48fd2e4..cf725f75 100644 --- a/protocols/dcutr/tests/lib.rs +++ b/protocols/dcutr/tests/lib.rs @@ -26,7 +26,7 @@ use libp2p_identity as identity; use libp2p_identity::PeerId; use libp2p_plaintext::PlainText2Config; use libp2p_relay as relay; -use libp2p_swarm::{NetworkBehaviour, Swarm, SwarmEvent}; +use libp2p_swarm::{NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent}; use libp2p_swarm_test::SwarmExt as _; use std::time::Duration; @@ -124,7 +124,7 @@ fn build_client() -> Swarm { .multiplex(libp2p_yamux::YamuxConfig::default()) .boxed(); - Swarm::without_executor( + SwarmBuilder::without_executor( transport, Client { relay: behaviour, @@ -132,6 +132,7 @@ fn build_client() -> Swarm { }, local_peer_id, ) + .build() } #[derive(NetworkBehaviour)] diff --git a/protocols/identify/src/behaviour.rs b/protocols/identify/src/behaviour.rs index 1447768e..88c75001 100644 --- a/protocols/identify/src/behaviour.rs +++ b/protocols/identify/src/behaviour.rs @@ -566,7 +566,7 @@ mod tests { use libp2p_identity::PeerId; use libp2p_mplex::MplexConfig; use libp2p_noise as noise; - use libp2p_swarm::{Swarm, SwarmEvent}; + use libp2p_swarm::{Swarm, SwarmBuilder, SwarmEvent}; use libp2p_tcp as tcp; use std::time::Duration; @@ -594,7 +594,9 @@ mod tests { let protocol = Behaviour::new( Config::new("a".to_string(), pubkey.clone()).with_agent_version("b".to_string()), ); - let swarm = Swarm::with_async_std_executor(transport, protocol, pubkey.to_peer_id()); + let swarm = + SwarmBuilder::with_async_std_executor(transport, protocol, pubkey.to_peer_id()) + .build(); (swarm, pubkey) }; @@ -603,7 +605,9 @@ mod tests { let protocol = Behaviour::new( Config::new("c".to_string(), pubkey.clone()).with_agent_version("d".to_string()), ); - let swarm = Swarm::with_async_std_executor(transport, protocol, pubkey.to_peer_id()); + let swarm = + SwarmBuilder::with_async_std_executor(transport, protocol, pubkey.to_peer_id()) + .build(); (swarm, pubkey) }; @@ -671,7 +675,9 @@ mod tests { let (mut swarm1, pubkey1) = { let (pubkey, transport) = transport(); let protocol = Behaviour::new(Config::new("a".to_string(), pubkey.clone())); - let swarm = Swarm::with_async_std_executor(transport, protocol, pubkey.to_peer_id()); + let swarm = + SwarmBuilder::with_async_std_executor(transport, protocol, pubkey.to_peer_id()) + .build(); (swarm, pubkey) }; @@ -680,7 +686,9 @@ mod tests { let protocol = Behaviour::new( Config::new("a".to_string(), pubkey.clone()).with_agent_version("b".to_string()), ); - let swarm = Swarm::with_async_std_executor(transport, protocol, pubkey.to_peer_id()); + let swarm = + SwarmBuilder::with_async_std_executor(transport, protocol, pubkey.to_peer_id()) + .build(); (swarm, pubkey) }; @@ -752,7 +760,7 @@ mod tests { .with_initial_delay(Duration::from_secs(10)), ); - Swarm::with_async_std_executor(transport, protocol, pubkey.to_peer_id()) + SwarmBuilder::with_async_std_executor(transport, protocol, pubkey.to_peer_id()).build() }; let mut swarm2 = { @@ -761,7 +769,7 @@ mod tests { Config::new("a".to_string(), pubkey.clone()).with_agent_version("b".to_string()), ); - Swarm::with_async_std_executor(transport, protocol, pubkey.to_peer_id()) + SwarmBuilder::with_async_std_executor(transport, protocol, pubkey.to_peer_id()).build() }; let swarm1_peer_id = *swarm1.local_peer_id(); diff --git a/protocols/kad/src/behaviour/test.rs b/protocols/kad/src/behaviour/test.rs index fdbf5568..33cd9dbe 100644 --- a/protocols/kad/src/behaviour/test.rs +++ b/protocols/kad/src/behaviour/test.rs @@ -37,7 +37,7 @@ use libp2p_core::{ use libp2p_identity as identity; use libp2p_identity::PeerId; use libp2p_noise as noise; -use libp2p_swarm::{ConnectionId, Swarm, SwarmEvent}; +use libp2p_swarm::{ConnectionId, Swarm, SwarmBuilder, SwarmEvent}; use libp2p_yamux as yamux; use quickcheck::*; use rand::{random, rngs::StdRng, thread_rng, Rng, SeedableRng}; @@ -67,7 +67,7 @@ fn build_node_with_config(cfg: KademliaConfig) -> (Multiaddr, TestSwarm) { let store = MemoryStore::new(local_id); let behaviour = Kademlia::with_config(local_id, store, cfg); - let mut swarm = Swarm::without_executor(transport, behaviour, local_id); + let mut swarm = SwarmBuilder::without_executor(transport, behaviour, local_id).build(); let address: Multiaddr = Protocol::Memory(random::()).into(); swarm.listen_on(address.clone()).unwrap(); diff --git a/protocols/relay/Cargo.toml b/protocols/relay/Cargo.toml index c4e1be41..7e9fb7ab 100644 --- a/protocols/relay/Cargo.toml +++ b/protocols/relay/Cargo.toml @@ -18,7 +18,7 @@ futures = "0.3.27" futures-timer = "3" instant = "0.1.11" libp2p-core = { version = "0.39.0", path = "../../core" } -libp2p-swarm = { version = "0.42.0", path = "../../swarm" } +libp2p-swarm = { version = "0.42.0", path = "../../swarm", features = ["async-std"] } libp2p-identity = { version = "0.1.0", path = "../../identity" } log = "0.4" quick-protobuf = "0.8" diff --git a/protocols/relay/examples/relay.rs b/protocols/relay/examples/relay.rs index ec5e3be7..1d6e1dd0 100644 --- a/protocols/relay/examples/relay.rs +++ b/protocols/relay/examples/relay.rs @@ -31,7 +31,7 @@ use libp2p_identity::PeerId; use libp2p_noise as noise; use libp2p_ping as ping; use libp2p_relay as relay; -use libp2p_swarm::{NetworkBehaviour, Swarm, SwarmEvent}; +use libp2p_swarm::{NetworkBehaviour, SwarmBuilder, SwarmEvent}; use libp2p_tcp as tcp; use std::error::Error; use std::net::{Ipv4Addr, Ipv6Addr}; @@ -67,7 +67,7 @@ fn main() -> Result<(), Box> { )), }; - let mut swarm = Swarm::without_executor(transport, behaviour, local_peer_id); + let mut swarm = SwarmBuilder::without_executor(transport, behaviour, local_peer_id).build(); // Listen on all interfaces let listen_addr = Multiaddr::empty() diff --git a/protocols/relay/tests/lib.rs b/protocols/relay/tests/lib.rs index e09fd7d7..880dae0c 100644 --- a/protocols/relay/tests/lib.rs +++ b/protocols/relay/tests/lib.rs @@ -34,7 +34,7 @@ use libp2p_identity::PublicKey; use libp2p_ping as ping; use libp2p_plaintext::PlainText2Config; use libp2p_relay as relay; -use libp2p_swarm::{AddressScore, NetworkBehaviour, Swarm, SwarmEvent}; +use libp2p_swarm::{AddressScore, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent}; use std::time::Duration; #[test] @@ -292,7 +292,7 @@ fn build_relay() -> Swarm { let transport = upgrade_transport(MemoryTransport::default().boxed(), local_public_key); - Swarm::with_threadpool_executor( + SwarmBuilder::with_async_std_executor( transport, Relay { ping: ping::Behaviour::new(ping::Config::new()), @@ -306,6 +306,7 @@ fn build_relay() -> Swarm { }, local_peer_id, ) + .build() } fn build_client() -> Swarm { @@ -319,7 +320,7 @@ fn build_client() -> Swarm { local_public_key, ); - Swarm::with_threadpool_executor( + SwarmBuilder::with_async_std_executor( transport, Client { ping: ping::Behaviour::new(ping::Config::new()), @@ -327,6 +328,7 @@ fn build_client() -> Swarm { }, local_peer_id, ) + .build() } fn upgrade_transport( diff --git a/swarm-test/src/lib.rs b/swarm-test/src/lib.rs index 50af3a6f..ebc8b041 100644 --- a/swarm-test/src/lib.rs +++ b/swarm-test/src/lib.rs @@ -28,7 +28,8 @@ use libp2p_core::{ use libp2p_identity::PeerId; use libp2p_plaintext::PlainText2Config; use libp2p_swarm::{ - dial_opts::DialOpts, AddressScore, NetworkBehaviour, Swarm, SwarmEvent, THandlerErr, + dial_opts::DialOpts, AddressScore, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent, + THandlerErr, }; use libp2p_yamux::YamuxConfig; use std::fmt::Debug; @@ -218,7 +219,7 @@ where .timeout(Duration::from_secs(20)) .boxed(); - Swarm::without_executor(transport, behaviour_fn(identity), peer_id) + SwarmBuilder::without_executor(transport, behaviour_fn(identity), peer_id).build() } async fn connect(&mut self, other: &mut Swarm) diff --git a/swarm/CHANGELOG.md b/swarm/CHANGELOG.md index 1e49715d..34fa2fd3 100644 --- a/swarm/CHANGELOG.md +++ b/swarm/CHANGELOG.md @@ -87,6 +87,9 @@ - Remove `ConnectionId::new`. Manually creating `ConnectionId`s is now unsupported. See [PR 3327]. +- Deprecate methods `Swarm::with_executor`, `Swarm::with_*_executor`, `Swarm::without_executor`. + Introduce similar methods in `SwarmBuilder`. See [PR 3588]. + [PR 3364]: https://github.com/libp2p/rust-libp2p/pull/3364 [PR 3170]: https://github.com/libp2p/rust-libp2p/pull/3170 [PR 3134]: https://github.com/libp2p/rust-libp2p/pull/3134 @@ -102,6 +105,7 @@ [PR 3375]: https://github.com/libp2p/rust-libp2p/pull/3375 [PR 3254]: https://github.com/libp2p/rust-libp2p/pull/3254 [PR 3497]: https://github.com/libp2p/rust-libp2p/pull/3497 +[PR 3588]: https://github.com/libp2p/rust-libp2p/pull/3588 # 0.41.1 diff --git a/swarm/src/lib.rs b/swarm/src/lib.rs index 0d44eada..34928b15 100644 --- a/swarm/src/lib.rs +++ b/swarm/src/lib.rs @@ -350,11 +350,13 @@ where impl Unpin for Swarm where TBehaviour: NetworkBehaviour {} +#[allow(deprecated)] impl Swarm where TBehaviour: NetworkBehaviour, { /// Builds a new `Swarm` with a provided executor. + #[deprecated(note = "Use `SwarmBuilder::with_executor` instead.")] pub fn with_executor( transport: transport::Boxed<(PeerId, StreamMuxerBox)>, behaviour: TBehaviour, @@ -369,6 +371,7 @@ where feature = "tokio", not(any(target_os = "emscripten", target_os = "wasi", target_os = "unknown")) ))] + #[deprecated(note = "Use `SwarmBuilder::with_tokio_executor` instead.")] pub fn with_tokio_executor( transport: transport::Boxed<(PeerId, StreamMuxerBox)>, behaviour: TBehaviour, @@ -387,6 +390,7 @@ where feature = "async-std", not(any(target_os = "emscripten", target_os = "wasi", target_os = "unknown")) ))] + #[deprecated(note = "Use `SwarmBuilder::with_async_std_executor` instead.")] pub fn with_async_std_executor( transport: transport::Boxed<(PeerId, StreamMuxerBox)>, behaviour: TBehaviour, @@ -401,6 +405,9 @@ where } /// Builds a new `Swarm` with a threadpool executor. + #[deprecated( + note = "The `futures::executor::ThreadPool` executor is deprecated. See https://github.com/libp2p/rust-libp2p/issues/3107." + )] pub fn with_threadpool_executor( transport: transport::Boxed<(PeerId, StreamMuxerBox)>, behaviour: TBehaviour, @@ -429,6 +436,7 @@ where /// } /// ``` #[cfg(feature = "wasm-bindgen")] + #[deprecated(note = "Use `SwarmBuilder::with_wasm_executor` instead.")] pub fn with_wasm_executor( transport: transport::Boxed<(PeerId, StreamMuxerBox)>, behaviour: TBehaviour, @@ -448,6 +456,7 @@ where /// All connections will be polled on the current task, thus quite bad performance /// characteristics should be expected. Whenever possible use an executor and /// [`Swarm::with_executor`]. + #[deprecated(note = "Use `SwarmBuilder::without_executor` instead.")] pub fn without_executor( transport: transport::Boxed<(PeerId, StreamMuxerBox)>, behaviour: TBehaviour, @@ -493,17 +502,17 @@ where /// See also [`DialOpts`]. /// /// ``` - /// # use libp2p_swarm::Swarm; + /// # use libp2p_swarm::SwarmBuilder; /// # use libp2p_swarm::dial_opts::{DialOpts, PeerCondition}; /// # use libp2p_core::{Multiaddr, PeerId, Transport}; /// # use libp2p_core::transport::dummy::DummyTransport; /// # use libp2p_swarm::dummy; /// # - /// let mut swarm = Swarm::without_executor( + /// let mut swarm = SwarmBuilder::without_executor( /// DummyTransport::new().boxed(), /// dummy::Behaviour, /// PeerId::random(), - /// ); + /// ).build(); /// /// // Dial a known peer. /// swarm.dial(PeerId::random()); @@ -1527,6 +1536,29 @@ where } } + /// Sets executor to the `wasm` executor. + /// Background tasks will be executed by the browser on the next micro-tick. + /// + /// Spawning a task is similar too: + /// ```typescript + /// function spawn(task: () => Promise) { + /// task() + /// } + /// ``` + #[cfg(feature = "wasm-bindgen")] + pub fn with_wasm_executor( + transport: transport::Boxed<(PeerId, StreamMuxerBox)>, + behaviour: TBehaviour, + local_peer_id: PeerId, + ) -> Self { + Self::with_executor( + transport, + behaviour, + local_peer_id, + crate::executor::WasmBindgenExecutor, + ) + } + /// Builds a new [`SwarmBuilder`] from the given transport, behaviour, local peer ID and a /// `tokio` executor. #[cfg(all( diff --git a/transports/pnet/tests/smoke.rs b/transports/pnet/tests/smoke.rs index 4fa1f0c7..7c8f571b 100644 --- a/transports/pnet/tests/smoke.rs +++ b/transports/pnet/tests/smoke.rs @@ -6,7 +6,7 @@ use libp2p_core::upgrade::Version; use libp2p_core::Transport; use libp2p_core::{multiaddr::Protocol, Multiaddr}; use libp2p_pnet::{PnetConfig, PreSharedKey}; -use libp2p_swarm::{keep_alive, NetworkBehaviour, Swarm, SwarmEvent}; +use libp2p_swarm::{keep_alive, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent}; const TIMEOUT: Duration = Duration::from_secs(5); @@ -113,11 +113,12 @@ where .authenticate(libp2p_noise::NoiseAuthenticated::xx(&identity).unwrap()) .multiplex(libp2p_yamux::YamuxConfig::default()) .boxed(); - Swarm::with_tokio_executor( + SwarmBuilder::with_tokio_executor( transport, keep_alive::Behaviour, identity.public().to_peer_id(), ) + .build() } async fn listen_on(swarm: &mut Swarm, addr: Multiaddr) -> Multiaddr { diff --git a/transports/tls/tests/smoke.rs b/transports/tls/tests/smoke.rs index 46c6bd16..9db82f0a 100644 --- a/transports/tls/tests/smoke.rs +++ b/transports/tls/tests/smoke.rs @@ -3,7 +3,7 @@ use libp2p_core::multiaddr::Protocol; use libp2p_core::transport::MemoryTransport; use libp2p_core::upgrade::Version; use libp2p_core::Transport; -use libp2p_swarm::{keep_alive, Swarm, SwarmEvent}; +use libp2p_swarm::{keep_alive, Swarm, SwarmBuilder, SwarmEvent}; #[tokio::test] async fn can_establish_connection() { @@ -64,9 +64,10 @@ fn make_swarm() -> Swarm { .multiplex(libp2p_yamux::YamuxConfig::default()) .boxed(); - Swarm::without_executor( + SwarmBuilder::without_executor( transport, keep_alive::Behaviour, identity.public().to_peer_id(), ) + .build() } diff --git a/transports/webrtc/examples/listen_ping.rs b/transports/webrtc/examples/listen_ping.rs index 2073e967..218380ec 100644 --- a/transports/webrtc/examples/listen_ping.rs +++ b/transports/webrtc/examples/listen_ping.rs @@ -4,7 +4,7 @@ use libp2p_core::muxing::StreamMuxerBox; use libp2p_core::Transport; use libp2p_identity as identity; use libp2p_ping as ping; -use libp2p_swarm::{keep_alive, NetworkBehaviour, Swarm}; +use libp2p_swarm::{keep_alive, NetworkBehaviour, Swarm, SwarmBuilder}; use rand::thread_rng; use void::Void; @@ -33,11 +33,7 @@ fn create_swarm() -> Result> { .map(|(peer_id, conn), _| (peer_id, StreamMuxerBox::new(conn))) .boxed(); - Ok(Swarm::with_tokio_executor( - transport, - Behaviour::default(), - peer_id, - )) + Ok(SwarmBuilder::with_tokio_executor(transport, Behaviour::default(), peer_id).build()) } #[derive(NetworkBehaviour, Default)]