@stormstreaming/stormstreamer 0.9.0-beta.3 → 0.9.0-beta.4

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/dist/umd/index.js CHANGED
@@ -4,11 +4,11 @@
4
4
  * contact@stormstreaming.com
5
5
  * https://stormstreaming.com
6
6
  *
7
- * Version: 0.9.0-beta.3
8
- * Version: 12/5/2024, 2:36:50 PM
7
+ * Version: 0.9.0-beta.4
8
+ * Version: 12/7/2024, 6:37:55 PM
9
9
  *
10
10
  * LEGAL NOTICE:
11
11
  * This software is subject to the terms and conditions defined in
12
12
  * separate license conditions ('LICENSE.txt')
13
13
  *
14
- */!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).stormStreamer={})}(this,function(o){"use strict";class r{constructor(e,t,i=443,n=!0){this.host=e,this.application=t,this.port=i,this.isSSL=n,this.hasFaild=!1}getHost(){return this.host}getApplication(){return this.application}getPort(){return this.port}getIfSSL(){return this.isSSL}getIfFaild(){return this.hasFaild}setAsFaild(e){this.hasFaild=e}getData(){return{serverURL:this.getHost(),application:this.getHost(),serverPort:this.getPort(),isSSL:this.getIfSSL()}}toString(){return"host: "+this.host+" | application: "+this.application+" | port: "+this.port+" | isSSL: "+this.isSSL}}class a{constructor(e){this._serverList=new Array,this._sourceList=new Array,this._streamKey=null,this.parse(e)}parse(e){if(this._streamConfig=e,!this._streamConfig)throw new Error("Stream configuration is missing. Please check stream config!");if(void 0===this._streamConfig.serverList||null===this._streamConfig.serverList)throw new Error("StormLibrary: Server list configuration is missing. Please check the config!");if(0===this._streamConfig.serverList.length)throw new Error("StormLibrary: Server list configuration is empty. Please check the config!");for(let i=0;i<this._streamConfig.serverList.length;i++){let e,t;if(null==this._streamConfig.serverList[i].host)throw new Error('Error while parsing server object ("host" field is missing). Please check player config!');if(e=this._streamConfig.serverList[i].host,null==this._streamConfig.serverList[i].application)throw new Error('Error while parsing server object ("application" field is missing). Please check player config!');t=this._streamConfig.serverList[i].application;var n=null!=(n=this._streamConfig.serverList[i].port)?n:a.DEFAULT_CONNECTION_PORT,s=null!=(s=this._streamConfig.serverList[i].ssl)?s:a.IS_SSL_BY_DEFAULT;this._serverList.push(new r(e,t,n,s))}this._streamKey=null!=(e=this._streamConfig.streamKey)?e:this._streamKey}getServerList(){return this._serverList}getSourceList(){return this._sourceList}get streamKey(){return this._streamKey}set streamKey(e){this._streamKey=e}set serverList(e){this._serverList=e}set sourceList(e){this._sourceList=e}clearSourceList(){this._sourceList=new Array}clearServerList(){this._serverList=new Array}print(t,e=!1){if(a.PRINT_ON_STARTUP||e){t.info(this,"Server List:");for(let e=0;e<this._serverList.length;e++)t.info(this,"=> ["+e+"] "+this._serverList[e].toString());t.info(this,"StreamKey: "+this._streamKey)}}}var s,i,n;a.PRINT_ON_STARTUP=!0,a.DEFAULT_CONNECTION_PORT=443,a.IS_SSL_BY_DEFAULT=!0,(C=s=s||{}).FILL="fill",C.LETTER_BOX="letterbox",C.CROP="crop",C.ORIGINAL="original",(C=i=i||{}).CLIENT_DIMENSIONS="clientDimensions",C.BOUNDING_BOX="boundingBox",C.FULL_BOX="fullBox";class t{constructor(e){this._scalingMode=s.LETTER_BOX,this._aspectRatio="none",this._videoWidthValue=100,this._isVideoWidthInPixels=!1,this._wasVideoWidthProvided=!1,this._videoHeightValue=100,this._isVideoHeightInPixels=!1,this._wasVideoHeightProvided=!1,this._resizeDebounce=250,this._parentSizeCalculationMethod=i.CLIENT_DIMENSIONS,this.parse(e)}parse(e){if(this.videoConfig=e,null==this.videoConfig)throw new Error("Missing video configuration. Please check player config!");if(null!=this.videoConfig.aspectRatio){var e=new RegExp("^[0-9]*\\.?[0-9]+:[0-9]*\\.?[0-9]+$"),t=this.videoConfig.aspectRatio;if(!e.test(t))throw new Error('Parameter "aspectRatio" - must match "number:number" pattern ');this._aspectRatio=t,this._aspectRatio=this.videoConfig.aspectRatio}if(null!=this.videoConfig.scalingMode)switch(this.videoConfig.scalingMode.toLowerCase()){case"fill":this._scalingMode=s.FILL;break;case"letterbox":this._scalingMode=s.LETTER_BOX;break;case"crop":this._scalingMode=s.CROP;break;case"original":this._scalingMode=s.ORIGINAL;break;default:throw new Error("Unknown video scaling mode. Please check player config!")}if(void 0!==this.videoConfig.width){if(null===this.videoConfig.width)throw new Error('Parameter "width" cannot be empty');if("number"==typeof this.videoConfig.width)this._videoWidthValue=this.videoConfig.width,this._isVideoWidthInPixels=!0;else{if("string"!=typeof this.videoConfig.width)throw new Error('Unknown type for parameter "width" - it must be a number or a string! ');this.videoConfig.width.toLowerCase().endsWith("px")?(this._videoWidthValue=parseInt(this.videoConfig.width),this._isVideoWidthInPixels=!0):this.videoConfig.width.toLowerCase().endsWith("%")&&(this._videoWidthValue=parseInt(this.videoConfig.width),this._isVideoWidthInPixels=!1)}this._wasVideoWidthProvided=!0}if(void 0!==this.videoConfig.height){if(null===this.videoConfig.height)throw new Error('Parameter "height" cannot be empty');if("number"==typeof this.videoConfig.height)this._videoHeightValue=this.videoConfig.height,this._isVideoHeightInPixels=!0;else{if("string"!=typeof this.videoConfig.height)throw new Error('Unknown type for parameter "height" - it must be a number or a string!');this.videoConfig.height.toLowerCase().endsWith("px")?(this._videoHeightValue=parseInt(this.videoConfig.height),this._isVideoHeightInPixels=!0):this.videoConfig.height.toLowerCase().endsWith("%")&&(this._videoHeightValue=parseInt(this.videoConfig.height),this._isVideoHeightInPixels=!1)}this._wasVideoHeightProvided=!0}if(void 0!==this.videoConfig.sizeCalculationMethod&&null!==this.videoConfig.sizeCalculationMethod)switch(this.videoConfig.sizeCalculationMethod){case"clientDimensions":this._parentSizeCalculationMethod=i.CLIENT_DIMENSIONS;break;case"boundingBox":this._parentSizeCalculationMethod=i.BOUNDING_BOX;break;case"fullBox":this._parentSizeCalculationMethod=i.FULL_BOX}this._containerID=null!=(e=this.videoConfig.containerID)?e:null,this._resizeDebounce=null!=(t=this.videoConfig.resizeDebounce)?t:this._resizeDebounce}get scalingMode(){return this._scalingMode}get containerID(){return this._containerID}get videoWidthValue(){return this._videoWidthValue}get videoWidthInPixels(){return this._isVideoWidthInPixels}get videoWidthProvided(){return this._wasVideoWidthProvided}get videoHeightValue(){return this._videoHeightValue}get videoHeightInPixels(){return this._isVideoHeightInPixels}get videoHeightProvided(){return this._wasVideoHeightProvided}get aspectRatio(){return this._aspectRatio}get resizeDebounce(){return this._resizeDebounce}set resizeDebounce(e){this._resizeDebounce=e}set videoWidthValue(e){this._videoWidthValue=e}set videoWidthInPixels(e){this._isVideoWidthInPixels=e}set videoHeightValue(e){this._videoHeightValue=e}set videoHeightInPixels(e){this._isVideoHeightInPixels=e}set containerID(e){this._containerID=e}set scalingMode(e){switch(e.toLowerCase()){case"fill":this._scalingMode=s.FILL;break;case"letterbox":this._scalingMode=s.LETTER_BOX;break;case"crop":this._scalingMode=s.CROP;break;case"original":this._scalingMode=s.ORIGINAL;break;default:throw new Error("Unknown video scaling mode. Please check player config!")}}get parentSizeCalculationMethod(){return this._parentSizeCalculationMethod}print(e){let t="";switch(this._scalingMode){case s.FILL:t="fill";break;case s.LETTER_BOX:t="letterbox";break;case s.CROP:t="crop";break;case s.ORIGINAL:t="original"}e.info(this,"VideoConfig :: containerID: "+this._containerID),e.info(this,"VideoConfig :: scalingMode: "+t),e.info(this,"VideoConfig :: width: "+this._videoWidthValue+(this._isVideoWidthInPixels?"px":"%")+(this._wasVideoWidthProvided?" (provided)":" (default)")),e.info(this,"VideoConfig :: height: "+this._videoHeightValue+(this._isVideoHeightInPixels?"px":"%")+(this._wasVideoHeightProvided?" (provided)":" (default)")),e.info(this,"VideoConfig :: aspectRatio: "+this._aspectRatio)}}(C=n=n||{})[C.TRACE=0]="TRACE",C[C.INFO=1]="INFO",C[C.SUCCESS=2]="SUCCESS",C[C.WARNING=3]="WARNING",C[C.ERROR=4]="ERROR";class h{constructor(e){this._consoleLogEnabled=!1,this._enabledConsoleTypes=[n.INFO,n.ERROR,n.SUCCESS,n.TRACE,n.WARNING],this._consoleMonoColor=!1,this._containerLogEnabled=!1,this._enabledContainerTypes=[n.INFO,n.ERROR,n.SUCCESS,n.TRACE,n.WARNING],this._containerLogMonoColor=!1,this.parse(e)}parse(e){this._debugConfig=e,this._debugConfig&&(this._consoleLogEnabled=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.console)?void 0:e.enabled)?e:this._consoleLogEnabled,this._consoleMonoColor=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.console)?void 0:e.monoColor)?e:this._consoleMonoColor,this._enabledConsoleTypes=null!=(e=this.parseLogTypes(null==(e=null==(e=this._debugConfig)?void 0:e.console)?void 0:e.logTypes))?e:this._enabledConsoleTypes,this._containerLogEnabled=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.enabled)?e:this._containerLogEnabled,this._containerLogMonoColor=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.monoColor)?e:this._containerLogMonoColor,this._enabledContainerTypes=null!=(e=this.parseLogTypes(null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.logTypes))?e:this._enabledContainerTypes,this._containerID=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.containerID)?e:this._containerID)}parseLogTypes(e){return null==e?void 0:e.map(e=>{switch(e.toLowerCase()){case"info":return n.INFO;case"error":return n.ERROR;case"warning":return n.WARNING;case"success":return n.SUCCESS;case"trace":return n.TRACE;default:throw new Error("Unsupported log type: "+e)}})}get consoleLogEnabled(){return this._consoleLogEnabled}set consoleLogEnabled(e){this._consoleLogEnabled=e}get enabledConsoleTypes(){return this._enabledConsoleTypes}set enabledConsoleTypes(t){this._enabledConsoleTypes=new Array;for(let e=0;e<t.length;e++)switch(t[e].toLowerCase()){case"info":this._enabledConsoleTypes.push(n.INFO);break;case"error":this._enabledConsoleTypes.push(n.ERROR);break;case"warning":this._enabledConsoleTypes.push(n.WARNING);break;case"success":this._enabledConsoleTypes.push(n.SUCCESS);break;case"trace":this._enabledConsoleTypes.push(n.TRACE)}}get containerLogEnabled(){return this._containerLogEnabled}set containerLogEnabled(e){this._consoleLogEnabled=e}get consoleLogMonoColor(){return this._consoleMonoColor}set consoleLogMonoColor(e){this._consoleMonoColor=e}get enabledContainerTypes(){return this._enabledContainerTypes}set enabledContainerTypes(t){this._enabledContainerTypes=new Array;for(let e=0;e<t.length;e++)switch(t[e].toLowerCase()){case"info":this._enabledContainerTypes.push(n.INFO);break;case"error":this._enabledContainerTypes.push(n.ERROR);break;case"warning":this._enabledContainerTypes.push(n.WARNING);break;case"success":this._enabledContainerTypes.push(n.SUCCESS);break;case"trace":this._enabledContainerTypes.push(n.TRACE)}}get containerID(){return this._containerID}set containerID(e){this._containerID=e}get containerLogMonoColor(){return this._containerLogMonoColor}set containerLogMonoColor(e){this._containerLogMonoColor=e}print(e,t=!1){if(h.PRINT_ON_STARTUP||t){let t="";for(let e=0;e<this._enabledConsoleTypes.length;e++)switch(this._enabledConsoleTypes[e]){case n.TRACE:t+="TRACE, ";break;case n.SUCCESS:t+="SUCCESS, ";break;case n.WARNING:t+="WARNING, ";break;case n.INFO:t+="INFO, ";break;case n.ERROR:t+="ERROR, "}e.info(this,"Console:: enabled: "+this._consoleLogEnabled),e.info(this,"Console:: logTypes: "+t),e.info(this,"Console:: monoColor: "+this._consoleMonoColor);let i="";for(let e=0;e<this._enabledContainerTypes.length;e++)switch(this._enabledContainerTypes[e]){case n.TRACE:i+="TRACE, ";break;case n.SUCCESS:i+="SUCCESS, ";break;case n.WARNING:i+="WARNING, ";break;case n.INFO:i+="INFO, ";break;case n.ERROR:i+="ERROR, "}e.info(this,"Container:: enabled: "+this._containerLogEnabled),e.info(this,"Container:: logTypes: "+i),e.info(this,"Container:: containerID: "+this._containerID),e.info(this,"Container:: monoColor: "+this._consoleMonoColor)}}}h.PRINT_ON_STARTUP=!0;class l{constructor(e){this._startVolume=100,this._isMuted=!1,this.parse(e)}parse(e){this._audioConfig=e,this._audioConfig&&(this._startVolume=null!=(e=null==(e=this._audioConfig)?void 0:e.startVolume)?e:this._startVolume,this._isMuted=null!=(e=null==(e=this._audioConfig)?void 0:e.muted)?e:this._isMuted)}get startVolume(){return this._startVolume}set startVolume(e){this._startVolume=e}get muted(){return this._isMuted}set muted(e){this._isMuted=e}print(e,t=!1){(l.PRINT_ON_STARTUP||t)&&e.info(this,"Audio :: startVolume: "+this._startVolume+" | isMuted: "+this._isMuted)}}l.PRINT_ON_STARTUP=!0;class c{constructor(e){this._enabled=!0,this._prefix="storm",this.parse(e)}parse(e){this._storageConfig=e,this._enabled=null!=(e=null==(e=this._storageConfig)?void 0:e.enabled)?e:this._enabled,this._prefix=null!=(e=null==(e=this._storageConfig)?void 0:e.prefix)?e:this._prefix}get enabled(){return this._enabled}set enabled(e){this._enabled=e}get prefix(){return this._prefix}set prefix(e){this._prefix=e}print(e,t=!1){(c.PRINT_ON_STARTUP||t)&&e.info(this,"Storage :: startVolume: "+this._enabled+" | prefix: "+this._prefix)}}c.PRINT_ON_STARTUP=!0;class d{constructor(e){this._restartOnError=!0,this._reconnectTime=1,this._autoStart=!1,this._autoConnect=!0,this.startOnDOMReady=!1,this.iOSOnDomReadyFix=!0,this._restartOnFocus=!0,this.parse(e)}parse(e){this._settingsConfig=e,this._autoConnect=null!=(e=this._settingsConfig.autoConnect)?e:this._autoConnect,this._autoStart=null!=(e=this._settingsConfig.autoStart)?e:this._autoStart,this._restartOnFocus=null!=(e=this._settingsConfig.restartOnFocus)?e:this._restartOnFocus,this._restartOnError=null!=(e=this._settingsConfig.restartOnError)?e:this._restartOnError,this._reconnectTime=null!=(e=this._settingsConfig.reconnectTime)?e:this._reconnectTime,this._videoData=new t(null!=(e=this._settingsConfig.video)?e:null),this._audioData=new l(null!=(e=this._settingsConfig.audio)?e:null),this._storageData=new c(null!=(e=this._settingsConfig.storage)?e:null),this._debugData=new h(null!=(e=this._settingsConfig.debug)?e:null)}getAudioData(){return this._audioData}getVideoData(){return this._videoData}getStorageData(){return this._storageData}getIfRestartOnError(){return this._restartOnError}getReconnectTime(){return this._reconnectTime}get autoStart(){return this._autoStart}set autoStart(e){this._autoStart=e}get autoConnect(){return this._autoConnect}get restartOnFocus(){return this._restartOnFocus}getDebugData(){return this._debugData}getIfStartOnDOMReadyEnabled(){return this.startOnDOMReady}getIfIOSOnDomStartFixEnabled(){return this.iOSOnDomReadyFix}print(e,t=!1){(d.PRINT_ON_STARTUP||t)&&(e.info(this,"SettingsConfig :: autoConnect: "+this._autoConnect),e.info(this,"SettingsConfig :: autoStart: "+this._autoStart),e.info(this,"SettingsConfig :: restartOnError: "+this._restartOnError),e.info(this,"SettingsConfig :: reconnectTime: "+this._reconnectTime),e.info(this,"SettingsConfig :: enabledProtocols: "),this._videoData.print(e),this._audioData.print(e),this._debugData.print(e),this._debugData.print(e))}}d.PRINT_ON_STARTUP=!0;class g{constructor(e){this.PRINT_ON_STARTUP=!0,this.demoMode=!1,this.parse(e)}parse(e){if(this.configTemplate=e,null==this.configTemplate.stream)throw new Error("No stream field was provided. Please check your player config!");this.streamData=new a(this.configTemplate.stream),this.settingsData=new d(null!=(e=this.configTemplate.settings)?e:null),this.demoMode=null!=(e=this.configTemplate.demoMode)&&e}getStreamData(){return this.streamData}getSettingsData(){return this.settingsData}getIfDemoMode(){return this.demoMode}print(e,t=!1){(this.PRINT_ON_STARTUP||t)&&(this.streamData.print(e),this.settingsData.print(e))}}class u{static addLeadingZero(e){return e<10?"0"+e:String(e)}static isNear(e,t,i){return Math.abs(e-t)<=i}static generateUniqueString(t){let i="";var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",s=n.length;for(let e=0;e<t;e++)i+=n.charAt(Math.floor(Math.random()*s));return i}}u.parseValue=e=>{var t;return"string"==typeof e?(t=e.toLowerCase().endsWith("px"),{value:parseInt(e,10),isPixels:t}):{value:e,isPixels:!0}};class _{constructor(e,t){this.colorOrder=["red","green","blue","orange","black","violet"],this._logMemory=[],this._streamerInstanceID=-1,this._debugConfig=e,this._stormStreamer=t,this._streamerInstanceID=this._stormStreamer.getStreamerID();e=this.colorOrder.length<t.getStreamerID()?this.colorOrder.length-1:t.getStreamerID();this._monoColor=this.colorOrder[e]}info(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.INFO)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.INFO_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.INFO)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.INFO_COLOR,this.writeToContainer(e,t))}warning(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.WARNING)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.WARNING_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.WARNING)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.WARNING_COLOR,this.writeToContainer(e,t))}error(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.ERROR)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.ERROR_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.ERROR)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.ERROR_COLOR,this.writeToContainer(e,t))}success(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.SUCCESS)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.SUCCESS_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.SUCCESS)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.SUCCESS_COLOR,this.writeToContainer(e,t))}trace(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.TRACE)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.TRACE_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.TRACE)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.TRACE_COLOR,this.writeToContainer(e,t))}logData(e,t){var i=new Date,n=u.addLeadingZero(i.getHours()),s=u.addLeadingZero(i.getMinutes()),i=u.addLeadingZero(i.getSeconds());let o=String(this._streamerInstanceID);0<=this._streamerInstanceID&&(o+="|"+this._streamerInstanceID);n="[Storm-ID:"+o+"] ["+n+":"+s+":"+i+"] :: "+t;return this._logMemory.push(n),n}writeToContainer(e,t){var i,n=this._debugConfig.containerID;n&&(n=document.getElementById(n),(i=document.createElement("span")).innerText=e,i.style.color=t,n.appendChild(i))}setPlayerID(e){this._streamerInstanceID=e}getAllLogs(){return this._logMemory}}_.INFO_COLOR="blue",_.WARNING_COLOR="orange",_.ERROR_COLOR="red",_.SUCCESS_COLOR="green",_.TRACE_COLOR="black";class e{constructor(){this.bandwidthCapabilities=0}setBandwidthCapabilities(e){this.bandwidthCapabilities=e}getBandwidthCapabilities(){return this.bandwidthCapabilities}}class m{static hasWebSocketsSupport(){return null!=window.WebSocket}static isMobile(){return new RegExp("Mobile|mini|Fennec|Android|iP(ad|od|hone)").test(navigator.userAgent)}static isCookieEnabled(){let e=!!navigator.cookieEnabled;return"undefined"!=typeof navigator.cookieEnabled||e||(document.cookie="testcookie",e=-1!=document.cookie.indexOf("testcookie")),e}static getOSVersion(){let e="Unknown version",t=m.getOS();if(null!=t){var i;switch(new RegExp("Windows").test(t)&&(i=new RegExp("Windows (.*)"),e=null!=i.exec(t)[1]?i.exec(t)[1]:e,t="Windows"),t){case"Mac OS":case"Mac OS X":case"Android":var n=new RegExp("(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\\.\\_\\d]+)");e=n.exec(navigator.userAgent)[1];break;case"iOS":n=new RegExp("OS (\\d+)_(\\d+)_?(\\d+)?");e=(e=n.exec(navigator.userAgent))[1]+"."+e[2]+"."+(0|e[3])}}return e}static getBrowserName(){return m.getFullBrowser().name}static getBrowserVersion(){return m.getFullBrowser().version}static getFullBrowser(){var e=navigator.userAgent;let t=navigator.appName,i=""+parseFloat(navigator.appVersion),n=parseInt(navigator.appVersion,10),s,o,r;return-1!=(o=e.indexOf("Opera"))?(t="Opera",i=e.substring(o+6),-1!=(o=e.indexOf("Version"))&&(i=e.substring(o+8))):-1!=(o=e.indexOf("MSIE"))?(t="Microsoft Internet Explorer",i=e.substring(o+5)):"Netscape"==t&&-1!=e.indexOf("Trident/")?(t="Microsoft Internet Explorer",i=e.substring(o+5),-1!=(o=e.indexOf("rv:"))&&(i=e.substring(o+3))):-1!=(o=e.indexOf("Chrome"))?(t="Chrome",(-1<e.indexOf("FBAV")||-1<e.indexOf("FBAN"))&&(t="Facebook"),-1<e.indexOf("OPR")&&(t="Opera"),-1<e.indexOf("SamsungBrowser")&&(t="Samsung"),i=e.substring(o+7)):-1!=(o=e.indexOf("Safari"))?(t="Safari",i=e.substring(o+7),-1!=(o=e.indexOf("Version"))&&(i=e.substring(o+8)),-1!=e.indexOf("CriOS")&&(t="Chrome"),-1!=e.indexOf("FxiOS")&&(t="Firefox")):-1!=(o=e.indexOf("Firefox"))?(t="Firefox",i=e.substring(o+8)):(s=e.lastIndexOf(" ")+1)<(o=e.lastIndexOf("/"))&&(t=e.substring(s,o),i=e.substring(o+1),t.toLowerCase()==t.toUpperCase())&&(t=navigator.appName),-1!=(r=(i=-1!=(r=(i=-1!=(r=i.indexOf(";"))?i.substring(0,r):i).indexOf(" "))?i.substring(0,r):i).indexOf(")"))&&(i=i.substring(0,r)),n=parseInt(""+i,10),isNaN(n)&&(i=""+parseFloat(navigator.appVersion),n=parseInt(navigator.appVersion,10)),{name:t,fullVersion:i,version:n}}static getOS(){let e="Unknown OS";var t,i=[{os:"Windows 10",code:"(Windows 10.0|Windows NT 10.0)"},{os:"Windows 8.1",code:"(Windows 8.1|Windows NT 6.3)"},{os:"Windows 8",code:"(Windows 8|Windows NT 6.2)"},{os:"Windows 7",code:"(Windows 7|Windows NT 6.1)"},{os:"Windows Vista",code:"Windows NT 6.0"},{os:"Windows Server 2003",code:"Windows NT 5.2"},{os:"Windows XP",code:"(Windows NT 5.1|Windows XP)"},{os:"Windows 2000",code:"(Windows NT 5.0|Windows 2000)"},{os:"Windows ME",code:"(Win 9x 4.90|Windows ME)"},{os:"Windows 98",code:"(Windows 98|Win98)"},{os:"Windows 95",code:"(Windows 95|Win95|Windows_95)"},{os:"Windows NT 4.0",code:"(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)"},{os:"Windows CE",code:"Windows CE"},{os:"Windows 3.11",code:"Win16"},{os:"Android",code:"Android"},{os:"Open BSD",code:"OpenBSD"},{os:"Sun OS",code:"SunOS"},{os:"Chrome OS",code:"CrOS"},{os:"Linux",code:"(Linux|X11(?!.*CrOS))"},{os:"iOS",code:"(iPhone|iPad|iPod)"},{os:"Mac OS X",code:"Mac OS X"},{os:"Mac OS",code:"(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)"},{os:"QNX",code:"QNX"},{os:"UNIX",code:"UNIX"},{os:"BeOS",code:"BeOS"},{os:"OS/2",code:"OS\\/2"},{os:"Search Bot",code:"(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\\/Teoma|ia_archiver)"}];for(t in i){var n=i[t];if(new RegExp(n.code).test(navigator.userAgent)){e=n.os;break}}return e}static hasWebRTCSupport(){let t=!1;try{navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia||window.RTCPeerConnection;t=!0}catch(e){t=!1}return t}static hasHLSSupport(e){return null!==e&&Boolean(e.canPlayType("application/vnd.apple.mpegURL")||e.canPlayType("audio/mpegurl"))}static hasMSESupport(){var e=window.MediaSource=window.MediaSource||window.WebKitMediaSource;return window.SourceBuffer=window.SourceBuffer||window.WebKitSourceBuffer,e&&"function"==typeof e.isTypeSupported}static hasMMSSupport(){return window.ManagedMediaSource}static isSSL(){return"https:"===location.protocol}}class p{constructor(e){var t;this.LOG_ACTIVITY=!1,this.isEnabled=!0,this.prefix="",this.logger=e.getLogger(),this.isEnabled=null!=(t=null==(t=null==(t=e.getConfigManager())?void 0:t.getSettingsData())?void 0:t.getStorageData().enabled)?t:this.isEnabled,this.prefix=null!=(t=null==(e=null==(t=e.getConfigManager())?void 0:t.getSettingsData())?void 0:e.getStorageData().prefix)?t:this.prefix,this.LOG_ACTIVITY&&this.logger.info(this,"Creating new StorageManager")}saveField(e,t){1==this.isEnabled&&(this.LOG_ACTIVITY&&this.logger.info(this,"Saving data: "+e+" | "+t),localStorage.setItem(this.prefix+e,t))}getField(e){var t;return 1==this.isEnabled?(t=localStorage.getItem(this.prefix+e),this.LOG_ACTIVITY&&this.logger.info(this,"Grabbing data: "+e+" | "+t),t):null}}var C="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function v(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function f(){return V.Date.now()}var S=NaN,b="[object Symbol]",E=/^\s+|\s+$/g,w=/^[-+]0x[0-9a-f]+$/i,L=/^0b[01]+$/i,x=/^0o[0-7]+$/i,A=parseInt,C="object"==typeof C&&C&&C.Object===Object&&C,I="object"==typeof self&&self&&self.Object===Object&&self,V=C||I||Function("return this")(),F=Object.prototype.toString,U=Math.max,B=Math.min;function M(e){var t=typeof e;return e&&("object"==t||"function"==t)}function T(e){if("number"==typeof e)return e;if("symbol"==typeof(i=e)||!!(t=i)&&"object"==typeof t&&F.call(i)==b)return S;var t;if("string"!=typeof(e=M(e)?M(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(E,"");var i=L.test(e);return i||x.test(e)?A(e.slice(2),i?2:8):w.test(e)?S:+e}var D,O,z=v(function(n,i,e){var s,o,r,a,h,l,c=0,d=!1,g=!1,t=!0;if("function"!=typeof n)throw new TypeError("Expected a function");function u(e){var t=s,i=o;return s=o=void 0,c=e,a=n.apply(i,t)}function _(e){var t=e-l;return void 0===l||i<=t||t<0||g&&r<=e-c}function m(){var e,t=f();if(_(t))return p(t);h=setTimeout(m,(e=i-((t=t)-l),g?B(e,r-(t-c)):e))}function p(e){return h=void 0,t&&s?u(e):(s=o=void 0,a)}function C(){var e=f(),t=_(e);if(s=arguments,o=this,l=e,t){if(void 0===h)return c=e=l,h=setTimeout(m,i),d?u(e):a;if(g)return h=setTimeout(m,i),u(l)}return void 0===h&&(h=setTimeout(m,i)),a}return i=T(i)||0,M(e)&&(d=!!e.leading,g="maxWait"in e,r=g?U(T(e.maxWait)||0,i):r,t="trailing"in e?!!e.trailing:t),C.cancel=function(){void 0!==h&&clearTimeout(h),s=l=o=h=void(c=0)},C.flush=function(){return void 0===h?a:p(f())},C});class H{constructor(e){this.LOG_ACTIVITY=!0,this._volume=100,this._isMuted=!1,this._isMutedByBrowser=!1,this.onForceMute=()=>{this._isMuted=!0,this._isMutedByBrowser=!0,this.dispatchVolumeEvent()},this._main=e,this._logger=e.getLogger(),this._videoElement=document.createElement("video"),this._main.addEventListener("playbackForceMute",this.onForceMute,!1);let t=null!=(e=null==(e=this._main.getConfigManager())?void 0:e.getSettingsData().getAudioData().startVolume)?e:100,i=null!=(e=null==(e=this._main.getConfigManager())?void 0:e.getSettingsData().getAudioData().muted)&&e;null!=(null==(e=this._main.getStorageManager())?void 0:e.getField("volume"))&&(t=Number(this._main.getStorageManager().getField("volume"))),null!=(null==(e=this._main.getStorageManager())?void 0:e.getField("muted"))&&"true"==this._main.getStorageManager().getField("muted")&&(i=!0,this._isMutedByBrowser=!0),this._volume=t,this._isMuted=i,this.LOG_ACTIVITY&&this._logger.info(this,"VideoElement :: Start Volume: "+this._volume+" | Muted: "+this._isMuted),this._videoElement.volume=this._volume/100,this._videoElement.muted=this._isMuted,this._videoElement.setAttribute("playsinline","playsinline"),this._videoElement.setAttribute("webkit-playsinline","webkit-playsinline"),this._main.dispatchEvent("videoElementCreate",{ref:this._main,videoElement:this._videoElement}),this.initialize()}initialize(){this._videoElement.onload=function(e){},this._videoElement.onstalled=e=>{this._logger.info(this,"VideoElement :: onstalled")},this._videoElement.onerror=e=>{this._logger.info(this,"VideoElement :: onerror :: "+JSON.stringify(e))},this._videoElement.onvolumechange=()=>{this.dispatchVolumeEvent()},this._videoElement.onpause=()=>{},this._videoElement.addEventListener("loadedmetadata",()=>{this._main.dispatchEvent("metadata",{ref:this._main,videoWidth:this._videoElement.videoWidth,videoHeight:this._videoElement.videoHeight})}),this._videoElement.ontimeupdate=function(e){},this._videoElement.onended=e=>{this._logger.info(this,"VideoElement :: onended")},this._videoElement.onplay=()=>{}}setVolume(e){this._isMuted&&0<e&&this.setMuted(!1),this._volume=e,this._videoElement.volume=e/100,this._main.getStorageManager().saveField("volume",String(e)),0==e&&this.setMuted(!0)}getVolume(){return this._volume}setMuted(e){this._isMuted=e,this._videoElement.muted=e,this._isMutedByBrowser=!1,this._main.getStorageManager().saveField("muted",String(e)),0!=this.getVolume()||e||this.setVolume(100)}getIfMuted(){return this._isMuted}dispatchVolumeEvent(){var e=this._isMutedByBrowser?"browser":"user",t={volume:this._volume,isMuted:this._isMuted,type:e};this.LOG_ACTIVITY&&this._logger.info(this,"ScreenElement :: Event: onVolumeChange: "+JSON.stringify(t)),this._main.dispatchEvent("volumeChange",{ref:this._main,volume:this._volume,muted:this._isMuted,invokedBy:e})}getVideoElement(){return this._videoElement}}class y{constructor(e){this._containerWidth=0,this._tempContainerWidth=0,this._containerHeight=0,this._tempContainerHeight=0,this._videoWidth=0,this._videoHeight=0,this._scalingMode=s.FILL,this.isInFullScreenMode=!1,this._isResizing=!1,this._autoResizeEnabled=!0,this._parentOriginalOverflow="",this.onFullScreenChange=()=>{null==document.fullscreenElement?(this.isInFullScreenMode=!1,this._logger.info(this,"The library has exited FullScreen mode!"),this._main.dispatchEvent("fullScreenExit",{ref:this._main})):(this.isInFullScreenMode=!0,this._logger.info(this,"The library has entered FullScreen mode!"),this._main.dispatchEvent("fullScreenEnter",{ref:this._main}))},this._main=e,this._logger=e.getLogger(),this._logger.info(this,"Creating new StageController"),this.initialize()}initialize(){var e=null!=(e=null==(e=null==(e=null==(e=this._main.getConfigManager())?void 0:e.getSettingsData())?void 0:e.getVideoData())?void 0:e.containerID)?e:null,t=(this._scalingMode=null!=(t=null==(t=this._main.getConfigManager())?void 0:t.getSettingsData().getVideoData().scalingMode)?t:s.FILL,this._videoContainer=document.createElement("div"),this._videoContainer.setAttribute("id","stormStreamer_"+this._main.getStreamerID()),this._videoContainer.style.overflow="hidden",this._videoContainer.style.position="relative",this._videoContainer.classList.add("stormStreamer"),this._screenElement=new H(this._main),this._videoContainer.appendChild(this._screenElement.getVideoElement()),this._main.getConfigManager().getSettingsData().getVideoData().resizeDebounce);this._resizeObserver=0<t?new ResizeObserver(z(()=>()=>{this._autoResizeEnabled&&this.handleResize()},t,{leading:!1,trailing:!0})):new ResizeObserver(()=>{this._autoResizeEnabled&&this.handleResize()}),document.addEventListener("fullscreenchange",this.onFullScreenChange,!1),document.addEventListener("webkitfullscreenchange",this.onFullScreenChange,!1),document.addEventListener("mozfullscreenchange",this.onFullScreenChange,!1),document.addEventListener("webkitendfullscreen",this.onFullScreenChange,!1),this._screenElement.getVideoElement().addEventListener("webkitendfullscreen",this.onFullScreenChange,!1),this._main.addEventListener("metadata",e=>{this._videoWidth=e.videoWidth,this._videoHeight=e.videoHeight,this.handleResize()},!1),e?this.attachToParent(e):this._logger.warning(this,'Could not create HTMLObject for the library - "containerID" was not provided')}attachToParent(e){let t=!1,i=null;return"string"==typeof e?(this._logger.info(this,"Attaching container to ID: "+e),i=document.getElementById(e),console.log(">>",document.getElementById(e))):e instanceof HTMLElement&&(this._logger.info(this,"Attaching container to HTMLElement: "+e),i=e),i===this._parentElement?(this._logger.warning(this,"attachToParent :: container is the same"),!1):(i&&this._videoContainer?(this._parentElement=i,this._parentElement.appendChild(this._videoContainer),this._resizeObserver.observe(this._parentElement),this._parentElement.addEventListener("transitionend",()=>{this.handleResize()}),this._main.dispatchEvent("containerChange",{ref:this._main,container:this._parentElement}),this.handleResize(),t=!0):(console.log("tempParentElement",i),console.log("this._videoContainer",this._videoContainer),this._logger.warning(this,"attachToParent :: container was not found")),t)}detachFromParent(){let e=!1;return null!=this._parentElement&&null!=this._videoContainer?(this._logger.info(this,"Detaching from parent: "+this._videoContainer),this._parentElement.removeChild(this._videoContainer),this._resizeObserver&&(this._resizeObserver.unobserve(this._parentElement),this._resizeObserver.disconnect()),this._autoResizeEnabled&&this._parentElement.removeEventListener("transitionend",this.handleResize),this._main.dispatchEvent("containerChange",{ref:this._main,container:null}),e=!0):this._logger.info(this,"Failed detaching from parent!"),this._parentElement=null,e}handleResize(){this._parentElement&&!this._isResizing&&(this._isResizing=!0,this._parentOriginalOverflow=this._parentElement.style.overflow,this._parentElement.style.overflow="hidden",requestAnimationFrame(()=>{this.calculateNewDimensions(),this._parentElement.style.overflow=this._parentOriginalOverflow,this._isResizing=!1,this._tempContainerWidth===this._containerWidth&&this._tempContainerHeight===this._containerHeight||this._main.dispatchEvent("resizeUpdate",{ref:this._main,width:this._tempContainerWidth,height:this._tempContainerHeight})}))}calculateNewDimensions(){var e=this._main.getConfigManager().getSettingsData().getVideoData().parentSizeCalculationMethod;switch(e){case i.CLIENT_DIMENSIONS:this._tempContainerWidth=this._parentElement.clientWidth,this._tempContainerHeight=this._parentElement.clientHeight;break;case i.BOUNDING_BOX:var t=this._parentElement.getBoundingClientRect();this._tempContainerWidth=t.width,this._tempContainerHeight=t.height;break;case i.FULL_BOX:t=class{static calculateDimensionsWithMargins(e){var t=window.getComputedStyle(e),e=e.getBoundingClientRect(),i=parseFloat(t.paddingLeft),n=parseFloat(t.paddingRight),s=parseFloat(t.paddingTop),o=parseFloat(t.paddingBottom),r=parseFloat(t.borderLeftWidth),a=parseFloat(t.borderRightWidth),h=parseFloat(t.borderTopWidth),t=parseFloat(t.borderBottomWidth);return{width:e.width-i-n-r-a,height:e.height-s-o-h-t}}}.calculateDimensionsWithMargins(this._parentElement);this._tempContainerWidth=t.width,this._tempContainerHeight=t.height}this._logger.info(this,`New dimensions calculated: ${this._tempContainerWidth}x${this._tempContainerHeight} (${e})`),this.resizeVideoContainer(),this.scaleVideo()}resizeVideoContainer(){var e=this._main.getConfigManager().getSettingsData().getVideoData().videoWidthInPixels,t=this._main.getConfigManager().getSettingsData().getVideoData().videoHeightInPixels,i=this._main.getConfigManager().getSettingsData().getVideoData().videoWidthValue,n=this._main.getConfigManager().getSettingsData().getVideoData().videoHeightValue,s=this._main.getConfigManager().getSettingsData().getVideoData().aspectRatio;let o=0,r=0;var a=Number(s.split(":")[0]),h=Number(s.split(":")[1]);"none"==s?(e?o=i:null!=this._parentElement&&(o=this._tempContainerWidth*i/100),t?r=n:null!=this._parentElement&&0==(r=this._tempContainerHeight*n/100)&&0!=this._videoHeight&&0!=this._videoWidth&&(r=this._videoHeight*o/this._videoWidth)):(e?o=i:null!=this._parentElement&&(o=this._tempContainerWidth*i/100),r=o*h/a),this._containerWidth=Math.ceil(o),this._containerHeight=Math.ceil(r),null!==this._videoContainer&&(this._videoContainer.style.width=this._containerWidth+"px",this._videoContainer.style.height=this._containerHeight+"px")}scaleVideo(){if(null!==this._screenElement){let e=0,t=0,i=0,n=0;switch(this._scalingMode){case s.FILL:i=this._containerWidth,n=this._containerHeight;break;case s.CROP:i=this._containerWidth,(n=this._videoHeight*this._containerWidth/this._videoWidth)>=this._containerHeight?(e=0,t=(n-this._containerHeight)/2*-1):(n=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case s.LETTER_BOX:i=this._containerWidth,(!((n=this._videoHeight*this._containerWidth/this._videoWidth)<=this._containerHeight)||(e=0,t=(n-this._containerHeight)/2*-1,n>this._containerHeight))&&(n=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case s.ORIGINAL:i=this._videoWidth,n=this._videoHeight,e=(this._videoWidth-this._containerWidth)/-2,t=(this._videoHeight-this._containerHeight)/-2}this._screenElement.getVideoElement().style.left=Math.floor(e)+"px",this._screenElement.getVideoElement().style.top=Math.floor(t)+"px",this._screenElement.getVideoElement().style.width=Math.ceil(i)+"px",this._screenElement.getVideoElement().style.height=Math.ceil(n)+"px",this._screenElement.getVideoElement().style.position="absolute",this._screenElement.getVideoElement().style.objectFit="fill"}}enterFullScreen(){var e;null!=(e=this._screenElement)&&e.getVideoElement().webkitEnterFullScreen?null!=(e=this._screenElement)&&e.getVideoElement().webkitEnterFullScreen():null!=(e=this._screenElement)&&e.getVideoElement().requestFullscreen()}exitFullScreen(){var e;null!=(e=this._screenElement)&&e.getVideoElement().webkitExitFullscreen?document.webkitExitFullscreen():document.exitFullscreen()}isFullScreenMode(){return this.isInFullScreenMode}setDimension(e,t){var i="width"===e?"videoWidth":"videoHeight";let n,s;if("number"==typeof t)s=t,n=!0;else{if("string"!=typeof t)throw new Error(`Unknown value for parameter "${e}" - it must be a number or a string!`);s=parseInt(t),n=t.toLowerCase().endsWith("px")}this._main.getConfigManager().getSettingsData().getVideoData()[i+"Value"]=s,this._main.getConfigManager().getSettingsData().getVideoData()[i+"InPixels"]=n,this.resizeVideoContainer(),this.scaleVideo()}setSize(e,t){this.setDimension("width",e),this.setDimension("height",t)}setWidth(e){this.setDimension("width",e)}setHeight(e){this.setDimension("height",e)}getParentElement(){return this._parentElement}setScalingMode(e){switch(e.toLowerCase()){case"fill":this._scalingMode=s.FILL;break;case"crop":this._scalingMode=s.CROP;break;case"letterbox":this._scalingMode=s.LETTER_BOX;break;case"original":this._scalingMode=s.ORIGINAL}this.scaleVideo()}getContainerWidth(){return this._containerWidth}getContainerHeight(){return this._containerHeight}getScalingModeAsString(){let e="";switch(this._scalingMode){case s.FILL:e="fill";break;case s.CROP:e="crop";break;case s.LETTER_BOX:e="letterbox";break;case s.ORIGINAL:e="original"}return e}getScalingMode(){return this._scalingMode}getScreenElement(){return this._screenElement}getContainer(){return this._videoContainer}destroy(){this.detachFromParent()}}function R(e,r,a,h){return new(a=a||Promise)(function(i,t){function n(e){try{o(h.next(e))}catch(e){t(e)}}function s(e){try{o(h.throw(e))}catch(e){t(e)}}function o(e){var t;e.done?i(e.value):((t=e.value)instanceof a?t:new a(function(e){e(t)})).then(n,s)}o((h=h.apply(e,r||[])).next())})}y.LOG_ACTIVITY=!0,"function"==typeof SuppressedError&&SuppressedError;class N{constructor(){}addAudio(e,t){let i="",n="",s=!1;for(const o of e.split(/\r\n/))o.length<=0||(0===o.indexOf("m=audio")?i="audio":0===o.indexOf("m=video")&&(i="video"),n=n+o+"\r\n","audio"!==i)||0!=="a=rtcp-mux".localeCompare(o)||s||(n+=t,s=!0);return n}addVideo(e,t){e=e.split(/\r\n/);let i="",n=!1,s=!1;for(const r of e)r.length<=0||(r.includes("a=rtcp-rsize")&&(s=!0),r.includes("a=rtcp-mux"));let o=!1;for(const a of e)a.startsWith("m=video")&&(o=!0),i=i+a+"\r\n",o&&(0==="a=rtcp-rsize".localeCompare(a)&&!n&&s&&(i+=t,n=!0),0==="a=rtcp-mux".localeCompare(a)&&n&&!s&&(i+=t,n=!0),0!=="a=rtcp-mux".localeCompare(a)||n||s||(n=!0));return i}deliverCheckLine(e,t){for(const n in N.SDPOutput){var i=N.SDPOutput[n];if(i.includes(e)){if(e.includes("VP9")||e.includes("VP8")){let e="";for(const s of i.split(/\r\n/))e=e+s+"\r\n";return t.includes("audio")&&(N.audioIndex=parseInt(n)),t.includes("video")&&(N.videoIndex=parseInt(n)),e}return t.includes("audio")&&(N.audioIndex=parseInt(n)),t.includes("video")&&(N.videoIndex=parseInt(n)),i}}return""}checkLine(t){if(t.startsWith("a=rtpmap")||t.startsWith("a=rtcp-fb")||t.startsWith("a=fmtp")){var i=t.split(":");if(1<i.length){i=i[1].split(" ");if(!isNaN(parseInt(i[0]))&&!i[1].startsWith("http")&&!i[1].startsWith("ur")){let e=N.SDPOutput[i[0]];return e=e||"",e+=t+"\r\n",N.SDPOutput[i[0]]=e,!1}}}return!0}getrtpMapID(e){var t=new RegExp("a=rtpmap:(\\d+) (\\w+)/(\\d+)"),e=e.match(t);return e&&3<=e.length?e:null}mungeSDPPublish(e,t){N.SDPOutput={},N.videoChoice="42e01f",N.audioChoice="opus",N.videoIndex=-1,N.audioIndex=-1;e=e.split(/\r\n/);let i="header",n=!1,s="";null!=t.videoCodec&&""!==t.videoCodec&&(N.videoChoice=t.videoCodec),null!=t.audioCodec&&""!==t.audioCodec&&(N.audioChoice=t.audioCodec);for(const a of e)a.length<=0||this.checkLine(a)&&(s=s+a+"\r\n");s=this.addAudio(s,this.deliverCheckLine(N.audioChoice,"audio"));var o,r,e=(s=this.addVideo(s,this.deliverCheckLine(N.videoChoice,"video"))).split(/\r\n/);s="";for(const h of e)if(!(h.length<=0)){let e;if(0===h.indexOf("m=audio")&&-1!==N.audioIndex)e=h.split(" "),s+=e[0]+" "+e[1]+" "+e[2]+" "+N.audioIndex+"\r\n",i="audio",n=!1;else if(0===h.indexOf("m=video")&&-1!==N.videoIndex)e=h.split(" "),s+=e[0]+" "+e[1]+" "+e[2]+" "+N.videoIndex+"\r\n",i="video",n=!1;else{if(s+=h,0===h.indexOf("a=rtpmap")&&(i="bandwidth",n=!1),"chrome"!==m.getBrowserName().toLowerCase()&&"safari"!==m.getBrowserName().toLowerCase()||0!==h.indexOf("a=mid:")&&0!==h.indexOf("a=rtpmap")||n||(0==="audio".localeCompare(i)?(void 0!==t.audioBitrate&&""!==t.audioBitrate&&(s=(s+="\r\nb=CT:"+t.audioBitrate)+"\r\nb=AS:"+t.audioBitrate),n=!0):0==="video".localeCompare(i)?(void 0!==t.videoBitrate&&""!==t.videoBitrate&&(s=(s+="\r\nb=CT:"+t.videoBitrate)+"\r\nb=AS:"+t.videoBitrate,void 0!==t.videoFrameRate)&&(s+="\r\na=framerate:"+t.videoFrameRate),n=!0):"chrome"===m.getBrowserName().toLowerCase()&&0==="bandwidth".localeCompare(i)&&null!==(r=this.getrtpMapID(h))&&(o=r[2].toLowerCase(),0!=="vp9".localeCompare(o)&&0!=="vp8".localeCompare(o)&&0!=="h264".localeCompare(o)&&0!=="red".localeCompare(o)&&0!=="ulpfec".localeCompare(o)&&0!=="rtx".localeCompare(o)||void 0!==t.videoBitrate&&(s+="\r\na=fmtp:"+r[1]+" x-google-min-bitrate="+t.videoBitrate+";x-google-max-bitrate="+t.videoBitrate),0!=="opus".localeCompare(o)&&0!=="isac".localeCompare(o)&&0!=="g722".localeCompare(o)&&0!=="pcmu".localeCompare(o)&&0!=="pcma".localeCompare(o)&&0!=="cn".localeCompare(o)||void 0!==t.audioBitrate&&(s+="\r\na=fmtp:"+r[1]+" x-google-min-bitrate="+t.audioBitrate+";x-google-max-bitrate="+t.audioBitrate))),"firefox"===m.getBrowserName().toLowerCase()&&0===h.indexOf("c=IN")){if(0==="audio".localeCompare(i)){""!==t.audioBitrate&&"string"==typeof t.audioBitrate&&(o=parseInt(t.audioBitrate),s=(s+="\r\nb=TIAS:"+(1e3*o*.95-16e3)+"\r\n")+"b=AS:"+o+"\r\nb=CT:"+o+"\r\n");continue}if(0==="video".localeCompare(i)){""!==t.videoBitrate&&"string"==typeof t.videoBitrate&&(r=parseInt(t.videoBitrate),s=(s+="\r\nb=TIAS:"+1e3*(1e3*r*.95-16e3)+"\r\n")+"b=AS:"+r+"\r\nb=CT:"+r+"\r\n");continue}}s+="\r\n"}}return s}mungeSDPPlay(e){let n="";for(const r of e.split(/\r\n/))if(0!==r.length){if(r.includes("profile-level-id")){var s=r.substr(r.indexOf("profile-level-id")+17,6);let e=Number("0x"+s.substr(0,2)),t=Number("0x"+s.substr(2,2)),i=Number("0x"+s.substr(4,2));66<e&&(e=66,t=224,i=31),0===t&&(t=224);var o=("00"+e.toString(16)).slice(-2).toLowerCase()+("00"+t.toString(16)).slice(-2).toLowerCase()+("00"+i.toString(16)).slice(-2).toLowerCase();n+=r.replace(s,o)}else n+=r;n+="\r\n"}return n}}N.SDPOutput={},(C=D=D||{})[C.VIDEO_INPUT=0]="VIDEO_INPUT",C[C.AUDIO_INPUT=1]="AUDIO_INPUT";class k{constructor(e,t){if(this._groupID="",this._isSelected=!1,null==e)throw new Error("no input device");if(void 0===e.deviceId||null===e.deviceId)throw new Error("no deviceID");if(this._id=e.deviceId,void 0===e.kind||null===e.kind)throw new Error("no device kind");switch(e.kind){case"videoinput":this._inputType=D.VIDEO_INPUT;break;case"audioinput":this._inputType=D.AUDIO_INPUT;break;default:throw new Error("incorrect kind")}null!==e.label&&""!==e.label?this._label=this.cleanLabel(e.label):this._label=this._inputType==D.VIDEO_INPUT?"Camera "+t:"Microphone "+t,void 0!==e.groupId&&null!==e.groupId&&(this._groupID=e.groupId)}cleanLabel(e){return e}getLabel(){return this._label}getID(){return this._id}getGroupID(){return this._groupID}getIfSelected(){return this._isSelected}setSelected(e){this._isSelected=e}}class W{constructor(){this._internalList=new Array}push(t){let i=!1;if(0<this._internalList.length){for(let e=0;e<this._internalList.length;e++)""!==this._internalList[e].getGroupID()&&this._internalList[e].getGroupID()==t.getGroupID()&&(i=!0,this._internalList[e]=t);return 0==i?this._internalList.push(t):this._internalList.length}return this._internalList.push(t)}get(e){return this._internalList[e]}getSize(){return this._internalList.length}getArray(){return this._internalList}}o.PublishState=void 0,(I=o.PublishState||(o.PublishState={})).NOT_INITIALIZED="NOT_INITIALIZED",I.INITIALIZED="INITIALIZED",I.CONNECTING="CONNECTING",I.PUBLISHED="PUBLISHED",I.UNPUBLISHED="UNPUBLISHED",I.STOPPED="STOPPED",I.UNKNOWN="UNKNOWN",I.ERROR="ERROR";class G{constructor(e){this._stream=null,this._audioContext=null,this._analyser=null,this._microphone=null,this._lastEventTime=0,this.THROTTLE_INTERVAL=100,this._instant=0,this._slow=0,this._clip=0,this._main=e}attach(e){this._stream=e,this._audioContext=new AudioContext,this._microphone=this._audioContext.createMediaStreamSource(e),this._analyser=this._audioContext.createAnalyser(),this._analyser.fftSize=2048,this._analyser.smoothingTimeConstant=.3,this._microphone.connect(this._analyser),this.startMonitoring()}detach(){this._microphone&&(this._microphone.disconnect(),this._microphone=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null),this._audioContext&&(this._audioContext.close(),this._audioContext=null),this._stream=null,this.clear()}clear(){this._instant=0,this._slow=0,this._clip=0}startMonitoring(){if(this._analyser){const s=new Float32Array(this._analyser.frequencyBinCount),o=()=>{if(this._analyser){var e=Date.now();this._analyser.getFloatTimeDomainData(s);let t=0,i=0;for(let e=0;e<s.length;++e){var n=s[e];t+=n*n,.99<Math.abs(n)&&(i+=1)}this._instant=Math.sqrt(t/s.length),this._slow=.05*this._instant+.95*this._slow,this._clip=i/s.length,e-this._lastEventTime>=this.THROTTLE_INTERVAL&&(this._lastEventTime=e,this._main.dispatchEvent("soundMeter",{ref:this._main,high:this._instant,low:this._slow})),requestAnimationFrame(o)}};requestAnimationFrame(o)}}}class K{constructor(e){this._isWindowActive=!0,this._peerConnectionConfig={iceServers:[]},this._isMicrophoneMuted=!1,this._pendingMicrophoneState=null,this._constraints={video:{width:{min:"640",ideal:"1024",max:"1024"},height:{min:"360",ideal:"576",max:"576"},frameRate:{min:24,ideal:30,max:30}},audio:!0},this._publishState=o.PublishState.NOT_INITIALIZED,this.onServerDisconnect=()=>{},this.onServerConnect=()=>{if(this._peerConnection&&this.closeWebRTCConnection(),this._peerConnection=new RTCPeerConnection(this._peerConnectionConfig),this._peerConnection.onicecandidate=e=>{this.onIceCandidate(e)},this._peerConnection.onconnectionstatechange=e=>{this.onConnectionStateChange(e)},this._peerConnection.onnegotiationneeded=e=>{this._peerConnection&&this._peerConnection.createOffer(e=>{this.onDescriptionSuccess(e)},e=>{this.onDescriptionError(e)}).catch(e=>{console.log(e)})},this._stream){var e,t=this._stream.getTracks();for(e in t)this._peerConnection.addTrack(t[e],this._stream)}},this.onDescriptionSuccess=t=>{var e;console.log("%cāµ šŸŽ„ onDescriptionSuccess ","background: green; color: white;");const i={applicationName:null==(e=null==(e=this._main.getNetworkController())?void 0:e.getConnection().getCurrentServer())?void 0:e.getApplication(),streamName:null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey,sessionId:"[empty]"};t.sdp=this._mungeSDP.mungeSDPPublish(t.sdp,{audioBitrate:"64",videoBitrate:"1500",videoFrameRate:30,videoCodec:"42e01f",audioCodec:"opus"}),this._peerConnection&&this._peerConnection.setLocalDescription(t).then(()=>{var e;null!=(e=this._main.getNetworkController())&&e.sendMessage('{"direction":"publish", "command":"sendOffer", "streamInfo":'+JSON.stringify(i)+', "sdp":'+JSON.stringify(t)+"}")}).catch(e=>{console.log(e)})},this.visibilityChange=()=>{"hidden"===document.visibilityState?this.onWindowBlur():"visible"===document.visibilityState&&this.onWindowFocus()},this.onWindowBlur=()=>{this._isWindowActive&&this._logger.warning(this,"Player window is no longer in focus!"),this._isWindowActive=!1},this.onWindowFocus=()=>{this._isWindowActive||this._logger.info(this,"Player window is focused again!"),this._isWindowActive=!0},this._main=e,this._logger=e.getLogger(),this._logger.info(this,"Creating new PlaybackController"),this._mungeSDP=new N,this._soundMeter=new G(this._main),this.initialize()}initialize(){var e;this._main.addEventListener("serverConnect",this.onServerConnect,!1),this._main.addEventListener("serverDisconnect",this.onServerDisconnect,!1),document.addEventListener("visibilitychange",this.visibilityChange),window.addEventListener("blur",this.onWindowBlur),window.addEventListener("focus",this.onWindowFocus),null!=(e=this._main.getConfigManager())&&e.getSettingsData().autoConnect?(this._logger.info(this,"Initializing NetworkController (autoConnect is true)"),null!=(e=this._main.getNetworkController())&&e.initialize()):this._logger.warning(this,"Warning - autoConnect is set to false, switching to standby mode!"),this.startCamera().then(()=>{var e;null!=(null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey)&&this.initializeWebRTC()})}onCameraStreamSuccess(e){this._logger.success(this,"Camera stream successfully retrieved"),this._stream=e,null!==this._pendingMicrophoneState?(this.applyMicrophoneState(this._pendingMicrophoneState),this._pendingMicrophoneState=null):this.applyMicrophoneState(!this._isMicrophoneMuted),0<this._stream.getAudioTracks().length&&this._soundMeter.attach(this._stream),null!=this._cameraList&&null!=this._microphoneList||this.grabDevices();var t=this._main.getStageController().getScreenElement().getVideoElement();t.srcObject=e,t.autoplay=!0,t.playsInline=!0,t.disableRemotePlayback=!0,t.controls=!1,t.muted=!0,this.setPublishState(o.PublishState.INITIALIZED)}initializeWebRTC(){var e;this._stream?this._peerConnection?(this._logger.info(this,"WebRTC connection already exists, updating stream"),this.updateWebRTCStream()):(this._logger.info(this,"Initializing new WebRTC connection"),null!=(e=this._main.getNetworkController())&&e.start()):this._logger.error(this,"Cannot initialize WebRTC - no camera stream available")}publish(e){return this.isStreamReady(!0,!0)?(this.closeWebRTCConnection(),this._main.getConfigManager().getStreamData().streamKey=e,this._main.dispatchEvent("publish",{ref:this._main,streamKey:e}),this.initializeWebRTC(),!0):(this._logger.warning(this,"Cannot publish - stream not ready (missing video or audio track)"),!1)}unpublish(){this._main.getConfigManager().getStreamData().streamKey=null,this._main.dispatchEvent("unpublish",{ref:this._main}),this.closeStream()}onUserMediaError(e){console.log("%cāµ šŸŽ„ onUserMediaError: "+JSON.stringify(e),"background: green; color: white;");var t=e.name||"",i=e.message||"";e.deviceType?("video"===e.deviceType?this._main.dispatchEvent("cameraAccessDenied",{ref:this._main}):"audio"===e.deviceType&&this._main.dispatchEvent("microphoneAccessDenied",{ref:this._main}),this.grabDevices()):"NotAllowedError"===t||i.includes("Permission denied")||i.includes("not allowed")?this.checkIndividualDeviceAccess().then(e=>{e.camera||e.microphone?(e.camera||this._main.dispatchEvent("cameraAccessDenied",{ref:this._main}),e.microphone||this._main.dispatchEvent("microphoneAccessDenied",{ref:this._main})):(this._main.dispatchEvent("cameraAccessDenied",{ref:this._main}),this._main.dispatchEvent("microphoneAccessDenied",{ref:this._main})),this.grabDevices()}):"NotFoundError"===t||i.includes("Requested device not found")?this.checkDeviceAvailability().then(e=>{e.camera||this._main.dispatchEvent("noCameraFound",{ref:this._main}),e.microphone||this._main.dispatchEvent("noMicrophoneFound",{ref:this._main}),this.grabDevices()}):(this._logger.warning(this,"WebRTCStreamer :: Unsupported onUserMediaError: "+i),this._main.dispatchEvent("inputDeviceError",{ref:this._main}),this.grabDevices())}checkIndividualDeviceAccess(){return R(this,void 0,void 0,function*(){var t={camera:!1,microphone:!1};try{var e=yield navigator.mediaDevices.getUserMedia({video:!0});t.camera=!0,e.getTracks().forEach(e=>e.stop())}catch(e){t.camera=!1}try{var i=yield navigator.mediaDevices.getUserMedia({audio:!0});t.microphone=!0,i.getTracks().forEach(e=>e.stop())}catch(e){t.microphone=!1}return t})}checkDeviceAvailability(){return R(this,void 0,void 0,function*(){var e=yield navigator.mediaDevices.enumerateDevices();return{camera:e.some(e=>"videoinput"===e.kind),microphone:e.some(e=>"audioinput"===e.kind)}})}onSocketMessage(e){var t=JSON.parse(e);switch(Number(t.status)){case 200:console.log("%cāµ šŸŽ„ onSocketMessage: 200","background: green; color: white;");var i=t.sdp,n=(void 0!==i&&this._peerConnection.setRemoteDescription(new RTCSessionDescription(i),()=>{},()=>{}),t.iceCandidates);if(void 0!==n)for(var s in n)this._peerConnection&&this._peerConnection.addIceCandidate(new RTCIceCandidate(n[s]));break;case 503:console.log("%cāµ šŸŽ„ onSocketMessage: 503","background: green; color: white;"),this._main.dispatchEvent("streamKeyInUse",{ref:this._main,streamKey:this._main.getConfigManager().getStreamData().streamKey}),this.setPublishState(o.PublishState.ERROR)}}onConnectionStateChange(e){if(console.log("%cāµ šŸŽ„ onConnectionStateChange: "+e.currentTarget.connectionState,"background: green; color: white;"),null!==e)switch(e.currentTarget.connectionState){case"connecting":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnecting"),this.setPublishState(o.PublishState.CONNECTING);break;case"connected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnected"),this.setPublishState(o.PublishState.PUBLISHED),this.muteMicrophone(this._isMicrophoneMuted);break;case"disconnected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerDisconnected"),this.setPublishState(o.PublishState.UNPUBLISHED);break;case"failed":this._logger.info(this,"WebRTCStreamer :: Event: onPlayerFailed"),this.setPublishState(o.PublishState.ERROR);break;default:this._logger.info(this,"WebRTCStreamer :: Unsupported onConnectionStateChange: "+e.currentTarget.connectionState)}}grabDevices(){return R(this,void 0,void 0,function*(){try{try{yield navigator.mediaDevices.getUserMedia({audio:!0,video:!0})}catch(e){}var e,t,i,n=yield navigator.mediaDevices.enumerateDevices();this._cameraList=new W,this._microphoneList=new W;for(e of n)try{e.deviceId&&e.label&&("videoinput"===e.kind?(t=new k(e,this._cameraList.getSize()),this._cameraList.push(t)):"audioinput"===e.kind&&(i=new k(e,this._microphoneList.getSize()),this._microphoneList.push(i)))}catch(e){this._logger.error(this,"WebRTCStreamer :: Input Device Error: "+e)}this._logger.info(this,"Camera list:");for(let e=0;e<this._cameraList.getSize();e++)this._logger.info(this,"=> ["+e+"] InputDevice: "+this._cameraList.get(e).getLabel());this._logger.info(this,"Microphone list:");for(let e=0;e<this._microphoneList.getSize();e++)this._logger.info(this,"=> ["+e+"] InputDevice: "+this._microphoneList.get(e).getLabel());0==this._cameraList.getSize()?this._main.dispatchEvent("noCameraFound",{ref:this._main}):this._selectedCamera=this.pickCamera(),0==this._microphoneList.getSize()?this._main.dispatchEvent("noMicrophoneFound",{ref:this._main}):this._selectedMicrophone=this.pickMicrophone(),this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()})}catch(e){this._cameraList||(this._cameraList=new W),this._microphoneList||(this._microphoneList=new W),this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._main.dispatchEvent("inputDeviceError",{ref:this._main})}})}selectCamera(t){var i;for(let e=0;e<this._cameraList.getSize();e++)if(this._cameraList.get(e).getID()==t){this._selectedCamera=this._cameraList.get(e),null!=(i=this._main.getStorageManager())&&i.saveField("cameraID",this._selectedCamera.getID());break}const n=this._publishState===o.PublishState.PUBLISHED;this.stopCameraStream(),this._constraints.video.deviceId=this._selectedCamera.getID(),this.startCamera().then(()=>{var e;n&&null!=(e=this._main.getConfigManager())&&e.getStreamData().streamKey&&this.updateWebRTCStream()})}selectMicrophone(t){var i;for(let e=0;e<this._microphoneList.getSize();e++)if(this._microphoneList.get(e).getID()==t){this._selectedMicrophone=this._microphoneList.get(e),null!=(i=this._main.getStorageManager())&&i.saveField("microphoneID",this._selectedMicrophone.getID());break}const n=this._publishState===o.PublishState.PUBLISHED;this.stopCameraStream(),this._constraints.audio={deviceId:this._selectedMicrophone.getID()},this.startCamera().then(()=>{var e;n&&null!=(e=this._main.getConfigManager())&&e.getStreamData().streamKey&&this.updateWebRTCStream()})}startCamera(){return R(this,void 0,void 0,function*(){try{var e=yield navigator.mediaDevices.enumerateDevices(),i=e.some(e=>"videoinput"===e.kind),n=e.some(e=>"audioinput"===e.kind),s=[];let t=!1;if(i)try{var o=yield navigator.mediaDevices.getUserMedia({video:this._constraints.video});s.push(...o.getTracks())}catch(e){t=!0,this.onUserMediaError({name:e instanceof Error?e.name:"UnknownError",message:e instanceof Error?e.message:"Unknown error",deviceType:"video"})}if(n)try{var r=yield navigator.mediaDevices.getUserMedia({audio:this._constraints.audio});s.push(...r.getTracks())}catch(e){t=!0,this.onUserMediaError({name:e instanceof Error?e.name:"UnknownError",message:e instanceof Error?e.message:"Unknown error",deviceType:"audio"})}0<s.length?(this._stream=new MediaStream(s),this.onCameraStreamSuccess(this._stream)):t&&(yield this.grabDevices())}catch(e){e instanceof Error&&!("deviceType"in e)&&this.onUserMediaError({name:e.name,message:e.message}),yield this.grabDevices()}})}stopCameraStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._main.getStageController().getScreenElement().getVideoElement().srcObject=null,this._soundMeter.detach(),this._stream=null)}updateWebRTCStream(){this._peerConnection&&this._stream&&(this._peerConnection.getSenders().forEach(e=>{this._peerConnection&&this._peerConnection.removeTrack(e)}),this._stream.getTracks().forEach(e=>{null!=this._stream&&this._peerConnection&&this._peerConnection.addTrack(e,this._stream)}))}closeStream(){void 0!==this._peerConnection&&null!==this._peerConnection&&this._peerConnection.close(),this.setPublishState(o.PublishState.UNPUBLISHED)}pickCamera(){var e;for(let e=0;e<this._cameraList.getSize();e++)this._cameraList.get(e).setSelected(!1);var t=null!=(e=null==(e=this._main.getStorageManager())?void 0:e.getField("cameraID"))?e:null;if(null==this._selectedCamera||null==t)0<this._cameraList.getSize()&&(this._selectedCamera=this._cameraList.get(0),this._selectedCamera.setSelected(!0));else{for(let e=0;e<this._cameraList.getSize();e++)if(this._cameraList.get(e).getID()==t){this._selectedCamera=this._cameraList.get(e),this._selectedCamera.setSelected(!0);break}!this._selectedCamera&&0<this._cameraList.getSize()&&(this._selectedCamera=this._cameraList.get(0),this._selectedCamera.setSelected(!0))}return this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._selectedCamera}pickMicrophone(){var e;for(let e=0;e<this._microphoneList.getSize();e++)this._microphoneList.get(e).setSelected(!1);var t=null!=(e=null==(e=this._main.getStorageManager())?void 0:e.getField("microphoneID"))?e:null;if(null==this._selectedMicrophone||null==t)0<this._microphoneList.getSize()&&(this._selectedMicrophone=this._microphoneList.get(0),this._selectedMicrophone.setSelected(!0));else{for(let e=0;e<this._microphoneList.getSize();e++)if(this._microphoneList.get(e).getID()==t){this._selectedMicrophone=this._microphoneList.get(e),this._selectedMicrophone.setSelected(!0);break}!this._selectedMicrophone&&0<this._microphoneList.getSize()&&(this._selectedMicrophone=this._microphoneList.get(0),this._selectedMicrophone.setSelected(!0))}return this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._selectedMicrophone}muteMicrophone(e){this._isMicrophoneMuted!==e&&(this._isMicrophoneMuted=e,this._stream?this.applyMicrophoneState(!e):(this._pendingMicrophoneState=!e,this._logger.info(this,`WebRTCStreamer :: Stream not yet available, storing microphone state (muted: ${e})`)),this._main.dispatchEvent("microphoneStateChange",{ref:this._main,isMuted:this._isMicrophoneMuted}))}applyMicrophoneState(t){var e;this._stream?(e=this._stream.getAudioTracks())&&0<e.length?(this._logger.success(this,`WebRTCStreamer :: ${t?"Unmuting":"Muting"} microphone`),e.forEach(e=>e.enabled=t)):this._logger.warning(this,"WebRTCStreamer :: No audio tracks found in stream"):this._logger.warning(this,"WebRTCStreamer :: Cannot apply microphone state - stream not available")}isMicrophoneMuted(){return this._isMicrophoneMuted}isStreamReady(e=!0,t=!0){var i,n;return!!this._stream&&(n=this._stream.getVideoTracks(),i=this._stream.getAudioTracks(),e=!e||0<n.length&&"live"===n[0].readyState,n=!t||0<i.length&&"live"===i[0].readyState,e)&&n}closeWebRTCConnection(){this._peerConnection&&(this._peerConnection.close(),this._peerConnection=null)}onDescriptionError(e){this._logger.info(this,"WebRTCStreamer :: onDescriptionError: "+JSON.stringify(e))}onIceCandidate(e){e.candidate}getCurrentCamera(){return this._selectedCamera}getCurrentMicrophone(){return this._selectedMicrophone}setPublishState(e){this._publishState=e,this._main.dispatchEvent("publishStateChange",{ref:this._main,state:this._publishState})}getCameraList(){return null!=this._cameraList?this._cameraList.getArray():[]}getMicrophoneList(){return null!=this._microphoneList?this._microphoneList.getArray():[]}getPublishState(){return this._publishState}getPlayer(){return this._selectedPlayer}destroy(){var e;this._pendingMicrophoneState=null,this.closeStream(),null!=(e=this._selectedPlayer)&&e.clear(),this._selectedPlayer=null,this._main.removeEventListener("serverConnect",this.onServerConnect),document.removeEventListener("visibilitychange",this.visibilityChange),window.removeEventListener("blur",this.onWindowBlur),window.removeEventListener("focus",this.onWindowFocus)}}(C=O=O||{})[C.NOT_INITIALIZED=0]="NOT_INITIALIZED",C[C.STARTED=1]="STARTED",C[C.CONNECTING=2]="CONNECTING",C[C.CONNECTED=3]="CONNECTED",C[C.CLOSED=4]="CLOSED",C[C.FAILED=5]="FAILED";class X extends class{constructor(){this.CONNECTION_TIMEOUT=5,this.isBinary=!0,this._connectionState=O.NOT_INITIALIZED,this._messageCount=0,this._disconnectedByUser=!1,this._isConnected=!1,this._sequenceNumber=-1}startConnection(){this._disconnectedByUser=!1,this._messageCount=0,this._isConnected=!1,this._disconnectedByUser=!1,this._connectionState=O.CONNECTING,this.socket=new WebSocket(this.socketURL),this.isBinary&&(this.socket.binaryType="arraybuffer"),this.socket.onopen=e=>{clearTimeout(this._connectionTimeout),this._sequenceNumber++,this._connectionState=O.CONNECTED,this.onSocketOpen(e)},this.socket.onmessage=e=>{this._messageCount++,this.onSocketMessage(e)},this.socket.onclose=e=>{clearTimeout(this._connectionTimeout),this._connectionState==O.CONNECTED?(this._connectionState=O.CLOSED,this.onSocketClose(e)):this._connectionState=O.FAILED},this.socket.onerror=e=>{if(clearTimeout(this._connectionTimeout),this._connectionState==O.CONNECTING&&this.onSocketError(e),this._connectionState==O.CONNECTED)try{this.socket.close()}catch(e){}},this._connectionTimeout=setTimeout(()=>{try{this.socket.close()}catch(e){}this._connectionState==O.CONNECTING&&(this._connectionState=O.FAILED,this.onSocketError(new ErrorEvent("connectionTimeout")))},1e3*this.CONNECTION_TIMEOUT)}onSocketOpen(e){}onSocketClose(e){}onSocketMessage(e){}onSocketError(e){}onError(e){}sendData(e){if(this._connectionState==O.CONNECTED&&null!==this.socket){if(null!=e)return void this.socket.send(e);this.onError("no data to send")}this.onError("socket not connected")}getConnectionState(){return this._connectionState}disconnect(e=!0){this._isConnected=!1,this._connectionState=O.CLOSED,e&&(this._logger.warning(this,"Disconnected by user"),this._disconnectedByUser=e),null!=this.socket&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close())}destroy(){void 0!==this.socket&&null!==this.socket&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close()),this._connectionState=O.CLOSED}getSocketURL(){return this.socketURL}}{constructor(e,t){super(),this._logger=e.getLogger(),this._main=e,this._networkController=t,this.initialize()}initialize(){this._logger.info(this,"Starting new connection with a storm server"),this.pickServerFromList(this._main.getConfigManager().getStreamData().getServerList()),null!=this._currServer?(this.socketURL=this.createURL(this._currServer),this._logger.info(this,"Starting WebSocket connection with: "+this.socketURL),this._main.dispatchEvent("serverConnectionInitiate",{ref:this._main,serverURL:this.socketURL}),this._main.getConfigManager().getIfDemoMode()?(this._logger.warning(this,"Player is in demo mode, and will not connect with a server!"),this._main.dispatchEvent("authorizationComplete",{ref:this._main})):this.startConnection()):this._logger.error(this,"Connection with the server could not be initialized!")}onSocketOpen(e){this._logger.success(this,"Connection with the server has been established!"),this._main.dispatchEvent("serverConnect",{ref:this._main,serverURL:this.socketURL,sequenceNum:this._sequenceNumber}),this._isConnected=!0}onSocketError(e){this._isConnected=!1,this._disconnectedByUser||(this._logger.error(this,"Connection with the server failed"),this._main.dispatchEvent("serverConnectionError",{ref:this._main,serverURL:this.socketURL,restart:this._main.getConfigManager().getSettingsData().getIfRestartOnError(),sequenceNum:this._sequenceNumber}),0==this._isConnected&&(this._currServer.setAsFaild(!0),this.initiateReconnect()))}onSocketClose(e){this._isConnected=!1,this._disconnectedByUser?this._logger.warning(this,"Force disconnect from server!"):(this._logger.error(this,"Connection with the server has been closed"),this._main.dispatchEvent("serverDisconnect",{ref:this._main,serverURL:this.socketURL,restart:this._main.getConfigManager().getSettingsData().getIfRestartOnError(),sequenceNum:this._sequenceNumber}),this.initiateReconnect())}onSocketMessage(e){this._networkController.onMessage(e)}createURL(e){var t="";return(t+=e.getIfSSL()?"wss://":"ws://")+e.getHost()+(":"+e.getPort())+"/webrtc-session.json"}initiateReconnect(){var e=this._main.getConfigManager().getSettingsData().getIfRestartOnError();const t=this._main.getConfigManager().getSettingsData().getReconnectTime();this._disconnectedByUser||e&&(null!=this._reconnectTimer&&clearTimeout(this._reconnectTimer),this._reconnectTimer=setTimeout(()=>{this.pickServerFromList(this._main.getConfigManager().getStreamData().getServerList()),null!=this._currServer&&(this._logger.info(this,`Will reconnect to the server in ${t} seconds...`),this.socketURL=this.createURL(this._currServer),this._logger.info(this,"Starting WebSocket connection with: "+this.socketURL),this._main.dispatchEvent("serverConnectionInitiate",{ref:this._main,serverURL:this.socketURL}),this.startConnection())},1e3*t))}pickServerFromList(t){let i=null;for(let e=0;e<t.length;e++)if(!t[e].getIfFaild()){i=t[e];break}null==i?(this._logger.error(this,"All connections failed!"),this._main.dispatchEvent("allConnectionsFailed",{ref:this._main,mode:"none"}),this._currServer=null):this._currServer=i}isConnectionActive(){return this._isConnected}getCurrentServer(){return this._currServer}destroy(){super.destroy(),null!=this._reconnectTimer&&clearTimeout(this._reconnectTimer)}}class j{constructor(e){this._currentStreamKey="none",this._lastState="",this.onServerConnect=()=>{},this.onServerDisconnect=()=>{this._lastState="none"},this.onMessage=e=>{var t;null!=(t=this._main.getPlaybackController())&&t.onSocketMessage(e.data)},this._main=e,this._logger=e.getLogger(),this._main.addEventListener("serverConnect",this.onServerConnect,!1),this._main.addEventListener("serverDisconnect",this.onServerDisconnect,!1)}initialize(){null!=this._connection&&(this._connection.getConnectionState()==O.CONNECTING||this._connection.getConnectionState()==O.CONNECTED?this._logger.info(this,"Connection is alive, not doing anything!"):(this._logger.info(this,"Connection is dead, restarting!"),this._connection.startConnection()))}start(){this._connection=new X(this._main,this)}stop(){this._connection.disconnect(!0),this._lastState=""}sendMessage(e){this._connection.isConnectionActive()&&this._connection.sendData(e)}getConnection(){return this._connection}getCurrentStreamKey(){return this._currentStreamKey}}class P extends class{constructor(){this._isRemoved=!1,this._listeners={}}addEventListener(t,i,e=!0){this._listeners[t]||(this._listeners[t]=[]);let n=!1;if(null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++)if(this._listeners[t][e][1]==i){n=!0;break}return this._logger.success(this,"Registering a new event: "+t),!n&&(this._listeners[t].push([t,i,e]),!0)}removeEventListener(t,i){let n=!1;if(null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++){var s=this._listeners[t][e];if(i){if(s[1]==i){if(1!=s[2])break;n=!0,this._listeners[t].splice(e,1);break}}else n=!0,1==s[2]&&this._listeners[t].splice(e,1)}return this._logger.success(this,"Removing listener: "+t),n}removeAllEventListeners(){this._logger.success(this,"Removing all listeners!");for(const i in this._listeners){var e=i,t=this._listeners[e];if(t&&0<t.length)for(let e=t.length-1;0<=e;e--)!0===t[e][2]&&t.splice(e,1)}}dispatchEvent(t,i){if(!this._isRemoved&&null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++)this._listeners[t][e][1].call(this,i)}}{constructor(e,t=!1){super(),this.DEV_MODE=!0,this.STREAMER_VERSION="0.9.0-beta.3",this.COMPILE_DATE="12/5/2024, 2:36:49 PM",this.STREAMER_BRANCH="Experimental",this.STREAMER_PROTOCOL_VERSION=1,this._initialized=!1,"undefined"!=typeof window&&window.document&&window.document.createElement?(!this.DEV_MODE||"StormStreamerArray"in window||(window.StormStreamerArray=[]),window.StormStreamerArray.push(this),this._streamerID=P.NEXT_STREAMER_ID++,null!=e&&(this.setStreamConfig(e),t)&&this.initialize()):console.error('StormLibrary Creation Error - No "window" element in the provided context!')}initialize(){if(!this._isRemoved){if(null==this._configManager)throw Error("Stream Config was not provided for this library! A properly configured object must be provided through the constructor or via the setConfig method before using the initialize() method.");this._storageManager=new p(this),this._stageController=new y(this),this._networkController=new j(this),this._playbackController=new K(this),this._clientUser=new e,this._initialized=!0,this.dispatchEvent("streamerReady",{ref:this})}}setStreamConfig(e){this._isRemoved||(e=JSON.parse(JSON.stringify(e)),null==this._configManager?(this._configManager=new g(e),this._logger=new _(this._configManager.getSettingsData().getDebugData(),this),this._logger.info(this,"StreamerID: "+this._streamerID),this._logger.info(this,"Version: "+this.STREAMER_VERSION+" | Compile Date: "+this.COMPILE_DATE+" | Branch: "+this.STREAMER_BRANCH),this._logger.info(this,"UserCapabilities :: Browser: "+m.getBrowserName()+" "+m.getBrowserVersion()),this._logger.info(this,"UserCapabilities :: Operating System: "+m.getOS()+" "+m.getOSVersion()),this._logger.info(this,"UserCapabilities :: isMobile: "+m.isMobile()),this._logger.info(this,"UserCapabilities :: hasMSESupport: "+m.hasMSESupport()),this._logger.info(this,"UserCapabilities :: hasWebSocketSupport: "+m.hasWebSocketsSupport()),this._logger.info(this,"UserCapabilities :: hasWebRTCSupport: "+m.hasWebRTCSupport()),this._configManager.print(this._logger)):(this._logger.info(this,"StreamConfig has been overwritten, dispatching streamConfigChanged!"),this._configManager=new g(e),this._configManager.print(this._logger),this.dispatchEvent("streamConfigChange",{ref:this,newConfig:this._configManager})))}stop(){}isConnected(){var e;return null!=(e=null==(e=this._networkController)?void 0:e.getConnection().isConnectionActive())&&e}attachToContainer(e){var t;return!!this._initialized&&null!=(t=null==(t=this._stageController)?void 0:t.attachToParent(e))&&t}detachFromContainer(){var e;return!!this._initialized&&null!=(e=null==(e=this._stageController)?void 0:e.detachFromParent())&&e}getContainer(){var e;return null!=(e=null==(e=this._stageController)?void 0:e.getParentElement())?e:null}mute(){null!=this._stageController&&null!=this._stageController.getScreenElement()?this._stageController.getScreenElement().setMuted(!0):this._configManager.getSettingsData().getAudioData().muted=!0}unmute(){null!=this._stageController&&null!=this._stageController.getScreenElement()?this._stageController.getScreenElement().setMuted(!1):this._configManager.getSettingsData().getAudioData().muted=!1}isMute(){var e;return null!=(e=null!=(e=null==(e=null==(e=this._stageController)?void 0:e.getScreenElement())?void 0:e.getIfMuted())?e:this._configManager.getSettingsData().getAudioData().muted)&&e}toggleMute(){var e=this.isMute();return e?this.unmute():this.mute(),!e}setVolume(e){var t;void 0===(null==(t=null==(t=this._stageController)?void 0:t.getScreenElement())?void 0:t.setVolume(e))&&(this._configManager.getSettingsData().getAudioData().startVolume=e)}getVolume(){var e;return null!=(e=null==(e=null==(e=this._stageController)?void 0:e.getScreenElement())?void 0:e.getVolume())?e:this._configManager.getSettingsData().getAudioData().startVolume}getCameraList(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.getCameraList())?e:[]}getMicrophoneList(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.getMicrophoneList())?e:[]}setCamera(e){var t;null!=(t=this._playbackController)&&t.selectCamera(e)}setMicrophone(e){var t;null!=(t=this._playbackController)&&t.selectMicrophone(e)}getCurrentCamera(){return this._playbackController.getCurrentCamera()}getCurrentMicrophone(){return this._playbackController.getCurrentMicrophone()}muteMicrophone(e){var t;null!=(t=this._playbackController)&&t.muteMicrophone(e)}isMicrophoneMuted(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.isMicrophoneMuted())&&e}getPublishState(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.getPublishState())?e:o.PublishState.NOT_INITIALIZED}publish(e){var t;return null!=(t=null==(t=this._playbackController)?void 0:t.publish(e))&&t}isStreamReady(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.isStreamReady())&&e}unpublish(){var e;null!=(e=this._playbackController)&&e.unpublish()}setSize(e,t){this._initialized?this._stageController.setSize(e,t):(e=u.parseValue(e),t=u.parseValue(t),this._configManager.getSettingsData().getVideoData().videoWidthValue=e.value,this._configManager.getSettingsData().getVideoData().videoWidthInPixels=e.isPixels,this._configManager.getSettingsData().getVideoData().videoHeightValue=t.value,this._configManager.getSettingsData().getVideoData().videoHeightInPixels=t.isPixels)}setWidth(e){this._initialized?this._stageController.setWidth(e):(e=u.parseValue(e),this._configManager.getSettingsData().getVideoData().videoWidthValue=e.value,this._configManager.getSettingsData().getVideoData().videoWidthInPixels=e.isPixels)}setHeight(e){this._initialized?this._stageController.setHeight(e):(e=u.parseValue(e),this._configManager.getSettingsData().getVideoData().videoHeightValue=e.value,this._configManager.getSettingsData().getVideoData().videoHeightInPixels=e.isPixels)}getWidth(){return this._initialized?this._stageController.getContainerWidth():this._configManager.getSettingsData().getVideoData().videoWidthInPixels?this._configManager.getSettingsData().getVideoData().videoWidthValue:0}getHeight(){return this._initialized?this._stageController.getContainerHeight():this._configManager.getSettingsData().getVideoData().videoHeightInPixels?this._configManager.getSettingsData().getVideoData().videoHeightValue:0}setScalingMode(e){this._stageController?this._stageController.setScalingMode(e):this._configManager.getSettingsData().getVideoData().scalingMode=e}getScalingMode(){return this._stageController?this._stageController.getScalingMode():this._configManager.getSettingsData().getVideoData().scalingMode}updateToSize(){this._initialized&&this._stageController.handleResize()}makeScreenshot(){let i=document.createElement("canvas"),n=i.getContext("2d");return new Promise(t=>{var e;null!=this._stageController&&(i.width=this._stageController.getScreenElement().getVideoElement().videoWidth,i.height=this._stageController.getScreenElement().getVideoElement().videoHeight,e=this._stageController.getScreenElement().getVideoElement(),n)?(n.drawImage(e,0,0,i.width,i.height),i.toBlob(e=>{t(e)},"image/png")):t(null)})}enterFullScreen(){this._initialized&&this._stageController&&this._stageController.enterFullScreen()}exitFullScreen(){this._initialized&&this._stageController&&this._stageController.exitFullScreen()}isFullScreenMode(){return!(!this._initialized||!this._stageController)&&this._stageController.isFullScreenMode()}getStreamerID(){return this._streamerID}getLogger(){return this._logger}getConfigManager(){return this._configManager}getNetworkController(){return this._networkController}getPlaybackController(){return this._playbackController}getStageController(){return this._stageController}getVideoElement(){var e;return null!=(e=null==(e=null==(e=this._stageController)?void 0:e.getScreenElement())?void 0:e.getVideoElement())?e:null}isInitialized(){return this._initialized}getVersion(){return this.STREAMER_VERSION}getBranch(){return this.STREAMER_BRANCH}getStorageManager(){return this._storageManager}dispatchEvent(e,t){super.dispatchEvent(e,t)}destroy(){var e;this._logger.warning(this,"Destroying library instance, bye, bye!"),this.DEV_MODE&&"StormStreamerArray"in window&&(window.StormStreamerArray[this._streamerID]=null),this._initialized=!1,this._isRemoved=!0,null!=(e=null==(e=this._networkController)?void 0:e.getConnection())&&e.destroy(),null!=(e=this._stageController)&&e.destroy(),null!=(e=this._playbackController)&&e.destroy(),this.removeAllEventListeners()}}P.NEXT_STREAMER_ID=0,o.StormStreamer=P,o.create=function(e){return new P(e)}});
14
+ */!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).stormStreamer={})}(this,function(c){"use strict";class o{constructor(e,t,i=443,n=!0){this.host=e,this.application=t,this.port=i,this.isSSL=n,this.hasFaild=!1}getHost(){return this.host}getApplication(){return this.application}getPort(){return this.port}getIfSSL(){return this.isSSL}getIfFaild(){return this.hasFaild}setAsFaild(e){this.hasFaild=e}getData(){return{serverURL:this.getHost(),application:this.getHost(),serverPort:this.getPort(),isSSL:this.getIfSSL()}}toString(){return"host: "+this.host+" | application: "+this.application+" | port: "+this.port+" | isSSL: "+this.isSSL}}class r{constructor(e){this._serverList=new Array,this._sourceList=new Array,this._streamKey=null,this.parse(e)}parse(e){if(this._streamConfig=e,!this._streamConfig)throw new Error("Stream configuration is missing. Please check stream config!");if(void 0===this._streamConfig.serverList||null===this._streamConfig.serverList)throw new Error("StormLibrary: Server list configuration is missing. Please check the config!");if(0===this._streamConfig.serverList.length)throw new Error("StormLibrary: Server list configuration is empty. Please check the config!");for(let i=0;i<this._streamConfig.serverList.length;i++){let e,t;if(null==this._streamConfig.serverList[i].host)throw new Error('Error while parsing server object ("host" field is missing). Please check player config!');if(e=this._streamConfig.serverList[i].host,null==this._streamConfig.serverList[i].application)throw new Error('Error while parsing server object ("application" field is missing). Please check player config!');t=this._streamConfig.serverList[i].application;var n=null!=(n=this._streamConfig.serverList[i].port)?n:r.DEFAULT_CONNECTION_PORT,s=null!=(s=this._streamConfig.serverList[i].ssl)?s:r.IS_SSL_BY_DEFAULT;this._serverList.push(new o(e,t,n,s))}this._streamKey=null!=(e=this._streamConfig.streamKey)?e:this._streamKey}getServerList(){return this._serverList}getSourceList(){return this._sourceList}get streamKey(){return this._streamKey}set streamKey(e){this._streamKey=e}set serverList(e){this._serverList=e}set sourceList(e){this._sourceList=e}clearSourceList(){this._sourceList=new Array}clearServerList(){this._serverList=new Array}print(t,e=!1){if(r.PRINT_ON_STARTUP||e){t.info(this,"Server List:");for(let e=0;e<this._serverList.length;e++)t.info(this,"=> ["+e+"] "+this._serverList[e].toString());t.info(this,"StreamKey: "+this._streamKey)}}}var s,i,n;r.PRINT_ON_STARTUP=!0,r.DEFAULT_CONNECTION_PORT=443,r.IS_SSL_BY_DEFAULT=!0,(C=s=s||{}).FILL="fill",C.LETTER_BOX="letterbox",C.CROP="crop",C.ORIGINAL="original",(C=i=i||{}).CLIENT_DIMENSIONS="clientDimensions",C.BOUNDING_BOX="boundingBox",C.FULL_BOX="fullBox";class t{constructor(e){this._scalingMode=s.LETTER_BOX,this._aspectRatio="none",this._videoWidthValue=100,this._isVideoWidthInPixels=!1,this._wasVideoWidthProvided=!1,this._videoHeightValue=100,this._isVideoHeightInPixels=!1,this._wasVideoHeightProvided=!1,this._resizeDebounce=250,this._parentSizeCalculationMethod=i.CLIENT_DIMENSIONS,this.parse(e)}parse(e){if(this.videoConfig=e,null==this.videoConfig)throw new Error("Missing video configuration. Please check player config!");if(null!=this.videoConfig.aspectRatio){var e=new RegExp("^[0-9]*\\.?[0-9]+:[0-9]*\\.?[0-9]+$"),t=this.videoConfig.aspectRatio;if(!e.test(t))throw new Error('Parameter "aspectRatio" - must match "number:number" pattern ');this._aspectRatio=t,this._aspectRatio=this.videoConfig.aspectRatio}if(null!=this.videoConfig.scalingMode)switch(this.videoConfig.scalingMode.toLowerCase()){case"fill":this._scalingMode=s.FILL;break;case"letterbox":this._scalingMode=s.LETTER_BOX;break;case"crop":this._scalingMode=s.CROP;break;case"original":this._scalingMode=s.ORIGINAL;break;default:throw new Error("Unknown video scaling mode. Please check player config!")}if(void 0!==this.videoConfig.width){if(null===this.videoConfig.width)throw new Error('Parameter "width" cannot be empty');if("number"==typeof this.videoConfig.width)this._videoWidthValue=this.videoConfig.width,this._isVideoWidthInPixels=!0;else{if("string"!=typeof this.videoConfig.width)throw new Error('Unknown type for parameter "width" - it must be a number or a string! ');this.videoConfig.width.toLowerCase().endsWith("px")?(this._videoWidthValue=parseInt(this.videoConfig.width),this._isVideoWidthInPixels=!0):this.videoConfig.width.toLowerCase().endsWith("%")&&(this._videoWidthValue=parseInt(this.videoConfig.width),this._isVideoWidthInPixels=!1)}this._wasVideoWidthProvided=!0}if(void 0!==this.videoConfig.height){if(null===this.videoConfig.height)throw new Error('Parameter "height" cannot be empty');if("number"==typeof this.videoConfig.height)this._videoHeightValue=this.videoConfig.height,this._isVideoHeightInPixels=!0;else{if("string"!=typeof this.videoConfig.height)throw new Error('Unknown type for parameter "height" - it must be a number or a string!');this.videoConfig.height.toLowerCase().endsWith("px")?(this._videoHeightValue=parseInt(this.videoConfig.height),this._isVideoHeightInPixels=!0):this.videoConfig.height.toLowerCase().endsWith("%")&&(this._videoHeightValue=parseInt(this.videoConfig.height),this._isVideoHeightInPixels=!1)}this._wasVideoHeightProvided=!0}if(void 0!==this.videoConfig.sizeCalculationMethod&&null!==this.videoConfig.sizeCalculationMethod)switch(this.videoConfig.sizeCalculationMethod){case"clientDimensions":this._parentSizeCalculationMethod=i.CLIENT_DIMENSIONS;break;case"boundingBox":this._parentSizeCalculationMethod=i.BOUNDING_BOX;break;case"fullBox":this._parentSizeCalculationMethod=i.FULL_BOX}this._containerID=null!=(e=this.videoConfig.containerID)?e:null,this._resizeDebounce=null!=(t=this.videoConfig.resizeDebounce)?t:this._resizeDebounce}get scalingMode(){return this._scalingMode}get containerID(){return this._containerID}get videoWidthValue(){return this._videoWidthValue}get videoWidthInPixels(){return this._isVideoWidthInPixels}get videoWidthProvided(){return this._wasVideoWidthProvided}get videoHeightValue(){return this._videoHeightValue}get videoHeightInPixels(){return this._isVideoHeightInPixels}get videoHeightProvided(){return this._wasVideoHeightProvided}get aspectRatio(){return this._aspectRatio}get resizeDebounce(){return this._resizeDebounce}set resizeDebounce(e){this._resizeDebounce=e}set videoWidthValue(e){this._videoWidthValue=e}set videoWidthInPixels(e){this._isVideoWidthInPixels=e}set videoHeightValue(e){this._videoHeightValue=e}set videoHeightInPixels(e){this._isVideoHeightInPixels=e}set containerID(e){this._containerID=e}set scalingMode(e){switch(e.toLowerCase()){case"fill":this._scalingMode=s.FILL;break;case"letterbox":this._scalingMode=s.LETTER_BOX;break;case"crop":this._scalingMode=s.CROP;break;case"original":this._scalingMode=s.ORIGINAL;break;default:throw new Error("Unknown video scaling mode. Please check player config!")}}get parentSizeCalculationMethod(){return this._parentSizeCalculationMethod}print(e){let t="";switch(this._scalingMode){case s.FILL:t="fill";break;case s.LETTER_BOX:t="letterbox";break;case s.CROP:t="crop";break;case s.ORIGINAL:t="original"}e.info(this,"VideoConfig :: containerID: "+this._containerID),e.info(this,"VideoConfig :: scalingMode: "+t),e.info(this,"VideoConfig :: width: "+this._videoWidthValue+(this._isVideoWidthInPixels?"px":"%")+(this._wasVideoWidthProvided?" (provided)":" (default)")),e.info(this,"VideoConfig :: height: "+this._videoHeightValue+(this._isVideoHeightInPixels?"px":"%")+(this._wasVideoHeightProvided?" (provided)":" (default)")),e.info(this,"VideoConfig :: aspectRatio: "+this._aspectRatio)}}(C=n=n||{})[C.TRACE=0]="TRACE",C[C.INFO=1]="INFO",C[C.SUCCESS=2]="SUCCESS",C[C.WARNING=3]="WARNING",C[C.ERROR=4]="ERROR";class a{constructor(e){this._consoleLogEnabled=!1,this._enabledConsoleTypes=[n.INFO,n.ERROR,n.SUCCESS,n.TRACE,n.WARNING],this._consoleMonoColor=!1,this._containerLogEnabled=!1,this._enabledContainerTypes=[n.INFO,n.ERROR,n.SUCCESS,n.TRACE,n.WARNING],this._containerLogMonoColor=!1,this.parse(e)}parse(e){this._debugConfig=e,this._debugConfig&&(this._consoleLogEnabled=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.console)?void 0:e.enabled)?e:this._consoleLogEnabled,this._consoleMonoColor=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.console)?void 0:e.monoColor)?e:this._consoleMonoColor,this._enabledConsoleTypes=null!=(e=this.parseLogTypes(null==(e=null==(e=this._debugConfig)?void 0:e.console)?void 0:e.logTypes))?e:this._enabledConsoleTypes,this._containerLogEnabled=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.enabled)?e:this._containerLogEnabled,this._containerLogMonoColor=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.monoColor)?e:this._containerLogMonoColor,this._enabledContainerTypes=null!=(e=this.parseLogTypes(null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.logTypes))?e:this._enabledContainerTypes,this._containerID=null!=(e=null==(e=null==(e=this._debugConfig)?void 0:e.container)?void 0:e.containerID)?e:this._containerID)}parseLogTypes(e){return null==e?void 0:e.map(e=>{switch(e.toLowerCase()){case"info":return n.INFO;case"error":return n.ERROR;case"warning":return n.WARNING;case"success":return n.SUCCESS;case"trace":return n.TRACE;default:throw new Error("Unsupported log type: "+e)}})}get consoleLogEnabled(){return this._consoleLogEnabled}set consoleLogEnabled(e){this._consoleLogEnabled=e}get enabledConsoleTypes(){return this._enabledConsoleTypes}set enabledConsoleTypes(t){this._enabledConsoleTypes=new Array;for(let e=0;e<t.length;e++)switch(t[e].toLowerCase()){case"info":this._enabledConsoleTypes.push(n.INFO);break;case"error":this._enabledConsoleTypes.push(n.ERROR);break;case"warning":this._enabledConsoleTypes.push(n.WARNING);break;case"success":this._enabledConsoleTypes.push(n.SUCCESS);break;case"trace":this._enabledConsoleTypes.push(n.TRACE)}}get containerLogEnabled(){return this._containerLogEnabled}set containerLogEnabled(e){this._consoleLogEnabled=e}get consoleLogMonoColor(){return this._consoleMonoColor}set consoleLogMonoColor(e){this._consoleMonoColor=e}get enabledContainerTypes(){return this._enabledContainerTypes}set enabledContainerTypes(t){this._enabledContainerTypes=new Array;for(let e=0;e<t.length;e++)switch(t[e].toLowerCase()){case"info":this._enabledContainerTypes.push(n.INFO);break;case"error":this._enabledContainerTypes.push(n.ERROR);break;case"warning":this._enabledContainerTypes.push(n.WARNING);break;case"success":this._enabledContainerTypes.push(n.SUCCESS);break;case"trace":this._enabledContainerTypes.push(n.TRACE)}}get containerID(){return this._containerID}set containerID(e){this._containerID=e}get containerLogMonoColor(){return this._containerLogMonoColor}set containerLogMonoColor(e){this._containerLogMonoColor=e}print(e,t=!1){if(a.PRINT_ON_STARTUP||t){let t="";for(let e=0;e<this._enabledConsoleTypes.length;e++)switch(this._enabledConsoleTypes[e]){case n.TRACE:t+="TRACE, ";break;case n.SUCCESS:t+="SUCCESS, ";break;case n.WARNING:t+="WARNING, ";break;case n.INFO:t+="INFO, ";break;case n.ERROR:t+="ERROR, "}e.info(this,"Console:: enabled: "+this._consoleLogEnabled),e.info(this,"Console:: logTypes: "+t),e.info(this,"Console:: monoColor: "+this._consoleMonoColor);let i="";for(let e=0;e<this._enabledContainerTypes.length;e++)switch(this._enabledContainerTypes[e]){case n.TRACE:i+="TRACE, ";break;case n.SUCCESS:i+="SUCCESS, ";break;case n.WARNING:i+="WARNING, ";break;case n.INFO:i+="INFO, ";break;case n.ERROR:i+="ERROR, "}e.info(this,"Container:: enabled: "+this._containerLogEnabled),e.info(this,"Container:: logTypes: "+i),e.info(this,"Container:: containerID: "+this._containerID),e.info(this,"Container:: monoColor: "+this._consoleMonoColor)}}}a.PRINT_ON_STARTUP=!0;class h{constructor(e){this._startVolume=100,this._isMuted=!1,this.parse(e)}parse(e){this._audioConfig=e,this._audioConfig&&(this._startVolume=null!=(e=null==(e=this._audioConfig)?void 0:e.startVolume)?e:this._startVolume,this._isMuted=null!=(e=null==(e=this._audioConfig)?void 0:e.muted)?e:this._isMuted)}get startVolume(){return this._startVolume}set startVolume(e){this._startVolume=e}get muted(){return this._isMuted}set muted(e){this._isMuted=e}print(e,t=!1){(h.PRINT_ON_STARTUP||t)&&e.info(this,"Audio :: startVolume: "+this._startVolume+" | isMuted: "+this._isMuted)}}h.PRINT_ON_STARTUP=!0;class l{constructor(e){this._enabled=!0,this._prefix="storm",this.parse(e)}parse(e){this._storageConfig=e,this._enabled=null!=(e=null==(e=this._storageConfig)?void 0:e.enabled)?e:this._enabled,this._prefix=null!=(e=null==(e=this._storageConfig)?void 0:e.prefix)?e:this._prefix}get enabled(){return this._enabled}set enabled(e){this._enabled=e}get prefix(){return this._prefix}set prefix(e){this._prefix=e}print(e,t=!1){(l.PRINT_ON_STARTUP||t)&&e.info(this,"Storage :: startVolume: "+this._enabled+" | prefix: "+this._prefix)}}l.PRINT_ON_STARTUP=!0;class d{constructor(e){this._restartOnError=!0,this._reconnectTime=1,this._autoStart=!1,this._autoConnect=!0,this.startOnDOMReady=!1,this.iOSOnDomReadyFix=!0,this._restartOnFocus=!0,this.parse(e)}parse(e){this._settingsConfig=e,this._autoConnect=null!=(e=this._settingsConfig.autoConnect)?e:this._autoConnect,this._autoStart=null!=(e=this._settingsConfig.autoStart)?e:this._autoStart,this._restartOnFocus=null!=(e=this._settingsConfig.restartOnFocus)?e:this._restartOnFocus,this._restartOnError=null!=(e=this._settingsConfig.restartOnError)?e:this._restartOnError,this._reconnectTime=null!=(e=this._settingsConfig.reconnectTime)?e:this._reconnectTime,this._videoData=new t(null!=(e=this._settingsConfig.video)?e:null),this._audioData=new h(null!=(e=this._settingsConfig.audio)?e:null),this._storageData=new l(null!=(e=this._settingsConfig.storage)?e:null),this._debugData=new a(null!=(e=this._settingsConfig.debug)?e:null)}getAudioData(){return this._audioData}getVideoData(){return this._videoData}getStorageData(){return this._storageData}getIfRestartOnError(){return this._restartOnError}getReconnectTime(){return this._reconnectTime}get autoStart(){return this._autoStart}set autoStart(e){this._autoStart=e}get autoConnect(){return this._autoConnect}get restartOnFocus(){return this._restartOnFocus}getDebugData(){return this._debugData}getIfStartOnDOMReadyEnabled(){return this.startOnDOMReady}getIfIOSOnDomStartFixEnabled(){return this.iOSOnDomReadyFix}print(e,t=!1){(d.PRINT_ON_STARTUP||t)&&(e.info(this,"SettingsConfig :: autoConnect: "+this._autoConnect),e.info(this,"SettingsConfig :: autoStart: "+this._autoStart),e.info(this,"SettingsConfig :: restartOnError: "+this._restartOnError),e.info(this,"SettingsConfig :: reconnectTime: "+this._reconnectTime),e.info(this,"SettingsConfig :: enabledProtocols: "),this._videoData.print(e),this._audioData.print(e),this._debugData.print(e),this._debugData.print(e))}}d.PRINT_ON_STARTUP=!0;class g{constructor(e){this.PRINT_ON_STARTUP=!0,this.demoMode=!1,this.parse(e)}parse(e){if(this.configTemplate=e,null==this.configTemplate.stream)throw new Error("No stream field was provided. Please check your player config!");this.streamData=new r(this.configTemplate.stream),this.settingsData=new d(null!=(e=this.configTemplate.settings)?e:null),this.demoMode=null!=(e=this.configTemplate.demoMode)&&e}getStreamData(){return this.streamData}getSettingsData(){return this.settingsData}getIfDemoMode(){return this.demoMode}print(e,t=!1){(this.PRINT_ON_STARTUP||t)&&(this.streamData.print(e),this.settingsData.print(e))}}class u{static addLeadingZero(e){return e<10?"0"+e:String(e)}static isNear(e,t,i){return Math.abs(e-t)<=i}static generateUniqueString(t){let i="";var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",s=n.length;for(let e=0;e<t;e++)i+=n.charAt(Math.floor(Math.random()*s));return i}}u.parseValue=e=>{var t;return"string"==typeof e?(t=e.toLowerCase().endsWith("px"),{value:parseInt(e,10),isPixels:t}):{value:e,isPixels:!0}};class _{constructor(e,t){this.colorOrder=["red","green","blue","orange","black","violet"],this._logMemory=[],this._streamerInstanceID=-1,this._debugConfig=e,this._stormStreamer=t,this._streamerInstanceID=this._stormStreamer.getStreamerID();e=this.colorOrder.length<t.getStreamerID()?this.colorOrder.length-1:t.getStreamerID();this._monoColor=this.colorOrder[e]}info(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.INFO)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.INFO_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.INFO)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.INFO_COLOR,this.writeToContainer(e,t))}warning(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.WARNING)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.WARNING_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.WARNING)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.WARNING_COLOR,this.writeToContainer(e,t))}error(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.ERROR)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.ERROR_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.ERROR)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.ERROR_COLOR,this.writeToContainer(e,t))}success(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.SUCCESS)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.SUCCESS_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.SUCCESS)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.SUCCESS_COLOR,this.writeToContainer(e,t))}trace(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(n.TRACE)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:_.TRACE_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(n.TRACE)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:_.TRACE_COLOR,this.writeToContainer(e,t))}logData(e,t){var i=new Date,n=u.addLeadingZero(i.getHours()),s=u.addLeadingZero(i.getMinutes()),i=u.addLeadingZero(i.getSeconds());let o=String(this._streamerInstanceID);0<=this._streamerInstanceID&&(o+="|"+this._streamerInstanceID);n="[Storm-ID:"+o+"] ["+n+":"+s+":"+i+"] :: "+t;return this._logMemory.push(n),n}writeToContainer(e,t){var i,n=this._debugConfig.containerID;n&&(n=document.getElementById(n),(i=document.createElement("span")).innerText=e,i.style.color=t,n.appendChild(i))}setPlayerID(e){this._streamerInstanceID=e}getAllLogs(){return this._logMemory}}_.INFO_COLOR="blue",_.WARNING_COLOR="orange",_.ERROR_COLOR="red",_.SUCCESS_COLOR="green",_.TRACE_COLOR="black";class e{constructor(){this.bandwidthCapabilities=0}setBandwidthCapabilities(e){this.bandwidthCapabilities=e}getBandwidthCapabilities(){return this.bandwidthCapabilities}}class m{static hasWebSocketsSupport(){return null!=window.WebSocket}static isMobile(){return new RegExp("Mobile|mini|Fennec|Android|iP(ad|od|hone)").test(navigator.userAgent)}static isCookieEnabled(){let e=!!navigator.cookieEnabled;return"undefined"!=typeof navigator.cookieEnabled||e||(document.cookie="testcookie",e=-1!=document.cookie.indexOf("testcookie")),e}static getOSVersion(){let e="Unknown version",t=m.getOS();if(null!=t){var i;switch(new RegExp("Windows").test(t)&&(i=new RegExp("Windows (.*)"),e=null!=i.exec(t)[1]?i.exec(t)[1]:e,t="Windows"),t){case"Mac OS":case"Mac OS X":case"Android":var n=new RegExp("(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\\.\\_\\d]+)");e=n.exec(navigator.userAgent)[1];break;case"iOS":n=new RegExp("OS (\\d+)_(\\d+)_?(\\d+)?");e=(e=n.exec(navigator.userAgent))[1]+"."+e[2]+"."+(0|e[3])}}return e}static getBrowserName(){return m.getFullBrowser().name}static getBrowserVersion(){return m.getFullBrowser().version}static getFullBrowser(){var e=navigator.userAgent;let t=navigator.appName,i=""+parseFloat(navigator.appVersion),n=parseInt(navigator.appVersion,10),s,o,r;return-1!=(o=e.indexOf("Opera"))?(t="Opera",i=e.substring(o+6),-1!=(o=e.indexOf("Version"))&&(i=e.substring(o+8))):-1!=(o=e.indexOf("MSIE"))?(t="Microsoft Internet Explorer",i=e.substring(o+5)):"Netscape"==t&&-1!=e.indexOf("Trident/")?(t="Microsoft Internet Explorer",i=e.substring(o+5),-1!=(o=e.indexOf("rv:"))&&(i=e.substring(o+3))):-1!=(o=e.indexOf("Chrome"))?(t="Chrome",(-1<e.indexOf("FBAV")||-1<e.indexOf("FBAN"))&&(t="Facebook"),-1<e.indexOf("OPR")&&(t="Opera"),-1<e.indexOf("SamsungBrowser")&&(t="Samsung"),i=e.substring(o+7)):-1!=(o=e.indexOf("Safari"))?(t="Safari",i=e.substring(o+7),-1!=(o=e.indexOf("Version"))&&(i=e.substring(o+8)),-1!=e.indexOf("CriOS")&&(t="Chrome"),-1!=e.indexOf("FxiOS")&&(t="Firefox")):-1!=(o=e.indexOf("Firefox"))?(t="Firefox",i=e.substring(o+8)):(s=e.lastIndexOf(" ")+1)<(o=e.lastIndexOf("/"))&&(t=e.substring(s,o),i=e.substring(o+1),t.toLowerCase()==t.toUpperCase())&&(t=navigator.appName),-1!=(r=(i=-1!=(r=(i=-1!=(r=i.indexOf(";"))?i.substring(0,r):i).indexOf(" "))?i.substring(0,r):i).indexOf(")"))&&(i=i.substring(0,r)),n=parseInt(""+i,10),isNaN(n)&&(i=""+parseFloat(navigator.appVersion),n=parseInt(navigator.appVersion,10)),{name:t,fullVersion:i,version:n}}static getOS(){let e="Unknown OS";var t,i=[{os:"Windows 10",code:"(Windows 10.0|Windows NT 10.0)"},{os:"Windows 8.1",code:"(Windows 8.1|Windows NT 6.3)"},{os:"Windows 8",code:"(Windows 8|Windows NT 6.2)"},{os:"Windows 7",code:"(Windows 7|Windows NT 6.1)"},{os:"Windows Vista",code:"Windows NT 6.0"},{os:"Windows Server 2003",code:"Windows NT 5.2"},{os:"Windows XP",code:"(Windows NT 5.1|Windows XP)"},{os:"Windows 2000",code:"(Windows NT 5.0|Windows 2000)"},{os:"Windows ME",code:"(Win 9x 4.90|Windows ME)"},{os:"Windows 98",code:"(Windows 98|Win98)"},{os:"Windows 95",code:"(Windows 95|Win95|Windows_95)"},{os:"Windows NT 4.0",code:"(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)"},{os:"Windows CE",code:"Windows CE"},{os:"Windows 3.11",code:"Win16"},{os:"Android",code:"Android"},{os:"Open BSD",code:"OpenBSD"},{os:"Sun OS",code:"SunOS"},{os:"Chrome OS",code:"CrOS"},{os:"Linux",code:"(Linux|X11(?!.*CrOS))"},{os:"iOS",code:"(iPhone|iPad|iPod)"},{os:"Mac OS X",code:"Mac OS X"},{os:"Mac OS",code:"(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)"},{os:"QNX",code:"QNX"},{os:"UNIX",code:"UNIX"},{os:"BeOS",code:"BeOS"},{os:"OS/2",code:"OS\\/2"},{os:"Search Bot",code:"(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\\/Teoma|ia_archiver)"}];for(t in i){var n=i[t];if(new RegExp(n.code).test(navigator.userAgent)){e=n.os;break}}return e}static hasWebRTCSupport(){let t=!1;try{navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia||window.RTCPeerConnection;t=!0}catch(e){t=!1}return t}static hasHLSSupport(e){return null!==e&&Boolean(e.canPlayType("application/vnd.apple.mpegURL")||e.canPlayType("audio/mpegurl"))}static hasMSESupport(){var e=window.MediaSource=window.MediaSource||window.WebKitMediaSource;return window.SourceBuffer=window.SourceBuffer||window.WebKitSourceBuffer,e&&"function"==typeof e.isTypeSupported}static hasMMSSupport(){return window.ManagedMediaSource}static isSSL(){return"https:"===location.protocol}}class p{constructor(e){var t;this.LOG_ACTIVITY=!1,this.isEnabled=!0,this.prefix="",this.logger=e.getLogger(),this.isEnabled=null!=(t=null==(t=null==(t=e.getConfigManager())?void 0:t.getSettingsData())?void 0:t.getStorageData().enabled)?t:this.isEnabled,this.prefix=null!=(t=null==(e=null==(t=e.getConfigManager())?void 0:t.getSettingsData())?void 0:e.getStorageData().prefix)?t:this.prefix,this.LOG_ACTIVITY&&this.logger.info(this,"Creating new StorageManager")}saveField(e,t){1==this.isEnabled&&(this.LOG_ACTIVITY&&this.logger.info(this,"Saving data: "+e+" | "+t),localStorage.setItem(this.prefix+e,t))}removeField(e){this.isEnabled&&(this.LOG_ACTIVITY&&this.logger.info(this,"Removing data: "+e),localStorage.removeItem(this.prefix+e))}getField(e){var t;return 1==this.isEnabled?(t=localStorage.getItem(this.prefix+e),this.LOG_ACTIVITY&&this.logger.info(this,"Grabbing data: "+e+" | "+t),t):null}}var C="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function v(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function f(){return V.Date.now()}var S=NaN,b="[object Symbol]",E=/^\s+|\s+$/g,w=/^[-+]0x[0-9a-f]+$/i,I=/^0b[01]+$/i,W=/^0o[0-7]+$/i,A=parseInt,C="object"==typeof C&&C&&C.Object===Object&&C,M="object"==typeof self&&self&&self.Object===Object&&self,V=C||M||Function("return this")(),F=Object.prototype.toString,U=Math.max,B=Math.min;function L(e){var t=typeof e;return e&&("object"==t||"function"==t)}function T(e){if("number"==typeof e)return e;if("symbol"==typeof(i=e)||!!(t=i)&&"object"==typeof t&&F.call(i)==b)return S;var t;if("string"!=typeof(e=L(e)?L(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(E,"");var i=I.test(e);return i||W.test(e)?A(e.slice(2),i?2:8):w.test(e)?S:+e}var D,y,z=v(function(n,i,e){var s,o,r,a,h,l,c=0,d=!1,g=!1,t=!0;if("function"!=typeof n)throw new TypeError("Expected a function");function u(e){var t=s,i=o;return s=o=void 0,c=e,a=n.apply(i,t)}function _(e){var t=e-l;return void 0===l||i<=t||t<0||g&&r<=e-c}function m(){var e,t=f();if(_(t))return p(t);h=setTimeout(m,(e=i-((t=t)-l),g?B(e,r-(t-c)):e))}function p(e){return h=void 0,t&&s?u(e):(s=o=void 0,a)}function C(){var e=f(),t=_(e);if(s=arguments,o=this,l=e,t){if(void 0===h)return c=e=l,h=setTimeout(m,i),d?u(e):a;if(g)return h=setTimeout(m,i),u(l)}return void 0===h&&(h=setTimeout(m,i)),a}return i=T(i)||0,L(e)&&(d=!!e.leading,g="maxWait"in e,r=g?U(T(e.maxWait)||0,i):r,t="trailing"in e?!!e.trailing:t),C.cancel=function(){void 0!==h&&clearTimeout(h),s=l=o=h=void(c=0)},C.flush=function(){return void 0===h?a:p(f())},C});class H{constructor(e){this.LOG_ACTIVITY=!0,this._volume=100,this._isMuted=!1,this._isMutedByBrowser=!1,this.onForceMute=()=>{this._isMuted=!0,this._isMutedByBrowser=!0,this.dispatchVolumeEvent()},this._main=e,this._logger=e.getLogger(),this._videoElement=document.createElement("video"),this._main.addEventListener("playbackForceMute",this.onForceMute,!1);let t=null!=(e=null==(e=this._main.getConfigManager())?void 0:e.getSettingsData().getAudioData().startVolume)?e:100,i=null!=(e=null==(e=this._main.getConfigManager())?void 0:e.getSettingsData().getAudioData().muted)&&e;null!=(null==(e=this._main.getStorageManager())?void 0:e.getField("volume"))&&(t=Number(this._main.getStorageManager().getField("volume"))),null!=(null==(e=this._main.getStorageManager())?void 0:e.getField("muted"))&&"true"==this._main.getStorageManager().getField("muted")&&(i=!0,this._isMutedByBrowser=!0),this._volume=t,this._isMuted=i,this.LOG_ACTIVITY&&this._logger.info(this,"VideoElement :: Start Volume: "+this._volume+" | Muted: "+this._isMuted),this._videoElement.volume=this._volume/100,this._videoElement.muted=this._isMuted,this._videoElement.setAttribute("playsinline","playsinline"),this._videoElement.setAttribute("webkit-playsinline","webkit-playsinline"),this._main.dispatchEvent("videoElementCreate",{ref:this._main,videoElement:this._videoElement}),this.initialize()}initialize(){this._videoElement.onload=function(e){},this._videoElement.onstalled=e=>{this._logger.info(this,"VideoElement :: onstalled")},this._videoElement.onerror=e=>{this._logger.info(this,"VideoElement :: onerror :: "+JSON.stringify(e))},this._videoElement.onvolumechange=()=>{this.dispatchVolumeEvent()},this._videoElement.onpause=()=>{},this._videoElement.addEventListener("loadedmetadata",()=>{this._main.dispatchEvent("metadata",{ref:this._main,videoWidth:this._videoElement.videoWidth,videoHeight:this._videoElement.videoHeight})}),this._videoElement.ontimeupdate=function(e){},this._videoElement.onended=e=>{this._logger.info(this,"VideoElement :: onended")},this._videoElement.onplay=()=>{}}setVolume(e){this._isMuted&&0<e&&this.setMuted(!1),this._volume=e,this._videoElement.volume=e/100,this._main.getStorageManager().saveField("volume",String(e)),0==e&&this.setMuted(!0)}getVolume(){return this._volume}setMuted(e){this._isMuted=e,this._videoElement.muted=e,this._isMutedByBrowser=!1,this._main.getStorageManager().saveField("muted",String(e)),0!=this.getVolume()||e||this.setVolume(100)}getIfMuted(){return this._isMuted}dispatchVolumeEvent(){var e=this._isMutedByBrowser?"browser":"user",t={volume:this._volume,isMuted:this._isMuted,type:e};this.LOG_ACTIVITY&&this._logger.info(this,"ScreenElement :: Event: onVolumeChange: "+JSON.stringify(t)),this._main.dispatchEvent("volumeChange",{ref:this._main,volume:this._volume,muted:this._isMuted,invokedBy:e})}getVideoElement(){return this._videoElement}}class O{constructor(e){this._containerWidth=0,this._tempContainerWidth=0,this._containerHeight=0,this._tempContainerHeight=0,this._videoWidth=0,this._videoHeight=0,this._scalingMode=s.FILL,this.isInFullScreenMode=!1,this._isResizing=!1,this._autoResizeEnabled=!0,this._parentOriginalOverflow="",this.onFullScreenChange=()=>{null==document.fullscreenElement?(this.isInFullScreenMode=!1,this._logger.info(this,"The library has exited FullScreen mode!"),this._main.dispatchEvent("fullScreenExit",{ref:this._main})):(this.isInFullScreenMode=!0,this._logger.info(this,"The library has entered FullScreen mode!"),this._main.dispatchEvent("fullScreenEnter",{ref:this._main}))},this._main=e,this._logger=e.getLogger(),this._logger.info(this,"Creating new StageController"),this.initialize()}initialize(){var e=null!=(e=null==(e=null==(e=null==(e=this._main.getConfigManager())?void 0:e.getSettingsData())?void 0:e.getVideoData())?void 0:e.containerID)?e:null,t=(this._scalingMode=null!=(t=null==(t=this._main.getConfigManager())?void 0:t.getSettingsData().getVideoData().scalingMode)?t:s.FILL,this._videoContainer=document.createElement("div"),this._videoContainer.setAttribute("id","stormStreamer_"+this._main.getStreamerID()),this._videoContainer.style.overflow="hidden",this._videoContainer.style.position="relative",this._videoContainer.classList.add("stormStreamer"),this._screenElement=new H(this._main),this._videoContainer.appendChild(this._screenElement.getVideoElement()),this._main.getConfigManager().getSettingsData().getVideoData().resizeDebounce);this._resizeObserver=0<t?new ResizeObserver(z(()=>()=>{this._autoResizeEnabled&&this.handleResize()},t,{leading:!1,trailing:!0})):new ResizeObserver(()=>{this._autoResizeEnabled&&this.handleResize()}),document.addEventListener("fullscreenchange",this.onFullScreenChange,!1),document.addEventListener("webkitfullscreenchange",this.onFullScreenChange,!1),document.addEventListener("mozfullscreenchange",this.onFullScreenChange,!1),document.addEventListener("webkitendfullscreen",this.onFullScreenChange,!1),this._screenElement.getVideoElement().addEventListener("webkitendfullscreen",this.onFullScreenChange,!1),this._main.addEventListener("metadata",e=>{this._videoWidth=e.videoWidth,this._videoHeight=e.videoHeight,this.handleResize()},!1),e?this.attachToParent(e):this._logger.warning(this,'Could not create HTMLObject for the library - "containerID" was not provided')}attachToParent(e){let t=!1,i=null;return"string"==typeof e?(this._logger.info(this,"Attaching container to ID: "+e),i=document.getElementById(e)):e instanceof HTMLElement&&(this._logger.info(this,"Attaching container to HTMLElement: "+e),i=e),i===this._parentElement?(this._logger.warning(this,"attachToParent :: container is the same"),!1):(i&&this._videoContainer?(this._parentElement=i,this._parentElement.appendChild(this._videoContainer),this._resizeObserver.observe(this._parentElement),this._parentElement.addEventListener("transitionend",()=>{this.handleResize()}),this._main.dispatchEvent("containerChange",{ref:this._main,container:this._parentElement}),this.handleResize(),t=!0):(console.log("tempParentElement",i),console.log("this._videoContainer",this._videoContainer),this._logger.warning(this,"attachToParent :: container was not found")),t)}detachFromParent(){let e=!1;return null!=this._parentElement&&null!=this._videoContainer?(this._logger.info(this,"Detaching from parent: "+this._videoContainer),this._parentElement.removeChild(this._videoContainer),this._resizeObserver&&(this._resizeObserver.unobserve(this._parentElement),this._resizeObserver.disconnect()),this._autoResizeEnabled&&this._parentElement.removeEventListener("transitionend",this.handleResize),this._main.dispatchEvent("containerChange",{ref:this._main,container:null}),e=!0):this._logger.info(this,"Failed detaching from parent!"),this._parentElement=null,e}handleResize(){this._parentElement&&!this._isResizing&&(this._isResizing=!0,this._parentOriginalOverflow=this._parentElement.style.overflow,this._parentElement.style.overflow="hidden",requestAnimationFrame(()=>{this.calculateNewDimensions(),this._parentElement.style.overflow=this._parentOriginalOverflow,this._isResizing=!1,this._tempContainerWidth===this._containerWidth&&this._tempContainerHeight===this._containerHeight||this._main.dispatchEvent("resizeUpdate",{ref:this._main,width:this._tempContainerWidth,height:this._tempContainerHeight})}))}calculateNewDimensions(){var e=this._main.getConfigManager().getSettingsData().getVideoData().parentSizeCalculationMethod;switch(e){case i.CLIENT_DIMENSIONS:this._tempContainerWidth=this._parentElement.clientWidth,this._tempContainerHeight=this._parentElement.clientHeight;break;case i.BOUNDING_BOX:var t=this._parentElement.getBoundingClientRect();this._tempContainerWidth=t.width,this._tempContainerHeight=t.height;break;case i.FULL_BOX:t=class{static calculateDimensionsWithMargins(e){var t=window.getComputedStyle(e),e=e.getBoundingClientRect(),i=parseFloat(t.paddingLeft),n=parseFloat(t.paddingRight),s=parseFloat(t.paddingTop),o=parseFloat(t.paddingBottom),r=parseFloat(t.borderLeftWidth),a=parseFloat(t.borderRightWidth),h=parseFloat(t.borderTopWidth),t=parseFloat(t.borderBottomWidth);return{width:e.width-i-n-r-a,height:e.height-s-o-h-t}}}.calculateDimensionsWithMargins(this._parentElement);this._tempContainerWidth=t.width,this._tempContainerHeight=t.height}this._logger.info(this,`New dimensions calculated: ${this._tempContainerWidth}x${this._tempContainerHeight} (${e})`),this.resizeVideoContainer(),this.scaleVideo()}resizeVideoContainer(){var e=this._main.getConfigManager().getSettingsData().getVideoData().videoWidthInPixels,t=this._main.getConfigManager().getSettingsData().getVideoData().videoHeightInPixels,i=this._main.getConfigManager().getSettingsData().getVideoData().videoWidthValue,n=this._main.getConfigManager().getSettingsData().getVideoData().videoHeightValue,s=this._main.getConfigManager().getSettingsData().getVideoData().aspectRatio;let o=0,r=0;var a=Number(s.split(":")[0]),h=Number(s.split(":")[1]);"none"==s?(e?o=i:null!=this._parentElement&&(o=this._tempContainerWidth*i/100),t?r=n:null!=this._parentElement&&0==(r=this._tempContainerHeight*n/100)&&0!=this._videoHeight&&0!=this._videoWidth&&(r=this._videoHeight*o/this._videoWidth)):(e?o=i:null!=this._parentElement&&(o=this._tempContainerWidth*i/100),r=o*h/a),this._containerWidth=Math.ceil(o),this._containerHeight=Math.ceil(r),null!==this._videoContainer&&(this._videoContainer.style.width=this._containerWidth+"px",this._videoContainer.style.height=this._containerHeight+"px")}scaleVideo(){if(null!==this._screenElement){let e=0,t=0,i=0,n=0;switch(this._scalingMode){case s.FILL:i=this._containerWidth,n=this._containerHeight;break;case s.CROP:i=this._containerWidth,(n=this._videoHeight*this._containerWidth/this._videoWidth)>=this._containerHeight?(e=0,t=(n-this._containerHeight)/2*-1):(n=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case s.LETTER_BOX:i=this._containerWidth,(!((n=this._videoHeight*this._containerWidth/this._videoWidth)<=this._containerHeight)||(e=0,t=(n-this._containerHeight)/2*-1,n>this._containerHeight))&&(n=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case s.ORIGINAL:i=this._videoWidth,n=this._videoHeight,e=(this._videoWidth-this._containerWidth)/-2,t=(this._videoHeight-this._containerHeight)/-2}this._screenElement.getVideoElement().style.left=Math.floor(e)+"px",this._screenElement.getVideoElement().style.top=Math.floor(t)+"px",this._screenElement.getVideoElement().style.width=Math.ceil(i)+"px",this._screenElement.getVideoElement().style.height=Math.ceil(n)+"px",this._screenElement.getVideoElement().style.position="absolute",this._screenElement.getVideoElement().style.objectFit="fill"}}enterFullScreen(){var e;null!=(e=this._screenElement)&&e.getVideoElement().webkitEnterFullScreen?null!=(e=this._screenElement)&&e.getVideoElement().webkitEnterFullScreen():null!=(e=this._screenElement)&&e.getVideoElement().requestFullscreen()}exitFullScreen(){var e;null!=(e=this._screenElement)&&e.getVideoElement().webkitExitFullscreen?document.webkitExitFullscreen():document.exitFullscreen()}isFullScreenMode(){return this.isInFullScreenMode}setDimension(e,t){var i="width"===e?"videoWidth":"videoHeight";let n,s;if("number"==typeof t)s=t,n=!0;else{if("string"!=typeof t)throw new Error(`Unknown value for parameter "${e}" - it must be a number or a string!`);s=parseInt(t),n=t.toLowerCase().endsWith("px")}this._main.getConfigManager().getSettingsData().getVideoData()[i+"Value"]=s,this._main.getConfigManager().getSettingsData().getVideoData()[i+"InPixels"]=n,this.resizeVideoContainer(),this.scaleVideo()}setSize(e,t){this.setDimension("width",e),this.setDimension("height",t)}setWidth(e){this.setDimension("width",e)}setHeight(e){this.setDimension("height",e)}getParentElement(){return this._parentElement}setScalingMode(e){switch(e.toLowerCase()){case"fill":this._scalingMode=s.FILL;break;case"crop":this._scalingMode=s.CROP;break;case"letterbox":this._scalingMode=s.LETTER_BOX;break;case"original":this._scalingMode=s.ORIGINAL}this.scaleVideo()}getContainerWidth(){return this._containerWidth}getContainerHeight(){return this._containerHeight}getScalingModeAsString(){let e="";switch(this._scalingMode){case s.FILL:e="fill";break;case s.CROP:e="crop";break;case s.LETTER_BOX:e="letterbox";break;case s.ORIGINAL:e="original"}return e}getScalingMode(){return this._scalingMode}getScreenElement(){return this._screenElement}getContainer(){return this._videoContainer}destroy(){this.detachFromParent()}}function R(e,r,a,h){return new(a=a||Promise)(function(i,t){function n(e){try{o(h.next(e))}catch(e){t(e)}}function s(e){try{o(h.throw(e))}catch(e){t(e)}}function o(e){var t;e.done?i(e.value):((t=e.value)instanceof a?t:new a(function(e){e(t)})).then(n,s)}o((h=h.apply(e,r||[])).next())})}O.LOG_ACTIVITY=!0,"function"==typeof SuppressedError&&SuppressedError;class N{constructor(){}addAudio(e,t){let i="",n="",s=!1;for(const o of e.split(/\r\n/))o.length<=0||(0===o.indexOf("m=audio")?i="audio":0===o.indexOf("m=video")&&(i="video"),n=n+o+"\r\n","audio"!==i)||0!=="a=rtcp-mux".localeCompare(o)||s||(n+=t,s=!0);return n}addVideo(e,t){e=e.split(/\r\n/);let i="",n=!1,s=!1;for(const r of e)r.length<=0||(r.includes("a=rtcp-rsize")&&(s=!0),r.includes("a=rtcp-mux"));let o=!1;for(const a of e)a.startsWith("m=video")&&(o=!0),i=i+a+"\r\n",o&&(0==="a=rtcp-rsize".localeCompare(a)&&!n&&s&&(i+=t,n=!0),0==="a=rtcp-mux".localeCompare(a)&&n&&!s&&(i+=t,n=!0),0!=="a=rtcp-mux".localeCompare(a)||n||s||(n=!0));return i}deliverCheckLine(e,t){for(const n in N.SDPOutput){var i=N.SDPOutput[n];if(i.includes(e)){if(e.includes("VP9")||e.includes("VP8")){let e="";for(const s of i.split(/\r\n/))e=e+s+"\r\n";return t.includes("audio")&&(N.audioIndex=parseInt(n)),t.includes("video")&&(N.videoIndex=parseInt(n)),e}return t.includes("audio")&&(N.audioIndex=parseInt(n)),t.includes("video")&&(N.videoIndex=parseInt(n)),i}}return""}checkLine(t){if(t.startsWith("a=rtpmap")||t.startsWith("a=rtcp-fb")||t.startsWith("a=fmtp")){var i=t.split(":");if(1<i.length){i=i[1].split(" ");if(!isNaN(parseInt(i[0]))&&!i[1].startsWith("http")&&!i[1].startsWith("ur")){let e=N.SDPOutput[i[0]];return e=e||"",e+=t+"\r\n",N.SDPOutput[i[0]]=e,!1}}}return!0}getrtpMapID(e){var t=new RegExp("a=rtpmap:(\\d+) (\\w+)/(\\d+)"),e=e.match(t);return e&&3<=e.length?e:null}mungeSDPPublish(e,t){N.SDPOutput={},N.videoChoice="42e01f",N.audioChoice="opus",N.videoIndex=-1,N.audioIndex=-1;e=e.split(/\r\n/);let i="header",n=!1,s="";null!=t.videoCodec&&""!==t.videoCodec&&(N.videoChoice=t.videoCodec),null!=t.audioCodec&&""!==t.audioCodec&&(N.audioChoice=t.audioCodec);for(const a of e)a.length<=0||this.checkLine(a)&&(s=s+a+"\r\n");s=this.addAudio(s,this.deliverCheckLine(N.audioChoice,"audio"));var o,r,e=(s=this.addVideo(s,this.deliverCheckLine(N.videoChoice,"video"))).split(/\r\n/);s="";for(const h of e)if(!(h.length<=0)){let e;if(0===h.indexOf("m=audio")&&-1!==N.audioIndex)e=h.split(" "),s+=e[0]+" "+e[1]+" "+e[2]+" "+N.audioIndex+"\r\n",i="audio",n=!1;else if(0===h.indexOf("m=video")&&-1!==N.videoIndex)e=h.split(" "),s+=e[0]+" "+e[1]+" "+e[2]+" "+N.videoIndex+"\r\n",i="video",n=!1;else{if(s+=h,0===h.indexOf("a=rtpmap")&&(i="bandwidth",n=!1),"chrome"!==m.getBrowserName().toLowerCase()&&"safari"!==m.getBrowserName().toLowerCase()||0!==h.indexOf("a=mid:")&&0!==h.indexOf("a=rtpmap")||n||(0==="audio".localeCompare(i)?(void 0!==t.audioBitrate&&""!==t.audioBitrate&&(s=(s+="\r\nb=CT:"+t.audioBitrate)+"\r\nb=AS:"+t.audioBitrate),n=!0):0==="video".localeCompare(i)?(void 0!==t.videoBitrate&&""!==t.videoBitrate&&(s=(s+="\r\nb=CT:"+t.videoBitrate)+"\r\nb=AS:"+t.videoBitrate,void 0!==t.videoFrameRate)&&(s+="\r\na=framerate:"+t.videoFrameRate),n=!0):"chrome"===m.getBrowserName().toLowerCase()&&0==="bandwidth".localeCompare(i)&&null!==(r=this.getrtpMapID(h))&&(o=r[2].toLowerCase(),0!=="vp9".localeCompare(o)&&0!=="vp8".localeCompare(o)&&0!=="h264".localeCompare(o)&&0!=="red".localeCompare(o)&&0!=="ulpfec".localeCompare(o)&&0!=="rtx".localeCompare(o)||void 0!==t.videoBitrate&&(s+="\r\na=fmtp:"+r[1]+" x-google-min-bitrate="+t.videoBitrate+";x-google-max-bitrate="+t.videoBitrate),0!=="opus".localeCompare(o)&&0!=="isac".localeCompare(o)&&0!=="g722".localeCompare(o)&&0!=="pcmu".localeCompare(o)&&0!=="pcma".localeCompare(o)&&0!=="cn".localeCompare(o)||void 0!==t.audioBitrate&&(s+="\r\na=fmtp:"+r[1]+" x-google-min-bitrate="+t.audioBitrate+";x-google-max-bitrate="+t.audioBitrate))),"firefox"===m.getBrowserName().toLowerCase()&&0===h.indexOf("c=IN")){if(0==="audio".localeCompare(i)){""!==t.audioBitrate&&"string"==typeof t.audioBitrate&&(o=parseInt(t.audioBitrate),s=(s+="\r\nb=TIAS:"+(1e3*o*.95-16e3)+"\r\n")+"b=AS:"+o+"\r\nb=CT:"+o+"\r\n");continue}if(0==="video".localeCompare(i)){""!==t.videoBitrate&&"string"==typeof t.videoBitrate&&(r=parseInt(t.videoBitrate),s=(s+="\r\nb=TIAS:"+1e3*(1e3*r*.95-16e3)+"\r\n")+"b=AS:"+r+"\r\nb=CT:"+r+"\r\n");continue}}s+="\r\n"}}return s}mungeSDPPlay(e){let n="";for(const r of e.split(/\r\n/))if(0!==r.length){if(r.includes("profile-level-id")){var s=r.substr(r.indexOf("profile-level-id")+17,6);let e=Number("0x"+s.substr(0,2)),t=Number("0x"+s.substr(2,2)),i=Number("0x"+s.substr(4,2));66<e&&(e=66,t=224,i=31),0===t&&(t=224);var o=("00"+e.toString(16)).slice(-2).toLowerCase()+("00"+t.toString(16)).slice(-2).toLowerCase()+("00"+i.toString(16)).slice(-2).toLowerCase();n+=r.replace(s,o)}else n+=r;n+="\r\n"}return n}}N.SDPOutput={},(C=D=D||{})[C.VIDEO_INPUT=0]="VIDEO_INPUT",C[C.AUDIO_INPUT=1]="AUDIO_INPUT";class k{constructor(e,t){if(this._groupID="",this._isSelected=!1,null==e)throw new Error("no input device");if(void 0===e.deviceId||null===e.deviceId)throw new Error("no deviceID");if(this._id=e.deviceId,void 0===e.kind||null===e.kind)throw new Error("no device kind");switch(e.kind){case"videoinput":this._inputType=D.VIDEO_INPUT;break;case"audioinput":this._inputType=D.AUDIO_INPUT;break;default:throw new Error("incorrect kind")}null!==e.label&&""!==e.label?this._label=this.cleanLabel(e.label):this._label=this._inputType==D.VIDEO_INPUT?"Camera "+t:"Microphone "+t,void 0!==e.groupId&&null!==e.groupId&&(this._groupID=e.groupId)}cleanLabel(e){return e}getLabel(){return this._label}getID(){return this._id}getGroupID(){return this._groupID}getIfSelected(){return this._isSelected}setSelected(e){this._isSelected=e}}class P{constructor(){this._internalList=new Array}push(t){let i=!1;if(0<this._internalList.length){for(let e=0;e<this._internalList.length;e++)""!==this._internalList[e].getGroupID()&&this._internalList[e].getGroupID()==t.getGroupID()&&(i=!0,this._internalList[e]=t);return 0==i?this._internalList.push(t):this._internalList.length}return this._internalList.push(t)}get(e){return this._internalList[e]}getSize(){return this._internalList.length}getArray(){return this._internalList}}c.PublishState=void 0,(M=c.PublishState||(c.PublishState={})).NOT_INITIALIZED="NOT_INITIALIZED",M.INITIALIZED="INITIALIZED",M.CONNECTING="CONNECTING",M.PUBLISHED="PUBLISHED",M.UNPUBLISHED="UNPUBLISHED",M.STOPPED="STOPPED",M.UNKNOWN="UNKNOWN",M.ERROR="ERROR";class G{constructor(e){this._stream=null,this._audioContext=null,this._analyser=null,this._microphone=null,this._lastEventTime=0,this.THROTTLE_INTERVAL=100,this._instant=0,this._slow=0,this._clip=0,this._main=e}attach(e){this._stream=e,this._audioContext=new AudioContext,this._microphone=this._audioContext.createMediaStreamSource(e),this._analyser=this._audioContext.createAnalyser(),this._analyser.fftSize=2048,this._analyser.smoothingTimeConstant=.3,this._microphone.connect(this._analyser),this.startMonitoring()}detach(){this._microphone&&(this._microphone.disconnect(),this._microphone=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null),this._audioContext&&(this._audioContext.close(),this._audioContext=null),this._stream=null,this.clear()}clear(){this._instant=0,this._slow=0,this._clip=0}startMonitoring(){if(this._analyser){const s=new Float32Array(this._analyser.frequencyBinCount),o=()=>{if(this._analyser){var e=Date.now();this._analyser.getFloatTimeDomainData(s);let t=0,i=0;for(let e=0;e<s.length;++e){var n=3.16*s[e];t+=n*n,.99<Math.abs(n)&&(i+=1)}this._instant=Math.min(1,Math.sqrt(t/s.length)),this._slow=Math.min(1,.05*this._instant+.95*this._slow),this._clip=i/s.length,e-this._lastEventTime>=this.THROTTLE_INTERVAL&&(this._lastEventTime=e,this._main.dispatchEvent("soundMeter",{ref:this._main,high:Number(this._instant.toFixed(4)),low:Number(this._slow.toFixed(4))})),requestAnimationFrame(o)}};requestAnimationFrame(o)}}}class K{constructor(e){this._isWindowActive=!0,this._peerConnectionConfig={iceServers:[]},this._isMicrophoneMuted=!1,this._pendingMicrophoneState=null,this._permissionChecked=!1,this._constraints={video:{width:{min:"640",ideal:"1024",max:"1024"},height:{min:"360",ideal:"576",max:"576"},frameRate:{min:24,ideal:30,max:30}},audio:!0},this._publishState=c.PublishState.NOT_INITIALIZED,this.onServerDisconnect=()=>{},this.onServerConnect=()=>{if(this._peerConnection&&this.closeWebRTCConnection(),this._peerConnection=new RTCPeerConnection(this._peerConnectionConfig),this._peerConnection.onicecandidate=e=>{this.onIceCandidate(e)},this._peerConnection.onconnectionstatechange=e=>{this.onConnectionStateChange(e)},this._peerConnection.onnegotiationneeded=e=>{this._peerConnection&&this._peerConnection.createOffer(e=>{this.onDescriptionSuccess(e)},e=>{this.onDescriptionError(e)}).catch(e=>{console.log(e)})},this._stream){var e,t=this._stream.getTracks();for(e in t)this._peerConnection.addTrack(t[e],this._stream)}},this.onDescriptionSuccess=t=>{var e;console.log("%cāµ šŸŽ„ onDescriptionSuccess ","background: green; color: white;");const i={applicationName:null==(e=null==(e=this._main.getNetworkController())?void 0:e.getConnection().getCurrentServer())?void 0:e.getApplication(),streamName:null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey,sessionId:"[empty]"};t.sdp=this._mungeSDP.mungeSDPPublish(t.sdp,{audioBitrate:"64",videoBitrate:"1500",videoFrameRate:30,videoCodec:"42e01f",audioCodec:"opus"}),this._peerConnection&&this._peerConnection.setLocalDescription(t).then(()=>{var e;null!=(e=this._main.getNetworkController())&&e.sendMessage('{"direction":"publish", "command":"sendOffer", "streamInfo":'+JSON.stringify(i)+', "sdp":'+JSON.stringify(t)+"}")}).catch(e=>{console.log(e)})},this.visibilityChange=()=>{"hidden"===document.visibilityState?this.onWindowBlur():"visible"===document.visibilityState&&this.onWindowFocus()},this.onWindowBlur=()=>{this._isWindowActive&&this._logger.warning(this,"Player window is no longer in focus!"),this._isWindowActive=!1},this.onWindowFocus=()=>{this._isWindowActive||this._logger.info(this,"Player window is focused again!"),this._isWindowActive=!0},this._main=e,this._logger=e.getLogger(),this._mungeSDP=new N,this._soundMeter=new G(this._main),this.initializeDevices()}initialize(){var e;this._main.addEventListener("serverConnect",this.onServerConnect,!1),this._main.addEventListener("serverDisconnect",this.onServerDisconnect,!1),document.addEventListener("visibilitychange",this.visibilityChange),window.addEventListener("blur",this.onWindowBlur),window.addEventListener("focus",this.onWindowFocus),(this._selectedCamera||this._selectedMicrophone)&&this.startCamera().then(()=>{var e;null!=(null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey)&&this.initializeWebRTC()}),null!=(e=this._main.getConfigManager())&&e.getSettingsData().autoConnect?(this._logger.info(this,"Initializing NetworkController (autoConnect is true)"),null!=(e=this._main.getNetworkController())&&e.initialize()):this._logger.warning(this,"Warning - autoConnect is set to false, switching to standby mode!"),this.setupPermissionListeners()}initializeDevices(){return R(this,void 0,void 0,function*(){try{yield this.grabDevices(),this.setupPermissionListeners(),this.initialize()}catch(e){this._logger.error(this,"Error initializing devices: "+JSON.stringify(e)),this.initialize()}})}setupPermissionListeners(){navigator.permissions.query({name:"camera"}).then(e=>{e.onchange=()=>{this._permissionChecked=!1,this.handlePermissionChange("camera",e.state)}}),navigator.permissions.query({name:"microphone"}).then(e=>{e.onchange=()=>{this._permissionChecked=!1,this.handlePermissionChange("microphone",e.state)}})}handlePermissionChange(e,t){return R(this,void 0,void 0,function*(){"denied"===t&&this._publishState==c.PublishState.PUBLISHED&&this.closeStream(),yield this.grabDevices(),"granted"===t&&(yield this.startCamera())})}onCameraStreamSuccess(e){this._logger.success(this,"Camera stream successfully retrieved"),this._stream=e,null!==this._pendingMicrophoneState?(this.applyMicrophoneState(this._pendingMicrophoneState),this._pendingMicrophoneState=null):this.applyMicrophoneState(!this._isMicrophoneMuted),0<this._stream.getAudioTracks().length&&this._soundMeter.attach(this._stream),null!=this._cameraList&&null!=this._microphoneList||this.grabDevices();var t=this._main.getStageController().getScreenElement().getVideoElement();t.srcObject=e,t.autoplay=!0,t.playsInline=!0,t.disableRemotePlayback=!0,t.controls=!1,t.muted=!0,this.setPublishState(c.PublishState.INITIALIZED)}initializeWebRTC(){var e;this._stream?this._peerConnection?(this._logger.info(this,"WebRTC connection already exists, updating stream"),this.updateWebRTCStream()):(this._logger.info(this,"Initializing new WebRTC connection"),null!=(e=this._main.getNetworkController())&&e.start()):this._logger.error(this,"Cannot initialize WebRTC - no camera stream available")}publish(e){return this.isStreamReady(!0,!0)?(this.closeWebRTCConnection(),this._main.getConfigManager().getStreamData().streamKey=e,this._main.dispatchEvent("publish",{ref:this._main,streamKey:e}),this.initializeWebRTC(),!0):(this._logger.warning(this,"Cannot publish - stream not ready (missing video or audio track)"),!1)}unpublish(){this._main.getConfigManager().getStreamData().streamKey=null,this._main.dispatchEvent("unpublish",{ref:this._main}),this.closeStream()}onUserMediaError(e){return R(this,void 0,void 0,function*(){yield this.grabDevices(),"OverconstrainedError"===e.name&&this._logger.warning(this,"Device constraints not satisfied")})}checkIndividualDeviceAccess(){return R(this,void 0,void 0,function*(){var t={camera:{allowed:!1,available:!1},microphone:{allowed:!1,available:!1}},e=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),i=/edg/i.test(navigator.userAgent),n=-1<navigator.userAgent.toLowerCase().indexOf("firefox");try{var s=yield navigator.mediaDevices.enumerateDevices();t.camera.available=s.some(e=>"videoinput"===e.kind),t.microphone.available=s.some(e=>"audioinput"===e.kind)}catch(e){console.error("Error checking device availability:",e)}if(n){if(console.log("Firefox detected, using direct getUserMedia check..."),t.camera.available)try{var o=yield navigator.mediaDevices.getUserMedia({video:!0});t.camera.allowed=!0,o.getTracks().forEach(e=>e.stop())}catch(e){console.log("Camera permission check failed:",e),t.camera.allowed=!1}if(t.microphone.available)try{var r=yield navigator.mediaDevices.getUserMedia({audio:!0});t.microphone.allowed=!0,r.getTracks().forEach(e=>e.stop())}catch(e){console.log("Microphone permission check failed:",e),t.microphone.allowed=!1}}else try{var[a,h]=yield Promise.all([navigator.permissions.query({name:"camera"}),navigator.permissions.query({name:"microphone"})]);if(t.camera.allowed="granted"===a.state,t.microphone.allowed="granted"===h.state,(e||i)&&(!t.camera.allowed||!t.microphone.allowed))try{var l=yield navigator.mediaDevices.getUserMedia({video:t.camera.available&&!t.camera.allowed,audio:t.microphone.available&&!t.microphone.allowed});0<l.getVideoTracks().length&&(t.camera.allowed=!0),0<l.getAudioTracks().length&&(t.microphone.allowed=!0),l.getTracks().forEach(e=>e.stop())}catch(e){console.log("Additional permission check failed:",e)}}catch(e){console.error("Error checking permissions:",e)}return t})}onSocketMessage(e){var t=JSON.parse(e);switch(Number(t.status)){case 200:console.log("%cāµ šŸŽ„ onSocketMessage: 200","background: green; color: white;");var i=t.sdp,n=(void 0!==i&&this._peerConnection.setRemoteDescription(new RTCSessionDescription(i),()=>{},()=>{}),t.iceCandidates);if(void 0!==n)for(var s in n)this._peerConnection&&this._peerConnection.addIceCandidate(new RTCIceCandidate(n[s]));break;case 503:console.log("%cāµ šŸŽ„ onSocketMessage: 503","background: green; color: white;"),this._main.dispatchEvent("streamKeyInUse",{ref:this._main,streamKey:this._main.getConfigManager().getStreamData().streamKey}),this.setPublishState(c.PublishState.ERROR)}}onConnectionStateChange(e){if(console.log("%cāµ šŸŽ„ onConnectionStateChange: "+e.currentTarget.connectionState,"background: green; color: white;"),null!==e)switch(e.currentTarget.connectionState){case"connecting":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnecting"),this.setPublishState(c.PublishState.CONNECTING);break;case"connected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnected"),this.setPublishState(c.PublishState.PUBLISHED),this.muteMicrophone(this._isMicrophoneMuted);break;case"disconnected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerDisconnected"),this.setPublishState(c.PublishState.UNPUBLISHED);break;case"failed":this._logger.info(this,"WebRTCStreamer :: Event: onPlayerFailed"),this.setPublishState(c.PublishState.ERROR);break;default:this._logger.info(this,"WebRTCStreamer :: Unsupported onConnectionStateChange: "+e.currentTarget.connectionState)}}grabDevices(){return R(this,void 0,void 0,function*(){try{var e,t,i=yield this.checkIndividualDeviceAccess(),n=(this._cameraList=new P,this._microphoneList=new P,this._permissionChecked||(i.camera.allowed?i.camera.available||this._main.dispatchEvent("noCameraFound",{ref:this._main}):this._main.dispatchEvent("cameraAccessDenied",{ref:this._main}),i.microphone.allowed?i.microphone.available||this._main.dispatchEvent("noMicrophoneFound",{ref:this._main}):this._main.dispatchEvent("microphoneAccessDenied",{ref:this._main})),yield navigator.mediaDevices.enumerateDevices());for(const s of n)s.deviceId&&s.label&&("videoinput"===s.kind&&i.camera.allowed?(e=new k(s,this._cameraList.getSize()),this._cameraList.push(e)):"audioinput"===s.kind&&i.microphone.allowed&&(t=new k(s,this._microphoneList.getSize()),this._microphoneList.push(t)));try{i.camera.allowed&&(this._selectedCamera=this.pickCamera()),i.microphone.allowed&&(this._selectedMicrophone=this.pickMicrophone())}catch(e){this._logger.error(this,"Errror on grab devices: "+JSON.stringify(e))}this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._permissionChecked=!0}catch(e){console.error("Error in grabDevices:",e),this._cameraList=new P,this._microphoneList=new P,this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._main.dispatchEvent("inputDeviceError",{ref:this._main})}})}selectCamera(t){var e,i;const n=null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey,s=this._publishState===c.PublishState.PUBLISHED;for(let e=0;e<this._cameraList.getSize();e++)if(this._cameraList.get(e).getID()==t){this._selectedCamera=this._cameraList.get(e),console.log("kamera znaleziona i zapisana "+this._cameraList.get(e).getLabel()+" "+this._cameraList.get(e).getID()),null!=(i=this._main.getStorageManager())&&i.saveField("cameraID",this._selectedCamera.getID());break}this.stopCameraStream(),this._constraints.video.deviceId=this._selectedCamera.getID(),this.startCamera().then(()=>{s&&n&&this.publish(n)})}selectMicrophone(s){var o,r,a,h,l;return R(this,void 0,void 0,function*(){console.log("šŸŽ¤ Selecting microphone:",s);var e=null==(r=this._main.getConfigManager())?void 0:r.getStreamData().streamKey,t=this._publishState===c.PublishState.PUBLISHED;for(let e=0;e<this._microphoneList.getSize();e++)if(this._microphoneList.get(e).getID()==s){this._selectedMicrophone=this._microphoneList.get(e),null!=(o=this._main.getStorageManager())&&o.saveField("microphoneID",this._selectedMicrophone.getID());break}this._soundMeter.detach(),null!=(r=this._stream)&&r.getAudioTracks().forEach(e=>e.stop());try{var i=yield navigator.mediaDevices.getUserMedia({audio:{deviceId:{exact:null==(a=this._selectedMicrophone)?void 0:a.getID()}}}),n=(((null==(h=this._stream)?void 0:h.getAudioTracks())||[]).forEach(e=>{var t;null!=(t=this._stream)&&t.removeTrack(e),e.stop()}),i.getAudioTracks()[0]);null!=(l=this._stream)&&l.addTrack(n),this._soundMeter.detach(),yield new Promise(e=>setTimeout(e,100)),this._stream&&this._soundMeter.attach(this._stream),t&&e&&this.publish(e)}catch(e){console.error("Error changing microphone:",e)}})}startCamera(){return R(this,void 0,void 0,function*(){this._stream&&(console.log("Stopping existing stream before starting new one"),this._stream.getTracks().forEach(e=>{e.stop()}),this._stream=null);try{var t={video:!!this._selectedCamera&&Object.assign(Object.assign({},this._constraints.video),{deviceId:{exact:this._selectedCamera.getID()}}),audio:!!this._selectedMicrophone&&{deviceId:{exact:this._selectedMicrophone.getID()}}};try{var e=yield navigator.mediaDevices.getUserMedia(t);this._stream=e,this.onCameraStreamSuccess(this._stream)}catch(e){t.video&&this.onUserMediaError({name:e.name||"Error",message:e.message||"Unknown error",deviceType:"video"}),t.audio&&this.onUserMediaError({name:e.name||"Error",message:e.message||"Unknown error",deviceType:"audio"})}}catch(e){console.error("Error in startCamera:",e),yield this.grabDevices()}})}updateWebRTCStream(){this._peerConnection&&this._stream&&(this._peerConnection.getSenders().forEach(e=>{this._peerConnection&&this._peerConnection.removeTrack(e)}),this._stream.getTracks().forEach(e=>{null!=this._stream&&this._peerConnection&&this._peerConnection.addTrack(e,this._stream)}))}closeStream(){void 0!==this._peerConnection&&null!==this._peerConnection&&this._peerConnection.close(),this.setPublishState(c.PublishState.UNPUBLISHED)}pickCamera(){var e;for(let e=0;e<this._cameraList.getSize();e++)this._cameraList.get(e).setSelected(!1);var i=null!=(e=null==(e=this._main.getStorageManager())?void 0:e.getField("cameraID"))?e:null;if(0<this._cameraList.getSize()){if(i){let t=!1;for(let e=0;e<this._cameraList.getSize();e++)if(this._cameraList.get(e).getID()===i){this._selectedCamera=this._cameraList.get(e),this._selectedCamera.setSelected(!0),t=!0,this._constraints.video.deviceId=this._selectedCamera.getID();break}if(!t)throw this._main.dispatchEvent("savedCameraNotFound",{ref:this._main}),new Error("Specific camera was not found!")}this._selectedCamera||(this._main.dispatchEvent("savedCameraNotFound",{ref:this._main}),this._selectedCamera=this._cameraList.get(0),this._selectedCamera.setSelected(!0),this._constraints.video.deviceId=this._selectedCamera.getID())}return this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._selectedCamera}pickMicrophone(){var e;for(let e=0;e<this._microphoneList.getSize();e++)this._microphoneList.get(e).setSelected(!1);var i=null!=(e=null==(e=this._main.getStorageManager())?void 0:e.getField("microphoneID"))?e:null;if(0<this._microphoneList.getSize()){if(i){let t=!1;for(let e=0;e<this._microphoneList.getSize();e++)if(this._microphoneList.get(e).getID()===i){this._selectedMicrophone=this._microphoneList.get(e),t=!0;break}if(!t)throw this._main.dispatchEvent("savedMicrophoneNotFound",{ref:this._main}),new Error("Specific microphone was not found!")}this._selectedMicrophone||(this._selectedMicrophone=this._microphoneList.get(0)),this._selectedMicrophone.setSelected(!0),this._constraints.audio={deviceId:this._selectedMicrophone.getID()}}return this._selectedMicrophone}clearSavedDevices(){var e;null!=(e=this._main.getStorageManager())&&e.removeField("cameraID"),null!=(e=this._main.getStorageManager())&&e.removeField("microphoneID")}messSavedDevices(){var e;null!=(e=this._main.getStorageManager())&&e.saveField("cameraID","a"),null!=(e=this._main.getStorageManager())&&e.saveField("microphoneID","b")}muteMicrophone(e){this._isMicrophoneMuted!==e&&(this._isMicrophoneMuted=e,this._stream?this.applyMicrophoneState(!e):(this._pendingMicrophoneState=!e,this._logger.info(this,`WebRTCStreamer :: Stream not yet available, storing microphone state (muted: ${e})`)),this._main.dispatchEvent("microphoneStateChange",{ref:this._main,isMuted:this._isMicrophoneMuted}))}applyMicrophoneState(t){var e;this._stream?(e=this._stream.getAudioTracks())&&0<e.length?(this._logger.success(this,`WebRTCStreamer :: ${t?"Unmuting":"Muting"} microphone`),e.forEach(e=>e.enabled=t)):this._logger.warning(this,"WebRTCStreamer :: No audio tracks found in stream"):this._logger.warning(this,"WebRTCStreamer :: Cannot apply microphone state - stream not available")}isMicrophoneMuted(){return this._isMicrophoneMuted}isStreamReady(e=!0,t=!0){var i,n;return!!this._stream&&(n=this._stream.getVideoTracks(),i=this._stream.getAudioTracks(),e=!e||0<n.length&&"live"===n[0].readyState,n=!t||0<i.length&&"live"===i[0].readyState,e)&&n}closeWebRTCConnection(){this._peerConnection&&(this._peerConnection.close(),this._peerConnection=null)}onDescriptionError(e){this._logger.info(this,"WebRTCStreamer :: onDescriptionError: "+JSON.stringify(e))}onIceCandidate(e){e.candidate}getCurrentCamera(){return this._selectedCamera}getCurrentMicrophone(){return this._selectedMicrophone}setPublishState(e){this._publishState=e,this._main.dispatchEvent("publishStateChange",{ref:this._main,state:this._publishState})}getCameraList(){return null!=this._cameraList?this._cameraList.getArray():[]}getMicrophoneList(){return null!=this._microphoneList?this._microphoneList.getArray():[]}getPublishState(){return this._publishState}getPlayer(){return this._selectedPlayer}stopCameraStream(){var e;this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),(e=null==(e=null==(e=this._main.getStageController())?void 0:e.getScreenElement())?void 0:e.getVideoElement())&&(e.srcObject=null),this._soundMeter.detach(),this._stream=null)}forceStopAllStreams(){var e,t;if(console.log("Force stopping all streams..."),this._peerConnection)try{this._peerConnection.getSenders().forEach(e=>{var t;try{e.track&&(e.track.enabled=!1,e.track.stop(),null!=(t=this._peerConnection))&&t.removeTrack(e)}catch(e){console.error("Error stopping sender track:",e)}}),this._peerConnection.close(),this._peerConnection=null}catch(e){console.error("Error closing peer connection:",e)}try{var i=null==(t=null==(e=this._main.getStageController())?void 0:e.getScreenElement())?void 0:t.getVideoElement();i&&i.srcObject instanceof MediaStream&&(i.srcObject.getTracks().forEach(e=>{try{e.enabled=!1,e.stop()}catch(e){console.error("Error stopping video element track:",e)}}),i.srcObject=null,i.removeAttribute("src"),i.load())}catch(e){console.error("Error cleaning video element:",e)}if(this._stream)try{var n=this._stream.getTracks();console.log(`Stopping ${n.length} tracks from main stream`),n.forEach(t=>{try{console.log(`Stopping ${t.kind} track, enabled: ${t.enabled}, state: `+t.readyState),t.enabled=!1,t.stop(),console.log("Track after stop - state: "+t.readyState)}catch(e){console.error(`Error stopping ${t.kind} track:`,e)}}),this._stream=null}catch(e){console.error("Error stopping main stream:",e)}console.log("All streams should be stopped now")}destroy(){console.log("Starting destroy process..."),this.forceStopAllStreams(),this._soundMeter&&this._soundMeter.detach(),this._pendingMicrophoneState=null,this._cameraList=new P,this._microphoneList=new P,this._permissionChecked=!1,this._isWindowActive=!1,this._isMicrophoneMuted=!1;try{this._main.removeEventListener("serverConnect",this.onServerConnect),this._main.removeEventListener("serverDisconnect",this.onServerDisconnect),document.removeEventListener("visibilitychange",this.visibilityChange),window.removeEventListener("blur",this.onWindowBlur),window.removeEventListener("focus",this.onWindowFocus)}catch(e){console.error("Error removing event listeners:",e)}this._publishState=c.PublishState.NOT_INITIALIZED,console.log("Destroy process completed")}}(C=y=y||{})[C.NOT_INITIALIZED=0]="NOT_INITIALIZED",C[C.STARTED=1]="STARTED",C[C.CONNECTING=2]="CONNECTING",C[C.CONNECTED=3]="CONNECTED",C[C.CLOSED=4]="CLOSED",C[C.FAILED=5]="FAILED";class X extends class{constructor(){this.CONNECTION_TIMEOUT=5,this.isBinary=!0,this._connectionState=y.NOT_INITIALIZED,this._messageCount=0,this._disconnectedByUser=!1,this._isConnected=!1,this._sequenceNumber=-1}startConnection(){this._disconnectedByUser=!1,this._messageCount=0,this._isConnected=!1,this._disconnectedByUser=!1,this._connectionState=y.CONNECTING,this.socket=new WebSocket(this.socketURL),this.isBinary&&(this.socket.binaryType="arraybuffer"),this.socket.onopen=e=>{clearTimeout(this._connectionTimeout),this._sequenceNumber++,this._connectionState=y.CONNECTED,this.onSocketOpen(e)},this.socket.onmessage=e=>{this._messageCount++,this.onSocketMessage(e)},this.socket.onclose=e=>{clearTimeout(this._connectionTimeout),this._connectionState==y.CONNECTED?(this._connectionState=y.CLOSED,this.onSocketClose(e)):this._connectionState=y.FAILED},this.socket.onerror=e=>{if(clearTimeout(this._connectionTimeout),this._connectionState==y.CONNECTING&&this.onSocketError(e),this._connectionState==y.CONNECTED)try{this.socket.close()}catch(e){}},this._connectionTimeout=setTimeout(()=>{try{this.socket.close()}catch(e){}this._connectionState==y.CONNECTING&&(this._connectionState=y.FAILED,this.onSocketError(new ErrorEvent("connectionTimeout")))},1e3*this.CONNECTION_TIMEOUT)}onSocketOpen(e){}onSocketClose(e){}onSocketMessage(e){}onSocketError(e){}onError(e){}sendData(e){if(this._connectionState==y.CONNECTED&&null!==this.socket){if(null!=e)return void this.socket.send(e);this.onError("no data to send")}this.onError("socket not connected")}getConnectionState(){return this._connectionState}disconnect(e=!0){this._isConnected=!1,this._connectionState=y.CLOSED,e&&(this._logger.warning(this,"Disconnected by user"),this._disconnectedByUser=e),null!=this.socket&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close())}destroy(){void 0!==this.socket&&null!==this.socket&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close()),this._connectionState=y.CLOSED}getSocketURL(){return this.socketURL}}{constructor(e,t){super(),this._logger=e.getLogger(),this._main=e,this._networkController=t,this.initialize()}initialize(){this._logger.info(this,"Starting new connection with a storm server"),this.pickServerFromList(this._main.getConfigManager().getStreamData().getServerList()),null!=this._currServer?(this.socketURL=this.createURL(this._currServer),this._logger.info(this,"Starting WebSocket connection with: "+this.socketURL),this._main.dispatchEvent("serverConnectionInitiate",{ref:this._main,serverURL:this.socketURL}),this._main.getConfigManager().getIfDemoMode()?(this._logger.warning(this,"Player is in demo mode, and will not connect with a server!"),this._main.dispatchEvent("authorizationComplete",{ref:this._main})):this.startConnection()):this._logger.error(this,"Connection with the server could not be initialized!")}onSocketOpen(e){this._logger.success(this,"Connection with the server has been established!"),this._main.dispatchEvent("serverConnect",{ref:this._main,serverURL:this.socketURL,sequenceNum:this._sequenceNumber}),this._isConnected=!0}onSocketError(e){this._isConnected=!1,this._disconnectedByUser||(this._logger.error(this,"Connection with the server failed"),this._main.dispatchEvent("serverConnectionError",{ref:this._main,serverURL:this.socketURL,restart:this._main.getConfigManager().getSettingsData().getIfRestartOnError(),sequenceNum:this._sequenceNumber}),0==this._isConnected&&(this._currServer.setAsFaild(!0),this.initiateReconnect()))}onSocketClose(e){this._isConnected=!1,this._disconnectedByUser?this._logger.warning(this,"Force disconnect from server!"):(this._logger.error(this,"Connection with the server has been closed"),this._main.dispatchEvent("serverDisconnect",{ref:this._main,serverURL:this.socketURL,restart:this._main.getConfigManager().getSettingsData().getIfRestartOnError(),sequenceNum:this._sequenceNumber}),this.initiateReconnect())}onSocketMessage(e){this._networkController.onMessage(e)}createURL(e){var t="";return(t+=e.getIfSSL()?"wss://":"ws://")+e.getHost()+(":"+e.getPort())+"/webrtc-session.json"}initiateReconnect(){var e=this._main.getConfigManager().getSettingsData().getIfRestartOnError();const t=this._main.getConfigManager().getSettingsData().getReconnectTime();this._disconnectedByUser||e&&(null!=this._reconnectTimer&&clearTimeout(this._reconnectTimer),this._reconnectTimer=setTimeout(()=>{this.pickServerFromList(this._main.getConfigManager().getStreamData().getServerList()),null!=this._currServer&&(this._logger.info(this,`Will reconnect to the server in ${t} seconds...`),this.socketURL=this.createURL(this._currServer),this._logger.info(this,"Starting WebSocket connection with: "+this.socketURL),this._main.dispatchEvent("serverConnectionInitiate",{ref:this._main,serverURL:this.socketURL}),this.startConnection())},1e3*t))}pickServerFromList(t){let i=null;for(let e=0;e<t.length;e++)if(!t[e].getIfFaild()){i=t[e];break}null==i?(this._logger.error(this,"All connections failed!"),this._main.dispatchEvent("allConnectionsFailed",{ref:this._main,mode:"none"}),this._currServer=null):this._currServer=i}isConnectionActive(){return this._isConnected}getCurrentServer(){return this._currServer}destroy(){super.destroy(),null!=this._reconnectTimer&&clearTimeout(this._reconnectTimer)}}class j{constructor(e){this._currentStreamKey="none",this._lastState="",this.onServerConnect=()=>{},this.onServerDisconnect=()=>{this._lastState="none"},this.onMessage=e=>{var t;null!=(t=this._main.getPlaybackController())&&t.onSocketMessage(e.data)},this._main=e,this._logger=e.getLogger(),this._main.addEventListener("serverConnect",this.onServerConnect,!1),this._main.addEventListener("serverDisconnect",this.onServerDisconnect,!1)}initialize(){null!=this._connection&&(this._connection.getConnectionState()==y.CONNECTING||this._connection.getConnectionState()==y.CONNECTED?this._logger.info(this,"Connection is alive, not doing anything!"):(this._logger.info(this,"Connection is dead, restarting!"),this._connection.startConnection()))}start(){this._connection=new X(this._main,this)}stop(){this._connection.disconnect(!0),this._lastState=""}sendMessage(e){this._connection.isConnectionActive()&&this._connection.sendData(e)}getConnection(){return this._connection}getCurrentStreamKey(){return this._currentStreamKey}}class x extends class{constructor(){this._isRemoved=!1,this._listeners={}}addEventListener(t,i,e=!0){this._listeners[t]||(this._listeners[t]=[]);let n=!1;if(null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++)if(this._listeners[t][e][1]==i){n=!0;break}return this._logger.success(this,"Registering a new event: "+t),!n&&(this._listeners[t].push([t,i,e]),!0)}removeEventListener(t,i){let n=!1;if(null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++){var s=this._listeners[t][e];if(i){if(s[1]==i){if(1!=s[2])break;n=!0,this._listeners[t].splice(e,1);break}}else n=!0,1==s[2]&&this._listeners[t].splice(e,1)}return this._logger.success(this,"Removing listener: "+t),n}removeAllEventListeners(){this._logger.success(this,"Removing all listeners!");for(const i in this._listeners){var e=i,t=this._listeners[e];if(t&&0<t.length)for(let e=t.length-1;0<=e;e--)!0===t[e][2]&&t.splice(e,1)}}dispatchEvent(t,i){if(!this._isRemoved&&null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++)this._listeners[t][e][1].call(this,i)}}{constructor(e,t=!1){super(),this.DEV_MODE=!0,this.STREAMER_VERSION="0.9.0-beta.4",this.COMPILE_DATE="12/7/2024, 6:37:54 PM",this.STREAMER_BRANCH="Experimental",this.STREAMER_PROTOCOL_VERSION=1,this._initialized=!1,"undefined"!=typeof window&&window.document&&window.document.createElement?(!this.DEV_MODE||"StormStreamerArray"in window||(window.StormStreamerArray=[]),window.StormStreamerArray.push(this),this._streamerID=x.NEXT_STREAMER_ID++,null!=e&&(this.setStreamConfig(e),t)&&this.initialize()):console.error('StormLibrary Creation Error - No "window" element in the provided context!')}initialize(){if(!this._isRemoved){if(null==this._configManager)throw Error("Stream Config was not provided for this library! A properly configured object must be provided through the constructor or via the setConfig method before using the initialize() method.");this._storageManager=new p(this),this._stageController=new O(this),this._networkController=new j(this),this._playbackController=new K(this),this._clientUser=new e,this._initialized=!0,this.dispatchEvent("streamerReady",{ref:this})}}setStreamConfig(e){this._isRemoved||(e=JSON.parse(JSON.stringify(e)),null==this._configManager?(this._configManager=new g(e),this._logger=new _(this._configManager.getSettingsData().getDebugData(),this),this._logger.info(this,"StreamerID: "+this._streamerID),this._logger.info(this,"Version: "+this.STREAMER_VERSION+" | Compile Date: "+this.COMPILE_DATE+" | Branch: "+this.STREAMER_BRANCH),this._logger.info(this,"UserCapabilities :: Browser: "+m.getBrowserName()+" "+m.getBrowserVersion()),this._logger.info(this,"UserCapabilities :: Operating System: "+m.getOS()+" "+m.getOSVersion()),this._logger.info(this,"UserCapabilities :: isMobile: "+m.isMobile()),this._logger.info(this,"UserCapabilities :: hasMSESupport: "+m.hasMSESupport()),this._logger.info(this,"UserCapabilities :: hasWebSocketSupport: "+m.hasWebSocketsSupport()),this._logger.info(this,"UserCapabilities :: hasWebRTCSupport: "+m.hasWebRTCSupport()),this._configManager.print(this._logger)):(this._logger.info(this,"StreamConfig has been overwritten, dispatching streamConfigChanged!"),this._configManager=new g(e),this._configManager.print(this._logger),this.dispatchEvent("streamConfigChange",{ref:this,newConfig:this._configManager})))}stop(){}isConnected(){var e;return null!=(e=null==(e=this._networkController)?void 0:e.getConnection().isConnectionActive())&&e}attachToContainer(e){var t;return!!this._initialized&&null!=(t=null==(t=this._stageController)?void 0:t.attachToParent(e))&&t}detachFromContainer(){var e;return!!this._initialized&&null!=(e=null==(e=this._stageController)?void 0:e.detachFromParent())&&e}getContainer(){var e;return null!=(e=null==(e=this._stageController)?void 0:e.getParentElement())?e:null}mute(){null!=this._stageController&&null!=this._stageController.getScreenElement()?this._stageController.getScreenElement().setMuted(!0):this._configManager.getSettingsData().getAudioData().muted=!0}unmute(){null!=this._stageController&&null!=this._stageController.getScreenElement()?this._stageController.getScreenElement().setMuted(!1):this._configManager.getSettingsData().getAudioData().muted=!1}isMute(){var e;return null!=(e=null!=(e=null==(e=null==(e=this._stageController)?void 0:e.getScreenElement())?void 0:e.getIfMuted())?e:this._configManager.getSettingsData().getAudioData().muted)&&e}toggleMute(){var e=this.isMute();return e?this.unmute():this.mute(),!e}setVolume(e){var t;void 0===(null==(t=null==(t=this._stageController)?void 0:t.getScreenElement())?void 0:t.setVolume(e))&&(this._configManager.getSettingsData().getAudioData().startVolume=e)}getVolume(){var e;return null!=(e=null==(e=null==(e=this._stageController)?void 0:e.getScreenElement())?void 0:e.getVolume())?e:this._configManager.getSettingsData().getAudioData().startVolume}getCameraList(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.getCameraList())?e:[]}getMicrophoneList(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.getMicrophoneList())?e:[]}setCamera(e){var t;null!=(t=this._playbackController)&&t.selectCamera(e)}setMicrophone(e){var t;null!=(t=this._playbackController)&&t.selectMicrophone(e)}getCurrentCamera(){return this._playbackController.getCurrentCamera()}getCurrentMicrophone(){return this._playbackController.getCurrentMicrophone()}muteMicrophone(e){var t;null!=(t=this._playbackController)&&t.muteMicrophone(e)}isMicrophoneMuted(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.isMicrophoneMuted())&&e}getPublishState(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.getPublishState())?e:c.PublishState.NOT_INITIALIZED}publish(e){var t;return null!=(t=null==(t=this._playbackController)?void 0:t.publish(e))&&t}clearSavedDevices(){var e;return null==(e=this._playbackController)?void 0:e.clearSavedDevices()}messSavedDevices(){var e;return null==(e=this._playbackController)?void 0:e.messSavedDevices()}isStreamReady(){var e;return null!=(e=null==(e=this._playbackController)?void 0:e.isStreamReady())&&e}unpublish(){var e;null!=(e=this._playbackController)&&e.unpublish()}setSize(e,t){this._initialized?this._stageController.setSize(e,t):(e=u.parseValue(e),t=u.parseValue(t),this._configManager.getSettingsData().getVideoData().videoWidthValue=e.value,this._configManager.getSettingsData().getVideoData().videoWidthInPixels=e.isPixels,this._configManager.getSettingsData().getVideoData().videoHeightValue=t.value,this._configManager.getSettingsData().getVideoData().videoHeightInPixels=t.isPixels)}setWidth(e){this._initialized?this._stageController.setWidth(e):(e=u.parseValue(e),this._configManager.getSettingsData().getVideoData().videoWidthValue=e.value,this._configManager.getSettingsData().getVideoData().videoWidthInPixels=e.isPixels)}setHeight(e){this._initialized?this._stageController.setHeight(e):(e=u.parseValue(e),this._configManager.getSettingsData().getVideoData().videoHeightValue=e.value,this._configManager.getSettingsData().getVideoData().videoHeightInPixels=e.isPixels)}getWidth(){return this._initialized?this._stageController.getContainerWidth():this._configManager.getSettingsData().getVideoData().videoWidthInPixels?this._configManager.getSettingsData().getVideoData().videoWidthValue:0}getHeight(){return this._initialized?this._stageController.getContainerHeight():this._configManager.getSettingsData().getVideoData().videoHeightInPixels?this._configManager.getSettingsData().getVideoData().videoHeightValue:0}setScalingMode(e){this._stageController?this._stageController.setScalingMode(e):this._configManager.getSettingsData().getVideoData().scalingMode=e}getScalingMode(){return this._stageController?this._stageController.getScalingMode():this._configManager.getSettingsData().getVideoData().scalingMode}updateToSize(){this._initialized&&this._stageController.handleResize()}makeScreenshot(){let i=document.createElement("canvas"),n=i.getContext("2d");return new Promise(t=>{var e;null!=this._stageController&&(i.width=this._stageController.getScreenElement().getVideoElement().videoWidth,i.height=this._stageController.getScreenElement().getVideoElement().videoHeight,e=this._stageController.getScreenElement().getVideoElement(),n)?(n.drawImage(e,0,0,i.width,i.height),i.toBlob(e=>{t(e)},"image/png")):t(null)})}enterFullScreen(){this._initialized&&this._stageController&&this._stageController.enterFullScreen()}exitFullScreen(){this._initialized&&this._stageController&&this._stageController.exitFullScreen()}isFullScreenMode(){return!(!this._initialized||!this._stageController)&&this._stageController.isFullScreenMode()}getStreamerID(){return this._streamerID}getLogger(){return this._logger}getConfigManager(){return this._configManager}getNetworkController(){return this._networkController}getPlaybackController(){return this._playbackController}getStageController(){return this._stageController}getVideoElement(){var e;return null!=(e=null==(e=null==(e=this._stageController)?void 0:e.getScreenElement())?void 0:e.getVideoElement())?e:null}isInitialized(){return this._initialized}getVersion(){return this.STREAMER_VERSION}getBranch(){return this.STREAMER_BRANCH}getStorageManager(){return this._storageManager}dispatchEvent(e,t){super.dispatchEvent(e,t)}destroy(){var e;this._logger.warning(this,"Destroying library instance, bye, bye!"),this.DEV_MODE&&"StormStreamerArray"in window&&(window.StormStreamerArray[this._streamerID]=null),this._initialized=!1,this._isRemoved=!0,null!=(e=null==(e=this._networkController)?void 0:e.getConnection())&&e.destroy(),null!=(e=this._playbackController)&&e.destroy(),null!=(e=this._stageController)&&e.destroy(),this.removeAllEventListeners()}}x.NEXT_STREAMER_ID=0,c.StormStreamer=x,c.create=function(e){return new x(e)}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stormstreaming/stormstreamer",
3
- "version": "0.9.0-beta.3",
3
+ "version": "0.9.0-beta.4",
4
4
  "description": "A JavaScript library containing core web video streamer functionality for embedding live-video streams on a website. Part of StormStreaming Suite.",
5
5
  "author": "Web-Anatomy s.c. <contact@web-anatomy.com>",
6
6
  "main": "dist/iife/index.js",