Skip to content

Commit 15ce816

Browse files
authored
update pkarr publish to also publish to relay (#41)
* update pkarr publish to also publish to relay also give more builder options * fix content discovery * use tokio::join instead of futures::future::join * use futures-lite * fmt
1 parent 7e17ea6 commit 15ce816

File tree

7 files changed

+431
-222
lines changed

7 files changed

+431
-222
lines changed

content-discovery/Cargo.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

content-discovery/iroh-mainline-content-discovery/src/client.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ async fn create_endpoint(
216216
publish: bool,
217217
) -> anyhow::Result<MagicEndpoint> {
218218
let mainline_discovery = if publish {
219-
PkarrNodeDiscovery::builder().secret_key(&key).build()
219+
PkarrNodeDiscovery::builder()
220+
.secret_key(key.clone())
221+
.build()?
220222
} else {
221223
PkarrNodeDiscovery::default()
222224
};

content-discovery/iroh-mainline-tracker/src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ async fn create_endpoint(
7070
publish: bool,
7171
) -> anyhow::Result<MagicEndpoint> {
7272
let mainline_discovery = if publish {
73-
PkarrNodeDiscovery::builder().secret_key(&key).build()
73+
PkarrNodeDiscovery::builder()
74+
.secret_key(key.clone())
75+
.build()?
7476
} else {
7577
PkarrNodeDiscovery::default()
7678
};

iroh-pkarr-node-discovery/Cargo.lock

Lines changed: 117 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

iroh-pkarr-node-discovery/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ description = "A discovery mechanism for iroh-net that uses the bittorrent mainl
1313

1414
[dependencies]
1515
anyhow = "1.0.79"
16-
futures = "0.3.30"
16+
futures-lite = "2.3.0"
17+
genawaiter = "0.99.1"
1718
iroh-net = "0.14.0"
1819
pkarr = { version = "1.0.1", features = ["async"] }
1920
tokio = "1.35.1"
2021
tracing = "0.1.40"
2122

2223
[dev-dependencies]
24+
clap = { version = "4.5.4", features = ["derive"] }
2325
hex = "0.4.3"
2426
postcard = "1.0.8"
2527
proptest = "1.4.0"

iroh-pkarr-node-discovery/examples/chat.rs

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,59 @@
1010
//! To see what is going on, run with `RUST_LOG=iroh_pkarr_node_discovery=debug`.
1111
use std::str::FromStr;
1212

13-
use anyhow::Context;
13+
use clap::Parser;
1414
use iroh_net::{magic_endpoint::get_remote_node_id, MagicEndpoint, NodeId};
15+
use pkarr::url::Url;
1516

1617
const CHAT_ALPN: &[u8] = b"pkarr-discovery-demo-chat";
1718

18-
async fn chat_server() -> anyhow::Result<()> {
19+
#[derive(Parser)]
20+
struct Args {
21+
/// The node id to connect to. If not set, the program will start a server.
22+
node_id: Option<NodeId>,
23+
/// Disable using the mainline DHT for discovery and publishing.
24+
#[clap(long)]
25+
disable_dht: bool,
26+
/// Pkarr relay to use.
27+
#[clap(long, default_value = "iroh")]
28+
pkarr_relay: PkarrRelay,
29+
}
30+
31+
#[derive(Debug, Clone)]
32+
enum PkarrRelay {
33+
Disabled,
34+
Iroh,
35+
Custom(Url),
36+
}
37+
38+
impl FromStr for PkarrRelay {
39+
type Err = anyhow::Error;
40+
41+
fn from_str(s: &str) -> Result<Self, Self::Err> {
42+
match s {
43+
"disabled" => Ok(Self::Disabled),
44+
"iroh" => Ok(Self::Iroh),
45+
s => Ok(Self::Custom(Url::parse(s)?)),
46+
}
47+
}
48+
}
49+
50+
fn build_discovery(args: Args) -> iroh_pkarr_node_discovery::Builder {
51+
let builder = iroh_pkarr_node_discovery::PkarrNodeDiscovery::builder().dht(!args.disable_dht);
52+
let builder = match args.pkarr_relay {
53+
PkarrRelay::Disabled => builder,
54+
PkarrRelay::Iroh => builder.iroh_pkarr_relay(),
55+
PkarrRelay::Custom(url) => builder.pkarr_relay(url),
56+
};
57+
builder
58+
}
59+
60+
async fn chat_server(args: Args) -> anyhow::Result<()> {
1961
let secret_key = iroh_net::key::SecretKey::generate();
2062
let node_id = secret_key.public();
21-
let discovery = iroh_pkarr_node_discovery::PkarrNodeDiscovery::builder()
22-
.secret_key(&secret_key)
23-
.build();
63+
let discovery = build_discovery(args)
64+
.secret_key(secret_key.clone())
65+
.build()?;
2466
let endpoint = MagicEndpoint::builder()
2567
.alpns(vec![CHAT_ALPN.to_vec()])
2668
.secret_key(secret_key)
@@ -51,11 +93,12 @@ async fn chat_server() -> anyhow::Result<()> {
5193
Ok(())
5294
}
5395

54-
async fn chat_client(remote_node_id: NodeId) -> anyhow::Result<()> {
96+
async fn chat_client(args: Args) -> anyhow::Result<()> {
97+
let remote_node_id = args.node_id.unwrap();
5598
let secret_key = iroh_net::key::SecretKey::generate();
5699
let node_id = secret_key.public();
57100
// note: we don't pass a secret key here, because we don't need to publish our address, don't spam the DHT
58-
let discovery = iroh_pkarr_node_discovery::PkarrNodeDiscovery::builder().build();
101+
let discovery = build_discovery(args).build()?;
59102
// we do not need to specify the alpn here, because we are not going to accept connections
60103
let endpoint = MagicEndpoint::builder()
61104
.secret_key(secret_key)
@@ -66,6 +109,7 @@ async fn chat_client(remote_node_id: NodeId) -> anyhow::Result<()> {
66109
let connection = endpoint
67110
.connect_by_node_id(&remote_node_id, CHAT_ALPN)
68111
.await?;
112+
println!("connected to {}", remote_node_id);
69113
let (mut writer, mut reader) = connection.open_bi().await?;
70114
let _copy_to_stdout =
71115
tokio::spawn(async move { tokio::io::copy(&mut reader, &mut tokio::io::stdout()).await });
@@ -79,16 +123,11 @@ async fn chat_client(remote_node_id: NodeId) -> anyhow::Result<()> {
79123
#[tokio::main]
80124
async fn main() -> anyhow::Result<()> {
81125
tracing_subscriber::fmt::init();
82-
let args = std::env::args();
83-
let first = args.into_iter().skip(1).next();
84-
match first {
85-
Some(node_id) => {
86-
let node_id = NodeId::from_str(&node_id).context("invalid node id")?;
87-
chat_client(node_id).await?;
88-
}
89-
None => {
90-
chat_server().await?;
91-
}
126+
let args = Args::parse();
127+
if args.node_id.is_some() {
128+
chat_client(args).await?;
129+
} else {
130+
chat_server(args).await?;
92131
}
93132
Ok(())
94133
}

0 commit comments

Comments
 (0)