app

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

commit d70851bdcb5dcde1d0f88eb775d077d15a48e09d
parent 379527f69b475c6767117dadcf9893f585d1b3af
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 18:38:03 +0000

app: add datastore roundtrip health check

- add health check to write/read/delete temp key
- map datastore failures into health results
- export roundtrip health check helper
- add unit test for non-wasm error mapping

Diffstat:
Mapp/src/health.rs | 32++++++++++++++++++++++++++++++++
Mapp/src/lib.rs | 1+
2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/app/src/health.rs b/app/src/health.rs @@ -110,12 +110,36 @@ pub async fn app_health_check_bootstrap_app_data<T: RadrootsClientDatastore>( } } +const APP_HEALTH_TEMP_KEY: &str = "radroots.health.temp"; + +pub async fn app_health_check_datastore_roundtrip<T: RadrootsClientDatastore>( + datastore: &T, +) -> AppHealthCheckResult { + let value = "ok"; + if let Err(err) = datastore.set(APP_HEALTH_TEMP_KEY, value).await { + return AppHealthCheckResult::error(err.to_string()); + } + match datastore.get(APP_HEALTH_TEMP_KEY).await { + Ok(read) => { + if read != value { + return AppHealthCheckResult::error("mismatch"); + } + } + Err(err) => return AppHealthCheckResult::error(err.to_string()), + } + if let Err(err) = datastore.del(APP_HEALTH_TEMP_KEY).await { + return AppHealthCheckResult::error(err.to_string()); + } + AppHealthCheckResult::ok() +} + #[cfg(test)] mod tests { use super::{ app_health_check_key_maps, app_health_check_bootstrap_app_data, app_health_check_bootstrap_config, + app_health_check_datastore_roundtrip, AppHealthCheckResult, AppHealthCheckStatus, AppHealthReport, @@ -177,4 +201,12 @@ mod tests { )); assert_eq!(result.status, AppHealthCheckStatus::Error); } + + #[test] + fn health_check_roundtrip_reports_idb_errors() { + let datastore = RadrootsClientWebDatastore::new(None); + let result = + futures::executor::block_on(app_health_check_datastore_roundtrip(&datastore)); + assert_eq!(result.status, AppHealthCheckStatus::Error); + } } diff --git a/app/src/lib.rs b/app/src/lib.rs @@ -22,6 +22,7 @@ pub use data::{AppAppData, AppConfigData, AppConfigRole}; pub use health::{ app_health_check_bootstrap_app_data, app_health_check_bootstrap_config, + app_health_check_datastore_roundtrip, app_health_check_key_maps, AppHealthCheckResult, AppHealthCheckStatus,