[package]
name = "iroh-relay"
version = "0.96.1"
edition = "2024"
readme = "README.md"
description = "Iroh's relay server and client"
license = "MIT OR Apache-2.0"
authors = ["n0 team"]
repository = "https://github.com/n0-computer/iroh"
keywords = ["networking", "holepunching", "p2p"]
rust-version = "1.89"
[lib]
# We need "cdylib" to actually generate .wasm files when we run with --target=wasm32-unknown-unknown.
# It would be nice if we could make this target-dependent, but we can't (yet): https://github.com/rust-lang/cargo/issues/12260
crate-type = ["lib", "cdylib"]
[lints]
workspace = true
[dependencies]
bytes = "1.11"
derive_more = { version = "2.0.1", features = [
"debug",
"display",
"from",
"try_into",
"deref",
] }
http = "1"
http-body-util = "0.1.0"
hyper = { version = "1", features = ["server", "client", "http1"] }
hyper-util = "0.1.1"
iroh-base = { version = "0.96.1", path = "../iroh-base", default-features = false, features = ["key", "relay"] }
iroh-metrics = { version = "0.38", default-features = false }
n0-future = "0.3"
num_enum = "0.7"
pin-project = "1"
pkarr = { version = "5", default-features = false, features = ["signed_packet"] }
postcard = { version = "1", default-features = false, features = [
"alloc",
"use-std",
"experimental-derive",
] }
quinn = { package = "iroh-quinn", version = "0.16.1", default-features = false, features = ["rustls-ring"] }
quinn-proto = { package = "iroh-quinn-proto", version = "0.15.1" }
rand = "0.9.2"
reqwest = { version = "0.12", default-features = false, features = [
"rustls-tls",
] }
rustls = { version = "0.23.33", default-features = false, features = ["ring"] }
serde = { version = "1", features = ["derive", "rc"] }
strum = { version = "0.27", features = ["derive"] }
tokio = { version = "1", features = [
"io-util",
"macros",
"sync",
"rt",
] }
tokio-rustls = { version = "0.26", default-features = false, features = [
"logging",
"ring",
] }
tokio-util = { version = "0.7", features = ["io-util", "io", "codec", "rt"] }
tracing = "0.1"
url = { version = "2.5.3", features = ["serde"] }
webpki-roots = "1.0.3"
webpki_types = { package = "rustls-pki-types", version = "1.12" }
data-encoding = "2.6.0"
lru = "0.16.3"
z32 = "1.0.3"
n0-error = "0.1"
# server feature
clap = { version = "4", features = ["derive"], optional = true }
dashmap = { version = "6.1.0", optional = true }
ahash = { version = "0.8.11", optional = true } # minimal version fix
rcgen = { version = "0.14", optional = true }
reloadable-state = { version = "0.1", optional = true }
rustls-cert-reloadable-resolver = { version = "0.7.1", optional = true }
rustls-cert-file-reader = { version = "0.4.2", optional = true }
time = { version = "0.3.37", optional = true }
tokio-rustls-acme = { version = "0.9", optional = true }
tokio-websockets = { version = "0.12", features = ["rustls-bring-your-own-connector", "ring", "getrandom", "rand", "server"], optional = true } # server-side websocket implementation
simdutf8 = { version = "0.1.5", optional = true } # minimal version fix
sha1 = { version = "0.11.0-rc.2", optional = true }
toml = { version = "0.9", optional = true }
serde_json = { version = "1", optional = true }
tracing-subscriber = { version = "0.3", features = [
"env-filter",
], optional = true }
hemera = { package = "cyber-hemera", path = "../../hemera/rs" }
serde_bytes = "0.11.17"
# non-wasm-in-browser dependencies
[target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies]
hickory-resolver = { version = "0.25.1", features = ["tokio", "https-ring"] }
tokio = { version = "1", features = [
"io-util",
"macros",
"sync",
"rt",
"net",
"fs",
"io-std",
"signal",
"process",
] }
tokio-websockets = { version = "0.12", features = ["rustls-bring-your-own-connector", "ring", "getrandom", "rand", "client"] }
# wasm-in-browser dependencies
[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies]
ws_stream_wasm = { version = "0.7.4", default-features = false }
getrandom = { version = "0.3.2", features = ["wasm_js"] }
[dev-dependencies]
clap = { version = "4", features = ["derive"] }
proptest = "1.2.0"
rand_chacha = "0.9"
tokio = { version = "1", features = [
"io-util",
"sync",
"rt",
"net",
"fs",
"macros",
"time",
"test-util",
] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
serde_json = "1"
n0-tracing-test = "0.3"
[build-dependencies]
cfg_aliases = "0.2.1"
vergen-gitcl = "1.0.8"
[features]
default = ["metrics"]
server = [
"metrics",
"dep:clap",
"dep:dashmap",
"dep:ahash",
"dep:rcgen",
"dep:reloadable-state",
"dep:rustls-cert-file-reader",
"dep:rustls-cert-reloadable-resolver",
"dep:time",
"dep:tokio-rustls-acme",
"dep:tokio-websockets",
"dep:simdutf8",
"dep:sha1",
"dep:toml",
"dep:serde_json",
"dep:tracing-subscriber",
"quinn/platform-verifier",
"quinn/runtime-tokio",
"iroh-metrics/service",
]
metrics = ["iroh-metrics/metrics"]
test-utils = []
bin
name = "iroh-relay"
path = "src/main.rs"
required-features = ["server"]
[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "iroh_docsrs"]