test(canvas): [PKG-CANVAS-01] freeze published proxy and media adapter contracts

This commit is contained in:
Harvey Zhao committed 2026-09-12 12:19:25 +08:00
1 parent 20f062bc90
commit 5e26d2298d
17 files changed
+814 -7

No files matched your search

@@ -0,0 +1,109 @@
{
"schemaVersion": 1,
"task": "PKG-CANVAS-01",
"status": "done",
"parentCommit": "20f062bc901d525d0659807dceebd1e41535ca7d",
"checks": [
{
"command": "node --test refactor/scripts/canvas-contract.test.mjs refactor/scripts/contracts.test.mjs",
"result": "pass",
"tests": 20,
"canvas": 13,
"indexValidation": 7,
"scope": "two actual npm archives and frozen workspace; normal property forwarding, bitmap/fallback/callback/event/resize contracts, public export/declaration shapes and exact Git versus npm core distinction"
},
{
"command": "focused eslint --no-fix",
"result": "pass"
},
{
"command": "yarn ci:check",
"result": "pass",
"tests": {
"unit": 881,
"engineering": 14,
"baseline": 96,
"mainTotal": 991,
"repeatedContractExecutions": 44
},
"strictProductionTypeScriptFiles": 278
}
],
"archiveScope": {
"plugins": [
"npm 1.0.0",
"npm 1.1.0",
"workspace frozen at parentCommit"
],
"members": 12,
"workspaceFiles": 6,
"gitAssociatedCoreVersions": [
"5.1.7",
"5.3.1"
],
"supportedCoreRange": "not inferred from Git associations"
},
"contractIndex": {
"packages": 22,
"assignedFamilies": 264,
"workspaceVersionPoints": 22,
"publishedVersionPoints": 11,
"exactIndexedCases": 10,
"unindexedFamilyRows": 255
},
"inputs": [
{
"file": "refactor/baselines/canvas-release.json",
"sha256LF": "7f7b229a5c0350a5d02be101d0095548c7ef1e76ce95c3b7152b415b0117398c"
},
{
"file": "refactor/scripts/canvas-contract.mjs",
"sha256LF": "eb545d0ccb3438413980d292fd2e511342b680e03c5985e58006a1407c8f53aa"
},
{
"file": "refactor/scripts/canvas-contract.test.mjs",
"sha256LF": "65e5ea0c9a12f47bc7939840d6e4c25b2820e7fd5e6f32fe3bd9f35e7f3e6da6"
},
{
"file": "test/helpers/canvas.js",
"sha256LF": "cc617b6d1053a9ed9caa5dad03088abaaff4344f078e23d007ee1a935f2a6c3c"
},
{
"file": "refactor/contract-policy.json",
"sha256LF": "f450c792465b67ebdc92e6d7339fb6be4f6fb19ffbded6c512244d73a57eafd2"
},
{
"file": "refactor/scripts/contracts.test.mjs",
"sha256LF": "7cb6cfa5fe2cdfe3fd6f8dc5377ff21db2aa748bc7788f4660f61abb98bbf647"
},
{
"file": "refactor/baselines/vast-core.json",
"sha256LF": "bb703cf37591211f78719665aed0e0cb2524ec5618dad48e6b8e2dbfef132b8e"
}
],
"logs": [
{
"file": "refactor/.cache/canvas01-capture.log",
"sha256": "a8dd65ebf981668b0fb1f44a58cd044879ecce10847797622f6bf56ef5189ed4"
},
{
"file": "refactor/.cache/canvas01-targeted.log",
"sha256": "9ad62bd4c20fd501c197ec77eb19e7c66090fce356e7c26fadb972e5524e0c2c"
},
{
"file": "refactor/.cache/canvas01-lint-final.log",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"file": "refactor/.cache/canvas01-ci.log",
"sha256": "ca15ff3aaa561911ed0809b6833c3ad47013d683fab4bfbac258b6cdb3be3243"
}
],
"limitations": [
"Controlled DOM/RAF/microtasks prove normal adapter contracts, not native browser pixels, video codecs or all enumerable browser properties.",
"Pending bitmap, cleanup, error and delayed subscription concerns remain source-observed; reproduce them in task 02 and fix in task 03.",
"Declaration shape checks are not full installed type consumer validation; optional inference/export/result checks remain task 04.",
"Git commit labeled core 5.1.7 contains proxy support while actual npm 5.1.7 does not; do not merge these identities into a support range.",
"No production source or artifacts modified; no new browser/media claims, push, version bump or publication."
]
}
+57
View File
@@ -0,0 +1,57 @@
# Canvas代理发布与工作区契约
PKG-CANVAS-01;工作区冻结于20f062bc。registry观察为1.0.0/1.1.0,latest为1.1.0;
两份实际tarball各6成员,SHA512、SHA256、所有文件及manifest见canvas-release.json。
1.0.0包含src/index.js,1.1.0不带src、增加真实mjs;测试直接执行两版实际main产物和
Git冻结工作区,不能用现代构建重生成“旧包”。工作区1.1.0未来按REL-09升至2.0.0。
## 入口、属性和事件
- factory(callback)返回同步注册函数;注册依次创建canvas/video/2Dcontext,返回该canvas。
callback省略时正常;不添加插件name或公开destroy句柄。
- 先收集canvas可枚举方法并绑定canvas,然后仅转发video里可枚举且canvas上不存在的
属性。转发get/set为enumerable/configurable;函数读取时绑定video,属性值实时读取。
既有canvas属性、style和方法优先;同名addEventListener仍是canvas方法。
- 通过零延迟setTimeout,按Artplayer.config.events逐项用art.proxy监听内置video;
原生event对象原样传给art.emit('video:'+type)。这不等于对canvas dispatchEvent。
- loadedmetadata将输出width/height设为视频intrinsic尺寸;resize按容器比例缩放输出,
用padding居中。autoSize=true时跳过尺寸变更,但resize依旧会绘制。
- play取消旧RAF后立即触发异步draw,await后排下一RAF;pause/destroy只取消已存handle。
- 支持createImageBitmap时await其结果,drawImage至canvas完整输出buffer,close bitmap,
然后callback(ctx,video),再emit('artplayerProxyCanvas:draw',ctx,video)。无bitmap能力
时直接drawImage(video,...),callback/event顺序相同。错误发artplayerProxyCanvas:error。
上述是实际正常执行与源码事实;错误/竞争/终止行为由02继续复现,不自动作为应永久
保留的缺陷。属性枚举器用受控DOM描述符做断言,未宣称穷尽不同浏览器的全部属性。
## 类型与分发差异
| 维度 | npm1.0.0 | npm1.1.0/工作区 |
| --- | --- | --- |
| CJS | namespace.default | 可调用工厂 |
| ESM | 无独立mjs | mjs默认导出 |
| 类型导出 | export=与全局声明 | export default |
| callback参数声明 | 必填 | 可选 |
| callback形状 | (ctx:CanvasRenderingContext2D,video:HTMLVideoElement)=>void | 同左 |
| Result | HTMLCanvasElement | 同左,未描述转发媒体能力 |
04必须保留1.1.0的可选参数提取(Parameters包含undefined),不能照搬Ambilight的
“必填最后重载”。旧require.default、全局、现代ESM/legacy/声明路径需分别验证。
README仅demo链接;canvas.js示例省略callback并开启多项播放器功能,不构成这些功能
已在每个代理/核心/设备上验收的证明。03改实现,04补类型,05/06再验证实际消费。
## 历史核心关联的限制
1.0.0 registryGitHead对应Git核心5.1.7,1.1.0对应Git5.3.1。冻结的前者index/template
已有proxy配置及替换媒体元素逻辑,但实际npm5.1.7的option声明和此前浏览器证据都
无proxy。版本字符串相同也不能把未发布Git状态当作npm已发布能力;新增断言并固定
两份Git源码哈希防止误认。这里没有声明一个连续支持范围。
前一步Ambilight代理取色使用工作区Canvas源码+实际npm5.4.0/候选核心,另明确记录
npm5.1.7未启用代理;不是这两版npm代理的浏览器矩阵。来源见ambilight-proxy-validation.json。
## 后续风险
源码可见await bitmap完成后仍可能在pause/destroy后排帧、draw抛错可能遗漏bitmap.close、
延迟订阅与art.on缺少主动终止、空context/早期尺寸需要能力边界。01仅记录,02必须
以受控完成顺序和必要真实浏览器复现,再由03修复,不能为通过旧快照保留泄漏。
+142
View File
@@ -0,0 +1,142 @@
{
"schemaVersion": 1,
"task": "PKG-CANVAS-01",
"capturedAt": "2026-09-12T04:06:47.519Z",
"sourceCommit": "20f062bc901d525d0659807dceebd1e41535ca7d",
"registryObservation": {
"versions": [
"1.0.0",
"1.1.0"
],
"latest": "1.1.0",
"workspaceVersion": "1.1.0"
},
"release": {
"name": "artplayer-proxy-canvas",
"version": "1.1.0",
"metadataUrl": "https://registry.npmjs.org/artplayer-proxy-canvas/1.1.0",
"tarball": "https://registry.npmjs.org/artplayer-proxy-canvas/-/artplayer-proxy-canvas-1.1.0.tgz",
"integrity": "sha512-lOq22z+xX2DcpokDSMQrDTk4VGDwUaQm9SovQ0GlhgmvMBdxRBDlvv6QrVxFUFsiGUjXEdx9TmtzdiW38dlxiQ==",
"sha256": "348c1d6671f79d0e0dbf2bb15875a1e6d60d00b73cde833c018bec7e4be96c8e",
"archiveBytes": 2960,
"publishedAt": "2026-03-12T14:20:13.012Z",
"registryGitHead": "daf133b22630b4a0eecfa3336bbddab0e9119d96",
"files": {
"package/README.md": "eb063f1381b4eea2e3f2bf6f7ae76d2979e807119ae53708bb3b2014c38a30d2",
"package/dist/artplayer-proxy-canvas.js": "ef489570e13f402f1a60eb256ce3900a0021a3d05699c2ba15adfaaeff184d4c",
"package/dist/artplayer-proxy-canvas.legacy.js": "7d25f21170c06d067aeaa1c8e79b15f2c0130a27cff1b410532d6c4ef4d2d45f",
"package/dist/artplayer-proxy-canvas.mjs": "4bb4a881787770093652a3262fc214a2529a1c514ef49affaf152b8abf0f4dc6",
"package/package.json": "4df3a0098730cfc12232fc57066fd1f7159bbd41dce87904fa51f39b82252eed",
"package/types/artplayer-proxy-canvas.d.ts": "2d7f4517ab9954ce8925739c2473c553977268bfa120b6420218470952567b47"
},
"manifest": {
"name": "artplayer-proxy-canvas",
"version": "1.1.0",
"description": "canvas proxy for ArtPlayer",
"author": "Harvey Zhao <laozhaochaguan@gmail.com>",
"license": "MIT",
"homepage": "https://artplayer.org",
"repository": {
"type": "git",
"url": "git+https://github.com/zhw2590582/ArtPlayer.git"
},
"bugs": {
"url": "https://github.com/zhw2590582/ArtPlayer/issues"
},
"keywords": [
"html5",
"video",
"player"
],
"exports": {
".": {
"types": "./types/artplayer-proxy-canvas.d.ts",
"import": "./dist/artplayer-proxy-canvas.mjs",
"require": "./dist/artplayer-proxy-canvas.js"
},
"./legacy": {
"types": "./types/artplayer-proxy-canvas.d.ts",
"import": "./dist/artplayer-proxy-canvas.legacy.js",
"require": "./dist/artplayer-proxy-canvas.legacy.js"
}
},
"main": "./dist/artplayer-proxy-canvas.js",
"module": "./dist/artplayer-proxy-canvas.mjs",
"types": "./types/artplayer-proxy-canvas.d.ts",
"legacy": "./dist/artplayer-proxy-canvas.legacy.js",
"browserslist": "last 1 Chrome version"
},
"historicalCore": {
"version": "5.3.1",
"commit": "daf133b22630b4a0eecfa3336bbddab0e9119d96",
"file": "packages/artplayer/package.json",
"sha256LF": "862f3697876fe915dd0ada178da766ce823aae7563ed30b3e5b11b811202929c",
"scope": "Git association only, not a tested support range"
}
},
"previous": [
{
"name": "artplayer-proxy-canvas",
"version": "1.0.0",
"metadataUrl": "https://registry.npmjs.org/artplayer-proxy-canvas/1.0.0",
"tarball": "https://registry.npmjs.org/artplayer-proxy-canvas/-/artplayer-proxy-canvas-1.0.0.tgz",
"integrity": "sha512-Wp/vbobzVfGXWkFWhhyi07TTsO7mtOhJ0BEEh/DWCBbJU1S4ghWyUhB0T9PFMVopbJfY7X51ytrrDeC2vpT1Jg==",
"sha256": "728ba39534b3b8139bdc404ef15fe1ac5f76a95562a14e78c6973db2dcfa6f4f",
"archiveBytes": 8534,
"publishedAt": "2024-09-19T02:48:29.419Z",
"registryGitHead": "1605df29431abfe1fc77683e609a2c3c0fba428a",
"files": {
"package/README.md": "2d2c6283a028e1f3882e855d0abef28a15f67525b1268b5f21c00eeea6244e80",
"package/dist/artplayer-proxy-canvas.js": "b87a0032711457b4c364d628cac3ae41fe071de08ed530ec2bd4cebf24941ec5",
"package/dist/artplayer-proxy-canvas.legacy.js": "21a2509bc01be721bda037fb6cf24461c52326865362e21873c4c32bfbb162dd",
"package/package.json": "600274235ba6d20cd9fe2c34b18acc72eeb6fd3ff262d19bc72a9a4e24bb5d42",
"package/src/index.js": "24add6af4f030e94fe1bdc66ca684e21d8baed7055e1ed44e85437bbff787c39",
"package/types/artplayer-proxy-canvas.d.ts": "aaa5f7886ecdfe1f6948d296fa3436811c466ac6e4da7fcd2d43faaab6bebc4d"
},
"manifest": {
"license": "MIT",
"version": "1.0.0",
"name": "artplayer-proxy-canvas",
"types": "types/artplayer-proxy-canvas.d.ts",
"description": "canvas proxy for ArtPlayer",
"main": "dist/artplayer-proxy-canvas.js",
"legacy": "dist/artplayer-proxy-canvas.legacy.js",
"author": "Harvey Zack <laozhaochaguan@gmail.com>",
"browserslist": "last 1 Chrome version",
"homepage": "https://artplayer.org",
"repository": {
"type": "git",
"url": "git+https://github.com/zhw2590582/ArtPlayer.git"
},
"bugs": {
"url": "https://github.com/zhw2590582/ArtPlayer/issues"
},
"keywords": [
"html5",
"video",
"player"
]
},
"historicalCore": {
"version": "5.1.7",
"commit": "1605df29431abfe1fc77683e609a2c3c0fba428a",
"file": "packages/artplayer/package.json",
"sha256LF": "8bd532103099c367fb2c289e0d410f144fdeb00b1b62cf850762a24b61e63c8a",
"scope": "Git association only, not a tested support range",
"proxySources": {
"packages/artplayer/src/index.js": "8c29c0d1c46461bf8ce0bb16f927637055fcdb9b76f979d4bf691c956b1bc8c0",
"packages/artplayer/src/template.js": "9f7e8708e79ce2f3a36c767b93721d40027fa85730eebbdd4dc807efea88f9e8"
}
}
}
],
"source": {
"packages/artplayer-proxy-canvas/src/index.js": "4b5922b05b46adf0d54ae92025b5c70456a5b8c87819c797ef91eb50e0c8f4d4",
"packages/artplayer-proxy-canvas/types/artplayer-proxy-canvas.d.ts": "2d7f4517ab9954ce8925739c2473c553977268bfa120b6420218470952567b47",
"packages/artplayer-proxy-canvas/package.json": "4df3a0098730cfc12232fc57066fd1f7159bbd41dce87904fa51f39b82252eed",
"packages/artplayer-proxy-canvas/README.md": "eb063f1381b4eea2e3f2bf6f7ae76d2979e807119ae53708bb3b2014c38a30d2",
"packages/artplayer-proxy-canvas/.npmignore": "46063058e98be55dba5cf5f33d379e73eca048f4126e7af75f8011bab7f09145",
"docs/assets/example/canvas.js": "95a971773e93cfb340a07eebcd49e333825f49ce0d167514ad98a188cd027799"
},
"limitation": "Historical core Git association is not compatibility verification; media/proxy/browser and candidate consumer checks remain later tasks."
}