@mux/mux-video 0.12.0 → 0.13.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
@@ -217,6 +217,62 @@ In order to use `token=` -- or any other query params, pass them through with th
217
217
  playback-id="DS00Spx1CV902MCtPj5WknGlR102V5HFkDe?token=jwt-signed-token"
218
218
  ```
219
219
 
220
+ ### Advanced: CuePoints
221
+
222
+ `<mux-video>` has an extended API for working with CuePoints metadata. This includes the `addCuePoints()` method to add CuePoints, `cuePoints` and `activeCuePoint` properties to get all CuePoints or the current active CuePoint (based on the element's `currentTime`), and the `cuepointchange` event, which fires whenever the `activeCuePoint` changes. The "shape" of a CuePoint is `{ time: number; value: any; }`, where `time` is the playback time you want the `CuePoint` to begin, and `value` is whatever (JSON-serializable) value is appropriate for your CuePoint use case.
223
+
224
+ To add CuePoints via `addCuePoint()`, simply pass in an array of CuePoints (as described above). Note that CuePoints are tied to the loaded media source, so: (a) you'll need to wait until the media source (`src` or `playback-id`) has loaded before adding any CuePoints; and (b) the CuePoints will be removed if you `unload()` the current media source or change it by re-setting e.g. `playback-id`. Below is a simple example of using CuePoints:
225
+
226
+ ```html
227
+ <mux-video
228
+ playback-id="DS00Spx1CV902MCtPj5WknGlR102V5HFkDe"
229
+ controls
230
+ >
231
+ </mux-video>
232
+ <script>
233
+ const muxVideoEl = document.querySelector('mux-video');
234
+ function addCuePointsToElement() {
235
+ const cuePoints = [
236
+ { time: 1, value: 'Simple Value' },
237
+ { time: 3, value: { complex: 'Complex Object', duration: 2 } },
238
+ { time: 10, value: true },
239
+ { time: 15, value: { anything: 'That can be serialized to JSON and makes sense for your use case' } }
240
+ ];
241
+
242
+ muxVideoEl.addCuePoints(cuePoints);
243
+ }
244
+
245
+ function cuePointChangeListener() {
246
+ // Do something with the activeCuePoint here.
247
+ console.log('Active CuePoint!', muxVideoEl.activeCuePoint);
248
+ }
249
+
250
+ //
251
+ muxVideoEl.addEventListener('cuepointchange', cuePointChangeListener);
252
+ // Here, we're `duration` and `'durationchange'` to determine if the `<mux-video>` element has loaded src. This also gives
253
+ // us the opportunity to compare our intended CuePoints against the duration of the media source.
254
+ // Note that you could use other events, such as `'loadedmetadata'` if that makes more sense for your use case.
255
+ if (playerEl.duration) {
256
+ addCuePointsToElement();
257
+ } else {
258
+ muxVideoEl.addEventListener('durationchange', addCuePointsToElement, { once: true });
259
+ }
260
+ </script>
261
+ ```
262
+
263
+ One last thing to note about CuePoints: Although they only have a single `time` value, if a user seeks between the `time` of two CuePoints, the `cuepointchange` event will still fire and the `activeCuePoint` will be the earlier CuePoint. Using the example above for reference, we have a CuePoint with a `time` of `3` and another with a `time` of `10`. If a user seeks to `8`, the `activeCuePoint` will be the CuePoint with the `time` of `3`. This is intentional to cover as many use cases as possible. If you only care about the `activeCuePoint` when the `currentTime` is roughly
264
+ the same as the `time`, you can add some simple logic to account for that, e.g.:
265
+
266
+ ```js
267
+ function cuePointChangeListener() {
268
+ // Only do something with the activeCuePoint if we're playing "near" its `time`.
269
+ const MARGIN_OF_ERROR = 1;
270
+ if (Math.abs(muxVideoEl.currentTime - muxVideoEl.activeCuePoint.time) <= MARGIN_OF_ERROR) {
271
+ console.log('Active CuePoint playing near its time!', muxVideoEl.activeCuePoint);
272
+ }
273
+ }
274
+ ```
275
+
220
276
  ### Advanced: Use with React+TypeScript
221
277
 
222
278
  Even though we don't (yet!) have our own `React` version of `<mux-video>`, you can still use it in your `React` app. However, if you're also using TypeScript, make sure you add the following TypeScript definitions, since custom elements (like as `<mux-video>`) will not be recognized as [Intrinsic Elements](https://www.typescriptlang.org/docs/handbook/jsx.html#intrinsic-elements):
package/dist/index.cjs.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var de=Object.defineProperty;var Xe=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Qe=Object.prototype.hasOwnProperty;var et=(i,t,e)=>t in i?de(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var tt=(i,t)=>{for(var e in t)de(i,e,{get:t[e],enumerable:!0})},st=(i,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ze(t))!Qe.call(i,n)&&n!==e&&de(i,n,{get:()=>t[n],enumerable:!(o=Xe(t,n))||o.enumerable});return i};var rt=i=>st(de({},"__esModule",{value:!0}),i);var W=(i,t,e)=>(et(i,typeof t!="symbol"?t+"":t,e),e),ge=(i,t,e)=>{if(!t.has(i))throw TypeError("Cannot "+e)};var r=(i,t,e)=>(ge(i,t,"read from private field"),e?e.call(i):t.get(i)),u=(i,t,e)=>{if(t.has(i))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(i):t.set(i,e)},l=(i,t,e,o)=>(ge(i,t,"write to private field"),o?o.call(i,e):t.set(i,e),e);var h=(i,t,e)=>(ge(i,t,"access private method"),e);var pt={};tt(pt,{Attributes:()=>c,MediaError:()=>E.MediaError,VideoEvents:()=>Me,default:()=>ft});module.exports=rt(pt);var U=class{addEventListener(){}removeEventListener(){}dispatchEvent(t){return!0}};if(typeof DocumentFragment=="undefined"){class i extends U{}globalThis.DocumentFragment=i}var $=class extends U{},be=class extends U{},it={get(i){},define(i,t,e){},upgrade(i){},whenDefined(i){return Promise.resolve($)}},z,Ae=class{constructor(t,e={}){u(this,z,void 0);l(this,z,e==null?void 0:e.detail)}get detail(){return r(this,z)}initCustomEvent(){}};z=new WeakMap;function at(i,t){return new $}var Be={document:{createElement:at},DocumentFragment,customElements:it,CustomEvent:Ae,EventTarget:U,HTMLElement:$,HTMLVideoElement:be},Fe=typeof window=="undefined"||typeof globalThis.customElements=="undefined",C=Fe?Be:globalThis,Te=Fe?Be.document:globalThis.document;var E=require("@mux/playback-core");var nt=()=>{try{return"0.12.0"}catch{}return"UNKNOWN"},ot=nt(),Ge=()=>ot;var ct=i=>{var t,e,o,n,f,Ke,p,he,T,O,x,me,Y,fe,ae,He,ne,je,K,Pe,H,b,k,I,R,L,_,J,oe,Ve,j,Se,ce,qe,V,ve,ue,We,q,Ce;return t=class extends i{constructor(){super();u(this,_);u(this,oe);u(this,j);u(this,ce);u(this,V);u(this,ue);u(this,q);W(this,"castEnabled",!1);u(this,H,{paused:!1});u(this,b,void 0);u(this,k,{});u(this,I,void 0);u(this,R,void 0);u(this,L,void 0);t.instances.add(this),h(this,V,ve).call(this)}static get castElement(){return r(t,e)}static get castEnabled(){return r(t,o)}static get castState(){var s;return(s=r(t,T,O))==null?void 0:s.getCastState()}static async exitCast(){try{await r(t,T,O).endCurrentSession(!0)}catch(a){console.error(a);return}}get castPlayer(){if(t.castElement===this)return r(this,b)}attributeChangedCallback(s){if(!!this.castPlayer)switch(s){case"cast-stream-type":case"cast-src":this.load();break}}async requestCast(s={}){var a;h(a=t,K,Pe).call(a,s),l(t,e,this),Object.entries(r(this,k)).forEach(([d,y])=>{r(this,b).controller.addEventListener(d,y)});try{await r(t,T,O).requestSession()}catch{l(t,e,void 0);return}r(this,H).paused=super.paused,super.pause(),this.muted=super.muted;try{await this.load()}catch(d){console.error(d)}}async load(){var v,w;if(!this.castPlayer)return super.load();let s=new chrome.cast.media.MediaInfo(this.castSrc,this.castContentType),a=[...this.querySelectorAll("track")].filter(({kind:P,src:A})=>A&&(P==="subtitles"||P==="captions")),d=[],y=0;a.length&&(s.tracks=a.map(P=>{let A=++y;d.length===0&&P.track.mode==="showing"&&d.push(A);let N=new chrome.cast.media.Track(A,chrome.cast.media.TrackType.TEXT);return N.trackContentId=P.src,N.trackContentType="text/vtt",N.subtype=P.kind==="captions"?chrome.cast.media.TextTrackType.CAPTIONS:chrome.cast.media.TextTrackType.SUBTITLES,N.name=P.label,N.language=P.srclang,N})),this.castStreamType==="live"?s.streamType=chrome.cast.media.StreamType.LIVE:s.streamType=chrome.cast.media.StreamType.BUFFERED,s.metadata=new chrome.cast.media.GenericMediaMetadata,s.metadata.title=this.title,s.metadata.images=[{url:this.poster}];let g=new chrome.cast.media.LoadRequest(s);g.currentTime=(v=super.currentTime)!=null?v:0,g.autoplay=!r(this,H).paused,g.activeTrackIds=d,await((w=r(t,x,me))==null?void 0:w.loadMedia(g)),this.dispatchEvent(new Event("volumechange"))}play(){var s;if(this.castPlayer){this.castPlayer.isPaused&&((s=this.castPlayer.controller)==null||s.playOrPause());return}return super.play()}pause(){var s;if(this.castPlayer){this.castPlayer.isPaused||(s=this.castPlayer.controller)==null||s.playOrPause();return}super.pause()}get castSrc(){var s,a,d;return(d=(a=this.getAttribute("cast-src"))!=null?a:(s=this.querySelector("source"))==null?void 0:s.src)!=null?d:this.currentSrc}set castSrc(s){this.castSrc!=s&&this.setAttribute("cast-src",`${s}`)}get castContentType(){var s;return(s=this.getAttribute("cast-content-type"))!=null?s:void 0}set castContentType(s){this.setAttribute("cast-content-type",`${s}`)}get castStreamType(){var s;return(s=this.getAttribute("cast-stream-type"))!=null?s:void 0}set castStreamType(s){this.setAttribute("cast-stream-type",`${s}`)}get readyState(){if(this.castPlayer)switch(this.castPlayer.playerState){case chrome.cast.media.PlayerState.IDLE:return 0;case chrome.cast.media.PlayerState.BUFFERING:return 2;default:return 3}return super.readyState}get paused(){return this.castPlayer?this.castPlayer.isPaused:super.paused}get muted(){var s;return this.castPlayer?(s=this.castPlayer)==null?void 0:s.isMuted:super.muted}set muted(s){var a;if(this.castPlayer){(s&&!this.castPlayer.isMuted||!s&&this.castPlayer.isMuted)&&((a=this.castPlayer.controller)==null||a.muteOrUnmute());return}super.muted=s}get volume(){var s,a;return this.castPlayer?(a=(s=this.castPlayer)==null?void 0:s.volumeLevel)!=null?a:1:super.volume}set volume(s){var a;if(this.castPlayer){this.castPlayer.volumeLevel=s,(a=this.castPlayer.controller)==null||a.setVolumeLevel();return}super.volume=s}get duration(){var s,a;return this.castPlayer&&r(this,_,J)?(a=(s=this.castPlayer)==null?void 0:s.duration)!=null?a:NaN:super.duration}get currentTime(){var s,a;return this.castPlayer&&r(this,_,J)?(a=(s=this.castPlayer)==null?void 0:s.currentTime)!=null?a:0:super.currentTime}set currentTime(s){var a;if(this.castPlayer){this.castPlayer.currentTime=s,(a=this.castPlayer.controller)==null||a.seek();return}super.currentTime=s}get onentercast(){return r(this,I)}set onentercast(s){r(this,I)&&(this.removeEventListener("entercast",r(this,I)),l(this,I,null)),typeof s=="function"&&(l(this,I,s),this.addEventListener("entercast",s))}get onleavecast(){return r(this,R)}set onleavecast(s){r(this,R)&&(this.removeEventListener("leavecast",r(this,R)),l(this,R,null)),typeof s=="function"&&(l(this,R,s),this.addEventListener("leavecast",s))}get oncastchange(){return r(this,L)}set oncastchange(s){r(this,L)&&(this.removeEventListener("castchange",r(this,L)),l(this,L,null)),typeof s=="function"&&(l(this,L,s),this.addEventListener("castchange",s))}},e=new WeakMap,o=new WeakMap,n=new WeakMap,f=new WeakSet,Ke=function(){return typeof chrome!="undefined"&&chrome.cast&&chrome.cast.isAvailable},p=new WeakSet,he=function(){return typeof cast!="undefined"&&cast.framework},T=new WeakSet,O=function(){if(r(t,p,he))return cast.framework.CastContext.getInstance()},x=new WeakSet,me=function(){var s;return(s=r(t,T,O))==null?void 0:s.getCurrentSession()},Y=new WeakSet,fe=function(){var s;return(s=r(t,x,me))==null?void 0:s.getSessionObj().media[0]},ae=new WeakSet,He=function(s){return new Promise((a,d)=>{r(t,Y,fe).editTracksInfo(s,a,d)})},ne=new WeakSet,je=function(s){return new Promise((a,d)=>{r(t,Y,fe).getStatus(s,a,d)})},K=new WeakSet,Pe=function(s){return r(t,T,O).setOptions({receiverApplicationId:chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,autoJoinPolicy:chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,androidReceiverCompatible:!1,language:"en-US",resumeSavedSession:!0,...s})},H=new WeakMap,b=new WeakMap,k=new WeakMap,I=new WeakMap,R=new WeakMap,L=new WeakMap,_=new WeakSet,J=function(){var s;return(s=this.castPlayer)==null?void 0:s.isMediaLoaded},oe=new WeakSet,Ve=function(){r(t,e)===this&&(Object.entries(r(this,k)).forEach(([s,a])=>{r(this,b).controller.removeEventListener(s,a)}),l(t,e,void 0),this.muted=r(this,b).isMuted,this.currentTime=r(this,b).savedPlayerState.currentTime,r(this,b).savedPlayerState.isPaused===!1&&this.play())},j=new WeakSet,Se=function(){this.dispatchEvent(new CustomEvent("castchange",{detail:r(t,T,O).getCastState()}))},ce=new WeakSet,qe=async function(){var a,d;let{SESSION_RESUMED:s}=cast.framework.SessionState;if(r(t,T,O).getSessionState()===s&&this.castSrc===((a=r(t,Y,fe))==null?void 0:a.media.contentId)){l(t,e,this),Object.entries(r(this,k)).forEach(([y,g])=>{r(this,b).controller.addEventListener(y,g)});try{await h(d=t,ne,je).call(d,new chrome.cast.media.GetStatusRequest)}catch(y){console.error(y)}r(this,k)[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED](),r(this,k)[cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]()}},V=new WeakSet,ve=function(){var s;!r(t,p,he)||this.castEnabled||(this.castEnabled=!0,h(s=t,K,Pe).call(s),this.textTracks.addEventListener("change",h(this,q,Ce).bind(this)),h(this,j,Se).call(this),l(this,b,new cast.framework.RemotePlayer),new cast.framework.RemotePlayerController(r(this,b)),l(this,k,{[cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED]:({value:a})=>{a===!1&&h(this,oe,Ve).call(this),this.dispatchEvent(new Event(a?"entercast":"leavecast"))},[cast.framework.RemotePlayerEventType.DURATION_CHANGED]:()=>{this.dispatchEvent(new Event("durationchange"))},[cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED]:()=>{this.dispatchEvent(new Event("volumechange"))},[cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED]:()=>{this.dispatchEvent(new Event("volumechange"))},[cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED]:()=>{!r(this,_,J)||this.dispatchEvent(new Event("timeupdate"))},[cast.framework.RemotePlayerEventType.VIDEO_INFO_CHANGED]:()=>{this.dispatchEvent(new Event("resize"))},[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED]:()=>{this.dispatchEvent(new Event(this.paused?"pause":"play"))},[cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]:()=>{var a,d;((a=this.castPlayer)==null?void 0:a.playerState)!==chrome.cast.media.PlayerState.PAUSED&&this.dispatchEvent(new Event({[chrome.cast.media.PlayerState.PLAYING]:"playing",[chrome.cast.media.PlayerState.BUFFERING]:"waiting",[chrome.cast.media.PlayerState.IDLE]:"emptied"}[(d=this.castPlayer)==null?void 0:d.playerState]))},[cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED]:async()=>{!r(this,_,J)||(await Promise.resolve(),h(this,ue,We).call(this))}}))},ue=new WeakSet,We=function(){h(this,q,Ce).call(this)},q=new WeakSet,Ce=async function(){var Re,Le,De,_e,we,Ne;if(!this.castPlayer)return;let a=((Le=(Re=r(this,b).mediaInfo)==null?void 0:Re.tracks)!=null?Le:[]).filter(({type:m})=>m===chrome.cast.media.TrackType.TEXT),d=[...this.textTracks].filter(({kind:m})=>m==="subtitles"||m==="captions"),y=a.map(({language:m,name:le,trackId:ye})=>{var Ye;let{mode:xe}=(Ye=d.find(Ue=>Ue.language===m&&Ue.label===le))!=null?Ye:{};return xe?{mode:xe,trackId:ye}:!1}).filter(Boolean),v=y.filter(({mode:m})=>m!=="showing").map(({trackId:m})=>m),w=y.find(({mode:m})=>m==="showing"),P=(we=(_e=(De=r(t,x,me))==null?void 0:De.getSessionObj().media[0])==null?void 0:_e.activeTrackIds)!=null?we:[],A=P;if(P.length&&(A=A.filter(m=>!v.includes(m))),w!=null&&w.trackId&&(A=[...A,w.trackId]),A=[...new Set(A)],!((m,le)=>m.length===le.length&&m.every(ye=>le.includes(ye)))(P,A))try{let m=new chrome.cast.media.EditTracksInfoRequest(A);await h(Ne=t,ae,He).call(Ne,m)}catch(m){console.error(m)}},u(t,f),u(t,p),u(t,T),u(t,x),u(t,Y),u(t,ae),u(t,ne),u(t,K),W(t,"observedAttributes",["cast-src","cast-content-type","cast-stream-type"]),W(t,"instances",new Set),u(t,e,void 0),u(t,o,!1),W(t,"initCast",()=>{var s;r(t,f,Ke)?r(t,p,he)?r(s=t,n).call(s,chrome.cast.isAvailable):customElements.whenDefined("google-cast-button").then(()=>{var a;return r(a=t,n).call(a,chrome.cast.isAvailable)}):globalThis.__onGCastApiAvailable=()=>{customElements.whenDefined("google-cast-button").then(()=>{var a;return r(a=t,n).call(a,chrome.cast.isAvailable)})}}),u(t,n,s=>{if(s){l(t,o,!0);let{CAST_STATE_CHANGED:a}=cast.framework.CastContextEventType;r(t,T,O).addEventListener(a,y=>{t.instances.forEach(g=>{var v;return h(v=g,j,Se).call(v,y)})});let{SESSION_STATE_CHANGED:d}=cast.framework.CastContextEventType;r(t,T,O).addEventListener(d,y=>{t.instances.forEach(g=>{var v;return h(v=g,ce,qe).call(v,y)})}),t.instances.forEach(y=>{var g;return h(g=y,V,ve).call(g)})}}),t};if(globalThis.HTMLVideoElement&&globalThis.customElements){let i=ct(HTMLVideoElement);globalThis.customElements.get("castable-video")||(globalThis.customElements.define("castable-video",i,{extends:"video"}),globalThis.CastableVideoElement=i),i.initCast()}var Me=["abort","canplay","canplaythrough","durationchange","emptied","encrypted","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting","waitingforkey","resize","enterpictureinpicture","leavepictureinpicture","castchange","entercast","leavecast"],$e=Te.createElement("template");$e.innerHTML=`
1
+ "use strict";var de=Object.defineProperty;var Ze=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var et=Object.prototype.hasOwnProperty;var tt=(i,t,e)=>t in i?de(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var st=(i,t)=>{for(var e in t)de(i,e,{get:t[e],enumerable:!0})},rt=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Qe(t))!et.call(i,o)&&o!==e&&de(i,o,{get:()=>t[o],enumerable:!(n=Ze(t,o))||n.enumerable});return i};var it=i=>rt(de({},"__esModule",{value:!0}),i);var W=(i,t,e)=>(tt(i,typeof t!="symbol"?t+"":t,e),e),ge=(i,t,e)=>{if(!t.has(i))throw TypeError("Cannot "+e)};var r=(i,t,e)=>(ge(i,t,"read from private field"),e?e.call(i):t.get(i)),u=(i,t,e)=>{if(t.has(i))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(i):t.set(i,e)},l=(i,t,e,n)=>(ge(i,t,"write to private field"),n?n.call(i,e):t.set(i,e),e);var m=(i,t,e)=>(ge(i,t,"access private method"),e);var pt={};st(pt,{Attributes:()=>c,MediaError:()=>d.MediaError,VideoEvents:()=>ke,default:()=>Et});module.exports=it(pt);var U=class{addEventListener(){}removeEventListener(){}dispatchEvent(t){return!0}};if(typeof DocumentFragment=="undefined"){class i extends U{}globalThis.DocumentFragment=i}var $=class extends U{},be=class extends U{},at={get(i){},define(i,t,e){},upgrade(i){},whenDefined(i){return Promise.resolve($)}},z,Ae=class{constructor(t,e={}){u(this,z,void 0);l(this,z,e==null?void 0:e.detail)}get detail(){return r(this,z)}initCustomEvent(){}};z=new WeakMap;function nt(i,t){return new $}var Fe={document:{createElement:nt},DocumentFragment,customElements:at,CustomEvent:Ae,EventTarget:U,HTMLElement:$,HTMLVideoElement:be},Ge=typeof window=="undefined"||typeof globalThis.customElements=="undefined",S=Ge?Fe:globalThis,Te=Ge?Fe.document:globalThis.document;var d=require("@mux/playback-core");var ot=()=>{try{return"0.13.0"}catch{}return"UNKNOWN"},ct=ot(),Ke=()=>ct;var Pe=class extends Set{add(t){super.add(new WeakRef(t))}forEach(t){super.forEach(e=>{let n=e.deref();n&&t(n)})}},ut=i=>{var t,e,n,o,E,He,p,he,T,O,x,me,Y,fe,ae,je,ne,Ve,K,ve,H,b,k,R,I,L,w,J,oe,qe,j,Ce,ce,We,V,Se,ue,$e,q,Oe;return t=class extends i{constructor(){super();u(this,w);u(this,oe);u(this,j);u(this,ce);u(this,V);u(this,ue);u(this,q);W(this,"castEnabled",!1);u(this,H,{paused:!1});u(this,b,void 0);u(this,k,{});u(this,R,void 0);u(this,I,void 0);u(this,L,void 0);t.instances.add(this),m(this,V,Se).call(this)}static get castElement(){return r(t,e)}static get castEnabled(){return r(t,n)}static get castState(){var s;return(s=r(t,T,O))==null?void 0:s.getCastState()}static async exitCast(){try{await r(t,T,O).endCurrentSession(!0)}catch(a){console.error(a);return}}get castPlayer(){if(t.castElement===this)return r(this,b)}attributeChangedCallback(s){if(!!this.castPlayer)switch(s){case"cast-stream-type":case"cast-src":this.load();break}}async requestCast(s={}){var a;m(a=t,K,ve).call(a,s),l(t,e,this),Object.entries(r(this,k)).forEach(([h,y])=>{r(this,b).controller.addEventListener(h,y)});try{await r(t,T,O).requestSession()}catch{l(t,e,void 0);return}r(this,H).paused=super.paused,super.pause(),this.muted=super.muted;try{await this.load()}catch(h){console.error(h)}}async load(){var C,_;if(!this.castPlayer)return super.load();let s=new chrome.cast.media.MediaInfo(this.castSrc,this.castContentType),a=[...this.querySelectorAll("track")].filter(({kind:P,src:A})=>A&&(P==="subtitles"||P==="captions")),h=[],y=0;a.length&&(s.tracks=a.map(P=>{let A=++y;h.length===0&&P.track.mode==="showing"&&h.push(A);let N=new chrome.cast.media.Track(A,chrome.cast.media.TrackType.TEXT);return N.trackContentId=P.src,N.trackContentType="text/vtt",N.subtype=P.kind==="captions"?chrome.cast.media.TextTrackType.CAPTIONS:chrome.cast.media.TextTrackType.SUBTITLES,N.name=P.label,N.language=P.srclang,N})),this.castStreamType==="live"?s.streamType=chrome.cast.media.StreamType.LIVE:s.streamType=chrome.cast.media.StreamType.BUFFERED,s.metadata=new chrome.cast.media.GenericMediaMetadata,s.metadata.title=this.title,s.metadata.images=[{url:this.poster}];let g=new chrome.cast.media.LoadRequest(s);g.currentTime=(C=super.currentTime)!=null?C:0,g.autoplay=!r(this,H).paused,g.activeTrackIds=h,await((_=r(t,x,me))==null?void 0:_.loadMedia(g)),this.dispatchEvent(new Event("volumechange"))}play(){var s;if(this.castPlayer){this.castPlayer.isPaused&&((s=this.castPlayer.controller)==null||s.playOrPause());return}return super.play()}pause(){var s;if(this.castPlayer){this.castPlayer.isPaused||(s=this.castPlayer.controller)==null||s.playOrPause();return}super.pause()}get castSrc(){var s,a,h;return(h=(a=this.getAttribute("cast-src"))!=null?a:(s=this.querySelector("source"))==null?void 0:s.src)!=null?h:this.currentSrc}set castSrc(s){this.castSrc!=s&&this.setAttribute("cast-src",`${s}`)}get castContentType(){var s;return(s=this.getAttribute("cast-content-type"))!=null?s:void 0}set castContentType(s){this.setAttribute("cast-content-type",`${s}`)}get castStreamType(){var s;return(s=this.getAttribute("cast-stream-type"))!=null?s:void 0}set castStreamType(s){this.setAttribute("cast-stream-type",`${s}`)}get readyState(){if(this.castPlayer)switch(this.castPlayer.playerState){case chrome.cast.media.PlayerState.IDLE:return 0;case chrome.cast.media.PlayerState.BUFFERING:return 2;default:return 3}return super.readyState}get paused(){return this.castPlayer?this.castPlayer.isPaused:super.paused}get muted(){var s;return this.castPlayer?(s=this.castPlayer)==null?void 0:s.isMuted:super.muted}set muted(s){var a;if(this.castPlayer){(s&&!this.castPlayer.isMuted||!s&&this.castPlayer.isMuted)&&((a=this.castPlayer.controller)==null||a.muteOrUnmute());return}super.muted=s}get volume(){var s,a;return this.castPlayer?(a=(s=this.castPlayer)==null?void 0:s.volumeLevel)!=null?a:1:super.volume}set volume(s){var a;if(this.castPlayer){this.castPlayer.volumeLevel=s,(a=this.castPlayer.controller)==null||a.setVolumeLevel();return}super.volume=s}get duration(){var s,a;return this.castPlayer&&r(this,w,J)?(a=(s=this.castPlayer)==null?void 0:s.duration)!=null?a:NaN:super.duration}get currentTime(){var s,a;return this.castPlayer&&r(this,w,J)?(a=(s=this.castPlayer)==null?void 0:s.currentTime)!=null?a:0:super.currentTime}set currentTime(s){var a;if(this.castPlayer){this.castPlayer.currentTime=s,(a=this.castPlayer.controller)==null||a.seek();return}super.currentTime=s}get onentercast(){return r(this,R)}set onentercast(s){r(this,R)&&(this.removeEventListener("entercast",r(this,R)),l(this,R,null)),typeof s=="function"&&(l(this,R,s),this.addEventListener("entercast",s))}get onleavecast(){return r(this,I)}set onleavecast(s){r(this,I)&&(this.removeEventListener("leavecast",r(this,I)),l(this,I,null)),typeof s=="function"&&(l(this,I,s),this.addEventListener("leavecast",s))}get oncastchange(){return r(this,L)}set oncastchange(s){r(this,L)&&(this.removeEventListener("castchange",r(this,L)),l(this,L,null)),typeof s=="function"&&(l(this,L,s),this.addEventListener("castchange",s))}},e=new WeakMap,n=new WeakMap,o=new WeakMap,E=new WeakSet,He=function(){return typeof chrome!="undefined"&&chrome.cast&&chrome.cast.isAvailable},p=new WeakSet,he=function(){return typeof cast!="undefined"&&cast.framework},T=new WeakSet,O=function(){if(r(t,p,he))return cast.framework.CastContext.getInstance()},x=new WeakSet,me=function(){var s;return(s=r(t,T,O))==null?void 0:s.getCurrentSession()},Y=new WeakSet,fe=function(){var s;return(s=r(t,x,me))==null?void 0:s.getSessionObj().media[0]},ae=new WeakSet,je=function(s){return new Promise((a,h)=>{r(t,Y,fe).editTracksInfo(s,a,h)})},ne=new WeakSet,Ve=function(s){return new Promise((a,h)=>{r(t,Y,fe).getStatus(s,a,h)})},K=new WeakSet,ve=function(s){return r(t,T,O).setOptions({receiverApplicationId:chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,autoJoinPolicy:chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,androidReceiverCompatible:!1,language:"en-US",resumeSavedSession:!0,...s})},H=new WeakMap,b=new WeakMap,k=new WeakMap,R=new WeakMap,I=new WeakMap,L=new WeakMap,w=new WeakSet,J=function(){var s;return(s=this.castPlayer)==null?void 0:s.isMediaLoaded},oe=new WeakSet,qe=function(){r(t,e)===this&&(Object.entries(r(this,k)).forEach(([s,a])=>{r(this,b).controller.removeEventListener(s,a)}),l(t,e,void 0),this.muted=r(this,b).isMuted,this.currentTime=r(this,b).savedPlayerState.currentTime,r(this,b).savedPlayerState.isPaused===!1&&this.play())},j=new WeakSet,Ce=function(){this.dispatchEvent(new CustomEvent("castchange",{detail:r(t,T,O).getCastState()}))},ce=new WeakSet,We=async function(){var a,h;let{SESSION_RESUMED:s}=cast.framework.SessionState;if(r(t,T,O).getSessionState()===s&&this.castSrc===((a=r(t,Y,fe))==null?void 0:a.media.contentId)){l(t,e,this),Object.entries(r(this,k)).forEach(([y,g])=>{r(this,b).controller.addEventListener(y,g)});try{await m(h=t,ne,Ve).call(h,new chrome.cast.media.GetStatusRequest)}catch(y){console.error(y)}r(this,k)[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED](),r(this,k)[cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]()}},V=new WeakSet,Se=function(){var s;!r(t,p,he)||this.castEnabled||(this.castEnabled=!0,m(s=t,K,ve).call(s),this.textTracks.addEventListener("change",m(this,q,Oe).bind(this)),m(this,j,Ce).call(this),l(this,b,new cast.framework.RemotePlayer),new cast.framework.RemotePlayerController(r(this,b)),l(this,k,{[cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED]:({value:a})=>{a===!1&&m(this,oe,qe).call(this),this.dispatchEvent(new Event(a?"entercast":"leavecast"))},[cast.framework.RemotePlayerEventType.DURATION_CHANGED]:()=>{this.dispatchEvent(new Event("durationchange"))},[cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED]:()=>{this.dispatchEvent(new Event("volumechange"))},[cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED]:()=>{this.dispatchEvent(new Event("volumechange"))},[cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED]:()=>{!r(this,w,J)||this.dispatchEvent(new Event("timeupdate"))},[cast.framework.RemotePlayerEventType.VIDEO_INFO_CHANGED]:()=>{this.dispatchEvent(new Event("resize"))},[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED]:()=>{this.dispatchEvent(new Event(this.paused?"pause":"play"))},[cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]:()=>{var a,h;((a=this.castPlayer)==null?void 0:a.playerState)!==chrome.cast.media.PlayerState.PAUSED&&this.dispatchEvent(new Event({[chrome.cast.media.PlayerState.PLAYING]:"playing",[chrome.cast.media.PlayerState.BUFFERING]:"waiting",[chrome.cast.media.PlayerState.IDLE]:"emptied"}[(h=this.castPlayer)==null?void 0:h.playerState]))},[cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED]:async()=>{!r(this,w,J)||(await Promise.resolve(),m(this,ue,$e).call(this))}}))},ue=new WeakSet,$e=function(){m(this,q,Oe).call(this)},q=new WeakSet,Oe=async function(){var Le,De,we,_e,Ne,xe;if(!this.castPlayer)return;let a=((De=(Le=r(this,b).mediaInfo)==null?void 0:Le.tracks)!=null?De:[]).filter(({type:f})=>f===chrome.cast.media.TrackType.TEXT),h=[...this.textTracks].filter(({kind:f})=>f==="subtitles"||f==="captions"),y=a.map(({language:f,name:le,trackId:ye})=>{var Ue;let{mode:Ye}=(Ue=h.find(Be=>Be.language===f&&Be.label===le))!=null?Ue:{};return Ye?{mode:Ye,trackId:ye}:!1}).filter(Boolean),C=y.filter(({mode:f})=>f!=="showing").map(({trackId:f})=>f),_=y.find(({mode:f})=>f==="showing"),P=(Ne=(_e=(we=r(t,x,me))==null?void 0:we.getSessionObj().media[0])==null?void 0:_e.activeTrackIds)!=null?Ne:[],A=P;if(P.length&&(A=A.filter(f=>!C.includes(f))),_!=null&&_.trackId&&(A=[...A,_.trackId]),A=[...new Set(A)],!((f,le)=>f.length===le.length&&f.every(ye=>le.includes(ye)))(P,A))try{let f=new chrome.cast.media.EditTracksInfoRequest(A);await m(xe=t,ae,je).call(xe,f)}catch(f){console.error(f)}},u(t,E),u(t,p),u(t,T),u(t,x),u(t,Y),u(t,ae),u(t,ne),u(t,K),W(t,"observedAttributes",["cast-src","cast-content-type","cast-stream-type"]),W(t,"instances",new Pe),u(t,e,void 0),u(t,n,!1),W(t,"initCast",()=>{var s;r(t,E,He)?r(t,p,he)?r(s=t,o).call(s,chrome.cast.isAvailable):customElements.whenDefined("google-cast-button").then(()=>{var a;return r(a=t,o).call(a,chrome.cast.isAvailable)}):globalThis.__onGCastApiAvailable=()=>{customElements.whenDefined("google-cast-button").then(()=>{var a;return r(a=t,o).call(a,chrome.cast.isAvailable)})}}),u(t,o,s=>{if(s){l(t,n,!0);let{CAST_STATE_CHANGED:a}=cast.framework.CastContextEventType;r(t,T,O).addEventListener(a,y=>{t.instances.forEach(g=>{var C;return m(C=g,j,Ce).call(C,y)})});let{SESSION_STATE_CHANGED:h}=cast.framework.CastContextEventType;r(t,T,O).addEventListener(h,y=>{t.instances.forEach(g=>{var C;return m(C=g,ce,We).call(C,y)})}),t.instances.forEach(y=>{var g;return m(g=y,V,Se).call(g)})}}),t};if(globalThis.HTMLVideoElement&&globalThis.customElements){let i=ut(HTMLVideoElement);globalThis.customElements.get("castable-video")||(globalThis.customElements.define("castable-video",i,{extends:"video"}),globalThis.CastableVideoElement=i),i.initCast()}var ke=["abort","canplay","canplaythrough","durationchange","emptied","encrypted","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting","waitingforkey","resize","enterpictureinpicture","leavepictureinpicture","castchange","entercast","leavecast"],ze=Te.createElement("template");ze.innerHTML=`
2
2
  <style>
3
3
  :host {
4
4
  display: inline-block;
@@ -18,5 +18,5 @@
18
18
  </style>
19
19
  <video is="castable-video" part="video" crossorigin></video>
20
20
  <slot></slot>
21
- `;var X,B,pe,Z,Oe,D=class extends C.HTMLElement{constructor(){super();u(this,B);u(this,Z);u(this,X,void 0);this.attachShadow({mode:"open"}),this.isConnected&&h(this,B,pe).call(this)}static get observedAttributes(){let e=[],o=f=>f.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();Object.getOwnPropertyNames(this.prototype).forEach(f=>{let S=!1;try{typeof this.prototype[f]=="function"&&(S=!0)}catch{}!S&&f!==f.toUpperCase()&&e.push(f.toLowerCase(),o(f))});let n=Object.getPrototypeOf(this).observedAttributes;return n&&(e=e.concat(n)),e}attributeChangedCallback(e,o,n){h(this,B,pe).call(this),h(this,Z,Oe).call(this,e,o,n)}connectedCallback(){h(this,B,pe).call(this)}};X=new WeakMap,B=new WeakSet,pe=function(){if(r(this,X))return;l(this,X,!0),this.shadowRoot.append($e.content.cloneNode(!0)),this.nativeEl=this.shadowRoot.querySelector("video"),Me.forEach(o=>{this.nativeEl.addEventListener(o,n=>{this.dispatchEvent(new CustomEvent(n.type,{detail:n.detail}))})});let e=this.shadowRoot.querySelector("slot");e.addEventListener("slotchange",()=>{e.assignedElements().forEach(o=>{!["track","source"].includes(o.localName)||this.nativeEl.append(o)})}),Array.prototype.forEach.call(this.attributes,o=>{h(this,Z,Oe).call(this,o.name,null,o.value)}),this.nativeEl.defaultMuted&&(this.nativeEl.muted=!0)},Z=new WeakSet,Oe=function(e,o,n){let f=Object.getOwnPropertyNames(Object.getPrototypeOf(this)),S=lt(f,e),p=Object.getPrototypeOf(this.constructor).toString().indexOf("function HTMLElement")===0;S&&!p?typeof this[S]=="boolean"?n===null?this[S]=!1:this[S]=!0:this[S]=n:n===null?this.nativeEl.removeAttribute(e):["id","class"].indexOf(e)===-1&&this.nativeEl.setAttribute(e,n)};var ze=[],Je=Te.createElement("video",{is:"castable-video"}),ut=["webkitDisplayingFullscreen","webkitSupportsFullscreen"];for(let i=Object.getPrototypeOf(Je);i&&i!==C.HTMLElement.prototype;i=Object.getPrototypeOf(i))Object.getOwnPropertyNames(i).forEach(t=>{ut.indexOf(t)===-1&&ze.push(t)});ze.forEach(i=>{if(i in D.prototype)return;if(typeof Je[i]=="function")D.prototype[i]=function(){return this.nativeEl[i].apply(this.nativeEl,arguments)};else{let e={get(){return this.nativeEl[i]}};i!==i.toUpperCase()&&(e.set=function(o){this.nativeEl[i]=o}),Object.defineProperty(D.prototype,i,e)}});function lt(i,t){let e=null;return i.forEach(o=>{o.toLowerCase()==t.toLowerCase()&&(e=o)}),e}C.customElements.get("custom-video")||(C.customElements.define("custom-video",D),C.CustomVideoElement=D);var ke=D;var c={ENV_KEY:"env-key",DEBUG:"debug",PLAYBACK_ID:"playback-id",METADATA_URL:"metadata-url",PREFER_PLAYBACK:"prefer-playback",PLAYER_SOFTWARE_VERSION:"player-software-version",PLAYER_SOFTWARE_NAME:"player-software-name",BEACON_COLLECTION_DOMAIN:"beacon-collection-domain",CUSTOM_DOMAIN:"custom-domain",DISABLE_COOKIES:"disable-cookies",TYPE:"type",STREAM_TYPE:"stream-type",START_TIME:"start-time",PREFER_CMCD:"prefer-cmcd"},dt=Object.values(c),ht=Ge(),mt="mux-video",M,F,ee,G,te,se,re,ie,Ie,Q=class extends ke{constructor(){super();u(this,ie);u(this,M,void 0);u(this,F,void 0);u(this,ee,void 0);u(this,G,{});u(this,te,void 0);u(this,se,void 0);u(this,re,void 0);l(this,ee,(0,E.generatePlayerInitTime)())}static get observedAttributes(){var e;return[...dt,...(e=ke.observedAttributes)!=null?e:[]]}get preferCmcd(){var e;return(e=this.getAttribute(c.PREFER_CMCD))!=null?e:void 0}set preferCmcd(e){e!==this.preferCmcd&&(e?E.CmcdTypeValues.includes(e)?this.setAttribute(c.PREFER_CMCD,e):console.warn(`Invalid value for preferCmcd. Must be one of ${E.CmcdTypeValues.join()}`):this.removeAttribute(c.PREFER_CMCD))}get playerInitTime(){return r(this,ee)}get playerSoftwareName(){var e;return(e=r(this,se))!=null?e:mt}set playerSoftwareName(e){l(this,se,e)}get playerSoftwareVersion(){var e;return(e=r(this,te))!=null?e:ht}set playerSoftwareVersion(e){l(this,te,e)}get _hls(){var e;return(e=r(this,M))==null?void 0:e.engine}get mux(){return this.nativeEl.mux}get error(){var e;return(e=(0,E.getError)(this.nativeEl))!=null?e:null}get errorTranslator(){return r(this,re)}set errorTranslator(e){l(this,re,e)}get src(){return this.getAttribute("src")}set src(e){e!==this.src&&(e==null?this.removeAttribute("src"):this.setAttribute("src",e))}get type(){var e;return(e=this.getAttribute(c.TYPE))!=null?e:void 0}set type(e){e!==this.type&&(e?this.setAttribute(c.TYPE,e):this.removeAttribute(c.TYPE))}get autoplay(){let e=this.getAttribute("autoplay");return e===null?!1:e===""?!0:e}set autoplay(e){let o=this.autoplay;e!==o&&(e?this.setAttribute("autoplay",typeof e=="string"?e:""):this.removeAttribute("autoplay"))}get preload(){let e=this.getAttribute("preload");return e===""?"auto":["none","metadata","auto"].includes(e)?e:super.preload}set preload(e){e!=this.getAttribute("preload")&&(["","none","metadata","auto"].includes(e)?this.setAttribute("preload",e):this.removeAttribute("preload"))}get debug(){return this.getAttribute(c.DEBUG)!=null}set debug(e){e!==this.debug&&(e?this.setAttribute(c.DEBUG,""):this.removeAttribute(c.DEBUG))}get disableCookies(){return this.hasAttribute(c.DISABLE_COOKIES)}set disableCookies(e){e!==this.disableCookies&&(e?this.setAttribute(c.DISABLE_COOKIES,""):this.removeAttribute(c.DISABLE_COOKIES))}get startTime(){let e=this.getAttribute(c.START_TIME);if(e==null)return;let o=+e;return Number.isNaN(o)?void 0:o}set startTime(e){e!==this.startTime&&(e==null?this.removeAttribute(c.START_TIME):this.setAttribute(c.START_TIME,`${e}`))}get playbackId(){var e;return(e=this.getAttribute(c.PLAYBACK_ID))!=null?e:void 0}set playbackId(e){e!==this.playbackId&&(e?this.setAttribute(c.PLAYBACK_ID,e):this.removeAttribute(c.PLAYBACK_ID))}get customDomain(){var e;return(e=this.getAttribute(c.CUSTOM_DOMAIN))!=null?e:void 0}set customDomain(e){e!==this.customDomain&&(e?this.setAttribute(c.CUSTOM_DOMAIN,e):this.removeAttribute(c.CUSTOM_DOMAIN))}get envKey(){var e;return(e=this.getAttribute(c.ENV_KEY))!=null?e:void 0}set envKey(e){e!==this.envKey&&(e?this.setAttribute(c.ENV_KEY,e):this.removeAttribute(c.ENV_KEY))}get beaconCollectionDomain(){var e;return(e=this.getAttribute(c.BEACON_COLLECTION_DOMAIN))!=null?e:void 0}set beaconCollectionDomain(e){e!==this.beaconCollectionDomain&&(e?this.setAttribute(c.BEACON_COLLECTION_DOMAIN,e):this.removeAttribute(c.BEACON_COLLECTION_DOMAIN))}get streamType(){var e;return(e=this.getAttribute(c.STREAM_TYPE))!=null?e:void 0}set streamType(e){e!==this.streamType&&(e?this.setAttribute(c.STREAM_TYPE,e):this.removeAttribute(c.STREAM_TYPE))}get preferPlayback(){let e=this.getAttribute(c.PREFER_PLAYBACK);if(e===E.PlaybackTypes.MSE||e===E.PlaybackTypes.NATIVE)return e}set preferPlayback(e){e!==this.preferPlayback&&(e===E.PlaybackTypes.MSE||e===E.PlaybackTypes.NATIVE?this.setAttribute(c.PREFER_PLAYBACK,e):this.removeAttribute(c.PREFER_PLAYBACK))}get metadata(){return{...this.getAttributeNames().filter(o=>o.startsWith("metadata-")&&![c.METADATA_URL].includes(o)).reduce((o,n)=>{let f=this.getAttribute(n);return f!=null&&(o[n.replace(/^metadata-/,"").replace(/-/g,"_")]=f),o},{}),...r(this,G)}}set metadata(e){l(this,G,e!=null?e:{}),this.mux&&this.mux.emit("hb",r(this,G))}load(){l(this,M,(0,E.initialize)(this,this.nativeEl,r(this,M)))}unload(){(0,E.teardown)(this.nativeEl,r(this,M)),l(this,M,void 0)}attributeChangedCallback(e,o,n){var f,S;switch(super.attributeChangedCallback(e,o,n),e){case c.PLAYER_SOFTWARE_NAME:this.playerSoftwareName=n!=null?n:void 0;break;case c.PLAYER_SOFTWARE_VERSION:this.playerSoftwareVersion=n!=null?n:void 0;break;case"src":{let p=!!o,Ee=!!n;!p&&Ee?h(this,ie,Ie).call(this):p&&!Ee?this.unload():p&&Ee&&(this.unload(),h(this,ie,Ie).call(this));break}case"autoplay":if(n===o)break;(f=r(this,M))==null||f.setAutoplay(this.autoplay);break;case"preload":if(n===o)break;(S=r(this,M))==null||S.setPreload(n);break;case c.PLAYBACK_ID:this.src=(0,E.toMuxVideoURL)(n!=null?n:void 0,{domain:this.customDomain});break;case c.DEBUG:{let p=this.debug;this.mux&&console.info("Cannot toggle debug mode of mux data after initialization. Make sure you set all metadata to override before setting the src."),this._hls&&(this._hls.config.debug=p);break}case c.METADATA_URL:n&&fetch(n).then(p=>p.json()).then(p=>this.metadata=p).catch(p=>console.error(`Unable to load or parse metadata JSON from metadata-url ${n}!`));break;default:break}}disconnectedCallback(){this.unload()}};M=new WeakMap,F=new WeakMap,ee=new WeakMap,G=new WeakMap,te=new WeakMap,se=new WeakMap,re=new WeakMap,ie=new WeakSet,Ie=async function(){r(this,F)||(await l(this,F,Promise.resolve()),l(this,F,null),this.load())};C.customElements.get("mux-video")||(C.customElements.define("mux-video",Q),C.MuxVideoElement=Q);var ft=Q;
21
+ `;var X,B,Ee,Z,Me,D=class extends S.HTMLElement{constructor(){super();u(this,B);u(this,Z);u(this,X,void 0);this.attachShadow({mode:"open"}),this.isConnected&&m(this,B,Ee).call(this)}static get observedAttributes(){let e=[],n=E=>E.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();Object.getOwnPropertyNames(this.prototype).forEach(E=>{let v=!1;try{typeof this.prototype[E]=="function"&&(v=!0)}catch{}!v&&E!==E.toUpperCase()&&e.push(E.toLowerCase(),n(E))});let o=Object.getPrototypeOf(this).observedAttributes;return o&&(e=e.concat(o)),e}attributeChangedCallback(e,n,o){m(this,B,Ee).call(this),m(this,Z,Me).call(this,e,n,o)}connectedCallback(){m(this,B,Ee).call(this)}};X=new WeakMap,B=new WeakSet,Ee=function(){if(r(this,X))return;l(this,X,!0),this.shadowRoot.append(ze.content.cloneNode(!0)),this.nativeEl=this.shadowRoot.querySelector("video"),ke.forEach(n=>{this.nativeEl.addEventListener(n,o=>{this.dispatchEvent(new CustomEvent(o.type,{detail:o.detail}))})});let e=this.shadowRoot.querySelector("slot");e.addEventListener("slotchange",()=>{e.assignedElements().forEach(n=>{!["track","source"].includes(n.localName)||this.nativeEl.append(n)})}),Array.prototype.forEach.call(this.attributes,n=>{m(this,Z,Me).call(this,n.name,null,n.value)}),this.nativeEl.defaultMuted&&(this.nativeEl.muted=!0)},Z=new WeakSet,Me=function(e,n,o){let E=Object.getOwnPropertyNames(Object.getPrototypeOf(this)),v=dt(E,e),p=Object.getPrototypeOf(this.constructor).toString().indexOf("function HTMLElement")===0;v&&!p?typeof this[v]=="boolean"?o===null?this[v]=!1:this[v]=!0:this[v]=o:o===null?this.nativeEl.removeAttribute(e):["id","class"].indexOf(e)===-1&&this.nativeEl.setAttribute(e,o)};var Je=[],Xe=Te.createElement("video",{is:"castable-video"}),lt=["webkitDisplayingFullscreen","webkitSupportsFullscreen"];for(let i=Object.getPrototypeOf(Xe);i&&i!==S.HTMLElement.prototype;i=Object.getPrototypeOf(i))Object.getOwnPropertyNames(i).forEach(t=>{lt.indexOf(t)===-1&&Je.push(t)});Je.forEach(i=>{if(i in D.prototype)return;if(typeof Xe[i]=="function")D.prototype[i]=function(){return this.nativeEl[i].apply(this.nativeEl,arguments)};else{let e={get(){return this.nativeEl[i]}};i!==i.toUpperCase()&&(e.set=function(n){this.nativeEl[i]=n}),Object.defineProperty(D.prototype,i,e)}});function dt(i,t){let e=null;return i.forEach(n=>{n.toLowerCase()==t.toLowerCase()&&(e=n)}),e}S.customElements.get("custom-video")||(S.customElements.define("custom-video",D),S.CustomVideoElement=D);var Re=D;var c={ENV_KEY:"env-key",DEBUG:"debug",PLAYBACK_ID:"playback-id",METADATA_URL:"metadata-url",PREFER_PLAYBACK:"prefer-playback",PLAYER_SOFTWARE_VERSION:"player-software-version",PLAYER_SOFTWARE_NAME:"player-software-name",BEACON_COLLECTION_DOMAIN:"beacon-collection-domain",CUSTOM_DOMAIN:"custom-domain",DISABLE_COOKIES:"disable-cookies",TYPE:"type",STREAM_TYPE:"stream-type",START_TIME:"start-time",PREFER_CMCD:"prefer-cmcd"},ht=Object.values(c),mt=Ke(),ft="mux-video",M,F,ee,G,te,se,re,ie,Ie,Q=class extends Re{constructor(){super();u(this,ie);u(this,M,void 0);u(this,F,void 0);u(this,ee,void 0);u(this,G,{});u(this,te,void 0);u(this,se,void 0);u(this,re,void 0);l(this,ee,(0,d.generatePlayerInitTime)())}static get observedAttributes(){var e;return[...ht,...(e=Re.observedAttributes)!=null?e:[]]}get preferCmcd(){var e;return(e=this.getAttribute(c.PREFER_CMCD))!=null?e:void 0}set preferCmcd(e){e!==this.preferCmcd&&(e?d.CmcdTypeValues.includes(e)?this.setAttribute(c.PREFER_CMCD,e):console.warn(`Invalid value for preferCmcd. Must be one of ${d.CmcdTypeValues.join()}`):this.removeAttribute(c.PREFER_CMCD))}get playerInitTime(){return r(this,ee)}get playerSoftwareName(){var e;return(e=r(this,se))!=null?e:ft}set playerSoftwareName(e){l(this,se,e)}get playerSoftwareVersion(){var e;return(e=r(this,te))!=null?e:mt}set playerSoftwareVersion(e){l(this,te,e)}get _hls(){var e;return(e=r(this,M))==null?void 0:e.engine}get mux(){return this.nativeEl.mux}get error(){var e;return(e=(0,d.getError)(this.nativeEl))!=null?e:null}get errorTranslator(){return r(this,re)}set errorTranslator(e){l(this,re,e)}get src(){return this.getAttribute("src")}set src(e){e!==this.src&&(e==null?this.removeAttribute("src"):this.setAttribute("src",e))}get type(){var e;return(e=this.getAttribute(c.TYPE))!=null?e:void 0}set type(e){e!==this.type&&(e?this.setAttribute(c.TYPE,e):this.removeAttribute(c.TYPE))}get autoplay(){let e=this.getAttribute("autoplay");return e===null?!1:e===""?!0:e}set autoplay(e){let n=this.autoplay;e!==n&&(e?this.setAttribute("autoplay",typeof e=="string"?e:""):this.removeAttribute("autoplay"))}get preload(){let e=this.getAttribute("preload");return e===""?"auto":["none","metadata","auto"].includes(e)?e:super.preload}set preload(e){e!=this.getAttribute("preload")&&(["","none","metadata","auto"].includes(e)?this.setAttribute("preload",e):this.removeAttribute("preload"))}get debug(){return this.getAttribute(c.DEBUG)!=null}set debug(e){e!==this.debug&&(e?this.setAttribute(c.DEBUG,""):this.removeAttribute(c.DEBUG))}get disableCookies(){return this.hasAttribute(c.DISABLE_COOKIES)}set disableCookies(e){e!==this.disableCookies&&(e?this.setAttribute(c.DISABLE_COOKIES,""):this.removeAttribute(c.DISABLE_COOKIES))}get startTime(){let e=this.getAttribute(c.START_TIME);if(e==null)return;let n=+e;return Number.isNaN(n)?void 0:n}set startTime(e){e!==this.startTime&&(e==null?this.removeAttribute(c.START_TIME):this.setAttribute(c.START_TIME,`${e}`))}get playbackId(){var e;return(e=this.getAttribute(c.PLAYBACK_ID))!=null?e:void 0}set playbackId(e){e!==this.playbackId&&(e?this.setAttribute(c.PLAYBACK_ID,e):this.removeAttribute(c.PLAYBACK_ID))}get customDomain(){var e;return(e=this.getAttribute(c.CUSTOM_DOMAIN))!=null?e:void 0}set customDomain(e){e!==this.customDomain&&(e?this.setAttribute(c.CUSTOM_DOMAIN,e):this.removeAttribute(c.CUSTOM_DOMAIN))}get envKey(){var e;return(e=this.getAttribute(c.ENV_KEY))!=null?e:void 0}set envKey(e){e!==this.envKey&&(e?this.setAttribute(c.ENV_KEY,e):this.removeAttribute(c.ENV_KEY))}get beaconCollectionDomain(){var e;return(e=this.getAttribute(c.BEACON_COLLECTION_DOMAIN))!=null?e:void 0}set beaconCollectionDomain(e){e!==this.beaconCollectionDomain&&(e?this.setAttribute(c.BEACON_COLLECTION_DOMAIN,e):this.removeAttribute(c.BEACON_COLLECTION_DOMAIN))}get streamType(){var e;return(e=this.getAttribute(c.STREAM_TYPE))!=null?e:void 0}set streamType(e){e!==this.streamType&&(e?this.setAttribute(c.STREAM_TYPE,e):this.removeAttribute(c.STREAM_TYPE))}async addCuePoints(e){return(0,d.addCuePoints)(this.nativeEl,e)}get activeCuePoint(){return(0,d.getActiveCuePoint)(this.nativeEl)}get cuePoints(){return(0,d.getCuePoints)(this.nativeEl)}get preferPlayback(){let e=this.getAttribute(c.PREFER_PLAYBACK);if(e===d.PlaybackTypes.MSE||e===d.PlaybackTypes.NATIVE)return e}set preferPlayback(e){e!==this.preferPlayback&&(e===d.PlaybackTypes.MSE||e===d.PlaybackTypes.NATIVE?this.setAttribute(c.PREFER_PLAYBACK,e):this.removeAttribute(c.PREFER_PLAYBACK))}get metadata(){return{...this.getAttributeNames().filter(n=>n.startsWith("metadata-")&&![c.METADATA_URL].includes(n)).reduce((n,o)=>{let E=this.getAttribute(o);return E!=null&&(n[o.replace(/^metadata-/,"").replace(/-/g,"_")]=E),n},{}),...r(this,G)}}set metadata(e){l(this,G,e!=null?e:{}),this.mux&&this.mux.emit("hb",r(this,G))}load(){l(this,M,(0,d.initialize)(this,this.nativeEl,r(this,M)))}unload(){(0,d.teardown)(this.nativeEl,r(this,M)),l(this,M,void 0)}attributeChangedCallback(e,n,o){var E,v;switch(super.attributeChangedCallback(e,n,o),e){case c.PLAYER_SOFTWARE_NAME:this.playerSoftwareName=o!=null?o:void 0;break;case c.PLAYER_SOFTWARE_VERSION:this.playerSoftwareVersion=o!=null?o:void 0;break;case"src":{let p=!!n,pe=!!o;!p&&pe?m(this,ie,Ie).call(this):p&&!pe?this.unload():p&&pe&&(this.unload(),m(this,ie,Ie).call(this));break}case"autoplay":if(o===n)break;(E=r(this,M))==null||E.setAutoplay(this.autoplay);break;case"preload":if(o===n)break;(v=r(this,M))==null||v.setPreload(o);break;case c.PLAYBACK_ID:this.src=(0,d.toMuxVideoURL)(o!=null?o:void 0,{domain:this.customDomain});break;case c.DEBUG:{let p=this.debug;this.mux&&console.info("Cannot toggle debug mode of mux data after initialization. Make sure you set all metadata to override before setting the src."),this._hls&&(this._hls.config.debug=p);break}case c.METADATA_URL:o&&fetch(o).then(p=>p.json()).then(p=>this.metadata=p).catch(()=>console.error(`Unable to load or parse metadata JSON from metadata-url ${o}!`));break;default:break}}disconnectedCallback(){this.unload()}};M=new WeakMap,F=new WeakMap,ee=new WeakMap,G=new WeakMap,te=new WeakMap,se=new WeakMap,re=new WeakMap,ie=new WeakSet,Ie=async function(){r(this,F)||(await l(this,F,Promise.resolve()),l(this,F,null),this.load())};S.customElements.get("mux-video")||(S.customElements.define("mux-video",Q),S.MuxVideoElement=Q);var Et=Q;
22
22
  //# sourceMappingURL=index.cjs.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../../../shared/polyfills/index.js", "../src/env.ts", "../../../shared/castable-video/castable-video.js", "../src/CustomVideoElement.js"],
4
- "sourcesContent": ["import { globalThis } from 'shared-polyfills';\nimport {\n initialize,\n teardown,\n generatePlayerInitTime,\n MuxMediaProps,\n StreamTypes,\n PlaybackTypes,\n ValueOf,\n toMuxVideoURL,\n Metadata,\n MediaError,\n getError,\n CmcdTypes,\n CmcdTypeValues,\n} from '@mux/playback-core';\nimport type { PlaybackCore, PlaybackEngine, Autoplay, ExtensionMimeTypeMap } from '@mux/playback-core';\nimport { getPlayerVersion } from './env';\n// this must be imported after playback-core for the polyfill to be included\nimport CustomVideoElement, { VideoEvents } from './CustomVideoElement';\n\n/** @TODO make the relationship between name+value smarter and more deriveable (CJP) */\ntype AttributeNames = {\n ENV_KEY: 'env-key';\n DEBUG: 'debug';\n METADATA_URL: 'metadata-url';\n PLAYER_SOFTWARE_VERSION: 'player-software-version';\n PLAYER_SOFTWARE_NAME: 'player-software-name';\n BEACON_COLLECTION_DOMAIN: 'beacon-collection-domain';\n CUSTOM_DOMAIN: 'custom-domain';\n DISABLE_COOKIES: 'disable-cookies';\n PLAYBACK_ID: 'playback-id';\n PREFER_PLAYBACK: 'prefer-playback';\n TYPE: 'type';\n STREAM_TYPE: 'stream-type';\n START_TIME: 'start-time';\n PREFER_CMCD: 'prefer-cmcd';\n};\n\nexport const Attributes: AttributeNames = {\n ENV_KEY: 'env-key',\n DEBUG: 'debug',\n PLAYBACK_ID: 'playback-id',\n METADATA_URL: 'metadata-url',\n PREFER_PLAYBACK: 'prefer-playback',\n PLAYER_SOFTWARE_VERSION: 'player-software-version',\n PLAYER_SOFTWARE_NAME: 'player-software-name',\n BEACON_COLLECTION_DOMAIN: 'beacon-collection-domain',\n CUSTOM_DOMAIN: 'custom-domain',\n DISABLE_COOKIES: 'disable-cookies',\n TYPE: 'type',\n STREAM_TYPE: 'stream-type',\n START_TIME: 'start-time',\n PREFER_CMCD: 'prefer-cmcd',\n};\n\nconst AttributeNameValues = Object.values(Attributes);\n\nconst playerSoftwareVersion = getPlayerVersion();\nconst playerSoftwareName = 'mux-video';\n\nclass MuxVideoElement extends CustomVideoElement<HTMLVideoElement> implements Partial<MuxMediaProps> {\n static get observedAttributes() {\n return [...AttributeNameValues, ...(CustomVideoElement.observedAttributes ?? [])];\n }\n\n #core?: PlaybackCore;\n #loadRequested?: Promise<void> | null;\n #playerInitTime: number;\n #metadata: Readonly<Metadata> = {};\n #playerSoftwareVersion?: string;\n #playerSoftwareName?: string;\n #errorTranslator?: (errorEvent: any) => any;\n\n constructor() {\n super();\n this.#playerInitTime = generatePlayerInitTime();\n }\n\n get preferCmcd() {\n return (this.getAttribute(Attributes.PREFER_CMCD) as ValueOf<CmcdTypes>) ?? undefined;\n }\n\n set preferCmcd(value: ValueOf<CmcdTypes> | undefined) {\n if (value === this.preferCmcd) return;\n if (!value) {\n this.removeAttribute(Attributes.PREFER_CMCD);\n } else if (CmcdTypeValues.includes(value)) {\n this.setAttribute(Attributes.PREFER_CMCD, value);\n } else {\n console.warn(`Invalid value for preferCmcd. Must be one of ${CmcdTypeValues.join()}`);\n }\n }\n\n get playerInitTime() {\n return this.#playerInitTime;\n }\n\n get playerSoftwareName() {\n return this.#playerSoftwareName ?? playerSoftwareName;\n }\n\n set playerSoftwareName(value: string | undefined) {\n this.#playerSoftwareName = value;\n }\n\n get playerSoftwareVersion() {\n return this.#playerSoftwareVersion ?? playerSoftwareVersion;\n }\n\n set playerSoftwareVersion(value: string | undefined) {\n this.#playerSoftwareVersion = value;\n }\n\n // Keeping this named \"_hls\" since it's exposed for unadvertised \"advanced usage\" via getter that assumes specifically hls.js (CJP)\n get _hls(): PlaybackEngine | undefined {\n return this.#core?.engine;\n }\n\n get mux(): Readonly<HTMLVideoElement['mux']> | undefined {\n return this.nativeEl.mux;\n }\n\n // @ts-ignore\n get error(): MediaError | null {\n return getError(this.nativeEl) ?? null;\n }\n\n get errorTranslator(): ((errorEvent: any) => any) | undefined {\n return this.#errorTranslator;\n }\n\n set errorTranslator(value: ((errorEvent: any) => any) | undefined) {\n this.#errorTranslator = value;\n }\n\n get src() {\n // Use the attribute value as the source of truth.\n // No need to store it in two places.\n // This avoids needing a to read the attribute initially and update the src.\n return this.getAttribute('src') as string;\n }\n\n set src(val: string) {\n // If being set by attributeChangedCallback,\n // dont' cause an infinite loop\n if (val === this.src) return;\n\n if (val == null) {\n this.removeAttribute('src');\n } else {\n this.setAttribute('src', val);\n }\n }\n\n get type(): ValueOf<ExtensionMimeTypeMap> | undefined {\n return (this.getAttribute(Attributes.TYPE) as ValueOf<ExtensionMimeTypeMap>) ?? undefined;\n }\n\n set type(val: ValueOf<ExtensionMimeTypeMap> | undefined) {\n // dont' cause an infinite loop\n if (val === this.type) return;\n\n if (val) {\n this.setAttribute(Attributes.TYPE, val);\n } else {\n this.removeAttribute(Attributes.TYPE);\n }\n }\n\n /** @ts-ignore */\n get autoplay(): Autoplay {\n const attr = this.getAttribute('autoplay');\n\n if (attr === null) {\n return false;\n } else if (attr === '') {\n return true;\n } else {\n return attr as Autoplay;\n }\n }\n\n /** @ts-ignore */\n set autoplay(val: Autoplay) {\n const currentVal = this.autoplay;\n if (val === currentVal) {\n return;\n }\n\n if (val) {\n this.setAttribute('autoplay', typeof val === 'string' ? val : '');\n } else {\n this.removeAttribute('autoplay');\n }\n }\n\n get preload() {\n const val = this.getAttribute('preload') as HTMLMediaElement['preload'];\n if (val === '') return 'auto';\n if (['none', 'metadata', 'auto'].includes(val)) return val;\n return super.preload;\n }\n\n set preload(val) {\n // don't cause an infinite loop\n // check the attribute because an empty string maps to the `auto` prop\n if (val == this.getAttribute('preload')) return;\n\n if (['', 'none', 'metadata', 'auto'].includes(val)) {\n this.setAttribute('preload', val);\n } else {\n this.removeAttribute('preload');\n }\n }\n\n get debug(): boolean {\n return this.getAttribute(Attributes.DEBUG) != null;\n }\n\n set debug(val: boolean) {\n // dont' cause an infinite loop\n if (val === this.debug) return;\n\n if (val) {\n this.setAttribute(Attributes.DEBUG, '');\n } else {\n this.removeAttribute(Attributes.DEBUG);\n }\n }\n\n get disableCookies(): boolean {\n return this.hasAttribute(Attributes.DISABLE_COOKIES);\n }\n\n set disableCookies(val: boolean) {\n // dont' cause an infinite loop\n if (val === this.disableCookies) return;\n\n if (val) {\n this.setAttribute(Attributes.DISABLE_COOKIES, '');\n } else {\n this.removeAttribute(Attributes.DISABLE_COOKIES);\n }\n }\n\n get startTime(): number | undefined {\n const val = this.getAttribute(Attributes.START_TIME);\n if (val == null) return undefined;\n const num = +val;\n return !Number.isNaN(num) ? num : undefined;\n }\n\n set startTime(val: number | undefined) {\n // dont' cause an infinite loop\n if (val === this.startTime) return;\n\n if (val == null) {\n this.removeAttribute(Attributes.START_TIME);\n } else {\n this.setAttribute(Attributes.START_TIME, `${val}`);\n }\n }\n\n get playbackId(): string | undefined {\n return this.getAttribute(Attributes.PLAYBACK_ID) ?? undefined;\n }\n\n set playbackId(val: string | undefined) {\n // dont' cause an infinite loop\n if (val === this.playbackId) return;\n\n if (val) {\n this.setAttribute(Attributes.PLAYBACK_ID, val);\n } else {\n this.removeAttribute(Attributes.PLAYBACK_ID);\n }\n }\n\n get customDomain() {\n return this.getAttribute(Attributes.CUSTOM_DOMAIN) ?? undefined;\n }\n\n set customDomain(val: string | undefined) {\n // dont' cause an infinite loop\n if (val === this.customDomain) return;\n\n if (val) {\n this.setAttribute(Attributes.CUSTOM_DOMAIN, val);\n } else {\n this.removeAttribute(Attributes.CUSTOM_DOMAIN);\n }\n }\n\n get envKey(): string | undefined {\n return this.getAttribute(Attributes.ENV_KEY) ?? undefined;\n }\n\n set envKey(val: string | undefined) {\n // dont' cause an infinite loop\n if (val === this.envKey) return;\n\n if (val) {\n this.setAttribute(Attributes.ENV_KEY, val);\n } else {\n this.removeAttribute(Attributes.ENV_KEY);\n }\n }\n\n get beaconCollectionDomain(): string | undefined {\n return this.getAttribute(Attributes.BEACON_COLLECTION_DOMAIN) ?? undefined;\n }\n\n set beaconCollectionDomain(val: string | undefined) {\n // don't cause an infinite loop\n if (val === this.beaconCollectionDomain) return;\n\n if (val) {\n this.setAttribute(Attributes.BEACON_COLLECTION_DOMAIN, val);\n } else {\n this.removeAttribute(Attributes.BEACON_COLLECTION_DOMAIN);\n }\n }\n\n get streamType(): ValueOf<StreamTypes> | undefined {\n // getAttribute doesn't know that this attribute is well defined. Should explore extending for MuxVideo (CJP)\n return (this.getAttribute(Attributes.STREAM_TYPE) as ValueOf<StreamTypes>) ?? undefined;\n }\n\n set streamType(val: ValueOf<StreamTypes> | undefined) {\n // dont' cause an infinite loop\n if (val === this.streamType) return;\n\n if (val) {\n this.setAttribute(Attributes.STREAM_TYPE, val);\n } else {\n this.removeAttribute(Attributes.STREAM_TYPE);\n }\n }\n\n get preferPlayback(): ValueOf<PlaybackTypes> | undefined {\n const val = this.getAttribute(Attributes.PREFER_PLAYBACK);\n if (val === PlaybackTypes.MSE || val === PlaybackTypes.NATIVE) return val;\n return undefined;\n }\n\n set preferPlayback(val: ValueOf<PlaybackTypes> | undefined) {\n if (val === this.preferPlayback) return;\n\n if (val === PlaybackTypes.MSE || val === PlaybackTypes.NATIVE) {\n this.setAttribute(Attributes.PREFER_PLAYBACK, val);\n } else {\n this.removeAttribute(Attributes.PREFER_PLAYBACK);\n }\n }\n\n get metadata() {\n const inferredMetadataAttrs: { [key: string]: string } = this.getAttributeNames()\n .filter((attrName) => {\n return attrName.startsWith('metadata-') && !([Attributes.METADATA_URL] as string[]).includes(attrName);\n })\n .reduce((currAttrs, attrName) => {\n const value = this.getAttribute(attrName);\n if (value != null) {\n currAttrs[attrName.replace(/^metadata-/, '').replace(/-/g, '_') as string] = value;\n }\n return currAttrs;\n }, {} as { [key: string]: string });\n\n return {\n ...inferredMetadataAttrs,\n ...this.#metadata,\n };\n }\n\n set metadata(val: Readonly<Metadata> | undefined) {\n this.#metadata = val ?? {};\n if (!!this.mux) {\n this.mux.emit('hb', this.#metadata);\n }\n }\n\n async #requestLoad() {\n if (this.#loadRequested) return;\n await (this.#loadRequested = Promise.resolve());\n this.#loadRequested = null;\n this.load();\n }\n\n load() {\n this.#core = initialize(this as Partial<MuxMediaProps>, this.nativeEl, this.#core);\n }\n\n unload() {\n teardown(this.nativeEl, this.#core);\n this.#core = undefined;\n }\n\n // NOTE: This was carried over from hls-video-element. Is it needed for an edge case?\n // play() {\n // if (this.readyState === 0 && this.networkState < 2) {\n // this.load();\n // this._hls.on(Hls.Events.MANIFEST_PARSED,function() {\n // video.play();\n //\n // return this.nativeEl.play();\n // }\n // }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n\n switch (attrName) {\n case Attributes.PLAYER_SOFTWARE_NAME:\n this.playerSoftwareName = newValue ?? undefined;\n break;\n case Attributes.PLAYER_SOFTWARE_VERSION:\n this.playerSoftwareVersion = newValue ?? undefined;\n break;\n case 'src': {\n const hadSrc = !!oldValue;\n const hasSrc = !!newValue;\n if (!hadSrc && hasSrc) {\n this.#requestLoad();\n } else if (hadSrc && !hasSrc) {\n this.unload();\n /** @TODO Test this thoroughly (async?) and confirm unload() necessary (CJP) */\n } else if (hadSrc && hasSrc) {\n this.unload();\n this.#requestLoad();\n }\n break;\n }\n case 'autoplay':\n if (newValue === oldValue) {\n break;\n }\n /** In case newValue is an empty string or null, use this.autoplay which translates to booleans (WL) */\n this.#core?.setAutoplay(this.autoplay);\n break;\n case 'preload':\n if (newValue === oldValue) {\n break;\n }\n this.#core?.setPreload(newValue as HTMLMediaElement['preload']);\n break;\n case Attributes.PLAYBACK_ID:\n /** @TODO Improv+Discuss - how should playback-id update wrt src attr changes (and vice versa) (CJP) */\n this.src = toMuxVideoURL(newValue ?? undefined, { domain: this.customDomain }) as string;\n break;\n case Attributes.DEBUG: {\n const debug = this.debug;\n if (!!this.mux) {\n /** @TODO Link to docs for a more detailed discussion (CJP) */\n console.info(\n 'Cannot toggle debug mode of mux data after initialization. Make sure you set all metadata to override before setting the src.'\n );\n }\n if (!!this._hls) {\n this._hls.config.debug = debug;\n }\n break;\n }\n case Attributes.METADATA_URL:\n if (newValue) {\n fetch(newValue)\n .then((resp) => resp.json())\n .then((json) => (this.metadata = json))\n .catch((_err) => console.error(`Unable to load or parse metadata JSON from metadata-url ${newValue}!`));\n }\n break;\n default:\n break;\n }\n }\n\n disconnectedCallback() {\n this.unload();\n }\n}\n\ntype MuxVideoElementType = typeof MuxVideoElement;\ndeclare global {\n var MuxVideoElement: MuxVideoElementType; // eslint-disable-line\n}\n\n/** @TODO Refactor once using `globalThis` polyfills */\nif (!globalThis.customElements.get('mux-video')) {\n globalThis.customElements.define('mux-video', MuxVideoElement);\n /** @TODO consider externalizing this (breaks standard modularity) */\n globalThis.MuxVideoElement = MuxVideoElement;\n}\n\nexport { PlaybackEngine, PlaybackEngine as Hls, ExtensionMimeTypeMap as MimeTypes, MediaError, VideoEvents };\n\nexport default MuxVideoElement;\n", "class EventTarget {\n addEventListener() {}\n removeEventListener() {}\n dispatchEvent(_event) {\n return true;\n }\n}\n\n// @github/template-parts requires DocumentFragment to be available on globalThis for SSR\nif (typeof DocumentFragment === 'undefined') {\n class DocumentFragment extends EventTarget {}\n // @ts-ignore\n globalThis.DocumentFragment = DocumentFragment;\n}\n\nclass HTMLElement extends EventTarget {}\nclass HTMLVideoElement extends EventTarget {}\n\nconst customElements = {\n get(_name) {\n return undefined;\n },\n define(_name, _constructor, _options) {},\n upgrade(_root) {},\n whenDefined(_name) {\n return Promise.resolve(HTMLElement);\n },\n};\n\nclass CustomEvent {\n #detail;\n get detail() {\n return this.#detail;\n }\n constructor(typeArg, eventInitDict = {}) {\n // super(typeArg, eventInitDict);\n this.#detail = eventInitDict?.detail;\n }\n initCustomEvent() {}\n}\n\nfunction createElement(_tagName, _options) {\n return new HTMLElement();\n}\n\nconst globalThisShim = {\n document: {\n createElement,\n },\n DocumentFragment,\n customElements,\n CustomEvent,\n EventTarget,\n HTMLElement,\n HTMLVideoElement,\n};\n\nconst isServer = typeof window === 'undefined' || typeof globalThis.customElements === 'undefined';\nconst GlobalThis = isServer ? globalThisShim : globalThis;\nconst Document = isServer ? globalThisShim.document : globalThis.document;\n\nexport { GlobalThis as globalThis, Document as document };\n", "export const isMaybeBrowser = () => typeof window != 'undefined';\n// @ts-ignore\nexport const isMaybeServer = () => typeof global != 'undefined';\n\nconst getEnvPlayerVersion = () => {\n try {\n // @ts-ignore\n return PLAYER_VERSION as string;\n } catch {}\n return 'UNKNOWN';\n};\n\nconst player_version: string = getEnvPlayerVersion();\n\nexport const getPlayerVersion = () => player_version;\n", "/* global globalThis, chrome, cast */\n\n/**\n * CastableVideoMixin\n *\n * Because there can only be one custom built-in (is=\"my-video\") this mixin function\n * provides a way to compose multiple classes to create one custom built-in class.\n * @see https://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/\n *\n * @param {HTMLVideoElement} superclass - HTMLVideoElement or an extended class of it.\n * @return {CastableVideo}\n */\nconst CastableVideoMixin = (superclass) =>\n class CastableVideo extends superclass {\n static observedAttributes = ['cast-src', 'cast-content-type', 'cast-stream-type'];\n static instances = new Set();\n\n static #castElement;\n static get castElement() {\n return CastableVideo.#castElement;\n }\n\n static #castEnabled = false;\n static get castEnabled() {\n return CastableVideo.#castEnabled;\n }\n\n static get castState() {\n return CastableVideo.#castContext?.getCastState();\n }\n\n static async exitCast() {\n // Should the receiver application be stopped or just disconnected.\n const stopCasting = true;\n try {\n await CastableVideo.#castContext.endCurrentSession(stopCasting);\n } catch (err) {\n console.error(err);\n return;\n }\n }\n\n static initCast = () => {\n if (!this.#isChromeCastAvailable) {\n globalThis.__onGCastApiAvailable = () => {\n // The globalThis.__onGCastApiAvailable callback alone is not reliable for\n // the added cast.framework. It's loaded in a separate JS file.\n // http://www.gstatic.com/eureka/clank/101/cast_sender.js\n // http://www.gstatic.com/cast/sdk/libs/sender/1.0/cast_framework.js\n customElements.whenDefined('google-cast-button').then(() => this.#onSdkLoaded(chrome.cast.isAvailable));\n };\n } else if (!this.#isCastFrameworkAvailable) {\n customElements.whenDefined('google-cast-button').then(() => this.#onSdkLoaded(chrome.cast.isAvailable));\n } else {\n this.#onSdkLoaded(chrome.cast.isAvailable);\n }\n };\n\n static #onSdkLoaded = (isAvailable) => {\n if (isAvailable) {\n this.#castEnabled = true;\n\n const { CAST_STATE_CHANGED } = cast.framework.CastContextEventType;\n CastableVideo.#castContext.addEventListener(CAST_STATE_CHANGED, (e) => {\n this.instances.forEach((video) => video.#onCastStateChanged(e));\n });\n\n const { SESSION_STATE_CHANGED } = cast.framework.CastContextEventType;\n CastableVideo.#castContext.addEventListener(SESSION_STATE_CHANGED, (e) => {\n this.instances.forEach((video) => video.#onSessionStateChanged(e));\n });\n\n this.instances.forEach((video) => video.#init());\n }\n };\n\n static get #isChromeCastAvailable() {\n return typeof chrome !== 'undefined' && chrome.cast && chrome.cast.isAvailable;\n }\n\n static get #isCastFrameworkAvailable() {\n return typeof cast !== 'undefined' && cast.framework;\n }\n\n static get #castContext() {\n if (CastableVideo.#isCastFrameworkAvailable) {\n return cast.framework.CastContext.getInstance();\n }\n return undefined;\n }\n\n static get #currentSession() {\n return CastableVideo.#castContext?.getCurrentSession();\n }\n\n static get #currentMedia() {\n return CastableVideo.#currentSession?.getSessionObj().media[0];\n }\n\n static #editTracksInfo(request) {\n return new Promise((resolve, reject) => {\n CastableVideo.#currentMedia.editTracksInfo(request, resolve, reject);\n });\n }\n\n static #getMediaStatus(request) {\n return new Promise((resolve, reject) => {\n CastableVideo.#currentMedia.getStatus(request, resolve, reject);\n });\n }\n\n static #setOptions(options) {\n return CastableVideo.#castContext.setOptions({\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,\n\n // The following flag enables Cast Connect(requires Chrome 87 or higher)\n // https://developers.googleblog.com/2020/08/introducing-cast-connect-android-tv.html\n androidReceiverCompatible: false,\n\n language: 'en-US',\n resumeSavedSession: true,\n\n ...options,\n });\n }\n\n castEnabled = false;\n #localState = { paused: false };\n #remotePlayer;\n #remoteListeners = {};\n #enterCastCallback;\n #leaveCastCallback;\n #castChangeCallback;\n\n constructor() {\n super();\n\n CastableVideo.instances.add(this);\n this.#init();\n }\n\n get castPlayer() {\n if (CastableVideo.castElement === this) return this.#remotePlayer;\n return undefined;\n }\n\n get #isMediaLoaded() {\n return this.castPlayer?.isMediaLoaded;\n }\n\n attributeChangedCallback(attrName) {\n if (!this.castPlayer) return;\n\n switch (attrName) {\n case 'cast-stream-type':\n case 'cast-src':\n this.load();\n break;\n }\n }\n\n #disconnect() {\n if (CastableVideo.#castElement !== this) return;\n\n Object.entries(this.#remoteListeners).forEach(([event, listener]) => {\n this.#remotePlayer.controller.removeEventListener(event, listener);\n });\n\n CastableVideo.#castElement = undefined;\n\n // isMuted is not in savedPlayerState. should we sync this back to local?\n this.muted = this.#remotePlayer.isMuted;\n this.currentTime = this.#remotePlayer.savedPlayerState.currentTime;\n if (this.#remotePlayer.savedPlayerState.isPaused === false) {\n this.play();\n }\n }\n\n #onCastStateChanged() {\n // Cast state: NO_DEVICES_AVAILABLE, NOT_CONNECTED, CONNECTING, CONNECTED\n // https://developers.google.com/cast/docs/reference/web_sender/cast.framework#.CastState\n this.dispatchEvent(\n new CustomEvent('castchange', {\n detail: CastableVideo.#castContext.getCastState(),\n })\n );\n }\n\n async #onSessionStateChanged() {\n // Session states: NO_SESSION, SESSION_STARTING, SESSION_STARTED, SESSION_START_FAILED,\n // SESSION_ENDING, SESSION_ENDED, SESSION_RESUMED\n // https://developers.google.com/cast/docs/reference/web_sender/cast.framework#.SessionState\n\n const { SESSION_RESUMED } = cast.framework.SessionState;\n if (CastableVideo.#castContext.getSessionState() === SESSION_RESUMED) {\n /**\n * Figure out if this was the video that started the resumed session.\n * @TODO make this more specific than just checking against the video src!! (WL)\n *\n * If this video element can get the same unique id on each browser refresh\n * it would be possible to pass this unique id w/ `LoadRequest.customData`\n * and verify against CastableVideo.#currentMedia.customData below.\n */\n if (this.castSrc === CastableVideo.#currentMedia?.media.contentId) {\n CastableVideo.#castElement = this;\n\n Object.entries(this.#remoteListeners).forEach(([event, listener]) => {\n this.#remotePlayer.controller.addEventListener(event, listener);\n });\n\n /**\n * There is cast framework resume session bug when you refresh the page a few\n * times the this.#remotePlayer.currentTime will not be in sync with the receiver :(\n * The below status request syncs it back up.\n */\n try {\n await CastableVideo.#getMediaStatus(new chrome.cast.media.GetStatusRequest());\n } catch (error) {\n console.error(error);\n }\n\n // Dispatch the play, playing events manually to sync remote playing state.\n this.#remoteListeners[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED]();\n this.#remoteListeners[cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]();\n }\n }\n }\n\n #init() {\n if (!CastableVideo.#isCastFrameworkAvailable || this.castEnabled) return;\n this.castEnabled = true;\n CastableVideo.#setOptions();\n\n /**\n * @TODO add listeners for addtrack, removetrack (WL)\n * This only has an impact on <track> with a `src` because these have to be\n * loaded manually in the load() method. This will require a new load() call\n * for each added/removed track w/ src.\n */\n this.textTracks.addEventListener('change', this.#updateRemoteTextTrack.bind(this));\n\n this.#onCastStateChanged();\n\n this.#remotePlayer = new cast.framework.RemotePlayer();\n new cast.framework.RemotePlayerController(this.#remotePlayer);\n\n this.#remoteListeners = {\n [cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED]: ({ value }) => {\n if (value === false) {\n this.#disconnect();\n }\n this.dispatchEvent(new Event(value ? 'entercast' : 'leavecast'));\n },\n [cast.framework.RemotePlayerEventType.DURATION_CHANGED]: () => {\n this.dispatchEvent(new Event('durationchange'));\n },\n [cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED]: () => {\n this.dispatchEvent(new Event('volumechange'));\n },\n [cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED]: () => {\n this.dispatchEvent(new Event('volumechange'));\n },\n [cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED]: () => {\n if (!this.#isMediaLoaded) return;\n this.dispatchEvent(new Event('timeupdate'));\n },\n [cast.framework.RemotePlayerEventType.VIDEO_INFO_CHANGED]: () => {\n this.dispatchEvent(new Event('resize'));\n },\n [cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED]: () => {\n this.dispatchEvent(new Event(this.paused ? 'pause' : 'play'));\n },\n [cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]: () => {\n // Player states: IDLE, PLAYING, PAUSED, BUFFERING\n // https://developers.google.com/cast/docs/reference/web_sender/chrome.cast.media#.PlayerState\n\n // pause event is handled above.\n if (this.castPlayer?.playerState === chrome.cast.media.PlayerState.PAUSED) {\n return;\n }\n this.dispatchEvent(\n new Event(\n {\n [chrome.cast.media.PlayerState.PLAYING]: 'playing',\n [chrome.cast.media.PlayerState.BUFFERING]: 'waiting',\n [chrome.cast.media.PlayerState.IDLE]: 'emptied',\n }[this.castPlayer?.playerState]\n )\n );\n },\n [cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED]: async () => {\n if (!this.#isMediaLoaded) return;\n\n // mediaInfo is not immediately available due to a bug? wait one tick\n await Promise.resolve();\n this.#onRemoteMediaLoaded();\n },\n };\n }\n\n async requestCast(options = {}) {\n CastableVideo.#setOptions(options);\n CastableVideo.#castElement = this;\n\n Object.entries(this.#remoteListeners).forEach(([event, listener]) => {\n this.#remotePlayer.controller.addEventListener(event, listener);\n });\n\n try {\n // Open browser cast menu.\n await CastableVideo.#castContext.requestSession();\n } catch (err) {\n CastableVideo.#castElement = undefined;\n // console.error(err); // Don't show an error if dismissing the menu.\n return;\n }\n\n // Pause locally when the session is created.\n this.#localState.paused = super.paused;\n super.pause();\n\n // Sync over the muted state but not volume, 100% is different on TV's :P\n this.muted = super.muted;\n\n try {\n await this.load();\n } catch (err) {\n console.error(err);\n }\n }\n\n async load() {\n if (!this.castPlayer) return super.load();\n\n const mediaInfo = new chrome.cast.media.MediaInfo(this.castSrc, this.castContentType);\n\n // Manually add text tracks with a `src` attribute.\n // M3U8's load text tracks in the receiver, handle these in the media loaded event.\n const subtitles = [...this.querySelectorAll('track')].filter(({ kind, src }) => {\n return src && (kind === 'subtitles' || kind === 'captions');\n });\n\n const activeTrackIds = [];\n let textTrackIdCount = 0;\n\n if (subtitles.length) {\n mediaInfo.tracks = subtitles.map((trackEl) => {\n const trackId = ++textTrackIdCount;\n // only activate 1 subtitle text track.\n if (activeTrackIds.length === 0 && trackEl.track.mode === 'showing') {\n activeTrackIds.push(trackId);\n }\n\n const track = new chrome.cast.media.Track(trackId, chrome.cast.media.TrackType.TEXT);\n track.trackContentId = trackEl.src;\n track.trackContentType = 'text/vtt';\n track.subtype =\n trackEl.kind === 'captions'\n ? chrome.cast.media.TextTrackType.CAPTIONS\n : chrome.cast.media.TextTrackType.SUBTITLES;\n track.name = trackEl.label;\n track.language = trackEl.srclang;\n return track;\n });\n }\n\n if (this.castStreamType === 'live') {\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n } else {\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n }\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.title = this.title;\n mediaInfo.metadata.images = [\n {\n url: this.poster,\n },\n ];\n\n const request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = super.currentTime ?? 0;\n request.autoplay = !this.#localState.paused;\n request.activeTrackIds = activeTrackIds;\n\n await CastableVideo.#currentSession?.loadMedia(request);\n\n this.dispatchEvent(new Event('volumechange'));\n }\n\n #onRemoteMediaLoaded() {\n this.#updateRemoteTextTrack();\n }\n\n async #updateRemoteTextTrack() {\n if (!this.castPlayer) return;\n\n // Get the tracks w/ trackId's that have been loaded; manually or via a playlist like a M3U8 or MPD.\n const remoteTracks = this.#remotePlayer.mediaInfo?.tracks ?? [];\n const remoteSubtitles = remoteTracks.filter(({ type }) => type === chrome.cast.media.TrackType.TEXT);\n\n const localSubtitles = [...this.textTracks].filter(({ kind }) => kind === 'subtitles' || kind === 'captions');\n\n // Create a new array from the local subs w/ the trackId's from the remote subs.\n const subtitles = remoteSubtitles\n .map(({ language, name, trackId }) => {\n // Find the corresponding local text track and assign the trackId.\n const { mode } = localSubtitles.find((local) => local.language === language && local.label === name) ?? {};\n if (mode) return { mode, trackId };\n return false;\n })\n .filter(Boolean);\n\n const hiddenSubtitles = subtitles.filter(({ mode }) => mode !== 'showing');\n const hiddenTrackIds = hiddenSubtitles.map(({ trackId }) => trackId);\n const showingSubtitle = subtitles.find(({ mode }) => mode === 'showing');\n\n // Note this could also include audio or video tracks, diff against local state.\n const activeTrackIds = CastableVideo.#currentSession?.getSessionObj().media[0]?.activeTrackIds ?? [];\n let requestTrackIds = activeTrackIds;\n\n if (activeTrackIds.length) {\n // Filter out all local hidden subtitle trackId's.\n requestTrackIds = requestTrackIds.filter((id) => !hiddenTrackIds.includes(id));\n }\n\n if (showingSubtitle?.trackId) {\n requestTrackIds = [...requestTrackIds, showingSubtitle.trackId];\n }\n\n // Remove duplicate ids.\n requestTrackIds = [...new Set(requestTrackIds)];\n\n const arrayEquals = (a, b) => a.length === b.length && a.every((a) => b.includes(a));\n if (!arrayEquals(activeTrackIds, requestTrackIds)) {\n try {\n const request = new chrome.cast.media.EditTracksInfoRequest(requestTrackIds);\n await CastableVideo.#editTracksInfo(request);\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n play() {\n if (this.castPlayer) {\n if (this.castPlayer.isPaused) {\n this.castPlayer.controller?.playOrPause();\n }\n return;\n }\n return super.play();\n }\n\n pause() {\n if (this.castPlayer) {\n if (!this.castPlayer.isPaused) {\n this.castPlayer.controller?.playOrPause();\n }\n return;\n }\n super.pause();\n }\n\n // Allow the cast source url to be different than <video src>, could be a blob.\n get castSrc() {\n // Try the first <source src> for usage with even more native markup.\n return this.getAttribute('cast-src') ?? this.querySelector('source')?.src ?? this.currentSrc;\n }\n\n set castSrc(val) {\n if (this.castSrc == val) return;\n this.setAttribute('cast-src', `${val}`);\n }\n\n get castContentType() {\n return this.getAttribute('cast-content-type') ?? undefined;\n }\n\n set castContentType(val) {\n this.setAttribute('cast-content-type', `${val}`);\n }\n\n get castStreamType() {\n return this.getAttribute('cast-stream-type') ?? undefined;\n }\n\n set castStreamType(val) {\n this.setAttribute('cast-stream-type', `${val}`);\n }\n\n get readyState() {\n if (this.castPlayer) {\n switch (this.castPlayer.playerState) {\n case chrome.cast.media.PlayerState.IDLE:\n return 0;\n case chrome.cast.media.PlayerState.BUFFERING:\n return 2;\n default:\n return 3;\n }\n }\n return super.readyState;\n }\n\n get paused() {\n if (this.castPlayer) return this.castPlayer.isPaused;\n return super.paused;\n }\n\n get muted() {\n if (this.castPlayer) return this.castPlayer?.isMuted;\n return super.muted;\n }\n\n set muted(val) {\n if (this.castPlayer) {\n if ((val && !this.castPlayer.isMuted) || (!val && this.castPlayer.isMuted)) {\n this.castPlayer.controller?.muteOrUnmute();\n }\n return;\n }\n super.muted = val;\n }\n\n get volume() {\n if (this.castPlayer) return this.castPlayer?.volumeLevel ?? 1;\n return super.volume;\n }\n\n set volume(val) {\n if (this.castPlayer) {\n this.castPlayer.volumeLevel = val;\n this.castPlayer.controller?.setVolumeLevel();\n return;\n }\n super.volume = val;\n }\n\n get duration() {\n // castPlayer duration returns `0` when no media is loaded.\n if (this.castPlayer && this.#isMediaLoaded) {\n return this.castPlayer?.duration ?? NaN;\n }\n return super.duration;\n }\n\n get currentTime() {\n if (this.castPlayer && this.#isMediaLoaded) {\n return this.castPlayer?.currentTime ?? 0;\n }\n return super.currentTime;\n }\n\n set currentTime(val) {\n if (this.castPlayer) {\n this.castPlayer.currentTime = val;\n this.castPlayer.controller?.seek();\n return;\n }\n super.currentTime = val;\n }\n\n get onentercast() {\n return this.#enterCastCallback;\n }\n\n set onentercast(callback) {\n if (this.#enterCastCallback) {\n this.removeEventListener('entercast', this.#enterCastCallback);\n this.#enterCastCallback = null;\n }\n if (typeof callback == 'function') {\n this.#enterCastCallback = callback;\n this.addEventListener('entercast', callback);\n }\n }\n\n get onleavecast() {\n return this.#leaveCastCallback;\n }\n\n set onleavecast(callback) {\n if (this.#leaveCastCallback) {\n this.removeEventListener('leavecast', this.#leaveCastCallback);\n this.#leaveCastCallback = null;\n }\n if (typeof callback == 'function') {\n this.#leaveCastCallback = callback;\n this.addEventListener('leavecast', callback);\n }\n }\n\n get oncastchange() {\n return this.#castChangeCallback;\n }\n\n set oncastchange(callback) {\n if (this.#castChangeCallback) {\n this.removeEventListener('castchange', this.#castChangeCallback);\n this.#castChangeCallback = null;\n }\n if (typeof callback == 'function') {\n this.#castChangeCallback = callback;\n this.addEventListener('castchange', callback);\n }\n }\n };\n\nif (globalThis.HTMLVideoElement && globalThis.customElements) {\n const CastableVideoElement = CastableVideoMixin(HTMLVideoElement);\n\n if (!globalThis.customElements.get('castable-video')) {\n globalThis.customElements.define('castable-video', CastableVideoElement, {\n extends: 'video',\n });\n globalThis.CastableVideoElement = CastableVideoElement;\n }\n\n CastableVideoElement.initCast();\n}\n", "import { globalThis, document } from 'shared-polyfills';\nimport 'castable-video';\n\n/**\n * Custom Video Element\n * The goal is to create an element that works just like the video element\n * but can be extended/sub-classed, because native elements cannot be\n * extended today across browsers.\n */\n\n// The onevent like props are weirdly set on the HTMLElement prototype with other\n// generic events making it impossible to pick these specific to HTMLMediaElement.\nexport const VideoEvents = [\n 'abort',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'emptied',\n 'encrypted',\n 'ended',\n 'error',\n 'loadeddata',\n 'loadedmetadata',\n 'loadstart',\n 'pause',\n 'play',\n 'playing',\n 'progress',\n 'ratechange',\n 'seeked',\n 'seeking',\n 'stalled',\n 'suspend',\n 'timeupdate',\n 'volumechange',\n 'waiting',\n 'waitingforkey',\n 'resize',\n 'enterpictureinpicture',\n 'leavepictureinpicture',\n 'castchange',\n 'entercast',\n 'leavecast',\n];\n\nconst template = document.createElement('template');\n// Could you get styles to apply by passing a global button from global to shadow?\n\ntemplate.innerHTML = `\n<style>\n :host {\n display: inline-block;\n line-height: 0;\n width: auto;\n height: auto;\n }\n\n video {\n max-width: 100%;\n max-height: 100%;\n min-width: 100%;\n min-height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, 50% 50%);\n }\n</style>\n<video is=\"castable-video\" part=\"video\" crossorigin></video>\n<slot></slot>\n`;\n\nclass CustomVideoElement extends globalThis.HTMLElement {\n #isInit;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n\n // If the custom element is defined before the <custom-video> HTML is parsed\n // no attributes will be available in the constructor (construction process).\n // Wait until initializing attributes in the attributeChangedCallback.\n // If this element is connected to the DOM, the attributes will be available.\n if (this.isConnected) {\n this.#init();\n }\n }\n\n #init() {\n if (this.#isInit) return;\n this.#isInit = true;\n\n this.shadowRoot.append(template.content.cloneNode(true));\n this.nativeEl = this.shadowRoot.querySelector('video');\n\n // The video events are dispatched on the CustomVideoElement instance.\n // This makes it possible to add event listeners before the element is upgraded.\n VideoEvents.forEach((type) => {\n this.nativeEl.addEventListener(type, (evt) => {\n this.dispatchEvent(new CustomEvent(evt.type, { detail: evt.detail }));\n });\n });\n\n // An unnamed <slot> will be filled with all of the custom element's\n // top-level child nodes that do not have the slot attribute.\n const slotEl = this.shadowRoot.querySelector('slot');\n slotEl.addEventListener('slotchange', () => {\n slotEl.assignedElements().forEach((el) => {\n if (!['track', 'source'].includes(el.localName)) return;\n this.nativeEl.append(el);\n });\n });\n\n // Initialize all the attribute properties\n // This is required before attributeChangedCallback is called after construction\n // so the initial state of all the attributes are forwarded to the native element.\n // Don't call attributeChangedCallback directly here because the extending class\n // could have overridden attributeChangedCallback leading to unexpected results.\n Array.prototype.forEach.call(this.attributes, (attrNode) => {\n this.#forwardAttribute(attrNode.name, null, attrNode.value);\n });\n\n // Neither Chrome or Firefox support setting the muted attribute\n // after using document.createElement.\n // One way to get around this would be to build the native tag as a string.\n // But just fixing it manually for now.\n // Apparently this may also be an issue with <input checked> for buttons\n if (this.nativeEl.defaultMuted) {\n this.nativeEl.muted = true;\n }\n }\n\n // observedAttributes is required to trigger attributeChangedCallback\n // for any attributes on the custom element.\n // Attributes need to be the lowercase word, e.g. crossorigin, not crossOrigin\n static get observedAttributes() {\n let attrs = [];\n\n const kebabCase = (name) => {\n return name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n };\n\n // Instead of manually creating a list of all observed attributes, observe\n // any getter/setter prop name (lowercase or kebab-case for custom builtins)\n Object.getOwnPropertyNames(this.prototype).forEach((propName) => {\n let isFunc = false;\n\n // Non-func properties throw errors because it's not an instance\n try {\n if (typeof this.prototype[propName] === 'function') {\n isFunc = true;\n }\n } catch (e) {}\n\n // Exclude functions and constants\n if (!isFunc && propName !== propName.toUpperCase()) {\n attrs.push(propName.toLowerCase(), kebabCase(propName));\n }\n });\n\n // Include any attributes from the super class (recursive)\n const supAttrs = Object.getPrototypeOf(this).observedAttributes;\n\n if (supAttrs) {\n attrs = attrs.concat(supAttrs);\n }\n\n return attrs;\n }\n\n attributeChangedCallback(attrName, oldValue, newValue) {\n // Initialize right after construction when the attributes become available.\n this.#init();\n\n this.#forwardAttribute(attrName, oldValue, newValue);\n }\n\n // We need to handle sub-class custom attributes differently from\n // attrs meant to be passed to the internal native el.\n #forwardAttribute(attrName, oldValue, newValue) {\n // Find the matching prop for custom attributes\n const ownProps = Object.getOwnPropertyNames(Object.getPrototypeOf(this));\n const propName = arrayFindAnyCase(ownProps, attrName);\n\n // Check if this is the original custom native elemnt or a subclass\n const isBaseElement = Object.getPrototypeOf(this.constructor).toString().indexOf('function HTMLElement') === 0;\n\n // If this is a subclass custom attribute we want to set the\n // matching property on the subclass\n if (propName && !isBaseElement) {\n // Boolean props should never start as null\n if (typeof this[propName] == 'boolean') {\n // null is returned when attributes are removed i.e. boolean attrs\n if (newValue === null) {\n this[propName] = false;\n } else {\n // The new value might be an empty string, which is still true\n // for boolean attributes\n this[propName] = true;\n }\n } else {\n this[propName] = newValue;\n }\n } else {\n // When this is the original Custom Element, or the subclass doesn't\n // have a matching prop, pass it through.\n if (newValue === null) {\n this.nativeEl.removeAttribute(attrName);\n } else {\n // Ignore a few that don't need to be passed through just in case\n // it creates unexpected behavior.\n if (['id', 'class'].indexOf(attrName) === -1) {\n this.nativeEl.setAttribute(attrName, newValue);\n }\n }\n }\n }\n\n connectedCallback() {\n this.#init();\n }\n}\n\n// Map all native element properties to the custom element\n// so that they're applied to the native element.\n// Skipping HTMLElement because of things like \"attachShadow\"\n// causing issues. Most of those props still need to apply to\n// the custom element.\nlet nativeElProps = [];\n\n// Can't check typeof directly on element prototypes without\n// throwing Illegal Invocation errors, so creating an element\n// to check on instead.\nconst nativeElTest = document.createElement('video', {\n is: 'castable-video',\n});\n\n// Deprecated props throw warnings if used, so exclude them\nconst deprecatedProps = ['webkitDisplayingFullscreen', 'webkitSupportsFullscreen'];\n\n// Walk the prototype chain up to HTMLElement.\n// This will grab all super class props in between.\n// i.e. VideoElement and MediaElement\nfor (\n let proto = Object.getPrototypeOf(nativeElTest);\n proto && proto !== globalThis.HTMLElement.prototype;\n proto = Object.getPrototypeOf(proto)\n) {\n Object.getOwnPropertyNames(proto).forEach((key) => {\n if (deprecatedProps.indexOf(key) === -1) {\n nativeElProps.push(key);\n }\n });\n}\n\n// Passthrough native el functions from the custom el to the native el\nnativeElProps.forEach((prop) => {\n if (prop in CustomVideoElement.prototype) return;\n\n const type = typeof nativeElTest[prop];\n if (type == 'function') {\n // Function\n CustomVideoElement.prototype[prop] = function () {\n return this.nativeEl[prop].apply(this.nativeEl, arguments);\n };\n } else {\n // Getter\n let config = {\n get() {\n return this.nativeEl[prop];\n },\n };\n\n if (prop !== prop.toUpperCase()) {\n // Setter (not a CONSTANT)\n config.set = function (val) {\n this.nativeEl[prop] = val;\n };\n }\n\n Object.defineProperty(CustomVideoElement.prototype, prop, config);\n }\n});\n\nfunction arrayFindAnyCase(arr, word) {\n let found = null;\n\n arr.forEach((item) => {\n if (item.toLowerCase() == word.toLowerCase()) {\n found = item;\n }\n });\n\n return found;\n}\n\nif (!globalThis.customElements.get('custom-video')) {\n globalThis.customElements.define('custom-video', CustomVideoElement);\n globalThis.CustomVideoElement = CustomVideoElement;\n}\n\nexport default CustomVideoElement;\n"],
5
- "mappings": "28BAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,gBAAAE,EAAA,4CAAAC,GAAA,YAAAC,KAAA,eAAAC,GAAAL,ICAA,IAAMM,EAAN,KAAkB,CAChB,kBAAmB,CAAC,CACpB,qBAAsB,CAAC,CACvB,cAAcC,EAAQ,CACpB,MAAO,EACT,CACF,EAGA,GAAI,OAAO,kBAAqB,YAAa,CAC3C,MAAMC,UAAyBF,CAAY,CAAC,CAE5C,WAAW,iBAAmBE,CAChC,CAEA,IAAMC,EAAN,cAA0BH,CAAY,CAAC,EACjCI,GAAN,cAA+BJ,CAAY,CAAC,EAEtCK,GAAiB,CACrB,IAAIC,EAAO,CAEX,EACA,OAAOA,EAAOC,EAAcC,EAAU,CAAC,EACvC,QAAQC,EAAO,CAAC,EAChB,YAAYH,EAAO,CACjB,OAAO,QAAQ,QAAQH,CAAW,CACpC,CACF,EA3BAO,EA6BMC,GAAN,KAAkB,CAKhB,YAAYC,EAASC,EAAgB,CAAC,EAAG,CAJzCC,EAAA,KAAAJ,EAAA,QAMEK,EAAA,KAAKL,EAAUG,GAAA,YAAAA,EAAe,OAChC,CANA,IAAI,QAAS,CACX,OAAOG,EAAA,KAAKN,EACd,CAKA,iBAAkB,CAAC,CACrB,EATEA,EAAA,YAWF,SAASO,GAAcC,EAAUV,EAAU,CACzC,OAAO,IAAIL,CACb,CAEA,IAAMgB,GAAiB,CACrB,SAAU,CACR,cAAAF,EACF,EACA,iBACA,eAAAZ,GACA,YAAAM,GACA,YAAAX,EACA,YAAAG,EACA,iBAAAC,EACF,EAEMgB,GAAW,OAAO,QAAW,aAAe,OAAO,WAAW,gBAAmB,YACjFC,EAAaD,GAAWD,GAAiB,WACzCG,GAAWF,GAAWD,GAAe,SAAW,WAAW,SD1DjE,IAAAI,EAcO,8BEXP,IAAMC,GAAsB,IAAM,CAChC,GAAI,CAEF,MAAO,QACT,MAAE,CAAO,CACT,MAAO,SACT,EAEMC,GAAyBD,GAAoB,EAEtCE,GAAmB,IAAMD,GCFtC,IAAME,GAAsBC,GAAY,CAZxC,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,EAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,EAAAC,GAAAC,GAAAC,GAAAC,EAAAC,GAAAC,GAAAC,GAAAC,EAAAC,GAaE,OAAAvC,EAAA,cAA4BD,CAAW,CAkIrC,aAAc,CACZ,MAAM,EAWRyC,EAAA,KAAId,GAeJc,EAAA,KAAAZ,IAiBAY,EAAA,KAAAV,GAUAU,EAAA,KAAMR,IAwCNQ,EAAA,KAAAN,GAkKAM,EAAA,KAAAJ,IAIAI,EAAA,KAAMF,GA5QNG,EAAA,mBAAc,IACdD,EAAA,KAAApB,EAAc,CAAE,OAAQ,EAAM,GAC9BoB,EAAA,KAAAnB,EAAA,QACAmB,EAAA,KAAAlB,EAAmB,CAAC,GACpBkB,EAAA,KAAAjB,EAAA,QACAiB,EAAA,KAAAhB,EAAA,QACAgB,EAAA,KAAAf,EAAA,QAKEzB,EAAc,UAAU,IAAI,IAAI,EAChC0C,EAAA,KAAKR,EAAAC,IAAL,UACF,CAlIA,WAAW,aAAc,CACvB,OAAOQ,EAAA3C,EAAcC,EACvB,CAGA,WAAW,aAAc,CACvB,OAAO0C,EAAA3C,EAAcE,EACvB,CAEA,WAAW,WAAY,CA3B3B,IAAAF,EA4BM,OAAOA,EAAA2C,EAAA3C,EAAcQ,EAAAC,KAAd,YAAAT,EAA4B,cACrC,CAEA,aAAa,UAAW,CAGtB,GAAI,CACF,MAAM2C,EAAA3C,EAAcQ,EAAAC,GAAa,kBAAkB,EAAW,CAChE,OAASmC,EAAP,CACA,QAAQ,MAAMA,CAAG,EACjB,MACF,CACF,CA8GA,IAAI,YAAa,CACf,GAAI5C,EAAc,cAAgB,KAAM,OAAO2C,EAAA,KAAKtB,EAEtD,CAMA,yBAAyBwB,EAAU,CACjC,GAAI,EAAC,KAAK,WAEV,OAAQA,OACD,uBACA,WACH,KAAK,KAAK,EACV,MAEN,CA6IA,MAAM,YAAYC,EAAU,CAAC,EAAG,CArTpC,IAAA9C,EAsTM0C,EAAA1C,IAAckB,EAAAC,IAAd,KAAAnB,EAA0B8C,GAC1BC,EAAA/C,EAAcC,EAAe,MAE7B,OAAO,QAAQ0C,EAAA,KAAKrB,EAAgB,EAAE,QAAQ,CAAC,CAAC0B,EAAOC,CAAQ,IAAM,CACnEN,EAAA,KAAKtB,GAAc,WAAW,iBAAiB2B,EAAOC,CAAQ,CAChE,CAAC,EAED,GAAI,CAEF,MAAMN,EAAA3C,EAAcQ,EAAAC,GAAa,eAAe,CAClD,MAAE,CACAsC,EAAA/C,EAAcC,EAAe,QAE7B,MACF,CAGA0C,EAAA,KAAKvB,GAAY,OAAS,MAAM,OAChC,MAAM,MAAM,EAGZ,KAAK,MAAQ,MAAM,MAEnB,GAAI,CACF,MAAM,KAAK,KAAK,CAClB,OAASwB,EAAP,CACA,QAAQ,MAAMA,CAAG,CACnB,CACF,CAEA,MAAM,MAAO,CApVjB,IAAA5C,EAAAkD,EAqVM,GAAI,CAAC,KAAK,WAAY,OAAO,MAAM,KAAK,EAExC,IAAMC,EAAY,IAAI,OAAO,KAAK,MAAM,UAAU,KAAK,QAAS,KAAK,eAAe,EAI9EC,EAAY,CAAC,GAAG,KAAK,iBAAiB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAE,KAAAC,EAAM,IAAAC,CAAI,IACjEA,IAAQD,IAAS,aAAeA,IAAS,WACjD,EAEKE,EAAiB,CAAC,EACpBC,EAAmB,EAEnBJ,EAAU,SACZD,EAAU,OAASC,EAAU,IAAKK,GAAY,CAC5C,IAAMC,EAAU,EAAEF,EAEdD,EAAe,SAAW,GAAKE,EAAQ,MAAM,OAAS,WACxDF,EAAe,KAAKG,CAAO,EAG7B,IAAMC,EAAQ,IAAI,OAAO,KAAK,MAAM,MAAMD,EAAS,OAAO,KAAK,MAAM,UAAU,IAAI,EACnF,OAAAC,EAAM,eAAiBF,EAAQ,IAC/BE,EAAM,iBAAmB,WACzBA,EAAM,QACJF,EAAQ,OAAS,WACb,OAAO,KAAK,MAAM,cAAc,SAChC,OAAO,KAAK,MAAM,cAAc,UACtCE,EAAM,KAAOF,EAAQ,MACrBE,EAAM,SAAWF,EAAQ,QAClBE,CACT,CAAC,GAGC,KAAK,iBAAmB,OAC1BR,EAAU,WAAa,OAAO,KAAK,MAAM,WAAW,KAEpDA,EAAU,WAAa,OAAO,KAAK,MAAM,WAAW,SAGtDA,EAAU,SAAW,IAAI,OAAO,KAAK,MAAM,qBAC3CA,EAAU,SAAS,MAAQ,KAAK,MAChCA,EAAU,SAAS,OAAS,CAC1B,CACE,IAAK,KAAK,MACZ,CACF,EAEA,IAAMS,EAAU,IAAI,OAAO,KAAK,MAAM,YAAYT,CAAS,EAC3DS,EAAQ,aAAc5D,EAAA,MAAM,cAAN,KAAAA,EAAqB,EAC3C4D,EAAQ,SAAW,CAACjB,EAAA,KAAKvB,GAAY,OACrCwC,EAAQ,eAAiBL,EAEzB,OAAML,EAAAP,EAAA3C,EAAcU,EAAAC,MAAd,YAAAuC,EAA+B,UAAUU,IAE/C,KAAK,cAAc,IAAI,MAAM,cAAc,CAAC,CAC9C,CAwDA,MAAO,CArcX,IAAA5D,EAscM,GAAI,KAAK,WAAY,CACf,KAAK,WAAW,YAClBA,EAAA,KAAK,WAAW,aAAhB,MAAAA,EAA4B,eAE9B,MACF,CACA,OAAO,MAAM,KAAK,CACpB,CAEA,OAAQ,CA/cZ,IAAAA,EAgdM,GAAI,KAAK,WAAY,CACd,KAAK,WAAW,WACnBA,EAAA,KAAK,WAAW,aAAhB,MAAAA,EAA4B,cAE9B,MACF,CACA,MAAM,MAAM,CACd,CAGA,IAAI,SAAU,CA1dlB,IAAAA,EAAAkD,EAAAW,EA4dM,OAAOA,GAAAX,EAAA,KAAK,aAAa,UAAU,IAA5B,KAAAA,GAAiClD,EAAA,KAAK,cAAc,QAAQ,IAA3B,YAAAA,EAA8B,MAA/D,KAAA6D,EAAsE,KAAK,UACpF,CAEA,IAAI,QAAQC,EAAK,CACX,KAAK,SAAWA,GACpB,KAAK,aAAa,WAAY,GAAGA,GAAK,CACxC,CAEA,IAAI,iBAAkB,CApe1B,IAAA9D,EAqeM,OAAOA,EAAA,KAAK,aAAa,mBAAmB,IAArC,KAAAA,EAA0C,MACnD,CAEA,IAAI,gBAAgB8D,EAAK,CACvB,KAAK,aAAa,oBAAqB,GAAGA,GAAK,CACjD,CAEA,IAAI,gBAAiB,CA5ezB,IAAA9D,EA6eM,OAAOA,EAAA,KAAK,aAAa,kBAAkB,IAApC,KAAAA,EAAyC,MAClD,CAEA,IAAI,eAAe8D,EAAK,CACtB,KAAK,aAAa,mBAAoB,GAAGA,GAAK,CAChD,CAEA,IAAI,YAAa,CACf,GAAI,KAAK,WACP,OAAQ,KAAK,WAAW,kBACjB,OAAO,KAAK,MAAM,YAAY,KACjC,MAAO,QACJ,OAAO,KAAK,MAAM,YAAY,UACjC,MAAO,WAEP,MAAO,GAGb,OAAO,MAAM,UACf,CAEA,IAAI,QAAS,CACX,OAAI,KAAK,WAAmB,KAAK,WAAW,SACrC,MAAM,MACf,CAEA,IAAI,OAAQ,CAvgBhB,IAAA9D,EAwgBM,OAAI,KAAK,YAAmBA,EAAA,KAAK,aAAL,YAAAA,EAAiB,QACtC,MAAM,KACf,CAEA,IAAI,MAAM8D,EAAK,CA5gBnB,IAAA9D,EA6gBM,GAAI,KAAK,WAAY,EACd8D,GAAO,CAAC,KAAK,WAAW,SAAa,CAACA,GAAO,KAAK,WAAW,YAChE9D,EAAA,KAAK,WAAW,aAAhB,MAAAA,EAA4B,gBAE9B,MACF,CACA,MAAM,MAAQ8D,CAChB,CAEA,IAAI,QAAS,CAthBjB,IAAA9D,EAAAkD,EAuhBM,OAAI,KAAK,YAAmBA,GAAAlD,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAjB,KAAAkD,EAAgC,EACrD,MAAM,MACf,CAEA,IAAI,OAAOY,EAAK,CA3hBpB,IAAA9D,EA4hBM,GAAI,KAAK,WAAY,CACnB,KAAK,WAAW,YAAc8D,GAC9B9D,EAAA,KAAK,WAAW,aAAhB,MAAAA,EAA4B,iBAC5B,MACF,CACA,MAAM,OAAS8D,CACjB,CAEA,IAAI,UAAW,CApiBnB,IAAA9D,EAAAkD,EAsiBM,OAAI,KAAK,YAAcP,EAAA,KAAKjB,EAAAC,IACnBuB,GAAAlD,EAAA,KAAK,aAAL,YAAAA,EAAiB,WAAjB,KAAAkD,EAA6B,IAE/B,MAAM,QACf,CAEA,IAAI,aAAc,CA5iBtB,IAAAlD,EAAAkD,EA6iBM,OAAI,KAAK,YAAcP,EAAA,KAAKjB,EAAAC,IACnBuB,GAAAlD,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAjB,KAAAkD,EAAgC,EAElC,MAAM,WACf,CAEA,IAAI,YAAYY,EAAK,CAnjBzB,IAAA9D,EAojBM,GAAI,KAAK,WAAY,CACnB,KAAK,WAAW,YAAc8D,GAC9B9D,EAAA,KAAK,WAAW,aAAhB,MAAAA,EAA4B,OAC5B,MACF,CACA,MAAM,YAAc8D,CACtB,CAEA,IAAI,aAAc,CAChB,OAAOnB,EAAA,KAAKpB,EACd,CAEA,IAAI,YAAYwC,EAAU,CACpBpB,EAAA,KAAKpB,KACP,KAAK,oBAAoB,YAAaoB,EAAA,KAAKpB,EAAkB,EAC7DwB,EAAA,KAAKxB,EAAqB,OAExB,OAAOwC,GAAY,aACrBhB,EAAA,KAAKxB,EAAqBwC,GAC1B,KAAK,iBAAiB,YAAaA,CAAQ,EAE/C,CAEA,IAAI,aAAc,CAChB,OAAOpB,EAAA,KAAKnB,EACd,CAEA,IAAI,YAAYuC,EAAU,CACpBpB,EAAA,KAAKnB,KACP,KAAK,oBAAoB,YAAamB,EAAA,KAAKnB,EAAkB,EAC7DuB,EAAA,KAAKvB,EAAqB,OAExB,OAAOuC,GAAY,aACrBhB,EAAA,KAAKvB,EAAqBuC,GAC1B,KAAK,iBAAiB,YAAaA,CAAQ,EAE/C,CAEA,IAAI,cAAe,CACjB,OAAOpB,EAAA,KAAKlB,EACd,CAEA,IAAI,aAAasC,EAAU,CACrBpB,EAAA,KAAKlB,KACP,KAAK,oBAAoB,aAAckB,EAAA,KAAKlB,EAAmB,EAC/DsB,EAAA,KAAKtB,EAAsB,OAEzB,OAAOsC,GAAY,aACrBhB,EAAA,KAAKtB,EAAsBsC,GAC3B,KAAK,iBAAiB,aAAcA,CAAQ,EAEhD,CACF,EAvlBS9D,EAAA,YAKAC,EAAA,YAoCAC,EAAA,YAkBIC,EAAA,YAAAC,GAAsB,UAAG,CAClC,OAAO,OAAO,QAAW,aAAe,OAAO,MAAQ,OAAO,KAAK,WACrE,EAEWC,EAAA,YAAAC,GAAyB,UAAG,CACrC,OAAO,OAAO,MAAS,aAAe,KAAK,SAC7C,EAEWC,EAAA,YAAAC,EAAY,UAAG,CACxB,GAAIkC,EAAA3C,EAAcM,EAAAC,IAChB,OAAO,KAAK,UAAU,YAAY,YAAY,CAGlD,EAEWG,EAAA,YAAAC,GAAe,UAAG,CA3FjC,IAAAX,EA4FM,OAAOA,EAAA2C,EAAA3C,EAAcQ,EAAAC,KAAd,YAAAT,EAA4B,mBACrC,EAEWY,EAAA,YAAAC,GAAa,UAAG,CA/F/B,IAAAb,EAgGM,OAAOA,EAAA2C,EAAA3C,EAAcU,EAAAC,MAAd,YAAAX,EAA+B,gBAAgB,MAAM,EAC9D,EAEOc,GAAA,YAAAC,GAAe,SAAC6C,EAAS,CAC9B,OAAO,IAAI,QAAQ,CAACI,EAASC,IAAW,CACtCtB,EAAA3C,EAAcY,EAAAC,IAAc,eAAe+C,EAASI,EAASC,CAAM,CACrE,CAAC,CACH,EAEOjD,GAAA,YAAAC,GAAe,SAAC2C,EAAS,CAC9B,OAAO,IAAI,QAAQ,CAACI,EAASC,IAAW,CACtCtB,EAAA3C,EAAcY,EAAAC,IAAc,UAAU+C,EAASI,EAASC,CAAM,CAChE,CAAC,CACH,EAEO/C,EAAA,YAAAC,GAAW,SAAC2B,EAAS,CAC1B,OAAOH,EAAA3C,EAAcQ,EAAAC,GAAa,WAAW,CAI3C,sBAAuB,OAAO,KAAK,MAAM,8BAMzC,eAAgB,OAAO,KAAK,eAAe,cAI3C,0BAA2B,GAE3B,SAAU,QACV,mBAAoB,GAEpB,GAAGqC,CACL,CAAC,CACH,EAGA1B,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAcIC,EAAA,YAAAC,EAAc,UAAG,CA3JzB,IAAA3B,EA4JM,OAAOA,EAAA,KAAK,aAAL,YAAAA,EAAiB,aAC1B,EAaA4B,GAAA,YAAAC,GAAW,UAAG,CACRc,EAAA3C,EAAcC,KAAiB,OAEnC,OAAO,QAAQ0C,EAAA,KAAKrB,EAAgB,EAAE,QAAQ,CAAC,CAAC0B,EAAOC,CAAQ,IAAM,CACnEN,EAAA,KAAKtB,GAAc,WAAW,oBAAoB2B,EAAOC,CAAQ,CACnE,CAAC,EAEDF,EAAA/C,EAAcC,EAAe,QAG7B,KAAK,MAAQ0C,EAAA,KAAKtB,GAAc,QAChC,KAAK,YAAcsB,EAAA,KAAKtB,GAAc,iBAAiB,YACnDsB,EAAA,KAAKtB,GAAc,iBAAiB,WAAa,IACnD,KAAK,KAAK,EAEd,EAEAS,EAAA,YAAAC,GAAmB,UAAG,CAGpB,KAAK,cACH,IAAI,YAAY,aAAc,CAC5B,OAAQY,EAAA3C,EAAcQ,EAAAC,GAAa,aAAa,CAClD,CAAC,CACH,CACF,EAEMuB,GAAA,YAAAC,GAAsB,gBAAG,CArMnC,IAAAjC,EAAAkD,EA0MM,GAAM,CAAE,gBAAAgB,CAAgB,EAAI,KAAK,UAAU,aAC3C,GAAIvB,EAAA3C,EAAcQ,EAAAC,GAAa,gBAAgB,IAAMyD,GAS/C,KAAK,YAAYlE,EAAA2C,EAAA3C,EAAcY,EAAAC,MAAd,YAAAb,EAA6B,MAAM,WAAW,CACjE+C,EAAA/C,EAAcC,EAAe,MAE7B,OAAO,QAAQ0C,EAAA,KAAKrB,EAAgB,EAAE,QAAQ,CAAC,CAAC0B,EAAOC,CAAQ,IAAM,CACnEN,EAAA,KAAKtB,GAAc,WAAW,iBAAiB2B,EAAOC,CAAQ,CAChE,CAAC,EAOD,GAAI,CACF,MAAMP,EAAAQ,EAAAlD,EAAcgB,GAAAC,IAAd,KAAAiC,EAA8B,IAAI,OAAO,KAAK,MAAM,iBAC5D,OAASiB,EAAP,CACA,QAAQ,MAAMA,CAAK,CACrB,CAGAxB,EAAA,KAAKrB,GAAiB,KAAK,UAAU,sBAAsB,mBAAmB,EAC9EqB,EAAA,KAAKrB,GAAiB,KAAK,UAAU,sBAAsB,sBAAsB,CACnF,CAEJ,EAEAY,EAAA,YAAAC,GAAK,UAAG,CA7OZ,IAAAnC,EA8OU,CAAC2C,EAAA3C,EAAcM,EAAAC,KAA6B,KAAK,cACrD,KAAK,YAAc,GACnBmC,EAAA1C,IAAckB,EAAAC,IAAd,KAAAnB,GAQA,KAAK,WAAW,iBAAiB,SAAU0C,EAAA,KAAKJ,EAAAC,IAAuB,KAAK,IAAI,CAAC,EAEjFG,EAAA,KAAKZ,EAAAC,IAAL,WAEAgB,EAAA,KAAK1B,EAAgB,IAAI,KAAK,UAAU,cACxC,IAAI,KAAK,UAAU,uBAAuBsB,EAAA,KAAKtB,EAAa,EAE5D0B,EAAA,KAAKzB,EAAmB,CACtB,CAAC,KAAK,UAAU,sBAAsB,sBAAuB,CAAC,CAAE,MAAA8C,CAAM,IAAM,CACtEA,IAAU,IACZ1B,EAAA,KAAKd,GAAAC,IAAL,WAEF,KAAK,cAAc,IAAI,MAAMuC,EAAQ,YAAc,WAAW,CAAC,CACjE,EACA,CAAC,KAAK,UAAU,sBAAsB,kBAAmB,IAAM,CAC7D,KAAK,cAAc,IAAI,MAAM,gBAAgB,CAAC,CAChD,EACA,CAAC,KAAK,UAAU,sBAAsB,sBAAuB,IAAM,CACjE,KAAK,cAAc,IAAI,MAAM,cAAc,CAAC,CAC9C,EACA,CAAC,KAAK,UAAU,sBAAsB,kBAAmB,IAAM,CAC7D,KAAK,cAAc,IAAI,MAAM,cAAc,CAAC,CAC9C,EACA,CAAC,KAAK,UAAU,sBAAsB,sBAAuB,IAAM,CAC7D,CAACzB,EAAA,KAAKjB,EAAAC,IACV,KAAK,cAAc,IAAI,MAAM,YAAY,CAAC,CAC5C,EACA,CAAC,KAAK,UAAU,sBAAsB,oBAAqB,IAAM,CAC/D,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,CACxC,EACA,CAAC,KAAK,UAAU,sBAAsB,mBAAoB,IAAM,CAC9D,KAAK,cAAc,IAAI,MAAM,KAAK,OAAS,QAAU,MAAM,CAAC,CAC9D,EACA,CAAC,KAAK,UAAU,sBAAsB,sBAAuB,IAAM,CAzR3E,IAAA3B,EAAAkD,IA8RclD,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAgB,OAAO,KAAK,MAAM,YAAY,QAGnE,KAAK,cACH,IAAI,MACF,CACE,CAAC,OAAO,KAAK,MAAM,YAAY,SAAU,UACzC,CAAC,OAAO,KAAK,MAAM,YAAY,WAAY,UAC3C,CAAC,OAAO,KAAK,MAAM,YAAY,MAAO,SACxC,GAAEkD,EAAA,KAAK,aAAL,YAAAA,EAAiB,YACrB,CACF,CACF,EACA,CAAC,KAAK,UAAU,sBAAsB,yBAA0B,SAAY,CACtE,CAACP,EAAA,KAAKjB,EAAAC,KAGV,MAAM,QAAQ,QAAQ,EACtBe,EAAA,KAAKN,GAAAC,IAAL,WACF,CACF,GACF,EA4FAD,GAAA,YAAAC,GAAoB,UAAG,CACrBK,EAAA,KAAKJ,EAAAC,IAAL,UACF,EAEMD,EAAA,YAAAC,GAAsB,gBAAG,CAnZnC,IAAAvC,GAAAkD,GAAAW,GAAAQ,GAAAC,GAAAC,GAoZM,GAAI,CAAC,KAAK,WAAY,OAItB,IAAMC,IADetB,IAAAlD,GAAA2C,EAAA,KAAKtB,GAAc,YAAnB,YAAArB,GAA8B,SAA9B,KAAAkD,GAAwC,CAAC,GACzB,OAAO,CAAC,CAAE,KAAAuB,CAAK,IAAMA,IAAS,OAAO,KAAK,MAAM,UAAU,IAAI,EAE7FC,EAAiB,CAAC,GAAG,KAAK,UAAU,EAAE,OAAO,CAAC,CAAE,KAAArB,CAAK,IAAMA,IAAS,aAAeA,IAAS,UAAU,EAGtGD,EAAYoB,EACf,IAAI,CAAC,CAAE,SAAAG,EAAU,KAAAC,GAAM,QAAAlB,EAAQ,IAAM,CA9Z9C,IAAA1D,GAgaU,GAAM,CAAE,KAAA6E,EAAK,GAAI7E,GAAA0E,EAAe,KAAMI,IAAUA,GAAM,WAAaH,GAAYG,GAAM,QAAUF,EAAI,IAAlF,KAAA5E,GAAuF,CAAC,EACzG,OAAI6E,GAAa,CAAE,KAAAA,GAAM,QAAAnB,EAAQ,EAC1B,EACT,CAAC,EACA,OAAO,OAAO,EAGXqB,EADkB3B,EAAU,OAAO,CAAC,CAAE,KAAAyB,CAAK,IAAMA,IAAS,SAAS,EAClC,IAAI,CAAC,CAAE,QAAAnB,CAAQ,IAAMA,CAAO,EAC7DsB,EAAkB5B,EAAU,KAAK,CAAC,CAAE,KAAAyB,CAAK,IAAMA,IAAS,SAAS,EAGjEtB,GAAiBe,IAAAD,IAAAR,GAAAlB,EAAA3C,EAAcU,EAAAC,MAAd,YAAAkD,GAA+B,gBAAgB,MAAM,KAArD,YAAAQ,GAAyD,iBAAzD,KAAAC,GAA2E,CAAC,EAC/FW,EAAkB1B,EAetB,GAbIA,EAAe,SAEjB0B,EAAkBA,EAAgB,OAAQC,GAAO,CAACH,EAAe,SAASG,CAAE,CAAC,GAG3EF,GAAA,MAAAA,EAAiB,UACnBC,EAAkB,CAAC,GAAGA,EAAiBD,EAAgB,OAAO,GAIhEC,EAAkB,CAAC,GAAG,IAAI,IAAIA,CAAe,CAAC,EAG1C,EADgB,CAACE,EAAGC,KAAMD,EAAE,SAAWC,GAAE,QAAUD,EAAE,MAAOA,IAAMC,GAAE,SAASD,EAAC,CAAC,GAClE5B,EAAgB0B,CAAe,EAC9C,GAAI,CACF,IAAMrB,EAAU,IAAI,OAAO,KAAK,MAAM,sBAAsBqB,CAAe,EAC3E,MAAMvC,EAAA6B,GAAAvE,EAAcc,GAAAC,IAAd,KAAAwD,GAA8BX,EACtC,OAASO,EAAP,CACA,QAAQ,MAAMA,CAAK,CACrB,CAEJ,EAvXA3B,EA/DFxC,EA+DaI,GAIXoC,EAnEFxC,EAmEaM,GAIXkC,EAvEFxC,EAuEaQ,GAOXgC,EA9EFxC,EA8EaU,GAIX8B,EAlFFxC,EAkFaY,GAIX4B,EAtFFxC,EAsFSc,IAMP0B,EA5FFxC,EA4FSgB,IAMPwB,EAlGFxC,EAkGSkB,GAjGPuB,EADFzC,EACS,qBAAqB,CAAC,WAAY,oBAAqB,kBAAkB,GAChFyC,EAFFzC,EAES,YAAY,IAAI,KAEvBwC,EAJFxC,EAISC,EAAP,QAKAuC,EATFxC,EASSE,EAAe,IAoBtBuC,EA7BFzC,EA6BS,WAAW,IAAM,CA1C5B,IAAAA,EA2CW2C,EAAA3C,EAAKI,EAAAC,IAQEsC,EAAA3C,EAAKM,EAAAC,IAGfoC,EAAA3C,IAAKG,GAAL,KAAAH,EAAkB,OAAO,KAAK,aAF9B,eAAe,YAAY,oBAAoB,EAAE,KAAK,IAAG,CApDjE,IAAAA,EAoDoE,OAAA2C,EAAA3C,IAAKG,GAAL,KAAAH,EAAkB,OAAO,KAAK,aAAY,EARtG,WAAW,sBAAwB,IAAM,CAKvC,eAAe,YAAY,oBAAoB,EAAE,KAAK,IAAG,CAjDnE,IAAAA,EAiDsE,OAAA2C,EAAA3C,IAAKG,GAAL,KAAAH,EAAkB,OAAO,KAAK,aAAY,CACxG,CAMJ,GAEAwC,EA7CFxC,EA6CSG,EAAgBkF,GAAgB,CACrC,GAAIA,EAAa,CACftC,EAAA/C,EAAKE,EAAe,IAEpB,GAAM,CAAE,mBAAAoF,CAAmB,EAAI,KAAK,UAAU,qBAC9C3C,EAAA3C,EAAcQ,EAAAC,GAAa,iBAAiB6E,EAAqBC,GAAM,CACrEvF,EAAK,UAAU,QAASwF,GAAO,CAhEzC,IAAAxF,EAgE4C,OAAA0C,EAAA1C,EAAAwF,EAAM1D,EAAAC,IAAN,KAAA/B,EAA0BuF,GAAE,CAChE,CAAC,EAED,GAAM,CAAE,sBAAAE,CAAsB,EAAI,KAAK,UAAU,qBACjD9C,EAAA3C,EAAcQ,EAAAC,GAAa,iBAAiBgF,EAAwBF,GAAM,CACxEvF,EAAK,UAAU,QAASwF,GAAO,CArEzC,IAAAxF,EAqE4C,OAAA0C,EAAA1C,EAAAwF,EAAMxD,GAAAC,IAAN,KAAAjC,EAA6BuF,GAAE,CACnE,CAAC,EAEDvF,EAAK,UAAU,QAASwF,GAAO,CAxEvC,IAAAxF,EAwE0C,OAAA0C,EAAA1C,EAAAwF,EAAMtD,EAAAC,IAAN,KAAAnC,GAAa,CACjD,CACF,GA7DFA,GA6lBF,GAAI,WAAW,kBAAoB,WAAW,eAAgB,CAC5D,IAAM0F,EAAuB5F,GAAmB,gBAAgB,EAE3D,WAAW,eAAe,IAAI,gBAAgB,IACjD,WAAW,eAAe,OAAO,iBAAkB4F,EAAsB,CACvE,QAAS,OACX,CAAC,EACD,WAAW,qBAAuBA,GAGpCA,EAAqB,SAAS,CAChC,CCzmBO,IAAMC,GAAc,CACzB,QACA,UACA,iBACA,iBACA,UACA,YACA,QACA,QACA,aACA,iBACA,YACA,QACA,OACA,UACA,WACA,aACA,SACA,UACA,UACA,UACA,aACA,eACA,UACA,gBACA,SACA,wBACA,wBACA,aACA,YACA,WACF,EAEMC,GAAWC,GAAS,cAAc,UAAU,EAGlDD,GAAS,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAhDrB,IAAAE,EAAAC,EAAAC,GAAAC,EAAAC,GAsEMC,EAAN,cAAiCC,EAAW,WAAY,CAGtD,aAAc,CACZ,MAAM,EAYRC,EAAA,KAAAN,GA2FAM,EAAA,KAAAJ,GA1GAI,EAAA,KAAAP,EAAA,QAIE,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,EAM9B,KAAK,aACPQ,EAAA,KAAKP,EAAAC,IAAL,UAEJ,CAiDA,WAAW,oBAAqB,CAC9B,IAAIO,EAAQ,CAAC,EAEPC,EAAaC,GACVA,EAAK,QAAQ,kBAAmB,OAAO,EAAE,YAAY,EAK9D,OAAO,oBAAoB,KAAK,SAAS,EAAE,QAASC,GAAa,CAC/D,IAAIC,EAAS,GAGb,GAAI,CACE,OAAO,KAAK,UAAUD,IAAc,aACtCC,EAAS,GAEb,MAAE,CAAW,CAGT,CAACA,GAAUD,IAAaA,EAAS,YAAY,GAC/CH,EAAM,KAAKG,EAAS,YAAY,EAAGF,EAAUE,CAAQ,CAAC,CAE1D,CAAC,EAGD,IAAME,EAAW,OAAO,eAAe,IAAI,EAAE,mBAE7C,OAAIA,IACFL,EAAQA,EAAM,OAAOK,CAAQ,GAGxBL,CACT,CAEA,yBAAyBM,EAAUC,EAAUC,EAAU,CAErDT,EAAA,KAAKP,EAAAC,IAAL,WAEAM,EAAA,KAAKL,EAAAC,IAAL,UAAuBW,EAAUC,EAAUC,EAC7C,CA2CA,mBAAoB,CAClBT,EAAA,KAAKP,EAAAC,IAAL,UACF,CACF,EApJEF,EAAA,YAeAC,EAAA,YAAAC,GAAK,UAAG,CACN,GAAIgB,EAAA,KAAKlB,GAAS,OAClBmB,EAAA,KAAKnB,EAAU,IAEf,KAAK,WAAW,OAAOF,GAAS,QAAQ,UAAU,EAAI,CAAC,EACvD,KAAK,SAAW,KAAK,WAAW,cAAc,OAAO,EAIrDD,GAAY,QAASuB,GAAS,CAC5B,KAAK,SAAS,iBAAiBA,EAAOC,GAAQ,CAC5C,KAAK,cAAc,IAAI,YAAYA,EAAI,KAAM,CAAE,OAAQA,EAAI,MAAO,CAAC,CAAC,CACtE,CAAC,CACH,CAAC,EAID,IAAMC,EAAS,KAAK,WAAW,cAAc,MAAM,EACnDA,EAAO,iBAAiB,aAAc,IAAM,CAC1CA,EAAO,iBAAiB,EAAE,QAASC,GAAO,CACpC,CAAC,CAAC,QAAS,QAAQ,EAAE,SAASA,EAAG,SAAS,GAC9C,KAAK,SAAS,OAAOA,CAAE,CACzB,CAAC,CACH,CAAC,EAOD,MAAM,UAAU,QAAQ,KAAK,KAAK,WAAaC,GAAa,CAC1DhB,EAAA,KAAKL,EAAAC,IAAL,UAAuBoB,EAAS,KAAM,KAAMA,EAAS,MACvD,CAAC,EAOG,KAAK,SAAS,eAChB,KAAK,SAAS,MAAQ,GAE1B,EAiDArB,EAAA,YAAAC,GAAiB,SAACW,EAAUC,EAAUC,EAAU,CAE9C,IAAMQ,EAAW,OAAO,oBAAoB,OAAO,eAAe,IAAI,CAAC,EACjEb,EAAWc,GAAiBD,EAAUV,CAAQ,EAG9CY,EAAgB,OAAO,eAAe,KAAK,WAAW,EAAE,SAAS,EAAE,QAAQ,sBAAsB,IAAM,EAIzGf,GAAY,CAACe,EAEX,OAAO,KAAKf,IAAa,UAEvBK,IAAa,KACf,KAAKL,GAAY,GAIjB,KAAKA,GAAY,GAGnB,KAAKA,GAAYK,EAKfA,IAAa,KACf,KAAK,SAAS,gBAAgBF,CAAQ,EAIlC,CAAC,KAAM,OAAO,EAAE,QAAQA,CAAQ,IAAM,IACxC,KAAK,SAAS,aAAaA,EAAUE,CAAQ,CAIrD,EAYF,IAAIW,GAAgB,CAAC,EAKfC,GAAe9B,GAAS,cAAc,QAAS,CACnD,GAAI,gBACN,CAAC,EAGK+B,GAAkB,CAAC,6BAA8B,0BAA0B,EAKjF,QACMC,EAAQ,OAAO,eAAeF,EAAY,EAC9CE,GAASA,IAAUzB,EAAW,YAAY,UAC1CyB,EAAQ,OAAO,eAAeA,CAAK,EAEnC,OAAO,oBAAoBA,CAAK,EAAE,QAASC,GAAQ,CAC7CF,GAAgB,QAAQE,CAAG,IAAM,IACnCJ,GAAc,KAAKI,CAAG,CAE1B,CAAC,EAIHJ,GAAc,QAASK,GAAS,CAC9B,GAAIA,KAAQ5B,EAAmB,UAAW,OAG1C,GADa,OAAOwB,GAAaI,IACrB,WAEV5B,EAAmB,UAAU4B,GAAQ,UAAY,CAC/C,OAAO,KAAK,SAASA,GAAM,MAAM,KAAK,SAAU,SAAS,CAC3D,MACK,CAEL,IAAIC,EAAS,CACX,KAAM,CACJ,OAAO,KAAK,SAASD,EACvB,CACF,EAEIA,IAASA,EAAK,YAAY,IAE5BC,EAAO,IAAM,SAAUC,EAAK,CAC1B,KAAK,SAASF,GAAQE,CACxB,GAGF,OAAO,eAAe9B,EAAmB,UAAW4B,EAAMC,CAAM,CAClE,CACF,CAAC,EAED,SAASR,GAAiBU,EAAKC,EAAM,CACnC,IAAIC,EAAQ,KAEZ,OAAAF,EAAI,QAASG,GAAS,CAChBA,EAAK,YAAY,GAAKF,EAAK,YAAY,IACzCC,EAAQC,EAEZ,CAAC,EAEMD,CACT,CAEKhC,EAAW,eAAe,IAAI,cAAc,IAC/CA,EAAW,eAAe,OAAO,eAAgBD,CAAkB,EACnEC,EAAW,mBAAqBD,GAGlC,IAAOmC,GAAQnC,EJpQR,IAAMoC,EAA6B,CACxC,QAAS,UACT,MAAO,QACP,YAAa,cACb,aAAc,eACd,gBAAiB,kBACjB,wBAAyB,0BACzB,qBAAsB,uBACtB,yBAA0B,2BAC1B,cAAe,gBACf,gBAAiB,kBACjB,KAAM,OACN,YAAa,cACb,WAAY,aACZ,YAAa,aACf,EAEMC,GAAsB,OAAO,OAAOD,CAAU,EAE9CE,GAAwBC,GAAiB,EACzCC,GAAqB,YA3D3BC,EAAAC,EAAAC,GAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GA6DMC,EAAN,cAA8BC,EAAuE,CAanG,aAAc,CACZ,MAAM,EAmTRC,EAAA,KAAMJ,IA5TNI,EAAA,KAAAX,EAAA,QACAW,EAAA,KAAAV,EAAA,QACAU,EAAA,KAAAT,GAAA,QACAS,EAAA,KAAAR,EAAgC,CAAC,GACjCQ,EAAA,KAAAP,GAAA,QACAO,EAAA,KAAAN,GAAA,QACAM,EAAA,KAAAL,GAAA,QAIEM,EAAA,KAAKV,MAAkB,0BAAuB,EAChD,CAfA,WAAW,oBAAqB,CA9DlC,IAAAW,EA+DI,MAAO,CAAC,GAAGjB,GAAqB,IAAIiB,EAAAH,GAAmB,qBAAnB,KAAAG,EAAyC,CAAC,CAAE,CAClF,CAeA,IAAI,YAAa,CA/EnB,IAAAA,EAgFI,OAAQA,EAAA,KAAK,aAAalB,EAAW,WAAW,IAAxC,KAAAkB,EAAoE,MAC9E,CAEA,IAAI,WAAWC,EAAuC,CAChDA,IAAU,KAAK,aACdA,EAEM,iBAAe,SAASA,CAAK,EACtC,KAAK,aAAanB,EAAW,YAAamB,CAAK,EAE/C,QAAQ,KAAK,gDAAgD,iBAAe,KAAK,GAAG,EAJpF,KAAK,gBAAgBnB,EAAW,WAAW,EAM/C,CAEA,IAAI,gBAAiB,CACnB,OAAOoB,EAAA,KAAKb,GACd,CAEA,IAAI,oBAAqB,CAlG3B,IAAAW,EAmGI,OAAOA,EAAAE,EAAA,KAAKV,MAAL,KAAAQ,EAA4Bd,EACrC,CAEA,IAAI,mBAAmBe,EAA2B,CAChDF,EAAA,KAAKP,GAAsBS,EAC7B,CAEA,IAAI,uBAAwB,CA1G9B,IAAAD,EA2GI,OAAOA,EAAAE,EAAA,KAAKX,MAAL,KAAAS,EAA+BhB,EACxC,CAEA,IAAI,sBAAsBiB,EAA2B,CACnDF,EAAA,KAAKR,GAAyBU,EAChC,CAGA,IAAI,MAAmC,CAnHzC,IAAAD,EAoHI,OAAOA,EAAAE,EAAA,KAAKf,KAAL,YAAAa,EAAY,MACrB,CAEA,IAAI,KAAqD,CACvD,OAAO,KAAK,SAAS,GACvB,CAGA,IAAI,OAA2B,CA5HjC,IAAAA,EA6HI,OAAOA,KAAA,YAAS,KAAK,QAAQ,IAAtB,KAAAA,EAA2B,IACpC,CAEA,IAAI,iBAA0D,CAC5D,OAAOE,EAAA,KAAKT,GACd,CAEA,IAAI,gBAAgBQ,EAA+C,CACjEF,EAAA,KAAKN,GAAmBQ,EAC1B,CAEA,IAAI,KAAM,CAIR,OAAO,KAAK,aAAa,KAAK,CAChC,CAEA,IAAI,IAAIE,EAAa,CAGfA,IAAQ,KAAK,MAEbA,GAAO,KACT,KAAK,gBAAgB,KAAK,EAE1B,KAAK,aAAa,MAAOA,CAAG,EAEhC,CAEA,IAAI,MAAkD,CA3JxD,IAAAH,EA4JI,OAAQA,EAAA,KAAK,aAAalB,EAAW,IAAI,IAAjC,KAAAkB,EAAwE,MAClF,CAEA,IAAI,KAAKG,EAAgD,CAEnDA,IAAQ,KAAK,OAEbA,EACF,KAAK,aAAarB,EAAW,KAAMqB,CAAG,EAEtC,KAAK,gBAAgBrB,EAAW,IAAI,EAExC,CAGA,IAAI,UAAqB,CACvB,IAAMsB,EAAO,KAAK,aAAa,UAAU,EAEzC,OAAIA,IAAS,KACJ,GACEA,IAAS,GACX,GAEAA,CAEX,CAGA,IAAI,SAASD,EAAe,CAC1B,IAAME,EAAa,KAAK,SACpBF,IAAQE,IAIRF,EACF,KAAK,aAAa,WAAY,OAAOA,GAAQ,SAAWA,EAAM,EAAE,EAEhE,KAAK,gBAAgB,UAAU,EAEnC,CAEA,IAAI,SAAU,CACZ,IAAMA,EAAM,KAAK,aAAa,SAAS,EACvC,OAAIA,IAAQ,GAAW,OACnB,CAAC,OAAQ,WAAY,MAAM,EAAE,SAASA,CAAG,EAAUA,EAChD,MAAM,OACf,CAEA,IAAI,QAAQA,EAAK,CAGXA,GAAO,KAAK,aAAa,SAAS,IAElC,CAAC,GAAI,OAAQ,WAAY,MAAM,EAAE,SAASA,CAAG,EAC/C,KAAK,aAAa,UAAWA,CAAG,EAEhC,KAAK,gBAAgB,SAAS,EAElC,CAEA,IAAI,OAAiB,CACnB,OAAO,KAAK,aAAarB,EAAW,KAAK,GAAK,IAChD,CAEA,IAAI,MAAMqB,EAAc,CAElBA,IAAQ,KAAK,QAEbA,EACF,KAAK,aAAarB,EAAW,MAAO,EAAE,EAEtC,KAAK,gBAAgBA,EAAW,KAAK,EAEzC,CAEA,IAAI,gBAA0B,CAC5B,OAAO,KAAK,aAAaA,EAAW,eAAe,CACrD,CAEA,IAAI,eAAeqB,EAAc,CAE3BA,IAAQ,KAAK,iBAEbA,EACF,KAAK,aAAarB,EAAW,gBAAiB,EAAE,EAEhD,KAAK,gBAAgBA,EAAW,eAAe,EAEnD,CAEA,IAAI,WAAgC,CAClC,IAAMqB,EAAM,KAAK,aAAarB,EAAW,UAAU,EACnD,GAAIqB,GAAO,KAAM,OACjB,IAAMG,EAAM,CAACH,EACb,OAAQ,OAAO,MAAMG,CAAG,EAAU,OAANA,CAC9B,CAEA,IAAI,UAAUH,EAAyB,CAEjCA,IAAQ,KAAK,YAEbA,GAAO,KACT,KAAK,gBAAgBrB,EAAW,UAAU,EAE1C,KAAK,aAAaA,EAAW,WAAY,GAAGqB,GAAK,EAErD,CAEA,IAAI,YAAiC,CAxQvC,IAAAH,EAyQI,OAAOA,EAAA,KAAK,aAAalB,EAAW,WAAW,IAAxC,KAAAkB,EAA6C,MACtD,CAEA,IAAI,WAAWG,EAAyB,CAElCA,IAAQ,KAAK,aAEbA,EACF,KAAK,aAAarB,EAAW,YAAaqB,CAAG,EAE7C,KAAK,gBAAgBrB,EAAW,WAAW,EAE/C,CAEA,IAAI,cAAe,CAvRrB,IAAAkB,EAwRI,OAAOA,EAAA,KAAK,aAAalB,EAAW,aAAa,IAA1C,KAAAkB,EAA+C,MACxD,CAEA,IAAI,aAAaG,EAAyB,CAEpCA,IAAQ,KAAK,eAEbA,EACF,KAAK,aAAarB,EAAW,cAAeqB,CAAG,EAE/C,KAAK,gBAAgBrB,EAAW,aAAa,EAEjD,CAEA,IAAI,QAA6B,CAtSnC,IAAAkB,EAuSI,OAAOA,EAAA,KAAK,aAAalB,EAAW,OAAO,IAApC,KAAAkB,EAAyC,MAClD,CAEA,IAAI,OAAOG,EAAyB,CAE9BA,IAAQ,KAAK,SAEbA,EACF,KAAK,aAAarB,EAAW,QAASqB,CAAG,EAEzC,KAAK,gBAAgBrB,EAAW,OAAO,EAE3C,CAEA,IAAI,wBAA6C,CArTnD,IAAAkB,EAsTI,OAAOA,EAAA,KAAK,aAAalB,EAAW,wBAAwB,IAArD,KAAAkB,EAA0D,MACnE,CAEA,IAAI,uBAAuBG,EAAyB,CAE9CA,IAAQ,KAAK,yBAEbA,EACF,KAAK,aAAarB,EAAW,yBAA0BqB,CAAG,EAE1D,KAAK,gBAAgBrB,EAAW,wBAAwB,EAE5D,CAEA,IAAI,YAA+C,CApUrD,IAAAkB,EAsUI,OAAQA,EAAA,KAAK,aAAalB,EAAW,WAAW,IAAxC,KAAAkB,EAAsE,MAChF,CAEA,IAAI,WAAWG,EAAuC,CAEhDA,IAAQ,KAAK,aAEbA,EACF,KAAK,aAAarB,EAAW,YAAaqB,CAAG,EAE7C,KAAK,gBAAgBrB,EAAW,WAAW,EAE/C,CAEA,IAAI,gBAAqD,CACvD,IAAMqB,EAAM,KAAK,aAAarB,EAAW,eAAe,EACxD,GAAIqB,IAAQ,gBAAc,KAAOA,IAAQ,gBAAc,OAAQ,OAAOA,CAExE,CAEA,IAAI,eAAeA,EAAyC,CACtDA,IAAQ,KAAK,iBAEbA,IAAQ,gBAAc,KAAOA,IAAQ,gBAAc,OACrD,KAAK,aAAarB,EAAW,gBAAiBqB,CAAG,EAEjD,KAAK,gBAAgBrB,EAAW,eAAe,EAEnD,CAEA,IAAI,UAAW,CAab,MAAO,CACL,GAbuD,KAAK,kBAAkB,EAC7E,OAAQyB,GACAA,EAAS,WAAW,WAAW,GAAK,CAAE,CAACzB,EAAW,YAAY,EAAe,SAASyB,CAAQ,CACtG,EACA,OAAO,CAACC,EAAWD,IAAa,CAC/B,IAAMN,EAAQ,KAAK,aAAaM,CAAQ,EACxC,OAAIN,GAAS,OACXO,EAAUD,EAAS,QAAQ,aAAc,EAAE,EAAE,QAAQ,KAAM,GAAG,GAAeN,GAExEO,CACT,EAAG,CAAC,CAA8B,EAIlC,GAAGN,EAAA,KAAKZ,EACV,CACF,CAEA,IAAI,SAASa,EAAqC,CAChDJ,EAAA,KAAKT,EAAYa,GAAA,KAAAA,EAAO,CAAC,GACnB,KAAK,KACT,KAAK,IAAI,KAAK,KAAMD,EAAA,KAAKZ,EAAS,CAEtC,CASA,MAAO,CACLS,EAAA,KAAKZ,KAAQ,cAAW,KAAgC,KAAK,SAAUe,EAAA,KAAKf,EAAK,EACnF,CAEA,QAAS,IACP,YAAS,KAAK,SAAUe,EAAA,KAAKf,EAAK,EAClCY,EAAA,KAAKZ,EAAQ,OACf,CAaA,yBAAyBoB,EAAkBE,EAAyBC,EAAyB,CAzZ/F,IAAAV,EAAAW,EA4ZI,OAFA,MAAM,yBAAyBJ,EAAUE,EAAUC,CAAQ,EAEnDH,QACDzB,EAAW,qBACd,KAAK,mBAAqB4B,GAAA,KAAAA,EAAY,OACtC,WACG5B,EAAW,wBACd,KAAK,sBAAwB4B,GAAA,KAAAA,EAAY,OACzC,UACG,MAAO,CACV,IAAME,EAAS,CAAC,CAACH,EACXI,GAAS,CAAC,CAACH,EACb,CAACE,GAAUC,GACbC,EAAA,KAAKpB,GAAAC,IAAL,WACSiB,GAAU,CAACC,GACpB,KAAK,OAAO,EAEHD,GAAUC,KACnB,KAAK,OAAO,EACZC,EAAA,KAAKpB,GAAAC,IAAL,YAEF,KACF,KACK,WACH,GAAIe,IAAaD,EACf,OAGFT,EAAAE,EAAA,KAAKf,KAAL,MAAAa,EAAY,YAAY,KAAK,UAC7B,UACG,UACH,GAAIU,IAAaD,EACf,OAEFE,EAAAT,EAAA,KAAKf,KAAL,MAAAwB,EAAY,WAAWD,GACvB,WACG5B,EAAW,YAEd,KAAK,OAAM,iBAAc4B,GAAA,KAAAA,EAAY,OAAW,CAAE,OAAQ,KAAK,YAAa,CAAC,EAC7E,WACG5B,EAAW,MAAO,CACrB,IAAMiC,EAAQ,KAAK,MACb,KAAK,KAET,QAAQ,KACN,+HACF,EAEI,KAAK,OACT,KAAK,KAAK,OAAO,MAAQA,GAE3B,KACF,MACKjC,EAAW,aACV4B,GACF,MAAMA,CAAQ,EACX,KAAMM,GAASA,EAAK,KAAK,CAAC,EAC1B,KAAMC,GAAU,KAAK,SAAWA,CAAK,EACrC,MAAOC,GAAS,QAAQ,MAAM,2DAA2DR,IAAW,CAAC,EAE1G,cAEA,MAEN,CAEA,sBAAuB,CACrB,KAAK,OAAO,CACd,CACF,EA7ZEvB,EAAA,YACAC,EAAA,YACAC,GAAA,YACAC,EAAA,YACAC,GAAA,YACAC,GAAA,YACAC,GAAA,YAsTMC,GAAA,YAAAC,GAAY,gBAAG,CACfO,EAAA,KAAKd,KACT,MAAOW,EAAA,KAAKX,EAAiB,QAAQ,QAAQ,GAC7CW,EAAA,KAAKX,EAAiB,MACtB,KAAK,KAAK,EACZ,EAoGG+B,EAAW,eAAe,IAAI,WAAW,IAC5CA,EAAW,eAAe,OAAO,YAAavB,CAAe,EAE7DuB,EAAW,gBAAkBvB,GAK/B,IAAOwB,GAAQC",
6
- "names": ["src_exports", "__export", "Attributes", "VideoEvents", "src_default", "__toCommonJS", "EventTarget", "_event", "DocumentFragment", "HTMLElement", "HTMLVideoElement", "customElements", "_name", "_constructor", "_options", "_root", "_detail", "CustomEvent", "typeArg", "eventInitDict", "__privateAdd", "__privateSet", "__privateGet", "createElement", "_tagName", "globalThisShim", "isServer", "GlobalThis", "Document", "import_playback_core", "getEnvPlayerVersion", "player_version", "getPlayerVersion", "CastableVideoMixin", "superclass", "_a", "_castElement", "_castEnabled", "_onSdkLoaded", "_isChromeCastAvailable", "isChromeCastAvailable_get", "_isCastFrameworkAvailable", "isCastFrameworkAvailable_get", "_castContext", "castContext_get", "_currentSession", "currentSession_get", "_currentMedia", "currentMedia_get", "_editTracksInfo", "editTracksInfo_fn", "_getMediaStatus", "getMediaStatus_fn", "_setOptions", "setOptions_fn", "_localState", "_remotePlayer", "_remoteListeners", "_enterCastCallback", "_leaveCastCallback", "_castChangeCallback", "_isMediaLoaded", "isMediaLoaded_get", "_disconnect", "disconnect_fn", "_onCastStateChanged", "onCastStateChanged_fn", "_onSessionStateChanged", "onSessionStateChanged_fn", "_init", "init_fn", "_onRemoteMediaLoaded", "onRemoteMediaLoaded_fn", "_updateRemoteTextTrack", "updateRemoteTextTrack_fn", "__privateAdd", "__publicField", "__privateMethod", "__privateGet", "err", "attrName", "options", "__privateSet", "event", "listener", "_b", "mediaInfo", "subtitles", "kind", "src", "activeTrackIds", "textTrackIdCount", "trackEl", "trackId", "track", "request", "_c", "val", "callback", "resolve", "reject", "SESSION_RESUMED", "error", "value", "_d", "_e", "_f", "remoteSubtitles", "type", "localSubtitles", "language", "name", "mode", "local", "hiddenTrackIds", "showingSubtitle", "requestTrackIds", "id", "a", "b", "isAvailable", "CAST_STATE_CHANGED", "e", "video", "SESSION_STATE_CHANGED", "CastableVideoElement", "VideoEvents", "template", "Document", "_isInit", "_init", "init_fn", "_forwardAttribute", "forwardAttribute_fn", "CustomVideoElement", "GlobalThis", "__privateAdd", "__privateMethod", "attrs", "kebabCase", "name", "propName", "isFunc", "supAttrs", "attrName", "oldValue", "newValue", "__privateGet", "__privateSet", "type", "evt", "slotEl", "el", "attrNode", "ownProps", "arrayFindAnyCase", "isBaseElement", "nativeElProps", "nativeElTest", "deprecatedProps", "proto", "key", "prop", "config", "val", "arr", "word", "found", "item", "CustomVideoElement_default", "Attributes", "AttributeNameValues", "playerSoftwareVersion", "getPlayerVersion", "playerSoftwareName", "_core", "_loadRequested", "_playerInitTime", "_metadata", "_playerSoftwareVersion", "_playerSoftwareName", "_errorTranslator", "_requestLoad", "requestLoad_fn", "MuxVideoElement", "CustomVideoElement_default", "__privateAdd", "__privateSet", "_a", "value", "__privateGet", "val", "attr", "currentVal", "num", "attrName", "currAttrs", "oldValue", "newValue", "_b", "hadSrc", "hasSrc", "__privateMethod", "debug", "resp", "json", "_err", "GlobalThis", "src_default", "MuxVideoElement"]
4
+ "sourcesContent": ["import { globalThis } from 'shared-polyfills';\nimport {\n initialize,\n teardown,\n generatePlayerInitTime,\n MuxMediaProps,\n StreamTypes,\n PlaybackTypes,\n toMuxVideoURL,\n Metadata,\n MediaError,\n getError,\n CmcdTypes,\n CmcdTypeValues,\n addCuePoints,\n getCuePoints,\n getActiveCuePoint,\n} from '@mux/playback-core';\nimport type { PlaybackCore, PlaybackEngine, Autoplay, ExtensionMimeTypeMap, ValueOf } from '@mux/playback-core';\nimport { getPlayerVersion } from './env';\n// this must be imported after playback-core for the polyfill to be included\nimport CustomVideoElement, { VideoEvents } from './CustomVideoElement';\n\n/** @TODO make the relationship between name+value smarter and more deriveable (CJP) */\ntype AttributeNames = {\n ENV_KEY: 'env-key';\n DEBUG: 'debug';\n METADATA_URL: 'metadata-url';\n PLAYER_SOFTWARE_VERSION: 'player-software-version';\n PLAYER_SOFTWARE_NAME: 'player-software-name';\n BEACON_COLLECTION_DOMAIN: 'beacon-collection-domain';\n CUSTOM_DOMAIN: 'custom-domain';\n DISABLE_COOKIES: 'disable-cookies';\n PLAYBACK_ID: 'playback-id';\n PREFER_PLAYBACK: 'prefer-playback';\n TYPE: 'type';\n STREAM_TYPE: 'stream-type';\n START_TIME: 'start-time';\n PREFER_CMCD: 'prefer-cmcd';\n};\n\nexport const Attributes: AttributeNames = {\n ENV_KEY: 'env-key',\n DEBUG: 'debug',\n PLAYBACK_ID: 'playback-id',\n METADATA_URL: 'metadata-url',\n PREFER_PLAYBACK: 'prefer-playback',\n PLAYER_SOFTWARE_VERSION: 'player-software-version',\n PLAYER_SOFTWARE_NAME: 'player-software-name',\n BEACON_COLLECTION_DOMAIN: 'beacon-collection-domain',\n CUSTOM_DOMAIN: 'custom-domain',\n DISABLE_COOKIES: 'disable-cookies',\n TYPE: 'type',\n STREAM_TYPE: 'stream-type',\n START_TIME: 'start-time',\n PREFER_CMCD: 'prefer-cmcd',\n};\n\nconst AttributeNameValues = Object.values(Attributes);\n\nconst playerSoftwareVersion = getPlayerVersion();\nconst playerSoftwareName = 'mux-video';\n\nclass MuxVideoElement extends CustomVideoElement<HTMLVideoElement> implements Partial<MuxMediaProps> {\n static get observedAttributes() {\n return [...AttributeNameValues, ...(CustomVideoElement.observedAttributes ?? [])];\n }\n\n #core?: PlaybackCore;\n #loadRequested?: Promise<void> | null;\n #playerInitTime: number;\n #metadata: Readonly<Metadata> = {};\n #playerSoftwareVersion?: string;\n #playerSoftwareName?: string;\n #errorTranslator?: (errorEvent: any) => any;\n\n constructor() {\n super();\n this.#playerInitTime = generatePlayerInitTime();\n }\n\n get preferCmcd() {\n return (this.getAttribute(Attributes.PREFER_CMCD) as ValueOf<CmcdTypes>) ?? undefined;\n }\n\n set preferCmcd(value: ValueOf<CmcdTypes> | undefined) {\n if (value === this.preferCmcd) return;\n if (!value) {\n this.removeAttribute(Attributes.PREFER_CMCD);\n } else if (CmcdTypeValues.includes(value)) {\n this.setAttribute(Attributes.PREFER_CMCD, value);\n } else {\n console.warn(`Invalid value for preferCmcd. Must be one of ${CmcdTypeValues.join()}`);\n }\n }\n\n get playerInitTime() {\n return this.#playerInitTime;\n }\n\n get playerSoftwareName() {\n return this.#playerSoftwareName ?? playerSoftwareName;\n }\n\n set playerSoftwareName(value: string | undefined) {\n this.#playerSoftwareName = value;\n }\n\n get playerSoftwareVersion() {\n return this.#playerSoftwareVersion ?? playerSoftwareVersion;\n }\n\n set playerSoftwareVersion(value: string | undefined) {\n this.#playerSoftwareVersion = value;\n }\n\n // Keeping this named \"_hls\" since it's exposed for unadvertised \"advanced usage\" via getter that assumes specifically hls.js (CJP)\n get _hls(): PlaybackEngine | undefined {\n return this.#core?.engine;\n }\n\n get mux(): Readonly<HTMLVideoElement['mux']> | undefined {\n return this.nativeEl.mux;\n }\n\n // @ts-ignore\n get error(): MediaError | null {\n return getError(this.nativeEl) ?? null;\n }\n\n get errorTranslator(): ((errorEvent: any) => any) | undefined {\n return this.#errorTranslator;\n }\n\n set errorTranslator(value: ((errorEvent: any) => any) | undefined) {\n this.#errorTranslator = value;\n }\n\n get src() {\n // Use the attribute value as the source of truth.\n // No need to store it in two places.\n // This avoids needing a to read the attribute initially and update the src.\n return this.getAttribute('src') as string;\n }\n\n set src(val: string) {\n // If being set by attributeChangedCallback,\n // dont' cause an infinite loop\n if (val === this.src) return;\n\n if (val == null) {\n this.removeAttribute('src');\n } else {\n this.setAttribute('src', val);\n }\n }\n\n get type(): ValueOf<ExtensionMimeTypeMap> | undefined {\n return (this.getAttribute(Attributes.TYPE) as ValueOf<ExtensionMimeTypeMap>) ?? undefined;\n }\n\n set type(val: ValueOf<ExtensionMimeTypeMap> | undefined) {\n // dont' cause an infinite loop\n if (val === this.type) return;\n\n if (val) {\n this.setAttribute(Attributes.TYPE, val);\n } else {\n this.removeAttribute(Attributes.TYPE);\n }\n }\n\n /** @ts-ignore */\n get autoplay(): Autoplay {\n const attr = this.getAttribute('autoplay');\n\n if (attr === null) {\n return false;\n } else if (attr === '') {\n return true;\n } else {\n return attr as Autoplay;\n }\n }\n\n /** @ts-ignore */\n set autoplay(val: Autoplay) {\n const currentVal = this.autoplay;\n if (val === currentVal) {\n return;\n }\n\n if (val) {\n this.setAttribute('autoplay', typeof val === 'string' ? val : '');\n } else {\n this.removeAttribute('autoplay');\n }\n }\n\n get preload() {\n const val = this.getAttribute('preload') as HTMLMediaElement['preload'];\n if (val === '') return 'auto';\n if (['none', 'metadata', 'auto'].includes(val)) return val;\n return super.preload;\n }\n\n set preload(val) {\n // don't cause an infinite loop\n // check the attribute because an empty string maps to the `auto` prop\n if (val == this.getAttribute('preload')) return;\n\n if (['', 'none', 'metadata', 'auto'].includes(val)) {\n this.setAttribute('preload', val);\n } else {\n this.removeAttribute('preload');\n }\n }\n\n get debug(): boolean {\n return this.getAttribute(Attributes.DEBUG) != null;\n }\n\n set debug(val: boolean) {\n // dont' cause an infinite loop\n if (val === this.debug) return;\n\n if (val) {\n this.setAttribute(Attributes.DEBUG, '');\n } else {\n this.removeAttribute(Attributes.DEBUG);\n }\n }\n\n get disableCookies(): boolean {\n return this.hasAttribute(Attributes.DISABLE_COOKIES);\n }\n\n set disableCookies(val: boolean) {\n // dont' cause an infinite loop\n if (val === this.disableCookies) return;\n\n if (val) {\n this.setAttribute(Attributes.DISABLE_COOKIES, '');\n } else {\n this.removeAttribute(Attributes.DISABLE_COOKIES);\n }\n }\n\n get startTime(): number | undefined {\n const val = this.getAttribute(Attributes.START_TIME);\n if (val == null) return undefined;\n const num = +val;\n return !Number.isNaN(num) ? num : undefined;\n }\n\n set startTime(val: number | undefined) {\n // dont' cause an infinite loop\n if (val === this.startTime) return;\n\n if (val == null) {\n this.removeAttribute(Attributes.START_TIME);\n } else {\n this.setAttribute(Attributes.START_TIME, `${val}`);\n }\n }\n\n get playbackId(): string | undefined {\n return this.getAttribute(Attributes.PLAYBACK_ID) ?? undefined;\n }\n\n set playbackId(val: string | undefined) {\n // dont' cause an infinite loop\n if (val === this.playbackId) return;\n\n if (val) {\n this.setAttribute(Attributes.PLAYBACK_ID, val);\n } else {\n this.removeAttribute(Attributes.PLAYBACK_ID);\n }\n }\n\n get customDomain() {\n return this.getAttribute(Attributes.CUSTOM_DOMAIN) ?? undefined;\n }\n\n set customDomain(val: string | undefined) {\n // dont' cause an infinite loop\n if (val === this.customDomain) return;\n\n if (val) {\n this.setAttribute(Attributes.CUSTOM_DOMAIN, val);\n } else {\n this.removeAttribute(Attributes.CUSTOM_DOMAIN);\n }\n }\n\n get envKey(): string | undefined {\n return this.getAttribute(Attributes.ENV_KEY) ?? undefined;\n }\n\n set envKey(val: string | undefined) {\n // dont' cause an infinite loop\n if (val === this.envKey) return;\n\n if (val) {\n this.setAttribute(Attributes.ENV_KEY, val);\n } else {\n this.removeAttribute(Attributes.ENV_KEY);\n }\n }\n\n get beaconCollectionDomain(): string | undefined {\n return this.getAttribute(Attributes.BEACON_COLLECTION_DOMAIN) ?? undefined;\n }\n\n set beaconCollectionDomain(val: string | undefined) {\n // don't cause an infinite loop\n if (val === this.beaconCollectionDomain) return;\n\n if (val) {\n this.setAttribute(Attributes.BEACON_COLLECTION_DOMAIN, val);\n } else {\n this.removeAttribute(Attributes.BEACON_COLLECTION_DOMAIN);\n }\n }\n\n get streamType(): ValueOf<StreamTypes> | undefined {\n // getAttribute doesn't know that this attribute is well defined. Should explore extending for MuxVideo (CJP)\n return (this.getAttribute(Attributes.STREAM_TYPE) as ValueOf<StreamTypes>) ?? undefined;\n }\n\n set streamType(val: ValueOf<StreamTypes> | undefined) {\n // dont' cause an infinite loop\n if (val === this.streamType) return;\n\n if (val) {\n this.setAttribute(Attributes.STREAM_TYPE, val);\n } else {\n this.removeAttribute(Attributes.STREAM_TYPE);\n }\n }\n\n async addCuePoints<T = any>(cuePoints: { time: number; value: T }[]) {\n return addCuePoints(this.nativeEl, cuePoints);\n }\n\n get activeCuePoint() {\n return getActiveCuePoint(this.nativeEl);\n }\n\n get cuePoints() {\n return getCuePoints(this.nativeEl);\n }\n\n get preferPlayback(): ValueOf<PlaybackTypes> | undefined {\n const val = this.getAttribute(Attributes.PREFER_PLAYBACK);\n if (val === PlaybackTypes.MSE || val === PlaybackTypes.NATIVE) return val;\n return undefined;\n }\n\n set preferPlayback(val: ValueOf<PlaybackTypes> | undefined) {\n if (val === this.preferPlayback) return;\n\n if (val === PlaybackTypes.MSE || val === PlaybackTypes.NATIVE) {\n this.setAttribute(Attributes.PREFER_PLAYBACK, val);\n } else {\n this.removeAttribute(Attributes.PREFER_PLAYBACK);\n }\n }\n\n get metadata() {\n const inferredMetadataAttrs: { [key: string]: string } = this.getAttributeNames()\n .filter((attrName) => {\n return attrName.startsWith('metadata-') && !([Attributes.METADATA_URL] as string[]).includes(attrName);\n })\n .reduce((currAttrs, attrName) => {\n const value = this.getAttribute(attrName);\n if (value != null) {\n currAttrs[attrName.replace(/^metadata-/, '').replace(/-/g, '_') as string] = value;\n }\n return currAttrs;\n }, {} as { [key: string]: string });\n\n return {\n ...inferredMetadataAttrs,\n ...this.#metadata,\n };\n }\n\n set metadata(val: Readonly<Metadata> | undefined) {\n this.#metadata = val ?? {};\n if (!!this.mux) {\n this.mux.emit('hb', this.#metadata);\n }\n }\n\n async #requestLoad() {\n if (this.#loadRequested) return;\n await (this.#loadRequested = Promise.resolve());\n this.#loadRequested = null;\n this.load();\n }\n\n load() {\n this.#core = initialize(this as Partial<MuxMediaProps>, this.nativeEl, this.#core);\n }\n\n unload() {\n teardown(this.nativeEl, this.#core);\n this.#core = undefined;\n }\n\n // NOTE: This was carried over from hls-video-element. Is it needed for an edge case?\n // play() {\n // if (this.readyState === 0 && this.networkState < 2) {\n // this.load();\n // this._hls.on(Hls.Events.MANIFEST_PARSED,function() {\n // video.play();\n //\n // return this.nativeEl.play();\n // }\n // }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n\n switch (attrName) {\n case Attributes.PLAYER_SOFTWARE_NAME:\n this.playerSoftwareName = newValue ?? undefined;\n break;\n case Attributes.PLAYER_SOFTWARE_VERSION:\n this.playerSoftwareVersion = newValue ?? undefined;\n break;\n case 'src': {\n const hadSrc = !!oldValue;\n const hasSrc = !!newValue;\n if (!hadSrc && hasSrc) {\n this.#requestLoad();\n } else if (hadSrc && !hasSrc) {\n this.unload();\n /** @TODO Test this thoroughly (async?) and confirm unload() necessary (CJP) */\n } else if (hadSrc && hasSrc) {\n this.unload();\n this.#requestLoad();\n }\n break;\n }\n case 'autoplay':\n if (newValue === oldValue) {\n break;\n }\n /** In case newValue is an empty string or null, use this.autoplay which translates to booleans (WL) */\n this.#core?.setAutoplay(this.autoplay);\n break;\n case 'preload':\n if (newValue === oldValue) {\n break;\n }\n this.#core?.setPreload(newValue as HTMLMediaElement['preload']);\n break;\n case Attributes.PLAYBACK_ID:\n /** @TODO Improv+Discuss - how should playback-id update wrt src attr changes (and vice versa) (CJP) */\n this.src = toMuxVideoURL(newValue ?? undefined, { domain: this.customDomain }) as string;\n break;\n case Attributes.DEBUG: {\n const debug = this.debug;\n if (!!this.mux) {\n /** @TODO Link to docs for a more detailed discussion (CJP) */\n console.info(\n 'Cannot toggle debug mode of mux data after initialization. Make sure you set all metadata to override before setting the src.'\n );\n }\n if (!!this._hls) {\n this._hls.config.debug = debug;\n }\n break;\n }\n case Attributes.METADATA_URL:\n if (newValue) {\n fetch(newValue)\n .then((resp) => resp.json())\n .then((json) => (this.metadata = json))\n .catch(() => console.error(`Unable to load or parse metadata JSON from metadata-url ${newValue}!`));\n }\n break;\n default:\n break;\n }\n }\n\n disconnectedCallback() {\n this.unload();\n }\n}\n\ntype MuxVideoElementType = typeof MuxVideoElement;\ndeclare global {\n var MuxVideoElement: MuxVideoElementType; // eslint-disable-line\n}\n\n/** @TODO Refactor once using `globalThis` polyfills */\nif (!globalThis.customElements.get('mux-video')) {\n globalThis.customElements.define('mux-video', MuxVideoElement);\n /** @TODO consider externalizing this (breaks standard modularity) */\n globalThis.MuxVideoElement = MuxVideoElement;\n}\n\nexport { PlaybackEngine, PlaybackEngine as Hls, ExtensionMimeTypeMap as MimeTypes, MediaError, VideoEvents };\n\nexport default MuxVideoElement;\n", "class EventTarget {\n addEventListener() {}\n removeEventListener() {}\n dispatchEvent(_event) {\n return true;\n }\n}\n\n// @github/template-parts requires DocumentFragment to be available on globalThis for SSR\nif (typeof DocumentFragment === 'undefined') {\n class DocumentFragment extends EventTarget {}\n // @ts-ignore\n globalThis.DocumentFragment = DocumentFragment;\n}\n\nclass HTMLElement extends EventTarget {}\nclass HTMLVideoElement extends EventTarget {}\n\nconst customElements = {\n get(_name) {\n return undefined;\n },\n define(_name, _constructor, _options) {},\n upgrade(_root) {},\n whenDefined(_name) {\n return Promise.resolve(HTMLElement);\n },\n};\n\nclass CustomEvent {\n #detail;\n get detail() {\n return this.#detail;\n }\n constructor(typeArg, eventInitDict = {}) {\n // super(typeArg, eventInitDict);\n this.#detail = eventInitDict?.detail;\n }\n initCustomEvent() {}\n}\n\nfunction createElement(_tagName, _options) {\n return new HTMLElement();\n}\n\nconst globalThisShim = {\n document: {\n createElement,\n },\n DocumentFragment,\n customElements,\n CustomEvent,\n EventTarget,\n HTMLElement,\n HTMLVideoElement,\n};\n\nconst isServer = typeof window === 'undefined' || typeof globalThis.customElements === 'undefined';\nconst GlobalThis = isServer ? globalThisShim : globalThis;\nconst Document = isServer ? globalThisShim.document : globalThis.document;\n\nexport { GlobalThis as globalThis, Document as document };\n", "export const isMaybeBrowser = () => typeof window != 'undefined';\n// @ts-ignore\nexport const isMaybeServer = () => typeof global != 'undefined';\n\nconst getEnvPlayerVersion = () => {\n try {\n // @ts-ignore\n return PLAYER_VERSION as string;\n } catch {}\n return 'UNKNOWN';\n};\n\nconst player_version: string = getEnvPlayerVersion();\n\nexport const getPlayerVersion = () => player_version;\n", "class IterableWeakSet extends Set {\n add(el) {\n super.add(new WeakRef(el));\n }\n forEach(fn) {\n super.forEach((ref) => {\n const value = ref.deref();\n if (value) fn(value);\n });\n }\n}\n\n/**\n * CastableVideoMixin\n *\n * Because there can only be one custom built-in (is=\"my-video\") this mixin function\n * provides a way to compose multiple classes to create one custom built-in class.\n * @see https://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/\n *\n * @param {HTMLVideoElement} superclass - HTMLVideoElement or an extended class of it.\n * @return {CastableVideo}\n */\nconst CastableVideoMixin = (superclass) =>\n class CastableVideo extends superclass {\n static observedAttributes = ['cast-src', 'cast-content-type', 'cast-stream-type'];\n static instances = new IterableWeakSet();\n\n static #castElement;\n static get castElement() {\n return CastableVideo.#castElement;\n }\n\n static #castEnabled = false;\n static get castEnabled() {\n return CastableVideo.#castEnabled;\n }\n\n static get castState() {\n return CastableVideo.#castContext?.getCastState();\n }\n\n static async exitCast() {\n // Should the receiver application be stopped or just disconnected.\n const stopCasting = true;\n try {\n await CastableVideo.#castContext.endCurrentSession(stopCasting);\n } catch (err) {\n console.error(err);\n return;\n }\n }\n\n static initCast = () => {\n if (!this.#isChromeCastAvailable) {\n globalThis.__onGCastApiAvailable = () => {\n // The globalThis.__onGCastApiAvailable callback alone is not reliable for\n // the added cast.framework. It's loaded in a separate JS file.\n // http://www.gstatic.com/eureka/clank/101/cast_sender.js\n // http://www.gstatic.com/cast/sdk/libs/sender/1.0/cast_framework.js\n customElements.whenDefined('google-cast-button').then(() => this.#onSdkLoaded(chrome.cast.isAvailable));\n };\n } else if (!this.#isCastFrameworkAvailable) {\n customElements.whenDefined('google-cast-button').then(() => this.#onSdkLoaded(chrome.cast.isAvailable));\n } else {\n this.#onSdkLoaded(chrome.cast.isAvailable);\n }\n };\n\n static #onSdkLoaded = (isAvailable) => {\n if (isAvailable) {\n this.#castEnabled = true;\n\n const { CAST_STATE_CHANGED } = cast.framework.CastContextEventType;\n CastableVideo.#castContext.addEventListener(CAST_STATE_CHANGED, (e) => {\n this.instances.forEach((video) => video.#onCastStateChanged(e));\n });\n\n const { SESSION_STATE_CHANGED } = cast.framework.CastContextEventType;\n CastableVideo.#castContext.addEventListener(SESSION_STATE_CHANGED, (e) => {\n this.instances.forEach((video) => video.#onSessionStateChanged(e));\n });\n\n this.instances.forEach((video) => video.#init());\n }\n };\n\n static get #isChromeCastAvailable() {\n return typeof chrome !== 'undefined' && chrome.cast && chrome.cast.isAvailable;\n }\n\n static get #isCastFrameworkAvailable() {\n return typeof cast !== 'undefined' && cast.framework;\n }\n\n static get #castContext() {\n if (CastableVideo.#isCastFrameworkAvailable) {\n return cast.framework.CastContext.getInstance();\n }\n return undefined;\n }\n\n static get #currentSession() {\n return CastableVideo.#castContext?.getCurrentSession();\n }\n\n static get #currentMedia() {\n return CastableVideo.#currentSession?.getSessionObj().media[0];\n }\n\n static #editTracksInfo(request) {\n return new Promise((resolve, reject) => {\n CastableVideo.#currentMedia.editTracksInfo(request, resolve, reject);\n });\n }\n\n static #getMediaStatus(request) {\n return new Promise((resolve, reject) => {\n CastableVideo.#currentMedia.getStatus(request, resolve, reject);\n });\n }\n\n static #setOptions(options) {\n return CastableVideo.#castContext.setOptions({\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,\n\n // The following flag enables Cast Connect(requires Chrome 87 or higher)\n // https://developers.googleblog.com/2020/08/introducing-cast-connect-android-tv.html\n androidReceiverCompatible: false,\n\n language: 'en-US',\n resumeSavedSession: true,\n\n ...options,\n });\n }\n\n castEnabled = false;\n #localState = { paused: false };\n #remotePlayer;\n #remoteListeners = {};\n #enterCastCallback;\n #leaveCastCallback;\n #castChangeCallback;\n\n constructor() {\n super();\n\n CastableVideo.instances.add(this);\n this.#init();\n }\n\n get castPlayer() {\n if (CastableVideo.castElement === this) return this.#remotePlayer;\n return undefined;\n }\n\n get #isMediaLoaded() {\n return this.castPlayer?.isMediaLoaded;\n }\n\n attributeChangedCallback(attrName) {\n if (!this.castPlayer) return;\n\n switch (attrName) {\n case 'cast-stream-type':\n case 'cast-src':\n this.load();\n break;\n }\n }\n\n #disconnect() {\n if (CastableVideo.#castElement !== this) return;\n\n Object.entries(this.#remoteListeners).forEach(([event, listener]) => {\n this.#remotePlayer.controller.removeEventListener(event, listener);\n });\n\n CastableVideo.#castElement = undefined;\n\n // isMuted is not in savedPlayerState. should we sync this back to local?\n this.muted = this.#remotePlayer.isMuted;\n this.currentTime = this.#remotePlayer.savedPlayerState.currentTime;\n if (this.#remotePlayer.savedPlayerState.isPaused === false) {\n this.play();\n }\n }\n\n #onCastStateChanged() {\n // Cast state: NO_DEVICES_AVAILABLE, NOT_CONNECTED, CONNECTING, CONNECTED\n // https://developers.google.com/cast/docs/reference/web_sender/cast.framework#.CastState\n this.dispatchEvent(\n new CustomEvent('castchange', {\n detail: CastableVideo.#castContext.getCastState(),\n })\n );\n }\n\n async #onSessionStateChanged() {\n // Session states: NO_SESSION, SESSION_STARTING, SESSION_STARTED, SESSION_START_FAILED,\n // SESSION_ENDING, SESSION_ENDED, SESSION_RESUMED\n // https://developers.google.com/cast/docs/reference/web_sender/cast.framework#.SessionState\n\n const { SESSION_RESUMED } = cast.framework.SessionState;\n if (CastableVideo.#castContext.getSessionState() === SESSION_RESUMED) {\n /**\n * Figure out if this was the video that started the resumed session.\n * @TODO make this more specific than just checking against the video src!! (WL)\n *\n * If this video element can get the same unique id on each browser refresh\n * it would be possible to pass this unique id w/ `LoadRequest.customData`\n * and verify against CastableVideo.#currentMedia.customData below.\n */\n if (this.castSrc === CastableVideo.#currentMedia?.media.contentId) {\n CastableVideo.#castElement = this;\n\n Object.entries(this.#remoteListeners).forEach(([event, listener]) => {\n this.#remotePlayer.controller.addEventListener(event, listener);\n });\n\n /**\n * There is cast framework resume session bug when you refresh the page a few\n * times the this.#remotePlayer.currentTime will not be in sync with the receiver :(\n * The below status request syncs it back up.\n */\n try {\n await CastableVideo.#getMediaStatus(new chrome.cast.media.GetStatusRequest());\n } catch (error) {\n console.error(error);\n }\n\n // Dispatch the play, playing events manually to sync remote playing state.\n this.#remoteListeners[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED]();\n this.#remoteListeners[cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]();\n }\n }\n }\n\n #init() {\n if (!CastableVideo.#isCastFrameworkAvailable || this.castEnabled) return;\n this.castEnabled = true;\n CastableVideo.#setOptions();\n\n /**\n * @TODO add listeners for addtrack, removetrack (WL)\n * This only has an impact on <track> with a `src` because these have to be\n * loaded manually in the load() method. This will require a new load() call\n * for each added/removed track w/ src.\n */\n this.textTracks.addEventListener('change', this.#updateRemoteTextTrack.bind(this));\n\n this.#onCastStateChanged();\n\n this.#remotePlayer = new cast.framework.RemotePlayer();\n new cast.framework.RemotePlayerController(this.#remotePlayer);\n\n this.#remoteListeners = {\n [cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED]: ({ value }) => {\n if (value === false) {\n this.#disconnect();\n }\n this.dispatchEvent(new Event(value ? 'entercast' : 'leavecast'));\n },\n [cast.framework.RemotePlayerEventType.DURATION_CHANGED]: () => {\n this.dispatchEvent(new Event('durationchange'));\n },\n [cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED]: () => {\n this.dispatchEvent(new Event('volumechange'));\n },\n [cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED]: () => {\n this.dispatchEvent(new Event('volumechange'));\n },\n [cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED]: () => {\n if (!this.#isMediaLoaded) return;\n this.dispatchEvent(new Event('timeupdate'));\n },\n [cast.framework.RemotePlayerEventType.VIDEO_INFO_CHANGED]: () => {\n this.dispatchEvent(new Event('resize'));\n },\n [cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED]: () => {\n this.dispatchEvent(new Event(this.paused ? 'pause' : 'play'));\n },\n [cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED]: () => {\n // Player states: IDLE, PLAYING, PAUSED, BUFFERING\n // https://developers.google.com/cast/docs/reference/web_sender/chrome.cast.media#.PlayerState\n\n // pause event is handled above.\n if (this.castPlayer?.playerState === chrome.cast.media.PlayerState.PAUSED) {\n return;\n }\n this.dispatchEvent(\n new Event(\n {\n [chrome.cast.media.PlayerState.PLAYING]: 'playing',\n [chrome.cast.media.PlayerState.BUFFERING]: 'waiting',\n [chrome.cast.media.PlayerState.IDLE]: 'emptied',\n }[this.castPlayer?.playerState]\n )\n );\n },\n [cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED]: async () => {\n if (!this.#isMediaLoaded) return;\n\n // mediaInfo is not immediately available due to a bug? wait one tick\n await Promise.resolve();\n this.#onRemoteMediaLoaded();\n },\n };\n }\n\n async requestCast(options = {}) {\n CastableVideo.#setOptions(options);\n CastableVideo.#castElement = this;\n\n Object.entries(this.#remoteListeners).forEach(([event, listener]) => {\n this.#remotePlayer.controller.addEventListener(event, listener);\n });\n\n try {\n // Open browser cast menu.\n await CastableVideo.#castContext.requestSession();\n } catch (err) {\n CastableVideo.#castElement = undefined;\n // console.error(err); // Don't show an error if dismissing the menu.\n return;\n }\n\n // Pause locally when the session is created.\n this.#localState.paused = super.paused;\n super.pause();\n\n // Sync over the muted state but not volume, 100% is different on TV's :P\n this.muted = super.muted;\n\n try {\n await this.load();\n } catch (err) {\n console.error(err);\n }\n }\n\n async load() {\n if (!this.castPlayer) return super.load();\n\n const mediaInfo = new chrome.cast.media.MediaInfo(this.castSrc, this.castContentType);\n\n // Manually add text tracks with a `src` attribute.\n // M3U8's load text tracks in the receiver, handle these in the media loaded event.\n const subtitles = [...this.querySelectorAll('track')].filter(({ kind, src }) => {\n return src && (kind === 'subtitles' || kind === 'captions');\n });\n\n const activeTrackIds = [];\n let textTrackIdCount = 0;\n\n if (subtitles.length) {\n mediaInfo.tracks = subtitles.map((trackEl) => {\n const trackId = ++textTrackIdCount;\n // only activate 1 subtitle text track.\n if (activeTrackIds.length === 0 && trackEl.track.mode === 'showing') {\n activeTrackIds.push(trackId);\n }\n\n const track = new chrome.cast.media.Track(trackId, chrome.cast.media.TrackType.TEXT);\n track.trackContentId = trackEl.src;\n track.trackContentType = 'text/vtt';\n track.subtype =\n trackEl.kind === 'captions'\n ? chrome.cast.media.TextTrackType.CAPTIONS\n : chrome.cast.media.TextTrackType.SUBTITLES;\n track.name = trackEl.label;\n track.language = trackEl.srclang;\n return track;\n });\n }\n\n if (this.castStreamType === 'live') {\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n } else {\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n }\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.title = this.title;\n mediaInfo.metadata.images = [\n {\n url: this.poster,\n },\n ];\n\n const request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = super.currentTime ?? 0;\n request.autoplay = !this.#localState.paused;\n request.activeTrackIds = activeTrackIds;\n\n await CastableVideo.#currentSession?.loadMedia(request);\n\n this.dispatchEvent(new Event('volumechange'));\n }\n\n #onRemoteMediaLoaded() {\n this.#updateRemoteTextTrack();\n }\n\n async #updateRemoteTextTrack() {\n if (!this.castPlayer) return;\n\n // Get the tracks w/ trackId's that have been loaded; manually or via a playlist like a M3U8 or MPD.\n const remoteTracks = this.#remotePlayer.mediaInfo?.tracks ?? [];\n const remoteSubtitles = remoteTracks.filter(({ type }) => type === chrome.cast.media.TrackType.TEXT);\n\n const localSubtitles = [...this.textTracks].filter(({ kind }) => kind === 'subtitles' || kind === 'captions');\n\n // Create a new array from the local subs w/ the trackId's from the remote subs.\n const subtitles = remoteSubtitles\n .map(({ language, name, trackId }) => {\n // Find the corresponding local text track and assign the trackId.\n const { mode } = localSubtitles.find((local) => local.language === language && local.label === name) ?? {};\n if (mode) return { mode, trackId };\n return false;\n })\n .filter(Boolean);\n\n const hiddenSubtitles = subtitles.filter(({ mode }) => mode !== 'showing');\n const hiddenTrackIds = hiddenSubtitles.map(({ trackId }) => trackId);\n const showingSubtitle = subtitles.find(({ mode }) => mode === 'showing');\n\n // Note this could also include audio or video tracks, diff against local state.\n const activeTrackIds = CastableVideo.#currentSession?.getSessionObj().media[0]?.activeTrackIds ?? [];\n let requestTrackIds = activeTrackIds;\n\n if (activeTrackIds.length) {\n // Filter out all local hidden subtitle trackId's.\n requestTrackIds = requestTrackIds.filter((id) => !hiddenTrackIds.includes(id));\n }\n\n if (showingSubtitle?.trackId) {\n requestTrackIds = [...requestTrackIds, showingSubtitle.trackId];\n }\n\n // Remove duplicate ids.\n requestTrackIds = [...new Set(requestTrackIds)];\n\n const arrayEquals = (a, b) => a.length === b.length && a.every((a) => b.includes(a));\n if (!arrayEquals(activeTrackIds, requestTrackIds)) {\n try {\n const request = new chrome.cast.media.EditTracksInfoRequest(requestTrackIds);\n await CastableVideo.#editTracksInfo(request);\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n play() {\n if (this.castPlayer) {\n if (this.castPlayer.isPaused) {\n this.castPlayer.controller?.playOrPause();\n }\n return;\n }\n return super.play();\n }\n\n pause() {\n if (this.castPlayer) {\n if (!this.castPlayer.isPaused) {\n this.castPlayer.controller?.playOrPause();\n }\n return;\n }\n super.pause();\n }\n\n // Allow the cast source url to be different than <video src>, could be a blob.\n get castSrc() {\n // Try the first <source src> for usage with even more native markup.\n return this.getAttribute('cast-src') ?? this.querySelector('source')?.src ?? this.currentSrc;\n }\n\n set castSrc(val) {\n if (this.castSrc == val) return;\n this.setAttribute('cast-src', `${val}`);\n }\n\n get castContentType() {\n return this.getAttribute('cast-content-type') ?? undefined;\n }\n\n set castContentType(val) {\n this.setAttribute('cast-content-type', `${val}`);\n }\n\n get castStreamType() {\n return this.getAttribute('cast-stream-type') ?? undefined;\n }\n\n set castStreamType(val) {\n this.setAttribute('cast-stream-type', `${val}`);\n }\n\n get readyState() {\n if (this.castPlayer) {\n switch (this.castPlayer.playerState) {\n case chrome.cast.media.PlayerState.IDLE:\n return 0;\n case chrome.cast.media.PlayerState.BUFFERING:\n return 2;\n default:\n return 3;\n }\n }\n return super.readyState;\n }\n\n get paused() {\n if (this.castPlayer) return this.castPlayer.isPaused;\n return super.paused;\n }\n\n get muted() {\n if (this.castPlayer) return this.castPlayer?.isMuted;\n return super.muted;\n }\n\n set muted(val) {\n if (this.castPlayer) {\n if ((val && !this.castPlayer.isMuted) || (!val && this.castPlayer.isMuted)) {\n this.castPlayer.controller?.muteOrUnmute();\n }\n return;\n }\n super.muted = val;\n }\n\n get volume() {\n if (this.castPlayer) return this.castPlayer?.volumeLevel ?? 1;\n return super.volume;\n }\n\n set volume(val) {\n if (this.castPlayer) {\n this.castPlayer.volumeLevel = val;\n this.castPlayer.controller?.setVolumeLevel();\n return;\n }\n super.volume = val;\n }\n\n get duration() {\n // castPlayer duration returns `0` when no media is loaded.\n if (this.castPlayer && this.#isMediaLoaded) {\n return this.castPlayer?.duration ?? NaN;\n }\n return super.duration;\n }\n\n get currentTime() {\n if (this.castPlayer && this.#isMediaLoaded) {\n return this.castPlayer?.currentTime ?? 0;\n }\n return super.currentTime;\n }\n\n set currentTime(val) {\n if (this.castPlayer) {\n this.castPlayer.currentTime = val;\n this.castPlayer.controller?.seek();\n return;\n }\n super.currentTime = val;\n }\n\n get onentercast() {\n return this.#enterCastCallback;\n }\n\n set onentercast(callback) {\n if (this.#enterCastCallback) {\n this.removeEventListener('entercast', this.#enterCastCallback);\n this.#enterCastCallback = null;\n }\n if (typeof callback == 'function') {\n this.#enterCastCallback = callback;\n this.addEventListener('entercast', callback);\n }\n }\n\n get onleavecast() {\n return this.#leaveCastCallback;\n }\n\n set onleavecast(callback) {\n if (this.#leaveCastCallback) {\n this.removeEventListener('leavecast', this.#leaveCastCallback);\n this.#leaveCastCallback = null;\n }\n if (typeof callback == 'function') {\n this.#leaveCastCallback = callback;\n this.addEventListener('leavecast', callback);\n }\n }\n\n get oncastchange() {\n return this.#castChangeCallback;\n }\n\n set oncastchange(callback) {\n if (this.#castChangeCallback) {\n this.removeEventListener('castchange', this.#castChangeCallback);\n this.#castChangeCallback = null;\n }\n if (typeof callback == 'function') {\n this.#castChangeCallback = callback;\n this.addEventListener('castchange', callback);\n }\n }\n };\n\nif (globalThis.HTMLVideoElement && globalThis.customElements) {\n const CastableVideoElement = CastableVideoMixin(HTMLVideoElement);\n\n if (!globalThis.customElements.get('castable-video')) {\n globalThis.customElements.define('castable-video', CastableVideoElement, {\n extends: 'video',\n });\n globalThis.CastableVideoElement = CastableVideoElement;\n }\n\n CastableVideoElement.initCast();\n}\n", "import { globalThis, document } from 'shared-polyfills';\nimport 'castable-video';\n\n/**\n * Custom Video Element\n * The goal is to create an element that works just like the video element\n * but can be extended/sub-classed, because native elements cannot be\n * extended today across browsers.\n */\n\n// The onevent like props are weirdly set on the HTMLElement prototype with other\n// generic events making it impossible to pick these specific to HTMLMediaElement.\nexport const VideoEvents = [\n 'abort',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'emptied',\n 'encrypted',\n 'ended',\n 'error',\n 'loadeddata',\n 'loadedmetadata',\n 'loadstart',\n 'pause',\n 'play',\n 'playing',\n 'progress',\n 'ratechange',\n 'seeked',\n 'seeking',\n 'stalled',\n 'suspend',\n 'timeupdate',\n 'volumechange',\n 'waiting',\n 'waitingforkey',\n 'resize',\n 'enterpictureinpicture',\n 'leavepictureinpicture',\n 'castchange',\n 'entercast',\n 'leavecast',\n];\n\nconst template = document.createElement('template');\n// Could you get styles to apply by passing a global button from global to shadow?\n\ntemplate.innerHTML = `\n<style>\n :host {\n display: inline-block;\n line-height: 0;\n width: auto;\n height: auto;\n }\n\n video {\n max-width: 100%;\n max-height: 100%;\n min-width: 100%;\n min-height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, 50% 50%);\n }\n</style>\n<video is=\"castable-video\" part=\"video\" crossorigin></video>\n<slot></slot>\n`;\n\nclass CustomVideoElement extends globalThis.HTMLElement {\n #isInit;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n\n // If the custom element is defined before the <custom-video> HTML is parsed\n // no attributes will be available in the constructor (construction process).\n // Wait until initializing attributes in the attributeChangedCallback.\n // If this element is connected to the DOM, the attributes will be available.\n if (this.isConnected) {\n this.#init();\n }\n }\n\n #init() {\n if (this.#isInit) return;\n this.#isInit = true;\n\n this.shadowRoot.append(template.content.cloneNode(true));\n this.nativeEl = this.shadowRoot.querySelector('video');\n\n // The video events are dispatched on the CustomVideoElement instance.\n // This makes it possible to add event listeners before the element is upgraded.\n VideoEvents.forEach((type) => {\n this.nativeEl.addEventListener(type, (evt) => {\n this.dispatchEvent(new CustomEvent(evt.type, { detail: evt.detail }));\n });\n });\n\n // An unnamed <slot> will be filled with all of the custom element's\n // top-level child nodes that do not have the slot attribute.\n const slotEl = this.shadowRoot.querySelector('slot');\n slotEl.addEventListener('slotchange', () => {\n slotEl.assignedElements().forEach((el) => {\n if (!['track', 'source'].includes(el.localName)) return;\n this.nativeEl.append(el);\n });\n });\n\n // Initialize all the attribute properties\n // This is required before attributeChangedCallback is called after construction\n // so the initial state of all the attributes are forwarded to the native element.\n // Don't call attributeChangedCallback directly here because the extending class\n // could have overridden attributeChangedCallback leading to unexpected results.\n Array.prototype.forEach.call(this.attributes, (attrNode) => {\n this.#forwardAttribute(attrNode.name, null, attrNode.value);\n });\n\n // Neither Chrome or Firefox support setting the muted attribute\n // after using document.createElement.\n // One way to get around this would be to build the native tag as a string.\n // But just fixing it manually for now.\n // Apparently this may also be an issue with <input checked> for buttons\n if (this.nativeEl.defaultMuted) {\n this.nativeEl.muted = true;\n }\n }\n\n // observedAttributes is required to trigger attributeChangedCallback\n // for any attributes on the custom element.\n // Attributes need to be the lowercase word, e.g. crossorigin, not crossOrigin\n static get observedAttributes() {\n let attrs = [];\n\n const kebabCase = (name) => {\n return name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n };\n\n // Instead of manually creating a list of all observed attributes, observe\n // any getter/setter prop name (lowercase or kebab-case for custom builtins)\n Object.getOwnPropertyNames(this.prototype).forEach((propName) => {\n let isFunc = false;\n\n // Non-func properties throw errors because it's not an instance\n try {\n if (typeof this.prototype[propName] === 'function') {\n isFunc = true;\n }\n } catch (e) {}\n\n // Exclude functions and constants\n if (!isFunc && propName !== propName.toUpperCase()) {\n attrs.push(propName.toLowerCase(), kebabCase(propName));\n }\n });\n\n // Include any attributes from the super class (recursive)\n const supAttrs = Object.getPrototypeOf(this).observedAttributes;\n\n if (supAttrs) {\n attrs = attrs.concat(supAttrs);\n }\n\n return attrs;\n }\n\n attributeChangedCallback(attrName, oldValue, newValue) {\n // Initialize right after construction when the attributes become available.\n this.#init();\n\n this.#forwardAttribute(attrName, oldValue, newValue);\n }\n\n // We need to handle sub-class custom attributes differently from\n // attrs meant to be passed to the internal native el.\n #forwardAttribute(attrName, oldValue, newValue) {\n // Find the matching prop for custom attributes\n const ownProps = Object.getOwnPropertyNames(Object.getPrototypeOf(this));\n const propName = arrayFindAnyCase(ownProps, attrName);\n\n // Check if this is the original custom native elemnt or a subclass\n const isBaseElement = Object.getPrototypeOf(this.constructor).toString().indexOf('function HTMLElement') === 0;\n\n // If this is a subclass custom attribute we want to set the\n // matching property on the subclass\n if (propName && !isBaseElement) {\n // Boolean props should never start as null\n if (typeof this[propName] == 'boolean') {\n // null is returned when attributes are removed i.e. boolean attrs\n if (newValue === null) {\n this[propName] = false;\n } else {\n // The new value might be an empty string, which is still true\n // for boolean attributes\n this[propName] = true;\n }\n } else {\n this[propName] = newValue;\n }\n } else {\n // When this is the original Custom Element, or the subclass doesn't\n // have a matching prop, pass it through.\n if (newValue === null) {\n this.nativeEl.removeAttribute(attrName);\n } else {\n // Ignore a few that don't need to be passed through just in case\n // it creates unexpected behavior.\n if (['id', 'class'].indexOf(attrName) === -1) {\n this.nativeEl.setAttribute(attrName, newValue);\n }\n }\n }\n }\n\n connectedCallback() {\n this.#init();\n }\n}\n\n// Map all native element properties to the custom element\n// so that they're applied to the native element.\n// Skipping HTMLElement because of things like \"attachShadow\"\n// causing issues. Most of those props still need to apply to\n// the custom element.\nlet nativeElProps = [];\n\n// Can't check typeof directly on element prototypes without\n// throwing Illegal Invocation errors, so creating an element\n// to check on instead.\nconst nativeElTest = document.createElement('video', {\n is: 'castable-video',\n});\n\n// Deprecated props throw warnings if used, so exclude them\nconst deprecatedProps = ['webkitDisplayingFullscreen', 'webkitSupportsFullscreen'];\n\n// Walk the prototype chain up to HTMLElement.\n// This will grab all super class props in between.\n// i.e. VideoElement and MediaElement\nfor (\n let proto = Object.getPrototypeOf(nativeElTest);\n proto && proto !== globalThis.HTMLElement.prototype;\n proto = Object.getPrototypeOf(proto)\n) {\n Object.getOwnPropertyNames(proto).forEach((key) => {\n if (deprecatedProps.indexOf(key) === -1) {\n nativeElProps.push(key);\n }\n });\n}\n\n// Passthrough native el functions from the custom el to the native el\nnativeElProps.forEach((prop) => {\n if (prop in CustomVideoElement.prototype) return;\n\n const type = typeof nativeElTest[prop];\n if (type == 'function') {\n // Function\n CustomVideoElement.prototype[prop] = function () {\n return this.nativeEl[prop].apply(this.nativeEl, arguments);\n };\n } else {\n // Getter\n let config = {\n get() {\n return this.nativeEl[prop];\n },\n };\n\n if (prop !== prop.toUpperCase()) {\n // Setter (not a CONSTANT)\n config.set = function (val) {\n this.nativeEl[prop] = val;\n };\n }\n\n Object.defineProperty(CustomVideoElement.prototype, prop, config);\n }\n});\n\nfunction arrayFindAnyCase(arr, word) {\n let found = null;\n\n arr.forEach((item) => {\n if (item.toLowerCase() == word.toLowerCase()) {\n found = item;\n }\n });\n\n return found;\n}\n\nif (!globalThis.customElements.get('custom-video')) {\n globalThis.customElements.define('custom-video', CustomVideoElement);\n globalThis.CustomVideoElement = CustomVideoElement;\n}\n\nexport default CustomVideoElement;\n"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "Attributes", "VideoEvents", "src_default", "__toCommonJS", "EventTarget", "_event", "DocumentFragment", "HTMLElement", "HTMLVideoElement", "customElements", "_name", "_constructor", "_options", "_root", "_detail", "CustomEvent", "typeArg", "eventInitDict", "__privateAdd", "__privateSet", "__privateGet", "createElement", "_tagName", "globalThisShim", "isServer", "GlobalThis", "Document", "import_playback_core", "getEnvPlayerVersion", "player_version", "getPlayerVersion", "IterableWeakSet", "el", "fn", "ref", "value", "CastableVideoMixin", "superclass", "_a", "_castElement", "_castEnabled", "_onSdkLoaded", "_isChromeCastAvailable", "isChromeCastAvailable_get", "_isCastFrameworkAvailable", "isCastFrameworkAvailable_get", "_castContext", "castContext_get", "_currentSession", "currentSession_get", "_currentMedia", "currentMedia_get", "_editTracksInfo", "editTracksInfo_fn", "_getMediaStatus", "getMediaStatus_fn", "_setOptions", "setOptions_fn", "_localState", "_remotePlayer", "_remoteListeners", "_enterCastCallback", "_leaveCastCallback", "_castChangeCallback", "_isMediaLoaded", "isMediaLoaded_get", "_disconnect", "disconnect_fn", "_onCastStateChanged", "onCastStateChanged_fn", "_onSessionStateChanged", "onSessionStateChanged_fn", "_init", "init_fn", "_onRemoteMediaLoaded", "onRemoteMediaLoaded_fn", "_updateRemoteTextTrack", "updateRemoteTextTrack_fn", "__privateAdd", "__publicField", "__privateMethod", "__privateGet", "err", "attrName", "options", "__privateSet", "event", "listener", "_b", "mediaInfo", "subtitles", "kind", "src", "activeTrackIds", "textTrackIdCount", "trackEl", "trackId", "track", "request", "_c", "val", "callback", "resolve", "reject", "SESSION_RESUMED", "error", "_d", "_e", "_f", "remoteSubtitles", "type", "localSubtitles", "language", "name", "mode", "local", "hiddenTrackIds", "showingSubtitle", "requestTrackIds", "id", "a", "b", "isAvailable", "CAST_STATE_CHANGED", "e", "video", "SESSION_STATE_CHANGED", "CastableVideoElement", "VideoEvents", "template", "Document", "_isInit", "_init", "init_fn", "_forwardAttribute", "forwardAttribute_fn", "CustomVideoElement", "GlobalThis", "__privateAdd", "__privateMethod", "attrs", "kebabCase", "name", "propName", "isFunc", "supAttrs", "attrName", "oldValue", "newValue", "__privateGet", "__privateSet", "type", "evt", "slotEl", "el", "attrNode", "ownProps", "arrayFindAnyCase", "isBaseElement", "nativeElProps", "nativeElTest", "deprecatedProps", "proto", "key", "prop", "config", "val", "arr", "word", "found", "item", "CustomVideoElement_default", "Attributes", "AttributeNameValues", "playerSoftwareVersion", "getPlayerVersion", "playerSoftwareName", "_core", "_loadRequested", "_playerInitTime", "_metadata", "_playerSoftwareVersion", "_playerSoftwareName", "_errorTranslator", "_requestLoad", "requestLoad_fn", "MuxVideoElement", "CustomVideoElement_default", "__privateAdd", "__privateSet", "_a", "value", "__privateGet", "val", "attr", "currentVal", "num", "cuePoints", "attrName", "currAttrs", "oldValue", "newValue", "_b", "hadSrc", "hasSrc", "__privateMethod", "debug", "resp", "json", "GlobalThis", "src_default", "MuxVideoElement"]
7
7
  }