refactor(danmuku): [PKG-DANMUKU-04] own scheduler and worker request lifecycle

This commit is contained in:
Harvey Zhao committed 2026-09-13 19:19:25 +08:00
1 parent 0b2efb07f1
commit 12332df221
24 files changed
+23441 -461

No files matched your search

@@ -0,0 +1,84 @@
# PKG-DANMUKU-04 时钟、队列与轨道调度
弹幕调度现在只有一个待执行RAF或异步准备帧。新增`src/scheduler.js`负责运行归属、
取消、失败和恢复,`src/queue.js`负责状态池与候选顺序,`src/worker-client.js`负责
请求关联和Worker收尾。`danmuku.js`保留公共行为出口;原`worker.js`轨道算法逐字未改。
本步仍是JS职责拆分,完整TS和最新npm根声明/准确`/runtime`归06。
## 行为与兼容边界
- 原生play/playing可以重复进入start,仍保留旧start事件;内部只能有一条运行链。
队列先ready后wait,保留当前媒体时间前后0.1秒窗口、状态池顺序和原轨道几何。
- 暂停、reset、替换输入成功提交、hide、seeking、destroy以及更换beforeVisible
使旧准备工作失效。取消与用户Promise竞速,新工作不必等待旧回调结束。
每次await及用户回调后检查归属;回收前检查节点身份,避免旧续体回收新节点。
- hide、seeking和回调更新保留已显示/暂停节点;seek不额外发reset。Date.now寿命
排除暂停时间;同步倍率仍只在新弹幕分配时取值,不顺便改写现有弹幕剩余寿命。
- beforeVisible拒绝沿现有error出口发原错一次,本轮跳过该项并继续其他项;false
仍可下一帧重试。显式start/reset或其他失效动作允许仍符合时间条件的失败项重试。
错误监听器自身抛错有局部观察,不产生脱离调用链的未处理RAF拒绝。
- Worker共享回复监听在post前安装,ID在请求及Worker替换之间递增,避免同毫秒串线。
反序、同步、重复、未知和迟到回复不会完成其他请求。取消的内部请求解析为
`{ id, result: undefined }`;故障以原错拒绝待处理请求,独立尝试解绑及terminate。
- Worker故障停止内部调度但不伪造公共stop。后续start/reset可重建;重复失败等待
下次显式恢复。错误监听器可能同步destroy/stop/reset/hide或嵌套start,因此恢复
后再次检查生命周期、generation和启动序号,过期start不能继续或发迟到start事件。
- 门面方法、getter、同步/异步返回及内部实例身份保持。配置回调保持当前option为this。
合法的NaN时间保持旧currentTime+0.5;零保持03明确修正后的0,正无穷保持原值,
负无穷仍钳位0,不扩大原验证器对null等输入的接受范围。
## 发现的问题先修复,再保留证据
最初18项调度测试为6通过12失败;03实际main在两核心的8个Chromium场景为4通过4失败,
具体包括六条弹幕产生七个请求、同ID及空visible快照、节点复用时留下额外隐藏节点。
这个03快照本身未重叠,02另有真实重叠记录;没有把不同运行的现象拼成同一次失败。
第一轮候选48项原生矩阵通过后,只读代理发现恢复错误监听器销毁播放器仍继续start。
补齐destroy/stop/reset/hide/嵌套start五个回归,保存的修复前真实main在32项中27绿5红,
加入恢复所有权检查后全部转绿。随后复审发现03的`time !== undefined`在修正零时
误改合法NaN:历史源码/main/legacy均沿旧默认时间,候选24项23绿1红。保留零的显式
判断并恢复NaN默认路径,增加历史对照和真实浏览器可见性断言;03旧报告保持原样。
这些修复作为本步变更记录,新增已解决风险INPUT-02;没有把中间版本的通过当作最终
验收。父代理负责复审、构建、浏览器和整合,子代理分别承担调度实现、确定性测试及
独立风险复核,同一文件分工不重叠,Git由父代理统一提交。
## 最终验证
- 源码、正式main、正式legacy各104项联合通过。每组中83项随候选实现变化,18项
直接验证内部Worker客户端/原轨道源码,3项固定历史数值对照。不能把后21项重复
宣称为不同产物的额外覆盖。组成:输入24、解析26、调度33、Worker客户端21。
- 确定性时钟覆盖三小时媒体范围、180批共720条、15次120秒暂停及暂停中seek,
执行真实Worker算法,检查每条一次请求、发射顺序、唯一状态池及4节点全程复用。
这是采样生命周期的模拟时钟测试,不是实际三小时播放或帧率/内存基准。
- 三种实现各66项原生浏览器通过,共198项:实际已发布核心5.4.0及候选5.4.1,
Chromium/Firefox/Windows WebKit。包括三模式、严格轨道几何、播放/暂停/跳转/倍率、
节点复用、四种pending取消、恢复重入、NaN、实际设置/发送/mount和双实例。
- main和legacy额外各30次密集场景重复,共60次,无跳过、失败或重试后通过。
每次六条固定弹幕都断言几何不交叠、顺序、六个唯一请求、visible快照长度0至5、
回复关联及六节点;复用场景另断言同一可见节点且额外节点数组为空。
- 普通场景要求零页面错误、零Worker错误;恢复场景显式派发受控ErrorEvent并让
createWorker抛错,仅允许精确已知故障。实际视频/DOM/Blob Worker继续使用原生实现,
但不能把注入故障描述成真实CSP或平台Worker构造失败。Windows WebKit不是Safari设备。
- 仓库正常build生成三格式及docs/compiled,逐一核对字节;修改源码/测试/脚本入口lint
通过。04未改生产TS或公开声明,引用03全仓366生产TS和消费者检查,未声称04新跑TS。
构建曾在浏览器运行期间遇Windows UNKNOWN复制错误;停止并行构建后正常串行重建成功,
核对main/legacy与当时已测试文件哈希一致。NaN修复后再次完整构建并运行上述最终矩阵。
故障日志、串行重试、字节一致性证明及最终结果均保留。新增所有权逻辑使产物变大,
机器证据记录相对03的原始/gzip字节,不能声称本步缩包或性能改善。
证据及输入指纹见[机器报告](../baselines/danmuku-scheduler-validation.json)。原始截图和
附件归档独立目录,报告记录原results路径到归档路径的映射,不手改原Playwright报告。
未新增依赖或修改Yarn锁;`test:unit`和`test:danmuku`加入调度/Worker客户端测试,新增
原生spec沿既有浏览器CI发现。中间48/60项矩阵保存为过程证据,最终引用numeric-final。
## 风险关闭与下一步
ASYNC-01由03输入/解析及04可见性/Worker归属共同满足关闭标准;TRACK-01关闭范围仅为
已复现的重复运行链和请求串线,以及对应严格几何/节点重复回归。它们不代表任意负载、
任意轨道算法或包级资源稳定性已经验收。CLEANUP-01保持开放:Setting外部DOM、发送
续体和锁定计时器仍需05处理;heatmap零采样同样未修。05继续DOM渲染/设置/热力图,
06完整TS与声明,07真实长负载。完整npm安装、发布前多轮复盘仍待各自任务。
本任务完成后独立本地commit,无推送、标签或npm发布。