v0.9.0-rc.20
iroh ecosystem bump from 0.98 → 1.0.0-rc.0, addressing the Android SIGABRT observed under iroh 0.98 in peat-ffi's Android Surface Test (defenseunicorns/peat#923). Active QUIC crypto provider remains aws-lc-rs (FIPS-approved); the bump is API-migration work plus the swarm-discovery + bionic-libc compatibility improvements that landed between iroh 0.98 and 1.0.
⚠ Breaking — public re-export surface change
peat_mesh::storage::iroh_types previously re-exported PathInfo and PathWatcher from iroh. iroh 1.0.0-rc.0 retired both types in favor of a borrowed Path<'a> + owned PathStats split, with Connection::paths_stream() returning a PathListStream (a Stream<Item = PathList<'_>>) where the prior PathWatcher::updated().await polling shape used to live. The re-exports now expose Path, PathEvent, PathEventStream, PathList, PathListStream, PathStats (in addition to Connection, EndpointHooks, PathId which were already there).
Downstream consumers (peat-protocol, peat-ffi, peat-mesh-node integrators) that imported peat_mesh::storage::iroh_types::PathInfo or PathWatcher directly must migrate:
PathInfo→Path<'a>for borrowed access orpeat_mesh::storage::mesh_sync_transport::PathSnapshot(a new owned struct introduced in this release; see Added below) when the snapshot needs to outlive the iteration.PathWatcher::updated()→Connection::paths_stream()consumed viaStream::next()(fromtokio_stream::Streamor any equivalentStreamExt). The stream ends on connection close, replacing the priorResult-based loop termination.
⚠ Semantics change — MeshSyncTransport::peer_rtt
Path::rtt() returns Duration directly in iroh 1.0.0-rc.0 (was Option<Duration> on the retired PathInfo). MeshSyncTransport::peer_rtt's outer Option now means strictly "no selected path" — pre-rc.20 it could also mean "RTT not yet measured." Callers that branched on is_some() to detect "do we have telemetry yet?" should switch to comparing the inner Duration against zero / a small threshold. The new docstring on peer_rtt calls this out explicitly.
Added
peat_mesh::storage::mesh_sync_transport::PathSnapshot— owned per-path struct (id,is_selected,is_ip,is_relay,rtt,stats) returned byMeshSyncTransport::peer_paths. iroh 1.0.0-rc.0'sPath<'a>borrows from aPathList<'_>snapshot, which would force callers to thread the snapshot's lifetime through their own code.PathSnapshotcaptures the borrowed predicates +PathStatsat the moment ofpeer_paths()so callers can hold aVec<PathSnapshot>indefinitely.iroh-mdns-address-lookup = "=0.2.0"as a new direct dep. iroh 1.0.0-rc.0 extracted the mDNS support fromiroh = { features = ["address-lookup-mdns"] }into a separate crate. The type name (MdnsAddressLookup) and behavior are unchanged; only the import path moved.test_path_snapshot_id_and_stats_pin— structural pin onPathSnapshot.id(PathId: Copy + Eq + Hash) andPathSnapshot.stats(PathStats::udp_tx/udp_rxfield shape from noq-proto). Catches future iroh-side refactors that changePath::id()/Path::stats()return types.
Changed
iroh = "=1.0.0-rc.0"(was 0.98). Exact-pinned during the iroh 1.0 rc-cycle.iroh-blobs = "=0.101.0"(was 0.100). Same.iroh-mdns-address-lookup = "=0.2.0"exact-pinned alongside iroh (extracted in the 1.0 cut, pre-1.0 SemVer applies to it).- Removed
ed25519 = "=3.0.0-rc.4"+pkcs8 = "=0.11.0-rc.11"pre-release pins. iroh 1.0.0-rc.0'sed25519-dalek 3.0.0-pre.7requires stableed25519 ^3which the resolver picks cleanly without our intervention. iroh::endpoint::ConnectionInfo→iroh::endpoint::Connection(rename in iroh 1.0). AffectsIrohBlobStore'sEndpointHooks::after_handshakeimpl (formation-member check is byte-for-byte preserved).MeshSyncTransport::start_sync_connection— path-watcher loop rewired fromPathWatcher::updated().awaittoConnection::paths_stream()+Stream::next(). The stream ends naturally on connection close, replacing the priorResult-based loop termination.
CI
No CI config changes vs. rc.19. The same --ignore RUSTSEC-2026-0118 / -0119 / -0120 advisory-set carries forward; iroh 1.0.0-rc.0's hickory transitive may resolve some of these on a future patch — revisit then.