Files
ArtPlayer/refactor/changes/2026-09-12-CORE-24-source-intent.md

64 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CORE-24:连续切源的播放意图
状态:完成验收,独立本地提交;起点 b5e96664。Audio-05 的首轮三引擎证据确认六项候选核心回归。
原切源每次读取 art.playing 并立即 art.pause()。第二次同步切源读取到第一次内部
暂停后的 false;旧操作被正确取消后,原先负责恢复播放的旧监听器不再执行,新
操作也没有恢复意图。修复必须传递最新切源的播放意图,同时保留过期操作无副作用。
将意图归属当前 source operation,在仍待恢复的操作间转移;用户明确 pause 可以
取消恢复。内部 pause 仍走既有公开事件,不能把它误当作用户放弃播放。补真实暂停
状态的受控宿主、重入/取消/失败/销毁和真实浏览器测试。完成后独立提交并恢复 Audio-05。
## 实现与兼容
source/operation.ts 保存待恢复意图、内部暂停标记及暂停修订号;switch.ts 在取消旧
操作前取得意图,结算时清除,避免完整结束/失败操作的状态泄漏到之后的来源。
playMix/pauseMix 在原生命令之前更新意图。内部暂停标记由进入 pauseMix 的第一次调用
消费,嵌套用户暂停仍然生效,不改变现有 pause 事件、同步返回或 play Promise 值/拒绝。
play 的副作用还核对暂停修订号:晚到的 native play 不能在用户暂停之后更新提示、
发出 play 或执行互斥,switch 的旧恢复也不能清空新暂停提示。
最初尝试监听 play/pause 事件,已有用例虽通过,但无法保证比用户预注册的回调先执行;
审查发现用户 pause 回调同步切源时可能先继承旧意图。因此采用命令入口方案(ADR-024),
没有增加额外监听器、定时器、依赖或公开字段。新用例使用真实 pauseMix/playMix,
不再让受控宿主的 pause 只计数却不改变播放状态。
一项既有晚到恢复测试原来只写 art.playing=false,未表达暂停命令;它现在同时调用
真实 art.pause,保留其旧操作不能覆盖新提示的断言。早期事件方案因此悬挂的运行已
主动终止并保留日志,没有当作通过。新增“恢复未完成时用户暂停”也先复现了错误 play
事件,再以修订号修复,失败日志均保留。
## 验证结果
- 源切换 34 项单元通过;新增 8 项覆盖连续操作、显式暂停、嵌套暂停、用户监听器重入、
未兑现的公开 play 意图、晚到恢复,以及直接 URL/失败/完成/销毁边界。
- 完整 `yarn ci:check` 594 项通过(548 单元、11 工程、35 基线),严格 TS 与声明检查通过。
后续新增一个浏览器命令顺序用例,最终单独 lint 和下面两套矩阵验证。
- 正常 `yarn build artplayer`、`yarn build:i18n` 通过;后者恢复核心构建清理的语言产物,
i18n 与上次提交无差异。三种核心 JS 与 docs/compiled 一致,公开声明/版本未改变。
- 正式 main/legacy 产物的 source-intent/source/media-events/playback-properties
三引擎最终各 81 项通过,无重试或跳过。早期事件方案的 39 项及新增用例前的 78 项
保留为过程记录,不充当最终实现证据。
- 原先失败的六项“候选核心 + 旧/新 Audio”连续切源用例全部通过,测试断言未改。
该组合重跑使用核心源码构建与明确指定的 Audio main 产物;正式核心产物另由上述矩阵验证。
- `yarn test:package` 在仓库外实际安装 tarball 并冻结重装:34 个运行时检查,5 组兼容类型
与 8 组精确类型通过。打包核心 JS 与浏览器所测的正式文件逐字节比对。
- `yarn test:coverage` 通过,224 个运行时文件进入报告、26 个明确排除,0 项门槛违例。
总体 Node 行覆盖 61.04%、分支 86.70%、函数 66.75%;不能将浏览器数量当作覆盖率。
变动文件的独立计数及产物体积差异见 [冻结证据](../baselines/core-source-intent-validation.json)。
main gzip 从 58,555 增至 58,748 字节(+193),legacy +181、ESM +248;这是兼容行为
修复的实际体积成本,不声称有性能/体积优化收益。source/operation.ts 的行/分支/函数
覆盖均 100%,source/switch.ts 行 98.08%、分支 94.20%,其他浏览器路径仍有 Node 覆盖缺口。
## 后续与回退
CORE-SOURCE-01 按上述公开命令与连续切源范围关闭;AUDIO-RESUME-01(旧核心 + 新音频
在 WebKit 上恢复)、原生偏移边界对照和真实网络缓冲仍由 Audio-05 接续,未一并关闭。
核心完整安装包全量矩阵、性能/体积风险和物理设备/发布复盘门槛仍需后续最终候选验证;
本任务的 81 项矩阵不等于重复了 CORE-22 的所有场景,也不代表 npm 发布放行。
回退此独立提交会恢复上次核心运行实现及三种构建文件,同时重新打开 CORE-SOURCE-01;
不应只回退命令入口或操作状态的一半。无 push/tag/publish/merge。