Skip to content

Commit

Permalink
Implement StorageEventLogs for fs client storage.
Browse files Browse the repository at this point in the history
  • Loading branch information
tmpfs committed Feb 3, 2025
1 parent f3d010f commit b4b87c5
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 54 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/account/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ sos-filesystem.workspace = true
sos-login.workspace = true
sos-sync.workspace = true
sos-client-storage.workspace = true
sos-reducers.workspace = true
sos-signer.workspace = true
sos-vault.workspace = true
sos-vfs.workspace = true
Expand Down
51 changes: 3 additions & 48 deletions crates/account/src/account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::{convert::CipherComparison, AccountBuilder, Error, Result};
use sos_backend::compact::compact_folder;
use sos_backend::{
reducers::FolderReducer, write_exclusive, AccessPoint, AccountEventLog,
FolderEventLog, StorageError,
StorageError,
};
use sos_client_storage::{
AccessOptions, AccountPack, ClientAccountStorage, ClientDeviceStorage,
Expand Down Expand Up @@ -48,14 +48,14 @@ use {
#[cfg(feature = "archive")]
use sos_filesystem::archive::{Inventory, RestoreOptions};

use sos_backend::{BackendTarget, DeviceEventLog};
use sos_backend::BackendTarget;
use sos_core::device::{DevicePublicKey, TrustedDevice};
use sos_login::device::{DeviceManager, DeviceSigner};

use indexmap::IndexSet;

#[cfg(feature = "files")]
use {sos_backend::FileEventLog, sos_external_files::FileMutationEvent};
use sos_external_files::FileMutationEvent;

#[cfg(feature = "search")]
use sos_search::*;
Expand Down Expand Up @@ -3326,48 +3326,3 @@ impl Account for LocalAccount {
Ok(false)
}
}

#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
impl StorageEventLogs for LocalAccount {
type Error = Error;

async fn identity_log(&self) -> Result<Arc<RwLock<FolderEventLog>>> {
let storage = self.storage.read().await;
Ok(Arc::clone(&storage.identity_log))
}

async fn account_log(&self) -> Result<Arc<RwLock<AccountEventLog>>> {
let storage = self.storage.read().await;
Ok(Arc::clone(&storage.account_log))
}

async fn device_log(&self) -> Result<Arc<RwLock<DeviceEventLog>>> {
let storage = self.storage.read().await;
Ok(Arc::clone(&storage.device_log))
}

#[cfg(feature = "files")]
async fn file_log(&self) -> Result<Arc<RwLock<FileEventLog>>> {
let storage = self.storage.read().await;
Ok(Arc::clone(&storage.file_log))
}

async fn folder_details(&self) -> Result<IndexSet<Summary>> {
let storage = self.storage.read().await;
let folders = storage.list_folders();
Ok(folders.into_iter().cloned().collect())
}

async fn folder_log(
&self,
id: &VaultId,
) -> Result<Arc<RwLock<FolderEventLog>>> {
let storage = self.storage.read().await;
let folder = storage
.folders()
.get(id)
.ok_or(StorageError::CacheNotAvailable(*id))?;
Ok(folder.event_log())
}
}
56 changes: 50 additions & 6 deletions crates/account/src/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
use super::folder_sync::{
FolderMerge, FolderMergeOptions, IdentityFolderMerge,
};
use crate::{Account, LocalAccount, Result};
use crate::{Account, Error, LocalAccount, Result};
use async_trait::async_trait;
use sos_backend::reducers::DeviceReducer;
use sos_backend::StorageError;
use indexmap::IndexSet;
use sos_backend::{
AccountEventLog, DeviceEventLog, FolderEventLog, StorageError,
};
use sos_client_storage::{ClientAccountStorage, ClientFolderStorage};
use sos_core::{decode, events::EventLog};
use sos_core::{
Expand All @@ -15,15 +17,57 @@ use sos_core::{
},
VaultId,
};
use sos_reducers::DeviceReducer;
use sos_sync::{
ForceMerge, Merge, MergeOutcome, StorageEventLogs, SyncStorage,
TrackedChanges,
};
use sos_vault::Vault;
use std::collections::HashSet;
use sos_vault::{Summary, Vault};
use std::{collections::HashSet, sync::Arc};
use tokio::sync::RwLock;

#[cfg(feature = "files")]
use sos_core::events::patch::FileDiff;
use {sos_backend::FileEventLog, sos_core::events::patch::FileDiff};

#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
impl StorageEventLogs for LocalAccount {
type Error = Error;

async fn identity_log(&self) -> Result<Arc<RwLock<FolderEventLog>>> {
let storage = self.storage.read().await;
Ok(storage.identity_log().await?)
}

async fn account_log(&self) -> Result<Arc<RwLock<AccountEventLog>>> {
let storage = self.storage.read().await;
Ok(storage.account_log().await?)
}

async fn device_log(&self) -> Result<Arc<RwLock<DeviceEventLog>>> {
let storage = self.storage.read().await;
Ok(storage.device_log().await?)
}

#[cfg(feature = "files")]
async fn file_log(&self) -> Result<Arc<RwLock<FileEventLog>>> {
let storage = self.storage.read().await;
Ok(storage.file_log().await?)
}

async fn folder_details(&self) -> Result<IndexSet<Summary>> {
let storage = self.storage.read().await;
Ok(storage.folder_details().await?)
}

async fn folder_log(
&self,
id: &VaultId,
) -> Result<Arc<RwLock<FolderEventLog>>> {
let storage = self.storage.read().await;
Ok(storage.folder_log(id).await?)
}
}

#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
Expand Down
1 change: 1 addition & 0 deletions crates/database/src/archive/import.rs
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,7 @@ pub(crate) async fn start<'conn>(
})?;
let mut db_temp = NamedTempFile::new()?;
db_temp.as_file_mut().write_all(&db_buffer)?;
db_temp.as_file_mut().flush()?;

