Files
ArtPlayer/refactor/baselines/ads-contract.md

73 lines
6.0 KiB
Markdown
Raw Permalink 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.
# Ads 发布与工作区契约
PKG-ADS-01,源码起点 `bafbf2c8`。来源与全部字节指纹见 [发布记录](ads-release.json),
可运行 `node --test refactor/scripts/ads-contract.test.mjs` 重新校验。
## 来源和支持范围
本次 registry 观察到 1.0.0/1.0.2/1.0.3/1.0.4/1.0.6,全部五个归档的 SHA512/SHA256、
30 个文件与 manifest 已校验。最后发布版本是 1.0.6;工作区 2.1.0 没有对应 npm 版本。
冻结版本观察不等于未来 latest。版本政策仍按工作区 2.1.0 → 3.0.0,REL-01/09 复核落地。
1.0.6 为主要行为基线;更早归档用于确定公共参数和历史差异,不能把早期重复监听等缺陷
升级为新实现必须保留的规则。五个版本运行时都是 html/video/url,从未实现 source/type。
1.0.6 的 registry gitHead 对应仓库核心 manifest 为 4.5.5,无 plugin peer 或版本检查;
当前源码新增核心 >=5 检查,并把原生 document visibility 订阅换成核心事件桥。
4.5.5 是有来源的旧核心组合候选,实际 npm/core 浏览器验收仍由 05 完成,不能宣称全部 4.x
已支持或以当前未发布源码的版本门槛证明已发布插件也有此限制。
## 公开形状
| 范围 | npm 1.0.6 / 当前工作区 |
| --- | --- |
| 工厂 | artplayerPluginAds(option)(art),同步返回 name/skip/pause/play;JS 省略 option 可合并默认值 |
| 参数 | html/video/url 默认空字符串;非空 video 优先于 html;图片通过 html 中的 img 展示 |
| 时长 | playDuration=5、totalDuration=10,运行时校验为 number,按一秒倒计时;不得擅自更改广告时长产品规则 |
| 静音 | muted=false;1.0.6 支持初始值及音量按钮,1.0.0 未包含该项 |
| i18n | close/countdown/detail/canBeClosed 四字段,整体浅合并;部分对象不能当作已实现的深合并 |
| 启动 | ready 后订阅首次 play/video:playing,init 只一次;show 后暂停主内容 |
| 视频广告 | loop/playsInline;metadata 后开始倒计时和 play;媒体 error 走 skip;广告时长不等同素材 duration |
| HTML 广告 | 使用调用方 HTML,立即倒计时;不是内置广告服务,不访问实际计费追踪 |
| 结果方法 | play/pause 管理倒计时,未同步暂停/恢复广告 video;skip 绕过按钮阈值并请求主内容播放 |
| 事件 | artplayerPluginAds:skip 与 :click,参数为校验合并后的 option;无 URL 点击广告内容仍 emit click,详情入口隐藏 |
| DOM/CSS | template.$ads、artplayer-plugin-ads 及其 html/video/loading/timer/close/countdown/control/detail/muted/fullscreen 类,style ID 相同 |
| 静态 | 已发布 bundle 的 env/version/build 和 window.artplayerPluginAds;注入一次样式,SSR 无 document 时不注入 |
skip 目前先 art.play,再暂停广告 video、隐藏容器、emit skip。正常用户调用、事件时序与
同步返回需在 02 固定。重复/过早调用、销毁后的工作属于待复现问题,不能从源码有函数
就宣称这些路径可用。options 被重赋给外层工厂变量,复用工厂多实例的身份也需要测试。
## 类型与入口冲突
| 来源 | 声明与实际内容 | 后续 |
| --- | --- | --- |
| npm 五版声明 | export=、export as namespace;html/video/url;totalDuration 错写 string;没有 i18n | 04 保留旧类型消费者接受方式,同时表达真实数字/i18n、工厂可选参数 |
| 工作区声明 | default export;必填 source/type,totalDuration number,没有 html/video/url/i18n | source/type 是已存在的工作区类型接受面,但不是发布 JS 接口;不能据此删旧真实字段或悄悄伪称原本支持 image 类型 |
| npm bundle | Parcel CommonJS 是 {default: factory},浏览器显式 window 全局;没有 module/exports/legacy 字段 | 06 保留 require(pkg).default/既有 dist 文件路径,并兼容当前 callable/ESM/legacy 入口 |
| 工作区 bundle/manifest | main/module/legacy 三格式、条件 exports;类型路径沿用但内容已变 | 不能将新文件布局直接当作已发布布局;隔离 tarball 消费证明入口 |
实际 npm bundle 的 namespace、全局工厂、静态字段、延迟 ready 注册及结果形状已通过 Node
加载检查。校验器在形状用例中只记录参数/schema;没有模拟真实播放或把校验器桩当成媒体测试。
具体合法/非法值及类型编译矩阵由 02/04 补齐。源文件也在旧归档内,但带 Parcel 专属
bundle-text 导入;私有打包器标识不属于稳定 API,不能把这段 raw source 直接当 Node 入口。
## 风险与执行顺序
- ADS-TYPE-01:公开声明和 JS 输入双向漂移,旧 string 时长的类型兼容与运行时拒绝分开处理。
- ADS-DIST-01:旧 default namespace/路径和当前 callable/exports 不同;保留两侧可用调用。
- ADS-CORE-01:已发布包没有 >=5 门槛;以能力 fallback 和真实 4.5.5/5.4.1/候选核心验证边界。
- ADS-LIFE-01:重复 play 可建立多个计时链,skip 不清计时器,无 destroy 清理;工厂复用、异常/过早调用待测。
- ADS-MEDIA-01:metadata 时序、广告与主内容 play 拒绝、隐藏页媒体状态/换源/错误恢复待测。
- ADS-UI-01:playDuration<=0 初始文案可关闭,但 isCanClose 直到首 tick 才真;全屏按钮图标和外部状态待核验。
上述除实际 export 形状外,运行路径问题先记 source-observed,由 02 复现再在 03 修正。
03 按配置/状态与计时/视图/内容恢复拆分;04 严格 TS 与公开类型;05 真实媒体/旧核心/
多实例;06 demo、文档和完整分发。保持本地广告素材,不触发真实投放、跳转或计费服务。
## 02 执行补充
上述为 01 捕获时的状态。02 已以 58 项 Node 和 66 项三引擎浏览器测试固定正常行为,
复现计时/工厂复用/过早调用/销毁、零阈值及两类播放拒绝问题;三个相关风险保持 open。
实际结果、原始失败和仍待验证边界见 [Ads 验证说明](../ads-validation.md) 及
[02 记录](../changes/2026-09-12-PKG-ADS-02-tests.md)。本步不修改生产接口。