fix(auto-thumbnail): [PKG-AUTO-THUMB-13] ignore registration after destroy

This commit is contained in:
Harvey Zhao committed 2026-09-15 19:16:22 +08:00
1 parent 9ba3c82f99
commit 876fa4c328
22 files changed
+4084 -11

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,68 @@
# PKG-AUTO-THUMB-13:已销毁宿主的迟到注册
基线 `9ba3c82f99e6bad0e858f6c2e1d8624dfb725c8c`。
## 问题与实现
应用保留插件 registrar(例如异步加载模块后的回调),在播放器已经 destroy 后
直接调用它,旧实现仍订阅 destroy、restart、video:loadedmetadata。旧 destroy
事件不会再次自然发生,因此新订阅没有可到达的正常销毁通知;之后若投递迟到的
元数据事件,还会创建隐藏 video。修复前两个实际核心的 Chromium 用例都记录
三个新增订阅和一个隐藏原生 video;Node 两个对应回归也失败。
入口在访问订阅或创建 session 之前读取公开 isDestroy,已经销毁时直接返回原有
名称对象。函数仍为 async,返回 Promise,没有新增拒绝、公开方法或结果字段。
内部 ThumbnailHost 的标志为可选,保留没有此字段的结构化旧宿主;false/缺省
宿主仍可完成 JPEG 抽帧、发布和清理。没有修改核心 plugins.add 的已有拒绝策略,
也不把本修复描述成允许该方法在销毁后继续工作。
仅修改入口与内部宿主类型,资源生命周期仍由既有 session/extraction 模块负责,
无需引入新抽象或依赖。API-05/06 的失效实例资源边界得到保护,API-09/11 的
公开声明、default 别名和分发入口保持不变。包 README 与架构说明同步更新。
## 测试、产物与工程入口
Node 24.21.0、Yarn Classic 1.22.22、TypeScript 5.9.3,Windows。
| 范围 | 结果 |
| --- | --- |
| 修复前四项 Node 回归 | 2 pass / 2 fail:残留三个订阅、访问不可用的销毁宿主成员 |
| 修复前真实核心 Chromium | 0 pass / 2 fail:新旧核心均新增订阅和隐藏 video |
| 完整 test:auto-thumbnail 源码/历史/类型集合 | 193 pass |
| 重建 main / legacy 的 auto-thumbnail-* 单元文件 | 各 88 pass |
| main 三引擎浏览器 | 42 pass / 0 skip / 0 retry |
| legacy 三引擎浏览器 | 42 pass / 0 skip / 0 retry |
| 包严格 TS、docs-tools TS、scoped lint | 通过 |
| 浏览器运行入口测试 | 18 pass |
| Yarn 严格工具链 | 通过 |
每个产物的 42 项包括六项实际新旧核心迟到注册,另 36 项已有原生资源/像素测试
使用受控插件宿主,验证元数据等待、抽帧/编码取消、成功 JPEG、别名和清理。
没有把所有 42 项称为完整真实核心组合。浏览器版本为 Chromium153.0.8010.12、
Firefox155.0、Windows WebKit26.6。新用例只观察订阅,不替换原生视频/抽帧方法。
故意投递元数据后记录资源,最后补发 destroy 清理修复前复现,不依赖重复
art.destroy() 自动清掉迟到资源。正常解码/编码仍由原生事件完成。
WebKit 无帧回调的既有两项像素用例继续只验后面三格,首两格仍是诊断;
AUTO-THUMB-PIXEL-01 不关闭,没有放宽原断言或新增跳过。
`yarn build artplayer-plugin-auto-thumbnail` 重建 main、legacy、ESM 及 docs/compiled
对应副本,未手改产物。test:unit 与 test:auto-thumbnail 加入新 Node 用例;
source 自动收集新 browser 文件,installedTests 显式加入它,入口测试和类型通过。
本轮实际浏览器使用重建 main/legacy,不声称执行了新的 tarball 安装测试。
既有安装 map 因生产源码改变需要重新打包生成,不能继续当作当前候选证据。
计划初次把未完成子任务追加到 doing 的03时被依赖校验拒绝,改为让 todo 的05
同时依赖03及本任务,保留全部旧依赖。没有绕开校验或提前将子任务标完成。
最终计划、风险、风险负例与提交审计必须通过。
精确输入、失败/最终报告及文件哈希见
[auto-thumbnail-registration-validation.json](../baselines/auto-thumbnail-registration-validation.json)。
## 状态和回退
关闭 AUTO-THUMB-REGISTRATION-01;PKG-AUTO-THUMB-03 的原生首帧问题、05 的设备/
组合、06 的安装与发布仍未完成。新增本任务后完成数 212,进行中21,待办43,
共276。没有修改包版本、Yarn 锁或依赖,没有推送、部署或发布。
回退本独立提交可同时恢复入口、内部类型、测试、构建文件及维护记录。
+6 -4
View File
@@ -2,9 +2,9 @@
> 由 tasks.json 生成。请修改数据后运行 `node refactor/scripts/plan.mjs --write`,不要手改本表。
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 275 项,范围 22 个包及工作区/示例。
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 276 项,范围 22 个包及工作区/示例。
状态:todo 43 / doing 21 / blocked 0 / done 211 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
状态:todo 43 / doing 21 / blocked 0 / done 212 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -19,7 +19,7 @@
| artplayer-plugin-ambilight | 1.1.0 | PKG-AMBILIGHT-01, PKG-AMBILIGHT-02, PKG-AMBILIGHT-03, PKG-AMBILIGHT-04, PKG-AMBILIGHT-PROXY-01, PKG-AMBILIGHT-05, PKG-AMBILIGHT-06, PKG-FACTORY-01 |
| artplayer-plugin-asr | 2.1.0 | PKG-ASR-01, PKG-ASR-02, PKG-ASR-03, PKG-ASR-04, PKG-ASR-05, PKG-ASR-06, PKG-ASR-07, PKG-ASR-08, PKG-ASR-09, PKG-ASR-10 |
| artplayer-plugin-audio-track | 1.1.0 | PKG-AUDIO-01, PKG-AUDIO-02, PKG-AUDIO-03, PKG-AUDIO-04, PKG-AUDIO-05, PKG-AUDIO-06, SITE-AUDIO-01 |
| artplayer-plugin-auto-thumbnail | 1.1.0 | PKG-AUTO-THUMB-01, PKG-AUTO-THUMB-02, PKG-AUTO-THUMB-03, PKG-AUTO-THUMB-04, PKG-AUTO-THUMB-05, PKG-AUTO-THUMB-06, PKG-AUTO-THUMB-07, PKG-AUTO-THUMB-08, PKG-AUTO-THUMB-09, PKG-AUTO-THUMB-10, PKG-AUTO-THUMB-11, PKG-AUTO-THUMB-12 |
| artplayer-plugin-auto-thumbnail | 1.1.0 | PKG-AUTO-THUMB-01, PKG-AUTO-THUMB-02, PKG-AUTO-THUMB-03, PKG-AUTO-THUMB-04, PKG-AUTO-THUMB-05, PKG-AUTO-THUMB-06, PKG-AUTO-THUMB-07, PKG-AUTO-THUMB-08, PKG-AUTO-THUMB-09, PKG-AUTO-THUMB-10, PKG-AUTO-THUMB-11, PKG-AUTO-THUMB-12, PKG-AUTO-THUMB-13 |
| artplayer-plugin-chapter | 1.1.0 | PILOT-01, PKG-CHAPTER-01, PKG-CHAPTER-02, PKG-CHAPTER-03, PKG-CHAPTER-04, PKG-CHAPTER-05, PKG-CHAPTER-06, PKG-CHAPTER-HOVER-01 |
| artplayer-plugin-chromecast | 1.1.0 | PKG-CAST-01, PKG-CAST-02, PKG-CAST-03, PKG-CAST-04, PKG-CAST-05, PKG-CAST-06 |
| artplayer-plugin-danmuku | 5.3.0 | PKG-DANMUKU-01, PKG-DANMUKU-02, PKG-DANMUKU-03, PKG-DANMUKU-04, PKG-DANMUKU-05, PKG-DANMUKU-06, PKG-DANMUKU-07, PKG-DANMUKU-08, PKG-DANMUKU-09, SITE-DANMUKU-01, PKG-DANMUKU-10, PKG-DANMUKU-11, PKG-DANMUKU-12, PKG-DANMUKU-MASK-LOAD-01 |
@@ -180,7 +180,7 @@
| PKG-AUTO-THUMB-02 | artplayer-plugin-auto-thumbnail<br>建立特有行为与错误测试 | PKG-AUTO-THUMB-01, ENG-03, ENG-05 | 抽帧边界、短视频、失败、连续来源和销毁中的抽帧 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | done |
| PKG-AUTO-THUMB-03 | artplayer-plugin-auto-thumbnail<br>整理内部职责与资源 | PKG-AUTO-THUMB-02, CORE-09, CORE-19, PKG-AUTO-THUMB-07 | 隐藏 video、seek 队列、canvas 编码与 Blob URL 清理 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | doing |
| PKG-AUTO-THUMB-04 | artplayer-plugin-auto-thumbnail<br>迁移自有源码和公开类型 | PKG-AUTO-THUMB-02, CORE-09, CORE-19, PKG-AUTO-THUMB-07, PKG-AUTO-THUMB-12, ENG-04, ENG-06, CORE-07, PKG-AUTO-THUMB-08, PKG-AUTO-THUMB-09, PKG-AUTO-THUMB-10, PKG-AUTO-THUMB-11 | 抽帧结果和真实异步插件返回类型兼容 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | done |
| PKG-AUTO-THUMB-05 | artplayer-plugin-auto-thumbnail<br>验证新旧核心和组合 | PKG-AUTO-THUMB-04, CORE-22, PKG-AUTO-THUMB-12, PKG-AUTO-THUMB-03 | 旧核心/候选核心预览、多次加载无过期缩略图覆盖 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | todo |
| PKG-AUTO-THUMB-05 | artplayer-plugin-auto-thumbnail<br>验证新旧核心和组合 | PKG-AUTO-THUMB-04, CORE-22, PKG-AUTO-THUMB-12, PKG-AUTO-THUMB-03, PKG-AUTO-THUMB-13 | 旧核心/候选核心预览、多次加载无过期缩略图覆盖 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | todo |
| PKG-AUTO-THUMB-06 | artplayer-plugin-auto-thumbnail<br>验证分发并同步文档 | PKG-AUTO-THUMB-05, ENG-07 | auto.thumbnail.js、三种产物和内存/URL 证据 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo |
| PKG-AUTO-THUMB-07 | artplayer-plugin-auto-thumbnail<br>终止抽帧时清空私有画布像素尺寸 | PKG-AUTO-THUMB-02, CORE-09, CORE-19 | 将私有 canvas 尺寸归入 job 清理;完成、取消、失败及分配重入均有回归,保留已编码 JPEG | 旧红新绿证明保留回调时画布归零,单项清理失败不阻断其他资源;原生取消和完成后 JPEG 仍可解码,原 API/时间公式/类型不变 | M | done |
| PKG-AUTO-THUMB-08 | artplayer-plugin-auto-thumbnail<br>保留旧声明并提供准确异步类型入口 | PKG-AUTO-THUMB-02, ENG-04, ENG-06, CORE-07 | 保留实际 npm 1.1.0 根声明;新增同实现 /runtime 类型、编辑器声明及隔离安装消费者 | 原 Parameters/ReturnType/替代函数不变;准确 Promise 类型正反例、CJS/ESM 条件入口和声明解析通过;不把像素与设备缺口计为通过 | M | done |
@@ -188,6 +188,7 @@
| PKG-AUTO-THUMB-10 | artplayer-plugin-auto-thumbnail<br>为渐进 JPEG 编码建立取消时限与独立资源归属 | PKG-AUTO-THUMB-02, PKG-AUTO-THUMB-07 | 拆分私有 canvas 编码模块,一次一帧的30秒编码时限,完成/失败/切源/销毁取消;迟到和重复回调无副作用 | 受控回调未返回的旧红新绿、正常JPEG和前一预览保持、同步重入/清理失败有回归;真实三浏览器编码/取消通过,公开时间公式与入口不变,首帧风险独立保留 | M | done |
| PKG-AUTO-THUMB-11 | artplayer-plugin-auto-thumbnail<br>保证抽帧事件属性清理异常不截断其他资源释放 | PKG-AUTO-THUMB-02, PKG-AUTO-THUMB-07, PKG-AUTO-THUMB-10 | 独立清除事件属性、抽帧时限和原生帧回调;首个异常保留,过期回调失效,替换任务可继续 | 八个故障注入用例旧红新绿,实际main/legacy抽帧与三浏览器生命周期回归通过;文档和构建同步,首帧及整体资源验收不冒充完成 | M | done |
| PKG-AUTO-THUMB-12 | artplayer-plugin-auto-thumbnail<br>终止隐藏视频元数据永久等待并释放资源 | PKG-AUTO-THUMB-02, CORE-09, CORE-19 | 元数据独立 30 秒期限、迟到回调失效、取消和错误清理、保留前一张可用预览;源码/重建产物及浏览器证据 | 旧红新绿、正常加载与阶段交接通过;实际挂起 HTTP 下销毁/切源/超时清理通过,不改变公开注册或帧时间公式,不关闭既有首帧风险 | M | done |
| PKG-AUTO-THUMB-13 | artplayer-plugin-auto-thumbnail<br>阻止已销毁实例的迟到插件注册重新持有资源 | PKG-AUTO-THUMB-02, PKG-AUTO-THUMB-04 | 入口检查公共销毁状态、保持异步名称结果;正常及无销毁标志的旧宿主兼容,源码/产物/真实核心回归 | 旧红新绿证明迟到注册零订阅且后续元数据不能创建隐藏视频;正常JPEG生成和清理不变,公开类型/入口不改,首帧问题保留 | M | done |
## 5 包迁移:artplayer-plugin-vtt-thumbnail
@@ -726,3 +727,4 @@
- CI-NPM-01: [记录](changes/2026-09-15-CI-NPM-01-bundle.md) [记录](baselines/npm-bundle-validation.json)
- SITE-AUDIO-01: [记录](changes/2026-09-15-SITE-AUDIO-01-guides.md) [记录](baselines/audio-docs-validation.json)
- SITE-VTT-01: [记录](changes/2026-09-15-SITE-VTT-01-guides.md) [记录](baselines/vtt-docs-validation.json)
- PKG-AUTO-THUMB-13: [记录](changes/2026-09-15-PKG-AUTO-THUMB-13-registration.md) [记录](baselines/auto-thumbnail-registration-validation.json)
+14
View File
@@ -1,5 +1,19 @@
# 进度与证据
## PKG-AUTO-THUMB-13 阻止销毁后迟到注册
修复保留registrar在宿主销毁后仍新增三个监听器、迟到元数据创建隐藏视频的问题。
入口检查公开isDestroy,保持Promise/name结果;内部标志可选,不影响旧结构宿主。
旧Node两项失败,真实新旧核心Chromium两项失败;修复后源码193通过,main/legacy
各88单元、各42三引擎浏览器通过。类型/lint/18入口测试通过,产物正常重建。
AUTO-THUMB-REGISTRATION-01关闭;原首帧像素问题及03/05/06仍未完成。新用例进入
Node脚本和installed名单,但未冒充新tarball安装验证,旧安装map需重新生成。
见[记录](changes/2026-09-15-PKG-AUTO-THUMB-13-registration.md)和[证据](baselines/auto-thumbnail-registration-validation.json)。
212 done、21 doing、43 todo,共276;无依赖/版本变更,无推送、部署或发布。
## SITE-VTT-01 缩略图双语指南与像素验证
新增中英文指南与本地侧栏,覆盖索引格式、相对路径、整秒包含边界、异步注册、
+1
View File
@@ -286,3 +286,4 @@
| HLS-EXAMPLE-01 | resolved / 已复现 | HLS示例换源累积销毁监听器且原生回退仍安装SDK控制插件 | SITE-HLS-01, EX-03 |
| DASH-EXAMPLE-01 | resolved / 已复现 | DASH示例重复销毁SDK、无MSE仍注册插件且空语言回调抛错 | SITE-DASH-01, EX-03 |
| CI-BROWSER-MODE-01 | resolved / 已复现 | Installed browser validation can inherit rendering substitutions and direct config loading bypasses launcher diagnostic policy | CI-01 |
| AUTO-THUMB-REGISTRATION-01 | resolved / 已复现 | Delayed direct factory installation on a destroyed host retains subscriptions and can restart hidden decoding | PKG-AUTO-THUMB-13 |
+21
View File
@@ -6733,6 +6733,27 @@
"refactor/baselines/ci-rendering-policy-validation.json"
],
"resolutionRationale": "Eleven new regression failures against the old implementation become passing; final eighteen entry tests and seventy-seven CI tests pass. Fresh twenty-package preparation and four actual installed Chromium lifecycle cases verify the normal path. Scope excludes future unreviewed flags and full CI acceptance."
},
{
"id": "AUTO-THUMB-REGISTRATION-01",
"title": "Delayed direct factory installation on a destroyed host retains subscriptions and can restart hidden decoding",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-AUTO-THUMB-13"
],
"evidence": [
"test/auto-thumbnail-registration.test.js",
"test/browser/auto-thumbnail-registration.spec.js",
"refactor/changes/2026-09-15-PKG-AUTO-THUMB-13-registration.md",
"refactor/baselines/auto-thumbnail-registration-validation.json"
],
"compatibleResolution": "Return the existing asynchronous name result before touching a destroyed host; retain live and structurally compatible hosts without isDestroy.",
"closureCriteria": "Prechange source and real-core browser failures plus fixed source, rebuilt main/legacy and normal extraction/type regressions; no change to full pixel/device gates.",
"resolutionEvidence": [
"refactor/baselines/auto-thumbnail-registration-validation.json"
],
"resolutionRationale": "Two prechange Node failures and both real-core Chromium failures reproduce retained subscriptions and native video creation. Source193, main/legacy88 each and three-engine42 each pass after the entry guard; live/absent-flag hosts retain successful generation. Public types and first-frame/device gates remain unchanged."
}
]
}
+22 -1
View File
@@ -1888,7 +1888,8 @@
"PKG-AUTO-THUMB-04",
"CORE-22",
"PKG-AUTO-THUMB-12",
"PKG-AUTO-THUMB-03"
"PKG-AUTO-THUMB-03",
"PKG-AUTO-THUMB-13"
],
"status": "todo",
"risk": "H",
@@ -5926,6 +5927,26 @@
"changes/2026-09-15-SITE-VTT-01-guides.md",
"baselines/vtt-docs-validation.json"
]
},
{
"id": "PKG-AUTO-THUMB-13",
"phase": "5 包迁移:artplayer-plugin-auto-thumbnail",
"title": "阻止已销毁实例的迟到插件注册重新持有资源",
"scope": [
"artplayer-plugin-auto-thumbnail"
],
"dependsOn": [
"PKG-AUTO-THUMB-02",
"PKG-AUTO-THUMB-04"
],
"status": "done",
"risk": "M",
"deliverable": "入口检查公共销毁状态、保持异步名称结果;正常及无销毁标志的旧宿主兼容,源码/产物/真实核心回归",
"acceptance": "旧红新绿证明迟到注册零订阅且后续元数据不能创建隐藏视频;正常JPEG生成和清理不变,公开类型/入口不改,首帧问题保留",
"evidence": [
"changes/2026-09-15-PKG-AUTO-THUMB-13-registration.md",
"baselines/auto-thumbnail-registration-validation.json"
]
}
]
}