use crate::{
protocols::{
direct_send::Message,
rpc::{error::RpcError, OutboundRpcRequest},
},
ProtocolId,
};
use aptos_types::{network_address::NetworkAddress, PeerId};
use bytes::Bytes;
use channel::{self, aptos_channel};
use futures::channel::oneshot;
use std::time::Duration;
use crate::peer_manager::{types::PeerManagerRequest, ConnectionRequest, PeerManagerError};
#[derive(Clone, Debug)]
pub struct PeerManagerRequestSender {
inner: aptos_channel::Sender<(PeerId, ProtocolId), PeerManagerRequest>,
}
#[derive(Clone, Debug)]
pub struct ConnectionRequestSender {
inner: aptos_channel::Sender<PeerId, ConnectionRequest>,
}
impl PeerManagerRequestSender {
pub fn new(inner: aptos_channel::Sender<(PeerId, ProtocolId), PeerManagerRequest>) -> Self {
Self { inner }
}
pub fn send_to(
&self,
peer_id: PeerId,
protocol_id: ProtocolId,
mdata: Bytes,
) -> Result<(), PeerManagerError> {
self.inner.push(
(peer_id, protocol_id),
PeerManagerRequest::SendDirectSend(peer_id, Message { protocol_id, mdata }),
)?;
Ok(())
}
pub fn send_to_many(
&self,
recipients: impl Iterator<Item = PeerId>,
protocol_id: ProtocolId,
mdata: Bytes,
) -> Result<(), PeerManagerError> {
let msg = Message { protocol_id, mdata };
for recipient in recipients {
self.inner.push(
(recipient, protocol_id),
PeerManagerRequest::SendDirectSend(recipient, msg.clone()),
)?;
}
Ok(())
}
pub async fn send_rpc(
&self,
peer_id: PeerId,
protocol_id: ProtocolId,
req: Bytes,
timeout: Duration,
) -> Result<Bytes, RpcError> {
let (res_tx, res_rx) = oneshot::channel();
let request = OutboundRpcRequest {
protocol_id,
data: req,
res_tx,
timeout,
};
self.inner.push(
(peer_id, protocol_id),
PeerManagerRequest::SendRpc(peer_id, request),
)?;
res_rx.await?
}
}
impl ConnectionRequestSender {
pub fn new(inner: aptos_channel::Sender<PeerId, ConnectionRequest>) -> Self {
Self { inner }
}
pub async fn dial_peer(
&self,
peer: PeerId,
addr: NetworkAddress,
) -> Result<(), PeerManagerError> {
let (oneshot_tx, oneshot_rx) = oneshot::channel();
self.inner
.push(peer, ConnectionRequest::DialPeer(peer, addr, oneshot_tx))?;
oneshot_rx.await?
}
pub async fn disconnect_peer(&self, peer: PeerId) -> Result<(), PeerManagerError> {
let (oneshot_tx, oneshot_rx) = oneshot::channel();
self.inner
.push(peer, ConnectionRequest::DisconnectPeer(peer, oneshot_tx))?;
oneshot_rx.await?
}
}