use std::{net::SocketAddr, sync::Arc}; use axum::{ Extension, Json, Router, extract::DefaultBodyLimit, routing::{get, post}, }; use tokio::net::TcpListener; use tower_http::limit::RequestBodyLimitLayer; use crate::{ Client, JoecalState, discovery::http::register_device, transfer::upload::{register_prepare_upload, register_upload}, }; impl Client { pub async fn start_http_server(&self) -> crate::error::Result<()> { let app = self.create_router(); let addr = SocketAddr::from(([0, 0, 0, 0], self.port)); let listener = TcpListener::bind(&addr).await?; println!("HTTP server listening on {addr}"); axum::serve( listener, app.into_make_service_with_connect_info::(), ) .await?; Ok(()) } fn create_router(&self) -> Router { let peers = self.peers.clone(); let device = self.device.clone(); let state = Arc::new(JoecalState { peers, device: device.clone(), sessions: self.sessions.clone(), }); Router::new() .route("/api/localsend/v2/register", post(register_device)) .route( "/api/localsend/v2/info", get(move || { let device = device.clone(); async move { Json(device) } }), ) .route( "/api/localsend/v2/prepare-upload", post(register_prepare_upload), ) .route("/api/localsend/v2/upload", post(register_upload)) .layer(DefaultBodyLimit::disable()) .layer(RequestBodyLimitLayer::new(1024 * 1024 * 1024)) .layer(Extension(self.download_dir.clone())) .with_state(state) } }