@videts/vide 0.7.0 → 0.8.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,16 @@
1
1
  # vide
2
2
 
3
- Modular video player library. Use only what you need.
3
+ [![CI](https://github.com/hogekai/vide/actions/workflows/ci.yml/badge.svg)](https://github.com/hogekai/vide/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/@videts/vide)](https://www.npmjs.com/package/@videts/vide)
5
+ [![gzip](https://img.shields.io/badge/core-1.8KB-blue)](https://bundlephobia.com/package/@videts/vide)
6
+
7
+ Modular video player library. Use only what you need. Also works with `<audio>`.
8
+
9
+ **[Documentation](https://hogekai.github.io/vide/)** · **[Getting Started](https://hogekai.github.io/vide/getting-started)** · **[Demo](https://hogekai.github.io/vide/demo)**
10
+
11
+ ```html
12
+ <video src="video.mp4"></video>
13
+ ```
4
14
 
5
15
  ```ts
6
16
  import { createPlayer } from "@videts/vide";
@@ -12,22 +22,6 @@ player.use(hls());
12
22
  player.use(vast({ tagUrl: "https://example.com/vast.xml" }));
13
23
  ```
14
24
 
15
- | Plugin | What | gzip |
16
- |--------|------|-----:|
17
- | `@videts/vide` | Core player | 1.7 KB |
18
- | `@videts/vide/vast` | VAST 4.2 ads | 1.5 KB |
19
- | `@videts/vide/vmap` | VMAP scheduling | 2.6 KB |
20
- | `@videts/vide/hls` | HLS streaming | 0.6 KB |
21
- | `@videts/vide/dash` | DASH streaming | 0.6 KB |
22
- | `@videts/vide/drm` | DRM (Widevine + FairPlay) | 0.8 KB |
23
- | `@videts/vide/ssai` | SSAI (server-side ads) | 1.4 KB |
24
- | `@videts/vide/omid` | Open Measurement | 1.7 KB |
25
- | `@videts/vide/simid` | Interactive ads | 2.4 KB |
26
- | `@videts/vide/ui` | Headless UI | 4.7 KB |
27
- | `@videts/vide/ui/theme.css` | Default theme | 3.4 KB |
28
-
29
- > HLS and DASH plugins require `hls.js` and `dashjs` as peer dependencies.
30
-
31
25
  Zero config. No data attributes. No class scanning. No side effects.
32
26
  Web standards first — if the browser can do it, we don't reinvent it.
33
27
 
@@ -41,6 +35,10 @@ npm install @videts/vide
41
35
 
42
36
  ## Quick Start
43
37
 
38
+ ```html
39
+ <video src="video.mp4"></video>
40
+ ```
41
+
44
42
  ```ts
45
43
  import { createPlayer } from "@videts/vide";
46
44
  // import type { PlayerEventMap } from "@videts/vide";
@@ -68,208 +66,31 @@ player.on("statechange", ({ from, to }) => console.log(`${from} → ${to}`));
68
66
 
69
67
  Plugins are explicit opt-in. Import only what you need.
70
68
 
71
- ### HLS Streaming
72
-
73
- ```sh
74
- npm install hls.js
75
- ```
76
-
77
- ```ts
78
- import { createPlayer } from "@videts/vide";
79
- import { hls } from "@videts/vide/hls";
80
-
81
- const player = createPlayer(document.querySelector("video")!);
82
- player.use(hls());
83
-
84
- player.src = "https://example.com/stream.m3u8";
85
- ```
86
-
87
- ```ts
88
- // Pass config directly to hls.js constructor
89
- player.use(hls({ hlsConfig: { maxBufferLength: 60 } }));
90
- ```
91
-
92
- ### DASH Streaming
93
-
94
- ```sh
95
- npm install dashjs
96
- ```
97
-
98
- ```ts
99
- import { createPlayer } from "@videts/vide";
100
- import { dash } from "@videts/vide/dash";
101
-
102
- const player = createPlayer(document.querySelector("video")!);
103
- player.use(dash());
104
-
105
- player.src = "https://example.com/stream.mpd";
106
- ```
107
-
108
- ```ts
109
- // Pass settings directly to dashjs.updateSettings()
110
- player.use(dash({ dashConfig: { streaming: { buffer: { bufferTimeDefault: 20 } } } }));
111
- ```
112
-
113
- ### DRM
114
-
115
- Widevine (Chrome/Firefox/Edge) and FairPlay (Safari/iOS). The plugin detects the browser's key system automatically — just pass the license server URL.
116
-
117
- ```ts
118
- import { createPlayer } from "@videts/vide";
119
- import { hls } from "@videts/vide/hls";
120
- import { drm } from "@videts/vide/drm";
121
-
122
- const player = createPlayer(document.querySelector("video")!);
123
- player.use(hls());
124
- player.use(drm({
125
- widevine: {
126
- licenseUrl: "https://license.example.com/widevine",
127
- },
128
- fairplay: {
129
- licenseUrl: "https://license.example.com/fairplay",
130
- certificateUrl: "https://certificate.example.com/fairplay.cer",
131
- },
132
- }));
133
-
134
- player.src = "https://example.com/encrypted-stream.m3u8";
135
- ```
136
-
137
- Works with both HLS and DASH — plugin order doesn't matter.
138
-
139
- ```ts
140
- // Custom headers for license requests (e.g. auth tokens)
141
- player.use(drm({
142
- widevine: {
143
- licenseUrl: "https://license.example.com/widevine",
144
- headers: { Authorization: "Bearer <token>" },
145
- },
146
- }));
147
- ```
148
-
149
- ### SSAI (Server-Side Ad Insertion)
150
-
151
- Detects ad breaks from HLS/DASH in-band metadata and fires standard ad events. No vendor SDK required.
152
-
153
- ```ts
154
- import { createPlayer } from "@videts/vide";
155
- import { hls } from "@videts/vide/hls";
156
- import { ssai } from "@videts/vide/ssai";
157
-
158
- const player = createPlayer(document.querySelector("video")!);
159
- player.use(hls());
160
- player.use(ssai());
161
-
162
- player.on("ad:start", ({ adId }) => console.log("ad started", adId));
163
- player.on("ad:end", ({ adId }) => console.log("ad ended", adId));
164
-
165
- player.src = "https://example.com/ssai-stream.m3u8";
166
- ```
167
-
168
- ```ts
169
- // Custom parser for vendor-specific metadata formats
170
- player.use(ssai({
171
- parser(raw) {
172
- if (raw.source === "daterange" && raw.attributes["X-MY-AD"] === "true") {
173
- return [{
174
- id: raw.attributes.ID,
175
- startTime: new Date(raw.attributes["START-DATE"]).getTime() / 1000,
176
- duration: Number(raw.attributes.DURATION || 0),
177
- trackingUrls: [raw.attributes["X-TRACKING-URL"]].filter(Boolean),
178
- }];
179
- }
180
- return [];
181
- },
182
- }));
183
- ```
184
-
185
- ### UI
186
-
187
- Headless by default — JS creates DOM and wires behavior, styling is yours.
188
- Import `theme.css` for a ready-made look, or target the BEM classes (`vide-play`, `vide-progress__bar`, …) yourself.
189
-
190
- ```ts
191
- import { createPlayer } from "@videts/vide";
192
- import { ui } from "@videts/vide/ui";
193
- import "@videts/vide/ui/theme.css"; // optional — brings default skin
194
-
195
- const player = createPlayer(document.querySelector("video")!);
196
- player.use(ui({ container: document.getElementById("player-container")! }));
197
- ```
198
-
199
- ```ts
200
- // exclude: play, progress, time, volume, fullscreen, loader, error,
201
- // bigplay, poster, keyboard, clickplay, autohide,
202
- // ad-countdown, ad-skip, ad-overlay, ad-label
203
- player.use(ui({
204
- container: el,
205
- exclude: ["volume", "fullscreen"],
206
- poster: "https://example.com/poster.jpg",
207
- }));
208
- ```
209
-
210
- Components can also be used individually:
211
-
212
- ```ts
213
- import { createPlayButton, createProgress } from "@videts/vide/ui";
214
-
215
- const play = createPlayButton();
216
- play.mount(controls);
217
- play.connect(player);
218
- ```
219
-
220
- #### UI + VAST Ads
221
-
222
- ```ts
223
- import { ui } from "@videts/vide/ui";
224
- import { vast } from "@videts/vide/vast";
225
-
226
- // UI plugin provides ad components (countdown, skip, overlay, label)
227
- // that integrate with VAST playback via getAdPlugin()
228
- const uiPlugin = ui({ container: el });
229
- player.use(uiPlugin);
230
- player.use(vast({
231
- tagUrl: "https://example.com/vast.xml",
232
- adPlugins: uiPlugin.getAdPlugin(),
233
- }));
234
- ```
235
-
236
- ### VAST Ads
237
-
238
- ```ts
239
- import { vast } from "@videts/vide/vast";
240
- player.use(vast({ tagUrl: "https://example.com/vast.xml" }));
241
- ```
242
-
243
- ### VMAP Ad Scheduling
244
-
245
- ```ts
246
- import { vmap } from "@videts/vide/vmap";
247
- player.use(vmap({ vmapUrl: "https://example.com/vmap.xml" }));
248
- ```
249
-
250
- ### OMID Viewability
251
-
252
- ```ts
253
- import { vast } from "@videts/vide/vast";
254
- import { omid } from "@videts/vide/omid";
69
+ | Plugin | What | gzip |
70
+ |--------|------|-----:|
71
+ | `@videts/vide` | Core player | 1.8 KB |
72
+ | `@videts/vide/vast` | VAST 4.2 ads | 1.6 KB |
73
+ | `@videts/vide/vmap` | VMAP scheduling | 2.6 KB |
74
+ | `@videts/vide/hls` | HLS streaming | 0.7 KB |
75
+ | `@videts/vide/dash` | DASH streaming | 0.6 KB |
76
+ | `@videts/vide/drm` | DRM (Widevine + FairPlay) | 1.7 KB |
77
+ | `@videts/vide/ssai` | SSAI (server-side ads) | 1.5 KB |
78
+ | `@videts/vide/omid` | Open Measurement | 1.7 KB |
79
+ | `@videts/vide/simid` | Interactive ads | 2.4 KB |
80
+ | `@videts/vide/ui` | Headless UI | 4.8 KB |
81
+ | `@videts/vide/ui/theme.css` | Default theme | 3.4 KB |
255
82
 
256
- player.use(vast({
257
- tagUrl: "https://example.com/vast.xml",
258
- adPlugins: () => [omid({ partner: { name: "your-company", version: "1.0.0" } })],
259
- }));
260
- ```
83
+ > HLS and DASH plugins require `hls.js` and `dashjs` as peer dependencies.
261
84
 
262
- ### SIMID Interactive Ads
85
+ See the [plugin documentation](https://hogekai.github.io/vide/plugins/hls) for usage examples and configuration options.
263
86
 
264
- ```ts
265
- import { vast } from "@videts/vide/vast";
266
- import { simid } from "@videts/vide/simid";
87
+ ## Documentation
267
88
 
268
- player.use(vast({
269
- tagUrl: "https://example.com/vast.xml",
270
- adPlugins: () => [simid({ container: document.getElementById("ad-container")! })],
271
- }));
272
- ```
89
+ - [Getting Started](https://hogekai.github.io/vide/getting-started) — install, CDN usage, basic setup
90
+ - [Plugin Guides](https://hogekai.github.io/vide/plugins/hls) — HLS, DASH, DRM, VAST, UI, and more
91
+ - [API Reference](https://hogekai.github.io/vide/api-reference/) auto-generated from TypeScript
92
+ - [Browser Support](https://hogekai.github.io/vide/browser-support) — compatibility notes
93
+ - [Demo](https://hogekai.github.io/vide/demo) — live examples
273
94
 
274
95
  ## License
275
96
 
@@ -0,0 +1 @@
1
+ var R=1e3,o=2e3,t=2001,E=2002,_=3e3,c=3001,e=4e3,n=4001,p=4002,r=4003;export{R as a,o as b,t as c,E as d,_ as e,c as f,e as g,n as h,p as i,r as j};
@@ -0,0 +1 @@
1
+ function n(r){return r>=2160?"4K":r>=1440?"1440p":r>=1080?"1080p":r>=720?"720p":r>=480?"480p":r>=360?"360p":r>=240?"240p":`${r}p`}export{n as a};
@@ -1,8 +1,10 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { R as RecoveryConfig, e as Plugin } from '../types-vxIcXgJz.js';
2
2
 
3
3
  interface DashPluginOptions {
4
4
  /** dash.js MediaPlayerSettingClass — passed to updateSettings(). */
5
5
  dashConfig?: Record<string, unknown> | undefined;
6
+ /** Error recovery settings. `false` to disable. Defaults to enabled (3 retries, 3s delay, 2x backoff). */
7
+ recovery?: Partial<RecoveryConfig> | false | undefined;
6
8
  }
7
9
 
8
10
  /** Create a DASH streaming plugin for vide. */
@@ -1,2 +1,2 @@
1
- var h="application/dash+xml";function m(t){try{return new URL(t,"https://placeholder.invalid").pathname.endsWith(".mpd")}catch{return t.includes(".mpd")}}function f(t){return t.toLowerCase()===h}function p(t={}){return {name:"dash",setup(e){let o=null,d=false,l={canHandle(r,n){return n&&f(n)?true:m(r)},load(r,n){this.unload(n),g(r,n);},unload(r){o&&(o.destroy(),o=null);}};function g(r,n){import('dashjs').then(s=>{if(d)return;let u=s.default,a=u.MediaPlayer().create();o=a,e.setPluginData("dash",a);let c=e.getPluginData("drm");c?.dashConfig&&a.updateSettings(c.dashConfig),t.dashConfig&&a.updateSettings(t.dashConfig),a.on(u.MediaPlayer.events.ERROR,i=>{typeof i.error=="object"&&i.error!==null?e.emit("error",{code:i.error.code,message:i.error.message}):e.emit("error",{code:0,message:`DASH error: ${String(i.error)}`});}),a.initialize(n,r,n.autoplay);}).catch(s=>{d||e.emit("error",{code:0,message:s instanceof Error?`Failed to load dashjs: ${s.message}`:"Failed to load dashjs"});});}return e.registerSourceHandler(l),()=>{d=true,l.unload(e.el);}}}}
2
- export{p as dash};
1
+ import {a}from'../chunk-H3OXPFD3.mjs';import'../chunk-DWXOYV4E.mjs';var w="application/dash+xml",L={maxRetries:3,retryDelay:3e3,backoffMultiplier:2};function T(n){try{return new URL(n,"https://placeholder.invalid").pathname.endsWith(".mpd")}catch{return n.includes(".mpd")}}function C(n){return n.toLowerCase()===w}function k(n={}){return {name:"dash",setup(e){let c=null,u=false,g=n.recovery===false?false:{...L,...n.recovery??{}},s=0,f=null,v="",l=null;function m(){f!==null&&(clearTimeout(f),f=null);}function R(a){if(g===false||u||s>=g.maxRetries||!l)return false;s++;let r=g.retryDelay*g.backoffMultiplier**(s-1);return m(),f=setTimeout(()=>{u||!l||(a.reset(),a.initialize(l,v,l.autoplay));},r),true}let p={canHandle(a,r){return r&&C(r)?true:T(a)},load(a,r){this.unload(r),E(a,r);},unload(a){m(),s=0,v="",l=null,c&&(c.destroy(),c=null);}};function E(a$1,r){v=a$1,l=r,import('dashjs').then(h=>{if(u)return;let y=h.default,t=y.MediaPlayer().create();c=t,e.setPluginData("dash",t);let b=e.getPluginData("drm");b?.dashConfig&&t.updateSettings(b.dashConfig),n.dashConfig&&t.updateSettings(n.dashConfig),t.on(y.MediaPlayer.events.ERROR,o=>{if(typeof o.error=="object"&&o.error!==null){let d=R(t);e.emit("error",{code:o.error.code,message:o.error.message,source:"dash",recoverable:d,retryCount:d?s:void 0});}else e.emit("error",{code:3001,message:`DASH error: ${String(o.error)}`,source:"dash"});}),t.on(y.MediaPlayer.events.STREAM_INITIALIZED,()=>{s>0&&(s=0,m());let d=t.getBitrateInfoListFor("video").map(i=>({id:i.qualityIndex,width:i.width,height:i.height,bitrate:i.bitrate,label:a(i.height)}));e.setPluginData("qualities",d),e.setPluginData("qualitySetter",i=>{i===-1?t.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:true}}}}):(t.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:false}}}}),t.setQualityFor("video",i,true)),e.setPluginData("autoQuality",i===-1);});}),t.on(y.MediaPlayer.events.QUALITY_CHANGE_RENDERED,o=>{if(o.mediaType!=="video")return;let i=e.qualities.find(D=>D.id===o.newQuality);if(i){e.setPluginData("currentQuality",i);let D=t.getSettings();e.setPluginData("autoQuality",D?.streaming?.abr?.autoSwitchBitrate?.video??true);}}),t.initialize(r,a$1,r.autoplay);}).catch(h=>{u||e.emit("error",{code:3e3,message:h instanceof Error?`Failed to load dashjs: ${h.message}`:"Failed to load dashjs",source:"dash"});});}return e.registerSourceHandler(p),()=>{u=true,m(),p.unload(e.el);}}}}
2
+ export{k as dash};
@@ -1,4 +1,4 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { M as MediaElement, e as Plugin } from '../types-vxIcXgJz.js';
2
2
 
3
3
  /** Widevine DRM configuration. */
4
4
  interface WidevineConfig {
@@ -45,7 +45,23 @@ declare function hlsDrmConfig(input: BridgeInput): Record<string, unknown>;
45
45
  /** Generate dash.js settings fragment from resolved DRM info. */
46
46
  declare function dashDrmConfig(input: BridgeInput): Record<string, unknown>;
47
47
 
48
+ interface EmeOptions {
49
+ keySystem: KeySystem;
50
+ licenseUrl: string;
51
+ certificateUrl?: string | undefined;
52
+ headers?: Record<string, string> | undefined;
53
+ prepareLicenseRequest?: ((payload: Uint8Array) => Uint8Array | Promise<Uint8Array>) | undefined;
54
+ processLicenseResponse?: ((response: Uint8Array) => Uint8Array | Promise<Uint8Array>) | undefined;
55
+ }
56
+ /**
57
+ * Set up standalone EME (Encrypted Media Extensions) handling on a video element.
58
+ * This enables DRM-protected MP4 playback without hls.js or dash.js.
59
+ *
60
+ * Returns a cleanup function that removes listeners and closes sessions.
61
+ */
62
+ declare function setupEme(videoElement: MediaElement, options: EmeOptions, onError: (err: Error) => void): () => void;
63
+
48
64
  /** Create a DRM plugin for vide. */
49
65
  declare function drm(options: DrmPluginOptions): Plugin;
50
66
 
51
- export { type DrmPluginOptions, type FairPlayConfig, type KeySystem, type ResolvedDrmConfig, type WidevineConfig, dashDrmConfig, detectKeySystem, drm, hlsDrmConfig };
67
+ export { type DrmPluginOptions, type FairPlayConfig, type KeySystem, type ResolvedDrmConfig, type WidevineConfig, dashDrmConfig, detectKeySystem, drm, hlsDrmConfig, setupEme };
@@ -1 +1 @@
1
- function f(e){let r={licenseUrl:e.licenseUrl,serverCertificateUrl:e.certificateUrl};if(e.headers){let n=e.headers;r.licenseXhrSetup=t=>{for(let[i,o]of Object.entries(n))t.setRequestHeader(i,o);};}return {emeEnabled:true,drmSystems:{"com.apple.fps.1_0":r}}}function m(e){let r={serverURL:e.licenseUrl,serverCertificateURL:e.certificateUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.apple.fps.1_0":r}}}}}function p(e){let r={licenseUrl:e.licenseUrl};if(e.headers){let n=e.headers;r.licenseXhrSetup=t=>{for(let[i,o]of Object.entries(n))t.setRequestHeader(i,o);};}return {emeEnabled:true,drmSystems:{"com.widevine.alpha":r}}}function y(e){let r={serverURL:e.licenseUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.widevine.alpha":r}}}}}function s(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?p(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?f(e.fairplay):{}}function a(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?y(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?m(e.fairplay):{}}var l="com.apple.fps.1_0",u=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}],g=[{initDataTypes:["sinf"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}];async function d(e){for(let r of e)try{let n=r===l?g:u;return await navigator.requestMediaKeySystemAccess(r,n),r}catch{}return null}function k(e){return {name:"drm",setup(r){let n=false,t=[];return e.widevine&&t.push("com.widevine.alpha"),e.fairplay&&t.push("com.apple.fps.1_0"),t.length===0?(console.warn("[vide/drm] No DRM configuration provided"),()=>{}):(d(t).then(i=>{if(n)return;if(!i){r.emit("error",{code:0,message:"No supported DRM key system found"});return}let o={keySystem:i,widevine:e.widevine,fairplay:e.fairplay},c={keySystem:i,hlsConfig:s(o),dashConfig:a(o)};r.setPluginData("drm",c);}).catch(i=>{n||r.emit("error",{code:0,message:i instanceof Error?`DRM detection failed: ${i.message}`:"DRM detection failed"});}),()=>{n=true;})}}}export{a as dashDrmConfig,d as detectKeySystem,k as drm,s as hlsDrmConfig};
1
+ import'../chunk-DWXOYV4E.mjs';function l(e){let r={licenseUrl:e.licenseUrl,serverCertificateUrl:e.certificateUrl};if(e.headers){let t=e.headers;r.licenseXhrSetup=n=>{for(let[i,s]of Object.entries(t))n.setRequestHeader(i,s);};}return {emeEnabled:true,drmSystems:{"com.apple.fps.1_0":r}}}function g(e){let r={serverURL:e.licenseUrl,serverCertificateURL:e.certificateUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.apple.fps.1_0":r}}}}}function h(e){let r={licenseUrl:e.licenseUrl};if(e.headers){let t=e.headers;r.licenseXhrSetup=n=>{for(let[i,s]of Object.entries(t))n.setRequestHeader(i,s);};}return {emeEnabled:true,drmSystems:{"com.widevine.alpha":r}}}function v(e){let r={serverURL:e.licenseUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.widevine.alpha":r}}}}}function u(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?h(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?l(e.fairplay):{}}function y(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?v(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?g(e.fairplay):{}}var K="com.apple.fps.1_0",M=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}],P=[{initDataTypes:["sinf"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}];async function m(e){for(let r of e)try{let t=r===K?P:M;return await navigator.requestMediaKeySystemAccess(r,t),r}catch{}return null}var R="com.apple.fps.1_0",U=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}],D=[{initDataTypes:["sinf"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}];function p(e,r,t){let n=false,i=[],s=null,a=o=>{if(n||e.mediaKeys&&e.mediaKeys!==s||!s||!o.initData)return;let f=s.createSession("temporary");i.push(f),f.generateRequest(o.initDataType,o.initData).then(()=>{},c=>{n||t(c instanceof Error?c:new Error("generateRequest failed"));}),f.addEventListener("message",c=>{n||k(c,f,r,t,()=>n);}),f.addEventListener("keystatuseschange",()=>{if(!n)for(let[,c]of f.keyStatuses)(c==="expired"||c==="internal-error")&&t(new Error(`Key status: ${c}`));});},d=r.keySystem===R?D:U;return navigator.requestMediaKeySystemAccess(r.keySystem,d).then(o=>{if(!n)return o.createMediaKeys()}).then(o=>{if(!(n||!o)&&(s=o,r.keySystem===R&&r.certificateUrl))return L(r.certificateUrl,r.headers,t,()=>n).then(f=>{if(!(n||!f))return s?.setServerCertificate(f.buffer)})}).then(()=>{n||!s||(e.mediaKeys||e.setMediaKeys(s),e.addEventListener("encrypted",a));}).catch(o=>{n||t(o instanceof Error?o:new Error("EME setup failed"));}),()=>{n=true,e.removeEventListener("encrypted",a);for(let o of i)o.close().catch(()=>{});}}async function L(e,r,t,n){try{let i=await fetch(e,r?{headers:r}:{});if(!i.ok)throw new Error(`Certificate fetch failed: ${i.status} ${i.statusText}`);let s=await i.arrayBuffer();return n()?null:new Uint8Array(s)}catch(i){return n()||t(i instanceof Error?i:new Error("Certificate fetch failed")),null}}function k(e,r,t,n,i){let s=new Uint8Array(e.message);Promise.resolve(t.prepareLicenseRequest?t.prepareLicenseRequest(s):s).then(a=>{if(!i())return fetch(t.licenseUrl,{method:"POST",body:a.buffer,...t.headers?{headers:t.headers}:{}})}).then(a=>{if(!(i()||!a)){if(!a.ok)throw new Error(`License request failed: ${a.status} ${a.statusText}`);return a.arrayBuffer()}}).then(a=>{if(i()||!a)return;let d=new Uint8Array(a);return Promise.resolve(t.processLicenseResponse?t.processLicenseResponse(d):d)}).then(a=>{if(!(i()||!a))return r.update(a.buffer)}).catch(a=>{i()||n(a instanceof Error?a:new Error("License exchange failed"));});}function B(e){return {name:"drm",setup(r){let t=false,n,i=[];return e.widevine&&i.push("com.widevine.alpha"),e.fairplay&&i.push("com.apple.fps.1_0"),i.length===0?(console.warn("[vide/drm] No DRM configuration provided"),()=>{}):(m(i).then(s=>{if(t)return;if(!s){r.emit("error",{code:4e3,message:"No supported DRM key system found",source:"drm"});return}let a={keySystem:s,widevine:e.widevine,fairplay:e.fairplay},d={keySystem:s,hlsConfig:u(a),dashConfig:y(a)};r.setPluginData("drm",d);let o=s!=="com.widevine.alpha",f=o?e.fairplay:e.widevine;if(!f)return;let c={keySystem:s,licenseUrl:f.licenseUrl,headers:f.headers,prepareLicenseRequest:f.prepareLicenseRequest,processLicenseResponse:f.processLicenseResponse};o&&(c.certificateUrl=f.certificateUrl),n=p(r.el,c,C=>{t||r.emit("error",{code:4002,message:C.message,source:"drm"});});}).catch(s=>{t||r.emit("error",{code:4001,message:s instanceof Error?`DRM detection failed: ${s.message}`:"DRM detection failed",source:"drm"});}),()=>{t=true,n?.();})}}}export{y as dashDrmConfig,m as detectKeySystem,B as drm,u as hlsDrmConfig,p as setupEme};
@@ -1,8 +1,10 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { R as RecoveryConfig, e as Plugin } from '../types-vxIcXgJz.js';
2
2
 
3
3
  interface HlsPluginOptions {
4
4
  /** Configuration passed directly to the hls.js constructor. */
5
5
  hlsConfig?: Record<string, unknown> | undefined;
6
+ /** Error recovery settings. `false` to disable. Defaults to enabled (3 retries, 3s delay, 2x backoff). */
7
+ recovery?: Partial<RecoveryConfig> | false | undefined;
6
8
  }
7
9
 
8
10
  /** Create an HLS streaming plugin for vide. */
@@ -1,2 +1,2 @@
1
- var c=["application/vnd.apple.mpegurl","application/x-mpegurl"];function m(e){if(e.startsWith("data:")){let t=e.indexOf(";");return t===-1?false:c.includes(e.slice(5,t).toLowerCase())}if(e.startsWith("blob:"))return e.includes(".m3u8");try{return new URL(e,"https://placeholder.invalid").pathname.endsWith(".m3u8")}catch{return e.includes(".m3u8")}}function h(e){return c.includes(e.toLowerCase())}function L(e={}){return {name:"hls",setup(t){let r=null,a=false,u={canHandle(s,n){return n&&h(n)?true:m(s)},load(s,n){this.unload(n),p(s,n);},unload(s){r&&(r.destroy(),r=null);}};function p(s,n){import('hls.js').then(o=>{if(a)return;let l=o.default;if(!l.isSupported()){if(n.canPlayType("application/vnd.apple.mpegurl")){n.src=s;return}t.emit("error",{code:0,message:"HLS is not supported in this browser"});return}let f=t.getPluginData("drm"),g={...e.hlsConfig??{},...f?.hlsConfig??{}},i=new l(g);r=i,t.setPluginData("hls",i),i.on(l.Events.ERROR,(H,d)=>{d.fatal&&t.emit("error",{code:1,message:`HLS fatal error: ${d.type} - ${d.details}`});}),i.attachMedia(n),i.loadSource(s);}).catch(o=>{a||t.emit("error",{code:0,message:o instanceof Error?`Failed to load hls.js: ${o.message}`:"Failed to load hls.js"});});}return t.registerSourceHandler(u),()=>{a=true,u.unload(t.el);}}}}
2
- export{L as hls};
1
+ import {a}from'../chunk-H3OXPFD3.mjs';import'../chunk-DWXOYV4E.mjs';var E=["application/vnd.apple.mpegurl","application/x-mpegurl"],T={maxRetries:3,retryDelay:3e3,backoffMultiplier:2};function _(r){if(r.startsWith("data:")){let e=r.indexOf(";");return e===-1?false:E.includes(r.slice(5,e).toLowerCase())}if(r.startsWith("blob:"))return r.includes(".m3u8");try{return new URL(r,"https://placeholder.invalid").pathname.endsWith(".m3u8")}catch{return r.includes(".m3u8")}}function C(r){return E.includes(r.toLowerCase())}function w(r={}){return {name:"hls",setup(e){let d=null,u=false,f=r.recovery===false?false:{...T,...r.recovery??{}},o=0,m=null;function g(){m!==null&&(clearTimeout(m),m=null);}function L(s,i){if(f===false||u||o>=f.maxRetries)return false;o++;let l=f.retryDelay*f.backoffMultiplier**(o-1);return g(),m=setTimeout(()=>{u||(i==="networkError"?s.startLoad(-1):s.recoverMediaError());},l),true}let v={canHandle(s,i){return i&&C(i)?true:_(s)},load(s,i){this.unload(i),b(s,i);},unload(s){g(),o=0,d&&(d.destroy(),d=null);}};function b(s,i){import('hls.js').then(l=>{if(u)return;let a$1=l.default;if(!a$1.isSupported()){if(i.canPlayType("application/vnd.apple.mpegurl")){i.src=s;return}e.emit("error",{code:2e3,message:"HLS is not supported in this browser",source:"hls"});return}let H=e.getPluginData("drm"),R={...r.hlsConfig??{},...H?.hlsConfig??{}},n=new a$1(R);d=n,e.setPluginData("hls",n),n.on(a$1.Events.ERROR,(h,t)=>{if(!t.fatal)return;let c=L(n,t.type);e.emit("error",{code:2002,message:`HLS fatal error: ${t.type} - ${t.details}`,source:"hls",recoverable:c,retryCount:c?o:void 0});}),n.on(a$1.Events.FRAG_LOADED,()=>{o>0&&(o=0,g());}),n.on(a$1.Events.MANIFEST_PARSED,()=>{let h=n.levels.map((t,c)=>({id:c,width:t.width,height:t.height,bitrate:t.bitrate,label:a(t.height)}));e.setPluginData("qualities",h),e.setPluginData("qualitySetter",t=>{n.currentLevel=t,e.setPluginData("autoQuality",t===-1);});}),n.on(a$1.Events.LEVEL_SWITCHED,(h,t)=>{let p=e.qualities[t.level];p&&(e.setPluginData("currentQuality",p),e.setPluginData("autoQuality",n.autoLevelEnabled));}),n.attachMedia(i),n.loadSource(s);}).catch(l=>{u||e.emit("error",{code:2001,message:l instanceof Error?`Failed to load hls.js: ${l.message}`:"Failed to load hls.js",source:"hls"});});}return e.registerSourceHandler(v),()=>{u=true,g(),v.unload(e.el);}}}}
2
+ export{w as hls};
package/dist/index.d.ts CHANGED
@@ -1,6 +1,28 @@
1
- import { P as Player } from './types-BxRa9Jvl.js';
2
- export { A as AdQuartile, E as EventBus, a as EventHandler, b as PlayerEvent, c as PlayerEventMap, d as PlayerState, e as Plugin, S as SourceHandler } from './types-BxRa9Jvl.js';
1
+ import { M as MediaElement, P as Player } from './types-vxIcXgJz.js';
2
+ export { A as AdQuartile, E as EventBus, a as EventHandler, b as PlayerEvent, c as PlayerEventMap, d as PlayerState, e as Plugin, Q as QualityLevel, R as RecoveryConfig, S as SeekableRange, f as SourceHandler, V as VideCue, g as VideTextTrack } from './types-vxIcXgJz.js';
3
3
 
4
- declare function createPlayer(el: HTMLVideoElement): Player;
4
+ /** Create a vide player instance wrapping the given media element. */
5
+ declare function createPlayer(el: MediaElement): Player;
5
6
 
6
- export { Player, createPlayer };
7
+ /** Core: HTMLMediaElement error. */
8
+ declare const ERR_MEDIA = 1000;
9
+ /** HLS: browser does not support MSE or hls.js. */
10
+ declare const ERR_HLS_UNSUPPORTED = 2000;
11
+ /** HLS: dynamic import of hls.js failed. */
12
+ declare const ERR_HLS_IMPORT = 2001;
13
+ /** HLS: fatal hls.js playback error. */
14
+ declare const ERR_HLS_FATAL = 2002;
15
+ /** DASH: dynamic import of dashjs failed. */
16
+ declare const ERR_DASH_IMPORT = 3000;
17
+ /** DASH: dashjs playback error. */
18
+ declare const ERR_DASH_PLAYBACK = 3001;
19
+ /** DRM: no supported key system found. */
20
+ declare const ERR_DRM_UNSUPPORTED = 4000;
21
+ /** DRM: key system detection failed. */
22
+ declare const ERR_DRM_DETECTION = 4001;
23
+ /** DRM: license request failed. */
24
+ declare const ERR_DRM_LICENSE = 4002;
25
+ /** DRM: certificate request failed. */
26
+ declare const ERR_DRM_CERTIFICATE = 4003;
27
+
28
+ export { ERR_DASH_IMPORT, ERR_DASH_PLAYBACK, ERR_DRM_CERTIFICATE, ERR_DRM_DETECTION, ERR_DRM_LICENSE, ERR_DRM_UNSUPPORTED, ERR_HLS_FATAL, ERR_HLS_IMPORT, ERR_HLS_UNSUPPORTED, ERR_MEDIA, MediaElement, Player, createPlayer };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var C={idle:["loading","error"],loading:["ready","error"],ready:["playing","loading","ad:loading","error"],playing:["paused","buffering","loading","ad:loading","ended","error"],paused:["playing","loading","ad:loading","ended","error"],buffering:["playing","loading","error"],"ad:loading":["ad:playing","playing","error"],"ad:playing":["ad:paused","playing","error"],"ad:paused":["ad:playing","playing","error"],ended:["idle","loading","error"],error:["idle","loading"]};function D(e,r){return C[e].includes(r)}function K(e){return e.readyState>=3?e.paused?"ready":"playing":e.readyState>=1?"loading":"idle"}function U(e){let r=K(e),g=new Map,v=[],p=false,f=[],i=null,y=e.getAttribute("src")??"",m=false,E=new Map;function b(t){let n=g.get(t);return n||(n=new Set,g.set(t,n)),n}function d(t,n){let a=g.get(t);if(a)for(let l of a)try{l(n);}catch(c){console.error("[vide] Event handler error:",c);}}function o(t){if(t===r)return;if(!D(r,t)){console.warn(`[vide] Invalid transition: ${r} \u2192 ${t}`);return}let n=r;r=t,d("statechange",{from:n,to:t});}function s(){return r==="ad:loading"||r==="ad:playing"||r==="ad:paused"}function S(){s()||o("loading");}function L(){r==="loading"&&o("ready");}function P(){s()||o("playing"),d("play",void 0);}function k(){s()||o("paused"),d("pause",void 0);}function w(){r==="playing"&&o("buffering");}function H(){r==="buffering"&&o("playing");}function h(){s()||o("ended"),d("ended",void 0);}function M(){d("timeupdate",{currentTime:e.currentTime,duration:e.duration});}function T(){let t=e.error;s()||o("error"),d("error",{code:t?.code??0,message:t?.message??"Unknown error"});}e.addEventListener("loadstart",S),e.addEventListener("canplay",L),e.addEventListener("play",P),e.addEventListener("pause",k),e.addEventListener("waiting",w),e.addEventListener("playing",H),e.addEventListener("ended",h),e.addEventListener("timeupdate",M),e.addEventListener("error",T);let O=new Set(["statechange","play","pause","ended","timeupdate","error","ad:start","ad:end","ad:skip","ad:click","ad:error","ad:impression","ad:loaded","ad:quartile","ad:mute","ad:unmute","ad:volumeChange","ad:fullscreen","ad:breakStart","ad:breakEnd","destroy"]);function R(){e.removeEventListener("loadstart",S),e.removeEventListener("canplay",L),e.removeEventListener("play",P),e.removeEventListener("pause",k),e.removeEventListener("waiting",w),e.removeEventListener("playing",H),e.removeEventListener("ended",h),e.removeEventListener("timeupdate",M),e.removeEventListener("error",T);}function A(){if(i||m)return;let t=e.querySelectorAll("source");for(let n of t){let a=n.getAttribute("src"),l=n.getAttribute("type")??void 0;if(a){for(let c of f)if(c.canHandle(a,l)){i=c,y=a,o("loading"),c.load(a,e);for(let j of t)j.remove();return}}}}let u={get el(){return e},get state(){return r},on(t,n){O.has(t)?b(t).add(n):e.addEventListener(t,n);},off(t,n){O.has(t)?b(t).delete(n):e.removeEventListener(t,n);},emit:d,once(t,n){let a=l=>{u.off(t,a),n(l);};u.on(t,a);},play(){return e.play()},pause(){e.pause();},get currentTime(){return e.currentTime},set currentTime(t){e.currentTime=t;},get duration(){return e.duration},set duration(t){},get volume(){return e.volume},set volume(t){e.volume=t;},get muted(){return e.muted},set muted(t){e.muted=t;},get playbackRate(){return e.playbackRate},set playbackRate(t){e.playbackRate=t;},get paused(){return e.paused},get ended(){return e.ended},get readyState(){return e.readyState},get buffered(){return e.buffered},get seekable(){return e.seekable},get seeking(){return e.seeking},get videoWidth(){return e.videoWidth},get videoHeight(){return e.videoHeight},get networkState(){return e.networkState},get loop(){return e.loop},set loop(t){e.loop=t;},get autoplay(){return e.autoplay},set autoplay(t){e.autoplay=t;},get poster(){return e.poster},set poster(t){e.poster=t;},get preload(){return e.preload},set preload(t){e.preload=t;},get defaultPlaybackRate(){return e.defaultPlaybackRate},set defaultPlaybackRate(t){e.defaultPlaybackRate=t;},get defaultMuted(){return e.defaultMuted},set defaultMuted(t){e.defaultMuted=t;},get crossOrigin(){return e.crossOrigin},set crossOrigin(t){e.crossOrigin=t;},get controls(){return e.controls},set controls(t){e.controls=t;},get src(){return y},set src(t){if(i&&(i.unload(e),i=null),m=true,y=t,!t){e.removeAttribute("src");return}for(let n of f)if(n.canHandle(t)){i=n,o("loading"),n.load(t,e);return}e.src=t;},registerSourceHandler(t){if(p){console.warn("[vide] Cannot register source handler after destroy");return}f.push(t),!m&&!i&&A();},addEventListener(t,n,a){e.addEventListener(t,n,a);},removeEventListener(t,n,a){e.removeEventListener(t,n,a);},use(t){if(p){console.warn("[vide] Cannot use plugin after destroy");return}let n=t.setup(u);n&&v.push(n);},setPluginData(t,n){E.set(t,n);},getPluginData(t){return E.get(t)},destroy(){if(!p){p=true,i&&(i.unload(e),i=null);for(let t of v)try{t();}catch(n){console.error("[vide] Plugin cleanup error:",n);}v.length=0,d("destroy",void 0),R(),g.clear(),E.clear();}}};return u._setState=o,u}export{U as createPlayer};
1
+ export{e as ERR_DASH_IMPORT,f as ERR_DASH_PLAYBACK,j as ERR_DRM_CERTIFICATE,h as ERR_DRM_DETECTION,i as ERR_DRM_LICENSE,g as ERR_DRM_UNSUPPORTED,d as ERR_HLS_FATAL,c as ERR_HLS_IMPORT,b as ERR_HLS_UNSUPPORTED,a as ERR_MEDIA}from'./chunk-DWXOYV4E.mjs';var ne={idle:["loading","playing","error"],loading:["ready","playing","error"],ready:["playing","loading","ad:loading","error"],playing:["paused","buffering","loading","ad:loading","ended","error"],paused:["playing","loading","ad:loading","ended","error"],buffering:["playing","loading","error"],"ad:loading":["ad:playing","playing","error"],"ad:playing":["ad:paused","playing","error"],"ad:paused":["ad:playing","playing","error"],ended:["idle","loading","error"],error:["idle","loading"]};function re(t,a){return ne[t].includes(a)}function ae(t){return t.readyState>=3?t.paused?"ready":"playing":t.readyState>=1?"loading":"idle"}function ie(t){let a=ae(t),g=t instanceof HTMLAudioElement,p=new Map,E=[],l=false,k=[],d=null,m=t.getAttribute("src")??"",L=false,o=new Map,h=t.duration===Number.POSITIVE_INFINITY,b=null;function x(e){let n=p.get(e);return n||(n=new Set,p.set(e,n)),n}function i(e,n){let r=p.get(e);if(r)for(let u of r)try{u(n);}catch(y){console.error("[vide] Event handler error:",y);}}function s(e){if(e===a)return;if(!re(a,e)){console.warn(`[vide] Invalid transition: ${a} \u2192 ${e}`);return}let n=a;a=e,i("statechange",{from:n,to:e});}function v(){return a==="ad:loading"||a==="ad:playing"||a==="ad:paused"}function S(){!v()&&t.paused&&s("loading");}function R(){a==="loading"&&s("ready");}function P(){v()||s("playing"),i("play",void 0);}function H(){v()||s("paused"),i("pause",void 0);}function w(){a==="playing"&&s("buffering");}function C(){(a==="buffering"||a==="ready")&&s("playing");}function I(){v()||s("ended"),i("ended",void 0);}function M(){i("timeupdate",{currentTime:t.currentTime,duration:t.duration});}function _(){let e=t.error;v()||s("error"),i("error",{code:e?.code??1e3,message:e?.message??"Unknown error",source:"core"});}function A(){let e=t.duration===Number.POSITIVE_INFINITY;e!==h&&(h=e,i("livestatechange",{isLive:e}));}t.addEventListener("durationchange",A),t.addEventListener("loadstart",S),t.addEventListener("canplay",R),t.addEventListener("play",P),t.addEventListener("pause",H),t.addEventListener("waiting",w),t.addEventListener("playing",C),t.addEventListener("ended",I),t.addEventListener("timeupdate",M),t.addEventListener("error",_);function T(e,n){return {id:n,label:e.label,language:e.language,kind:e.kind,active:e.mode==="showing"}}function V(e){if(!e)return [];let n=[];for(let r=0;r<e.length;r++){let u=e[r];n.push({startTime:u.startTime,endTime:u.endTime,text:u.text??""});}return n}let c=new Map;function Q(e){if(c.has(e))return;let n=()=>{e.mode==="showing"&&i("cuechange",{cues:V(e.activeCues)});};c.set(e,n),e.addEventListener("cuechange",n);}function j(e){let n=c.get(e);n&&(e.removeEventListener("cuechange",n),c.delete(e));}function O(){let e=[];for(let n=0;n<t.textTracks.length;n++)e.push(T(t.textTracks[n],n));i("texttracksavailable",{tracks:e});}function D(){for(let e=0;e<t.textTracks.length;e++)Q(t.textTracks[e]);O();}function q(e){e.track&&j(e.track),O();}let N=typeof t.textTracks.addEventListener=="function";if(N){t.textTracks.addEventListener("addtrack",D),t.textTracks.addEventListener("removetrack",q);for(let e=0;e<t.textTracks.length;e++)Q(t.textTracks[e]);}let U=new Set(["statechange","play","pause","ended","timeupdate","livestatechange","error","ad:start","ad:end","ad:skip","ad:click","ad:error","ad:impression","ad:loaded","ad:quartile","ad:mute","ad:unmute","ad:volumeChange","ad:fullscreen","ad:breakStart","ad:breakEnd","qualitiesavailable","qualitychange","texttrackchange","texttracksavailable","cuechange","destroy"]);function K(){if(t.removeEventListener("durationchange",A),t.removeEventListener("loadstart",S),t.removeEventListener("canplay",R),t.removeEventListener("play",P),t.removeEventListener("pause",H),t.removeEventListener("waiting",w),t.removeEventListener("playing",C),t.removeEventListener("ended",I),t.removeEventListener("timeupdate",M),t.removeEventListener("error",_),N){t.textTracks.removeEventListener("addtrack",D),t.textTracks.removeEventListener("removetrack",q);for(let[e,n]of c)e.removeEventListener("cuechange",n);c.clear();}}function Y(){if(d||L)return;let e=t.querySelectorAll("source");for(let n of e){let r=n.getAttribute("src"),u=n.getAttribute("type")??void 0;if(r){for(let y of k)if(y.canHandle(r,u)){d=y,m=r,s("loading"),y.load(r,t);for(let W of e)W.remove();return}}}}let f={get el(){return t},get state(){return a},on(e,n){U.has(e)?x(e).add(n):t.addEventListener(e,n);},off(e,n){U.has(e)?x(e).delete(n):t.removeEventListener(e,n);},emit:i,once(e,n){let r=u=>{f.off(e,r),n(u);};f.on(e,r);},play(){return t.play()},pause(){t.pause();},get currentTime(){return t.currentTime},set currentTime(e){t.currentTime=e;},get duration(){return t.duration},set duration(e){},get volume(){return t.volume},set volume(e){t.volume=e;},get muted(){return t.muted},set muted(e){t.muted=e;},get playbackRate(){return t.playbackRate},set playbackRate(e){t.playbackRate=e;},get paused(){return t.paused},get ended(){return t.ended},get readyState(){return t.readyState},get buffered(){return t.buffered},get seekable(){return t.seekable},get seeking(){return t.seeking},get isLive(){return l?false:t.duration===Number.POSITIVE_INFINITY},get seekableRange(){return l||t.seekable.length===0?null:{start:t.seekable.start(0),end:t.seekable.end(0)}},get qualities(){return o.get("qualities")??[]},get currentQuality(){return o.get("currentQuality")??null},get isAutoQuality(){return o.get("autoQuality")??true},get isAudio(){return g},setQuality(e){let n=o.get("qualitySetter");n&&n(e);},get textTracks(){return t.textTracks},getTextTracks(){let e=[];for(let n=0;n<t.textTracks.length;n++)e.push(T(t.textTracks[n],n));return e},getActiveTextTrack(){for(let e=0;e<t.textTracks.length;e++)if(t.textTracks[e].mode==="showing")return T(t.textTracks[e],e);return null},get activeCues(){for(let e=0;e<t.textTracks.length;e++)if(t.textTracks[e].mode==="showing")return V(t.textTracks[e].activeCues);return []},setTextTrack(e){for(let r=0;r<t.textTracks.length;r++)t.textTracks[r].mode=r===e?"showing":"disabled";let n=e>=0&&e<t.textTracks.length?T(t.textTracks[e],e):null;i("texttrackchange",{track:n});},addTextTrack(e){let n=document.createElement("track");n.src=e.src,n.label=e.label,n.srclang=e.language,n.kind=e.kind??"subtitles",e.default&&(n.default=true),t.appendChild(n);},get videoWidth(){return g?0:t.videoWidth},get videoHeight(){return g?0:t.videoHeight},get networkState(){return t.networkState},get loop(){return t.loop},set loop(e){t.loop=e;},get autoplay(){return t.autoplay},set autoplay(e){t.autoplay=e;},get poster(){return g?"":t.poster},set poster(e){g||(t.poster=e);},get preload(){return t.preload},set preload(e){t.preload=e;},get defaultPlaybackRate(){return t.defaultPlaybackRate},set defaultPlaybackRate(e){t.defaultPlaybackRate=e;},get defaultMuted(){return t.defaultMuted},set defaultMuted(e){t.defaultMuted=e;},get crossOrigin(){return t.crossOrigin},set crossOrigin(e){t.crossOrigin=e;},get controls(){return t.controls},set controls(e){t.controls=e;},get src(){return m},set src(e){if(d&&(d.unload(t),d=null),o.delete("qualities"),o.delete("currentQuality"),o.delete("autoQuality"),o.delete("qualitySetter"),b=null,L=true,m=e,!e){t.removeAttribute("src");return}for(let n of k)if(n.canHandle(e)){d=n,s("loading"),n.load(e,t);return}t.src=e;},registerSourceHandler(e){if(l){console.warn("[vide] Cannot register source handler after destroy");return}k.push(e),!L&&!d&&Y();},addEventListener(e,n,r){t.addEventListener(e,n,r);},removeEventListener(e,n,r){t.removeEventListener(e,n,r);},use(e){if(l){console.warn("[vide] Cannot use plugin after destroy");return}let n=e.setup(f);n&&E.push(n);},setPluginData(e,n){if(o.set(e,n),e==="qualities")i("qualitiesavailable",{qualities:n});else if(e==="currentQuality"){let r=n;i("qualitychange",{from:b,to:r}),b=r;}},getPluginData(e){return o.get(e)},destroy(){if(!l){l=true,d&&(d.unload(t),d=null);for(let e of E)try{e();}catch(n){console.error("[vide] Plugin cleanup error:",n);}E.length=0,i("destroy",void 0),K(),p.clear(),o.clear();}}};return f._setState=s,f}export{ie as createPlayer};
@@ -1,5 +1,5 @@
1
- import { b as AdPlugin } from '../types-BryM58LE.js';
2
- import '../types-BxRa9Jvl.js';
1
+ import { b as AdPlugin } from '../types-CAJmacV6.js';
2
+ import '../types-vxIcXgJz.js';
3
3
 
4
4
  interface OmidPluginOptions {
5
5
  /** Partner identification for the OM SDK. */
@@ -1,2 +1,2 @@
1
- function E(e,t,r){let i=true;t.adEvents.loaded(t.vastProperties),t.adEvents.impressionOccurred(),t.mediaEvents.start(r,e.el.muted?0:e.el.volume);function o(n){i&&(n.quartile==="firstQuartile"?t.mediaEvents.firstQuartile():n.quartile==="midpoint"?t.mediaEvents.midpoint():n.quartile==="thirdQuartile"&&t.mediaEvents.thirdQuartile());}function s(n){i&&(n.to==="ad:paused"?t.mediaEvents.pause():n.to==="ad:playing"&&n.from==="ad:paused"&&t.mediaEvents.resume());}function d(){i&&(i=false,t.mediaEvents.complete(),t.finish());}function a(){i&&(i=false,t.mediaEvents.skipped(),t.finish());}function u(){i&&(i=false,t.error("Ad playback error"),t.finish());}function c(){i&&(i=false,t.finish());}function l(n){i&&t.mediaEvents.volumeChange(n.volume);}function p(n){if(!i)return;let v=n.fullscreen?"fullscreen":"normal";t.mediaEvents.playerStateChange(v);}return e.on("ad:quartile",o),e.on("statechange",s),e.on("ad:end",d),e.on("ad:skip",a),e.on("ad:error",u),e.on("destroy",c),e.on("ad:volumeChange",l),e.on("ad:fullscreen",p),()=>{i=false,e.off("ad:quartile",o),e.off("statechange",s),e.off("ad:end",d),e.off("ad:skip",a),e.off("ad:error",u),e.off("destroy",c),e.off("ad:volumeChange",l),e.off("ad:fullscreen",p);}}function w(e,t){return new Promise((r,i)=>{let o=document.createElement("script");o.src=e,o.async=true;let s=setTimeout(()=>{o.remove(),i(new Error(`OM SDK script load timeout: ${e}`));},t);o.onload=()=>{clearTimeout(s),r();},o.onerror=()=>{clearTimeout(s),o.remove(),i(new Error(`OM SDK script load failed: ${e}`));},document.head.appendChild(o);})}function b(){let t=globalThis.OmidSessionClient;if(!t)return null;let r=t.default??t;return typeof r.AdSession!="function"?null:r}async function h(e,t,r){let i=Date.now();if(await w(e,r),t){let s=Date.now()-i,d=Math.max(r-s,1e3);await w(t,d);}let o=b();if(!o)throw new Error("OM SDK namespace not found after script load");return o}function P(e,t,r){let i=new e.Partner(r.partner.name,r.partner.version),o=r.verifications.filter(m=>m.resourceUrl).map(m=>new e.VerificationScriptResource(m.resourceUrl,m.vendor,m.parameters,"full")),s=new e.Context(i,o,r.contentUrl,r.customReferenceData);s.setVideoElement(t);let d=t.parentElement;d&&s.setSlotElement(d),s.setServiceWindow(window);let a=new e.AdSession(s);if(a.setCreativeType("video"),a.setImpressionType("beginToRender"),!a.isSupported())throw new Error("OM SDK session not supported in this environment");let u=false,c=false,l=null;a.registerSessionObserver(m=>{m.type==="sessionStart"&&(u=true,l&&(l(true),l=null));}),a.start();let p=new e.AdEvents(a),n=new e.MediaEvents(a),v=r.position??"standalone",f=r.skipOffset!==void 0,O=r.skipOffset??-1,S=r.isAutoPlay??true,y=new e.VastProperties(f,O,S,v);return {get adEvents(){return p},get mediaEvents(){return n},get vastProperties(){return y},get started(){return u},waitForStart(m){return u?Promise.resolve(true):new Promise(g=>{l=g,setTimeout(()=>{u||(l=null,g(false));},m);})},finish(){c||(c=true,a.finish());},error(m){a.error("video",m);}}}var A="https://pagead2.googlesyndication.com/omsdk/releases/live/omweb-v1.js";function D(e){return {name:"omid",setup(t,r){let i=r.verifications??[];if(i.length===0)return;let o=false,s=null,d=null,a=e.timeout??5e3,u=e.serviceScriptUrl??A,c={...e,serviceScriptUrl:u,verifications:i,skipOffset:r.creatives[0]?.linear?.skipOffset},l=h(u,e.sessionClientUrl,a).catch(n=>n);async function p(){if(!o)try{let n=await l;if(o)return;if(n instanceof Error)throw n;let f=P(n,t.el,c);if(d=f,o){f.finish();return}let O=await f.waitForStart(a);if(o){f.finish();return}if(!O){console.warn("[vide:omid] Session start timed out"),f.finish();return}let S=Number.isFinite(t.el.duration)?t.el.duration:0;s=E(t,f,S);}catch(n){if(o)return;console.warn("[vide:omid] Failed to initialize:",n instanceof Error?n.message:String(n)),t.emit("ad:error",{error:n instanceof Error?n:new Error(String(n))});}}return p(),()=>{o=true,s&&(s(),s=null),d&&(d.finish(),d=null);}}}}
2
- export{D as omid};
1
+ function E(e,t,r){let n=true;t.adEvents.loaded(t.vastProperties),t.adEvents.impressionOccurred(),t.mediaEvents.start(r,e.el.muted?0:e.el.volume);function o(i){n&&(i.quartile==="firstQuartile"?t.mediaEvents.firstQuartile():i.quartile==="midpoint"?t.mediaEvents.midpoint():i.quartile==="thirdQuartile"&&t.mediaEvents.thirdQuartile());}function s(i){n&&(i.to==="ad:paused"?t.mediaEvents.pause():i.to==="ad:playing"&&i.from==="ad:paused"&&t.mediaEvents.resume());}function d(){n&&(n=false,t.mediaEvents.complete(),t.finish());}function a(){n&&(n=false,t.mediaEvents.skipped(),t.finish());}function u(){n&&(n=false,t.error("Ad playback error"),t.finish());}function c(){n&&(n=false,t.finish());}function l(i){n&&t.mediaEvents.volumeChange(i.volume);}function p(i){if(!n)return;let v=i.fullscreen?"fullscreen":"normal";t.mediaEvents.playerStateChange(v);}return e.on("ad:quartile",o),e.on("statechange",s),e.on("ad:end",d),e.on("ad:skip",a),e.on("ad:error",u),e.on("destroy",c),e.on("ad:volumeChange",l),e.on("ad:fullscreen",p),()=>{n=false,e.off("ad:quartile",o),e.off("statechange",s),e.off("ad:end",d),e.off("ad:skip",a),e.off("ad:error",u),e.off("destroy",c),e.off("ad:volumeChange",l),e.off("ad:fullscreen",p);}}function w(e,t){return new Promise((r,n)=>{let o=document.createElement("script");o.src=e,o.async=true;let s=setTimeout(()=>{o.remove(),n(new Error(`OM SDK script load timeout: ${e}`));},t);o.onload=()=>{clearTimeout(s),r();},o.onerror=()=>{clearTimeout(s),o.remove(),n(new Error(`OM SDK script load failed: ${e}`));},document.head.appendChild(o);})}function b(){let t=globalThis.OmidSessionClient;if(!t)return null;let r=t.default??t;return typeof r.AdSession!="function"?null:r}async function h(e,t,r){let n=Date.now();if(await w(e,r),t){let s=Date.now()-n,d=Math.max(r-s,1e3);await w(t,d);}let o=b();if(!o)throw new Error("OM SDK namespace not found after script load");return o}function P(e,t,r){let n=new e.Partner(r.partner.name,r.partner.version),o=r.verifications.filter(m=>m.resourceUrl).map(m=>new e.VerificationScriptResource(m.resourceUrl,m.vendor,m.parameters,"full")),s=new e.Context(n,o,r.contentUrl,r.customReferenceData);s.setVideoElement(t);let d=t.parentElement;d&&s.setSlotElement(d),s.setServiceWindow(window);let a=new e.AdSession(s);if(a.setCreativeType("video"),a.setImpressionType("beginToRender"),!a.isSupported())throw new Error("OM SDK session not supported in this environment");let u=false,c=false,l=null;a.registerSessionObserver(m=>{m.type==="sessionStart"&&(u=true,l&&(l(true),l=null));}),a.start();let p=new e.AdEvents(a),i=new e.MediaEvents(a),v=r.position??"standalone",f=r.skipOffset!==void 0,O=r.skipOffset??-1,S=r.isAutoPlay??true,y=new e.VastProperties(f,O,S,v);return {get adEvents(){return p},get mediaEvents(){return i},get vastProperties(){return y},get started(){return u},waitForStart(m){return u?Promise.resolve(true):new Promise(g=>{l=g,setTimeout(()=>{u||(l=null,g(false));},m);})},finish(){c||(c=true,a.finish());},error(m){a.error("video",m);}}}var A="https://pagead2.googlesyndication.com/omsdk/releases/live/omweb-v1.js";function j(e){return {name:"omid",setup(t,r){let n=r.verifications??[];if(n.length===0)return;let o=false,s=null,d=null,a=e.timeout??5e3,u=e.serviceScriptUrl??A,c={...e,serviceScriptUrl:u,verifications:n,skipOffset:r.creatives[0]?.linear?.skipOffset},l=h(u,e.sessionClientUrl,a).catch(i=>i);async function p(){if(!o)try{let i=await l;if(o)return;if(i instanceof Error)throw i;let f=P(i,t.el,c);if(d=f,o){f.finish();return}let O=await f.waitForStart(a);if(o){f.finish();return}if(!O){console.warn("[vide:omid] Session start timed out"),f.finish();return}let S=Number.isFinite(t.el.duration)?t.el.duration:0;s=E(t,f,S);}catch(i){if(o)return;console.warn("[vide:omid] Failed to initialize:",i instanceof Error?i.message:String(i)),t.emit("ad:error",{error:i instanceof Error?i:new Error(String(i)),source:"omid"});}}return p(),()=>{o=true,s&&(s(),s=null),d&&(d.finish(),d=null);}}}}
2
+ export{j as omid};
@@ -1,5 +1,5 @@
1
- import { b as AdPlugin } from '../types-BryM58LE.js';
2
- import '../types-BxRa9Jvl.js';
1
+ import { b as AdPlugin } from '../types-CAJmacV6.js';
2
+ import '../types-vxIcXgJz.js';
3
3
 
4
4
  interface SimidPluginOptions {
5
5
  /** Container element to mount the SIMID iframe into. */
@@ -1 +1 @@
1
- function k(t,r){let i=document.createElement("iframe");i.sandbox.add("allow-scripts","allow-same-origin"),i.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;border:none;display:none;pointer-events:auto;",i.src=t;let a=new MessageChannel,o=a.port1,l=()=>{i.contentWindow?.postMessage("simid:connect","*",[a.port2]);};i.addEventListener("load",l,{once:true}),r.appendChild(i);let m=false;return {iframe:i,port:o,show(){m||(i.style.display="");},destroy(){m||(m=true,i.removeEventListener("load",l),i.remove(),o.close());}}}function h(t,r,i,a){return {sessionId:t,messageId:r,timestamp:Date.now(),type:i,args:a}}function j(t,r,i,a){let o={messageId:i};return a!==void 0&&(o.value=a),h(t,r,"resolve",o)}function T(t,r,i,a,o){let l={errorCode:a};return o!==void 0&&(l.message=o),h(t,r,"reject",{messageId:i,value:l})}function b(t){if(typeof t!="object"||t===null)return null;let r=t;return typeof r.sessionId!="string"||typeof r.messageId!="number"||typeof r.timestamp!="number"||typeof r.type!="string"?null:{sessionId:r.sessionId,messageId:r.messageId,timestamp:r.timestamp,type:r.type,args:r.args}}function x(t){return t.type==="createSession"}function C(t){return t.type==="resolve"}function y(t){return t.type==="reject"}function L(t,r,i,a){let o=false,l="",m=0,f=[],d=new Map;function w(){return m++}function S(e,n){let s=w(),u=h(l,s,e,n);return r.postMessage(u),s}function g(e,n){let s=w();r.postMessage(j(l,s,e,n));}function M(e,n,s){let u=w();r.postMessage(T(l,u,e,n,s));}function P(e,n,s){return new Promise((u,c)=>{let v=S(e,n),I=setTimeout(()=>{d.delete(v),c(new Error(`SIMID timeout waiting for response to ${e}`));},i.handshakeTimeout);d.set(v,{resolve:p=>{clearTimeout(I),d.delete(v),u(p);},reject:p=>{clearTimeout(I),d.delete(v),c(p);}});})}function q(){let e=t.el.getBoundingClientRect();return {x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}function A(){let e=q();return {videoDimensions:e,creativeDimensions:e,fullscreen:!!document.fullscreenElement,fullscreenAllowed:!!document.fullscreenEnabled,variableDurationAllowed:false,skippableState:"playerHandles",version:"1.2",muted:t.muted,volume:t.volume,navigationSupport:i.policy.navigation==="new-tab"?"playerHandles":"notSupported"}}function N(){return {adParameters:"",clickThruUrl:a.creatives[0]?.linear?.clickThrough}}function O(){return {currentTime:t.el.currentTime,duration:t.el.duration,ended:t.el.ended,muted:t.muted,paused:t.el.paused,volume:t.volume,fullscreen:!!document.fullscreenElement}}function H(){let e=t.el,n=["play","pause","playing","ended","seeking","seeked","stalled"];for(let I of n){let p=()=>{o||S(`SIMID:Media:${I}`);};e.addEventListener(I,p),f.push(()=>e.removeEventListener(I,p));}let s=()=>{o||S("SIMID:Media:timeupdate",{currentTime:e.currentTime});};e.addEventListener("timeupdate",s),f.push(()=>e.removeEventListener("timeupdate",s));let u=()=>{o||S("SIMID:Media:durationchange",{duration:e.duration});};e.addEventListener("durationchange",u),f.push(()=>e.removeEventListener("durationchange",u));let c=()=>{o||S("SIMID:Media:volumechange",{volume:e.volume,muted:e.muted});};e.addEventListener("volumechange",c),f.push(()=>e.removeEventListener("volumechange",c));let v=()=>{o||S("SIMID:Media:error",{error:e.error?.code??0,message:e.error?.message??""});};e.addEventListener("error",v),f.push(()=>e.removeEventListener("error",v));}function V(e){if(o)return;if(C(e)||y(e)){let u=e.args?.messageId;if(u!==void 0){let c=d.get(u);c&&(C(e)?c.resolve(e):c.reject(new Error(`SIMID creative rejected: ${JSON.stringify(e.args)}`)));}return}let n=e.type;if(n==="SIMID:Creative:requestPause"){i.policy.allowPause?(t.pause(),g(e.messageId)):M(e.messageId,1203,"Pause not allowed");return}if(n==="SIMID:Creative:requestPlay"){i.policy.allowPlay?(t.play(),g(e.messageId)):M(e.messageId,1203,"Play not allowed");return}if(n==="SIMID:Creative:requestResize"){i.policy.allowResize?g(e.messageId):M(e.messageId,1203,"Resize not allowed");return}if(n==="SIMID:Creative:requestNavigation"){let s=e.args;i.policy.navigation==="new-tab"&&s?.uri?(window.open(s.uri,"_blank"),g(e.messageId)):M(e.messageId,1214,"Navigation not supported");return}if(n==="SIMID:Creative:getMediaState"){g(e.messageId,O());return}if(n==="SIMID:Creative:requestSkip"){g(e.messageId),t.emit("ad:skip",{adId:a.id});return}if(n==="SIMID:Creative:requestStop"){g(e.messageId),S("SIMID:Player:adStopped",{code:4}),D(),t.emit("ad:skip",{adId:a.id});return}if(n!=="SIMID:Creative:clickThru"){if(n==="SIMID:Creative:fatalError"){t.emit("ad:error",{error:new Error(`SIMID creative fatal error: ${JSON.stringify(e.args)}`)}),D();return}if(n==="SIMID:Creative:log"){let s=e.args;console.debug("[vide:simid] creative:",s?.message);return}if(n==="SIMID:Creative:reportTracking"){g(e.messageId);return}if(n==="SIMID:Creative:requestChangeVolume"){let s=e.args;s?.volume!==void 0&&(t.volume=s.volume),s?.muted!==void 0&&(t.muted=s.muted),g(e.messageId);return}if(n==="SIMID:Creative:requestFullscreen"||n==="SIMID:Creative:requestExitFullscreen"||n==="SIMID:Creative:requestChangeAdDuration"){M(e.messageId,1203,"Not supported");return}if(n==="SIMID:Creative:expandNonlinear"||n==="SIMID:Creative:collapseNonlinear"){M(e.messageId,1203,"Not supported");return}}}function R(e){let n=b(e.data);n&&V(n);}function D(){if(!o){o=true,r.removeEventListener("message",R);for(let e of f)e();f.length=0;for(let[,e]of d)e.reject(new Error("SIMID host destroyed"));d.clear();}}async function F(){r.addEventListener("message",R),r.start();let e=await new Promise((u,c)=>{let v=setTimeout(()=>{c(new Error("SIMID handshake timeout: no createSession"));},i.handshakeTimeout),I=p=>{let E=b(p.data);!E||!x(E)||(clearTimeout(v),r.removeEventListener("message",I),u(E));};r.addEventListener("message",I);});if(o)throw new Error("SIMID host destroyed during handshake");l=e.sessionId,g(e.messageId);let n=await P("SIMID:Player:init",{environmentData:A(),creativeData:N()});if(o)throw new Error("SIMID host destroyed during handshake");if(y(n))throw new Error(`SIMID creative rejected init: ${JSON.stringify(n.args)}`);let s=await P("SIMID:Player:startCreative");if(o)throw new Error("SIMID host destroyed during handshake");if(y(s))throw new Error(`SIMID creative rejected startCreative: ${JSON.stringify(s.args)}`);H();}return {start:F,destroy:D}}var z={allowPause:true,allowPlay:true,allowResize:false,navigation:"new-tab"};function G(t){return {name:"simid",setup(r,i){let a=i.creatives.flatMap(d=>d.linear?.interactiveCreativeFiles??[]).find(d=>d.apiFramework==="SIMID");if(!a)return;let o={...z,...t.policy},l=t.handshakeTimeout??5e3,m=k(a.url,t.container),f=L(r,m.port,{policy:o,handshakeTimeout:l},i);return f.start().then(()=>m.show()).catch(d=>{r.emit("ad:error",{error:d instanceof Error?d:new Error(String(d))}),m.destroy();}),()=>{f.destroy(),m.destroy();}}}}export{G as simid};
1
+ function k(t,r){let i=document.createElement("iframe");i.sandbox.add("allow-scripts","allow-same-origin"),i.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;border:none;display:none;pointer-events:auto;",i.src=t;let a=new MessageChannel,o=a.port1,l=()=>{i.contentWindow?.postMessage("simid:connect","*",[a.port2]);};i.addEventListener("load",l,{once:true}),r.appendChild(i);let m=false;return {iframe:i,port:o,show(){m||(i.style.display="");},destroy(){m||(m=true,i.removeEventListener("load",l),i.remove(),o.close());}}}function h(t,r,i,a){return {sessionId:t,messageId:r,timestamp:Date.now(),type:i,args:a}}function j(t,r,i,a){let o={messageId:i};return a!==void 0&&(o.value=a),h(t,r,"resolve",o)}function T(t,r,i,a,o){let l={errorCode:a};return o!==void 0&&(l.message=o),h(t,r,"reject",{messageId:i,value:l})}function b(t){if(typeof t!="object"||t===null)return null;let r=t;return typeof r.sessionId!="string"||typeof r.messageId!="number"||typeof r.timestamp!="number"||typeof r.type!="string"?null:{sessionId:r.sessionId,messageId:r.messageId,timestamp:r.timestamp,type:r.type,args:r.args}}function x(t){return t.type==="createSession"}function C(t){return t.type==="resolve"}function y(t){return t.type==="reject"}function L(t,r,i,a){let o=false,l="",m=0,f=[],d=new Map;function w(){return m++}function S(e,n){let s=w(),u=h(l,s,e,n);return r.postMessage(u),s}function g(e,n){let s=w();r.postMessage(j(l,s,e,n));}function M(e,n,s){let u=w();r.postMessage(T(l,u,e,n,s));}function P(e,n,s){return new Promise((u,c)=>{let v=S(e,n),I=setTimeout(()=>{d.delete(v),c(new Error(`SIMID timeout waiting for response to ${e}`));},i.handshakeTimeout);d.set(v,{resolve:p=>{clearTimeout(I),d.delete(v),u(p);},reject:p=>{clearTimeout(I),d.delete(v),c(p);}});})}function q(){let e=t.el.getBoundingClientRect();return {x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}function A(){let e=q();return {videoDimensions:e,creativeDimensions:e,fullscreen:!!document.fullscreenElement,fullscreenAllowed:!!document.fullscreenEnabled,variableDurationAllowed:false,skippableState:"playerHandles",version:"1.2",muted:t.muted,volume:t.volume,navigationSupport:i.policy.navigation==="new-tab"?"playerHandles":"notSupported"}}function N(){return {adParameters:"",clickThruUrl:a.creatives[0]?.linear?.clickThrough}}function O(){return {currentTime:t.el.currentTime,duration:t.el.duration,ended:t.el.ended,muted:t.muted,paused:t.el.paused,volume:t.volume,fullscreen:!!document.fullscreenElement}}function H(){let e=t.el,n=["play","pause","playing","ended","seeking","seeked","stalled"];for(let I of n){let p=()=>{o||S(`SIMID:Media:${I}`);};e.addEventListener(I,p),f.push(()=>e.removeEventListener(I,p));}let s=()=>{o||S("SIMID:Media:timeupdate",{currentTime:e.currentTime});};e.addEventListener("timeupdate",s),f.push(()=>e.removeEventListener("timeupdate",s));let u=()=>{o||S("SIMID:Media:durationchange",{duration:e.duration});};e.addEventListener("durationchange",u),f.push(()=>e.removeEventListener("durationchange",u));let c=()=>{o||S("SIMID:Media:volumechange",{volume:e.volume,muted:e.muted});};e.addEventListener("volumechange",c),f.push(()=>e.removeEventListener("volumechange",c));let v=()=>{o||S("SIMID:Media:error",{error:e.error?.code??0,message:e.error?.message??""});};e.addEventListener("error",v),f.push(()=>e.removeEventListener("error",v));}function V(e){if(o)return;if(C(e)||y(e)){let u=e.args?.messageId;if(u!==void 0){let c=d.get(u);c&&(C(e)?c.resolve(e):c.reject(new Error(`SIMID creative rejected: ${JSON.stringify(e.args)}`)));}return}let n=e.type;if(n==="SIMID:Creative:requestPause"){i.policy.allowPause?(t.pause(),g(e.messageId)):M(e.messageId,1203,"Pause not allowed");return}if(n==="SIMID:Creative:requestPlay"){i.policy.allowPlay?(t.play(),g(e.messageId)):M(e.messageId,1203,"Play not allowed");return}if(n==="SIMID:Creative:requestResize"){i.policy.allowResize?g(e.messageId):M(e.messageId,1203,"Resize not allowed");return}if(n==="SIMID:Creative:requestNavigation"){let s=e.args;i.policy.navigation==="new-tab"&&s?.uri?(window.open(s.uri,"_blank"),g(e.messageId)):M(e.messageId,1214,"Navigation not supported");return}if(n==="SIMID:Creative:getMediaState"){g(e.messageId,O());return}if(n==="SIMID:Creative:requestSkip"){g(e.messageId),t.emit("ad:skip",{adId:a.id});return}if(n==="SIMID:Creative:requestStop"){g(e.messageId),S("SIMID:Player:adStopped",{code:4}),D(),t.emit("ad:skip",{adId:a.id});return}if(n!=="SIMID:Creative:clickThru"){if(n==="SIMID:Creative:fatalError"){t.emit("ad:error",{error:new Error(`SIMID creative fatal error: ${JSON.stringify(e.args)}`),source:"simid"}),D();return}if(n==="SIMID:Creative:log"){let s=e.args;console.debug("[vide:simid] creative:",s?.message);return}if(n==="SIMID:Creative:reportTracking"){g(e.messageId);return}if(n==="SIMID:Creative:requestChangeVolume"){let s=e.args;s?.volume!==void 0&&(t.volume=s.volume),s?.muted!==void 0&&(t.muted=s.muted),g(e.messageId);return}if(n==="SIMID:Creative:requestFullscreen"||n==="SIMID:Creative:requestExitFullscreen"||n==="SIMID:Creative:requestChangeAdDuration"){M(e.messageId,1203,"Not supported");return}if(n==="SIMID:Creative:expandNonlinear"||n==="SIMID:Creative:collapseNonlinear"){M(e.messageId,1203,"Not supported");return}}}function R(e){let n=b(e.data);n&&V(n);}function D(){if(!o){o=true,r.removeEventListener("message",R);for(let e of f)e();f.length=0;for(let[,e]of d)e.reject(new Error("SIMID host destroyed"));d.clear();}}async function F(){r.addEventListener("message",R),r.start();let e=await new Promise((u,c)=>{let v=setTimeout(()=>{c(new Error("SIMID handshake timeout: no createSession"));},i.handshakeTimeout),I=p=>{let E=b(p.data);!E||!x(E)||(clearTimeout(v),r.removeEventListener("message",I),u(E));};r.addEventListener("message",I);});if(o)throw new Error("SIMID host destroyed during handshake");l=e.sessionId,g(e.messageId);let n=await P("SIMID:Player:init",{environmentData:A(),creativeData:N()});if(o)throw new Error("SIMID host destroyed during handshake");if(y(n))throw new Error(`SIMID creative rejected init: ${JSON.stringify(n.args)}`);let s=await P("SIMID:Player:startCreative");if(o)throw new Error("SIMID host destroyed during handshake");if(y(s))throw new Error(`SIMID creative rejected startCreative: ${JSON.stringify(s.args)}`);H();}return {start:F,destroy:D}}var z={allowPause:true,allowPlay:true,allowResize:false,navigation:"new-tab"};function G(t){return {name:"simid",setup(r,i){let a=i.creatives.flatMap(d=>d.linear?.interactiveCreativeFiles??[]).find(d=>d.apiFramework==="SIMID");if(!a)return;let o={...z,...t.policy},l=t.handshakeTimeout??5e3,m=k(a.url,t.container),f=L(r,m.port,{policy:o,handshakeTimeout:l},i);return f.start().then(()=>m.show()).catch(d=>{r.emit("ad:error",{error:d instanceof Error?d:new Error(String(d)),source:"simid"}),m.destroy();}),()=>{f.destroy(),m.destroy();}}}}export{G as simid};
@@ -1,4 +1,4 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { e as Plugin } from '../types-vxIcXgJz.js';
2
2
 
3
3
  /** Parsed ad break metadata from stream signals. */
4
4
  interface AdBreakMetadata {
@@ -1,4 +1,4 @@
1
- import { P as Player } from './types-BxRa9Jvl.js';
1
+ import { P as Player } from './types-vxIcXgJz.js';
2
2
 
3
3
  interface VastResponse {
4
4
  version: string;