Skip to main content

kellnr_appstate/
lib.rs

1use std::sync::Arc;
2
3use axum::extract::FromRef;
4use axum_extra::extract::cookie::Key;
5use flume::Sender;
6use kellnr_common::cratesio_prefetch_msg::CratesioPrefetchMsg;
7use kellnr_common::token_cache::TokenCacheManager;
8use kellnr_db::DbProvider;
9use kellnr_db::download_counter::DownloadCounter;
10use kellnr_settings::{Settings, SettingsProv};
11use kellnr_storage::cached_crate_storage::DynStorage;
12use kellnr_storage::cratesio_crate_storage::CratesIoCrateStorage;
13use kellnr_storage::fs_storage::FSStorage;
14use kellnr_storage::kellnr_crate_storage::KellnrCrateStorage;
15use kellnr_storage::toolchain_storage::ToolchainStorage;
16use reqwest::Client;
17
18pub type AppState = axum::extract::State<AppStateData>;
19
20// Substates
21pub type DbState = axum::extract::State<Arc<dyn DbProvider>>;
22pub type SettingsState = axum::extract::State<Arc<Settings>>;
23pub type SettingsProvState = axum::extract::State<Arc<SettingsProv>>;
24pub type CrateStorageState = axum::extract::State<Arc<KellnrCrateStorage>>;
25pub type CrateIoStorageState = axum::extract::State<Arc<CratesIoCrateStorage>>;
26pub type SigningKeyState = axum::extract::State<Key>;
27pub type CratesIoPrefetchSenderState = axum::extract::State<Sender<CratesioPrefetchMsg>>;
28pub type TokenCacheState = axum::extract::State<Arc<TokenCacheManager>>;
29pub type ToolchainStorageState = axum::extract::State<Option<Arc<ToolchainStorage>>>;
30pub type DownloadCounterState = axum::extract::State<Arc<DownloadCounter>>;
31pub type ProxyClientState = axum::extract::State<Client>;
32
33#[derive(Clone, FromRef)]
34pub struct AppStateData {
35    pub db: Arc<dyn DbProvider>,
36    // key that is used for signing cookies
37    pub signing_key: Key,
38    pub settings: Arc<Settings>,
39    /// Per-leaf provenance for the merged `settings`. Only the `/settings`
40    /// web-ui handler reads this; everything else uses the plain `Settings`.
41    pub settings_prov: Arc<SettingsProv>,
42    pub crate_storage: Arc<KellnrCrateStorage>,
43    pub cratesio_storage: Arc<CratesIoCrateStorage>,
44    pub cratesio_prefetch_sender: Sender<CratesioPrefetchMsg>,
45    pub token_cache: Arc<TokenCacheManager>,
46    pub toolchain_storage: Option<Arc<ToolchainStorage>>,
47    pub download_counter: Arc<DownloadCounter>,
48    pub proxy_client: Client,
49}
50
51/// Build a defaults-only `SettingsProv`, every leaf reports
52/// `Category::Default`. Convenient for ad-hoc test `AppStateData`
53/// construction where the `settings_prov` field isn't otherwise relevant.
54#[must_use]
55pub fn default_settings_prov() -> Arc<SettingsProv> {
56    Arc::new(
57        provcfg::Config::new()
58            .build::<SettingsProv>()
59            .expect("default SettingsProv build is infallible"),
60    )
61}
62
63pub fn test_state() -> AppStateData {
64    let db: Arc<dyn DbProvider> = Arc::new(kellnr_db::mock::MockDb::new());
65    let signing_key = Key::generate();
66    let settings = Arc::new(kellnr_settings::test_settings());
67    let settings_prov = default_settings_prov();
68    let kellnr_storage = Box::new(FSStorage::new(&settings.crates_path()).unwrap()) as DynStorage;
69    let crate_storage = Arc::new(KellnrCrateStorage::new(&settings, kellnr_storage));
70    let cratesio_storage = Arc::new(CratesIoCrateStorage::new(
71        &settings,
72        Box::new(FSStorage::new(&settings.crates_io_path()).unwrap()) as DynStorage,
73    ));
74    let (cratesio_prefetch_sender, _) = flume::unbounded();
75    let token_cache = Arc::new(TokenCacheManager::new(false, 60, 1000));
76    let download_counter = Arc::new(DownloadCounter::new(db.clone(), 30));
77    AppStateData {
78        db,
79        signing_key,
80        settings,
81        settings_prov,
82        crate_storage,
83        cratesio_storage,
84        cratesio_prefetch_sender,
85        token_cache,
86        toolchain_storage: None, // Toolchain storage disabled in tests by default
87        download_counter,
88        proxy_client: kellnr_common::cratesio_downloader::CLIENT.clone(),
89    }
90}