Skip to main content

commonware_storage/qmdb/sync/
mod.rs

1//! Shared sync types and functionality for authenticated databases.
2
3use crate::qmdb::sync::engine::Config;
4use commonware_codec::Encode;
5use commonware_macros::boxed;
6
7pub mod engine;
8pub(crate) use engine::Engine;
9
10mod error;
11pub use error::{EngineError, Error};
12
13mod gaps;
14mod journal;
15pub(crate) use journal::Journal;
16
17mod metrics;
18pub use metrics::Metrics;
19
20mod database;
21pub(crate) use database::{
22    journal_covers_range, local_boundary_nodes, Config as DatabaseConfig, Database,
23};
24
25pub mod resolver;
26pub(crate) use resolver::{FetchResult, Resolver};
27
28mod target;
29pub use target::Target;
30
31pub mod compact;
32mod requests;
33
34/// A [`Resolver`] whose associated types match a specific `Database`.
35///
36/// Blanket-impled for any matching `Resolver`, so callers never implement this directly.
37pub trait DbResolver<DB: Database>:
38    Resolver<Family = DB::Family, Op = DB::Op, Digest = DB::Digest>
39{
40}
41
42impl<DB, R> DbResolver<DB> for R
43where
44    DB: Database,
45    R: Resolver<Family = DB::Family, Op = DB::Op, Digest = DB::Digest>,
46{
47}
48
49/// Create/open a database and sync it to a target state
50#[boxed]
51pub async fn sync<DB, R>(
52    config: Config<DB, R>,
53) -> Result<DB, Error<DB::Family, R::Error, DB::Digest>>
54where
55    DB: Database,
56    DB::Op: Encode,
57    R: DbResolver<DB>,
58{
59    Box::pin(Engine::new(config).await?.sync()).await
60}