loro_ffi/
ephemeral.rs

1use crate::{LoroValue, LoroValueLike, Subscription};
2pub use loro::awareness::EphemeralEventTrigger;
3use loro::{awareness::EphemeralStore as InternalEphemeralStore, LoroError, LoroResult};
4use std::sync::{Arc, Mutex};
5
6#[derive(Debug, Clone)]
7pub struct EphemeralStoreEvent {
8    pub by: EphemeralEventTrigger,
9    pub added: Vec<String>,
10    pub removed: Vec<String>,
11    pub updated: Vec<String>,
12}
13
14pub trait LocalEphemeralListener: Sync + Send {
15    fn on_ephemeral_update(&self, update: Vec<u8>);
16}
17
18pub trait EphemeralSubscriber: Sync + Send {
19    fn on_ephemeral_event(&self, event: EphemeralStoreEvent);
20}
21pub struct EphemeralStore(InternalEphemeralStore);
22
23impl EphemeralStore {
24    pub fn new(timeout: i64) -> Self {
25        Self(InternalEphemeralStore::new(timeout))
26    }
27
28    pub fn encode(&self, key: &str) -> Vec<u8> {
29        self.0.encode(key)
30    }
31
32    pub fn encode_all(&self) -> Vec<u8> {
33        self.0.encode_all()
34    }
35
36    pub fn apply(&self, data: &[u8]) -> LoroResult<()> {
37        self.0
38            .apply(data)
39            .map_err(|e| LoroError::DecodeError(e.into()))
40    }
41
42    pub fn set(&self, key: &str, value: Arc<dyn LoroValueLike>) {
43        self.0.set(key, value.as_loro_value())
44    }
45
46    pub fn delete(&self, key: &str) {
47        self.0.delete(key)
48    }
49
50    pub fn get(&self, key: &str) -> Option<LoroValue> {
51        self.0.get(key).map(|v| v.into())
52    }
53
54    pub fn remove_outdated(&self) {
55        self.0.remove_outdated()
56    }
57
58    pub fn keys(&self) -> Vec<String> {
59        self.0.keys()
60    }
61
62    pub fn get_all_states(&self) -> std::collections::HashMap<String, LoroValue> {
63        self.0
64            .get_all_states()
65            .into_iter()
66            .map(|(k, v)| (k, v.into()))
67            .collect()
68    }
69
70    pub fn subscribe_local_update(
71        &self,
72        listener: Arc<dyn LocalEphemeralListener>,
73    ) -> Arc<Subscription> {
74        let s = self.0.subscribe_local_updates(Box::new(move |update| {
75            listener.on_ephemeral_update(update.to_vec());
76            true
77        }));
78        Arc::new(Subscription(Mutex::new(Some(s))))
79    }
80
81    pub fn subscribe(&self, listener: Arc<dyn EphemeralSubscriber>) -> Arc<Subscription> {
82        let s = self.0.subscribe(Box::new(move |update| {
83            listener.on_ephemeral_event(EphemeralStoreEvent {
84                by: update.by,
85                added: update.added.to_vec(),
86                removed: update.removed.to_vec(),
87                updated: update.updated.to_vec(),
88            });
89            true
90        }));
91        Arc::new(Subscription(Mutex::new(Some(s))))
92    }
93}