1#![allow(deprecated)]
2use std::{
3 collections::HashMap,
4 sync::{Arc, Mutex},
5};
6
7use loro::PeerID;
8
9use crate::{LoroValue, LoroValueLike};
10pub struct Awareness(Mutex<loro::awareness::Awareness>);
11
12impl Awareness {
13 pub fn new(peer: PeerID, timeout: i64) -> Self {
14 Self(Mutex::new(loro::awareness::Awareness::new(peer, timeout)))
15 }
16
17 pub fn encode(&self, peers: &[PeerID]) -> Vec<u8> {
18 self.0.lock().unwrap().encode(peers)
19 }
20
21 pub fn encode_all(&self) -> Vec<u8> {
22 self.0.lock().unwrap().encode_all()
23 }
24
25 pub fn apply(&self, encoded_peers_info: &[u8]) -> AwarenessPeerUpdate {
26 let (updated, added) = self.0.lock().unwrap().apply(encoded_peers_info);
27 AwarenessPeerUpdate { updated, added }
28 }
29
30 pub fn set_local_state(&self, value: Arc<dyn LoroValueLike>) {
31 self.0
32 .lock()
33 .unwrap()
34 .set_local_state(value.as_loro_value());
35 }
36
37 pub fn get_local_state(&self) -> Option<LoroValue> {
38 self.0.lock().unwrap().get_local_state().map(|x| x.into())
39 }
40
41 pub fn remove_outdated(&self) -> Vec<PeerID> {
42 self.0.lock().unwrap().remove_outdated()
43 }
44
45 pub fn get_all_states(&self) -> HashMap<PeerID, PeerInfo> {
46 self.0
47 .lock()
48 .unwrap()
49 .get_all_states()
50 .iter()
51 .map(|(p, i)| (*p, i.into()))
52 .collect()
53 }
54
55 pub fn peer(&self) -> PeerID {
56 self.0.lock().unwrap().peer()
57 }
58}
59
60pub struct AwarenessPeerUpdate {
61 pub updated: Vec<PeerID>,
62 pub added: Vec<PeerID>,
63}
64
65pub struct PeerInfo {
66 pub state: LoroValue,
67 pub counter: i32,
68 pub timestamp: i64,
70}
71
72impl From<&loro::awareness::PeerInfo> for PeerInfo {
73 fn from(value: &loro::awareness::PeerInfo) -> Self {
74 PeerInfo {
75 state: value.state.clone().into(),
76 counter: value.counter,
77 timestamp: value.timestamp,
78 }
79 }
80}