AppFlowy-Cloud/libs/realtime/src/entities.rs

96 lines
2.2 KiB
Rust

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<T> RealtimeUser for Arc<T> where T: RealtimeUser {}
#[derive(Debug, Message, Clone)]
#[rtype(result = "Result<(), RealtimeError>")]
pub struct Connect<U> {
pub socket: Recipient<RealtimeMessage>,
pub user: U,
}
#[derive(Debug, Message, Clone)]
#[rtype(result = "Result<(), RealtimeError>")]
pub struct Disconnect<U> {
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<U> {
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<u8>) -> Result<Self, serde_json::Error> {
serde_json::from_slice(&bytes)
}
}
impl From<RealtimeMessage> for Bytes {
fn from(msg: RealtimeMessage) -> Self {
let bytes = serde_json::to_vec(&msg).unwrap_or_default();
Bytes::from(bytes)
}
}
impl From<CollabMessage> 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<U> From<ClientMessage<U>> for RealtimeMessage
where
U: RealtimeUser,
{
fn from(client_msg: ClientMessage<U>) -> 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,
}