diff --git a/crates/tor-guardmgr/src/daemon.rs b/crates/tor-guardmgr/src/daemon.rs index e4a6c7a4b..b39dbcb78 100644 --- a/crates/tor-guardmgr/src/daemon.rs +++ b/crates/tor-guardmgr/src/daemon.rs @@ -116,3 +116,31 @@ pub(crate) async fn keep_netdir_updated( } } } + +/// Background task to keep a guard manager up-to-date with a given bridge +/// descriptor provider. +#[cfg(feature = "bridge-client")] +pub(crate) async fn keep_bridge_descs_updated( + runtime: RT, + inner: Weak>, + bridge_desc_provider: Weak, +) { + use crate::bridge::BridgeDescEvent as E; + let mut event_stream = match bridge_desc_provider.upgrade().map(|p| p.events()) { + Some(s) => s, + None => return, + }; + + while let Some(event) = event_stream.next().await { + match event { + E::SomethingChanged => { + if let Some(inner) = inner.upgrade() { + let mut inner = inner.lock().expect("Poisoned lock"); + inner.update(runtime.wallclock()); + } else { + return; + } + } + } + } +} diff --git a/crates/tor-guardmgr/src/lib.rs b/crates/tor-guardmgr/src/lib.rs index 02f441bd3..63a5cbb5f 100644 --- a/crates/tor-guardmgr/src/lib.rs +++ b/crates/tor-guardmgr/src/lib.rs @@ -394,7 +394,16 @@ impl GuardMgr { let mut inner = self.inner.lock().expect("Poisoned lock"); inner.bridge_desc_provider = Some(weak_provider.clone()); } - // TODO pt-client: launch a keep_bridge_descs_updated task. + + let weak_inner = Arc::downgrade(&self.inner); + let rt_clone = self.runtime.clone(); + self.runtime + .spawn(daemon::keep_bridge_descs_updated( + rt_clone, + weak_inner, + weak_provider, + )) + .map_err(|e| GuardMgrError::from_spawn("periodic guard netdir updater", e))?; Ok(()) }