pub mod collaborative_editing;
pub mod conflict_resolution;
pub mod live_updates;
pub mod message_protocol;
pub mod touch_interactions;
pub mod websocket_connection;
pub use collaborative_editing::{
CollaborationError, CollaborationSession, CollaborationSettings, CollaborationStats,
CollaborativeEditor, Collaborator, ConflictResolutionStrategy, EditOperation,
EditOperationType, ElementChanges as CollaborationElementChanges,
ElementStyle as CollaborationElementStyle, Size as CollaborationSize, UserPermissions,
};
pub use conflict_resolution::{
Conflict, ConflictResolution, ConflictResolutionError, ConflictResolutionManager,
ConflictSeverity, ConflictStats, ConflictType, ResolutionStrategy, TransformContext,
TransformResult,
};
pub use live_updates::{
AuthConfig, AuthType, DataFilter, DataSourceConfig, DataSourceType, DataTransform,
FilterOperator, LiveDataSource, LiveUpdate, LiveUpdateError, LiveUpdateManager,
LiveUpdateStats, TransformType, UpdatePriority, UpdateSubscription, UpdateType,
};
pub use touch_interactions::{
Gesture, GestureType, SwipeDirection, TouchConfig, TouchInteractionError,
TouchInteractionManager, TouchPoint, TouchStats,
};
pub use websocket_connection::{
ChartElement, ChartOperation, ConnectionState, ConnectionStats, DataPoint, ElementChanges,
ElementType, Position, UserStatus, WebSocketConfig, WebSocketConnection, WebSocketError,
WebSocketMessage,
};
pub use message_protocol::{
AcknowledgmentStatus, ActivityType, DataFilter as MessageDataFilter, DataUpdateType,
ElementStyle, FilterOperator as MessageFilterOperator, Message, MessagePayload,
MessageProtocol, MessageProtocolError, MessageType, SessionUpdateType, Size, StreamConfig,
};
pub struct RealtimeManager {
websocket: WebSocketConnection,
message_protocol: MessageProtocol,
session_id: Option<String>,
user_id: Option<String>,
}
impl RealtimeManager {
pub fn new(config: WebSocketConfig) -> Self {
Self {
websocket: WebSocketConnection::new(config),
message_protocol: MessageProtocol::new(),
session_id: None,
user_id: None,
}
}
pub async fn connect(&self) -> Result<(), WebSocketError> {
self.websocket.connect().await
}
pub async fn disconnect(&self) -> Result<(), WebSocketError> {
self.websocket.disconnect().await
}
pub async fn send_message(&self, message: Message) -> Result<(), WebSocketError> {
let _serialized = self
.message_protocol
.serialize(&message)
.map_err(|e| WebSocketError::SerializationFailed(e.to_string()))?;
let ws_message = WebSocketMessage::DataUpdate {
chart_id: "default".to_string(),
data: vec![],
timestamp: message.timestamp,
};
self.websocket.send_message(ws_message).await
}
pub async fn get_stats(&self) -> ConnectionStats {
self.websocket.get_stats().await
}
pub async fn get_state(&self) -> ConnectionState {
self.websocket.get_state().await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_realtime_manager_creation() {
let config = WebSocketConfig::default();
let manager = RealtimeManager::new(config);
let state = manager.get_state().await;
assert_eq!(state, ConnectionState::Disconnected);
}
#[tokio::test]
async fn test_realtime_manager_connection() {
let config = WebSocketConfig::default();
let manager = RealtimeManager::new(config);
let result = manager.connect().await;
assert!(result.is_ok());
let state = manager.get_state().await;
assert_eq!(state, ConnectionState::Connected);
}
#[tokio::test]
async fn test_realtime_manager_disconnection() {
let config = WebSocketConfig::default();
let manager = RealtimeManager::new(config);
manager.connect().await.unwrap();
let result = manager.disconnect().await;
assert!(result.is_ok());
let state = manager.get_state().await;
assert_eq!(state, ConnectionState::Disconnected);
}
}