use ipfrs_network::{NetworkConfig, NetworkNode};
use std::time::Duration;
use tokio::time::sleep;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
println!("=== Basic IPFRS Network Node Example ===\n");
let config = NetworkConfig {
listen_addrs: vec![
"/ip4/0.0.0.0/udp/0/quic-v1".to_string(),
"/ip4/0.0.0.0/tcp/0".to_string(),
],
enable_quic: true,
enable_mdns: true,
enable_nat_traversal: true,
..Default::default()
};
println!("Creating network node with configuration:");
println!(" - QUIC transport: enabled");
println!(" - TCP fallback: enabled");
println!(" - mDNS discovery: enabled");
println!(" - NAT traversal: enabled\n");
let mut node = NetworkNode::new(config)?;
let peer_id = node.peer_id();
println!("Node peer ID: {}\n", peer_id);
println!("Starting network node...");
node.start().await?;
let addrs = node.listeners();
println!("\nListening on {} addresses:", addrs.len());
for addr in &addrs {
println!(" {}", addr);
}
println!("\nWaiting for node to initialize...");
sleep(Duration::from_secs(2)).await;
let health = node.get_network_health();
println!("\nNetwork Health:");
println!(" Status: {:?}", health.status);
println!(" Connected peers: {}", health.connected_peers);
println!(" Publicly reachable: {}", health.is_publicly_reachable);
println!(" External addresses: {}", health.external_addresses);
let stats = node.stats();
println!("\nNetwork Statistics:");
println!(" Peer ID: {}", stats.peer_id);
println!(" Connected peers: {}", stats.connected_peers);
println!(" QUIC enabled: {}", stats.quic_enabled);
println!(" Bytes sent: {}", stats.bytes_sent);
println!(" Bytes received: {}", stats.bytes_received);
println!(" Bootstrap peers: {}", stats.bootstrap_peers.len());
let is_public = node.is_publicly_reachable();
println!("\nPublicly reachable: {}", is_public);
if is_public {
let external_addrs = node.get_external_addresses();
println!("External addresses:");
for addr in &external_addrs {
println!(" {}", addr);
}
}
let is_healthy = node.is_healthy();
println!("\nNode is healthy: {}", is_healthy);
println!("\nNode is running. Press Ctrl+C to stop.");
println!("Keeping node alive for 30 seconds...\n");
for i in 1..=6 {
sleep(Duration::from_secs(5)).await;
let peer_count = node.get_peer_count();
println!("After {} seconds: {} peers connected", i * 5, peer_count);
}
println!("\nShutting down node...");
node.stop().await?;
println!("Node stopped successfully!");
Ok(())
}