WP25:演讲者播放同步协议
状态:已完成(2026-10-18)。阶段:M2。主责:Runtime / Presenter。 上层工作项:R05(协议);详见模块计划。本包是该工作项的实施拆分,不是另一份配置契约。
前置与输入
前置完成:WP24。 字段与行为以统一契约为准;所有依赖编号见执行清单。
修改范围与交付
- 修改范围:扩展 BroadcastChannel/localStorage 消息与纯处理逻辑:协议版本、频道/产物、owner epoch、命令 ID、revision、路径/状态/剩余时间。
- 交付物:可去重、拒绝旧 owner 和恢复快照的双窗口同步协议与处理器。
- 提交边界:先完成协议与状态应用,不在此启动第二个调度器或依赖真实窗口做纯逻辑测试。
完成标准
- [x] 实现及评审覆盖上述修改范围,未超出提交边界。
- [x] 行为验收:重复/过期/身份不匹配消息不改变状态;新窗口可重新建立本地时钟基准;不比较跨窗口 performance.now。
- [x] 验证范围:纯协议解析、去重/乱序/身份与 storage 兜底测试;真实双窗口在 WP26 验收。
- [x] 关联验收:A21、A22 的协议侧;真实窗口一致性与失效交接见 WP26。
- [x] 记录代码版本、实际测试命令/结果、未运行项及原因,产物保存到任务专属临时目录。
- [x] 回填本卡状态与证据;阶段能力是否开放由对应阶段出口包决定,单包完成不等于整阶段交付。
建议提交标题:WP25:演讲者播放同步协议。通常按一个可评审 PR 实施;若实际改动仍过大,先按输入/输出再拆子包,保留父编号和依赖。
实施记录(2026-10-18)
- 协议:新增
presenter-sync-protocol.ts,v2 信封包含protocol、channelId、产物身份、sourceId、ownerEpoch、递增revision、eventId与可选commandId;state-sync/navigate 携带完整路径、视图、tileSize 与播放快照(状态、剩余毫秒、delay、媒体等待、页码)。 - 处理器:Receiver 在业务应用前完成协议/身份/self/频道/产物校验,按 event 与 command 去重,维护 owner epoch 水位与 per-source revision;新 owner 接管后旧 owner 的消息失效。
- 时钟:接收方只用本地到达时间加
remainingMs计算 deadline,不跨窗口比较performance.now;新观众ready后控制台回发状态快照。 - 集成:控制器所有 BroadcastChannel 与 storage 消息统一走 Receiver;storage 初始导航升级为 v2;暴露
playbackSnapshot/remotePlayback/updatePlayback供 WP26 消费。WP26 在 v2 信封追加role并按角色隔离 owner 水位,观众窗口只接受控制台来源的导航。 - 验证:定向 12 passed;Runtime 全量 141 files/1081 passed/3 skipped;
pnpm --dir runtime check与改动文件 ESLint 通过。 - 未运行:真实双窗口调度权交接与播放器应用(WP26);生产 OAuth 无关。
- 产物:
.tmp/wp25/。 - 提交:
61d1457。
测试环境与命令选择遵循 dev-start-test,不因执行本卡重复启动服务或重置开发数据。