clementine_core/task/
tx_sender.rs

1use std::time::Duration;
2
3use crate::task::{BufferedErrors, TaskExt, WithDelay};
4use crate::task::{RecoverableTask, Task, TaskVariant};
5use clementine_errors::BridgeError;
6use clementine_tx_sender::task::TxSenderTaskInternal;
7use clementine_tx_sender::TxSender;
8use tonic::async_trait;
9
10const POLL_DELAY: Duration = if cfg!(test) {
11    Duration::from_millis(400)
12} else {
13    Duration::from_secs(30)
14};
15
16#[derive(Debug)]
17pub struct TxSenderTask {
18    inner: TxSenderTaskInternal,
19}
20
21impl TxSenderTask {
22    pub fn new(inner: TxSender) -> Self {
23        Self {
24            inner: TxSenderTaskInternal::new(inner),
25        }
26    }
27}
28
29#[async_trait]
30impl Task for TxSenderTask {
31    type Output = bool;
32    const VARIANT: TaskVariant = TaskVariant::TxSender;
33
34    async fn run_once(&mut self) -> Result<bool, BridgeError> {
35        self.inner.run_once().await
36    }
37}
38
39#[async_trait]
40impl RecoverableTask for TxSenderTask {
41    async fn recover_from_error(&mut self, _error: &BridgeError) -> Result<(), BridgeError> {
42        // No special recovery needed; retry on next run.
43        Ok(())
44    }
45}
46
47// Implement IntoTask for TxSender
48impl crate::task::IntoTask for TxSender {
49    type Task = WithDelay<BufferedErrors<TxSenderTask>>;
50    fn into_task(self) -> Self::Task {
51        TxSenderTask::new(self)
52            .into_buffered_errors(10, 1, Duration::from_secs(10))
53            .with_delay(POLL_DELAY)
54    }
55}