Review foreign types in public APIs
We currently expose quite a lot of types from dependencies in the pubic API of iroh. We should review that list before 1.0.
For some types from widely used crates with a 1.0 release, e.g. bytes::Bytes , we're likely fine with exposing them.
For types from pre-1.0 crates, leaving them in the public API of iroh means we cannot update the crate (apart from patch-level changes) without a semver breaking change in iroh.
There's a tool called cargo-check-external-types which produces a list of foreign types that are used in public APIs.
I ran the tool on iroh-base, iroh-relay, and iroh with the following crates excluded: bytes, serde, url, iroh_metrics, iroh_quinn, iroh_quinn_proto. Reasoning: bytes, serde, url are 1.0. iroh_metrics we will release at 1.0 ourselves. And quinn we know we have to deal with either by releasing iroh-quinn as 1.0 or by newtyping everything.
Here's the cleaned up and deduplicated list on main as of 2025-10-13:
| Crate | Type | Used In |
|---|---|---|
| Crate | Type | Used In |
| backtrace | backtrace::capture::Backtrace | iroh-base/src/key.rs:207:5 iroh-base/src/ticket.rs:63:5 iroh-relay/src/client.rs:51:5 iroh-relay/src/client.rs:91:5 iroh-relay/src/client/conn.rs:30:5 iroh-relay/src/client/conn.rs:53:5 iroh-relay/src/dns.rs:66:5 iroh-relay/src/dns.rs:96:5 iroh-relay/src/node_info.rs:414:5 iroh-relay/src/node_info.rs:52:5 iroh-relay/src/node_info.rs:70:5 iroh-relay/src/protos/common.rs:57:5 iroh-relay/src/protos/handshake.rs:137:5 iroh-relay/src/protos/relay.rs:45:5 iroh-relay/src/quic.rs:232:5 iroh-relay/src/server.rs:272:5 iroh-relay/src/server.rs:296:5 |
| data_encoding | data_encoding::DecodeError | iroh-base/src/key.rs:211:10 iroh-base/src/key.rs:217:14 iroh-base/src/ticket.rs:67:17 iroh-base/src/ticket.rs:83:16 |
| ed25519_dalek | ed25519_dalek::errors::SignatureError | iroh-base/src/key.rs:120:5 iroh-base/src/key.rs:131:5 iroh-base/src/key.rs:221:9 iroh-base/src/lib.rs:18:79 iroh-relay/src/node_info.rs:84:24 iroh-relay/src/protos/relay.rs:62:24 |
| ed25519_dalek | ed25519_dalek::signing::SigningKey | iroh-base/src/key.rs:319:5 iroh-base/src/key.rs:324:1 |
| ed25519_dalek | ed25519_dalek::verifying::VerifyingKey | iroh-base/src/key.rs:109:5 iroh-base/src/key.rs:182:1 |
| ed25519 | ed25519::Signature | iroh-base/src/key.rs:131:5 iroh-base/src/key.rs:300:5 iroh-base/src/lib.rs:18:68 |
| futures_core | futures_core::stream::Stream | iroh-relay/src/client.rs:375:1 iroh-relay/src/client.rs:461:1 |
| futures_lite | futures_lite::future::Boxed | iroh-relay/src/dns.rs:43:5 iroh-relay/src/dns.rs:46:5 iroh-relay/src/dns.rs:49:5 iroh-relay/src/server.rs:141:16 |
| futures_sink | futures_sink::Sink | iroh-relay/src/client.rs:383:1 iroh-relay/src/client.rs:418:1 iroh-relay/src/client/conn.rs:140:1 iroh-relay/src/server/streams.rs:89:1 |
| hickory_resolver | hickory_resolver::error::ResolveError | iroh-relay/src/dns.rs:71:17 iroh-relay/src/dns.rs:88:9 |
| http | http::header::name::HeaderName | iroh-relay/src/http.rs:22:1 |
| http | http::header::value::HeaderValue | iroh-relay/src/protos/handshake.rs:142:17 iroh-relay/src/protos/handshake.rs:170:31 |
| http | http::header::value::InvalidHeaderValue | iroh-relay/src/server.rs:277:17 iroh-relay/src/server.rs:285:22 |
| http | http::status::StatusCode | iroh-relay/src/client.rs:111:33 iroh-relay/src/client.rs:56:17 iroh-relay/src/client.rs:75:31 iroh-relay/src/client.rs:96:17 |
| hyper | hyper::error::Error | iroh-relay/src/client.rs:115:20 iroh-relay/src/client.rs:56:17 iroh-relay/src/client.rs:77:15 iroh-relay/src/client.rs:96:17 |
| n0_snafu | n0_snafu::spantrace::SpanTrace | iroh-base/src/key.rs:209:5 iroh-base/src/ticket.rs:65:5 iroh-relay/src/client.rs:53:5 iroh-relay/src/client.rs:93:5 iroh-relay/src/client/conn.rs:32:5 iroh-relay/src/client/conn.rs:55:5 iroh-relay/src/dns.rs:68:5 iroh-relay/src/dns.rs:98:5 iroh-relay/src/node_info.rs:416:5 iroh-relay/src/node_info.rs:54:5 iroh-relay/src/node_info.rs:72:5 iroh-relay/src/protos/common.rs:59:5 iroh-relay/src/protos/handshake.rs:139:5 iroh-relay/src/protos/relay.rs:47:5 iroh-relay/src/quic.rs:234:5 iroh-relay/src/server.rs:274:5 iroh-relay/src/server.rs:298:5 |
| num_enum | num_enum::TryFromPrimitive | iroh-relay/src/protos/common.rs:14:65 |
| num_enum | num_enum::TryFromPrimitiveError | iroh-relay/src/protos/common.rs:14:65 |
| pkarr | pkarr::signed_packet::SignedPacket | iroh-relay/src/node_info.rs:391:5 iroh-relay/src/node_info.rs:399:5 |
| pkarr | pkarr::signed_packet::SignedPacketBuildError | iroh-relay/src/node_info.rs:57:17 iroh-relay/src/node_info.rs:63:9 |
| postcard | postcard::error::Error | iroh-base/src/ticket.rs:67:17 iroh-base/src/ticket.rs:80:16 iroh-relay/src/protos/handshake.rs:142:17 iroh-relay/src/protos/handshake.rs:166:9 iroh-relay/src/protos/relay.rs:50:17 iroh-relay/src/protos/relay.rs:58:13 |
| rand_core | rand_core::CryptoRng | iroh-base/src/key.rs:293:5 |
| reloadable_core | reloadable_core::Loader | iroh-relay/src/server/resolver.rs:28:1 iroh-relay/src/server/resolver.rs:33:5 iroh-relay/src/server/resolver.rs:77:1 |
| reloadable_state | reloadable_state::Reloadable | iroh-relay/src/server/resolver.rs:89:5 |
| reqwest | reqwest::dns::resolve::Resolve | iroh-relay/src/dns.rs:482:1 |
| rustls_pki_types | rustls_pki_types::CertificateDer | iroh-relay/src/server.rs:234:9 iroh-relay/src/server.rs:511:5 iroh-relay/src/server/testing.rs:9:1 |
| rustls | rustls::client::client_conn::ClientConfig | iroh-relay/src/client.rs:473:1 iroh-relay/src/quic.rs:260:5 |
| rustls | rustls::crypto::signer::CertifiedKey | iroh-relay/src/server/resolver.rs:28:1 iroh-relay/src/server/resolver.rs:77:1 iroh-relay/src/server/resolver.rs:89:5 |
| rustls | rustls::server::server_conn::ResolvesServerCert | iroh-relay/src/server/resolver.rs:77:1 |
| rustls | rustls::server::server_conn::ServerConfig | iroh-relay/src/server.rs:177:5 iroh-relay/src/server.rs:198:5 iroh-relay/src/server/testing.rs:9:1 |
| serde_core | serde_core::de::Deserialize | iroh-base/src/key.rs:271:1 iroh-base/src/key.rs:87:1 iroh-base/src/node_addr.rs:39:35 iroh-base/src/relay_url.rs:20:83 iroh-base/src/ticket/node.rs:123:1 iroh-relay/src/relay_map.rs:115:50 iroh-relay/src/relay_map.rs:142:17 |
| serde_core | serde_core::ser::Serialize | iroh-base/src/key.rs:262:1 iroh-base/src/key.rs:74:1 iroh-base/src/node_addr.rs:39:24 iroh-base/src/relay_url.rs:20:72 iroh-base/src/ticket/node.rs:112:1 iroh-relay/src/relay_map.rs:115:39 iroh-relay/src/relay_map.rs:142:30 |
| signature | signature::error::Error | iroh-base/src/key.rs:158:5 iroh-base/src/key.rs:168:5 iroh-base/src/key.rs:211:10 iroh-base/src/key.rs:337:5 iroh-relay/src/node_info.rs:75:17 iroh-relay/src/protos/relay.rs:50:17 |
| simple_dns | simple_dns::simple_dns_error::SimpleDnsError | iroh-relay/src/node_info.rs:57:17 iroh-relay/src/node_info.rs:66:23 |
| snafu | snafu::ErrorCompat | iroh-base/src/key.rs:211:10 iroh-base/src/relay_url.rs:42:17 iroh-base/src/ticket.rs:67:17 iroh-relay/src/client.rs:56:17 iroh-relay/src/client.rs:96:17 iroh-relay/src/client/conn.rs:35:17 iroh-relay/src/client/conn.rs:58:17 iroh-relay/src/dns.rs:101:17 iroh-relay/src/dns.rs:119:17 iroh-relay/src/dns.rs:71:17 iroh-relay/src/node_info.rs:230:17 iroh-relay/src/node_info.rs:419:17 iroh-relay/src/node_info.rs:57:17 iroh-relay/src/node_info.rs:75:17 iroh-relay/src/protos/common.rs:62:17 iroh-relay/src/protos/handshake.rs:142:17 iroh-relay/src/protos/relay.rs:50:17 iroh-relay/src/quic.rs:237:17 iroh-relay/src/server.rs:277:17 iroh-relay/src/server.rs:301:17 |
| snafu | snafu::IntoError | iroh-base/src/key.rs:211:10 iroh-base/src/relay_url.rs:42:17 iroh-base/src/ticket.rs:67:17 iroh-relay/src/client.rs:56:17 iroh-relay/src/client.rs:96:17 iroh-relay/src/client/conn.rs:35:17 iroh-relay/src/dns.rs:101:17 iroh-relay/src/dns.rs:119:17 iroh-relay/src/dns.rs:71:17 iroh-relay/src/node_info.rs:230:17 iroh-relay/src/node_info.rs:419:17 iroh-relay/src/node_info.rs:57:17 iroh-relay/src/node_info.rs:75:17 iroh-relay/src/protos/common.rs:62:17 iroh-relay/src/protos/handshake.rs:142:17 iroh-relay/src/protos/relay.rs:50:17 iroh-relay/src/server.rs:277:17 iroh-relay/src/server.rs:301:17 |
| snafu | snafu::NoneError | iroh-base/src/key.rs:211:10 iroh-base/src/ticket.rs:67:17 iroh-relay/src/client.rs:56:17 iroh-relay/src/client.rs:96:17 iroh-relay/src/client/conn.rs:35:17 iroh-relay/src/dns.rs:119:17 iroh-relay/src/dns.rs:71:17 iroh-relay/src/node_info.rs:230:17 iroh-relay/src/node_info.rs:419:17 iroh-relay/src/node_info.rs:75:17 iroh-relay/src/protos/common.rs:62:17 iroh-relay/src/protos/handshake.rs:142:17 iroh-relay/src/protos/relay.rs:50:17 iroh-relay/src/server.rs:277:17 iroh-relay/src/server.rs:301:17 |
| tokio_rustls_acme | tokio_rustls_acme::state::AcmeState | iroh-relay/src/server.rs:229:9 |
| tokio_util | tokio_util::task::abort_on_drop::AbortOnDropHandle | iroh-relay/src/server.rs:491:5 |
| tokio_websockets | tokio_websockets::error::Error | iroh-relay/src/client.rs:56:17 iroh-relay/src/client.rs:66:9 iroh-relay/src/client/conn.rs:35:17 iroh-relay/src/client/conn.rs:41:9 iroh-relay/src/client/conn.rs:58:17 iroh-relay/src/client/conn.rs:66:9 iroh-relay/src/protos/handshake.rs:142:17 iroh-relay/src/protos/handshake.rs:148:9 |
| tokio | tokio::runtime::task::error::JoinError | iroh-relay/src/server.rs:301:17 iroh-relay/src/server.rs:309:17 |
| tokio | tokio::sync::watch::error::RecvError | iroh-relay/src/quic.rs:237:17 iroh-relay/src/quic.rs:245:17 |
| tokio | tokio::time::error::Elapsed | iroh-relay/src/client.rs:105:15 iroh-relay/src/client.rs:96:17 iroh-relay/src/dns.rs:71:17 iroh-relay/src/dns.rs:76:15 |
| z32 | z32::Z32Error | iroh-relay/src/node_info.rs:75:17 iroh-relay/src/node_info.rs:80:26 |