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;
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
20pub type DbState = axum::extract::State<Arc<dyn DbProvider>>;
22pub type SettingsState = axum::extract::State<Arc<Settings>>;
23pub type CrateStorageState = axum::extract::State<Arc<KellnrCrateStorage>>;
24pub type CrateIoStorageState = axum::extract::State<Arc<CratesIoCrateStorage>>;
25pub type SigningKeyState = axum::extract::State<Key>;
26pub type CratesIoPrefetchSenderState = axum::extract::State<Sender<CratesioPrefetchMsg>>;
27pub type TokenCacheState = axum::extract::State<Arc<TokenCacheManager>>;
28pub type ToolchainStorageState = axum::extract::State<Option<Arc<ToolchainStorage>>>;
29pub type DownloadCounterState = axum::extract::State<Arc<DownloadCounter>>;
30pub type ProxyClientState = axum::extract::State<Client>;
31
32#[derive(Clone, FromRef)]
33pub struct AppStateData {
34 pub db: Arc<dyn DbProvider>,
35 pub signing_key: Key,
37 pub settings: Arc<Settings>,
38 pub crate_storage: Arc<KellnrCrateStorage>,
39 pub cratesio_storage: Arc<CratesIoCrateStorage>,
40 pub cratesio_prefetch_sender: Sender<CratesioPrefetchMsg>,
41 pub token_cache: Arc<TokenCacheManager>,
42 pub toolchain_storage: Option<Arc<ToolchainStorage>>,
43 pub download_counter: Arc<DownloadCounter>,
44 pub proxy_client: Client,
45}
46
47pub fn test_state() -> AppStateData {
48 let db: Arc<dyn DbProvider> = Arc::new(kellnr_db::mock::MockDb::new());
49 let signing_key = Key::generate();
50 let settings = Arc::new(kellnr_settings::test_settings());
51 let kellnr_storage = Box::new(FSStorage::new(&settings.crates_path()).unwrap()) as DynStorage;
52 let crate_storage = Arc::new(KellnrCrateStorage::new(&settings, kellnr_storage));
53 let cratesio_storage = Arc::new(CratesIoCrateStorage::new(
54 &settings,
55 Box::new(FSStorage::new(&settings.crates_io_path()).unwrap()) as DynStorage,
56 ));
57 let (cratesio_prefetch_sender, _) = flume::unbounded();
58 let token_cache = Arc::new(TokenCacheManager::new(false, 60, 1000));
59 let download_counter = Arc::new(DownloadCounter::new(db.clone(), 30));
60 AppStateData {
61 db,
62 signing_key,
63 settings,
64 crate_storage,
65 cratesio_storage,
66 cratesio_prefetch_sender,
67 token_cache,
68 toolchain_storage: None, download_counter,
70 proxy_client: kellnr_common::cratesio_downloader::CLIENT.clone(),
71 }
72}