espresso_node/api/
update.rs

1//! Update loop for query API state.
2
3use std::{fmt::Debug, sync::Arc};
4
5use anyhow::bail;
6use async_trait::async_trait;
7use derivative::Derivative;
8use derive_more::From;
9use espresso_types::{PubKey, v0::traits::SequencerPersistence};
10use hotshot::types::Event;
11use hotshot_query_service::data_source::UpdateDataSource;
12use hotshot_types::traits::network::ConnectedNetwork;
13
14use super::{StorageState, data_source::SequencerDataSource};
15use crate::{EventConsumer, SeqTypes};
16
17#[derive(Derivative, From)]
18#[derivative(Clone(bound = ""), Debug(bound = "D: Debug"))]
19pub(crate) struct ApiEventConsumer<N, P, D>
20where
21    N: ConnectedNetwork<PubKey>,
22    P: SequencerPersistence,
23{
24    inner: Arc<StorageState<N, P, D>>,
25}
26
27#[async_trait]
28impl<N, P, D> EventConsumer for ApiEventConsumer<N, P, D>
29where
30    N: ConnectedNetwork<PubKey>,
31    P: SequencerPersistence,
32    D: SequencerDataSource + Debug + Send + Sync + 'static,
33{
34    async fn handle_event(&self, event: &Event<SeqTypes>) -> anyhow::Result<()> {
35        if let Err(height) = self.inner.update(event).await {
36            bail!("failed to update API state after {height}: {event:?}",);
37        }
38        Ok(())
39    }
40}