@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 +8 -8
- package/dist/index.cjs +4 -29
- package/dist/index.mjs +4 -29
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @video-lab/protocol
|
|
2
2
|
|
|
3
|
-
Video Lab Player
|
|
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` |
|
|
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
|
-
|
|
52
|
+
**事件名是全小写连写**(`timeupdate` / `autoplayblocked`),对齐 HTML5 媒体事件。这是通信层名称;Vue 映射为 `time-update`,React 映射为 `onTimeUpdate`。
|
|
53
53
|
|
|
54
|
-
**`retryable`
|
|
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
|
|
60
|
+
**`type DrmConfig = never`。** v1 不提供 DRM;传入 `drm` 字段会直接产生编译错误,而不是运行时静默失效。
|
|
61
61
|
|
|
62
62
|
## 版本与冻结
|
|
63
63
|
|
|
64
|
-
当前 `CONTRACT_VERSION = '1.0.0'
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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.
|
|
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
|
-
*
|
|
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.
|
|
1568
|
+
const CONTRACT_VERSION = "1.0.2";
|
|
1594
1569
|
const SEMVER_RE = /^(\d+)\.(\d+)\.(\d+)$/;
|
|
1595
1570
|
/**
|
|
1596
1571
|
* 解析 semver 字符串。只接受严格的 `major.minor.patch`,
|