## Problem and outcome / 问题与结果 This phase adds lightweight room interaction without making media depend on chat, and adds Windows source-audio exclusion and optional SFU-only hosting at their existing owners. It also corrects confirmed encoder/capture ownership and native color-conversion defects. Host microphone commentary remains on the shared media path; room voice and 4K are outside this phase. ## Release notes ### 中文 这是一次功能更新:Piik 加入了文字聊天与表情互动,并完善了 Windows 声音采集、画面颜色和自部署选项。 #### 新功能 - **边看边聊。** 在可移动、可缩放的聊天窗口中发送消息,或开启弹幕。停止分享后,房间中的朋友仍可继续聊天。 - **表情互动。** 点击沙发上的人物,给自己发表情,或把番茄等表情送给朋友;各端按同一事件显示动画。 - **排除应用声音。** Windows App 分享整个屏幕时,可排除一个应用及其子进程的声音,适合同时使用语音软件。所选应用退出后,来源声音停止,避免恢复为未过滤的系统声音。 - **可选的纯 SFU 模式。** 自部署管理员可让共享画面和声音统一通过媒体服务器转发。默认仍为优先 P2P;App 公网邀请保持纯 P2P。 - **Windows HDR 转 SDR。** 原生采集与缩略图自动将 HDR 来源转换为 SDR,沿用现有观看链路。 #### 修复与改进 - 修复原生颜色转换的范围与矩阵处理,避免已复现的暗部丢失、高光裁切和颜色偏差。 - 修复共享编码器切换时使用过期需求或过期帧信息的问题,保护正在观看的画面;修复换源后旧采集事件可能影响新来源的问题。 - 统一新控件、浮窗与来源选择文案,补充中英文使用说明。 #### 使用与升级 聊天与表情需要新版站点页面和 Server;声音排除需要新版页面与支持此能力的 Windows App。聊天只保留本页最近收到的消息,刷新后清空,不补发历史,且不提供端到端加密。 HDR 转换输出为 SDR,不代表端到端 HDR 或多声道支持。既有房主麦克风与立体声能力保留。 ### English This feature update brings text chat and reactions to Piik, alongside improvements to Windows audio capture, picture colors and self-hosting options. #### New features - **Chat while watching.** Send messages in a movable, resizable window, or enable on-screen chat. Friends can keep chatting after the host stops sharing. - **Reactions.** Select a person on the sofa to react above yourself or send a tomato and other reactions to a friend. Participants animate the same shared event. - **Exclude application audio.** When sharing a whole screen with Windows App, exclude one application and its child processes, useful when using a separate voice app. Source audio stops if the selected app exits, preventing a return to unfiltered system sound. - **Optional SFU-only hosting.** Site operators can require shared video and audio to pass through the media server. P2P-first remains the default; App Public invite remains P2P-only. - **Windows HDR-to-SDR conversion.** Native capture and source thumbnails automatically convert HDR sources to SDR for the existing viewing path. #### Fixes and improvements - Correct native color-conversion ranges and matrices, addressing reproduced crushed shadows, clipped highlights and color shifts. - Correct stale demand and frame evidence during shared-encoder handoffs to protect the current picture. Prevent events from a replaced capture from affecting its successor. - Align new controls, floating panels and source-picker copy, with updated Chinese and English guides. #### Using this update Chat and reactions require updated site pages and Server. Audio exclusion requires updated pages and a Windows App that supports the capability. Chat retains only recent messages received by the current page, clears on refresh and does not replay history. It is not end-to-end encrypted. HDR conversion produces SDR; it does not add end-to-end HDR or surround sound. Existing host microphone commentary and stereo support remain available. ## Verification / 验证 - Web type checks, 78 test files / 1275 tests and production build: PASS. - Go core tests, formatting/vet and target builds: PASS; Darwin cgo remains platform-limited on this Windows runner. - Native build/check/color probes and synthetic HDR-to-SDR H.264/VP8 browser reception: PASS. - Access/privacy gate, Native H.264 SFU-only media gate and local Auto/H.264 Host gate: PASS. - Three real production pages: chat/reactions, stop/resume, idle-room join, host departure/return, offline draft recovery and invitation revocation: PASS. - Synthetic parent/child process-audio exclusion and target lifetime: PASS; no raw audio retained. - Windows candidate archive extraction and packaged Local startup/shutdown: PASS. - Documentation and website build: PASS. - [Candidate CI](https://github.com/TNTcraftHIM/Piik/actions/runs/36873766646) at `f26cd208d03bc0dcbe353f8cac217f993216b0a3`: Go core and race checks, Web tests, Server/container checks and Windows/macOS/Linux App packaging all PASS. Publication was skipped as intended. The owner accepted the UI/model and bounded local walkthrough for phase closure. Physical HDR/mixed displays, mobile keyboard, real voice applications across output devices and macOS/Linux capture remain unverified. Existing field reports without matched evidence are not claimed resolved. The owner authorized v1.7.0 publication on 2026-10-02. The final documentation-only commit records that authorization; product code matches the verified candidate above. ## Impact / 影响 Authorized version: **v1.7.0**, matching the local release planner. Current wire contracts remain Browser/server 23, Native control 9 and capture 7. Optional capabilities gate new functionality; existing room/media authority remains owned by the existing services. No new ports, message persistence, room voice or automatic room creation on page visit. Updated README, guides, standards, research evidence and TODO stay with the candidate phase.
1199 lines
70 KiB
JSON
1199 lines
70 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
|
||
},
|
||
"maxChatCodePoints": 280,
|
||
"interactionIntervalMs": 800
|
||
},
|
||
"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
|
||
},
|
||
{
|
||
"name": "room-interaction-subscribe",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"subscribe-room-interactions\"}",
|
||
"valid": true
|
||
},
|
||
{
|
||
"name": "room-chat",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"来,看点好康的。 <b>Hello</b> 👋\"}}",
|
||
"valid": true
|
||
},
|
||
{
|
||
"name": "room-reaction",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"tomato\",\"targetPeerId\":\"viewer_12345678\"}}",
|
||
"valid": true
|
||
},
|
||
{
|
||
"name": "room-interaction-invalid-blank",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\" \"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-invalid-long",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-invalid-control",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"hello\\nworld\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-invalid-unknown",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"unknown\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-invalid-chat-target",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"hello\",\"targetPeerId\":\"viewer_12345678\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-invalid-reaction-text",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"poop\",\"text\":\"hello\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-invalid-null-target",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"poop\",\"targetPeerId\":null}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-spoofed-sender",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"来,看点好康的。 <b>Hello</b> 👋\"},\"sender\":{\"peerId\":\"host_12345678\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-interaction-extra-room",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"来,看点好康的。 <b>Hello</b> 👋\"},\"roomId\":\"1234\"}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-chat-surrogate",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"\\ud800\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-chat-emoji-limit",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋\"}}",
|
||
"valid": true
|
||
},
|
||
{
|
||
"name": "room-chat-emoji-over-limit",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋👋\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-chat-non-canonical",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"chat\",\"text\":\"Café\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-reaction-tomato-untargeted",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"tomato\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-reaction-poop-untargeted",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"poop\"}}",
|
||
"valid": false
|
||
},
|
||
{
|
||
"name": "room-reaction-poop-targeted",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"poop\",\"targetPeerId\":\"viewer_12345678\"}}",
|
||
"valid": true
|
||
},
|
||
{
|
||
"name": "room-reaction-wave-untargeted",
|
||
"schema": "client",
|
||
"json": "{\"type\":\"send-room-interaction\",\"requestId\":\"request_12345678\",\"payload\":{\"kind\":\"reaction\",\"reaction\":\"wave\"}}",
|
||
"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}"
|
||
},
|
||
{
|
||
"name": "room-interactions-ready",
|
||
"json": "{\"type\":\"room-interactions-ready\",\"serverTime\":1700000000000}"
|
||
},
|
||
{
|
||
"name": "room-interaction-rejected",
|
||
"json": "{\"type\":\"room-interaction-rejected\",\"requestId\":\"request_12345678\",\"reason\":\"rate-limited\"}"
|
||
},
|
||
{
|
||
"name": "room-interaction",
|
||
"json": "{\"type\":\"room-interaction\",\"id\":\"event_12345678\",\"requestId\":\"request_12345678\",\"occurredAt\":1700000000010,\"sender\":{\"peerId\":\"peer_12345678\",\"role\":\"host\",\"displayName\":\"Piik friend\"},\"payload\":{\"kind\":\"chat\",\"text\":\"来,看点好康的。 <b>Hello</b> 👋\"}}"
|
||
}
|
||
]
|
||
}
|