mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-21 13:51:33 +00:00
{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:
@ -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,
|
||||
{
|
||||
|
Reference in New Issue
Block a user