mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
rename some structs
This commit is contained in:
@ -7,7 +7,7 @@ use actix_web::web::Data;
|
|||||||
|
|
||||||
use crate::services::document::{
|
use crate::services::document::{
|
||||||
persistence::DocumentKVPersistence,
|
persistence::DocumentKVPersistence,
|
||||||
ws_receiver::{make_document_ws_receiver, DocumentPersistenceImpl},
|
ws_receiver::{make_document_ws_receiver, HttpServerDocumentPersistence},
|
||||||
};
|
};
|
||||||
use flowy_collaboration::sync::ServerDocumentManager;
|
use flowy_collaboration::sync::ServerDocumentManager;
|
||||||
use lib_ws::WSModule;
|
use lib_ws::WSModule;
|
||||||
@ -30,7 +30,7 @@ impl AppContext {
|
|||||||
let kv_store = make_document_kv_store(pg_pool.clone());
|
let kv_store = make_document_kv_store(pg_pool.clone());
|
||||||
let persistence = Arc::new(FlowyPersistence { pg_pool, kv_store });
|
let persistence = Arc::new(FlowyPersistence { pg_pool, kv_store });
|
||||||
|
|
||||||
let document_persistence = Arc::new(DocumentPersistenceImpl(persistence.clone()));
|
let document_persistence = Arc::new(HttpServerDocumentPersistence(persistence.clone()));
|
||||||
let document_manager = Arc::new(ServerDocumentManager::new(document_persistence));
|
let document_manager = Arc::new(ServerDocumentManager::new(document_persistence));
|
||||||
|
|
||||||
let document_ws_receiver = make_document_ws_receiver(persistence.clone(), document_manager.clone());
|
let document_ws_receiver = make_document_ws_receiver(persistence.clone(), document_manager.clone());
|
||||||
|
@ -83,7 +83,7 @@ impl DocumentWebSocketActor {
|
|||||||
document_client_data.ty
|
document_client_data.ty
|
||||||
);
|
);
|
||||||
|
|
||||||
let user = Arc::new(ServerDocUser {
|
let user = Arc::new(HttpDocumentUser {
|
||||||
user,
|
user,
|
||||||
socket,
|
socket,
|
||||||
persistence,
|
persistence,
|
||||||
@ -119,13 +119,13 @@ fn verify_md5(revision: &RevisionPB) -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ServerDocUser {
|
pub struct HttpDocumentUser {
|
||||||
pub user: Arc<WSUser>,
|
pub user: Arc<WSUser>,
|
||||||
pub(crate) socket: Socket,
|
pub(crate) socket: Socket,
|
||||||
pub persistence: Arc<FlowyPersistence>,
|
pub persistence: Arc<FlowyPersistence>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Debug for ServerDocUser {
|
impl std::fmt::Debug for HttpDocumentUser {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
f.debug_struct("ServerDocUser")
|
f.debug_struct("ServerDocUser")
|
||||||
.field("user", &self.user)
|
.field("user", &self.user)
|
||||||
@ -134,7 +134,7 @@ impl std::fmt::Debug for ServerDocUser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RevisionUser for ServerDocUser {
|
impl RevisionUser for HttpDocumentUser {
|
||||||
fn user_id(&self) -> String { self.user.id().to_string() }
|
fn user_id(&self) -> String { self.user.id().to_string() }
|
||||||
|
|
||||||
fn receive(&self, resp: SyncResponse) {
|
fn receive(&self, resp: SyncResponse) {
|
||||||
|
@ -76,13 +76,13 @@ impl WebSocketReceiver for DocumentWebSocketReceiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DocumentPersistenceImpl(pub Arc<FlowyPersistence>);
|
pub struct HttpServerDocumentPersistence(pub Arc<FlowyPersistence>);
|
||||||
impl Debug for DocumentPersistenceImpl {
|
impl Debug for HttpServerDocumentPersistence {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("DocumentPersistenceImpl") }
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("DocumentPersistenceImpl") }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DocumentPersistence for DocumentPersistenceImpl {
|
impl DocumentPersistence for HttpServerDocumentPersistence {
|
||||||
fn read_doc(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
fn read_document(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
||||||
let params = DocumentId {
|
let params = DocumentId {
|
||||||
doc_id: doc_id.to_string(),
|
doc_id: doc_id.to_string(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
@ -99,7 +99,7 @@ impl DocumentPersistence for DocumentPersistenceImpl {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_doc(
|
fn create_document(
|
||||||
&self,
|
&self,
|
||||||
doc_id: &str,
|
doc_id: &str,
|
||||||
repeated_revision: RepeatedRevisionPB,
|
repeated_revision: RepeatedRevisionPB,
|
||||||
@ -120,23 +120,24 @@ impl DocumentPersistence for DocumentPersistenceImpl {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_revisions(&self, doc_id: &str, rev_ids: Vec<i64>) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
fn read_revisions(
|
||||||
let kv_store = self.0.kv_store();
|
&self,
|
||||||
let doc_id = doc_id.to_owned();
|
doc_id: &str,
|
||||||
let f = || async move {
|
rev_ids: Option<Vec<i64>>,
|
||||||
let mut repeated_revision = kv_store.batch_get_revisions(&doc_id, rev_ids).await?;
|
) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
||||||
Ok(repeated_revision.take_items().into())
|
|
||||||
};
|
|
||||||
|
|
||||||
Box::pin(async move { f().await.map_err(server_error_to_collaborate_error) })
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_doc_revisions(&self, doc_id: &str) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
|
||||||
let kv_store = self.0.kv_store();
|
let kv_store = self.0.kv_store();
|
||||||
let doc_id = doc_id.to_owned();
|
let doc_id = doc_id.to_owned();
|
||||||
let f = || async move {
|
let f = || async move {
|
||||||
|
match rev_ids {
|
||||||
|
None => {
|
||||||
let mut repeated_revision = kv_store.get_doc_revisions(&doc_id).await?;
|
let mut repeated_revision = kv_store.get_doc_revisions(&doc_id).await?;
|
||||||
Ok(repeated_revision.take_items().into())
|
Ok(repeated_revision.take_items().into())
|
||||||
|
},
|
||||||
|
Some(rev_ids) => {
|
||||||
|
let mut repeated_revision = kv_store.batch_get_revisions(&doc_id, rev_ids).await?;
|
||||||
|
Ok(repeated_revision.take_items().into())
|
||||||
|
},
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Box::pin(async move { f().await.map_err(server_error_to_collaborate_error) })
|
Box::pin(async move { f().await.map_err(server_error_to_collaborate_error) })
|
||||||
|
@ -121,7 +121,7 @@ impl RevisionTableSql {
|
|||||||
.filter(dsl::doc_id.eq(changeset.doc_id));
|
.filter(dsl::doc_id.eq(changeset.doc_id));
|
||||||
let _ = update(filter).set(dsl::state.eq(changeset.state)).execute(conn)?;
|
let _ = update(filter).set(dsl::state.eq(changeset.state)).execute(conn)?;
|
||||||
tracing::debug!(
|
tracing::debug!(
|
||||||
"[[RevisionTable]] Save:{} state to {:?}",
|
"[RevisionTable] update revision:{} state:to {:?}",
|
||||||
changeset.rev_id,
|
changeset.rev_id,
|
||||||
changeset.state
|
changeset.state
|
||||||
);
|
);
|
||||||
|
@ -175,7 +175,6 @@ impl RevisionSyncSequence {
|
|||||||
return Err(FlowyError::internal().context(desc));
|
return Err(FlowyError::internal().context(desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
tracing::trace!("{} revision finish synchronizing", pop_rev_id);
|
|
||||||
self.revs_map.remove(&pop_rev_id);
|
self.revs_map.remove(&pop_rev_id);
|
||||||
let _ = self.local_revs.write().await.pop_front();
|
let _ = self.local_revs.write().await.pop_front();
|
||||||
}
|
}
|
||||||
|
3
frontend/rust-lib/flowy-net/src/services/http/mod.rs
Normal file
3
frontend/rust-lib/flowy-net/src/services/http/mod.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub use http_ws::*;
|
||||||
|
|
||||||
|
mod http_ws;
|
@ -1,3 +0,0 @@
|
|||||||
pub use http_ws_impl::*;
|
|
||||||
|
|
||||||
mod http_ws_impl;
|
|
@ -1,38 +1,30 @@
|
|||||||
|
use crate::services::local::persistence::LocalServerDocumentPersistence;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use dashmap::DashMap;
|
|
||||||
use flowy_collaboration::{
|
use flowy_collaboration::{
|
||||||
entities::{
|
entities::ws::{DocumentClientWSData, DocumentClientWSDataType},
|
||||||
doc::DocumentInfo,
|
|
||||||
ws::{DocumentClientWSData, DocumentClientWSDataType},
|
|
||||||
},
|
|
||||||
errors::CollaborateError,
|
errors::CollaborateError,
|
||||||
protobuf::{
|
protobuf::DocumentClientWSData as DocumentClientWSDataPB,
|
||||||
DocumentClientWSData as DocumentClientWSDataPB,
|
|
||||||
RepeatedRevision as RepeatedRevisionPB,
|
|
||||||
Revision as RevisionPB,
|
|
||||||
},
|
|
||||||
sync::*,
|
sync::*,
|
||||||
util::repeated_revision_from_repeated_revision_pb,
|
|
||||||
};
|
};
|
||||||
use lib_infra::future::BoxResultFuture;
|
|
||||||
use lib_ws::{WSModule, WebSocketRawMessage};
|
use lib_ws::{WSModule, WebSocketRawMessage};
|
||||||
use std::{
|
use std::{convert::TryInto, fmt::Debug, sync::Arc};
|
||||||
convert::TryInto,
|
|
||||||
fmt::{Debug, Formatter},
|
|
||||||
sync::Arc,
|
|
||||||
};
|
|
||||||
use tokio::sync::{mpsc, mpsc::UnboundedSender};
|
use tokio::sync::{mpsc, mpsc::UnboundedSender};
|
||||||
|
|
||||||
pub struct LocalDocumentServer {
|
pub struct LocalDocumentServer {
|
||||||
pub doc_manager: Arc<ServerDocumentManager>,
|
pub doc_manager: Arc<ServerDocumentManager>,
|
||||||
sender: mpsc::UnboundedSender<WebSocketRawMessage>,
|
sender: mpsc::UnboundedSender<WebSocketRawMessage>,
|
||||||
|
persistence: Arc<dyn DocumentPersistence>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LocalDocumentServer {
|
impl LocalDocumentServer {
|
||||||
pub fn new(sender: mpsc::UnboundedSender<WebSocketRawMessage>) -> Self {
|
pub fn new(sender: mpsc::UnboundedSender<WebSocketRawMessage>) -> Self {
|
||||||
let persistence = Arc::new(LocalDocServerPersistence::default());
|
let persistence = Arc::new(LocalServerDocumentPersistence::default());
|
||||||
let doc_manager = Arc::new(ServerDocumentManager::new(persistence));
|
let doc_manager = Arc::new(ServerDocumentManager::new(persistence.clone()));
|
||||||
LocalDocumentServer { doc_manager, sender }
|
LocalDocumentServer {
|
||||||
|
doc_manager,
|
||||||
|
sender,
|
||||||
|
persistence,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn handle_client_data(
|
pub async fn handle_client_data(
|
||||||
@ -49,6 +41,7 @@ impl LocalDocumentServer {
|
|||||||
let user = Arc::new(LocalDocumentUser {
|
let user = Arc::new(LocalDocumentUser {
|
||||||
user_id,
|
user_id,
|
||||||
ws_sender: self.sender.clone(),
|
ws_sender: self.sender.clone(),
|
||||||
|
persistence: self.persistence.clone(),
|
||||||
});
|
});
|
||||||
let ty = client_data.ty.clone();
|
let ty = client_data.ty.clone();
|
||||||
let document_client_data: DocumentClientWSDataPB = client_data.try_into().unwrap();
|
let document_client_data: DocumentClientWSDataPB = client_data.try_into().unwrap();
|
||||||
@ -67,66 +60,11 @@ impl LocalDocumentServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LocalDocServerPersistence {
|
|
||||||
inner: Arc<DashMap<String, DocumentInfo>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Debug for LocalDocServerPersistence {
|
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("LocalDocServerPersistence") }
|
|
||||||
}
|
|
||||||
|
|
||||||
impl std::default::Default for LocalDocServerPersistence {
|
|
||||||
fn default() -> Self {
|
|
||||||
LocalDocServerPersistence {
|
|
||||||
inner: Arc::new(DashMap::new()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl DocumentPersistence for LocalDocServerPersistence {
|
|
||||||
fn read_doc(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
|
||||||
let inner = self.inner.clone();
|
|
||||||
let doc_id = doc_id.to_owned();
|
|
||||||
Box::pin(async move {
|
|
||||||
match inner.get(&doc_id) {
|
|
||||||
None => Err(CollaborateError::record_not_found()),
|
|
||||||
Some(val) => {
|
|
||||||
//
|
|
||||||
Ok(val.value().clone())
|
|
||||||
},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn create_doc(
|
|
||||||
&self,
|
|
||||||
doc_id: &str,
|
|
||||||
repeated_revision: RepeatedRevisionPB,
|
|
||||||
) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
|
||||||
let doc_id = doc_id.to_owned();
|
|
||||||
Box::pin(async move {
|
|
||||||
let repeated_revision = repeated_revision_from_repeated_revision_pb(repeated_revision)?;
|
|
||||||
DocumentInfo::from_revisions(&doc_id, repeated_revision.into_inner())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_revisions(&self, _doc_id: &str, _rev_ids: Vec<i64>) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
|
||||||
Box::pin(async move { Ok(vec![]) })
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_doc_revisions(&self, _doc_id: &str) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn reset_document(&self, _doc_id: &str, _revisions: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError> {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct LocalDocumentUser {
|
struct LocalDocumentUser {
|
||||||
user_id: String,
|
user_id: String,
|
||||||
ws_sender: mpsc::UnboundedSender<WebSocketRawMessage>,
|
ws_sender: mpsc::UnboundedSender<WebSocketRawMessage>,
|
||||||
|
persistence: Arc<dyn DocumentPersistence>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RevisionUser for LocalDocumentUser {
|
impl RevisionUser for LocalDocumentUser {
|
@ -1,14 +1,13 @@
|
|||||||
|
use crate::services::{
|
||||||
|
local::local_server::LocalDocumentServer,
|
||||||
|
ws_conn::{FlowyRawWebSocket, FlowyWSSender},
|
||||||
|
};
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use flowy_collaboration::entities::ws::*;
|
use flowy_collaboration::entities::ws::*;
|
||||||
use flowy_error::{internal_error, FlowyError};
|
use flowy_error::{internal_error, FlowyError};
|
||||||
use lib_infra::future::FutureResult;
|
use lib_infra::future::FutureResult;
|
||||||
use lib_ws::{WSConnectState, WSMessageReceiver, WSModule, WebSocketRawMessage};
|
use lib_ws::{WSConnectState, WSMessageReceiver, WSModule, WebSocketRawMessage};
|
||||||
|
|
||||||
use crate::services::{
|
|
||||||
local_ws::local_server::LocalDocumentServer,
|
|
||||||
ws_conn::{FlowyRawWebSocket, FlowyWSSender},
|
|
||||||
};
|
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use std::{convert::TryFrom, sync::Arc};
|
use std::{convert::TryFrom, sync::Arc};
|
||||||
use tokio::sync::{broadcast, broadcast::Receiver, mpsc, mpsc::UnboundedReceiver};
|
use tokio::sync::{broadcast, broadcast::Receiver, mpsc, mpsc::UnboundedReceiver};
|
5
frontend/rust-lib/flowy-net/src/services/local/mod.rs
Normal file
5
frontend/rust-lib/flowy-net/src/services/local/mod.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
mod local_server;
|
||||||
|
mod local_ws;
|
||||||
|
mod persistence;
|
||||||
|
|
||||||
|
pub use local_ws::*;
|
@ -0,0 +1,74 @@
|
|||||||
|
use dashmap::DashMap;
|
||||||
|
use flowy_collaboration::{
|
||||||
|
entities::doc::DocumentInfo,
|
||||||
|
errors::CollaborateError,
|
||||||
|
protobuf::{RepeatedRevision as RepeatedRevisionPB, Revision as RevisionPB},
|
||||||
|
sync::*,
|
||||||
|
util::repeated_revision_from_repeated_revision_pb,
|
||||||
|
};
|
||||||
|
use lib_infra::future::BoxResultFuture;
|
||||||
|
use std::{
|
||||||
|
fmt::{Debug, Formatter},
|
||||||
|
sync::Arc,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub(crate) struct LocalServerDocumentPersistence {
|
||||||
|
// For the moment, we use memory to cache the data, it will be implemented with other storage.
|
||||||
|
// Like the Firestore,Dropbox.etc.
|
||||||
|
inner: Arc<DashMap<String, DocumentInfo>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Debug for LocalServerDocumentPersistence {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("LocalDocServerPersistence") }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::default::Default for LocalServerDocumentPersistence {
|
||||||
|
fn default() -> Self {
|
||||||
|
LocalServerDocumentPersistence {
|
||||||
|
inner: Arc::new(DashMap::new()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DocumentPersistence for LocalServerDocumentPersistence {
|
||||||
|
fn read_document(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
||||||
|
let inner = self.inner.clone();
|
||||||
|
let doc_id = doc_id.to_owned();
|
||||||
|
Box::pin(async move {
|
||||||
|
match inner.get(&doc_id) {
|
||||||
|
None => Err(CollaborateError::record_not_found()),
|
||||||
|
Some(val) => {
|
||||||
|
//
|
||||||
|
Ok(val.value().clone())
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_document(
|
||||||
|
&self,
|
||||||
|
doc_id: &str,
|
||||||
|
repeated_revision: RepeatedRevisionPB,
|
||||||
|
) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
||||||
|
let doc_id = doc_id.to_owned();
|
||||||
|
let inner = self.inner.clone();
|
||||||
|
Box::pin(async move {
|
||||||
|
let repeated_revision = repeated_revision_from_repeated_revision_pb(repeated_revision)?;
|
||||||
|
let document_info = DocumentInfo::from_revisions(&doc_id, repeated_revision.into_inner())?;
|
||||||
|
inner.insert(doc_id, document_info.clone());
|
||||||
|
Ok(document_info)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_revisions(
|
||||||
|
&self,
|
||||||
|
_doc_id: &str,
|
||||||
|
_rev_ids: Option<Vec<i64>>,
|
||||||
|
) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
||||||
|
Box::pin(async move { Ok(vec![]) })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reset_document(&self, _doc_id: &str, _revisions: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +0,0 @@
|
|||||||
mod local_server;
|
|
||||||
mod local_ws_impl;
|
|
||||||
|
|
||||||
pub use local_ws_impl::*;
|
|
@ -1,3 +1,3 @@
|
|||||||
pub mod http_ws;
|
pub mod http;
|
||||||
pub mod local_ws;
|
pub mod local;
|
||||||
pub mod ws_conn;
|
pub mod ws_conn;
|
||||||
|
@ -7,7 +7,7 @@ use flowy_document::context::DocumentContext;
|
|||||||
use flowy_net::{
|
use flowy_net::{
|
||||||
entities::NetworkType,
|
entities::NetworkType,
|
||||||
services::{
|
services::{
|
||||||
local_ws::LocalWebSocket,
|
local::LocalWebSocket,
|
||||||
ws_conn::{listen_on_websocket, FlowyRawWebSocket, FlowyWebSocketConnect},
|
ws_conn::{listen_on_websocket, FlowyRawWebSocket, FlowyWebSocketConnect},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -17,17 +17,19 @@ use tokio::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub trait DocumentPersistence: Send + Sync + Debug {
|
pub trait DocumentPersistence: Send + Sync + Debug {
|
||||||
fn read_doc(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError>;
|
fn read_document(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError>;
|
||||||
|
|
||||||
fn create_doc(
|
fn create_document(
|
||||||
&self,
|
&self,
|
||||||
doc_id: &str,
|
doc_id: &str,
|
||||||
repeated_revision: RepeatedRevisionPB,
|
repeated_revision: RepeatedRevisionPB,
|
||||||
) -> BoxResultFuture<DocumentInfo, CollaborateError>;
|
) -> BoxResultFuture<DocumentInfo, CollaborateError>;
|
||||||
|
|
||||||
fn get_revisions(&self, doc_id: &str, rev_ids: Vec<i64>) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError>;
|
fn read_revisions(
|
||||||
|
&self,
|
||||||
fn get_doc_revisions(&self, doc_id: &str) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError>;
|
doc_id: &str,
|
||||||
|
rev_ids: Option<Vec<i64>>,
|
||||||
|
) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError>;
|
||||||
|
|
||||||
fn reset_document(
|
fn reset_document(
|
||||||
&self,
|
&self,
|
||||||
@ -123,7 +125,7 @@ impl ServerDocumentManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut write_guard = self.open_doc_map.write().await;
|
let mut write_guard = self.open_doc_map.write().await;
|
||||||
match self.persistence.read_doc(doc_id).await {
|
match self.persistence.read_document(doc_id).await {
|
||||||
Ok(doc) => {
|
Ok(doc) => {
|
||||||
let handler = self.create_document_handler(doc).await.map_err(internal_error).unwrap();
|
let handler = self.create_document_handler(doc).await.map_err(internal_error).unwrap();
|
||||||
write_guard.insert(doc_id.to_owned(), handler.clone());
|
write_guard.insert(doc_id.to_owned(), handler.clone());
|
||||||
@ -140,7 +142,7 @@ impl ServerDocumentManager {
|
|||||||
doc_id: &str,
|
doc_id: &str,
|
||||||
repeated_revision: RepeatedRevisionPB,
|
repeated_revision: RepeatedRevisionPB,
|
||||||
) -> Result<Arc<OpenDocHandle>, CollaborateError> {
|
) -> Result<Arc<OpenDocHandle>, CollaborateError> {
|
||||||
let doc = self.persistence.create_doc(doc_id, repeated_revision).await?;
|
let doc = self.persistence.create_document(doc_id, repeated_revision).await?;
|
||||||
let handler = self.create_document_handler(doc).await?;
|
let handler = self.create_document_handler(doc).await?;
|
||||||
self.open_doc_map
|
self.open_doc_map
|
||||||
.write()
|
.write()
|
||||||
|
@ -59,7 +59,7 @@ impl RevisionSynchronizer {
|
|||||||
let doc_id = self.doc_id.clone();
|
let doc_id = self.doc_id.clone();
|
||||||
if repeated_revision.get_items().is_empty() {
|
if repeated_revision.get_items().is_empty() {
|
||||||
// Return all the revisions to client
|
// Return all the revisions to client
|
||||||
let revisions = persistence.get_doc_revisions(&doc_id).await?;
|
let revisions = persistence.read_revisions(&doc_id, None).await?;
|
||||||
let repeated_revision = repeated_revision_from_revision_pbs(revisions)?;
|
let repeated_revision = repeated_revision_from_revision_pbs(revisions)?;
|
||||||
let data = DocumentServerWSDataBuilder::build_push_message(&doc_id, repeated_revision);
|
let data = DocumentServerWSDataBuilder::build_push_message(&doc_id, repeated_revision);
|
||||||
user.receive(SyncResponse::Push(data));
|
user.receive(SyncResponse::Push(data));
|
||||||
@ -192,7 +192,8 @@ impl RevisionSynchronizer {
|
|||||||
pub(crate) fn rev_id(&self) -> i64 { self.rev_id.load(SeqCst) }
|
pub(crate) fn rev_id(&self) -> i64 { self.rev_id.load(SeqCst) }
|
||||||
|
|
||||||
async fn is_applied_before(&self, new_revision: &RevisionPB, persistence: &Arc<dyn DocumentPersistence>) -> bool {
|
async fn is_applied_before(&self, new_revision: &RevisionPB, persistence: &Arc<dyn DocumentPersistence>) -> bool {
|
||||||
if let Ok(revisions) = persistence.get_revisions(&self.doc_id, vec![new_revision.rev_id]).await {
|
let rev_ids = Some(vec![new_revision.rev_id]);
|
||||||
|
if let Ok(revisions) = persistence.read_revisions(&self.doc_id, rev_ids).await {
|
||||||
if let Some(revision) = revisions.first() {
|
if let Some(revision) = revisions.first() {
|
||||||
if revision.md5 == new_revision.md5 {
|
if revision.md5 == new_revision.md5 {
|
||||||
return true;
|
return true;
|
||||||
@ -211,7 +212,7 @@ impl RevisionSynchronizer {
|
|||||||
to: i64,
|
to: i64,
|
||||||
) {
|
) {
|
||||||
let rev_ids: Vec<i64> = (from..=to).collect();
|
let rev_ids: Vec<i64> = (from..=to).collect();
|
||||||
let revisions = match persistence.get_revisions(&self.doc_id, rev_ids).await {
|
let revisions = match persistence.read_revisions(&self.doc_id, Some(rev_ids)).await {
|
||||||
Ok(revisions) => {
|
Ok(revisions) => {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
revisions.is_empty(),
|
revisions.is_empty(),
|
||||||
|
@ -447,7 +447,7 @@ fn invert_from_other<T: Attributes>(
|
|||||||
let other_ops = DeltaIter::from_interval(other, Interval::new(start, end)).ops();
|
let other_ops = DeltaIter::from_interval(other, Interval::new(start, end)).ops();
|
||||||
other_ops.into_iter().for_each(|other_op| match operation {
|
other_ops.into_iter().for_each(|other_op| match operation {
|
||||||
Operation::Delete(n) => {
|
Operation::Delete(n) => {
|
||||||
tracing::trace!("invert delete: {} by add {}", n, other_op);
|
// tracing::trace!("invert delete: {} by add {}", n, other_op);
|
||||||
base.add(other_op);
|
base.add(other_op);
|
||||||
},
|
},
|
||||||
Operation::Retain(_retain) => {
|
Operation::Retain(_retain) => {
|
||||||
|
Reference in New Issue
Block a user