refactor: try merge update before output and after input
This commit is contained in:
@@ -52,13 +52,27 @@ pub async fn get_doc<'s>(
|
|||||||
parameters: GetDocumentParameter,
|
parameters: GetDocumentParameter,
|
||||||
) -> Result<GetDocumentResponse, String> {
|
) -> Result<GetDocumentResponse, String> {
|
||||||
// TODO: check user permission
|
// TODO: check user permission
|
||||||
|
let state = &state.0.lock().await;
|
||||||
|
let doc_store = &state.doc_store;
|
||||||
|
let doc_db = &state.doc_db;
|
||||||
|
|
||||||
if let Ok(all_updates_of_workspace) = &state.0.lock().await.doc_db.all(¶meters.id).await {
|
if let Ok(all_updates_of_workspace) = doc_db.all(¶meters.id).await {
|
||||||
Ok(GetDocumentResponse {
|
let all_updates = all_updates_of_workspace
|
||||||
updates: all_updates_of_workspace
|
|
||||||
.iter()
|
.iter()
|
||||||
.map(|model| model.blob.clone())
|
.map(|model| model.blob.clone())
|
||||||
.collect::<Vec<Vec<u8>>>(),
|
.collect::<Vec<Vec<u8>>>();
|
||||||
|
all_updates
|
||||||
|
.iter()
|
||||||
|
.for_each(|update_blob| {
|
||||||
|
let mut tx = doc_store.doc().transact();
|
||||||
|
let update = Update::decode_v1(&update_blob).unwrap();
|
||||||
|
tx.apply_update(update);
|
||||||
|
tx.commit();
|
||||||
|
});
|
||||||
|
let merged_update = doc_store.doc().transact().encode_update_v1();
|
||||||
|
// TODO: store merged update here
|
||||||
|
Ok(GetDocumentResponse {
|
||||||
|
updates: vec![merged_update],
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
Err(format!(
|
Err(format!(
|
||||||
@@ -75,43 +89,15 @@ pub async fn update_y_document<'s>(
|
|||||||
) -> Result<bool, String> {
|
) -> Result<bool, String> {
|
||||||
let state = &state.0.lock().await;
|
let state = &state.0.lock().await;
|
||||||
let doc_store = &state.doc_store;
|
let doc_store = &state.doc_store;
|
||||||
let doc_db = &state.doc_db;
|
|
||||||
let update = Update::decode_v1(¶meters.update).unwrap();
|
|
||||||
let mut decoder = DecoderV1::from(¶meters.update[..]);
|
|
||||||
for msg in MessageReader::new(&mut decoder) {
|
|
||||||
msg.ok().and_then(|msg| match msg {
|
|
||||||
Message::Sync(msg) => match msg {
|
|
||||||
SyncMessage::SyncStep1(sv) => {
|
|
||||||
Some(())
|
|
||||||
}
|
|
||||||
SyncMessage::SyncStep2(update) => {
|
|
||||||
Some(())
|
|
||||||
}
|
|
||||||
SyncMessage::Update(update) => {
|
|
||||||
let mut tx = doc_store.doc().transact();
|
let mut tx = doc_store.doc().transact();
|
||||||
tx.apply_update(Update::decode_v1(&update).unwrap());
|
let update = Update::decode_v1(¶meters.update).unwrap();
|
||||||
tx.commit();
|
tx.apply_update(update);
|
||||||
let merged_update = tx.encode_update_v1();
|
let merged_update = tx.encode_update_v1();
|
||||||
Some(())
|
tx.commit();
|
||||||
}
|
let doc_db = &state.doc_db;
|
||||||
},
|
|
||||||
Message::Auth(reason) => {
|
|
||||||
Some(())
|
|
||||||
}
|
|
||||||
Message::AwarenessQuery => {
|
|
||||||
Some(())
|
|
||||||
}
|
|
||||||
Message::Awareness(update) => {
|
|
||||||
Some(())
|
|
||||||
}
|
|
||||||
Message::Custom(tag, data) => {
|
|
||||||
Some(())
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
let merged_update = doc_store.doc().transact().encode_update_v1();
|
|
||||||
doc_db
|
doc_db
|
||||||
.insert(¶meters.id.clone(), &merged_update)
|
.replace_with(¶meters.id.clone(), merged_update)
|
||||||
.await
|
.await
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user