commonware_p2p/utils/
codec.rs1use crate::{Receiver, Recipients, Sender};
4use bytes::Bytes;
5use commonware_codec::{Codec, Error};
6
7pub 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
19pub type WrappedMessage<P, V> = (P, Result<V, Error>);
21
22pub 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 pub fn new(sender: S) -> Self {
32 Self {
33 sender,
34 _phantom_v: std::marker::PhantomData,
35 }
36 }
37
38 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
52pub 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 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 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}