use derive_builder::Builder;
use http::Uri;
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, DurationMilliSeconds, DurationSeconds};
use std::time::Duration;
#[serde_as]
#[derive(Builder, Clone, Debug, Serialize, Deserialize, PartialEq)]
#[builder(default)]
#[serde(default)]
pub struct Libp2p {
#[serde_as(as = "Vec<serde_with::DisplayFromStr>")]
pub(crate) announce_addresses: Vec<libp2p::Multiaddr>,
pub(crate) dht: Dht,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) idle_connection_timeout: Duration,
#[serde(with = "http_serde::uri")]
pub(crate) listen_address: Uri,
pub(crate) max_connected_peers: u32,
pub(crate) max_announce_addresses: u32,
#[serde_as(as = "Vec<serde_with::DisplayFromStr>")]
pub(crate) node_addresses: Vec<libp2p::Multiaddr>,
pub(crate) quic: Quic,
pub(crate) mdns: Mdns,
pub(crate) pubsub: Pubsub,
pub(crate) rendezvous: Rendezvous,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) transport_connection_timeout: Duration,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) dial_interval: Duration,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) bootstrap_interval: Duration,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub(crate) struct Quic {
pub(crate) enable: bool,
}
#[serde_as]
#[derive(Builder, Clone, Debug, Serialize, Deserialize, PartialEq)]
#[builder(default)]
#[serde(default)]
pub struct Dht {
pub(crate) enable_resolve_receipts_in_background: bool,
#[serde_as(as = "DurationMilliSeconds<u64>")]
pub(crate) p2p_receipt_timeout: Duration,
#[serde_as(as = "DurationMilliSeconds<u64>")]
pub(crate) p2p_workflow_info_timeout: Duration,
#[serde_as(as = "DurationMilliSeconds<u64>")]
pub(crate) p2p_provider_timeout: Duration,
pub(crate) receipt_quorum: usize,
pub(crate) workflow_quorum: usize,
}
#[serde_as]
#[derive(Builder, Clone, Debug, Serialize, Deserialize, PartialEq)]
#[builder(default)]
#[serde(default)]
pub struct Mdns {
pub(crate) enable: bool,
pub(crate) enable_ipv6: bool,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) query_interval: Duration,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) ttl: Duration,
}
#[serde_as]
#[derive(Builder, Clone, Debug, Serialize, Deserialize, PartialEq)]
#[builder(default)]
#[serde(default)]
pub struct Pubsub {
pub(crate) enable: bool,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) duplication_cache_time: Duration,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) heartbeat: Duration,
pub(crate) max_transmit_size: usize,
pub(crate) mesh_n_low: usize,
pub(crate) mesh_n_high: usize,
pub(crate) mesh_n: usize,
pub(crate) mesh_outbound_min: usize,
}
#[serde_as]
#[derive(Builder, Clone, Debug, Serialize, Deserialize, PartialEq)]
#[builder(default)]
#[serde(default)]
pub struct Rendezvous {
pub(crate) enable_client: bool,
pub(crate) enable_server: bool,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) registration_ttl: Duration,
#[serde_as(as = "DurationSeconds<u64>")]
pub(crate) discovery_interval: Duration,
}
impl Default for Libp2p {
fn default() -> Self {
Self {
announce_addresses: Vec::new(),
dht: Dht::default(),
idle_connection_timeout: Duration::new(60, 0),
listen_address: Uri::from_static("/ip4/0.0.0.0/tcp/0"),
max_connected_peers: 32,
max_announce_addresses: 10,
quic: Quic::default(),
mdns: Mdns::default(),
node_addresses: Vec::new(),
pubsub: Pubsub::default(),
rendezvous: Rendezvous::default(),
transport_connection_timeout: Duration::new(60, 0),
dial_interval: Duration::new(30, 0),
bootstrap_interval: Duration::new(30, 0),
}
}
}
impl Libp2p {
pub(crate) fn dht(&self) -> &Dht {
&self.dht
}
pub(crate) fn pubsub(&self) -> &Pubsub {
&self.pubsub
}
}
impl Default for Dht {
fn default() -> Self {
Self {
enable_resolve_receipts_in_background: true,
p2p_receipt_timeout: Duration::from_millis(500),
p2p_workflow_info_timeout: Duration::from_millis(500),
p2p_provider_timeout: Duration::from_millis(10000),
receipt_quorum: 2,
workflow_quorum: 3,
}
}
}
impl Default for Quic {
fn default() -> Self {
Self { enable: true }
}
}
impl Default for Mdns {
fn default() -> Self {
Self {
enable: true,
enable_ipv6: false,
query_interval: Duration::from_secs(5 * 60),
ttl: Duration::from_secs(60 * 9),
}
}
}
impl Default for Pubsub {
fn default() -> Self {
Self {
enable: true,
duplication_cache_time: Duration::new(1, 0),
heartbeat: Duration::new(60, 0),
max_transmit_size: 10 * 1024 * 1024,
mesh_n_low: 1,
mesh_n_high: 10,
mesh_n: 2,
mesh_outbound_min: 1,
}
}
}
impl Default for Rendezvous {
fn default() -> Self {
Self {
enable_client: true,
enable_server: false,
registration_ttl: Duration::from_secs(2 * 60 * 60),
discovery_interval: Duration::from_secs(10 * 60),
}
}
}