v0.91.0
n0-computer/irohv0.91.0Jul 30, 2025by github-actions[bot]
AI Summary
A major release updating the Rust edition to 2024 and refactoring the relay protocol to use stride and ECN bits.
Key Highlights
- Edition changed to edition2024.
- Relay wire protocol changed: added ECN byte, removed SendPacket/RecvPacket, added Datagram types.
- Default relay URLs updated.
- n0-watcher updated with API changes for get() and ? handling.
- Added stride protocol and ECN bits support.
Breaking Changes
- Edition changed to edition2024.
- Relay wire protocol changed (added ECN byte, removed SendPacket/RecvPacket, added Datagram types).
- Default relay URLs changed.
- n0-watcher API changes (get takes &mut self, initialized().await? -> initialized().await).
- Removed Builder::initial_publish_delay.
- Removed Builder::relay_conn_protocol.
- Removed iroh::RelayProtocol re-export.
New Features
- New relay servers.
- Stride protocol for relay.
- ECN bits support.
- Timeout duration for relay dial errors.
Full Release Notes
## ⚠️ Breaking Changes
- `iroh`
- changed
- edition is now set to `edition2024`
- The relay wire protocol changed: All relayed messages now contain at least an additional ECN byte.
They *might* be accidentally compatible when GSO is not enabled, but they're likely not.
This means this version of iroh can't connect to older relays or older clients on newer relays.
- `ClientToRelayMsg::SendPacket` was removed in favor of `ClientToRelayMsg::Datagrams`
- `RelayToClientMsg::ReceivedPacket` was removed in favor of `RelayToClientMsg::Datagrams`
- `FrameType` has changed variants:
- `SendPacket` and `RecvPacket` were removed
- `ClientToRelayDatagram` and `ClientToRelayDatagramBatch` were added
- `RelayToClientDatagram` and `RelayToClientDatagramBatch` were added
- The default relay URLs have changed. We are still maintaining relay URLs for version `0.90.0`, those will be phased out next release.
- Updated `n0-watcher` from version `0.2` to `0.3`
- Migration guide for users:
- `endpoint.node_addr().initialized().await?` -> `endpoint.node_addr().initialized().await` (no `?` needed anymore) and similarly for `endpoint.home_relay()` and other uses of `Watcher`s.
- `endpoint.node_addr().get()?` -> `endpoint.node_addr().get()` and similarly for `endpoint.home_relay()` and other uses of `Watcher`s.
- If all you have is a `&impl Watcher` but you need the current value, then you can't call `Watcher::get` anymore, as that now takes a `&mut self` instead of `&self`. You can work around this by `.clone()`ing to an intermediate watcher:`watcher_ref.get()` -> `watcher_ref.clone().get()`
- removed
- Removed `iroh::discovery::pkarr::dht::Builder::initial_publish_delay`
- Removed `iroh::endpoint::Builder::relay_conn_protocol`. It's now always websockets
- Removed the `iroh::RelayProtocol` re-export (the type was removed in `iroh-relay`)
- `iroh-relay`
- removed
- Removed `iroh_relay::client::SendMessage` and `iroh_relay::client::ReceivedMessage` in favor of `ClientToRelayMsg` and `RelayToClientMsg` respectively.
- Removed `ClientBuilder::is_prober`
- Removed `ClientBuilder::protocol`
- Removed `http::Protocol` type
- Removed `relay_accepts` and `websocket_accepts` metrics
- changed
- `impl Stream for Client` now produces `RelayToClientMsg` instead of `ReceivedMessage`
- `Client` now `impl Sink<ClientToRelayMsg>` instead of `impl Sink<SendMessage>`
- Moved `protos::relay::FrameType` to `protos::common::FrameType` and adjusted frame types to those of the current set of protocols
- Renamed `frames_rx_ratelimited_total` metric to `bytes_rx_ratelimited_total`, which now tracks bytes not frames
## ⛰️ Features
- *(iroh)* Update to new relay servers ([#3412](https://github.com/n0-computer/iroh/issues/3412)) - ([f3e4307](https://github.com/n0-computer/iroh/commit/f3e430718a3316dffe191498fd3d0adddb92f2b4))
- *(iroh,iroh-relay)* [**breaking**] Use stride instead of custom split protocol, send ECN bits ([#3389](https://github.com/n0-computer/iroh/issues/3389)) - ([f3fd988](https://github.com/n0-computer/iroh/commit/f3fd988adfcab26023d7987f2fa6bf60975beb3c))
- *(iroh-relay)* [**breaking**] Implement new handshake protocol, refactor frame types ([#3331](https://github.com/n0-computer/iroh/issues/3331)) - ([3a1592a](https://github.com/n0-computer/iroh/commit/3a1592ac752bff2b71b85a7be8afb71edc92d6be))
- [**breaking**] Update to edition 2024 and update deps to latest ([#3386](https://github.com/n0-computer/iroh/issues/3386)) - ([e2cfde7](https://github.com/n0-computer/iroh/commit/e2cfde779cf3d04b15aafe5d193c171454463220))
- Add the timeout duration to the relay dial error ([#3406](https://github.com/n0-computer/iroh/issues/3406)) - ([db36c65](https://github.com/n0-computer/iroh/commit/db36c659a9d8725e44ef6751b85d2f604ec2f379))
## 🐛 Bug Fixes
- *(iroh)* Use std Mutex instead of tokio Mutex ([#3374](https://github.com/n0-computer/iroh/issues/3374)) - ([eb383a6](https://github.com/n0-computer/iroh/commit/eb383a61db4ca3645a445fcf0424fd516cd32c3f))
- *(iroh)* Track path validity for all paths and replace `BestAddr` with `PathValidity` ([#3400](https://github.com/n0-computer/iroh/issues/3400)) - ([a3187ca](https://github.com/n0-computer/iroh/commit/a3187caee475e83c2f6ad8cb57bbfd3825a7c917))
- *(iroh)* Re-batch received relay datagram batches in case they exceed `max_receive_segments` ([#3414](https://github.com/n0-computer/iroh/issues/3414)) - ([a8485ad](https://github.com/n0-computer/iroh/commit/a8485ad101c30babda1cb76343d5d242447bf049))
- *(iroh)* Only clear `last_call_me_maybe` when the best addr became invalid ([#3415](https://github.com/n0-computer/iroh/issues/3415)) - ([bcb60d4](https://github.com/n0-computer/iroh/commit/bcb60d42fecd79fcc5e4d064f410367a3f7aa0b2))
- *(iroh-relay)* Fix proptests, make `Datagrams::segment_size` be an `Option<NonZeroU16>` ([#3404](https://github.com/n0-computer/iroh/issues/3404)) - ([75fd57c](https://github.com/n0-computer/iroh/commit/75fd57c8e0fb2e47ed424f0926d3bb816cc4018b))
- Fix dht publishing at startup ([#3397](https://github.com/n0-computer/iroh/issues/3397)) - ([dd1d692](https://github.com/n0-computer/iroh/commit/dd1d692661b3ba6ee133b7d80500837444482385))
- Better tracing spans ([#3399](https://github.com/n0-computer/iroh/issues/3399)) - ([f8f7f95](https://github.com/n0-computer/iroh/commit/f8f7f959cb6f5e6273ab0c57fe23a7c6b326fa0a))
- Add missing use<> for wasm_browser ([#3411](https://github.com/n0-computer/iroh/issues/3411)) - ([91c2e63](https://github.com/n0-computer/iroh/commit/91c2e636c6d248857418ad918df63d7a667735ee))
- Wait for at least one ipv6 and ipv4 qad report ([#3413](https://github.com/n0-computer/iroh/issues/3413)) - ([b755db4](https://github.com/n0-computer/iroh/commit/b755db460d77c3b9b8eb2c6e25f1841a7236a89d))
## 🚜 Refactor
- *(iroh,iroh-relay)* Remove legacy relay path, make websocket connections default ([#3384](https://github.com/n0-computer/iroh/issues/3384)) - ([0776687](https://github.com/n0-computer/iroh/commit/0776687e982050c7a7c46e8d430b350a24481718))
## 📚 Documentation
- *(iroh)* Use `iroh::Watcher` reexport in docs ([#3375](https://github.com/n0-computer/iroh/issues/3375)) - ([9c023bf](https://github.com/n0-computer/iroh/commit/9c023bf4d7d1c3c10a9cc3b10df7e1a22c6ab7a4))
## 🧪 Testing
- *(iroh)* Make `endpoint_relay_connect_loop` not flaky ([#3402](https://github.com/n0-computer/iroh/issues/3402)) - ([8426241](https://github.com/n0-computer/iroh/commit/84262418d7597d0435b9e5f437dac119598880f2))
## ⚙️ Miscellaneous Tasks
- *(iroh)* Update `n0-watcher` ([#3405](https://github.com/n0-computer/iroh/issues/3405)) - ([2ce6a73](https://github.com/n0-computer/iroh/commit/2ce6a73412ec8a0343696a11fa531601bc5a76a1))
- *(iroh)* Update portmapper ([#3410](https://github.com/n0-computer/iroh/issues/3410)) - ([ee08341](https://github.com/n0-computer/iroh/commit/ee08341b3e621f3ff311f7d77cc6d73e49c70bd7))