@video-lab/vue-frame 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,10 +1,10 @@
1
1
  # @video-lab/vue-frame
2
2
 
3
- Vue 3 iframe 薄壳(L7 · 消费面)。Video Lab Player 的 Vue 接入方式——
3
+ Video Lab Player 的 Vue 3 iframe 接入方式。
4
4
 
5
5
  **只做技术**:创建 iframe 播放器、把 props 桥接成命令、把 iframe 事件桥接成 Vue emits。
6
- 不含任何团队品牌 UI(团队 UI 在业务封装层 `examples/team-video-vue`,ADR-021)。
7
- **不再是 Vue 唯一的接入方式** —— Vue inline [`@video-lab/vue`](https://www.npmjs.com/package/@video-lab/vue)(ADR-052)
6
+ 不含任何品牌 UI,品牌 UI 由消费应用提供。
7
+ Vue inline 接入可使用 [`@video-lab/vue`](https://www.npmjs.com/package/@video-lab/vue)。
8
8
  需要隔离 / 宿主是 SSR 框架的仍然走本包;要首帧最快、要摸 `<video>` 的用 inline。
9
9
 
10
10
  ## 安装
@@ -13,7 +13,9 @@ Vue 3 iframe 薄壳(L7 · 消费面)。Video Lab Player 的 Vue 接入方式—
13
13
  pnpm add @video-lab/vue-frame
14
14
  ```
15
15
 
16
- peer: `vue >= 3.5`。
16
+ peer: `vue ^3.4.0`(支持 Vue 3.4 / 3.5,最低 3.4.0)。
17
+
18
+ 宿主无需升级 Vue 或相关工具链;组件复用宿主 Vue,不内嵌第二份运行时。
17
19
 
18
20
  ## 用法
19
21
 
@@ -33,7 +35,7 @@ function onError(err: PlayerError) {
33
35
  <template>
34
36
  <VideoPlayerFrame
35
37
  ref="player"
36
- :source="'https://cdn.example.com/live.m3u8'"
38
+ :source="'https://media.example.com/live.m3u8'"
37
39
  preset="homepage-preview"
38
40
  @ready="() => console.log('ready')"
39
41
  @error="onError"
@@ -49,8 +51,8 @@ function onError(err: PlayerError) {
49
51
  ## Props
50
52
 
51
53
  `source` 必填,其余可选:`autoplay` `muted` `loop` `controls` `interactive`
52
- `playsinline` `poster` `preset` `locale` `debug`,加 URL 覆盖 `origin` / `version`
53
- (ADR-023,私有化 / 版本锁定 / 本地 dev 指向 embed-app dev server)。
54
+ `playsinline` `poster` `preset` `locale` `debug`,以及 iframe 部署配置 `origin` / `version`。
55
+ 实际部署地址由内部配置提供,本包不声明公共播放器地址。
54
56
 
55
57
  **布尔 prop 不传就是 undefined**(不是 false),这样 `preset` 才能生效——比如
56
58
  `preset="homepage-preview"` 会带上 `muted: true`,只要你没显式传 `:muted="false"` 覆盖它。
@@ -68,12 +70,15 @@ function onError(err: PlayerError) {
68
70
 
69
71
  ## 边界
70
72
 
71
- - 不依赖 player-core / player-ui(那些在 iframe 内的 embed-app)
72
- - 不直接 import xgplayer(薄壳不接触播放技术)
73
- - 无团队品牌 UI
73
+ - 不依赖 `@video-lab/player-core` / `@video-lab/player-ui`。
74
+ - 不直接 import xgplayer
75
+ - 不内置品牌 UI
74
76
 
75
77
  ## 相关
76
78
 
77
- - **ADR-052**(Vue inline 开门,取代 ADR-002)· ADR-023(iframe URL 覆盖)
78
- - 五种接入方式与完整 API 请联系项目维护团队获取内部使用手册。
79
- - 宿主、服务端与业务 UI 的责任边界请联系项目维护团队获取。
79
+ - 完整 API 与接入方式请向项目维护团队获取。
80
+ - 宿主、服务端与业务 UI 的责任边界请向项目维护团队获取。
81
+
82
+ ### iframe 基础路径
83
+
84
+ `origin` 是宿主提供的完整部署基础 URL,可包含 `/custom/player` 等目录。SDK 只追加 `/v{iframe应用版本}/`,不会自动追加 `/embed`。旧部署仍在 `/embed/v…/` 时,请把 `/embed` 显式保留在 `origin` 中;版本目录不要写进 `origin`。
@@ -3,7 +3,15 @@ declare var __VLS_1: {};
3
3
  type __VLS_Slots = {} & {
4
4
  'ssr-placeholder'?: (props: typeof __VLS_1) => any;
5
5
  };
6
- declare const __VLS_component: import('vue').DefineComponent<VideoPlayerFrameProps, {
6
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<VideoPlayerFrameProps>, {
7
+ autoplay: undefined;
8
+ muted: undefined;
9
+ loop: undefined;
10
+ controls: undefined;
11
+ interactive: undefined;
12
+ playsinline: undefined;
13
+ debug: undefined;
14
+ }>, {
7
15
  play(): Promise<void>;
8
16
  pause(): Promise<void>;
9
17
  seek(time: number): Promise<void>;
@@ -26,11 +34,831 @@ declare const __VLS_component: import('vue').DefineComponent<VideoPlayerFramePro
26
34
  getDuration(): number;
27
35
  getPlaybackContext(): import('@video-lab/protocol').PlaybackContext | null;
28
36
  getPlayerHandle(): import('./types').PlayerHandle | null;
29
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
30
- [x: string]: any;
31
- }, string, import('vue').PublicProps, Readonly<VideoPlayerFrameProps> & Readonly<{
32
- [x: `on${Capitalize<any>}`]: ((...args: any) => any) | undefined;
33
- }>, {
37
+ }, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
38
+ playerEvent: (payload: {
39
+ event: "sourceroute";
40
+ payload: {
41
+ outcome: "selected";
42
+ sessionId: string;
43
+ candidateTypes: ("mp4" | "hls" | "flv")[];
44
+ streamKind: "live" | "vod";
45
+ runtime: {
46
+ platform: "unknown" | "ios" | "android" | "desktop";
47
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
48
+ mse: "standard" | "managed" | "unavailable";
49
+ };
50
+ mediaType: "mp4" | "hls" | "flv";
51
+ kernel: "native" | "hls.js" | "flv.js";
52
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
53
+ } | {
54
+ outcome: "unsupported";
55
+ sessionId: string;
56
+ candidateTypes: ("mp4" | "hls" | "flv")[];
57
+ streamKind: "live" | "vod";
58
+ runtime: {
59
+ platform: "unknown" | "ios" | "android" | "desktop";
60
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
61
+ mse: "standard" | "managed" | "unavailable";
62
+ };
63
+ mediaType: null;
64
+ kernel: null;
65
+ reason: "no_supported_candidate";
66
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
67
+ };
68
+ } | {
69
+ event: "ready";
70
+ payload: {
71
+ duration: number;
72
+ quality: {
73
+ level: number;
74
+ label?: string | undefined;
75
+ height?: number | undefined;
76
+ bitrate?: number | undefined;
77
+ }[];
78
+ subtitles?: {
79
+ locale: string;
80
+ label: string;
81
+ id: number;
82
+ }[] | undefined;
83
+ };
84
+ } | {
85
+ event: "play";
86
+ payload: {};
87
+ } | {
88
+ event: "pause";
89
+ payload: {};
90
+ } | {
91
+ event: "ended";
92
+ payload: {};
93
+ } | {
94
+ event: "timeupdate";
95
+ payload: {
96
+ duration: number;
97
+ time: number;
98
+ };
99
+ } | {
100
+ event: "volumechange";
101
+ payload: {
102
+ muted: boolean;
103
+ volume: number;
104
+ };
105
+ } | {
106
+ event: "seeking";
107
+ payload: {
108
+ time: number;
109
+ };
110
+ } | {
111
+ event: "seeked";
112
+ payload: {
113
+ time: number;
114
+ };
115
+ } | {
116
+ event: "waiting";
117
+ payload: {};
118
+ } | {
119
+ event: "playing";
120
+ payload: {};
121
+ } | {
122
+ event: "qualitychange";
123
+ payload: {
124
+ auto: boolean;
125
+ level: number;
126
+ };
127
+ } | {
128
+ event: "subtitlechange";
129
+ payload: {
130
+ id: number | null;
131
+ };
132
+ } | {
133
+ event: "error";
134
+ payload: {
135
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
136
+ message: string;
137
+ retryable: boolean;
138
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
139
+ cause?: import('zod').objectOutputType<{
140
+ name: import('zod').ZodString;
141
+ message: import('zod').ZodString;
142
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
143
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
144
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
145
+ };
146
+ } | {
147
+ event: "autoplayblocked";
148
+ payload: {};
149
+ } | {
150
+ event: "reconnectstart";
151
+ payload: {
152
+ attempt: number;
153
+ maxAttempts: number;
154
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
155
+ nextDelayMs?: number | undefined;
156
+ };
157
+ } | {
158
+ event: "reconnectsuccess";
159
+ payload: {
160
+ attempts: number;
161
+ };
162
+ } | {
163
+ event: "reconnectfailed";
164
+ payload: {
165
+ attempts: number;
166
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
167
+ };
168
+ } | {
169
+ event: "recovery";
170
+ payload: {
171
+ attempt: number;
172
+ maxAttempts: number;
173
+ phase: "detected";
174
+ recoveryId: number;
175
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
176
+ trigger: "error" | "manual" | "visibility";
177
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
178
+ } | {
179
+ attempt: number;
180
+ maxAttempts: number;
181
+ phase: "attempting";
182
+ recoveryId: number;
183
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
184
+ trigger: "error" | "manual" | "visibility";
185
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
186
+ } | {
187
+ attempt: number;
188
+ maxAttempts: number;
189
+ phase: "validating";
190
+ recoveryId: number;
191
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
192
+ trigger: "error" | "manual" | "visibility";
193
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
194
+ } | {
195
+ attempt: number;
196
+ maxAttempts: number;
197
+ phase: "recovered";
198
+ recoveryId: number;
199
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
200
+ trigger: "error" | "manual" | "visibility";
201
+ validatedBy: "playing_position_advance";
202
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
203
+ } | {
204
+ outcome: "timeout" | "attempts_exhausted";
205
+ attempt: number;
206
+ maxAttempts: number;
207
+ phase: "failed";
208
+ recoveryId: number;
209
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
210
+ trigger: "error" | "manual" | "visibility";
211
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
212
+ } | {
213
+ outcome: "source_changed" | "destroyed" | "superseded";
214
+ attempt: number;
215
+ maxAttempts: number;
216
+ phase: "cancelled";
217
+ recoveryId: number;
218
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
219
+ trigger: "error" | "manual" | "visibility";
220
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
221
+ };
222
+ } | {
223
+ event: "compatwarning";
224
+ payload: {
225
+ code: "W_BROWSER_INCOMPATIBLE" | "W_VERSION_MISMATCH" | "W_EVENT_REJECTED";
226
+ message: string;
227
+ ua: string;
228
+ hostVersion?: string | undefined;
229
+ iframeVersion?: string | undefined;
230
+ rejectedEvent?: string | undefined;
231
+ };
232
+ } | {
233
+ event: "stalled";
234
+ payload: {
235
+ phase: "start" | "end";
236
+ position: number;
237
+ durationMs?: number | undefined;
238
+ kind?: "seek" | "playback" | "firstframe" | undefined;
239
+ };
240
+ } | {
241
+ event: "playablechange";
242
+ payload: {
243
+ reason: "error" | "stalled" | "ok" | "initializing" | "buffering" | "reconnecting" | "autoplay_blocked" | "frame_disconnected" | "degraded";
244
+ playable: boolean;
245
+ recoverable: boolean;
246
+ };
247
+ } | {
248
+ event: "kernelhealth";
249
+ payload: {
250
+ reason: "media" | "network" | "other";
251
+ durationMs: number;
252
+ degraded: boolean;
253
+ count: number;
254
+ detail: string;
255
+ };
256
+ } | {
257
+ event: "audiohealth";
258
+ payload: {
259
+ reason: "audio_data_gap";
260
+ durationMs: number;
261
+ degraded: boolean;
262
+ };
263
+ } | {
264
+ event: "bufferhealth";
265
+ payload: {
266
+ draining: boolean;
267
+ marginSec: number;
268
+ };
269
+ } | {
270
+ event: "contextchange";
271
+ payload: {
272
+ sessionId: string;
273
+ kernel: "native" | "hls.js" | "flv.js";
274
+ position: number;
275
+ qualityLevel: number | null;
276
+ srcOrigin: string;
277
+ srcPath: string;
278
+ streamKind?: "live" | "vod" | undefined;
279
+ runtime?: {
280
+ platform: "unknown" | "ios" | "android" | "desktop";
281
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
282
+ mse: "standard" | "managed" | "unavailable";
283
+ } | undefined;
284
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
285
+ };
286
+ } | {
287
+ event: "firstframe";
288
+ payload: {
289
+ fvt: number;
290
+ };
291
+ } | {
292
+ event: "framefreeze";
293
+ payload: {
294
+ durationMs: number;
295
+ droppedFrames: number;
296
+ totalFrames: number;
297
+ };
298
+ } | {
299
+ event: "useraction";
300
+ payload: {
301
+ source: string;
302
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
303
+ from: string | number | boolean | null;
304
+ to: string | number | boolean | null;
305
+ };
306
+ }) => void;
307
+ ready: (payload: {
308
+ duration: number;
309
+ quality: import('@video-lab/protocol').QualityLevel[];
310
+ subtitles?: import('@video-lab/protocol').SubtitleTrackInfo[];
311
+ }) => void;
312
+ play: () => void;
313
+ pause: () => void;
314
+ ended: () => void;
315
+ timeUpdate: (payload: {
316
+ time: number;
317
+ duration: number;
318
+ }) => void;
319
+ volumeChange: (payload: {
320
+ volume: number;
321
+ muted: boolean;
322
+ }) => void;
323
+ seeking: (payload: {
324
+ time: number;
325
+ }) => void;
326
+ seeked: (payload: {
327
+ time: number;
328
+ }) => void;
329
+ waiting: () => void;
330
+ playing: () => void;
331
+ qualityChange: (payload: {
332
+ level: number;
333
+ auto: boolean;
334
+ }) => void;
335
+ subtitleChange: (payload: {
336
+ id: number | null;
337
+ }) => void;
338
+ error: (payload: {
339
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
340
+ message: string;
341
+ retryable: boolean;
342
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
343
+ cause?: import('zod').objectOutputType<{
344
+ name: import('zod').ZodString;
345
+ message: import('zod').ZodString;
346
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
347
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
348
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
349
+ }) => void;
350
+ autoplayBlocked: () => void;
351
+ reconnectStart: (payload: {
352
+ attempt: number;
353
+ maxAttempts: number;
354
+ }) => void;
355
+ reconnectSuccess: () => void;
356
+ reconnectFailed: () => void;
357
+ compatWarning: (payload: {
358
+ code: string;
359
+ message: string;
360
+ ua: string;
361
+ }) => void;
362
+ stalled: (payload: {
363
+ phase: "start" | "end";
364
+ position: number;
365
+ durationMs?: number;
366
+ }) => void;
367
+ playableChange: (payload: {
368
+ playable: boolean;
369
+ reason: import('@video-lab/protocol').PlayableReason;
370
+ recoverable: boolean;
371
+ }) => void;
372
+ kernelHealth: (payload: {
373
+ reason: "media" | "network" | "other";
374
+ durationMs: number;
375
+ degraded: boolean;
376
+ count: number;
377
+ detail: string;
378
+ }) => void;
379
+ audioHealth: (payload: {
380
+ reason: "audio_data_gap";
381
+ durationMs: number;
382
+ degraded: boolean;
383
+ }) => void;
384
+ bufferHealth: (payload: {
385
+ draining: boolean;
386
+ marginSec: number;
387
+ }) => void;
388
+ contextChange: (payload: {
389
+ sessionId: string;
390
+ kernel: "native" | "hls.js" | "flv.js";
391
+ position: number;
392
+ qualityLevel: number | null;
393
+ srcOrigin: string;
394
+ srcPath: string;
395
+ streamKind?: "live" | "vod" | undefined;
396
+ runtime?: {
397
+ platform: "unknown" | "ios" | "android" | "desktop";
398
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
399
+ mse: "standard" | "managed" | "unavailable";
400
+ } | undefined;
401
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
402
+ }) => void;
403
+ sourceRoute: (payload: {
404
+ outcome: "selected";
405
+ sessionId: string;
406
+ candidateTypes: ("mp4" | "hls" | "flv")[];
407
+ streamKind: "live" | "vod";
408
+ runtime: {
409
+ platform: "unknown" | "ios" | "android" | "desktop";
410
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
411
+ mse: "standard" | "managed" | "unavailable";
412
+ };
413
+ mediaType: "mp4" | "hls" | "flv";
414
+ kernel: "native" | "hls.js" | "flv.js";
415
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
416
+ } | {
417
+ outcome: "unsupported";
418
+ sessionId: string;
419
+ candidateTypes: ("mp4" | "hls" | "flv")[];
420
+ streamKind: "live" | "vod";
421
+ runtime: {
422
+ platform: "unknown" | "ios" | "android" | "desktop";
423
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
424
+ mse: "standard" | "managed" | "unavailable";
425
+ };
426
+ mediaType: null;
427
+ kernel: null;
428
+ reason: "no_supported_candidate";
429
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
430
+ }) => void;
431
+ firstFrame: (payload: {
432
+ fvt: number;
433
+ }) => void;
434
+ frameFreeze: (payload: {
435
+ durationMs: number;
436
+ droppedFrames: number;
437
+ totalFrames: number;
438
+ }) => void;
439
+ userAction: (payload: {
440
+ source: string;
441
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
442
+ from: string | number | boolean | null;
443
+ to: string | number | boolean | null;
444
+ }) => void;
445
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<VideoPlayerFrameProps>, {
446
+ autoplay: undefined;
447
+ muted: undefined;
448
+ loop: undefined;
449
+ controls: undefined;
450
+ interactive: undefined;
451
+ playsinline: undefined;
452
+ debug: undefined;
453
+ }>>> & {
454
+ onPlayerEvent?: ((payload: {
455
+ event: "sourceroute";
456
+ payload: {
457
+ outcome: "selected";
458
+ sessionId: string;
459
+ candidateTypes: ("mp4" | "hls" | "flv")[];
460
+ streamKind: "live" | "vod";
461
+ runtime: {
462
+ platform: "unknown" | "ios" | "android" | "desktop";
463
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
464
+ mse: "standard" | "managed" | "unavailable";
465
+ };
466
+ mediaType: "mp4" | "hls" | "flv";
467
+ kernel: "native" | "hls.js" | "flv.js";
468
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
469
+ } | {
470
+ outcome: "unsupported";
471
+ sessionId: string;
472
+ candidateTypes: ("mp4" | "hls" | "flv")[];
473
+ streamKind: "live" | "vod";
474
+ runtime: {
475
+ platform: "unknown" | "ios" | "android" | "desktop";
476
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
477
+ mse: "standard" | "managed" | "unavailable";
478
+ };
479
+ mediaType: null;
480
+ kernel: null;
481
+ reason: "no_supported_candidate";
482
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
483
+ };
484
+ } | {
485
+ event: "ready";
486
+ payload: {
487
+ duration: number;
488
+ quality: {
489
+ level: number;
490
+ label?: string | undefined;
491
+ height?: number | undefined;
492
+ bitrate?: number | undefined;
493
+ }[];
494
+ subtitles?: {
495
+ locale: string;
496
+ label: string;
497
+ id: number;
498
+ }[] | undefined;
499
+ };
500
+ } | {
501
+ event: "play";
502
+ payload: {};
503
+ } | {
504
+ event: "pause";
505
+ payload: {};
506
+ } | {
507
+ event: "ended";
508
+ payload: {};
509
+ } | {
510
+ event: "timeupdate";
511
+ payload: {
512
+ duration: number;
513
+ time: number;
514
+ };
515
+ } | {
516
+ event: "volumechange";
517
+ payload: {
518
+ muted: boolean;
519
+ volume: number;
520
+ };
521
+ } | {
522
+ event: "seeking";
523
+ payload: {
524
+ time: number;
525
+ };
526
+ } | {
527
+ event: "seeked";
528
+ payload: {
529
+ time: number;
530
+ };
531
+ } | {
532
+ event: "waiting";
533
+ payload: {};
534
+ } | {
535
+ event: "playing";
536
+ payload: {};
537
+ } | {
538
+ event: "qualitychange";
539
+ payload: {
540
+ auto: boolean;
541
+ level: number;
542
+ };
543
+ } | {
544
+ event: "subtitlechange";
545
+ payload: {
546
+ id: number | null;
547
+ };
548
+ } | {
549
+ event: "error";
550
+ payload: {
551
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
552
+ message: string;
553
+ retryable: boolean;
554
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
555
+ cause?: import('zod').objectOutputType<{
556
+ name: import('zod').ZodString;
557
+ message: import('zod').ZodString;
558
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
559
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
560
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
561
+ };
562
+ } | {
563
+ event: "autoplayblocked";
564
+ payload: {};
565
+ } | {
566
+ event: "reconnectstart";
567
+ payload: {
568
+ attempt: number;
569
+ maxAttempts: number;
570
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
571
+ nextDelayMs?: number | undefined;
572
+ };
573
+ } | {
574
+ event: "reconnectsuccess";
575
+ payload: {
576
+ attempts: number;
577
+ };
578
+ } | {
579
+ event: "reconnectfailed";
580
+ payload: {
581
+ attempts: number;
582
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
583
+ };
584
+ } | {
585
+ event: "recovery";
586
+ payload: {
587
+ attempt: number;
588
+ maxAttempts: number;
589
+ phase: "detected";
590
+ recoveryId: number;
591
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
592
+ trigger: "error" | "manual" | "visibility";
593
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
594
+ } | {
595
+ attempt: number;
596
+ maxAttempts: number;
597
+ phase: "attempting";
598
+ recoveryId: number;
599
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
600
+ trigger: "error" | "manual" | "visibility";
601
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
602
+ } | {
603
+ attempt: number;
604
+ maxAttempts: number;
605
+ phase: "validating";
606
+ recoveryId: number;
607
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
608
+ trigger: "error" | "manual" | "visibility";
609
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
610
+ } | {
611
+ attempt: number;
612
+ maxAttempts: number;
613
+ phase: "recovered";
614
+ recoveryId: number;
615
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
616
+ trigger: "error" | "manual" | "visibility";
617
+ validatedBy: "playing_position_advance";
618
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
619
+ } | {
620
+ outcome: "timeout" | "attempts_exhausted";
621
+ attempt: number;
622
+ maxAttempts: number;
623
+ phase: "failed";
624
+ recoveryId: number;
625
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
626
+ trigger: "error" | "manual" | "visibility";
627
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
628
+ } | {
629
+ outcome: "source_changed" | "destroyed" | "superseded";
630
+ attempt: number;
631
+ maxAttempts: number;
632
+ phase: "cancelled";
633
+ recoveryId: number;
634
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
635
+ trigger: "error" | "manual" | "visibility";
636
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
637
+ };
638
+ } | {
639
+ event: "compatwarning";
640
+ payload: {
641
+ code: "W_BROWSER_INCOMPATIBLE" | "W_VERSION_MISMATCH" | "W_EVENT_REJECTED";
642
+ message: string;
643
+ ua: string;
644
+ hostVersion?: string | undefined;
645
+ iframeVersion?: string | undefined;
646
+ rejectedEvent?: string | undefined;
647
+ };
648
+ } | {
649
+ event: "stalled";
650
+ payload: {
651
+ phase: "start" | "end";
652
+ position: number;
653
+ durationMs?: number | undefined;
654
+ kind?: "seek" | "playback" | "firstframe" | undefined;
655
+ };
656
+ } | {
657
+ event: "playablechange";
658
+ payload: {
659
+ reason: "error" | "stalled" | "ok" | "initializing" | "buffering" | "reconnecting" | "autoplay_blocked" | "frame_disconnected" | "degraded";
660
+ playable: boolean;
661
+ recoverable: boolean;
662
+ };
663
+ } | {
664
+ event: "kernelhealth";
665
+ payload: {
666
+ reason: "media" | "network" | "other";
667
+ durationMs: number;
668
+ degraded: boolean;
669
+ count: number;
670
+ detail: string;
671
+ };
672
+ } | {
673
+ event: "audiohealth";
674
+ payload: {
675
+ reason: "audio_data_gap";
676
+ durationMs: number;
677
+ degraded: boolean;
678
+ };
679
+ } | {
680
+ event: "bufferhealth";
681
+ payload: {
682
+ draining: boolean;
683
+ marginSec: number;
684
+ };
685
+ } | {
686
+ event: "contextchange";
687
+ payload: {
688
+ sessionId: string;
689
+ kernel: "native" | "hls.js" | "flv.js";
690
+ position: number;
691
+ qualityLevel: number | null;
692
+ srcOrigin: string;
693
+ srcPath: string;
694
+ streamKind?: "live" | "vod" | undefined;
695
+ runtime?: {
696
+ platform: "unknown" | "ios" | "android" | "desktop";
697
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
698
+ mse: "standard" | "managed" | "unavailable";
699
+ } | undefined;
700
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
701
+ };
702
+ } | {
703
+ event: "firstframe";
704
+ payload: {
705
+ fvt: number;
706
+ };
707
+ } | {
708
+ event: "framefreeze";
709
+ payload: {
710
+ durationMs: number;
711
+ droppedFrames: number;
712
+ totalFrames: number;
713
+ };
714
+ } | {
715
+ event: "useraction";
716
+ payload: {
717
+ source: string;
718
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
719
+ from: string | number | boolean | null;
720
+ to: string | number | boolean | null;
721
+ };
722
+ }) => any) | undefined;
723
+ onReady?: ((payload: {
724
+ duration: number;
725
+ quality: import('@video-lab/protocol').QualityLevel[];
726
+ subtitles?: import('@video-lab/protocol').SubtitleTrackInfo[];
727
+ }) => any) | undefined;
728
+ onPlay?: (() => any) | undefined;
729
+ onPause?: (() => any) | undefined;
730
+ onEnded?: (() => any) | undefined;
731
+ onTimeUpdate?: ((payload: {
732
+ time: number;
733
+ duration: number;
734
+ }) => any) | undefined;
735
+ onVolumeChange?: ((payload: {
736
+ volume: number;
737
+ muted: boolean;
738
+ }) => any) | undefined;
739
+ onSeeking?: ((payload: {
740
+ time: number;
741
+ }) => any) | undefined;
742
+ onSeeked?: ((payload: {
743
+ time: number;
744
+ }) => any) | undefined;
745
+ onWaiting?: (() => any) | undefined;
746
+ onPlaying?: (() => any) | undefined;
747
+ onQualityChange?: ((payload: {
748
+ level: number;
749
+ auto: boolean;
750
+ }) => any) | undefined;
751
+ onSubtitleChange?: ((payload: {
752
+ id: number | null;
753
+ }) => any) | undefined;
754
+ onError?: ((payload: {
755
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
756
+ message: string;
757
+ retryable: boolean;
758
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
759
+ cause?: import('zod').objectOutputType<{
760
+ name: import('zod').ZodString;
761
+ message: import('zod').ZodString;
762
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
763
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
764
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
765
+ }) => any) | undefined;
766
+ onAutoplayBlocked?: (() => any) | undefined;
767
+ onReconnectStart?: ((payload: {
768
+ attempt: number;
769
+ maxAttempts: number;
770
+ }) => any) | undefined;
771
+ onReconnectSuccess?: (() => any) | undefined;
772
+ onReconnectFailed?: (() => any) | undefined;
773
+ onCompatWarning?: ((payload: {
774
+ code: string;
775
+ message: string;
776
+ ua: string;
777
+ }) => any) | undefined;
778
+ onStalled?: ((payload: {
779
+ phase: "start" | "end";
780
+ position: number;
781
+ durationMs?: number;
782
+ }) => any) | undefined;
783
+ onPlayableChange?: ((payload: {
784
+ playable: boolean;
785
+ reason: import('@video-lab/protocol').PlayableReason;
786
+ recoverable: boolean;
787
+ }) => any) | undefined;
788
+ onKernelHealth?: ((payload: {
789
+ reason: "media" | "network" | "other";
790
+ durationMs: number;
791
+ degraded: boolean;
792
+ count: number;
793
+ detail: string;
794
+ }) => any) | undefined;
795
+ onAudioHealth?: ((payload: {
796
+ reason: "audio_data_gap";
797
+ durationMs: number;
798
+ degraded: boolean;
799
+ }) => any) | undefined;
800
+ onBufferHealth?: ((payload: {
801
+ draining: boolean;
802
+ marginSec: number;
803
+ }) => any) | undefined;
804
+ onContextChange?: ((payload: {
805
+ sessionId: string;
806
+ kernel: "native" | "hls.js" | "flv.js";
807
+ position: number;
808
+ qualityLevel: number | null;
809
+ srcOrigin: string;
810
+ srcPath: string;
811
+ streamKind?: "live" | "vod" | undefined;
812
+ runtime?: {
813
+ platform: "unknown" | "ios" | "android" | "desktop";
814
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
815
+ mse: "standard" | "managed" | "unavailable";
816
+ } | undefined;
817
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
818
+ }) => any) | undefined;
819
+ onSourceRoute?: ((payload: {
820
+ outcome: "selected";
821
+ sessionId: string;
822
+ candidateTypes: ("mp4" | "hls" | "flv")[];
823
+ streamKind: "live" | "vod";
824
+ runtime: {
825
+ platform: "unknown" | "ios" | "android" | "desktop";
826
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
827
+ mse: "standard" | "managed" | "unavailable";
828
+ };
829
+ mediaType: "mp4" | "hls" | "flv";
830
+ kernel: "native" | "hls.js" | "flv.js";
831
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
832
+ } | {
833
+ outcome: "unsupported";
834
+ sessionId: string;
835
+ candidateTypes: ("mp4" | "hls" | "flv")[];
836
+ streamKind: "live" | "vod";
837
+ runtime: {
838
+ platform: "unknown" | "ios" | "android" | "desktop";
839
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
840
+ mse: "standard" | "managed" | "unavailable";
841
+ };
842
+ mediaType: null;
843
+ kernel: null;
844
+ reason: "no_supported_candidate";
845
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
846
+ }) => any) | undefined;
847
+ onFirstFrame?: ((payload: {
848
+ fvt: number;
849
+ }) => any) | undefined;
850
+ onFrameFreeze?: ((payload: {
851
+ durationMs: number;
852
+ droppedFrames: number;
853
+ totalFrames: number;
854
+ }) => any) | undefined;
855
+ onUserAction?: ((payload: {
856
+ source: string;
857
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
858
+ from: string | number | boolean | null;
859
+ to: string | number | boolean | null;
860
+ }) => any) | undefined;
861
+ }, {
34
862
  autoplay: boolean;
35
863
  muted: boolean;
36
864
  loop: boolean;
@@ -38,12 +866,29 @@ declare const __VLS_component: import('vue').DefineComponent<VideoPlayerFramePro
38
866
  controls: boolean;
39
867
  interactive: boolean;
40
868
  debug: boolean;
41
- }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
869
+ }, {}>;
42
870
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
43
871
  export default _default;
872
+ type __VLS_WithDefaults<P, D> = {
873
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
874
+ default: D[K];
875
+ }> : P[K];
876
+ };
877
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
878
+ type __VLS_TypePropsToOption<T> = {
879
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
880
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
881
+ } : {
882
+ type: import('vue').PropType<T[K]>;
883
+ required: true;
884
+ };
885
+ };
44
886
  type __VLS_WithSlots<T, S> = T & {
45
887
  new (): {
46
888
  $slots: S;
47
889
  };
48
890
  };
891
+ type __VLS_PrettifyLocal<T> = {
892
+ [K in keyof T]: T[K];
893
+ } & {};
49
894
  //# sourceMappingURL=VideoPlayerFrame.vue.d.ts.map
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("vue"),t=require("@video-lab/frame-core");function n(n,r,i){let a=(0,e.shallowRef)(null),o=(0,e.ref)(!1),s=(0,e.ref)(!0);function c(){let e={};return r.preset!==void 0&&(e.preset=r.preset),r.autoplay!==void 0&&(e.autoplay=r.autoplay),r.muted!==void 0&&(e.muted=r.muted),r.loop!==void 0&&(e.loop=r.loop),r.playsinline!==void 0&&(e.playsinline=r.playsinline),r.playbackRate!==void 0&&(e.playbackRate=r.playbackRate),r.volume!==void 0&&(e.volume=r.volume),r.startTime!==void 0&&(e.startTime=r.startTime),r.preload!==void 0&&(e.preload=r.preload),r.controls!==void 0&&(e.controls=r.controls),r.interactive!==void 0&&(e.interactive=r.interactive),r.poster!==void 0&&(e.poster=r.poster),r.pauseImage!==void 0&&(e.pauseImage=r.pauseImage),r.locale!==void 0&&(e.locale=r.locale),r.danmaku!==void 0&&(e.danmaku=r.danmaku),r.debug!==void 0&&(e.debug=r.debug),e}function l(e){(e.event===`play`||e.event===`error`)&&(s.value=!1);try{i(`playerEvent`,e)}catch{}switch(e.event){case`ready`:i(`ready`,e.payload);break;case`play`:i(`play`);break;case`pause`:i(`pause`);break;case`ended`:i(`ended`);break;case`timeupdate`:i(`timeUpdate`,e.payload);break;case`volumechange`:i(`volumeChange`,e.payload);break;case`seeking`:i(`seeking`,e.payload);break;case`seeked`:i(`seeked`,e.payload);break;case`waiting`:i(`waiting`);break;case`playing`:i(`playing`);break;case`qualitychange`:i(`qualityChange`,e.payload);break;case`subtitlechange`:i(`subtitleChange`,e.payload);break;case`error`:i(`error`,e.payload);break;case`autoplayblocked`:i(`autoplayBlocked`);break;case`reconnectstart`:i(`reconnectStart`,{attempt:e.payload.attempt,maxAttempts:e.payload.maxAttempts});break;case`reconnectsuccess`:i(`reconnectSuccess`);break;case`reconnectfailed`:i(`reconnectFailed`);break;case`compatwarning`:i(`compatWarning`,e.payload);break;case`stalled`:i(`stalled`,e.payload);break;case`playablechange`:i(`playableChange`,e.payload);break;case`bufferhealth`:i(`bufferHealth`,e.payload);break;case`contextchange`:i(`contextChange`,e.payload);break;case`sourceroute`:i(`sourceRoute`,e.payload);break;case`firstframe`:i(`firstFrame`,e.payload);break;case`framefreeze`:i(`frameFreeze`,e.payload);break;case`useraction`:i(`userAction`,e.payload);break;case`kernelhealth`:i(`kernelHealth`,e.payload);break;case`audiohealth`:i(`audioHealth`,e.payload);break;case`recovery`:break;default:break}}let u=!1;return(0,e.onMounted)(async()=>{o.value=!0;let e=n.value;if(!e)return;let i=await(0,t.createPlayerFrame)({container:e,source:r.source,config:c(),...r.origin===void 0?{}:{origin:r.origin},...r.version===void 0?{}:{version:r.version},onEvent:l,debug:r.debug??!1});if(u){i.destroy();return}a.value=i}),(0,e.watch)(()=>JSON.stringify(r.source),async()=>{s.value=!0;try{await a.value?.load(r.source)}catch(e){l({event:`error`,payload:(0,t.toPlayerError)(e)})}}),(0,e.watch)(()=>r.muted,async e=>{if(e!==void 0)try{await a.value?.setMuted(e)}catch(e){l({event:`error`,payload:(0,t.toPlayerError)(e)})}}),(0,e.watch)(()=>r.locale,async e=>{if(e!==void 0)try{await a.value?.setLocale(e)}catch(e){l({event:`error`,payload:(0,t.toPlayerError)(e)})}},{deep:!0}),(0,e.onBeforeUnmount)(async()=>{u=!0,await a.value?.destroy(),a.value=null}),{handle:a,isMounted:o,hostPosterVisible:s}}var r=[`src`,`loading`],i=(0,e.defineComponent)({__name:`VideoPlayerFrame`,props:{source:{},autoplay:{type:Boolean,default:void 0},muted:{type:Boolean,default:void 0},loop:{type:Boolean,default:void 0},controls:{type:Boolean,default:void 0},interactive:{type:Boolean,default:void 0},playsinline:{type:Boolean,default:void 0},playbackRate:{},volume:{},startTime:{},preload:{},poster:{},pauseImage:{},preset:{},origin:{},version:{},locale:{},danmaku:{},debug:{type:Boolean,default:void 0}},emits:`playerEvent.ready.play.pause.ended.timeUpdate.volumeChange.seeking.seeked.waiting.playing.qualityChange.subtitleChange.error.autoplayBlocked.reconnectStart.reconnectSuccess.reconnectFailed.compatWarning.stalled.playableChange.kernelHealth.audioHealth.bufferHealth.contextChange.sourceRoute.firstFrame.frameFreeze.userAction`.split(`.`),setup(t,{expose:i,emit:a}){let o=t,s=a,{handle:c,isMounted:l,hostPosterVisible:u}=n((0,e.useTemplateRef)(`container`),o,s),d=(0,e.computed)(()=>typeof o.poster==`string`?o.poster:o.poster?.url??``),f=(0,e.computed)(()=>typeof o.poster==`string`?`cover`:o.poster?.fit??`cover`),p=(0,e.computed)(()=>typeof o.poster!=`string`&&o.poster?.loading===`eager`?`eager`:`lazy`);return i({play:()=>c.value?.play()??Promise.resolve(),pause:()=>c.value?.pause()??Promise.resolve(),seek:e=>c.value?.seek(e)??Promise.resolve(),setMuted:e=>c.value?.setMuted(e)??Promise.resolve(),setVolume:e=>c.value?.setVolume(e)??Promise.resolve(),setPlaybackRate:e=>c.value?.setPlaybackRate(e)??Promise.resolve(),enterFullscreen:()=>c.value?.enterFullscreen()??Promise.resolve(),exitFullscreen:()=>c.value?.exitFullscreen()??Promise.resolve(),setQuality:e=>c.value?.setQuality(e)??Promise.resolve(),setSubtitle:e=>c.value?.setSubtitle(e)??Promise.resolve(),setLocale:e=>c.value?.setLocale(e)??Promise.resolve(),pushDanmaku:e=>c.value?.pushDanmaku(e)??Promise.resolve(),setDanmakuEnabled:e=>c.value?.setDanmakuEnabled(e)??Promise.resolve(),clearDanmaku:()=>c.value?.clearDanmaku()??Promise.resolve(),reconnect:e=>c.value?.reconnect(e)??Promise.resolve(),destroy:()=>c.value?.destroy()??Promise.resolve(),getCurrentTime:()=>c.value?.getCurrentTime()??0,getPlaybackContext:()=>c.value?.getPlaybackContext()??null,getDuration:()=>c.value?.getDuration()??0,getPlayerHandle:()=>c.value}),(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{ref:`container`,class:`sentinel-video-frame`,style:(0,e.normalizeStyle)({position:`relative`,width:`100%`,height:`100%`,pointerEvents:o.interactive===!1?`none`:void 0})},[(0,e.unref)(l)?(0,e.createCommentVNode)(``,!0):(0,e.renderSlot)(t.$slots,`ssr-placeholder`,{key:0},()=>[n[0]||=(0,e.createElementVNode)(`div`,{class:`sentinel-video-frame__placeholder`,style:{width:`100%`,height:`100%`,background:`#000`}},null,-1)]),(0,e.unref)(u)&&d.value?((0,e.openBlock)(),(0,e.createElementBlock)(`img`,{key:1,class:`sentinel-video-frame__poster`,src:d.value,alt:``,loading:p.value,style:(0,e.normalizeStyle)({position:`absolute`,inset:0,width:`100%`,height:`100%`,display:`block`,objectFit:f.value,zIndex:10})},null,12,r)):(0,e.createCommentVNode)(``,!0)],4))}});exports.VideoPlayerFrame=i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("vue"),t=require("@video-lab/frame-core");function n(n,r,i){let a=(0,e.shallowRef)(null),o=(0,e.ref)(!1),s=(0,e.ref)(!0);function c(){let e={};return r.preset!==void 0&&(e.preset=r.preset),r.autoplay!==void 0&&(e.autoplay=r.autoplay),r.muted!==void 0&&(e.muted=r.muted),r.loop!==void 0&&(e.loop=r.loop),r.playsinline!==void 0&&(e.playsinline=r.playsinline),r.playbackRate!==void 0&&(e.playbackRate=r.playbackRate),r.volume!==void 0&&(e.volume=r.volume),r.startTime!==void 0&&(e.startTime=r.startTime),r.preload!==void 0&&(e.preload=r.preload),r.controls!==void 0&&(e.controls=r.controls),r.interactive!==void 0&&(e.interactive=r.interactive),r.poster!==void 0&&(e.poster=r.poster),r.pauseImage!==void 0&&(e.pauseImage=r.pauseImage),r.locale!==void 0&&(e.locale=r.locale),r.danmaku!==void 0&&(e.danmaku=r.danmaku),r.debug!==void 0&&(e.debug=r.debug),e}function l(e){(e.event===`play`||e.event===`error`)&&(s.value=!1);try{i(`playerEvent`,e)}catch{}switch(e.event){case`ready`:i(`ready`,e.payload);break;case`play`:i(`play`);break;case`pause`:i(`pause`);break;case`ended`:i(`ended`);break;case`timeupdate`:i(`timeUpdate`,e.payload);break;case`volumechange`:i(`volumeChange`,e.payload);break;case`seeking`:i(`seeking`,e.payload);break;case`seeked`:i(`seeked`,e.payload);break;case`waiting`:i(`waiting`);break;case`playing`:i(`playing`);break;case`qualitychange`:i(`qualityChange`,e.payload);break;case`subtitlechange`:i(`subtitleChange`,e.payload);break;case`error`:i(`error`,e.payload);break;case`autoplayblocked`:i(`autoplayBlocked`);break;case`reconnectstart`:i(`reconnectStart`,{attempt:e.payload.attempt,maxAttempts:e.payload.maxAttempts});break;case`reconnectsuccess`:i(`reconnectSuccess`);break;case`reconnectfailed`:i(`reconnectFailed`);break;case`compatwarning`:i(`compatWarning`,e.payload);break;case`stalled`:i(`stalled`,e.payload);break;case`playablechange`:i(`playableChange`,e.payload);break;case`bufferhealth`:i(`bufferHealth`,e.payload);break;case`contextchange`:i(`contextChange`,e.payload);break;case`sourceroute`:i(`sourceRoute`,e.payload);break;case`firstframe`:i(`firstFrame`,e.payload);break;case`framefreeze`:i(`frameFreeze`,e.payload);break;case`useraction`:i(`userAction`,e.payload);break;case`kernelhealth`:i(`kernelHealth`,e.payload);break;case`audiohealth`:i(`audioHealth`,e.payload);break;case`recovery`:break;default:break}}let u=!1;return(0,e.onMounted)(async()=>{o.value=!0;let e=n.value;if(!e)return;let i=await(0,t.createPlayerFrame)({container:e,source:r.source,config:c(),...r.origin===void 0?{}:{origin:r.origin},...r.version===void 0?{}:{version:r.version},onEvent:l,debug:r.debug??!1});if(u){i.destroy();return}a.value=i}),(0,e.watch)(()=>JSON.stringify(r.source),async()=>{s.value=!0;try{await a.value?.load(r.source)}catch(e){l({event:`error`,payload:(0,t.toPlayerError)(e)})}}),(0,e.watch)(()=>r.muted,async e=>{if(e!==void 0)try{await a.value?.setMuted(e)}catch(e){l({event:`error`,payload:(0,t.toPlayerError)(e)})}}),(0,e.watch)(()=>r.locale,async e=>{if(e!==void 0)try{await a.value?.setLocale(e)}catch(e){l({event:`error`,payload:(0,t.toPlayerError)(e)})}},{deep:!0}),(0,e.onBeforeUnmount)(async()=>{u=!0,await a.value?.destroy(),a.value=null}),{handle:a,isMounted:o,hostPosterVisible:s}}var r=(0,e.createElementVNode)(`div`,{class:`sentinel-video-frame__placeholder`,style:{width:`100%`,height:`100%`,background:`#000`}},null,-1),i=[`src`,`loading`],a=(0,e.defineComponent)({__name:`VideoPlayerFrame`,props:{source:{},autoplay:{type:Boolean,default:void 0},muted:{type:Boolean,default:void 0},loop:{type:Boolean,default:void 0},controls:{type:Boolean,default:void 0},interactive:{type:Boolean,default:void 0},playsinline:{type:Boolean,default:void 0},playbackRate:{},volume:{},startTime:{},preload:{},poster:{},pauseImage:{},preset:{},origin:{},version:{},locale:{},danmaku:{},debug:{type:Boolean,default:void 0}},emits:`playerEvent.ready.play.pause.ended.timeUpdate.volumeChange.seeking.seeked.waiting.playing.qualityChange.subtitleChange.error.autoplayBlocked.reconnectStart.reconnectSuccess.reconnectFailed.compatWarning.stalled.playableChange.kernelHealth.audioHealth.bufferHealth.contextChange.sourceRoute.firstFrame.frameFreeze.userAction`.split(`.`),setup(t,{expose:a,emit:o}){let s=t,c=o,l=(0,e.shallowRef)(null),{handle:u,isMounted:d,hostPosterVisible:f}=n(l,s,c),p=(0,e.computed)(()=>typeof s.poster==`string`?s.poster:s.poster?.url??``),m=(0,e.computed)(()=>typeof s.poster==`string`?`cover`:s.poster?.fit??`cover`),h=(0,e.computed)(()=>typeof s.poster!=`string`&&s.poster?.loading===`eager`?`eager`:`lazy`);return a({play:()=>u.value?.play()??Promise.resolve(),pause:()=>u.value?.pause()??Promise.resolve(),seek:e=>u.value?.seek(e)??Promise.resolve(),setMuted:e=>u.value?.setMuted(e)??Promise.resolve(),setVolume:e=>u.value?.setVolume(e)??Promise.resolve(),setPlaybackRate:e=>u.value?.setPlaybackRate(e)??Promise.resolve(),enterFullscreen:()=>u.value?.enterFullscreen()??Promise.resolve(),exitFullscreen:()=>u.value?.exitFullscreen()??Promise.resolve(),setQuality:e=>u.value?.setQuality(e)??Promise.resolve(),setSubtitle:e=>u.value?.setSubtitle(e)??Promise.resolve(),setLocale:e=>u.value?.setLocale(e)??Promise.resolve(),pushDanmaku:e=>u.value?.pushDanmaku(e)??Promise.resolve(),setDanmakuEnabled:e=>u.value?.setDanmakuEnabled(e)??Promise.resolve(),clearDanmaku:()=>u.value?.clearDanmaku()??Promise.resolve(),reconnect:e=>u.value?.reconnect(e)??Promise.resolve(),destroy:()=>u.value?.destroy()??Promise.resolve(),getCurrentTime:()=>u.value?.getCurrentTime()??0,getPlaybackContext:()=>u.value?.getPlaybackContext()??null,getDuration:()=>u.value?.getDuration()??0,getPlayerHandle:()=>u.value}),(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{ref_key:`containerRef`,ref:l,class:`sentinel-video-frame`,style:(0,e.normalizeStyle)({position:`relative`,width:`100%`,height:`100%`,pointerEvents:s.interactive===!1?`none`:void 0})},[(0,e.unref)(d)?(0,e.createCommentVNode)(``,!0):(0,e.renderSlot)(t.$slots,`ssr-placeholder`,{key:0},()=>[r]),(0,e.unref)(f)&&p.value?((0,e.openBlock)(),(0,e.createElementBlock)(`img`,{key:1,class:`sentinel-video-frame__poster`,src:p.value,alt:``,loading:h.value,style:(0,e.normalizeStyle)({position:`absolute`,inset:0,width:`100%`,height:`100%`,display:`block`,objectFit:m.value,zIndex:10})},null,12,i)):(0,e.createCommentVNode)(``,!0)],4))}});exports.VideoPlayerFrame=a;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeStyle as a, onBeforeUnmount as o, onMounted as s, openBlock as c, ref as l, renderSlot as u, shallowRef as d, unref as f, useTemplateRef as p, watch as m } from "vue";
2
- import { createPlayerFrame as h, toPlayerError as g } from "@video-lab/frame-core";
1
+ import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeStyle as a, onBeforeUnmount as o, onMounted as s, openBlock as c, ref as l, renderSlot as u, shallowRef as d, unref as f, watch as p } from "vue";
2
+ import { createPlayerFrame as m, toPlayerError as h } from "@video-lab/frame-core";
3
3
  //#region src/use-frame-connection.ts
4
- function _(e, t, n) {
4
+ function g(e, t, n) {
5
5
  let r = d(null), i = l(!1), a = l(!0);
6
6
  function c() {
7
7
  let e = {};
@@ -109,7 +109,7 @@ function _(e, t, n) {
109
109
  i.value = !0;
110
110
  let n = e.value;
111
111
  if (!n) return;
112
- let a = await h({
112
+ let a = await m({
113
113
  container: n,
114
114
  source: t.source,
115
115
  config: c(),
@@ -123,32 +123,32 @@ function _(e, t, n) {
123
123
  return;
124
124
  }
125
125
  r.value = a;
126
- }), m(() => JSON.stringify(t.source), async () => {
126
+ }), p(() => JSON.stringify(t.source), async () => {
127
127
  a.value = !0;
128
128
  try {
129
129
  await r.value?.load(t.source);
130
130
  } catch (e) {
131
131
  u({
132
132
  event: "error",
133
- payload: g(e)
133
+ payload: h(e)
134
134
  });
135
135
  }
136
- }), m(() => t.muted, async (e) => {
136
+ }), p(() => t.muted, async (e) => {
137
137
  if (e !== void 0) try {
138
138
  await r.value?.setMuted(e);
139
139
  } catch (e) {
140
140
  u({
141
141
  event: "error",
142
- payload: g(e)
142
+ payload: h(e)
143
143
  });
144
144
  }
145
- }), m(() => t.locale, async (e) => {
145
+ }), p(() => t.locale, async (e) => {
146
146
  if (e !== void 0) try {
147
147
  await r.value?.setLocale(e);
148
148
  } catch (e) {
149
149
  u({
150
150
  event: "error",
151
- payload: g(e)
151
+ payload: h(e)
152
152
  });
153
153
  }
154
154
  }, { deep: !0 }), o(async () => {
@@ -161,7 +161,14 @@ function _(e, t, n) {
161
161
  }
162
162
  //#endregion
163
163
  //#region src/VideoPlayerFrame.vue?vue&type=script&setup=true&lang.ts
164
- var v = ["src", "loading"], y = /* @__PURE__ */ i({
164
+ var _ = /*#__PURE__*/ r("div", {
165
+ class: "sentinel-video-frame__placeholder",
166
+ style: {
167
+ width: "100%",
168
+ height: "100%",
169
+ background: "#000"
170
+ }
171
+ }, null, -1), v = ["src", "loading"], y = /* @__PURE__ */ i({
165
172
  __name: "VideoPlayerFrame",
166
173
  props: {
167
174
  source: {},
@@ -206,9 +213,9 @@ var v = ["src", "loading"], y = /* @__PURE__ */ i({
206
213
  }
207
214
  },
208
215
  emits: /* @__PURE__ */ "playerEvent.ready.play.pause.ended.timeUpdate.volumeChange.seeking.seeked.waiting.playing.qualityChange.subtitleChange.error.autoplayBlocked.reconnectStart.reconnectSuccess.reconnectFailed.compatWarning.stalled.playableChange.kernelHealth.audioHealth.bufferHealth.contextChange.sourceRoute.firstFrame.frameFreeze.userAction".split("."),
209
- setup(i, { expose: o, emit: s }) {
210
- let l = i, d = s, { handle: m, isMounted: h, hostPosterVisible: g } = _(p("container"), l, d), y = e(() => typeof l.poster == "string" ? l.poster : l.poster?.url ?? ""), b = e(() => typeof l.poster == "string" ? "cover" : l.poster?.fit ?? "cover"), x = e(() => typeof l.poster != "string" && l.poster?.loading === "eager" ? "eager" : "lazy");
211
- return o({
216
+ setup(r, { expose: i, emit: o }) {
217
+ let s = r, l = o, p = d(null), { handle: m, isMounted: h, hostPosterVisible: y } = g(p, s, l), b = e(() => typeof s.poster == "string" ? s.poster : s.poster?.url ?? ""), x = e(() => typeof s.poster == "string" ? "cover" : s.poster?.fit ?? "cover"), S = e(() => typeof s.poster != "string" && s.poster?.loading === "eager" ? "eager" : "lazy");
218
+ return i({
212
219
  play: () => m.value?.play() ?? Promise.resolve(),
213
220
  pause: () => m.value?.pause() ?? Promise.resolve(),
214
221
  seek: (e) => m.value?.seek(e) ?? Promise.resolve(),
@@ -229,35 +236,29 @@ var v = ["src", "loading"], y = /* @__PURE__ */ i({
229
236
  getPlaybackContext: () => m.value?.getPlaybackContext() ?? null,
230
237
  getDuration: () => m.value?.getDuration() ?? 0,
231
238
  getPlayerHandle: () => m.value
232
- }), (e, i) => (c(), n("div", {
233
- ref: "container",
239
+ }), (e, r) => (c(), n("div", {
240
+ ref_key: "containerRef",
241
+ ref: p,
234
242
  class: "sentinel-video-frame",
235
243
  style: a({
236
244
  position: "relative",
237
245
  width: "100%",
238
246
  height: "100%",
239
- pointerEvents: l.interactive === !1 ? "none" : void 0
247
+ pointerEvents: s.interactive === !1 ? "none" : void 0
240
248
  })
241
- }, [f(h) ? t("", !0) : u(e.$slots, "ssr-placeholder", { key: 0 }, () => [i[0] ||= r("div", {
242
- class: "sentinel-video-frame__placeholder",
243
- style: {
244
- width: "100%",
245
- height: "100%",
246
- background: "#000"
247
- }
248
- }, null, -1)]), f(g) && y.value ? (c(), n("img", {
249
+ }, [f(h) ? t("", !0) : u(e.$slots, "ssr-placeholder", { key: 0 }, () => [_]), f(y) && b.value ? (c(), n("img", {
249
250
  key: 1,
250
251
  class: "sentinel-video-frame__poster",
251
- src: y.value,
252
+ src: b.value,
252
253
  alt: "",
253
- loading: x.value,
254
+ loading: S.value,
254
255
  style: a({
255
256
  position: "absolute",
256
257
  inset: 0,
257
258
  width: "100%",
258
259
  height: "100%",
259
260
  display: "block",
260
- objectFit: b.value,
261
+ objectFit: x.value,
261
262
  zIndex: 10
262
263
  })
263
264
  }, null, 12, v)) : t("", !0)], 4));
package/dist/types.d.ts CHANGED
@@ -54,9 +54,9 @@ export interface VideoPlayerFrameProps {
54
54
  */
55
55
  pauseImage?: string | PauseImageConfig;
56
56
  preset?: PresetName;
57
- /** iframe URL origin 覆盖(私有化 / dev)。默认官方 CDN */
57
+ /** iframe 部署基础 URL,可包含自定义目录;SDK 只追加版本目录,不追加 embed。 */
58
58
  origin?: string;
59
- /** iframe URL 版本段覆盖。默认跟随契约 major(`DEFAULT_VERSION`,ADR-053) */
59
+ /** iframe 版本目录;默认使用 DEFAULT_VERSION 指定的 iframe 应用精确版本。 */
60
60
  version?: string;
61
61
  /** 传给 iframe 内 xgplayer 的 i18n 配置 */
62
62
  locale?: LocaleConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@video-lab/vue-frame",
3
- "version": "1.0.1",
3
+ "version": "2.0.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -24,22 +24,23 @@
24
24
  ],
25
25
  "sideEffects": false,
26
26
  "peerDependencies": {
27
- "vue": ">=3.5.0"
27
+ "vue": "^3.4.0"
28
28
  },
29
29
  "dependencies": {
30
- "@video-lab/protocol": "1.0.1",
31
- "@video-lab/frame-core": "1.0.1"
30
+ "@video-lab/protocol": "2.0.0",
31
+ "@video-lab/frame-core": "2.0.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@vitejs/plugin-vue": "^6.0.8",
35
- "@vue/test-utils": "^2.4.0",
35
+ "@vue/test-utils": "2.4.6",
36
36
  "jsdom": "^24.0.0",
37
37
  "vite": "^8.1.5",
38
38
  "vite-plugin-dts": "^5.0.3",
39
- "vue": "^3.5.0",
39
+ "vue": "3.4.0",
40
40
  "vue-tsc": "^2.0.0",
41
41
  "typescript": "~5.9.0",
42
- "vitest": "^4.1.10"
42
+ "vitest": "^4.1.10",
43
+ "@vue/server-renderer": "3.4.0"
43
44
  },
44
45
  "description": "Video Lab Player Vue 3 iframe 组件:隔离沙箱接入,不引入播放内核",
45
46
  "publishConfig": {