wallet_persistence.rs (1602B)
1 use std::time::Duration; 2 3 use tokio::time::sleep; 4 5 use crate::adapters::wallet_store; 6 7 use super::{HttpState, now_ms}; 8 9 pub(super) async fn run_owned_blinded_outbox_persistence(state: HttpState) { 10 loop { 11 sleep(Duration::from_millis(500)).await; 12 let (version, entries) = { 13 let node = state.node.lock().await; 14 let version = node.owned_blinded_outbox_version(); 15 if version == 0 { 16 continue; 17 } 18 (version, node.owned_blinded_transactions()) 19 }; 20 let password = wallet_persistence_password(&state).await; 21 match wallet_store::replace_owned_blinded_transactions( 22 &state.wallet_path, 23 password.as_deref(), 24 entries, 25 ) { 26 Ok(()) => { 27 state 28 .node 29 .lock() 30 .await 31 .mark_owned_blinded_outbox_persisted(version); 32 } 33 Err(error) if format!("{error:#}").contains("wallet is encrypted") => {} 34 Err(error) => eprintln!("failed to persist owned blinded transactions: {error:#}"), 35 } 36 } 37 } 38 39 async fn wallet_persistence_password(state: &HttpState) -> Option<String> { 40 let metadata = wallet_store::metadata(&state.wallet_path).ok().flatten()?; 41 if !metadata.encrypted { 42 return None; 43 } 44 let now = now_ms(); 45 state 46 .auth_sessions 47 .lock() 48 .await 49 .values() 50 .find(|session| session.expires_at > now) 51 .map(|session| session.wallet_password.clone()) 52 }