app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 0a8e2788db5e0e012314b53543138e0aa79043d7
parent 1960461dbd0357404f7d84a7bce6e9949363de9b
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 15:05:24 +0000

app: add idb bootstrap init for app backends

- add app_init_backends to bootstrap idb and build backends
- initialize datastore during app init sequence
- export app_init_backends for app wiring
- add non-wasm test with futures dev dependency

Diffstat:
MCargo.lock | 1+
Mapp/Cargo.toml | 3+++
Mapp/src/init.rs | 40+++++++++++++++++++++++++++++++++++++---
Mapp/src/lib.rs | 8+++++++-
4 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1540,6 +1540,7 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" name = "radroots-app" version = "0.1.0" dependencies = [ + "futures", "leptos", "radroots-app-core", "wasm-bindgen", diff --git a/app/Cargo.toml b/app/Cargo.toml @@ -13,3 +13,6 @@ crate-type = ["cdylib", "rlib"] leptos = { workspace = true, features = ["csr"] } wasm-bindgen.workspace = true radroots-app-core = { path = "../crates/core" } + +[dev-dependencies] +futures.workspace = true diff --git a/app/src/init.rs b/app/src/init.rs @@ -2,8 +2,16 @@ use std::fmt; -use radroots_app_core::datastore::{RadrootsClientDatastoreError, RadrootsClientWebDatastore}; -use radroots_app_core::idb::RadrootsClientIdbStoreError; +use radroots_app_core::datastore::{ + RadrootsClientDatastore, + RadrootsClientDatastoreError, + RadrootsClientWebDatastore, +}; +use radroots_app_core::idb::{ + idb_store_bootstrap, + RadrootsClientIdbStoreError, + RADROOTS_IDB_DATABASE, +}; use radroots_app_core::keystore::{RadrootsClientKeystoreError, RadrootsClientWebKeystoreNostr}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -40,9 +48,25 @@ pub struct AppBackends { pub type AppInitResult<T> = Result<T, AppInitError>; +pub async fn app_init_backends() -> AppInitResult<AppBackends> { + idb_store_bootstrap(RADROOTS_IDB_DATABASE, None) + .await + .map_err(AppInitError::Idb)?; + let datastore = RadrootsClientWebDatastore::new(None); + datastore + .init() + .await + .map_err(AppInitError::Datastore)?; + let nostr_keystore = RadrootsClientWebKeystoreNostr::new(None); + Ok(AppBackends { + datastore, + nostr_keystore, + }) +} + #[cfg(test)] mod tests { - use super::{AppInitError, AppInitErrorMessage}; + use super::{app_init_backends, AppInitError, AppInitErrorMessage}; use radroots_app_core::datastore::RadrootsClientDatastoreError; use radroots_app_core::idb::RadrootsClientIdbStoreError; use radroots_app_core::keystore::RadrootsClientKeystoreError; @@ -68,4 +92,14 @@ mod tests { assert_eq!(err.to_string(), *expected); } } + + #[test] + fn app_init_backends_maps_idb_errors() { + let err = futures::executor::block_on(app_init_backends()) + .expect_err("idb bootstrap should error on non-wasm"); + assert_eq!( + err, + AppInitError::Idb(RadrootsClientIdbStoreError::IdbUndefined) + ); + } } diff --git a/app/src/lib.rs b/app/src/lib.rs @@ -5,4 +5,10 @@ mod init; mod entry; pub use app::App; -pub use init::{AppBackends, AppInitError, AppInitErrorMessage, AppInitResult}; +pub use init::{ + app_init_backends, + AppBackends, + AppInitError, + AppInitErrorMessage, + AppInitResult, +};