Files
Piik/tests/fixtures/wire-samples.json
T
AAA cdd503a98d feat: improve feedback and App lifecycle reliability (#404)
Waiting feedback and tooltips now share consistent presentation lifecycles, while App shutdown and native-media operation failures stay within their owning session or output. This phase also consolidates the project standards and publishes searchable English/Chinese reader documentation alongside the homepage.

Validation: repository hygiene and Markdown links; TypeScript, 971 Web tests and production build; website/documentation build; Go tests, vet and Windows/Linux builds with Windows capture checks; desktop/mobile UI and documentation review. Linux race, container and three-platform packaging checks run in the release pipeline. Physical macOS/Linux capture and broader network coverage remain outside this acceptance.

The owner approved v1.4.0 publication. Existing empty-source, Windows URL-handler and public-invitation timeout reports remain tracked; this release makes no claim to resolve those device/network reports. The Windows capture-border request is next-phase work.

## Release notes

### 中文

这是一次以稳定性和交互一致性为重点的功能更新。等待与提示更有反馈,App 启动、原生分享和连接恢复的边界处理得到改善,使用与部署指南也有了统一的文档中心。

#### 新增与改进

- 欢迎语、等待短句和六类可轮换的标签页标题共用一致的显示规则。等待短句从一开始就出现,并在停留时轮换;明确的错误与操作提示保持固定。
- 房间准入等漫画采用更克制的小人物与循环动效。改进 tooltip 的定位与指向,减少对播放器的遮挡;状态、图标和文案保持相同含义。
- 新增中英文文档中心,提供搜索、手机目录、使用教程、问题排查与自部署指南。官网 FAQ 聚焦开始使用前的问题,详细排查统一进入文档中心。

#### 修复

- 使用 `--local` 启动不再清空已保存的 Piik 站点地址。
- 打开系统浏览器不再阻塞 App 的退出流程;改进临时公网邀请、终端和诊断导出在关闭时的清理及错误反馈。
- 单条原生媒体连接的操作失败不再被误判为整个会话的协议错误;重复停止分享保持幂等。
- 修复连接替换、转发停止和异常退出时的部分资源清理问题,避免迟到结果影响当前连接。
- Windows 原生采集中,单个输出的编码错误只结束对应输出;共享采集源本身的错误仍会结束分享。

#### 升级与已知边界

本次保持现有协议版本与配置格式。更新 App 或自托管 Server 后,重新打开页面即可使用对应的新界面。

个别设备的空窗口列表、Windows 浏览器启动异常,以及 Linux 编码输出的故障隔离仍在跟进。macOS/Linux 的物理采集和更广泛的公网网络场景仍需实机验证;本次不宣称这些问题已经解决,也不承诺所有网络都能直连。

### English

This feature update focuses on stability and consistent feedback. Waiting states are easier to follow, App startup and native sharing handle several failure cases more reliably, and the new documentation center brings usage and deployment guides together.

#### New and improved

- Welcome lines, waiting captions and six groups of rotating tab titles follow one presentation lifecycle. Waiting captions appear immediately and rotate while visible; actionable errors and instructions remain fixed.
- Room-admission comics use restrained characters and looping motion. Tooltips point more accurately to their controls and interfere less with the player, with consistent meanings across illustrations, icons and copy.
- A new English/Chinese documentation center includes search, mobile navigation, usage guides, troubleshooting and self-hosting. The homepage FAQ covers questions before getting started and links to the documentation for detailed help.

#### Fixes

- Starting with `--local` no longer clears a saved Piik site address.
- Opening the system browser no longer blocks App shutdown. Temporary public invitations, the terminal and diagnostic exports handle cleanup and exit errors more consistently.
- An operation failure on one native media connection no longer becomes a protocol failure for the entire session. Repeated stop-sharing requests are safe.
- Fixed cleanup cases during connection replacement, relay shutdown and unexpected exits, preventing late results from affecting the current connection.
- On Windows, an encoder failure for one native output stops that output only. A failure of the shared capture source still ends sharing.

#### Updating and known limits

Protocol versions and configuration formats are unchanged. After updating the App or your self-hosted Server, reopen the page to use its updated interface.

Empty source lists on some devices, Windows browser-launch failures and Linux output-failure isolation remain under investigation. Physical macOS/Linux capture and broader public-network coverage still need device testing; this update does not claim to resolve those cases or guarantee a direct connection on every network.
2026-09-16 13:13:06 +08:00

1065 lines
61 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"constants": {
"signalingProtocol": "piik-v23",
"maxViewersPerRoomLimit": 20,
"maxParticipantsPerRoomLimit": 21,
"maxSignalBytes": 65536,
"roomCodeLength": 4,
"maxMediaRouteRevision": 9007199254740991,
"maxIceServerUrls": 8,
"maxNatPredictionAuxiliaryStunUrls": 2,
"maxViewerQualityEvidenceBytes": 2048,
"viewerQualityEvidenceIntervalMs": 2000,
"viewerQualityEvidenceExpiryMs": 5000,
"persistentNativeEdgeDegradedWindows": 3,
"maxDisplayNameCodePoints": 24,
"defaultViewerDisplayName": "观众",
"defaultHostDisplayNamePrefix": "房主",
"minViewerPasswordLength": 1,
"maxViewerPasswordLength": 64,
"defaultEndpointMediaCopyCapacity": 2,
"maxEndpointMediaCopyCapacity": 3,
"signalCloseCodeServiceRestart": 1012,
"signalCloseCodeSessionReplaced": 4001,
"signalCloseCodeClientReconnect": 4002,
"signalCloseCodeAuthenticationFailed": 4003,
"signalCloseCodeViewerAccessRevoked": 4004,
"defaultQualitySettings": {
"resolution": "1080p",
"maxFramerate": 30,
"maxBitrate": 5000000,
"degradationPreference": "balanced",
"screenAudioQuality": "music"
},
"defaultRoutePolicy": {
"peerOnly": false,
"topologyOptimization": true,
"natPrediction": false
}
},
"clientMessages": [
{
"name": "authenticate-host-minimal",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"clientId\":\"client_12345678\"}",
"valid": true
},
{
"name": "authenticate-host-full",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"clientId\":\"client_12345678\",\"shareGeneration\":\"share_generation_12345678\",\"sharingPaused\":false,\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\"},\"routePolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false},\"viewerPresence\":true,\"displayName\":\"小明\"}",
"valid": true
},
{
"name": "authenticate-host-carries-viewer-grant",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"clientId\":\"client_12345678\",\"viewerGrant\":\"bbbbbbbbbbbbbbbbbbbbbg\"}",
"valid": false
},
{
"name": "authenticate-host-carries-viewer-password",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"clientId\":\"client_12345678\",\"viewerPassword\":\"easy-password\"}",
"valid": false
},
{
"name": "authenticate-host-short-token",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"short\",\"clientId\":\"client_12345678\"}",
"valid": false
},
{
"name": "authenticate-host-unknown-key",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"clientId\":\"client_12345678\",\"admin\":true}",
"valid": false
},
{
"name": "authenticate-viewer-minimal",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\"}",
"valid": true
},
{
"name": "authenticate-viewer-full",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"viewerGrant\":\"bbbbbbbbbbbbbbbbbbbbbg\",\"viewerPassword\":\"easy-password\",\"displayName\":\"Café 朋友\",\"viewerPresence\":true}",
"valid": true
},
{
"name": "authenticate-viewer-carries-host-token",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"}",
"valid": false
},
{
"name": "authenticate-viewer-carries-route-policy",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"routePolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false}}",
"valid": false
},
{
"name": "authenticate-viewer-malformed-grant",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"viewerGrant\":\"bbbbbbbbbbbbbbbbbbbbb\"}",
"valid": false
},
{
"name": "authenticate-viewer-grant-bad-final-character",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"viewerGrant\":\"bbbbbbbbbbbbbbbbbbbbbb\"}",
"valid": false
},
{
"name": "authenticate-viewer-unknown-capabilities",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"capabilities\":{\"peerIceTurn\":true}}",
"valid": false
},
{
"name": "authenticate-viewer-wrong-protocol",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"invalid-protocol\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\"}",
"valid": false
},
{
"name": "authenticate-viewer-missing-protocol",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\"}",
"valid": false
},
{
"name": "authenticate-viewer-leading-zero-room",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"0123\",\"role\":\"viewer\",\"clientId\":\"client_12345678\"}",
"valid": false
},
{
"name": "authenticate-viewer-long-room",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"11111\",\"role\":\"viewer\",\"clientId\":\"client_12345678\"}",
"valid": false
},
{
"name": "authenticate-viewer-noncanonical-display-name",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"displayName\":\" Café \"}",
"valid": false
},
{
"name": "authenticate-viewer-display-name-too-long",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"displayName\":\"名名名名名名名名名名名名名名名名名名名名名名名名名\"}",
"valid": false
},
{
"name": "authenticate-viewer-display-name-at-limit",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"displayName\":\"名名名名名名名名名名名名名名名名名名名名名名名名\"}",
"valid": true
},
{
"name": "authenticate-viewer-display-name-bidi-override",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"displayName\":\"a‮b\"}",
"valid": false
},
{
"name": "authenticate-viewer-display-name-newline",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"displayName\":\"a\\nb\"}",
"valid": false
},
{
"name": "authenticate-viewer-null-display-name",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"displayName\":null}",
"valid": false
},
{
"name": "authenticate-unknown-role",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"relay\",\"clientId\":\"client_12345678\"}",
"valid": false
},
{
"name": "signaling-challenge-max",
"schema": "client",
"json": "{\"type\":\"signaling-challenge\",\"sequence\":9007199254740991}",
"valid": true
},
{
"name": "signaling-challenge-negative",
"schema": "client",
"json": "{\"type\":\"signaling-challenge\",\"sequence\":-1}",
"valid": false
},
{
"name": "signaling-challenge-fractional",
"schema": "client",
"json": "{\"type\":\"signaling-challenge\",\"sequence\":1.5}",
"valid": false
},
{
"name": "signaling-challenge-above-safe-integer",
"schema": "client",
"json": "{\"type\":\"signaling-challenge\",\"sequence\":9007199254740992}",
"valid": false
},
{
"name": "signaling-challenge-extra-key",
"schema": "client",
"json": "{\"type\":\"signaling-challenge\",\"sequence\":1,\"roomId\":\"1234\"}",
"valid": false
},
{
"name": "signal-description",
"schema": "client",
"json": "{\"type\":\"signal\",\"targetPeerId\":\"viewer_12345678\",\"payload\":{\"kind\":\"description\",\"connectionId\":\"connection_12345678\",\"description\":{\"type\":\"offer\",\"sdp\":\"v=0\\r\\n\"}}}",
"valid": true
},
{
"name": "signal-candidate-end",
"schema": "client",
"json": "{\"type\":\"signal\",\"payload\":{\"kind\":\"candidate\",\"connectionId\":\"connection_12345678\",\"candidate\":null}}",
"valid": true
},
{
"name": "signal-candidate-full",
"schema": "client",
"json": "{\"type\":\"signal\",\"payload\":{\"kind\":\"candidate\",\"connectionId\":\"connection_12345678\",\"candidate\":{\"candidate\":\"candidate:1 1 udp 1 203.0.113.1 50000 typ host\",\"sdpMid\":\"0\",\"sdpMLineIndex\":0,\"usernameFragment\":null}}}",
"valid": true
},
{
"name": "signal-empty-sdp",
"schema": "client",
"json": "{\"type\":\"signal\",\"payload\":{\"kind\":\"description\",\"connectionId\":\"connection_12345678\",\"description\":{\"type\":\"offer\",\"sdp\":\"\"}}}",
"valid": false
},
{
"name": "signal-unknown-payload-kind",
"schema": "client",
"json": "{\"type\":\"signal\",\"payload\":{\"kind\":\"renegotiate\",\"connectionId\":\"connection_12345678\"}}",
"valid": false
},
{
"name": "signal-missing-candidate-key",
"schema": "client",
"json": "{\"type\":\"signal\",\"payload\":{\"kind\":\"candidate\",\"connectionId\":\"connection_12345678\"}}",
"valid": false
},
{
"name": "restart-request",
"schema": "client",
"json": "{\"type\":\"restart-request\",\"connectionId\":\"connection_12345678\",\"rebuild\":true}",
"valid": true
},
{
"name": "restart-request-targeted",
"schema": "client",
"json": "{\"type\":\"restart-request\",\"targetPeerId\":\"parent_12345678\",\"connectionId\":\"connection_12345678\",\"rebuild\":false}",
"valid": true
},
{
"name": "restart-request-missing-rebuild",
"schema": "client",
"json": "{\"type\":\"restart-request\",\"connectionId\":\"connection_12345678\"}",
"valid": false
},
{
"name": "set-quality-settings",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\"}}",
"valid": true
},
{
"name": "set-quality-settings-with-audio",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\"}}",
"valid": true
},
{
"name": "set-quality-settings-legacy-codec",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"videoCodec\":\"vp8\"}}",
"valid": false
},
{
"name": "set-quality-settings-framerate-below-floor",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":14,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\"}}",
"valid": false
},
{
"name": "set-quality-settings-fractional-bitrate",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":5000000.5,\"degradationPreference\":\"maintain-resolution\"}}",
"valid": false
},
{
"name": "set-quality-settings-missing-framerate",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\"}}",
"valid": false
},
{
"name": "set-quality-settings-unknown-resolution",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"2160p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\"}}",
"valid": false
},
{
"name": "relay-capacity-max",
"schema": "client",
"json": "{\"type\":\"relay-capacity\",\"downstreamEdges\":3}",
"valid": true
},
{
"name": "relay-capacity-zero",
"schema": "client",
"json": "{\"type\":\"relay-capacity\",\"downstreamEdges\":0}",
"valid": true
},
{
"name": "relay-capacity-over-limit",
"schema": "client",
"json": "{\"type\":\"relay-capacity\",\"downstreamEdges\":4}",
"valid": false
},
{
"name": "relay-capacity-extra-key",
"schema": "client",
"json": "{\"type\":\"relay-capacity\",\"downstreamEdges\":1,\"score\":100}",
"valid": false
},
{
"name": "route-ready",
"schema": "client",
"json": "{\"type\":\"route-ready\",\"revision\":7,\"phase\":\"prepare\"}",
"valid": true
},
{
"name": "route-ready-quality-approved",
"schema": "client",
"json": "{\"type\":\"route-ready\",\"revision\":7,\"phase\":\"prepare\",\"qualityApproved\":true}",
"valid": true
},
{
"name": "route-ready-quality-approved-false",
"schema": "client",
"json": "{\"type\":\"route-ready\",\"revision\":7,\"phase\":\"prepare\",\"qualityApproved\":false}",
"valid": false
},
{
"name": "route-ready-negative-revision",
"schema": "client",
"json": "{\"type\":\"route-ready\",\"revision\":-1,\"phase\":\"prepare\"}",
"valid": false
},
{
"name": "route-transport-connected",
"schema": "client",
"json": "{\"type\":\"route-transport-connected\",\"revision\":7,\"connectionId\":\"connection_12345678\"}",
"valid": true
},
{
"name": "route-transport-connected-missing-connection",
"schema": "client",
"json": "{\"type\":\"route-transport-connected\",\"revision\":7}",
"valid": false
},
{
"name": "route-media-unavailable",
"schema": "client",
"json": "{\"type\":\"route-media-unavailable\",\"revision\":7}",
"valid": true
},
{
"name": "route-media-unavailable-negative",
"schema": "client",
"json": "{\"type\":\"route-media-unavailable\",\"revision\":-1}",
"valid": false
},
{
"name": "route-failed",
"schema": "client",
"json": "{\"type\":\"route-failed\",\"revision\":7,\"phase\":\"active\",\"connectionId\":null}",
"valid": true
},
{
"name": "route-failed-missing-connection",
"schema": "client",
"json": "{\"type\":\"route-failed\",\"revision\":7,\"phase\":\"active\"}",
"valid": false
},
{
"name": "refresh-sfu-max-revision",
"schema": "client",
"json": "{\"type\":\"refresh-sfu\",\"revision\":9007199254740991}",
"valid": true
},
{
"name": "refresh-sfu-fractional",
"schema": "client",
"json": "{\"type\":\"refresh-sfu\",\"revision\":1.5}",
"valid": false
},
{
"name": "request-route-diagnostic",
"schema": "client",
"json": "{\"type\":\"request-route-diagnostic\"}",
"valid": true
},
{
"name": "request-route-diagnostic-extra-key",
"schema": "client",
"json": "{\"type\":\"request-route-diagnostic\",\"roomId\":\"1234\"}",
"valid": false
},
{
"name": "viewer-quality-evidence",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": true
},
{
"name": "viewer-quality-evidence-null-freeze",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":null,\"freezeDurationMsDelta\":null,\"pauseCountDelta\":null,\"pauseDurationMsDelta\":null,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": true
},
{
"name": "viewer-quality-evidence-vp8",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/VP8\",\"codecProfile\":null,\"codecParameters\":\"max-fr=60; max-fs=8160\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": true
},
{
"name": "viewer-quality-evidence-unknown-codec",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/unknown\",\"codecProfile\":null,\"codecParameters\":null,\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": true
},
{
"name": "viewer-quality-evidence-missing-path",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": false
},
{
"name": "viewer-quality-evidence-lonely-height",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":null,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": false
},
{
"name": "viewer-quality-evidence-lonely-width",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":null,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": false
},
{
"name": "viewer-quality-evidence-noncanonical-parameters",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"sprop-parameter-sets=deadbeef\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": false
},
{
"name": "viewer-quality-evidence-window-too-short",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":999,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": false
},
{
"name": "viewer-quality-evidence-extra-guard-key",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0,\"peerId\":\"viewer_12345678\"},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": false
},
{
"name": "viewer-quality-evidence-device-fingerprint",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\",\"decoderImplementation\":\"device-specific-decoder\"}}",
"valid": false
},
{
"name": "viewer-quality-evidence-freeze-above-safe-integer",
"schema": "client",
"json": "{\"type\":\"viewer-quality-evidence\",\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":9007199254740992,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}",
"valid": false
},
{
"name": "sender-quality-evidence",
"schema": "client",
"json": "{\"type\":\"sender-quality-evidence\",\"childPeerId\":\"viewer_12345678\",\"connectionId\":\"connection_12345678\",\"rtpStatsId\":\"rtp-stats-1\",\"trackIdentifier\":\"track-1\",\"sampleTimestampMs\":2000,\"routeRevision\":3,\"state\":\"degraded\",\"diagnostics\":{\"natTraversalPath\":\"ordinary\",\"reason\":\"bandwidth\",\"framesPerSecond\":24,\"bitrateKbps\":1500}}",
"valid": true
},
{
"name": "sender-quality-evidence-unknown-state",
"schema": "client",
"json": "{\"type\":\"sender-quality-evidence\",\"childPeerId\":\"viewer_12345678\",\"connectionId\":\"connection_12345678\",\"rtpStatsId\":null,\"trackIdentifier\":null,\"sampleTimestampMs\":null,\"routeRevision\":3,\"state\":\"unknown\",\"diagnostics\":{\"natTraversalPath\":\"ordinary\",\"reason\":null,\"framesPerSecond\":24,\"bitrateKbps\":1500}}",
"valid": true
},
{
"name": "sender-quality-evidence-healthy-without-identity",
"schema": "client",
"json": "{\"type\":\"sender-quality-evidence\",\"childPeerId\":\"viewer_12345678\",\"connectionId\":\"connection_12345678\",\"rtpStatsId\":null,\"trackIdentifier\":\"track-1\",\"sampleTimestampMs\":2000,\"routeRevision\":3,\"state\":\"healthy\",\"diagnostics\":{\"natTraversalPath\":\"ordinary\",\"reason\":\"none\",\"framesPerSecond\":24,\"bitrateKbps\":1500}}",
"valid": false
},
{
"name": "sender-quality-evidence-reason-mismatch",
"schema": "client",
"json": "{\"type\":\"sender-quality-evidence\",\"childPeerId\":\"viewer_12345678\",\"connectionId\":\"connection_12345678\",\"rtpStatsId\":\"rtp-stats-1\",\"trackIdentifier\":\"track-1\",\"sampleTimestampMs\":2000,\"routeRevision\":3,\"state\":\"healthy\",\"diagnostics\":{\"natTraversalPath\":\"ordinary\",\"reason\":\"bandwidth\",\"framesPerSecond\":24,\"bitrateKbps\":1500}}",
"valid": false
},
{
"name": "sender-quality-evidence-missing-path",
"schema": "client",
"json": "{\"type\":\"sender-quality-evidence\",\"childPeerId\":\"viewer_12345678\",\"connectionId\":\"connection_12345678\",\"rtpStatsId\":\"rtp-stats-1\",\"trackIdentifier\":\"track-1\",\"sampleTimestampMs\":2000,\"routeRevision\":3,\"state\":\"degraded\",\"diagnostics\":{\"reason\":\"bandwidth\",\"framesPerSecond\":24,\"bitrateKbps\":1500}}",
"valid": false
},
{
"name": "sfu-publisher-quality-evidence",
"schema": "client",
"json": "{\"type\":\"sfu-publisher-quality-evidence\",\"publicationGeneration\":\"publication_generation_12345678\",\"routeRevision\":4,\"state\":\"healthy\",\"sampleTimestampMs\":2000,\"diagnostics\":{\"natTraversalPath\":\"ordinary\",\"reason\":\"none\",\"framesPerSecond\":30,\"bitrateKbps\":2000,\"captureFramesPerSecond\":30,\"mediaSourceFramesPerSecond\":null,\"width\":1920,\"height\":1080,\"videoEncodingCount\":1,\"activeVideoEncodingCount\":1,\"availableOutgoingKbps\":9000,\"rttMs\":12,\"packetLossPercent\":0.1}}",
"valid": true
},
{
"name": "sfu-publisher-quality-evidence-missing-sample",
"schema": "client",
"json": "{\"type\":\"sfu-publisher-quality-evidence\",\"publicationGeneration\":\"publication_generation_12345678\",\"routeRevision\":4,\"state\":\"healthy\",\"sampleTimestampMs\":null,\"diagnostics\":{\"natTraversalPath\":\"ordinary\",\"reason\":\"none\",\"framesPerSecond\":30,\"bitrateKbps\":2000,\"captureFramesPerSecond\":30,\"mediaSourceFramesPerSecond\":null,\"width\":1920,\"height\":1080,\"videoEncodingCount\":1,\"activeVideoEncodingCount\":1,\"availableOutgoingKbps\":9000,\"rttMs\":12,\"packetLossPercent\":0.1}}",
"valid": false
},
{
"name": "reset-sender-quality",
"schema": "client",
"json": "{\"type\":\"reset-sender-quality\"}",
"valid": true
},
{
"name": "reset-sender-quality-extra-key",
"schema": "client",
"json": "{\"type\":\"reset-sender-quality\",\"roomId\":\"1234\"}",
"valid": false
},
{
"name": "set-display-name",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"小明\"}",
"valid": true
},
{
"name": "set-display-name-noncanonical",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\" Café \"}",
"valid": false
},
{
"name": "set-sharing-paused",
"schema": "client",
"json": "{\"type\":\"set-sharing-paused\",\"shareGeneration\":\"share_generation_12345678\",\"paused\":true}",
"valid": true
},
{
"name": "set-sharing-paused-resume",
"schema": "client",
"json": "{\"type\":\"set-sharing-paused\",\"shareGeneration\":\"share_generation_12345678\",\"paused\":false}",
"valid": true
},
{
"name": "set-sharing-paused-string-flag",
"schema": "client",
"json": "{\"type\":\"set-sharing-paused\",\"shareGeneration\":\"share_generation_12345678\",\"paused\":\"true\"}",
"valid": false
},
{
"name": "set-sharing-paused-extra-key",
"schema": "client",
"json": "{\"type\":\"set-sharing-paused\",\"shareGeneration\":\"share_generation_12345678\",\"paused\":true,\"unexpected\":1}",
"valid": false
},
{
"name": "set-sharing-paused-missing-generation",
"schema": "client",
"json": "{\"type\":\"set-sharing-paused\",\"paused\":true}",
"valid": false
},
{
"name": "stop-sharing",
"schema": "client",
"json": "{\"type\":\"stop-sharing\"}",
"valid": true
},
{
"name": "stop-sharing-generation",
"schema": "client",
"json": "{\"type\":\"stop-sharing\",\"shareGeneration\":\"share_generation_12345678\"}",
"valid": true
},
{
"name": "stop-sharing-short-generation",
"schema": "client",
"json": "{\"type\":\"stop-sharing\",\"shareGeneration\":\"short\"}",
"valid": false
},
{
"name": "abandon-room",
"schema": "client",
"json": "{\"type\":\"abandon-room\"}",
"valid": true
},
{
"name": "abandon-room-extra-key",
"schema": "client",
"json": "{\"type\":\"abandon-room\",\"unexpected\":true}",
"valid": false
},
{
"name": "removed-refresh-ice",
"schema": "client",
"json": "{\"type\":\"refresh-ice\"}",
"valid": false
},
{
"name": "removed-set-code-entry-policy",
"schema": "client",
"json": "{\"type\":\"set-code-entry-policy\",\"policy\":\"open\"}",
"valid": false
},
{
"name": "removed-rotate-viewer-grant",
"schema": "client",
"json": "{\"type\":\"rotate-viewer-grant\"}",
"valid": false
},
{
"name": "create-room-open",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"open\"}",
"valid": true
},
{
"name": "create-room-private-password",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"private\",\"roomPassword\":\"room-password\"}",
"valid": true
},
{
"name": "create-room-null-password",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"private\",\"roomPassword\":null}",
"valid": true
},
{
"name": "create-room-preferred-code",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"open\",\"preferredRoomId\":\"4321\"}",
"valid": true
},
{
"name": "create-room-leading-zero-code",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"open\",\"preferredRoomId\":\"0432\"}",
"valid": false
},
{
"name": "create-room-unknown-policy",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"password\"}",
"valid": false
},
{
"name": "create-room-numeric-policy",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":1}",
"valid": false
},
{
"name": "create-room-space-in-password",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"private\",\"roomPassword\":\"contains space\"}",
"valid": false
},
{
"name": "create-room-unknown-key",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"open\",\"hostToken\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"}",
"valid": false
},
{
"name": "replace-room-private-password",
"schema": "replaceRoomRequest",
"json": "{\"codeEntryPolicy\":\"private\",\"roomPassword\":\"room-password\"}",
"valid": true
},
{
"name": "replace-room-open",
"schema": "replaceRoomRequest",
"json": "{\"codeEntryPolicy\":\"open\"}",
"valid": true
},
{
"name": "replace-room-preferred-code",
"schema": "replaceRoomRequest",
"json": "{\"codeEntryPolicy\":\"open\",\"preferredRoomId\":\"4321\"}",
"valid": false
},
{
"name": "replace-room-missing-policy",
"schema": "replaceRoomRequest",
"json": "{}",
"valid": false
},
{
"name": "room-access-set-code-entry-policy-open",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"set-code-entry-policy\",\"policy\":\"open\"}",
"valid": true
},
{
"name": "room-access-set-code-entry-policy-private",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"set-code-entry-policy\",\"policy\":\"private\"}",
"valid": true
},
{
"name": "room-access-set-code-entry-policy-disabled",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"set-code-entry-policy\",\"policy\":\"disabled\"}",
"valid": false
},
{
"name": "room-access-rotate-viewer-grant",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"rotate-viewer-grant\"}",
"valid": true
},
{
"name": "room-access-rotate-viewer-grant-extra-key",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"rotate-viewer-grant\",\"policy\":\"open\"}",
"valid": false
},
{
"name": "room-access-revoke-viewer-grant",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"revoke-viewer-grant\"}",
"valid": true
},
{
"name": "room-access-set-viewer-password",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"set-viewer-password\",\"password\":\"simple-password\"}",
"valid": true
},
{
"name": "room-access-clear-viewer-password",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"set-viewer-password\",\"password\":null}",
"valid": true
},
{
"name": "room-access-missing-password-key",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"set-viewer-password\"}",
"valid": false
},
{
"name": "room-access-long-password",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"set-viewer-password\",\"password\":\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"}",
"valid": false
},
{
"name": "room-access-unknown-action",
"schema": "roomAccessUpdateRequest",
"json": "{\"action\":\"disable-room\"}",
"valid": false
},
{
"name": "sfu-publisher-offer",
"schema": "client",
"json": "{\"type\":\"sfu-signal\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\",\"kind\":\"description\",\"description\":{\"type\":\"offer\",\"sdp\":\"v=0\\\\r\\\\n\"},\"media\":{\"codec\":\"vp8\",\"layers\":[{\"rid\":\"q\",\"width\":640,\"height\":360,\"bitrate\":500000},{\"rid\":\"h\",\"width\":1280,\"height\":720,\"bitrate\":2000000}],\"audio\":false,\"audioBitrate\":128000}}",
"valid": true
},
{
"name": "sfu-ice-end",
"schema": "client",
"json": "{\"type\":\"sfu-signal\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\",\"kind\":\"candidate\"}",
"valid": true
},
{
"name": "sfu-invalid-layers",
"schema": "client",
"json": "{\"type\":\"sfu-signal\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\",\"kind\":\"description\",\"description\":{\"type\":\"offer\",\"sdp\":\"v=0\\\\r\\\\n\"},\"media\":{\"codec\":\"vp8\",\"layers\":[],\"audio\":false,\"audioBitrate\":128000}}",
"valid": false
},
{
"name": "sfu-invalid-media-role",
"schema": "client",
"json": "{\"type\":\"sfu-signal\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\",\"kind\":\"description\",\"description\":{\"type\":\"answer\",\"sdp\":\"v=0\"},\"media\":{\"codec\":\"vp8\",\"layers\":[{\"rid\":\"q\",\"width\":640,\"height\":360,\"bitrate\":500000},{\"rid\":\"h\",\"width\":1280,\"height\":720,\"bitrate\":2000000}],\"audio\":false,\"audioBitrate\":128000}}",
"valid": false
},
{
"name": "sfu-null-description",
"schema": "client",
"json": "{\"type\":\"sfu-signal\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\",\"kind\":\"candidate\",\"description\":null}",
"valid": false
},
{
"name": "set-quality-settings-folded-audio-invalid",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenaudioquality\":\"invalid\"}}",
"valid": false
},
{
"name": "set-quality-settings-folded-audio-null",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenaudioquality\":null}}",
"valid": false
},
{
"name": "set-quality-settings-folded-key-collision",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\",\"screenaudioquality\":\"invalid\"}}",
"valid": false
},
{
"name": "set-quality-settings-exact-duplicate-last-valid",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":null,\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\"}}",
"valid": true
},
{
"name": "set-quality-settings-exact-duplicate-last-null",
"schema": "client",
"json": "{\"type\":\"set-quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxFramerate\":null,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\"}}",
"valid": false
},
{
"name": "authenticate-host-folded-generation",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"clientId\":\"client_12345678\",\"sharegeneration\":\"bad\"}",
"valid": false
},
{
"name": "authenticate-host-folded-default-policy",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"host\",\"token\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"clientId\":\"client_12345678\",\"routepolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false}}",
"valid": false
},
{
"name": "authenticate-viewer-folded-presence-false",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"viewerpresence\":false}",
"valid": false
},
{
"name": "authenticate-viewer-folded-password-null",
"schema": "client",
"json": "{\"type\":\"authenticate\",\"protocol\":\"piik-v23\",\"roomId\":\"1234\",\"role\":\"viewer\",\"clientId\":\"client_12345678\",\"viewerpassword\":null}",
"valid": false
},
{
"name": "route-ready-folded-approval-false",
"schema": "client",
"json": "{\"type\":\"route-ready\",\"revision\":7,\"phase\":\"prepare\",\"qualityapproved\":false}",
"valid": false
},
{
"name": "signal-folded-target-empty",
"schema": "client",
"json": "{\"type\":\"signal\",\"payload\":{\"kind\":\"candidate\",\"connectionId\":\"connection_12345678\",\"candidate\":null},\"targetpeerid\":\"\"}",
"valid": false
},
{
"name": "stop-sharing-folded-generation-empty",
"schema": "client",
"json": "{\"type\":\"stop-sharing\",\"sharegeneration\":\"\"}",
"valid": false
},
{
"name": "create-room-folded-preferred-null",
"schema": "createRoomRequest",
"json": "{\"codeEntryPolicy\":\"open\",\"preferredroomid\":null}",
"valid": false
},
{
"name": "set-display-name-literal-high-surrogate-text",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"\\\\ud800\"}",
"valid": true
},
{
"name": "set-display-name-literal-low-surrogate-text",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"\\\\udc00\"}",
"valid": true
},
{
"name": "set-display-name-escaped-surrogate-pair",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"\\ud83d\\ude00\"}",
"valid": true
},
{
"name": "set-display-name-unpaired-high-surrogate",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"\\ud800\"}",
"valid": false
},
{
"name": "set-display-name-unpaired-low-surrogate",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"\\udc00\"}",
"valid": false
},
{
"name": "set-display-name-literal-high-followed-by-unpaired-low",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"\\\\ud800\\udc00\"}",
"valid": false
},
{
"name": "set-display-name-escaped-slash-followed-by-surrogate-pair",
"schema": "client",
"json": "{\"type\":\"set-display-name\",\"displayName\":\"\\\\\\ud83d\\ude00\"}",
"valid": true
}
],
"serverMessages": [
{
"name": "authenticated-host-minimal",
"json": "{\"type\":\"authenticated\",\"protocol\":\"piik-v23\",\"peerId\":\"host_12345678\",\"maxViewers\":8,\"endpointMediaCopyCapacity\":2,\"hostOnline\":true,\"connectionId\":null,\"iceConfig\":{\"iceServers\":[],\"natPredictionStunUrls\":[]},\"routePolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false},\"codeEntryPolicy\":\"open\",\"viewerAuthorizationGeneration\":\"viewer_generation_12345678\",\"mediaMode\":\"peer-assisted\",\"shareGeneration\":\"share_generation_12345678\",\"routeRevision\":0,\"routeAssignment\":{\"upstream\":{\"kind\":\"none\"},\"childPeerIds\":[],\"sfuPublicationGeneration\":null},\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\"},\"role\":\"host\",\"viewerPasswordEnabled\":false}"
},
{
"name": "authenticated-host-full",
"json": "{\"type\":\"authenticated\",\"protocol\":\"piik-v23\",\"peerId\":\"host_12345678\",\"maxViewers\":8,\"endpointMediaCopyCapacity\":2,\"hostOnline\":true,\"connectionId\":\"connection_12345678\",\"iceConfig\":{\"iceServers\":[{\"urls\":\"stun:stun.example.test:3478\"},{\"urls\":[\"stun:stun-1.example.test:3478\",\"stun:[2001:db8::1]:3478\"]}],\"natPredictionStunUrls\":[\"stun:nat.example.test:3478\"]},\"routePolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false},\"codeEntryPolicy\":\"open\",\"viewerAuthorizationGeneration\":\"viewer_generation_12345678\",\"mediaMode\":\"peer-assisted\",\"shareGeneration\":\"share_generation_12345678\",\"routeRevision\":0,\"routeAssignment\":{\"upstream\":{\"kind\":\"sfu\"},\"childPeerIds\":[],\"sfuPublicationGeneration\":\"generation_12345678\"},\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\"},\"role\":\"host\",\"viewerPasswordEnabled\":false}"
},
{
"name": "authenticated-viewer-minimal",
"json": "{\"type\":\"authenticated\",\"protocol\":\"piik-v23\",\"peerId\":\"viewer_12345678\",\"maxViewers\":8,\"endpointMediaCopyCapacity\":2,\"hostOnline\":true,\"hostPaused\":false,\"connectionId\":null,\"iceConfig\":{\"iceServers\":[],\"natPredictionStunUrls\":[]},\"routePolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false},\"codeEntryPolicy\":\"open\",\"viewerAuthorizationGeneration\":\"viewer_generation_12345678\",\"mediaMode\":\"peer-assisted\",\"shareGeneration\":\"share_generation_12345678\",\"routeRevision\":0,\"routeAssignment\":{\"upstream\":{\"kind\":\"none\"},\"childPeerIds\":[],\"sfuPublicationGeneration\":null},\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\"},\"role\":\"viewer\"}"
},
{
"name": "authenticated-viewer-full",
"json": "{\"type\":\"authenticated\",\"protocol\":\"piik-v23\",\"peerId\":\"viewer_12345678\",\"maxViewers\":8,\"endpointMediaCopyCapacity\":2,\"hostOnline\":true,\"hostPaused\":true,\"connectionId\":\"connection_12345678\",\"iceConfig\":{\"iceServers\":[],\"natPredictionStunUrls\":[]},\"routePolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false},\"codeEntryPolicy\":\"open\",\"viewerAuthorizationGeneration\":\"viewer_generation_12345678\",\"mediaMode\":\"peer-assisted\",\"shareGeneration\":\"share_generation_12345678\",\"routeRevision\":0,\"routeAssignment\":{\"upstream\":{\"kind\":\"peer\",\"peerId\":\"parent_12345678\"},\"childPeerIds\":[\"child_12345678\",\"child_87654321\"],\"sfuPublicationGeneration\":null},\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\"},\"role\":\"viewer\"}"
},
{
"name": "signaling-challenge-response",
"json": "{\"type\":\"signaling-challenge-response\",\"sequence\":0}"
},
{
"name": "signal-description",
"json": "{\"type\":\"signal\",\"fromPeerId\":\"host_12345678\",\"payload\":{\"kind\":\"description\",\"connectionId\":\"connection_12345678\",\"description\":{\"type\":\"offer\",\"sdp\":\"v=0\\r\\n\"}}}"
},
{
"name": "signal-candidate-full",
"json": "{\"type\":\"signal\",\"fromPeerId\":\"host_12345678\",\"payload\":{\"kind\":\"candidate\",\"connectionId\":\"connection_12345678\",\"candidate\":{\"candidate\":\"candidate:1 1 udp 1 203.0.113.1 50000 typ host\",\"sdpMid\":\"0\",\"sdpMLineIndex\":0,\"usernameFragment\":null}}}"
},
{
"name": "signal-candidate-end",
"json": "{\"type\":\"signal\",\"fromPeerId\":\"host_12345678\",\"payload\":{\"kind\":\"candidate\",\"connectionId\":\"connection_12345678\",\"candidate\":null}}"
},
{
"name": "restart-request",
"json": "{\"type\":\"restart-request\",\"fromPeerId\":\"viewer_12345678\",\"connectionId\":\"connection_12345678\",\"rebuild\":true}"
},
{
"name": "route-update-prepare",
"json": "{\"type\":\"route-update\",\"revision\":9,\"phase\":\"prepare\",\"assignment\":{\"upstream\":{\"kind\":\"peer\",\"peerId\":\"parent_12345678\"},\"childPeerIds\":[\"child_12345678\",\"child_87654321\"],\"sfuPublicationGeneration\":null},\"candidate\":{\"childPeerId\":\"child_12345678\",\"connectionId\":\"connection_12345678\",\"transport\":\"direct\",\"qualityProbe\":false}}"
},
{
"name": "route-update-prepare-with-attempt",
"json": "{\"type\":\"route-update\",\"revision\":10,\"phase\":\"prepare\",\"assignment\":{\"upstream\":{\"kind\":\"sfu\"},\"childPeerIds\":[],\"sfuPublicationGeneration\":\"generation_12345678\"},\"candidate\":{\"childPeerId\":\"child_12345678\",\"connectionId\":\"connection_12345678\",\"transport\":\"sfu\",\"qualityProbe\":true,\"connectionAttempt\":{\"current\":2,\"total\":3}}}"
},
{
"name": "route-update-active",
"json": "{\"type\":\"route-update\",\"revision\":11,\"phase\":\"active\",\"assignment\":{\"upstream\":{\"kind\":\"none\"},\"childPeerIds\":[],\"sfuPublicationGeneration\":null}}"
},
{
"name": "route-status-waiting",
"json": "{\"type\":\"route-status\",\"revision\":3,\"state\":\"waiting\",\"reason\":\"sfu-admission\"}"
},
{
"name": "route-status-failed",
"json": "{\"type\":\"route-status\",\"revision\":4,\"state\":\"failed\",\"reason\":\"route-exhausted\"}"
},
{
"name": "route-diagnostic-snapshot-empty",
"json": "{\"type\":\"route-diagnostic-snapshot\",\"snapshot\":{\"children\":[],\"operation\":null}}"
},
{
"name": "route-diagnostic-snapshot",
"json": "{\"type\":\"route-diagnostic-snapshot\",\"snapshot\":{\"children\":[{\"ordinal\":1,\"parent\":{\"kind\":\"host\"},\"effectiveCapacity\":2,\"childCount\":1,\"demandAgeMs\":100,\"queueWaitMs\":10,\"candidateStartMs\":20,\"firstDecodedFrameMs\":80,\"finalMs\":80,\"finalRoute\":\"direct\",\"rejectionBucket\":\"none\",\"quality\":{\"eligibleWindows\":3,\"eligibleDurationMs\":6000,\"freezeWindows\":1,\"freezeCount\":1,\"freezeDurationMs\":250,\"pauseCount\":0,\"pauseDurationMs\":0}},{\"ordinal\":2,\"parent\":{\"kind\":\"viewer\",\"ordinal\":1},\"effectiveCapacity\":0,\"childCount\":0,\"demandAgeMs\":90,\"queueWaitMs\":null,\"candidateStartMs\":null,\"firstDecodedFrameMs\":null,\"finalMs\":null,\"finalRoute\":\"waiting\",\"rejectionBucket\":\"sfu-admission\",\"quality\":null}],\"operation\":{\"childOrdinal\":2,\"reason\":\"join\",\"stage\":\"admission\",\"cursor\":1,\"candidateCount\":2}}}"
},
{
"name": "sfu-config",
"json": "{\"type\":\"sfu-config\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\"}"
},
{
"name": "quality-settings",
"json": "{\"type\":\"quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\",\"screenAudioQuality\":\"music\"}}"
},
{
"name": "quality-settings-without-audio",
"json": "{\"type\":\"quality-settings\",\"qualitySettings\":{\"resolution\":\"1080p\",\"maxFramerate\":60,\"maxBitrate\":8000000,\"degradationPreference\":\"maintain-resolution\"}}"
},
{
"name": "route-policy",
"json": "{\"type\":\"route-policy\",\"shareGeneration\":\"share_generation_12345678\",\"routePolicy\":{\"peerOnly\":false,\"topologyOptimization\":true,\"natPrediction\":false}}"
},
{
"name": "route-policy-peer-only",
"json": "{\"type\":\"route-policy\",\"shareGeneration\":\"share_generation_12345678\",\"routePolicy\":{\"peerOnly\":true,\"topologyOptimization\":true,\"natPrediction\":false}}"
},
{
"name": "pause-sharing-source",
"json": "{\"type\":\"pause-sharing-source\",\"shareGeneration\":\"share_generation_12345678\"}"
},
{
"name": "viewer-quality-evidence-peer",
"json": "{\"type\":\"viewer-quality-evidence\",\"viewerPeerId\":\"viewer_12345678\",\"upstream\":{\"kind\":\"peer\",\"peerId\":\"host_12345678\"},\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":0,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":1920,\"height\":1080,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":\"video/H264\",\"codecProfile\":\"profile-level-id=42e01f\",\"codecParameters\":\"packetization-mode=1; level-asymmetry-allowed=1\",\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}"
},
{
"name": "viewer-quality-evidence-sfu",
"json": "{\"type\":\"viewer-quality-evidence\",\"viewerPeerId\":\"viewer_12345678\",\"upstream\":{\"kind\":\"sfu\"},\"guard\":{\"connectionId\":\"connection_12345678\",\"routeRevision\":0,\"presentationEpoch\":0},\"sequence\":1,\"windowMs\":2000,\"metrics\":{\"natTraversalPath\":\"ordinary\",\"width\":null,\"height\":null,\"framesPerSecond\":59.8,\"bitrateKbps\":7500,\"packetsReceivedDelta\":1500,\"packetsLostDelta\":2,\"rttMs\":18,\"jitterMs\":3.5,\"framesDecodedDelta\":120,\"framesDroppedDelta\":1,\"decodeMsPerFrame\":2.4,\"freezeCountDelta\":0,\"freezeDurationMsDelta\":0,\"pauseCountDelta\":0,\"pauseDurationMsDelta\":0,\"codec\":null,\"codecProfile\":null,\"codecParameters\":null,\"audioBitrateKbps\":192,\"audioPacketLossPercent\":0.2,\"audioJitterMs\":2.5,\"audioVideoPlayoutDeltaMs\":-12.5,\"videoJitterBufferDelayMs\":24,\"audioJitterBufferDelayMs\":18,\"audioConcealedSamplesPercent\":1,\"audioConcealmentEventsDelta\":3,\"audioCodec\":\"audio/opus\"}}"
},
{
"name": "host-status-online",
"json": "{\"type\":\"host-status\",\"online\":true,\"paused\":false}"
},
{
"name": "viewer-presence-empty",
"json": "{\"type\":\"viewer-presence\",\"viewers\":[]}"
},
{
"name": "viewer-presence",
"json": "{\"type\":\"viewer-presence\",\"viewers\":[{\"role\":\"host\",\"peerId\":\"host_12345678\",\"displayName\":\"分享者\",\"upstream\":{\"kind\":\"none\"}},{\"role\":\"viewer\",\"peerId\":\"viewer_12345678\",\"displayName\":\"小明\",\"upstream\":{\"kind\":\"peer\",\"peerId\":\"host_12345678\"},\"mediaReady\":true},{\"role\":\"viewer\",\"peerId\":\"viewer_87654321\",\"displayName\":\"观众\",\"upstream\":{\"kind\":\"none\"}}]}"
},
{
"name": "viewer-grant-revoked",
"json": "{\"type\":\"viewer-grant-revoked\",\"viewerAuthorizationGeneration\":\"viewer_generation_12345678\"}"
},
{
"name": "sharing-stopped",
"json": "{\"type\":\"sharing-stopped\"}"
},
{
"name": "room-closed-host-ended",
"json": "{\"type\":\"room-closed\",\"reason\":\"host-ended\"}"
},
{
"name": "error",
"json": "{\"type\":\"error\",\"code\":\"ROOM_FULL\",\"message\":\"Room is full\"}"
},
{
"name": "sfu-subscriber-offer",
"json": "{\"type\":\"sfu-signal\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\",\"kind\":\"description\",\"description\":{\"type\":\"offer\",\"sdp\":\"v=0\\\\r\\\\n\"}}"
},
{
"name": "sfu-layer-demand",
"json": "{\"type\":\"sfu-signal\",\"revision\":9,\"publicationGeneration\":\"publication_12345678\",\"connectionId\":\"connection_12345678\",\"kind\":\"layers\",\"activeCount\":0}"
}
]
}