@@ -22,6 +22,7 @@ use libp2p_core::multiaddr::{Multiaddr, Protocol};
2222use libp2p_core:: transport:: upgrade:: Version ;
2323use libp2p_core:: transport:: { MemoryTransport , Transport } ;
2424use libp2p_dcutr as dcutr;
25+ use libp2p_identify as identify;
2526use libp2p_identity as identity;
2627use libp2p_identity:: PeerId ;
2728use libp2p_plaintext as plaintext;
@@ -38,10 +39,19 @@ async fn connect() {
3839 let mut dst = build_client ( ) ;
3940 let mut src = build_client ( ) ;
4041
41- // Have all swarms listen on a local memory address.
42- let ( relay_addr, _) = relay. listen ( ) . await ;
43- let ( dst_addr, _) = dst. listen ( ) . await ;
44- src. listen ( ) . await ;
42+ // Have all swarms listen on a local TCP address.
43+ let ( memory_addr, relay_addr) = relay. listen ( ) . await ;
44+ relay. remove_external_address ( & memory_addr) ;
45+ relay. add_external_address ( relay_addr. clone ( ) ) ;
46+
47+ let ( dst_mem_addr, dst_tcp_addr) = dst. listen ( ) . await ;
48+ let ( src_mem_addr, _) = src. listen ( ) . await ;
49+
50+ dst. remove_external_address ( & dst_mem_addr) ;
51+ src. remove_external_address ( & src_mem_addr) ;
52+
53+ assert ! ( src. external_addresses( ) . next( ) . is_none( ) ) ;
54+ assert ! ( dst. external_addresses( ) . next( ) . is_none( ) ) ;
4555
4656 let relay_peer_id = * relay. local_peer_id ( ) ;
4757 let dst_peer_id = * dst. local_peer_id ( ) ;
@@ -80,11 +90,12 @@ async fn connect() {
8090 break ;
8191 }
8292 }
93+ ClientEvent :: Identify ( _) => { }
8394 other => panic ! ( "Unexpected event: {other:?}." ) ,
8495 }
8596 }
8697
87- let dst_addr = dst_addr . with ( Protocol :: P2p ( dst_peer_id) ) ;
98+ let dst_addr = dst_tcp_addr . with ( Protocol :: P2p ( dst_peer_id) ) ;
8899
89100 let established_conn_id = src
90101 . wait ( move |e| match e {
@@ -109,20 +120,33 @@ async fn connect() {
109120 assert_eq ! ( established_conn_id, reported_conn_id) ;
110121}
111122
112- fn build_relay ( ) -> Swarm < relay :: Behaviour > {
123+ fn build_relay ( ) -> Swarm < Relay > {
113124 Swarm :: new_ephemeral ( |identity| {
114125 let local_peer_id = identity. public ( ) . to_peer_id ( ) ;
115126
116- relay:: Behaviour :: new (
117- local_peer_id,
118- relay:: Config {
119- reservation_duration : Duration :: from_secs ( 2 ) ,
120- ..Default :: default ( )
121- } ,
122- )
127+ Relay {
128+ relay : relay:: Behaviour :: new (
129+ local_peer_id,
130+ relay:: Config {
131+ reservation_duration : Duration :: from_secs ( 2 ) ,
132+ ..Default :: default ( )
133+ } ,
134+ ) ,
135+ identify : identify:: Behaviour :: new ( identify:: Config :: new (
136+ "/relay" . to_owned ( ) ,
137+ identity. public ( ) ,
138+ ) ) ,
139+ }
123140 } )
124141}
125142
143+ #[ derive( NetworkBehaviour ) ]
144+ #[ behaviour( prelude = "libp2p_swarm::derive_prelude" ) ]
145+ struct Relay {
146+ relay : relay:: Behaviour ,
147+ identify : identify:: Behaviour ,
148+ }
149+
126150fn build_client ( ) -> Swarm < Client > {
127151 let local_key = identity:: Keypair :: generate_ed25519 ( ) ;
128152 let local_peer_id = local_key. public ( ) . to_peer_id ( ) ;
@@ -142,6 +166,10 @@ fn build_client() -> Swarm<Client> {
142166 Client {
143167 relay : behaviour,
144168 dcutr : dcutr:: Behaviour :: new ( local_peer_id) ,
169+ identify : identify:: Behaviour :: new ( identify:: Config :: new (
170+ "/client" . to_owned ( ) ,
171+ local_key. public ( ) ,
172+ ) ) ,
145173 } ,
146174 local_peer_id,
147175 Config :: with_async_std_executor ( ) ,
@@ -153,6 +181,7 @@ fn build_client() -> Swarm<Client> {
153181struct Client {
154182 relay : relay:: client:: Behaviour ,
155183 dcutr : dcutr:: Behaviour ,
184+ identify : identify:: Behaviour ,
156185}
157186
158187async fn wait_for_reservation (
@@ -163,14 +192,16 @@ async fn wait_for_reservation(
163192) {
164193 let mut new_listen_addr_for_relayed_addr = false ;
165194 let mut reservation_req_accepted = false ;
195+ let mut addr_observed = false ;
196+
166197 loop {
198+ if new_listen_addr_for_relayed_addr && reservation_req_accepted && addr_observed {
199+ break ;
200+ }
201+
167202 match client. next_swarm_event ( ) . await {
168- SwarmEvent :: NewListenAddr { address, .. } if address != client_addr => { }
169203 SwarmEvent :: NewListenAddr { address, .. } if address == client_addr => {
170204 new_listen_addr_for_relayed_addr = true ;
171- if reservation_req_accepted {
172- break ;
173- }
174205 }
175206 SwarmEvent :: Behaviour ( ClientEvent :: Relay (
176207 relay:: client:: Event :: ReservationReqAccepted {
@@ -180,15 +211,16 @@ async fn wait_for_reservation(
180211 } ,
181212 ) ) if relay_peer_id == peer_id && renewal == is_renewal => {
182213 reservation_req_accepted = true ;
183- if new_listen_addr_for_relayed_addr {
184- break ;
185- }
186214 }
187215 SwarmEvent :: Dialing {
188216 peer_id : Some ( peer_id) ,
189217 ..
190218 } if peer_id == relay_peer_id => { }
191219 SwarmEvent :: ConnectionEstablished { peer_id, .. } if peer_id == relay_peer_id => { }
220+ SwarmEvent :: Behaviour ( ClientEvent :: Identify ( identify:: Event :: Received { .. } ) ) => {
221+ addr_observed = true ;
222+ }
223+ SwarmEvent :: Behaviour ( ClientEvent :: Identify ( _) ) => { }
192224 e => panic ! ( "{e:?}" ) ,
193225 }
194226 }
0 commit comments