joecalsend/src/http_server.rs

52 lines
1.5 KiB
Rust
Raw Normal View History

use std::net::SocketAddr;
2025-07-04 22:15:52 +00:00
2025-07-04 00:00:11 +00:00
use axum::{
Json, Router,
2025-07-04 00:00:11 +00:00
extract::DefaultBodyLimit,
routing::{get, post},
};
2025-07-06 23:02:11 +00:00
use tokio::{net::TcpListener, sync::mpsc};
2025-07-04 00:00:11 +00:00
use tower_http::limit::RequestBodyLimitLayer;
use crate::{
2025-08-06 21:09:37 +00:00
JocalService,
discovery::register_device,
transfer::{prepare_upload, receive_upload},
2025-07-04 00:00:11 +00:00
};
2025-08-06 21:09:37 +00:00
impl JocalService {
pub async fn start_http_server(&self, stop_rx: mpsc::Receiver<()>) -> crate::error::Result<()> {
let app = self.create_router();
2025-07-08 22:46:31 +00:00
// TODO: make addr config
let addr = SocketAddr::from(([0, 0, 0, 0], self.config.port));
2025-07-04 00:00:11 +00:00
let listener = TcpListener::bind(&addr).await?;
axum::serve(
listener,
app.into_make_service_with_connect_info::<SocketAddr>(),
)
2025-07-06 23:02:11 +00:00
.with_graceful_shutdown(shutdown(stop_rx))
2025-07-04 00:00:11 +00:00
.await?;
Ok(())
}
fn create_router(&self) -> Router {
2025-07-04 00:00:11 +00:00
let device = self.device.clone();
Router::new()
.route("/api/localsend/v2/register", post(register_device))
.route(
"/api/localsend/v2/info",
2025-07-08 16:59:03 +00:00
get(move || async move { Json(device) }),
2025-07-04 00:00:11 +00:00
)
.route("/api/localsend/v2/prepare-upload", post(prepare_upload))
.route("/api/localsend/v2/upload", post(receive_upload))
2025-07-04 00:00:11 +00:00
.layer(DefaultBodyLimit::disable())
.layer(RequestBodyLimitLayer::new(1024 * 1024 * 1024))
.with_state(self.clone())
2025-07-04 00:00:11 +00:00
}
}
2025-07-06 23:02:11 +00:00
async fn shutdown(mut rx: mpsc::Receiver<()>) {
rx.recv().await.unwrap_or_default()
}