use crate::mixnet::{AnonymousSenderTag, IncludedSurbs, Recipient};
use crate::Result;
use async_trait::async_trait;
use nym_client_core::client::inbound_messages::InputMessage;
use nym_sphinx::params::PacketType;
use nym_task::connections::TransmissionLane;
#[async_trait]
pub trait MixnetMessageSender {
fn packet_type(&self) -> Option<PacketType> {
None
}
async fn send(&self, message: InputMessage) -> Result<()>;
async fn send_plain_message<M>(&self, address: Recipient, message: M) -> Result<()>
where
M: AsRef<[u8]> + Send,
{
self.send_message(address, message, IncludedSurbs::default())
.await
}
async fn send_message<M>(
&self,
address: Recipient,
message: M,
surbs: IncludedSurbs,
) -> Result<()>
where
M: AsRef<[u8]> + Send,
{
let lane = TransmissionLane::General;
let input_msg = match surbs {
IncludedSurbs::Amount(surbs) => InputMessage::new_anonymous(
address,
message.as_ref().to_vec(),
surbs,
lane,
self.packet_type(),
),
IncludedSurbs::ExposeSelfAddress => InputMessage::new_regular(
address,
message.as_ref().to_vec(),
lane,
self.packet_type(),
),
};
self.send(input_msg).await
}
async fn send_reply<M>(&self, recipient_tag: AnonymousSenderTag, message: M) -> Result<()>
where
M: AsRef<[u8]> + Send,
{
let lane = TransmissionLane::General;
let input_msg = InputMessage::new_reply(
recipient_tag,
message.as_ref().to_vec(),
lane,
self.packet_type(),
);
self.send(input_msg).await
}
}