pub mod authenticator;
pub mod error;
pub mod rate_limiter;
pub mod statistics;
pub use authenticator::{AuthToken, RelayAuthenticator};
pub use error::{RelayError, RelayResult};
pub use rate_limiter::{RateLimiter, TokenBucket};
pub use statistics::RelayStatisticsCollector;
pub use crate::masque::{
MasqueRelayClient, MasqueRelayConfig, MasqueRelayServer, MasqueRelayStats, MigrationConfig,
MigrationCoordinator, MigrationState, RelayManager, RelayManagerConfig, RelaySession,
RelaySessionConfig, RelaySessionState,
};
use std::time::Duration;
pub const DEFAULT_SESSION_TIMEOUT: Duration = Duration::from_secs(300);
pub const DEFAULT_BANDWIDTH_LIMIT: u32 = 1_048_576;
pub const MAX_CONCURRENT_SESSIONS: usize = 10;
pub const MAX_RELAY_DATA_SIZE: usize = 65536;
pub const RATE_LIMIT_TOKENS_PER_SECOND: u32 = 100;
pub const RATE_LIMIT_BURST_SIZE: u32 = 500;
pub const ANTI_REPLAY_WINDOW_SIZE: u64 = 1000;
pub const SESSION_CLEANUP_INTERVAL: Duration = Duration::from_secs(30);
#[derive(Debug, Clone, Default)]
pub struct RelayStatistics {
pub session_stats: SessionStatistics,
pub connection_stats: ConnectionStatistics,
pub auth_stats: AuthenticationStatistics,
pub rate_limit_stats: RateLimitingStatistics,
pub error_stats: ErrorStatistics,
}
#[derive(Debug, Clone, Default)]
pub struct SessionStatistics {
pub total_sessions_created: u64,
pub active_sessions: u32,
pub pending_sessions: u32,
pub sessions_terminated_normally: u64,
pub sessions_timed_out: u64,
pub sessions_terminated_with_errors: u64,
pub avg_session_duration: f64,
pub total_bytes_forwarded: u64,
}
#[derive(Debug, Clone, Default)]
pub struct ConnectionStatistics {
pub total_connections: u64,
pub active_connections: u32,
pub total_bytes_sent: u64,
pub total_bytes_received: u64,
pub avg_bandwidth_usage: f64,
pub peak_concurrent_connections: u32,
pub connection_timeouts: u64,
pub keep_alive_sent: u64,
}
#[derive(Debug, Clone, Default)]
pub struct AuthenticationStatistics {
pub total_auth_attempts: u64,
pub successful_auths: u64,
pub failed_auths: u64,
pub auth_rate: f64,
pub replay_attacks_blocked: u64,
pub invalid_signatures: u64,
pub unknown_peer_keys: u64,
}
#[derive(Debug, Clone, Default)]
pub struct RateLimitingStatistics {
pub total_requests: u64,
pub requests_allowed: u64,
pub requests_blocked: u64,
pub current_tokens: u32,
pub efficiency_percentage: f64,
pub peak_request_rate: f64,
}
#[derive(Debug, Clone, Default)]
pub struct ErrorStatistics {
pub protocol_errors: u64,
pub resource_exhausted: u64,
pub session_errors: u64,
pub auth_failures: u64,
pub network_errors: u64,
pub internal_errors: u64,
pub error_rate: f64,
pub error_breakdown: std::collections::HashMap<String, u64>,
}
impl RelayStatistics {
pub fn new() -> Self {
Self::default()
}
pub fn success_rate(&self) -> f64 {
let total_ops = self.session_stats.total_sessions_created
+ self.connection_stats.total_connections
+ self.auth_stats.total_auth_attempts;
if total_ops == 0 {
return 1.0;
}
let total_failures = self.session_stats.sessions_terminated_with_errors
+ self.connection_stats.connection_timeouts
+ self.auth_stats.failed_auths
+ self.error_stats.protocol_errors
+ self.error_stats.resource_exhausted;
1.0 - (total_failures as f64 / total_ops as f64)
}
pub fn total_throughput(&self) -> f64 {
if self.session_stats.avg_session_duration == 0.0 {
return 0.0;
}
self.session_stats.total_bytes_forwarded as f64 / self.session_stats.avg_session_duration
}
pub fn is_healthy(&self) -> bool {
let total_ops = self.session_stats.total_sessions_created
+ self.connection_stats.total_connections
+ self.auth_stats.total_auth_attempts
+ self.rate_limit_stats.total_requests;
if total_ops == 0 {
return true;
}
let total_errors = self.error_stats.protocol_errors
+ self.error_stats.resource_exhausted
+ self.error_stats.session_errors
+ self.error_stats.auth_failures
+ self.error_stats.network_errors
+ self.error_stats.internal_errors;
let error_rate_ok = if total_errors == 0 {
true
} else if self.error_stats.error_rate < 1.0 {
true
} else {
total_errors <= 5 && total_ops >= 100
};
self.success_rate() > 0.95
&& error_rate_ok
&& (self.rate_limit_stats.total_requests == 0
|| self.rate_limit_stats.efficiency_percentage > 80.0)
}
}