kabu_node_json_rpc/
mempool_processing_component.rs1use alloy_network::Ethereum;
2use alloy_provider::Provider;
3use eyre::Result;
4use tokio::sync::broadcast;
5use tracing::{error, info};
6
7use kabu_core_components::Component;
8use kabu_types_events::MessageMempoolDataUpdate;
9use reth_ethereum_primitives::EthPrimitives;
10use reth_tasks::TaskExecutor;
11
12pub struct MempoolProcessingComponent<P> {
14 #[allow(dead_code)]
16 client: P,
17 name: String,
19 mempool_tx: Option<broadcast::Sender<MessageMempoolDataUpdate<EthPrimitives>>>,
21}
22
23impl<P> MempoolProcessingComponent<P>
24where
25 P: Provider<Ethereum> + Send + Sync + Clone + 'static,
26{
27 pub fn new(client: P, name: String) -> Self {
28 Self { client, name, mempool_tx: None }
29 }
30
31 pub fn with_mempool_channel(mut self, mempool_tx: broadcast::Sender<MessageMempoolDataUpdate<EthPrimitives>>) -> Self {
32 self.mempool_tx = Some(mempool_tx);
33 self
34 }
35
36 async fn run(self) -> Result<()> {
37 info!("Starting mempool processing component: {}", self.name);
38
39 if self.mempool_tx.is_some() {
44 info!("Mempool processing component {} is running (simplified)", self.name);
45
46 loop {
49 tokio::time::sleep(tokio::time::Duration::from_secs(30)).await;
50 info!("Mempool processing component {} heartbeat", self.name);
51 }
52 } else {
53 info!("No mempool channel configured for {}", self.name);
54 }
55
56 Ok(())
57 }
58}
59
60impl<P> Component for MempoolProcessingComponent<P>
61where
62 P: Provider<Ethereum> + Send + Sync + Clone + 'static,
63{
64 fn spawn(self, executor: TaskExecutor) -> Result<()> {
65 executor.spawn_critical(self.name(), async move {
66 if let Err(e) = self.run().await {
67 error!("Mempool processing component failed: {}", e);
68 }
69 });
70 Ok(())
71 }
72 fn name(&self) -> &'static str {
73 "MempoolProcessingComponent"
74 }
75}
76
77pub struct MempoolProcessingComponentBuilder {
79 name: String,
80}
81
82impl MempoolProcessingComponentBuilder {
83 pub fn new(name: String) -> Self {
84 Self { name }
85 }
86
87 pub fn build<P>(self, client: P) -> MempoolProcessingComponent<P>
88 where
89 P: Provider<Ethereum> + Send + Sync + Clone + 'static,
90 {
91 MempoolProcessingComponent::new(client, self.name)
92 }
93}
94
95impl Default for MempoolProcessingComponentBuilder {
96 fn default() -> Self {
97 Self::new("mempool".to_string())
98 }
99}