loro_ffi/
awareness.rs

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    // This field is generated locally
69    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}