use crate::models::{AppState, PeerNode, SERVICE_TYPE}; use mdns_sd::{ServiceDaemon, ServiceEvent, ServiceInfo}; use std::sync::Arc; pub fn start_mdns_service(state: Arc) { 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); } } } }); }