Releases: momics/iroh-http
Releases · momics/iroh-http
Release list
v0.6.1
[0.6.1] - 2026-07-21
🐛 Bug Fixes
- (android) Manage legacy DNS-SD multicast lifecycle
- (release) Publish curated changelog notes
- (android) Fail closed without legacy multicast service
- (core) Disable QUIC GSO on Android
- (release) Preserve dependency graph during version bump
💼 Other
- (deps) Bump js-yaml to 4.3.0
📚 Documentation
- Align skill review and closure language
- Complete next-release readiness audit
- Format mobile setup guides
- Make mobile release gate executable
- (core) Link Android GSO removal tracker
⚙️ Miscellaneous Tasks
- Consolidate project agent skills
v0.6.0
[0.6.0] - 2026-07-18
🚀 Features
- (ci) Add workflow_dispatch tag input to re-benchmark a release (#253)
- (tauri) Make httpi:// scheme response cap configurable
- (example) Stream peer-hosted audio and images over httpi:// (#265)
- (core) Route self-requests via in-process loopback (#267)
- (shared) Add ServeHandle.close() and Symbol.asyncDispose
- (adapter) Unify fetch header/numeric validation across Node/Deno/Tauri
- (adapter) Unify fetch input validation across adapters
- (adapter) Unify serve/endpoint numeric caps across adapters
- (adapter) Unify compressionLevel validation + fix drainTimeout doc
- (tauri) Mobile AddressLookup bridge for iroh peer auto-dial (#310)
- (discovery) Replace swarm-discovery with standard DNS-SD (mdns-sd)
- (discovery) Add generic dnsSd advertise/browse surface
- (discovery) Add dnsSd examples, re-exports, and interop docs
- (tauri) Implement generic DNS-SD on mobile
- (discovery) Exclude self from browsePeers()
- (example) Add live discovered-peer list with copy button
- (test) Add cross-device interop Test tab (#340)
- (core) Split transport liveness from handle existence for #336
- (tauri) Clear stale mobile discovery on endpoint recovery (#336)
- (core) Add dialable_direct_address to IrohEndpoint
- (adapters) Expose discoveryInfo across shared, node, deno, tauri
- (tauri) Re-export TXT_KEY_ADDRESS and isDialableSocketAddr from guest-js
- (examples/tauri) Direct-dial testing mode, peer registry/picker, suite-runner UI
- (discovery) Advertise all routable direct addresses
- (interop) Add iroh-http result collector + harness submit
- (interop) Prefill collector id from VITE_IROH_COLLECTOR_ID
🐛 Bug Fixes
- (ci) Create local bench-results branch from FETCH_HEAD in bench archival
- Guard u64 handle precision loss at Deno rawFetch and Tauri FFI boundary (#254)
- (tauri) Drain pending handler promises on serve shutdown (#256)
- (deno) Drain serve teardown ops so leak sanitizer stays green (#257)
- (shared,core) Strip URL fragments and abort request stream on body-pipe failure
- (core) Log request path without query string
- (core) Enforce negotiated ALPN and bound request-head reads
- (deno) Verify native binary integrity before dlopen
- (ci) Pin publish to the artifact commit and verify on manual dispatch
- (tauri) Cap buffered httpi:// scheme handler response size
- (shared) Only skip finishBody on error for request uploads
- (tauri) Guard datagram base64 encode against oversize spread
- (shared) Redact SecretKey.toString() and add explicit secret-export methods
- (core) Surface stream error instead of clean EOF on over-limit bodies
- (core) Unsubscribe path-change watcher when iteration stops
- (tauri) Stop returning raw secret key from create_endpoint (#275)
- (core) Store local_service as a Weak to break the endpoint cycle (#282)
- (core) Distinguish body stream errors from BodyTooLarge
- (shared) Refine createNode secretKey typing and validate chunk size
- (core) Preserve BodyTooLarge across drain-time stream errors
- (core) Reuse watcher on repeated subscribe_path_changes (#298)
- (tauri) Add path-change subscription parity (#314)
- (tauri) Mobile mDNS browse falls back to instance name for node-id (#318)
- (ci) Build iroh-http-shared before tauri guest tests in check.sh (#321)
- (tauri) Make the plugin build for iOS/Android (#328)
- (deno) Emit browse event "type" field so discovered peers aren't mislabeled
- (examples) Declare _demo-printer._tcp Bonjour service for tauri dnssd demo
- (examples) Grant iroh-http:dns-sd capability in tauri example
- (discovery) Fix CI-blocking fmt and real DNS-SD peer bugs
- (discovery) Harden instance-label parsing, document iOS ServiceRecord gap
- (example) Make tauri example typecheck cleanly
- (release) Auto-revert CI artifact churn before version bump
- (tauri) Make Android Kotlin plugin compile
- (tauri) Make Android peers reachable and buildable
- (shared) Deliver serve response body when res.body is falsy (#338)
- (tauri) Add iOS get_dns_servers to restore Swift/Kotlin FFI parity
- (tauri) Invalidate stale pooled conns and replace stale endpoints
- (tauri-example) Whitelist _iroh-http-test._udp for iOS Bonjour
- (tauri) Base64 body chunks when the WebView rejects raw binary (#338)
- (core) Propagate bound QUIC port into advertised direct addresses (#346)
- (discovery) Drop bare port-less discovered addrs; robust iOS advertise (#346)
- (tauri) Advertise the real bound QUIC port, not the iOS placeholder (#346)
- (core) Close stale connections when serve loop is replaced
- (test) Honor skip-annotated compliance cases in mobile Test tab (#334, #340)
- (tauri) Chain wait_serve_stop after serve so restarts survive many cycles
- (core) Close active connections on graceful serve stop (drain-then-close)
- (core) Use saturating_add for DNS nameserver counter
- (shared) Preserve relay URLs in asIrohPeer (#350)
- (discovery) Advertise a dialable ip:port from the desktop advertiser (#350)
- (tauri) Harden Android DNS-SD browse for desktop dialing and rebinds (#350)
- (tauri) Serialize iOS browse/advertise id allocation (#350)
- (core) Transparently retry a fetch when a reused pooled connection was closed
- (core) Close teardown concurrency races in serve lifecycle
- (core) Gate retry on idempotency and scope pool eviction to the failed connection
- (shared) Reject non-decimal ports in isDialableSocketAddr
- (discovery) Skip link-local addresses in address selectors
- (tauri) Re-emit peer-browse rebinds under the same node id
- (tauri) Close browse/advertise sessions on terminal failure
- (core) Close residual drain-truncation + drain-wakeup races, harden pool eviction
- (examples) Restore clean Tauri example build and gate it in CI (#350)
- (addr) Treat port 1 as a placeholder and pair addresses within one IP family (#350)
- (android) Guard DNS-server lookup on API 21–22 (#350)
- (android) Use SRV fallback only without address TXT; make DNS-SD signatures injective (#350)
- (shared) Validate literal IPv4/IPv6 in isDialableSocketAddr (#350)
- (tauri) Abort lifecycle operations on stop and emit orphan/error signals once (#350)
- (tauri) Honor reconnect
auto: falseand expose an honest recovery callback - (core) Scope timeout eviction without mutating the first request
- (core) Make pool compare-and-evict atomic
- (core) Disable HTTP/1 keep-alive to enforce one exchange per bidirectional stream
- (core) Scope serve-stop signals to a restart generation
- (harness) Make interop assertions reflect actual transport outcomes
- (harness) Advertise testing mode only after serve succeeds
- (core) [breaking] Make
DiscoveryOptionsnon-exhaustive; reject all-invalid DNS nameservers - (harness) Distinguish empty peer-picker states
- (harness) Target batch runs only at active testing-mode peers
- (harness) Guard testing-mode serving and show an honest exposure warning
- (tauri) Retire orphaned DNS-SD sessions after endpoint replacement
- (harness) Drop testing-mode peer allowlist and stop instance-rename eviction
- (core) Strip IPv6 zone suffix from DNS nameservers
- (tauri) Close lifecycle ownership races (#363)
- (core) Preserve transport request ownership (#362)
- (discovery) Preserve scoped address policy (#364)
- (discovery) Own native session state (#365, #366)
- (discovery) Preserve in-flight native operations
- (discovery) Close abandoned failed updates
- (shared) Preserve inbound request headers
- (discovery) Replace stale address snapshots
- (transport) Preserve discovered relay hints
- (android) Recover stalled dns-sd resolution
- (core) Await response delivery before graceful close
- (discovery) Refresh peer records after interface changes
- (ci) Satisfy strict arithmetic lint
- (node) Close an endpoint safely while serve registration is still in flight (#374)
- (tauri) Replay early serve-stop requests after registration completes (#375)
- (core,adapters) Give path-change subscriptions token-scoped ownership and safe resubscription (#375)
- (deno) Order serve registration, fetch, stop, and endpoint close without leaking operations (#376)
- (node,tauri) Treat a removed endpoint as closed when an asynchronous close waiter starts late (#378)
💼 Other
- (node) Regenerate napi loader from pinned CLI baseline
- (deps) Bump crossbeam-epoch to 0.9.20 (RUSTSEC-2026-0204)
- (release) Generate CHANGELOG.md during release via git-cliff
- (example) Bump example tauri crate to 2.11.5 to match @tauri-apps/api
- Bump yanked spin 0.9.8/0.10.0 to 0.9.9/0.10.1
- (discovery) Make engine-only mode dependency-free
🚜 Refactor
- (deno) Use @denosaurs/plug for native lib download/cache
- (adapter) Route undeliverable-request 503s through a shared helper
- (core) Centralize fetch cancel/timeout/token cleanup (#281, #283, #284)
- (shared) [breaking] Expose secretKey only when a key is supplied
- (core) [breaking] Remove Endpoint::secret_key_bytes raw-key accessor
- (core) Extract error/crypto/encoding/addr types out of lib.rs (#198)
- (core) [breaking] Remove the inert
maxServeErrorsoption (#278) - (adapter) Consolidate fetch/serve coercion behind coerce_* seam (#289)
- (shared) Unify JS option normalisers into iroh-http-shared (#312)
- (deno) Consolidate FFI chunk-read grow/retry into one readChunk (#313)
- (adapter) Add RequestTransport seam and deliver_request (#315)
- (tauri) Route request delivery through RequestTransport (#315)
- (node) Route request delivery through RequestTransport (#315)
- (deno) Route request delivery through RequestTransport (#315)
- (tauri) Inherit iroh via workspace dependency (#310)
- (discovery) [breaking] Flatten DNS-SD API onto node.advertise/browse
- (discovery) Replace internal DnsSd class with stateless ...
v0.5.2
[0.5.2] - 2026-06-26
🚀 Features
- (examples) Add Deno mDNS advertise/browse example
🐛 Bug Fixes
- (examples) Resolve @momics/iroh-http-shared/adapter in Tauri Vite config
- (tauri) Declare permission sets with [[set]] not [[permission]] (#246)
- (tauri) Make mdns_advertise async so it runs on the Tokio runtime (#247)
- (tauri) Register session_accept, try_next_chunk, start_transport_events in ACL (#248)
- (examples) Correct Tauri mDNS advertise/browse usage
💼 Other
- (examples) Update to iroh-http 0.5.1 and refresh lockfiles
- (ci) Adopt deno fmt and enforce formatting in CI (#249)
📚 Documentation
- (shared) Document node.browse and node.advertise (#249)
- (api) Document public TS API across node/deno/tauri (#249)
- (tauri) Fix literal \n in README; make tests/http-compliance fmt scope explicit (#249)
🎨 Styling
- Format TS code with deno fmt (#249)
🧪 Testing
- (tauri) Add ACL permission-set regression guard (#246)
- (tauri) Guard command/permission-set parity (#248)
⚙️ Miscellaneous Tasks
v0.5.1
v0.5.0
[0.5.0] - 2026-06-25
🚀 Features
- (tauri) Register httpi:// as custom URI scheme
- (deps) [breaking] Migrate to iroh 1.0 (#236)
🐛 Bug Fixes
- (ci) Update napi artifacts flags for @napi-rs/cli v3
- Remove endpoint from registry after close, not before
- (node) Add local u32-to-u64 handle indirection to preserve slotmap bits
- (node) Suppress mDNS shutdown panic that fails Node test runner
- (core) Prevent stop_serve race when abort fires before rawServe resolves
- (core) Prevent close/closed race on session handle removal
- (node) Tolerate missing endpoint in stop_serve and wait_serve_stop
- (ci) Version-bump policy matched context lines in package.json diffs
- (tauri) Remove needless Ok wrap in scheme 405 response
- (ci) Version-bump policy matched package-lock.json entries
- (deps) Clear undici & js-yaml npm audit advisories (#239)
📚 Documentation
- Rewrite READMEs for clarity and dedup shared API content
⚙️ Miscellaneous Tasks
- Fix Node.js extended tests hanging on open handles
- Regen napi bindings and fix Deno shutdown races (#231)
- Release v0.5.0
v0.4.0
[0.4.0] - 2026-05-02
🚀 Features
- [breaking] Drop raw_connect from public surface
- (core) Decompress inbound request bodies on serve path
- (api) [breaking] Rename node.connect→dial, node.sessions→incoming, session_→Session::
- (api) Node.dial() accepts httpi:// URLs (closes #166)
- (compression) [breaking] Make zstd always-on, drop build-time feature flag
- (ffi) Impl Sink for BodyWriter (#174)
- (ffi) Pass StackConfig knobs through FFI — fetch timeout/decompress, serve decompress, per-call response limit (#189)
- (node) [breaking] Migrate iroh-http-node from napi v2 to v3 (#146)
🐛 Bug Fixes
- (core) Align compression docs and implementation
- (core) Replace slab with slotmap in endpoint registry
- (release) Regenerate lockfile with all platform optional deps
- (tauri) Drop "connect" from build.rs command list
- (deno) Close_all signals serve queues so SIGINT exits cleanly
- (deno) Widen FFI endpoint handle to u64 to preserve slotmap version bits
- (compression) Align min_body_bytes default with docs (1 KiB) (closes #167)
- (server) Box ServeService and collapse pipeline assembly into one chain
- (server) Add max_request_body_decoded_bytes to guard against zstd bombs (#190)
- (tauri) Rename max_request_body_bytes in ServeArgs and ServeOptions mapping (#190 follow-up)
- (server) Poll_ready logs+Pending instead of swallowing; add clippy.toml disallowed-types
- (ffi) Forward fetch knobs in Node/Deno adapters; add AC regression tests (#189)
- (ci) Narrow version-bump-policy to actual version-field diffs (#196)
- (api) Tidy stale references after #194 rename
- (shared) Export FetchOptions from adapter barrel
- (deny) Ignore hickory CVEs blocked on iroh upstream
- (audit) Ignore hickory CVEs in cargo-audit config
- (bench) Replace serve() with ffi_serve() in bench fixtures
- (shared) Export FetchOptions from public index barrel
- (node) Make start_transport_events async to satisfy tokio runtime
- (node) Make raw_serve async to run inside tokio runtime
- (bench) Clean up formatting in QUIC stream and HTTP benchmarks
- (core) Resolve P3 issues #199, #200, #201, #202, #203
- (build) Auto-repair bare lockfile stubs in check-lockfile.mjs
🚜 Refactor
- (core) Introduce unified Body newtype (slice 1 of #159)
- (core) Make RequestService infallible (slice 2 of #159)
- (core) Collapse serve-loop wiring with option_layer (slice 3 of #159)
- (core) Split RequestService into FfiDispatcher + IrohHttpService (slice 4 of #159)
- (core) Rename TowerErrorHandler → HandleLayerError + ADR-013 doc (slice 6 of #159)
- (core) Use tower_http::RequestBodyLimitLayer for request-body size enforcement
- (core) Unify response body via MapResponseBodyLayer + Body::new
- (core) Extract config and stats types out of endpoint.rs
- (server) Use tower-http NotForContentType for compression skip rules (closes #172)
- (server) Extract per-bistream pipeline assembly into server_pipeline (closes #169)
- (stream) Impl http_body::Body for BodyReader directly (refs #170)
- (endpoint) Split EndpointInner into named subsystems (closes #171)
- (server) IrohHttpService.remote_node_id is Arc, not Option
- (server_pipeline) Extract build_stack so the guardrail tests the real chain
- (core) [breaking] Slice A — introduce mod http / mod ffi split + architecture test
- (core) Slice B — typed StackConfig + shared build_stack/build_client_stack (#184)
- (core) Slice C.0 — boxed-per-layer stack composition (#185)
- (core) Slice C.1+C.3 — pure-Rust serve(svc) + RemoteNodeId extension (#185)
- (core) Move FfiDispatcher into mod ffi (Slice C.2 of #185)
- (core) Delete dead duplex CONNECT/Upgrade branch (Slice C.5, closes #180)
- (core) Typed ConnectionTracker / RequestTracker (Slice C.4, closes #178)
- (core) Collapse src/ to endpoint.rs + http/ + ffi/ (#185)
- (server) Split http/server/mod.rs to ≤200 LoC (Slice C.7 of #185)
- (core) Pure-Rust http::fetch(addr, req, &cfg) -> Result<Response, FetchError> (Slice D, closes #186)
- (client) Finish Slice D acceptance — pumps to ffi, drop hyper string match, wire timeout/decompress through ffi::fetch (#186 review)
- (ffi) Slice E — move session under mod ffi, lock canonical layout (closes #187)
- (api) Rename serve_service → serve; demote FFI serve to ffi_serve (#194)
- (endpoint) Split endpoint.rs into endpoint/ subsystem modules (ADR-014 D1, #192)
- (endpoint) Extract lifecycle.rs; update ADR-014 status note (#192 follow-up)
📚 Documentation
- (spec) Add missing public types and Rust API coverage
- (adr) Draft ADR-014 runtime architecture
- (adr) Add ADR-013 lean on the ecosystem
- (internals) Add core-assessment-2026-04
- (core) Warn FFI adapters not to truncate slotmap handles to u32
- (compression) Document zstd-only policy and runtime support (closes #173)
- (lib,session) Regroup Session re-export under FFI banner; doc rationale (#187 review MAINT-1, INFO-1, TEST-2)
- (adr-014) Record D4 perf-vs-elegance split after Slice E
- (adr-014,ffi) Record D4 resolution; backlink pumps to #174
- (adr-014,epic-182) Recalibrate D1 LoC targets; record subsystem split gap (#195)
- (guidelines) Document FFI payload field naming convention; add handle doc comments (#143)
⚡ Performance
- (build) Add .cargo/config.toml, prefer cargo nextest, document linker and sccache (closes #168)
- (node) Use zero-copy buffer transfers in napi bridge
🎨 Styling
- (core) Rustfmt fixes after Slice C.2/C.5
- Move allow attr out of doc-comment block; drop trailing blank lines
- Rustfmt + napi v3 generated bindings
🧪 Testing
- (core) Regression test for #161 u32-handle truncation
- (server_pipeline) Adding a no-op layer is one append (closes #175)
- (core) Add layered channel and QUIC micro-benchmarks
- (node) Add FFI bridge isolation benchmark
⚙️ Miscellaneous Tasks
- Gate publish on extended tests passing
- (core) Cargo fmt
- Remove reviews/ — findings filed as issues #190-#195
- (docs) Remove stale Slice E comment, fix fetch intra-doc links, delete dead apply_handle_layer_error
- (release) Gate version bumps to chore-release commits; guard version.sh against dirty trees (#196)
- Update deno.lock
- Release v0.4.0
◀️ Revert
- (release) Roll workspace back to 0.3.4 to unbreak CI
v0.3.4
[0.3.4] - 2026-04-29
🚀 Features
- (shared) [breaking] Remove legacy two-argument fetch(peer, path) overload
- (core) Validate ALPN capabilities at bind() time
- (core) Expose BodyReader cancellation contract
🐛 Bug Fixes
- (bench) Exclude close() from cold-connect measurement
- (tauri) Wrap serve params in ServeArgs struct
- Update fetch URLs to use dynamic serverId for bench tests
- Update fetch URLs to use dynamic serverId in benchmark scripts
- (ci) Align local and github checks
- (deno) Re-add ignore flag to regression #115 test
- (deno) Cancellable yield for serve loop shutdown (#115)
- (deno) Keep serve registry entry alive until close_endpoint (#149)
- (deno) Remove x-503-source debug header from production responses
💼 Other
- Upgrade iroh to 0.98.1
- (deps) Bump napi-build from 1.2.1 to 2.3.1
- (deps) Bump criterion from 0.5.1 to 0.8.2
- (deps) Bump rand from 0.9.4 to 0.10.1
🚜 Refactor
- (core) [breaking] Mechanical cleanup — units, naming, type consistency
- [breaking] Move serve config from NodeOptions to ServeOptions
- Restructure JsNodeOptions and introduce JsServeOptions for improved server configuration
📚 Documentation
- Promote httpi:// URL form as primary fetch() input
- Correct ServeOptions default values
⚡ Performance
- Redesign benchmark suite with 9 consistent scenarios
- (deno) Reduce FFI overhead from ~40x to ~1.2x native (#126)
- (node,tauri) Add try_next_chunk sync fast path for body streaming
- (tauri) Use binary IPC for body chunks instead of base64
- (shared) Profile and optimize shared TypeScript fetch layer
- (deno) Benchmark JSON vs MessagePack for FFI boundary
🧪 Testing
- (tauri) Add Rust and guest-JS test coverage
- Assert response status in 32-stream regression test (#149)
- (deno) Separate concerns in regression tests and add #149 coverage
- Modularize and unify test suite naming and structure
⚙️ Miscellaneous Tasks
- Restrict extended tests to tags and manual dispatch
- (bench) Fix benchmark workflow — rename groups and create gh-pages
- (bench) Fix gh-pages push — add auto-push and skip-fetch
- (bench) Split release/main data paths and disable fail-on-alert
- Release v0.3.4
v0.3.3
[0.3.3] - 2026-04-25
🐛 Bug Fixes
- (build) Regenerate Tauri Cargo.lock during version bump
- (ci) Revert upload-artifact to v7 (v8 does not exist)
- (ci) Match cargo "already exists" in publish idempotency check
⚙️ Miscellaneous Tasks
- Release v0.3.3
- Skip verify for tauri-plugin-iroh-http publish
- Harden release pipeline
v0.3.2
[0.3.2] - 2026-04-25
🐛 Bug Fixes
- (build) Add version to all internal path deps for cargo publish
⚙️ Miscellaneous Tasks
- Release v0.3.2
v0.3.1
[0.3.1] - 2026-04-25
🐛 Bug Fixes
- (deno) Signal shutdown and drain queue before removing serve registry
- (shared) Await body pipe before respond on handler failure
- (build) Version script now updates all iroh-http dep versions in Tauri Cargo.toml
- (build) Regenerate lockfile to fix npm ci crash on versionless optional deps
📚 Documentation
- Rename explorations/ to adr/ and add ADRs 009-012
- (tauri) Update Cargo dependency version to 0.3 in README
⚙️ Miscellaneous Tasks
- (cargo) Migrate workspace members to version.workspace inheritance
- (scripts) Replace release/ folder with interactive release.sh
- Fail publish on real errors, only skip on already-published
- Release v0.3.1