use anyhow::Result; use tokio::try_join; use crate::{ config::ConfigOpts, consul_actor::ConsulActor, fw_actor::FirewallActor, igd_actor::IgdActor, stun_actor::StunActor, }; pub struct Diplonat { consul: ConsulActor, firewall: FirewallActor, igd: IgdActor, stun: StunActor, } impl Diplonat { pub async fn new() -> Result { let rt_cfg = ConfigOpts::from_env()?; println!("{:#?}", rt_cfg); let ca = ConsulActor::new(&rt_cfg.consul, &rt_cfg.consul.node_name); let fw = FirewallActor::new(rt_cfg.firewall.refresh_time, &ca.rx_open_ports).await?; let ia = IgdActor::new( rt_cfg.igd.private_ip.as_ref().map(String::as_str), rt_cfg.igd.refresh_time, rt_cfg.igd.expiration_time, &ca.rx_open_ports, ) .await?; let sa = StunActor::new( &rt_cfg.consul, &rt_cfg.stun, &rt_cfg.consul.node_name, ); let ctx = Self { consul: ca, igd: ia, firewall: fw, stun: sa, }; Ok(ctx) } pub async fn listen(&mut self) -> Result<()> { try_join!( self.consul.listen(), self.igd.listen(), self.firewall.listen(), self.stun.listen(), )?; Ok(()) } }