@stormstreaming/stormstreamer 1.0.6 → 1.0.7

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/esm/index.js CHANGED
@@ -4,14 +4,14 @@
4
4
  * contact@stormstreaming.com
5
5
  * https://stormstreaming.com
6
6
  *
7
- * Version: 1.0.6
8
- * Version: 2/22/2026, 12:57:01 PM
7
+ * Version: 1.0.7
8
+ * Version: 2/24/2026, 9:59:15 AM
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 __awaiter(e,o,a,h){return new(a=a||Promise)(function(i,t){function s(e){try{r(h.next(e))}catch(e){t(e)}}function n(e){try{r(h.throw(e))}catch(e){t(e)}}function r(e){var t;e.done?i(e.value):((t=e.value)instanceof a?t:new a(function(e){e(t)})).then(s,n)}r((h=h.apply(e,o||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class StormServerItem{constructor(e,t,i=443,s=!0){this.host=e,this.application=t,this.port=i,this.isSSL=s,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 StreamData{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 s=null!=(s=this._streamConfig.serverList[i].port)?s:StreamData.DEFAULT_CONNECTION_PORT,n=null!=(n=this._streamConfig.serverList[i].ssl)?n:StreamData.IS_SSL_BY_DEFAULT;this._serverList.push(new StormServerItem(e,t,s,n))}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(StreamData.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 ScalingType,SizeCalculationType,LogType;StreamData.PRINT_ON_STARTUP=!0,StreamData.DEFAULT_CONNECTION_PORT=443,StreamData.IS_SSL_BY_DEFAULT=!0,function(e){e.FILL="fill",e.LETTER_BOX="letterbox",e.CROP="crop",e.ORIGINAL="original"}(ScalingType=ScalingType||{}),function(e){e.CLIENT_DIMENSIONS="clientDimensions",e.BOUNDING_BOX="boundingBox",e.FULL_BOX="fullBox"}(SizeCalculationType=SizeCalculationType||{});class VideoData{constructor(e){this._scalingMode=ScalingType.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=SizeCalculationType.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=ScalingType.FILL;break;case"letterbox":this._scalingMode=ScalingType.LETTER_BOX;break;case"crop":this._scalingMode=ScalingType.CROP;break;case"original":this._scalingMode=ScalingType.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=SizeCalculationType.CLIENT_DIMENSIONS;break;case"boundingBox":this._parentSizeCalculationMethod=SizeCalculationType.BOUNDING_BOX;break;case"fullBox":this._parentSizeCalculationMethod=SizeCalculationType.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=ScalingType.FILL;break;case"letterbox":this._scalingMode=ScalingType.LETTER_BOX;break;case"crop":this._scalingMode=ScalingType.CROP;break;case"original":this._scalingMode=ScalingType.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 ScalingType.FILL:t="fill";break;case ScalingType.LETTER_BOX:t="letterbox";break;case ScalingType.CROP:t="crop";break;case ScalingType.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)}}!function(e){e[e.TRACE=0]="TRACE",e[e.INFO=1]="INFO",e[e.SUCCESS=2]="SUCCESS",e[e.WARNING=3]="WARNING",e[e.ERROR=4]="ERROR"}(LogType=LogType||{});class DebugData{constructor(e){this._consoleLogEnabled=!1,this._enabledConsoleTypes=[LogType.INFO,LogType.ERROR,LogType.SUCCESS,LogType.TRACE,LogType.WARNING],this._consoleMonoColor=!1,this._containerLogEnabled=!1,this._enabledContainerTypes=[LogType.INFO,LogType.ERROR,LogType.SUCCESS,LogType.TRACE,LogType.WARNING],this._containerLogMonoColor=!1,this._stageController=!0,this._streamerController=!0,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,this._streamerController=null!=(e=null==(e=this._debugConfig)?void 0:e.streamerController)?e:this._streamerController,this._stageController=null!=(e=null==(e=this._debugConfig)?void 0:e.stageController)?e:this._stageController)}parseLogTypes(e){return null==e?void 0:e.map(e=>{switch(e.toLowerCase()){case"info":return LogType.INFO;case"error":return LogType.ERROR;case"warning":return LogType.WARNING;case"success":return LogType.SUCCESS;case"trace":return LogType.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(LogType.INFO);break;case"error":this._enabledConsoleTypes.push(LogType.ERROR);break;case"warning":this._enabledConsoleTypes.push(LogType.WARNING);break;case"success":this._enabledConsoleTypes.push(LogType.SUCCESS);break;case"trace":this._enabledConsoleTypes.push(LogType.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(LogType.INFO);break;case"error":this._enabledContainerTypes.push(LogType.ERROR);break;case"warning":this._enabledContainerTypes.push(LogType.WARNING);break;case"success":this._enabledContainerTypes.push(LogType.SUCCESS);break;case"trace":this._enabledContainerTypes.push(LogType.TRACE)}}get containerID(){return this._containerID}set containerID(e){this._containerID=e}get containerLogMonoColor(){return this._containerLogMonoColor}set containerLogMonoColor(e){this._containerLogMonoColor=e}get stageControllerDebug(){return this._stageController}get streamerControllerDebug(){return this._streamerController}print(e,t=!1){if(DebugData.PRINT_ON_STARTUP||t){let t="";for(let e=0;e<this._enabledConsoleTypes.length;e++)switch(this._enabledConsoleTypes[e]){case LogType.TRACE:t+="TRACE, ";break;case LogType.SUCCESS:t+="SUCCESS, ";break;case LogType.WARNING:t+="WARNING, ";break;case LogType.INFO:t+="INFO, ";break;case LogType.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 LogType.TRACE:i+="TRACE, ";break;case LogType.SUCCESS:i+="SUCCESS, ";break;case LogType.WARNING:i+="WARNING, ";break;case LogType.INFO:i+="INFO, ";break;case LogType.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)}}}DebugData.PRINT_ON_STARTUP=!0;class AudioData{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){(AudioData.PRINT_ON_STARTUP||t)&&e.info(this,"Audio :: startVolume: "+this._startVolume+" | isMuted: "+this._isMuted)}}AudioData.PRINT_ON_STARTUP=!0;class StorageData{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){(StorageData.PRINT_ON_STARTUP||t)&&e.info(this,"Storage :: startVolume: "+this._enabled+" | prefix: "+this._prefix)}}StorageData.PRINT_ON_STARTUP=!0;class SettingsData{constructor(e){this._restartOnError=!0,this._reconnectTime=1,this._autoStart=!1,this._autoConnect=!0,this.startOnDOMReady=!1,this.iOSOnDomReadyFix=!0,this._restartOnFocus=!0,this._preselectDevices=!0,this._cancelPublishOnError=!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._preselectDevices=null!=(e=this._settingsConfig.preselectDevices)?e:this._preselectDevices,this._cancelPublishOnError=null!=(e=this._settingsConfig.cancelPublishOnError)?e:this._cancelPublishOnError,this._videoData=new VideoData(null!=(e=this._settingsConfig.video)?e:null),this._audioData=new AudioData(null!=(e=this._settingsConfig.audio)?e:null),this._storageData=new StorageData(null!=(e=this._settingsConfig.storage)?e:null),this._debugData=new DebugData(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}getIfForceSelection(){return this._preselectDevices}getIfCancelPublishOnError(){return this._cancelPublishOnError}getIfStartOnDOMReadyEnabled(){return this.startOnDOMReady}getIfIOSOnDomStartFixEnabled(){return this.iOSOnDomReadyFix}print(e,t=!1){(SettingsData.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))}}SettingsData.PRINT_ON_STARTUP=!0;class ConfigManager{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 StreamData(this.configTemplate.stream),this.settingsData=new SettingsData(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 EventDispatcher{constructor(){this._isRemoved=!1,this._listeners={}}addEventListener(t,i,e=!0){this._listeners[t]||(this._listeners[t]=[]);let s=!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){s=!0;break}return this._logger.success(this,"Registering a new event: "+t),!s&&(this._listeners[t].push([t,i,e]),!0)}removeEventListener(t,i){let s=!1;if(null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++){var n=this._listeners[t][e];if(i){if(n[1]==i){if(1!=n[2])break;s=!0,this._listeners[t].splice(e,1);break}}else s=!0,1==n[2]&&this._listeners[t].splice(e,1)}return this._logger.success(this,"Removing listener: "+t),s}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)}}class NumberUtilities{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 s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=s.length;for(let e=0;e<t;e++)i+=s.charAt(Math.floor(Math.random()*n));return i}}NumberUtilities.parseValue=e=>{var t;return"string"==typeof e?(t=e.toLowerCase().endsWith("px"),{value:parseInt(e,10),isPixels:t}):{value:e,isPixels:!0}};class Logger{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(LogType.INFO)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.INFO_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.INFO)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.INFO_COLOR,this.writeToContainer(e,t))}warning(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.WARNING)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.WARNING_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.WARNING)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.WARNING_COLOR,this.writeToContainer(e,t))}decoratedLog(e,t){var i=["0️⃣","1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣","8️⃣","9️⃣","🔟"],s=this._stormStreamer.getStreamerID(),t={"dark-blue":"#4c9fee","dark-green":"#4bcb64","dark-orange":"#daa33a","dark-red":"#f86464","dark-pink":"#f864e8","dark-yellow":"#e1f864"}[t];t&&console.log(`%c 🎦️${0<=s&&s<i.length?i[s]:`[${s}]`} `+e,`background: black; color: ${t}; border: 1px solid ${t}; padding: 5px 5px 5px 0px`)}error(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.ERROR)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.ERROR_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.ERROR)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.ERROR_COLOR,this.writeToContainer(e,t))}success(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.SUCCESS)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.SUCCESS_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.SUCCESS)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.SUCCESS_COLOR,this.writeToContainer(e,t))}trace(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.TRACE)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.TRACE_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.TRACE)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.TRACE_COLOR,this.writeToContainer(e,t))}logData(e,t){var i=new Date,s=NumberUtilities.addLeadingZero(i.getHours()),n=NumberUtilities.addLeadingZero(i.getMinutes()),i=NumberUtilities.addLeadingZero(i.getSeconds());let r=String(this._streamerInstanceID);0<=this._streamerInstanceID&&(r+="|"+this._streamerInstanceID);s="[Storm-ID:"+r+"] ["+s+":"+n+":"+i+"] :: "+t;return this._logMemory.push(s),s}writeToContainer(e,t){var i,s=this._debugConfig.containerID;s&&(s=document.getElementById(s),(i=document.createElement("span")).innerText=e,i.style.color=t,s.appendChild(i))}setPlayerID(e){this._streamerInstanceID=e}getAllLogs(){return this._logMemory}}Logger.INFO_COLOR="blue",Logger.WARNING_COLOR="orange",Logger.ERROR_COLOR="red",Logger.SUCCESS_COLOR="green",Logger.TRACE_COLOR="black";class UserCapabilities{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=UserCapabilities.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 s=new RegExp("(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\\.\\_\\d]+)");e=s.exec(navigator.userAgent)[1];break;case"iOS":s=new RegExp("OS (\\d+)_(\\d+)_?(\\d+)?");e=(e=s.exec(navigator.userAgent))[1]+"."+e[2]+"."+(0|e[3])}}return e}static getBrowserName(){return UserCapabilities.getFullBrowser().name}static getBrowserVersion(){return UserCapabilities.getFullBrowser().version}static getFullBrowser(){var e=navigator.userAgent;let t=navigator.appName,i=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10),n,r,o;return-1!=(r=e.indexOf("Opera"))?(t="Opera",i=e.substring(r+6),-1!=(r=e.indexOf("Version"))&&(i=e.substring(r+8))):-1!=(r=e.indexOf("MSIE"))?(t="Microsoft Internet Explorer",i=e.substring(r+5)):"Netscape"==t&&-1!=e.indexOf("Trident/")?(t="Microsoft Internet Explorer",i=e.substring(r+5),-1!=(r=e.indexOf("rv:"))&&(i=e.substring(r+3))):-1!=(r=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(r+7)):-1!=(r=e.indexOf("Safari"))?(t="Safari",i=e.substring(r+7),-1!=(r=e.indexOf("Version"))&&(i=e.substring(r+8)),-1!=e.indexOf("CriOS")&&(t="Chrome"),-1!=e.indexOf("FxiOS")&&(t="Firefox")):-1!=(r=e.indexOf("Firefox"))?(t="Firefox",i=e.substring(r+8)):(n=e.lastIndexOf(" ")+1)<(r=e.lastIndexOf("/"))&&(t=e.substring(n,r),i=e.substring(r+1),t.toLowerCase()==t.toUpperCase())&&(t=navigator.appName),-1!=(o=(i=-1!=(o=(i=-1!=(o=i.indexOf(";"))?i.substring(0,o):i).indexOf(" "))?i.substring(0,o):i).indexOf(")"))&&(i=i.substring(0,o)),s=parseInt(""+i,10),isNaN(s)&&(i=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10)),{name:t,fullVersion:i,version:s}}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 s=i[t];if(new RegExp(s.code).test(navigator.userAgent)){e=s.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 StorageManager{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 commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function getDefaultExportFromCjs(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var FUNC_ERROR_TEXT="Expected a function",NAN=NaN,symbolTag="[object Symbol]",reTrim=/^\s+|\s+$/g,reIsBadHex=/^[-+]0x[0-9a-f]+$/i,reIsBinary=/^0b[01]+$/i,reIsOctal=/^0o[0-7]+$/i,freeParseInt=parseInt,freeGlobal="object"==typeof commonjsGlobal&&commonjsGlobal&&commonjsGlobal.Object===Object&&commonjsGlobal,freeSelf="object"==typeof self&&self&&self.Object===Object&&self,root=freeGlobal||freeSelf||Function("return this")(),objectProto=Object.prototype,objectToString=objectProto.toString,nativeMax=Math.max,nativeMin=Math.min,now=function(){return root.Date.now()};function debounce(s,i,e){var n,r,o,a,h,l,c=0,d=!1,g=!1,t=!0;if("function"!=typeof s)throw new TypeError(FUNC_ERROR_TEXT);function u(e){var t=n,i=r;return n=r=void 0,c=e,a=s.apply(i,t)}function _(e){var t=e-l;return void 0===l||i<=t||t<0||g&&o<=e-c}function m(){var e,t=now();if(_(t))return p(t);h=setTimeout(m,(e=i-((t=t)-l),g?nativeMin(e,o-(t-c)):e))}function p(e){return h=void 0,t&&n?u(e):(n=r=void 0,a)}function v(){var e=now(),t=_(e);if(n=arguments,r=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=toNumber(i)||0,isObject(e)&&(d=!!e.leading,g="maxWait"in e,o=g?nativeMax(toNumber(e.maxWait)||0,i):o,t="trailing"in e?!!e.trailing:t),v.cancel=function(){void 0!==h&&clearTimeout(h),n=l=r=h=void(c=0)},v.flush=function(){return void 0===h?a:p(now())},v}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isSymbol(e){return"symbol"==typeof e||isObjectLike(e)&&objectToString.call(e)==symbolTag}function toNumber(e){if("number"==typeof e)return e;if(isSymbol(e))return NAN;if("string"!=typeof(e=isObject(e)?isObject(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(reTrim,"");var t=reIsBinary.test(e);return t||reIsOctal.test(e)?freeParseInt(e.slice(2),t?2:8):reIsBadHex.test(e)?NAN:+e}var InputType,PublishState,InputDevicesState,DeviceState,ConnectionState,lodash_debounce=debounce,debounce$1=getDefaultExportFromCjs(debounce);class ScreenElement{constructor(e){this.LOG_ACTIVITY=!0,this._volume=100,this._isMuted=!1,this._isMutedByBrowser=!1,this._loadedMetadataHandler=null,this._volumeChangeHandler=null,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._volumeChangeHandler=()=>{this.dispatchVolumeEvent()},this._videoElement.onvolumechange=this._volumeChangeHandler,this._videoElement.onpause=()=>{},this._loadedMetadataHandler=()=>{this._main.dispatchEvent("metadata",{ref:this._main,videoWidth:this._videoElement.videoWidth,videoHeight:this._videoElement.videoHeight})},this._videoElement.addEventListener("loadedmetadata",this._loadedMetadataHandler),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}destroy(){this._logger.info(this,"Destroying ScreenElement...");try{this._main.removeEventListener("playbackForceMute",this.onForceMute),this._videoElement.srcObject instanceof MediaStream&&this._videoElement.srcObject.getTracks().forEach(e=>{e.enabled=!1,e.stop()}),this._videoElement.pause(),this._videoElement.onload=null,this._videoElement.onstalled=null,this._videoElement.onerror=null,this._videoElement.onvolumechange=null,this._videoElement.onpause=null,this._videoElement.ontimeupdate=null,this._videoElement.onended=null,this._videoElement.onplay=null,this._videoElement.onloadstart=null,this._videoElement.onloadeddata=null,this._videoElement.onloadedmetadata=null,this._videoElement.oncanplay=null,this._videoElement.oncanplaythrough=null,this._videoElement.onprogress=null,this._videoElement.onseeking=null,this._videoElement.onseeked=null,this._videoElement.onwaiting=null,this._videoElement.ondurationchange=null,this._videoElement.onratechange=null,this._videoElement.onsuspend=null,this._videoElement.onemptied=null,this._loadedMetadataHandler&&(this._videoElement.removeEventListener("loadedmetadata",this._loadedMetadataHandler),this._loadedMetadataHandler=null),this._videoElement.removeAttribute("src"),this._videoElement.srcObject=null;try{this._videoElement.load()}catch(e){}this._videoElement.removeAttribute("playsinline"),this._videoElement.removeAttribute("webkit-playsinline"),this._videoElement.parentNode&&this._videoElement.parentNode.removeChild(this._videoElement),this._volumeChangeHandler=null,this._logger.success(this,"ScreenElement successfully destroyed")}catch(e){this._logger.error(this,"Error during ScreenElement destroy: "+e)}}}class DomUtilities{static calculateDimensionsWithMargins(e){var t=window.getComputedStyle(e),e=e.getBoundingClientRect(),i=parseFloat(t.paddingLeft),s=parseFloat(t.paddingRight),n=parseFloat(t.paddingTop),r=parseFloat(t.paddingBottom),o=parseFloat(t.borderLeftWidth),a=parseFloat(t.borderRightWidth),h=parseFloat(t.borderTopWidth),t=parseFloat(t.borderBottomWidth);return{width:e.width-i-s-o-a,height:e.height-n-r-h-t}}}class StageController{constructor(e){this._containerWidth=0,this._tempContainerWidth=0,this._containerHeight=0,this._tempContainerHeight=0,this._videoWidth=0,this._videoHeight=0,this._scalingMode=ScalingType.FILL,this.isInFullScreenMode=!1,this._isResizing=!1,this._autoResizeEnabled=!0,this._parentOriginalOverflow="",this._debug=!1,this._animationFrameId=null,this._isDestroying=!1,this._fullscreenChangeHandler=null,this._transitionEndHandler=null,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:ScalingType.FILL,this._debug=null!=(t=null==(t=this._main.getConfigManager())?void 0:t.getSettingsData().getDebugData().stageControllerDebug)?t:this._debug,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 ScreenElement(this._main),this._videoContainer.appendChild(this._screenElement.getVideoElement()),this._main.getConfigManager().getSettingsData().getVideoData().resizeDebounce);this._resizeObserver=0<t?new ResizeObserver(debounce$1(()=>()=>{this._autoResizeEnabled&&this.handleResize()},t,{leading:!1,trailing:!0})):new ResizeObserver(()=>{this._autoResizeEnabled&&this.handleResize()}),this._fullscreenChangeHandler=this.onFullScreenChange,this._transitionEndHandler=()=>{this.handleResize()},document.addEventListener("fullscreenchange",this._fullscreenChangeHandler,!1),document.addEventListener("webkitfullscreenchange",this._fullscreenChangeHandler,!1),document.addEventListener("mozfullscreenchange",this._fullscreenChangeHandler,!1),document.addEventListener("webkitendfullscreen",this._fullscreenChangeHandler,!1),this._screenElement.getVideoElement().addEventListener("webkitendfullscreen",this._fullscreenChangeHandler,!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._debug&&this._logger.decoratedLog("Attaching Failed (container is the same)","dark-pink"),this._logger.warning(this,"attachToParent :: container is the same"),!1):(i&&this._videoContainer?(this._debug&&this._logger.decoratedLog("Attach To Parent: "+e+" (success)","dark-pink"),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):(this._debug&&this._logger.decoratedLog("Attach To Parent: "+e+" (failure - container not found)","dark-pink"),this._logger.warning(this,'attachToParent :: container "'+e+'"+ was not found')),t)}detachFromParent(){this._debug&&this._logger.decoratedLog("Detach From Parent","dark-pink");let e=!1;return null!=this._parentElement&&null!=this._videoContainer?(this._logger.info(this,"Detaching from parent: "+this._videoContainer),this._transitionEndHandler&&this._parentElement.removeEventListener("transitionend",this._transitionEndHandler),this._parentElement.removeChild(this._videoContainer),this._resizeObserver&&this._resizeObserver.unobserve(this._parentElement),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._isDestroying||(null!==this._animationFrameId&&cancelAnimationFrame(this._animationFrameId),this._isResizing=!0,this._parentOriginalOverflow=this._parentElement.style.overflow,this._parentElement.style.overflow="hidden",this._animationFrameId=requestAnimationFrame(()=>{this._isDestroying||(this.calculateNewDimensions(),this._parentElement&&(this._parentElement.style.overflow=this._parentOriginalOverflow),this._isResizing=!1,this._animationFrameId=null,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 SizeCalculationType.CLIENT_DIMENSIONS:this._tempContainerWidth=this._parentElement.clientWidth,this._tempContainerHeight=this._parentElement.clientHeight;break;case SizeCalculationType.BOUNDING_BOX:var t=this._parentElement.getBoundingClientRect();this._tempContainerWidth=t.width,this._tempContainerHeight=t.height;break;case SizeCalculationType.FULL_BOX:t=DomUtilities.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,s=this._main.getConfigManager().getSettingsData().getVideoData().videoHeightValue,n=this._main.getConfigManager().getSettingsData().getVideoData().aspectRatio;let r=0,o=0;var a=Number(n.split(":")[0]),h=Number(n.split(":")[1]);"none"==n?(e?r=i:null!=this._parentElement&&(r=this._tempContainerWidth*i/100),t?o=s:null!=this._parentElement&&0==(o=this._tempContainerHeight*s/100)&&0!=this._videoHeight&&0!=this._videoWidth&&(o=this._videoHeight*r/this._videoWidth)):(e?r=i:null!=this._parentElement&&(r=this._tempContainerWidth*i/100),o=r*h/a),this._containerWidth=Math.ceil(r),this._containerHeight=Math.ceil(o),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,s=0;switch(this._scalingMode){case ScalingType.FILL:i=this._containerWidth,s=this._containerHeight;break;case ScalingType.CROP:i=this._containerWidth,(s=this._videoHeight*this._containerWidth/this._videoWidth)>=this._containerHeight?(e=0,t=(s-this._containerHeight)/2*-1):(s=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case ScalingType.LETTER_BOX:i=this._containerWidth,(!((s=this._videoHeight*this._containerWidth/this._videoWidth)<=this._containerHeight)||(e=0,t=(s-this._containerHeight)/2*-1,s>this._containerHeight))&&(s=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case ScalingType.ORIGINAL:i=this._videoWidth,s=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(s)+"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 s,n;if("number"==typeof t)n=t,s=!0;else{if("string"!=typeof t)throw new Error(`Unknown value for parameter "${e}" - it must be a number or a string!`);n=parseInt(t),s=t.toLowerCase().endsWith("px")}this._main.getConfigManager().getSettingsData().getVideoData()[i+"Value"]=n,this._main.getConfigManager().getSettingsData().getVideoData()[i+"InPixels"]=s,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=ScalingType.FILL;break;case"crop":this._scalingMode=ScalingType.CROP;break;case"letterbox":this._scalingMode=ScalingType.LETTER_BOX;break;case"original":this._scalingMode=ScalingType.ORIGINAL}this.scaleVideo()}getContainerWidth(){return this._containerWidth}getContainerHeight(){return this._containerHeight}getScalingModeAsString(){let e="";switch(this._scalingMode){case ScalingType.FILL:e="fill";break;case ScalingType.CROP:e="crop";break;case ScalingType.LETTER_BOX:e="letterbox";break;case ScalingType.ORIGINAL:e="original"}return e}getScalingMode(){return this._scalingMode}getScreenElement(){return this._screenElement}getContainer(){return this._videoContainer}destroy(){var e,t;this._logger.info(this,"Starting StageController destroy..."),this._isDestroying=!0;try{null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null),this.detachFromParent(),this._resizeObserver&&this._resizeObserver.disconnect(),this._fullscreenChangeHandler&&(document.removeEventListener("fullscreenchange",this._fullscreenChangeHandler),document.removeEventListener("webkitfullscreenchange",this._fullscreenChangeHandler),document.removeEventListener("mozfullscreenchange",this._fullscreenChangeHandler),document.removeEventListener("webkitendfullscreen",this._fullscreenChangeHandler),null!=(e=this._screenElement)&&e.getVideoElement()&&this._screenElement.getVideoElement().removeEventListener("webkitendfullscreen",this._fullscreenChangeHandler),this._fullscreenChangeHandler=null),this._screenElement&&((t=this._screenElement.getVideoElement())&&(t.srcObject instanceof MediaStream&&t.srcObject.getTracks().forEach(e=>{e.enabled=!1,e.stop()}),t.pause(),t.removeAttribute("src"),t.srcObject=null,t.load(),t.parentNode)&&t.parentNode.removeChild(t),"function"==typeof this._screenElement.destroy&&this._screenElement.destroy(),this._screenElement=null),this._videoContainer&&(this._videoContainer.parentNode&&this._videoContainer.parentNode.removeChild(this._videoContainer),this._videoContainer=null),this._containerWidth=0,this._containerHeight=0,this._tempContainerWidth=0,this._tempContainerHeight=0,this._videoWidth=0,this._videoHeight=0,this.isInFullScreenMode=!1,this._isResizing=!1,this._autoResizeEnabled=!1,this._logger.success(this,"StageController successfully destroyed")}catch(e){this._logger.error(this,"Error during destroy: "+e)}finally{this._isDestroying=!1}}}StageController.LOG_ACTIVITY=!0;class MungeSDP{constructor(){}addAudio(e,t){let i="",s="",n=!1;for(const r of e.split(/\r\n/))r.length<=0||(0===r.indexOf("m=audio")?i="audio":0===r.indexOf("m=video")&&(i="video"),s=s+r+"\r\n","audio"!==i)||0!=="a=rtcp-mux".localeCompare(r)||n||(s+=t,n=!0);return s}addVideo(e,t){e=e.split(/\r\n/);let i="",s=!1,n=!1;for(const o of e)o.length<=0||(o.includes("a=rtcp-rsize")&&(n=!0),o.includes("a=rtcp-mux"));let r=!1;for(const a of e)a.startsWith("m=video")&&(r=!0),i=i+a+"\r\n",r&&(0==="a=rtcp-rsize".localeCompare(a)&&!s&&n&&(i+=t,s=!0),0==="a=rtcp-mux".localeCompare(a)&&s&&!n&&(i+=t,s=!0),0!=="a=rtcp-mux".localeCompare(a)||s||n||(s=!0));return i}deliverCheckLine(e,t){for(const s in MungeSDP.SDPOutput){var i=MungeSDP.SDPOutput[s];if(i.includes(e)){if(e.includes("VP9")||e.includes("VP8")){let e="";for(const n of i.split(/\r\n/))e=e+n+"\r\n";return t.includes("audio")&&(MungeSDP.audioIndex=parseInt(s)),t.includes("video")&&(MungeSDP.videoIndex=parseInt(s)),e}return t.includes("audio")&&(MungeSDP.audioIndex=parseInt(s)),t.includes("video")&&(MungeSDP.videoIndex=parseInt(s)),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=MungeSDP.SDPOutput[i[0]];return e=e||"",e+=t+"\r\n",MungeSDP.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){MungeSDP.SDPOutput={},MungeSDP.videoChoice=t.videoCodec||"42e01f",MungeSDP.audioChoice=t.audioCodec||"opus",MungeSDP.videoIndex=-1,MungeSDP.audioIndex=-1;const i=t.videoFrameRate?Math.min(Math.max(t.videoFrameRate,1),60):30;let s="";for(const c of e.split(/\r\n/))c.length<=0||this.checkLine(c)&&(s+=c+"\r\n");s=this.addAudio(s,this.deliverCheckLine(MungeSDP.audioChoice,"audio"));e=(s=this.addVideo(s,this.deliverCheckLine(MungeSDP.videoChoice,"video"))).split(/\r\n/);s="";let n="header",r=!1;for(const d of e)if(!(d.length<=0))if(0===d.indexOf("m=audio")&&-1!==MungeSDP.audioIndex){var o=d.split(" ");s+=`${o[0]} ${o[1]} ${o[2]} ${MungeSDP.audioIndex}\r\n`,n="audio",r=!1}else if(0===d.indexOf("m=video")&&-1!==MungeSDP.videoIndex){o=d.split(" ");s=(s=(s=(s+=`${o[0]} ${o[1]} ${o[2]} ${MungeSDP.videoIndex}\r\n`)+`a=framerate:${i}\r
14
+ */function __awaiter(e,o,a,h){return new(a=a||Promise)(function(i,t){function s(e){try{r(h.next(e))}catch(e){t(e)}}function n(e){try{r(h.throw(e))}catch(e){t(e)}}function r(e){var t;e.done?i(e.value):((t=e.value)instanceof a?t:new a(function(e){e(t)})).then(s,n)}r((h=h.apply(e,o||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class StormServerItem{constructor(e,t,i=443,s=!0){this.host=e,this.application=t,this.port=i,this.isSSL=s,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 StreamData{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 s=null!=(s=this._streamConfig.serverList[i].port)?s:StreamData.DEFAULT_CONNECTION_PORT,n=null!=(n=this._streamConfig.serverList[i].ssl)?n:StreamData.IS_SSL_BY_DEFAULT;this._serverList.push(new StormServerItem(e,t,s,n))}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(StreamData.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 ScalingType,SizeCalculationType,LogType;StreamData.PRINT_ON_STARTUP=!0,StreamData.DEFAULT_CONNECTION_PORT=443,StreamData.IS_SSL_BY_DEFAULT=!0,function(e){e.FILL="fill",e.LETTER_BOX="letterbox",e.CROP="crop",e.ORIGINAL="original"}(ScalingType=ScalingType||{}),function(e){e.CLIENT_DIMENSIONS="clientDimensions",e.BOUNDING_BOX="boundingBox",e.FULL_BOX="fullBox"}(SizeCalculationType=SizeCalculationType||{});class VideoData{constructor(e){this._scalingMode=ScalingType.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=SizeCalculationType.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=ScalingType.FILL;break;case"letterbox":this._scalingMode=ScalingType.LETTER_BOX;break;case"crop":this._scalingMode=ScalingType.CROP;break;case"original":this._scalingMode=ScalingType.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=SizeCalculationType.CLIENT_DIMENSIONS;break;case"boundingBox":this._parentSizeCalculationMethod=SizeCalculationType.BOUNDING_BOX;break;case"fullBox":this._parentSizeCalculationMethod=SizeCalculationType.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=ScalingType.FILL;break;case"letterbox":this._scalingMode=ScalingType.LETTER_BOX;break;case"crop":this._scalingMode=ScalingType.CROP;break;case"original":this._scalingMode=ScalingType.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 ScalingType.FILL:t="fill";break;case ScalingType.LETTER_BOX:t="letterbox";break;case ScalingType.CROP:t="crop";break;case ScalingType.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)}}!function(e){e[e.TRACE=0]="TRACE",e[e.INFO=1]="INFO",e[e.SUCCESS=2]="SUCCESS",e[e.WARNING=3]="WARNING",e[e.ERROR=4]="ERROR"}(LogType=LogType||{});class DebugData{constructor(e){this._consoleLogEnabled=!1,this._enabledConsoleTypes=[LogType.INFO,LogType.ERROR,LogType.SUCCESS,LogType.TRACE,LogType.WARNING],this._consoleMonoColor=!1,this._containerLogEnabled=!1,this._enabledContainerTypes=[LogType.INFO,LogType.ERROR,LogType.SUCCESS,LogType.TRACE,LogType.WARNING],this._containerLogMonoColor=!1,this._stageController=!0,this._streamerController=!0,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,this._streamerController=null!=(e=null==(e=this._debugConfig)?void 0:e.streamerController)?e:this._streamerController,this._stageController=null!=(e=null==(e=this._debugConfig)?void 0:e.stageController)?e:this._stageController)}parseLogTypes(e){return null==e?void 0:e.map(e=>{switch(e.toLowerCase()){case"info":return LogType.INFO;case"error":return LogType.ERROR;case"warning":return LogType.WARNING;case"success":return LogType.SUCCESS;case"trace":return LogType.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(LogType.INFO);break;case"error":this._enabledConsoleTypes.push(LogType.ERROR);break;case"warning":this._enabledConsoleTypes.push(LogType.WARNING);break;case"success":this._enabledConsoleTypes.push(LogType.SUCCESS);break;case"trace":this._enabledConsoleTypes.push(LogType.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(LogType.INFO);break;case"error":this._enabledContainerTypes.push(LogType.ERROR);break;case"warning":this._enabledContainerTypes.push(LogType.WARNING);break;case"success":this._enabledContainerTypes.push(LogType.SUCCESS);break;case"trace":this._enabledContainerTypes.push(LogType.TRACE)}}get containerID(){return this._containerID}set containerID(e){this._containerID=e}get containerLogMonoColor(){return this._containerLogMonoColor}set containerLogMonoColor(e){this._containerLogMonoColor=e}get stageControllerDebug(){return this._stageController}get streamerControllerDebug(){return this._streamerController}print(e,t=!1){if(DebugData.PRINT_ON_STARTUP||t){let t="";for(let e=0;e<this._enabledConsoleTypes.length;e++)switch(this._enabledConsoleTypes[e]){case LogType.TRACE:t+="TRACE, ";break;case LogType.SUCCESS:t+="SUCCESS, ";break;case LogType.WARNING:t+="WARNING, ";break;case LogType.INFO:t+="INFO, ";break;case LogType.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 LogType.TRACE:i+="TRACE, ";break;case LogType.SUCCESS:i+="SUCCESS, ";break;case LogType.WARNING:i+="WARNING, ";break;case LogType.INFO:i+="INFO, ";break;case LogType.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)}}}DebugData.PRINT_ON_STARTUP=!0;class AudioData{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){(AudioData.PRINT_ON_STARTUP||t)&&e.info(this,"Audio :: startVolume: "+this._startVolume+" | isMuted: "+this._isMuted)}}AudioData.PRINT_ON_STARTUP=!0;class StorageData{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){(StorageData.PRINT_ON_STARTUP||t)&&e.info(this,"Storage :: startVolume: "+this._enabled+" | prefix: "+this._prefix)}}StorageData.PRINT_ON_STARTUP=!0;class SettingsData{constructor(e){this._restartOnError=!0,this._reconnectTime=1,this._autoStart=!1,this._autoConnect=!0,this.startOnDOMReady=!1,this.iOSOnDomReadyFix=!0,this._restartOnFocus=!0,this._preselectDevices=!0,this._cancelPublishOnError=!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._preselectDevices=null!=(e=this._settingsConfig.preselectDevices)?e:this._preselectDevices,this._cancelPublishOnError=null!=(e=this._settingsConfig.cancelPublishOnError)?e:this._cancelPublishOnError,this._videoData=new VideoData(null!=(e=this._settingsConfig.video)?e:null),this._audioData=new AudioData(null!=(e=this._settingsConfig.audio)?e:null),this._storageData=new StorageData(null!=(e=this._settingsConfig.storage)?e:null),this._debugData=new DebugData(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}getIfForceSelection(){return this._preselectDevices}getIfCancelPublishOnError(){return this._cancelPublishOnError}getIfStartOnDOMReadyEnabled(){return this.startOnDOMReady}getIfIOSOnDomStartFixEnabled(){return this.iOSOnDomReadyFix}print(e,t=!1){(SettingsData.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))}}SettingsData.PRINT_ON_STARTUP=!0;class ConfigManager{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 StreamData(this.configTemplate.stream),this.settingsData=new SettingsData(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 EventDispatcher{constructor(){this._isRemoved=!1,this._listeners={}}addEventListener(t,i,e=!0){this._listeners[t]||(this._listeners[t]=[]);let s=!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){s=!0;break}return this._logger.success(this,"Registering a new event: "+t),!s&&(this._listeners[t].push([t,i,e]),!0)}removeEventListener(t,i){let s=!1;if(null!=this._listeners[t]&&0<this._listeners[t].length)for(let e=0;e<this._listeners[t].length;e++){var n=this._listeners[t][e];if(i){if(n[1]==i){if(1!=n[2])break;s=!0,this._listeners[t].splice(e,1);break}}else s=!0,1==n[2]&&this._listeners[t].splice(e,1)}return this._logger.success(this,"Removing listener: "+t),s}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)}}class NumberUtilities{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 s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=s.length;for(let e=0;e<t;e++)i+=s.charAt(Math.floor(Math.random()*n));return i}}NumberUtilities.parseValue=e=>{var t;return"string"==typeof e?(t=e.toLowerCase().endsWith("px"),{value:parseInt(e,10),isPixels:t}):{value:e,isPixels:!0}};class Logger{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(LogType.INFO)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.INFO_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.INFO)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.INFO_COLOR,this.writeToContainer(e,t))}warning(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.WARNING)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.WARNING_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.WARNING)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.WARNING_COLOR,this.writeToContainer(e,t))}decoratedLog(e,t){var i=["0️⃣","1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣","8️⃣","9️⃣","🔟"],s=this._stormStreamer.getStreamerID(),t={"dark-blue":"#4c9fee","dark-green":"#4bcb64","dark-orange":"#daa33a","dark-red":"#f86464","dark-pink":"#f864e8","dark-yellow":"#e1f864"}[t];t&&console.log(`%c 🎦️${0<=s&&s<i.length?i[s]:`[${s}]`} `+e,`background: black; color: ${t}; border: 1px solid ${t}; padding: 5px 5px 5px 0px`)}error(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.ERROR)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.ERROR_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.ERROR)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.ERROR_COLOR,this.writeToContainer(e,t))}success(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.SUCCESS)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.SUCCESS_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.SUCCESS)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.SUCCESS_COLOR,this.writeToContainer(e,t))}trace(e,t){e=this.logData(e,t);this._debugConfig.consoleLogEnabled&&0<=this._debugConfig.enabledConsoleTypes.indexOf(LogType.TRACE)&&(t=this._debugConfig.consoleLogMonoColor?this._monoColor:Logger.TRACE_COLOR,console.log("%c "+e,"color: "+t)),this._debugConfig.containerLogEnabled&&0<=this._debugConfig.enabledContainerTypes.indexOf(LogType.TRACE)&&(t=this._debugConfig.containerLogMonoColor?this._monoColor:Logger.TRACE_COLOR,this.writeToContainer(e,t))}logData(e,t){var i=new Date,s=NumberUtilities.addLeadingZero(i.getHours()),n=NumberUtilities.addLeadingZero(i.getMinutes()),i=NumberUtilities.addLeadingZero(i.getSeconds());let r=String(this._streamerInstanceID);0<=this._streamerInstanceID&&(r+="|"+this._streamerInstanceID);s="[Storm-ID:"+r+"] ["+s+":"+n+":"+i+"] :: "+t;return this._logMemory.push(s),s}writeToContainer(e,t){var i,s=this._debugConfig.containerID;s&&(s=document.getElementById(s),(i=document.createElement("span")).innerText=e,i.style.color=t,s.appendChild(i))}setPlayerID(e){this._streamerInstanceID=e}getAllLogs(){return this._logMemory}}Logger.INFO_COLOR="blue",Logger.WARNING_COLOR="orange",Logger.ERROR_COLOR="red",Logger.SUCCESS_COLOR="green",Logger.TRACE_COLOR="black";class UserCapabilities{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=UserCapabilities.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 s=new RegExp("(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\\.\\_\\d]+)");e=s.exec(navigator.userAgent)[1];break;case"iOS":s=new RegExp("OS (\\d+)_(\\d+)_?(\\d+)?");e=(e=s.exec(navigator.userAgent))[1]+"."+e[2]+"."+(0|e[3])}}return e}static getBrowserName(){return UserCapabilities.getFullBrowser().name}static getBrowserVersion(){return UserCapabilities.getFullBrowser().version}static getFullBrowser(){var e=navigator.userAgent;let t=navigator.appName,i=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10),n,r,o;return-1!=(r=e.indexOf("Opera"))?(t="Opera",i=e.substring(r+6),-1!=(r=e.indexOf("Version"))&&(i=e.substring(r+8))):-1!=(r=e.indexOf("MSIE"))?(t="Microsoft Internet Explorer",i=e.substring(r+5)):"Netscape"==t&&-1!=e.indexOf("Trident/")?(t="Microsoft Internet Explorer",i=e.substring(r+5),-1!=(r=e.indexOf("rv:"))&&(i=e.substring(r+3))):-1!=(r=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(r+7)):-1!=(r=e.indexOf("Safari"))?(t="Safari",i=e.substring(r+7),-1!=(r=e.indexOf("Version"))&&(i=e.substring(r+8)),-1!=e.indexOf("CriOS")&&(t="Chrome"),-1!=e.indexOf("FxiOS")&&(t="Firefox")):-1!=(r=e.indexOf("Firefox"))?(t="Firefox",i=e.substring(r+8)):(n=e.lastIndexOf(" ")+1)<(r=e.lastIndexOf("/"))&&(t=e.substring(n,r),i=e.substring(r+1),t.toLowerCase()==t.toUpperCase())&&(t=navigator.appName),-1!=(o=(i=-1!=(o=(i=-1!=(o=i.indexOf(";"))?i.substring(0,o):i).indexOf(" "))?i.substring(0,o):i).indexOf(")"))&&(i=i.substring(0,o)),s=parseInt(""+i,10),isNaN(s)&&(i=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10)),{name:t,fullVersion:i,version:s}}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 s=i[t];if(new RegExp(s.code).test(navigator.userAgent)){e=s.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 StorageManager{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 commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function getDefaultExportFromCjs(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var FUNC_ERROR_TEXT="Expected a function",NAN=NaN,symbolTag="[object Symbol]",reTrim=/^\s+|\s+$/g,reIsBadHex=/^[-+]0x[0-9a-f]+$/i,reIsBinary=/^0b[01]+$/i,reIsOctal=/^0o[0-7]+$/i,freeParseInt=parseInt,freeGlobal="object"==typeof commonjsGlobal&&commonjsGlobal&&commonjsGlobal.Object===Object&&commonjsGlobal,freeSelf="object"==typeof self&&self&&self.Object===Object&&self,root=freeGlobal||freeSelf||Function("return this")(),objectProto=Object.prototype,objectToString=objectProto.toString,nativeMax=Math.max,nativeMin=Math.min,now=function(){return root.Date.now()};function debounce(s,i,e){var n,r,o,a,h,l,c=0,d=!1,g=!1,t=!0;if("function"!=typeof s)throw new TypeError(FUNC_ERROR_TEXT);function u(e){var t=n,i=r;return n=r=void 0,c=e,a=s.apply(i,t)}function _(e){var t=e-l;return void 0===l||i<=t||t<0||g&&o<=e-c}function m(){var e,t=now();if(_(t))return p(t);h=setTimeout(m,(e=i-((t=t)-l),g?nativeMin(e,o-(t-c)):e))}function p(e){return h=void 0,t&&n?u(e):(n=r=void 0,a)}function v(){var e=now(),t=_(e);if(n=arguments,r=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=toNumber(i)||0,isObject(e)&&(d=!!e.leading,g="maxWait"in e,o=g?nativeMax(toNumber(e.maxWait)||0,i):o,t="trailing"in e?!!e.trailing:t),v.cancel=function(){void 0!==h&&clearTimeout(h),n=l=r=h=void(c=0)},v.flush=function(){return void 0===h?a:p(now())},v}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isSymbol(e){return"symbol"==typeof e||isObjectLike(e)&&objectToString.call(e)==symbolTag}function toNumber(e){if("number"==typeof e)return e;if(isSymbol(e))return NAN;if("string"!=typeof(e=isObject(e)?isObject(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(reTrim,"");var t=reIsBinary.test(e);return t||reIsOctal.test(e)?freeParseInt(e.slice(2),t?2:8):reIsBadHex.test(e)?NAN:+e}var InputType,PublishState,InputDevicesState,DeviceState,ConnectionState,lodash_debounce=debounce,debounce$1=getDefaultExportFromCjs(debounce);class ScreenElement{constructor(e){this.LOG_ACTIVITY=!0,this._volume=100,this._isMuted=!1,this._isMutedByBrowser=!1,this._loadedMetadataHandler=null,this._volumeChangeHandler=null,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._volumeChangeHandler=()=>{this.dispatchVolumeEvent()},this._videoElement.onvolumechange=this._volumeChangeHandler,this._videoElement.onpause=()=>{},this._loadedMetadataHandler=()=>{this._main.dispatchEvent("metadata",{ref:this._main,videoWidth:this._videoElement.videoWidth,videoHeight:this._videoElement.videoHeight})},this._videoElement.addEventListener("loadedmetadata",this._loadedMetadataHandler),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}destroy(){this._logger.info(this,"Destroying ScreenElement...");try{this._main.removeEventListener("playbackForceMute",this.onForceMute),this._videoElement.srcObject instanceof MediaStream&&this._videoElement.srcObject.getTracks().forEach(e=>{e.enabled=!1,e.stop()}),this._videoElement.pause(),this._videoElement.onload=null,this._videoElement.onstalled=null,this._videoElement.onerror=null,this._videoElement.onvolumechange=null,this._videoElement.onpause=null,this._videoElement.ontimeupdate=null,this._videoElement.onended=null,this._videoElement.onplay=null,this._videoElement.onloadstart=null,this._videoElement.onloadeddata=null,this._videoElement.onloadedmetadata=null,this._videoElement.oncanplay=null,this._videoElement.oncanplaythrough=null,this._videoElement.onprogress=null,this._videoElement.onseeking=null,this._videoElement.onseeked=null,this._videoElement.onwaiting=null,this._videoElement.ondurationchange=null,this._videoElement.onratechange=null,this._videoElement.onsuspend=null,this._videoElement.onemptied=null,this._loadedMetadataHandler&&(this._videoElement.removeEventListener("loadedmetadata",this._loadedMetadataHandler),this._loadedMetadataHandler=null),this._videoElement.removeAttribute("src"),this._videoElement.srcObject=null;try{this._videoElement.load()}catch(e){}this._videoElement.removeAttribute("playsinline"),this._videoElement.removeAttribute("webkit-playsinline"),this._videoElement.parentNode&&this._videoElement.parentNode.removeChild(this._videoElement),this._volumeChangeHandler=null,this._logger.success(this,"ScreenElement successfully destroyed")}catch(e){this._logger.error(this,"Error during ScreenElement destroy: "+e)}}}class DomUtilities{static calculateDimensionsWithMargins(e){var t=window.getComputedStyle(e),e=e.getBoundingClientRect(),i=parseFloat(t.paddingLeft),s=parseFloat(t.paddingRight),n=parseFloat(t.paddingTop),r=parseFloat(t.paddingBottom),o=parseFloat(t.borderLeftWidth),a=parseFloat(t.borderRightWidth),h=parseFloat(t.borderTopWidth),t=parseFloat(t.borderBottomWidth);return{width:e.width-i-s-o-a,height:e.height-n-r-h-t}}}class StageController{constructor(e){this._containerWidth=0,this._tempContainerWidth=0,this._containerHeight=0,this._tempContainerHeight=0,this._videoWidth=0,this._videoHeight=0,this._scalingMode=ScalingType.FILL,this.isInFullScreenMode=!1,this._isResizing=!1,this._autoResizeEnabled=!0,this._parentOriginalOverflow="",this._debug=!1,this._animationFrameId=null,this._isDestroying=!1,this._fullscreenChangeHandler=null,this._transitionEndHandler=null,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:ScalingType.FILL,this._debug=null!=(t=null==(t=this._main.getConfigManager())?void 0:t.getSettingsData().getDebugData().stageControllerDebug)?t:this._debug,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 ScreenElement(this._main),this._videoContainer.appendChild(this._screenElement.getVideoElement()),this._main.getConfigManager().getSettingsData().getVideoData().resizeDebounce);this._resizeObserver=0<t?new ResizeObserver(debounce$1(()=>{this._autoResizeEnabled&&this._parentElement&&this.handleResize()},t,{leading:!1,trailing:!0})):new ResizeObserver(()=>{this._autoResizeEnabled&&this._parentElement&&this.handleResize()}),this._fullscreenChangeHandler=this.onFullScreenChange,this._transitionEndHandler=()=>{this.handleResize()},document.addEventListener("fullscreenchange",this._fullscreenChangeHandler,!1),document.addEventListener("webkitfullscreenchange",this._fullscreenChangeHandler,!1),document.addEventListener("mozfullscreenchange",this._fullscreenChangeHandler,!1),document.addEventListener("webkitendfullscreen",this._fullscreenChangeHandler,!1),this._screenElement.getVideoElement().addEventListener("webkitendfullscreen",this._fullscreenChangeHandler,!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._debug&&this._logger.decoratedLog("Attaching Failed (container is the same)","dark-pink"),this._logger.warning(this,"attachToParent :: container is the same"),!1):(i&&this._videoContainer?(this._debug&&this._logger.decoratedLog("Attach To Parent: "+e+" (success)","dark-pink"),this._parentElement=i,this._parentElement.appendChild(this._videoContainer),this._resizeObserver.observe(this._parentElement),this._parentElement.addEventListener("transitionend",this._transitionEndHandler),this._main.dispatchEvent("containerChange",{ref:this._main,container:this._parentElement}),this.handleResize(),t=!0):(this._debug&&this._logger.decoratedLog("Attach To Parent: "+e+" (failure - container not found)","dark-pink"),this._logger.warning(this,'attachToParent :: container "'+e+'"+ was not found')),t)}detachFromParent(){this._debug&&this._logger.decoratedLog("Detach From Parent","dark-pink");let e=!1;return null!=this._parentElement&&null!=this._videoContainer?(this._logger.info(this,"Detaching from parent: "+this._videoContainer),null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null,this._isResizing&&(this._parentElement.style.overflow=this._parentOriginalOverflow),this._isResizing=!1),this._transitionEndHandler&&this._parentElement.removeEventListener("transitionend",this._transitionEndHandler),this._parentElement.removeChild(this._videoContainer),this._resizeObserver&&this._resizeObserver.unobserve(this._parentElement),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._isDestroying||(null!==this._animationFrameId&&cancelAnimationFrame(this._animationFrameId),this._isResizing=!0,this._parentOriginalOverflow=this._parentElement.style.overflow,this._parentElement.style.overflow="hidden",this._animationFrameId=requestAnimationFrame(()=>{this._isDestroying||!this._parentElement?(this._isResizing=!1,this._animationFrameId=null):(this.calculateNewDimensions(),this._parentElement&&(this._parentElement.style.overflow=this._parentOriginalOverflow),this._isResizing=!1,this._animationFrameId=null,this._tempContainerWidth===this._containerWidth&&this._tempContainerHeight===this._containerHeight||this._main.dispatchEvent("resizeUpdate",{ref:this._main,width:this._tempContainerWidth,height:this._tempContainerHeight}))}))}calculateNewDimensions(){if(this._parentElement){var e=this._main.getConfigManager().getSettingsData().getVideoData().parentSizeCalculationMethod;switch(e){case SizeCalculationType.CLIENT_DIMENSIONS:this._tempContainerWidth=this._parentElement.clientWidth,this._tempContainerHeight=this._parentElement.clientHeight;break;case SizeCalculationType.BOUNDING_BOX:var t=this._parentElement.getBoundingClientRect();this._tempContainerWidth=t.width,this._tempContainerHeight=t.height;break;case SizeCalculationType.FULL_BOX:t=DomUtilities.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,s=this._main.getConfigManager().getSettingsData().getVideoData().videoHeightValue,n=this._main.getConfigManager().getSettingsData().getVideoData().aspectRatio;let r=0,o=0;var a=Number(n.split(":")[0]),h=Number(n.split(":")[1]);"none"==n?(e?r=i:null!=this._parentElement&&(r=this._tempContainerWidth*i/100),t?o=s:null!=this._parentElement&&0==(o=this._tempContainerHeight*s/100)&&0!=this._videoHeight&&0!=this._videoWidth&&(o=this._videoHeight*r/this._videoWidth)):(e?r=i:null!=this._parentElement&&(r=this._tempContainerWidth*i/100),o=r*h/a),this._containerWidth=Math.ceil(r),this._containerHeight=Math.ceil(o),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,s=0;switch(this._scalingMode){case ScalingType.FILL:i=this._containerWidth,s=this._containerHeight;break;case ScalingType.CROP:i=this._containerWidth,(s=this._videoHeight*this._containerWidth/this._videoWidth)>=this._containerHeight?(e=0,t=(s-this._containerHeight)/2*-1):(s=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case ScalingType.LETTER_BOX:i=this._containerWidth,(!((s=this._videoHeight*this._containerWidth/this._videoWidth)<=this._containerHeight)||(e=0,t=(s-this._containerHeight)/2*-1,s>this._containerHeight))&&(s=this._containerHeight,i=this._videoWidth*this._containerHeight/this._videoHeight,t=0,e=(i-this._containerWidth)/2*-1);break;case ScalingType.ORIGINAL:i=this._videoWidth,s=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(s)+"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 s,n;if("number"==typeof t)n=t,s=!0;else{if("string"!=typeof t)throw new Error(`Unknown value for parameter "${e}" - it must be a number or a string!`);n=parseInt(t),s=t.toLowerCase().endsWith("px")}this._main.getConfigManager().getSettingsData().getVideoData()[i+"Value"]=n,this._main.getConfigManager().getSettingsData().getVideoData()[i+"InPixels"]=s,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=ScalingType.FILL;break;case"crop":this._scalingMode=ScalingType.CROP;break;case"letterbox":this._scalingMode=ScalingType.LETTER_BOX;break;case"original":this._scalingMode=ScalingType.ORIGINAL}this.scaleVideo()}getContainerWidth(){return this._containerWidth}getContainerHeight(){return this._containerHeight}getScalingModeAsString(){let e="";switch(this._scalingMode){case ScalingType.FILL:e="fill";break;case ScalingType.CROP:e="crop";break;case ScalingType.LETTER_BOX:e="letterbox";break;case ScalingType.ORIGINAL:e="original"}return e}getScalingMode(){return this._scalingMode}getScreenElement(){return this._screenElement}getContainer(){return this._videoContainer}destroy(){var e,t;this._logger.info(this,"Starting StageController destroy..."),this._isDestroying=!0;try{null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null),this.detachFromParent(),this._resizeObserver&&this._resizeObserver.disconnect(),this._fullscreenChangeHandler&&(document.removeEventListener("fullscreenchange",this._fullscreenChangeHandler),document.removeEventListener("webkitfullscreenchange",this._fullscreenChangeHandler),document.removeEventListener("mozfullscreenchange",this._fullscreenChangeHandler),document.removeEventListener("webkitendfullscreen",this._fullscreenChangeHandler),null!=(e=this._screenElement)&&e.getVideoElement()&&this._screenElement.getVideoElement().removeEventListener("webkitendfullscreen",this._fullscreenChangeHandler),this._fullscreenChangeHandler=null),this._screenElement&&((t=this._screenElement.getVideoElement())&&(t.srcObject instanceof MediaStream&&t.srcObject.getTracks().forEach(e=>{e.enabled=!1,e.stop()}),t.pause(),t.removeAttribute("src"),t.srcObject=null,t.load(),t.parentNode)&&t.parentNode.removeChild(t),"function"==typeof this._screenElement.destroy&&this._screenElement.destroy(),this._screenElement=null),this._videoContainer&&(this._videoContainer.parentNode&&this._videoContainer.parentNode.removeChild(this._videoContainer),this._videoContainer=null),this._containerWidth=0,this._containerHeight=0,this._tempContainerWidth=0,this._tempContainerHeight=0,this._videoWidth=0,this._videoHeight=0,this.isInFullScreenMode=!1,this._isResizing=!1,this._autoResizeEnabled=!1,this._transitionEndHandler=null,this._logger.success(this,"StageController successfully destroyed")}catch(e){this._logger.error(this,"Error during destroy: "+e)}finally{this._isDestroying=!1}}}StageController.LOG_ACTIVITY=!0;class MungeSDP{constructor(){}addAudio(e,t){let i="",s="",n=!1;for(const r of e.split(/\r\n/))r.length<=0||(0===r.indexOf("m=audio")?i="audio":0===r.indexOf("m=video")&&(i="video"),s=s+r+"\r\n","audio"!==i)||0!=="a=rtcp-mux".localeCompare(r)||n||(s+=t,n=!0);return s}addVideo(e,t){e=e.split(/\r\n/);let i="",s=!1,n=!1;for(const o of e)o.length<=0||(o.includes("a=rtcp-rsize")&&(n=!0),o.includes("a=rtcp-mux"));let r=!1;for(const a of e)a.startsWith("m=video")&&(r=!0),i=i+a+"\r\n",r&&(0==="a=rtcp-rsize".localeCompare(a)&&!s&&n&&(i+=t,s=!0),0==="a=rtcp-mux".localeCompare(a)&&s&&!n&&(i+=t,s=!0),0!=="a=rtcp-mux".localeCompare(a)||s||n||(s=!0));return i}deliverCheckLine(e,t){for(const s in MungeSDP.SDPOutput){var i=MungeSDP.SDPOutput[s];if(i.includes(e)){if(e.includes("VP9")||e.includes("VP8")){let e="";for(const n of i.split(/\r\n/))e=e+n+"\r\n";return t.includes("audio")&&(MungeSDP.audioIndex=parseInt(s)),t.includes("video")&&(MungeSDP.videoIndex=parseInt(s)),e}return t.includes("audio")&&(MungeSDP.audioIndex=parseInt(s)),t.includes("video")&&(MungeSDP.videoIndex=parseInt(s)),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=MungeSDP.SDPOutput[i[0]];return e=e||"",e+=t+"\r\n",MungeSDP.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){MungeSDP.SDPOutput={},MungeSDP.videoChoice=t.videoCodec||"42e01f",MungeSDP.audioChoice=t.audioCodec||"opus",MungeSDP.videoIndex=-1,MungeSDP.audioIndex=-1;const i=t.videoFrameRate?Math.min(Math.max(t.videoFrameRate,1),60):30;let s="";for(const c of e.split(/\r\n/))c.length<=0||this.checkLine(c)&&(s+=c+"\r\n");s=this.addAudio(s,this.deliverCheckLine(MungeSDP.audioChoice,"audio"));e=(s=this.addVideo(s,this.deliverCheckLine(MungeSDP.videoChoice,"video"))).split(/\r\n/);s="";let n="header",r=!1;for(const d of e)if(!(d.length<=0))if(0===d.indexOf("m=audio")&&-1!==MungeSDP.audioIndex){var o=d.split(" ");s+=`${o[0]} ${o[1]} ${o[2]} ${MungeSDP.audioIndex}\r\n`,n="audio",r=!1}else if(0===d.indexOf("m=video")&&-1!==MungeSDP.videoIndex){o=d.split(" ");s=(s=(s=(s+=`${o[0]} ${o[1]} ${o[2]} ${MungeSDP.videoIndex}\r\n`)+`a=framerate:${i}\r
15
15
  `)+`a=x-google-max-framerate:${i}\r
16
16
  `)+`a=max-fr:${i}\r
17
17
  `,n="video",r=!1}else{s+=d,0===d.indexOf("a=rtpmap")&&(null===(h=this.getrtpMapID(d))||"vp9"!==(a=h[2].toLowerCase())&&"vp8"!==a&&"h264"!==a||(s+=(a=h[1],void 0,`\r
@@ -31,4 +31,4 @@ b=TIAS:${1e3*(1e3*l*.95-16e3)}\r
31
31
  `+`b=CT:${l}\r
32
32
  `)+`a=framerate:${i}\r
33
33
  `)+`a=max-fr:${i}\r
34
- `;continue}s+="\r\n"}return s}mungeSDPPlay(e){let s="";for(const o of e.split(/\r\n/))if(0!==o.length){if(o.includes("profile-level-id")){var n=o.substr(o.indexOf("profile-level-id")+17,6);let e=Number("0x"+n.substr(0,2)),t=Number("0x"+n.substr(2,2)),i=Number("0x"+n.substr(4,2));66<e&&(e=66,t=224,i=31),0===t&&(t=224);var r=("00"+e.toString(16)).slice(-2).toLowerCase()+("00"+t.toString(16)).slice(-2).toLowerCase()+("00"+i.toString(16)).slice(-2).toLowerCase();s+=o.replace(n,r)}else s+=o;s+="\r\n"}return s}}MungeSDP.SDPOutput={},function(e){e[e.VIDEO_INPUT=0]="VIDEO_INPUT",e[e.AUDIO_INPUT=1]="AUDIO_INPUT"}(InputType=InputType||{});class InputDevice{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=InputType.VIDEO_INPUT;break;case"audioinput":this._inputType=InputType.AUDIO_INPUT;break;default:throw new Error("incorrect kind")}null!==e.label&&""!==e.label?this._label=this.cleanLabel(e.label):this._label=this._inputType==InputType.VIDEO_INPUT?"Camera "+t:"Microphone "+t,void 0!==e.groupId&&null!==e.groupId&&(this._groupID=e.groupId)}cleanLabel(e){return e}get label(){return this._label}get id(){return this._id}get groupID(){return this._groupID}get isSelected(){return this._isSelected}set isSelected(e){this._isSelected=e}}class InputDeviceList{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].groupID&&this._internalList[e].groupID==t.groupID&&(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}}!function(e){e.NOT_INITIALIZED="NOT_INITIALIZED",e.INITIALIZED="INITIALIZED",e.CONNECTING="CONNECTING",e.CONNECTED="CONNECTED",e.PUBLISHED="PUBLISHED",e.UNPUBLISHED="UNPUBLISHED",e.STOPPED="STOPPED",e.UNKNOWN="UNKNOWN",e.ERROR="ERROR"}(PublishState=PublishState||{});class SoundMeter{constructor(e){this._audioContext=null,this._analyser=null,this._microphone=null,this._lastEventTime=0,this.THROTTLE_INTERVAL=100,this._isMonitoring=!1,this._animationFrameId=null,this._instant=0,this._slow=0,this.PEAK_DECAY=.92,this._main=e}attach(e){if(e.getAudioTracks().length){this.detach();try{this._audioContext=new AudioContext,this._microphone=this._audioContext.createMediaStreamSource(e),this._analyser=this._audioContext.createAnalyser(),this._analyser.fftSize=2048,this._microphone.connect(this._analyser),this.startMonitoring()}catch(e){console.error("SoundMeter: Error during attach:",e),this.detach()}}else console.warn("SoundMeter: Attempted to attach stream without audio tracks")}detach(){if(this._audioContext||this._analyser||this._microphone){if(this._isMonitoring=!1,null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null),this._microphone){try{this._microphone.disconnect()}catch(e){console.warn("SoundMeter: Error disconnecting microphone:",e)}this._microphone=null}if(this._analyser){try{this._analyser.disconnect()}catch(e){console.warn("SoundMeter: Error disconnecting analyser:",e)}this._analyser=null}if(this._audioContext)try{if("closed"!==this._audioContext.state){const e=this._audioContext;this._audioContext=null,e.suspend().then(()=>e.close()).catch(e=>{console.warn("SoundMeter: Error closing audio context:",e)})}else this._audioContext=null}catch(e){console.warn("SoundMeter: Error handling audio context:",e),this._audioContext=null}this.clear()}}clear(){this._instant=0,this._slow=0,this._lastEventTime=0}startMonitoring(){if(this._analyser&&!this._isMonitoring){this._isMonitoring=!0;const s=new Float32Array(this._analyser.frequencyBinCount),t=()=>{if(this._analyser&&this._isMonitoring&&this._audioContext){var e=Date.now();try{this._analyser.getFloatTimeDomainData(s);let t=0;for(let e=0;e<s.length;++e){var i=Math.abs(s[e]);i>t&&(t=i)}this._instant=Math.min(1,t),this._instant>this._slow?this._slow=this._instant:this._slow*=this.PEAK_DECAY,e-this._lastEventTime>=this.THROTTLE_INTERVAL&&(this._lastEventTime=e,this._main.dispatchEvent("soundMeter",{ref:this._main,high:this._instant,low:this._slow}))}catch(e){return console.error("SoundMeter: Error during analysis:",e),this._isMonitoring=!1,void(this._animationFrameId=null)}this._isMonitoring&&(this._animationFrameId=requestAnimationFrame(t))}else this._animationFrameId=null};this._animationFrameId=requestAnimationFrame(t)}}destroy(){this.detach()}}!function(e){e.NOT_INITIALIZED="NOT_INITIALIZED",e.INITIALIZED="INITIALIZED",e.READY="READY",e.UPDATING="UPDATING",e.INVALID="INVALID",e.UNKNOWN="UNKNOWN",e.STOPPED="STOPPED"}(InputDevicesState=InputDevicesState||{}),function(e){e.NOT_INITIALIZED="NOT_INITIALIZED",e.ENABLED="ENABLED",e.ACCESS_DENIED="ACCESS_DENIED",e.NOT_FOUND="NOT_FOUND",e.STOPPED="STOPPED"}(DeviceState=DeviceState||{}),function(e){e[e.NOT_INITIALIZED=0]="NOT_INITIALIZED",e[e.STARTED=1]="STARTED",e[e.CONNECTING=2]="CONNECTING",e[e.CONNECTED=3]="CONNECTED",e[e.CLOSED=4]="CLOSED",e[e.FAILED=5]="FAILED"}(ConnectionState=ConnectionState||{});class AbstractSocket{constructor(){this.CONNECTION_TIMEOUT=5,this.isBinary=!0,this._connectionState=ConnectionState.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=ConnectionState.CONNECTING,this.socket=new WebSocket(this.socketURL),this.isBinary&&(this.socket.binaryType="arraybuffer"),this.socket.onopen=e=>{clearTimeout(this._connectionTimeout),this._sequenceNumber++,this._connectionState=ConnectionState.CONNECTED,this.onSocketOpen(e)},this.socket.onmessage=e=>{this._messageCount++,this.onSocketMessage(e)},this.socket.onclose=e=>{clearTimeout(this._connectionTimeout),this._connectionState==ConnectionState.CONNECTED?(this._connectionState=ConnectionState.CLOSED,this.onSocketClose(e)):this._connectionState=ConnectionState.FAILED},this.socket.onerror=e=>{if(clearTimeout(this._connectionTimeout),this._connectionState==ConnectionState.CONNECTING&&this.onSocketError(e),this._connectionState==ConnectionState.CONNECTED)try{this.socket.close()}catch(e){}},this._connectionTimeout=setTimeout(()=>{try{this.socket.close()}catch(e){}this._connectionState==ConnectionState.CONNECTING&&(this._connectionState=ConnectionState.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==ConnectionState.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=ConnectionState.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()),clearTimeout(this._connectionTimeout)}destroy(){null!=this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),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=ConnectionState.CLOSED}getSocketURL(){return this.socketURL}}class StreamStatusInfo{constructor(){this._publishState=PublishState.NOT_INITIALIZED,this._videoPublishBitrate=0,this._audioPublishBitrate=0,this._currentBitrate=0,this._audioFrameCount=0,this._videoFrameCount=0,this._frameRate=0,this._videoWidth=0,this._videoHeight=0}get publishState(){return this._publishState}set publishState(e){this._publishState="published"===e?PublishState.PUBLISHED:PublishState.CONNECTED}get videoPublishBitrate(){return this._videoPublishBitrate}set videoPublishBitrate(e){this._videoPublishBitrate=e}get audioPublishBitrate(){return this._audioPublishBitrate}set audioPublishBitrate(e){this._audioPublishBitrate=e}set currentBitrate(e){this._currentBitrate=e}get currentBitrate(){return this._currentBitrate}get audioFrameCount(){return this._audioFrameCount}set audioFrameCount(e){this._audioFrameCount=e}get videoFrameCount(){return this._videoFrameCount}set videoFrameCount(e){this._videoFrameCount=e}get frameRate(){return this._frameRate}set frameRate(e){this._frameRate=e}set videoWidth(e){this._videoWidth=e}get videoWidth(){return this._videoWidth}set videoHeight(e){this._videoHeight=e}get videoHeight(){return this._videoHeight}}class WowzaStatusConnection extends AbstractSocket{constructor(e,t){super(),this._logger=e.getLogger(),this._main=e,this._currServer=t,this.initialize()}initialize(){this._logger.info(this,"Starting new status check connection with a storm server"),null!=this._currServer?(this.socketURL=this.createURL(this._currServer),this._logger.info(this,"Starting WebSocket connection with: "+this.socketURL),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("statusServerConnect",{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}))}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("statusServerDisconnect",{ref:this._main,serverURL:this.socketURL,restart:this._main.getConfigManager().getSettingsData().getIfRestartOnError(),sequenceNum:this._sequenceNumber}),this.initiateReconnect())}onSocketMessage(e){var t;"string"==typeof e.data&&"STREAM_STATUS_RESPONSE"===(e=JSON.parse(e.data)).packetID&&((t=new StreamStatusInfo).publishState=e.streamStatus,t.videoPublishBitrate=e.publishVideoBitrate,t.audioPublishBitrate=e.publishAudioBitrate,t.videoFrameCount=e.videoFrameCount,t.audioFrameCount=e.audioFrameCount,t.frameRate=e.frameRate,t.videoWidth=e.videoWidth,t.videoHeight=e.videoHeight,t.currentBitrate=e.realBitrate,this._main.dispatchEvent("streamStatusUpdate",{ref:this._main,streamStatus:t}))}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(()=>{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))}createURL(e){var t="";return(t+=e.getIfSSL()?"wss://":"ws://")+e.getHost()+(":"+e.getPort())+"/statuschecker"}isConnectionActive(){return this._isConnected}getCurrentServer(){return this._currServer}destroy(){super.destroy()}}class PublishMetadata{constructor(){this._streamWidth=0,this._streamHeight=0,this._aspectRatio="",this._hasVideoTrack=!1,this._hasAudioTrack=!1}get streamWidth(){return this._streamWidth}set streamWidth(e){this._streamWidth=e}get streamHeight(){return this._streamHeight}set streamHeight(e){this._streamHeight=e}get aspectRatio(){return this._aspectRatio}set aspectRatio(e){this._aspectRatio=e}get videoTrackPresent(){return this._hasVideoTrack}set videoTrackPresent(e){this._hasVideoTrack=e}get audioTrackPresent(){return this._hasAudioTrack}set audioTrackPresent(e){this._hasAudioTrack=e}}class StreamerController{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._restartTimerCount=0,this._restartTimerMaxCount=5,this._publishState=PublishState.NOT_INITIALIZED,this._publishTime=0,this._inputDeviceState=InputDevicesState.NOT_INITIALIZED,this._cameraState=DeviceState.NOT_INITIALIZED,this._microphoneState=DeviceState.NOT_INITIALIZED,this._publishTimer=0,this._currentOrientation=(null==(t=window.screen.orientation)?void 0:t.type)||"",this._statusTimer=null,this._debug=!1,this._deviceChangeHandler=null,this._orientationChangeHandler=null,this._isDestroyed=!1,this._cameraAbortController=null,this._microphoneAbortController=null,this._startCameraAbortController=null,this._switchingCamera=!1,this._switchingMicrophone=!1,this._firstPublish=!0,this._activeStreamCount=0,this._cameraPermissionStatus=null,this._microphonePermissionStatus=null,this._boundCameraPermissionHandler=null,this._boundMicrophonePermissionHandler=null,this._isInitializing=!1,this.onDeviceStateChange=e=>{var t;this._isDestroyed||(t=null==(t=this._main.getConfigManager())?void 0:t.getStreamData().streamKey,e.state==InputDevicesState.READY&&null!=t&&this.internalPublish(t))},this.handleOrientationChange=()=>__awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed&&(yield new Promise(e=>setTimeout(e,500)),!this._isDestroyed)){var e=(null==(e=window.screen.orientation)?void 0:e.type)||"";if(this._currentOrientation!==e){this._logger.info(this,`Orientation changed from ${this._currentOrientation} to `+e),this._currentOrientation=e;e=null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey;if(this._publishState,PublishState.PUBLISHED,this.closeWebRTCConnection(),this._stream&&(this._logger.info(this,"📹 [RELEASE] handleOrientationChange() - releasing stream for orientation change"),this._stream.getTracks().forEach(e=>{e.stop(),this._logger.info(this,"📹 [RELEASE] handleOrientationChange() - stopped track: "+e.kind)}),this._stream=null,this._activeStreamCount--),!this._isDestroyed)try{yield this.startCamera(),this._isDestroyed||e&&this.internalPublish(e)}catch(e){this._isDestroyed||(this._logger.error(this,"Error restarting stream after orientation change: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID))}}}}),this.onServerDisconnect=()=>{},this.onStreamKeyTaken=()=>{this._isDestroyed||(null!=this._restartTimer&&(clearInterval(this._restartTimer),this._restartTimerCount=0),this._logger.info(this,"WebRTCStreamer :: Starting StreamKeyTaken Interval"),this.setPublishState(PublishState.ERROR),this._restartTimer=setInterval(()=>{var e;this._isDestroyed?this._restartTimer&&clearInterval(this._restartTimer):null!=this._restartTimer&&(this._restartTimerCount<this._restartTimerMaxCount?(this._logger.info(this,"WebRTCStreamer :: StreamKeyTaken Interval: "+this._restartTimerCount+"/"+this._restartTimerMaxCount),this._restartTimerCount++):(clearInterval(this._restartTimer),this._restartTimer=null,this._restartTimerCount=0,null==(e=null==(e=null==(e=this._main.getConfigManager())?void 0:e.getStreamData())?void 0:e.streamKey)||this._isDestroyed||this.internalPublish(e)),this._isDestroyed||(e=null!=(e=this._main.getConfigManager().getStreamData().streamKey)?e:"unknown",this._main.dispatchEvent("streamKeyInUseInterval",{ref:this._main,streamKey:e,count:this._restartTimerCount,maxCount:this._restartTimerMaxCount})))},1e3))},this.onServerConnect=()=>{if(!this._isDestroyed){if(this._peerConnection&&this.closeWebRTCConnection(),this._peerConnection=new RTCPeerConnection(this._peerConnectionConfig),this._stream){var e,t=this._stream.getTracks();for(e in t)this._peerConnection.addTrack(t[e],this._stream)}this._peerConnection.onicecandidate=e=>{this.onIceCandidate(e)},this._peerConnection.onconnectionstatechange=e=>{this.onConnectionStateChange(e)},this._peerConnection.onnegotiationneeded=e=>__awaiter(this,void 0,void 0,function*(){if(this._peerConnection&&!this._isDestroyed)try{var e=yield this._peerConnection.createOffer();this._isDestroyed||(yield this.onDescriptionSuccess(e))}catch(e){this.onDescriptionError(e)}}),this.createStatusConnection()}},this.onStatusServerConnect=()=>{var e;this._isDestroyed||(e=this._main.getConfigManager().getStreamData().streamKey,null==this._statusTimer&&null!=this._statusConnection&&null!=e&&(this._statusTimer=setInterval(()=>{this._isDestroyed?this._statusTimer&&clearInterval(this._statusTimer):this.requestStatusData()},1e3)))},this.requestStatusData=()=>{var e;!this._isDestroyed&&this._fullStreamName&&null!=(e=this._statusConnection)&&e.sendData('{"packetID":"STREAM_STATUS", "streamKey": "'+this._fullStreamName+'"}')},this.onStatusServerDisconnect=()=>{null!=this._statusTimer&&clearInterval(this._statusTimer),this._statusTimer=null},this.onStreamStatsUpdate=e=>{this._isDestroyed||(e=e.streamStatus,this._publishState==PublishState.PUBLISHED&&e.publishState!=PublishState.PUBLISHED&&this.setPublishState(PublishState.UNPUBLISHED),this._publishState==PublishState.CONNECTED&&e.publishState==PublishState.PUBLISHED&&this.setPublishState(PublishState.PUBLISHED))},this.onDescriptionSuccess=t=>{var e;if(!this._isDestroyed){const i={applicationName:null==(e=null==(e=null==(e=this._main.getNetworkController())?void 0:e.getConnection())?void 0:e.getCurrentServer())?void 0:e.getApplication(),streamName:this._fullStreamName,sessionId:"[empty]"};t.sdp=this._mungeSDP.mungeSDPPublish(t.sdp,{audioBitrate:"64",videoBitrate:"2000",videoFrameRate:30,videoCodec:"42e01f",audioCodec:"opus"}),this._peerConnection&&!this._isDestroyed&&this._peerConnection.setLocalDescription(t).then(()=>{var e;this._isDestroyed||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 MungeSDP,this._soundMeter=new SoundMeter(this._main),this._debug=null!=(e=null==(t=this._main.getConfigManager())?void 0:t.getSettingsData().getDebugData().streamerControllerDebug)?e:this._debug;var t,e=null==(t=this._main.getStorageManager())?void 0:t.getField("microphoneMuted");null!==e&&(this._isMicrophoneMuted="true"===e,this._logger.info(this,"📹 [INIT] Restored microphone mute state: "+this._isMicrophoneMuted)),this.initialize()}isDestroyedCheck(e){var t;return!!this._isDestroyed&&(e&&null!=(t=this._logger)&&t.info(this,`📹 [ABORT] ${e} - instance destroyed, aborting`),!0)}initialize(){var e,t;return __awaiter(this,void 0,void 0,function*(){if(!this._isInitializing){this._isInitializing=!0,this._logger.info(this,"📹 [INIT] initialize() - starting initialization");try{if(this.isDestroyedCheck("initialize start"))return;if(yield this.initializeDevices(),this.isDestroyedCheck("after initializeDevices"))return;if(this.setupEventListeners(),this.isDestroyedCheck("after setupEventListeners"))return;if(this.initializeStream(),this.isDestroyedCheck("after initializeStream"))return;if(this.setupOrientationListener(),yield this.setupPermissionListeners(),this.isDestroyedCheck("after setupPermissionListeners"))return;if(this.setupDeviceChangeListener(),this.isDestroyedCheck("before network init"))return;null!=(e=this._main.getConfigManager())&&e.getSettingsData().autoConnect?(this._logger.info(this,"Initializing NetworkController (autoConnect is true)"),null!=(t=this._main.getNetworkController())&&t.initialize()):this._logger.warning(this,"Warning - autoConnect is set to false, switching to standby mode!"),this._logger.success(this,"📹 [INIT] initialize() - completed successfully")}catch(e){if(this._isDestroyed)return void this._logger.warning(this,"📹 [INIT] initialize() - aborted by destroy()");this._logger.error(this,"Initialization failed: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID)}finally{this._isInitializing=!1}this._main.dispatchEvent("microphoneStateChange",{ref:this._main,isMuted:this._isMicrophoneMuted})}})}setupEventListeners(){this._isDestroyed||(this._main.addEventListener("serverConnect",this.onServerConnect,!1),this._main.addEventListener("serverDisconnect",this.onServerDisconnect,!1),this._main.addEventListener("streamKeyInUse",this.onStreamKeyTaken,!1),this._main.addEventListener("statusServerConnect",this.onStatusServerConnect,!1),this._main.addEventListener("statusServerDisconnect",this.onStatusServerDisconnect,!1),this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate,!1),this._main.addEventListener("deviceStateChange",this.onDeviceStateChange,!1),document.addEventListener("visibilitychange",this.visibilityChange),window.addEventListener("blur",this.onWindowBlur),window.addEventListener("focus",this.onWindowFocus))}initializeDevices(){return __awaiter(this,void 0,void 0,function*(){try{var e;this._logger.info(this,"📹 [ACQUIRE] initializeDevices() - requesting test getUserMedia for permissions"),this.isDestroyedCheck("initializeDevices before getUserMedia")||(e=yield navigator.mediaDevices.getUserMedia({video:!0,audio:!0}),this._isDestroyed?(this._logger.warning(this,"📹 [RELEASE] initializeDevices() - destroyed during getUserMedia, releasing orphan stream"),e.getTracks().forEach(e=>{e.stop(),this._logger.info(this,`📹 [RELEASE] initializeDevices() - stopped orphan track: ${e.kind}, id: `+e.id)})):(this._logger.info(this,"📹 [RELEASE] initializeDevices() - stopping test stream immediately"),e.getTracks().forEach(e=>{e.stop(),this._logger.info(this,`📹 [RELEASE] initializeDevices() - stopped track: ${e.kind}, id: `+e.id)}),this.isDestroyedCheck("initializeDevices before grabDevices")||(yield this.grabDevices())))}catch(e){this._isDestroyed||(console.log(e),this._logger.error(this,"Error initializing devices: "+JSON.stringify(e)),this._isDestroyed)||(yield this.grabDevices())}})}initializeStream(){this._isDestroyed||(this._selectedCamera||this._selectedMicrophone)&&this.startCamera()}setupPermissionListeners(){return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed)try{var e={name:"camera"},t={name:"microphone"};this._cameraPermissionStatus=yield navigator.permissions.query(e),this._isDestroyed||(this._boundCameraPermissionHandler=()=>{this._isDestroyed||(this._permissionChecked=!1,this.handlePermissionChange("camera",this._cameraPermissionStatus.state))},this._cameraPermissionStatus.addEventListener("change",this._boundCameraPermissionHandler),this._microphonePermissionStatus=yield navigator.permissions.query(t),this._isDestroyed)||(this._boundMicrophonePermissionHandler=()=>{this._isDestroyed||(this._permissionChecked=!1,this.handlePermissionChange("microphone",this._microphonePermissionStatus.state))},this._microphonePermissionStatus.addEventListener("change",this._boundMicrophonePermissionHandler))}catch(e){this._logger.warning(this,"Could not set up permission listeners: "+e)}})}removePermissionListeners(){this._cameraPermissionStatus&&this._boundCameraPermissionHandler&&(this._cameraPermissionStatus.removeEventListener("change",this._boundCameraPermissionHandler),this._cameraPermissionStatus=null,this._boundCameraPermissionHandler=null),this._microphonePermissionStatus&&this._boundMicrophonePermissionHandler&&(this._microphonePermissionStatus.removeEventListener("change",this._boundMicrophonePermissionHandler),this._microphonePermissionStatus=null,this._boundMicrophonePermissionHandler=null)}setupDeviceChangeListener(){this._isDestroyed||(this._deviceChangeHandler=()=>__awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed)if(this._publishState===PublishState.PUBLISHED)this._logger.info(this,"Device change detected, but already publish - no restarting streamer");else{this._logger.info(this,"Device change detected, restarting streamer");var e=null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey,t=this._publishState===PublishState.CONNECTED;try{this.stop(),yield new Promise(e=>setTimeout(e,500)),this._isDestroyed||(yield this.start(),this._isDestroyed)||(t&&e&&(this._logger.info(this,"Resuming publishing after device change"),this.isStreamReady(!0,!0)?this.internalPublish(e):(this._logger.warning(this,"Cannot resume publishing - stream not ready after device change"),this._main.dispatchEvent("inputDeviceError",{ref:this._main}))),this._logger.success(this,"Successfully handled device change"))}catch(e){this._isDestroyed||(this._logger.error(this,"Error handling device change: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID))}}}),navigator.mediaDevices.addEventListener("devicechange",this._deviceChangeHandler))}handlePermissionChange(e,t){return __awaiter(this,void 0,void 0,function*(){this._isDestroyed||(this._logger.info(this,`📹 [PERMISSION] handlePermissionChange() - device: ${e}, state: `+t),"denied"===t&&(this.setInputDeviceState(InputDevicesState.INVALID),this._publishState!=PublishState.CONNECTED&&!this._stream||(this._logger.info(this,"📹 [RELEASE] handlePermissionChange() - permission denied, stopping all streams"),this.stopCameraStream(),this.closeWebRTCConnection())),this._isDestroyed)||(yield this.grabDevices(),this._isDestroyed)||"granted"===t&&(yield this.startCamera())})}onCameraStreamSuccess(e){if(this._isDestroyed)this._logger.warning(this,"📹 [RELEASE] onCameraStreamSuccess() - destroyed, releasing stream immediately"),e.getTracks().forEach(e=>{e.stop()});else{this._activeStreamCount++,this._logger.success(this,`📹 [ACQUIRED] onCameraStreamSuccess() - stream acquired, id: ${e.id}, active streams: `+this._activeStreamCount);var s=e.getVideoTracks()[0],t=e.getAudioTracks()[0],n=new PublishMetadata;if(s){var r=s.getSettings();let e=r.width,t=r.height;/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)&&(e>t&&window.innerWidth<window.innerHeight||e<t&&window.innerWidth>window.innerHeight)&&([e,t]=[t,e]),n.streamWidth=e,n.streamHeight=t,n.videoTrackPresent=!0;const h=(e,t)=>t?h(t,e%t):e;var r=h(e,t),o=e/r,r=t/r,a=e/t;let i=o+":"+r;Math.abs(a-16/9)<.1?i=e>t?"16:9":"9:16":Math.abs(a-4/3)<.1&&(i=e>t?"4:3":"3:4"),n.aspectRatio=i,this._logger.info(this,`📹 [INFO] Video track - id: ${s.id}, enabled: ${s.enabled}, readyState: `+s.readyState)}else n.videoTrackPresent=!1;t&&this._logger.info(this,`📹 [INFO] Audio track - id: ${t.id}, enabled: ${t.enabled}, readyState: `+t.readyState),n.audioTrackPresent=!!t,this._logger.info(this,`Publish MetaData :: Resolution: ${n.streamWidth}x${n.streamHeight} | `+`Aspect ratio: ${n.aspectRatio}, `+`Video track: ${n.videoTrackPresent} | Audio track: `+n.audioTrackPresent),this._isDestroyed?(this._logger.warning(this,"📹 [RELEASE] onCameraStreamSuccess() - destroyed during setup, releasing"),e.getTracks().forEach(e=>e.stop()),this._activeStreamCount--):(this._main.dispatchEvent("publishMetadataUpdate",{ref:this._main,metadata:n}),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(),(a=null==(r=null==(o=this._main.getStageController())?void 0:o.getScreenElement())?void 0:r.getVideoElement())&&(a.srcObject=e,a.autoplay=!0,a.playsInline=!0,a.disableRemotePlayback=!0,a.controls=!1,a.muted=!0),this.setPublishState(PublishState.INITIALIZED))}}initializeWebRTC(){var e;this._isDestroyed||(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._isDestroyed&&(this._debug&&this._logger.decoratedLog("Publishing: "+e,"dark-red"),this._logger.info(this,"Publish: "+e),this._main.getConfigManager().getStreamData().streamKey==e?(this._debug&&this._logger.decoratedLog("Canceling publishing, already published "+e,"dark-red"),this._logger.info(this,"Canceling publishing, already published "+e),!1):this.internalPublish(e))}internalPublish(e){return!(this._isDestroyed||(null!=this._statusTimer&&clearInterval(this._statusTimer),null==this._main.getConfigManager().getStreamData().streamKey||this._firstPublish||(this._debug&&this._logger.decoratedLog("Unpublishing active session: "+this._main.getConfigManager().getStreamData().streamKey,"dark-red"),this.unpublish()),this._main.getConfigManager().getStreamData().streamKey=e,this._fullStreamName=e+"_"+(new Date).getTime(),this.isStreamReady(!0,!0)?(this.closeWebRTCConnection(),this._main.dispatchEvent("publish",{ref:this._main,streamKey:e}),this.initializeWebRTC(),this._firstPublish=!1):(this._logger.warning(this,"Cannot publish - stream not ready (missing video or audio track)"),1)))}unpublish(){this._debug&&this._logger.decoratedLog("Unpublish","dark-red"),this._logger.info(this,"📹 [UNPUBLISH] unpublish() - stopping WebRTC but keeping camera preview"),null!=this._statusConnection&&(this._statusConnection.destroy(),this._statusConnection=null),null!=this._statusTimer&&(clearInterval(this._statusTimer),this._statusTimer=null),clearTimeout(this._publishTimer),this._main.getConfigManager().getStreamData().streamKey=null,this._main.dispatchEvent("unpublish",{ref:this._main}),this.closeWebRTCConnection(),this.setPublishState(PublishState.UNPUBLISHED)}unpublishAndRelease(){this._logger.info(this,"📹 [UNPUBLISH+RELEASE] unpublishAndRelease() - stopping everything"),this._debug&&this._logger.decoratedLog("Unpublish + Release","dark-red"),this.unpublish(),this.stopCameraStream()}setupOrientationListener(){this._isDestroyed||(this._orientationChangeHandler=this.handleOrientationChange,window.screen&&window.screen.orientation?window.screen.orientation.addEventListener("change",this._orientationChangeHandler):window.addEventListener("orientationchange",this._orientationChangeHandler))}onUserMediaError(e){return __awaiter(this,void 0,void 0,function*(){this._isDestroyed||(this._logger.error(this,`📹 [ERROR] onUserMediaError() - ${e.name}: `+e.message),yield this.grabDevices(),"OverconstrainedError"===e.name&&this._logger.warning(this,"Device constraints not satisfied"))})}checkIndividualDeviceAccess(){return __awaiter(this,void 0,void 0,function*(){var t={camera:{allowed:!1,available:!1},microphone:{allowed:!1,available:!1}};if(!this._isDestroyed)try{var e=yield navigator.mediaDevices.enumerateDevices();if(this._isDestroyed)return t;if(t.camera.available=e.some(e=>"videoinput"===e.kind),t.microphone.available=e.some(e=>"audioinput"===e.kind),e.some(e=>""!==e.label))t.camera.allowed=e.some(e=>"videoinput"===e.kind&&""!==e.label),t.microphone.allowed=e.some(e=>"audioinput"===e.kind&&""!==e.label);else{if(this._logger.info(this,"📹 [ACQUIRE] checkIndividualDeviceAccess() - no labels, requesting permissions"),this._isDestroyed)return t;try{var i=yield navigator.mediaDevices.getUserMedia({video:t.camera.available,audio:t.microphone.available});if(this._isDestroyed)return this._logger.warning(this,"📹 [RELEASE] checkIndividualDeviceAccess() - destroyed, releasing orphan stream"),i.getTracks().forEach(e=>e.stop()),t;if(t.camera.allowed=0<i.getVideoTracks().length,t.microphone.allowed=0<i.getAudioTracks().length,this._logger.info(this,"📹 [RELEASE] checkIndividualDeviceAccess() - stopping test stream"),i.getTracks().forEach(e=>{e.stop(),this._logger.info(this,"📹 [RELEASE] checkIndividualDeviceAccess() - stopped track: "+e.kind)}),this._isDestroyed)return t;yield this.grabDevices()}catch(e){console.error("Error requesting permissions:",e),t.camera.allowed=!1,t.microphone.allowed=!1}}}catch(e){console.error("Error checking devices:",e)}return t})}onSocketMessage(e){if(!this._isDestroyed){var t=JSON.parse(e);switch(Number(t.status)){case 200:this._logger.info(this,"SDP Exchange Successful");var i=t.sdp,s=(void 0!==i&&this._peerConnection&&this._peerConnection.setRemoteDescription(new RTCSessionDescription(i),()=>{},()=>{}),t.iceCandidates);if(void 0!==s)for(var n in s)this._peerConnection&&this._peerConnection.addIceCandidate(new RTCIceCandidate(s[n]));break;case 503:this._logger.error(this,"StreamKey already use");i=null!=(i=this._main.getConfigManager().getStreamData().streamKey)?i:"unknown";this._main.dispatchEvent("streamKeyInUse",{ref:this._main,streamKey:i}),this.setPublishState(PublishState.ERROR)}}}onConnectionStateChange(e){if(!this._isDestroyed&&(this._logger.info(this,"Connection State Change: "+JSON.stringify(e)),null!==e))switch(e.currentTarget.connectionState){case"connecting":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnecting"),this.setPublishState(PublishState.CONNECTING);break;case"connected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnected"),this.setPublishState(PublishState.CONNECTED),this.muteMicrophone(this._isMicrophoneMuted);break;case"disconnected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerDisconnected"),this.setPublishState(PublishState.UNPUBLISHED);break;case"failed":this._logger.info(this,"WebRTCStreamer :: Event: onPlayerFailed"),this.setPublishState(PublishState.ERROR);break;default:this._logger.info(this,"WebRTCStreamer :: Unsupported onConnectionStateChange: "+e.currentTarget.connectionState)}}grabDevices(){return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed)try{var e=yield this.checkIndividualDeviceAccess();if(!this._isDestroyed&&(this._cameraList=new InputDeviceList,this._microphoneList=new InputDeviceList,this._permissionChecked||(e.camera.allowed?e.camera.available||(this._main.dispatchEvent("noCameraFound",{ref:this._main}),this.setCameraState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID)):(this._main.dispatchEvent("cameraAccessDenied",{ref:this._main}),this.setCameraState(DeviceState.ACCESS_DENIED),this.setInputDeviceState(InputDevicesState.INVALID)),e.microphone.allowed?e.microphone.available||(this._main.dispatchEvent("noMicrophoneFound",{ref:this._main}),this.setMicrophoneState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID)):(this._main.dispatchEvent("microphoneAccessDenied",{ref:this._main}),this.setMicrophoneState(DeviceState.ACCESS_DENIED),this.setInputDeviceState(InputDevicesState.INVALID))),!this._isDestroyed)){var t,i,s=yield navigator.mediaDevices.enumerateDevices();if(!this._isDestroyed){for(const n of s)n.deviceId&&n.label&&("videoinput"===n.kind&&e.camera.allowed?(t=new InputDevice(n,this._cameraList.getSize()),this._cameraList.push(t)):"audioinput"===n.kind&&e.microphone.allowed&&(i=new InputDevice(n,this._microphoneList.getSize()),this._microphoneList.push(i)));if(!this._isDestroyed){try{e.camera.allowed&&(this._selectedCamera=this.pickCamera()),e.microphone.allowed&&(this._selectedMicrophone=this.pickMicrophone())}catch(e){console.log(e),this.setInputDeviceState(InputDevicesState.INVALID),this._logger.error(this,"Error on grab devices: "+JSON.stringify(e))}this._isDestroyed||this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._permissionChecked=!0}}}}catch(e){this._isDestroyed||(console.error("Error in grabDevices:",e),this._cameraList=new InputDeviceList,this._microphoneList=new InputDeviceList,this._isDestroyed)||(this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._main.dispatchEvent("inputDeviceError",{ref:this._main}))}})}selectCamera(i){var n,r,o;return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed){this._cameraAbortController&&this._cameraAbortController.abort(),this._cameraAbortController=new AbortController;const s=this._cameraAbortController.signal;try{this._switchingCamera=!0,this._logger.info(this,"📹 [SWITCH] selectCamera() - switching to camera: "+i);for(let e=0;e<this._cameraList.getSize();e++)this._cameraList.get(e).isSelected=!1;this._selectedCamera=null,this.setInputDeviceState(InputDevicesState.UPDATING),this.setCameraState(DeviceState.NOT_INITIALIZED);var e=null==(n=this._main.getConfigManager())?void 0:n.getStreamData().streamKey,t=this._publishState===PublishState.CONNECTED;for(let e=0;e<this._cameraList.getSize();e++)if(this._cameraList.get(e).id==i){this._selectedCamera=this._cameraList.get(e),this._selectedCamera.isSelected=!0,null!=(r=this._main.getStorageManager())&&r.saveField("cameraID",this._selectedCamera.id);break}this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),s.aborted||this._isDestroyed||(this.stopCameraStream(),null!=this._selectedCamera?(this._constraints.video.deviceId=this._selectedCamera.id,s.aborted||this._isDestroyed||(yield new Promise((e,t)=>{const i=setTimeout(e,500);s.addEventListener("abort",()=>{clearTimeout(i),t(new Error("Aborted"))})}),s.aborted)||this._isDestroyed||(yield this.startCamera(),this._isDestroyed)||(this.setCameraState(DeviceState.ENABLED),this._cameraState==DeviceState.ENABLED&&this._microphoneState==DeviceState.ENABLED?this.setInputDeviceState(InputDevicesState.READY):this.setInputDeviceState(InputDevicesState.INVALID),t&&e&&!s.aborted&&!this._isDestroyed&&this.internalPublish(e))):this.setInputDeviceState(InputDevicesState.INVALID))}catch(e){"Aborted"===e.message||this._isDestroyed||(this._logger.error(this,"📹 [ERROR] selectCamera() - Error switching camera: "+e),this.setInputDeviceState(InputDevicesState.INVALID))}finally{this._switchingCamera=!1,(null==(o=this._cameraAbortController)?void 0:o.signal)===s&&(this._cameraAbortController=null)}}})}selectMicrophone(i){var n,r,o;return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed){this._microphoneAbortController&&this._microphoneAbortController.abort(),this._microphoneAbortController=new AbortController;const s=this._microphoneAbortController.signal;try{this._switchingMicrophone=!0,this._logger.info(this,"📹 [SWITCH] selectMicrophone() - switching to microphone: "+i);for(let e=0;e<this._microphoneList.getSize();e++)this._microphoneList.get(e).isSelected=!1;this._selectedMicrophone=null,this.setInputDeviceState(InputDevicesState.UPDATING),this.setMicrophoneState(DeviceState.NOT_INITIALIZED);var e=null==(n=this._main.getConfigManager())?void 0:n.getStreamData().streamKey,t=this._publishState===PublishState.CONNECTED;for(let e=0;e<this._microphoneList.getSize();e++)if(this._microphoneList.get(e).id==i){this._selectedMicrophone=this._microphoneList.get(e),this._selectedMicrophone.isSelected=!0,null!=(r=this._main.getStorageManager())&&r.saveField("microphoneID",this._selectedMicrophone.id);break}this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),s.aborted||this._isDestroyed||(this._soundMeter.detach(),this.closeWebRTCConnection(),this._stream&&(this._logger.info(this,"📹 [RELEASE] selectMicrophone() - stopping current stream"),this._stream.getTracks().forEach(e=>{e.stop()}),this._stream=null,this._activeStreamCount--),s.aborted)||this._isDestroyed||(yield new Promise((e,t)=>{const i=setTimeout(e,500);s.addEventListener("abort",()=>{clearTimeout(i),t(new Error("Aborted"))})}),s.aborted)||this._isDestroyed||(yield this.startCamera(),this._isDestroyed)||(this.setMicrophoneState(DeviceState.ENABLED),this._cameraState==DeviceState.ENABLED&&this._microphoneState==DeviceState.ENABLED?this.setInputDeviceState(InputDevicesState.READY):this.setInputDeviceState(InputDevicesState.INVALID),t&&e&&!s.aborted&&!this._isDestroyed&&this.internalPublish(e))}catch(e){"Aborted"===e.message||this._isDestroyed||(console.error("Error changing microphone:",e),this._main.dispatchEvent("inputDeviceError",{ref:this._main}),this.setInputDeviceState(InputDevicesState.INVALID))}finally{this._switchingMicrophone=!1,(null==(o=this._microphoneAbortController)?void 0:o.signal)===s&&(this._microphoneAbortController=null)}}})}startCamera(){var s;return __awaiter(this,void 0,void 0,function*(){if(this._isDestroyed)this._logger.warning(this,"📹 [ACQUIRE] startCamera() - aborted, instance is destroyed");else{this._startCameraAbortController&&this._startCameraAbortController.abort(),this._startCameraAbortController=new AbortController;var t=this._startCameraAbortController.signal;this._stream&&(this._logger.info(this,"📹 [RELEASE] startCamera() - releasing existing stream before acquiring new one"),this._stream.getTracks().forEach(e=>{e.stop()}),this._stream=null,this._activeStreamCount--);try{var i={video:!!this._selectedCamera&&Object.assign(Object.assign({},this._constraints.video),{deviceId:{exact:this._selectedCamera.id}}),audio:!!this._selectedMicrophone&&{deviceId:{exact:this._selectedMicrophone.id}}};if(!t.aborted&&!this._isDestroyed){this._logger.info(this,"📹 [ACQUIRE] startCamera() - requesting getUserMedia");try{var e=yield navigator.mediaDevices.getUserMedia(i);if(t.aborted||this._isDestroyed)return this._logger.warning(this,"📹 [RELEASE] startCamera() - destroyed during getUserMedia, releasing orphan stream"),void e.getTracks().forEach(e=>{e.stop(),this._logger.info(this,`📹 [RELEASE] startCamera() - stopped orphan track: ${e.kind}, id: `+e.id)});this._stream=e,this.onCameraStreamSuccess(this._stream)}catch(e){if(t.aborted||this._isDestroyed)return;this._logger.error(this,`📹 [ERROR] startCamera() - getUserMedia failed: ${e.name}: `+e.message),i.video&&this.onUserMediaError({name:e.name||"Error",message:e.message||"Unknown error",deviceType:"video"}),i.audio&&this.onUserMediaError({name:e.name||"Error",message:e.message||"Unknown error",deviceType:"audio"})}this._cameraState==DeviceState.ENABLED&&this._microphoneState==DeviceState.ENABLED&&this.setInputDeviceState(InputDevicesState.READY)}}catch(e){this._isDestroyed||(console.error("Error in startCamera:",e),yield this.grabDevices())}finally{(null==(s=this._startCameraAbortController)?void 0:s.signal)===t&&(this._startCameraAbortController=null)}}})}updateWebRTCStream(){this._isDestroyed||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)}))}pickCamera(){var e;if(this._isDestroyed)return null;for(let e=0;e<this._cameraList.getSize();e++)this._cameraList.get(e).isSelected=!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).id===i){this._selectedCamera=this._cameraList.get(e),this._selectedCamera.isSelected=!0,this.setCameraState(DeviceState.ENABLED),t=!0,this._constraints.video.deviceId=this._selectedCamera.id;break}t||(this.setCameraState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),this._main.dispatchEvent("savedCameraNotFound",{ref:this._main,savedDeviceID:i}),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null))}if(!this._selectedCamera){if(this._main.dispatchEvent("savedCameraNotFound",{ref:this._main,savedDeviceID:null}),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null),null==(e=this._main.getConfigManager())||!e.getSettingsData().getIfForceSelection())return this.setCameraState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),null;this._selectedCamera=this._cameraList.get(0),this._selectedCamera.isSelected=!0,null!=(e=this._main.getStorageManager())&&e.saveField("cameraID",this._selectedCamera.id),this._constraints.video.deviceId=this._selectedCamera.id,this.setCameraState(DeviceState.ENABLED)}}return this._isDestroyed||this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._selectedCamera}pickMicrophone(){var e;if(this._isDestroyed)return null;for(let e=0;e<this._microphoneList.getSize();e++)this._microphoneList.get(e).isSelected=!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).id===i){this._selectedMicrophone=this._microphoneList.get(e),t=!0,this.setMicrophoneState(DeviceState.ENABLED);break}t||(this._main.dispatchEvent("savedMicrophoneNotFound",{ref:this._main,savedDeviceID:i}),this.setMicrophoneState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null))}if(!this._selectedMicrophone){if(this._main.dispatchEvent("savedMicrophoneNotFound",{ref:this._main,savedDeviceID:null}),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null),null==(e=this._main.getConfigManager())||!e.getSettingsData().getIfForceSelection())return this.setMicrophoneState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),null;this._selectedMicrophone=this._microphoneList.get(0),this.setMicrophoneState(DeviceState.ENABLED),null!=(e=this._main.getStorageManager())&&e.saveField("microphoneID",this._selectedMicrophone.id)}this._selectedMicrophone.isSelected=!0,this._constraints.audio={deviceId:this._selectedMicrophone.id}}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){var t;this._isDestroyed||this._isMicrophoneMuted!==e&&(this._isMicrophoneMuted=e,null!=(t=this._main.getStorageManager())&&t.saveField("microphoneMuted",e?"true":"false"),this._stream?this.applyMicrophoneState(!e):this._pendingMicrophoneState=!e,this._main.dispatchEvent("microphoneStateChange",{ref:this._main,isMuted:this._isMicrophoneMuted}))}applyMicrophoneState(t){var e;this._stream&&(e=this._stream.getAudioTracks())&&0<e.length&&e.forEach(e=>e.enabled=t)}isStreamReady(e=!0,t=!0){var i,s;return!!this._stream&&(s=this._stream.getVideoTracks(),i=this._stream.getAudioTracks(),e=!e||0<s.length&&"live"===s[0].readyState,s=!t||0<i.length&&"live"===i[0].readyState,e)&&s}closeWebRTCConnection(){if(this._peerConnection){this._logger.info(this,"📡 [WEBRTC] closeWebRTCConnection() - closing peer connection"),this._peerConnection.onicecandidate=null,this._peerConnection.onconnectionstatechange=null,this._peerConnection.onnegotiationneeded=null;try{this._peerConnection.close()}catch(e){}this._peerConnection=null}}onDescriptionError(e){this._logger.info(this,"WebRTCStreamer :: onDescriptionError: "+JSON.stringify(e))}onIceCandidate(e){e.candidate}createStatusConnection(){var e;this._isDestroyed||(e=null==(e=null==(e=null==(e=this._main)?void 0:e.getNetworkController())?void 0:e.getConnection())?void 0:e.getCurrentServer())&&(this._statusConnection&&!this._statusConnection.isConnectionActive()&&this._statusConnection.destroy(),this._statusConnection=new WowzaStatusConnection(this._main,e))}isMicrophoneMuted(){return this._isMicrophoneMuted}getCurrentCamera(){return this._selectedCamera}getCurrentMicrophone(){return this._selectedMicrophone}setPublishState(e){this._publishState==e||this._isDestroyed||(this._debug&&this._logger.decoratedLog("Publish State: "+e,"dark-blue"),this._logger.info(this,"Publish State: "+e),e==PublishState.PUBLISHED&&(this._publishTime=(new Date).getTime()),this._publishState=e,this._main.dispatchEvent("publishStateChange",{ref:this._main,state:this._publishState}))}getPublishTime(){return this._publishState==PublishState.PUBLISHED?this._publishTime:0}setInputDeviceState(e){this._inputDeviceState==e||this._isDestroyed||(this._inputDeviceState=e,this._main.dispatchEvent("deviceStateChange",{ref:this._main,state:this._inputDeviceState,selectedCamera:this._selectedCamera,selectedMicrophone:this._selectedMicrophone}))}getInputDeviceState(){return this._inputDeviceState}setCameraState(e){this._cameraState==e||this._isDestroyed||(this._cameraState=e,this._main.dispatchEvent("cameraDeviceStateChange",{ref:this._main,state:e,selectedCamera:this._selectedCamera}))}getCameraState(){return this._cameraState}setMicrophoneState(e){this._microphoneState==e||this._isDestroyed||(this._microphoneState=e,this._main.dispatchEvent("microphoneDeviceStateChange",{ref:this._main,state:e,selectedMicrophone:this._selectedMicrophone}))}getMicrophoneState(){return this._microphoneState}getCameraList(){return null!=this._cameraList?this._cameraList.getArray():[]}getMicrophoneList(){return null!=this._microphoneList?this._microphoneList.getArray():[]}getPublishState(){return this._publishState}debugMediaState(){console.group("🎥 Media Debug State"),console.log("=== STREAM INFO ==="),console.log("this._stream:",this._stream),console.log("Active stream count:",this._activeStreamCount),console.log("Is destroyed:",this._isDestroyed),this._stream&&(console.log("Stream ID:",this._stream.id),console.log("Stream active:",this._stream.active),console.log("--- Video Tracks ---"),this._stream.getVideoTracks().forEach((e,t)=>{console.log(` Track ${t}:`,{id:e.id,enabled:e.enabled,readyState:e.readyState,muted:e.muted})}),console.log("--- Audio Tracks ---"),this._stream.getAudioTracks().forEach((e,t)=>{console.log(` Track ${t}:`,{id:e.id,enabled:e.enabled,readyState:e.readyState,muted:e.muted})})),console.log("=== VIDEO ELEMENT ===");var e=null==(e=null==(e=this._main.getStageController())?void 0:e.getScreenElement())?void 0:e.getVideoElement();(null==e?void 0:e.srcObject)instanceof MediaStream&&(e=e.srcObject,console.log("Video srcObject stream ID:",e.id),console.log("Video srcObject active:",e.active),console.log("Same as this._stream:",e===this._stream)),console.groupEnd()}stopCameraStream(){var e;this._stream&&(this._logger.info(this,"📹 [RELEASE] stopCameraStream() - stopping stream, id: "+this._stream.id),this._stream.getTracks().forEach(e=>{this._logger.info(this,`📹 [RELEASE] stopCameraStream() - stopping track: ${e.kind}, id: `+e.id),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,this._activeStreamCount--,this._logger.info(this,"📹 [RELEASE] stopCameraStream() - complete, active streams: "+this._activeStreamCount))}stop(){this._logger.info(this,"📹 [STOP] stop() - stopping all operations"),this._cameraAbortController&&(this._cameraAbortController.abort(),this._cameraAbortController=null),this._microphoneAbortController&&(this._microphoneAbortController.abort(),this._microphoneAbortController=null),this._startCameraAbortController&&(this._startCameraAbortController.abort(),this._startCameraAbortController=null),this._statusConnection&&(this._statusConnection.destroy(),this._statusConnection=null),this._statusTimer&&(clearInterval(this._statusTimer),this._statusTimer=null),this._main.getConfigManager().getStreamData().streamKey=null,this.closeWebRTCConnection(),this.stopCameraStream(),this.setPublishState(PublishState.STOPPED),this.setInputDeviceState(InputDevicesState.STOPPED),this.setCameraState(DeviceState.STOPPED),this.setMicrophoneState(DeviceState.STOPPED),this._restartTimer&&(clearInterval(this._restartTimer),this._restartTimer=null),this._restartTimerCount=0,clearTimeout(this._publishTimer)}start(){var e,t,i;return __awaiter(this,void 0,void 0,function*(){if(this._isDestroyed||this._isInitializing)this._logger.warning(this,"📹 [START] start() - skipped (destroyed or already initializing)");else if(this._publishState!==PublishState.STOPPED&&this._publishState!==PublishState.NOT_INITIALIZED)this._logger.warning(this,"📹 [START] start() - already running, ignoring");else if(this._inputDeviceState!==InputDevicesState.STOPPED&&this._inputDeviceState!==InputDevicesState.NOT_INITIALIZED)this._logger.warning(this,"📹 [START] start() - devices already initializing/ready, ignoring");else{this._logger.info(this,"📹 [START] start() - reinitializing streaming");try{this._publishState=PublishState.NOT_INITIALIZED,this._inputDeviceState=InputDevicesState.NOT_INITIALIZED,this._cameraState=DeviceState.NOT_INITIALIZED,this._microphoneState=DeviceState.NOT_INITIALIZED,yield this.initializeDevices(),this._isDestroyed||(yield this.startCamera(),this._isDestroyed)||(null!=(e=this._main.getConfigManager())&&e.getSettingsData().autoConnect&&null!=(t=this._main.getNetworkController())&&t.initialize(),null!=(i=this._main.getConfigManager())&&i.getStreamData().streamKey&&this.createStatusConnection())}catch(e){if(!this._isDestroyed)throw this._logger.error(this,"📹 [START] start() - failed: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID),e}}})}destroy(){var e,t,i,s;if(this._isDestroyed)null!=(e=this._logger)&&e.warning(this,"🔴 [DESTROY] Already destroyed, skipping");else{this._logger.info(this,"🔴 [DESTROY] Starting StreamerController destroy (sync)..."),this._isDestroyed=!0,this._cameraAbortController&&(this._cameraAbortController.abort(),this._cameraAbortController=null),this._microphoneAbortController&&(this._microphoneAbortController.abort(),this._microphoneAbortController=null),this._startCameraAbortController&&(this._startCameraAbortController.abort(),this._startCameraAbortController=null),null!=this._statusTimer&&(clearInterval(this._statusTimer),this._statusTimer=null),null!=this._restartTimer&&(clearInterval(this._restartTimer),this._restartTimer=null),clearTimeout(this._publishTimer),this.removePermissionListeners(),this._deviceChangeHandler&&(navigator.mediaDevices.removeEventListener("devicechange",this._deviceChangeHandler),this._deviceChangeHandler=null),this._orientationChangeHandler&&(window.screen&&window.screen.orientation?window.screen.orientation.removeEventListener("change",this._orientationChangeHandler):window.removeEventListener("orientationchange",this._orientationChangeHandler),this._orientationChangeHandler=null);try{this._main.removeEventListener("serverConnect",this.onServerConnect),this._main.removeEventListener("serverDisconnect",this.onServerDisconnect),this._main.removeEventListener("streamKeyInUse",this.onStreamKeyTaken),this._main.removeEventListener("statusServerConnect",this.onStatusServerConnect),this._main.removeEventListener("statusServerDisconnect",this.onStatusServerDisconnect),this._main.removeEventListener("streamStatusUpdate",this.onStreamStatsUpdate),this._main.removeEventListener("deviceStateChange",this.onDeviceStateChange),document.removeEventListener("visibilitychange",this.visibilityChange),window.removeEventListener("blur",this.onWindowBlur),window.removeEventListener("focus",this.onWindowFocus)}catch(e){}this._statusConnection&&(this._statusConnection.destroy(),this._statusConnection=null),this.closeWebRTCConnection(),this._stream&&(this._logger.info(this,"📹 [FORCE_STOP] Stopping main stream"),this._stream.getTracks().forEach(e=>{e.stop()}),this._stream=null);try{var n=null==(i=null==(t=this._main.getStageController())?void 0:t.getScreenElement())?void 0:i.getVideoElement();n&&(n.srcObject instanceof MediaStream&&n.srcObject.getTracks().forEach(e=>e.stop()),n.srcObject=null)}catch(e){}try{null!=(s=this._soundMeter)&&s.destroy()}catch(e){}this._selectedCamera=null,this._selectedMicrophone=null,this._activeStreamCount=0,this._logger.success(this,"🔴 [DESTROY] StreamerController destroyed (sync)")}}}class WowzaConnection extends AbstractSocket{constructor(e,t){super(),this._isDestroyed=!1,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._isDestroyed||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(){this._isDestroyed=!0,super.destroy(),null!=this._reconnectTimer&&clearTimeout(this._reconnectTimer)}}class NetworkController{constructor(e){this._connection=null,this._currentStreamKey="none",this._lastState="",this._isDestroyed=!1,this.onServerConnect=()=>{},this.onServerDisconnect=()=>{this._lastState="none"},this.onMessage=e=>{var t;null!=(t=this._main.getStreamerController())&&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(){this._isDestroyed||null!=this._connection&&(this._connection.getConnectionState()==ConnectionState.CONNECTING||this._connection.getConnectionState()==ConnectionState.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 WowzaConnection(this._main,this)}stop(){var e;null!=(e=this._connection)&&e.disconnect(!0),this._lastState=""}sendMessage(e){!this._isDestroyed&&this._connection&&this._connection.isConnectionActive()&&this._connection.sendData(e)}getConnection(){return this._connection}getCurrentStreamKey(){return this._currentStreamKey}destroy(){this._isDestroyed=!0,this._main.removeEventListener("serverConnect",this.onServerConnect),this._main.removeEventListener("serverDisconnect",this.onServerDisconnect),this._connection&&(this._connection.destroy(),this._connection=null)}}class StatsController{constructor(e){this._publishVideoWidth=0,this._publishVideoHeight=0,this._publishVideoBitrate=0,this._publishAudioBitrate=0,this._currentBitrate=0,this._currentFPS=0,this._deliveredVideoFrames=0,this._deliveredAudioFrames=0,this.onStreamStatsUpdate=e=>{this._publishVideoWidth=e.streamStatus.videoWidth,this._publishVideoHeight=e.streamStatus.videoHeight,this._currentBitrate=e.streamStatus.currentBitrate,this._publishVideoBitrate=e.streamStatus.videoPublishBitrate,this._publishAudioBitrate=e.streamStatus.audioPublishBitrate,this._currentFPS=e.streamStatus.frameRate,this._deliveredVideoFrames=e.streamStatus.videoFrameCount,this._deliveredAudioFrames=e.streamStatus.audioFrameCount},this._main=e,this._logger=e.getLogger(),this._logger.info(this,"Creating new StatsController"),this.initialize()}initialize(){this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate,!1)}get deliveredVideoFrames(){return this._deliveredVideoFrames}get deliveredAudioFrames(){return this._deliveredAudioFrames}get currentFPS(){return this._currentFPS}get publishVideoWidth(){return this._publishVideoWidth}get publishVideoHeight(){return this._publishVideoHeight}get currentBitrate(){return this._currentBitrate}get publishVideoBitrate(){return this._publishVideoBitrate}get publishAudioBitrate(){return this._publishAudioBitrate}}class GraphDrawer{constructor(e,t,i,s=1){if(this._currentX=0,this._isFullyDrawn=!1,this._lastTimestamp=null,this._isTimemarkLine=!1,this._borderWidth=1,i.length!==t.length+1)throw new Error(`Colors array must have exactly ${t.length+1} elements (one more than valueRanges)`);for(let e=1;e<t.length;e++)if(t[e]<=t[e-1])throw new Error("ValueRanges must be in ascending order");const n=/^#[0-9A-Fa-f]{6}$/;if(!i.every(e=>n.test(e)))throw new Error("All colors must be in valid hex format (e.g., #FF0000)");let r;if("string"==typeof e){var o=document.getElementById(e);if(!o)throw new Error(`Container element with id ${e} not found`);r=o}else r=e;o=r.getBoundingClientRect(),this._width=Math.floor(o.width),this._height=Math.floor(o.height),this._effectiveWidth=this._width-2*this._borderWidth,this._effectiveHeight=this._height-2*this._borderWidth,this._canvas=document.createElement("canvas"),r.appendChild(this._canvas),e=this._canvas.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to get canvas context");this._ctx=e,this._valueRanges=[0,...t],this._colors=i,this._lineWidth=s,this._canvas.width=this._width,this._canvas.height=this._height,this._canvas.style.width=this._width+"px",this._canvas.style.height=this._height+"px",this.clear()}drawBorder(){this._ctx.strokeStyle="#000000",this._ctx.lineWidth=this._borderWidth,this._ctx.strokeRect(this._borderWidth/2,this._borderWidth/2,this._width-this._borderWidth,this._height-this._borderWidth)}clear(){this._ctx.clearRect(0,0,this._width,this._height),this._ctx.fillStyle=this._colors[0],this._ctx.fillRect(this._borderWidth,this._borderWidth,this._effectiveWidth,this._effectiveHeight),this.drawBorder(),this._isFullyDrawn=!1,this._currentX=this._borderWidth,this._lastTimestamp=null,this._isTimemarkLine=!1}getColorIndices(t){for(let e=0;e<this._valueRanges.length-1;e++)if(t>=this._valueRanges[e]&&t<=this._valueRanges[e+1])return{lowerIndex:e,upperIndex:e+1};return{lowerIndex:this._valueRanges.length-2,upperIndex:this._valueRanges.length-1}}calculateHeightRatio(e,t,i){return(e-t)/(i-t)}shiftCanvasLeft(e){e=this._ctx.getImageData(this._borderWidth+e,this._borderWidth,this._effectiveWidth-e,this._effectiveHeight);this._ctx.fillStyle=this._colors[0],this._ctx.fillRect(this._borderWidth,this._borderWidth,this._effectiveWidth,this._effectiveHeight),this._ctx.putImageData(e,this._borderWidth,this._borderWidth),this.drawBorder()}applyOverlayEffect(e,s=.5){var t=parseInt(e.slice(1,3),16),i=parseInt(e.slice(3,5),16),e=parseInt(e.slice(5,7),16),n=e=>{var t=e/255;let i;return i=t<=.5?2*t*1:1-2*(1-t)*0,Math.round(255*i*s+e*(1-s))},t=n(t),i=n(i),n=n(e),e=e=>{e=e.toString(16);return 1===e.length?"0"+e:e};return"#"+e(t)+e(i)+e(n)}addEntry(e){e=Math.round(100*e)/100;var t=Date.now(),t=(null===this._lastTimestamp?(this._lastTimestamp=t,this._isTimemarkLine=!1):1e3<=t-this._lastTimestamp?(this._isTimemarkLine=!0,this._lastTimestamp=t):this._isTimemarkLine=!1,this._isTimemarkLine?1:this._lineWidth);!this._isFullyDrawn&&this._currentX>=this._width-this._borderWidth&&(this._isFullyDrawn=!0),this._isFullyDrawn?(this.shiftCanvasLeft(t),this.drawLine(this._width-this._borderWidth-t,e,t)):(this.drawLine(this._currentX,e,t),this._currentX+=t)}drawLine(e,t,i){var{lowerIndex:s,upperIndex:n}=this.getColorIndices(t),t=this.calculateHeightRatio(t,this._valueRanges[s],this._valueRanges[n]);let r=this._colors[s],o=this._colors[n];this._isTimemarkLine&&(r=this.applyOverlayEffect(r,.3),o=this.applyOverlayEffect(o,.3));s=Math.round(this._effectiveHeight*t),n=this._effectiveHeight-s;this._ctx.fillStyle=r,this._ctx.fillRect(e,this._height-this._borderWidth-n,i,n),this._ctx.fillStyle=o,this._ctx.fillRect(e,this._borderWidth,i,s)}clearGraph(){this._currentX=this._borderWidth,this._isFullyDrawn=!1,this._lastTimestamp=null,this._isTimemarkLine=!1,this.clear()}destroy(){this._canvas.parentNode&&this._canvas.parentNode.removeChild(this._canvas)}}class BitrateGraph{constructor(e,t){this.onStreamStatsUpdate=e=>{var t;null!=(t=this._graph)&&t.addEntry(e.streamStatus.currentBitrate)},this._main=e,this._object=t,this._main.addGraph(this)}start(){null!=this._graph&&stop();return this._graph=new GraphDrawer(this._object,[1e6,2e6,3e6,5e6,6e6,7e6],["#000000","#0a3980","#2793dd","#3bc39c","#c3df3e","#f89539","#f83f3f"],5),this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate),this}stop(){return this._main.removeEventListener("streamStatusUpdate",this.onStreamStatsUpdate),null!=this._graph&&this._graph.destroy(),this._graph=null,this}}class FPSGraph{constructor(e,t){this.onStreamStatsUpdate=e=>{var t;null!=(t=this._graph)&&t.addEntry(e.streamStatus.frameRate)},this._main=e,this._object=t,this._main.addGraph(this)}start(){null!=this._graph&&stop();return this._graph=new GraphDrawer(this._object,[25,26,27,28,29,30],["#000000","#0a3980","#2793dd","#3bc39c","#c3df3e","#f89539","#f83f3f"],5),this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate),this}stop(){return this._main.removeEventListener("streamStatusUpdate",this.onStreamStatsUpdate),null!=this._graph&&this._graph.destroy(),this._graph=null,this}}class MicrophoneGraph{constructor(e,t){this.onStreamStatsUpdate=e=>{var t;null!=(t=this._graph)&&t.addEntry(500*e.high)},this._main=e,this._object=t,this._main.addGraph(this)}start(){null!=this._graph&&stop();return this._graph=new GraphDrawer(this._object,[0,20,40,60,80,100],["#000000","#0a3980","#2793dd","#3bc39c","#c3df3e","#f89539","#f83f3f"],2),this._main.addEventListener("soundMeter",this.onStreamStatsUpdate),this}stop(){return this._main.removeEventListener("soundMeter",this.onStreamStatsUpdate),null!=this._graph&&this._graph.destroy(),this._graph=null,this}}class StormStreamer extends EventDispatcher{constructor(e,t=!1){super(),this.DEV_MODE=!0,this.STREAMER_VERSION="1.0.6",this.COMPILE_DATE="2/22/2026, 12:56:59 PM",this.STREAMER_BRANCH="Experimental",this.STREAMER_PROTOCOL_VERSION=1,this._initialized=!1,this._isDestroyed=!1,"undefined"!=typeof window&&window.document&&window.document.createElement?(!this.DEV_MODE||"StormStreamerArray"in window||(window.StormStreamerArray=[]),window.StormStreamerArray.push(this),this._streamerID=StormStreamer.NEXT_STREAMER_ID++,null!=e&&(this.setStreamConfig(e),t)&&this.initialize()):console.error('StormStreamer Creation Error - No "window" element in the provided context!')}initialize(){if(!this._isRemoved&&!this._isDestroyed){if(null==this._configManager)throw Error("Stream Config was not provided for this streamer!");this._storageManager=new StorageManager(this),this._stageController=new StageController(this),this._networkController=new NetworkController(this),this._streamerController=new StreamerController(this),this._statsController=new StatsController(this),this._graphs=[],this._initialized=!0,this.dispatchEvent("streamerReady",{ref:this})}}setStreamConfig(e){this._isRemoved||this._isDestroyed||(e=JSON.parse(JSON.stringify(e)),null==this._configManager?(this._configManager=new ConfigManager(e),this._logger=new Logger(this._configManager.getSettingsData().getDebugData(),this),this._logger.info(this,"Storm Streamer :: Storm Streaming Suite"),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: "+UserCapabilities.getBrowserName()+" "+UserCapabilities.getBrowserVersion()),this._logger.info(this,"UserCapabilities :: Operating System: "+UserCapabilities.getOS()+" "+UserCapabilities.getOSVersion()),this._logger.info(this,"UserCapabilities :: isMobile: "+UserCapabilities.isMobile()),this._logger.info(this,"UserCapabilities :: hasMSESupport: "+UserCapabilities.hasMSESupport()),this._logger.info(this,"UserCapabilities :: hasWebSocketSupport: "+UserCapabilities.hasWebSocketsSupport()),this._logger.info(this,"UserCapabilities :: hasWebRTCSupport: "+UserCapabilities.hasWebRTCSupport()),this._configManager.print(this._logger)):(this._logger.info(this,"StreamConfig has been overwritten, dispatching streamConfigChanged!"),this._configManager=new ConfigManager(e),this._configManager.print(this._logger),this.dispatchEvent("streamConfigChange",{ref:this,newConfig:this._configManager})))}isConnected(){var e;return null!=(e=null==(e=null==(e=this._networkController)?void 0:e.getConnection())?void 0:e.isConnectionActive())&&e}mute(){var e;null!=(null==(e=this._stageController)?void 0:e.getScreenElement())?this._stageController.getScreenElement().setMuted(!0):this._configManager.getSettingsData().getAudioData().muted=!0}unmute(){var e;null!=(null==(e=this._stageController)?void 0:e.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._streamerController)?void 0:e.getCameraList())?e:[]}getMicrophoneList(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getMicrophoneList())?e:[]}setCamera(e){var t;null!=(t=this._streamerController)&&t.selectCamera(e)}setMicrophone(e){var t;null!=(t=this._streamerController)&&t.selectMicrophone(e)}getCurrentCamera(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getCurrentCamera())?e:null}getCurrentMicrophone(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getCurrentMicrophone())?e:null}muteMicrophone(e){var t;null!=(t=this._streamerController)&&t.muteMicrophone(e)}isMicrophoneMuted(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.isMicrophoneMuted())&&e}getPublishState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getPublishState())?e:PublishState.NOT_INITIALIZED}getPublishTime(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getPublishTime())?e:0}publish(e){var t;return null!=(t=null==(t=this._streamerController)?void 0:t.publish(e))&&t}unpublish(){var e;null!=(e=this._streamerController)&&e.unpublish()}getInputDevicesState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getInputDeviceState())?e:InputDevicesState.NOT_INITIALIZED}getCameraState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getCameraState())?e:DeviceState.NOT_INITIALIZED}getMicrophoneState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getMicrophoneState())?e:DeviceState.NOT_INITIALIZED}clearSavedDevices(){var e;null!=(e=this._streamerController)&&e.clearSavedDevices()}messSavedDevices(){var e;null!=(e=this._streamerController)&&e.messSavedDevices()}isStreamReady(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.isStreamReady())&&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}setSize(e,t){this._initialized?this._stageController.setSize(e,t):(e=NumberUtilities.parseValue(e),t=NumberUtilities.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=NumberUtilities.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=NumberUtilities.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"),s=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(),s)?(s.drawImage(e,0,0,i.width,i.height),i.toBlob(e=>t(e),"image/png")):t(null)})}createFPSGraph(e){return new FPSGraph(this,e)}createBitrateGraph(e){return new BitrateGraph(this,e)}createMicrophoneGraph(e){return new MicrophoneGraph(this,e)}addGraph(e){null!=this._graphs&&this._graphs.push(e)}stopAllGraphs(){if(null!=this._graphs&&0<this._graphs.length)for(let e=0;e<this._graphs.length;e++)this._graphs[e].stop()}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()}getStreamKey(){var e;return null!=(e=null==(e=null==(e=this.getConfigManager())?void 0:e.getStreamData())?void 0:e.streamKey)?e:null}getStatsController(){return this._statsController}getStreamerID(){return this._streamerID}getLogger(){return this._logger}getConfigManager(){return this._configManager}getNetworkController(){return this._networkController}getStreamerController(){return this._streamerController}getStageController(){return this._stageController}getStorageManager(){return this._storageManager}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}isDestroyed(){return this._isDestroyed}getVersion(){return this.STREAMER_VERSION}getBranch(){return this.STREAMER_BRANCH}dispatchEvent(e,t){super.dispatchEvent(e,t)}start(){var e;return __awaiter(this,void 0,void 0,function*(){return!this._initialized||this._isDestroyed||null==(e=this._streamerController)?void 0:e.start()})}stop(){var e;null!=(e=this._streamerController)&&e.stop()}debugMediaState(){var e;null!=(e=this._streamerController)&&e.debugMediaState()}destroy(){var e;if(this._isDestroyed)null!=(e=this._logger)&&e.warning(this,"🔴 [DESTROY] Already destroyed, skipping");else{if(null!=(e=this._logger)&&e.warning(this,"🔴 [DESTROY] Starting streamer instance destruction (sync)..."),this._isDestroyed=!0,this._initialized=!1,this._isRemoved=!0,this.DEV_MODE&&"StormStreamerArray"in window&&(window.StormStreamerArray[this._streamerID]=null),this.stopAllGraphs(),this._graphs=[],this._networkController&&(null!=(e=this._logger)&&e.info(this,"🔴 [DESTROY] Destroying NetworkController..."),this._networkController.destroy(),this._networkController=null),this._streamerController&&(null!=(e=this._logger)&&e.info(this,"🔴 [DESTROY] Destroying StreamerController..."),this._streamerController.destroy(),this._streamerController=null),this._stageController){null!=(e=this._logger)&&e.info(this,"🔴 [DESTROY] Destroying StageController...");try{this._stageController.destroy()}catch(e){}this._stageController=null}this._storageManager=null,this._statsController=null,this.removeAllEventListeners(),null!=(e=this._logger)&&e.success(this,"🔴 [DESTROY] Streamer instance destroyed successfully (sync)")}}}function create(e){return new StormStreamer(e)}StormStreamer.NEXT_STREAMER_ID=0;export{DeviceState,InputDevicesState,PublishState,StormStreamer,create};
34
+ `;continue}s+="\r\n"}return s}mungeSDPPlay(e){let s="";for(const o of e.split(/\r\n/))if(0!==o.length){if(o.includes("profile-level-id")){var n=o.substr(o.indexOf("profile-level-id")+17,6);let e=Number("0x"+n.substr(0,2)),t=Number("0x"+n.substr(2,2)),i=Number("0x"+n.substr(4,2));66<e&&(e=66,t=224,i=31),0===t&&(t=224);var r=("00"+e.toString(16)).slice(-2).toLowerCase()+("00"+t.toString(16)).slice(-2).toLowerCase()+("00"+i.toString(16)).slice(-2).toLowerCase();s+=o.replace(n,r)}else s+=o;s+="\r\n"}return s}}MungeSDP.SDPOutput={},function(e){e[e.VIDEO_INPUT=0]="VIDEO_INPUT",e[e.AUDIO_INPUT=1]="AUDIO_INPUT"}(InputType=InputType||{});class InputDevice{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=InputType.VIDEO_INPUT;break;case"audioinput":this._inputType=InputType.AUDIO_INPUT;break;default:throw new Error("incorrect kind")}null!==e.label&&""!==e.label?this._label=this.cleanLabel(e.label):this._label=this._inputType==InputType.VIDEO_INPUT?"Camera "+t:"Microphone "+t,void 0!==e.groupId&&null!==e.groupId&&(this._groupID=e.groupId)}cleanLabel(e){return e}get label(){return this._label}get id(){return this._id}get groupID(){return this._groupID}get isSelected(){return this._isSelected}set isSelected(e){this._isSelected=e}}class InputDeviceList{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].groupID&&this._internalList[e].groupID==t.groupID&&(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}}!function(e){e.NOT_INITIALIZED="NOT_INITIALIZED",e.INITIALIZED="INITIALIZED",e.CONNECTING="CONNECTING",e.CONNECTED="CONNECTED",e.PUBLISHED="PUBLISHED",e.UNPUBLISHED="UNPUBLISHED",e.STOPPED="STOPPED",e.UNKNOWN="UNKNOWN",e.ERROR="ERROR"}(PublishState=PublishState||{});class SoundMeter{constructor(e){this._audioContext=null,this._analyser=null,this._microphone=null,this._lastEventTime=0,this.THROTTLE_INTERVAL=100,this._isMonitoring=!1,this._animationFrameId=null,this._instant=0,this._slow=0,this.PEAK_DECAY=.92,this._main=e}attach(e){if(e.getAudioTracks().length){this.detach();try{this._audioContext=new AudioContext,this._microphone=this._audioContext.createMediaStreamSource(e),this._analyser=this._audioContext.createAnalyser(),this._analyser.fftSize=2048,this._microphone.connect(this._analyser),this.startMonitoring()}catch(e){console.error("SoundMeter: Error during attach:",e),this.detach()}}else console.warn("SoundMeter: Attempted to attach stream without audio tracks")}detach(){if(this._audioContext||this._analyser||this._microphone){if(this._isMonitoring=!1,null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null),this._microphone){try{this._microphone.disconnect()}catch(e){console.warn("SoundMeter: Error disconnecting microphone:",e)}this._microphone=null}if(this._analyser){try{this._analyser.disconnect()}catch(e){console.warn("SoundMeter: Error disconnecting analyser:",e)}this._analyser=null}if(this._audioContext)try{if("closed"!==this._audioContext.state){const e=this._audioContext;this._audioContext=null,e.suspend().then(()=>e.close()).catch(e=>{console.warn("SoundMeter: Error closing audio context:",e)})}else this._audioContext=null}catch(e){console.warn("SoundMeter: Error handling audio context:",e),this._audioContext=null}this.clear()}}clear(){this._instant=0,this._slow=0,this._lastEventTime=0}startMonitoring(){if(this._analyser&&!this._isMonitoring){this._isMonitoring=!0;const s=new Float32Array(this._analyser.frequencyBinCount),t=()=>{if(this._analyser&&this._isMonitoring&&this._audioContext){var e=Date.now();try{this._analyser.getFloatTimeDomainData(s);let t=0;for(let e=0;e<s.length;++e){var i=Math.abs(s[e]);i>t&&(t=i)}this._instant=Math.min(1,t),this._instant>this._slow?this._slow=this._instant:this._slow*=this.PEAK_DECAY,e-this._lastEventTime>=this.THROTTLE_INTERVAL&&(this._lastEventTime=e,this._main.dispatchEvent("soundMeter",{ref:this._main,high:this._instant,low:this._slow}))}catch(e){return console.error("SoundMeter: Error during analysis:",e),this._isMonitoring=!1,void(this._animationFrameId=null)}this._isMonitoring&&(this._animationFrameId=requestAnimationFrame(t))}else this._animationFrameId=null};this._animationFrameId=requestAnimationFrame(t)}}destroy(){this.detach()}}!function(e){e.NOT_INITIALIZED="NOT_INITIALIZED",e.INITIALIZED="INITIALIZED",e.READY="READY",e.UPDATING="UPDATING",e.INVALID="INVALID",e.UNKNOWN="UNKNOWN",e.STOPPED="STOPPED"}(InputDevicesState=InputDevicesState||{}),function(e){e.NOT_INITIALIZED="NOT_INITIALIZED",e.ENABLED="ENABLED",e.ACCESS_DENIED="ACCESS_DENIED",e.NOT_FOUND="NOT_FOUND",e.STOPPED="STOPPED"}(DeviceState=DeviceState||{}),function(e){e[e.NOT_INITIALIZED=0]="NOT_INITIALIZED",e[e.STARTED=1]="STARTED",e[e.CONNECTING=2]="CONNECTING",e[e.CONNECTED=3]="CONNECTED",e[e.CLOSED=4]="CLOSED",e[e.FAILED=5]="FAILED"}(ConnectionState=ConnectionState||{});class AbstractSocket{constructor(){this.CONNECTION_TIMEOUT=5,this.isBinary=!0,this._connectionState=ConnectionState.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=ConnectionState.CONNECTING,this.socket=new WebSocket(this.socketURL),this.isBinary&&(this.socket.binaryType="arraybuffer"),this.socket.onopen=e=>{clearTimeout(this._connectionTimeout),this._sequenceNumber++,this._connectionState=ConnectionState.CONNECTED,this.onSocketOpen(e)},this.socket.onmessage=e=>{this._messageCount++,this.onSocketMessage(e)},this.socket.onclose=e=>{clearTimeout(this._connectionTimeout),this._connectionState==ConnectionState.CONNECTED?(this._connectionState=ConnectionState.CLOSED,this.onSocketClose(e)):this._connectionState=ConnectionState.FAILED},this.socket.onerror=e=>{if(clearTimeout(this._connectionTimeout),this._connectionState==ConnectionState.CONNECTING&&this.onSocketError(e),this._connectionState==ConnectionState.CONNECTED)try{this.socket.close()}catch(e){}},this._connectionTimeout=setTimeout(()=>{try{this.socket.close()}catch(e){}this._connectionState==ConnectionState.CONNECTING&&(this._connectionState=ConnectionState.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==ConnectionState.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=ConnectionState.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()),clearTimeout(this._connectionTimeout)}destroy(){null!=this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),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=ConnectionState.CLOSED}getSocketURL(){return this.socketURL}}class StreamStatusInfo{constructor(){this._publishState=PublishState.NOT_INITIALIZED,this._videoPublishBitrate=0,this._audioPublishBitrate=0,this._currentBitrate=0,this._audioFrameCount=0,this._videoFrameCount=0,this._frameRate=0,this._videoWidth=0,this._videoHeight=0}get publishState(){return this._publishState}set publishState(e){this._publishState="published"===e?PublishState.PUBLISHED:PublishState.CONNECTED}get videoPublishBitrate(){return this._videoPublishBitrate}set videoPublishBitrate(e){this._videoPublishBitrate=e}get audioPublishBitrate(){return this._audioPublishBitrate}set audioPublishBitrate(e){this._audioPublishBitrate=e}set currentBitrate(e){this._currentBitrate=e}get currentBitrate(){return this._currentBitrate}get audioFrameCount(){return this._audioFrameCount}set audioFrameCount(e){this._audioFrameCount=e}get videoFrameCount(){return this._videoFrameCount}set videoFrameCount(e){this._videoFrameCount=e}get frameRate(){return this._frameRate}set frameRate(e){this._frameRate=e}set videoWidth(e){this._videoWidth=e}get videoWidth(){return this._videoWidth}set videoHeight(e){this._videoHeight=e}get videoHeight(){return this._videoHeight}}class WowzaStatusConnection extends AbstractSocket{constructor(e,t){super(),this._logger=e.getLogger(),this._main=e,this._currServer=t,this.initialize()}initialize(){this._logger.info(this,"Starting new status check connection with a storm server"),null!=this._currServer?(this.socketURL=this.createURL(this._currServer),this._logger.info(this,"Starting WebSocket connection with: "+this.socketURL),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("statusServerConnect",{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}))}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("statusServerDisconnect",{ref:this._main,serverURL:this.socketURL,restart:this._main.getConfigManager().getSettingsData().getIfRestartOnError(),sequenceNum:this._sequenceNumber}),this.initiateReconnect())}onSocketMessage(e){var t;"string"==typeof e.data&&"STREAM_STATUS_RESPONSE"===(e=JSON.parse(e.data)).packetID&&((t=new StreamStatusInfo).publishState=e.streamStatus,t.videoPublishBitrate=e.publishVideoBitrate,t.audioPublishBitrate=e.publishAudioBitrate,t.videoFrameCount=e.videoFrameCount,t.audioFrameCount=e.audioFrameCount,t.frameRate=e.frameRate,t.videoWidth=e.videoWidth,t.videoHeight=e.videoHeight,t.currentBitrate=e.realBitrate,this._main.dispatchEvent("streamStatusUpdate",{ref:this._main,streamStatus:t}))}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(()=>{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))}createURL(e){var t="";return(t+=e.getIfSSL()?"wss://":"ws://")+e.getHost()+(":"+e.getPort())+"/statuschecker"}isConnectionActive(){return this._isConnected}getCurrentServer(){return this._currServer}destroy(){super.destroy()}}class PublishMetadata{constructor(){this._streamWidth=0,this._streamHeight=0,this._aspectRatio="",this._hasVideoTrack=!1,this._hasAudioTrack=!1}get streamWidth(){return this._streamWidth}set streamWidth(e){this._streamWidth=e}get streamHeight(){return this._streamHeight}set streamHeight(e){this._streamHeight=e}get aspectRatio(){return this._aspectRatio}set aspectRatio(e){this._aspectRatio=e}get videoTrackPresent(){return this._hasVideoTrack}set videoTrackPresent(e){this._hasVideoTrack=e}get audioTrackPresent(){return this._hasAudioTrack}set audioTrackPresent(e){this._hasAudioTrack=e}}class StreamerController{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._restartTimerCount=0,this._restartTimerMaxCount=5,this._publishState=PublishState.NOT_INITIALIZED,this._publishTime=0,this._inputDeviceState=InputDevicesState.NOT_INITIALIZED,this._cameraState=DeviceState.NOT_INITIALIZED,this._microphoneState=DeviceState.NOT_INITIALIZED,this._publishTimer=0,this._currentOrientation=(null==(t=window.screen.orientation)?void 0:t.type)||"",this._statusTimer=null,this._debug=!1,this._deviceChangeHandler=null,this._orientationChangeHandler=null,this._isDestroyed=!1,this._cameraAbortController=null,this._microphoneAbortController=null,this._startCameraAbortController=null,this._switchingCamera=!1,this._switchingMicrophone=!1,this._firstPublish=!0,this._activeStreamCount=0,this._cameraPermissionStatus=null,this._microphonePermissionStatus=null,this._boundCameraPermissionHandler=null,this._boundMicrophonePermissionHandler=null,this._isInitializing=!1,this.onDeviceStateChange=e=>{var t;this._isDestroyed||(t=null==(t=this._main.getConfigManager())?void 0:t.getStreamData().streamKey,e.state==InputDevicesState.READY&&null!=t&&this.internalPublish(t))},this.handleOrientationChange=()=>__awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed&&(yield new Promise(e=>setTimeout(e,500)),!this._isDestroyed)){var e=(null==(e=window.screen.orientation)?void 0:e.type)||"";if(this._currentOrientation!==e){this._logger.info(this,`Orientation changed from ${this._currentOrientation} to `+e),this._currentOrientation=e;e=null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey;if(this._publishState,PublishState.PUBLISHED,this.closeWebRTCConnection(),this._stream&&(this._logger.info(this,"📹 [RELEASE] handleOrientationChange() - releasing stream for orientation change"),this._stream.getTracks().forEach(e=>{e.stop(),this._logger.info(this,"📹 [RELEASE] handleOrientationChange() - stopped track: "+e.kind)}),this._stream=null,this._activeStreamCount--),!this._isDestroyed)try{yield this.startCamera(),this._isDestroyed||e&&this.internalPublish(e)}catch(e){this._isDestroyed||(this._logger.error(this,"Error restarting stream after orientation change: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID))}}}}),this.onServerDisconnect=()=>{},this.onStreamKeyTaken=()=>{this._isDestroyed||(null!=this._restartTimer&&(clearInterval(this._restartTimer),this._restartTimerCount=0),this._logger.info(this,"WebRTCStreamer :: Starting StreamKeyTaken Interval"),this.setPublishState(PublishState.ERROR),this._restartTimer=setInterval(()=>{var e;this._isDestroyed?this._restartTimer&&clearInterval(this._restartTimer):null!=this._restartTimer&&(this._restartTimerCount<this._restartTimerMaxCount?(this._logger.info(this,"WebRTCStreamer :: StreamKeyTaken Interval: "+this._restartTimerCount+"/"+this._restartTimerMaxCount),this._restartTimerCount++):(clearInterval(this._restartTimer),this._restartTimer=null,this._restartTimerCount=0,null==(e=null==(e=null==(e=this._main.getConfigManager())?void 0:e.getStreamData())?void 0:e.streamKey)||this._isDestroyed||this.internalPublish(e)),this._isDestroyed||(e=null!=(e=this._main.getConfigManager().getStreamData().streamKey)?e:"unknown",this._main.dispatchEvent("streamKeyInUseInterval",{ref:this._main,streamKey:e,count:this._restartTimerCount,maxCount:this._restartTimerMaxCount})))},1e3))},this.onServerConnect=()=>{if(!this._isDestroyed){if(this._peerConnection&&this.closeWebRTCConnection(),this._peerConnection=new RTCPeerConnection(this._peerConnectionConfig),this._stream){var e,t=this._stream.getTracks();for(e in t)this._peerConnection.addTrack(t[e],this._stream)}this._peerConnection.onicecandidate=e=>{this.onIceCandidate(e)},this._peerConnection.onconnectionstatechange=e=>{this.onConnectionStateChange(e)},this._peerConnection.onnegotiationneeded=e=>__awaiter(this,void 0,void 0,function*(){if(this._peerConnection&&!this._isDestroyed)try{var e=yield this._peerConnection.createOffer();this._isDestroyed||(yield this.onDescriptionSuccess(e))}catch(e){this.onDescriptionError(e)}}),this.createStatusConnection()}},this.onStatusServerConnect=()=>{var e;this._isDestroyed||(e=this._main.getConfigManager().getStreamData().streamKey,null==this._statusTimer&&null!=this._statusConnection&&null!=e&&(this._statusTimer=setInterval(()=>{this._isDestroyed?this._statusTimer&&clearInterval(this._statusTimer):this.requestStatusData()},1e3)))},this.requestStatusData=()=>{var e;!this._isDestroyed&&this._fullStreamName&&null!=(e=this._statusConnection)&&e.sendData('{"packetID":"STREAM_STATUS", "streamKey": "'+this._fullStreamName+'"}')},this.onStatusServerDisconnect=()=>{null!=this._statusTimer&&clearInterval(this._statusTimer),this._statusTimer=null},this.onStreamStatsUpdate=e=>{this._isDestroyed||(e=e.streamStatus,this._publishState==PublishState.PUBLISHED&&e.publishState!=PublishState.PUBLISHED&&this.setPublishState(PublishState.UNPUBLISHED),this._publishState==PublishState.CONNECTED&&e.publishState==PublishState.PUBLISHED&&this.setPublishState(PublishState.PUBLISHED))},this.onDescriptionSuccess=t=>{var e;if(!this._isDestroyed){const i={applicationName:null==(e=null==(e=null==(e=this._main.getNetworkController())?void 0:e.getConnection())?void 0:e.getCurrentServer())?void 0:e.getApplication(),streamName:this._fullStreamName,sessionId:"[empty]"};t.sdp=this._mungeSDP.mungeSDPPublish(t.sdp,{audioBitrate:"64",videoBitrate:"2000",videoFrameRate:30,videoCodec:"42e01f",audioCodec:"opus"}),this._peerConnection&&!this._isDestroyed&&this._peerConnection.setLocalDescription(t).then(()=>{var e;this._isDestroyed||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 MungeSDP,this._soundMeter=new SoundMeter(this._main),this._debug=null!=(e=null==(t=this._main.getConfigManager())?void 0:t.getSettingsData().getDebugData().streamerControllerDebug)?e:this._debug;var t,e=null==(t=this._main.getStorageManager())?void 0:t.getField("microphoneMuted");null!==e&&(this._isMicrophoneMuted="true"===e,this._logger.info(this,"📹 [INIT] Restored microphone mute state: "+this._isMicrophoneMuted)),this.initialize()}isDestroyedCheck(e){var t;return!!this._isDestroyed&&(e&&null!=(t=this._logger)&&t.info(this,`📹 [ABORT] ${e} - instance destroyed, aborting`),!0)}initialize(){var e,t;return __awaiter(this,void 0,void 0,function*(){if(!this._isInitializing){this._isInitializing=!0,this._logger.info(this,"📹 [INIT] initialize() - starting initialization");try{if(this.isDestroyedCheck("initialize start"))return;if(yield this.initializeDevices(),this.isDestroyedCheck("after initializeDevices"))return;if(this.setupEventListeners(),this.isDestroyedCheck("after setupEventListeners"))return;if(this.initializeStream(),this.isDestroyedCheck("after initializeStream"))return;if(this.setupOrientationListener(),yield this.setupPermissionListeners(),this.isDestroyedCheck("after setupPermissionListeners"))return;if(this.setupDeviceChangeListener(),this.isDestroyedCheck("before network init"))return;null!=(e=this._main.getConfigManager())&&e.getSettingsData().autoConnect?(this._logger.info(this,"Initializing NetworkController (autoConnect is true)"),null!=(t=this._main.getNetworkController())&&t.initialize()):this._logger.warning(this,"Warning - autoConnect is set to false, switching to standby mode!"),this._logger.success(this,"📹 [INIT] initialize() - completed successfully")}catch(e){if(this._isDestroyed)return void this._logger.warning(this,"📹 [INIT] initialize() - aborted by destroy()");this._logger.error(this,"Initialization failed: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID)}finally{this._isInitializing=!1}this._main.dispatchEvent("microphoneStateChange",{ref:this._main,isMuted:this._isMicrophoneMuted})}})}setupEventListeners(){this._isDestroyed||(this._main.addEventListener("serverConnect",this.onServerConnect,!1),this._main.addEventListener("serverDisconnect",this.onServerDisconnect,!1),this._main.addEventListener("streamKeyInUse",this.onStreamKeyTaken,!1),this._main.addEventListener("statusServerConnect",this.onStatusServerConnect,!1),this._main.addEventListener("statusServerDisconnect",this.onStatusServerDisconnect,!1),this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate,!1),this._main.addEventListener("deviceStateChange",this.onDeviceStateChange,!1),document.addEventListener("visibilitychange",this.visibilityChange),window.addEventListener("blur",this.onWindowBlur),window.addEventListener("focus",this.onWindowFocus))}initializeDevices(){return __awaiter(this,void 0,void 0,function*(){try{var e;this._logger.info(this,"📹 [ACQUIRE] initializeDevices() - requesting test getUserMedia for permissions"),this.isDestroyedCheck("initializeDevices before getUserMedia")||(e=yield navigator.mediaDevices.getUserMedia({video:!0,audio:!0}),this._isDestroyed?(this._logger.warning(this,"📹 [RELEASE] initializeDevices() - destroyed during getUserMedia, releasing orphan stream"),e.getTracks().forEach(e=>{e.stop(),this._logger.info(this,`📹 [RELEASE] initializeDevices() - stopped orphan track: ${e.kind}, id: `+e.id)})):(this._logger.info(this,"📹 [RELEASE] initializeDevices() - stopping test stream immediately"),e.getTracks().forEach(e=>{e.stop(),this._logger.info(this,`📹 [RELEASE] initializeDevices() - stopped track: ${e.kind}, id: `+e.id)}),this.isDestroyedCheck("initializeDevices before grabDevices")||(yield this.grabDevices())))}catch(e){this._isDestroyed||(console.log(e),this._logger.error(this,"Error initializing devices: "+JSON.stringify(e)),this._isDestroyed)||(yield this.grabDevices())}})}initializeStream(){this._isDestroyed||(this._selectedCamera||this._selectedMicrophone)&&this.startCamera()}setupPermissionListeners(){return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed)try{var e={name:"camera"},t={name:"microphone"};this._cameraPermissionStatus=yield navigator.permissions.query(e),this._isDestroyed||(this._boundCameraPermissionHandler=()=>{this._isDestroyed||(this._permissionChecked=!1,this.handlePermissionChange("camera",this._cameraPermissionStatus.state))},this._cameraPermissionStatus.addEventListener("change",this._boundCameraPermissionHandler),this._microphonePermissionStatus=yield navigator.permissions.query(t),this._isDestroyed)||(this._boundMicrophonePermissionHandler=()=>{this._isDestroyed||(this._permissionChecked=!1,this.handlePermissionChange("microphone",this._microphonePermissionStatus.state))},this._microphonePermissionStatus.addEventListener("change",this._boundMicrophonePermissionHandler))}catch(e){this._logger.warning(this,"Could not set up permission listeners: "+e)}})}removePermissionListeners(){this._cameraPermissionStatus&&this._boundCameraPermissionHandler&&(this._cameraPermissionStatus.removeEventListener("change",this._boundCameraPermissionHandler),this._cameraPermissionStatus=null,this._boundCameraPermissionHandler=null),this._microphonePermissionStatus&&this._boundMicrophonePermissionHandler&&(this._microphonePermissionStatus.removeEventListener("change",this._boundMicrophonePermissionHandler),this._microphonePermissionStatus=null,this._boundMicrophonePermissionHandler=null)}setupDeviceChangeListener(){this._isDestroyed||(this._deviceChangeHandler=()=>__awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed)if(this._publishState===PublishState.PUBLISHED)this._logger.info(this,"Device change detected, but already publish - no restarting streamer");else{this._logger.info(this,"Device change detected, restarting streamer");var e=null==(e=this._main.getConfigManager())?void 0:e.getStreamData().streamKey,t=this._publishState===PublishState.CONNECTED;try{this.stop(),yield new Promise(e=>setTimeout(e,500)),this._isDestroyed||(yield this.start(),this._isDestroyed)||(t&&e&&(this._logger.info(this,"Resuming publishing after device change"),this.isStreamReady(!0,!0)?this.internalPublish(e):(this._logger.warning(this,"Cannot resume publishing - stream not ready after device change"),this._main.dispatchEvent("inputDeviceError",{ref:this._main}))),this._logger.success(this,"Successfully handled device change"))}catch(e){this._isDestroyed||(this._logger.error(this,"Error handling device change: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID))}}}),navigator.mediaDevices.addEventListener("devicechange",this._deviceChangeHandler))}handlePermissionChange(e,t){return __awaiter(this,void 0,void 0,function*(){this._isDestroyed||(this._logger.info(this,`📹 [PERMISSION] handlePermissionChange() - device: ${e}, state: `+t),"denied"===t&&(this.setInputDeviceState(InputDevicesState.INVALID),this._publishState!=PublishState.CONNECTED&&!this._stream||(this._logger.info(this,"📹 [RELEASE] handlePermissionChange() - permission denied, stopping all streams"),this.stopCameraStream(),this.closeWebRTCConnection())),this._isDestroyed)||(yield this.grabDevices(),this._isDestroyed)||"granted"===t&&(yield this.startCamera())})}onCameraStreamSuccess(e){if(this._isDestroyed)this._logger.warning(this,"📹 [RELEASE] onCameraStreamSuccess() - destroyed, releasing stream immediately"),e.getTracks().forEach(e=>{e.stop()});else{this._activeStreamCount++,this._logger.success(this,`📹 [ACQUIRED] onCameraStreamSuccess() - stream acquired, id: ${e.id}, active streams: `+this._activeStreamCount);var s=e.getVideoTracks()[0],t=e.getAudioTracks()[0],n=new PublishMetadata;if(s){var r=s.getSettings();let e=r.width,t=r.height;/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)&&(e>t&&window.innerWidth<window.innerHeight||e<t&&window.innerWidth>window.innerHeight)&&([e,t]=[t,e]),n.streamWidth=e,n.streamHeight=t,n.videoTrackPresent=!0;const h=(e,t)=>t?h(t,e%t):e;var r=h(e,t),o=e/r,r=t/r,a=e/t;let i=o+":"+r;Math.abs(a-16/9)<.1?i=e>t?"16:9":"9:16":Math.abs(a-4/3)<.1&&(i=e>t?"4:3":"3:4"),n.aspectRatio=i,this._logger.info(this,`📹 [INFO] Video track - id: ${s.id}, enabled: ${s.enabled}, readyState: `+s.readyState)}else n.videoTrackPresent=!1;t&&this._logger.info(this,`📹 [INFO] Audio track - id: ${t.id}, enabled: ${t.enabled}, readyState: `+t.readyState),n.audioTrackPresent=!!t,this._logger.info(this,`Publish MetaData :: Resolution: ${n.streamWidth}x${n.streamHeight} | `+`Aspect ratio: ${n.aspectRatio}, `+`Video track: ${n.videoTrackPresent} | Audio track: `+n.audioTrackPresent),this._isDestroyed?(this._logger.warning(this,"📹 [RELEASE] onCameraStreamSuccess() - destroyed during setup, releasing"),e.getTracks().forEach(e=>e.stop()),this._activeStreamCount--):(this._main.dispatchEvent("publishMetadataUpdate",{ref:this._main,metadata:n}),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(),(a=null==(r=null==(o=this._main.getStageController())?void 0:o.getScreenElement())?void 0:r.getVideoElement())&&(a.srcObject=e,a.autoplay=!0,a.playsInline=!0,a.disableRemotePlayback=!0,a.controls=!1,a.muted=!0),this.setPublishState(PublishState.INITIALIZED))}}initializeWebRTC(){var e;this._isDestroyed||(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._isDestroyed&&(this._debug&&this._logger.decoratedLog("Publishing: "+e,"dark-red"),this._logger.info(this,"Publish: "+e),this._main.getConfigManager().getStreamData().streamKey==e?(this._debug&&this._logger.decoratedLog("Canceling publishing, already published "+e,"dark-red"),this._logger.info(this,"Canceling publishing, already published "+e),!1):this.internalPublish(e))}internalPublish(e){return!(this._isDestroyed||(null!=this._statusTimer&&clearInterval(this._statusTimer),null==this._main.getConfigManager().getStreamData().streamKey||this._firstPublish||(this._debug&&this._logger.decoratedLog("Unpublishing active session: "+this._main.getConfigManager().getStreamData().streamKey,"dark-red"),this.unpublish()),this._main.getConfigManager().getStreamData().streamKey=e,this._fullStreamName=e+"_"+(new Date).getTime(),this.isStreamReady(!0,!0)?(this.closeWebRTCConnection(),this._main.dispatchEvent("publish",{ref:this._main,streamKey:e}),this.initializeWebRTC(),this._firstPublish=!1):(this._logger.warning(this,"Cannot publish - stream not ready (missing video or audio track)"),1)))}unpublish(){this._debug&&this._logger.decoratedLog("Unpublish","dark-red"),this._logger.info(this,"📹 [UNPUBLISH] unpublish() - stopping WebRTC but keeping camera preview"),null!=this._statusConnection&&(this._statusConnection.destroy(),this._statusConnection=null),null!=this._statusTimer&&(clearInterval(this._statusTimer),this._statusTimer=null),clearTimeout(this._publishTimer),this._main.getConfigManager().getStreamData().streamKey=null,this._main.dispatchEvent("unpublish",{ref:this._main}),this.closeWebRTCConnection(),this.setPublishState(PublishState.UNPUBLISHED)}unpublishAndRelease(){this._logger.info(this,"📹 [UNPUBLISH+RELEASE] unpublishAndRelease() - stopping everything"),this._debug&&this._logger.decoratedLog("Unpublish + Release","dark-red"),this.unpublish(),this.stopCameraStream()}setupOrientationListener(){this._isDestroyed||(this._orientationChangeHandler=this.handleOrientationChange,window.screen&&window.screen.orientation?window.screen.orientation.addEventListener("change",this._orientationChangeHandler):window.addEventListener("orientationchange",this._orientationChangeHandler))}onUserMediaError(e){return __awaiter(this,void 0,void 0,function*(){this._isDestroyed||(this._logger.error(this,`📹 [ERROR] onUserMediaError() - ${e.name}: `+e.message),yield this.grabDevices(),"OverconstrainedError"===e.name&&this._logger.warning(this,"Device constraints not satisfied"))})}checkIndividualDeviceAccess(){return __awaiter(this,void 0,void 0,function*(){var t={camera:{allowed:!1,available:!1},microphone:{allowed:!1,available:!1}};if(!this._isDestroyed)try{var e=yield navigator.mediaDevices.enumerateDevices();if(this._isDestroyed)return t;if(t.camera.available=e.some(e=>"videoinput"===e.kind),t.microphone.available=e.some(e=>"audioinput"===e.kind),e.some(e=>""!==e.label))t.camera.allowed=e.some(e=>"videoinput"===e.kind&&""!==e.label),t.microphone.allowed=e.some(e=>"audioinput"===e.kind&&""!==e.label);else{if(this._logger.info(this,"📹 [ACQUIRE] checkIndividualDeviceAccess() - no labels, requesting permissions"),this._isDestroyed)return t;try{var i=yield navigator.mediaDevices.getUserMedia({video:t.camera.available,audio:t.microphone.available});if(this._isDestroyed)return this._logger.warning(this,"📹 [RELEASE] checkIndividualDeviceAccess() - destroyed, releasing orphan stream"),i.getTracks().forEach(e=>e.stop()),t;if(t.camera.allowed=0<i.getVideoTracks().length,t.microphone.allowed=0<i.getAudioTracks().length,this._logger.info(this,"📹 [RELEASE] checkIndividualDeviceAccess() - stopping test stream"),i.getTracks().forEach(e=>{e.stop(),this._logger.info(this,"📹 [RELEASE] checkIndividualDeviceAccess() - stopped track: "+e.kind)}),this._isDestroyed)return t;yield this.grabDevices()}catch(e){console.error("Error requesting permissions:",e),t.camera.allowed=!1,t.microphone.allowed=!1}}}catch(e){console.error("Error checking devices:",e)}return t})}onSocketMessage(e){if(!this._isDestroyed){var t=JSON.parse(e);switch(Number(t.status)){case 200:this._logger.info(this,"SDP Exchange Successful");var i=t.sdp,s=(void 0!==i&&this._peerConnection&&this._peerConnection.setRemoteDescription(new RTCSessionDescription(i),()=>{},()=>{}),t.iceCandidates);if(void 0!==s)for(var n in s)this._peerConnection&&this._peerConnection.addIceCandidate(new RTCIceCandidate(s[n]));break;case 503:this._logger.error(this,"StreamKey already use");i=null!=(i=this._main.getConfigManager().getStreamData().streamKey)?i:"unknown";this._main.dispatchEvent("streamKeyInUse",{ref:this._main,streamKey:i}),this.setPublishState(PublishState.ERROR)}}}onConnectionStateChange(e){if(!this._isDestroyed&&(this._logger.info(this,"Connection State Change: "+JSON.stringify(e)),null!==e))switch(e.currentTarget.connectionState){case"connecting":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnecting"),this.setPublishState(PublishState.CONNECTING);break;case"connected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerConnected"),this.setPublishState(PublishState.CONNECTED),this.muteMicrophone(this._isMicrophoneMuted);break;case"disconnected":this._logger.info(this,"WebRTCStreamer :: Event: onStreamerDisconnected"),this.setPublishState(PublishState.UNPUBLISHED);break;case"failed":this._logger.info(this,"WebRTCStreamer :: Event: onPlayerFailed"),this.setPublishState(PublishState.ERROR);break;default:this._logger.info(this,"WebRTCStreamer :: Unsupported onConnectionStateChange: "+e.currentTarget.connectionState)}}grabDevices(){return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed)try{var e=yield this.checkIndividualDeviceAccess();if(!this._isDestroyed&&(this._cameraList=new InputDeviceList,this._microphoneList=new InputDeviceList,this._permissionChecked||(e.camera.allowed?e.camera.available||(this._main.dispatchEvent("noCameraFound",{ref:this._main}),this.setCameraState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID)):(this._main.dispatchEvent("cameraAccessDenied",{ref:this._main}),this.setCameraState(DeviceState.ACCESS_DENIED),this.setInputDeviceState(InputDevicesState.INVALID)),e.microphone.allowed?e.microphone.available||(this._main.dispatchEvent("noMicrophoneFound",{ref:this._main}),this.setMicrophoneState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID)):(this._main.dispatchEvent("microphoneAccessDenied",{ref:this._main}),this.setMicrophoneState(DeviceState.ACCESS_DENIED),this.setInputDeviceState(InputDevicesState.INVALID))),!this._isDestroyed)){var t,i,s=yield navigator.mediaDevices.enumerateDevices();if(!this._isDestroyed){for(const n of s)n.deviceId&&n.label&&("videoinput"===n.kind&&e.camera.allowed?(t=new InputDevice(n,this._cameraList.getSize()),this._cameraList.push(t)):"audioinput"===n.kind&&e.microphone.allowed&&(i=new InputDevice(n,this._microphoneList.getSize()),this._microphoneList.push(i)));if(!this._isDestroyed){try{e.camera.allowed&&(this._selectedCamera=this.pickCamera()),e.microphone.allowed&&(this._selectedMicrophone=this.pickMicrophone())}catch(e){console.log(e),this.setInputDeviceState(InputDevicesState.INVALID),this._logger.error(this,"Error on grab devices: "+JSON.stringify(e))}this._isDestroyed||this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._permissionChecked=!0}}}}catch(e){this._isDestroyed||(console.error("Error in grabDevices:",e),this._cameraList=new InputDeviceList,this._microphoneList=new InputDeviceList,this._isDestroyed)||(this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._main.dispatchEvent("inputDeviceError",{ref:this._main}))}})}selectCamera(i){var n,r,o;return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed){this._cameraAbortController&&this._cameraAbortController.abort(),this._cameraAbortController=new AbortController;const s=this._cameraAbortController.signal;try{this._switchingCamera=!0,this._logger.info(this,"📹 [SWITCH] selectCamera() - switching to camera: "+i);for(let e=0;e<this._cameraList.getSize();e++)this._cameraList.get(e).isSelected=!1;this._selectedCamera=null,this.setInputDeviceState(InputDevicesState.UPDATING),this.setCameraState(DeviceState.NOT_INITIALIZED);var e=null==(n=this._main.getConfigManager())?void 0:n.getStreamData().streamKey,t=this._publishState===PublishState.CONNECTED;for(let e=0;e<this._cameraList.getSize();e++)if(this._cameraList.get(e).id==i){this._selectedCamera=this._cameraList.get(e),this._selectedCamera.isSelected=!0,null!=(r=this._main.getStorageManager())&&r.saveField("cameraID",this._selectedCamera.id);break}this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),s.aborted||this._isDestroyed||(this.stopCameraStream(),null!=this._selectedCamera?(this._constraints.video.deviceId=this._selectedCamera.id,s.aborted||this._isDestroyed||(yield new Promise((e,t)=>{const i=setTimeout(e,500);s.addEventListener("abort",()=>{clearTimeout(i),t(new Error("Aborted"))})}),s.aborted)||this._isDestroyed||(yield this.startCamera(),this._isDestroyed)||(this.setCameraState(DeviceState.ENABLED),this._cameraState==DeviceState.ENABLED&&this._microphoneState==DeviceState.ENABLED?this.setInputDeviceState(InputDevicesState.READY):this.setInputDeviceState(InputDevicesState.INVALID),t&&e&&!s.aborted&&!this._isDestroyed&&this.internalPublish(e))):this.setInputDeviceState(InputDevicesState.INVALID))}catch(e){"Aborted"===e.message||this._isDestroyed||(this._logger.error(this,"📹 [ERROR] selectCamera() - Error switching camera: "+e),this.setInputDeviceState(InputDevicesState.INVALID))}finally{this._switchingCamera=!1,(null==(o=this._cameraAbortController)?void 0:o.signal)===s&&(this._cameraAbortController=null)}}})}selectMicrophone(i){var n,r,o;return __awaiter(this,void 0,void 0,function*(){if(!this._isDestroyed){this._microphoneAbortController&&this._microphoneAbortController.abort(),this._microphoneAbortController=new AbortController;const s=this._microphoneAbortController.signal;try{this._switchingMicrophone=!0,this._logger.info(this,"📹 [SWITCH] selectMicrophone() - switching to microphone: "+i);for(let e=0;e<this._microphoneList.getSize();e++)this._microphoneList.get(e).isSelected=!1;this._selectedMicrophone=null,this.setInputDeviceState(InputDevicesState.UPDATING),this.setMicrophoneState(DeviceState.NOT_INITIALIZED);var e=null==(n=this._main.getConfigManager())?void 0:n.getStreamData().streamKey,t=this._publishState===PublishState.CONNECTED;for(let e=0;e<this._microphoneList.getSize();e++)if(this._microphoneList.get(e).id==i){this._selectedMicrophone=this._microphoneList.get(e),this._selectedMicrophone.isSelected=!0,null!=(r=this._main.getStorageManager())&&r.saveField("microphoneID",this._selectedMicrophone.id);break}this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),s.aborted||this._isDestroyed||(this._soundMeter.detach(),this.closeWebRTCConnection(),this._stream&&(this._logger.info(this,"📹 [RELEASE] selectMicrophone() - stopping current stream"),this._stream.getTracks().forEach(e=>{e.stop()}),this._stream=null,this._activeStreamCount--),s.aborted)||this._isDestroyed||(yield new Promise((e,t)=>{const i=setTimeout(e,500);s.addEventListener("abort",()=>{clearTimeout(i),t(new Error("Aborted"))})}),s.aborted)||this._isDestroyed||(yield this.startCamera(),this._isDestroyed)||(this.setMicrophoneState(DeviceState.ENABLED),this._cameraState==DeviceState.ENABLED&&this._microphoneState==DeviceState.ENABLED?this.setInputDeviceState(InputDevicesState.READY):this.setInputDeviceState(InputDevicesState.INVALID),t&&e&&!s.aborted&&!this._isDestroyed&&this.internalPublish(e))}catch(e){"Aborted"===e.message||this._isDestroyed||(console.error("Error changing microphone:",e),this._main.dispatchEvent("inputDeviceError",{ref:this._main}),this.setInputDeviceState(InputDevicesState.INVALID))}finally{this._switchingMicrophone=!1,(null==(o=this._microphoneAbortController)?void 0:o.signal)===s&&(this._microphoneAbortController=null)}}})}startCamera(){var s;return __awaiter(this,void 0,void 0,function*(){if(this._isDestroyed)this._logger.warning(this,"📹 [ACQUIRE] startCamera() - aborted, instance is destroyed");else{this._startCameraAbortController&&this._startCameraAbortController.abort(),this._startCameraAbortController=new AbortController;var t=this._startCameraAbortController.signal;this._stream&&(this._logger.info(this,"📹 [RELEASE] startCamera() - releasing existing stream before acquiring new one"),this._stream.getTracks().forEach(e=>{e.stop()}),this._stream=null,this._activeStreamCount--);try{var i={video:!!this._selectedCamera&&Object.assign(Object.assign({},this._constraints.video),{deviceId:{exact:this._selectedCamera.id}}),audio:!!this._selectedMicrophone&&{deviceId:{exact:this._selectedMicrophone.id}}};if(!t.aborted&&!this._isDestroyed){this._logger.info(this,"📹 [ACQUIRE] startCamera() - requesting getUserMedia");try{var e=yield navigator.mediaDevices.getUserMedia(i);if(t.aborted||this._isDestroyed)return this._logger.warning(this,"📹 [RELEASE] startCamera() - destroyed during getUserMedia, releasing orphan stream"),void e.getTracks().forEach(e=>{e.stop(),this._logger.info(this,`📹 [RELEASE] startCamera() - stopped orphan track: ${e.kind}, id: `+e.id)});this._stream=e,this.onCameraStreamSuccess(this._stream)}catch(e){if(t.aborted||this._isDestroyed)return;this._logger.error(this,`📹 [ERROR] startCamera() - getUserMedia failed: ${e.name}: `+e.message),i.video&&this.onUserMediaError({name:e.name||"Error",message:e.message||"Unknown error",deviceType:"video"}),i.audio&&this.onUserMediaError({name:e.name||"Error",message:e.message||"Unknown error",deviceType:"audio"})}this._cameraState==DeviceState.ENABLED&&this._microphoneState==DeviceState.ENABLED&&this.setInputDeviceState(InputDevicesState.READY)}}catch(e){this._isDestroyed||(console.error("Error in startCamera:",e),yield this.grabDevices())}finally{(null==(s=this._startCameraAbortController)?void 0:s.signal)===t&&(this._startCameraAbortController=null)}}})}updateWebRTCStream(){this._isDestroyed||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)}))}pickCamera(){var e;if(this._isDestroyed)return null;for(let e=0;e<this._cameraList.getSize();e++)this._cameraList.get(e).isSelected=!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).id===i){this._selectedCamera=this._cameraList.get(e),this._selectedCamera.isSelected=!0,this.setCameraState(DeviceState.ENABLED),t=!0,this._constraints.video.deviceId=this._selectedCamera.id;break}t||(this.setCameraState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),this._main.dispatchEvent("savedCameraNotFound",{ref:this._main,savedDeviceID:i}),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null))}if(!this._selectedCamera){if(this._main.dispatchEvent("savedCameraNotFound",{ref:this._main,savedDeviceID:null}),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null),null==(e=this._main.getConfigManager())||!e.getSettingsData().getIfForceSelection())return this.setCameraState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),null;this._selectedCamera=this._cameraList.get(0),this._selectedCamera.isSelected=!0,null!=(e=this._main.getStorageManager())&&e.saveField("cameraID",this._selectedCamera.id),this._constraints.video.deviceId=this._selectedCamera.id,this.setCameraState(DeviceState.ENABLED)}}return this._isDestroyed||this._main.dispatchEvent("deviceListUpdate",{ref:this._main,cameraList:this._cameraList.getArray(),microphoneList:this._microphoneList.getArray()}),this._selectedCamera}pickMicrophone(){var e;if(this._isDestroyed)return null;for(let e=0;e<this._microphoneList.getSize();e++)this._microphoneList.get(e).isSelected=!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).id===i){this._selectedMicrophone=this._microphoneList.get(e),t=!0,this.setMicrophoneState(DeviceState.ENABLED);break}t||(this._main.dispatchEvent("savedMicrophoneNotFound",{ref:this._main,savedDeviceID:i}),this.setMicrophoneState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null))}if(!this._selectedMicrophone){if(this._main.dispatchEvent("savedMicrophoneNotFound",{ref:this._main,savedDeviceID:null}),null!=(e=this._main.getConfigManager())&&e.getSettingsData().getIfCancelPublishOnError()&&(this._logger.info(this,"Canceling Publish!"),this._main.getConfigManager().getStreamData().streamKey=null),null==(e=this._main.getConfigManager())||!e.getSettingsData().getIfForceSelection())return this.setMicrophoneState(DeviceState.NOT_FOUND),this.setInputDeviceState(InputDevicesState.INVALID),null;this._selectedMicrophone=this._microphoneList.get(0),this.setMicrophoneState(DeviceState.ENABLED),null!=(e=this._main.getStorageManager())&&e.saveField("microphoneID",this._selectedMicrophone.id)}this._selectedMicrophone.isSelected=!0,this._constraints.audio={deviceId:this._selectedMicrophone.id}}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){var t;this._isDestroyed||this._isMicrophoneMuted!==e&&(this._isMicrophoneMuted=e,null!=(t=this._main.getStorageManager())&&t.saveField("microphoneMuted",e?"true":"false"),this._stream?this.applyMicrophoneState(!e):this._pendingMicrophoneState=!e,this._main.dispatchEvent("microphoneStateChange",{ref:this._main,isMuted:this._isMicrophoneMuted}))}applyMicrophoneState(t){var e;this._stream&&(e=this._stream.getAudioTracks())&&0<e.length&&e.forEach(e=>e.enabled=t)}isStreamReady(e=!0,t=!0){var i,s;return!!this._stream&&(s=this._stream.getVideoTracks(),i=this._stream.getAudioTracks(),e=!e||0<s.length&&"live"===s[0].readyState,s=!t||0<i.length&&"live"===i[0].readyState,e)&&s}closeWebRTCConnection(){if(this._peerConnection){this._logger.info(this,"📡 [WEBRTC] closeWebRTCConnection() - closing peer connection"),this._peerConnection.onicecandidate=null,this._peerConnection.onconnectionstatechange=null,this._peerConnection.onnegotiationneeded=null;try{this._peerConnection.close()}catch(e){}this._peerConnection=null}}onDescriptionError(e){this._logger.info(this,"WebRTCStreamer :: onDescriptionError: "+JSON.stringify(e))}onIceCandidate(e){e.candidate}createStatusConnection(){var e;this._isDestroyed||(e=null==(e=null==(e=null==(e=this._main)?void 0:e.getNetworkController())?void 0:e.getConnection())?void 0:e.getCurrentServer())&&(this._statusConnection&&!this._statusConnection.isConnectionActive()&&this._statusConnection.destroy(),this._statusConnection=new WowzaStatusConnection(this._main,e))}isMicrophoneMuted(){return this._isMicrophoneMuted}getCurrentCamera(){return this._selectedCamera}getCurrentMicrophone(){return this._selectedMicrophone}setPublishState(e){this._publishState==e||this._isDestroyed||(this._debug&&this._logger.decoratedLog("Publish State: "+e,"dark-blue"),this._logger.info(this,"Publish State: "+e),e==PublishState.PUBLISHED&&(this._publishTime=(new Date).getTime()),this._publishState=e,this._main.dispatchEvent("publishStateChange",{ref:this._main,state:this._publishState}))}getPublishTime(){return this._publishState==PublishState.PUBLISHED?this._publishTime:0}setInputDeviceState(e){this._inputDeviceState==e||this._isDestroyed||(this._inputDeviceState=e,this._main.dispatchEvent("deviceStateChange",{ref:this._main,state:this._inputDeviceState,selectedCamera:this._selectedCamera,selectedMicrophone:this._selectedMicrophone}))}getInputDeviceState(){return this._inputDeviceState}setCameraState(e){this._cameraState==e||this._isDestroyed||(this._cameraState=e,this._main.dispatchEvent("cameraDeviceStateChange",{ref:this._main,state:e,selectedCamera:this._selectedCamera}))}getCameraState(){return this._cameraState}setMicrophoneState(e){this._microphoneState==e||this._isDestroyed||(this._microphoneState=e,this._main.dispatchEvent("microphoneDeviceStateChange",{ref:this._main,state:e,selectedMicrophone:this._selectedMicrophone}))}getMicrophoneState(){return this._microphoneState}getCameraList(){return null!=this._cameraList?this._cameraList.getArray():[]}getMicrophoneList(){return null!=this._microphoneList?this._microphoneList.getArray():[]}getPublishState(){return this._publishState}debugMediaState(){console.group("🎥 Media Debug State"),console.log("=== STREAM INFO ==="),console.log("this._stream:",this._stream),console.log("Active stream count:",this._activeStreamCount),console.log("Is destroyed:",this._isDestroyed),this._stream&&(console.log("Stream ID:",this._stream.id),console.log("Stream active:",this._stream.active),console.log("--- Video Tracks ---"),this._stream.getVideoTracks().forEach((e,t)=>{console.log(` Track ${t}:`,{id:e.id,enabled:e.enabled,readyState:e.readyState,muted:e.muted})}),console.log("--- Audio Tracks ---"),this._stream.getAudioTracks().forEach((e,t)=>{console.log(` Track ${t}:`,{id:e.id,enabled:e.enabled,readyState:e.readyState,muted:e.muted})})),console.log("=== VIDEO ELEMENT ===");var e=null==(e=null==(e=this._main.getStageController())?void 0:e.getScreenElement())?void 0:e.getVideoElement();(null==e?void 0:e.srcObject)instanceof MediaStream&&(e=e.srcObject,console.log("Video srcObject stream ID:",e.id),console.log("Video srcObject active:",e.active),console.log("Same as this._stream:",e===this._stream)),console.groupEnd()}stopCameraStream(){var e;this._stream&&(this._logger.info(this,"📹 [RELEASE] stopCameraStream() - stopping stream, id: "+this._stream.id),this._stream.getTracks().forEach(e=>{this._logger.info(this,`📹 [RELEASE] stopCameraStream() - stopping track: ${e.kind}, id: `+e.id),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,this._activeStreamCount--,this._logger.info(this,"📹 [RELEASE] stopCameraStream() - complete, active streams: "+this._activeStreamCount))}stop(){this._logger.info(this,"📹 [STOP] stop() - stopping all operations"),this._cameraAbortController&&(this._cameraAbortController.abort(),this._cameraAbortController=null),this._microphoneAbortController&&(this._microphoneAbortController.abort(),this._microphoneAbortController=null),this._startCameraAbortController&&(this._startCameraAbortController.abort(),this._startCameraAbortController=null),this._statusConnection&&(this._statusConnection.destroy(),this._statusConnection=null),this._statusTimer&&(clearInterval(this._statusTimer),this._statusTimer=null),this._main.getConfigManager().getStreamData().streamKey=null,this.closeWebRTCConnection(),this.stopCameraStream(),this.setPublishState(PublishState.STOPPED),this.setInputDeviceState(InputDevicesState.STOPPED),this.setCameraState(DeviceState.STOPPED),this.setMicrophoneState(DeviceState.STOPPED),this._restartTimer&&(clearInterval(this._restartTimer),this._restartTimer=null),this._restartTimerCount=0,clearTimeout(this._publishTimer)}start(){var e,t,i;return __awaiter(this,void 0,void 0,function*(){if(this._isDestroyed||this._isInitializing)this._logger.warning(this,"📹 [START] start() - skipped (destroyed or already initializing)");else if(this._publishState!==PublishState.STOPPED&&this._publishState!==PublishState.NOT_INITIALIZED)this._logger.warning(this,"📹 [START] start() - already running, ignoring");else if(this._inputDeviceState!==InputDevicesState.STOPPED&&this._inputDeviceState!==InputDevicesState.NOT_INITIALIZED)this._logger.warning(this,"📹 [START] start() - devices already initializing/ready, ignoring");else{this._logger.info(this,"📹 [START] start() - reinitializing streaming");try{this._publishState=PublishState.NOT_INITIALIZED,this._inputDeviceState=InputDevicesState.NOT_INITIALIZED,this._cameraState=DeviceState.NOT_INITIALIZED,this._microphoneState=DeviceState.NOT_INITIALIZED,yield this.initializeDevices(),this._isDestroyed||(yield this.startCamera(),this._isDestroyed)||(null!=(e=this._main.getConfigManager())&&e.getSettingsData().autoConnect&&null!=(t=this._main.getNetworkController())&&t.initialize(),null!=(i=this._main.getConfigManager())&&i.getStreamData().streamKey&&this.createStatusConnection())}catch(e){if(!this._isDestroyed)throw this._logger.error(this,"📹 [START] start() - failed: "+JSON.stringify(e)),this.setInputDeviceState(InputDevicesState.INVALID),e}}})}destroy(){var e,t,i,s;if(this._isDestroyed)null!=(e=this._logger)&&e.warning(this,"🔴 [DESTROY] Already destroyed, skipping");else{this._logger.info(this,"🔴 [DESTROY] Starting StreamerController destroy (sync)..."),this._isDestroyed=!0,this._cameraAbortController&&(this._cameraAbortController.abort(),this._cameraAbortController=null),this._microphoneAbortController&&(this._microphoneAbortController.abort(),this._microphoneAbortController=null),this._startCameraAbortController&&(this._startCameraAbortController.abort(),this._startCameraAbortController=null),null!=this._statusTimer&&(clearInterval(this._statusTimer),this._statusTimer=null),null!=this._restartTimer&&(clearInterval(this._restartTimer),this._restartTimer=null),clearTimeout(this._publishTimer),this.removePermissionListeners(),this._deviceChangeHandler&&(navigator.mediaDevices.removeEventListener("devicechange",this._deviceChangeHandler),this._deviceChangeHandler=null),this._orientationChangeHandler&&(window.screen&&window.screen.orientation?window.screen.orientation.removeEventListener("change",this._orientationChangeHandler):window.removeEventListener("orientationchange",this._orientationChangeHandler),this._orientationChangeHandler=null);try{this._main.removeEventListener("serverConnect",this.onServerConnect),this._main.removeEventListener("serverDisconnect",this.onServerDisconnect),this._main.removeEventListener("streamKeyInUse",this.onStreamKeyTaken),this._main.removeEventListener("statusServerConnect",this.onStatusServerConnect),this._main.removeEventListener("statusServerDisconnect",this.onStatusServerDisconnect),this._main.removeEventListener("streamStatusUpdate",this.onStreamStatsUpdate),this._main.removeEventListener("deviceStateChange",this.onDeviceStateChange),document.removeEventListener("visibilitychange",this.visibilityChange),window.removeEventListener("blur",this.onWindowBlur),window.removeEventListener("focus",this.onWindowFocus)}catch(e){}this._statusConnection&&(this._statusConnection.destroy(),this._statusConnection=null),this.closeWebRTCConnection(),this._stream&&(this._logger.info(this,"📹 [FORCE_STOP] Stopping main stream"),this._stream.getTracks().forEach(e=>{e.stop()}),this._stream=null);try{var n=null==(i=null==(t=this._main.getStageController())?void 0:t.getScreenElement())?void 0:i.getVideoElement();n&&(n.srcObject instanceof MediaStream&&n.srcObject.getTracks().forEach(e=>e.stop()),n.srcObject=null)}catch(e){}try{null!=(s=this._soundMeter)&&s.destroy()}catch(e){}this._selectedCamera=null,this._selectedMicrophone=null,this._activeStreamCount=0,this._logger.success(this,"🔴 [DESTROY] StreamerController destroyed (sync)")}}}class WowzaConnection extends AbstractSocket{constructor(e,t){super(),this._isDestroyed=!1,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._isDestroyed||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(){this._isDestroyed=!0,super.destroy(),null!=this._reconnectTimer&&clearTimeout(this._reconnectTimer)}}class NetworkController{constructor(e){this._connection=null,this._currentStreamKey="none",this._lastState="",this._isDestroyed=!1,this.onServerConnect=()=>{},this.onServerDisconnect=()=>{this._lastState="none"},this.onMessage=e=>{var t;null!=(t=this._main.getStreamerController())&&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(){this._isDestroyed||null!=this._connection&&(this._connection.getConnectionState()==ConnectionState.CONNECTING||this._connection.getConnectionState()==ConnectionState.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 WowzaConnection(this._main,this)}stop(){var e;null!=(e=this._connection)&&e.disconnect(!0),this._lastState=""}sendMessage(e){!this._isDestroyed&&this._connection&&this._connection.isConnectionActive()&&this._connection.sendData(e)}getConnection(){return this._connection}getCurrentStreamKey(){return this._currentStreamKey}destroy(){this._isDestroyed=!0,this._main.removeEventListener("serverConnect",this.onServerConnect),this._main.removeEventListener("serverDisconnect",this.onServerDisconnect),this._connection&&(this._connection.destroy(),this._connection=null)}}class StatsController{constructor(e){this._publishVideoWidth=0,this._publishVideoHeight=0,this._publishVideoBitrate=0,this._publishAudioBitrate=0,this._currentBitrate=0,this._currentFPS=0,this._deliveredVideoFrames=0,this._deliveredAudioFrames=0,this.onStreamStatsUpdate=e=>{this._publishVideoWidth=e.streamStatus.videoWidth,this._publishVideoHeight=e.streamStatus.videoHeight,this._currentBitrate=e.streamStatus.currentBitrate,this._publishVideoBitrate=e.streamStatus.videoPublishBitrate,this._publishAudioBitrate=e.streamStatus.audioPublishBitrate,this._currentFPS=e.streamStatus.frameRate,this._deliveredVideoFrames=e.streamStatus.videoFrameCount,this._deliveredAudioFrames=e.streamStatus.audioFrameCount},this._main=e,this._logger=e.getLogger(),this._logger.info(this,"Creating new StatsController"),this.initialize()}initialize(){this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate,!1)}get deliveredVideoFrames(){return this._deliveredVideoFrames}get deliveredAudioFrames(){return this._deliveredAudioFrames}get currentFPS(){return this._currentFPS}get publishVideoWidth(){return this._publishVideoWidth}get publishVideoHeight(){return this._publishVideoHeight}get currentBitrate(){return this._currentBitrate}get publishVideoBitrate(){return this._publishVideoBitrate}get publishAudioBitrate(){return this._publishAudioBitrate}}class GraphDrawer{constructor(e,t,i,s=1){if(this._currentX=0,this._isFullyDrawn=!1,this._lastTimestamp=null,this._isTimemarkLine=!1,this._borderWidth=1,i.length!==t.length+1)throw new Error(`Colors array must have exactly ${t.length+1} elements (one more than valueRanges)`);for(let e=1;e<t.length;e++)if(t[e]<=t[e-1])throw new Error("ValueRanges must be in ascending order");const n=/^#[0-9A-Fa-f]{6}$/;if(!i.every(e=>n.test(e)))throw new Error("All colors must be in valid hex format (e.g., #FF0000)");let r;if("string"==typeof e){var o=document.getElementById(e);if(!o)throw new Error(`Container element with id ${e} not found`);r=o}else r=e;o=r.getBoundingClientRect(),this._width=Math.floor(o.width),this._height=Math.floor(o.height),this._effectiveWidth=this._width-2*this._borderWidth,this._effectiveHeight=this._height-2*this._borderWidth,this._canvas=document.createElement("canvas"),r.appendChild(this._canvas),e=this._canvas.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to get canvas context");this._ctx=e,this._valueRanges=[0,...t],this._colors=i,this._lineWidth=s,this._canvas.width=this._width,this._canvas.height=this._height,this._canvas.style.width=this._width+"px",this._canvas.style.height=this._height+"px",this.clear()}drawBorder(){this._ctx.strokeStyle="#000000",this._ctx.lineWidth=this._borderWidth,this._ctx.strokeRect(this._borderWidth/2,this._borderWidth/2,this._width-this._borderWidth,this._height-this._borderWidth)}clear(){this._ctx.clearRect(0,0,this._width,this._height),this._ctx.fillStyle=this._colors[0],this._ctx.fillRect(this._borderWidth,this._borderWidth,this._effectiveWidth,this._effectiveHeight),this.drawBorder(),this._isFullyDrawn=!1,this._currentX=this._borderWidth,this._lastTimestamp=null,this._isTimemarkLine=!1}getColorIndices(t){for(let e=0;e<this._valueRanges.length-1;e++)if(t>=this._valueRanges[e]&&t<=this._valueRanges[e+1])return{lowerIndex:e,upperIndex:e+1};return{lowerIndex:this._valueRanges.length-2,upperIndex:this._valueRanges.length-1}}calculateHeightRatio(e,t,i){return(e-t)/(i-t)}shiftCanvasLeft(e){e=this._ctx.getImageData(this._borderWidth+e,this._borderWidth,this._effectiveWidth-e,this._effectiveHeight);this._ctx.fillStyle=this._colors[0],this._ctx.fillRect(this._borderWidth,this._borderWidth,this._effectiveWidth,this._effectiveHeight),this._ctx.putImageData(e,this._borderWidth,this._borderWidth),this.drawBorder()}applyOverlayEffect(e,s=.5){var t=parseInt(e.slice(1,3),16),i=parseInt(e.slice(3,5),16),e=parseInt(e.slice(5,7),16),n=e=>{var t=e/255;let i;return i=t<=.5?2*t*1:1-2*(1-t)*0,Math.round(255*i*s+e*(1-s))},t=n(t),i=n(i),n=n(e),e=e=>{e=e.toString(16);return 1===e.length?"0"+e:e};return"#"+e(t)+e(i)+e(n)}addEntry(e){e=Math.round(100*e)/100;var t=Date.now(),t=(null===this._lastTimestamp?(this._lastTimestamp=t,this._isTimemarkLine=!1):1e3<=t-this._lastTimestamp?(this._isTimemarkLine=!0,this._lastTimestamp=t):this._isTimemarkLine=!1,this._isTimemarkLine?1:this._lineWidth);!this._isFullyDrawn&&this._currentX>=this._width-this._borderWidth&&(this._isFullyDrawn=!0),this._isFullyDrawn?(this.shiftCanvasLeft(t),this.drawLine(this._width-this._borderWidth-t,e,t)):(this.drawLine(this._currentX,e,t),this._currentX+=t)}drawLine(e,t,i){var{lowerIndex:s,upperIndex:n}=this.getColorIndices(t),t=this.calculateHeightRatio(t,this._valueRanges[s],this._valueRanges[n]);let r=this._colors[s],o=this._colors[n];this._isTimemarkLine&&(r=this.applyOverlayEffect(r,.3),o=this.applyOverlayEffect(o,.3));s=Math.round(this._effectiveHeight*t),n=this._effectiveHeight-s;this._ctx.fillStyle=r,this._ctx.fillRect(e,this._height-this._borderWidth-n,i,n),this._ctx.fillStyle=o,this._ctx.fillRect(e,this._borderWidth,i,s)}clearGraph(){this._currentX=this._borderWidth,this._isFullyDrawn=!1,this._lastTimestamp=null,this._isTimemarkLine=!1,this.clear()}destroy(){this._canvas.parentNode&&this._canvas.parentNode.removeChild(this._canvas)}}class BitrateGraph{constructor(e,t){this.onStreamStatsUpdate=e=>{var t;null!=(t=this._graph)&&t.addEntry(e.streamStatus.currentBitrate)},this._main=e,this._object=t,this._main.addGraph(this)}start(){null!=this._graph&&stop();return this._graph=new GraphDrawer(this._object,[1e6,2e6,3e6,5e6,6e6,7e6],["#000000","#0a3980","#2793dd","#3bc39c","#c3df3e","#f89539","#f83f3f"],5),this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate),this}stop(){return this._main.removeEventListener("streamStatusUpdate",this.onStreamStatsUpdate),null!=this._graph&&this._graph.destroy(),this._graph=null,this}}class FPSGraph{constructor(e,t){this.onStreamStatsUpdate=e=>{var t;null!=(t=this._graph)&&t.addEntry(e.streamStatus.frameRate)},this._main=e,this._object=t,this._main.addGraph(this)}start(){null!=this._graph&&stop();return this._graph=new GraphDrawer(this._object,[25,26,27,28,29,30],["#000000","#0a3980","#2793dd","#3bc39c","#c3df3e","#f89539","#f83f3f"],5),this._main.addEventListener("streamStatusUpdate",this.onStreamStatsUpdate),this}stop(){return this._main.removeEventListener("streamStatusUpdate",this.onStreamStatsUpdate),null!=this._graph&&this._graph.destroy(),this._graph=null,this}}class MicrophoneGraph{constructor(e,t){this.onStreamStatsUpdate=e=>{var t;null!=(t=this._graph)&&t.addEntry(500*e.high)},this._main=e,this._object=t,this._main.addGraph(this)}start(){null!=this._graph&&stop();return this._graph=new GraphDrawer(this._object,[0,20,40,60,80,100],["#000000","#0a3980","#2793dd","#3bc39c","#c3df3e","#f89539","#f83f3f"],2),this._main.addEventListener("soundMeter",this.onStreamStatsUpdate),this}stop(){return this._main.removeEventListener("soundMeter",this.onStreamStatsUpdate),null!=this._graph&&this._graph.destroy(),this._graph=null,this}}class StormStreamer extends EventDispatcher{constructor(e,t=!1){super(),this.DEV_MODE=!0,this.STREAMER_VERSION="1.0.7",this.COMPILE_DATE="2/24/2026, 9:59:13 AM",this.STREAMER_BRANCH="Experimental",this.STREAMER_PROTOCOL_VERSION=1,this._initialized=!1,this._isDestroyed=!1,"undefined"!=typeof window&&window.document&&window.document.createElement?(!this.DEV_MODE||"StormStreamerArray"in window||(window.StormStreamerArray=[]),window.StormStreamerArray.push(this),this._streamerID=StormStreamer.NEXT_STREAMER_ID++,null!=e&&(this.setStreamConfig(e),t)&&this.initialize()):console.error('StormStreamer Creation Error - No "window" element in the provided context!')}initialize(){if(!this._isRemoved&&!this._isDestroyed){if(null==this._configManager)throw Error("Stream Config was not provided for this streamer!");this._storageManager=new StorageManager(this),this._stageController=new StageController(this),this._networkController=new NetworkController(this),this._streamerController=new StreamerController(this),this._statsController=new StatsController(this),this._graphs=[],this._initialized=!0,this.dispatchEvent("streamerReady",{ref:this})}}setStreamConfig(e){this._isRemoved||this._isDestroyed||(e=JSON.parse(JSON.stringify(e)),null==this._configManager?(this._configManager=new ConfigManager(e),this._logger=new Logger(this._configManager.getSettingsData().getDebugData(),this),this._logger.info(this,"Storm Streamer :: Storm Streaming Suite"),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: "+UserCapabilities.getBrowserName()+" "+UserCapabilities.getBrowserVersion()),this._logger.info(this,"UserCapabilities :: Operating System: "+UserCapabilities.getOS()+" "+UserCapabilities.getOSVersion()),this._logger.info(this,"UserCapabilities :: isMobile: "+UserCapabilities.isMobile()),this._logger.info(this,"UserCapabilities :: hasMSESupport: "+UserCapabilities.hasMSESupport()),this._logger.info(this,"UserCapabilities :: hasWebSocketSupport: "+UserCapabilities.hasWebSocketsSupport()),this._logger.info(this,"UserCapabilities :: hasWebRTCSupport: "+UserCapabilities.hasWebRTCSupport()),this._configManager.print(this._logger)):(this._logger.info(this,"StreamConfig has been overwritten, dispatching streamConfigChanged!"),this._configManager=new ConfigManager(e),this._configManager.print(this._logger),this.dispatchEvent("streamConfigChange",{ref:this,newConfig:this._configManager})))}isConnected(){var e;return null!=(e=null==(e=null==(e=this._networkController)?void 0:e.getConnection())?void 0:e.isConnectionActive())&&e}mute(){var e;null!=(null==(e=this._stageController)?void 0:e.getScreenElement())?this._stageController.getScreenElement().setMuted(!0):this._configManager.getSettingsData().getAudioData().muted=!0}unmute(){var e;null!=(null==(e=this._stageController)?void 0:e.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._streamerController)?void 0:e.getCameraList())?e:[]}getMicrophoneList(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getMicrophoneList())?e:[]}setCamera(e){var t;null!=(t=this._streamerController)&&t.selectCamera(e)}setMicrophone(e){var t;null!=(t=this._streamerController)&&t.selectMicrophone(e)}getCurrentCamera(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getCurrentCamera())?e:null}getCurrentMicrophone(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getCurrentMicrophone())?e:null}muteMicrophone(e){var t;null!=(t=this._streamerController)&&t.muteMicrophone(e)}isMicrophoneMuted(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.isMicrophoneMuted())&&e}getPublishState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getPublishState())?e:PublishState.NOT_INITIALIZED}getPublishTime(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getPublishTime())?e:0}publish(e){var t;return null!=(t=null==(t=this._streamerController)?void 0:t.publish(e))&&t}unpublish(){var e;null!=(e=this._streamerController)&&e.unpublish()}getInputDevicesState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getInputDeviceState())?e:InputDevicesState.NOT_INITIALIZED}getCameraState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getCameraState())?e:DeviceState.NOT_INITIALIZED}getMicrophoneState(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.getMicrophoneState())?e:DeviceState.NOT_INITIALIZED}clearSavedDevices(){var e;null!=(e=this._streamerController)&&e.clearSavedDevices()}messSavedDevices(){var e;null!=(e=this._streamerController)&&e.messSavedDevices()}isStreamReady(){var e;return null!=(e=null==(e=this._streamerController)?void 0:e.isStreamReady())&&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}setSize(e,t){this._initialized?this._stageController.setSize(e,t):(e=NumberUtilities.parseValue(e),t=NumberUtilities.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=NumberUtilities.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=NumberUtilities.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"),s=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(),s)?(s.drawImage(e,0,0,i.width,i.height),i.toBlob(e=>t(e),"image/png")):t(null)})}createFPSGraph(e){return new FPSGraph(this,e)}createBitrateGraph(e){return new BitrateGraph(this,e)}createMicrophoneGraph(e){return new MicrophoneGraph(this,e)}addGraph(e){null!=this._graphs&&this._graphs.push(e)}stopAllGraphs(){if(null!=this._graphs&&0<this._graphs.length)for(let e=0;e<this._graphs.length;e++)this._graphs[e].stop()}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()}getStreamKey(){var e;return null!=(e=null==(e=null==(e=this.getConfigManager())?void 0:e.getStreamData())?void 0:e.streamKey)?e:null}getStatsController(){return this._statsController}getStreamerID(){return this._streamerID}getLogger(){return this._logger}getConfigManager(){return this._configManager}getNetworkController(){return this._networkController}getStreamerController(){return this._streamerController}getStageController(){return this._stageController}getStorageManager(){return this._storageManager}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}isDestroyed(){return this._isDestroyed}getVersion(){return this.STREAMER_VERSION}getBranch(){return this.STREAMER_BRANCH}dispatchEvent(e,t){super.dispatchEvent(e,t)}start(){var e;return __awaiter(this,void 0,void 0,function*(){return!this._initialized||this._isDestroyed||null==(e=this._streamerController)?void 0:e.start()})}stop(){var e;null!=(e=this._streamerController)&&e.stop()}debugMediaState(){var e;null!=(e=this._streamerController)&&e.debugMediaState()}destroy(){var e;if(this._isDestroyed)null!=(e=this._logger)&&e.warning(this,"🔴 [DESTROY] Already destroyed, skipping");else{if(null!=(e=this._logger)&&e.warning(this,"🔴 [DESTROY] Starting streamer instance destruction (sync)..."),this._isDestroyed=!0,this._initialized=!1,this._isRemoved=!0,this.DEV_MODE&&"StormStreamerArray"in window&&(window.StormStreamerArray[this._streamerID]=null),this.stopAllGraphs(),this._graphs=[],this._networkController&&(null!=(e=this._logger)&&e.info(this,"🔴 [DESTROY] Destroying NetworkController..."),this._networkController.destroy(),this._networkController=null),this._streamerController&&(null!=(e=this._logger)&&e.info(this,"🔴 [DESTROY] Destroying StreamerController..."),this._streamerController.destroy(),this._streamerController=null),this._stageController){null!=(e=this._logger)&&e.info(this,"🔴 [DESTROY] Destroying StageController...");try{this._stageController.destroy()}catch(e){}this._stageController=null}this._storageManager=null,this._statsController=null,this.removeAllEventListeners(),null!=(e=this._logger)&&e.success(this,"🔴 [DESTROY] Streamer instance destroyed successfully (sync)")}}}function create(e){return new StormStreamer(e)}StormStreamer.NEXT_STREAMER_ID=0;export{DeviceState,InputDevicesState,PublishState,StormStreamer,create};