pub struct AppState {Show 23 fields
pub db: DbPool,
pub config_path: PathBuf,
pub data_dir: PathBuf,
pub event_tx: Sender<AccountWsEvent>,
pub api_token: String,
pub passphrase_hash: RwLock<Option<String>>,
pub passphrase_hash_mtime: RwLock<Option<SystemTime>>,
pub bind_host: String,
pub bind_port: u16,
pub login_attempts: Mutex<HashMap<IpAddr, (u32, Instant)>>,
pub runtimes: Mutex<HashMap<String, Runtime>>,
pub content_generators: Mutex<HashMap<String, Arc<ContentGenerator>>>,
pub circuit_breaker: Option<Arc<CircuitBreaker>>,
pub scraper_health: Option<ScraperHealth>,
pub watchtower_cancel: RwLock<Option<CancellationToken>>,
pub content_sources: RwLock<ContentSourcesConfig>,
pub connector_config: ConnectorConfig,
pub deployment_mode: DeploymentMode,
pub pending_oauth: Mutex<HashMap<String, PendingOAuth>>,
pub token_managers: Mutex<HashMap<String, Arc<TokenManager>>>,
pub x_client_id: String,
pub semantic_index: Option<Arc<RwLock<SemanticIndex>>>,
pub embedding_provider: Option<Arc<dyn EmbeddingProvider>>,
}Expand description
Shared application state accessible by all route handlers.
Fields§
§db: DbPoolSQLite connection pool.
config_path: PathBufPath to the configuration file.
data_dir: PathBufData directory for media storage (parent of config file).
event_tx: Sender<AccountWsEvent>Broadcast channel sender for real-time WebSocket events.
api_token: StringLocal bearer token for API authentication.
passphrase_hash: RwLock<Option<String>>Bcrypt hash of the web login passphrase (None if not configured).
passphrase_hash_mtime: RwLock<Option<SystemTime>>Last-observed mtime of the passphrase_hash file (for detecting out-of-band resets).
bind_host: StringHost address the server is bound to.
bind_port: u16Port the server is listening on.
login_attempts: Mutex<HashMap<IpAddr, (u32, Instant)>>Per-IP login attempt tracking for rate limiting: (count, window_start).
runtimes: Mutex<HashMap<String, Runtime>>Per-account automation runtimes (keyed by account_id).
content_generators: Mutex<HashMap<String, Arc<ContentGenerator>>>Per-account content generators for AI assist endpoints.
circuit_breaker: Option<Arc<CircuitBreaker>>Optional circuit breaker for X API rate-limit protection.
scraper_health: Option<ScraperHealth>Optional scraper health tracker (populated when provider_backend = “scraper”).
watchtower_cancel: RwLock<Option<CancellationToken>>Cancellation token for the Watchtower filesystem watcher (None if not running).
content_sources: RwLock<ContentSourcesConfig>Content sources configuration for the Watchtower.
connector_config: ConnectorConfigConnector configuration for remote source OAuth flows.
deployment_mode: DeploymentModeDeployment mode (desktop, self_host, or cloud).
pending_oauth: Mutex<HashMap<String, PendingOAuth>>Pending OAuth PKCE challenges keyed by state parameter.
token_managers: Mutex<HashMap<String, Arc<TokenManager>>>Per-account X API token managers for automatic token refresh.
x_client_id: StringX API client ID from config (needed to create token managers).
semantic_index: Option<Arc<RwLock<SemanticIndex>>>In-memory semantic search index (None if embedding not configured).
embedding_provider: Option<Arc<dyn EmbeddingProvider>>Embedding provider for semantic indexing (None if not configured).
Implementations§
Source§impl AppState
impl AppState
Sourcepub async fn get_x_access_token(
&self,
token_path: &Path,
account_id: &str,
) -> Result<String, XApiError>
pub async fn get_x_access_token( &self, token_path: &Path, account_id: &str, ) -> Result<String, XApiError>
Get a fresh X API access token for the given account.
Lazily creates a TokenManager on first use (loading tokens from disk),
then returns a token that is automatically refreshed before expiry.
Sourcepub async fn load_effective_config(
&self,
account_id: &str,
) -> Result<Config, String>
pub async fn load_effective_config( &self, account_id: &str, ) -> Result<Config, String>
Load the effective config for a given account.
Default account: reads config.toml directly (backward compat).
Non-default: merges config.toml base with account’s config_overrides from DB.
Sourcepub async fn get_or_create_content_generator(
&self,
account_id: &str,
) -> Result<Arc<ContentGenerator>, String>
pub async fn get_or_create_content_generator( &self, account_id: &str, ) -> Result<Arc<ContentGenerator>, String>
Lazily create or return a cached ContentGenerator for the given account.
Loads effective config, creates the LLM provider, and caches the generator.
Sourcepub fn is_local_first(&self) -> bool
pub fn is_local_first(&self) -> bool
Returns true if the current deployment mode is local-first (Desktop).
Sourcepub async fn restart_watchtower(&self)
pub async fn restart_watchtower(&self)
Cancel the running Watchtower (if any), reload config from disk, and spawn a new Watchtower loop with the updated sources.
Called after PATCH /api/settings modifies content_sources or
deployment_mode.
Auto Trait Implementations§
impl !Freeze for AppState
impl !RefUnwindSafe for AppState
impl Send for AppState
impl Sync for AppState
impl Unpin for AppState
impl UnsafeUnpin for AppState
impl !UnwindSafe for AppState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more