commonware_p2p/utils/
codec.rs

1//! Codec wrapper for [Sender] and [Receiver].
2
3use crate::{Receiver, Recipients, Sender};
4use bytes::Bytes;
5use commonware_codec::{Codec, Error};
6
7/// Wrap a [Sender] and [Receiver] with some [Codec].
8pub fn wrap<S: Sender, R: Receiver, V: Codec>(
9    config: V::Cfg,
10    sender: S,
11    receiver: R,
12) -> (WrappedSender<S, V>, WrappedReceiver<R, V>) {
13    (
14        WrappedSender::new(sender),
15        WrappedReceiver::new(config, receiver),
16    )
17}
18
19/// Tuple representing a message received from a given public key.
20pub type WrappedMessage<P, V> = (P, Result<V, Error>);
21
22/// Wrapper around a [Sender] that encodes messages using a [Codec].
23pub struct WrappedSender<S: Sender, V: Codec> {
24    sender: S,
25
26    _phantom_v: std::marker::PhantomData<V>,
27}
28
29impl<S: Sender, V: Codec> WrappedSender<S, V> {
30    /// Create a new [WrappedSender] with the given [Sender].
31    pub fn new(sender: S) -> Self {
32        Self {
33            sender,
34            _phantom_v: std::marker::PhantomData,
35        }
36    }
37
38    /// Send a message to a set of recipients.
39    pub async fn send(
40        &mut self,
41        recipients: Recipients<S::PublicKey>,
42        message: V,
43        priority: bool,
44    ) -> Result<Vec<S::PublicKey>, S::Error> {
45        let encoded = message.encode();
46        self.sender
47            .send(recipients, Bytes::from(encoded), priority)
48            .await
49    }
50}
51
52/// Wrapper around a [Receiver] that decodes messages using a [Codec].
53pub struct WrappedReceiver<R: Receiver, V: Codec> {
54    config: V::Cfg,
55    receiver: R,
56
57    _phantom_v: std::marker::PhantomData<V>,
58}
59
60impl<R: Receiver, V: Codec> WrappedReceiver<R, V> {
61    /// Create a new [WrappedReceiver] with the given [Receiver].
62    pub fn new(config: V::Cfg, receiver: R) -> Self {
63        Self {
64            config,
65            receiver,
66            _phantom_v: std::marker::PhantomData,
67        }
68    }
69
70    /// Receive a message from an arbitrary recipient.
71    pub async fn recv(&mut self) -> Result<WrappedMessage<R::PublicKey, V>, R::Error> {
72        let (pk, bytes) = self.receiver.recv().await?;
73        let decoded = match V::decode_cfg(bytes.as_ref(), &self.config) {
74            Ok(decoded) => decoded,
75            Err(e) => {
76                return Ok((pk, Err(e)));
77            }
78        };
79        Ok((pk, Ok(decoded)))
80    }
81}