use wsb::prelude::*;
use tokio::sync::{broadcast, RwLock};
use super::handlers::fleet::RepoDetailedStatus;
use super::handlers::workspace::WorkspaceChangedEvent;
use super::ops::OpsRegistry;
use wsb::persist::global::models::PlaceFilter;
use wsb::persist::global::{DatabaseService, SessionRepo, WsbRepos};
#[derive(Clone, Debug, serde::Serialize)]
pub struct FileChangedEvent {
pub path: String,
pub mtime_secs: Option<u64>,
}
#[derive(Clone)]
pub struct WebState {
pub db: Arc<WsbRepos>,
pub db_service: Arc<DatabaseService>,
pub sessions: Arc<SessionRepo>,
pub place: Option<PlaceFilter>,
pub workspace_root: PathBuf,
pub listen: std::net::IpAddr,
pub port: u16,
pub git_status_tx: broadcast::Sender<RepoDetailedStatus>,
pub git_status_snapshot: Arc<RwLock<HashMap<String, RepoDetailedStatus>>>,
pub git_focus_tx: broadcast::Sender<String>,
pub git_nudge_tx: broadcast::Sender<Option<String>>,
pub ops: OpsRegistry,
pub file_changed_tx: broadcast::Sender<FileChangedEvent>,
pub workspace_changed_tx: broadcast::Sender<WorkspaceChangedEvent>,
pub github: Result<Arc<super::github::GitHub>, String>,
}
impl WebState {
pub async fn new(
db: Arc<WsbRepos>,
db_service: Arc<DatabaseService>,
sessions: Arc<SessionRepo>,
place: Option<PlaceFilter>,
workspace_root: PathBuf,
listen: std::net::IpAddr,
port: u16,
github: Result<Arc<super::github::GitHub>, String>,
) -> Result<Self> {
let (git_status_tx, _) = broadcast::channel(64);
let (git_focus_tx, _) = broadcast::channel(16);
let (git_nudge_tx, _) = broadcast::channel::<Option<String>>(64);
let (file_changed_tx, _) = broadcast::channel(256);
let (workspace_changed_tx, _) = broadcast::channel::<WorkspaceChangedEvent>(64);
let logs_root = wsb::logs::root(&workspace_root);
Ok(Self {
db,
db_service,
sessions,
place,
workspace_root,
listen,
port,
git_status_tx,
git_status_snapshot: Arc::new(RwLock::new(HashMap::new())),
git_focus_tx,
git_nudge_tx,
ops: OpsRegistry::with_logs(logs_root),
file_changed_tx,
workspace_changed_tx,
github,
})
}
}