Skip to main content

kellnr_http/
state.rs

1use std::sync::Arc;
2
3use axum::extract::FromRef;
4use axum_extra::extract::cookie::Key;
5use flume::Sender;
6use kellnr_common::background_tasks::BackgroundTasks;
7use kellnr_common::cratesio_prefetch_msg::CratesioPrefetchMsg;
8use kellnr_cratesio_sync::CratesioSync;
9use kellnr_db::DbProvider;
10use kellnr_db::download_counter::DownloadCounter;
11use kellnr_filter::DownloadFilters;
12use kellnr_settings::{Settings, SettingsProv};
13use kellnr_storage::cratesio_crate_storage::CratesIoCrateStorage;
14use kellnr_storage::docs_storage::DocsStorage;
15use kellnr_storage::kellnr_crate_storage::KellnrCrateStorage;
16use kellnr_storage::toolchain_storage::ToolchainStorage;
17use reqwest::Client;
18
19use crate::login_throttle::LoginThrottle;
20use crate::token_cache::TokenCacheManager;
21
22pub type AppState = axum::extract::State<AppStateData>;
23
24// Substates
25pub type DbState = axum::extract::State<Arc<dyn DbProvider>>;
26pub type SettingsState = axum::extract::State<Arc<Settings>>;
27pub type SettingsProvState = axum::extract::State<Arc<SettingsProv>>;
28pub type DocsStorageState = axum::extract::State<Arc<DocsStorage>>;
29pub type CratesIoPrefetchSenderState = axum::extract::State<Sender<CratesioPrefetchMsg>>;
30pub type TokenCacheState = axum::extract::State<Arc<TokenCacheManager>>;
31pub type LoginThrottleState = axum::extract::State<Arc<LoginThrottle>>;
32pub type ToolchainStorageState = axum::extract::State<Option<Arc<ToolchainStorage>>>;
33pub type ProxyClientState = axum::extract::State<Client>;
34pub type BackgroundTasksState = axum::extract::State<BackgroundTasks>;
35
36#[derive(Clone, FromRef)]
37pub struct AppStateData {
38    pub db: Arc<dyn DbProvider>,
39    // key that is used for signing cookies
40    pub signing_key: Key,
41    pub settings: Arc<Settings>,
42    /// Per-leaf provenance for the merged `settings`. Only the `/settings`
43    /// web-ui handler reads this; everything else uses the plain `Settings`.
44    pub settings_prov: Arc<SettingsProv>,
45    pub crate_storage: Arc<KellnrCrateStorage>,
46    pub cratesio_storage: Arc<CratesIoCrateStorage>,
47    /// Always present, unlike `toolchain_storage`: `/docs/*` serving and
48    /// manual doc publishing are mounted regardless of `settings.docs.enabled`
49    /// (that flag only gates the automatic generation queue).
50    pub docs_storage: Arc<DocsStorage>,
51    pub cratesio_prefetch_sender: Sender<CratesioPrefetchMsg>,
52    pub token_cache: Arc<TokenCacheManager>,
53    /// Per-username throttle for password authentication attempts.
54    pub login_throttle: Arc<LoginThrottle>,
55    pub toolchain_storage: Option<Arc<ToolchainStorage>>,
56    pub download_counter: Arc<DownloadCounter>,
57    pub proxy_client: Client,
58    pub cratesio_sync: CratesioSync,
59    pub download_filters: Arc<DownloadFilters>,
60    /// Work that outlives a request, e.g. processing an upload, runs here so
61    /// shutdown waits for it.
62    pub background_tasks: BackgroundTasks,
63}
64
65/// Build a defaults-only `SettingsProv`, every leaf reports
66/// `Category::Default`. Convenient for ad-hoc test `AppStateData`
67/// construction where the `settings_prov` field isn't otherwise relevant.
68#[must_use]
69pub fn default_settings_prov() -> Arc<SettingsProv> {
70    Arc::new(
71        provcfg::Config::new()
72            .build::<SettingsProv>()
73            .expect("default SettingsProv build is infallible"),
74    )
75}