From f01a7b547cf377aa205e2a3842081751c682a7e1 Mon Sep 17 00:00:00 2001 From: Darius Date: Thu, 1 Feb 2024 15:41:45 -0500 Subject: [PATCH 1/2] chore: Emit NewExternalAddrOfPeer for discovered peers --- protocols/rendezvous/src/client.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/protocols/rendezvous/src/client.rs b/protocols/rendezvous/src/client.rs index 92d7884758b..148705ef66a 100644 --- a/protocols/rendezvous/src/client.rs +++ b/protocols/rendezvous/src/client.rs @@ -31,12 +31,14 @@ use libp2p_swarm::{ ConnectionDenied, ConnectionId, ExternalAddresses, FromSwarm, NetworkBehaviour, THandler, THandlerInEvent, THandlerOutEvent, ToSwarm, }; -use std::collections::HashMap; +use std::collections::{HashMap, VecDeque}; use std::iter; use std::task::{Context, Poll}; use std::time::Duration; pub struct Behaviour { + events: VecDeque::ToSwarm, THandlerInEvent>>, + inner: libp2p_request_response::Behaviour, keypair: Keypair, @@ -61,6 +63,7 @@ impl Behaviour { /// Create a new instance of the rendezvous [`NetworkBehaviour`]. pub fn new(keypair: Keypair) -> Self { Self { + events: Default::default(), inner: libp2p_request_response::Behaviour::with_codec( crate::codec::Codec::default(), iter::once((crate::PROTOCOL_IDENT, ProtocolSupport::Outbound)), @@ -244,8 +247,11 @@ impl NetworkBehaviour for Behaviour { cx: &mut Context<'_>, ) -> Poll>> { use libp2p_request_response as req_res; - loop { + if let Some(event) = self.events.pop_front() { + return Poll::Ready(event); + } + match self.inner.poll(cx) { Poll::Ready(ToSwarm::GenerateEvent(req_res::Event::Message { message: @@ -393,6 +399,13 @@ impl Behaviour { let addresses = registration.record.addresses().to_vec(); + self.events.extend(addresses.iter().map(|addr| { + ToSwarm::NewExternalAddrOfPeer { + peer_id, + address: addr.clone(), + } + })); + ((peer_id, namespace), addresses) })); From 6e7906a6b4cbcdd60f4bd05e0c459d057d145f53 Mon Sep 17 00:00:00 2001 From: Darius Date: Fri, 17 May 2024 18:57:52 -0400 Subject: [PATCH 2/2] chore: Emit event if discovered addresses doesnt exist --- protocols/rendezvous/src/client.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/protocols/rendezvous/src/client.rs b/protocols/rendezvous/src/client.rs index 148705ef66a..01e6193ee95 100644 --- a/protocols/rendezvous/src/client.rs +++ b/protocols/rendezvous/src/client.rs @@ -392,6 +392,27 @@ impl Behaviour { DiscoverResponse(Ok((registrations, cookie))) => { if let Some((rendezvous_node, _ns)) = self.waiting_for_discovery.remove(request_id) { + self.events + .extend(registrations.iter().flat_map(|registration| { + let peer_id = registration.record.peer_id(); + registration + .record + .addresses() + .iter() + .filter(|addr| { + !self.discovered_peers.iter().any( + |((discovered_peer_id, _), addrs)| { + *discovered_peer_id == peer_id && addrs.contains(addr) + }, + ) + }) + .map(|address| ToSwarm::NewExternalAddrOfPeer { + peer_id, + address: address.clone(), + }) + .collect::>() + })); + self.discovered_peers .extend(registrations.iter().map(|registration| { let peer_id = registration.record.peer_id(); @@ -399,13 +420,6 @@ impl Behaviour { let addresses = registration.record.addresses().to_vec(); - self.events.extend(addresses.iter().map(|addr| { - ToSwarm::NewExternalAddrOfPeer { - peer_id, - address: addr.clone(), - } - })); - ((peer_id, namespace), addresses) }));