diff --git a/mycelium/src/cdn.rs b/mycelium/src/cdn.rs index 0ee7183..f065eaa 100644 --- a/mycelium/src/cdn.rs +++ b/mycelium/src/cdn.rs @@ -37,14 +37,24 @@ impl Cdn { } /// Start the Cdn server. This future runs until the server is stopped. - pub async fn start(&self, listener: TcpListener) -> Result<(), Box> { + pub fn start(&self, listener: TcpListener) -> Result<(), Box> { let state = Cache { base: self.cache.clone(), }; let router = Router::new().route("/", get(cdn)).with_state(state); - Ok(axum::serve(listener, router) - .with_graceful_shutdown(self.cancel_token.clone().cancelled_owned()) - .await?) + + let cancel_token = self.cancel_token.clone(); + + tokio::spawn(async { + axum::serve(listener, router) + .with_graceful_shutdown(cancel_token.cancelled_owned()) + .await + .map_err(|err| { + warn!(%err, "Cdn server error"); + }) + }); + + Ok(()) } } diff --git a/mycelium/src/lib.rs b/mycelium/src/lib.rs index 16f755d..15f4023 100644 --- a/mycelium/src/lib.rs +++ b/mycelium/src/lib.rs @@ -1,7 +1,9 @@ use std::net::{IpAddr, Ipv6Addr}; +use std::path::PathBuf; #[cfg(feature = "message")] use std::{future::Future, time::Duration}; +use crate::cdn::Cdn; use crate::tun::TunConfig; use bytes::BytesMut; use data::DataPlane; @@ -16,6 +18,7 @@ use metrics::Metrics; use peer_manager::{PeerExists, PeerNotFound, PeerStats, PrivateNetworkKey}; use routing_table::{NoRouteSubnet, QueriedSubnet, RouteEntry}; use subnet::Subnet; +use tokio::net::TcpListener; use tracing::{error, info, warn}; mod babel; @@ -97,6 +100,8 @@ pub struct Config { /// system. pub update_workers: usize, + pub cdn_cache: Option, + /// Configuration for message topics, if this is not set the default config will be used. #[cfg(feature = "message")] pub topic_config: Option, @@ -106,6 +111,7 @@ pub struct Config { pub struct Node { router: router::Router, peer_manager: peer_manager::PeerManager, + _cdn: Option, #[cfg(feature = "message")] message_stack: message::MessageStack, } @@ -259,12 +265,19 @@ where } }; + let cdn = config.cdn_cache.map(Cdn::new); + if let Some(ref cdn) = cdn { + let listener = TcpListener::bind("localhost:80").await?; + cdn.start(listener)?; + } + #[cfg(feature = "message")] let ms = MessageStack::new(_data_plane, msg_receiver, config.topic_config); Ok(Node { router, peer_manager: pm, + _cdn: cdn, #[cfg(feature = "message")] message_stack: ms, })