1pub mod ant_quic_adapter;
22
23pub mod dht_handler;
25
26pub mod network_config;
28
29pub use network_config::{IpMode, NatTraversalMode, NetworkConfig, PortConfig, RetryBehavior};
30
31use crate::validation::{Validate, ValidationContext, validate_message_size, validate_peer_id};
32use crate::{P2PError, PeerId, Result};
33use serde::{Deserialize, Serialize};
34use std::collections::HashMap;
35use std::fmt;
36use std::time::{Duration, Instant};
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
40pub enum TransportType {
41 QUIC,
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
47pub enum TransportSelection {
48 #[default]
50 QUIC,
51}
52
53#[derive(Debug, Clone)]
55pub struct ConnectionQuality {
56 pub latency: Duration,
58 pub throughput_mbps: f64,
60 pub packet_loss: f64,
62 pub jitter: Duration,
64 pub connect_time: Duration,
66}
67
68#[derive(Debug, Clone)]
70pub struct ConnectionInfo {
71 pub transport_type: TransportType,
73 pub local_addr: crate::NetworkAddress,
75 pub remote_addr: crate::NetworkAddress,
77 pub is_encrypted: bool,
79 pub cipher_suite: String,
81 pub used_0rtt: bool,
83 pub established_at: Instant,
85 pub last_activity: Instant,
87}
88
89#[derive(Debug, Clone)]
91pub struct ConnectionPoolInfo {
92 pub active_connections: usize,
94 pub total_connections: usize,
96 pub bytes_sent: u64,
98 pub bytes_received: u64,
100}
101
102#[derive(Debug, Clone)]
104pub struct ConnectionPoolStats {
105 pub messages_per_connection: HashMap<String, usize>,
107 pub bytes_per_connection: HashMap<String, u64>,
109 pub latency_per_connection: HashMap<String, Duration>,
111}
112
113#[derive(Debug, Clone)]
115pub struct TransportMessage {
116 pub sender: PeerId,
118 pub data: Vec<u8>,
120 pub protocol: String,
122 pub received_at: Instant,
124}
125
126impl Validate for TransportMessage {
127 fn validate(&self, ctx: &ValidationContext) -> Result<()> {
128 validate_peer_id(&self.sender)?;
130
131 validate_message_size(self.data.len(), ctx.max_message_size)?;
133
134 if self.protocol.is_empty() || self.protocol.len() > 64 {
136 return Err(P2PError::validation("Invalid protocol identifier"));
137 }
138
139 Ok(())
140 }
141}
142
143#[derive(Debug, Clone)]
145pub struct TransportOptions {
146 pub enable_0rtt: bool,
148 pub require_encryption: bool,
150 pub connect_timeout: Duration,
152 pub keep_alive: Duration,
154 pub max_message_size: usize,
156}
157
158impl fmt::Display for TransportType {
159 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
160 match self {
161 TransportType::QUIC => write!(f, "quic"),
162 }
163 }
164}
165
166impl Default for TransportOptions {
167 fn default() -> Self {
168 Self {
169 enable_0rtt: true,
170 require_encryption: true,
171 connect_timeout: Duration::from_secs(30),
172 keep_alive: Duration::from_secs(60),
173 max_message_size: 64 * 1024 * 1024, }
175 }
176}
177
178impl Default for ConnectionQuality {
179 fn default() -> Self {
180 Self {
181 latency: Duration::from_millis(50),
182 throughput_mbps: 100.0,
183 packet_loss: 0.0,
184 jitter: Duration::from_millis(5),
185 connect_time: Duration::from_millis(100),
186 }
187 }
188}
189
190pub mod transport_types {
192 pub use super::TransportType;
193}
194
195#[cfg(test)]
196mod tests {
197 use super::*;
198
199 #[test]
200 fn test_transport_type_display() {
201 assert_eq!(format!("{}", TransportType::QUIC), "quic");
202 }
203
204 #[test]
205 fn test_transport_type_serialization() {
206 let quic_type = TransportType::QUIC;
207 assert_eq!(quic_type, TransportType::QUIC);
208 }
209
210 #[test]
211 fn test_transport_selection_variants() {
212 let quic_selection = TransportSelection::QUIC;
213 assert!(matches!(quic_selection, TransportSelection::QUIC));
214 }
215
216 #[test]
217 fn test_transport_selection_default() {
218 let default = TransportSelection::default();
219 assert!(matches!(default, TransportSelection::QUIC));
220 }
221
222 #[test]
223 fn test_transport_options_default() {
224 let options = TransportOptions::default();
225
226 assert!(options.enable_0rtt);
227 assert!(options.require_encryption);
228 assert_eq!(options.connect_timeout, Duration::from_secs(30));
229 assert_eq!(options.keep_alive, Duration::from_secs(60));
230 assert_eq!(options.max_message_size, 64 * 1024 * 1024);
231 }
232
233 #[test]
234 fn test_connection_quality_default() {
235 let quality = ConnectionQuality::default();
236
237 assert_eq!(quality.latency, Duration::from_millis(50));
238 assert_eq!(quality.throughput_mbps, 100.0);
239 assert_eq!(quality.packet_loss, 0.0);
240 assert_eq!(quality.jitter, Duration::from_millis(5));
241 assert_eq!(quality.connect_time, Duration::from_millis(100));
242 }
243
244 #[test]
245 fn test_transport_options_configuration() {
246 let options = TransportOptions {
247 enable_0rtt: false,
248 require_encryption: false,
249 connect_timeout: Duration::from_secs(10),
250 keep_alive: Duration::from_secs(30),
251 max_message_size: 1024,
252 };
253
254 assert!(!options.enable_0rtt);
255 assert!(!options.require_encryption);
256 assert_eq!(options.connect_timeout, Duration::from_secs(10));
257 assert_eq!(options.keep_alive, Duration::from_secs(30));
258 assert_eq!(options.max_message_size, 1024);
259 }
260
261 #[test]
262 fn test_transport_message_structure() {
263 let message = TransportMessage {
264 sender: "test_peer".to_string(),
265 data: vec![1, 2, 3, 4],
266 protocol: "/p2p/test/1.0.0".to_string(),
267 received_at: Instant::now(),
268 };
269
270 assert_eq!(message.sender, "test_peer");
271 assert_eq!(message.data, vec![1, 2, 3, 4]);
272 assert_eq!(message.protocol, "/p2p/test/1.0.0");
273 }
274}