@@ -8,6 +8,7 @@ use bytes::Bytes;
8
8
use clap:: { Parser , Subcommand } ;
9
9
use indicatif:: HumanBytes ;
10
10
use iroh:: {
11
+ discovery:: { dns:: DnsDiscovery , pkarr:: PkarrPublisher } ,
11
12
endpoint:: { ConnectionError , PathSelection } ,
12
13
Endpoint , NodeAddr , RelayMap , RelayMode , RelayUrl , SecretKey ,
13
14
} ;
@@ -32,6 +33,10 @@ enum Commands {
32
33
relay_url : Option < String > ,
33
34
#[ clap( long, default_value = "false" ) ]
34
35
relay_only : bool ,
36
+ #[ clap( long) ]
37
+ pkarr_relay_url : Option < String > ,
38
+ #[ clap( long) ]
39
+ dns_origin_domain : Option < String > ,
35
40
} ,
36
41
Fetch {
37
42
#[ arg( index = 1 ) ]
@@ -40,6 +45,10 @@ enum Commands {
40
45
relay_url : Option < String > ,
41
46
#[ clap( long, default_value = "false" ) ]
42
47
relay_only : bool ,
48
+ #[ clap( long) ]
49
+ pkarr_relay_url : Option < String > ,
50
+ #[ clap( long) ]
51
+ dns_origin_domain : Option < String > ,
43
52
} ,
44
53
}
45
54
@@ -53,18 +62,46 @@ async fn main() -> anyhow::Result<()> {
53
62
size,
54
63
relay_url,
55
64
relay_only,
56
- } => provide ( * size, relay_url. clone ( ) , * relay_only) . await ?,
65
+ pkarr_relay_url,
66
+ dns_origin_domain,
67
+ } => {
68
+ provide (
69
+ * size,
70
+ relay_url. clone ( ) ,
71
+ * relay_only,
72
+ pkarr_relay_url. clone ( ) ,
73
+ dns_origin_domain. clone ( ) ,
74
+ )
75
+ . await ?
76
+ }
57
77
Commands :: Fetch {
58
78
ticket,
59
79
relay_url,
60
80
relay_only,
61
- } => fetch ( ticket, relay_url. clone ( ) , * relay_only) . await ?,
81
+ pkarr_relay_url,
82
+ dns_origin_domain,
83
+ } => {
84
+ fetch (
85
+ ticket,
86
+ relay_url. clone ( ) ,
87
+ * relay_only,
88
+ pkarr_relay_url. clone ( ) ,
89
+ dns_origin_domain. clone ( ) ,
90
+ )
91
+ . await ?
92
+ }
62
93
}
63
94
64
95
Ok ( ( ) )
65
96
}
66
97
67
- async fn provide ( size : u64 , relay_url : Option < String > , relay_only : bool ) -> anyhow:: Result < ( ) > {
98
+ async fn provide (
99
+ size : u64 ,
100
+ relay_url : Option < String > ,
101
+ relay_only : bool ,
102
+ pkarr_relay_url : Option < String > ,
103
+ dns_origin_domain : Option < String > ,
104
+ ) -> anyhow:: Result < ( ) > {
68
105
let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
69
106
let relay_mode = match relay_url {
70
107
Some ( relay_url) => {
@@ -78,7 +115,28 @@ async fn provide(size: u64, relay_url: Option<String>, relay_only: bool) -> anyh
78
115
true => PathSelection :: RelayOnly ,
79
116
false => PathSelection :: default ( ) ,
80
117
} ;
81
- let endpoint = Endpoint :: builder ( )
118
+
119
+ let mut endpoint_builder = Endpoint :: builder ( ) ;
120
+
121
+ if let Some ( pkarr_relay_url) = pkarr_relay_url {
122
+ let pkarr_relay_url = pkarr_relay_url
123
+ . parse ( )
124
+ . context ( "Invalid pkarr URL provided" ) ?;
125
+
126
+ let pkarr_discovery_closure = move |secret_key : & SecretKey | {
127
+ let pkarr_d = PkarrPublisher :: new ( secret_key. clone ( ) , pkarr_relay_url) ;
128
+ Some ( pkarr_d)
129
+ } ;
130
+ endpoint_builder = endpoint_builder. add_discovery ( pkarr_discovery_closure) ;
131
+ }
132
+
133
+ if let Some ( dns_origin_domain) = dns_origin_domain {
134
+ let dns_discovery_closure = move |_: & SecretKey | Some ( DnsDiscovery :: new ( dns_origin_domain) ) ;
135
+
136
+ endpoint_builder = endpoint_builder. add_discovery ( dns_discovery_closure) ;
137
+ }
138
+
139
+ let endpoint = endpoint_builder
82
140
. secret_key ( secret_key)
83
141
. alpns ( vec ! [ TRANSFER_ALPN . to_vec( ) ] )
84
142
. relay_mode ( relay_mode)
@@ -160,7 +218,13 @@ async fn provide(size: u64, relay_url: Option<String>, relay_only: bool) -> anyh
160
218
Ok ( ( ) )
161
219
}
162
220
163
- async fn fetch ( ticket : & str , relay_url : Option < String > , relay_only : bool ) -> anyhow:: Result < ( ) > {
221
+ async fn fetch (
222
+ ticket : & str ,
223
+ relay_url : Option < String > ,
224
+ relay_only : bool ,
225
+ pkarr_relay_url : Option < String > ,
226
+ dns_origin_domain : Option < String > ,
227
+ ) -> anyhow:: Result < ( ) > {
164
228
let ticket: NodeTicket = ticket. parse ( ) ?;
165
229
let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
166
230
let relay_mode = match relay_url {
@@ -175,7 +239,27 @@ async fn fetch(ticket: &str, relay_url: Option<String>, relay_only: bool) -> any
175
239
true => PathSelection :: RelayOnly ,
176
240
false => PathSelection :: default ( ) ,
177
241
} ;
178
- let endpoint = Endpoint :: builder ( )
242
+ let mut endpoint_builder = Endpoint :: builder ( ) ;
243
+
244
+ if let Some ( pkarr_relay_url) = pkarr_relay_url {
245
+ let pkarr_relay_url = pkarr_relay_url
246
+ . parse ( )
247
+ . context ( "Invalid pkarr URL provided" ) ?;
248
+
249
+ let pkarr_discovery_closure = move |secret_key : & SecretKey | {
250
+ let pkarr_d = PkarrPublisher :: new ( secret_key. clone ( ) , pkarr_relay_url) ;
251
+ Some ( pkarr_d)
252
+ } ;
253
+ endpoint_builder = endpoint_builder. add_discovery ( pkarr_discovery_closure) ;
254
+ }
255
+
256
+ if let Some ( dns_origin_domain) = dns_origin_domain {
257
+ let dns_discovery_closure = move |_: & SecretKey | Some ( DnsDiscovery :: new ( dns_origin_domain) ) ;
258
+
259
+ endpoint_builder = endpoint_builder. add_discovery ( dns_discovery_closure) ;
260
+ }
261
+
262
+ let endpoint = endpoint_builder
179
263
. secret_key ( secret_key)
180
264
. alpns ( vec ! [ TRANSFER_ALPN . to_vec( ) ] )
181
265
. relay_mode ( relay_mode)
0 commit comments