refactor(core): [CORE-20] type entry and converge initialization

This commit is contained in:
Harvey Zhao committed 2026-09-11 16:07:06 +08:00
1 parent ccf77c4ed2
commit ee895a558f
100 files changed
+33854 -839

No files matched your search

File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,91 @@
# CORE-20 核心入口与依赖收敛
## 范围与状态
从 ccf77c4e 开始,CORE-20 源码及任务验收完成;下文保留阶段实施过程。上一任务已独立提交并验证,工作区开始时干净。覆盖剩余 13 个自有 JS:公共入口、Player 安装与 option 初始化、config/storage、DOM/环境工具和六个属性 mixin。screenfull 为登记的第三方文件,遵循来源与许可规则。完整迁移、严格类型、旧接口/描述符/静态/事件差分、构建和安装产物验证完成前不标 done,也不提前提交任务完成 commit。
API-01/02/03/04/05/07/08/09/10/11/12 均相关。保留构造顺序、属性安装顺序、静态字段可写性与求值时机、实例收集、就绪回调 this、导入样式/global/日志副作用。公共类型精确视图由 CORE-21 收敛,不能用全局 any 索引绕过入口检查。
## 实施顺序与边界
先迁移叶层属性、storage 和环境判断;按职责拆分 DOM 查询/树操作、样式、事件路径与布局测量,utils 保留兼容导出。然后类型化 config 与 optionInit,明确初始化依赖及失效边界;最后将 Player 和 Artplayer 门面接入已迁移子系统,复核断言是否确实只存在于动态属性安装和旧媒体扩展边界。
Storage 必须先保留 artplayer_settings 信封、name/settings 可观察字段、同步返回及错误 fallback。attr 的动态属性访问、cssVar 的 truthy 判定和 poster 解析也属于历史事实,不能在补类型时顺手规范化。发现缺陷先复现登记,再记录兼容修正。
## 验收与交接
复用既有 Node/类型/浏览器/真实 tarball 入口,新增测试只覆盖未覆盖的行为、失效与重入。普通显示与媒体流程继续使用真实浏览器,AirPlay 等实体设备能力不能以受控对象证明。各阶段结果如实记录,不将上个候选的完整矩阵当作当前代码证据。
本任务可使用已有工具链;新增依赖或脚本时记录用途和固定版本。完成后独立本地提交 CORE-20,不推送或发布。回退只撤销本任务并重建对应产物,保留 CORE-19 已交付功能。
## 叶层与 DOM 阶段
已迁移 storage、compatibility 及 attr/cssVar/type/theme/poster 五个 mixin;保留动态属性访问、undefined getter、truthy CSS 写入、原媒体/样式目标捕获、poster 引号解析和同步描述符。Storage 使用 unknown 表示未校验的历史 JSON 读取;没有把既有错误 fallback 改成无记录的新持久化策略。
环境测试从发布包复现自定义 iPhone/Macintosh UA 的 SSR ReferenceError。候选增加缺失全局保护,同时保留自定义 UA 的优先级与 navigator 惰性访问。该异常修复的完整候选入口/安装产物验证仍待完成,BASE-ENV-02 保持 open。
utils/dom 迁移并拆为 tree/styles/event-path/measure/presentation,公开 utils 仍是原导出集合。初次严格检查暴露 23 个隐含节点类型假设;设置内已知 DOM 复用 appendElement,Map.has 后的缓存和已挂载模板节点使用局部断言,没有把所有返回扩大为 any 或强行宣称 public append 永不为空。
事件路径无 window 时的 ReferenceError 已由发布包复现。安全区测量失败后泄漏探测节点则来自 CORE-19 工作区;最初误以 npm 基线也有该 helper,Node 检查指出 getSafeAreaInsets 不存在,已更正来源。test/helpers/legacy-safe-area.js 是从 ccf77c4e 原函数逐字提取的自有代码夹具,注明函数 SHA-256;浏览器服务也登记其来源与哈希。不依赖浅 clone 中的 Git 历史来运行回归,不将该夹具当作生产实现。
新增 Node 边界检查覆盖 Storage 信封/JSON/异常、属性转发、环境 flags/SSR、DOM 字符串与节点、原始样式值、事件路径和安全区 finally 清理。浏览器专项复验原生树/样式/事件与探测节点清理,同时复用设置、模板和方向场景。此阶段不生成或验收正式 tarball,最终仍需完成剩余初始化与入口源码。
叶层/DOM 历史阶段已完成 CI 436 项(407 单元 + 4 工程 + 25 基线)、220 个生产 TS 检查与 180 项源码 UMD 三浏览器专项,见 baselines/entry-leaf-dom-partial.json。该证据固定当时源码;后续初始化改动不能沿用它作为全量候选验收。
## 初始化与配置阶段
媒体 config 迁移 TS,公共数组仍可修改,保持顺序。optionInit 保持属性、静音、配置音量、持久音量、poster、autoplay、inline、theme/CSS、url 的顺序;在 getter、原生 setter、storage 和样式回调后检查销毁,阻止后续写入。原函数与 AirPlay 函数从 ccf77c4e 冻结成自有测试夹具,仅调整 utils 相对导入,注明原文件 SHA。
六项 Node 测试比较原初始化顺序和八个销毁重入边界,并验证属性 getter、AirPlay 可用性/接收者/事件/错误和销毁后的 picker/notice。候选均通过;AirPlay 的真实连接设备仍需环境矩阵验证。新增内部类型夹具明确 raw storage unknown、append 可空以及 mutable config;公开声明未改。BASE-LIFE-46/47 保持 open,等待两个入口及完整出口验证。
初始化阶段 `yarn ci:check` 已通过:442 项(413 单元、4 工程、25 基线),223 个生产 TS 文件严格检查(核心 218 + chapter 5)。日志为 `refactor/.cache/core20-initialization-ci.log`。本任务已迁移 11 个原有 JS,自有 JS 尚余 Artplayer 与 Player 两个入口;当前改动尚未作为完成任务提交,后续仍需最终构建、安装产物与全量浏览器验收。
## Player 安装与构造取消阶段
player/index.ts 将原 35 个步骤保留在一个有类型的安装表中,Player 实例仍无自有字段、构造参数个数为 1。PlayerHost 从各拥有模块的参数推导安装依赖,包含安装期间提供、稍后回调才读取的能力;不将其当成所有构造阶段已初始化的证明。Artplayer 入口暂仍为 JS,现已在子系统之间检查关闭状态;公共字段仍在各自构造返回后赋值,未提前填充 undefined 字段。Storage 原本不接收参数,入口移除未使用实参。
内部接线修正 PiP 读取类型为真实 element/null/boolean、写入仍为 boolean;初始 native/proxy autoplay 和 URL 视图保留可选能力及 nullable URL。续播记录在读取处明确历史 JSON 形状假设,不再要求所有 Storage.get 返回已校验对象。公开 types 目录未改。
新增浏览器对照确认正常实例属性描述符顺序、原型/静态形状和构造 arity 保持;发布核心在初始 volume setter 销毁后仍安装插件并登记实例,候选现在停止。能力 getter 销毁也会停止后续 Player 安装。最初夹具使用 layers 工厂被既有 schema 拒绝,已改成合法对象,不能把该夹具错误当生产回归。扩大用例后发现 AirPlay 检测内部仍会继续读取/定义,进一步在能力 getter、picker getter 和监听注册返回后检查关闭;新 Node 用例与冻结函数对照。
proxy 在 art.template 赋值前同步销毁的检查,首先在当前候选 Chromium 复现:removeHtml=true 仍残留 DOM;false 未标记 art-destroy;返回的 proxy 仍被挂载和改类名。失败报告 core20-mounting-before.json 固定当时 bundle 指纹。现在 lifecycle 仅在模板构造期间保留私有清理引用,destroy 事件前执行对应 DOM 清理,finally 清除引用;proxy 回调结束发现关闭即停止,不再处理其返回节点。没有提前暴露 art.template,也不替调用方释放其新建 proxy。正常挂载、初始化失败回滚和后续容器复用一并复验。
此阶段 CI 445 项通过(416 单元、4 工程、25 基线),224 个生产 TS 严格检查(核心 219 + chapter 5);核心剩余一个自有 JS 总入口。同一源码 UMD 三浏览器 105 项初始化/生命周期/配置/模板回归,加上新增销毁回调内重建实例的 3 项检查,共 108 个唯一用例(其中初始化专项 24 项);无重试、跳过、意外 pageerror。见 [阶段指纹与报告](../baselines/entry-player-partial.json)。两份成功报告均记录相同候选 bundle 哈希,不是安装包验收。BASE-LIFE-48/49 登记模板挂载和跨阶段取消差异,全部七项 CORE-20 风险保持 open,等待最终出口。
接续重点:src/index.js 迁移必须给真实子系统组合提供类型证明,不能将 PlayerHost 的安装依赖交叉类型当成完整实例实现。Template 保留缺失 SSR 节点可空的实际语义;Canvas proxy 与 native video 能力不同。外部旧回调类型、内部 UI callback this、Emitter 的开放事件和模块 Host 的窄事件需要在组合处协调。不要通过全局 any 或整个实例的旧声明断言跳过这些边界。完成后再处理最终构建、安装包、自定义 UA SSR、全量浏览器与本任务独立 commit。
## 完整入口与类型接线
src/index.ts 已迁移,player/properties.ts 单独描述实际安装的读写属性和方法,不再把模块输入交叉类型当作实例实现。URL 先按实际泛型 Host 安装,再运行原顺序中的其余 34 步。Artplayer 与 Icons 的 declaration-only interface 合并明确登记为动态描述符边界,避免 class fields 提前创建或遮蔽属性;每个子系统均用实际 Artplayer 类型检查。公开 class/prototype/静态值仍按原顺序创建,bootstrap/browser.ts 负责全局发布、样式注入与 100ms 版本日志。
组合检查修正了旧模块视图中的实际不一致:只写 seek/quality/forward/backward 读取为 undefined;metadata 之前 fullscreen 可缺失;PiP 读取为 element/null/boolean;notice 显示 getter 为 boolean,写入使用 NoticeSink;字幕图标可缺失,quality html 支持 HTMLElement。事件使用开放的 CoreEvents 和按名称约束的 CoreEmission,保留原 Emitter 实现;窄接口中的媒体事件补上真实 Event payload。五个内置插件去除整段 unknown factory casts,直接检查实际 host。Storage 的原始读取和续播局部历史记录假设维持分离。
保留两处有名称、可审查的输入兼容边界:option/runtime.ts 将旧声明中的回调视图接到实际模块,不包装函数或改变 this/对象身份;PlayerTemplate 只对核心消费者所需的 SSR 节点和 media-like proxy 标明既有预期,断言局限在模板赋值处。未使用的可省略 SSR 节点继续可空;不添加提前拒绝或合成节点。它们不是对所有任意 JS 输入的运行时证明,公开消费者声明仍留 CORE-21 独立收敛。
test/types/entry-source.ts 检查真实入口满足 Player/Builtin host、参数和读写语义的正反例。根 tsconfig 纳入已有资源声明,使类型夹具能导入带 SVG/LESS 的完整源入口,没有启用 ambient Node 或 skipLibCheck。test/entry.test.js 使用仓库构建配置生成完整 UMD,在隔离服务端环境验证自定义 UA、惰性 navigator、无定时器/DOM 副作用和构造错误;build helper 提取编译入口并保留原 ES loader。类型和 SDK 台账中的当前路径同步至 index.ts/option/resolve.ts,历史快照不改写。
最新 CI 447 项、229 个生产 TS 严格检查、五组原声明消费者通过;完整入口源码 UMD 36 项三浏览器专项通过,覆盖正常描述符/静态、子类、回调身份、可省略 SSR 节点和构造销毁。旧阶段报告不沿用为当前候选证据。
## 安装包验收进行中
生产构建及语言生成通过。run-v40AgV 实际 tarball 已通过 29 项运行时、五组类型。新增安装 UMD/legacy 与直接 ESM 自定义 UA SSR;baseline 模式显式断言旧 ReferenceError,候选必须成功,负例证明旧包不能冒充候选通过。初次 ESM 夹具误认为 Node 24 没有 navigator,Macintosh 预期拒绝未发生;现在明确暂时移除并 finally 恢复 navigator,保证这个 profile 测试的是无 browser/navigator 环境,不把环境差异当包回归。具体诊断与修正日志分别为 core20-package-gates.log / core20-package-gates-fixed.log。
安装包全量 UMD/legacy 浏览器矩阵尚未完成,全部七项 CORE-20 风险仍保持 open。无依赖/锁文件/公开声明/版本变更,未推送或发布;待最终出口完成后独立提交本任务。
## 最终验收与交接
本任务源码和完整验收已完成;上面的 doing、待迁移和待验收描述保留分阶段历史。
固定 Node 24.21.0 / Yarn 1.22.22。核心全部 224 个自有 TS 文件和 chapter 5 个生产文件严格检查;只保留已登记第三方 libs/screenfull.js。CI 447 项通过(418 单元、4 工程、25 基线),另显式检查新增浏览器、内部类型、冻结夹具及安装包脚本的 lint。公开 types 和 yarn.lock 未改。
run-v40AgV 实际 tarball 的 29 项运行时、五组消费者类型检查通过;安装 UMD/legacy 分别在 Chromium 153.0.8010.12、Firefox 155.0、WebKit 26.6 完整通过 1503 项,各含 45 项 DOM/初始化专项。无重试、跳过或意外页面错误;已知旧续播/截图拒绝精确登记。完整入口、子类、实例描述符/静态形状、正常事件和生命周期均复验。
[最终证据](../baselines/entry-validation.json) 将全部当前核心源码对照隔离构建快照,再核对包内全部文件、UMD/legacy/ESM、docs 副本、22 个语言文件和第三方许可。每个浏览器用例均校验实际加载的核心与 chapter 安装文件 SHA;源码专项和两个中间阶段快照不能代替该最终产物证据。
关闭 BASE-ENV-02/03 和 BASE-LIFE-45 至 49,共七项。BASE-ENV-01 的 Windows WebKit Blob 解码、真实 Safari/Apple/AirPlay 设备与其他外部集成仍交对应发布任务。CORE-21 继续负责准确公开视图和历史声明的协调,不用虚假的交叉返回或改变运行时掩盖冲突。
结构、类型、兼容、测试、文档和交接证据已齐;本任务以独立本地 commit 交付。当前 214 项:56 完成、158 待办。下一任务 CORE-21 生成既有入口声明并校验包内容;从 src/index.ts、src/option/runtime.ts、src/player/properties.ts、types/ 及 test/types/declaration-legacy.ts 开始,逐项处理 BASE-TYPE-04/05/07/08/09/10,并复核运行时可变的 option 和媒体能力视图。两个局部输入断言的边界已记在包内 ARCHITECTURE.md,不能将其误当任意 JS 输入的验证。
最终另轮审查对照了生成 ESM 的实际差异:DOM/helper 移动和已登记修正、AirPlay 接收者与异常、35 个 Player 步骤顺序、原样回调传递、声明字段不生成实例属性、模板私有挂载清理以及 browser bootstrap 的原样式参数和延时日志。已知运行时差异均有记录及测试。提交主题:refactor(core): [CORE-20] type entry and converge initialization。
没有新增依赖、锁文件或版本变化,没有推送或发布。回退只撤销本任务源码、测试、文档/状态及构建生成产物,保留 CORE-19 及之前交付;下一任务开始前先核实本任务提交。
+2 -2
View File
@@ -4,7 +4,7 @@
## 现状证据
- [入口](../packages/artplayer/src/index.js)顺序构造所有子系统;[player](../packages/artplayer/src/player/index.js)通过 mixin 将属性安装到 art。
- [入口](../packages/artplayer/src/index.ts)顺序构造所有子系统;[player](../packages/artplayer/src/player/index.ts)按保留的安装顺序通过 mixin 将属性安装到 art,并在销毁后停止后续步骤。
- [Component](../packages/artplayer/src/utils/component.ts)负责控件缓存、DOM 和监听器;[Setting](../packages/artplayer/src/setting/index.ts)还有独立的树、渲染和更新语义。
- [Events](../packages/artplayer/src/events/index.ts)已迁移为 TS,管理 DOM 监听器和全局重绑;输入调度、内部订阅与异步请求分别通过所属模块接入实例或操作作用域。
- [声明](../packages/artplayer/types/artplayer.d.ts)与源码独立维护;[build-ts](../scripts/build-ts.js)进行文本拼接。
@@ -13,7 +13,7 @@
| 领域 | 现有文件范围 | 目标与迁移方式 |
| -------- | -------------------------------------------- | ---------------------------------------------------------------------------- |
| 公共门面 | src/index.js、player/*Mix.js | 保留原签名和属性描述符;委托内部服务,不一次性换继承结构 |
| 公共门面 | src/index.ts、player/index.ts、player/*Mix.ts | 保留原签名和属性描述符;委托内部服务,不一次性换继承结构 |
| 配置 | option、scheme、config、默认值 | 区分用户输入与归一化配置;保持默认值、合并语义和错误时机 |
| 生命周期 | constructor、destroy、Events、各模块清理 | 实例资源作用域与操作资源作用域,清理恰好一次、可重入、失败后继续释放 |
| 内部事件 | utils/emitter.js | typed event map、未知事件兼容扩展、原调用顺序和 ctx |
+3 -2
View File
@@ -4,7 +4,7 @@
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 214 项,范围 22 个包及工作区/示例。
状态:todo 159 / doing 0 / blocked 0 / done 55 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
状态:todo 158 / doing 0 / blocked 0 / done 56 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -123,7 +123,7 @@
| CORE-17 | artplayer<br>迁移键盘、手势、焦点和全局事件 | CORE-13, CORE-16 | events/hotkey 的明确 document 与资源归属 | 跨 document 重绑、触摸/键盘、快捷键及销毁无重复响应;修复 BASE-PERF-01 pending resize debounce 销毁后执行,并验证正常 resize 不变 | H | done |
| CORE-18 | artplayer<br>迁移内置插件和提示模块 | CORE-14, CORE-16, CORE-17 | autoPlayback/autoOrientation/fastForward/lock/miniProgressBar 及 info/notice/loading/mask | 默认启用条件、storage 格式、定时器/动画清理通过;结合 BASE-PERF-01 防止销毁后重新安排 notice timer;接续 BASE-TYPE-07 的 notice.show boolean getter 与历史读类型冲突 | M | done |
| CORE-19 | artplayer<br>整理进度、质量、缩略图和截图 | CORE-10, CORE-13, CORE-16 | 相关 player/control 功能与纯计算分离 | 截图跨域失败、缩略图布局、quality/进度边界保持 | M | done |
| CORE-20 | artplayer<br>收敛核心入口与依赖方向 | CORE-14, CORE-15, CORE-18, CORE-19 | Artplayer 门面、初始化依赖与最终目录 | 所有核心自有源码迁移,公开描述符/静态接口/事件差分通过 | H | todo |
| CORE-20 | artplayer<br>收敛核心入口与依赖方向 | CORE-14, CORE-15, CORE-18, CORE-19 | Artplayer 门面、初始化依赖与最终目录 | 所有核心自有源码迁移,公开描述符/静态接口/事件差分通过 | H | done |
| CORE-21 | artplayer<br>生成核心声明并校验包内容 | CORE-20, ENG-07 | 由 TS 生成的既有入口声明与三种发布产物 | 内部类型不泄漏,旧 JS/TS 消费者与 i18n 通过;逐项完成 CORE-07 留下的 BASE-TYPE-04/05/07 声明方案,旧合法消费者与实际返回分别留证;不能以虚假的交叉返回类型或改变运行时来掩盖冲突,未决项阻止核心声明出口;处理 CORE-10 / BASE-TYPE-08 的 setter-only 属性虚构 getter 声明,并复核 PlaybackControls 精确视图与旧 toggle 声明共存策略 | H | todo |
| CORE-23 | artplayer<br>检查并补齐键盘、焦点与可访问名称 | CORE-13, CORE-14, CORE-17, ENG-05, BASE-04 | 主要控件/设置/模式退出的键盘与焦点回归、名称和字幕可用性检查及必要兼容修正 | 保持旧快捷键和 DOM/CSS 钩子;真实浏览器验证,不以静态属性检查代替交互;处理 BASE-DOM-01 的主要控件 Tab 不可达,保留既有名称与快捷键 | H | todo |
| CORE-22 | artplayer<br>核心阶段完整验收 | CORE-21, CORE-23, PILOT-01, ENG-08, ENG-10 | 核心与旧插件的可自动化完整回归、资源/性能及明确外部验证缺口 | 核心自动化和公开差异处置通过;真实环境缺口链接包集成/REL 门槛,阶段完成不代表可公开发布 | H | todo |
@@ -454,6 +454,7 @@
- CORE-17: [记录](changes/2026-09-11-CORE-17-input.md) [记录](baselines/input-validation.json)
- CORE-18: [记录](changes/2026-09-11-CORE-18-builtins-prompts.md) [记录](baselines/builtins-prompts-validation.json)
- CORE-19: [记录](changes/2026-09-11-CORE-19-capture-thumbnails.md) [记录](baselines/capture-progress-validation.json)
- CORE-20: [记录](changes/2026-09-11-CORE-20-entry.md) [记录](baselines/entry-validation.json)
- PKG-CHAPTER-01: [记录](changes/2026-09-10-PKG-CHAPTER-01-contract.md) [记录](baselines/chapter-contract.md)
- PKG-CHAPTER-02: [记录](changes/2026-09-10-PKG-CHAPTER-02-tests.md) [记录](baselines/chapter-validation.json)
- PKG-CHAPTER-03: [记录](changes/2026-09-10-PKG-CHAPTER-03-typescript-modules.md) [记录](baselines/chapter-migration-validation.json)
+8
View File
@@ -1,5 +1,13 @@
# 进度与证据
## 当前实施:CORE-20 核心入口与依赖收敛完成
核心全部 224 个自有源文件已迁移 TS,唯一 JS 为登记第三方 libs/screenfull.js。拆清入口、浏览器 bootstrap、DOM 叶层、实际属性/事件与初始化依赖;保持公开形状及顺序,修复构造/配置/AirPlay 销毁后继续安装和 proxy 挂载清理。
CI 447 项、229 个生产 TS 严格检查、实际 tarball 29 项运行时及五组类型通过。安装 UMD/legacy 各 1503 项三浏览器全量通过,各含 45 项 DOM/初始化专项;源码、包内文件、三个格式、docs/语言/许可指纹一致。见 [实施记录](changes/2026-09-11-CORE-20-entry.md) 和 [最终证据](baselines/entry-validation.json)。
关闭七项 CORE-20 差异;真实设备和 BASE-ENV-01 仍保留发布门槛,公开精确类型交 CORE-21。当前 214 项:56 完成、158 待办;下一项 CORE-21 生成声明及安装包类型协调。本任务独立本地提交,无推送或发布。
## 当前实施:CORE-19 进度、质量、截图与缩略图完成
截图和缩略图门面迁移 TS,拆清图像捕获、加载与布局。进度交互防止回调重入/跨源拖动继续 seek;质量切换对原生首次 seek 偏差最多修正一次,保持用户覆盖、取消与 Promise 结算。媒体/公开图片 URL 由调用方拥有,内部资源在配置、控件或实例结束时释放。保留公开 API、类型、正常事件顺序和 DOM/CSS;整列与首格缩略图裁剪是明确记录的显示修复。
+7
View File
@@ -111,3 +111,10 @@
| BASE-LIFE-43 | resolved / 已复现 | Replacing a media source revokes a caller-owned Blob URL still in use | CORE-19 |
| BASE-LIFE-44 | resolved / 已复现 | Native quality restoration can settle at a different position after its first seek | CORE-19 |
| BASE-ENV-01 | open / 已复现 | Windows WebKit native Blob video samples lack decoding support; Apple-device validation remains outstanding | REL-03, REVIEW-02 |
| BASE-ENV-02 | resolved / 已复现 | Custom iOS or Macintosh user agents dereference absent browser globals during SSR import | CORE-20 |
| BASE-LIFE-45 | resolved / 已复现 | Previous workspace safe-area measurement leaks its probe when native style access fails | CORE-20 |
| BASE-ENV-03 | resolved / 已复现 | Fallback event-path utilities dereference absent window in server environments | CORE-20 |
| BASE-LIFE-46 | resolved / 已复现 | Option initialization continues native, style and source writes after reentrant destruction | CORE-20 |
| BASE-LIFE-47 | resolved / 已复现 | AirPlay methods can call a picker or publish events and notices after destruction | CORE-20 |
| BASE-LIFE-48 | resolved / 已复现 | Proxy-time destruction cannot clean a template before its public assignment | CORE-20 |
| BASE-LIFE-49 | resolved / 已复现 | Constructor and Player initialization continue after a callback destroys the instance | CORE-20 |
+176 -1
View File
@@ -717,7 +717,8 @@
"CORE-07"
],
"evidence": [
"packages/artplayer/src/index.js"
"packages/artplayer/src/index.ts",
"packages/artplayer/src/option/resolve.ts"
],
"compatibleResolution": "Bundled validation dependency; preserve validation/default/merge behavior and failure cleanup when typing constructor boundaries.",
"closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
@@ -2238,6 +2239,180 @@
"closureCriteria": "Record actual Safari and Apple device versions and native sample capabilities, then compare published/candidate load, playback, seek, source replacement and Blob ownership.",
"workspaceState": "Independent video probes on Windows WebKit 26.6 return error 4 and width zero for both local MP4 and WebM Blob samples. Chromium and Firefox decode the tested Blob sample. WebKit ownership tests explicitly report decodedBlob=false.",
"resolutionEvidence": []
},
{
"id": "BASE-ENV-02",
"title": "Custom iOS or Macintosh user agents dereference absent browser globals during SSR import",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/environment.test.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Keep UA matching, override priority and browser flags while guarding absent window and navigator globals.",
"closureCriteria": "Published failure, isolated environment flags and complete candidate entry/installed import regressions pass without new import side effects.",
"workspaceState": "Absent window/navigator are guarded without changing custom UA priority or lazy evaluation. Full UMD/legacy/ESM imports from the installed tarball pass the explicit no-browser-global profile, and published failures remain tested.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/environment.test.js"
],
"resolutionRationale": "Absent window/navigator are guarded without changing custom UA priority or lazy evaluation. Full UMD/legacy/ESM imports from the installed tarball pass the explicit no-browser-global profile, and published failures remain tested."
},
{
"id": "BASE-LIFE-45",
"title": "Previous workspace safe-area measurement leaks its probe when native style access fails",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve public utility exports, tree/style semantics and primary errors while closing owned probe cleanup and absent-global failures.",
"closureCriteria": "Complete entry, source/consumer types and installed-package/browser exit pass with explicit source provenance.",
"workspaceState": "The CORE-19 own-source safe-area helper is frozen with provenance; candidate finally cleanup releases its probe on native append/style failures while preserving primary errors. Installed browser regressions pass. The npm baseline does not contain this helper.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js"
],
"resolutionRationale": "The CORE-19 own-source safe-area helper is frozen with provenance; candidate finally cleanup releases its probe on native append/style failures while preserving primary errors. Installed browser regressions pass. The npm baseline does not contain this helper."
},
{
"id": "BASE-ENV-03",
"title": "Fallback event-path utilities dereference absent window in server environments",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve public utility exports, tree/style semantics and primary errors while closing owned probe cleanup and absent-global failures.",
"closureCriteria": "Complete entry, source/consumer types and installed-package/browser exit pass with explicit source provenance.",
"workspaceState": "Fallback event paths preserve native receiver, original array identity and DOM ancestry while supporting an absent window. Published failure and candidate source/browser regressions pass.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js"
],
"resolutionRationale": "Fallback event paths preserve native receiver, original array identity and DOM ancestry while supporting an absent window. Published failure and candidate source/browser regressions pass."
},
{
"id": "BASE-LIFE-46",
"title": "Option initialization continues native, style and source writes after reentrant destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve initialization and AirPlay contracts while stopping effects after lifecycle cancellation; keep real device limits explicit.",
"closureCriteria": "Final constructor, strict source types, normal/error/teardown tests and installed-package/browser acceptance pass.",
"workspaceState": "Option initialization retains ordered native/storage/style/source writes, but checks lifecycle closure after callbacks, getters and conversion boundaries. Frozen old traces and complete installed construction tests cover the difference.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js"
],
"resolutionRationale": "Option initialization retains ordered native/storage/style/source writes, but checks lifecycle closure after callbacks, getters and conversion boundaries. Frozen old traces and complete installed construction tests cover the difference."
},
{
"id": "BASE-LIFE-47",
"title": "AirPlay methods can call a picker or publish events and notices after destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve initialization and AirPlay contracts while stopping effects after lifecycle cancellation; keep real device limits explicit.",
"closureCriteria": "Final constructor, strict source types, normal/error/teardown tests and installed-package/browser acceptance pass.",
"workspaceState": "AirPlay capability detection, picker getter/call completion, event and notice publication stop after closure. Controlled source and installed construction checks preserve normal receiver/error behavior; real AirPlay devices remain unverified release scope.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js"
],
"resolutionRationale": "AirPlay capability detection, picker getter/call completion, event and notice publication stop after closure. Controlled source and installed construction checks preserve normal receiver/error behavior; real AirPlay devices remain unverified release scope."
},
{
"id": "BASE-LIFE-48",
"title": "Proxy-time destruction cannot clean a template before its public assignment",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/instance-lifecycle.test.js",
"test/browser/initialization.spec.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve normal constructor order, public property visibility and first-call teardown semantics while cancelling later installation and cleaning the mounting template.",
"closureCriteria": "Strict final entry, normal/failed/reentrant construction and installed package/browser acceptance pass.",
"workspaceState": "Private mounting ownership permits cleanup before public template assignment. Installed removeHtml true/false, proxy ownership, destroy-observer order, replacement construction and failed-constructor regressions pass.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/instance-lifecycle.test.js",
"test/browser/initialization.spec.js"
],
"resolutionRationale": "Private mounting ownership permits cleanup before public template assignment. Installed removeHtml true/false, proxy ownership, destroy-observer order, replacement construction and failed-constructor regressions pass."
},
{
"id": "BASE-LIFE-49",
"title": "Constructor and Player initialization continue after a callback destroys the instance",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/browser/initialization.spec.js",
"test/initialization.test.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve normal constructor order, public property visibility and first-call teardown semantics while cancelling later installation and cleaning the mounting template.",
"closureCriteria": "Strict final entry, normal/failed/reentrant construction and installed package/browser acceptance pass.",
"workspaceState": "Player installers and outer construction stop after reentrant closure without publishing later plugins or registering the dead instance. Installed normal descriptors/static/subclass behavior and getter/native-write destruction cases pass.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/browser/initialization.spec.js",
"test/initialization.test.js"
],
"resolutionRationale": "Player installers and outer construction stop after reentrant closure without publishing later plugins or registering the dead instance. Installed normal descriptors/static/subclass behavior and getter/native-write destruction cases pass."
}
]
}
+5 -2
View File
@@ -1133,11 +1133,14 @@
"CORE-18",
"CORE-19"
],
"status": "todo",
"status": "done",
"risk": "H",
"deliverable": "Artplayer 门面、初始化依赖与最终目录",
"acceptance": "所有核心自有源码迁移,公开描述符/静态接口/事件差分通过",
"evidence": []
"evidence": [
"changes/2026-09-11-CORE-20-entry.md",
"baselines/entry-validation.json"
]
},
{
"id": "CORE-21",
+2 -1
View File
@@ -1184,7 +1184,8 @@
"CORE-07"
],
"sourceFiles": [
"packages/artplayer/src/index.js"
"packages/artplayer/src/index.ts",
"packages/artplayer/src/option/resolve.ts"
],
"contract": "Bundled validation dependency; preserve validation/default/merge behavior and failure cleanup when typing constructor boundaries.",
"validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",