use std::time::Duration;
use serde_derive::{Deserialize, Serialize};
use crate::transport::encoding::{
Configurable, TransportDecoder, TransportEncoder,
};
pub use crate::transport::encoding::{
TransportDecoderConfig, TransportEncoderConfig,
};
pub const BUCKET_DEFAULT_NODE_TTL_MILLIS: u64 = 30000;
pub const BUCKET_DEFAULT_NODE_EVICT_AFTER_MILLIS: u64 = 5000;
pub const BUCKET_DEFAULT_TTL_SECS: u64 = 60 * 60;
pub const ENABLE_BROADCAST_PROPAGATION: bool = true;
pub const DEFAULT_CHANNEL_SIZE: usize = 1000;
pub const DEFAULT_SEND_RETRY_COUNT: u8 = 3;
pub const DEFAULT_SEND_RETRY_SLEEP_MILLIS: u64 = 5;
pub const DEFAULT_BLOCKLIST_REFRESH_SECS: u64 = 10;
pub const DEFAULT_MIN_PEERS_FOR_INTEGRATION: usize = 3;
const DEFAULT_VERSION: &str = "0.0.1";
const DEFAULT_VERSION_MATCH: &str = "*";
const fn default_min_peers() -> usize {
DEFAULT_MIN_PEERS_FOR_INTEGRATION
}
fn default_version() -> String {
DEFAULT_VERSION.to_string()
}
fn default_version_match() -> String {
DEFAULT_VERSION_MATCH.to_string()
}
#[derive(Clone, Serialize, Deserialize)]
pub struct Config {
pub kadcast_id: Option<u8>,
pub public_address: String,
pub listen_address: Option<String>,
pub bootstrapping_nodes: Vec<String>,
pub auto_propagate: bool,
pub channel_size: usize,
pub recursive_discovery: bool,
pub bucket: BucketConfig,
pub network: NetworkConfig,
pub fec: FECConfig,
#[serde(default = "default_version")]
pub version: String,
#[serde(default = "default_version_match")]
pub version_match: String,
}
impl Default for Config {
fn default() -> Self {
Self {
public_address: "127.0.0.1:9000".to_string(),
kadcast_id: None,
listen_address: None,
bootstrapping_nodes: vec![],
auto_propagate: ENABLE_BROADCAST_PROPAGATION,
channel_size: DEFAULT_CHANNEL_SIZE,
recursive_discovery: true,
network: NetworkConfig::default(),
bucket: BucketConfig::default(),
fec: FECConfig::default(),
version: default_version(),
version_match: default_version_match(),
}
}
}
#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
pub struct BucketConfig {
#[serde(with = "humantime_serde")]
pub node_ttl: Duration,
#[serde(with = "humantime_serde")]
pub node_evict_after: Duration,
#[serde(with = "humantime_serde")]
pub bucket_ttl: Duration,
#[serde(default = "default_min_peers")]
pub min_peers: usize,
}
impl Default for BucketConfig {
fn default() -> Self {
Self {
node_evict_after: Duration::from_millis(
BUCKET_DEFAULT_NODE_EVICT_AFTER_MILLIS,
),
node_ttl: Duration::from_millis(BUCKET_DEFAULT_NODE_TTL_MILLIS),
bucket_ttl: Duration::from_secs(BUCKET_DEFAULT_TTL_SECS),
min_peers: default_min_peers(),
}
}
}
#[derive(Serialize, Deserialize, Clone, Copy)]
pub struct FECConfig {
pub encoder: TransportEncoderConfig,
pub decoder: TransportDecoderConfig,
}
#[derive(Serialize, Deserialize, Clone, Copy)]
pub struct NetworkConfig {
pub udp_recv_buffer_size: Option<usize>,
#[serde(default)]
#[serde(with = "humantime_serde")]
pub udp_send_backoff_timeout: Option<Duration>,
#[serde(with = "humantime_serde")]
pub udp_send_retry_interval: Duration,
pub udp_send_retry_count: u8,
#[serde(with = "humantime_serde")]
pub blocklist_refresh_interval: Duration,
}
impl Default for FECConfig {
fn default() -> Self {
Self {
encoder: TransportEncoder::default_configuration(),
decoder: TransportDecoder::default_configuration(),
}
}
}
impl Default for NetworkConfig {
fn default() -> Self {
Self {
udp_recv_buffer_size: Some(5000000),
udp_send_backoff_timeout: None,
udp_send_retry_interval: Duration::from_millis(
DEFAULT_SEND_RETRY_SLEEP_MILLIS,
),
udp_send_retry_count: DEFAULT_SEND_RETRY_COUNT,
blocklist_refresh_interval: Duration::from_secs(
DEFAULT_BLOCKLIST_REFRESH_SECS,
),
}
}
}