Skip to content

feat(webapp): play session-protocol WebM streams - #1943

Draft
irvingouj@Devolutions (irvingoujAtDevolution) wants to merge 10 commits into
feat/video-streamer-session-reconnectfrom
feat/video-streamer-js-client
Draft

feat(webapp): play session-protocol WebM streams#1943
irvingouj@Devolutions (irvingoujAtDevolution) wants to merge 10 commits into
feat/video-streamer-session-reconnectfrom
feat/video-streamer-js-client

Conversation

@irvingoujAtDevolution

@irvingoujAtDevolution irvingouj@Devolutions (irvingoujAtDevolution) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

The shadow player now understands Segment started, queued Pulls, and Stream ended so live clips can reconnect and change size on one websocket.

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com


Stack created with GitHub Stacks CLIGive Feedback 💬

@github-actions

Copy link
Copy Markdown

Let maintainers know that an action is required on their side

  • Add the label release-required Please cut a new release (Devolutions Gateway, Devolutions Agent, Jetsocat, PowerShell module) when you request a maintainer to cut a new release (Devolutions Gateway, Devolutions Agent, Jetsocat, PowerShell module)

  • Add the label release-blocker Follow-up is required before cutting a new release if a follow-up is required before cutting a new release

  • Add the label publish-required Please publish libraries (`Devolutions.Gateway.Utils`, OpenAPI clients, etc) when you request a maintainer to publish libraries (Devolutions.Gateway.Utils, OpenAPI clients, etc.)

  • Add the label publish-blocker Follow-up is required before publishing libraries if a follow-up is required before publishing libraries

@irvingoujAtDevolution

Copy link
Copy Markdown
Contributor Author

Implementation notes:

  • shadow-player parses Segment started JSON, implicit segment end, and Stream ended.
  • Pull is sent before MSE append so the Gateway can pipeline the next chunk.
  • Playback controls and clip list are isolated so resolution/clip changes can swap SourceBuffers.
  • recording-player WebM streamer is wired to the same protocol.

Note

LLM-assisted content (no human feedback).

The original streamer treated incomplete tags as UnexpectedEOF and
rewound the file. ebml-iterable 0.7 keeps those tags pending, so
live recordings can append without seek/skip.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
TagDecoder reports incomplete input as None, not UnexpectedEOF.
Retrying InvalidTagData just stalled on real corruption.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
A parse error stays at the same offset. Swallowing it while
draining already-recorded tags hid corruption.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Gateway WebM shadowing now consumes a recording event stream so
clips can reconnect and change size. The Start/Pull codes stay
valid for existing clients. Push disconnect marks the session
ended so viewers receive StreamEnded.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep one response per Pull while recordings roll over to new WebM clips.

Recover truncated tails and distinguish reconnectable capture disconnects from terminal recording end.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The shadow player now understands Segment started, queued Pulls,
and Stream ended so live clips can reconnect and change size on
one websocket.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Queue metadata-delimited WebM clips as independent playback sources.

Serialize SourceBuffer completion and terminal events so delayed segments cannot be skipped.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@irvingoujAtDevolution

Copy link
Copy Markdown
Contributor Author

Corrected MSRDP producer-parity validation:

  • Final bundle: 2dce10ecef14d68c0ad7b7532419ab9a342198017603ed2ae6116e511ebf9f9b
  • Gateway: 8dfc9ff39389419241767e8e8d1bbef02926371c
  • Fixture: 33b853540b000c48667edb9dbc88964365f2bb6f
  • MsRdpEx: 2026.8.20.1
  • LIVE-005 MSRDP/Cadeau → JavaScript passed on IT-HELP-RDM: run 815bb2cea28a42b08a8e774082cdf9b5

The corrected fixture enables recording before connect, keeps one ActiveX control and stable pipe across reconnects, and uses RDM's quality/frame-rate settings. Both Gateway shadow segments decode with the expected dimensions and marker progression. The remaining LIVE-006 failure is downstream: the C# MediaFoundation player advances its timeline but renders black frames.

Note

Human-tuned, LLM-assisted content.

The shadow player now understands Segment started, queued Pulls,
and Stream ended so live clips can reconnect and change size on
one websocket.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Queue metadata-delimited WebM clips as independent playback sources.

Serialize SourceBuffer completion and terminal events so delayed segments cannot be skipped.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant