snix_castore_http/
router.rs1use crate::app_state::{AppConfig, AppState};
2use crate::routes;
3
4use snix_castore::Node;
5use snix_castore::utils::ServiceUrlsGrpc;
6
7use axum::{Router, routing::get};
8use std::sync::Arc;
9use tokio_listener::ListenerAddressLFlag;
10use tracing::info;
11
12pub async fn gen_router(
14 listen_args: ListenerAddressLFlag,
15 service_addrs: ServiceUrlsGrpc,
16 root_node: Node,
17 index_names: &[String],
18 auto_index: bool,
19) -> anyhow::Result<()> {
20 let (blob_service, directory_service) = snix_castore::utils::construct_services(service_addrs)
21 .await
22 .expect("failed to construct services");
23
24 let app_state = Arc::new(AppConfig {
25 blob_service,
26 directory_service,
27 root_node,
28 index_names: index_names.to_vec(),
29 auto_index,
30 });
31
32 let app = app(app_state);
33
34 let listen_address = &listen_args.listen_address.unwrap_or_else(|| {
35 "[::]:9000"
36 .parse()
37 .expect("invalid fallback listen address")
38 });
39
40 let listener = tokio_listener::Listener::bind(
41 listen_address,
42 &Default::default(),
43 &listen_args.listener_options,
44 )
45 .await?;
46
47 info!(listen_address=%listen_address, "starting daemon");
48
49 tokio_listener::axum07::serve(
50 listener,
51 app.into_make_service_with_connect_info::<tokio_listener::SomeSocketAddrClonable>(),
52 )
53 .await?;
54 Ok(())
55}
56
57pub fn app(app_state: AppState) -> Router {
58 Router::new()
59 .route("/*path", get(routes::root_node_contents))
60 .route("/", get(routes::root_node_contents))
61 .with_state(app_state)
62}