use crate::authenticated::discovery::{
metrics,
types::{self, InfoVerifier},
};
use commonware_codec::Error as CodecError;
use commonware_cryptography::PublicKey;
use prometheus_client::metrics::{counter::Counter, family::Family};
use std::{num::NonZeroUsize, time::Duration};
use thiserror::Error;
mod actor;
pub use actor::Actor;
mod ingress;
pub use ingress::Message;
pub struct Config<C: PublicKey> {
pub mailbox_size: usize,
pub send_batch_size: NonZeroUsize,
pub gossip_bit_vec_frequency: Duration,
pub max_peer_set_size: u64,
pub peer_gossip_max_count: usize,
pub info_verifier: InfoVerifier<C>,
pub sent_messages: Family<metrics::Message, Counter>,
pub received_messages: Family<metrics::Message, Counter>,
pub dropped_messages: Family<metrics::Message, Counter>,
pub rate_limited: Family<metrics::Message, Counter>,
}
#[derive(Error, Debug)]
pub enum Error {
#[error("peer killed: {0}")]
PeerKilled(String),
#[error("send failed: {0}")]
SendFailed(commonware_stream::encrypted::Error),
#[error("peer disconnected")]
PeerDisconnected,
#[error("receive failed: {0}")]
ReceiveFailed(commonware_stream::encrypted::Error),
#[error("decode failed: {0}")]
DecodeFailed(CodecError),
#[error("unexpected failure: {0}")]
UnexpectedFailure(commonware_runtime::Error),
#[error("invalid channel")]
InvalidChannel,
#[error("types: {0}")]
Types(types::Error),
#[error("missing greeting")]
MissingGreeting,
#[error("duplicate greeting")]
DuplicateGreeting,
#[error("greeting public key mismatch")]
GreetingMismatch,
}