AIRA/src/discovery.rs

38 lines
1.3 KiB
Rust
Raw Normal View History

2021-04-28 17:57:49 +02:00
use std::{net::IpAddr, io};
use tokio::runtime::Handle;
2021-04-26 16:29:26 +02:00
use libmdns::{Responder, Service};
2021-03-20 18:03:47 +01:00
use multicast_dns::discovery::{DiscoveryManager, DiscoveryListeners, ResolveListeners};
use crate::{constants, print_error};
const SERVICE_TYPE: &str = "_aira._tcp";
pub async fn advertise_me() -> io::Result<Service> {
Ok(Responder::spawn(&Handle::current())?.register(
2021-04-26 16:29:26 +02:00
SERVICE_TYPE.to_string(),
"AIRA Node".to_string(),
constants::PORT,
&[]
2021-04-28 17:57:49 +02:00
))
2021-03-20 18:03:47 +01:00
}
pub fn discover_peers<F: Fn(&DiscoveryManager, IpAddr)>(on_service_discovered: F) {
let discovery_manager = DiscoveryManager::new();
match discovery_manager.discover_services(SERVICE_TYPE, DiscoveryListeners{
on_service_discovered: Some(&|service| {
discovery_manager.resolve_service(service, ResolveListeners{
on_service_resolved: Some(&|service| {
match service.address {
Some(service_ip) => on_service_discovered(&discovery_manager, service_ip.parse().unwrap()),
None => print_error!("Service discovered without IP address: {:?}", service)
};
})
});
}),
on_all_discovered: Some(&|| {
discovery_manager.stop_service_discovery();
})
}) {
Ok(_) => {},
Err(e) => print_error!(e)
}
}