A lexicon-driven AppView for ATProto.
1pub mod admin;
2pub mod auth;
3pub mod config;
4pub mod db;
5pub mod delegation;
6pub mod dev_happyview;
7pub mod dns;
8pub mod domain;
9pub mod domain_middleware;
10pub mod error;
11pub mod event_log;
12pub mod external_auth;
13pub mod feature_flags;
14pub mod feature_middleware;
15pub mod http_retry;
16pub mod jetstream;
17pub mod jobs;
18pub mod labeler;
19pub mod lexicon;
20pub mod lua;
21pub mod lua_analysis;
22pub mod oauth;
23pub mod plc;
24pub mod plugin;
25pub mod profile;
26pub mod proxy_config;
27pub mod rate_limit;
28pub mod record_handler;
29pub mod record_refs;
30pub mod repo;
31pub mod resolve;
32pub mod server;
33pub mod service_entries;
34pub mod service_identity;
35pub mod setup;
36pub mod spaces;
37pub mod verification_methods;
38pub mod xrpc;
39
40use auth::oauth_store::{DbSessionStore, DbStateStore};
41use config::Config;
42use db::DatabaseBackend;
43use dns::NativeDnsResolver;
44use lexicon::LexiconRegistry;
45use plugin::official_registry::{RegistryConfig, SharedRegistry};
46use rate_limit::RateLimiter;
47use std::sync::Arc;
48use tokio::sync::watch;
49
50use atrium_identity::did::CommonDidResolver;
51use atrium_identity::handle::AtprotoHandleResolver;
52use atrium_oauth::DefaultHttpClient;
53
54pub type HappyViewOAuthClient = atrium_oauth::OAuthClient<
55 DbStateStore,
56 DbSessionStore,
57 CommonDidResolver<DefaultHttpClient>,
58 AtprotoHandleResolver<NativeDnsResolver, DefaultHttpClient>,
59>;
60
61pub type HappyViewOAuthSession = atrium_oauth::OAuthSession<
62 DefaultHttpClient,
63 CommonDidResolver<DefaultHttpClient>,
64 AtprotoHandleResolver<NativeDnsResolver, DefaultHttpClient>,
65 DbSessionStore,
66>;
67
68#[derive(Clone)]
69pub struct AppState {
70 pub config: Config,
71 pub http: reqwest::Client,
72 pub db: sqlx::AnyPool,
73 pub backfill_db: sqlx::AnyPool,
74 pub db_backend: DatabaseBackend,
75 pub domain_cache: domain::DomainCache,
76 pub lexicons: LexiconRegistry,
77 pub collections_tx: watch::Sender<Vec<String>>,
78 pub labeler_subscriptions_tx: watch::Sender<()>,
79 pub rate_limiter: Arc<RateLimiter>,
80 pub oauth: Arc<auth::OAuthClientRegistry>,
81 pub oauth_state_store: DbStateStore,
82 pub cookie_key: axum_extra::extract::cookie::Key,
83 pub plugin_registry: Arc<plugin::PluginRegistry>,
84 pub wasm_runtime: Arc<plugin::WasmRuntime>,
85 pub attestation_signer: Option<Arc<plugin::attestation::AttestationSigner>>,
86 pub official_registry: SharedRegistry,
87 pub official_registry_config: RegistryConfig,
88 pub proxy_config: Arc<arc_swap::ArcSwap<proxy_config::ProxyConfig>>,
89 pub backfill_events_tx: tokio::sync::broadcast::Sender<crate::admin::types::BackfillEvent>,
90 pub verbose_event_logging: std::sync::Arc<std::sync::atomic::AtomicBool>,
91}
92
93impl axum::extract::FromRef<AppState> for axum_extra::extract::cookie::Key {
94 fn from_ref(state: &AppState) -> Self {
95 state.cookie_key.clone()
96 }
97}