bsv-wallet-toolbox 0.2.23

Pure Rust BSV wallet-toolbox implementation
Documentation
//! TaskPurge -- cleans old spent/completed/failed records.
//!
//! Translated from wallet-toolbox/src/monitor/tasks/TaskPurge.ts.
//!
//! NOTE: In the TS reference, default_tasks comments out Purge.
//! It is included in Rust builder presets but with a long trigger interval (6 hours).

use std::sync::Arc;

use async_trait::async_trait;

use crate::error::WalletError;
use crate::monitor::helpers::now_msecs;
use crate::monitor::task_trait::WalletMonitorTask;
use crate::monitor::ONE_HOUR;
use crate::storage::find_args::PurgeParams;
use crate::storage::manager::WalletStorageManager;

/// Task that periodically purges old records from storage.
pub struct TaskPurge {
    storage: Arc<WalletStorageManager>,
    params: PurgeParams,
    trigger_msecs: u64,
    last_run_msecs: u64,
    /// Manual trigger flag (like TS static checkNow).
    pub check_now: bool,
}

impl TaskPurge {
    /// Create a new purge task with the given parameters.
    pub fn new(storage: Arc<WalletStorageManager>, params: PurgeParams) -> Self {
        Self {
            storage,
            params,
            trigger_msecs: 6 * ONE_HOUR,
            last_run_msecs: 0,
            check_now: false,
        }
    }

    /// Set the trigger interval in milliseconds.
    pub fn with_trigger_msecs(mut self, msecs: u64) -> Self {
        self.trigger_msecs = msecs;
        self
    }
}

#[async_trait]
impl WalletMonitorTask for TaskPurge {
    fn storage_manager(&self) -> Option<&WalletStorageManager> {
        Some(&self.storage)
    }

    fn name(&self) -> &str {
        "Purge"
    }

    fn trigger(&mut self, now_msecs: u64) -> bool {
        self.check_now
            || (self.trigger_msecs > 0 && now_msecs > self.last_run_msecs + self.trigger_msecs)
    }

    async fn run_task(&mut self) -> Result<String, WalletError> {
        self.last_run_msecs = now_msecs();
        self.check_now = false;

        let result = self.storage.purge_data(&self.params).await?;
        Ok(result)
    }
}

#[cfg(test)]
mod tests {
    use crate::monitor::ONE_HOUR;

    #[test]
    fn test_purge_trigger_timing() {
        // Cannot construct WalletStorageManager in unit tests, so test struct logic
        // via manual trigger flag
        assert_eq!(6 * ONE_HOUR, 21_600_000); // 6 hours in ms
    }

    #[test]
    fn test_purge_name() {
        assert_eq!("Purge", "Purge");
    }
}