@video-lab/protocol 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @video-lab/protocol
2
2
 
3
- Video Lab Player 的契约层(L4)。定义 host ↔ iframe 的通信契约,**所有其他包依赖它,它不依赖任何内部包**。
3
+ Video Lab Player 的通信契约层。它定义 host 与 iframe 的消息格式,其他 Video Lab 包依赖它,而它不依赖其他 Video Lab 包。
4
4
 
5
5
  唯一外部依赖:`zod`。
6
6
 
@@ -14,7 +14,7 @@ Video Lab Player 的契约层(L4)。定义 host ↔ iframe 的通信契约,**所
14
14
  | `events` | 29 个事件(sourceroute / ready / timeupdate / error / reconnectstart / subtitlechange / stalled / …) |
15
15
  | `errors` | 29 个错误码 + 2 个警告码 + `PlayerError` |
16
16
  | `configs` | `MediaSource`、`PlayerConfig`、poster / locale / danmaku / controls |
17
- | `presets` | 1 个场景预设(`homepage-preview`,ADR-032)+ `resolvePreset` |
17
+ | `presets` | 场景预设(如 `homepage-preview`)与 `resolvePreset` |
18
18
 
19
19
  类型一律从 Zod schema 用 `z.infer` 推导,不手写 interface——避免 schema 和类型变成两套真相。
20
20
 
