mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
send revisions to server if server rev is outdated
This commit is contained in:
@ -134,7 +134,6 @@ pub async fn init_app_context(configuration: &Settings) -> AppContext {
|
||||
));
|
||||
|
||||
let ws_server = WsServer::new().start();
|
||||
|
||||
AppContext::new(ws_server, pg_pool)
|
||||
}
|
||||
|
||||
|
@ -65,12 +65,19 @@ impl ServerEditDoc {
|
||||
self.users.insert(user.id(), user.clone());
|
||||
let cur_rev_id = self.rev_id.load(SeqCst);
|
||||
|
||||
if cur_rev_id > rev_id {
|
||||
let doc_delta = self.document.read().delta().clone();
|
||||
let cli_revision = self.mk_revision(rev_id, doc_delta);
|
||||
log::debug!("Server push rev");
|
||||
let ws_cli_revision = mk_push_rev_ws_message(&self.doc_id, cli_revision);
|
||||
user.socket.do_send(ws_cli_revision).map_err(internal_error)?;
|
||||
match cur_rev_id.cmp(&rev_id) {
|
||||
Ordering::Less => {
|
||||
user.socket
|
||||
.do_send(mk_pull_rev_ws_message(&self.doc_id, cur_rev_id, rev_id))
|
||||
.map_err(internal_error)?;
|
||||
},
|
||||
Ordering::Equal => {},
|
||||
Ordering::Greater => {
|
||||
let doc_delta = self.document.read().delta().clone();
|
||||
let cli_revision = self.mk_revision(rev_id, doc_delta);
|
||||
let ws_cli_revision = mk_push_rev_ws_message(&self.doc_id, cli_revision);
|
||||
user.socket.do_send(ws_cli_revision).map_err(internal_error)?;
|
||||
},
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@ -99,7 +106,6 @@ impl ServerEditDoc {
|
||||
if cur_rev_id != revision.base_rev_id {
|
||||
// The server document is outdated, try to get the missing revision from the
|
||||
// client.
|
||||
log::debug!("Server push rev");
|
||||
user.socket
|
||||
.do_send(mk_pull_rev_ws_message(&self.doc_id, cur_rev_id, revision.rev_id))
|
||||
.map_err(internal_error)?;
|
||||
|
@ -1,23 +1,49 @@
|
||||
use crate::document::helper::{DocScript, DocumentTest};
|
||||
use flowy_document::services::doc::{Document, FlowyDoc};
|
||||
|
||||
#[rustfmt::skip]
|
||||
// ┌─────────┐ ┌─────────┐
|
||||
// │ Server │ │ Client │
|
||||
// └─────────┘ └─────────┘
|
||||
// ┌────────────────┐ │ │ ┌────────────────┐
|
||||
// │ops: [] rev: 0 │◀┼───── ws ────┼─┤ops: [] rev: 0 │
|
||||
// └────────────────┘ │ │ └────────────────┘
|
||||
// ┌────────────────────┐ │ │ ┌────────────────────┐
|
||||
// │ops: ["abc"] rev: 1 │◀┼───── ws ────┼─│ops: ["abc"] rev: 1 │
|
||||
// └────────────────────┘ │ │ └────────────────────┘
|
||||
// ┌──────────────────────────┐ │ │ ┌──────────────────────┐
|
||||
// │ops: ["abc", "123"] rev: 2│◀┼───── ws ────┼─│ops: ["123"] rev: 2 │
|
||||
// └──────────────────────────┘ │ │ └──────────────────────┘
|
||||
// │ │
|
||||
#[actix_rt::test]
|
||||
async fn sync_doc_insert_text() {
|
||||
async fn delta_sync_after_ws_connection() {
|
||||
let test = DocumentTest::new().await;
|
||||
test.run_scripts(vec![
|
||||
DocScript::ConnectWs,
|
||||
DocScript::OpenDoc,
|
||||
DocScript::SendText(0, "abc"),
|
||||
DocScript::SendText(3, "123"),
|
||||
DocScript::SendText(6, "efg"),
|
||||
DocScript::AssertClient(r#"[{"insert":"abc123efg\n"}]"#),
|
||||
DocScript::AssertServer(r#"[{"insert":"abc123efg\n"}]"#),
|
||||
DocScript::AssertClient(r#"[{"insert":"abc123\n"}]"#),
|
||||
DocScript::AssertServer(r#"[{"insert":"abc123\n"}]"#),
|
||||
])
|
||||
.await;
|
||||
}
|
||||
|
||||
#[rustfmt::skip]
|
||||
// ┌─────────┐ ┌─────────┐
|
||||
// │ Server │ │ Client │
|
||||
// └─────────┘ └─────────┘
|
||||
// ┌──────────────────────────┐ │ │
|
||||
// │ops: ["123", "456"] rev: 2│ │ │
|
||||
// └──────────────────────────┘ │ │
|
||||
// │ │
|
||||
// ◀── http request ─┤ Open doc
|
||||
// │ │
|
||||
// │ │ ┌──────────────────────────┐
|
||||
// ├──http response──┼─▶│ops: ["123", "456"] rev: 2│
|
||||
// │ │ └──────────────────────────┘
|
||||
#[actix_rt::test]
|
||||
async fn sync_open_empty_doc_and_sync_from_server() {
|
||||
async fn delta_sync_with_http_request() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<FlowyDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
@ -34,7 +60,7 @@ async fn sync_open_empty_doc_and_sync_from_server() {
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn sync_open_empty_doc_and_sync_from_server_using_ws() {
|
||||
async fn delta_sync_with_server_push_delta() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<FlowyDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
@ -49,8 +75,35 @@ async fn sync_open_empty_doc_and_sync_from_server_using_ws() {
|
||||
.await;
|
||||
}
|
||||
|
||||
#[rustfmt::skip]
|
||||
// ┌─────────┐ ┌─────────┐
|
||||
// │ Server │ │ Client │
|
||||
// └─────────┘ └─────────┘
|
||||
// │ │
|
||||
// │ │
|
||||
// ◀── http request ─┤ Open doc
|
||||
// │ │
|
||||
// │ │ ┌───────────────┐
|
||||
// ├──http response──┼─▶│ops: [] rev: 0 │
|
||||
// ┌───────────────────┐│ │ └───────────────┘
|
||||
// │ops: ["123"] rev: 3││ │
|
||||
// └───────────────────┘│ │ ┌────────────────────┐
|
||||
// │ │ │ops: ["abc"] rev: 1 │
|
||||
// │ │ └────────────────────┘
|
||||
// │ │
|
||||
// ◀─────────────────┤ start ws connection
|
||||
// │ │
|
||||
// ◀─────────────────┤ notify with rev: 1
|
||||
// │ │
|
||||
// ┌───────────────────┐ │ │ ┌──────────────────────────┐
|
||||
// │ops: ["123"] rev: 3│ ├────Push Rev─────▶ │ops: ["abc", "123"] rev: 4│
|
||||
// └───────────────────┘ │ │ └──────────────────────────┘
|
||||
// ┌──────────────────────────┐ │ │ ┌────────────────────┐
|
||||
// │ops: ["abc", "123"] rev: 4│ ◀────Push Rev─────┤ │ops: ["abc"] rev: 4 │
|
||||
// └──────────────────────────┘ │ │ └────────────────────┘
|
||||
// │ │
|
||||
#[actix_rt::test]
|
||||
async fn sync_open_non_empty_doc_and_sync_with_sever() {
|
||||
async fn delta_sync_while_local_rev_less_than_server_rev() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<FlowyDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
@ -66,3 +119,23 @@ async fn sync_open_non_empty_doc_and_sync_with_sever() {
|
||||
])
|
||||
.await;
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn delta_sync_while_local_rev_greater_than_server_rev() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<FlowyDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
let json = document.to_json();
|
||||
|
||||
test.run_scripts(vec![
|
||||
DocScript::SetServerDocument(json, 1),
|
||||
DocScript::OpenDoc,
|
||||
DocScript::AssertClient(r#"[{"insert":"123\n"}]"#),
|
||||
DocScript::SendText(3, "abc"),
|
||||
DocScript::SendText(6, "efg"),
|
||||
DocScript::ConnectWs,
|
||||
DocScript::AssertClient(r#"[{"insert":"123abcefg\n"}]"#),
|
||||
DocScript::AssertServer(r#"[{"insert":"123abcefg\n"}]"#),
|
||||
])
|
||||
.await;
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ async fn run_scripts(context: Arc<RwLock<ScriptContext>>, scripts: Vec<DocScript
|
||||
let doc_id = context.read().doc_id.clone();
|
||||
match script {
|
||||
DocScript::ConnectWs => {
|
||||
// sleep(Duration::from_millis(300)).await;
|
||||
sleep(Duration::from_millis(300)).await;
|
||||
let user_session = context.read().user_session.clone();
|
||||
let token = user_session.token().unwrap();
|
||||
let _ = user_session.start_ws_connection(&token).await.unwrap();
|
||||
|
Reference in New Issue
Block a user