63 lines
2.2 KiB
Rust
Raw Normal View History

2021-12-25 21:44:45 +08:00
use crate::errors::FlowyError;
2022-01-12 12:40:41 +08:00
use async_trait::async_trait;
2021-12-25 21:44:45 +08:00
use bytes::Bytes;
use dashmap::DashMap;
use flowy_collaboration::entities::ws::{DocumentClientWSData, DocumentServerWSData};
2021-12-25 21:44:45 +08:00
use lib_ws::WSConnectState;
use std::{convert::TryInto, sync::Arc};
2022-01-12 12:40:41 +08:00
#[async_trait]
2021-12-25 21:44:45 +08:00
pub(crate) trait DocumentWSReceiver: Send + Sync {
2022-01-12 12:40:41 +08:00
async fn receive_ws_data(&self, data: DocumentServerWSData) -> Result<(), FlowyError>;
fn connect_state_changed(&self, state: WSConnectState);
2021-12-25 21:44:45 +08:00
}
pub type WSStateReceiver = tokio::sync::broadcast::Receiver<WSConnectState>;
pub trait DocumentWebSocket: Send + Sync {
fn send(&self, data: DocumentClientWSData) -> Result<(), FlowyError>;
2021-12-25 21:44:45 +08:00
fn subscribe_state_changed(&self) -> WSStateReceiver;
}
pub struct DocumentWSReceivers {
// key: the document id
2022-01-12 12:40:41 +08:00
// value: DocumentWSReceiver
2021-12-25 21:44:45 +08:00
receivers: Arc<DashMap<String, Arc<dyn DocumentWSReceiver>>>,
}
impl std::default::Default for DocumentWSReceivers {
fn default() -> Self {
let receivers: Arc<DashMap<String, Arc<dyn DocumentWSReceiver>>> = Arc::new(DashMap::new());
DocumentWSReceivers { receivers }
}
}
impl DocumentWSReceivers {
pub fn new() -> Self { DocumentWSReceivers::default() }
2021-12-30 22:44:07 +08:00
pub(crate) fn add(&self, doc_id: &str, receiver: Arc<dyn DocumentWSReceiver>) {
2021-12-25 21:44:45 +08:00
if self.receivers.contains_key(doc_id) {
log::error!("Duplicate handler registered for {:?}", doc_id);
}
self.receivers.insert(doc_id.to_string(), receiver);
}
2021-12-30 22:44:07 +08:00
pub(crate) fn remove(&self, id: &str) { self.receivers.remove(id); }
2021-12-25 21:44:45 +08:00
2022-01-12 12:40:41 +08:00
pub async fn did_receive_data(&self, data: Bytes) {
let data: DocumentServerWSData = data.try_into().unwrap();
2021-12-25 21:44:45 +08:00
match self.receivers.get(&data.doc_id) {
2022-01-12 12:40:41 +08:00
None => tracing::error!("Can't find any source handler for {:?}", data.doc_id),
Some(handler) => match handler.receive_ws_data(data).await {
Ok(_) => {},
Err(e) => tracing::error!("{}", e),
2021-12-25 21:44:45 +08:00
},
}
}
2022-01-12 12:40:41 +08:00
pub async fn ws_connect_state_changed(&self, state: &WSConnectState) {
for receiver in self.receivers.iter() {
receiver.value().connect_state_changed(state.clone());
}
2021-12-25 21:44:45 +08:00
}
}