commonware_broadcast/linked/signer/
ingress.rs

1use crate::Broadcaster;
2use commonware_utils::Array;
3use futures::{
4    channel::{mpsc, oneshot},
5    SinkExt,
6};
7use std::marker::PhantomData;
8
9/// Message types that can be sent to the `Mailbox`
10pub enum Message<D: Array> {
11    Broadcast {
12        payload: D,
13        result: oneshot::Sender<bool>,
14    },
15}
16
17/// Ingress mailbox for the `Actor`.
18#[derive(Clone)]
19pub struct Mailbox<D: Array> {
20    sender: mpsc::Sender<Message<D>>,
21    _digest: PhantomData<D>,
22}
23
24impl<D: Array> Mailbox<D> {
25    pub(super) fn new(sender: mpsc::Sender<Message<D>>) -> Self {
26        Self {
27            sender,
28            _digest: PhantomData,
29        }
30    }
31}
32
33impl<D: Array> Broadcaster for Mailbox<D> {
34    type Digest = D;
35
36    async fn broadcast(&mut self, payload: Self::Digest) -> oneshot::Receiver<bool> {
37        let (sender, receiver) = oneshot::channel();
38        let _ = self
39            .sender
40            .send(Message::Broadcast {
41                payload,
42                result: sender,
43            })
44            .await;
45        receiver
46    }
47}