use std::net::SocketAddrV4;
#[cfg(all(not(wasm_browser), feature = "portmapper"))]
pub use ::portmapper::Metrics;
#[cfg(not(all(not(wasm_browser), feature = "portmapper")))]
pub use stub::Metrics;
use tokio::sync::watch;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum PortmapperConfig {
#[non_exhaustive]
Enabled {},
Disabled,
}
impl Default for PortmapperConfig {
fn default() -> Self {
PortmapperConfig::Enabled {}
}
}
pub(crate) fn create_client(
metrics: &crate::metrics::EndpointMetrics,
config: &PortmapperConfig,
) -> Client {
match config {
#[cfg(all(not(wasm_browser), feature = "portmapper"))]
PortmapperConfig::Enabled {} => Client::Enabled(::portmapper::Client::with_metrics(
Default::default(),
metrics.portmapper.clone(),
)),
_ => {
let _ = metrics;
let (tx, rx) = watch::channel(None);
Client::Disabled { _tx: tx, rx }
}
}
}
#[derive(Debug)]
pub(crate) enum Client {
#[cfg(all(not(wasm_browser), feature = "portmapper"))]
Enabled(::portmapper::Client),
Disabled {
_tx: watch::Sender<Option<SocketAddrV4>>,
rx: watch::Receiver<Option<SocketAddrV4>>,
},
}
impl Client {
pub(crate) fn procure_mapping(&self) {
match self {
#[cfg(all(not(wasm_browser), feature = "portmapper"))]
Client::Enabled(c) => c.procure_mapping(),
Client::Disabled { .. } => {}
}
}
pub(crate) fn update_local_port(&self, _port: std::num::NonZeroU16) {
match self {
#[cfg(all(not(wasm_browser), feature = "portmapper"))]
Client::Enabled(c) => c.update_local_port(_port),
Client::Disabled { .. } => {}
}
}
pub(crate) fn deactivate(&self) {
match self {
#[cfg(all(not(wasm_browser), feature = "portmapper"))]
Client::Enabled(c) => c.deactivate(),
Client::Disabled { .. } => {}
}
}
pub(crate) fn watch_external_address(&self) -> watch::Receiver<Option<SocketAddrV4>> {
match self {
#[cfg(all(not(wasm_browser), feature = "portmapper"))]
Client::Enabled(c) => c.watch_external_address(),
Client::Disabled { rx, .. } => rx.clone(),
}
}
}
#[allow(dead_code)]
mod stub {
use iroh_metrics::{Counter, MetricsGroup};
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, MetricsGroup, Serialize, Deserialize)]
#[metrics(name = "portmap")]
pub struct Metrics {
pub probes_started: Counter,
pub local_port_updates: Counter,
pub mapping_attempts: Counter,
pub mapping_failures: Counter,
pub external_address_updated: Counter,
pub upnp_probes: Counter,
pub upnp_probes_failed: Counter,
pub upnp_available: Counter,
pub upnp_gateway_updated: Counter,
pub pcp_probes: Counter,
pub pcp_available: Counter,
}
}