version a0.0.1
This commit is contained in:
commit
9469ef10b6
19 files changed
+4281
No files matched your search
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user