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