Skip to content

Commit 25a8cd7

Browse files
authored
Merge 793a586 into a62a2bd
2 parents a62a2bd + 793a586 commit 25a8cd7

File tree

7 files changed

+77
-65
lines changed

7 files changed

+77
-65
lines changed

iroh-relay/src/relay_map.rs

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
33
use std::{collections::BTreeMap, fmt, sync::Arc};
44

5-
use anyhow::{ensure, Result};
65
use iroh_base::RelayUrl;
76
use serde::{Deserialize, Serialize};
87

@@ -52,50 +51,53 @@ impl RelayMap {
5251
pub fn is_empty(&self) -> bool {
5352
self.nodes.is_empty()
5453
}
54+
}
5555

56-
/// Creates a new [`RelayMap`] with a single relay server configured.
57-
///
58-
/// Allows to set a custom STUN port and different IP addresses for IPv4 and IPv6.
59-
/// If IP addresses are provided, no DNS lookup will be performed.
60-
///
61-
/// Sets the port to the default [`DEFAULT_RELAY_QUIC_PORT`].
62-
pub fn default_from_node(url: RelayUrl, stun_port: u16) -> Self {
63-
let mut nodes = BTreeMap::new();
64-
nodes.insert(
65-
url.clone(),
66-
RelayNode {
67-
url,
68-
stun_only: false,
69-
stun_port,
70-
quic: Some(RelayQuicConfig::default()),
71-
}
72-
.into(),
73-
);
74-
75-
RelayMap {
76-
nodes: Arc::new(nodes),
56+
impl FromIterator<RelayNode> for RelayMap {
57+
fn from_iter<T: IntoIterator<Item = RelayNode>>(iter: T) -> Self {
58+
Self {
59+
nodes: Arc::new(
60+
iter.into_iter()
61+
.map(|node| (node.url.clone(), Arc::new(node)))
62+
.collect(),
63+
),
7764
}
7865
}
66+
}
7967

80-
/// Returns a [`RelayMap`] from a [`RelayUrl`].
68+
impl From<RelayUrl> for RelayMap {
69+
/// Creates a [`RelayMap`] from a [`RelayUrl`].
8170
///
82-
/// This will use the default STUN port, the default QUIC port
83-
/// (as defined by the `iroh-relay` crate) and IP addresses
84-
/// resolved from the URL's host name via DNS.
85-
/// relay nodes are specified at <../../docs/relay_nodes.md>
86-
pub fn from_url(url: RelayUrl) -> Self {
87-
Self::default_from_node(url, DEFAULT_STUN_PORT)
71+
/// The [`RelayNode`]s in the [`RelayMap`] will have the default STUN and QUIC address
72+
/// discovery ports.
73+
fn from(value: RelayUrl) -> Self {
74+
Self {
75+
nodes: Arc::new([(value.clone(), Arc::new(value.into()))].into()),
76+
}
77+
}
78+
}
79+
80+
impl From<RelayNode> for RelayMap {
81+
fn from(value: RelayNode) -> Self {
82+
Self {
83+
nodes: Arc::new([(value.url.clone(), Arc::new(value))].into()),
84+
}
8885
}
86+
}
8987

90-
/// Constructs the [`RelayMap`] from an iterator of [`RelayNode`]s.
91-
pub fn from_nodes<I: Into<Arc<RelayNode>>>(value: impl IntoIterator<Item = I>) -> Result<Self> {
92-
let mut map = BTreeMap::new();
93-
for node in value.into_iter() {
94-
let node = node.into();
95-
ensure!(!map.contains_key(&node.url), "Duplicate node url");
96-
map.insert(node.url.clone(), node);
88+
impl FromIterator<RelayUrl> for RelayMap {
89+
/// Creates a [`RelayMap`] from an iterator of [`RelayUrl`].
90+
///
91+
/// The [`RelayNode`]s in the [`RelayMap`] will have the default STUN and QUIC address
92+
/// discovery ports.
93+
fn from_iter<T: IntoIterator<Item = RelayUrl>>(iter: T) -> Self {
94+
Self {
95+
nodes: Arc::new(
96+
iter.into_iter()
97+
.map(|url| (url.clone(), Arc::new(url.into())))
98+
.collect(),
99+
),
97100
}
98-
Ok(RelayMap { nodes: map.into() })
99101
}
100102
}
101103

@@ -131,6 +133,17 @@ pub struct RelayNode {
131133
pub quic: Option<RelayQuicConfig>,
132134
}
133135

136+
impl From<RelayUrl> for RelayNode {
137+
fn from(value: RelayUrl) -> Self {
138+
Self {
139+
url: value,
140+
stun_only: false,
141+
stun_port: DEFAULT_STUN_PORT,
142+
quic: quic_config(),
143+
}
144+
}
145+
}
146+
134147
fn quic_config() -> Option<RelayQuicConfig> {
135148
Some(RelayQuicConfig::default())
136149
}

iroh/bench/src/iroh.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use anyhow::{Context, Result};
77
use bytes::Bytes;
88
use iroh::{
99
endpoint::{Connection, ConnectionError, RecvStream, SendStream, TransportConfig},
10-
Endpoint, NodeAddr, RelayMap, RelayMode, RelayUrl,
10+
Endpoint, NodeAddr, RelayMode, RelayUrl,
1111
};
1212
use tracing::{trace, warn};
1313

@@ -25,9 +25,9 @@ pub fn server_endpoint(
2525
) -> (NodeAddr, Endpoint) {
2626
let _guard = rt.enter();
2727
rt.block_on(async move {
28-
let relay_mode = relay_url.clone().map_or(RelayMode::Disabled, |url| {
29-
RelayMode::Custom(RelayMap::from_url(url))
30-
});
28+
let relay_mode = relay_url
29+
.clone()
30+
.map_or(RelayMode::Disabled, |url| RelayMode::Custom(url.into()));
3131

3232
#[allow(unused_mut)]
3333
let mut builder = Endpoint::builder();
@@ -87,9 +87,9 @@ pub async fn connect_client(
8787
relay_url: Option<RelayUrl>,
8888
opt: Opt,
8989
) -> Result<(Endpoint, Connection)> {
90-
let relay_mode = relay_url.clone().map_or(RelayMode::Disabled, |url| {
91-
RelayMode::Custom(RelayMap::from_url(url))
92-
});
90+
let relay_mode = relay_url
91+
.clone()
92+
.map_or(RelayMode::Disabled, |url| RelayMode::Custom(url.into()));
9393
#[allow(unused_mut)]
9494
let mut builder = Endpoint::builder();
9595
#[cfg(feature = "local-relay")]

iroh/examples/transfer.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use indicatif::HumanBytes;
1010
use iroh::{
1111
discovery::{dns::DnsDiscovery, pkarr::PkarrPublisher},
1212
endpoint::{ConnectionError, PathSelection},
13-
Endpoint, NodeAddr, RelayMap, RelayMode, RelayUrl, SecretKey,
13+
Endpoint, NodeAddr, RelayMode, RelayUrl, SecretKey,
1414
};
1515
use iroh_base::ticket::NodeTicket;
1616
use tracing::info;
@@ -106,8 +106,7 @@ async fn provide(
106106
let relay_mode = match relay_url {
107107
Some(relay_url) => {
108108
let relay_url = RelayUrl::from_str(&relay_url)?;
109-
let relay_map = RelayMap::from_url(relay_url);
110-
RelayMode::Custom(relay_map)
109+
RelayMode::Custom(relay_url.into())
111110
}
112111
None => RelayMode::Default,
113112
};
@@ -229,8 +228,7 @@ async fn fetch(
229228
let relay_mode = match relay_url {
230229
Some(relay_url) => {
231230
let relay_url = RelayUrl::from_str(&relay_url)?;
232-
let relay_map = RelayMap::from_url(relay_url);
233-
RelayMode::Custom(relay_map)
231+
RelayMode::Custom(relay_url.into())
234232
}
235233
None => RelayMode::Default,
236234
};

iroh/src/defaults.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,11 @@ pub mod prod {
3636

3737
/// Get the default [`RelayMap`].
3838
pub fn default_relay_map() -> RelayMap {
39-
RelayMap::from_nodes([
39+
RelayMap::from_iter([
4040
default_na_relay_node(),
4141
default_eu_relay_node(),
4242
default_ap_relay_node(),
4343
])
44-
.expect("default nodes invalid")
4544
}
4645

4746
/// Get the default [`RelayNode`] for NA.
@@ -104,8 +103,7 @@ pub mod staging {
104103

105104
/// Get the default [`RelayMap`].
106105
pub fn default_relay_map() -> RelayMap {
107-
RelayMap::from_nodes([default_na_relay_node(), default_eu_relay_node()])
108-
.expect("default nodes invalid")
106+
RelayMap::from_iter([default_na_relay_node(), default_eu_relay_node()])
109107
}
110108

111109
/// Get the default [`RelayNode`] for NA.

iroh/src/net_report.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -877,11 +877,9 @@ pub(crate) mod stun_utils {
877877
mod test_utils {
878878
//! Creates a relay server against which to perform tests
879879
880-
use std::sync::Arc;
881-
882880
use iroh_relay::{server, RelayNode, RelayQuicConfig};
883881

884-
pub(crate) async fn relay() -> (server::Server, Arc<RelayNode>) {
882+
pub(crate) async fn relay() -> (server::Server, RelayNode) {
885883
let server = server::Server::spawn(server::testing::server_config())
886884
.await
887885
.expect("should serve relay");
@@ -895,7 +893,7 @@ mod test_utils {
895893
quic,
896894
};
897895

898-
(server, Arc::new(node_desc))
896+
(server, node_desc)
899897
}
900898

901899
/// Create a [`crate::RelayMap`] of the given size.
@@ -910,8 +908,7 @@ mod test_utils {
910908
servers.push(relay_server);
911909
nodes.push(node);
912910
}
913-
let map = crate::RelayMap::from_nodes(nodes).expect("unuque urls");
914-
(servers, map)
911+
(servers, crate::RelayMap::from_iter(nodes))
915912
}
916913
}
917914

@@ -983,7 +980,7 @@ mod tests {
983980
quic: None,
984981
}
985982
});
986-
RelayMap::from_nodes(nodes).expect("generated invalid nodes")
983+
RelayMap::from_iter(nodes)
987984
}
988985

989986
/// Sets up a simple STUN server binding to `0.0.0.0:0`.

iroh/src/net_report/reportgen.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,8 @@ mod tests {
14551455
let (_server_b, relay_b) = test_utils::relay().await;
14561456

14571457
let mut report = Report::default();
1458+
let relay_a = Arc::new(relay_a);
1459+
let relay_b = Arc::new(relay_b);
14581460

14591461
// A STUN IPv4 probe from the the first relay server.
14601462
let probe_report_a = ProbeReport {
@@ -1539,6 +1541,8 @@ mod tests {
15391541
async fn test_update_report_icmp() {
15401542
let (_server_a, relay_a) = test_utils::relay().await;
15411543
let (_server_b, relay_b) = test_utils::relay().await;
1544+
let relay_a = Arc::new(relay_a);
1545+
let relay_b = Arc::new(relay_b);
15421546

15431547
let mut report = Report::default();
15441548

@@ -1652,7 +1656,7 @@ mod tests {
16521656
let addr = server.stun_addr().expect("test relay serves stun");
16531657
let probe = Probe::IcmpV4 {
16541658
delay: Duration::from_secs(0),
1655-
node,
1659+
node: Arc::new(node),
16561660
};
16571661

16581662
// A single ICMP packet might get lost. Try several and take the first.
@@ -1717,6 +1721,7 @@ mod tests {
17171721
#[traced_test]
17181722
async fn test_quic_probe() -> TestResult {
17191723
let (server, relay) = test_utils::relay().await;
1724+
let relay = Arc::new(relay);
17201725
let client_config = iroh_relay::client::make_dangerous_client_config();
17211726
let ep = quinn::Endpoint::client(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 0))?;
17221727
let client_addr = ep.local_addr()?;
@@ -1730,7 +1735,7 @@ mod tests {
17301735
let port = server.quic_addr().unwrap().port();
17311736
let probe = Probe::QuicIpv4 {
17321737
delay: Duration::from_secs(0),
1733-
node: relay.clone(),
1738+
node: relay,
17341739
};
17351740
let probe = match run_quic_probe(
17361741
quic_addr_disc,

iroh/src/test_utils.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,14 @@ pub async fn run_relay_server_with(
101101
let quic = server
102102
.quic_addr()
103103
.map(|addr| RelayQuicConfig { port: addr.port() });
104-
let m = RelayMap::from_nodes([RelayNode {
104+
let n: RelayMap = RelayNode {
105105
url: url.clone(),
106106
stun_only: false,
107107
stun_port: server.stun_addr().map_or(DEFAULT_STUN_PORT, |s| s.port()),
108108
quic,
109-
}])?;
110-
Ok((m, url, server))
109+
}
110+
.into();
111+
Ok((n, url, server))
111112
}
112113

113114
pub(crate) mod dns_and_pkarr_servers {

0 commit comments

Comments
 (0)