#![forbid(unsafe_code)]
use aptos_config::network_id::PeerNetworkId;
use network::application::types::PeerInfo;
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, convert::TryFrom};
use thiserror::Error;
pub type Result<T, E = PeerMonitoringServiceError> = ::std::result::Result<T, E>;
#[derive(Clone, Debug, Deserialize, Eq, Error, PartialEq, Serialize)]
pub enum PeerMonitoringServiceError {
#[error("Internal service error: {0}")]
InternalError(String),
#[error("Invalid service request: {0}")]
InvalidRequest(String),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[allow(clippy::large_enum_variant)]
pub enum PeerMonitoringServiceMessage {
Request(PeerMonitoringServiceRequest),
Response(Result<PeerMonitoringServiceResponse>),
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub enum PeerMonitoringServiceRequest {
GetConnectedPeers, GetDepthFromValidators, GetKnownPeers, GetServerProtocolVersion, GetValidatorsAndVFNs, Ping, }
impl PeerMonitoringServiceRequest {
pub fn get_label(&self) -> &'static str {
match self {
Self::GetConnectedPeers => "get_connected_peers",
Self::GetDepthFromValidators => "get_depth_from_validators",
Self::GetKnownPeers => "get_known_peers",
Self::GetServerProtocolVersion => "get_server_protocol_version",
Self::GetValidatorsAndVFNs => "get_validators_and_vfns",
Self::Ping => "ping",
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[allow(clippy::large_enum_variant)]
pub enum PeerMonitoringServiceResponse {
ConnectedPeers(ConnectedPeersResponse), DepthFromValidators(DepthFromValidatorsResponse), KnownPeers(KnownPeersResponse), Ping(PingResponse), ServerProtocolVersion(ServerProtocolVersionResponse), ValidatorsAndVFNs(ValidatorsAndVFNsResponse), }
impl PeerMonitoringServiceResponse {
pub fn get_label(&self) -> &'static str {
match self {
Self::ConnectedPeers(_) => "connected_peers",
Self::DepthFromValidators(_) => "depth_from_validators",
Self::KnownPeers(_) => "known_peers",
Self::Ping(_) => "ping",
Self::ServerProtocolVersion(_) => "server_protocol_version",
Self::ValidatorsAndVFNs(_) => "validators_and_vfns",
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ConnectedPeersResponse {
pub connected_peers: HashMap<PeerNetworkId, PeerInfo>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DepthFromValidatorsResponse {
pub todo: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct KnownPeersResponse {
pub todo: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct PingResponse {
pub todo: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ServerProtocolVersionResponse {
pub version: u64,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ValidatorsAndVFNsResponse {
pub todo: bool,
}
#[derive(Clone, Debug, Error)]
#[error("Unexpected response variant: {0}")]
pub struct UnexpectedResponseError(pub String);
impl TryFrom<PeerMonitoringServiceResponse> for ConnectedPeersResponse {
type Error = UnexpectedResponseError;
fn try_from(response: PeerMonitoringServiceResponse) -> Result<Self, Self::Error> {
match response {
PeerMonitoringServiceResponse::ConnectedPeers(inner) => Ok(inner),
_ => Err(UnexpectedResponseError(format!(
"expected connected_peers_response, found {}",
response.get_label()
))),
}
}
}
impl TryFrom<PeerMonitoringServiceResponse> for DepthFromValidatorsResponse {
type Error = UnexpectedResponseError;
fn try_from(response: PeerMonitoringServiceResponse) -> Result<Self, Self::Error> {
match response {
PeerMonitoringServiceResponse::DepthFromValidators(inner) => Ok(inner),
_ => Err(UnexpectedResponseError(format!(
"expected depth_from_validators_response, found {}",
response.get_label()
))),
}
}
}
impl TryFrom<PeerMonitoringServiceResponse> for KnownPeersResponse {
type Error = UnexpectedResponseError;
fn try_from(response: PeerMonitoringServiceResponse) -> Result<Self, Self::Error> {
match response {
PeerMonitoringServiceResponse::KnownPeers(inner) => Ok(inner),
_ => Err(UnexpectedResponseError(format!(
"expected known_peers_response, found {}",
response.get_label()
))),
}
}
}
impl TryFrom<PeerMonitoringServiceResponse> for PingResponse {
type Error = UnexpectedResponseError;
fn try_from(response: PeerMonitoringServiceResponse) -> Result<Self, Self::Error> {
match response {
PeerMonitoringServiceResponse::Ping(inner) => Ok(inner),
_ => Err(UnexpectedResponseError(format!(
"expected ping_response, found {}",
response.get_label()
))),
}
}
}
impl TryFrom<PeerMonitoringServiceResponse> for ServerProtocolVersionResponse {
type Error = UnexpectedResponseError;
fn try_from(response: PeerMonitoringServiceResponse) -> Result<Self, Self::Error> {
match response {
PeerMonitoringServiceResponse::ServerProtocolVersion(inner) => Ok(inner),
_ => Err(UnexpectedResponseError(format!(
"expected server_protocol_version_response, found {}",
response.get_label()
))),
}
}
}
impl TryFrom<PeerMonitoringServiceResponse> for ValidatorsAndVFNsResponse {
type Error = UnexpectedResponseError;
fn try_from(response: PeerMonitoringServiceResponse) -> Result<Self, Self::Error> {
match response {
PeerMonitoringServiceResponse::ValidatorsAndVFNs(inner) => Ok(inner),
_ => Err(UnexpectedResponseError(format!(
"expected validators_and_vfns_response, found {}",
response.get_label()
))),
}
}
}