@@ -316,6 +316,7 @@ pub(crate) async fn run_entry_connect(
316316 }
317317
318318 let peer_addr = endpoint. to_string ( ) ;
319+ let peers = Arc :: clone ( & res. peers ) ;
319320 let security = SecurityParams {
320321 psk : global. psk . clone ( ) ,
321322 accept_fingerprint : None ,
@@ -352,11 +353,12 @@ pub(crate) async fn run_entry_connect(
352353 move |connect_result| {
353354 let e = connect_result. erase ( ) ;
354355 let m = Arc :: clone ( & metrics) ;
356+ let p = Arc :: clone ( & peers) ;
355357 let r = Arc :: clone ( & routes) ;
356358 let ru = r_updates. resubscribe ( ) ;
357359 let pa = peer_addr. clone ( ) ;
358360 async move {
359- run_entry_connected_erased ( e, & m, & pa, Some ( r) , Some ( ru) ) . await
361+ run_entry_connected_erased ( e, & m, & pa, Some ( p ) , Some ( r) , Some ( ru) ) . await
360362 }
361363 } ,
362364 RECONNECT_DELAY ,
@@ -388,11 +390,12 @@ pub(crate) async fn run_entry_connect(
388390 move |connect_result| {
389391 let e = connect_result. erase ( ) ;
390392 let m = Arc :: clone ( & metrics) ;
393+ let p = Arc :: clone ( & peers) ;
391394 let r = Arc :: clone ( & routes) ;
392395 let ru = r_updates. resubscribe ( ) ;
393396 let pa = peer_addr. clone ( ) ;
394397 async move {
395- run_entry_connected_erased ( e, & m, & pa, Some ( r) , Some ( ru) ) . await
398+ run_entry_connected_erased ( e, & m, & pa, Some ( p ) , Some ( r) , Some ( ru) ) . await
396399 }
397400 } ,
398401 RECONNECT_DELAY ,
@@ -429,6 +432,7 @@ pub(crate) async fn run_entry_connected_erased(
429432 connect_result : wallhack_core:: client:: client:: ErasedConnectResult ,
430433 metrics : & Arc < Metrics > ,
431434 peer_addr : & str ,
435+ peers : Option < Arc < Registry > > ,
432436 routes : Option < SharedRouteTable > ,
433437 route_updates : Option <
434438 tokio:: sync:: broadcast:: Receiver < wallhack_core:: control:: routes:: RouteUpdate > ,
@@ -443,6 +447,7 @@ pub(crate) async fn run_entry_connected_erased(
443447 tasks : _tasks,
444448 control_tx,
445449 peer_addr : _,
450+ latency_rx,
446451 } = connect_result;
447452
448453 // Wait for the server's handshake to get the peer name
@@ -478,6 +483,8 @@ pub(crate) async fn run_entry_connected_erased(
478483 metrics,
479484 peer_addr,
480485 peer_name. as_deref ( ) ,
486+ peers,
487+ latency_rx,
481488 routes,
482489 route_updates,
483490 )
@@ -495,6 +502,8 @@ pub(crate) async fn run_entry_connected_inner(
495502 metrics : & Arc < Metrics > ,
496503 peer_addr : & str ,
497504 peer_name : Option < & str > ,
505+ peers : Option < Arc < Registry > > ,
506+ latency_rx : Option < tokio:: sync:: mpsc:: Receiver < f64 > > ,
498507 routes : Option < SharedRouteTable > ,
499508 route_updates : Option <
500509 tokio:: sync:: broadcast:: Receiver < wallhack_core:: control:: routes:: RouteUpdate > ,
@@ -574,6 +583,19 @@ pub(crate) async fn run_entry_connected_inner(
574583 tracing:: debug!( "Initial ping failed: {e}" ) ;
575584 }
576585
586+ // Consume latency measurements from the control loop and update the registry.
587+ if let ( Some ( mut lat_rx) , Some ( reg) ) = ( latency_rx, & peers) {
588+ let peer_id = peer_name. map ( std:: string:: ToString :: to_string) ;
589+ let reg = Arc :: clone ( reg) ;
590+ tokio:: spawn ( async move {
591+ while let Some ( ms) = lat_rx. recv ( ) . await {
592+ if let Some ( ref id) = peer_id {
593+ reg. update_latency ( id, ms) ;
594+ }
595+ }
596+ } ) ;
597+ }
598+
577599 let manager_handle = tokio:: spawn ( async move { manager. run ( ) . await } ) ;
578600
579601 match manager_handle. await {
0 commit comments