2021-12-12 12:41:16 +08:00
|
|
|
use crate::{
|
|
|
|
|
errors::UserError,
|
|
|
|
|
services::user::ws_manager::{FlowyWebSocket, FlowyWsSender},
|
|
|
|
|
};
|
|
|
|
|
use bytes::Bytes;
|
|
|
|
|
use dashmap::DashMap;
|
2021-12-13 13:55:44 +08:00
|
|
|
use flowy_collaboration::{
|
|
|
|
|
core::sync::{ServerDocManager, ServerDocPersistence},
|
|
|
|
|
entities::{
|
|
|
|
|
doc::{Doc, NewDocUser},
|
|
|
|
|
ws::{WsDataType, WsDocumentData},
|
|
|
|
|
},
|
|
|
|
|
errors::CollaborateError,
|
|
|
|
|
};
|
|
|
|
|
use lazy_static::lazy_static;
|
|
|
|
|
use lib_infra::future::{FutureResult, FutureResultSend};
|
|
|
|
|
use lib_ot::{revision::Revision, rich_text::RichTextDelta};
|
2021-12-12 12:41:16 +08:00
|
|
|
use lib_ws::{WsConnectState, WsMessage, WsMessageHandler, WsModule};
|
2021-12-13 13:55:44 +08:00
|
|
|
use parking_lot::RwLock;
|
2021-12-12 12:41:16 +08:00
|
|
|
use std::{convert::TryFrom, sync::Arc};
|
|
|
|
|
use tokio::sync::{broadcast, broadcast::Receiver};
|
|
|
|
|
|
|
|
|
|
pub struct MockWebSocket {
|
|
|
|
|
handlers: DashMap<WsModule, Arc<dyn WsMessageHandler>>,
|
|
|
|
|
state_sender: broadcast::Sender<WsConnectState>,
|
|
|
|
|
ws_sender: broadcast::Sender<WsMessage>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl std::default::Default for MockWebSocket {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
let (state_sender, _) = broadcast::channel(16);
|
|
|
|
|
let (ws_sender, _) = broadcast::channel(16);
|
|
|
|
|
MockWebSocket {
|
|
|
|
|
handlers: DashMap::new(),
|
|
|
|
|
state_sender,
|
|
|
|
|
ws_sender,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl MockWebSocket {
|
|
|
|
|
pub fn new() -> MockWebSocket { MockWebSocket::default() }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl FlowyWebSocket for Arc<MockWebSocket> {
|
2021-12-13 13:55:44 +08:00
|
|
|
fn start_connect(&self, _addr: String) -> FutureResult<(), UserError> {
|
2021-12-12 12:41:16 +08:00
|
|
|
let mut ws_receiver = self.ws_sender.subscribe();
|
|
|
|
|
let cloned_ws = self.clone();
|
|
|
|
|
tokio::spawn(async move {
|
|
|
|
|
while let Ok(message) = ws_receiver.recv().await {
|
|
|
|
|
let ws_data = WsDocumentData::try_from(Bytes::from(message.data.clone())).unwrap();
|
2021-12-13 13:55:44 +08:00
|
|
|
match DOC_SERVER.handle_ws_data(ws_data).await {
|
|
|
|
|
None => {},
|
|
|
|
|
Some(new_ws_message) => match cloned_ws.handlers.get(&new_ws_message.module) {
|
|
|
|
|
None => log::error!("Can't find any handler for message: {:?}", new_ws_message),
|
|
|
|
|
Some(handler) => handler.receive_message(new_ws_message.clone()),
|
|
|
|
|
},
|
2021-12-12 12:41:16 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
FutureResult::new(async { Ok(()) })
|
2021-12-12 12:41:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn conn_state_subscribe(&self) -> Receiver<WsConnectState> { self.state_sender.subscribe() }
|
|
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
fn reconnect(&self, _count: usize) -> FutureResult<(), UserError> { FutureResult::new(async { Ok(()) }) }
|
2021-12-12 12:41:16 +08:00
|
|
|
|
|
|
|
|
fn add_handler(&self, handler: Arc<dyn WsMessageHandler>) -> Result<(), UserError> {
|
|
|
|
|
let source = handler.source();
|
|
|
|
|
if self.handlers.contains_key(&source) {
|
|
|
|
|
log::error!("WsSource's {:?} is already registered", source);
|
|
|
|
|
}
|
|
|
|
|
self.handlers.insert(source, handler);
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn ws_sender(&self) -> Result<Arc<dyn FlowyWsSender>, UserError> { Ok(Arc::new(self.ws_sender.clone())) }
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
lazy_static! {
|
|
|
|
|
static ref DOC_SERVER: Arc<MockDocServer> = Arc::new(MockDocServer::default());
|
2021-12-12 12:41:16 +08:00
|
|
|
}
|
|
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
struct MockDocServer {
|
|
|
|
|
pub manager: Arc<ServerDocManager>,
|
2021-12-12 12:41:16 +08:00
|
|
|
}
|
|
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
impl std::default::Default for MockDocServer {
|
2021-12-12 12:41:16 +08:00
|
|
|
fn default() -> Self {
|
2021-12-13 13:55:44 +08:00
|
|
|
let manager = Arc::new(ServerDocManager::new(Arc::new(MockDocServerPersistence {})));
|
|
|
|
|
MockDocServer { manager }
|
2021-12-12 12:41:16 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
impl MockDocServer {
|
|
|
|
|
async fn handle_ws_data(&self, ws_data: WsDocumentData) -> Option<WsMessage> {
|
|
|
|
|
let bytes = Bytes::from(ws_data.data);
|
|
|
|
|
match ws_data.ty {
|
|
|
|
|
WsDataType::Acked => {},
|
|
|
|
|
WsDataType::PushRev => {
|
|
|
|
|
let revision = Revision::try_from(bytes).unwrap();
|
|
|
|
|
log::info!("{:?}", revision);
|
|
|
|
|
},
|
|
|
|
|
WsDataType::PullRev => {},
|
|
|
|
|
WsDataType::Conflict => {},
|
|
|
|
|
WsDataType::NewDocUser => {
|
|
|
|
|
let new_doc_user = NewDocUser::try_from(bytes).unwrap();
|
|
|
|
|
log::info!("{:?}", new_doc_user);
|
|
|
|
|
// NewDocUser
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-12-12 12:41:16 +08:00
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
struct MockDocServerPersistence {}
|
2021-12-12 12:41:16 +08:00
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
impl ServerDocPersistence for MockDocServerPersistence {
|
|
|
|
|
fn update_doc(&self, doc_id: &str, rev_id: i64, delta: RichTextDelta) -> FutureResultSend<(), CollaborateError> {
|
|
|
|
|
unimplemented!()
|
|
|
|
|
}
|
2021-12-12 12:41:16 +08:00
|
|
|
|
2021-12-13 13:55:44 +08:00
|
|
|
fn read_doc(&self, doc_id: &str) -> FutureResultSend<Doc, CollaborateError> { unimplemented!() }
|
2021-12-12 12:41:16 +08:00
|
|
|
}
|