use crate::context::config::Config; use crate::context::{AppState, NetworkAddr, PacketLossInfo, ServerNodeInfo, TrafficInfo}; use crate::protocol::control_message::ClientSimpleInfo; use crate::tunnel_core::p2p::route_table::Route; use crate::tunnel_core::server::rpc::ServerRPC; use rust_p2p_core::nat::NatInfo; use std::net::Ipv4Addr; #[derive(Clone)] pub struct VntApi { app_state: AppState, server_rpc: ServerRPC, } impl VntApi { pub(crate) fn new(app_state: AppState, server_rpc: ServerRPC) -> Self { Self { app_state, server_rpc, } } pub fn server_rpc(&self) -> &ServerRPC { &self.server_rpc } /// 获取启动配置 pub fn get_config(&self) -> Option> { self.app_state.get_config() } /// 获取所有客户端ip pub fn client_ips(&self) -> Vec { self.app_state.client_ips() } /// 判断目标IP是否直连 pub fn is_direct(&self, ip: &Ipv4Addr) -> bool { self.app_state.route_table.p2p_num(ip) > 0 } /// 查找路由 pub fn find_route(&self, ip: &Ipv4Addr) -> Option { self.app_state.route_table.get_route_by_id(ip).ok() } pub fn get_rtt(&self, ip: &Ipv4Addr) -> Option { if let Some(route) = self.find_route(ip) { Some(route.rtt()) } else { self.server_node_rtt(ip).map(|v| v * 2) } } /// 获取所有路由 pub fn route_table(&self) -> Vec<(Ipv4Addr, Vec)> { self.app_state.route_table.route_table() } /// 获取服务器节点 pub fn server_node_list(&self) -> Vec { self.app_state.server_info_collection.server_node_list() } pub fn server_node_rtt(&self, ip: &Ipv4Addr) -> Option { self.app_state.server_info_collection.get_server_rtt(ip) } /// 获取网络配置 pub fn network(&self) -> Option { self.app_state.get_network() } /// 获取当前的nat信息 pub fn nat_info(&self) -> Option { self.app_state.get_nat_info() } pub fn peer_nat_info(&self, ip: &Ipv4Addr) -> Option { self.app_state.get_peer_info(ip).and_then(|v| v.nat_info) } /// 获取指定 IP 的聚合丢包信息(所有路由合并) pub fn packet_loss_info(&self, ip: &Ipv4Addr) -> Option { self.app_state .packet_loss_stats .get_aggregated_loss_info(ip) } /// 获取指定 IP 的所有路由的丢包信息 pub fn packet_loss_info_by_routes(&self, ip: &Ipv4Addr) -> Vec { self.app_state.packet_loss_stats.get_loss_info_by_ip(ip) } pub fn all_packet_loss_info(&self) -> Vec { self.app_state.packet_loss_stats.get_all_loss_info() } pub fn reset_packet_loss(&self, ip: &Ipv4Addr) { // 重置该 IP 的所有路由统计 for info in self.app_state.packet_loss_stats.get_loss_info_by_ip(ip) { if let Some(route_key) = info.route_key { self.app_state.packet_loss_stats.reset(ip, &route_key); } } } pub fn reset_all_packet_loss(&self) { self.app_state.packet_loss_stats.reset_all() } pub fn traffic_info(&self, ip: &Ipv4Addr) -> Option { self.app_state.traffic_stats.get_traffic_info(ip) } pub fn all_traffic_info(&self) -> Vec { self.app_state.traffic_stats.get_all_traffic_info() } pub fn reset_traffic(&self, ip: &Ipv4Addr) { self.app_state.traffic_stats.reset(ip) } pub fn reset_all_traffic(&self) { self.app_state.traffic_stats.reset_all() } }