ceres: a small planet in a giant solar system
1pub mod fallback;
2pub mod well_known;
3pub mod xrpc;
4
5use std::net::SocketAddr;
6
7use axum::{Router, routing::get};
8use log::info;
9use tokio::net::TcpListener;
10use tokio_util::sync::CancellationToken;
11use tower_http::cors::CorsLayer;
12
13use crate::error::Result;
14use crate::state::AppState;
15
16pub async fn serve(
17 addr: SocketAddr,
18 state: AppState,
19 token: CancellationToken,
20) -> Result<()> {
21 let app: Router = Router::new()
22 .route("/.well-known/did.json", get(well_known::did_document))
23 .merge(xrpc::app_bsky_actor::routes())
24 .merge(xrpc::app_bsky_feed::routes())
25 .fallback(fallback::log_request)
26 .layer(CorsLayer::permissive())
27 .with_state(state);
28
29 let listener = TcpListener::bind(addr).await?;
30 info!("listening on http://{addr}");
31 axum::serve(listener, app)
32 .with_graceful_shutdown(token.cancelled_owned())
33 .await?;
34 Ok(())
35}