app

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

commit 6e90de7bef0bbf08627f0c49cd68a4d7182216bf
parent 342a55de50a607b41da085a50d4ba74504c0d9ca
Author: triesap <triesap@radroots.dev>
Date:   Wed, 21 Jan 2026 17:50:23 +0000

app: move logs to logs store

- add dedicated logs store config in idb

- route log reads and writes to logs datastore

- keep key map prefixes unchanged for log entries

- update logs page to use logs store

Diffstat:
Mapp/src/app.rs | 32++++++++++++++++++++------------
Mapp/src/logs.rs | 12+++++++++++-
Mcrates/core/src/idb/config.rs | 5+++++
Mcrates/core/src/idb/mod.rs | 2++
4 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/app/src/app.rs b/app/src/app.rs @@ -5,6 +5,8 @@ use leptos_router::components::{A, Route, Router, Routes}; use leptos_router::hooks::use_navigate; use leptos_router::path; +use radroots_app_core::idb::IDB_CONFIG_LOGS; + use crate::{ app_init_assets, app_init_backends, @@ -70,6 +72,10 @@ fn log_init_stage(stage: RadrootsAppInitStage) { let _ = app_log_debug_emit("log.app.init.stage", stage.as_str(), None); } +fn logs_datastore() -> radroots_app_core::datastore::RadrootsClientWebDatastore { + radroots_app_core::datastore::RadrootsClientWebDatastore::new(Some(IDB_CONFIG_LOGS)) +} + fn spawn_health_checks( config: RadrootsAppConfig, setup_required: bool, @@ -121,7 +127,8 @@ fn spawn_health_checks( health_running.set(false); let key_maps = config.datastore.key_maps.clone(); spawn_local(async move { - let _ = app_log_buffer_flush_deferred(&datastore, &key_maps, true).await; + let log_datastore = logs_datastore(); + let _ = app_log_buffer_flush_deferred(&log_datastore, &key_maps, true).await; }); }); } @@ -136,7 +143,6 @@ fn app_health_check_delay_ms() -> u32 { fn SplashPage() -> impl IntoView { view! { <main style="min-height:100vh;background:white;display:flex;align-items:center;justify-content:center;"> - <div>"loading"</div> </main> } } @@ -296,7 +302,13 @@ fn HomePage() -> impl IntoView { ); } Err(err) => { - let _ = app_log_error_store(&datastore, &config.datastore.key_maps, &err).await; + let log_datastore = logs_datastore(); + let _ = app_log_error_store( + &log_datastore, + &config.datastore.key_maps, + &err, + ) + .await; reset_status.set(Some(err.to_string())); } } @@ -344,8 +356,9 @@ fn HomePage() -> impl IntoView { ); } Err(err) => { + let log_datastore = logs_datastore(); let _ = app_log_error_store( - &datastore, + &log_datastore, &config.datastore.key_maps, &err, ) @@ -563,17 +576,12 @@ fn AppShell() -> impl IntoView { } }); let flush_ctx = backends.with_untracked(|value| { - value.as_ref().map(|backends| { - ( - backends.datastore.clone(), - backends.config.datastore.key_maps.clone(), - ) - }) + value.as_ref().map(|backends| backends.config.datastore.key_maps.clone()) }); - if let Some((datastore, key_maps)) = flush_ctx { + if let Some(key_maps) = flush_ctx { spawn_local(async move { let _ = app_log_buffer_flush_deferred( - datastore.as_ref(), + &logs_datastore(), &key_maps, true, ) diff --git a/app/src/logs.rs b/app/src/logs.rs @@ -14,6 +14,9 @@ use wasm_bindgen_futures::JsFuture; use wasm_bindgen::JsValue; use std::rc::Rc; +use radroots_app_core::datastore::RadrootsClientWebDatastore; +use radroots_app_core::idb::IDB_CONFIG_LOGS; + use crate::{ app_context, app_log_buffer_flush_no_prune, @@ -44,6 +47,10 @@ fn logs_page_size_default() -> usize { LOGS_PAGE_SIZE } +fn logs_datastore() -> RadrootsClientWebDatastore { + RadrootsClientWebDatastore::new(Some(IDB_CONFIG_LOGS)) +} + fn log_level_color(level: RadrootsAppLogLevel) -> &'static str { match level { RadrootsAppLogLevel::Debug => "#6b7280", @@ -372,7 +379,10 @@ pub fn RadrootsAppLogsPage() -> impl IntoView { .backends .with_untracked(|value| { value.as_ref().map(|backends| { - (backends.datastore.clone(), backends.config.datastore.key_maps.clone()) + ( + Rc::new(logs_datastore()), + backends.config.datastore.key_maps.clone(), + ) }) }) }) diff --git a/crates/core/src/idb/config.rs b/crates/core/src/idb/config.rs @@ -3,6 +3,7 @@ use super::RadrootsClientIdbConfig; pub const RADROOTS_IDB_DATABASE: &str = "radroots-pwa-v1"; pub const IDB_STORE_DATASTORE: &str = "radroots.app.datastore"; +pub const IDB_STORE_LOGS: &str = "radroots.app.logs"; pub const IDB_STORE_KEYSTORE: &str = "radroots.security.keystore"; pub const IDB_STORE_KEYSTORE_NOSTR: &str = "radroots.security.keystore.nostr"; pub const IDB_STORE_CRYPTO_REGISTRY: &str = "radroots.security.crypto.registry"; @@ -16,6 +17,8 @@ pub const IDB_STORE_KEYSTORE_NOSTR_CIPHER: &str = "radroots.security.keystore.no pub const IDB_CONFIG_DATASTORE: RadrootsClientIdbConfig = RadrootsClientIdbConfig::new(RADROOTS_IDB_DATABASE, IDB_STORE_DATASTORE); +pub const IDB_CONFIG_LOGS: RadrootsClientIdbConfig = + RadrootsClientIdbConfig::new(RADROOTS_IDB_DATABASE, IDB_STORE_LOGS); pub const IDB_CONFIG_KEYSTORE: RadrootsClientIdbConfig = RadrootsClientIdbConfig::new(RADROOTS_IDB_DATABASE, IDB_STORE_KEYSTORE); pub const IDB_CONFIG_KEYSTORE_NOSTR: RadrootsClientIdbConfig = @@ -31,6 +34,7 @@ pub const IDB_CONFIG_TANGLE: RadrootsClientIdbConfig = pub const RADROOTS_IDB_CONFIGS: &[RadrootsClientIdbConfig] = &[ IDB_CONFIG_DATASTORE, + IDB_CONFIG_LOGS, IDB_CONFIG_KEYSTORE, IDB_CONFIG_KEYSTORE_NOSTR, IDB_CONFIG_CRYPTO_REGISTRY, @@ -41,6 +45,7 @@ pub const RADROOTS_IDB_CONFIGS: &[RadrootsClientIdbConfig] = &[ pub const RADROOTS_IDB_STORES: &[&str] = &[ IDB_STORE_DATASTORE, + IDB_STORE_LOGS, IDB_STORE_KEYSTORE, IDB_STORE_KEYSTORE_NOSTR, IDB_STORE_CRYPTO_REGISTRY, diff --git a/crates/core/src/idb/mod.rs b/crates/core/src/idb/mod.rs @@ -11,6 +11,7 @@ pub use config::{ IDB_CONFIG_CIPHER_SQL, IDB_CONFIG_CRYPTO_REGISTRY, IDB_CONFIG_DATASTORE, + IDB_CONFIG_LOGS, IDB_CONFIG_KEYSTORE, IDB_CONFIG_KEYSTORE_NOSTR, IDB_CONFIG_TANGLE, @@ -19,6 +20,7 @@ pub use config::{ IDB_STORE_CIPHER_SUFFIX, IDB_STORE_CRYPTO_REGISTRY, IDB_STORE_DATASTORE, + IDB_STORE_LOGS, IDB_STORE_KEYSTORE, IDB_STORE_KEYSTORE_CIPHER, IDB_STORE_KEYSTORE_NOSTR,