use anyhow::Result;
use mdns_sd::{ServiceDaemon, ServiceInfo};
pub struct MdnsAdvertiser {
daemon: ServiceDaemon,
}
impl MdnsAdvertiser {
pub fn new(port: u16, service_type: &str) -> Result<Self> {
let daemon = ServiceDaemon::new()?;
let host = hostname::get()?.to_string_lossy().to_string();
let short = host.split('.').next().unwrap_or(&host);
let mdns_host = format!("{short}.local.");
let service = ServiceInfo::new(service_type, "Snapserver", &mdns_host, "", port, None)?;
daemon.register(service)?;
tracing::info!(port, host = %mdns_host, service_type, "mDNS: advertising");
Ok(Self { daemon })
}
pub fn shutdown(&self) {
let _ = self.daemon.shutdown();
}
}
impl Drop for MdnsAdvertiser {
fn drop(&mut self) {
self.shutdown();
}
}