use crate::{
simplex::{
metrics::TimeoutReason,
types::{Proposal, Vote},
},
types::{Participant, View},
};
use commonware_cryptography::{certificate::Scheme, Digest};
use commonware_utils::channel::{fallible::AsyncFallibleExt, mpsc, oneshot};
pub enum Message<S: Scheme, D: Digest> {
Update {
current: View,
leader: Participant,
finalized: View,
forwardable_proposal: Option<Proposal<D>>,
response: oneshot::Sender<Option<TimeoutReason>>,
},
Constructed(Vote<S, D>),
}
#[derive(Clone)]
pub struct Mailbox<S: Scheme, D: Digest> {
sender: mpsc::Sender<Message<S, D>>,
}
impl<S: Scheme, D: Digest> Mailbox<S, D> {
pub const fn new(sender: mpsc::Sender<Message<S, D>>) -> Self {
Self { sender }
}
pub async fn update(
&mut self,
current: View,
leader: Participant,
finalized: View,
forwardable_proposal: Option<Proposal<D>>,
) -> Option<TimeoutReason> {
self.sender
.request_or(
|response| Message::Update {
current,
leader,
finalized,
forwardable_proposal,
response,
},
None,
)
.await
}
pub async fn constructed(&mut self, message: Vote<S, D>) {
self.sender.send_lossy(Message::Constructed(message)).await;
}
}