mod connection;
pub mod events;
mod routes;
mod state;
use std::collections::HashSet;
use std::error::Error as StdError;
use std::net::SocketAddr;
use std::sync::Arc;
use axum::Router;
use axum::routing::{get, post};
use tokio::net::TcpListener;
use tokio::sync::{Mutex, broadcast};
use tracing::info;
use events::set_broadcast_tx;
use state::AppState;
const BROADCAST_CAPACITY: usize = 1000;
pub async fn websocket_server(port: u16) -> Result<(), Box<dyn StdError>> {
let capacity: usize = BROADCAST_CAPACITY;
let (tx, _) = broadcast::channel::<String>(capacity);
set_broadcast_tx(tx.clone());
info!("DMS Broadcast channel created with capacity: {}", capacity);
let active_subscribers: Arc<Mutex<HashSet<String>>> = Arc::new(Mutex::new(HashSet::new()));
let app_state: AppState = AppState {
tx: tx.clone(),
active_subscribers,
};
let app: Router = Router::new()
.route("/ws", get(routes::ws_handler))
.route("/events", post(routes::publish_event))
.route("/status", get(routes::status))
.with_state(app_state);
let addr = SocketAddr::from(([0, 0, 0, 0], port));
info!("Server running at http://{}", addr);
info!("WebSocket endpoint available at ws://{}/ws", addr);
let listener = TcpListener::bind(&addr).await?;
axum::serve(listener, app).await?;
info!("Server started successfully");
Ok(())
}