sync_reconcile/
sync_reconcile.rs1use std::{error::Error, sync::Arc};
2
3use yrs::{updates::decoder::Decode, ReadTxn, Transact, Update};
4use yrs_tree::{NodeApi, Tree};
5
6fn main() -> Result<(), Box<dyn Error>> {
7 let doc1 = Arc::new(yrs::Doc::new());
8 let doc2 = Arc::new(yrs::Doc::new());
9
10 let tree1 = Tree::new(doc1.clone(), "test")?;
11 let tree2 = Tree::new(doc2.clone(), "test")?;
12
13 let node1 = tree1.create_child_with_id("1")?;
14 let node2 = tree1.create_child_with_id("2")?;
15 let node3 = node1.create_child_with_id("3")?;
16 let node4 = node2.create_child_with_id("4")?;
17 node3.move_to(&node2, Some(0))?;
18 node1.move_after(&node2)?;
19 node4.move_before(&node3)?;
20
21 sync_docs(&doc1, &doc2)?;
22
23 let node3_left = tree1.get_node("3").unwrap();
25 let node4_left = tree1.get_node("4").unwrap();
26 node3_left.move_to(&node4_left, None)?;
27
28 let node3_right = tree2.get_node("3").unwrap();
29 let node4_right = tree2.get_node("4").unwrap();
30 node4_right.move_to(&node3_right, None)?;
31
32 println!("Tree 1: \n{}", tree1);
33 println!("Tree 2: \n{}", tree2);
34
35 println!("Syncing docs...\n");
36 sync_docs(&doc1, &doc2)?;
37
38 println!("Tree 1: \n{}", tree1);
39 println!("Tree 2: \n{}", tree2);
40
41 Ok(())
42}
43
44fn sync_docs(doc1: &yrs::Doc, doc2: &yrs::Doc) -> Result<(), Box<dyn Error>> {
45 let mut txn1 = doc1.transact_mut();
46 let sv1 = txn1.state_vector();
47
48 let mut txn2 = doc2.transact_mut();
49 let sv2 = txn2.state_vector();
50
51 let update1 = txn1.encode_diff_v1(&sv2);
52 let update2 = txn2.encode_diff_v1(&sv1);
53
54 txn1.apply_update(Update::decode_v1(&update2).unwrap())?;
55 txn2.apply_update(Update::decode_v1(&update1).unwrap())?;
56
57 Ok(())
58}