use crate::config::WebSocketConfig;
use crate::model::ConnectionState;
use crate::model::subscription::SubscriptionManager;
use std::sync::Arc;
use tokio::sync::Mutex;
#[derive(Debug)]
pub struct WebSocketSession {
config: Arc<WebSocketConfig>,
state: Arc<Mutex<ConnectionState>>,
subscription_manager: Arc<Mutex<SubscriptionManager>>,
}
impl WebSocketSession {
pub fn new(
config: impl Into<Arc<WebSocketConfig>>,
subscription_manager: Arc<Mutex<SubscriptionManager>>,
) -> Self {
Self {
config: config.into(),
state: Arc::new(Mutex::new(ConnectionState::Disconnected)),
subscription_manager,
}
}
pub async fn state(&self) -> ConnectionState {
self.state.lock().await.clone()
}
pub async fn set_state(&self, new_state: ConnectionState) {
*self.state.lock().await = new_state;
}
pub fn config(&self) -> &WebSocketConfig {
&self.config
}
pub fn subscription_manager(&self) -> Arc<Mutex<SubscriptionManager>> {
Arc::clone(&self.subscription_manager)
}
pub async fn is_connected(&self) -> bool {
matches!(
*self.state.lock().await,
ConnectionState::Connected | ConnectionState::Authenticated
)
}
pub async fn is_authenticated(&self) -> bool {
matches!(*self.state.lock().await, ConnectionState::Authenticated)
}
pub async fn mark_authenticated(&self) {
self.set_state(ConnectionState::Authenticated).await;
}
pub async fn mark_disconnected(&self) {
self.set_state(ConnectionState::Disconnected).await;
self.subscription_manager.lock().await.deactivate_all();
}
pub async fn reactivate_subscriptions(&self) {
self.subscription_manager.lock().await.reactivate_all();
}
}