241 lines
7.9 KiB
Rust
Raw Normal View History

2021-12-16 22:24:05 +08:00
use crate::services::ws::{FlowyError, FlowyWebSocket, FlowyWsSender, WSConnectState, WSMessage, WSMessageReceiver};
use bytes::Bytes;
use dashmap::DashMap;
2021-12-13 13:55:44 +08:00
use flowy_collaboration::{
2021-12-22 18:53:52 +08:00
core::sync::{DocumentPersistence, RevisionUser, ServerDocumentManager, SyncResponse},
2021-12-13 13:55:44 +08:00
entities::{
2021-12-13 22:46:35 +08:00
doc::Doc,
ws::{DocumentWSData, DocumentWSDataBuilder, DocumentWSDataType, NewDocumentUser},
2021-12-13 13:55:44 +08:00
},
errors::CollaborateError,
2021-12-14 15:31:44 +08:00
Revision,
RichTextDelta,
2021-12-13 13:55:44 +08:00
};
use lazy_static::lazy_static;
use lib_infra::future::{FutureResult, FutureResultSend};
2021-12-16 22:24:05 +08:00
use lib_ws::WSModule;
2021-12-15 16:28:18 +08:00
use parking_lot::RwLock;
2021-12-13 22:46:35 +08:00
use std::{
convert::{TryFrom, TryInto},
sync::Arc,
};
use tokio::sync::{broadcast, broadcast::Receiver, mpsc};
pub struct MockWebSocket {
2021-12-16 22:24:05 +08:00
handlers: DashMap<WSModule, Arc<dyn WSMessageReceiver>>,
state_sender: broadcast::Sender<WSConnectState>,
ws_sender: broadcast::Sender<WSMessage>,
2021-12-15 16:28:18 +08:00
is_stop: RwLock<bool>,
}
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,
2021-12-15 16:28:18 +08:00
is_stop: RwLock::new(false),
}
}
}
impl MockWebSocket {
pub fn new() -> MockWebSocket { MockWebSocket::default() }
}
impl FlowyWebSocket for Arc<MockWebSocket> {
2021-12-14 15:31:44 +08:00
fn start_connect(&self, _addr: String) -> FutureResult<(), FlowyError> {
2021-12-15 16:28:18 +08:00
*self.is_stop.write() = false;
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 {
2021-12-15 16:28:18 +08:00
if *cloned_ws.is_stop.read() {
// do nothing
} else {
2021-12-16 22:24:05 +08:00
let ws_data = DocumentWSData::try_from(Bytes::from(message.data.clone())).unwrap();
2021-12-15 16:28:18 +08:00
let mut rx = DOC_SERVER.handle_ws_data(ws_data).await;
let new_ws_message = rx.recv().await.unwrap();
match cloned_ws.handlers.get(&new_ws_message.module) {
None => tracing::error!("Can't find any handler for message: {:?}", new_ws_message),
Some(handler) => handler.receive_message(new_ws_message.clone()),
}
}
}
});
2021-12-13 13:55:44 +08:00
FutureResult::new(async { Ok(()) })
}
2021-12-15 16:28:18 +08:00
fn stop_connect(&self) -> FutureResult<(), FlowyError> {
*self.is_stop.write() = true;
FutureResult::new(async { Ok(()) })
}
2021-12-14 20:50:07 +08:00
2021-12-16 22:24:05 +08:00
fn subscribe_connect_state(&self) -> Receiver<WSConnectState> { self.state_sender.subscribe() }
2021-12-14 15:31:44 +08:00
fn reconnect(&self, _count: usize) -> FutureResult<(), FlowyError> { FutureResult::new(async { Ok(()) }) }
2021-12-16 22:24:05 +08:00
fn add_message_receiver(&self, handler: Arc<dyn WSMessageReceiver>) -> Result<(), FlowyError> {
let source = handler.source();
if self.handlers.contains_key(&source) {
2021-12-14 15:31:44 +08:00
tracing::error!("WsSource's {:?} is already registered", source);
}
self.handlers.insert(source, handler);
Ok(())
}
2021-12-14 15:31:44 +08:00
fn ws_sender(&self) -> Result<Arc<dyn FlowyWsSender>, FlowyError> { 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-13 13:55:44 +08:00
struct MockDocServer {
2021-12-22 18:53:52 +08:00
pub manager: Arc<ServerDocumentManager>,
}
2021-12-13 13:55:44 +08:00
impl std::default::Default for MockDocServer {
fn default() -> Self {
2021-12-13 22:46:35 +08:00
let persistence = Arc::new(MockDocServerPersistence::default());
2021-12-22 18:53:52 +08:00
let manager = Arc::new(ServerDocumentManager::new(persistence));
2021-12-13 13:55:44 +08:00
MockDocServer { manager }
}
}
2021-12-13 13:55:44 +08:00
impl MockDocServer {
2021-12-16 22:24:05 +08:00
async fn handle_ws_data(&self, ws_data: DocumentWSData) -> mpsc::Receiver<WSMessage> {
2021-12-13 13:55:44 +08:00
let bytes = Bytes::from(ws_data.data);
match ws_data.ty {
DocumentWSDataType::Ack => {
2021-12-13 22:46:35 +08:00
unimplemented!()
},
2021-12-16 22:24:05 +08:00
DocumentWSDataType::PushRev => {
2021-12-13 13:55:44 +08:00
let revision = Revision::try_from(bytes).unwrap();
2021-12-13 22:46:35 +08:00
let handler = match self.manager.get(&revision.doc_id).await {
None => self.manager.create_doc(revision.clone()).await.unwrap(),
Some(handler) => handler,
};
let (tx, rx) = mpsc::channel(1);
let user = MockDocUser {
user_id: revision.user_id.clone(),
tx,
};
handler.apply_revision(Arc::new(user), revision).await.unwrap();
rx
2021-12-13 13:55:44 +08:00
},
2021-12-16 22:24:05 +08:00
DocumentWSDataType::PullRev => {
2021-12-13 22:46:35 +08:00
unimplemented!()
},
2021-12-16 22:24:05 +08:00
DocumentWSDataType::UserConnect => {
let new_user = NewDocumentUser::try_from(bytes).unwrap();
let (tx, rx) = mpsc::channel(1);
let data = DocumentWSDataBuilder::build_ack_message(&new_user.doc_id, &ws_data.id);
let user = Arc::new(MockDocUser {
user_id: new_user.user_id,
tx,
}) as Arc<dyn RevisionUser>;
2021-12-20 20:59:33 +08:00
user.receive(SyncResponse::Ack(data));
rx
2021-12-13 13:55:44 +08:00
},
}
}
}
2021-12-13 22:46:35 +08:00
struct MockDocServerPersistence {
inner: Arc<DashMap<String, Doc>>,
}
impl std::default::Default for MockDocServerPersistence {
fn default() -> Self {
MockDocServerPersistence {
inner: Arc::new(DashMap::new()),
}
}
}
2021-12-22 18:53:52 +08:00
impl DocumentPersistence for MockDocServerPersistence {
2021-12-13 22:46:35 +08:00
fn update_doc(&self, _doc_id: &str, _rev_id: i64, _delta: RichTextDelta) -> FutureResultSend<(), CollaborateError> {
2021-12-13 13:55:44 +08:00
unimplemented!()
}
2021-12-13 22:46:35 +08:00
fn read_doc(&self, doc_id: &str) -> FutureResultSend<Doc, CollaborateError> {
let inner = self.inner.clone();
let doc_id = doc_id.to_owned();
FutureResultSend::new(async move {
match inner.get(&doc_id) {
None => {
//
Err(CollaborateError::record_not_found())
},
Some(val) => {
//
Ok(val.value().clone())
},
}
})
}
fn create_doc(&self, revision: Revision) -> FutureResultSend<Doc, CollaborateError> {
FutureResultSend::new(async move {
let doc: Doc = revision.try_into().unwrap();
Ok(doc)
})
}
}
#[derive(Debug)]
struct MockDocUser {
user_id: String,
2021-12-16 22:24:05 +08:00
tx: mpsc::Sender<WSMessage>,
2021-12-13 22:46:35 +08:00
}
impl RevisionUser for MockDocUser {
fn user_id(&self) -> String { self.user_id.clone() }
2021-12-20 20:59:33 +08:00
fn receive(&self, resp: SyncResponse) {
2021-12-13 22:46:35 +08:00
let sender = self.tx.clone();
tokio::spawn(async move {
match resp {
SyncResponse::Pull(data) => {
let bytes: Bytes = data.try_into().unwrap();
2021-12-16 22:24:05 +08:00
let msg = WSMessage {
module: WSModule::Doc,
2021-12-13 22:46:35 +08:00
data: bytes.to_vec(),
};
sender.send(msg).await.unwrap();
},
SyncResponse::Push(data) => {
let bytes: Bytes = data.try_into().unwrap();
2021-12-16 22:24:05 +08:00
let msg = WSMessage {
module: WSModule::Doc,
2021-12-13 22:46:35 +08:00
data: bytes.to_vec(),
};
sender.send(msg).await.unwrap();
},
SyncResponse::Ack(data) => {
let bytes: Bytes = data.try_into().unwrap();
2021-12-16 22:24:05 +08:00
let msg = WSMessage {
module: WSModule::Doc,
2021-12-13 22:46:35 +08:00
data: bytes.to_vec(),
};
sender.send(msg).await.unwrap();
},
SyncResponse::NewRevision {
rev_id: _,
doc_id: _,
doc_json: _,
} => {
// unimplemented!()
},
}
});
}
}