commit 413cb3de125c8712ed665bac99431c6530620485
parent 627003d498fca722f66ad994e48d696123d27e77
Author: triesap <triesap@radroots.dev>
Date: Mon, 19 Jan 2026 18:03:54 +0000
app: add bootstrap reset helper
- add helper to delete bootstrap datastore entries
- call reset helper from app_init_reset when provided
- re-export bootstrap reset helper from app crate
- add unit test for reset error mapping
Diffstat:
3 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/app/src/bootstrap.rs b/app/src/bootstrap.rs
@@ -36,9 +36,30 @@ pub async fn app_datastore_write_app_data<T: RadrootsClientDatastore>(
.map_err(AppInitError::Datastore)
}
+pub async fn app_datastore_clear_bootstrap<T: RadrootsClientDatastore>(
+ datastore: &T,
+ key_maps: &AppKeyMapConfig,
+) -> AppInitResult<()> {
+ let cfg_key = app_datastore_obj_key_cfg_data(key_maps).map_err(AppInitError::Config)?;
+ datastore
+ .del_obj(cfg_key)
+ .await
+ .map_err(AppInitError::Datastore)?;
+ let app_key = app_datastore_obj_key_app_data(key_maps).map_err(AppInitError::Config)?;
+ datastore
+ .del_obj(app_key)
+ .await
+ .map_err(AppInitError::Datastore)?;
+ Ok(())
+}
+
#[cfg(test)]
mod tests {
- use super::{app_datastore_write_app_data, app_datastore_write_config};
+ use super::{
+ app_datastore_clear_bootstrap,
+ app_datastore_write_app_data,
+ app_datastore_write_config,
+ };
use crate::{app_key_maps_default, AppAppData, AppConfigData, AppInitError};
use radroots_app_core::datastore::{RadrootsClientDatastoreError, RadrootsClientWebDatastore};
@@ -69,4 +90,16 @@ mod tests {
.expect_err("idb undefined");
assert_eq!(err, AppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined));
}
+
+ #[test]
+ fn clear_bootstrap_maps_idb_errors() {
+ let datastore = RadrootsClientWebDatastore::new(None);
+ let key_maps = app_key_maps_default();
+ let err = futures::executor::block_on(app_datastore_clear_bootstrap(
+ &datastore,
+ &key_maps,
+ ))
+ .expect_err("idb undefined");
+ assert_eq!(err, AppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined));
+ }
}
diff --git a/app/src/init.rs b/app/src/init.rs
@@ -15,12 +15,14 @@ use radroots_app_core::idb::{
use radroots_app_core::keystore::{RadrootsClientKeystoreError, RadrootsClientWebKeystoreNostr};
use crate::{
+ app_datastore_clear_bootstrap,
app_datastore_write_app_data,
app_datastore_write_config,
AppAppData,
AppConfig,
AppConfigData,
AppConfigError,
+ AppKeyMapConfig,
};
#[cfg(target_arch = "wasm32")]
@@ -149,7 +151,13 @@ pub fn app_init_mark_completed() {
}
}
-pub fn app_init_reset() {
+pub async fn app_init_reset<T: RadrootsClientDatastore>(
+ datastore: Option<&T>,
+ key_maps: Option<&AppKeyMapConfig>,
+) -> AppInitResult<()> {
+ if let (Some(datastore), Some(key_maps)) = (datastore, key_maps) {
+ app_datastore_clear_bootstrap(datastore, key_maps).await?;
+ }
#[cfg(target_arch = "wasm32")]
{
let window = window();
@@ -157,6 +165,7 @@ pub fn app_init_reset() {
let _ = storage.remove_item(APP_INIT_STORAGE_KEY);
}
}
+ Ok(())
}
pub async fn app_init_backends(config: AppConfig) -> AppInitResult<AppBackends> {
@@ -242,7 +251,10 @@ mod tests {
#[test]
fn app_init_reset_is_noop_on_native() {
super::app_init_mark_completed();
- super::app_init_reset();
+ let result = futures::executor::block_on(super::app_init_reset::<
+ radroots_app_core::datastore::RadrootsClientWebDatastore,
+ >(None, None));
+ assert!(result.is_ok());
}
#[test]
diff --git a/app/src/lib.rs b/app/src/lib.rs
@@ -9,7 +9,11 @@ mod init;
mod entry;
pub use app::App;
-pub use bootstrap::{app_datastore_write_app_data, app_datastore_write_config};
+pub use bootstrap::{
+ app_datastore_clear_bootstrap,
+ app_datastore_write_app_data,
+ app_datastore_write_config,
+};
pub use context::{app_context, AppContext};
pub use data::{AppAppData, AppConfigData, AppConfigRole};
pub use config::{