use log::{debug, error}; use mdns_sd::{ServiceDaemon, ServiceEvent}; use crate::local_presence::SERVICE_NAME; pub type DiscoveryEvent = ServiceEvent; pub async fn discover_agents(timeout: Option, on_event: F) where F: FnOnce(DiscoveryEvent) -> Result<(), String> + Send + 'static + Copy, { // Create a new mDNS daemon. let mdns = ServiceDaemon::new().expect("Failed to create mDNS daemon"); // Start browsing for the service type. // The receiver will be a stream of events. let receiver = mdns.browse(SERVICE_NAME).expect("Failed to browse"); tokio::spawn(async move { while let Ok(event) = receiver.recv() { if let Err(e) = on_event(event.clone()) { error!("Event callback failed : {e}"); } match event { ServiceEvent::ServiceResolved(resolved) => { debug!("Resolved a new service: {}", resolved.fullname); } other_event => { debug!("Received other event: {:?}", &other_event); } } } }); if let Some(timeout) = timeout { tokio::time::sleep(std::time::Duration::from_secs(timeout)).await; mdns.shutdown().unwrap(); } }