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:
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,
+};