app

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

commit 0939774c7546d79bbc28ba5317140fc17fc0d1fe
parent a840502f6832982e4bc7d8fbd8fc79f53460159c
Author: triesap <triesap@radroots.dev>
Date:   Wed, 21 Jan 2026 15:53:54 +0000

app: defer log flush off readiness

- run init log flush in background after ready

- keep health checks from blocking on log flush

- use deferred log flush helper for pruning

- preserve existing UI status updates

Diffstat:
Mapp/src/app.rs | 33+++++++++++++++++++++++++--------
1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/app/src/app.rs b/app/src/app.rs @@ -16,7 +16,7 @@ use crate::{ app_init_total_add, app_init_total_unknown, app_context, - app_log_buffer_flush_critical, + app_log_buffer_flush_deferred, app_log_debug_emit, app_log_error_emit, app_log_error_store, @@ -24,7 +24,7 @@ use crate::{ app_datastore_read_state, app_state_notifications_permission_value, app_state_set_notifications_permission_value, - app_health_check_all_logged, + app_health_check_all, RadrootsAppBackends, RadrootsAppConfig, RadrootsAppHealthCheckResult, @@ -85,7 +85,7 @@ fn spawn_health_checks( ); let notifications = RadrootsAppNotifications::new(None); let tangle = RadrootsAppTangleClientStub::new(); - let report = app_health_check_all_logged( + let report = app_health_check_all( &datastore, &keystore, &notifications, @@ -111,6 +111,10 @@ fn spawn_health_checks( active_key.set(active_key_value); notifications_status.set(notifications_value); 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; + }); }); } @@ -481,16 +485,29 @@ pub fn RadrootsApp() -> impl IntoView { } match app_init_backends(config).await { Ok(value) => { - let _ = app_log_buffer_flush_critical( - value.datastore.as_ref(), - &value.config.datastore.key_maps, - ) - .await; backends.set(Some(value)); app_init_mark_completed(); let stage = RadrootsAppInitStage::Ready; init_state.update(|state| app_init_stage_set(state, stage)); log_init_stage(stage); + let flush_ctx = backends.with_untracked(|value| { + value.as_ref().map(|backends| { + ( + backends.datastore.clone(), + backends.config.datastore.key_maps.clone(), + ) + }) + }); + if let Some((datastore, key_maps)) = flush_ctx { + spawn_local(async move { + let _ = app_log_buffer_flush_deferred( + datastore.as_ref(), + &key_maps, + true, + ) + .await; + }); + } } Err(err) => { let _ = app_log_error_emit(&err);