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}