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 async fn save(&self, doc: Doc) -> Result<(), StoreError> {
28 let update = doc.get_update();
29 self.write(&update).await
30 }
31 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}