|
@@ -4,12 +4,13 @@ use std::sync::Arc;
|
|
|
use std::time::Duration;
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
use arc_swap::ArcSwap;
|
|
use arc_swap::ArcSwap;
|
|
|
-use cdk_common::database::WalletDatabase;
|
|
|
|
|
|
|
+use cdk_common::database::{self, WalletDatabase};
|
|
|
use cdk_common::mint_url::MintUrl;
|
|
use cdk_common::mint_url::MintUrl;
|
|
|
use cdk_common::parking_lot::RwLock as ParkingLotRwLock;
|
|
use cdk_common::parking_lot::RwLock as ParkingLotRwLock;
|
|
|
use cdk_common::task::spawn;
|
|
use cdk_common::task::spawn;
|
|
|
use cdk_common::util::unix_time;
|
|
use cdk_common::util::unix_time;
|
|
|
use cdk_common::KeySet;
|
|
use cdk_common::KeySet;
|
|
|
|
|
+use tokio::time::sleep;
|
|
|
|
|
|
|
|
use super::scheduler::RefreshScheduler;
|
|
use super::scheduler::RefreshScheduler;
|
|
|
use super::{KeyManager, MintKeyCache};
|
|
use super::{KeyManager, MintKeyCache};
|
|
@@ -26,10 +27,8 @@ pub(super) enum MessageToWorker {
|
|
|
/// Stop the refresh task
|
|
/// Stop the refresh task
|
|
|
Stop,
|
|
Stop,
|
|
|
|
|
|
|
|
- /// Make sure the mint is loaded, from either any localstore or remotely.
|
|
|
|
|
///
|
|
///
|
|
|
- /// This function also makes sure all storages have a copy of the mint info and keys
|
|
|
|
|
- SyncMint,
|
|
|
|
|
|
|
+ SyncDb(Arc<dyn WalletDatabase<Err = database::Error> + Send + Sync>),
|
|
|
|
|
|
|
|
/// Fetch keys from the mint immediately
|
|
/// Fetch keys from the mint immediately
|
|
|
FetchMint,
|
|
FetchMint,
|
|
@@ -148,8 +147,10 @@ impl KeyManager {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- storage_cache.refresh_version += 1;
|
|
|
|
|
- storage_cache.is_ready = true;
|
|
|
|
|
|
|
+ if storage_cache.mint_info.is_some() {
|
|
|
|
|
+ storage_cache.refresh_version += 1;
|
|
|
|
|
+ storage_cache.is_ready = true;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
tracing::debug!(
|
|
tracing::debug!(
|
|
|
"Loaded {} keys from storage for {}",
|
|
"Loaded {} keys from storage for {}",
|
|
@@ -345,53 +346,6 @@ impl KeyManager {
|
|
|
Ok::<(), Error>(())
|
|
Ok::<(), Error>(())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- pub(super) fn sync_mint_task(
|
|
|
|
|
- mint_url: MintUrl,
|
|
|
|
|
- client: Arc<dyn MintConnector + Send + Sync>,
|
|
|
|
|
- #[cfg(feature = "auth")] auth_client: Arc<dyn AuthMintConnector + Send + Sync>,
|
|
|
|
|
- storages: Arc<
|
|
|
|
|
- ParkingLotRwLock<
|
|
|
|
|
- Vec<Arc<dyn WalletDatabase<Err = cdk_common::database::Error> + Send + Sync>>,
|
|
|
|
|
- >,
|
|
|
|
|
- >,
|
|
|
|
|
- cache: Arc<ArcSwap<MintKeyCache>>,
|
|
|
|
|
- refresh_scheduler: RefreshScheduler,
|
|
|
|
|
- ) {
|
|
|
|
|
- spawn(async move {
|
|
|
|
|
- if !cache.load().is_ready {
|
|
|
|
|
- if let Ok(new_cache) = Self::fetch_mint_info_and_keys_from_db(&mint_url, &storages)
|
|
|
|
|
- .await
|
|
|
|
|
- .inspect_err(|e| {
|
|
|
|
|
- tracing::warn!("Failed to load keys from storage for {}: {}", mint_url, e)
|
|
|
|
|
- })
|
|
|
|
|
- {
|
|
|
|
|
- let new_cache = Arc::new(new_cache);
|
|
|
|
|
- Self::persist_cache(&storages, mint_url.clone(), new_cache.clone()).await;
|
|
|
|
|
- cache.store(new_cache);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if !cache.load().is_ready {
|
|
|
|
|
- let _ = tokio::time::timeout(
|
|
|
|
|
- Duration::from_secs(60),
|
|
|
|
|
- Self::fetch_from_http(
|
|
|
|
|
- mint_url.clone(),
|
|
|
|
|
- client,
|
|
|
|
|
- #[cfg(feature = "auth")]
|
|
|
|
|
- auth_client,
|
|
|
|
|
- storages,
|
|
|
|
|
- cache,
|
|
|
|
|
- refresh_scheduler,
|
|
|
|
|
- ),
|
|
|
|
|
- )
|
|
|
|
|
- .await
|
|
|
|
|
- .inspect_err(|e| {
|
|
|
|
|
- tracing::warn!("Failed to fetch keys for {} with error {}", mint_url, e)
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
/// Refresh keys from mint server
|
|
/// Refresh keys from mint server
|
|
|
///
|
|
///
|
|
|
/// Spawns an async task with 60s timeout.
|
|
/// Spawns an async task with 60s timeout.
|
|
@@ -488,17 +442,19 @@ impl KeyManager {
|
|
|
tracing::debug!("Stopping refresh task for {}", mint_url);
|
|
tracing::debug!("Stopping refresh task for {}", mint_url);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- MessageToWorker::SyncMint => {
|
|
|
|
|
- tracing::debug!("Sync mint {}", mint_url);
|
|
|
|
|
- Self::sync_mint_task(
|
|
|
|
|
- mint_url.clone(),
|
|
|
|
|
- client.clone(),
|
|
|
|
|
- #[cfg(feature = "auth")]
|
|
|
|
|
- auth_client.clone(),
|
|
|
|
|
- storages.clone(),
|
|
|
|
|
- cache.clone(),
|
|
|
|
|
- refresh_scheduler.clone(),
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ MessageToWorker::SyncDb(db) => {
|
|
|
|
|
+ let cache_for_spawn = cache.clone();
|
|
|
|
|
+ let mint_for_spawn = mint_url.clone();
|
|
|
|
|
+ tokio::spawn(async move {
|
|
|
|
|
+ loop {
|
|
|
|
|
+ let cache = cache_for_spawn.load();
|
|
|
|
|
+ if cache.is_ready {
|
|
|
|
|
+ Self::persist_cache_db(db, mint_for_spawn, cache.clone()).await;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ sleep(Duration::from_millis(100)).await;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
MessageToWorker::FetchMint => {
|
|
MessageToWorker::FetchMint => {
|
|
|
tracing::debug!("FetchMint message received for {}", mint_url);
|
|
tracing::debug!("FetchMint message received for {}", mint_url);
|