ZyrisDocs
Protocol specification

Video

How a video tool sets up a WebRTC session with in-band signaling, and the MJPEG fallback.

Media must not traverse the server. A video tool call establishes a session; WebRTC signaling rides in-band as symmetric notes; media flows peer-to-peer, or through TURN.

  1. Establish. req { method: "screen.live", params: { source, max_height } } → res { video_session_id, codecs: ["h264/baseline", "vp8"], ice_servers: [ ] }. codecs is a list of what is possible; the final choice happens in SDP.
  2. Signal, correlated by video_session_id:
    • note webrtc.signal { video_session_id, signal: { type: "offer" | "answer", sdp } }
    • trickle ICE: signal: { type: "ice", candidate, mid }
  3. Tear down with note webrtc.close { video_session_id } from either side.
  4. Fallback (feature video-mjpeg): a uni_stream tool sending one timestamped JPEG per chunk. It is a degraded path and is labelled as such in the announcement.

Cross-NAT video needs TURN infrastructure. Until Attacca operates TURN, WebRTC works only where a direct or STUN path exists. The Rust macro does not yet accept video tools.