use crate::error::RealtimeError; use actix::{Message, Recipient}; use bytes::Bytes; use collab::core::origin::CollabOrigin; use collab_define::collab_msg::CollabMessage; use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; use std::fmt::{Debug, Display}; use std::hash::Hash; use std::sync::Arc; pub trait RealtimeUser: Clone + Debug + Send + Sync + 'static + Display + Hash + Eq + PartialEq { } impl RealtimeUser for Arc where T: RealtimeUser {} #[derive(Debug, Message, Clone)] #[rtype(result = "Result<(), RealtimeError>")] pub struct Connect { pub socket: Recipient, pub user: U, } #[derive(Debug, Message, Clone)] #[rtype(result = "Result<(), RealtimeError>")] pub struct Disconnect { pub user: U, } #[derive(Debug, Clone, Serialize_repr, Deserialize_repr)] #[repr(u8)] pub enum BusinessID { CollabId = 1, } #[derive(Debug, Message, Clone)] #[rtype(result = "Result<(), RealtimeError>")] pub struct ClientMessage { pub business_id: BusinessID, pub user: U, pub content: CollabMessage, } #[derive(Debug, Clone, Message, Serialize, Deserialize)] #[rtype(result = "()")] pub struct RealtimeMessage { pub business_id: BusinessID, pub object_id: String, pub payload: Bytes, } impl RealtimeMessage { pub fn from_vec(bytes: Vec) -> Result { serde_json::from_slice(&bytes) } } impl From for Bytes { fn from(msg: RealtimeMessage) -> Self { let bytes = serde_json::to_vec(&msg).unwrap_or_default(); Bytes::from(bytes) } } impl From for RealtimeMessage { fn from(msg: CollabMessage) -> Self { Self { business_id: BusinessID::CollabId, object_id: msg.object_id().to_string(), payload: Bytes::from(msg.to_vec()), } } } impl From> for RealtimeMessage where U: RealtimeUser, { fn from(client_msg: ClientMessage) -> Self { Self { business_id: client_msg.business_id, object_id: client_msg.content.object_id().to_string(), payload: Bytes::from(client_msg.content.to_vec()), } } } #[derive(Debug, Hash, PartialEq, Eq)] pub(crate) struct Editing { pub object_id: String, pub origin: CollabOrigin, }