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.
1065 lines
61 KiB
JSON
1065 lines
61 KiB
JSON
{
|
||
"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\":\"ab\"}",
|
||
"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}"
|
||
}
|
||
]
|
||
}
|