1use crate::encoding::parse_node_id;
4use crate::{CoreError, IrohEndpoint, NodeAddrInfo};
5
6pub fn node_ticket(ep: &IrohEndpoint) -> Result<String, CoreError> {
11 let info = ep.node_addr();
12 serde_json::to_string(&info)
13 .map_err(|e| CoreError::internal(format!("failed to serialize node ticket: {e}")))
14}
15
16pub struct ParsedNodeAddr {
18 pub node_id: iroh::PublicKey,
19 pub relay_urls: Vec<iroh::RelayUrl>,
20 pub direct_addrs: Vec<std::net::SocketAddr>,
21}
22
23pub fn parse_node_addr(s: &str) -> Result<ParsedNodeAddr, CoreError> {
29 if let Ok(info) = serde_json::from_str::<NodeAddrInfo>(s) {
30 let node_id = parse_node_id(&info.id)?;
31 let mut relay_urls = Vec::new();
32 let mut direct_addrs = Vec::new();
33 for addr_str in &info.addrs {
34 if addr_str.contains("://") {
35 relay_urls.push(addr_str.parse::<iroh::RelayUrl>().map_err(|_| {
36 CoreError::invalid_input(format!("malformed relay URL: {addr_str}"))
37 })?);
38 continue;
39 }
40 let addr = addr_str
41 .parse::<std::net::SocketAddr>()
42 .map_err(|_| CoreError::invalid_input(format!("malformed address: {addr_str}")))?;
43 if addr.port() == 0 {
46 return Err(CoreError::invalid_input(format!(
47 "direct address {addr_str} has no port (port 0)"
48 )));
49 }
50 direct_addrs.push(addr);
51 }
52 return Ok(ParsedNodeAddr {
53 node_id,
54 relay_urls,
55 direct_addrs,
56 });
57 }
58 let node_id = parse_node_id(s)?;
59 Ok(ParsedNodeAddr {
60 node_id,
61 relay_urls: Vec::new(),
62 direct_addrs: Vec::new(),
63 })
64}