yrs_store/
lib.rs

1pub mod doc;
2pub mod errors;
3
4use crate::doc::ForStore;
5use crate::errors::StoreError;
6use async_trait::async_trait;
7use futures_util::stream::BoxStream;
8use futures_util::{StreamExt};
9use yrs::{Doc, Transact};
10
11#[async_trait]
12pub trait Store: Send + Sync {
13    async fn start(&self) -> Result<(), StoreError> {
14        Ok(())
15    }
16    async fn stop(&self) -> Result<(), StoreError> {
17        Ok(())
18    }
19    async fn delete(&self) -> Result<(), StoreError>;
20    async fn write(&self, update: &Vec<u8>) -> Result<(), StoreError>;
21    async fn read(&self) -> Result<BoxStream<Result<(Vec<u8>, i64), StoreError>>, StoreError>;
22    async fn read_payloads(&self) -> Result<BoxStream<Result<Vec<u8>, StoreError>>, StoreError>;
23    async fn squash(&self) -> Result<(), StoreError>;
24    /// save a YDoc updates
25    /// # Arguments
26    /// * `doc`: y doc
27    async fn save(&self, doc: Doc) -> Result<(), StoreError> {
28        let update = doc.get_update();
29        self.write(&update).await
30    }
31    /// load and apply updates for doc
32    /// # Arguments:
33    ///* `doc`: apply updates YDoc
34    async fn load(&self, doc: &Doc) -> Result<(), StoreError> {
35        let mut txn = doc.transact_mut();
36        let mut streams = self.read_payloads().await?;
37        while let Some(result) = streams.next().await {
38            let update = result?;
39            doc.apply_update(&mut txn, &update)
40                .map_err(StoreError::UpdateError)?;
41        }
42        Ok(())
43    }
44}