Files
ArtPlayer/refactor/changes/2026-09-13-PKG-MULTI-SUB-03-resources.md
T

74 lines
5.4 KiB
Markdown
Raw 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.
# PKG-MULTI-SUB-03 模块边界与资源修复
本次修改生产源码,保持工厂名称/必需参数、async 注册结果、name/tracks/reset、同步 void
选择方法和原分发入口。自有 JS 先按职责拆清,严格 TS 与公开声明仍由 04 完成。
原始 parser、许可和公开类型未改,没有新增依赖或改变包版本。
## 结构变化
| 文件 | 实际职责 |
| --- | --- |
| index.js | 注册编排、名称选择、活跃状态检查和公开返回对象 |
| request.js | 每轨请求、原生状态检查、字节解码与既有核心格式转换 |
| merge.js | 解析元数据和按选择顺序序列化;通过复制 cue 包装文本,原树不变 |
| lifetime.js | 本次注册的 destroy 监听、请求取消、Promise 提前结束与清理登记 |
| render.js | Blob 所有权、新旧 URL 替换、重入保护及宿主 init 失败处理 |
| parser.js | 保持原始 vendor 边界,不因本次拆分改写算法 |
模块依赖由入口向请求/纯解析/安装流动;仅入口和宿主安装/生命周期需要 art,纯 merge
不依赖 DOM、fetch 或播放器。没有引入要求用户升级核心的共享运行时依赖。
## 独立缺陷修正
- 销毁中 fetch/body 通过取消信号和关闭 Promise 结束;无 AbortController 的旧环境仍
能及时结束注册并忽略迟到结果。返回相同形状的失活结果,不新增 destroy 拒绝。
- 单轨失败保留原传输/解码异常身份,关闭整个注册并取消兄弟请求;HTTP ok=false 明确
拒绝且取消未消费的响应,不再把错误页面当作有效字幕。
- 最后 Blob URL 在 destroy 时释放。保留的 tracks/reset 此后返回 undefined,不再
读取名称、分配 URL 或触发宿主。重复 destroy 不重复释放。
- 分配新 URL 成功后才尝试替换;分配失败保留旧 URL。同步 init 失败释放新 URL,
保留先前资源并回滚该次 escape 写入;首次注册失败同时移除监听。
- 观察宿主真实 Promise 的 rejection,释放失败安装对应的 URL,并在活跃时以 console.warn
保留诊断。正常注册仍不等待宿主加载;tracks/reset 仍为 void。宿主核心可能自行显示
notice,这里不引入新公开事件,也不假装异步错误会从旧 void 方法同步抛出。
- 老 init 的迟到错误不释放后来成功替换的资源;同步重入选择、配置读取失败,以及
用户 getter/init 中触发 destroy 都有明确归属检查。
异步 init 失败发生时,宿主可能已经更新自身状态;插件不能通用回滚第三方宿主的副作用。
此时释放失败资源,保留旧异步接口时序并记录错误;调用方可在仍活跃时重新 reset。
正常 destroy 不恢复共享 subtitle.escape,避免覆盖后续插件/用户的配置。
## 保留的兼容边界
1. 采用已发布 1.2.0 的逐轨连接语义;没有恢复 1.0.0 按下标丢 cue 的缺陷。
2. 轨内 parser 排序、轨间选择顺序、同名取第一个、重复选择、未知名 TypeError、空轨、
onParser 未执行,以及坏 header 仍可保留可用 cue 的容错均保留。
3. option.type 优先、当前核心 SRT/ASS 转换、encoding 默认与原生解码行为保持。
轨元数据在下载结束后读取;restart 不重新下载字幕,配置在每次安装时读取。
4. 不再调用无实际资源的 revokeObjectURL('')。历史测试仍断言旧调用记录,候选正常
测试仅对这一项无资源清理差异作明确区分,不放宽真实 URL 的释放断言。
5. 合并不再原地标记 updated/改 cue;冻结树重复序列化测试和九种真实旧产物逐字对照
证明输出保持,另对实际核心转换和 Windows-1252/UTF-16LE 字节逐字比较。
## 验证与限制
命令及准确运行结果、输入指纹、原生浏览器观察见
[验证记录](../baselines/multiple-subtitles-resources.json)。新生命周期/merge 文件接入
test:unit 与 test:multiple-subtitles,生产三入口由正常 yarn build 生成。
浏览器矩阵使用发布/候选核心、Chromium/Firefox/Windows WebKit 和源码/现代/legacy
插件,覆盖 SRT 显示/选择、挂起请求销毁、原生 Blob 不可访问、HTTP 失败及真实视频切源。
其中资源/错误场景直接执行公开注册函数,显示与切源场景使用真实 plugins.add。
最终本包 241 项通过;源码/main/legacy 各 31 项通过(其中冻结树纯函数用例固定读取源码,
其余正常/生命周期/转换对照通过选定入口)。三入口原生浏览器各 30 项,共 90 项通过。
完整 CI 2311 项通过:1963 单元、14 工程、334 基线;严格生产 TS 仍 346 文件。
状态更新后 9 项风险/契约元数据测试通过。显式 lint 无错误或警告;全量 lint 仍有既有
生成声明 unused-disable 警告。实际 ESM 只验证导出形状和工厂,不冒充完整安装消费者。
这不是全部历史核心、实体 Safari/移动设备、ASS 原生显示、样式/编辑器或 npm 发布准入。
HOST/HTTP 在本次边界回归后关闭;LIFE/MERGE 的完整支持范围组合仍由 05 补齐。
每项状态以 tasks/risks 与验证记录为准;后续 04 迁移 TS 时重跑相同生产入口用例。
独立本地任务提交,不推送、不发布。回退本提交恢复旧单文件和生成产物,同时重新引入
02 已复现的泄漏/失败行为;02 历史基线及浏览器证据保留。