61 lines
2.1 KiB
Rust
61 lines
2.1 KiB
Rust
use crate::models::{AppState, PeerNode, SERVICE_TYPE};
|
|
use mdns_sd::{ServiceDaemon, ServiceEvent, ServiceInfo};
|
|
use std::sync::Arc;
|
|
|
|
pub fn start_mdns_service(state: Arc<AppState>) {
|
|
let mdns = ServiceDaemon::new().expect("Не удалось запустить mDNS");
|
|
|
|
let instance_name = format!("{}_{}", state.device_name, &state.my_fingerprint[..6]);
|
|
let host_name = format!("{}.local.", instance_name);
|
|
let properties = [
|
|
("fp", state.my_fingerprint.as_str()),
|
|
("name", state.device_name.as_str()),
|
|
];
|
|
|
|
let service_info = ServiceInfo::new(
|
|
SERVICE_TYPE,
|
|
&instance_name,
|
|
&host_name,
|
|
&state.my_ip,
|
|
state.p2p_port,
|
|
&properties[..],
|
|
)
|
|
.expect("Ошибка создания mDNS записи");
|
|
|
|
mdns.register(service_info).expect("Ошибка регистрации mDNS");
|
|
|
|
let receiver = mdns.browse(SERVICE_TYPE).expect("Ошибка mDNS browse");
|
|
tokio::spawn(async move {
|
|
while let Ok(event) = receiver.recv_async().await {
|
|
if let ServiceEvent::ServiceResolved(info) = event {
|
|
let fp = info
|
|
.get_property_val_str("fp")
|
|
.unwrap_or_default()
|
|
.to_string();
|
|
let name = info
|
|
.get_property_val_str("name")
|
|
.unwrap_or("Unknown")
|
|
.to_string();
|
|
|
|
if fp == state.my_fingerprint || fp.len() < 8 {
|
|
continue;
|
|
}
|
|
|
|
if let Some(ip) = info.get_addresses().iter().next() {
|
|
let ip_str = ip.to_string();
|
|
let pin_code = fp[..8].to_uppercase();
|
|
let peer = PeerNode {
|
|
name,
|
|
ip: ip_str.clone(),
|
|
port: info.get_port(),
|
|
fingerprint: fp,
|
|
pin_code,
|
|
verified: false,
|
|
};
|
|
state.peers.write().unwrap().insert(ip_str, peer);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|