joecalsend/src/server/http.rs
2025-07-04 15:15:52 -07:00

61 lines
1.8 KiB
Rust

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::<SocketAddr>(),
)
.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)
}
}