Repository navigation
Conversation
|
@fergusean is attempting to deploy a commit to the leeporic Team on Vercel. A member of the Team first needs to authorize it. |
cb64f4d to
a4d5d99
Compare
|
Great investigation, thanks Sean. fmt, clippy, the six tests and the release build all pass on Linux merged with One concern before merging: answering on the first relay candidate can drop the TURN TCP/TLS:443 candidates that arrive later. Since the SDP is non-trickle, networks that block UDP would lose that fallback. Could you wait for a TLS relay candidate (or use a short cap) before answering? |
a4d5d99 to
caa3993
Compare
|
I reran the failed iOS Kit and host workflows against the current head (
Keeping this draft unmerged until these failures are explained/fixed and the full required matrix passes. The documented physical-device / UDP-blocked TURN fallback validation is also still outstanding. |
|
Sorry, this is a WIP! I haven't had a chance to review or test, it just got pushed with my other branch updates :) |
leepokai
left a comment
There was a problem hiding this comment.
Thanks for pushing this forward! The compatibility design is right: trickle only when the phone asks and the helper advertises it, falling back to full SDP otherwise. The candidate limits/validation and the helper-replacement race tests are great too. Since it's still a WIP draft, here's what I'd need before merging:
- Signaling loss tears down working media. The candidate subscription's lifetime is tied to the whole screen session on both sides. On the host,
Subscription::drop→fail_signaling→screen.close(session)(host/src/screen/signaling.rs), and channel teardown aborts every subscription. On iOS,ScreenSignalingthrowsunreachablewhen the stream ends andScreenSessiontears down and reconnects. So a relay ⇄ LAN route change, a relay re-handshake, or a brief background trip closes a healthy P2P stream, and reconnects can exhaust their 3 attempts while the link is still down. Please treat signaling loss as fatal only until ICE connects (or both sides sendcomplete), then quietly drop the subscription and keep the media. - Rebase onto dev. There are real conflicts in
apps/screen-linux/src/main.rsandportal.rs: dev made the portal lazy (Arc<Mutex<Option<Portal>>>), addedrequestPermission, and sends status every 3 s. Thesessions.rs/link.rssplit will need to route dev's directh.sessionsdraining throughSessions::close_all()and add"trickle": trueto the new status. Regenerateproject.pbxprojwith xcodegen rather than merging it. - End-to-end validation on real devices, as noted in the PR: direct, relay, UDP-blocked TURN over TCP/TLS 443, and old/new app × host combinations.
Smaller things:
CLAUDE.mdstill says "non-trickle SDP relayed byscreenOffer";docs/architecture/file-structure.mddoesn't listapps/screen-macos-tests/.viewer.ice.expires_at = 0doubles as a "session failed" flag; an explicit state enum would be clearer.- iOS local errors are wrapped as
HostError.http(400, …). - The Linux streaming fixes (H.264 payload type, 8-bit 4:2:0,
provide-clock=false) are independent of trickle ICE; a separate PR would be easier to review and land quickly.
d8796de to
5bd6092
Compare
49a3168 to
d6c0e79
Compare
Use the viewer's H.264 payload and 8-bit 4:2:0 encoder input, negotiate the answer before capture starts, and keep PipeWire timestamps on the system clock. These fixes work with complete SDP independently of trickle ICE and are split from PR leepokai#40 as requested. Co-authored-by: Codex <codex@openai.com>
|
Code updated but I haven't tested it with a real device yet, so keeping it a draft until I do. |
53e0a20 to
888ab82
Compare
Negotiate bounded candidate streams on supported endpoints and retain connected media through signaling outages. Recover on usable routes, surface terminal channel errors, and guard helper replacement lifetimes. Independent Linux video corrections and upstream CI maintenance are separate PRs; this feature preserves the existing full-SDP fallback. Co-authored-by: Codex <codex@openai.com>
Ignore GStreamer's empty per-transport end marker before validating wire candidates. Finish the ordered exchange only when every native transport has completed gathering. Cover live viewer preservation, native global completion and strict wire validation with regressions. Co-authored-by: Codex <codex@openai.com>
Keep the narrowed remote-screen PR clean under the repository whitespace check. Test behavior is unchanged. Co-authored-by: Codex <codex@openai.com>
Construct the existing complete-SDP capture fixture with explicit non-trickle mode and its candidate buffer after integrating the upstream capture regressions. Co-authored-by: Codex <codex@openai.com>
888ab82 to
ad54454
Compare
Summary
Stream bounded, ordered ICE candidates in both directions when the phone requests trickle and the helper advertises support; retain complete-SDP negotiation otherwise. Remote screens preserve established media when their candidate signaling channel ends during a route change, relay reconnect or brief background trip. Signaling loss remains fatal before ICE connects or both directions complete. Reconnect waits for a usable host route and surfaces terminal upgrade/stopped-channel errors.
macOS and Linux helpers report guarded native connection state, and stale callbacks cannot close or revive replacement sessions. Linux ignores native empty per-transport gathering markers and sends global completion only after every transport finishes; incoming candidate validation and limits remain strict. This prevents GStreamer 1.28.2 from ending a working viewer at gathering completion.
The independent Linux H.264 payload, 8-bit 4:2:0 and system-clock capture fixes landed separately in #104. This PR retains the Tokio callback context and socket/session lifetime needed for trickle; existing keepalive behavior is unchanged. The Linux portal remains lazy, supports permission requests and sends periodic status. Desktop, terminal and Watch clients have no remote-screen viewer; host helper and permission behavior is shared.
Dependencies
#103 and #104 are merged. This head is rebased onto upstream
devatacd8998a, inheriting version 2.17.2 without a feature version bump.Validation
This PR remains draft. Remaining acceptance: the upstream iOS CI rerun, physical iPhone forced-relay/UDP-blocked TCP/TLS selected-pair measurements, and the complete old/new physical app/host/helper binary matrix. The native results above establish their stated routes and wire compatibility scopes.
What's New
zh-Hant
en-US