pub use self::overlay::Overlay; pub use self::peer::Peer; use common::event_loop::{spawn_event_loop, CoreMsg}; use common::read_config; use p2p::{Config, NatMsg, TcpRendezvousServer, UdpRendezvousServer}; use std::io; use std::sync::mpsc; mod overlay; mod peer; #[derive(Serialize, Deserialize)] pub struct FullConfig { pub server_cfg: ServerConfig, pub p2p_cfg: Config, } #[derive(Serialize, Deserialize)] pub struct ServerConfig { overlay_port: u16, } pub fn entry_point() { let cfg: FullConfig = read_config("./server-config"); let el = spawn_event_loop(cfg.p2p_cfg); let server_cfg = cfg.server_cfg; { let (tx, rx) = mpsc::channel(); unwrap!(el.nat_tx.send(NatMsg::new(move |ifc, poll| { let _token_udp = unwrap!(UdpRendezvousServer::start(ifc, poll)); let _token_tcp = unwrap!(TcpRendezvousServer::start(ifc, poll)); unwrap!(tx.send(())); }))); unwrap!(rx.recv()); } println!("Rendezvous servers started successfully."); println!("Should this node also be the overlay [y/n] ?"); let mut answer = String::new(); unwrap!(io::stdin().read_line(&mut answer)); answer = answer.trim().to_string().to_lowercase(); if answer == "y" || answer == "yes" { let (tx, rx) = mpsc::channel(); unwrap!(el.core_tx.send(CoreMsg::new(move |core, poll| { Overlay::start(core, poll, server_cfg.overlay_port); unwrap!(tx.send(())); }))); unwrap!(rx.recv()); println!("Overlay started successfully."); } println!("Everything done. Blocking main thread until user quits."); let mut quit = String::new(); loop { println!("Enter 'q' to quit"); unwrap!(io::stdin().read_line(&mut quit)); quit = quit.trim().to_string().to_lowercase(); if quit == "q" || quit == "quit" { break; } quit.clear(); } }