refactor(chromecast): [PKG-CAST-03] isolate SDK and player lifecycles

This commit is contained in:
Harvey Zhao committed 2026-09-13 17:13:35 +08:00
1 parent 87cfcf5a6c
commit b0cfbfe3a0
26 files changed
+2503 -551

No files matched your search

@@ -0,0 +1,185 @@
{
"schemaVersion": 1,
"task": "PKG-CAST-03",
"status": "done",
"capturedAt": "2026-09-13T09:12:41.513Z",
"frozenSourceCommit": "146b78d5767bba88612184869155a39317794537",
"unit": [
{
"file": "refactor/.cache/chromecast03-combined.log",
"tests": 128,
"sha256": "9ee410f58d5a4f00b574ab8fabab6237e8befcbee7701ee519f2a029d9709eb0",
"failed": 0,
"skipped": 0
},
{
"file": "refactor/.cache/chromecast03-main.log",
"tests": 35,
"sha256": "31ae3664139c37f89e398364f5ec52d260fa27d6d9fad6a3d15540b23a3be739",
"failed": 0,
"skipped": 0
},
{
"file": "refactor/.cache/chromecast03-legacy.log",
"tests": 35,
"sha256": "f1488bc634c48d744b32f854686fc7a0ecdf2ccfd638c0ce3f9837bcbc5bdcbf",
"failed": 0,
"skipped": 0
}
],
"browsers": [
{
"name": "source-final",
"file": "refactor/.cache/chromecast03-browser-source-final/report.json",
"sha256": "d59ba138015444168c11f728831ca9369c096282f62323472edce98f75f728d6",
"tests": 45,
"failures": 0,
"skips": 0,
"versions": [
"chromium: 153.0.8010.12",
"firefox: 155.0",
"webkit: 26.6"
],
"inputSha256": "d973945154aa56dafa4ef0de5425661606cef25f1d363c05120f7764b9e53a94",
"sdk": "Controlled SDK; native DOM, actual cores and local video; no real receiver validation."
},
{
"name": "main",
"file": "refactor/.cache/chromecast03-browser-main/report.json",
"sha256": "23dca701c479232d4fc265a2b7fad657fbfdbded8892be5ff1bc5e34b4b7e963",
"tests": 45,
"failures": 0,
"skips": 0,
"versions": [
"chromium: 153.0.8010.12",
"firefox: 155.0",
"webkit: 26.6"
],
"inputSha256": "80b12b3081086488c9d80f03979c336d4a6fdb44dca298e218dfeaaadb295d00",
"sdk": "Controlled SDK; native DOM, actual cores and local video; no real receiver validation."
},
{
"name": "legacy",
"file": "refactor/.cache/chromecast03-browser-legacy/report.json",
"sha256": "eebeb37f9e83d9a583d630c81a3685cc0a9be3c99c36f71ea02a9808fcc137b3",
"tests": 45,
"failures": 0,
"skips": 0,
"versions": [
"chromium: 153.0.8010.12",
"firefox: 155.0",
"webkit: 26.6"
],
"inputSha256": "b21a30852403914a3bf3defc89aff11f2cc23b044ed68ccf667164b477f04172",
"sdk": "Controlled SDK; native DOM, actual cores and local video; no real receiver validation."
}
],
"artifacts": [
{
"file": "packages/artplayer-plugin-chromecast/dist/artplayer-plugin-chromecast.js",
"copied": "docs/compiled/artplayer-plugin-chromecast.js",
"sha256": "80b12b3081086488c9d80f03979c336d4a6fdb44dca298e218dfeaaadb295d00",
"bytes": 6096,
"previousIconRemoved": true
},
{
"file": "packages/artplayer-plugin-chromecast/dist/artplayer-plugin-chromecast.legacy.js",
"copied": "docs/compiled/artplayer-plugin-chromecast.legacy.js",
"sha256": "b21a30852403914a3bf3defc89aff11f2cc23b044ed68ccf667164b477f04172",
"bytes": 6633,
"previousIconRemoved": true
},
{
"file": "packages/artplayer-plugin-chromecast/dist/artplayer-plugin-chromecast.mjs",
"copied": "docs/compiled/artplayer-plugin-chromecast.mjs",
"sha256": "68d81fcab469f74fe9d9740842d989e10144f7ff28c7ade91ed22adee90f44d7",
"bytes": 11546,
"previousIconRemoved": true
}
],
"inputs": [
{
"path": "packages/artplayer-plugin-chromecast/src/cast.svg",
"algorithm": "sha256-lf",
"sha256": "48470d66b5874569c54d66889b0ec62c33bf809670d4baf2eded2bfa83d6d726"
},
{
"path": "packages/artplayer-plugin-chromecast/src/controller.ts",
"algorithm": "sha256-lf",
"sha256": "e61760f082e233da1f4e94ca98c68b4f07357117a66b2b5c448659dd57cb193d"
},
{
"path": "packages/artplayer-plugin-chromecast/src/index.ts",
"algorithm": "sha256-lf",
"sha256": "951d8bbaf273c56722d3767a514a3f8a65050122d934612e5c53c8349d1400e7"
},
{
"path": "packages/artplayer-plugin-chromecast/src/media.ts",
"algorithm": "sha256-lf",
"sha256": "6c16b3cc7b5c570dbb6ae7a4ff9c1492f8e6a07d07662db2b417ff825b7f0dd1"
},
{
"path": "packages/artplayer-plugin-chromecast/src/sdk.ts",
"algorithm": "sha256-lf",
"sha256": "eee5ff443406c400bd54822b71b20e1bb8a9191e15c625eb329cb3207a01902f"
},
{
"path": "packages/artplayer-plugin-chromecast/src/types.ts",
"algorithm": "sha256-lf",
"sha256": "9958a32fb20e0ed55b7f0b6d34e02febe67966a972a9055999f5a030d034a178"
},
{
"path": "packages/artplayer-plugin-chromecast/tsconfig.json",
"algorithm": "sha256-lf",
"sha256": "4e4d4e725a1f49736504f408a1b56abb6a1f1aec9213be890b5db6c7c7a28002"
},
{
"path": "test/browser/chromecast-lifecycle.spec.js",
"algorithm": "sha256-lf",
"sha256": "8a9b47f899e018cb43d396d58ffc29144c97f5feef753eb9b91df0cf8ecd674e"
},
{
"path": "test/chromecast-runtime.test.js",
"algorithm": "sha256-lf",
"sha256": "94ce42f8d92f529a7ca93294369f017e6953405a4ea84b3bfbd0bc50f178c67a"
}
],
"priorFailure": {
"file": "refactor/.cache/chromecast03-browser-initial/report.json",
"sha256": "fa189b92b0d6b0a0812fdb62bc75fa95e0fce14aabfa02d4323e1d5c7cacba37",
"expected": 18,
"unexpected": 27,
"cause": "Production assumed Control.add returns a node; WebKit test misclassified same-origin Blob URLs. Both corrected without deleting assertions."
},
"focusedRedGreen": [
{
"file": "refactor/.cache/chromecast03-mounted-red.log",
"sha256": "fbafc237ac36de524f918310a4aa682106c0fe40604f601b918257b58aa6de72"
},
{
"file": "refactor/.cache/chromecast03-mounted-green.log",
"sha256": "9e3452207925efed6e2b7e84d7facd51bad61d1d3f10384e41883de2bdba3ef5"
}
],
"checks": [
{
"file": "refactor/.cache/chromecast03-build.log",
"sha256": "538ecc3cd0d78f3b25f25ba3e3263f7f78988ea9126526d959cb42341bc7a495"
},
{
"file": "refactor/.cache/chromecast03-typecheck.log",
"sha256": "881cbc6371263597ec45d5af816997f5d93bdda99045a532df8a04a9cbec7c07"
},
{
"file": "refactor/.cache/chromecast03-lint.log",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
],
"limitations": [
"Public declarations still owned by CAST04.",
"SDK06/CAST05 real HTTPS sender, Cast SDK, receiver and network playback remain unverified.",
"Controlled Windows WebKit is not Safari device evidence.",
"Pending loader ownership is shared within one loaded plugin module, not independently loaded copies."
],
"releaseReady": false
}
@@ -0,0 +1,50 @@
# PKG-CAST-03 Chromecast 模块与生命周期修复
原单文件拆为5个strict TypeScript模块:入口、SDK加载协调、每实例控制器、媒体请求、
内部SDK类型。公开npm声明保持原状,精确公开类型留给04;不会因内部TS迁移静默
修改历史类型。保留异步注册、控件name/位置/tooltip/HTML hooks、live选项与回调this、
原始SessionState getter和旧CommonJS default调用。详细维护边界见
[包内架构](../../packages/artplayer-plugin-chromecast/ARCHITECTURE.md)。
## 已修复行为
- requestSession成功后重新读取getCurrentSession,不再把完成值当session。
- 完整SDK立即复用,同模块多实例共享待加载脚本;保留外部availability回调,失败
可重试,最后等待者销毁可释放自有脚本。无SDK就绪信号时30秒超时,定时器可释放。
- availability同步安装监听,初始NO_SESSION不吞掉首次请求;请求/媒体期间终态
和会话替换取消过时结果。重复及同步重入点击共享同一个操作。
- await完整loadMedia链,原始错误只通知一次;DOM点击无人接收Promise时有独立
拒绝观察,程序调用仍收到原始拒绝。销毁后没有晚到成功提示或新媒体加载。
- 每实例分别维护状态与监听,销毁尝试全部清理,不结束页面共享投屏会话。
- 默认图标换为本项目原创几何SVG,保留自定义icon与外层class。旧商业图形仅保留
在历史基线,候选源码、三格式dist及docs/compiled均移除该path。
## 真实浏览器反查出的错误
首轮源码浏览器45项中18通过、27失败,原始报告和trace保存在
`refactor/.cache/chromecast03-browser-initial/`,没有删除失败证据。
其中实际Control.add返回undefined,测试替身却返回节点,掩盖了候选图标不变色。
修复改用既有mounted回调捕获本控件,候选替身也改为准确回放mounted并返回undefined。
改测试后、改源码前的红例保留在`chromecast03-mounted-red.log`;修复后35项绿例在
`chromecast03-mounted-green.log`。没有改核心返回值,也没有弱化颜色断言。
WebKit另有测试边界错误:同源Blob URL被误当外网。测试仅放行与测试baseURL精确
同origin的blob,真正外网仍阻断并断言零尝试;没有拦截unhandledrejection来掩盖错误。
## 验证与未完成范围
93项冻结历史行为/故障测试和35项候选测试共128通过;最终main、legacy各35项通过,
并核对真实mjs及可写default身份。正常Yarn构建更新三格式dist与docs/compiled。
共享strict检查覆盖366个生产TS文件;定向lint通过。
源码、最终main、最终legacy各45项真实浏览器测试通过,共135项、零skip。
每组使用真实核心5.3.0、最新已冻结发布核心及候选核心,运行Chromium/Firefox/Windows
WebKit;断言实际DOM点击、控件归属、状态颜色、加载/销毁、失败重试与无未处理错误。
SDK明确为受控替身,本地视频和控件是真实浏览器对象。Windows WebKit不等于Safari
设备支持,以上不证明真实SDK发现设备或接收器播放。
本任务关闭5项已复现Cast实现风险及候选图标来源风险;SDK-06真实HTTPS sender、
接收设备与媒体可达性留给05,公开类型留给04,完整npm分发验收留给06。不同模块副本
不共享内部加载注册表;页面其他Cast应用的接收器配置不由本插件协商。所有这些限制
已写入包内文档,没有静默判作通过。可追溯哈希、日志和范围见
[验证记录](../baselines/chromecast-runtime-validation.json)。独立本地完成提交,不推送或发布。
+3 -2
View File
@@ -4,7 +4,7 @@
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 228 项,范围 22 个包及工作区/示例。
状态:todo 78 / doing 15 / blocked 0 / done 135 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
状态:todo 78 / doing 14 / blocked 0 / done 136 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -289,7 +289,7 @@
| --- | --- | --- | --- | --- | --- | --- |
| PKG-CAST-01 | artplayer-plugin-chromecast<br>核对包契约与历史用法 | BASE-05 | url/sdk/icon/mimeType、loader、会话、全局 SDK 与结果 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结 | H | done |
| PKG-CAST-02 | artplayer-plugin-chromecast<br>建立特有行为与错误测试 | PKG-CAST-01, ENG-03, ENG-05 | SDK 脚本加载失败/重入、无设备/拒绝、重复实例与销毁 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | done |
| PKG-CAST-03 | artplayer-plugin-chromecast<br>整理内部职责与资源 | PKG-CAST-02, CORE-11, CORE-13 | SDK singleton/实例订阅/会话与控件职责分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | doing |
| PKG-CAST-03 | artplayer-plugin-chromecast<br>整理内部职责与资源 | PKG-CAST-02, CORE-11, CORE-13 | SDK singleton/实例订阅/会话与控件职责分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | done |
| PKG-CAST-04 | artplayer-plugin-chromecast<br>迁移自有源码和公开类型 | PKG-CAST-03, ENG-04, ENG-06, CORE-07 | Cast 能力 adapter、全局对象和元数据类型 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | todo |
| PKG-CAST-05 | artplayer-plugin-chromecast<br>验证新旧核心和组合 | PKG-CAST-04, CORE-22 | stub 测试之外记录实际 Cast 设备会话、源更新和断开 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | todo |
| PKG-CAST-06 | artplayer-plugin-chromecast<br>验证分发并同步文档 | PKG-CAST-05, ENG-07 | chromecast.js、SDK URL/权限能力及待支持环境说明 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo |
@@ -544,6 +544,7 @@
- PKG-VAST-03: [记录](changes/2026-09-12-PKG-VAST-03-lifecycle.md) [记录](baselines/vast-lifecycle-validation.json) [记录](vast-compatibility-decision.md)
- PKG-CAST-01: [记录](baselines/chromecast-release.json) [记录](baselines/chromecast-contract.md) [记录](baselines/chromecast-contract-validation.json) [记录](changes/2026-09-13-PKG-CAST-01-contracts.md)
- PKG-CAST-02: [记录](changes/2026-09-13-PKG-CAST-02-failures.md) [记录](baselines/chromecast-failures-validation.json)
- PKG-CAST-03: [记录](changes/2026-09-13-PKG-CAST-03-runtime.md) [记录](baselines/chromecast-runtime-validation.json)
- PKG-DPIP-01: [记录](changes/2026-09-12-PKG-DPIP-01-contract.md) [记录](baselines/dpip-release.json) [记录](baselines/dpip-contract.md) [记录](baselines/dpip-contract-validation.json) [记录](dpip-validation.md)
- PKG-DPIP-02: [记录](changes/2026-09-12-PKG-DPIP-02-tests.md) [记录](baselines/dpip-behavior-validation.json) [记录](dpip-validation.md)
- PKG-DPIP-03: [记录](changes/2026-09-12-PKG-DPIP-03-lifecycle.md) [记录](baselines/dpip-lifecycle-validation.json) [记录](dpip-validation.md)
+11
View File
@@ -1,5 +1,16 @@
# 进度与证据
## PKG-CAST-03 Chromecast生产重构完成
5个TS模块与35个候选测试落地,SDK等待/会话返回值/过期结果/实例图标/错误Promise
已修复。真实浏览器进一步发现Control.add返回undefined导致图标不变色,已用mounted
修复并保留红绿证据。128项历史+候选测试、main/legacy各35项、三形态各45项浏览器
全部通过;正常构建和366生产TS strict检查通过。原商业SVG换为原创几何图形。
见[变更](changes/2026-09-13-PKG-CAST-03-runtime.md)及[证据](baselines/chromecast-runtime-validation.json)。
228项:136 done、14 doing、78 todo。04公开类型、05真实SDK/设备、06分发继续;
135浏览器项使用受控SDK,不能当作接收设备投屏通过。没有推送或发布。
## PKG-MULTI-SUB-04 Multiple Subtitles 类型兼容实施完成
已落实用户批准的最新npm 1.2.0根类型及较早1.0.0/1.1.0迁移规则;/runtime准确
+6 -6
View File
@@ -214,10 +214,10 @@
| ASR-FOREIGN-01 | resolved / 已复现 | Firefox permits parallel native media-element owners instead of selecting capture fallback | PKG-ASR-05, PKG-ASR-09 |
| ASR-CORS-01 | open / 已复现 | Default WebAudio binding silences CORS-cross-origin media that otherwise advances normally | PKG-ASR-05 |
| ASR-RESTART-01 | resolved / 已复现 | Delayed captured-source restart resumes recognition after a newer pause or stop | PKG-ASR-09 |
| VENDOR-10 | open / 源码/产物事实 | Chromecast embeds a Font Awesome Pro path with no established redistribution entitlement | PKG-CAST-03, PKG-CAST-06 |
| VENDOR-10 | resolved / 源码/产物事实 | Chromecast embeds a Font Awesome Pro path with no established redistribution entitlement | PKG-CAST-03, PKG-CAST-06 |
| CAST-TYPE-01 | open / 源码/产物事实 | Chromecast declarations describe a synchronous name-only registration and omit existing runtime callbacks and query methods | PKG-CAST-04 |
| CAST-SDK-01 | open / 已复现 | Cast requestSession completion is incorrectly passed to loadMedia as a session | PKG-CAST-03, PKG-CAST-05 |
| CAST-LOADER-01 | open / 已复现 | Cast readiness waits hang or overwrite each other across ready SDKs, repeated clicks and multiple instances | PKG-CAST-03, PKG-CAST-05 |
| CAST-LIFE-01 | open / 已复现 | Cast listeners and continuations survive player destruction and update another player icon | PKG-CAST-03, PKG-CAST-05 |
| CAST-STATE-01 | open / 已复现 | Cast terminal session states leave the normalized callback and icon connected | PKG-CAST-03, PKG-CAST-05 |
| CAST-ERROR-01 | open / 已复现 | Cast media loading rejection escapes on a detached Promise while the click has already fulfilled | PKG-CAST-03, PKG-CAST-05 |
| CAST-SDK-01 | resolved / 已复现 | Cast requestSession completion is incorrectly passed to loadMedia as a session | PKG-CAST-03, PKG-CAST-05 |
| CAST-LOADER-01 | resolved / 已复现 | Cast readiness waits hang or overwrite each other across ready SDKs, repeated clicks and multiple instances | PKG-CAST-03, PKG-CAST-05 |
| CAST-LIFE-01 | resolved / 已复现 | Cast listeners and continuations survive player destruction and update another player icon | PKG-CAST-03, PKG-CAST-05 |
| CAST-STATE-01 | resolved / 已复现 | Cast terminal session states leave the normalized callback and icon connected | PKG-CAST-03, PKG-CAST-05 |
| CAST-ERROR-01 | resolved / 已复现 | Cast media loading rejection escapes on a detached Promise while the click has already fulfilled | PKG-CAST-03, PKG-CAST-05 |
+55 -13
View File
@@ -713,7 +713,7 @@
"PKG-CAST-05"
],
"evidence": [
"packages/artplayer-plugin-chromecast/src/index.js"
"packages/artplayer-plugin-chromecast/src/sdk.ts"
],
"compatibleResolution": "Default remote cast_sender.js?loadCastFramework=1; sdk URL/options and actual Cast device/session behavior require separate validation.",
"closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
@@ -4743,7 +4743,7 @@
"id": "VENDOR-10",
"title": "Chromecast embeds a Font Awesome Pro path with no established redistribution entitlement",
"confirmation": "source-observed",
"status": "open",
"status": "resolved",
"owners": [
"PKG-CAST-03",
"PKG-CAST-06"
@@ -4753,7 +4753,14 @@
"refactor/baselines/chromecast-release.json"
],
"compatibleResolution": "Replace the default embedded artwork with an owned simple Cast indicator while retaining the custom icon option and wrapper classes; keep historical provenance separate.",
"closureCriteria": "Owned or properly licensed default artwork replaces the commercial-marked source and every shipped bundle, with source/provenance and generated-output checks."
"closureCriteria": "Owned or properly licensed default artwork replaces the commercial-marked source and every shipped bundle, with source/provenance and generated-output checks.",
"resolutionEvidence": [
"refactor/changes/2026-09-13-PKG-CAST-03-runtime.md",
"refactor/baselines/chromecast-runtime-validation.json",
"test/chromecast-runtime.test.js",
"test/browser/chromecast-lifecycle.spec.js"
],
"resolutionRationale": "Original repo-authored geometric SVG replaces the commercial path in source and all three built/copied formats; historical source remains frozen, no claim of rights in the removed artwork."
},
{
"id": "CAST-TYPE-01",
@@ -4774,7 +4781,7 @@
"id": "CAST-SDK-01",
"title": "Cast requestSession completion is incorrectly passed to loadMedia as a session",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"PKG-CAST-03",
"PKG-CAST-05"
@@ -4784,13 +4791,20 @@
"refactor/baselines/chromecast-failures-validation.json"
],
"compatibleResolution": "Retrieve the actual current session after request success and validate live instance ownership.",
"closureCriteria": "Successful undefined/null request result loads through the current session; absence and refusal preserve appropriate original errors."
"closureCriteria": "Successful undefined/null request result loads through the current session; absence and refusal preserve appropriate original errors.",
"resolutionEvidence": [
"refactor/changes/2026-09-13-PKG-CAST-03-runtime.md",
"refactor/baselines/chromecast-runtime-validation.json",
"test/chromecast-runtime.test.js",
"test/browser/chromecast-lifecycle.spec.js"
],
"resolutionRationale": "35 candidate source/main/legacy tests and 135 native browser DOM/core cases verify corrected behavior against controlled SDK boundaries. 93 frozen historical observations remain. Actual remote SDK and receivers remain SDK06/CAST05, not waived."
},
{
"id": "CAST-LOADER-01",
"title": "Cast readiness waits hang or overwrite each other across ready SDKs, repeated clicks and multiple instances",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"PKG-CAST-03",
"PKG-CAST-05"
@@ -4800,13 +4814,20 @@
"refactor/baselines/chromecast-failures-validation.json"
],
"compatibleResolution": "Coordinate one reusable loader per document with readiness detection, shared pending work and complete error settlement.",
"closureCriteria": "Ready, pending, failure, retry, external callback and multiple instances are covered without duplicate scripts or stranded callers."
"closureCriteria": "Ready, pending, failure, retry, external callback and multiple instances are covered without duplicate scripts or stranded callers.",
"resolutionEvidence": [
"refactor/changes/2026-09-13-PKG-CAST-03-runtime.md",
"refactor/baselines/chromecast-runtime-validation.json",
"test/chromecast-runtime.test.js",
"test/browser/chromecast-lifecycle.spec.js"
],
"resolutionRationale": "35 candidate source/main/legacy tests and 135 native browser DOM/core cases verify corrected behavior against controlled SDK boundaries. 93 frozen historical observations remain. Actual remote SDK and receivers remain SDK06/CAST05, not waived."
},
{
"id": "CAST-LIFE-01",
"title": "Cast listeners and continuations survive player destruction and update another player icon",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"PKG-CAST-03",
"PKG-CAST-05"
@@ -4816,13 +4837,20 @@
"refactor/baselines/chromecast-failures-validation.json"
],
"compatibleResolution": "Use per-registration lifecycle ownership, scoped control nodes and obsolete-operation checks without ending a page-shared session.",
"closureCriteria": "Destroyed players get no late media loads or callbacks; subscriptions are removed and separate players keep independent UI."
"closureCriteria": "Destroyed players get no late media loads or callbacks; subscriptions are removed and separate players keep independent UI.",
"resolutionEvidence": [
"refactor/changes/2026-09-13-PKG-CAST-03-runtime.md",
"refactor/baselines/chromecast-runtime-validation.json",
"test/chromecast-runtime.test.js",
"test/browser/chromecast-lifecycle.spec.js"
],
"resolutionRationale": "35 candidate source/main/legacy tests and 135 native browser DOM/core cases verify corrected behavior against controlled SDK boundaries. 93 frozen historical observations remain. Actual remote SDK and receivers remain SDK06/CAST05, not waived."
},
{
"id": "CAST-STATE-01",
"title": "Cast terminal session states leave the normalized callback and icon connected",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"PKG-CAST-03",
"PKG-CAST-05"
@@ -4832,13 +4860,20 @@
"refactor/baselines/chromecast-failures-validation.json"
],
"compatibleResolution": "Map terminal states without changing the raw SessionState query API.",
"closureCriteria": "Ended and failed states update UI and callbacks while getCastState keeps original SessionState values."
"closureCriteria": "Ended and failed states update UI and callbacks while getCastState keeps original SessionState values.",
"resolutionEvidence": [
"refactor/changes/2026-09-13-PKG-CAST-03-runtime.md",
"refactor/baselines/chromecast-runtime-validation.json",
"test/chromecast-runtime.test.js",
"test/browser/chromecast-lifecycle.spec.js"
],
"resolutionRationale": "35 candidate source/main/legacy tests and 135 native browser DOM/core cases verify corrected behavior against controlled SDK boundaries. 93 frozen historical observations remain. Actual remote SDK and receivers remain SDK06/CAST05, not waived."
},
{
"id": "CAST-ERROR-01",
"title": "Cast media loading rejection escapes on a detached Promise while the click has already fulfilled",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"PKG-CAST-03",
"PKG-CAST-05"
@@ -4848,7 +4883,14 @@
"refactor/baselines/chromecast-failures-validation.json"
],
"compatibleResolution": "Await the complete media-loading chain and preserve one original error notification.",
"closureCriteria": "loadMedia failure reaches the click promise exactly once, no orphan rejection or duplicated error callback; success ordering remains documented."
"closureCriteria": "loadMedia failure reaches the click promise exactly once, no orphan rejection or duplicated error callback; success ordering remains documented.",
"resolutionEvidence": [
"refactor/changes/2026-09-13-PKG-CAST-03-runtime.md",
"refactor/baselines/chromecast-runtime-validation.json",
"test/chromecast-runtime.test.js",
"test/browser/chromecast-lifecycle.spec.js"
],
"resolutionRationale": "35 candidate source/main/legacy tests and 135 native browser DOM/core cases verify corrected behavior against controlled SDK boundaries. 93 frozen historical observations remain. Actual remote SDK and receivers remain SDK06/CAST05, not waived."
}
]
}
+5 -2
View File
@@ -3043,11 +3043,14 @@
"CORE-11",
"CORE-13"
],
"status": "doing",
"status": "done",
"risk": "H",
"deliverable": "SDK singleton/实例订阅/会话与控件职责分离",
"acceptance": "结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过",
"evidence": []
"evidence": [
"changes/2026-09-13-PKG-CAST-03-runtime.md",
"baselines/chromecast-runtime-validation.json"
]
},
{
"id": "PKG-CAST-04",
+14 -10
View File
@@ -1078,30 +1078,32 @@
"riskId": "VENDOR-10",
"inputs": [
"packages/artplayer-plugin-chromecast/src/cast.svg",
"packages/artplayer-plugin-chromecast/src/index.js"
"packages/artplayer-plugin-chromecast/src/controller.ts"
],
"owners": [
"PKG-CAST-03",
"PKG-CAST-06"
],
"sourceStatus": "Exact SVG path matches the runtime default icon; source notice identifies Font Awesome Pro 6.5.1.",
"licenseStatus": "Commercial License notice exists in cast.svg; repository entitlement and redistribution authorization are not established by the package MIT metadata.",
"updatePolicy": "Replace with owned artwork or verify permission before release; preserve user-supplied icon support and icon wrapper classes, retain historical archive evidence.",
"sourceStatus": "Former commercial SVG removed. Current cast.svg is an original geometric icon authored for this repository during PKG-CAST-03; controller imports that file directly.",
"licenseStatus": "Current original repository artwork follows the package MIT license; no entitlement in or relicensing of the removed Font Awesome Pro artwork is asserted.",
"updatePolicy": "Keep original artwork and custom icon/wrapper support; review any replacement provenance and verify actual rebuilt/shipped assets. Historical commercial-source evidence remains immutable.",
"fingerprints": [
{
"path": "packages/artplayer-plugin-chromecast/src/cast.svg",
"algorithm": "sha256-lf",
"sha256": "8c0f9ad82c2d6c70afb70ab5002204c4948dd282fbf52095aed4b07fa8d466d4"
"sha256": "48470d66b5874569c54d66889b0ec62c33bf809670d4baf2eded2bfa83d6d726"
},
{
"path": "packages/artplayer-plugin-chromecast/src/index.js",
"path": "packages/artplayer-plugin-chromecast/src/controller.ts",
"algorithm": "sha256-lf",
"sha256": "2ab8967cf7fdbf9fbac8a9afe73713e66047bad7e4d4afc802665ce594fa3274"
"sha256": "e61760f082e233da1f4e94ca98c68b4f07357117a66b2b5c448659dd57cb193d"
}
],
"reviewEvidence": [
"refactor/baselines/chromecast-release.json",
"refactor/changes/2026-09-13-PKG-CAST-01-contracts.md"
"refactor/changes/2026-09-13-PKG-CAST-01-contracts.md",
"refactor/changes/2026-09-13-PKG-CAST-03-runtime.md",
"refactor/baselines/chromecast-runtime-validation.json"
]
}
],
@@ -1191,10 +1193,12 @@
"PKG-CAST-05"
],
"sourceFiles": [
"packages/artplayer-plugin-chromecast/src/index.js"
"packages/artplayer-plugin-chromecast/src/sdk.ts",
"packages/artplayer-plugin-chromecast/src/controller.ts",
"packages/artplayer-plugin-chromecast/src/media.ts"
],
"contract": "Default remote cast_sender.js?loadCastFramework=1; sdk URL/options and actual Cast device/session behavior require separate validation.",
"validationStatus": "Real 1.0.0/1.1.0 archives and controlled public behavior frozen. Official requestSession completion is not a session; runtime/source gaps proceed through CAST-02/03. No actual SDK bytes, HTTPS sender, receiver, casting or media networking acceptance.",
"validationStatus": "Controlled SDK regression and native browser DOM/core tests verified source/main/legacy behavior in CAST03. No actual SDK bytes/version, HTTPS sender, physical receiver, discovery or receiver media networking acceptance; CAST05 remains outstanding.",
"demoPathsSource": "refactor/baselines/demo-inventory.json"
},
{