Callbewijs macOS: uitgaande media via de offer-transceivers (#2541) #2586

Merged
brenno merged 1 commit from docs/callbewijs-macos-2541 into main 2026-10-25 14:59:03 +00:00
Owner

Samenvatting

De echte macOS-proef (#2541) met een release-artefact tegen een onafhankelijke browser-deelnemer wees drie defecten aan die fake- en wire-tests niet vingen — allemaal in deze change opgelost en daarna eind-tot-eind bewezen.

Defecten + oplossing

  1. Geen uitgaande media — de JVB-offer maakte eigen recvonly-transceivers aan terwijl twee vooraf gecreëerde SendRecv-transceivers wees bleven (dir=[recvonly,recvonly]). Nu adopt applyRemoteOffer de offer-transceivers en zet ze vóór het antwoord op SendRecv; tracks koppelen ná de offer via replaceTrack.
  2. Source-add ging stilletjes niet uit — sender.parameters is een creatie-cache op de native binding. localSource() leest nu parameters → a=ssrc/FID/msid uit het antwoord → outbound-rtp/legacy ssrc-stats (begrensd pollen, singleAttempt voor gemuteerde bronnen). Bronnen zonder ssrc wachten in _unannounced; announcePendingSources() herprobeert bij enable/ICE-live; een actieve bron die blijft ontbreken is een zichtbare MeetingErrorEvent. De wire-vorm volgt nu de echte capture: álle ssrc's, FID-groepen, msid, videoType ('camera'/'desktop').
  3. Preflight-dialoog hing — _preflightNow miste een error-boundary; een dode server hing op "Verbinden…" voor altijd. Nu de getypeerde fout, plus _resolve wist de oude foutregel.

Bewijs (release-artefact, niet profile/debug)

  • Artefact: build/macos/Build/Products/Release/OciDeck.app v0.7.0, geverifieerde signatuur
  • Platform: macOS 27.0.1 arm64, Flutter 3.47.7/Dart 3.13.5, flutter_webrtc 1.5.1
  • Tegenpartij: Chrome 156, jitsi-meet-web van de testbed (stable-11248, digests in evidence/macos-2541/images.txt)
  • Uitkomst: remoteTracks:"audio:live:,video:live:camera" beide richtingen; schermdeling als screenshare:live:desktop; schone leave (Removed participant); reconnect <10 s; mislukte join met getypeerde fout; volledige TCC-keten met eigen usage-teksten
  • Productmatrix in docs/design/NATIVE_CALLS.md §7.1; ingevuld formulier lokaal in testbed/jitsi-meet/evidence/macos-2541/ (gitignored; rapport + beelden komen in het issue)

Poort

make check groen op cbc77549a (format, analyze --fatal-infos, conventies, volledige testsuite, dekking, goldens). make check-secrets en make sast: 0 vondsten.

Testplan

  • make check op de merge-commit-kandidaat
  • make check-secrets + make sast
  • Echte tweepersoonscall release↔Chrome (zelfde code)

Generated with Devin

## Samenvatting De echte macOS-proef (#2541) met een release-artefact tegen een onafhankelijke browser-deelnemer wees drie defecten aan die fake- en wire-tests niet vingen — allemaal in deze change opgelost en daarna eind-tot-eind bewezen. ### Defecten + oplossing 1. **Geen uitgaande media** — de JVB-offer maakte eigen `recvonly`-transceivers aan terwijl twee vooraf gecreëerde `SendRecv`-transceivers wees bleven (`dir=[recvonly,recvonly]`). Nu adopt `applyRemoteOffer` de offer-transceivers en zet ze vóór het antwoord op `SendRecv`; tracks koppelen ná de offer via `replaceTrack`. 2. **Source-add ging stilletjes niet uit** — `sender.parameters` is een creatie-cache op de native binding. `localSource()` leest nu parameters → `a=ssrc`/`FID`/`msid` uit het antwoord → `outbound-rtp`/legacy `ssrc`-stats (begrensd pollen, `singleAttempt` voor gemuteerde bronnen). Bronnen zonder ssrc wachten in `_unannounced`; `announcePendingSources()` herprobeert bij enable/ICE-live; een actieve bron die blijft ontbreken is een zichtbare `MeetingErrorEvent`. De wire-vorm volgt nu de echte capture: álle ssrc's, FID-groepen, `msid`, `videoType` ('camera'/'desktop'). 3. **Preflight-dialoog hing** — `_preflightNow` miste een error-boundary; een dode server hing op "Verbinden…" voor altijd. Nu de getypeerde fout, plus `_resolve` wist de oude foutregel. ### Bewijs (release-artefact, niet profile/debug) - Artefact: `build/macos/Build/Products/Release/OciDeck.app` v0.7.0, geverifieerde signatuur - Platform: macOS 27.0.1 arm64, Flutter 3.47.7/Dart 3.13.5, flutter_webrtc 1.5.1 - Tegenpartij: Chrome 156, jitsi-meet-web van de testbed (`stable-11248`, digests in `evidence/macos-2541/images.txt`) - Uitkomst: `remoteTracks:"audio:live:,video:live:camera"` beide richtingen; schermdeling als `screenshare:live:desktop`; schone leave (`Removed participant`); reconnect <10 s; mislukte join met getypeerde fout; volledige TCC-keten met eigen usage-teksten - Productmatrix in `docs/design/NATIVE_CALLS.md` §7.1; ingevuld formulier lokaal in `testbed/jitsi-meet/evidence/macos-2541/` (gitignored; rapport + beelden komen in het issue) ### Poort `make check` groen op `cbc77549a` (format, analyze --fatal-infos, conventies, volledige testsuite, dekking, goldens). `make check-secrets` en `make sast`: 0 vondsten. #### Testplan - [x] `make check` op de merge-commit-kandidaat - [x] `make check-secrets` + `make sast` - [x] Echte tweepersoonscall release↔Chrome (zelfde code) Generated with [Devin](https://devin.ai)
De echte macOS-proef met een onafhankelijke browser-tegenpartij wees drie
defecten aan die fake- en wire-tests niet vingen:

- Het antwoord onderhandelde beide m-lines als recvonly: de JVB-offer
  maakte eigen transceivers aan terwijl twee vooraf gecreeerde SendRecv-
  transceivers wees bleven. Nu adopt de binding de offer-transceivers en
  zet ze voor het antwoord op SendRecv; tracks koppelen na de offer via
  replaceTrack.
- sender.parameters bleek een creatie-cache op de native binding; de
  source-add vond daardoor nooit een ssrc en ging stilletjes niet uit.
  localSource() leest nu parameters -> a=ssrc/FID/msid uit het antwoord ->
  outbound-rtp/legacy-ssrc stats (begrensd pollen, singleAttempt voor een
  gemuteerde bron); sources zonder ssrc wachten in _unannounced en worden
  opnieuw aangekondigd zodra ze gaan zenden, met een zichtbare fout alleen
  voor een actieve bron die blijft ontbreken.
- De source-add volgde de echte wire niet: nu alle sender-ssrc's, FID-
  groepen, msid en videoType (camera/desktop) zoals de referentieclient.
- De preflight-dialoog miste een error-boundary: een dode server hing op
  "Verbinden..." voor altijd. Nu de getypeerde fout, plus _resolve wist de
  oude foutregel bij een nieuwe link.

Bewezen op het release-artefact (v0.7.0, macOS 27.0.1 arm64, Jitsi
stable-11248, Chrome 156): tweepersoonscall met tweeweg live audio en
video, mute/camera, schermdelen zichtbaar als desktop-bron, leave +
reconnect, mislukte join met getypeerde melding en de volledige TCC-
keten. Productmatrix in NATIVE_CALLS.md par. 7.1; bewijsbundel lokaal in
testbed/jitsi-meet/evidence/macos-2541 (gitignored, rapport in het issue).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit f500131848 into main 2026-10-25 14:59:03 +00:00
Sign in to join this conversation.
No description provided.