You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The DNS-SD standardization landed in #330 (merged to main as 3ba1ff3) includes mobile-native changes to the Tauri plugin that no CI job compiles or runs — there is no iOS/Android runner. Two of those changes fix real defects and are currently review-only, so their correctness rests entirely on code inspection. We need on-device verification that DNS-SD advertise/browse actually works end-to-end on iOS and Android, and specifically that the two mobile fixes behave as intended.
Evidence
Landed in #330, untested by CI (no mobile toolchain in the pipeline):
Android — serialized resolve queue (packages/iroh-http-tauri/android/src/main/java/com/iroh/http/IrohHttpPlugin.kt): NsdManager.resolveService() allows only one outstanding resolve; concurrent calls previously failed with FAILURE_ALREADY_ACTIVE and onResolveFailed was a silent no-op, dropping records. Fixed by a shared enqueueResolve/drainResolveQueue that serializes resolves across both the peer (browse_peers_start) and generic (browse_start) paths.
iOS — re-emit on record change (packages/iroh-http-tauri/ios/Sources/IrohHttpPlugin.swift): the generic browse_start dedup was changed from a one-shot Set<String> to [String: DnsSdRecordSnapshot] so a known instance whose TXT/port/addrs change is re-surfaced instead of being suppressed forever.
The broader #[cfg(mobile)] command paths, run_mobile_plugin string contracts, and the Swift @objc / Kotlin @Command method names are also only review-verified.
Related: #333 (CI guardrails: native compile + FFI string-parity) — that catches build/contract drift; this issue is about runtime behavior on hardware.
Workaround: desktop (Rust mdns-sd) and the Node/Deno adapters are exercised by CI and verified, so non-mobile usage is unaffected. That's why this is P2 rather than P1.
Remediation
Run a manual on-device pass (physical devices preferred; simulators/emulators as a first cut) covering:
Advertise → discover across platforms: advertise from desktop, discover on iOS and Android (and the reverse). Confirm the peer's nodeId resolves and auto-dial succeeds.
Android concurrency: bring several services/peers up simultaneously and confirm none are dropped (validates the resolve queue; pre-fix this silently lost records).
iOS re-emit: change a live service's TXT/port and confirm iOS re-surfaces the updated record rather than suppressing it.
Generic surface: exercise node.advertise() / node.browse() (non-peer service) on both platforms; note the documented iOS metadata-only limitation (port: 0, host: undefined).
Capture results (device/OS versions, pass/fail per step) and file follow-up bugs for any divergence.
Acceptance criteria
iOS ↔ desktop and Android ↔ desktop advertise/discover verified on-device, with successful auto-dial.
browsePeers() reports correct isActive transitions on the Tauri adapter on both platforms.
Android multi-peer burst confirmed to drop zero records (resolve queue validated).
iOS confirmed to re-emit on a TXT/port change of a known instance.
Generic advertise()/browse() exercised on both platforms; iOS metadata-only limitation confirmed to match the documented behavior.
Results recorded in this issue (device/OS matrix); any failures filed as linked follow-up issues.
Summary
The DNS-SD standardization landed in #330 (merged to
mainas3ba1ff3) includes mobile-native changes to the Tauri plugin that no CI job compiles or runs — there is no iOS/Android runner. Two of those changes fix real defects and are currently review-only, so their correctness rests entirely on code inspection. We need on-device verification that DNS-SD advertise/browse actually works end-to-end on iOS and Android, and specifically that the two mobile fixes behave as intended.Evidence
Landed in #330, untested by CI (no mobile toolchain in the pipeline):
packages/iroh-http-tauri/android/src/main/java/com/iroh/http/IrohHttpPlugin.kt):NsdManager.resolveService()allows only one outstanding resolve; concurrent calls previously failed withFAILURE_ALREADY_ACTIVEandonResolveFailedwas a silent no-op, dropping records. Fixed by a sharedenqueueResolve/drainResolveQueuethat serializes resolves across both the peer (browse_peers_start) and generic (browse_start) paths.packages/iroh-http-tauri/ios/Sources/IrohHttpPlugin.swift): the genericbrowse_startdedup was changed from a one-shotSet<String>to[String: DnsSdRecordSnapshot]so a known instance whose TXT/port/addrs change is re-surfaced instead of being suppressed forever.#[cfg(mobile)]command paths,run_mobile_pluginstring contracts, and the Swift@objc/ Kotlin@Commandmethod names are also only review-verified.Related: #333 (CI guardrails: native compile + FFI string-parity) — that catches build/contract drift; this issue is about runtime behavior on hardware.
Impact
mdns-sd) and the Node/Deno adapters are exercised by CI and verified, so non-mobile usage is unaffected. That's why this is P2 rather than P1.Remediation
Run a manual on-device pass (physical devices preferred; simulators/emulators as a first cut) covering:
nodeIdresolves and auto-dial succeeds.browsePeers()liveness: confirm discovered peers reportisActive: trueon arrival andfalseon expiry (the F-004:cancel_readerdoes not cancel already in-flightnext_chunkawait #10 tagged-event fix) on the Tauri adapter specifically.node.advertise()/node.browse()(non-peer service) on both platforms; note the documented iOS metadata-only limitation (port: 0,host: undefined).Capture results (device/OS versions, pass/fail per step) and file follow-up bugs for any divergence.
Acceptance criteria
browsePeers()reports correctisActivetransitions on the Tauri adapter on both platforms.advertise()/browse()exercised on both platforms; iOS metadata-only limitation confirmed to match the documented behavior.