1use rustls::sign::CertifiedKey;
7use std::{
8 collections::HashMap,
9 path::Path,
10 sync::{Arc, RwLock},
11};
12
13use crate::extensions::Extensions;
14use crate::prelude::*;
15use crate::profile_me_cache::ProfileMeCache;
16use crate::proxy_token_cache::ProxyTokenCache;
17use crate::{abac, request, scheduler, ws_broadcast::BroadcastManager};
18
19use cloudillo_types::auth_adapter::AuthAdapter;
20use cloudillo_types::blob_adapter::BlobAdapter;
21use cloudillo_types::crdt_adapter::CrdtAdapter;
22use cloudillo_types::identity_provider_adapter::IdentityProviderAdapter;
23use cloudillo_types::meta_adapter::MetaAdapter;
24use cloudillo_types::rtdb_adapter::RtdbAdapter;
25use cloudillo_types::worker;
26
27use crate::rate_limit::RateLimitManager;
28use crate::settings::service::SettingsService;
29use crate::settings::types::FrozenSettingsRegistry;
30
31pub const VERSION: &str = env!("CARGO_PKG_VERSION");
32
33#[derive(Debug, Clone, Copy)]
34pub enum ServerMode {
35 Standalone,
36 Proxy,
37 StreamProxy,
38}
39
40pub struct AppState {
41 pub scheduler: Arc<scheduler::Scheduler<App>>,
42 pub worker: Arc<worker::WorkerPool>,
43 pub request: request::Request,
44 pub proxy_tokens: Arc<ProxyTokenCache>,
45 pub profile_me: Arc<ProfileMeCache>,
46 pub acme_challenge_map: RwLock<HashMap<Box<str>, Box<str>>>,
47 pub certs: RwLock<HashMap<Box<str>, Arc<CertifiedKey>>>,
48 pub opts: AppBuilderOpts,
49 pub broadcast: BroadcastManager,
50 pub permission_checker: Arc<tokio::sync::RwLock<abac::PermissionChecker>>,
51
52 pub auth_adapter: Arc<dyn AuthAdapter>,
53 pub meta_adapter: Arc<dyn MetaAdapter>,
54 pub blob_adapter: Arc<dyn BlobAdapter>,
55 pub crdt_adapter: Arc<dyn CrdtAdapter>,
56 pub rtdb_adapter: Arc<dyn RtdbAdapter>,
57 pub idp_adapter: Option<Arc<dyn IdentityProviderAdapter>>,
58
59 pub settings: Arc<SettingsService>,
61 pub settings_registry: Arc<FrozenSettingsRegistry>,
62
63 pub rate_limiter: Arc<RateLimitManager>,
65
66 pub extensions: Extensions,
68}
69
70impl AppState {
71 pub fn ext<T: Send + Sync + 'static>(&self) -> ClResult<&T> {
73 self.extensions.get::<T>().ok_or_else(|| {
74 Error::Internal(format!("Extension {} not registered", std::any::type_name::<T>()))
75 })
76 }
77}
78
79pub type App = Arc<AppState>;
80
81pub struct Adapters {
82 pub auth_adapter: Option<Arc<dyn AuthAdapter>>,
83 pub meta_adapter: Option<Arc<dyn MetaAdapter>>,
84 pub blob_adapter: Option<Arc<dyn BlobAdapter>>,
85 pub crdt_adapter: Option<Arc<dyn CrdtAdapter>>,
86 pub rtdb_adapter: Option<Arc<dyn RtdbAdapter>>,
87 pub idp_adapter: Option<Arc<dyn IdentityProviderAdapter>>,
88}
89
90#[derive(Debug)]
91pub struct AppBuilderOpts {
92 pub mode: ServerMode,
93 pub listen: Box<str>,
94 pub listen_http: Option<Box<str>>,
95 pub base_id_tag: Option<Box<str>>,
96 pub base_app_domain: Option<Box<str>>,
97 pub base_password: Option<Box<str>>,
98 pub dist_dir: Box<Path>,
99 pub tmp_dir: Box<Path>,
100 pub acme_email: Option<Box<str>>,
101 pub local_address: Box<[Box<str>]>,
102 pub disable_cache: bool,
104}
105
106