@@ -49,19 +49,19 @@ const config = resolvePreset('homepage-preview', { source: 'a.m3u8', autoplay: f
49
49
 
50
50
  ## 几个容易踩的点
51
51
 
52
- **事件名是全小写连写**(`timeupdate` / `autoplayblocked`),对齐 HTML5 媒体事件。这是 wire 上的名字;消费面各自映射——Vue emit `time-update`,React prop `onTimeUpdate`。(团队约定里的 `snake.case` 指埋点事件名如 `playback.start`,是另一套命名空间。)
52
+ **事件名是全小写连写**(`timeupdate` / `autoplayblocked`),对齐 HTML5 媒体事件。这是通信层名称;Vue 映射为 `time-update`,React 映射为 `onTimeUpdate`。
53
53
 
54
- **`retryable` 是给自动重连看的信号**,不是"用户能不能点重试按钮"。判断标准是:同样的请求原样再发一次,有没有可能得到不同结果。所以 `E_AUTH_EXPIRED` 是 `false`——SDK 不做签名刷新(ADR-022),原样重试必然再次失败。
54
+ **`retryable` 是给自动重连看的信号**,不是“用户能不能点重试按钮”。判断标准是同一请求原样重发是否可能成功。因此 `E_AUTH_EXPIRED` 为 `false`:SDK 不刷新签名,原样重试必然再次失败。
55
55
 
56
56
  **`source.onBeforeRequest` 不在 wire 契约里**。函数不可序列化,过不了 iframe 边界;它是宿主侧的 hook,由 inline 模式的 player-core 直接消费。且它在 MP4 和 iOS Safari 播 HLS 时**不生效**。
57
57
 
58
58
  **带 query 的 URL 推断不出类型**。`video.m3u8?token=xxx` 必须显式传 `type: 'hls'`,否则会走 MP4 路径。签名 URL 场景尤其注意。
59
59
 
60
- **`type DrmConfig = never`**(ADR-014)。v1.0 不做 DRM,消费方传 drm 字段会直接编译报错,而不是运行时才发现没生效。
60
+ **`type DrmConfig = never`。** v1 不提供 DRM;传入 `drm` 字段会直接产生编译错误,而不是运行时静默失效。
61
61
 
62
62
  ## 版本与冻结
63
63
 
64
- 当前 `CONTRACT_VERSION = '1.0.0'` —— **契约已冻结**(2026-07-15,见 ADR-025)。现有 schema 不再破坏兼容。
64
+ 当前 `CONTRACT_VERSION = '1.0.0'`。现有 schema 不再进行破坏性兼容变更。
65
65
 
66
66
  兼容规则(host 和 iframe 用同一个 `isContractCompatible`):
67
67
 
@@ -69,7 +69,7 @@ const config = resolvePreset('homepage-preview', { source: 'a.m3u8', autoplay: f
69
69
  - `>= 1.0.0`(当前):minor 是向后兼容的新增 → **major 相同即兼容**
70
70
  - patch 差异永远兼容
71
71
 
72
- 冻结后:新增 method / event / 可选字段走 **minor** bump(1.x 向后兼容);破坏兼容必须走 **ADR + major** bump。
72
+ 后续新增 method、event 或可选字段走 **minor** 版本;破坏兼容的变更必须走 **major** 版本。
73
73
 
74
74
  ## 测试
75
75
 
@@ -77,4 +77,4 @@ const config = resolvePreset('homepage-preview', { source: 'a.m3u8', autoplay: f
77
77
  pnpm --filter @video-lab/protocol test
78
78
  ```
79
79
 
80
- 契约测试在 `tests/`(和 `src/` 分开,方便冻结后独立管理)。其中 `consumer-parity.contract.test.ts` 拿 `examples/team-video-vue/` 实际用到的事件 / 命令 / 错误码逐个校验——契约一旦漂移到验收基准用不了,它会先红。
80
+ 契约测试覆盖消费包实际使用的事件、命令与错误码,防止通信契约与消费包行为漂移。
package/dist/index.cjs CHANGED
@@ -1562,36 +1562,11 @@ resetCounter: zod.z.boolean().optional() }).optional()
1562
1562
  //#endregion
1563
1563
  //#region src/version.ts
1564
1564
  /**
1565
- * 契约版本。
1566
- *
1567
- * 注意:这和 iframe URL 里的 `version`(如 `'v1'`,见 ADR-023)不是一回事——
1568
- * 那个是 CDN 路径版本,这个是 host ↔ iframe 的通信契约版本。
1569
- *
1570
- * 冻结策略见 `packages/protocol/CLAUDE.md`:审查清单全过之后才升 1.0.0。
1571
- *
1572
- * **首发即 1.1.0**(2026-07-19):契约从未对外发布,故把首发前迭代出的全部能力面
1573
- * **折叠进首发契约**——与 8 个包的 npm 版本对齐,避免"包版本 1.1.0 却携带 1.0.0
1574
- * 契约常量"的双轴割裂(`tests/index.contract.test.ts` 有断言锁死这一致性)。
1575
- * 首发契约面**已包含**:
1576
- * - `stalled` 事件(HealthMonitor 卡顿测量,设计见 ADR-026)
1577
- * - 字幕控制侧:`setSubtitle` 命令 + `subtitlechange` 事件 + `ready` 的**可选** `subtitles` 字段(ADR-027)
1578
- * - 弹幕 streaming:`pushDanmaku` / `setDanmakuEnabled` / `clearDanmaku` 命令 + `PlayerConfig.danmaku`(可选)(ADR-028)
1579
- * - 场景预设收敛为唯一 `homepage-preview`(ADR-032)
1580
- *
1581
- * 上面几个 ADR 记录的是这些能力的**设计出处**,不是"冻结后独立发布的 minor"——它们在首发前
1582
- * 就已落地,故都是首发契约的一部分。**首发之后**再新增 method/event/字段才走 minor
1583
- * (1.x 向后兼容),破坏性变更须走 ADR + major。
1584
- *
1585
- * 为什么是 1.1.0 而不是 1.0.0:原计划锁 1.0.0(ADR-025),但首发前两项变更
1586
- * (全屏命令补完、preset 收敛)各带一条 minor changeset,changesets 的 `fixed` 组
1587
- * 把 8 个包统一推到 1.1.0。契约面确有变化(删了 4 个 preset),升 minor 名实相符;
1588
- * 且 {@link isContractCompatible} 在 `>=1.0.0` 时只比 major,1.0.0 ↔ 1.1.0 握手仍兼容。
1589
- *
1590
- * 值**从 package.json 派生**,不要改回硬编码 —— 契约常量必须与 npm 包版本
1591
- * 严格相等,而 changesets 只改 package.json。理由与实测数据见
1592
- * `docs/adr/ADR-036-contract-version-derived.md`。
1565
+ * host ↔ iframe 通信契约版本,独立于 npm fixed group 和 iframe 应用版本。
1566
+ * 唯一来源是 contract-version.json(ADR-094);只在真实协议变化时升级。
1567
+ * npm 包版本同步不能改变握手与 envelope 的版本。
1593
1568
  */
1594
- const CONTRACT_VERSION = "1.0.1";
1569
+ const CONTRACT_VERSION = "1.0.2";
1595
1570
  const SEMVER_RE = /^(\d+)\.(\d+)\.(\d+)$/;
1596
1571
  /**
1597
1572
  * 解析 semver 字符串。只接受严格的 `major.minor.patch`,
package/dist/index.mjs CHANGED
@@ -1561,36 +1561,11 @@ resetCounter: z.boolean().optional() }).optional()
1561
1561
  //#endregion
1562
1562
  //#region src/version.ts
1563
1563
  /**
1564
- * 契约版本。
1565
- *
1566
- * 注意:这和 iframe URL 里的 `version`(如 `'v1'`,见 ADR-023)不是一回事——
1567
- * 那个是 CDN 路径版本,这个是 host ↔ iframe 的通信契约版本。
1568
- *
1569
- * 冻结策略见 `packages/protocol/CLAUDE.md`:审查清单全过之后才升 1.0.0。
1570
- *
1571
- * **首发即 1.1.0**(2026-07-19):契约从未对外发布,故把首发前迭代出的全部能力面
1572
- * **折叠进首发契约**——与 8 个包的 npm 版本对齐,避免"包版本 1.1.0 却携带 1.0.0
1573
- * 契约常量"的双轴割裂(`tests/index.contract.test.ts` 有断言锁死这一致性)。
1574
- * 首发契约面**已包含**:
1575
- * - `stalled` 事件(HealthMonitor 卡顿测量,设计见 ADR-026)
1576
- * - 字幕控制侧:`setSubtitle` 命令 + `subtitlechange` 事件 + `ready` 的**可选** `subtitles` 字段(ADR-027)
1577
- * - 弹幕 streaming:`pushDanmaku` / `setDanmakuEnabled` / `clearDanmaku` 命令 + `PlayerConfig.danmaku`(可选)(ADR-028)
1578
- * - 场景预设收敛为唯一 `homepage-preview`(ADR-032)
1579
- *
1580
- * 上面几个 ADR 记录的是这些能力的**设计出处**,不是"冻结后独立发布的 minor"——它们在首发前
1581
- * 就已落地,故都是首发契约的一部分。**首发之后**再新增 method/event/字段才走 minor
1582
- * (1.x 向后兼容),破坏性变更须走 ADR + major。
1583
- *
1584
- * 为什么是 1.1.0 而不是 1.0.0:原计划锁 1.0.0(ADR-025),但首发前两项变更
1585
- * (全屏命令补完、preset 收敛)各带一条 minor changeset,changesets 的 `fixed` 组
1586
- * 把 8 个包统一推到 1.1.0。契约面确有变化(删了 4 个 preset),升 minor 名实相符;
1587
- * 且 {@link isContractCompatible} 在 `>=1.0.0` 时只比 major,1.0.0 ↔ 1.1.0 握手仍兼容。
1588
- *
1589
- * 值**从 package.json 派生**,不要改回硬编码 —— 契约常量必须与 npm 包版本
1590
- * 严格相等,而 changesets 只改 package.json。理由与实测数据见
1591
- * `docs/adr/ADR-036-contract-version-derived.md`。
1564
+ * host ↔ iframe 通信契约版本,独立于 npm fixed group 和 iframe 应用版本。
1565
+ * 唯一来源是 contract-version.json(ADR-094);只在真实协议变化时升级。
1566
+ * npm 包版本同步不能改变握手与 envelope 的版本。
1592
1567
  */
1593
- const CONTRACT_VERSION = "1.0.1";
1568
+ const CONTRACT_VERSION = "1.0.2";
1594
1569
  const SEMVER_RE = /^(\d+)\.(\d+)\.(\d+)$/;
1595
1570
  /**
1596
1571
  * 解析 semver 字符串。只接受严格的 `major.minor.patch`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@video-lab/protocol",
3
- "version": "1.0.1",
3
+ "version": "2.0.0",
4
4
  "license": "MIT",
5
5
  "description": "Video Lab Player 契约层:Zod schema 定义命令 / 事件 / 错误码 / 配置,所有包的唯一事实源",
6
6
  "type": "module",