let source_db = Connection::open(db_temp.path())?;
let import = BackupImport {
Expand Down
2 changes: 2 additions & 0 deletions crates/storage/client/src/filesystem/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ use {
#[cfg(feature = "search")]
use sos_search::{AccountSearch, DocumentCount};

mod sync;

/// Storage change event with an optional
/// collection of file mutation events.
#[doc(hidden)]
Expand Down
53 changes: 53 additions & 0 deletions crates/storage/client/src/filesystem/sync.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
use crate::{ClientFolderStorage, Error, Result};
use async_trait::async_trait;
use indexmap::IndexSet;
use sos_backend::{
AccountEventLog, DeviceEventLog, FolderEventLog, StorageError,
};
use sos_core::VaultId;
use sos_sync::StorageEventLogs;
use sos_vault::Summary;
use std::sync::Arc;
use tokio::sync::RwLock;

#[cfg(feature = "files")]
use sos_backend::FileEventLog;

#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
impl StorageEventLogs for super::ClientStorage {
type Error = Error;

async fn identity_log(&self) -> Result<Arc<RwLock<FolderEventLog>>> {
Ok(self.identity_log.clone())
}

async fn account_log(&self) -> Result<Arc<RwLock<AccountEventLog>>> {
Ok(self.account_log.clone())
}

async fn device_log(&self) -> Result<Arc<RwLock<DeviceEventLog>>> {
Ok(self.device_log.clone())
}

#[cfg(feature = "files")]
async fn file_log(&self) -> Result<Arc<RwLock<FileEventLog>>> {
Ok(self.file_log.clone())
}

async fn folder_details(&self) -> Result<IndexSet<Summary>> {
let folders = self.list_folders();
Ok(folders.into_iter().cloned().collect())
}

async fn folder_log(
&self,
id: &VaultId,
) -> Result<Arc<RwLock<FolderEventLog>>> {
let folder = self
.folders
.get(id)
.ok_or(StorageError::CacheNotAvailable(*id))?;
Ok(folder.event_log())
}
}

0 comments on commit b4b87c5

Please sign in to comment.