pub mod fallback; pub mod well_known; pub mod xrpc; use std::net::SocketAddr; use axum::{Router, routing::get}; use log::info; use tokio::net::TcpListener; use tokio_util::sync::CancellationToken; use tower_http::cors::CorsLayer; use crate::error::Result; use crate::state::AppState; pub async fn serve( addr: SocketAddr, state: AppState, token: CancellationToken, ) -> Result<()> { let app: Router = Router::new() .route("/.well-known/did.json", get(well_known::did_document)) .merge(xrpc::app_bsky_actor::routes()) .merge(xrpc::app_bsky_feed::routes()) .fallback(fallback::log_request) .layer(CorsLayer::permissive()) .with_state(state); let listener = TcpListener::bind(addr).await?; info!("listening on http://{addr}"); axum::serve(listener, app) .with_graceful_shutdown(token.cancelled_owned()) .await?; Ok(()) }