Skip to main content

fireblocks_sdk/client/
poll.rs

1use {
2    super::Client,
3    crate::models::TransactionResponse,
4    std::{ops::Add, time::Duration},
5    tracing::debug,
6};
7
8impl Client {
9    /// Pool transaction until
10    /// * [`TransactionStatus::Failed`]
11    /// * [`TransactionStatus::Completed`]
12    /// * [`TransactionStatus::Blocked`]
13    /// * [`TransactionStatus::Rejected`]
14    /// * [`TransactionStatus::Cancelling`]
15    /// * [`TransactionStatus::Cancelled`]
16    ///
17    /// [getTransaction](https://docs.fireblocks.com/api/swagger-ui/#/Transactions/getTransaction)
18    #[tracing::instrument(level = "debug", skip(self, callback))]
19    pub async fn poll_transaction(
20        &self,
21        id: &str,
22        timeout: std::time::Duration,
23        interval: std::time::Duration,
24        callback: impl Fn(&TransactionResponse) + Send + Sync,
25    ) -> crate::Result<TransactionResponse> {
26        let mut total_time = Duration::from_millis(0);
27        loop {
28            if let Ok(result) = self.get_transaction(id).await {
29                debug!("status {:#?}", result.status);
30                if result.status.is_terminal() {
31                    break;
32                }
33                callback(&result);
34            }
35            tokio::time::sleep(interval).await;
36            total_time = total_time.add(interval);
37            if total_time > timeout {
38                break;
39            }
40        }
41        self.get_transaction(id).await
42    }
43}