use super::NatType;
use serde::{Deserialize, Serialize};
use std::collections::VecDeque;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkHealth {
pub status: String,
pub peer_count: usize,
pub nat_type: NatType,
pub bandwidth_kbps: f64,
pub avg_latency_ms: f64,
}
#[derive(Debug, Default)]
pub struct NetworkMetrics {
pub connected_peers: usize,
pub latency_samples: VecDeque<f64>,
pub bandwidth_usage_kbps: f64,
pub nat_type: NatType,
pub packet_loss_rate: f64,
pub avg_latency_ms: f64,
}
#[derive(Debug, Default)]
pub struct StorageMetrics {
pub dht_operations_total: u64,
pub dht_operations_success: u64,
pub avg_dht_latency_ms: f64,
pub storage_bytes: u64,
pub record_count: u64,
pub avg_replication_factor: f64,
}
#[derive(Debug, Default)]
pub struct PeerMetrics {
pub connected_peers: usize,
pub total_peers_discovered: usize,
pub churn_rate: f64,
pub avg_peer_uptime_seconds: f64,
}
impl NetworkMetrics {
pub fn update(&mut self, stats: NetworkStats) {
self.connected_peers = stats.connected_peers;
self.bandwidth_usage_kbps = stats.bandwidth_kbps;
self.latency_samples.push_back(stats.latest_latency_ms);
if self.latency_samples.len() > 100 {
self.latency_samples.pop_front();
}
if !self.latency_samples.is_empty() {
self.avg_latency_ms = self.latency_samples.iter().sum::<f64>()
/ self.latency_samples.len() as f64;
}
}
}
#[derive(Debug)]
pub struct NetworkStats {
pub connected_peers: usize,
pub bandwidth_kbps: f64,
pub latest_latency_ms: f64,
}