{core,swarm}/: Don't require Transport: Clone and take &mut (#2529)

Previously `libp2p-swarm` required a `Transport` to be `Clone`. Methods
on `Transport`, e.g. `Transport::dial` would take ownership, requiring
e.g. a `Clone::clone` before calling `Transport::dial`.

The requirement of `Transport` to be `Clone` is no longer needed in
`libp2p-swarm`. E.g.  concurrent dialing can be done without a clone per
dial.

This commit removes the requirement of `Clone` for `Transport` in
`libp2p-swarm`. As a follow-up methods on `Transport` no longer take
ownership, but instead a mutable reference (`&mut self`).

On the one hand this simplifies `libp2p-swarm`, on the other it
simplifies implementations of `Transport`.
This commit is contained in:
Max Inden
2022-04-06 20:23:16 +02:00
committed by GitHub
parent 7a1147877a
commit 2ad905f35a
82 changed files with 751 additions and 449 deletions

View File

@ -54,7 +54,7 @@ use thiserror::Error;
/// let (relay_transport, behaviour) = client::Client::new_transport_and_behaviour(
/// PeerId::random(),
/// );
/// let transport = OrTransport::new(relay_transport, actual_transport);
/// let mut transport = OrTransport::new(relay_transport, actual_transport);
/// # let relay_id = PeerId::random();
/// # let destination_id = PeerId::random();
/// let dst_addr_via_relay = Multiaddr::empty()
@ -78,7 +78,7 @@ use thiserror::Error;
/// let (relay_transport, behaviour) = client::Client::new_transport_and_behaviour(
/// local_peer_id,
/// );
/// let transport = OrTransport::new(relay_transport, actual_transport);
/// let mut transport = OrTransport::new(relay_transport, actual_transport);
/// let relay_addr = Multiaddr::empty()
/// .with(Protocol::Memory(40)) // Relay address.
/// .with(Protocol::P2p(relay_id.into())) // Relay peer id.
@ -108,7 +108,7 @@ impl ClientTransport {
/// );
///
/// // To reduce unnecessary connection attempts, put `relay_transport` first.
/// let transport = OrTransport::new(relay_transport, actual_transport);
/// let mut transport = OrTransport::new(relay_transport, actual_transport);
/// ```
pub(crate) fn new() -> (Self, mpsc::Receiver<TransportToBehaviourMsg>) {
let (to_behaviour, from_transport) = mpsc::channel(0);
@ -124,7 +124,10 @@ impl Transport for ClientTransport {
type ListenerUpgrade = Ready<Result<Self::Output, Self::Error>>;
type Dial = RelayedDial;
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
fn listen_on(
&mut self,
addr: Multiaddr,
) -> Result<Self::Listener, TransportError<Self::Error>> {
let (relay_peer_id, relay_addr) = match parse_relayed_multiaddr(addr)? {
RelayedMultiaddr {
relay_peer_id: None,
@ -144,7 +147,7 @@ impl Transport for ClientTransport {
};
let (to_listener, from_behaviour) = mpsc::channel(0);
let mut to_behaviour = self.to_behaviour;
let mut to_behaviour = self.to_behaviour.clone();
let msg_to_behaviour = Some(
async move {
to_behaviour
@ -165,7 +168,7 @@ impl Transport for ClientTransport {
})
}
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
fn dial(&mut self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
let RelayedMultiaddr {
relay_peer_id,
relay_addr,
@ -178,7 +181,7 @@ impl Transport for ClientTransport {
let relay_addr = relay_addr.ok_or(RelayError::MissingRelayAddr)?;
let dst_peer_id = dst_peer_id.ok_or(RelayError::MissingDstPeerId)?;
let mut to_behaviour = self.to_behaviour;
let mut to_behaviour = self.to_behaviour.clone();
Ok(async move {
let (tx, rx) = oneshot::channel();
to_behaviour
@ -197,7 +200,10 @@ impl Transport for ClientTransport {
.boxed())
}
fn dial_as_listener(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>>
fn dial_as_listener(
&mut self,
addr: Multiaddr,
) -> Result<Self::Dial, TransportError<Self::Error>>
where
Self: Sized,
{