hopr_transport_protocol/ack/
processor.rs1use tracing::trace;
2
3use hopr_crypto_types::prelude::*;
4pub use hopr_db_api::protocol::AckResult;
5use hopr_db_api::protocol::HoprDbProtocolOperations;
6use hopr_internal_types::prelude::*;
7use hopr_transport_identity::PeerId;
8
9use crate::errors::{ProtocolError, Result};
10
11#[derive(Clone)]
13pub struct AcknowledgementProcessor<Db: HoprDbProtocolOperations> {
14 db: Db,
15 chain_key: ChainKeypair,
16}
17
18impl<Db: HoprDbProtocolOperations> AcknowledgementProcessor<Db> {
19 pub fn new(db: Db, chain_key: &ChainKeypair) -> Self {
20 Self {
21 db,
22 chain_key: chain_key.clone(),
23 }
24 }
25
26 #[inline]
28 #[tracing::instrument(level = "debug", skip(self, ack))]
29 pub async fn send(&self, peer: &PeerId, ack: Acknowledgement) -> Acknowledgement {
30 ack
31 }
32
33 #[tracing::instrument(level = "debug", skip(self, ack))]
35 pub async fn recv(&self, peer: &PeerId, mut ack: Acknowledgement) -> Result<AckResult> {
36 let remote_pk = OffchainPublicKey::try_from(peer)?;
37 if !ack.validate(&remote_pk) {
38 tracing::error!("Failed to verify signature on received acknowledgement");
39 return Err(ProtocolError::InvalidSignature);
40 };
41
42 self.db.handle_acknowledgement(ack, &self.chain_key).await.map_err(|e| {
43 trace!(error = %e, "Failed to process a received acknowledgement");
44 let error: ProtocolError = e.into();
45 error
46 })
47 }
48}