use std::path::PathBuf;
use std::sync::Arc;
use tokio::sync::{broadcast, Mutex, MutexGuard};
use crate::db::Database;
use crate::server::ws::{self, WsEvent};
#[derive(Clone)]
pub struct AppState {
pub db: Arc<Mutex<Database>>,
pub crosslink_dir: PathBuf,
pub version: &'static str,
pub ws_tx: broadcast::Sender<WsEvent>,
pub auth_token: String,
}
impl AppState {
pub fn new(db: Database, crosslink_dir: PathBuf) -> Self {
let (ws_tx, _ws_rx) = ws::channel();
let auth_token = generate_auth_token();
Self {
db: Arc::new(Mutex::new(db)),
crosslink_dir,
version: env!("CARGO_PKG_VERSION"),
ws_tx,
auth_token,
}
}
pub async fn db(&self) -> MutexGuard<'_, Database> {
self.db.lock().await
}
}
fn generate_auth_token() -> String {
use std::time::SystemTime;
let seed = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.unwrap_or_default()
.as_nanos();
let pid = u128::from(std::process::id());
format!("{:032x}", seed ^ (pid << 64))
}