@vindral/web-sdk 3.0.7 → 3.0.8

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/index.mjs CHANGED
@@ -3664,10 +3664,10 @@ const dt = class {
3664
3664
  t(this, "reset", () => {
3665
3665
  });
3666
3666
  t(this, "load", () => {
3667
- this.mediaElement.load(), this.emitter.on("decoded frame", this.onDecodedFrame), this.emitter.on("flush buffers", this.flushBuffers), this.emitter.on("ios-hack: reset size", this.resetCanvasSize), this.emitter.on("enter picture in picture", this.onEnterPictureInPicture), this.emitter.on("exit picture in picture", this.onExitPictureInPicture), this.videoPlayer.load();
3667
+ this.mediaElement.load(), this.emitter.on("decoded frame", this.onDecodedFrame), this.emitter.on("flush buffers", this.flushBuffers), this.emitter.on("ios-hack: reset size", this.resetCanvasSize), this.emitter.on("enter picture in picture", this.onEnterIOSHack), this.emitter.on("exit picture in picture", this.onExitIOSHack), this.element().element.addEventListener("webkitendfullscreen", this.onExitIOSHack), this.element().element.addEventListener("webkitbeginfullscreen", this.onEnterIOSHack), this.videoPlayer.load();
3668
3668
  });
3669
3669
  t(this, "unload", () => {
3670
- this.emitter.off("decoded frame", this.onDecodedFrame), this.emitter.off("flush buffers", this.flushBuffers), this.emitter.off("ios-hack: reset size", this.resetCanvasSize), this.emitter.off("enter picture in picture", this.onEnterPictureInPicture), this.emitter.off("exit picture in picture", this.onExitPictureInPicture), this.mediaElement.unload(), this.audioPlayer.unload(), this.videoPlayer.unload();
3670
+ this.emitter.off("decoded frame", this.onDecodedFrame), this.emitter.off("flush buffers", this.flushBuffers), this.emitter.off("ios-hack: reset size", this.resetCanvasSize), this.emitter.off("enter picture in picture", this.onEnterIOSHack), this.emitter.off("exit picture in picture", this.onExitIOSHack), this.element().element.removeEventListener("webkitendfullscreen", this.onExitIOSHack), this.element().element.removeEventListener("webkitbeginfullscreen", this.onEnterIOSHack), this.mediaElement.unload(), this.audioPlayer.unload(), this.videoPlayer.unload();
3671
3671
  });
3672
3672
  t(this, "suspend", () => {
3673
3673
  this.videoPlayer.suspend(), this.audioPlayer.suspend();
@@ -3684,10 +3684,10 @@ const dt = class {
3684
3684
  t(this, "resetCanvasSize", () => {
3685
3685
  this.videoPlayer.resetSize();
3686
3686
  });
3687
- t(this, "onEnterPictureInPicture", () => {
3687
+ t(this, "onEnterIOSHack", () => {
3688
3688
  this.mediaElement._iosHackEnterPiPMode();
3689
3689
  });
3690
- t(this, "onExitPictureInPicture", () => {
3690
+ t(this, "onExitIOSHack", () => {
3691
3691
  this.mediaElement._iosHackExitPiPMode();
3692
3692
  });
3693
3693
  t(this, "onDecodedFrame", (A) => {
@@ -5136,7 +5136,7 @@ const pB = (i) => {
5136
5136
  const e = this.modules.canvasModule ? this.options.get("iosMediaElementEnabled") : void 0;
5137
5137
  return r({
5138
5138
  uptime: Date.now() - this.createdAt,
5139
- version: "3.0.7",
5139
+ version: "3.0.8",
5140
5140
  clientId: this.clientId,
5141
5141
  sessionId: this.sessionId,
5142
5142
  channelId: this.channelId,
package/index.umd.js CHANGED
@@ -23,8 +23,8 @@ void main() {
23
23
  texture_coordinate = position;
24
24
  gl_Position = model * vec4(position, 0.0, 1.0);
25
25
  }
26
- `,Si=(i,A)=>{let e=i.getContext("webgl",A);if(e||(e=i.getContext("experimental-webgl",A)),!e)throw new f("Failed to create webgl context",{isFatal:!0,code:"failed_to_create_web_gl_context"});return e},ce=(i,A,e)=>{const g=i.createShader(A);if(!g)throw new f("Failed to create shader",{isFatal:!0,code:"failed_to_create_shader"});if(i.shaderSource(g,e),i.compileShader(g),!i.getShaderParameter(g,i.COMPILE_STATUS)){const s=i.getShaderInfoLog(g);throw new f(`Failed to compile shader: ${s!=null?s:""}`,{isFatal:!0,code:"failed_to_compile_shader"})}return g},GA=i=>{const A=i.createTexture();if(!A)throw new f("Failed to create texture",{isFatal:!0,code:"failed_to_create_texture"});return i.bindTexture(i.TEXTURE_2D,A),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),A},Di=(i,A)=>{const e=i.createBuffer();if(!e)throw new f("Failed to create buffer",{isFatal:!0,code:"failed_to_create_buffer"});return i.bindBuffer(i.ARRAY_BUFFER,e),i.bufferData(i.ARRAY_BUFFER,A.buffer,i.STATIC_DRAW),e},fi=(i,A,e)=>{const g=i.createProgram();if(!g)throw new f("Failed to create program",{isFatal:!0,code:"failed_to_create_program"});if(i.attachShader(g,e),i.attachShader(g,A),i.linkProgram(g),!i.getProgramParameter(g,i.LINK_STATUS)){const s=i.getShaderInfoLog(g);throw new f(`Failed to link program: ${s!=null?s:""}`,{isFatal:!0,code:"failed_to_link_program"})}return g},pi={width:256,codedWidth:256,height:144,codedHeight:144},Fi={preserveDrawingBuffer:!1,alpha:!1,depth:!1,stencil:!1,antialias:!1,premultipliedAlpha:!1},Ne=class extends AA{constructor(){super();t(this,"canvas",document.createElement("canvas"));t(this,"context",Si(this.canvas,Fi));t(this,"pixelShader",ce(this.context,this.context.FRAGMENT_SHADER,mi));t(this,"vertexShader",ce(this.context,this.context.VERTEX_SHADER,wi));t(this,"buffer",Di(this.context,Ne.SQUARE_VERTICES));t(this,"program",fi(this.context,this.vertexShader,this.pixelShader));t(this,"textures",{y:GA(this.context),u:GA(this.context),v:GA(this.context)});t(this,"size",pi);t(this,"onContextLost",e=>{const g=new Error(e instanceof WebGLContextEvent?e.statusMessage:"webgl context lost");this.emit("context lost",Cs(g)),e.preventDefault()});t(this,"onContextRestored",()=>{this.emit("context restored"),this.context=Si(this.canvas,Fi),this.pixelShader=ce(this.context,this.context.FRAGMENT_SHADER,mi),this.vertexShader=ce(this.context,this.context.VERTEX_SHADER,wi),this.buffer=Di(this.context,Ne.SQUARE_VERTICES),this.program=fi(this.context,this.vertexShader,this.pixelShader),this.textures={y:GA(this.context),u:GA(this.context),v:GA(this.context)},this.load()});t(this,"load",()=>{this.context.useProgram(this.program),this.setupPositionVertexAttributes(),this.setSize(pi),this.context.uniform1i(this.context.getUniformLocation(this.program,"y_texture"),0),this.context.uniform1i(this.context.getUniformLocation(this.program,"u_texture"),1),this.context.uniform1i(this.context.getUniformLocation(this.program,"v_texture"),2),this.setConversionMatrix(this.rec709())});t(this,"unload",()=>{var g;this.setSize({width:1,height:1,codedHeight:1,codedWidth:1}),[this.textures.y,this.textures.u,this.textures.v].forEach(s=>this.context.deleteTexture(s)),this.context.deleteShader(this.pixelShader),this.context.deleteShader(this.vertexShader),this.context.deleteProgram(this.program),this.context.deleteBuffer(this.buffer),this.canvas.removeEventListener("webglcontextlost",this.onContextLost),this.canvas.removeEventListener("webglcontextrestored",this.onContextRestored),(g=this.context.getExtension("WEBGL_lose_context"))==null||g.loseContext()});t(this,"resetSize",()=>{this.setSize({width:this.size.width/2,height:this.size.height/2,codedHeight:this.size.codedHeight/2,codedWidth:this.size.codedWidth/2})});t(this,"render",e=>{this.setSize({width:e.width,height:e.height,codedWidth:e.codedWidth,codedHeight:e.codedHeight}),this.context.activeTexture(this.context.TEXTURE0),this.updateTexture(this.textures.y,this.size.codedWidth,this.size.codedHeight,e.data[0]),this.context.activeTexture(this.context.TEXTURE1),this.updateTexture(this.textures.u,this.size.codedWidth/2,this.size.codedHeight/2,e.data[1]),this.context.activeTexture(this.context.TEXTURE2),this.updateTexture(this.textures.v,this.size.codedWidth/2,this.size.codedHeight/2,e.data[2]),this.context.drawArrays(this.context.TRIANGLE_STRIP,0,4)});t(this,"updateTexture",(e,g,s,I)=>{const n=this.context.LUMINANCE,o=this.context.UNSIGNED_BYTE;this.context.bindTexture(this.context.TEXTURE_2D,e),this.context.texImage2D(this.context.TEXTURE_2D,0,n,g,s,0,n,o,I)});t(this,"setupPositionVertexAttributes",()=>{const e=this.context.getAttribLocation(this.program,"position");this.context.enableVertexAttribArray(e),this.context.vertexAttribPointer(e,2,this.context.FLOAT,!1,0,0)});t(this,"setSize",e=>{rA(e,this.size)||(this.size=e,this.canvas.setAttribute("width",e.width.toString()),this.canvas.setAttribute("height",e.height.toString()),this.context.viewport(0,0,e.width,e.height),this.setModelMatrix(e.width/e.codedWidth,e.height/e.codedHeight))});t(this,"setModelMatrix",(e,g)=>{const s=this.context.getUniformLocation(this.program,"model");this.context.uniformMatrix4fv(s,!1,this.transformMatrix(e,g))});t(this,"setConversionMatrix",e=>{const g=this.context.getUniformLocation(this.program,"conversion");this.context.uniformMatrix4fv(g,!1,e)});t(this,"transformMatrix",(e,g)=>[2/e,0,0,0,0,-2/g,0,0,0,0,2/1,0,-1,1,0,1]);t(this,"rec709",()=>[1.16438,0,1.79274,-.97295,1.16438,-.21325,-.53291,.30148,1.16438,2.1124,0,-1.1334,0,0,0,1]);t(this,"rec601",()=>[1.16438,0,1.59603,-.87079,1.16438,-.39176,-.81297,.52959,1.16438,2.01723,0,-1.08139,0,0,0,1]);this.canvas.addEventListener("webglcontextlost",this.onContextLost),this.canvas.addEventListener("webglcontextrestored",this.onContextRestored,!1),this.canvas.style.width="100%",this.canvas.style.position="relative"}};let de=Ne;t(de,"SQUARE_VERTICES",new Float32Array([0,0,0,1,1,0,1,1]));const ct=class{constructor(A,e,g){t(this,"oldTimestampLimit",400);t(this,"pool");t(this,"logger");t(this,"videoRenderer",new de);t(this,"renderQueue",[]);t(this,"clockSource");t(this,"isFirstFrame",!0);t(this,"animationFrameRequest");t(this,"renderedFrameCount",0);t(this,"rendererDroppedFrameCount",0);t(this,"load",()=>{this.videoRenderer.load()});t(this,"unload",()=>(this.stopRender(),this.videoRenderer.unload(),Promise.resolve()));t(this,"suspend",()=>{this.renderQueue=[],this.stopRender()});t(this,"unsuspend",()=>{this.animationFrameRequest=requestAnimationFrame(this.render)});t(this,"element",()=>this.videoRenderer.canvas);t(this,"getStatistics",()=>({renderedFrameCount:this.renderedFrameCount,rendererDroppedFrameCount:this.rendererDroppedFrameCount,contextLostCount:0,contextRestoredCount:0}));t(this,"resetSize",()=>{this.videoRenderer.resetSize()});t(this,"onDecodedFrame",A=>{if(A.type==="video")if(this.isFirstFrame)this.isFirstFrame=!1,requestAnimationFrame(()=>{this.renderSample(A)});else{const e=(this.clockSource.currentTime-this.oldTimestampLimit)/1e3;this.renderQueue=this.renderQueue.filter(g=>{const s=g.timestamp/g.timescale,I=A.timestamp/A.timescale,B=s>e&&s<=I;return B||this.pool.reclaim(g.buffer),B}),this.renderQueue.push(A)}});t(this,"render",()=>{const A=this.clockSource.currentTime;let e=this.renderQueue[0],g,s=0;for(;e&&e.timestamp/e.timescale*1e3<=A;)e=this.renderQueue.shift(),e&&(s++,g&&this.pool.reclaim(g.buffer),g=e),e=this.renderQueue[0];g&&this.renderSample(g),this.rendererDroppedFrameCount+=Math.max(s-1,0),this.animationFrameRequest=requestAnimationFrame(this.render)});t(this,"renderSample",A=>{this.renderedFrameCount++,this.videoRenderer.render(A),this.pool.reclaim(A.buffer)});t(this,"stopRender",()=>{this.animationFrameRequest&&cancelAnimationFrame(this.animationFrameRequest)});this.logger=A,this.clockSource=e,this.pool=g}};let WA=ct;t(WA,"create",(A,e,g)=>new ct(A,e,g));const mA=(i,A)=>{let e;for(e=A;i>1;i--)e+=A;return e};class CB{constructor(){t(this,"audio");t(this,"unmute",()=>this.audio.play().catch(eA));const A=document.createElement("div");A.innerHTML="<audio x-webkit-airplay='deny'></audio>";const e=A.children.item(0);if(e instanceof HTMLAudioElement)this.audio=e,this.audio.controls=!1,this.audio.disableRemotePlayback=!0,this.audio.preload="auto",this.audio.src="data:audio/mpeg;base64,//uQx"+mA(23,"A")+"WGluZwAAAA8AAAACAAACcQCA"+mA(16,"gICA")+mA(66,"/")+"8AAABhTEFNRTMuMTAwA8MAAAAAAAAAABQgJAUHQQAB9AAAAnGMHkkI"+mA(320,"A")+"//sQxAADgnABGiAAQBCqgCRMAAgEAH"+mA(15,"/")+"7+n/9FTuQsQH//////2NG0jWUGlio5gLQTOtIoeR2WX////X4s9Atb/JRVCbBUpeRUq"+mA(18,"/")+"9RUi0f2jn/+xDECgPCjAEQAABN4AAANIAAAAQVTEFNRTMuMTAw"+mA(97,"V")+"Q==",this.audio.loop=!1,this.audio.load();else throw new Error("Failed to create audio tag")}}const dt=class{constructor(A,e,g,s,I){t(this,"logger");t(this,"emitter");t(this,"audioPlayer");t(this,"videoPlayer");t(this,"pool");t(this,"unmuter",new CB);t(this,"_isPaused",!1);t(this,"isDisconnected",!1);t(this,"reset",()=>{});t(this,"load",()=>{this.audioPlayer.useDefaultDestination(),this.emitter.on("decoded frame",this.onDecodedFrame),this.emitter.on("flush buffers",this.flushBuffers),this.videoPlayer.load()});t(this,"unload",()=>{this.emitter.off("decoded frame",this.onDecodedFrame),this.emitter.off("flush buffers",this.flushBuffers),this.audioPlayer.unload(),this.videoPlayer.unload()});t(this,"suspend",()=>{this.videoPlayer.suspend(),this.audioPlayer.suspend()});t(this,"unsuspend",()=>{this.videoPlayer.unsuspend(),this.audioPlayer.unsuspend()});t(this,"element",()=>this.videoPlayer.element());t(this,"getStatistics",()=>this.videoPlayer.getStatistics());t(this,"flushBuffers",()=>{this.audioPlayer.flushBuffer()});t(this,"activateAudioPlayer",()=>(this.isDisconnected&&(this.isDisconnected=!1,this.audioPlayer.useDefaultDestination()),this._isPaused=!1,this.unmuter.unmute(),this.audioPlayer.play()));t(this,"onDecodedFrame",A=>{try{this.audioPlayer.onDecodedFrame(A)}catch(e){e instanceof Error&&this.emitter.emit("error",_t(!1,e))}this.videoPlayer.onDecodedFrame(A)});this.logger=e,this.emitter=A,this.pool=g,this.audioPlayer=xA.create(this.logger.getLogger("AudioPlayerModule"),s,{muted:I,reInitWhenStuck:!0}),this.audioPlayer.on("stuck",()=>{this.isDisconnected=!0}),this.audioPlayer.on("state change",()=>{this.emitter.emit("volume state",{volume:this.volume,isMuted:this.muted})}),this.videoPlayer=WA.create(this.logger.getLogger("VideoPlayerModule"),this.audioPlayer,this.pool)}get volume(){return this.audioPlayer.volume}set volume(A){this.audioPlayer.volume=A}get muted(){return this.audioPlayer.muted}set muted(A){const e=this.muted;this.audioPlayer.muted=A,!A&&e&&this.activateAudioPlayer().catch(eA)}get currentTime(){return this.audioPlayer.currentTime}set currentTime(A){this.audioPlayer.currentTime=A}get isActivated(){return this.audioPlayer.isActivated}set isActivated(A){this.audioPlayer.isActivated=A}get seekTime(){return this.audioPlayer.seekTime}get isPaused(){return this._isPaused}get isSeeking(){return this.audioPlayer.isSeeking}play(){return m(this,null,function*(){try{yield this.activateAudioPlayer()}catch(A){this.emitter.emit("needs user input",{forAudio:!0,forVideo:!1})}this.emitter.emit("media element state","playing")})}pause(){this._isPaused=!0,this.audioPlayer.pause(),this.emitter.emit("media element state","paused")}};let le=dt;t(le,"create",(A,e,g,s,I)=>new dt(A,e,g,s,I));const yi=Object.values(PA),Ri=(i,A)=>yi.indexOf(i)<yi.indexOf(A),lt=class{constructor(){t(this,"level",PA.DEBUG);t(this,"categoryLevels",new Map);t(this,"getLogger",A=>new Ye({category:A,onLog:this.onLog}));t(this,"setLevel",(A,e)=>{e?this.categoryLevels.set(e,A):this.level=A});t(this,"unload",()=>{});t(this,"onLog",(A,e,g,s)=>{if(Ri(e,this.level))return;const I=A.category(),B=this.categoryLevels.get(I);if(B&&Ri(e,B))return;const n=A.getFullCategory().reduceRight((C,a)=>(C.length?C+" > ":"")+a,""),o=`[${new Date().toISOString()}][${e}][${n}] ${g}`;console.log(o,s)})}};let ue=lt;t(ue,"create",()=>new lt);const ut=class{constructor(A,e,g,s,{muted:I,type:B,poster:n}){t(this,"logger");t(this,"emitter");t(this,"mediaElement");t(this,"audioPlayer");t(this,"videoPlayer");t(this,"pool");t(this,"isDisconnected",!0);t(this,"_userProvidedMuted",!1);t(this,"volumeState");t(this,"reset",()=>{});t(this,"load",()=>{this.mediaElement.load(),this.emitter.on("decoded frame",this.onDecodedFrame),this.emitter.on("flush buffers",this.flushBuffers),this.emitter.on("ios-hack: reset size",this.resetCanvasSize),this.emitter.on("enter picture in picture",this.onEnterPictureInPicture),this.emitter.on("exit picture in picture",this.onExitPictureInPicture),this.videoPlayer.load()});t(this,"unload",()=>{this.emitter.off("decoded frame",this.onDecodedFrame),this.emitter.off("flush buffers",this.flushBuffers),this.emitter.off("ios-hack: reset size",this.resetCanvasSize),this.emitter.off("enter picture in picture",this.onEnterPictureInPicture),this.emitter.off("exit picture in picture",this.onExitPictureInPicture),this.mediaElement.unload(),this.audioPlayer.unload(),this.videoPlayer.unload()});t(this,"suspend",()=>{this.videoPlayer.suspend(),this.audioPlayer.suspend()});t(this,"unsuspend",()=>{this.videoPlayer.unsuspend(),this.audioPlayer.unsuspend()});t(this,"element",()=>this.mediaElement);t(this,"getStatistics",()=>this.videoPlayer.getStatistics());t(this,"activateAudioPlayer",()=>(this.isDisconnected&&this.connectStreams(),this.audioPlayer.play()));t(this,"flushBuffers",()=>{this.audioPlayer.flushBuffer()});t(this,"resetCanvasSize",()=>{this.videoPlayer.resetSize()});t(this,"onEnterPictureInPicture",()=>{this.mediaElement._iosHackEnterPiPMode()});t(this,"onExitPictureInPicture",()=>{this.mediaElement._iosHackExitPiPMode()});t(this,"onDecodedFrame",A=>{try{this.audioPlayer.onDecodedFrame(A)}catch(e){e instanceof Error&&this.emitter.emit("error",_t(!1,e))}this.videoPlayer.onDecodedFrame(A)});t(this,"connectStreams",()=>{const A=this.videoPlayer.element().captureStream(),e=this.audioPlayer.useMediaStreamDestination().stream,g=[];g.push(...A.getTracks(),...e.getTracks()),this.mediaElement.element.srcObject=new MediaStream(g),this.isDisconnected=!1});t(this,"updateVolumeState",()=>{const A={isMuted:this.muted,volume:this.volume};rA(A,this.volumeState)||(this.volumeState=A,this.emitter.emit("volume state",this.volumeState))});this.logger=e,this.emitter=A,this.pool=g,this._userProvidedMuted=I,this.mediaElement=new Oe({poster:n,type:B,muted:I,autoplay:!1,logger:this.logger.getLogger("MediaElement")}),this.mediaElement.on("volume state",o=>{this.updateVolumeState(),!o.isMuted&&!this.audioPlayer.isContextRunning&&this.activateAudioPlayer().catch(eA),o.isMuted||(this._userProvidedMuted=!1)}),this.mediaElement.on("media element state",o=>{o==="paused"&&this.audioPlayer.flushBuffer(),this.emitter.emit("media element state",o)}),this.audioPlayer=xA.create(this.logger.getLogger("AudioPlayerModule"),s,{muted:!1,reInitWhenStuck:!1}),this.audioPlayer.on("stuck",()=>{this.isDisconnected=!0}),this.audioPlayer.on("state change",o=>{o==="suspended"||o==="interrupted"?this.mediaElement.muted=!0:o==="running"&&(this.mediaElement.muted=this._userProvidedMuted||document.visibilityState==="hidden"),this.updateVolumeState()}),this.videoPlayer=WA.create(this.logger.getLogger("VideoPlayerModule"),this.audioPlayer,this.pool),this.volumeState={volume:this.volume,isMuted:this.muted}}get volume(){return this.mediaElement.volume}set volume(A){this.mediaElement.volume=A}get muted(){return this.mediaElement.muted||this.audioPlayer.muted}set muted(A){const e=this.muted;this._userProvidedMuted=A,this.mediaElement.muted=A,!A&&e&&this.activateAudioPlayer().catch(eA)}get currentTime(){return this.audioPlayer.currentTime}set currentTime(A){this.audioPlayer.currentTime=A}get isActivated(){return this.mediaElement.isActivated}set isActivated(A){this.mediaElement.isActivated=A}get seekTime(){return this.mediaElement.seekTime}get isPaused(){return this.mediaElement.isPaused}get isSeeking(){return this.mediaElement.isSeeking}play(){return m(this,null,function*(){const A=this._userProvidedMuted;return this.activateAudioPlayer().catch(()=>{A||this.emitter.emit("needs user input",{forAudio:!0,forVideo:!1})}),this.mediaElement.play()})}pause(){this.mediaElement.pause()}};let me=ut;t(me,"create",(A,e,g,s,I)=>new ut(A,e,g,s,I));class Gi{constructor(){t(this,"initSegments",new Map);t(this,"set",(A,e,g)=>{var I;const s=(I=this.initSegments.get(A))!=null?I:new Map;s.set(e,g),this.initSegments.set(A,s)});t(this,"get",(A,e)=>{var g;return(g=this.initSegments.get(A))==null?void 0:g.get(e)})}}function QB(i,{mediaSource:A,mimeType:e}){return L(r({},i),{state:"initialized",mimeType:e,sourceBuffer:A.addSourceBuffer(e),isWorkingOnPendingSamples:!1,sequenceNumber:0})}function ki({initSegments:i,pendingSamples:A}){return{state:"uninitialized",initSegments:i!=null?i:new Gi,sequenceNumber:0,isWorkingOnPendingSamples:!1,hasFirstSync:!!A,pendingSamples:A!=null?A:[],consecutiveQuotaExceededErrorCount:0,successfulAppendCalls:0}}const mt=class{constructor(A,e,g){t(this,"maxChunkSize",20);t(this,"minConsecutiveErrorsBeforeEmit",5);t(this,"logger");t(this,"timers",O.create());t(this,"emitter");t(this,"mediaElement");t(this,"mediaSource",new ai);t(this,"trackContexts",new Map);t(this,"autoRecoverFromMediaErrors",!0);t(this,"quotaErrorCount",0);t(this,"recoveredFromErrorCount",0);t(this,"sourceOpenStartTime",Date.now());t(this,"sourceOpenEndTime",Date.now());t(this,"pendingTracksToAddSourceBuffers");t(this,"hasAddedInitialPosterFrame",!0);t(this,"load",()=>{this.emitter.on("init segment",this.init),this.emitter.on("coded sample",this.onCodedSample),this.emitter.on("flush buffers",this.flushBuffers)});t(this,"unload",()=>{this.logger.debug("Unloading module..."),this.emitter.off("init segment",this.init),this.emitter.off("coded sample",this.onCodedSample),this.emitter.off("flush buffers",this.flushBuffers),this.mediaSource.off("source ended",this.onSourceEnded),this.mediaSource.off("source open",this.onSourceOpen),this.trackContexts.forEach(A=>A.pendingSamples=[]),this.timers.unload(),this.logger.debug("Unloaded module")});t(this,"getStatistics",()=>{var e,g,s,I;const A={quotaErrorCount:this.quotaErrorCount,mediaSourceOpenTime:this.sourceOpenEndTime-this.sourceOpenStartTime,successfulAudioAppendsCalls:(e=this.trackContexts.get("audio"))==null?void 0:e.successfulAppendCalls,successfulVideoAppendCalls:(g=this.trackContexts.get("video"))==null?void 0:g.successfulAppendCalls};if(this.mediaElement instanceof HTMLVideoElement){const B=(I=(s=this.mediaElement).getVideoPlaybackQuality)==null?void 0:I.call(s);A.totalVideoFrames=B==null?void 0:B.totalVideoFrames,A.droppedVideoFrames=B==null?void 0:B.droppedVideoFrames}return A});t(this,"flushBuffers",()=>{this.trackContexts.forEach(A=>{A.pendingSamples=[],A.hasFirstSync=!1,A.state!=="uninitialized"&&this.mediaSource.isOpen()&&A.sourceBuffer.removeBuffer(0,Number.POSITIVE_INFINITY).catch(e=>{this.logger.error("Failed to remove buffer",{error:e})})})});t(this,"setTrackContexts",(...e)=>m(this,[...e],function*(A=new Map){this.logger.debug("setTrackContexts"),["audio","video"].forEach(s=>{var n,o,C,a;const I=(o=(n=A.get(s))==null?void 0:n.pendingSamples)!=null?o:[],B=(C=A.get(s))==null?void 0:C.initSegments;for(;I.length>0&&!((a=I[0])!=null&&a.isSync);)I.shift();this.trackContexts.set(s,ki({pendingSamples:I,initSegments:B}))})}));t(this,"setSourceBuffers",A=>m(this,null,function*(){if(this.mediaSource.isClosed()){this.pendingTracksToAddSourceBuffers=A;return}let e=!0;for(const g of A){const s=this.trackContexts.get(g.type);if(!s||s.state==="uninitialized"||s.mimeType!==g.mimeType){e=!1;break}}if(e){this.logger.debug("Already setup with the correct mime types");return}for(const g of A){let s=this.trackContexts.get(g.type);s||(s=ki({pendingSamples:[],initSegments:new Gi}),this.trackContexts.set(g.type,s)),s.state==="initialized"?g.mimeType!==s.mimeType&&(yield s.sourceBuffer.changeType(g.mimeType)):this.trackContexts.set(g.type,QB(s,{mimeType:g.mimeType,mediaSource:this.mediaSource}))}}));t(this,"getBuffer",A=>{const e=[];if(this.mediaSource.isClosed())return[];const g=this.trackContexts.get(A);if(!g||g.state==="uninitialized")return[];try{const s=g.sourceBuffer.buffered();if(!s)return[];for(let I=0;I<s.length;I++)e.push({start:s.start(I)*1e3,end:s.end(I)*1e3});return e}catch(s){return[]}});t(this,"init",A=>{this.logger.debug("Added init segment",{channel:A.channelId,renditionId:A.renditionId});const e=this.trackContexts.get(A.type);if(!e)throw xe(A.type,A.renditionId);const g=bI(A.codec,A.data,A.timescale);g&&e.initSegments.set(A.channelId,A.renditionId,g)});t(this,"append",(A,e)=>m(this,null,function*(){var B;const g=A[0];if(!g)return;const s=this.trackContexts.get(g.type),I=s==null?void 0:s.initSegments.get(g.channelId,g.renditionId);if(!this.mediaSource.isClosed()){if(!I)throw ts(g.renditionId,g.channelId);if(!s)throw xe(g.type,g.renditionId);if(s.state==="uninitialized")throw is(g.type,g.renditionId);if(e){const n=(g.timestamp+((B=g.compositionTimeOffset)!=null?B:0))/g.timescale;yield s.sourceBuffer.removeBuffer(n,Number.POSITIVE_INFINITY),yield s.sourceBuffer.appendBuffer(I)}try{let n=s.sequenceNumber;const o=aB(A.map(C=>MI(C,n++)));yield s.sourceBuffer.appendBuffer(o),s.sequenceNumber=n,s.consecutiveQuotaExceededErrorCount=0,s.successfulAppendCalls++}catch(n){throw n instanceof DOMException&&(n.code===DOMException.QUOTA_EXCEEDED_ERR?(this.quotaErrorCount++,s.consecutiveQuotaExceededErrorCount++,this.logger.error("quota exceeded error",{error:n}),s.pendingSamples.unshift(...A)):this.mediaElement.error&&s.pendingSamples.unshift(...A)),n}}}));t(this,"onCodedSample",A=>{if(A.duration===0)return;const e=this.trackContexts.get(A.type);if(!e)throw xe(A.type,A.renditionId);if(!(!e.hasFirstSync&&!A.isSync)){if(this.hasAddedInitialPosterFrame&&A.isSync&&A.type==="video"){this.hasAddedInitialPosterFrame=!1;const g=r({},A);g.timestamp=0,e.pendingSamples.push(g)}e.hasFirstSync=!0,e.pendingSamples.push(A),e.state!=="uninitialized"&&(e.isWorkingOnPendingSamples||EB(e,this.append,this.maxChunkSize).catch(g=>{if(e.isWorkingOnPendingSamples=!1,g instanceof Error){if(this.logger.error("append failed",{message:g.message,name:g.name}),g instanceof DOMException&&g.code===DOMException.QUOTA_EXCEEDED_ERR){if(e.consecutiveQuotaExceededErrorCount>=this.minConsecutiveErrorsBeforeEmit){const s=$t(!1,g,e.consecutiveQuotaExceededErrorCount,A.type);this.emitter.emit("error",s)}}else{const s=$t(!1,g,e.consecutiveQuotaExceededErrorCount,A.type);this.emitter.emit("error",s)}this.mediaElement.error&&this.onSourceEnded()}}))}});t(this,"onSourceOpen",()=>{this.logger.debug("source opened"),this.sourceOpenEndTime=Date.now(),this.pendingTracksToAddSourceBuffers&&(this.setSourceBuffers(this.pendingTracksToAddSourceBuffers),this.pendingTracksToAddSourceBuffers=void 0)});t(this,"onSourceEnded",()=>{const{error:A}=this.mediaElement;if(A){const e=/AUDIO_RENDERER/.test(A.message)||!this.autoRecoverFromMediaErrors,g=es(e,A);if(this.logger.error("MediaElement error",{error:g}),this.emitter.emit("error",g),!g.isFatal()){this.logger.info("Re-opening MediaSource"),this.emitter.emit("recovered from media error",{error:g,count:this.recoveredFromErrorCount}),this.recoveredFromErrorCount++;const s=!this.mediaElement.paused,I=[];this.trackContexts.forEach((B,n)=>{B.state==="initialized"&&I.push({type:n,mimeType:B.mimeType})}),this.sourceOpenStartTime=Date.now(),this.pendingTracksToAddSourceBuffers=I,this.mediaElement.src="",this.setTrackContexts(this.trackContexts),this.mediaElement.src=this.mediaSource.createObjectURL(),s&&this.mediaElement.play()}}this.logger.debug("source ended")});this.logger=A,this.mediaElement=g,this.emitter=e}};let we=mt;t(we,"create",(A,e,g)=>{const s=new mt(A,e,g);return s.setTrackContexts(),s.mediaSource.on("source ended",s.onSourceEnded),s.mediaSource.on("source open",s.onSourceOpen),g.src=s.mediaSource.createObjectURL(),s});const Ui=(i,A)=>{var B;const e=i.renditionId!==A.renditionId,g=i.channelId!==A.channelId,s=((B=i.timestamp)!=null?B:0)>A.timestamp;let I=!1;return i.type==="video"&&A.type==="video"&&(I=A.width!==i.width||A.height!==i.height),g||e||s||I},aB=function(i){const A=i.reduce((s,I)=>s+I.byteLength,0),e=new Uint8Array(A);let g=0;return i.forEach(s=>{e.set(new Uint8Array(s),g),g+=s.byteLength}),e.buffer},EB=(i,A,e)=>m(this,null,function*(){for(i.isWorkingOnPendingSamples=!0;i.pendingSamples.length>0;){const g=[];let s=0;for(let n=0;n<i.pendingSamples.length;n++){s=n;const o=i.pendingSamples[n],C=i.pendingSamples[n+1];if(o&&(g.push(o),C&&Ui(o,C))||n===e-1)break}const I=g[0];if(!I)break;const B=i.previousSample?Ui(i.previousSample,I):!0;yield A(g,B),i.pendingSamples=i.pendingSamples.slice(s+1),i.previousSample=g[g.length-1]}i.isWorkingOnPendingSamples=!1}),wt=class{constructor(A,e){t(this,"logger");t(this,"emitter");t(this,"element");t(this,"pictureInPictureWindow");t(this,"unload",()=>{this.emitter.off("add picture in picture listener",this.onEnablePictureInPicture)});t(this,"onEnablePictureInPicture",A=>{this.element=A.element,A.element.addEventListener("leavepictureinpicture",()=>{this.pictureInPictureWindow=void 0,this.logger.debug("Leave picture in picture"),this.emitter.emit("exit picture in picture")}),A.element.addEventListener("enterpictureinpicture",e=>{this.pictureInPictureWindow=e.pictureInPictureWindow,this.logger.debug("Enter picture in picture"),this.emitter.emit("enter picture in picture",this)}),A.element.autopictureinpicture=!0});t(this,"getPictureInPictureSize",()=>this.pictureInPictureWindow);t(this,"isPictureInPictureActive",()=>this.isWebkitPresentationModeActive()||this.isStandardPictureInPictureActive());t(this,"isPictureInPictureSupported",()=>this.isWebkitPresentationModeSupported()||this.isStandardPictureInPictureSupported());t(this,"requestPictureInPicture",()=>(this.emitter.emit("ios-hack: reset size"),this.isStandardPictureInPictureSupported()?this.requestStandardPictureInPicture():this.isWebkitPresentationModeSupported()?this.requestWebkitPresentationMode("picture-in-picture"):Promise.reject(new Error("Picture in picture is not supported"))));t(this,"exitPictureInPicture",()=>this.isStandardPictureInPictureSupported()?this.exitStandardPictureInPicture():this.isWebkitPresentationModeSupported()?this.requestWebkitPresentationMode("inline"):Promise.reject(new Error("Picture in picture is not supported")));t(this,"getStatistics",()=>({isPictureInPictureActive:this.isPictureInPictureActive()}));t(this,"requestStandardPictureInPicture",()=>m(this,null,function*(){return yield this.element.requestPictureInPicture()}));t(this,"exitStandardPictureInPicture",()=>m(this,null,function*(){return yield document.exitPictureInPicture()}));t(this,"isStandardPictureInPictureSupported",()=>!!this.element&&!!this.element.requestPictureInPicture&&!!document.pictureInPictureEnabled);t(this,"isStandardPictureInPictureActive",()=>!!this.element&&!!document.pictureInPictureElement);t(this,"isWebkitPresentationModeActive",()=>!!this.element&&this.element.webkitPresentationMode==="picture-in-picture");t(this,"requestWebkitPresentationMode",A=>m(this,null,function*(){return this.element.webkitSetPresentationMode(A),Promise.resolve()}));t(this,"isWebkitPresentationModeSupported",()=>!!this.element&&!!this.element.webkitSetPresentationMode);this.emitter=A,this.logger=e,this.emitter.on("add picture in picture listener",this.onEnablePictureInPicture)}};let Se=wt;t(Se,"create",(A,e)=>new wt(A,e));const St=class{constructor(A,e,g,s){t(this,"emitter");t(this,"logger");t(this,"clockSource");t(this,"state","buffering");t(this,"bufferFullness",0);t(this,"targetBufferTime");t(this,"lastBufferStateEvent","drained");t(this,"firstFrameTime");t(this,"currentTimeIsInRange",!1);t(this,"needsInputForAudioCount",0);t(this,"needsInputForVideoCount",0);t(this,"unload",()=>{this.emitter.off("buffer state",this.onBufferedStateChanged),this.emitter.off("needs user input",this.onNeedsUserInput)});t(this,"setTargetBufferTime",A=>void(this.targetBufferTime=A));t(this,"getTargetBufferTime",()=>this.targetBufferTime);t(this,"getBufferFullness",()=>this.bufferFullness);t(this,"getLastBufferStateEvent",()=>this.lastBufferStateEvent);t(this,"getState",()=>this.state);t(this,"getFirstFrameTime",()=>this.firstFrameTime);t(this,"getStatistics",()=>({bufferTime:this.targetBufferTime,needsInputForAudioCount:this.needsInputForAudioCount,needsInputForVideoCount:this.needsInputForVideoCount}));t(this,"onBufferedStateChanged",({buffered:A,isPaused:e})=>{const g=this.clockSource.currentTime,s=A.some(a=>a.start<g&&g<a.end),I=A[A.length-1],B=I?I.end-I.start>=this.targetBufferTime:!1,n=I?Math.max(0,I.end-g)/this.targetBufferTime:0,o=e?"paused":s?"playing":"buffering",C=this.state;this.currentTimeIsInRange!==s&&!s?(this.lastBufferStateEvent="drained",this.emitter.emit("buffer state event",this.lastBufferStateEvent)):s&&B&&this.lastBufferStateEvent==="drained"&&(this.lastBufferStateEvent="filled",this.emitter.emit("buffer state event",this.lastBufferStateEvent)),o==="playing"&&!this.firstFrameTime&&(this.firstFrameTime=Date.now()),this.currentTimeIsInRange=s,this.state=o,this.bufferFullness=s?n:0,C!==o&&this.emitter.emit("playback state",o),this.emitter.emit("buffer fullness",this.bufferFullness)});t(this,"onNeedsUserInput",({forAudio:A,forVideo:e})=>{A&&this.needsInputForAudioCount++,e&&this.needsInputForVideoCount++});this.emitter=A,this.logger=e,this.clockSource=g,this.targetBufferTime=s,this.emitter.on("buffer state",this.onBufferedStateChanged),this.emitter.on("needs user input",this.onNeedsUserInput)}};let De=St;t(De,"create",(A,e,g,s)=>new St(A,e,g,s));const $e=()=>({upgradesFromLevel:[],downgradesFromLevel:[],bufferingRanges:[],activeRanges:[],decodeRate:Number.MAX_SAFE_INTEGER}),rB=()=>({levels:{},levelDowngrades:[],levelUpgrades:[],bufferFullness:0,general:$e()}),Dt=class{constructor(A,e){t(this,"minBufferFullnessLengthForRegression",6);t(this,"logger");t(this,"emitter");t(this,"timers",O.create());t(this,"metrics",rB());t(this,"bufferFullness",new Z(30));t(this,"bufferFullnessRegression");t(this,"currentLevel");t(this,"isSuspended",!1);t(this,"_fatalQosCount",0);t(this,"hasAsserted",!1);t(this,"load",()=>{this.emitter.on("playback state",this.onPlaybackState),this.emitter.on("buffer fullness",this.onBufferFullness),this.emitter.on("rendition level changed",this.onRenditionLevelChanged),this.emitter.on("video decode rate",this.onVideoDecodeRate)});t(this,"unload",()=>{this.emitter.off("playback state",this.onPlaybackState),this.emitter.off("buffer fullness",this.onBufferFullness),this.emitter.off("rendition level changed",this.onRenditionLevelChanged),this.emitter.off("video decode rate",this.onVideoDecodeRate),this.suspend()});t(this,"suspend",()=>{this.isSuspended=!0,this.timers.unload(),this.stopBuffering(),this.unsetActive()});t(this,"unsuspend",()=>{this.isSuspended=!1,this.currentLevel&&this.setActive()});t(this,"fatalQosGraceTime",()=>1e4*(this.fatalQosCount+1));t(this,"incrementFatalQosCount",()=>{this._fatalQosCount++});t(this,"getMetrics",()=>this.metrics);t(this,"getLevelStats",A=>{var g,s,I,B;const e=((s=(g=A.video)==null?void 0:g.bitRate)!=null?s:0)+((B=(I=A.audio)==null?void 0:I.bitRate)!=null?B:0);return this.metrics.levels[e]});t(this,"getBufferFullnessRegression",()=>this.bufferFullnessRegression);t(this,"activeRatios",()=>{const A=new Map,e=pA(this.metrics.general.activeRanges);if(Object.entries(this.metrics.levels).forEach(([g,s])=>{A.set(g,e?pA(s.activeRanges)/e:0)}),!this.hasAsserted){const g=A.size?Math.abs(Array.from(A.values()).reduce((s,I)=>s+I,0)-1)<=.02:!0;g||(this.hasAsserted=!0,console.assert(g,`Active ratios should be close to 1 - actual: ${Array.from(A.values()).reduce((s,I)=>s+I,0)}`))}return A});t(this,"bufferingRatios",()=>{const A=new Map,e=pA(this.metrics.general.bufferingRanges);if(Object.entries(this.metrics.levels).forEach(([g,s])=>{A.set(g,e?pA(s.bufferingRanges)/e:0)}),!this.hasAsserted){const g=Array.from(A.values()).reduce((s,I)=>s+I,0)<=1;g||(this.hasAsserted=!0,console.assert(g,`Buffering ratios should be less than 1 - actual: ${Array.from(A.values()).reduce((s,I)=>s+I,0)}`))}return A});t(this,"bufferingEventsLast",A=>this.metrics.general.bufferingRanges.filter(e=>e.start>=Date.now()-A).length);t(this,"timeSpentBufferingLast",A=>vt(this.metrics.general.bufferingRanges,A));t(this,"timeSpentActiveLast",A=>vt(this.metrics.general.activeRanges,A));t(this,"timeSpentPlayingInAtLeastLevelRatio",A=>{var o,C,a,Q;const e=this.timeSpentBuffering(),g=this.timeActive(),s=this.bufferingRatios(),I=this.activeRatios(),B=((C=(o=A.video)==null?void 0:o.bitRate)!=null?C:0)+((Q=(a=A.audio)==null?void 0:a.bitRate)!=null?Q:0),n=e/g;return Object.keys(this.metrics.levels).map(h=>parseInt(h,10)).filter(h=>h>=B).reduce((h,u)=>{var l,D;return((l=I.get(u.toString()))!=null?l:0)-((D=s.get(u.toString()))!=null?D:0)*n+h},0)});t(this,"timeSpentBuffering",()=>pA(this.metrics.general.bufferingRanges));t(this,"timeActive",()=>pA(this.metrics.general.activeRanges));t(this,"getStatistics",()=>({timeSpentBuffering:this.timeSpentBuffering(),bufferingEventsCount:this.metrics.general.bufferingRanges.length,timeSpentRatio:Object.fromEntries(this.activeRatios()),fatalQosCount:this.fatalQosCount}));t(this,"onRenditionLevelChanged",A=>{var I,B,n,o,C,a,Q,h,u,l,D,S,Y,T;const e=((n=(B=(I=A.from)==null?void 0:I.video)==null?void 0:B.bitRate)!=null?n:0)+((a=(C=(o=A.from)==null?void 0:o.audio)==null?void 0:C.bitRate)!=null?a:0),g=((u=(h=(Q=A.to)==null?void 0:Q.video)==null?void 0:h.bitRate)!=null?u:0)+((S=(D=(l=A.to)==null?void 0:l.audio)==null?void 0:D.bitRate)!=null?S:0);this.logger.info("rendition level changed",{fromLevel:e,toLevel:g}),this.metrics.general.activeRanges.length===0&&this.setActive(),A.from&&A.to&&(e<g?this.metrics.general.upgradesFromLevel.push(Date.now()):this.metrics.general.downgradesFromLevel.push(Date.now()));let s=!1;if(A.from){const k=(Y=this.metrics.levels[e])!=null?Y:$e();e<g?k.upgradesFromLevel.push(Date.now()):k.downgradesFromLevel.push(Date.now()),hA(k.activeRanges);const W=k.bufferingRanges[k.bufferingRanges.length-1];s=!!W&&!W.end,hA(k.bufferingRanges),this.metrics.levels[e]=k}if(A.to){const k=(T=this.metrics.levels[g])!=null?T:$e();fA(k.activeRanges),s&&fA(k.bufferingRanges),this.metrics.levels[g]=k,this.currentLevel=g}});t(this,"onBufferFullness",A=>{this.bufferFullness.push(A),this.metrics.bufferFullness=A,this.bufferFullness.items().length>=this.minBufferFullnessLengthForRegression&&(this.bufferFullnessRegression=this.calculateLinearRegression())});t(this,"onPlaybackState",A=>{switch(this.logger.info("Playback state",{state:A,currentLevel:this.currentLevel}),A){case"playing":this.stopBuffering();break;case"buffering":this.isSuspended||this.startBuffering();break}});t(this,"onVideoDecodeRate",A=>{var g;if(this.metrics.general.decodeRate=A,!this.currentLevel)return;const e=this.metrics.levels[(g=this.currentLevel)!=null?g:0];e&&(e.decodeRate=A)});t(this,"calculateLinearRegression",()=>NA(this.bufferFullness.items().map((A,e)=>({x:e,y:A}))));t(this,"stopBuffering",()=>{if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&hA(A.bufferingRanges)}hA(this.metrics.general.bufferingRanges)});t(this,"startBuffering",()=>{if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&fA(A.bufferingRanges)}fA(this.metrics.general.bufferingRanges)});t(this,"unsetActive",()=>{if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&hA(A.activeRanges)}hA(this.metrics.general.activeRanges)});this.logger=e,this.emitter=A}get fatalQosCount(){return this._fatalQosCount}setActive(){if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&fA(A.activeRanges)}fA(this.metrics.general.activeRanges)}};let fe=Dt;t(fe,"create",(A,e)=>new Dt(A,e));const ft=class{constructor(A,e){t(this,"renditions",new Map);t(this,"renditionLevels",[]);t(this,"languages",[]);t(this,"emitter");t(this,"subscriptionSource");t(this,"renditionLevelChangeCount",0);t(this,"unload",()=>{this.emitter.off("renditions",this.onRenditions),this.emitter.off("subscription changed",this.onSubscriptionChanged)});t(this,"getRenditionLevels",A=>A?this.createRenditionLevels(A):this.renditionLevels);t(this,"getRenditionLevel",A=>{var n;const e=A!=null?A:this.getCurrentSubscription(),g=A?this.createRenditionLevels(A):this.renditionLevels;if(!e.video)return g.length?g[0]:void 0;const s=e.video.bitRate||Number.MAX_SAFE_INTEGER,I=e.video.width||Number.MAX_SAFE_INTEGER,B=e.video.height||Number.MAX_SAFE_INTEGER;return(n=g.filter(o=>o.video&&e.video?o.video.bitRate<=s&&o.video.width<=I&&o.video.height<=B:!0).pop())!=null?n:g[0]});t(this,"setRenditions",(A,e)=>{this.renditions.set(A,e)});t(this,"getLanguages",()=>this.languages);t(this,"getVideoRendition",(A,e=this.getCurrentSubscription().channelId)=>{const g=this.getRendition(A,e);if(g&&HA(g))return g});t(this,"getAudioRenditions",A=>{const e=this.renditions.get(A);return e==null?void 0:e.filter(s=>MA(s))});t(this,"getAudioRendition",(A,e=this.getCurrentSubscription().channelId)=>{const g=this.getRendition(A,e);if(g&&MA(g))return g});t(this,"getRendition",(A,e=this.getCurrentSubscription().channelId)=>{var g;return(g=this.renditions.get(e))==null?void 0:g.find(s=>s.id===A)});t(this,"getStatistics",()=>{var e,g,s,I,B,n,o,C,a,Q;const A=this.getRenditionLevel();return{videoCodec:(e=A==null?void 0:A.video)==null?void 0:e.codec,audioCodec:(g=A==null?void 0:A.audio)==null?void 0:g.codec,videoRenditionId:(s=A==null?void 0:A.video)==null?void 0:s.id,audioRenditionId:(I=A==null?void 0:A.audio)==null?void 0:I.id,videoWidth:(B=A==null?void 0:A.video)==null?void 0:B.width,videoHeight:(n=A==null?void 0:A.video)==null?void 0:n.height,expectedVideoBitRate:(o=A==null?void 0:A.video)==null?void 0:o.bitRate,expectedAudioBitRate:(C=A==null?void 0:A.audio)==null?void 0:C.bitRate,frameRate:(a=A==null?void 0:A.video)==null?void 0:a.frameRate,language:(Q=A==null?void 0:A.audio)==null?void 0:Q.language,renditionLevelChangeCount:this.renditionLevelChangeCount}});t(this,"onRenditions",A=>{const e=this.subscriptionSource.getCurrentSubscription();this.renditions.set(A.channelId,A.renditions),this.updateRenditionLevels({to:e,from:e})});t(this,"onSubscriptionChanged",A=>{this.updateRenditionLevels(A)});t(this,"updateRenditionLevels",({to:A,from:e})=>{var C;const{channelId:g,initiator:s}=A,I=this.getRenditionLevel(e),B=new Set;((C=this.renditions.get(g))!=null?C:[]).forEach(a=>a.language?B.add(a.language):void 0),this.languages=Array.from(B),this.renditionLevels=this.createRenditionLevels(A);const o=this.getRenditionLevel(A);rA(I,o)||(this.renditionLevelChangeCount++,this.emitter.emit("rendition level changed",{to:o,from:I,reason:s?"manual":"abr"}))});t(this,"createRenditionLevels",A=>{var a;const{video:e,audio:g,channelId:s}=A,I=(a=this.renditions.get(s))!=null?a:[],B=I.filter(HA).filter(Q=>e&&Q.codec===e.codec),n=I.filter(MA).filter(Q=>g&&Q.codec===g.codec&&Q.language===g.language),o=Math.max(B.length,n.length),C=[];for(let Q=0;Q<o;Q++){const h=B[Math.min(B.length-1,Q)],u=n[Math.min(n.length-1,Q)];C.push({audio:u,video:h})}return C});t(this,"getCurrentSubscription",()=>this.subscriptionSource.getCurrentSubscription());this.subscriptionSource=e,this.emitter=A,this.emitter.on("renditions",this.onRenditions),this.emitter.on("subscription changed",this.onSubscriptionChanged)}};let pe=ft;t(pe,"create",(A,e)=>new ft(A,e));const bi=i=>JSON.parse(JSON.stringify(i)),pt=class{constructor(A,e,g){t(this,"logger");t(this,"timers",new O);t(this,"emitter");t(this,"targetSubscription");t(this,"currentSubscription");t(this,"_isSwitchingSubscription",!1);t(this,"pendingSubscriptionTimeoutId");t(this,"burstMs",0);t(this,"unload",()=>{this.logger.debug("Unloading module..."),this.timers.unload(),this.emitter.off("subscription changed",this.onSubscriptionChanged),this.logger.debug("Unloaded module")});t(this,"isSwitchingSubscription",()=>this._isSwitchingSubscription);t(this,"getTargetSubscription",()=>this.targetSubscription);t(this,"getCurrentSubscription",()=>this.currentSubscription);t(this,"enableBurst",A=>{this.burstMs=A});t(this,"setSize",A=>{this.targetSubscription.video.width=A.width,this.targetSubscription.video.height=A.height,this.scheduleSubscriptionChange()});t(this,"setVideoConstraint",A=>{this.targetSubscription.video=A,this.scheduleSubscriptionChange()});t(this,"setAudioConstraint",A=>{this.targetSubscription.audio=A,this.scheduleSubscriptionChange()});t(this,"setVideoBitRate",A=>{this.targetSubscription.video.bitRate=A,this.scheduleSubscriptionChange()});t(this,"setAudioBitRate",A=>{this.targetSubscription.audio.bitRate=A,this.scheduleSubscriptionChange()});t(this,"setChannelId",A=>{this.targetSubscription.channelId=A,this.scheduleSubscriptionChange()});t(this,"setLanguage",A=>{this.targetSubscription.audio.language=A,this.scheduleSubscriptionChange()});t(this,"setVideoCodec",A=>{this.targetSubscription.video.codec=A,this.scheduleSubscriptionChange()});t(this,"setAudioCodec",A=>{this.targetSubscription.audio.codec=A,this.scheduleSubscriptionChange()});t(this,"setBurst",A=>{A?this.targetSubscription.burstMs=A:delete this.targetSubscription.burstMs});t(this,"isNewSubscription",()=>{const A=["burstMs","meta","initiator","channelGroupId"];return!rA(Lt(this.currentSubscription,A),Lt(this.targetSubscription,A))});t(this,"onSubscriptionChanged",({to:A})=>{this.logger.debug("onSubscriptionChanged",{to:A}),this.currentSubscription=r({},A),this._isSwitchingSubscription=this.isNewSubscription()});t(this,"scheduleSubscriptionChange",()=>{this.targetSubscription=bi(this.targetSubscription),this._isSwitchingSubscription=this.isNewSubscription();const A=this.currentSubscription.channelId!==this.targetSubscription.channelId;this._isSwitchingSubscription&&(A&&this.burstMs?this.setBurst(this.burstMs):this.setBurst(0),this.pendingSubscriptionTimeoutId&&(this.timers.clearTimeout(this.pendingSubscriptionTimeoutId),this.pendingSubscriptionTimeoutId=void 0),this.pendingSubscriptionTimeoutId=this.timers.setTimeout(()=>this.emitter.emit("send signal",JSON.stringify({type:"subscribe",subscription:this.getTargetSubscription()})),0))});this.logger=A,this.targetSubscription=e,this.currentSubscription=bi(e),this.emitter=g,this.emitter.on("subscription changed",this.onSubscriptionChanged)}};let Fe=pt;t(Fe,"create",(A,e,g)=>new pt(A,g,e));const hB=5e3,cB=()=>ci()||Ce()||WI(),Ji=()=>cB()?100:0,Li=i=>A=>A>i,Ft=class{constructor(A,e,g,s,I){t(this,"emitter");t(this,"logger");t(this,"playbackSource");t(this,"bufferSource");t(this,"lastSeekTime",Date.now());t(this,"seekCooldownTime",1e3);t(this,"seekTimeoutTime",5e3);t(this,"syncMaxBehind");t(this,"syncMaxBehindMultiplierStep",1);t(this,"syncMaxBehindIncreaseEvery",2);t(this,"syncMaxBehindMaximumAllowed",2e3);t(this,"syncMaxBehindMultiplier",1);t(this,"timeshiftOnAudio",!1);t(this,"syncMaxAhead",150);t(this,"timeshiftSync",{enabled:!1,maxBehind:50,multiplier:1,maxBehindAllowed:600,overshoot:Ji(),minOvershootAllowed:Ji(),maxOvershootAllowed:500});t(this,"maxTimeSyncDifferenceTolerance",150);t(this,"timers",O.create());t(this,"rtt",0);t(this,"channelSyncInfo",new Map);t(this,"driftAdjustmentsCount",0);t(this,"timeshiftDriftAdjustmentCount",0);t(this,"driftAdjustments",[]);t(this,"timeShiftAdjustments",[]);t(this,"timestampOffset");t(this,"currentChannelId");t(this,"highestSeenTimestamps",new Map);t(this,"isSuspended",!1);t(this,"isSyncAdjustmentActivated",!1);t(this,"load",()=>{this.timers.setInterval(this.onSync,100)});t(this,"unload",()=>{this.logger.debug("Unloading module..."),this.emitter.off("rtt",this.updateRtt),this.timers.unload(),this.logger.debug("Unloaded module")});t(this,"suspend",()=>{this.isSuspended=!0});t(this,"unsuspend",()=>{this.resetSyncState(),this.isSuspended=!1});t(this,"deactivateSyncAdjustments",()=>{this.isSyncAdjustmentActivated=!1});t(this,"activateSyncAdjustments",()=>{this.tryApplySyncInfo(0),this.lastSeekTime=Date.now(),this.isSyncAdjustmentActivated=!0});t(this,"reset",()=>{this.logger.info("Reset sync state"),this.currentChannelId=void 0,this.timestampOffset=void 0,this.resetSyncState(),this.highestSeenTimestamps.clear()});t(this,"getTimeshiftOffset",()=>{var A;return(A=this.timestampOffset)!=null?A:0});t(this,"getCurrentChannelId",()=>this.currentChannelId);t(this,"resetSyncState",()=>{this.timeshiftSync.multiplier=1,this.syncMaxBehindMultiplier=1,this.driftAdjustments=[],this.timeShiftAdjustments=[]});t(this,"getLiveEdgeTime",A=>{const e=this.channelSyncInfo.get(A);if(!e)return;const g=Date.now()-e.localTimestamp;return e.timestamp+g});t(this,"getLiveEdgeTimeLatencyAdjusted",A=>{const e=this.getLiveEdgeTime(A);if(e)return e+this.rtt/2});t(this,"getWallclockTime",A=>{const e=this.channelSyncInfo.get(A);if(!e)return;const g=Date.now()-e.localTimestamp;return e.wallclockTime+g});t(this,"getWallclockTimeLatencyAdjusted",A=>{const e=this.getWallclockTime(A);if(e)return e+this.rtt/2});t(this,"processSample",A=>{var g;if(!A.channelId)throw new Error("Sample must be assigned to a channel");if(this.currentChannelId||(this.currentChannelId=A.channelId),this.timestampOffset||(this.timestampOffset=A.timestamp/A.timescale*1e3-hB),this.currentChannelId!==A.channelId){let s=Number.MAX_SAFE_INTEGER;console.assert(this.highestSeenTimestamps.size!==0,"no known timestamps"),this.highestSeenTimestamps.forEach(B=>{s=Math.min(s,B)});const I=A.timestamp/A.timescale*1e3;this.currentChannelId=A.channelId,this.timestampOffset=I-s}else(A.type==="video"&&A.isSync||this.timeshiftOnAudio)&&this.tryTimeshiftSync();const e=this.timestampOffset*A.timescale/1e3;return A.timestamp-=e,this.highestSeenTimestamps.set(A.type,Math.max((g=this.highestSeenTimestamps.get(A.type))!=null?g:0,A.timestamp/A.timescale*1e3)),A});t(this,"getStatistics",()=>({drift:this.drift,driftAdjustmentCount:this.driftAdjustmentsCount,timeshiftDriftAdjustmentCount:this.timeshiftDriftAdjustmentCount,seekTime:this.playbackSource.seekTime}));t(this,"updateRtt",A=>void(this.rtt=A));t(this,"isPlaybackSourceReadyToSeek",()=>!this.isSeeking()&&this.isSeekCooldownExpired()&&this.isSyncAdjustmentActivated);t(this,"isSeeking",()=>this.playbackSource.isSeeking?this.isSeekTimeoutExpired():!1);t(this,"isAllowedToSync",()=>this.isPlaybackSourceReadyToSeek()&&!!this.currentChannelId&&!this.isSuspended&&!this.playbackSource.isPaused);t(this,"isSeekCooldownExpired",()=>Date.now()-this.lastSeekTime>this.seekCooldownTime);t(this,"isSeekTimeoutExpired",()=>Date.now()-this.lastSeekTime>this.seekTimeoutTime);t(this,"currentTimeshiftMaxBehind",()=>Math.min(this.timeshiftSync.maxBehind*this.timeshiftSync.multiplier,this.timeshiftSync.maxBehindAllowed));t(this,"currentSyncMaxBehind",()=>Math.min(this.syncMaxBehindMultiplier*this.syncMaxBehind,this.syncMaxBehindMaximumAllowed));t(this,"currentSyncMaxAhead",()=>this.playbackSource.seekTime>500?Math.max(this.syncMaxAhead*this.syncMaxBehindMultiplier,300):this.syncMaxAhead);t(this,"tryTimeshiftSync",()=>{var I;if(!this.isAllowedToSync())return;const A=(I=this.drift)!=null?I:0;if(A>=this.syncMaxBehind)return;if(A<this.currentTimeshiftMaxBehind()){this.timeshiftSync.overshoot=0;return}if(!this.timestampOffset)return;const e=Date.now()-this.seekTimeoutTime*this.timeshiftSync.multiplier,g=this.timeShiftAdjustments.filter(Li(e)).length;if(g&&this.timeshiftSync.multiplier>2)return this.logger.debug("Too many diff timeShifts within sliding window",{timeShiftsCooldownMs:e,timeShiftsWithinCooldownTime:g}),!1;const s=A+this.timeshiftSync.overshoot;this.logger.info("Adjusting for drift using timeshift",{drift:A,syncAmount:s,currentTime:this.playbackSource.currentTime,rtt:this.rtt,overshoot:this.timeshiftSync.overshoot}),this.timestampOffset+=s,this.lastSeekTime=Date.now(),!this.playbackSource.isPaused&&(this.timeShiftAdjustments.push(this.lastSeekTime),this.timeshiftDriftAdjustmentCount++,this.timeshiftSync.multiplier++,this.timeshiftSync.overshoot=Math.max(this.timeshiftSync.minOvershootAllowed,Math.min(this.timeshiftSync.multiplier*A/2,this.timeshiftSync.maxOvershootAllowed)))});t(this,"onSync",()=>{var B;if(!this.isAllowedToSync())return;const A=(B=this.drift)!=null?B:0;if(A<0&&-A<this.currentSyncMaxAhead()||A>0&&A<this.currentSyncMaxBehind()||Math.abs(A)<1||!this.isSeekCooldownExpired())return;const e=Date.now()-this.seekTimeoutTime*this.syncMaxBehindMultiplier,g=this.driftAdjustments.filter(Li(e)).length;if(g&&this.syncMaxBehindMultiplier>2)return this.logger.debug("Too many diff adjustments within sliding window",{adjustmentsCooldownMs:e,adjustmentsWithinCooldownTime:g}),!1;const s=this.playbackSource.seekTime,I=this.playbackSource.currentTime+A+s;if(this.logger.info("Adjusting for drift using seek",{drift:A,currentTime:this.playbackSource.currentTime,newCurrentTime:I,seekTime:s,rtt:this.rtt}),this.lastSeekTime=Date.now(),this.driftAdjustments.push(this.lastSeekTime),this.driftAdjustmentsCount++,this.playbackSource.currentTime=I,this.timeshiftSync.overshoot=Math.max(this.timeshiftSync.minOvershootAllowed,this.timeshiftSync.overshoot/2),this.driftAdjustmentsCount%this.syncMaxBehindIncreaseEvery===0&&!this.playbackSource.isPaused){const n=this.currentSyncMaxBehind;this.syncMaxBehindMultiplier+=this.syncMaxBehindMultiplierStep,n!==this.currentSyncMaxBehind&&this.logger.info("Increasing max drift behind allowed",{from:n,to:this.currentSyncMaxBehind})}});this.logger=e,this.emitter=A,this.playbackSource=g,this.bufferSource=s,this.timeshiftSync.enabled=I,this.syncMaxBehind=this.timeshiftSync.enabled?1e3:100,this.emitter.on("rtt",this.updateRtt)}updateChannelSyncInfo(A,e){const g=Date.now(),s=this.channelSyncInfo.get(A),I=this.getLiveEdgeTime(A);if(this.isSuspended)return;if(!s||!I){this.logger.info("Initial timing info",{syncInfo:e}),this.channelSyncInfo.set(A,L(r({},e),{localTimestamp:g,timeDifferences:new Z(12)}));return}const B=e.wallclockTime-s.wallclockTime,n=e.timestamp-s.timestamp,o=g-s.localTimestamp,C=n-o;if(s.timeDifferences.push(C),this.logger.debug("Timing info",{rtt:this.rtt,channelId:A,syncInfo:e,localTimestamp:g,diffFromEstimated:C,timestampDelta:n,wallclockDelta:B,localWallclockDelta:o}),Math.abs(C)>=this.bufferSource.getTargetBufferTime()*2){this.logger.info("Resetting sync info",{diffFromEstimated:C}),this.channelSyncInfo.set(A,L(r({},e),{localTimestamp:g,timeDifferences:new Z(s.timeDifferences.maxSize+1)})),this.currentChannelId&&this.currentChannelId===A&&(this.reset(),this.emitter.emit("channel reset"));return}s.timeDifferences.isFull()&&this.tryApplySyncInfo(this.maxTimeSyncDifferenceTolerance)}tryApplySyncInfo(A){const e=this.getCurrentChannelId();if(!e)return;const g=this.channelSyncInfo.get(e);if(!g)return;const s=sA(g.timeDifferences.items());Math.abs(s)>A&&(this.logger.info("Adjusting sync info",{averageDifference:s}),g.timestamp+=s,g.timeDifferences.clear())}get serverCurrentTime(){return this.channelCurrentTime-this.getTimeshiftOffset()}get channelCurrentTime(){const A=this.getCurrentChannelId();if(!A)return 0;const e=this.getLiveEdgeTime(A);return e?e-this.bufferSource.getTargetBufferTime():0}get drift(){return this.serverCurrentTime-this.playbackSource.currentTime}};let ye=Ft;t(ye,"create",(A,e,g,s,I)=>new Ft(A,e,g,s,I));const dB={enabled:!0,interval:3e4,includeErrors:!0,includeEvents:!0,includeStats:!0,maxRetries:10,maxErrorReports:50,maxEvents:50},At=(i,A)=>L(r({},A),{type:i,timestamp:new Date().toISOString(),discriminator:"web"}),yt=class{constructor(A,e,g,s){t(this,"logger");t(this,"timers",new O);t(this,"emitter");t(this,"options");t(this,"parentContext");t(this,"unsentLines",new Z(100));t(this,"retries",0);t(this,"errorCount",0);t(this,"eventCount",0);t(this,"statsCount",0);t(this,"unload",()=>{this.logger.debug("Unloading module..."),window.removeEventListener("error",this.onError),window.removeEventListener("unhandledrejection",this.onRejection),this.timers.unload(),this.emitter.off("error",this.addError),this.emitter.off("visibilitystate",this.onVisibilityChange),this.emitter.off("pagehide",this.onPageHide),this.addStats({isFinal:!0,initiator:"unload"}),this.send("beacon"),this.logger.debug("Unloaded module")});t(this,"load",()=>{window.addEventListener("error",this.onError),window.addEventListener("unhandledrejection",this.onRejection),this.emitter.on("error",this.addError),this.emitter.on("visibilitystate",this.onVisibilityChange),this.emitter.on("pagehide",this.onPageHide),this.timers.setInterval(()=>{this.addStats(),this.send("fetch")},this.options.interval)});t(this,"addStats",({isFinal:A,initiator:e}={isFinal:!1,initiator:"interval"},g={})=>{if(!this.options.includeStats)return;const s=this.parentContext.getStatistics(),I=At("stats",L(r(r({},g),s),{isFinal:A,initiator:e,count:this.statsCount++}));this.unsentLines.push(I)});t(this,"addEvent",A=>{if(!this.options.includeEvents||this.eventCount>this.options.maxEvents)return;const e=this.parentContext.getStatistics(),g=At("event",r(r({},e),A));this.eventCount++,this.unsentLines.push(g)});t(this,"getStatistics",()=>({errorCount:this.errorCount}));t(this,"send",A=>m(this,null,function*(){if(this.options.enabled&&!(this.retries>=this.options.maxRetries)&&!this.unsentLines.isEmpty()){this.logger.debug("Sending telemetry",{lines:this.unsentLines.items()});try{const e=this.unsentLines.items().map(g=>JSON.stringify(g)).reverse().join(`
27
- `);switch(A){case"beacon":navigator.sendBeacon(this.options.url,e);break;case"fetch":default:this.parentContext.connectionState==="connected"?this.emitter.emit("send signal",JSON.stringify({type:"telemetry",body:e})):yield xg(new URL(this.options.url),{body:e,headers:{"Content-Type":"text/plain"}});break}this.retries=0,this.unsentLines.clear()}catch(e){this.retries++}}}));t(this,"onVisibilityChange",A=>{A==="hidden"&&(this.addStats({isFinal:!0,initiator:"visibilitychange"}),this.send("beacon"))});t(this,"onPageHide",A=>{this.addStats({isFinal:!0,initiator:"pagehide"},{persisted:A.persisted}),this.send("beacon")});t(this,"onRejection",A=>this.addError(A.reason));t(this,"onError",A=>this.addError(A.error));t(this,"addError",A=>{const{includeErrors:e,maxErrorReports:g}=this.options;if(e&&A instanceof f){if(this.errorCount++,this.errorCount>g)return;const s=this.parentContext.getStatistics();this.unsentLines.push(At("error",r(r({},s),A.toStringifiable())))}});this.logger=A,this.emitter=e,this.options=r(r({},dB),g),this.parentContext=s}};let VA=yt;t(VA,"create",(A,e,g,s)=>new yt(A,e,g,s));const Rt=class{constructor(A,e,g){t(this,"logger");t(this,"element");t(this,"documentState");t(this,"timers",new O);t(this,"unload",()=>{this.timers.unload()});t(this,"unpause",()=>{this.element.userHasProvidedInput&&this.element.isPaused&&this.documentState.isVisible&&this.documentState.isOnline&&(this.logger.debug("Unpause video"),this.element.play().catch(eA))});this.logger=A,this.element=e,this.documentState=g,this.timers.setInterval(this.unpause,100)}};let ZA=Rt;t(ZA,"create",(A,e,g)=>new Rt(A,e,g));const lB=["minBufferTime","maxBufferTime","burstEnabled"];function uB(i){return lB.includes(i)}class mB{constructor(A){t(this,"options");t(this,"overrides",new Map);this.options=A}getOptions(){return this.options}addOverrides(A,e){this.overrides.set(A,e)}set(A,e){this.options[A]=e}get(A,e){var g;if(e&&uB(A)){const s=(g=this.overrides.get(e))==null?void 0:g[A];if(typeof s!="undefined")return s}return this.options[A]}getOverride(A,e){var g;return(g=this.overrides.get(e))==null?void 0:g[A]}}const wB=i=>{let A=i,e=0,g=0;return I=>{var l,D,S;const B=A;A=I,B.flags&&ne(B.flags)&&(e=(l=B.compositionTimeOffset)!=null?l:0),B.timestamp+=e,B.compositionTimeOffset=((D=B.compositionTimeOffset)!=null?D:0)-e;const n=B.timestamp/B.timescale,C=I.flags&&ne(I.flags)?(S=I.compositionTimeOffset)!=null?S:0:e,Q=(I.timestamp+C)/I.timescale,h=Math.max(0,Math.round((Q-n)*B.timescale));return h>0&&(g=h),L(r({},B),{duration:h>0?h:g})}},SB=(i,A)=>{if(!i)return;const e=new URL("/subscribe",i);return e.searchParams.append("channelId",A.channelId),e.searchParams.append("sessionId",A.sessionId),e.searchParams.append("clientId",A.clientId),A.audio&&A.audio.codec&&(e.searchParams.append("audio.bitRate",Math.round(A.audio.bitRate).toString()),e.searchParams.append("audio.codec",A.audio.codec),A.audio.language&&e.searchParams.append("audio.language",A.audio.language)),A.video&&A.video.codec&&(e.searchParams.append("video.width",A.video.width.toString()),e.searchParams.append("video.height",A.video.height.toString()),e.searchParams.append("video.bitRate",Math.round(A.video.bitRate).toString()),e.searchParams.append("video.codec",A.video.codec)),A.expectAdditionalConnection&&e.searchParams.append("expectAdditionalConnection",A.expectAdditionalConnection.toString()),A.burstMs&&e.searchParams.append("burstMs",A.burstMs.toString()),A.channelGroupId&&e.searchParams.append("channelGroupId",A.channelGroupId),A.authToken&&(e.searchParams.append("auth.token",A.authToken),e.searchParams.append("auth.type","jwt")),e.toString()},DB=(i,A,e)=>HA(A)?r(L(r({},i),{type:"video",codec:A.codec,isSync:ne(i.flags),data:i.payload,duration:0,width:A.width,height:A.height}),e):L(r({},i),{type:"audio",channels:A.channels,sampleRate:A.sampleRate,codec:A.codec,language:A.language,isSync:ne(i.flags),data:i.payload,duration:0}),fB=()=>{var g;const i=window.location.origin,e=!i||i=="null"?"":`${window.location.pathname}${window.location.search}`.substring(0,1e3);return{userAgent:window.navigator.userAgent,locationOrigin:window.location.origin,locationPath:e,ancestorOrigins:((g=window.location.ancestorOrigins)==null?void 0:g.length)>0?Array.from(window.location.ancestorOrigins):void 0}},pB=i=>{if(typeof i!="object"||i===null)throw new Error("not an object");if(!("video"in i))throw new Error("missing video in subscription");if(!("audio"in i))throw new Error("missing audio in subscription");if(!("channelId"in i))throw new Error("missing channelId");return!0},QA=class extends AA{constructor(e){super();t(this,"pictureInPicture");t(this,"browser",di());t(this,"options");t(this,"element");t(this,"playbackSource");t(this,"emitter",new AA);t(this,"logger");t(this,"modules");t(this,"clientIp");t(this,"sessionId");t(this,"clientId",Nt());t(this,"_channels",[]);t(this,"createdAt",Date.now());t(this,"hasCalledConnect",!1);t(this,"apiClient");t(this,"latestEmittedLanguages",[]);t(this,"wakeLock");t(this,"cachedEdges",[]);t(this,"shiftedEdges",[]);t(this,"pool",new H(QA.MAX_POOL_SIZE));t(this,"sampleProcessingSesssions",new Map);t(this,"sizes",new Map);t(this,"isSuspended",!0);t(this,"disconnectTimeout");t(this,"attach",e=>{var g;(g=this.wakeLock)==null||g.attach(e),e.appendChild(this.element)});t(this,"getOptions",()=>this.options.getOptions());t(this,"getThumbnailUrl",()=>{let e=this.options.get("edgeUrl")||this.options.get("url");e=e.replace("wss://","https://"),e=e.replace("ws://","http://"),e=e.endsWith("/")?e.slice(0,-1):e;const g=this.options.get("authenticationToken"),s=g?`&auth.token=${g}`:"";return`${e}/api/thumbnail?channelId=${this.options.get("channelId")}${s}`});t(this,"updateAuthenticationToken",e=>{this.logger.debug("Got new auth token",{token:e}),this.options.set("authenticationToken",e),this.emitter.emit("send signal",JSON.stringify({type:"refresh auth",token:e}))});t(this,"connect",()=>{this.hasCalledConnect||(this.play(),this._connect())});t(this,"_connect",()=>{var e,g;this.hasCalledConnect||(this.hasCalledConnect=!0,Object.values(this.modules).forEach(s=>{s&&"load"in s&&s.load()}),this.unsuspend(),this.playbackSource instanceof Oe&&((g=(e=this.playbackSource).load)==null||g.call(e)),this.modules.connection.connect(this.options.get("media")==="audio+video"?2:1))});t(this,"getCastOptions",()=>({url:this.options.get("url"),channelId:this.options.get("channelId"),channelGroupId:this.options.get("channelGroupId"),authenticationToken:this.options.get("authenticationToken"),language:this.options.get("language"),logLevel:this.options.get("logLevel"),minBufferTime:this.options.get("minBufferTime"),tags:this.options.get("tags"),ownerSessionId:this.sessionId,edgeUrl:this.options.get("edgeUrl"),media:this.options.get("media")}));t(this,"connectionInfo",()=>m(this,null,function*(){try{return yield this.apiClient.connect(this.options.getOptions())}catch(e){if(Yg(e))switch(e.status){case 401:throw this.emitter.emit("error",ge(e)),ge(e);case 403:throw this.emitter.emit("error",ei(e.message)),ei(e.message)}throw this.emitter.emit("error",ns(e instanceof Error?e:void 0)),e}}));t(this,"estimateRTT",()=>m(this,null,function*(){const e=Date.now(),g=()=>Date.now()-e;return Promise.race([Ht(QA.PING_TIMEOUT),fetch(new URL("/api/v2/connect/ping",this.options.get("url")).toString(),{method:"HEAD"})]).then(g,g)}));t(this,"connectHandler",()=>m(this,null,function*(){var D;this.sessionId=Nt();const e=this.modules.subscription.getTargetSubscription(),[g,s]=yield Promise.all([this.connectionInfo(),this.estimateRTT()]),I=s/2,B=je(I),n=g.channels.find(S=>S.channelId===e.channelId);if(this.emitter.emit("connect info",g),this._channels=g.channels,g.channels.forEach(S=>{S.overrides&&this.options.addOverrides(S.channelId,S.overrides),S.renditions=this.filterRenditions(S.renditions),this.modules.renditions.setRenditions(S.channelId,S.renditions)}),!n)throw Ai("external");const o=this.options.getOverride("minBufferTime",this.channelId),C=this.options.getOverride("maxBufferTime",this.channelId);if((o||C)&&(this.modules.bufferTime.updateConfig({minBufferTime:o,maxBufferTime:C}),this.targetBufferTime=this.options.get("minBufferTime",this.channelId)),this.options.get("burstEnabled",this.channelId)&&this.modules.subscription.enableBurst(this.targetBufferTime),this.emit("is live",n.isLive),!n.isLive)throw new Error("Waiting for channel to go live");this.patchSubscription(n,B),yield this.initializeDecodingModule(),this.resetModules(),this.emit("rendition levels",this.modules.renditions.getRenditionLevels()),this.emit("channels",this.channels),this.emitLanguagesIfChanged(),this.sampleProcessingSesssions.clear(),this.cachedEdges=this.cachedEdges.length===0?g.edges:this.cachedEdges;const Q=(this.options.get("edgeUrl")?[this.options.get("edgeUrl")]:[this.cachedEdges.shift()])[0],h=this.options.get("burstEnabled",this.channelId),u=SB(Q,{video:this.targetSubscription.video,audio:this.targetSubscription.audio,burstMs:h?this.targetBufferTime:void 0,sessionId:this.sessionId,clientId:this.clientId,channelId:this.channelId,channelGroupId:this.options.get("channelGroupId"),expectAdditionalConnection:this.options.get("media")==="audio+video",authToken:this.options.get("authenticationToken")});if(!u||!Q)throw new f("Failed to resolve edge url",{isFatal:!0,code:"failed_to_resolve_edge_url"});const l=this.shiftedEdges[this.shiftedEdges.length-1];return l&&((D=this.modules.telemetry)==null||D.addEvent({code:"shifted_edge",edgeUrl:l})),this.shiftedEdges.push(Q),this.logger.debug("resolved edge url",{edgeUrl:u}),Promise.resolve(u)}));t(this,"emitLanguagesIfChanged",()=>{const e=this.modules.renditions.getLanguages(),g=this.latestEmittedLanguages;e.length==g.length&&e.every(I=>g.includes(I))||(this.logger.debug("Emitting new languages",{currentLanguages:e}),this.latestEmittedLanguages=e,this.emit("languages",this.latestEmittedLanguages))});t(this,"filterRenditions",e=>e.filter(g=>{var I,B,n;if(MA(g))return!0;if(!this.isSupportedVideoCodecProfile(g.codec,g.codecString))return!1;if(!this.willUseMediaSource()){const o=(I=this.options.get("advanced").wasmDecodingConstraint.bitRate)!=null?I:Number.MAX_SAFE_INTEGER,C=(B=this.options.get("advanced").wasmDecodingConstraint.width)!=null?B:Number.MAX_SAFE_INTEGER,a=(n=this.options.get("advanced").wasmDecodingConstraint.height)!=null?n:Number.MAX_SAFE_INTEGER;return g.bitRate<=o&&g.width<=C&&g.height<=a}const s=this.options.getOverride("maxVideoBitRate",this.channelId);return s?s>=g.bitRate:!0}));t(this,"patchSubscription",(e,g)=>{const s=Math.min(this.options.get("maxVideoBitRate"),QA.INITIAL_MAX_BIT_RATE,g,this.targetSubscription.video.bitRate),I=Math.min(this.options.get("maxAudioBitRate"),QA.INITIAL_MAX_BIT_RATE,g,this.targetSubscription.audio.bitRate),B=this.options.get("media")==="audio"?[]:["av1","h264"],n=this.supportedAudioCodecs(),o=e.renditions.filter(MA),C=e.renditions.filter(HA),a=n.find(l=>o.find(D=>D.codec===l)!==void 0),Q=B.find(l=>C.find(D=>D.codec===l)!==void 0),h=o.map(l=>l.language);if(this.logger.debug("supported and selected codecs",{audioCodecs:n,videoCodecs:B,audioCodec:a,videoCodec:Q}),Q){const l=this.options.get("maxSize");this.modules.subscription.setVideoConstraint(r({codec:Q,bitRate:this.abrEnabled?s:this.options.get("maxVideoBitRate")},l))}a&&(this.modules.subscription.setAudioConstraint({codec:a,bitRate:this.abrEnabled?I:this.options.get("maxAudioBitRate"),language:this.options.get("language")}),(!h.includes(this.options.get("language"))||this.language===void 0)&&this.modules.subscription.setLanguage(h[0])),this.alignSizeAndBitRate(this.targetSubscription);const u=this.modules.subscription.getTargetSubscription();this.emitter.emit("subscription changed",{to:u,from:this.modules.subscription.getCurrentSubscription()})});t(this,"isSupportedVideoCodecProfile",(e,g)=>{if(this.willUseMediaSource())return window.MediaSource?window.MediaSource.isTypeSupported(Ke({codec:e,codecString:g})):!0;if(e==="h264"){const s=!!(g!=null&&g.startsWith("avc1.42")),I=!!(g!=null&&g.startsWith("avc1.66."));return s||I}return e!=="av1"});t(this,"supportedAudioCodecs",()=>{if(this.options.get("media")==="video")return[];const e=[];return(this.browser.supportsMp4Opus&&this.options.get("mseOpusEnabled")||!this.willUseMediaSource())&&e.push("opus"),this.willUseMediaSource()&&e.push("aac"),e});t(this,"initializeDecodingModule",()=>m(this,null,function*(){var s,I;const e=this.currentRenditionLevel,g=[];if(!e)throw new f("No currentRenditionLevel",{code:"no_current_rendition_level",isFatal:!1});if(e!=null&&e.video&&g.push({type:"video",mimeType:Ke(e.video)}),e!=null&&e.audio&&g.push({type:"audio",mimeType:Ke(e.audio)}),g.length===0)throw new f("Can't initialize decoding module without tracks",{code:"no_tracks",isFatal:!1});if(this.willUseMediaSource()&&this.element instanceof HTMLMediaElement)this.emitter.emit("flush buffers"),yield(s=this.modules.mseModule)==null?void 0:s.setSourceBuffers(g);else{const B=yield lA.create(this.emitter,this.logger.getLogger("DecoderModule"),g,this.playbackSource,this.pool);(I=this.modules.decoder)==null||I.unload(),this.modules.decoder=B,this.modules.decoder.load()}}));t(this,"unload",()=>m(this,null,function*(){var e,g,s;this.logger.debug("Unloading modules..."),yield Promise.all(Object.values(this.modules).map(I=>I==null?void 0:I.unload())),(e=this.wakeLock)==null||e.unload(),this.pool=new H(QA.MAX_POOL_SIZE),(s=(g=this.playbackSource).unload)==null||s.call(g),this.element.remove(),this.emitter.reset(),this.reset(),this.logger.debug("Unloaded modules")}));t(this,"userInput",()=>{this.play()});t(this,"pause",()=>{this.options.get("pauseSupportEnabled")&&(this.playbackSource.pause(),this.hasCalledConnect&&this.suspend())});t(this,"play",()=>m(this,null,function*(){var e;this.hasCalledConnect?this.unsuspend():this._connect(),(e=this.wakeLock)==null||e.enable(),this.playbackState==="paused"&&(this.resetModules(),this.emitter.emit("flush buffers"));try{yield this.playbackSource.play()}catch(g){}}));t(this,"getStatistics",()=>Object.values(this.modules).reduce((e,g)=>g&&"getStatistics"in g?r(r({},e),g.getStatistics()):e,this.getRuntimeInfo()));t(this,"resetModules",()=>{Object.values(this.modules).forEach(e=>{e&&"reset"in e&&e.reset()}),this.sampleProcessingSesssions.clear(),this.playbackSource.currentTime=0,this.playbackSource.isActivated=!1});t(this,"getRuntimeInfo",()=>{const e=this.modules.canvasModule?this.options.get("iosMediaElementEnabled"):void 0;return r({uptime:Date.now()-this.createdAt,version:"3.0.7",clientId:this.clientId,sessionId:this.sessionId,channelId:this.channelId,channelGroupId:this.options.get("channelGroupId"),ip:this.clientIp,url:this.options.get("url"),timeToFirstFrame:this.timeToFirstFrame(),iosMediaElementEnabled:e},fB())});t(this,"onMediaElementState",e=>{this.logger.info("media element state",{state:e}),this.options.get("pauseSupportEnabled")&&(e==="paused"?this.modules.documentState.isVisible&&(this.suspend(),this.modules.connection.disconnect()):this.unsuspend())});t(this,"onBufferEvent",e=>{var s,I,B,n;this.emit("buffer state event",e);const g=!this.playbackSource.isActivated||this.playbackSource.isPaused;if(e==="filled"&&g){const o=Math.max(this.currentTime,(I=(s=this.videoBufferedRanges[0])==null?void 0:s.start)!=null?I:0,(n=(B=this.audioBufferedRanges[0])==null?void 0:B.start)!=null?n:0);this.logger.info("Buffer filled - starting playback",{currentTime:o}),this.playbackSource.currentTime=o,this.modules.sync.activateSyncAdjustments(),this.playbackSource.isActivated=!0}else e==="drained"&&this.playbackSource.isPaused&&(this.playbackSource.isActivated=!1,this.modules.sync.deactivateSyncAdjustments())});t(this,"timeToFirstFrame",()=>{const e=this.modules.playback.getFirstFrameTime(),g=this.modules.connection.firstConnectionTime;if(g&&e)return e-g});t(this,"willUseMediaSource",()=>this.browser.supportsMediaSource&&this.options.get("mseEnabled"));this.options=new mB(r(r({},Vg),Qs(e)));const g=["localhost","127.0.0.1"];e.telemetryEnabled===void 0&&g.includes(location.hostname)&&this.options.set("telemetryEnabled",!1);const s={channelId:this.options.get("channelId"),audio:{language:this.options.get("language"),bitRate:this.options.get("maxAudioBitRate")},video:{bitRate:this.options.get("maxVideoBitRate"),width:this.options.get("maxSize").width,height:this.options.get("maxSize").height}},I=ue.create();I.setLevel(this.options.get("logLevel")),this.logger=I.getLogger("Vindral");const B=Se.create(this.emitter,this.logger.getLogger("PictureInPictureModule")),n=O.create();this.apiClient=new qt({publicEndpoint:this.options.get("url").toString(),tokenFactory:()=>this.options.get("authenticationToken")});const o=dA.create(this.emitter,this.logger.getLogger("ConnectionModule"),{connectHandler:this.connectHandler,reconnectHandler:this.options.get("reconnectHandler")}),C=Fe.create(this.logger.getLogger("SubscriptionModule"),this.emitter,s),a=pe.create(this.emitter,C),Q=fe.create(this.emitter,this.logger.getLogger("QualityOfServiceModule")),h=De.create(this.emitter,this.logger.getLogger("PlaybackModule"),this,this.options.get("minBufferTime")),u=re.create(this.emitter),l=this.options.get("poster"),D=l===!0?this.getThumbnailUrl():l||void 0;let S,Y,T;if(this.willUseMediaSource()){const E=new Oe({type:this.options.get("media")=="audio"?"audio":"video",autoplay:!1,muted:this.options.get("muted")||this.options.get("media")==="video",logger:this.logger.getLogger("MediaElement"),poster:D});E.on("buffer state",w=>this.emitter.emit("buffer state",w)),E.on("needs user input",w=>this.emitter.emit("needs user input",w)),E.on("volume state",w=>this.emit("volume state",w)),E.on("media element state",w=>this.onMediaElementState(w)),this.element=E.element,this.playbackSource=E,S=we.create(this.logger.getLogger("MseModule"),this.emitter,this.element),this.options.get("pauseSupportEnabled")||(Y=ZA.create(this.logger.getLogger("UnpauseModule"),E,u)),this.options.get("pictureInPictureEnabled")&&this.emitter.emit("add picture in picture listener",{element:E.element})}else if(this.browser.platform.iosVersion>=15&&this.options.get("iosMediaElementEnabled")){const E=me.create(this.emitter,this.logger.getLogger("ModernCanvasModule"),this.pool,this,{type:this.options.get("media")=="audio"?"audio":"video",muted:this.options.get("muted")||this.options.get("media")==="video",poster:D}),w=E.element();this.element=w.element,this.playbackSource=E,T=E,this.options.get("pictureInPictureEnabled")&&this.browser.platform.iosVersion>15&&this.emitter.emit("add picture in picture listener",{element:this.element}),this.options.get("pauseSupportEnabled")||(Y=ZA.create(this.logger.getLogger("UnpauseModule"),w,u))}else{const E=le.create(this.emitter,this.logger.getLogger("LegacyCanvasModule"),this.pool,this,this.options.get("muted")||this.options.get("media")==="video");this.element=E.element(),this.playbackSource=E,T=E,this.options.get("iosWakeLockEnabled")&&(this.wakeLock=new qI)}this.emitter.on("channel reset",this.resetModules),this.emitter.on("no data timeout",this.resetModules),this.emitter.on("media element state",E=>this.onMediaElementState(E)),this.emitter.on("volume state",E=>this.emit("volume state",E)),this.options.get("pauseSupportEnabled")||this.emitter.on("exit picture in picture",()=>n.setTimeout(()=>void this.play(),0)),this.emitter.on("constraint cap changed",E=>{this.logger.info("new cap set",{cap:E}),this.alignSizeAndBitRate(this.targetSubscription)}),this.pictureInPicture={enter:()=>B.requestPictureInPicture(),exit:()=>B.exitPictureInPicture(),isActive:()=>B.isPictureInPictureActive(),isSupported:()=>B.isPictureInPictureSupported()},this.emitter.on("error",E=>{if(E.type()==="external"&&this.emit("error",E),E.isFatal())return()=>void this.unload()});const k=ye.create(this.emitter,this.logger.getLogger("SyncModule"),this.playbackSource,h,this.willUseMediaSource()),W=new URL("/telemetry",this.options.get("url").replace("//lb.","//errors.")).toString(),x=VA.create(this.logger.getLogger("TelemetryModule"),this.emitter,{url:W,enabled:this.options.get("telemetryEnabled"),includeStats:!1,interval:5e3},this);this.modules={telemetry:x,bufferTime:FA.create(this.emitter,this.logger.getLogger("BufferTimeModule"),Q,this,{maxBufferTime:this.options.get("maxBufferTime"),minBufferTime:this.options.get("minBufferTime")}),incomingData:uA.create(this.emitter),adaptivity:Qe.create(this.emitter,this.logger.getLogger("AdaptivityModule"),Q,{cooldownTime:Math.max(this.options.get("minBufferTime"),2e3)}),constraintCap:YA.create(this.emitter,this.element,a,this.options.get("abrEnabled")?this.options.get("sizeBasedResolutionCapEnabled"):!1),event:RA.create(this.emitter,this.logger.getLogger("EventModule"),k),sync:k,documentState:u,connection:o,playback:h,pictureInPicture:B,logger:I,timer:n,subscription:C,renditions:a,qualityOfService:Q,mseModule:S,unpause:Y,canvasModule:T},this.modules.adaptivity.isEnabled=this.options.get("abrEnabled"),this.emitter.on("page active",E=>{var w;E&&typeof this.disconnectTimeout=="number"&&(this.modules.timer.clearInterval(this.disconnectTimeout),this.disconnectTimeout=void 0),E?this.playbackSource.isPaused||(this.logger.debug("Unsuspending"),this.unsuspend()):(this.logger.debug("Suspending"),this.suspend(),this.modules.decoder?this.options.get("iosBackgroundPlayEnabled")?(this.modules.decoder.unsuspend(),(w=this.modules.canvasModule)==null||w.unsuspend()):this.modules.connection.disconnect():(this.disconnectTimeout&&this.modules.timer.clearInterval(this.disconnectTimeout),this.disconnectTimeout=this.modules.timer.setInterval(()=>{const b=this.playbackState==="paused"||this.muted;this.connectionState==="connected"&&b&&(this.emitter.emit("flush buffers"),this.modules.connection.disconnect("Page inactive timeout"))},QA.DISCONNECT_TIMEOUT)))});let V;this.emitter.on("context switch complete",()=>{V||(V=window.setTimeout(()=>{window.clearTimeout(V),V=void 0,this.emit("context switch","completed"),this.emitLanguagesIfChanged()},this.targetBufferTime))}),this.emitter.on("context switch started",()=>this.emit("context switch","started")),this.emitter.on("needs user input",E=>this.emit("needs user input",E)),this.emitter.on("event",E=>{switch(E.type){case"metadata":this.emit("metadata",E);break;case"channel switch":this.emit("channel switch",{channelId:E.channelId});break;case"language switch":this.emit("language switch",{language:E.language});break}}),this.emitter.on("buffer state event",this.onBufferEvent),this.emitter.on("playback state",E=>this.emit("playback state",E)),this.emitter.on("rendition level changed",({to:E})=>{E&&this.emit("rendition level",E)}),this.emitter.on("connection state",E=>{E==="connected"&&(this.cachedEdges=[],this.shiftedEdges=[]),this.emit("connection state",E)}),this.emitter.on("recovered from media error",()=>{this.modules.adaptivity.reset(this.targetBufferTime*2)}),this.emitter.once("connect info",E=>{var J,M,P;const b=((M=(J=E.telemetry)==null?void 0:J.probability)!=null?M:1)>=Math.random();E.telemetry&&((P=this.modules.telemetry)==null||P.unload(),this.modules.telemetry=VA.create(this.logger.getLogger("TelemetryModule"),this.emitter,L(r({},E.telemetry),{enabled:this.options.get("telemetryEnabled")&&b}),this),this.modules.telemetry.load())}),this.emitter.on("adapt level",E=>{var JA,aA,IA,c,p;this.logger.debug("adapt level",{direction:E});const w=this.modules.renditions.getRenditionLevels(),b=this.modules.renditions.getRenditionLevel(),J=w.findIndex(G=>G===b),M=w.length-1;let P=J;switch(E){case"upgrade":{const G=Math.min(J+1,M),N=w[G],y=(JA=this.modules.connection.estimatedBandwidth)!=null?JA:nA(),K=((IA=(aA=N==null?void 0:N.audio)==null?void 0:aA.bitRate)!=null?IA:0)+((p=(c=N==null?void 0:N.video)==null?void 0:c.bitRate)!=null?p:0),LA=y*2>K;N&&LA&&this.modules.adaptivity.isQoSOk(N)&&(P=G)}break;case"downgrade":P=Math.max(J-1,0);break;case"double downgrade":P=Math.max(J-2,0);break;case"reconnect":if(J===0||this.modules.qualityOfService.timeSpentBufferingLast(6e3)>5e3){if(!this.modules.connection.lastConnectionTime||Date.now()-this.modules.connection.lastConnectionTime<this.modules.qualityOfService.fatalQosGraceTime()||this.modules.connection.getState()!=="connected")return;this.modules.qualityOfService.incrementFatalQosCount(),this.logger.info("Reconnecting due to poor qos"),this.modules.connection.reconnect("Fatal QOS"),this.emitter.emit("adapted level");return}else P=0}if(P===J)return;const z=w[P];this.alignSizeAndBitRate(L(r({},this.targetSubscription),{video:r(r({},this.targetSubscription.video),z==null?void 0:z.video),audio:r(r({},this.targetSubscription.audio),z==null?void 0:z.audio)})),this.emitter.emit("adapted level")}),this.emitter.on("received signal",E=>{var b;const w=E;switch(this.logger.debug("received",r({},w)),w.type){case"client ip":this.clientIp=w.ip;break;case"renditions":this.emitter.emit("renditions",{renditions:this.filterRenditions(w.renditions),channelId:this.currentSubscription.channelId}),this.emit("rendition levels",this.modules.renditions.getRenditionLevels()),this.emitLanguagesIfChanged();break;case"subscription changed":try{pB(w.subscription)}catch(J){this.emitter.emit("error",new f("Subscription failed validation",{source:J instanceof Error?J:void 0,isFatal:!1,code:"subscription_failed_validation"}))}this.emitter.emit("subscription changed",{to:w.subscription,from:this.modules.subscription.getCurrentSubscription()}),this.modules.sync.timeshiftOnAudio=!((b=w.subscription.video)!=null&&b.codec),this.modules.adaptivity.reset();break;case"timing info":this.modules.sync.updateChannelSyncInfo(w.timingInfo.channelId,w.timingInfo),this.emit("server wallclock time",w.timingInfo.wallclockTime);break}}),this.emitter.on("received data",E=>{const w=this.modules.subscription.getCurrentSubscription(),b=hI(E);if(!w){this.logger.warn("Received unwanted message",r({},b));return}iA(L(r({},b),{channelId:w.channelId}))});const tA=this.options.get("container");tA&&this.attach(tA),this.logger.info("Created Vindral instance",{options:this.options});const iA=E=>{const w=E.channelId,b=this.modules.renditions.getRendition(E.renditionId,w);if(!aI(E.flags)){if(EI(E.flags)){const J=new TextDecoder;this.modules.event.addEvent({timestamp:E.timestamp/E.timescale*1e3-this.modules.sync.getTimeshiftOffset(),content:J.decode(E.payload),type:"metadata"})}else if(b!=null&&b.codec){const J=as(b.codec);if(this.modules.incomingData.add(J,E.payload.byteLength),QI(E.flags)){const M=L(r({type:J,data:E.payload,codec:b.codec},E),{channelId:w}),P=JI(M.codec,M.payload);P&&this.sizes.set(M.renditionId,P),this.emitter.emit("init segment",M),this.emit("initialized media")}else{const M=DB(E,b,this.sizes.get(E.renditionId));let P=this.sampleProcessingSesssions.get(J);if(!P)P=wB(this.modules.sync.processSample(M)),this.sampleProcessingSesssions.set(J,P);else{const z=P(this.modules.sync.processSample(M));this.modules.event.extractEvent(z,M),this.emitter.emit("coded sample",z)}}}}};this.options.get("maxVideoBitRate")!==Number.MAX_SAFE_INTEGER&&(this.maxVideoBitRate=this.options.get("maxVideoBitRate")),this.options.get("maxAudioBitRate")!==Number.MAX_SAFE_INTEGER&&(this.maxAudioBitRate=this.options.get("maxAudioBitRate")),rA(this.options.get("maxSize"),ie())||(this.maxSize=this.options.get("maxSize")),this.options.get("burstEnabled")&&C.enableBurst(this.targetBufferTime),zI(this)}set volume(e){this.playbackSource.volume=e}get volume(){return this.playbackSource.volume}set muted(e){const g=this.playbackSource.muted;this.playbackSource.muted=e,!e&&g&&!this.playbackSource.isPaused&&this.playbackSource.play()}get muted(){return this.playbackSource.muted}get media(){return this.options.get("media")}get videoBitRate(){return this.modules.incomingData.averageBitRate("video")}get audioBitRate(){return this.modules.incomingData.averageBitRate("audio")}get connectionState(){return this.modules.connection.getState()}get playbackState(){return this.modules.playback.getState()}get bufferFullness(){return this.modules.playback.getBufferFullness()}get sizeBasedResolutionCapEnabled(){return this.modules.constraintCap.sizeBasedResolutionCapEnabled}set sizeBasedResolutionCapEnabled(e){this.modules.constraintCap.sizeBasedResolutionCapEnabled=e}get abrEnabled(){return this.modules.adaptivity.isEnabled}set abrEnabled(e){this.modules.constraintCap.sizeBasedResolutionCapEnabled=e?this.options.get("sizeBasedResolutionCapEnabled"):!1,this.modules.adaptivity.isEnabled=e,this.alignSizeAndBitRate(this.targetSubscription)}get serverEdgeTime(){return this.modules.sync.getLiveEdgeTimeLatencyAdjusted(this.currentSubscription.channelId)}get serverWallclockTime(){return this.modules.sync.getWallclockTimeLatencyAdjusted(this.currentSubscription.channelId)}get currentTime(){return this.modules.sync.serverCurrentTime}get channelCurrentTime(){return this.modules.sync.channelCurrentTime}get targetBufferTime(){return this.modules.playback.getTargetBufferTime()}set targetBufferTime(e){this.modules.playback.getTargetBufferTime()!==e&&(this.modules.playback.setTargetBufferTime(e),this.playbackSource.currentTime=this.modules.sync.serverCurrentTime,this.options.get("burstEnabled",this.channelId)?this.modules.subscription.enableBurst(this.targetBufferTime):this.modules.subscription.enableBurst(0))}get playbackLatency(){var e;if(this.playbackSource.currentTime!==0)return this.targetBufferTime+((e=this.modules.sync.drift)!=null?e:0)+this.modules.connection.rtt/2}get playbackWallclockTime(){if(!(!this.serverWallclockTime||!this.playbackLatency))return this.serverWallclockTime-this.playbackLatency}get channels(){return this._channels}get languages(){return this.modules.renditions.getLanguages()}get language(){return this.modules.subscription.getTargetSubscription().audio.language}set language(e){this.modules.subscription.setLanguage(e)}get channelId(){return this.modules.subscription.getTargetSubscription().channelId}set channelId(e){if(e===this.channelId)return;this.modules.subscription.setChannelId(e);const g=this.modules.renditions.getAudioRenditions(e),s=this.targetSubscription.audio.language,I=g==null?void 0:g.some(B=>B.language===s);this.logger.debug("Channel switch - started",{audioRenditions:g,targetSubscriptionLanguage:s,targetHasCurrentLanguage:I}),this.alignSizeAndBitRate(this.targetSubscription)}get maxSize(){var s,I;const{width:e,height:g}=(I=(s=this.modules.constraintCap.getCurrentConstraintCap())==null?void 0:s.video)!=null?I:ie();return{width:e,height:g}}set maxSize(e){this.modules.constraintCap.setUserSpecifiedCap({video:{width:e.width,height:e.height}}),this.alignSizeAndBitRate(this.targetSubscription)}get maxVideoBitRate(){var e,g;return(g=(e=this.modules.constraintCap.getCurrentConstraintCap())==null?void 0:e.video.bitRate)!=null?g:nA()}set maxVideoBitRate(e){this.modules.constraintCap.setUserSpecifiedCap({video:{bitRate:e}}),this.alignSizeAndBitRate(this.targetSubscription)}get maxAudioBitRate(){var e,g;return(g=(e=this.modules.constraintCap.getCurrentConstraintCap())==null?void 0:e.audio.bitRate)!=null?g:nA()}set maxAudioBitRate(e){this.modules.constraintCap.setUserSpecifiedCap({audio:{bitRate:e}}),this.alignSizeAndBitRate(this.targetSubscription)}get renditionLevels(){return this.modules.renditions.getRenditionLevels()}get currentRenditionLevel(){return this.modules.renditions.getRenditionLevel()}get targetRenditionLevel(){return this.modules.renditions.getRenditionLevel(this.modules.subscription.getTargetSubscription())}get isSwitchingRenditionLevel(){return this.modules.subscription.isSwitchingSubscription()}get videoBufferedRanges(){var e,g,s,I;return(I=(s=(e=this.modules.mseModule)==null?void 0:e.getBuffer("video"))!=null?s:(g=this.modules.decoder)==null?void 0:g.getBuffer("video"))!=null?I:[]}get audioBufferedRanges(){var e,g,s,I;return(I=(s=(e=this.modules.mseModule)==null?void 0:e.getBuffer("audio"))!=null?s:(g=this.modules.decoder)==null?void 0:g.getBuffer("audio"))!=null?I:[]}get lastBufferEvent(){return this.modules.playback.getLastBufferStateEvent()}get activeRatios(){return this.modules.qualityOfService.activeRatios()}get bufferingRatios(){return this.modules.qualityOfService.bufferingRatios()}get timeSpentBuffering(){return this.modules.qualityOfService.timeSpentBuffering()}get timeActive(){return this.modules.qualityOfService.timeActive()}get mediaElement(){return this.element}get uptime(){return Date.now()-this.createdAt}suspend(){this.isSuspended||(Object.values(this.modules).forEach(e=>{e&&"suspend"in e&&e.suspend()}),this.isSuspended=!0)}unsuspend(){this.isSuspended&&(Object.values(this.modules).forEach(e=>{e&&"unsuspend"in e&&e.unsuspend()}),this.isSuspended=!1)}alignSizeAndBitRate(e){const g=this.modules.constraintCap.constrainSubscription(L(r({},e),{video:r({},e.video),audio:r({},e.audio)})),s=this.modules.constraintCap.getUserSpecifiedCap();!this.abrEnabled&&s&&(g.audio.bitRate=s.audio.bitRate,g.video.bitRate=s.video.bitRate,g.video.width=s.video.width,g.video.height=s.video.height);const I=this.modules.renditions.getRenditionLevel(g);if(I){if(I.video&&(this.modules.subscription.setVideoBitRate(I.video.bitRate),this.modules.subscription.setSize(I.video)),I.audio)this.modules.subscription.setAudioBitRate(I.audio.bitRate),this.modules.subscription.setLanguage(I.audio.language);else if(g.audio.language){let B=this.modules.renditions.getAudioRenditions(g.channelId);!this.abrEnabled&&s&&(B=B==null?void 0:B.filter(Q=>Q.bitRate<s.audio.bitRate));const n=g.audio.language,o=B==null?void 0:B.some(Q=>Q.language===n),C=B==null?void 0:B.find(Q=>Q.language),a=(B==null?void 0:B.length)&&B[0]||void 0;o||(C?(this.logger.debug("Randomizing language since target did not have current language"),this.modules.subscription.setAudioBitRate(C.bitRate),this.modules.subscription.setLanguage(C.language)):(this.logger.debug("Randomizing audio rendition since target did not have current language"),a!=null&&a.bitRate&&this.modules.subscription.setAudioBitRate(a.bitRate),this.modules.subscription.setLanguage(a==null?void 0:a.language)))}}}get currentSubscription(){return this.modules.subscription.getCurrentSubscription()}get targetSubscription(){return this.modules.subscription.getTargetSubscription()}};let oA=QA;t(oA,"MAX_POOL_SIZE",10),t(oA,"INITIAL_MAX_BIT_RATE",2.5*1e3*1e3),t(oA,"PING_TIMEOUT",1e3),t(oA,"DISCONNECT_TIMEOUT",15*1e3);const vi={bar:"_bar_16xpe_1",hidden:"_hidden_16xpe_46"},OA={"channel-selection-item":"_channel-selection-item_suenn_1","channel-selection-item-selected":"_channel-selection-item-selected_suenn_8","channel-selection-item-image":"_channel-selection-item-image_suenn_13",withThumbnails:"_withThumbnails_suenn_19","hide-on-small":"_hide-on-small_suenn_27"};class ${constructor(A){t(this,"attach",A=>{this.detach(),A.appendChild(this.element)});t(this,"detach",()=>this.element.remove());this.element=A}}const FB={"icon-button":"_icon-button_5fg7v_1"},Ni={enter:{viewBox:"-12 -12 38 38",content:`<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-5.000000, -5.000000)">
26
+ `,Si=(i,A)=>{let e=i.getContext("webgl",A);if(e||(e=i.getContext("experimental-webgl",A)),!e)throw new f("Failed to create webgl context",{isFatal:!0,code:"failed_to_create_web_gl_context"});return e},ce=(i,A,e)=>{const g=i.createShader(A);if(!g)throw new f("Failed to create shader",{isFatal:!0,code:"failed_to_create_shader"});if(i.shaderSource(g,e),i.compileShader(g),!i.getShaderParameter(g,i.COMPILE_STATUS)){const s=i.getShaderInfoLog(g);throw new f(`Failed to compile shader: ${s!=null?s:""}`,{isFatal:!0,code:"failed_to_compile_shader"})}return g},GA=i=>{const A=i.createTexture();if(!A)throw new f("Failed to create texture",{isFatal:!0,code:"failed_to_create_texture"});return i.bindTexture(i.TEXTURE_2D,A),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),A},Di=(i,A)=>{const e=i.createBuffer();if(!e)throw new f("Failed to create buffer",{isFatal:!0,code:"failed_to_create_buffer"});return i.bindBuffer(i.ARRAY_BUFFER,e),i.bufferData(i.ARRAY_BUFFER,A.buffer,i.STATIC_DRAW),e},fi=(i,A,e)=>{const g=i.createProgram();if(!g)throw new f("Failed to create program",{isFatal:!0,code:"failed_to_create_program"});if(i.attachShader(g,e),i.attachShader(g,A),i.linkProgram(g),!i.getProgramParameter(g,i.LINK_STATUS)){const s=i.getShaderInfoLog(g);throw new f(`Failed to link program: ${s!=null?s:""}`,{isFatal:!0,code:"failed_to_link_program"})}return g},pi={width:256,codedWidth:256,height:144,codedHeight:144},Fi={preserveDrawingBuffer:!1,alpha:!1,depth:!1,stencil:!1,antialias:!1,premultipliedAlpha:!1},Ne=class extends AA{constructor(){super();t(this,"canvas",document.createElement("canvas"));t(this,"context",Si(this.canvas,Fi));t(this,"pixelShader",ce(this.context,this.context.FRAGMENT_SHADER,mi));t(this,"vertexShader",ce(this.context,this.context.VERTEX_SHADER,wi));t(this,"buffer",Di(this.context,Ne.SQUARE_VERTICES));t(this,"program",fi(this.context,this.vertexShader,this.pixelShader));t(this,"textures",{y:GA(this.context),u:GA(this.context),v:GA(this.context)});t(this,"size",pi);t(this,"onContextLost",e=>{const g=new Error(e instanceof WebGLContextEvent?e.statusMessage:"webgl context lost");this.emit("context lost",Cs(g)),e.preventDefault()});t(this,"onContextRestored",()=>{this.emit("context restored"),this.context=Si(this.canvas,Fi),this.pixelShader=ce(this.context,this.context.FRAGMENT_SHADER,mi),this.vertexShader=ce(this.context,this.context.VERTEX_SHADER,wi),this.buffer=Di(this.context,Ne.SQUARE_VERTICES),this.program=fi(this.context,this.vertexShader,this.pixelShader),this.textures={y:GA(this.context),u:GA(this.context),v:GA(this.context)},this.load()});t(this,"load",()=>{this.context.useProgram(this.program),this.setupPositionVertexAttributes(),this.setSize(pi),this.context.uniform1i(this.context.getUniformLocation(this.program,"y_texture"),0),this.context.uniform1i(this.context.getUniformLocation(this.program,"u_texture"),1),this.context.uniform1i(this.context.getUniformLocation(this.program,"v_texture"),2),this.setConversionMatrix(this.rec709())});t(this,"unload",()=>{var g;this.setSize({width:1,height:1,codedHeight:1,codedWidth:1}),[this.textures.y,this.textures.u,this.textures.v].forEach(s=>this.context.deleteTexture(s)),this.context.deleteShader(this.pixelShader),this.context.deleteShader(this.vertexShader),this.context.deleteProgram(this.program),this.context.deleteBuffer(this.buffer),this.canvas.removeEventListener("webglcontextlost",this.onContextLost),this.canvas.removeEventListener("webglcontextrestored",this.onContextRestored),(g=this.context.getExtension("WEBGL_lose_context"))==null||g.loseContext()});t(this,"resetSize",()=>{this.setSize({width:this.size.width/2,height:this.size.height/2,codedHeight:this.size.codedHeight/2,codedWidth:this.size.codedWidth/2})});t(this,"render",e=>{this.setSize({width:e.width,height:e.height,codedWidth:e.codedWidth,codedHeight:e.codedHeight}),this.context.activeTexture(this.context.TEXTURE0),this.updateTexture(this.textures.y,this.size.codedWidth,this.size.codedHeight,e.data[0]),this.context.activeTexture(this.context.TEXTURE1),this.updateTexture(this.textures.u,this.size.codedWidth/2,this.size.codedHeight/2,e.data[1]),this.context.activeTexture(this.context.TEXTURE2),this.updateTexture(this.textures.v,this.size.codedWidth/2,this.size.codedHeight/2,e.data[2]),this.context.drawArrays(this.context.TRIANGLE_STRIP,0,4)});t(this,"updateTexture",(e,g,s,I)=>{const n=this.context.LUMINANCE,o=this.context.UNSIGNED_BYTE;this.context.bindTexture(this.context.TEXTURE_2D,e),this.context.texImage2D(this.context.TEXTURE_2D,0,n,g,s,0,n,o,I)});t(this,"setupPositionVertexAttributes",()=>{const e=this.context.getAttribLocation(this.program,"position");this.context.enableVertexAttribArray(e),this.context.vertexAttribPointer(e,2,this.context.FLOAT,!1,0,0)});t(this,"setSize",e=>{rA(e,this.size)||(this.size=e,this.canvas.setAttribute("width",e.width.toString()),this.canvas.setAttribute("height",e.height.toString()),this.context.viewport(0,0,e.width,e.height),this.setModelMatrix(e.width/e.codedWidth,e.height/e.codedHeight))});t(this,"setModelMatrix",(e,g)=>{const s=this.context.getUniformLocation(this.program,"model");this.context.uniformMatrix4fv(s,!1,this.transformMatrix(e,g))});t(this,"setConversionMatrix",e=>{const g=this.context.getUniformLocation(this.program,"conversion");this.context.uniformMatrix4fv(g,!1,e)});t(this,"transformMatrix",(e,g)=>[2/e,0,0,0,0,-2/g,0,0,0,0,2/1,0,-1,1,0,1]);t(this,"rec709",()=>[1.16438,0,1.79274,-.97295,1.16438,-.21325,-.53291,.30148,1.16438,2.1124,0,-1.1334,0,0,0,1]);t(this,"rec601",()=>[1.16438,0,1.59603,-.87079,1.16438,-.39176,-.81297,.52959,1.16438,2.01723,0,-1.08139,0,0,0,1]);this.canvas.addEventListener("webglcontextlost",this.onContextLost),this.canvas.addEventListener("webglcontextrestored",this.onContextRestored,!1),this.canvas.style.width="100%",this.canvas.style.position="relative"}};let de=Ne;t(de,"SQUARE_VERTICES",new Float32Array([0,0,0,1,1,0,1,1]));const ct=class{constructor(A,e,g){t(this,"oldTimestampLimit",400);t(this,"pool");t(this,"logger");t(this,"videoRenderer",new de);t(this,"renderQueue",[]);t(this,"clockSource");t(this,"isFirstFrame",!0);t(this,"animationFrameRequest");t(this,"renderedFrameCount",0);t(this,"rendererDroppedFrameCount",0);t(this,"load",()=>{this.videoRenderer.load()});t(this,"unload",()=>(this.stopRender(),this.videoRenderer.unload(),Promise.resolve()));t(this,"suspend",()=>{this.renderQueue=[],this.stopRender()});t(this,"unsuspend",()=>{this.animationFrameRequest=requestAnimationFrame(this.render)});t(this,"element",()=>this.videoRenderer.canvas);t(this,"getStatistics",()=>({renderedFrameCount:this.renderedFrameCount,rendererDroppedFrameCount:this.rendererDroppedFrameCount,contextLostCount:0,contextRestoredCount:0}));t(this,"resetSize",()=>{this.videoRenderer.resetSize()});t(this,"onDecodedFrame",A=>{if(A.type==="video")if(this.isFirstFrame)this.isFirstFrame=!1,requestAnimationFrame(()=>{this.renderSample(A)});else{const e=(this.clockSource.currentTime-this.oldTimestampLimit)/1e3;this.renderQueue=this.renderQueue.filter(g=>{const s=g.timestamp/g.timescale,I=A.timestamp/A.timescale,B=s>e&&s<=I;return B||this.pool.reclaim(g.buffer),B}),this.renderQueue.push(A)}});t(this,"render",()=>{const A=this.clockSource.currentTime;let e=this.renderQueue[0],g,s=0;for(;e&&e.timestamp/e.timescale*1e3<=A;)e=this.renderQueue.shift(),e&&(s++,g&&this.pool.reclaim(g.buffer),g=e),e=this.renderQueue[0];g&&this.renderSample(g),this.rendererDroppedFrameCount+=Math.max(s-1,0),this.animationFrameRequest=requestAnimationFrame(this.render)});t(this,"renderSample",A=>{this.renderedFrameCount++,this.videoRenderer.render(A),this.pool.reclaim(A.buffer)});t(this,"stopRender",()=>{this.animationFrameRequest&&cancelAnimationFrame(this.animationFrameRequest)});this.logger=A,this.clockSource=e,this.pool=g}};let WA=ct;t(WA,"create",(A,e,g)=>new ct(A,e,g));const mA=(i,A)=>{let e;for(e=A;i>1;i--)e+=A;return e};class CB{constructor(){t(this,"audio");t(this,"unmute",()=>this.audio.play().catch(eA));const A=document.createElement("div");A.innerHTML="<audio x-webkit-airplay='deny'></audio>";const e=A.children.item(0);if(e instanceof HTMLAudioElement)this.audio=e,this.audio.controls=!1,this.audio.disableRemotePlayback=!0,this.audio.preload="auto",this.audio.src="data:audio/mpeg;base64,//uQx"+mA(23,"A")+"WGluZwAAAA8AAAACAAACcQCA"+mA(16,"gICA")+mA(66,"/")+"8AAABhTEFNRTMuMTAwA8MAAAAAAAAAABQgJAUHQQAB9AAAAnGMHkkI"+mA(320,"A")+"//sQxAADgnABGiAAQBCqgCRMAAgEAH"+mA(15,"/")+"7+n/9FTuQsQH//////2NG0jWUGlio5gLQTOtIoeR2WX////X4s9Atb/JRVCbBUpeRUq"+mA(18,"/")+"9RUi0f2jn/+xDECgPCjAEQAABN4AAANIAAAAQVTEFNRTMuMTAw"+mA(97,"V")+"Q==",this.audio.loop=!1,this.audio.load();else throw new Error("Failed to create audio tag")}}const dt=class{constructor(A,e,g,s,I){t(this,"logger");t(this,"emitter");t(this,"audioPlayer");t(this,"videoPlayer");t(this,"pool");t(this,"unmuter",new CB);t(this,"_isPaused",!1);t(this,"isDisconnected",!1);t(this,"reset",()=>{});t(this,"load",()=>{this.audioPlayer.useDefaultDestination(),this.emitter.on("decoded frame",this.onDecodedFrame),this.emitter.on("flush buffers",this.flushBuffers),this.videoPlayer.load()});t(this,"unload",()=>{this.emitter.off("decoded frame",this.onDecodedFrame),this.emitter.off("flush buffers",this.flushBuffers),this.audioPlayer.unload(),this.videoPlayer.unload()});t(this,"suspend",()=>{this.videoPlayer.suspend(),this.audioPlayer.suspend()});t(this,"unsuspend",()=>{this.videoPlayer.unsuspend(),this.audioPlayer.unsuspend()});t(this,"element",()=>this.videoPlayer.element());t(this,"getStatistics",()=>this.videoPlayer.getStatistics());t(this,"flushBuffers",()=>{this.audioPlayer.flushBuffer()});t(this,"activateAudioPlayer",()=>(this.isDisconnected&&(this.isDisconnected=!1,this.audioPlayer.useDefaultDestination()),this._isPaused=!1,this.unmuter.unmute(),this.audioPlayer.play()));t(this,"onDecodedFrame",A=>{try{this.audioPlayer.onDecodedFrame(A)}catch(e){e instanceof Error&&this.emitter.emit("error",_t(!1,e))}this.videoPlayer.onDecodedFrame(A)});this.logger=e,this.emitter=A,this.pool=g,this.audioPlayer=xA.create(this.logger.getLogger("AudioPlayerModule"),s,{muted:I,reInitWhenStuck:!0}),this.audioPlayer.on("stuck",()=>{this.isDisconnected=!0}),this.audioPlayer.on("state change",()=>{this.emitter.emit("volume state",{volume:this.volume,isMuted:this.muted})}),this.videoPlayer=WA.create(this.logger.getLogger("VideoPlayerModule"),this.audioPlayer,this.pool)}get volume(){return this.audioPlayer.volume}set volume(A){this.audioPlayer.volume=A}get muted(){return this.audioPlayer.muted}set muted(A){const e=this.muted;this.audioPlayer.muted=A,!A&&e&&this.activateAudioPlayer().catch(eA)}get currentTime(){return this.audioPlayer.currentTime}set currentTime(A){this.audioPlayer.currentTime=A}get isActivated(){return this.audioPlayer.isActivated}set isActivated(A){this.audioPlayer.isActivated=A}get seekTime(){return this.audioPlayer.seekTime}get isPaused(){return this._isPaused}get isSeeking(){return this.audioPlayer.isSeeking}play(){return m(this,null,function*(){try{yield this.activateAudioPlayer()}catch(A){this.emitter.emit("needs user input",{forAudio:!0,forVideo:!1})}this.emitter.emit("media element state","playing")})}pause(){this._isPaused=!0,this.audioPlayer.pause(),this.emitter.emit("media element state","paused")}};let le=dt;t(le,"create",(A,e,g,s,I)=>new dt(A,e,g,s,I));const yi=Object.values(PA),Ri=(i,A)=>yi.indexOf(i)<yi.indexOf(A),lt=class{constructor(){t(this,"level",PA.DEBUG);t(this,"categoryLevels",new Map);t(this,"getLogger",A=>new Ye({category:A,onLog:this.onLog}));t(this,"setLevel",(A,e)=>{e?this.categoryLevels.set(e,A):this.level=A});t(this,"unload",()=>{});t(this,"onLog",(A,e,g,s)=>{if(Ri(e,this.level))return;const I=A.category(),B=this.categoryLevels.get(I);if(B&&Ri(e,B))return;const n=A.getFullCategory().reduceRight((C,a)=>(C.length?C+" > ":"")+a,""),o=`[${new Date().toISOString()}][${e}][${n}] ${g}`;console.log(o,s)})}};let ue=lt;t(ue,"create",()=>new lt);const ut=class{constructor(A,e,g,s,{muted:I,type:B,poster:n}){t(this,"logger");t(this,"emitter");t(this,"mediaElement");t(this,"audioPlayer");t(this,"videoPlayer");t(this,"pool");t(this,"isDisconnected",!0);t(this,"_userProvidedMuted",!1);t(this,"volumeState");t(this,"reset",()=>{});t(this,"load",()=>{this.mediaElement.load(),this.emitter.on("decoded frame",this.onDecodedFrame),this.emitter.on("flush buffers",this.flushBuffers),this.emitter.on("ios-hack: reset size",this.resetCanvasSize),this.emitter.on("enter picture in picture",this.onEnterIOSHack),this.emitter.on("exit picture in picture",this.onExitIOSHack),this.element().element.addEventListener("webkitendfullscreen",this.onExitIOSHack),this.element().element.addEventListener("webkitbeginfullscreen",this.onEnterIOSHack),this.videoPlayer.load()});t(this,"unload",()=>{this.emitter.off("decoded frame",this.onDecodedFrame),this.emitter.off("flush buffers",this.flushBuffers),this.emitter.off("ios-hack: reset size",this.resetCanvasSize),this.emitter.off("enter picture in picture",this.onEnterIOSHack),this.emitter.off("exit picture in picture",this.onExitIOSHack),this.element().element.removeEventListener("webkitendfullscreen",this.onExitIOSHack),this.element().element.removeEventListener("webkitbeginfullscreen",this.onEnterIOSHack),this.mediaElement.unload(),this.audioPlayer.unload(),this.videoPlayer.unload()});t(this,"suspend",()=>{this.videoPlayer.suspend(),this.audioPlayer.suspend()});t(this,"unsuspend",()=>{this.videoPlayer.unsuspend(),this.audioPlayer.unsuspend()});t(this,"element",()=>this.mediaElement);t(this,"getStatistics",()=>this.videoPlayer.getStatistics());t(this,"activateAudioPlayer",()=>(this.isDisconnected&&this.connectStreams(),this.audioPlayer.play()));t(this,"flushBuffers",()=>{this.audioPlayer.flushBuffer()});t(this,"resetCanvasSize",()=>{this.videoPlayer.resetSize()});t(this,"onEnterIOSHack",()=>{this.mediaElement._iosHackEnterPiPMode()});t(this,"onExitIOSHack",()=>{this.mediaElement._iosHackExitPiPMode()});t(this,"onDecodedFrame",A=>{try{this.audioPlayer.onDecodedFrame(A)}catch(e){e instanceof Error&&this.emitter.emit("error",_t(!1,e))}this.videoPlayer.onDecodedFrame(A)});t(this,"connectStreams",()=>{const A=this.videoPlayer.element().captureStream(),e=this.audioPlayer.useMediaStreamDestination().stream,g=[];g.push(...A.getTracks(),...e.getTracks()),this.mediaElement.element.srcObject=new MediaStream(g),this.isDisconnected=!1});t(this,"updateVolumeState",()=>{const A={isMuted:this.muted,volume:this.volume};rA(A,this.volumeState)||(this.volumeState=A,this.emitter.emit("volume state",this.volumeState))});this.logger=e,this.emitter=A,this.pool=g,this._userProvidedMuted=I,this.mediaElement=new Oe({poster:n,type:B,muted:I,autoplay:!1,logger:this.logger.getLogger("MediaElement")}),this.mediaElement.on("volume state",o=>{this.updateVolumeState(),!o.isMuted&&!this.audioPlayer.isContextRunning&&this.activateAudioPlayer().catch(eA),o.isMuted||(this._userProvidedMuted=!1)}),this.mediaElement.on("media element state",o=>{o==="paused"&&this.audioPlayer.flushBuffer(),this.emitter.emit("media element state",o)}),this.audioPlayer=xA.create(this.logger.getLogger("AudioPlayerModule"),s,{muted:!1,reInitWhenStuck:!1}),this.audioPlayer.on("stuck",()=>{this.isDisconnected=!0}),this.audioPlayer.on("state change",o=>{o==="suspended"||o==="interrupted"?this.mediaElement.muted=!0:o==="running"&&(this.mediaElement.muted=this._userProvidedMuted||document.visibilityState==="hidden"),this.updateVolumeState()}),this.videoPlayer=WA.create(this.logger.getLogger("VideoPlayerModule"),this.audioPlayer,this.pool),this.volumeState={volume:this.volume,isMuted:this.muted}}get volume(){return this.mediaElement.volume}set volume(A){this.mediaElement.volume=A}get muted(){return this.mediaElement.muted||this.audioPlayer.muted}set muted(A){const e=this.muted;this._userProvidedMuted=A,this.mediaElement.muted=A,!A&&e&&this.activateAudioPlayer().catch(eA)}get currentTime(){return this.audioPlayer.currentTime}set currentTime(A){this.audioPlayer.currentTime=A}get isActivated(){return this.mediaElement.isActivated}set isActivated(A){this.mediaElement.isActivated=A}get seekTime(){return this.mediaElement.seekTime}get isPaused(){return this.mediaElement.isPaused}get isSeeking(){return this.mediaElement.isSeeking}play(){return m(this,null,function*(){const A=this._userProvidedMuted;return this.activateAudioPlayer().catch(()=>{A||this.emitter.emit("needs user input",{forAudio:!0,forVideo:!1})}),this.mediaElement.play()})}pause(){this.mediaElement.pause()}};let me=ut;t(me,"create",(A,e,g,s,I)=>new ut(A,e,g,s,I));class Gi{constructor(){t(this,"initSegments",new Map);t(this,"set",(A,e,g)=>{var I;const s=(I=this.initSegments.get(A))!=null?I:new Map;s.set(e,g),this.initSegments.set(A,s)});t(this,"get",(A,e)=>{var g;return(g=this.initSegments.get(A))==null?void 0:g.get(e)})}}function QB(i,{mediaSource:A,mimeType:e}){return L(r({},i),{state:"initialized",mimeType:e,sourceBuffer:A.addSourceBuffer(e),isWorkingOnPendingSamples:!1,sequenceNumber:0})}function ki({initSegments:i,pendingSamples:A}){return{state:"uninitialized",initSegments:i!=null?i:new Gi,sequenceNumber:0,isWorkingOnPendingSamples:!1,hasFirstSync:!!A,pendingSamples:A!=null?A:[],consecutiveQuotaExceededErrorCount:0,successfulAppendCalls:0}}const mt=class{constructor(A,e,g){t(this,"maxChunkSize",20);t(this,"minConsecutiveErrorsBeforeEmit",5);t(this,"logger");t(this,"timers",O.create());t(this,"emitter");t(this,"mediaElement");t(this,"mediaSource",new ai);t(this,"trackContexts",new Map);t(this,"autoRecoverFromMediaErrors",!0);t(this,"quotaErrorCount",0);t(this,"recoveredFromErrorCount",0);t(this,"sourceOpenStartTime",Date.now());t(this,"sourceOpenEndTime",Date.now());t(this,"pendingTracksToAddSourceBuffers");t(this,"hasAddedInitialPosterFrame",!0);t(this,"load",()=>{this.emitter.on("init segment",this.init),this.emitter.on("coded sample",this.onCodedSample),this.emitter.on("flush buffers",this.flushBuffers)});t(this,"unload",()=>{this.logger.debug("Unloading module..."),this.emitter.off("init segment",this.init),this.emitter.off("coded sample",this.onCodedSample),this.emitter.off("flush buffers",this.flushBuffers),this.mediaSource.off("source ended",this.onSourceEnded),this.mediaSource.off("source open",this.onSourceOpen),this.trackContexts.forEach(A=>A.pendingSamples=[]),this.timers.unload(),this.logger.debug("Unloaded module")});t(this,"getStatistics",()=>{var e,g,s,I;const A={quotaErrorCount:this.quotaErrorCount,mediaSourceOpenTime:this.sourceOpenEndTime-this.sourceOpenStartTime,successfulAudioAppendsCalls:(e=this.trackContexts.get("audio"))==null?void 0:e.successfulAppendCalls,successfulVideoAppendCalls:(g=this.trackContexts.get("video"))==null?void 0:g.successfulAppendCalls};if(this.mediaElement instanceof HTMLVideoElement){const B=(I=(s=this.mediaElement).getVideoPlaybackQuality)==null?void 0:I.call(s);A.totalVideoFrames=B==null?void 0:B.totalVideoFrames,A.droppedVideoFrames=B==null?void 0:B.droppedVideoFrames}return A});t(this,"flushBuffers",()=>{this.trackContexts.forEach(A=>{A.pendingSamples=[],A.hasFirstSync=!1,A.state!=="uninitialized"&&this.mediaSource.isOpen()&&A.sourceBuffer.removeBuffer(0,Number.POSITIVE_INFINITY).catch(e=>{this.logger.error("Failed to remove buffer",{error:e})})})});t(this,"setTrackContexts",(...e)=>m(this,[...e],function*(A=new Map){this.logger.debug("setTrackContexts"),["audio","video"].forEach(s=>{var n,o,C,a;const I=(o=(n=A.get(s))==null?void 0:n.pendingSamples)!=null?o:[],B=(C=A.get(s))==null?void 0:C.initSegments;for(;I.length>0&&!((a=I[0])!=null&&a.isSync);)I.shift();this.trackContexts.set(s,ki({pendingSamples:I,initSegments:B}))})}));t(this,"setSourceBuffers",A=>m(this,null,function*(){if(this.mediaSource.isClosed()){this.pendingTracksToAddSourceBuffers=A;return}let e=!0;for(const g of A){const s=this.trackContexts.get(g.type);if(!s||s.state==="uninitialized"||s.mimeType!==g.mimeType){e=!1;break}}if(e){this.logger.debug("Already setup with the correct mime types");return}for(const g of A){let s=this.trackContexts.get(g.type);s||(s=ki({pendingSamples:[],initSegments:new Gi}),this.trackContexts.set(g.type,s)),s.state==="initialized"?g.mimeType!==s.mimeType&&(yield s.sourceBuffer.changeType(g.mimeType)):this.trackContexts.set(g.type,QB(s,{mimeType:g.mimeType,mediaSource:this.mediaSource}))}}));t(this,"getBuffer",A=>{const e=[];if(this.mediaSource.isClosed())return[];const g=this.trackContexts.get(A);if(!g||g.state==="uninitialized")return[];try{const s=g.sourceBuffer.buffered();if(!s)return[];for(let I=0;I<s.length;I++)e.push({start:s.start(I)*1e3,end:s.end(I)*1e3});return e}catch(s){return[]}});t(this,"init",A=>{this.logger.debug("Added init segment",{channel:A.channelId,renditionId:A.renditionId});const e=this.trackContexts.get(A.type);if(!e)throw xe(A.type,A.renditionId);const g=bI(A.codec,A.data,A.timescale);g&&e.initSegments.set(A.channelId,A.renditionId,g)});t(this,"append",(A,e)=>m(this,null,function*(){var B;const g=A[0];if(!g)return;const s=this.trackContexts.get(g.type),I=s==null?void 0:s.initSegments.get(g.channelId,g.renditionId);if(!this.mediaSource.isClosed()){if(!I)throw ts(g.renditionId,g.channelId);if(!s)throw xe(g.type,g.renditionId);if(s.state==="uninitialized")throw is(g.type,g.renditionId);if(e){const n=(g.timestamp+((B=g.compositionTimeOffset)!=null?B:0))/g.timescale;yield s.sourceBuffer.removeBuffer(n,Number.POSITIVE_INFINITY),yield s.sourceBuffer.appendBuffer(I)}try{let n=s.sequenceNumber;const o=aB(A.map(C=>MI(C,n++)));yield s.sourceBuffer.appendBuffer(o),s.sequenceNumber=n,s.consecutiveQuotaExceededErrorCount=0,s.successfulAppendCalls++}catch(n){throw n instanceof DOMException&&(n.code===DOMException.QUOTA_EXCEEDED_ERR?(this.quotaErrorCount++,s.consecutiveQuotaExceededErrorCount++,this.logger.error("quota exceeded error",{error:n}),s.pendingSamples.unshift(...A)):this.mediaElement.error&&s.pendingSamples.unshift(...A)),n}}}));t(this,"onCodedSample",A=>{if(A.duration===0)return;const e=this.trackContexts.get(A.type);if(!e)throw xe(A.type,A.renditionId);if(!(!e.hasFirstSync&&!A.isSync)){if(this.hasAddedInitialPosterFrame&&A.isSync&&A.type==="video"){this.hasAddedInitialPosterFrame=!1;const g=r({},A);g.timestamp=0,e.pendingSamples.push(g)}e.hasFirstSync=!0,e.pendingSamples.push(A),e.state!=="uninitialized"&&(e.isWorkingOnPendingSamples||EB(e,this.append,this.maxChunkSize).catch(g=>{if(e.isWorkingOnPendingSamples=!1,g instanceof Error){if(this.logger.error("append failed",{message:g.message,name:g.name}),g instanceof DOMException&&g.code===DOMException.QUOTA_EXCEEDED_ERR){if(e.consecutiveQuotaExceededErrorCount>=this.minConsecutiveErrorsBeforeEmit){const s=$t(!1,g,e.consecutiveQuotaExceededErrorCount,A.type);this.emitter.emit("error",s)}}else{const s=$t(!1,g,e.consecutiveQuotaExceededErrorCount,A.type);this.emitter.emit("error",s)}this.mediaElement.error&&this.onSourceEnded()}}))}});t(this,"onSourceOpen",()=>{this.logger.debug("source opened"),this.sourceOpenEndTime=Date.now(),this.pendingTracksToAddSourceBuffers&&(this.setSourceBuffers(this.pendingTracksToAddSourceBuffers),this.pendingTracksToAddSourceBuffers=void 0)});t(this,"onSourceEnded",()=>{const{error:A}=this.mediaElement;if(A){const e=/AUDIO_RENDERER/.test(A.message)||!this.autoRecoverFromMediaErrors,g=es(e,A);if(this.logger.error("MediaElement error",{error:g}),this.emitter.emit("error",g),!g.isFatal()){this.logger.info("Re-opening MediaSource"),this.emitter.emit("recovered from media error",{error:g,count:this.recoveredFromErrorCount}),this.recoveredFromErrorCount++;const s=!this.mediaElement.paused,I=[];this.trackContexts.forEach((B,n)=>{B.state==="initialized"&&I.push({type:n,mimeType:B.mimeType})}),this.sourceOpenStartTime=Date.now(),this.pendingTracksToAddSourceBuffers=I,this.mediaElement.src="",this.setTrackContexts(this.trackContexts),this.mediaElement.src=this.mediaSource.createObjectURL(),s&&this.mediaElement.play()}}this.logger.debug("source ended")});this.logger=A,this.mediaElement=g,this.emitter=e}};let we=mt;t(we,"create",(A,e,g)=>{const s=new mt(A,e,g);return s.setTrackContexts(),s.mediaSource.on("source ended",s.onSourceEnded),s.mediaSource.on("source open",s.onSourceOpen),g.src=s.mediaSource.createObjectURL(),s});const Ui=(i,A)=>{var B;const e=i.renditionId!==A.renditionId,g=i.channelId!==A.channelId,s=((B=i.timestamp)!=null?B:0)>A.timestamp;let I=!1;return i.type==="video"&&A.type==="video"&&(I=A.width!==i.width||A.height!==i.height),g||e||s||I},aB=function(i){const A=i.reduce((s,I)=>s+I.byteLength,0),e=new Uint8Array(A);let g=0;return i.forEach(s=>{e.set(new Uint8Array(s),g),g+=s.byteLength}),e.buffer},EB=(i,A,e)=>m(this,null,function*(){for(i.isWorkingOnPendingSamples=!0;i.pendingSamples.length>0;){const g=[];let s=0;for(let n=0;n<i.pendingSamples.length;n++){s=n;const o=i.pendingSamples[n],C=i.pendingSamples[n+1];if(o&&(g.push(o),C&&Ui(o,C))||n===e-1)break}const I=g[0];if(!I)break;const B=i.previousSample?Ui(i.previousSample,I):!0;yield A(g,B),i.pendingSamples=i.pendingSamples.slice(s+1),i.previousSample=g[g.length-1]}i.isWorkingOnPendingSamples=!1}),wt=class{constructor(A,e){t(this,"logger");t(this,"emitter");t(this,"element");t(this,"pictureInPictureWindow");t(this,"unload",()=>{this.emitter.off("add picture in picture listener",this.onEnablePictureInPicture)});t(this,"onEnablePictureInPicture",A=>{this.element=A.element,A.element.addEventListener("leavepictureinpicture",()=>{this.pictureInPictureWindow=void 0,this.logger.debug("Leave picture in picture"),this.emitter.emit("exit picture in picture")}),A.element.addEventListener("enterpictureinpicture",e=>{this.pictureInPictureWindow=e.pictureInPictureWindow,this.logger.debug("Enter picture in picture"),this.emitter.emit("enter picture in picture",this)}),A.element.autopictureinpicture=!0});t(this,"getPictureInPictureSize",()=>this.pictureInPictureWindow);t(this,"isPictureInPictureActive",()=>this.isWebkitPresentationModeActive()||this.isStandardPictureInPictureActive());t(this,"isPictureInPictureSupported",()=>this.isWebkitPresentationModeSupported()||this.isStandardPictureInPictureSupported());t(this,"requestPictureInPicture",()=>(this.emitter.emit("ios-hack: reset size"),this.isStandardPictureInPictureSupported()?this.requestStandardPictureInPicture():this.isWebkitPresentationModeSupported()?this.requestWebkitPresentationMode("picture-in-picture"):Promise.reject(new Error("Picture in picture is not supported"))));t(this,"exitPictureInPicture",()=>this.isStandardPictureInPictureSupported()?this.exitStandardPictureInPicture():this.isWebkitPresentationModeSupported()?this.requestWebkitPresentationMode("inline"):Promise.reject(new Error("Picture in picture is not supported")));t(this,"getStatistics",()=>({isPictureInPictureActive:this.isPictureInPictureActive()}));t(this,"requestStandardPictureInPicture",()=>m(this,null,function*(){return yield this.element.requestPictureInPicture()}));t(this,"exitStandardPictureInPicture",()=>m(this,null,function*(){return yield document.exitPictureInPicture()}));t(this,"isStandardPictureInPictureSupported",()=>!!this.element&&!!this.element.requestPictureInPicture&&!!document.pictureInPictureEnabled);t(this,"isStandardPictureInPictureActive",()=>!!this.element&&!!document.pictureInPictureElement);t(this,"isWebkitPresentationModeActive",()=>!!this.element&&this.element.webkitPresentationMode==="picture-in-picture");t(this,"requestWebkitPresentationMode",A=>m(this,null,function*(){return this.element.webkitSetPresentationMode(A),Promise.resolve()}));t(this,"isWebkitPresentationModeSupported",()=>!!this.element&&!!this.element.webkitSetPresentationMode);this.emitter=A,this.logger=e,this.emitter.on("add picture in picture listener",this.onEnablePictureInPicture)}};let Se=wt;t(Se,"create",(A,e)=>new wt(A,e));const St=class{constructor(A,e,g,s){t(this,"emitter");t(this,"logger");t(this,"clockSource");t(this,"state","buffering");t(this,"bufferFullness",0);t(this,"targetBufferTime");t(this,"lastBufferStateEvent","drained");t(this,"firstFrameTime");t(this,"currentTimeIsInRange",!1);t(this,"needsInputForAudioCount",0);t(this,"needsInputForVideoCount",0);t(this,"unload",()=>{this.emitter.off("buffer state",this.onBufferedStateChanged),this.emitter.off("needs user input",this.onNeedsUserInput)});t(this,"setTargetBufferTime",A=>void(this.targetBufferTime=A));t(this,"getTargetBufferTime",()=>this.targetBufferTime);t(this,"getBufferFullness",()=>this.bufferFullness);t(this,"getLastBufferStateEvent",()=>this.lastBufferStateEvent);t(this,"getState",()=>this.state);t(this,"getFirstFrameTime",()=>this.firstFrameTime);t(this,"getStatistics",()=>({bufferTime:this.targetBufferTime,needsInputForAudioCount:this.needsInputForAudioCount,needsInputForVideoCount:this.needsInputForVideoCount}));t(this,"onBufferedStateChanged",({buffered:A,isPaused:e})=>{const g=this.clockSource.currentTime,s=A.some(a=>a.start<g&&g<a.end),I=A[A.length-1],B=I?I.end-I.start>=this.targetBufferTime:!1,n=I?Math.max(0,I.end-g)/this.targetBufferTime:0,o=e?"paused":s?"playing":"buffering",C=this.state;this.currentTimeIsInRange!==s&&!s?(this.lastBufferStateEvent="drained",this.emitter.emit("buffer state event",this.lastBufferStateEvent)):s&&B&&this.lastBufferStateEvent==="drained"&&(this.lastBufferStateEvent="filled",this.emitter.emit("buffer state event",this.lastBufferStateEvent)),o==="playing"&&!this.firstFrameTime&&(this.firstFrameTime=Date.now()),this.currentTimeIsInRange=s,this.state=o,this.bufferFullness=s?n:0,C!==o&&this.emitter.emit("playback state",o),this.emitter.emit("buffer fullness",this.bufferFullness)});t(this,"onNeedsUserInput",({forAudio:A,forVideo:e})=>{A&&this.needsInputForAudioCount++,e&&this.needsInputForVideoCount++});this.emitter=A,this.logger=e,this.clockSource=g,this.targetBufferTime=s,this.emitter.on("buffer state",this.onBufferedStateChanged),this.emitter.on("needs user input",this.onNeedsUserInput)}};let De=St;t(De,"create",(A,e,g,s)=>new St(A,e,g,s));const $e=()=>({upgradesFromLevel:[],downgradesFromLevel:[],bufferingRanges:[],activeRanges:[],decodeRate:Number.MAX_SAFE_INTEGER}),rB=()=>({levels:{},levelDowngrades:[],levelUpgrades:[],bufferFullness:0,general:$e()}),Dt=class{constructor(A,e){t(this,"minBufferFullnessLengthForRegression",6);t(this,"logger");t(this,"emitter");t(this,"timers",O.create());t(this,"metrics",rB());t(this,"bufferFullness",new Z(30));t(this,"bufferFullnessRegression");t(this,"currentLevel");t(this,"isSuspended",!1);t(this,"_fatalQosCount",0);t(this,"hasAsserted",!1);t(this,"load",()=>{this.emitter.on("playback state",this.onPlaybackState),this.emitter.on("buffer fullness",this.onBufferFullness),this.emitter.on("rendition level changed",this.onRenditionLevelChanged),this.emitter.on("video decode rate",this.onVideoDecodeRate)});t(this,"unload",()=>{this.emitter.off("playback state",this.onPlaybackState),this.emitter.off("buffer fullness",this.onBufferFullness),this.emitter.off("rendition level changed",this.onRenditionLevelChanged),this.emitter.off("video decode rate",this.onVideoDecodeRate),this.suspend()});t(this,"suspend",()=>{this.isSuspended=!0,this.timers.unload(),this.stopBuffering(),this.unsetActive()});t(this,"unsuspend",()=>{this.isSuspended=!1,this.currentLevel&&this.setActive()});t(this,"fatalQosGraceTime",()=>1e4*(this.fatalQosCount+1));t(this,"incrementFatalQosCount",()=>{this._fatalQosCount++});t(this,"getMetrics",()=>this.metrics);t(this,"getLevelStats",A=>{var g,s,I,B;const e=((s=(g=A.video)==null?void 0:g.bitRate)!=null?s:0)+((B=(I=A.audio)==null?void 0:I.bitRate)!=null?B:0);return this.metrics.levels[e]});t(this,"getBufferFullnessRegression",()=>this.bufferFullnessRegression);t(this,"activeRatios",()=>{const A=new Map,e=pA(this.metrics.general.activeRanges);if(Object.entries(this.metrics.levels).forEach(([g,s])=>{A.set(g,e?pA(s.activeRanges)/e:0)}),!this.hasAsserted){const g=A.size?Math.abs(Array.from(A.values()).reduce((s,I)=>s+I,0)-1)<=.02:!0;g||(this.hasAsserted=!0,console.assert(g,`Active ratios should be close to 1 - actual: ${Array.from(A.values()).reduce((s,I)=>s+I,0)}`))}return A});t(this,"bufferingRatios",()=>{const A=new Map,e=pA(this.metrics.general.bufferingRanges);if(Object.entries(this.metrics.levels).forEach(([g,s])=>{A.set(g,e?pA(s.bufferingRanges)/e:0)}),!this.hasAsserted){const g=Array.from(A.values()).reduce((s,I)=>s+I,0)<=1;g||(this.hasAsserted=!0,console.assert(g,`Buffering ratios should be less than 1 - actual: ${Array.from(A.values()).reduce((s,I)=>s+I,0)}`))}return A});t(this,"bufferingEventsLast",A=>this.metrics.general.bufferingRanges.filter(e=>e.start>=Date.now()-A).length);t(this,"timeSpentBufferingLast",A=>vt(this.metrics.general.bufferingRanges,A));t(this,"timeSpentActiveLast",A=>vt(this.metrics.general.activeRanges,A));t(this,"timeSpentPlayingInAtLeastLevelRatio",A=>{var o,C,a,Q;const e=this.timeSpentBuffering(),g=this.timeActive(),s=this.bufferingRatios(),I=this.activeRatios(),B=((C=(o=A.video)==null?void 0:o.bitRate)!=null?C:0)+((Q=(a=A.audio)==null?void 0:a.bitRate)!=null?Q:0),n=e/g;return Object.keys(this.metrics.levels).map(h=>parseInt(h,10)).filter(h=>h>=B).reduce((h,u)=>{var l,D;return((l=I.get(u.toString()))!=null?l:0)-((D=s.get(u.toString()))!=null?D:0)*n+h},0)});t(this,"timeSpentBuffering",()=>pA(this.metrics.general.bufferingRanges));t(this,"timeActive",()=>pA(this.metrics.general.activeRanges));t(this,"getStatistics",()=>({timeSpentBuffering:this.timeSpentBuffering(),bufferingEventsCount:this.metrics.general.bufferingRanges.length,timeSpentRatio:Object.fromEntries(this.activeRatios()),fatalQosCount:this.fatalQosCount}));t(this,"onRenditionLevelChanged",A=>{var I,B,n,o,C,a,Q,h,u,l,D,S,Y,T;const e=((n=(B=(I=A.from)==null?void 0:I.video)==null?void 0:B.bitRate)!=null?n:0)+((a=(C=(o=A.from)==null?void 0:o.audio)==null?void 0:C.bitRate)!=null?a:0),g=((u=(h=(Q=A.to)==null?void 0:Q.video)==null?void 0:h.bitRate)!=null?u:0)+((S=(D=(l=A.to)==null?void 0:l.audio)==null?void 0:D.bitRate)!=null?S:0);this.logger.info("rendition level changed",{fromLevel:e,toLevel:g}),this.metrics.general.activeRanges.length===0&&this.setActive(),A.from&&A.to&&(e<g?this.metrics.general.upgradesFromLevel.push(Date.now()):this.metrics.general.downgradesFromLevel.push(Date.now()));let s=!1;if(A.from){const k=(Y=this.metrics.levels[e])!=null?Y:$e();e<g?k.upgradesFromLevel.push(Date.now()):k.downgradesFromLevel.push(Date.now()),hA(k.activeRanges);const W=k.bufferingRanges[k.bufferingRanges.length-1];s=!!W&&!W.end,hA(k.bufferingRanges),this.metrics.levels[e]=k}if(A.to){const k=(T=this.metrics.levels[g])!=null?T:$e();fA(k.activeRanges),s&&fA(k.bufferingRanges),this.metrics.levels[g]=k,this.currentLevel=g}});t(this,"onBufferFullness",A=>{this.bufferFullness.push(A),this.metrics.bufferFullness=A,this.bufferFullness.items().length>=this.minBufferFullnessLengthForRegression&&(this.bufferFullnessRegression=this.calculateLinearRegression())});t(this,"onPlaybackState",A=>{switch(this.logger.info("Playback state",{state:A,currentLevel:this.currentLevel}),A){case"playing":this.stopBuffering();break;case"buffering":this.isSuspended||this.startBuffering();break}});t(this,"onVideoDecodeRate",A=>{var g;if(this.metrics.general.decodeRate=A,!this.currentLevel)return;const e=this.metrics.levels[(g=this.currentLevel)!=null?g:0];e&&(e.decodeRate=A)});t(this,"calculateLinearRegression",()=>NA(this.bufferFullness.items().map((A,e)=>({x:e,y:A}))));t(this,"stopBuffering",()=>{if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&hA(A.bufferingRanges)}hA(this.metrics.general.bufferingRanges)});t(this,"startBuffering",()=>{if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&fA(A.bufferingRanges)}fA(this.metrics.general.bufferingRanges)});t(this,"unsetActive",()=>{if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&hA(A.activeRanges)}hA(this.metrics.general.activeRanges)});this.logger=e,this.emitter=A}get fatalQosCount(){return this._fatalQosCount}setActive(){if(this.currentLevel){const A=this.metrics.levels[this.currentLevel];A&&fA(A.activeRanges)}fA(this.metrics.general.activeRanges)}};let fe=Dt;t(fe,"create",(A,e)=>new Dt(A,e));const ft=class{constructor(A,e){t(this,"renditions",new Map);t(this,"renditionLevels",[]);t(this,"languages",[]);t(this,"emitter");t(this,"subscriptionSource");t(this,"renditionLevelChangeCount",0);t(this,"unload",()=>{this.emitter.off("renditions",this.onRenditions),this.emitter.off("subscription changed",this.onSubscriptionChanged)});t(this,"getRenditionLevels",A=>A?this.createRenditionLevels(A):this.renditionLevels);t(this,"getRenditionLevel",A=>{var n;const e=A!=null?A:this.getCurrentSubscription(),g=A?this.createRenditionLevels(A):this.renditionLevels;if(!e.video)return g.length?g[0]:void 0;const s=e.video.bitRate||Number.MAX_SAFE_INTEGER,I=e.video.width||Number.MAX_SAFE_INTEGER,B=e.video.height||Number.MAX_SAFE_INTEGER;return(n=g.filter(o=>o.video&&e.video?o.video.bitRate<=s&&o.video.width<=I&&o.video.height<=B:!0).pop())!=null?n:g[0]});t(this,"setRenditions",(A,e)=>{this.renditions.set(A,e)});t(this,"getLanguages",()=>this.languages);t(this,"getVideoRendition",(A,e=this.getCurrentSubscription().channelId)=>{const g=this.getRendition(A,e);if(g&&HA(g))return g});t(this,"getAudioRenditions",A=>{const e=this.renditions.get(A);return e==null?void 0:e.filter(s=>MA(s))});t(this,"getAudioRendition",(A,e=this.getCurrentSubscription().channelId)=>{const g=this.getRendition(A,e);if(g&&MA(g))return g});t(this,"getRendition",(A,e=this.getCurrentSubscription().channelId)=>{var g;return(g=this.renditions.get(e))==null?void 0:g.find(s=>s.id===A)});t(this,"getStatistics",()=>{var e,g,s,I,B,n,o,C,a,Q;const A=this.getRenditionLevel();return{videoCodec:(e=A==null?void 0:A.video)==null?void 0:e.codec,audioCodec:(g=A==null?void 0:A.audio)==null?void 0:g.codec,videoRenditionId:(s=A==null?void 0:A.video)==null?void 0:s.id,audioRenditionId:(I=A==null?void 0:A.audio)==null?void 0:I.id,videoWidth:(B=A==null?void 0:A.video)==null?void 0:B.width,videoHeight:(n=A==null?void 0:A.video)==null?void 0:n.height,expectedVideoBitRate:(o=A==null?void 0:A.video)==null?void 0:o.bitRate,expectedAudioBitRate:(C=A==null?void 0:A.audio)==null?void 0:C.bitRate,frameRate:(a=A==null?void 0:A.video)==null?void 0:a.frameRate,language:(Q=A==null?void 0:A.audio)==null?void 0:Q.language,renditionLevelChangeCount:this.renditionLevelChangeCount}});t(this,"onRenditions",A=>{const e=this.subscriptionSource.getCurrentSubscription();this.renditions.set(A.channelId,A.renditions),this.updateRenditionLevels({to:e,from:e})});t(this,"onSubscriptionChanged",A=>{this.updateRenditionLevels(A)});t(this,"updateRenditionLevels",({to:A,from:e})=>{var C;const{channelId:g,initiator:s}=A,I=this.getRenditionLevel(e),B=new Set;((C=this.renditions.get(g))!=null?C:[]).forEach(a=>a.language?B.add(a.language):void 0),this.languages=Array.from(B),this.renditionLevels=this.createRenditionLevels(A);const o=this.getRenditionLevel(A);rA(I,o)||(this.renditionLevelChangeCount++,this.emitter.emit("rendition level changed",{to:o,from:I,reason:s?"manual":"abr"}))});t(this,"createRenditionLevels",A=>{var a;const{video:e,audio:g,channelId:s}=A,I=(a=this.renditions.get(s))!=null?a:[],B=I.filter(HA).filter(Q=>e&&Q.codec===e.codec),n=I.filter(MA).filter(Q=>g&&Q.codec===g.codec&&Q.language===g.language),o=Math.max(B.length,n.length),C=[];for(let Q=0;Q<o;Q++){const h=B[Math.min(B.length-1,Q)],u=n[Math.min(n.length-1,Q)];C.push({audio:u,video:h})}return C});t(this,"getCurrentSubscription",()=>this.subscriptionSource.getCurrentSubscription());this.subscriptionSource=e,this.emitter=A,this.emitter.on("renditions",this.onRenditions),this.emitter.on("subscription changed",this.onSubscriptionChanged)}};let pe=ft;t(pe,"create",(A,e)=>new ft(A,e));const bi=i=>JSON.parse(JSON.stringify(i)),pt=class{constructor(A,e,g){t(this,"logger");t(this,"timers",new O);t(this,"emitter");t(this,"targetSubscription");t(this,"currentSubscription");t(this,"_isSwitchingSubscription",!1);t(this,"pendingSubscriptionTimeoutId");t(this,"burstMs",0);t(this,"unload",()=>{this.logger.debug("Unloading module..."),this.timers.unload(),this.emitter.off("subscription changed",this.onSubscriptionChanged),this.logger.debug("Unloaded module")});t(this,"isSwitchingSubscription",()=>this._isSwitchingSubscription);t(this,"getTargetSubscription",()=>this.targetSubscription);t(this,"getCurrentSubscription",()=>this.currentSubscription);t(this,"enableBurst",A=>{this.burstMs=A});t(this,"setSize",A=>{this.targetSubscription.video.width=A.width,this.targetSubscription.video.height=A.height,this.scheduleSubscriptionChange()});t(this,"setVideoConstraint",A=>{this.targetSubscription.video=A,this.scheduleSubscriptionChange()});t(this,"setAudioConstraint",A=>{this.targetSubscription.audio=A,this.scheduleSubscriptionChange()});t(this,"setVideoBitRate",A=>{this.targetSubscription.video.bitRate=A,this.scheduleSubscriptionChange()});t(this,"setAudioBitRate",A=>{this.targetSubscription.audio.bitRate=A,this.scheduleSubscriptionChange()});t(this,"setChannelId",A=>{this.targetSubscription.channelId=A,this.scheduleSubscriptionChange()});t(this,"setLanguage",A=>{this.targetSubscription.audio.language=A,this.scheduleSubscriptionChange()});t(this,"setVideoCodec",A=>{this.targetSubscription.video.codec=A,this.scheduleSubscriptionChange()});t(this,"setAudioCodec",A=>{this.targetSubscription.audio.codec=A,this.scheduleSubscriptionChange()});t(this,"setBurst",A=>{A?this.targetSubscription.burstMs=A:delete this.targetSubscription.burstMs});t(this,"isNewSubscription",()=>{const A=["burstMs","meta","initiator","channelGroupId"];return!rA(Lt(this.currentSubscription,A),Lt(this.targetSubscription,A))});t(this,"onSubscriptionChanged",({to:A})=>{this.logger.debug("onSubscriptionChanged",{to:A}),this.currentSubscription=r({},A),this._isSwitchingSubscription=this.isNewSubscription()});t(this,"scheduleSubscriptionChange",()=>{this.targetSubscription=bi(this.targetSubscription),this._isSwitchingSubscription=this.isNewSubscription();const A=this.currentSubscription.channelId!==this.targetSubscription.channelId;this._isSwitchingSubscription&&(A&&this.burstMs?this.setBurst(this.burstMs):this.setBurst(0),this.pendingSubscriptionTimeoutId&&(this.timers.clearTimeout(this.pendingSubscriptionTimeoutId),this.pendingSubscriptionTimeoutId=void 0),this.pendingSubscriptionTimeoutId=this.timers.setTimeout(()=>this.emitter.emit("send signal",JSON.stringify({type:"subscribe",subscription:this.getTargetSubscription()})),0))});this.logger=A,this.targetSubscription=e,this.currentSubscription=bi(e),this.emitter=g,this.emitter.on("subscription changed",this.onSubscriptionChanged)}};let Fe=pt;t(Fe,"create",(A,e,g)=>new pt(A,g,e));const hB=5e3,cB=()=>ci()||Ce()||WI(),Ji=()=>cB()?100:0,Li=i=>A=>A>i,Ft=class{constructor(A,e,g,s,I){t(this,"emitter");t(this,"logger");t(this,"playbackSource");t(this,"bufferSource");t(this,"lastSeekTime",Date.now());t(this,"seekCooldownTime",1e3);t(this,"seekTimeoutTime",5e3);t(this,"syncMaxBehind");t(this,"syncMaxBehindMultiplierStep",1);t(this,"syncMaxBehindIncreaseEvery",2);t(this,"syncMaxBehindMaximumAllowed",2e3);t(this,"syncMaxBehindMultiplier",1);t(this,"timeshiftOnAudio",!1);t(this,"syncMaxAhead",150);t(this,"timeshiftSync",{enabled:!1,maxBehind:50,multiplier:1,maxBehindAllowed:600,overshoot:Ji(),minOvershootAllowed:Ji(),maxOvershootAllowed:500});t(this,"maxTimeSyncDifferenceTolerance",150);t(this,"timers",O.create());t(this,"rtt",0);t(this,"channelSyncInfo",new Map);t(this,"driftAdjustmentsCount",0);t(this,"timeshiftDriftAdjustmentCount",0);t(this,"driftAdjustments",[]);t(this,"timeShiftAdjustments",[]);t(this,"timestampOffset");t(this,"currentChannelId");t(this,"highestSeenTimestamps",new Map);t(this,"isSuspended",!1);t(this,"isSyncAdjustmentActivated",!1);t(this,"load",()=>{this.timers.setInterval(this.onSync,100)});t(this,"unload",()=>{this.logger.debug("Unloading module..."),this.emitter.off("rtt",this.updateRtt),this.timers.unload(),this.logger.debug("Unloaded module")});t(this,"suspend",()=>{this.isSuspended=!0});t(this,"unsuspend",()=>{this.resetSyncState(),this.isSuspended=!1});t(this,"deactivateSyncAdjustments",()=>{this.isSyncAdjustmentActivated=!1});t(this,"activateSyncAdjustments",()=>{this.tryApplySyncInfo(0),this.lastSeekTime=Date.now(),this.isSyncAdjustmentActivated=!0});t(this,"reset",()=>{this.logger.info("Reset sync state"),this.currentChannelId=void 0,this.timestampOffset=void 0,this.resetSyncState(),this.highestSeenTimestamps.clear()});t(this,"getTimeshiftOffset",()=>{var A;return(A=this.timestampOffset)!=null?A:0});t(this,"getCurrentChannelId",()=>this.currentChannelId);t(this,"resetSyncState",()=>{this.timeshiftSync.multiplier=1,this.syncMaxBehindMultiplier=1,this.driftAdjustments=[],this.timeShiftAdjustments=[]});t(this,"getLiveEdgeTime",A=>{const e=this.channelSyncInfo.get(A);if(!e)return;const g=Date.now()-e.localTimestamp;return e.timestamp+g});t(this,"getLiveEdgeTimeLatencyAdjusted",A=>{const e=this.getLiveEdgeTime(A);if(e)return e+this.rtt/2});t(this,"getWallclockTime",A=>{const e=this.channelSyncInfo.get(A);if(!e)return;const g=Date.now()-e.localTimestamp;return e.wallclockTime+g});t(this,"getWallclockTimeLatencyAdjusted",A=>{const e=this.getWallclockTime(A);if(e)return e+this.rtt/2});t(this,"processSample",A=>{var g;if(!A.channelId)throw new Error("Sample must be assigned to a channel");if(this.currentChannelId||(this.currentChannelId=A.channelId),this.timestampOffset||(this.timestampOffset=A.timestamp/A.timescale*1e3-hB),this.currentChannelId!==A.channelId){let s=Number.MAX_SAFE_INTEGER;console.assert(this.highestSeenTimestamps.size!==0,"no known timestamps"),this.highestSeenTimestamps.forEach(B=>{s=Math.min(s,B)});const I=A.timestamp/A.timescale*1e3;this.currentChannelId=A.channelId,this.timestampOffset=I-s}else(A.type==="video"&&A.isSync||this.timeshiftOnAudio)&&this.tryTimeshiftSync();const e=this.timestampOffset*A.timescale/1e3;return A.timestamp-=e,this.highestSeenTimestamps.set(A.type,Math.max((g=this.highestSeenTimestamps.get(A.type))!=null?g:0,A.timestamp/A.timescale*1e3)),A});t(this,"getStatistics",()=>({drift:this.drift,driftAdjustmentCount:this.driftAdjustmentsCount,timeshiftDriftAdjustmentCount:this.timeshiftDriftAdjustmentCount,seekTime:this.playbackSource.seekTime}));t(this,"updateRtt",A=>void(this.rtt=A));t(this,"isPlaybackSourceReadyToSeek",()=>!this.isSeeking()&&this.isSeekCooldownExpired()&&this.isSyncAdjustmentActivated);t(this,"isSeeking",()=>this.playbackSource.isSeeking?this.isSeekTimeoutExpired():!1);t(this,"isAllowedToSync",()=>this.isPlaybackSourceReadyToSeek()&&!!this.currentChannelId&&!this.isSuspended&&!this.playbackSource.isPaused);t(this,"isSeekCooldownExpired",()=>Date.now()-this.lastSeekTime>this.seekCooldownTime);t(this,"isSeekTimeoutExpired",()=>Date.now()-this.lastSeekTime>this.seekTimeoutTime);t(this,"currentTimeshiftMaxBehind",()=>Math.min(this.timeshiftSync.maxBehind*this.timeshiftSync.multiplier,this.timeshiftSync.maxBehindAllowed));t(this,"currentSyncMaxBehind",()=>Math.min(this.syncMaxBehindMultiplier*this.syncMaxBehind,this.syncMaxBehindMaximumAllowed));t(this,"currentSyncMaxAhead",()=>this.playbackSource.seekTime>500?Math.max(this.syncMaxAhead*this.syncMaxBehindMultiplier,300):this.syncMaxAhead);t(this,"tryTimeshiftSync",()=>{var I;if(!this.isAllowedToSync())return;const A=(I=this.drift)!=null?I:0;if(A>=this.syncMaxBehind)return;if(A<this.currentTimeshiftMaxBehind()){this.timeshiftSync.overshoot=0;return}if(!this.timestampOffset)return;const e=Date.now()-this.seekTimeoutTime*this.timeshiftSync.multiplier,g=this.timeShiftAdjustments.filter(Li(e)).length;if(g&&this.timeshiftSync.multiplier>2)return this.logger.debug("Too many diff timeShifts within sliding window",{timeShiftsCooldownMs:e,timeShiftsWithinCooldownTime:g}),!1;const s=A+this.timeshiftSync.overshoot;this.logger.info("Adjusting for drift using timeshift",{drift:A,syncAmount:s,currentTime:this.playbackSource.currentTime,rtt:this.rtt,overshoot:this.timeshiftSync.overshoot}),this.timestampOffset+=s,this.lastSeekTime=Date.now(),!this.playbackSource.isPaused&&(this.timeShiftAdjustments.push(this.lastSeekTime),this.timeshiftDriftAdjustmentCount++,this.timeshiftSync.multiplier++,this.timeshiftSync.overshoot=Math.max(this.timeshiftSync.minOvershootAllowed,Math.min(this.timeshiftSync.multiplier*A/2,this.timeshiftSync.maxOvershootAllowed)))});t(this,"onSync",()=>{var B;if(!this.isAllowedToSync())return;const A=(B=this.drift)!=null?B:0;if(A<0&&-A<this.currentSyncMaxAhead()||A>0&&A<this.currentSyncMaxBehind()||Math.abs(A)<1||!this.isSeekCooldownExpired())return;const e=Date.now()-this.seekTimeoutTime*this.syncMaxBehindMultiplier,g=this.driftAdjustments.filter(Li(e)).length;if(g&&this.syncMaxBehindMultiplier>2)return this.logger.debug("Too many diff adjustments within sliding window",{adjustmentsCooldownMs:e,adjustmentsWithinCooldownTime:g}),!1;const s=this.playbackSource.seekTime,I=this.playbackSource.currentTime+A+s;if(this.logger.info("Adjusting for drift using seek",{drift:A,currentTime:this.playbackSource.currentTime,newCurrentTime:I,seekTime:s,rtt:this.rtt}),this.lastSeekTime=Date.now(),this.driftAdjustments.push(this.lastSeekTime),this.driftAdjustmentsCount++,this.playbackSource.currentTime=I,this.timeshiftSync.overshoot=Math.max(this.timeshiftSync.minOvershootAllowed,this.timeshiftSync.overshoot/2),this.driftAdjustmentsCount%this.syncMaxBehindIncreaseEvery===0&&!this.playbackSource.isPaused){const n=this.currentSyncMaxBehind;this.syncMaxBehindMultiplier+=this.syncMaxBehindMultiplierStep,n!==this.currentSyncMaxBehind&&this.logger.info("Increasing max drift behind allowed",{from:n,to:this.currentSyncMaxBehind})}});this.logger=e,this.emitter=A,this.playbackSource=g,this.bufferSource=s,this.timeshiftSync.enabled=I,this.syncMaxBehind=this.timeshiftSync.enabled?1e3:100,this.emitter.on("rtt",this.updateRtt)}updateChannelSyncInfo(A,e){const g=Date.now(),s=this.channelSyncInfo.get(A),I=this.getLiveEdgeTime(A);if(this.isSuspended)return;if(!s||!I){this.logger.info("Initial timing info",{syncInfo:e}),this.channelSyncInfo.set(A,L(r({},e),{localTimestamp:g,timeDifferences:new Z(12)}));return}const B=e.wallclockTime-s.wallclockTime,n=e.timestamp-s.timestamp,o=g-s.localTimestamp,C=n-o;if(s.timeDifferences.push(C),this.logger.debug("Timing info",{rtt:this.rtt,channelId:A,syncInfo:e,localTimestamp:g,diffFromEstimated:C,timestampDelta:n,wallclockDelta:B,localWallclockDelta:o}),Math.abs(C)>=this.bufferSource.getTargetBufferTime()*2){this.logger.info("Resetting sync info",{diffFromEstimated:C}),this.channelSyncInfo.set(A,L(r({},e),{localTimestamp:g,timeDifferences:new Z(s.timeDifferences.maxSize+1)})),this.currentChannelId&&this.currentChannelId===A&&(this.reset(),this.emitter.emit("channel reset"));return}s.timeDifferences.isFull()&&this.tryApplySyncInfo(this.maxTimeSyncDifferenceTolerance)}tryApplySyncInfo(A){const e=this.getCurrentChannelId();if(!e)return;const g=this.channelSyncInfo.get(e);if(!g)return;const s=sA(g.timeDifferences.items());Math.abs(s)>A&&(this.logger.info("Adjusting sync info",{averageDifference:s}),g.timestamp+=s,g.timeDifferences.clear())}get serverCurrentTime(){return this.channelCurrentTime-this.getTimeshiftOffset()}get channelCurrentTime(){const A=this.getCurrentChannelId();if(!A)return 0;const e=this.getLiveEdgeTime(A);return e?e-this.bufferSource.getTargetBufferTime():0}get drift(){return this.serverCurrentTime-this.playbackSource.currentTime}};let ye=Ft;t(ye,"create",(A,e,g,s,I)=>new Ft(A,e,g,s,I));const dB={enabled:!0,interval:3e4,includeErrors:!0,includeEvents:!0,includeStats:!0,maxRetries:10,maxErrorReports:50,maxEvents:50},At=(i,A)=>L(r({},A),{type:i,timestamp:new Date().toISOString(),discriminator:"web"}),yt=class{constructor(A,e,g,s){t(this,"logger");t(this,"timers",new O);t(this,"emitter");t(this,"options");t(this,"parentContext");t(this,"unsentLines",new Z(100));t(this,"retries",0);t(this,"errorCount",0);t(this,"eventCount",0);t(this,"statsCount",0);t(this,"unload",()=>{this.logger.debug("Unloading module..."),window.removeEventListener("error",this.onError),window.removeEventListener("unhandledrejection",this.onRejection),this.timers.unload(),this.emitter.off("error",this.addError),this.emitter.off("visibilitystate",this.onVisibilityChange),this.emitter.off("pagehide",this.onPageHide),this.addStats({isFinal:!0,initiator:"unload"}),this.send("beacon"),this.logger.debug("Unloaded module")});t(this,"load",()=>{window.addEventListener("error",this.onError),window.addEventListener("unhandledrejection",this.onRejection),this.emitter.on("error",this.addError),this.emitter.on("visibilitystate",this.onVisibilityChange),this.emitter.on("pagehide",this.onPageHide),this.timers.setInterval(()=>{this.addStats(),this.send("fetch")},this.options.interval)});t(this,"addStats",({isFinal:A,initiator:e}={isFinal:!1,initiator:"interval"},g={})=>{if(!this.options.includeStats)return;const s=this.parentContext.getStatistics(),I=At("stats",L(r(r({},g),s),{isFinal:A,initiator:e,count:this.statsCount++}));this.unsentLines.push(I)});t(this,"addEvent",A=>{if(!this.options.includeEvents||this.eventCount>this.options.maxEvents)return;const e=this.parentContext.getStatistics(),g=At("event",r(r({},e),A));this.eventCount++,this.unsentLines.push(g)});t(this,"getStatistics",()=>({errorCount:this.errorCount}));t(this,"send",A=>m(this,null,function*(){if(this.options.enabled&&!(this.retries>=this.options.maxRetries)&&!this.unsentLines.isEmpty()){this.logger.debug("Sending telemetry",{lines:this.unsentLines.items()});try{const e=this.unsentLines.items().map(g=>JSON.stringify(g)).reverse().join(`
27
+ `);switch(A){case"beacon":navigator.sendBeacon(this.options.url,e);break;case"fetch":default:this.parentContext.connectionState==="connected"?this.emitter.emit("send signal",JSON.stringify({type:"telemetry",body:e})):yield xg(new URL(this.options.url),{body:e,headers:{"Content-Type":"text/plain"}});break}this.retries=0,this.unsentLines.clear()}catch(e){this.retries++}}}));t(this,"onVisibilityChange",A=>{A==="hidden"&&(this.addStats({isFinal:!0,initiator:"visibilitychange"}),this.send("beacon"))});t(this,"onPageHide",A=>{this.addStats({isFinal:!0,initiator:"pagehide"},{persisted:A.persisted}),this.send("beacon")});t(this,"onRejection",A=>this.addError(A.reason));t(this,"onError",A=>this.addError(A.error));t(this,"addError",A=>{const{includeErrors:e,maxErrorReports:g}=this.options;if(e&&A instanceof f){if(this.errorCount++,this.errorCount>g)return;const s=this.parentContext.getStatistics();this.unsentLines.push(At("error",r(r({},s),A.toStringifiable())))}});this.logger=A,this.emitter=e,this.options=r(r({},dB),g),this.parentContext=s}};let VA=yt;t(VA,"create",(A,e,g,s)=>new yt(A,e,g,s));const Rt=class{constructor(A,e,g){t(this,"logger");t(this,"element");t(this,"documentState");t(this,"timers",new O);t(this,"unload",()=>{this.timers.unload()});t(this,"unpause",()=>{this.element.userHasProvidedInput&&this.element.isPaused&&this.documentState.isVisible&&this.documentState.isOnline&&(this.logger.debug("Unpause video"),this.element.play().catch(eA))});this.logger=A,this.element=e,this.documentState=g,this.timers.setInterval(this.unpause,100)}};let ZA=Rt;t(ZA,"create",(A,e,g)=>new Rt(A,e,g));const lB=["minBufferTime","maxBufferTime","burstEnabled"];function uB(i){return lB.includes(i)}class mB{constructor(A){t(this,"options");t(this,"overrides",new Map);this.options=A}getOptions(){return this.options}addOverrides(A,e){this.overrides.set(A,e)}set(A,e){this.options[A]=e}get(A,e){var g;if(e&&uB(A)){const s=(g=this.overrides.get(e))==null?void 0:g[A];if(typeof s!="undefined")return s}return this.options[A]}getOverride(A,e){var g;return(g=this.overrides.get(e))==null?void 0:g[A]}}const wB=i=>{let A=i,e=0,g=0;return I=>{var l,D,S;const B=A;A=I,B.flags&&ne(B.flags)&&(e=(l=B.compositionTimeOffset)!=null?l:0),B.timestamp+=e,B.compositionTimeOffset=((D=B.compositionTimeOffset)!=null?D:0)-e;const n=B.timestamp/B.timescale,C=I.flags&&ne(I.flags)?(S=I.compositionTimeOffset)!=null?S:0:e,Q=(I.timestamp+C)/I.timescale,h=Math.max(0,Math.round((Q-n)*B.timescale));return h>0&&(g=h),L(r({},B),{duration:h>0?h:g})}},SB=(i,A)=>{if(!i)return;const e=new URL("/subscribe",i);return e.searchParams.append("channelId",A.channelId),e.searchParams.append("sessionId",A.sessionId),e.searchParams.append("clientId",A.clientId),A.audio&&A.audio.codec&&(e.searchParams.append("audio.bitRate",Math.round(A.audio.bitRate).toString()),e.searchParams.append("audio.codec",A.audio.codec),A.audio.language&&e.searchParams.append("audio.language",A.audio.language)),A.video&&A.video.codec&&(e.searchParams.append("video.width",A.video.width.toString()),e.searchParams.append("video.height",A.video.height.toString()),e.searchParams.append("video.bitRate",Math.round(A.video.bitRate).toString()),e.searchParams.append("video.codec",A.video.codec)),A.expectAdditionalConnection&&e.searchParams.append("expectAdditionalConnection",A.expectAdditionalConnection.toString()),A.burstMs&&e.searchParams.append("burstMs",A.burstMs.toString()),A.channelGroupId&&e.searchParams.append("channelGroupId",A.channelGroupId),A.authToken&&(e.searchParams.append("auth.token",A.authToken),e.searchParams.append("auth.type","jwt")),e.toString()},DB=(i,A,e)=>HA(A)?r(L(r({},i),{type:"video",codec:A.codec,isSync:ne(i.flags),data:i.payload,duration:0,width:A.width,height:A.height}),e):L(r({},i),{type:"audio",channels:A.channels,sampleRate:A.sampleRate,codec:A.codec,language:A.language,isSync:ne(i.flags),data:i.payload,duration:0}),fB=()=>{var g;const i=window.location.origin,e=!i||i=="null"?"":`${window.location.pathname}${window.location.search}`.substring(0,1e3);return{userAgent:window.navigator.userAgent,locationOrigin:window.location.origin,locationPath:e,ancestorOrigins:((g=window.location.ancestorOrigins)==null?void 0:g.length)>0?Array.from(window.location.ancestorOrigins):void 0}},pB=i=>{if(typeof i!="object"||i===null)throw new Error("not an object");if(!("video"in i))throw new Error("missing video in subscription");if(!("audio"in i))throw new Error("missing audio in subscription");if(!("channelId"in i))throw new Error("missing channelId");return!0},QA=class extends AA{constructor(e){super();t(this,"pictureInPicture");t(this,"browser",di());t(this,"options");t(this,"element");t(this,"playbackSource");t(this,"emitter",new AA);t(this,"logger");t(this,"modules");t(this,"clientIp");t(this,"sessionId");t(this,"clientId",Nt());t(this,"_channels",[]);t(this,"createdAt",Date.now());t(this,"hasCalledConnect",!1);t(this,"apiClient");t(this,"latestEmittedLanguages",[]);t(this,"wakeLock");t(this,"cachedEdges",[]);t(this,"shiftedEdges",[]);t(this,"pool",new H(QA.MAX_POOL_SIZE));t(this,"sampleProcessingSesssions",new Map);t(this,"sizes",new Map);t(this,"isSuspended",!0);t(this,"disconnectTimeout");t(this,"attach",e=>{var g;(g=this.wakeLock)==null||g.attach(e),e.appendChild(this.element)});t(this,"getOptions",()=>this.options.getOptions());t(this,"getThumbnailUrl",()=>{let e=this.options.get("edgeUrl")||this.options.get("url");e=e.replace("wss://","https://"),e=e.replace("ws://","http://"),e=e.endsWith("/")?e.slice(0,-1):e;const g=this.options.get("authenticationToken"),s=g?`&auth.token=${g}`:"";return`${e}/api/thumbnail?channelId=${this.options.get("channelId")}${s}`});t(this,"updateAuthenticationToken",e=>{this.logger.debug("Got new auth token",{token:e}),this.options.set("authenticationToken",e),this.emitter.emit("send signal",JSON.stringify({type:"refresh auth",token:e}))});t(this,"connect",()=>{this.hasCalledConnect||(this.play(),this._connect())});t(this,"_connect",()=>{var e,g;this.hasCalledConnect||(this.hasCalledConnect=!0,Object.values(this.modules).forEach(s=>{s&&"load"in s&&s.load()}),this.unsuspend(),this.playbackSource instanceof Oe&&((g=(e=this.playbackSource).load)==null||g.call(e)),this.modules.connection.connect(this.options.get("media")==="audio+video"?2:1))});t(this,"getCastOptions",()=>({url:this.options.get("url"),channelId:this.options.get("channelId"),channelGroupId:this.options.get("channelGroupId"),authenticationToken:this.options.get("authenticationToken"),language:this.options.get("language"),logLevel:this.options.get("logLevel"),minBufferTime:this.options.get("minBufferTime"),tags:this.options.get("tags"),ownerSessionId:this.sessionId,edgeUrl:this.options.get("edgeUrl"),media:this.options.get("media")}));t(this,"connectionInfo",()=>m(this,null,function*(){try{return yield this.apiClient.connect(this.options.getOptions())}catch(e){if(Yg(e))switch(e.status){case 401:throw this.emitter.emit("error",ge(e)),ge(e);case 403:throw this.emitter.emit("error",ei(e.message)),ei(e.message)}throw this.emitter.emit("error",ns(e instanceof Error?e:void 0)),e}}));t(this,"estimateRTT",()=>m(this,null,function*(){const e=Date.now(),g=()=>Date.now()-e;return Promise.race([Ht(QA.PING_TIMEOUT),fetch(new URL("/api/v2/connect/ping",this.options.get("url")).toString(),{method:"HEAD"})]).then(g,g)}));t(this,"connectHandler",()=>m(this,null,function*(){var D;this.sessionId=Nt();const e=this.modules.subscription.getTargetSubscription(),[g,s]=yield Promise.all([this.connectionInfo(),this.estimateRTT()]),I=s/2,B=je(I),n=g.channels.find(S=>S.channelId===e.channelId);if(this.emitter.emit("connect info",g),this._channels=g.channels,g.channels.forEach(S=>{S.overrides&&this.options.addOverrides(S.channelId,S.overrides),S.renditions=this.filterRenditions(S.renditions),this.modules.renditions.setRenditions(S.channelId,S.renditions)}),!n)throw Ai("external");const o=this.options.getOverride("minBufferTime",this.channelId),C=this.options.getOverride("maxBufferTime",this.channelId);if((o||C)&&(this.modules.bufferTime.updateConfig({minBufferTime:o,maxBufferTime:C}),this.targetBufferTime=this.options.get("minBufferTime",this.channelId)),this.options.get("burstEnabled",this.channelId)&&this.modules.subscription.enableBurst(this.targetBufferTime),this.emit("is live",n.isLive),!n.isLive)throw new Error("Waiting for channel to go live");this.patchSubscription(n,B),yield this.initializeDecodingModule(),this.resetModules(),this.emit("rendition levels",this.modules.renditions.getRenditionLevels()),this.emit("channels",this.channels),this.emitLanguagesIfChanged(),this.sampleProcessingSesssions.clear(),this.cachedEdges=this.cachedEdges.length===0?g.edges:this.cachedEdges;const Q=(this.options.get("edgeUrl")?[this.options.get("edgeUrl")]:[this.cachedEdges.shift()])[0],h=this.options.get("burstEnabled",this.channelId),u=SB(Q,{video:this.targetSubscription.video,audio:this.targetSubscription.audio,burstMs:h?this.targetBufferTime:void 0,sessionId:this.sessionId,clientId:this.clientId,channelId:this.channelId,channelGroupId:this.options.get("channelGroupId"),expectAdditionalConnection:this.options.get("media")==="audio+video",authToken:this.options.get("authenticationToken")});if(!u||!Q)throw new f("Failed to resolve edge url",{isFatal:!0,code:"failed_to_resolve_edge_url"});const l=this.shiftedEdges[this.shiftedEdges.length-1];return l&&((D=this.modules.telemetry)==null||D.addEvent({code:"shifted_edge",edgeUrl:l})),this.shiftedEdges.push(Q),this.logger.debug("resolved edge url",{edgeUrl:u}),Promise.resolve(u)}));t(this,"emitLanguagesIfChanged",()=>{const e=this.modules.renditions.getLanguages(),g=this.latestEmittedLanguages;e.length==g.length&&e.every(I=>g.includes(I))||(this.logger.debug("Emitting new languages",{currentLanguages:e}),this.latestEmittedLanguages=e,this.emit("languages",this.latestEmittedLanguages))});t(this,"filterRenditions",e=>e.filter(g=>{var I,B,n;if(MA(g))return!0;if(!this.isSupportedVideoCodecProfile(g.codec,g.codecString))return!1;if(!this.willUseMediaSource()){const o=(I=this.options.get("advanced").wasmDecodingConstraint.bitRate)!=null?I:Number.MAX_SAFE_INTEGER,C=(B=this.options.get("advanced").wasmDecodingConstraint.width)!=null?B:Number.MAX_SAFE_INTEGER,a=(n=this.options.get("advanced").wasmDecodingConstraint.height)!=null?n:Number.MAX_SAFE_INTEGER;return g.bitRate<=o&&g.width<=C&&g.height<=a}const s=this.options.getOverride("maxVideoBitRate",this.channelId);return s?s>=g.bitRate:!0}));t(this,"patchSubscription",(e,g)=>{const s=Math.min(this.options.get("maxVideoBitRate"),QA.INITIAL_MAX_BIT_RATE,g,this.targetSubscription.video.bitRate),I=Math.min(this.options.get("maxAudioBitRate"),QA.INITIAL_MAX_BIT_RATE,g,this.targetSubscription.audio.bitRate),B=this.options.get("media")==="audio"?[]:["av1","h264"],n=this.supportedAudioCodecs(),o=e.renditions.filter(MA),C=e.renditions.filter(HA),a=n.find(l=>o.find(D=>D.codec===l)!==void 0),Q=B.find(l=>C.find(D=>D.codec===l)!==void 0),h=o.map(l=>l.language);if(this.logger.debug("supported and selected codecs",{audioCodecs:n,videoCodecs:B,audioCodec:a,videoCodec:Q}),Q){const l=this.options.get("maxSize");this.modules.subscription.setVideoConstraint(r({codec:Q,bitRate:this.abrEnabled?s:this.options.get("maxVideoBitRate")},l))}a&&(this.modules.subscription.setAudioConstraint({codec:a,bitRate:this.abrEnabled?I:this.options.get("maxAudioBitRate"),language:this.options.get("language")}),(!h.includes(this.options.get("language"))||this.language===void 0)&&this.modules.subscription.setLanguage(h[0])),this.alignSizeAndBitRate(this.targetSubscription);const u=this.modules.subscription.getTargetSubscription();this.emitter.emit("subscription changed",{to:u,from:this.modules.subscription.getCurrentSubscription()})});t(this,"isSupportedVideoCodecProfile",(e,g)=>{if(this.willUseMediaSource())return window.MediaSource?window.MediaSource.isTypeSupported(Ke({codec:e,codecString:g})):!0;if(e==="h264"){const s=!!(g!=null&&g.startsWith("avc1.42")),I=!!(g!=null&&g.startsWith("avc1.66."));return s||I}return e!=="av1"});t(this,"supportedAudioCodecs",()=>{if(this.options.get("media")==="video")return[];const e=[];return(this.browser.supportsMp4Opus&&this.options.get("mseOpusEnabled")||!this.willUseMediaSource())&&e.push("opus"),this.willUseMediaSource()&&e.push("aac"),e});t(this,"initializeDecodingModule",()=>m(this,null,function*(){var s,I;const e=this.currentRenditionLevel,g=[];if(!e)throw new f("No currentRenditionLevel",{code:"no_current_rendition_level",isFatal:!1});if(e!=null&&e.video&&g.push({type:"video",mimeType:Ke(e.video)}),e!=null&&e.audio&&g.push({type:"audio",mimeType:Ke(e.audio)}),g.length===0)throw new f("Can't initialize decoding module without tracks",{code:"no_tracks",isFatal:!1});if(this.willUseMediaSource()&&this.element instanceof HTMLMediaElement)this.emitter.emit("flush buffers"),yield(s=this.modules.mseModule)==null?void 0:s.setSourceBuffers(g);else{const B=yield lA.create(this.emitter,this.logger.getLogger("DecoderModule"),g,this.playbackSource,this.pool);(I=this.modules.decoder)==null||I.unload(),this.modules.decoder=B,this.modules.decoder.load()}}));t(this,"unload",()=>m(this,null,function*(){var e,g,s;this.logger.debug("Unloading modules..."),yield Promise.all(Object.values(this.modules).map(I=>I==null?void 0:I.unload())),(e=this.wakeLock)==null||e.unload(),this.pool=new H(QA.MAX_POOL_SIZE),(s=(g=this.playbackSource).unload)==null||s.call(g),this.element.remove(),this.emitter.reset(),this.reset(),this.logger.debug("Unloaded modules")}));t(this,"userInput",()=>{this.play()});t(this,"pause",()=>{this.options.get("pauseSupportEnabled")&&(this.playbackSource.pause(),this.hasCalledConnect&&this.suspend())});t(this,"play",()=>m(this,null,function*(){var e;this.hasCalledConnect?this.unsuspend():this._connect(),(e=this.wakeLock)==null||e.enable(),this.playbackState==="paused"&&(this.resetModules(),this.emitter.emit("flush buffers"));try{yield this.playbackSource.play()}catch(g){}}));t(this,"getStatistics",()=>Object.values(this.modules).reduce((e,g)=>g&&"getStatistics"in g?r(r({},e),g.getStatistics()):e,this.getRuntimeInfo()));t(this,"resetModules",()=>{Object.values(this.modules).forEach(e=>{e&&"reset"in e&&e.reset()}),this.sampleProcessingSesssions.clear(),this.playbackSource.currentTime=0,this.playbackSource.isActivated=!1});t(this,"getRuntimeInfo",()=>{const e=this.modules.canvasModule?this.options.get("iosMediaElementEnabled"):void 0;return r({uptime:Date.now()-this.createdAt,version:"3.0.8",clientId:this.clientId,sessionId:this.sessionId,channelId:this.channelId,channelGroupId:this.options.get("channelGroupId"),ip:this.clientIp,url:this.options.get("url"),timeToFirstFrame:this.timeToFirstFrame(),iosMediaElementEnabled:e},fB())});t(this,"onMediaElementState",e=>{this.logger.info("media element state",{state:e}),this.options.get("pauseSupportEnabled")&&(e==="paused"?this.modules.documentState.isVisible&&(this.suspend(),this.modules.connection.disconnect()):this.unsuspend())});t(this,"onBufferEvent",e=>{var s,I,B,n;this.emit("buffer state event",e);const g=!this.playbackSource.isActivated||this.playbackSource.isPaused;if(e==="filled"&&g){const o=Math.max(this.currentTime,(I=(s=this.videoBufferedRanges[0])==null?void 0:s.start)!=null?I:0,(n=(B=this.audioBufferedRanges[0])==null?void 0:B.start)!=null?n:0);this.logger.info("Buffer filled - starting playback",{currentTime:o}),this.playbackSource.currentTime=o,this.modules.sync.activateSyncAdjustments(),this.playbackSource.isActivated=!0}else e==="drained"&&this.playbackSource.isPaused&&(this.playbackSource.isActivated=!1,this.modules.sync.deactivateSyncAdjustments())});t(this,"timeToFirstFrame",()=>{const e=this.modules.playback.getFirstFrameTime(),g=this.modules.connection.firstConnectionTime;if(g&&e)return e-g});t(this,"willUseMediaSource",()=>this.browser.supportsMediaSource&&this.options.get("mseEnabled"));this.options=new mB(r(r({},Vg),Qs(e)));const g=["localhost","127.0.0.1"];e.telemetryEnabled===void 0&&g.includes(location.hostname)&&this.options.set("telemetryEnabled",!1);const s={channelId:this.options.get("channelId"),audio:{language:this.options.get("language"),bitRate:this.options.get("maxAudioBitRate")},video:{bitRate:this.options.get("maxVideoBitRate"),width:this.options.get("maxSize").width,height:this.options.get("maxSize").height}},I=ue.create();I.setLevel(this.options.get("logLevel")),this.logger=I.getLogger("Vindral");const B=Se.create(this.emitter,this.logger.getLogger("PictureInPictureModule")),n=O.create();this.apiClient=new qt({publicEndpoint:this.options.get("url").toString(),tokenFactory:()=>this.options.get("authenticationToken")});const o=dA.create(this.emitter,this.logger.getLogger("ConnectionModule"),{connectHandler:this.connectHandler,reconnectHandler:this.options.get("reconnectHandler")}),C=Fe.create(this.logger.getLogger("SubscriptionModule"),this.emitter,s),a=pe.create(this.emitter,C),Q=fe.create(this.emitter,this.logger.getLogger("QualityOfServiceModule")),h=De.create(this.emitter,this.logger.getLogger("PlaybackModule"),this,this.options.get("minBufferTime")),u=re.create(this.emitter),l=this.options.get("poster"),D=l===!0?this.getThumbnailUrl():l||void 0;let S,Y,T;if(this.willUseMediaSource()){const E=new Oe({type:this.options.get("media")=="audio"?"audio":"video",autoplay:!1,muted:this.options.get("muted")||this.options.get("media")==="video",logger:this.logger.getLogger("MediaElement"),poster:D});E.on("buffer state",w=>this.emitter.emit("buffer state",w)),E.on("needs user input",w=>this.emitter.emit("needs user input",w)),E.on("volume state",w=>this.emit("volume state",w)),E.on("media element state",w=>this.onMediaElementState(w)),this.element=E.element,this.playbackSource=E,S=we.create(this.logger.getLogger("MseModule"),this.emitter,this.element),this.options.get("pauseSupportEnabled")||(Y=ZA.create(this.logger.getLogger("UnpauseModule"),E,u)),this.options.get("pictureInPictureEnabled")&&this.emitter.emit("add picture in picture listener",{element:E.element})}else if(this.browser.platform.iosVersion>=15&&this.options.get("iosMediaElementEnabled")){const E=me.create(this.emitter,this.logger.getLogger("ModernCanvasModule"),this.pool,this,{type:this.options.get("media")=="audio"?"audio":"video",muted:this.options.get("muted")||this.options.get("media")==="video",poster:D}),w=E.element();this.element=w.element,this.playbackSource=E,T=E,this.options.get("pictureInPictureEnabled")&&this.browser.platform.iosVersion>15&&this.emitter.emit("add picture in picture listener",{element:this.element}),this.options.get("pauseSupportEnabled")||(Y=ZA.create(this.logger.getLogger("UnpauseModule"),w,u))}else{const E=le.create(this.emitter,this.logger.getLogger("LegacyCanvasModule"),this.pool,this,this.options.get("muted")||this.options.get("media")==="video");this.element=E.element(),this.playbackSource=E,T=E,this.options.get("iosWakeLockEnabled")&&(this.wakeLock=new qI)}this.emitter.on("channel reset",this.resetModules),this.emitter.on("no data timeout",this.resetModules),this.emitter.on("media element state",E=>this.onMediaElementState(E)),this.emitter.on("volume state",E=>this.emit("volume state",E)),this.options.get("pauseSupportEnabled")||this.emitter.on("exit picture in picture",()=>n.setTimeout(()=>void this.play(),0)),this.emitter.on("constraint cap changed",E=>{this.logger.info("new cap set",{cap:E}),this.alignSizeAndBitRate(this.targetSubscription)}),this.pictureInPicture={enter:()=>B.requestPictureInPicture(),exit:()=>B.exitPictureInPicture(),isActive:()=>B.isPictureInPictureActive(),isSupported:()=>B.isPictureInPictureSupported()},this.emitter.on("error",E=>{if(E.type()==="external"&&this.emit("error",E),E.isFatal())return()=>void this.unload()});const k=ye.create(this.emitter,this.logger.getLogger("SyncModule"),this.playbackSource,h,this.willUseMediaSource()),W=new URL("/telemetry",this.options.get("url").replace("//lb.","//errors.")).toString(),x=VA.create(this.logger.getLogger("TelemetryModule"),this.emitter,{url:W,enabled:this.options.get("telemetryEnabled"),includeStats:!1,interval:5e3},this);this.modules={telemetry:x,bufferTime:FA.create(this.emitter,this.logger.getLogger("BufferTimeModule"),Q,this,{maxBufferTime:this.options.get("maxBufferTime"),minBufferTime:this.options.get("minBufferTime")}),incomingData:uA.create(this.emitter),adaptivity:Qe.create(this.emitter,this.logger.getLogger("AdaptivityModule"),Q,{cooldownTime:Math.max(this.options.get("minBufferTime"),2e3)}),constraintCap:YA.create(this.emitter,this.element,a,this.options.get("abrEnabled")?this.options.get("sizeBasedResolutionCapEnabled"):!1),event:RA.create(this.emitter,this.logger.getLogger("EventModule"),k),sync:k,documentState:u,connection:o,playback:h,pictureInPicture:B,logger:I,timer:n,subscription:C,renditions:a,qualityOfService:Q,mseModule:S,unpause:Y,canvasModule:T},this.modules.adaptivity.isEnabled=this.options.get("abrEnabled"),this.emitter.on("page active",E=>{var w;E&&typeof this.disconnectTimeout=="number"&&(this.modules.timer.clearInterval(this.disconnectTimeout),this.disconnectTimeout=void 0),E?this.playbackSource.isPaused||(this.logger.debug("Unsuspending"),this.unsuspend()):(this.logger.debug("Suspending"),this.suspend(),this.modules.decoder?this.options.get("iosBackgroundPlayEnabled")?(this.modules.decoder.unsuspend(),(w=this.modules.canvasModule)==null||w.unsuspend()):this.modules.connection.disconnect():(this.disconnectTimeout&&this.modules.timer.clearInterval(this.disconnectTimeout),this.disconnectTimeout=this.modules.timer.setInterval(()=>{const b=this.playbackState==="paused"||this.muted;this.connectionState==="connected"&&b&&(this.emitter.emit("flush buffers"),this.modules.connection.disconnect("Page inactive timeout"))},QA.DISCONNECT_TIMEOUT)))});let V;this.emitter.on("context switch complete",()=>{V||(V=window.setTimeout(()=>{window.clearTimeout(V),V=void 0,this.emit("context switch","completed"),this.emitLanguagesIfChanged()},this.targetBufferTime))}),this.emitter.on("context switch started",()=>this.emit("context switch","started")),this.emitter.on("needs user input",E=>this.emit("needs user input",E)),this.emitter.on("event",E=>{switch(E.type){case"metadata":this.emit("metadata",E);break;case"channel switch":this.emit("channel switch",{channelId:E.channelId});break;case"language switch":this.emit("language switch",{language:E.language});break}}),this.emitter.on("buffer state event",this.onBufferEvent),this.emitter.on("playback state",E=>this.emit("playback state",E)),this.emitter.on("rendition level changed",({to:E})=>{E&&this.emit("rendition level",E)}),this.emitter.on("connection state",E=>{E==="connected"&&(this.cachedEdges=[],this.shiftedEdges=[]),this.emit("connection state",E)}),this.emitter.on("recovered from media error",()=>{this.modules.adaptivity.reset(this.targetBufferTime*2)}),this.emitter.once("connect info",E=>{var J,M,P;const b=((M=(J=E.telemetry)==null?void 0:J.probability)!=null?M:1)>=Math.random();E.telemetry&&((P=this.modules.telemetry)==null||P.unload(),this.modules.telemetry=VA.create(this.logger.getLogger("TelemetryModule"),this.emitter,L(r({},E.telemetry),{enabled:this.options.get("telemetryEnabled")&&b}),this),this.modules.telemetry.load())}),this.emitter.on("adapt level",E=>{var JA,aA,IA,c,p;this.logger.debug("adapt level",{direction:E});const w=this.modules.renditions.getRenditionLevels(),b=this.modules.renditions.getRenditionLevel(),J=w.findIndex(G=>G===b),M=w.length-1;let P=J;switch(E){case"upgrade":{const G=Math.min(J+1,M),N=w[G],y=(JA=this.modules.connection.estimatedBandwidth)!=null?JA:nA(),K=((IA=(aA=N==null?void 0:N.audio)==null?void 0:aA.bitRate)!=null?IA:0)+((p=(c=N==null?void 0:N.video)==null?void 0:c.bitRate)!=null?p:0),LA=y*2>K;N&&LA&&this.modules.adaptivity.isQoSOk(N)&&(P=G)}break;case"downgrade":P=Math.max(J-1,0);break;case"double downgrade":P=Math.max(J-2,0);break;case"reconnect":if(J===0||this.modules.qualityOfService.timeSpentBufferingLast(6e3)>5e3){if(!this.modules.connection.lastConnectionTime||Date.now()-this.modules.connection.lastConnectionTime<this.modules.qualityOfService.fatalQosGraceTime()||this.modules.connection.getState()!=="connected")return;this.modules.qualityOfService.incrementFatalQosCount(),this.logger.info("Reconnecting due to poor qos"),this.modules.connection.reconnect("Fatal QOS"),this.emitter.emit("adapted level");return}else P=0}if(P===J)return;const z=w[P];this.alignSizeAndBitRate(L(r({},this.targetSubscription),{video:r(r({},this.targetSubscription.video),z==null?void 0:z.video),audio:r(r({},this.targetSubscription.audio),z==null?void 0:z.audio)})),this.emitter.emit("adapted level")}),this.emitter.on("received signal",E=>{var b;const w=E;switch(this.logger.debug("received",r({},w)),w.type){case"client ip":this.clientIp=w.ip;break;case"renditions":this.emitter.emit("renditions",{renditions:this.filterRenditions(w.renditions),channelId:this.currentSubscription.channelId}),this.emit("rendition levels",this.modules.renditions.getRenditionLevels()),this.emitLanguagesIfChanged();break;case"subscription changed":try{pB(w.subscription)}catch(J){this.emitter.emit("error",new f("Subscription failed validation",{source:J instanceof Error?J:void 0,isFatal:!1,code:"subscription_failed_validation"}))}this.emitter.emit("subscription changed",{to:w.subscription,from:this.modules.subscription.getCurrentSubscription()}),this.modules.sync.timeshiftOnAudio=!((b=w.subscription.video)!=null&&b.codec),this.modules.adaptivity.reset();break;case"timing info":this.modules.sync.updateChannelSyncInfo(w.timingInfo.channelId,w.timingInfo),this.emit("server wallclock time",w.timingInfo.wallclockTime);break}}),this.emitter.on("received data",E=>{const w=this.modules.subscription.getCurrentSubscription(),b=hI(E);if(!w){this.logger.warn("Received unwanted message",r({},b));return}iA(L(r({},b),{channelId:w.channelId}))});const tA=this.options.get("container");tA&&this.attach(tA),this.logger.info("Created Vindral instance",{options:this.options});const iA=E=>{const w=E.channelId,b=this.modules.renditions.getRendition(E.renditionId,w);if(!aI(E.flags)){if(EI(E.flags)){const J=new TextDecoder;this.modules.event.addEvent({timestamp:E.timestamp/E.timescale*1e3-this.modules.sync.getTimeshiftOffset(),content:J.decode(E.payload),type:"metadata"})}else if(b!=null&&b.codec){const J=as(b.codec);if(this.modules.incomingData.add(J,E.payload.byteLength),QI(E.flags)){const M=L(r({type:J,data:E.payload,codec:b.codec},E),{channelId:w}),P=JI(M.codec,M.payload);P&&this.sizes.set(M.renditionId,P),this.emitter.emit("init segment",M),this.emit("initialized media")}else{const M=DB(E,b,this.sizes.get(E.renditionId));let P=this.sampleProcessingSesssions.get(J);if(!P)P=wB(this.modules.sync.processSample(M)),this.sampleProcessingSesssions.set(J,P);else{const z=P(this.modules.sync.processSample(M));this.modules.event.extractEvent(z,M),this.emitter.emit("coded sample",z)}}}}};this.options.get("maxVideoBitRate")!==Number.MAX_SAFE_INTEGER&&(this.maxVideoBitRate=this.options.get("maxVideoBitRate")),this.options.get("maxAudioBitRate")!==Number.MAX_SAFE_INTEGER&&(this.maxAudioBitRate=this.options.get("maxAudioBitRate")),rA(this.options.get("maxSize"),ie())||(this.maxSize=this.options.get("maxSize")),this.options.get("burstEnabled")&&C.enableBurst(this.targetBufferTime),zI(this)}set volume(e){this.playbackSource.volume=e}get volume(){return this.playbackSource.volume}set muted(e){const g=this.playbackSource.muted;this.playbackSource.muted=e,!e&&g&&!this.playbackSource.isPaused&&this.playbackSource.play()}get muted(){return this.playbackSource.muted}get media(){return this.options.get("media")}get videoBitRate(){return this.modules.incomingData.averageBitRate("video")}get audioBitRate(){return this.modules.incomingData.averageBitRate("audio")}get connectionState(){return this.modules.connection.getState()}get playbackState(){return this.modules.playback.getState()}get bufferFullness(){return this.modules.playback.getBufferFullness()}get sizeBasedResolutionCapEnabled(){return this.modules.constraintCap.sizeBasedResolutionCapEnabled}set sizeBasedResolutionCapEnabled(e){this.modules.constraintCap.sizeBasedResolutionCapEnabled=e}get abrEnabled(){return this.modules.adaptivity.isEnabled}set abrEnabled(e){this.modules.constraintCap.sizeBasedResolutionCapEnabled=e?this.options.get("sizeBasedResolutionCapEnabled"):!1,this.modules.adaptivity.isEnabled=e,this.alignSizeAndBitRate(this.targetSubscription)}get serverEdgeTime(){return this.modules.sync.getLiveEdgeTimeLatencyAdjusted(this.currentSubscription.channelId)}get serverWallclockTime(){return this.modules.sync.getWallclockTimeLatencyAdjusted(this.currentSubscription.channelId)}get currentTime(){return this.modules.sync.serverCurrentTime}get channelCurrentTime(){return this.modules.sync.channelCurrentTime}get targetBufferTime(){return this.modules.playback.getTargetBufferTime()}set targetBufferTime(e){this.modules.playback.getTargetBufferTime()!==e&&(this.modules.playback.setTargetBufferTime(e),this.playbackSource.currentTime=this.modules.sync.serverCurrentTime,this.options.get("burstEnabled",this.channelId)?this.modules.subscription.enableBurst(this.targetBufferTime):this.modules.subscription.enableBurst(0))}get playbackLatency(){var e;if(this.playbackSource.currentTime!==0)return this.targetBufferTime+((e=this.modules.sync.drift)!=null?e:0)+this.modules.connection.rtt/2}get playbackWallclockTime(){if(!(!this.serverWallclockTime||!this.playbackLatency))return this.serverWallclockTime-this.playbackLatency}get channels(){return this._channels}get languages(){return this.modules.renditions.getLanguages()}get language(){return this.modules.subscription.getTargetSubscription().audio.language}set language(e){this.modules.subscription.setLanguage(e)}get channelId(){return this.modules.subscription.getTargetSubscription().channelId}set channelId(e){if(e===this.channelId)return;this.modules.subscription.setChannelId(e);const g=this.modules.renditions.getAudioRenditions(e),s=this.targetSubscription.audio.language,I=g==null?void 0:g.some(B=>B.language===s);this.logger.debug("Channel switch - started",{audioRenditions:g,targetSubscriptionLanguage:s,targetHasCurrentLanguage:I}),this.alignSizeAndBitRate(this.targetSubscription)}get maxSize(){var s,I;const{width:e,height:g}=(I=(s=this.modules.constraintCap.getCurrentConstraintCap())==null?void 0:s.video)!=null?I:ie();return{width:e,height:g}}set maxSize(e){this.modules.constraintCap.setUserSpecifiedCap({video:{width:e.width,height:e.height}}),this.alignSizeAndBitRate(this.targetSubscription)}get maxVideoBitRate(){var e,g;return(g=(e=this.modules.constraintCap.getCurrentConstraintCap())==null?void 0:e.video.bitRate)!=null?g:nA()}set maxVideoBitRate(e){this.modules.constraintCap.setUserSpecifiedCap({video:{bitRate:e}}),this.alignSizeAndBitRate(this.targetSubscription)}get maxAudioBitRate(){var e,g;return(g=(e=this.modules.constraintCap.getCurrentConstraintCap())==null?void 0:e.audio.bitRate)!=null?g:nA()}set maxAudioBitRate(e){this.modules.constraintCap.setUserSpecifiedCap({audio:{bitRate:e}}),this.alignSizeAndBitRate(this.targetSubscription)}get renditionLevels(){return this.modules.renditions.getRenditionLevels()}get currentRenditionLevel(){return this.modules.renditions.getRenditionLevel()}get targetRenditionLevel(){return this.modules.renditions.getRenditionLevel(this.modules.subscription.getTargetSubscription())}get isSwitchingRenditionLevel(){return this.modules.subscription.isSwitchingSubscription()}get videoBufferedRanges(){var e,g,s,I;return(I=(s=(e=this.modules.mseModule)==null?void 0:e.getBuffer("video"))!=null?s:(g=this.modules.decoder)==null?void 0:g.getBuffer("video"))!=null?I:[]}get audioBufferedRanges(){var e,g,s,I;return(I=(s=(e=this.modules.mseModule)==null?void 0:e.getBuffer("audio"))!=null?s:(g=this.modules.decoder)==null?void 0:g.getBuffer("audio"))!=null?I:[]}get lastBufferEvent(){return this.modules.playback.getLastBufferStateEvent()}get activeRatios(){return this.modules.qualityOfService.activeRatios()}get bufferingRatios(){return this.modules.qualityOfService.bufferingRatios()}get timeSpentBuffering(){return this.modules.qualityOfService.timeSpentBuffering()}get timeActive(){return this.modules.qualityOfService.timeActive()}get mediaElement(){return this.element}get uptime(){return Date.now()-this.createdAt}suspend(){this.isSuspended||(Object.values(this.modules).forEach(e=>{e&&"suspend"in e&&e.suspend()}),this.isSuspended=!0)}unsuspend(){this.isSuspended&&(Object.values(this.modules).forEach(e=>{e&&"unsuspend"in e&&e.unsuspend()}),this.isSuspended=!1)}alignSizeAndBitRate(e){const g=this.modules.constraintCap.constrainSubscription(L(r({},e),{video:r({},e.video),audio:r({},e.audio)})),s=this.modules.constraintCap.getUserSpecifiedCap();!this.abrEnabled&&s&&(g.audio.bitRate=s.audio.bitRate,g.video.bitRate=s.video.bitRate,g.video.width=s.video.width,g.video.height=s.video.height);const I=this.modules.renditions.getRenditionLevel(g);if(I){if(I.video&&(this.modules.subscription.setVideoBitRate(I.video.bitRate),this.modules.subscription.setSize(I.video)),I.audio)this.modules.subscription.setAudioBitRate(I.audio.bitRate),this.modules.subscription.setLanguage(I.audio.language);else if(g.audio.language){let B=this.modules.renditions.getAudioRenditions(g.channelId);!this.abrEnabled&&s&&(B=B==null?void 0:B.filter(Q=>Q.bitRate<s.audio.bitRate));const n=g.audio.language,o=B==null?void 0:B.some(Q=>Q.language===n),C=B==null?void 0:B.find(Q=>Q.language),a=(B==null?void 0:B.length)&&B[0]||void 0;o||(C?(this.logger.debug("Randomizing language since target did not have current language"),this.modules.subscription.setAudioBitRate(C.bitRate),this.modules.subscription.setLanguage(C.language)):(this.logger.debug("Randomizing audio rendition since target did not have current language"),a!=null&&a.bitRate&&this.modules.subscription.setAudioBitRate(a.bitRate),this.modules.subscription.setLanguage(a==null?void 0:a.language)))}}}get currentSubscription(){return this.modules.subscription.getCurrentSubscription()}get targetSubscription(){return this.modules.subscription.getTargetSubscription()}};let oA=QA;t(oA,"MAX_POOL_SIZE",10),t(oA,"INITIAL_MAX_BIT_RATE",2.5*1e3*1e3),t(oA,"PING_TIMEOUT",1e3),t(oA,"DISCONNECT_TIMEOUT",15*1e3);const vi={bar:"_bar_16xpe_1",hidden:"_hidden_16xpe_46"},OA={"channel-selection-item":"_channel-selection-item_suenn_1","channel-selection-item-selected":"_channel-selection-item-selected_suenn_8","channel-selection-item-image":"_channel-selection-item-image_suenn_13",withThumbnails:"_withThumbnails_suenn_19","hide-on-small":"_hide-on-small_suenn_27"};class ${constructor(A){t(this,"attach",A=>{this.detach(),A.appendChild(this.element)});t(this,"detach",()=>this.element.remove());this.element=A}}const FB={"icon-button":"_icon-button_5fg7v_1"},Ni={enter:{viewBox:"-12 -12 38 38",content:`<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-5.000000, -5.000000)">
28
28
  <path d="M6,14 C5.45,14 5,14.45 5,15 L5,18 C5,18.55 5.45,19 6,19 L9,19 C9.55,19 10,18.55 10,18 C10,17.45 9.55,17 9,17 L7,17 L7,15 C7,14.45 6.55,14 6,14 Z M6,10 C6.55,10 7,9.55 7,9 L7,7 L9,7 C9.55,7 10,6.55 10,6 C10,5.45 9.55,5 9,5 L6,5 C5.45,5 5,5.45 5,6 L5,9 C5,9.55 5.45,10 6,10 Z M17,17 L15,17 C14.45,17 14,17.45 14,18 C14,18.55 14.45,19 15,19 L18,19 C18.55,19 19,18.55 19,18 L19,15 C19,14.45 18.55,14 18,14 C17.45,14 17,14.45 17,15 L17,17 Z M14,6 C14,6.55 14.45,7 15,7 L17,7 L17,9 C17,9.55 17.45,10 18,10 C18.55,10 19,9.55 19,9 L19,6 C19,5.45 18.55,5 18,5 L15,5 C14.45,5 14,5.45 14,6 Z" fill="white"></path>
29
29
  </g>`},exit:{viewBox:"-12 -12 38 38",content:`<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-5.000000, -5.000000)">
30
30
  <path d="M6,16 L8,16 L8,18 C8,18.55 8.45,19 9,19 C9.55,19 10,18.55 10,18 L10,15 C10,14.45 9.55,14 9,14 L6,14 C5.45,14 5,14.45 5,15 C5,15.55 5.45,16 6,16 Z M8,8 L6,8 C5.45,8 5,8.45 5,9 C5,9.55 5.45,10 6,10 L9,10 C9.55,10 10,9.55 10,9 L10,6 C10,5.45 9.55,5 9,5 C8.45,5 8,5.45 8,6 L8,8 Z M15,19 C15.55,19 16,18.55 16,18 L16,16 L18,16 C18.55,16 19,15.55 19,15 C19,14.45 18.55,14 18,14 L15,14 C14.45,14 14,14.45 14,15 L14,18 C14,18.55 14.45,19 15,19 Z M16,8 L16,6 C16,5.45 15.55,5 15,5 C14.45,5 14,5.45 14,6 L14,9 C14,9.55 14.45,10 15,10 L18,10 C18.55,10 19,9.55 19,9 C19,8.45 18.55,8 18,8 L16,8 Z" fill="white"></path>
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.0.7",
2
+ "version": "3.0.8",
3
3
  "name": "@vindral/web-sdk",
4
4
  "main": "./index.umd.js",
5
5
  "module": "./index.mjs",