version a0.0.1

This commit is contained in:
netadmin committed 2026-10-22 20:45:13 +03:00
commit 9469ef10b6
19 files changed
+4281

No files matched your search

+60
View File
@@ -0,0 +1,60 @@
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);
}
}
}
});
}