use crate::Result;
use crate::config::Config;
use crate::plugin::Registry;
use crate::web::config::WebConfig;
use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::Instant;
use tokio::sync::RwLock;
use super::alerts::AlertEngine;
use super::metrics::MetricsCollector;
pub struct WebState {
config: WebConfig,
metrics_collector: Arc<MetricsCollector>,
alert_engine: Arc<AlertEngine>,
start_time: Instant,
registry: Option<Arc<Registry>>,
config_arc: Option<Arc<RwLock<Config>>>,
sse_connections: Arc<AtomicU64>,
ws_connections: Arc<AtomicU64>,
}
impl WebState {
pub async fn new(config: &WebConfig) -> Result<Self> {
let metrics_collector = Arc::new(MetricsCollector::new(&config.metrics)?);
let alert_engine = Arc::new(AlertEngine::new(&config.alerts)?);
Ok(Self {
config: config.clone(),
metrics_collector,
alert_engine,
start_time: Instant::now(),
registry: None,
config_arc: None,
sse_connections: Arc::new(AtomicU64::new(0)),
ws_connections: Arc::new(AtomicU64::new(0)),
})
}
pub fn set_registry(&mut self, registry: Arc<Registry>) {
self.registry = Some(registry);
}
pub fn set_config_arc(&mut self, config: Arc<RwLock<Config>>) {
self.config_arc = Some(config);
}
pub fn registry(&self) -> Option<Arc<Registry>> {
self.registry.clone()
}
pub fn config_arc(&self) -> Option<Arc<RwLock<Config>>> {
self.config_arc.clone()
}
pub fn config(&self) -> &WebConfig {
&self.config
}
pub fn metrics_collector(&self) -> Arc<MetricsCollector> {
Arc::clone(&self.metrics_collector)
}
pub fn alert_engine(&self) -> Arc<AlertEngine> {
Arc::clone(&self.alert_engine)
}
pub fn uptime_secs(&self) -> u64 {
self.start_time.elapsed().as_secs()
}
pub fn sse_connections(&self) -> Arc<AtomicU64> {
Arc::clone(&self.sse_connections)
}
pub fn ws_connections(&self) -> Arc<AtomicU64> {
Arc::clone(&self.ws_connections)
}
pub fn active_sse_connections(&self) -> u64 {
self.sse_connections.load(Ordering::Relaxed)
}
pub fn active_ws_connections(&self) -> u64 {
self.ws_connections.load(Ordering::Relaxed)
}
}