vidyoclient-nativewebrtc-sdk
Version:
Native WebRTC SDK for building a full featured video chat app running in the browser
1 lines • 1.62 MB
JavaScript
var A={7:function(A,e,t){var i=this&&this.__createBinding||(Object.create?function(A,e,t,i){void 0===i&&(i=t);var o=Object.getOwnPropertyDescriptor(e,t);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(A,i,o)}:function(A,e,t,i){void 0===i&&(i=t),A[i]=e[t]}),o=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}:function(A,e){A.default=e}),r=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(null!=A)for(var t in A)"default"!==t&&Object.prototype.hasOwnProperty.call(A,t)&&i(e,A,t);return o(e,A),e},n=this&&this.__importDefault||function(A){return A&&A.__esModule?A:{default:A}};Object.defineProperty(e,"__esModule",{value:!0}),e.RendererBase=e.cameraControlsPanelState=e.viewOrientationType=void 0;const s=r(t(2463)),g=r(t(6161)),a=r(t(9959)),C=r(t(5343)),I=r(t(465)),B=r(t(7293)),c=r(t(1934)),E=t(4304),Q=t(5926),l=n(t(3566)),d=t(7636),h=t(2268),u=t(2387),p=t(8681),D=t(5877),y=t(4537),m=r(t(8964)),S=t(8943),R=t(9441),w=n(t(5792)),v="aspectRatioTooHigh",M="aspectRatioTooWide",G="aspectRatioInversed";var N,f;!function(A){A.LANDSCAPE="LANDSCAPE",A.PORTRAIT="PORTRAIT"}(N=e.viewOrientationType||(e.viewOrientationType={})),function(A){A.OPEN="OPEN",A.CLOSE="CLOSE"}(f=e.cameraControlsPanelState||(e.cameraControlsPanelState={})),window.customElements.define("fecc-controls-view",m.default),e.RendererBase=class{constructor(A){this.audioLevelMaxThreshold=-20,this.audioLevelMinThreshold=-90,this.audioLevelDynamicRange=70,this._streamPopups={},this._energyLevelCanvasContext={},this._participantsAudios={},this._blurredVideoTilesTimeouts={},this._currentSinkId=null,this._scaleDownToResolution={1:"1280x720",1.3:"960x540",2:"640x360",2.6:"480x270",4:"320x180",5.3:"240x135",8:"160x90"},this._getOrientation=()=>{const A=(window.screen.orientation||{}).type||window.screen.mozOrientation||window.screen.msOrientation;return"portrait-secondary"===A||"portrait-primary"===A||window.matchMedia("(orientation: portrait)").matches?N.PORTRAIT:"landscape-primary"===A||"landscape-secondary"===A||window.matchMedia("(orientation: landscape)").matches?N.LANDSCAPE:void 0!==A&&void 0},this._onWindowResize=()=>{this._resetFeccControlsPosition(),this._feccControlsUpdateSize()},this._vidyoCore=A,window.addEventListener("unload",(()=>{try{Object.keys(this._streamPopups).forEach((A=>{this._closeStreamPopup(A)}))}catch(A){}})),this._actionsQueue=(0,h.queue)(((A,e)=>{A().then(e).catch(e)}))}get ActivePopupsCount(){return Object.keys(this._streamPopups).length}CreateView(A){this._vidyoCore.EventDispatcher.releaseGroup(s.RenderListeners),window.addEventListener("resize",this._onWindowResize),this._vidyoCore.EventDispatcher.on(this._vidyoCore.Controllers.AdvancedSettingsController.DisableAudioEnergyMonitor.OnChangeEvent,s.RenderListeners,(A=>this._onDisableAudioEnergyMonitorChanged(A))),this._vidyoCore.EventDispatcher.on(B.Events.SpeakerSelected,s.RenderListeners,(A=>this._onSpeakerSelected(A))),this._vidyoCore.EventDispatcher.on(B.Events.SpeakerPrivacyChanged,s.RenderListeners,(A=>this._onSpeakerPrivacyChanged(A))),this._vidyoCore.EventDispatcher.on(B.Events.VideoCropSettingsChanged,s.RenderListeners,(A=>this._onVideoCropSettingsChanged(A))),this._vidyoCore.EventDispatcher.on(B.Events.RecheckEachVideoSize,s.RenderListeners,(()=>this._onRecheckEachVideoSize())),this._vidyoCore.EventDispatcher.on(B.Events.StatisticsUpdate,s.RenderListeners,(()=>{requestAnimationFrame((()=>this._onStatisticsUpdate()))})),this._vidyoCore.EventDispatcher.on(B.Events.UpdateLocalViewLabel,s.RenderListeners,(()=>this._updateLocalViewLabel())),this._vidyoCore.EventDispatcher.on(B.Events.UpdateLocalViewTag,s.RenderListeners,(()=>this._updateLocalViewTag())),this._vidyoCore.EventDispatcher.on(B.Events.UpdateWindowShareViewLabel,s.RenderListeners,(()=>this._updateShareWindowLocalViewLabel("window"))),this._vidyoCore.EventDispatcher.on(B.Events.UpdateMonitorShareViewLabel,s.RenderListeners,(()=>this._updateShareWindowLocalViewLabel("monitor"))),this._vidyoCore.EventDispatcher.on(B.Events.UpdateWindowShareEndLabel,s.RenderListeners,(()=>this._updateShareWindowLocalEndLabel("window"))),this._vidyoCore.EventDispatcher.on(B.Events.UpdateMonitorShareEndLabel,s.RenderListeners,(()=>this._updateShareWindowLocalEndLabel("monitor"))),this._vidyoCore.EventDispatcher.on(B.Events.UpdateCameraControl,s.RenderListeners,(A=>this._onUpdateCameraControl(A))),this._vidyoCore.EventDispatcher.on(B.Events.UpdateSource,s.RenderListeners,(A=>this._onUpdateStreamSource(A))),this._vidyoCore.EventDispatcher.on(C.Events.CameraListChanged,s.RenderListeners,(A=>this._onCameraListChanged(A))),this._vidyoCore.EventDispatcher.on(g.Events.Connected,s.RenderListeners,(()=>this._onConnected())),this._vidyoCore.EventDispatcher.on(this._vidyoCore.Controllers.AdvancedSettingsController.ShowStatisticsOverlay.OnChangeEvent,s.RenderListeners,(()=>this._showStatisticsOverlayChanged())),this._vidyoCore.EventDispatcher.on(I.Events.MicrophoneEnergyLevelUpdate,s.RenderListeners,(A=>this._onMicrophoneEnergyLevelUpdate(A))),this._vidyoCore.EventDispatcher.on(B.Events.UpdateFeccPresetsSelectLabel,s.RenderListeners,(()=>this._updateFeccPanelLabels())),this._vidyoCore.EventDispatcher.on(B.Events.UpdateFeccPresetsLabel,s.RenderListeners,(()=>this._updateFeccPanelLabels())),this._vidyoCore.EventDispatcher.on(B.Events.VideoTileRemoved,s.RenderListeners,(A=>this._onTileRemoved(A))),this._vidyoCore.EventDispatcher.emit(a.Events.CreateView),this._onRecheckEachVideoSizeRef=this._onRecheckEachVideoSize.bind(this),this._parent=this._createParent(A),this._parent&&Q.SizeObserver.Start(this._parent,(()=>this._onRecheckEachVideoSize()))}Destroy(){this._destroyAudioElements()}HardUpdateRenderer(){}_addVideoElement(A,e,t,i,o,r,n,s=!1){let g=i.Id;const a=i.GetVideoTracks()[0]&&"environment"===i.GetVideoTracks()[0].Settings.facingMode;let C=t.name||"",I=t.tag||"",c=C.match(/^&#?[a-z0-9]{2,7};/gi);const E=C.split(" ");let Q="";if(E.length>=2){const A=E[0].match(/^&#?[a-z0-9]{2,7};/gi),e=E[1].match(/^&#?[a-z0-9]{2,7};/gi);Q=`${A?A[0]:E[0][0]||""}${e?e[0]:E[1][0]||""}`}else Q=c?c[0]:C[0]||"";let d={name:C,placeholderLetter:Q.toLocaleUpperCase(),updateGeneration:(t.updateGeneration||1/0).toString(),participantId:`${o}`,streamId:`${g}`,cellId:`${g}`,trackId:`${g}-track`,trackType:r?"local-track":"remote-track",displayCroppedText:t.displayCropped?"displayCropped":"",allowZoomText:t.allowZoom?"allowZoom":"",tag:I},h=document.createElement("div");h.innerHTML=l.default.Format(A,d);let p=h.firstElementChild;if(p&&e){const A=n?"application-type":"video-type";p.classList.add(A),s&&p.classList.add("pinned-video"),t.displayCropped&&this._attachDragEventsToElement(p);let C=document.getElementById("vidyo-global-stats-overlay");if(C?e.insertBefore(p,C):e.appendChild(p),n){let A=p.querySelector(".video-placeholder");A&&A.classList.add("hide"),this._initApplicationPopup(e,p,i,t.name,o,g)}else this._initPinParticipantHandler(p,o);const I=p.querySelector(".stats-overlay");if(I){const A=I.querySelector("button"),e=()=>{I&&A&&(I.classList.contains("show-advanced")?(A.innerText="Show More",I.classList.remove("show-advanced")):(A.innerText="Show Less",I.classList.add("show-advanced")))};A.onclick=e}let c=document.getElementById(d.trackId);if(c){c.autoplay=!0;let A=i.GetMediaStream();c.srcObject=A,setTimeout((()=>c.ended&&c.load())),c.addEventListener("resize",this._onRecheckEachVideoSizeRef);const e=()=>setTimeout((()=>c.load()));c.addEventListener("leavepictureinpicture",(()=>{c.classList.remove("pip-mode"),e()})),c.addEventListener("enterpictureinpicture",(()=>{c.classList.add("pip-mode")})),u.OperatingSystemInfoProvider.IsSafari()&&c.addEventListener("suspend",e,{once:!0}),navigator.userAgent.includes("iPhone")&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")&&c.setAttribute("playsinline","true"),(u.OperatingSystemInfoProvider.IsIOS||u.OperatingSystemInfoProvider.IsIPadOS)&&c.addEventListener("pause",(()=>{c.play().catch((()=>{}))})),r&&a&&c.classList.add("flip-back-video"),c.classList.add("video-loading"),c.addEventListener("play",(()=>{c.classList.remove("video-loading")})),c.addEventListener("loadstart",(()=>{c.classList.add("video-loading")}));let t=!1;if(!r){let A=this._vidyoCore.Controllers.ParticipantController.TryGetParticipant(o);A&&(this._vidyoCore.Controllers.PowerController.IsLowPowerModeEnabled&&!n||(t=A.HasVideoSource()||n,A.HasVideoSource()&&this._initFeccHandler(p,A)))}let g=!1,C=t||!!(r&&i.GetVideoTracks().length&&i.GetVideoTracks()[0].IsActive());p.classList.toggle("video-muted",!C);let I=p.querySelector(".volume-indicator");if(I&&!n){let A,e=!1;if(r)A=this._vidyoCore.Controllers.LocalStreamController.MicrophoneAudioStrem,e=!this._vidyoCore.Controllers.LocalStreamController.IsAudioEnabled();else{const t=this._vidyoCore.Controllers.RemoteStreamController.TryGetParticipantAudioStream(o);t&&(A=t.GetMediaStream());const i=this._vidyoCore.Controllers.ParticipantController.TryGetParticipant(o);i&&(e=!i.HasAudioSource()||i.AudioMuted())}if(A&&!e){const e=r?A.Id:o;this._createEnergyLevelCanvasContext(e,I),g=!0}}this._vidyoCore.EventDispatcher.emitAsync(B.Events.VideoTileAdded,{element:p,isApplication:n,isLocal:r,isPinned:s,participantId:o,audioEnabled:g,videoEnabled:C})}}return p}_updatePinnedDisplayCropped(A){const e=this._parent.querySelectorAll(".video-container.pinned-video");Array.prototype.forEach.call(e,(e=>{A?e.classList.add("displayCropped"):e.classList.remove("displayCropped")}))}_attachDragEventsToElement(A){let e,t,i,o=!1,r=0,n=0,s=()=>{o=!1,e=void 0};A.addEventListener("mousedown",(()=>{A.classList.contains("pinned-video")||A.classList.contains("application-type")||(o=new Promise(((e,o)=>{t=A.querySelector("video"),t?setTimeout((()=>{t&&setTimeout((()=>{if(!t)return void o("Failed to find video element");if(i=t.closest(".video-container"),!i)return void o("Failed to find parent container");let{height:A,width:s}=i.getBoundingClientRect(),{height:g,width:a}=t.getBoundingClientRect();r=Math.abs((a-s)/2),n=Math.abs((g-A)/2),e()}))})):o("Failed to find video element")})).then((()=>{o=!0})))})),A.addEventListener("mouseleave",s),A.addEventListener("mouseup",s),A.addEventListener("mousemove",(A=>{if(!o)return;let i=()=>{if(!e){const i=10;if(!t)return;let o=parseInt(t.style.marginTop,i),r=isNaN(o)?0:o,n=parseInt(t.style.marginLeft,i),s=isNaN(n)?0:n;e={dragStartTop:A.clientY,dragStartLeft:A.clientX,elementTop:r,elementLeft:s}}let i=-1*(e.dragStartLeft-A.clientX)+e.elementLeft,o=-1*(e.dragStartTop-A.clientY)+e.elementTop;i=0===i?0:Math.abs(i)<r?i:i/Math.abs(i)*r,o=0===o?0:Math.abs(o)<n?o:o/Math.abs(o)*n,t&&(t.style.marginLeft=0===i?"":i.toString()+"px",t.style.marginTop=0===o?"":o.toString()+"px")};!0!==o&&o.then?o.then(i):i()}))}_closeStreamPopup(A){this._streamPopups[A]&&(this._streamPopups[A].popup.onbeforeunload=()=>{},this._streamPopups[A].popup.document.body.innerHTML="",this._streamPopups[A].popup.close(),delete this._streamPopups[A])}_createEnergyLevelCanvasContext(A,e){const t=e.getContext("2d");t.fillStyle="green",this._energyLevelCanvasContext[A]={canvas:e,canvasContext:t}}_deleteEnergyLevelCanvasContext(A){delete this._energyLevelCanvasContext[A]}_destroyAudioElements(){Object.keys(this._participantsAudios).forEach((A=>{this._participantsAudios[A].srcObject=null,delete this._participantsAudios[A]})),this._currentSinkId=null}_eachVideoElement(A){if(this._parent){const e=this._parent.querySelectorAll(".vidyo-rendering-container .video-container");Array.prototype.forEach.call(e,A)}}_elementsApplicationForParticipant(A){let e=document.querySelectorAll(`.vidyo-rendering-container .application-type.video-container[data-participant-id='${A}']`);return Array.from(e)}_elementsForParticipant(A){let e=document.querySelectorAll(`.vidyo-rendering-container .video-container[data-participant-id='${A}']`);return Array.from(e)}_elementsVideoForParticipant(A){let e=document.querySelectorAll(`.vidyo-rendering-container .video-grid .video-type.video-container[data-participant-id='${A}']`);return Array.from(e)}_getVideoMediaResolution(A){return{width:A.videoWidth,height:A.videoHeight}}_getVideoTileByDataParticipantId(A,e){return this._vidyoCore.Controllers.RendererController.RenderMode===D.RenderMode.Composite?this._parent.querySelector(`[data-participant-id='${A}']${e}`):this._parent.querySelector(`${e} [data-participant-id='${A}']`)}_isAudioMeterDisabled(A){return!1}_onConnected(){u.OperatingSystemInfoProvider.IsSafari()&&(new Audio).load()}_onRecheckEachVideoSize(){}_onVideoCropSettingsChanged(A){const e=this._parent.querySelectorAll(`[data-participant-id='${A.Id}']`);Array.prototype.forEach.call(e,(e=>{this._setAspectRatioClassToContainer(e,A)}))}_safelyRemoveAllMediaElement(A){this._safelyRemoveVideoElement(A),this._safelyRemoveApplicationElement(A)}_safelyRemoveApplicationElement(A){this._elementsApplicationForParticipant(A).forEach((e=>{this._removeVideoElements(e),this._vidyoCore.EventDispatcher.emitAsync(B.Events.VideoTileRemoved,{element:e,isApplication:!0,participantId:A})}));for(let[e,t]of Object.entries(this._streamPopups))t.participantId===A&&this._closeStreamPopup(e)}_safelyRemoveVideoElement(A){this._deleteEnergyLevelCanvasContext(A),this._elementsVideoForParticipant(A).forEach((e=>{this._removeVideoElements(e),this._vidyoCore.EventDispatcher.emitAsync(B.Events.VideoTileRemoved,{element:e,isApplication:!1,participantId:A})}))}_setAspectRatioClassToContainer(A,e){let t=A.querySelector("video");e.AspectRatio<1?(A.classList.contains(M)&&A.classList.remove(M),A.classList.contains(v)&&A.classList.remove(v),A.classList.contains(G)||A.classList.add(G)):e.AspectRatioRatioType===E.AspectRatioRatioType.Taller?(A.classList.contains(G)&&A.classList.remove(G),A.classList.contains(M)&&A.classList.remove(M),A.classList.contains(v)||A.classList.add(v),t&&(t.style.marginLeft="")):(A.classList.contains(G)&&A.classList.remove(G),A.classList.contains(v)&&A.classList.remove(v),A.classList.contains(M)||A.classList.add(M),t&&(t.style.marginTop=""))}_setSinkId(A,e){return this._pushToAsyncQueue((()=>{if("setSinkId"in A){const t=u.OperatingSystemInfoProvider.IsChrome()||u.OperatingSystemInfoProvider.IsEdge();return!t&&"default"===e||t&&e===this._currentSinkId?Promise.resolve(void 0):A.setSinkId(e).then((()=>{this._currentSinkId=e})).catch((e=>{if(["AbortError: The operation could not be performed and was aborted"].indexOf(e.toString())<0)throw new Error(`Failed to set speaker for ${A.id}. ${e}`)}))}return A.sinkId=e,Promise.resolve(void 0)}))}_updateAudioStreams(){const A=this._vidyoCore.Controllers.ParticipantController.GetParticipants({Origin:"remote"}).map((A=>A.Id)),e=[];A.forEach((A=>{let t=this._vidyoCore.Controllers.RemoteStreamController.TryGetParticipantAudioStream(A);t&&(e.push(t.Id),this._updateParticipantAudioStream(t))})),Object.keys(this._participantsAudios).forEach((A=>{-1===e.indexOf(A)&&(this._participantsAudios[A].srcObject=null,delete this._participantsAudios[A])})),w.default.IsEmpty(this._participantsAudios)&&(this._currentSinkId=null)}_updateAudioStreamSource(A){this._updateParticipantAudioStream(A)}_removeCameraControls(A,e){let t;if(t=A?A.querySelector("fecc-controls-view"):this._parent.querySelector(`fecc-controls-view[data-participantid="${e}"]`),t&&t.dataset.participantid===e){const e=A||t.closest(".js-vidyo-rendering-container");t.remove(),this._vidyoCore.EventDispatcher.emitAsync(B.Events.CameraControlsPanelStateChange,{state:f.CLOSE}),e&&e.classList.remove("fecc-open")}}_onTileRemoved(A){A?.participantId&&!document.getElementById(A?.element?.id)&&this._removeCameraControls(null,A.participantId)}_updateCameraControl(A,e,t,i){const o=A.closest(".js-vidyo-rendering-container");t&&e||this._removeCameraControls(o,i.Id),e&&o&&this._vidyoCore.Controllers.DeviceController.GetCameraControlCapabilities(e).then((A=>{if(A&&(A.panTiltHasContinuousMove||A.zoomHasContinuousMove||A.panTiltHasNudge||A.zoomHasNudge)&&t){let t=null,r=!1;const n=o.querySelector("fecc-controls-view");if(n){if(n.dataset.participantid===i.Id)return;n.remove(),this._vidyoCore.EventDispatcher.emitAsync(B.Events.CameraControlsPanelStateChange,{state:f.CLOSE})}const s=document.createElement("fecc-controls-view");(u.OperatingSystemInfoProvider.IsMobileDevice()&&this._getOrientation()===N.LANDSCAPE||this._vidyoCore.Controllers.RendererController.RenderMode===D.RenderMode.Custom)&&s.SetCompactView(!0),s.Presets=this._vidyoCore.Controllers.DeviceController.GetCameraPresets(e),s.PanelTitle=i.Name,s.PresetsSelectTitle=this._vidyoCore.Controllers.RendererController.FeccPresetsSelectLabel,s.PresetsTitle=this._vidyoCore.Controllers.RendererController.FeccPresetsLabel,s.classList.add("tile-control-view","fecc-controls"),s.setAttribute("data-participantid",i.Id),o.appendChild(s),o.classList.add("fecc-open"),this._vidyoCore.EventDispatcher.emitAsync(B.Events.CameraControlsPanelStateChange,{state:f.OPEN});const g=(A,i=y.FeccMoveInterval)=>{r=!0,t=R.TimingProvider.Interval(i,(()=>{this._vidyoCore.Controllers.DeviceController.ControlRemoteCameraPTZStart(e,{timeout:y.FeccMoveDurationNs,direction:A})}),!0)},a=i=>{const o=A.hasVisca?y.FeccMoveInterval:y.FeccNudgeInterval;t=R.TimingProvider.Interval(o,(()=>{this._vidyoCore.Controllers.DeviceController.ControlRemoteCameraPTZNudge(e,i)}),!0)},C=()=>{clearInterval(t),r&&(this._vidyoCore.Controllers.DeviceController.ControlRemoteCameraPTZStop(e),r=!1)};s.handleAction=r=>{switch(clearInterval(t),this._vidyoCore.Controllers.LogController.LogDebug((()=>`Handle FECC action: ${JSON.stringify(r.detail)}`)),r.detail.type){case m.FeccPanelAction.CLOSE:i.IsControlled=!1,s.remove(),o.classList.remove("fecc-open"),this._vidyoCore.EventDispatcher.emitAsync(B.Events.CameraControlsPanelStateChange,{state:f.CLOSE});break;case m.FeccPanelAction.CHOSEPRESET:r.detail.value&&this._vidyoCore.Controllers.DeviceController.RemoteCameraActivatePreset(e,{index:r.detail.value});break;case m.FeccControlAction.PANLEFT:A.panTiltHasContinuousMove?g(S.VidyoCameraControlDirection.VIDYO_CAMERACONTROLDIRECTION_PanLeft):A.panTiltHasNudge&&a({pan:-1});break;case m.FeccControlAction.PANRIGHT:A.panTiltHasContinuousMove?g(S.VidyoCameraControlDirection.VIDYO_CAMERACONTROLDIRECTION_PanRight):A.panTiltHasNudge&&a({pan:1});break;case m.FeccControlAction.TILTUP:A.panTiltHasContinuousMove?g(S.VidyoCameraControlDirection.VIDYO_CAMERACONTROLDIRECTION_TiltUp):A.panTiltHasNudge&&a({tilt:1});break;case m.FeccControlAction.TILTDOWN:A.panTiltHasContinuousMove?g(S.VidyoCameraControlDirection.VIDYO_CAMERACONTROLDIRECTION_TiltDown):A.panTiltHasNudge&&a({tilt:-1});break;case m.FeccControlAction.ZOOMIN:A.zoomHasContinuousMove?g(S.VidyoCameraControlDirection.VIDYO_CAMERACONTROLDIRECTION_ZoomIn):A.zoomHasNudge&&a({zoom:1});break;case m.FeccControlAction.ZOOMOUT:A.zoomHasContinuousMove?g(S.VidyoCameraControlDirection.VIDYO_CAMERACONTROLDIRECTION_ZoomOut):A.zoomHasNudge&&a({zoom:-1});break;case m.FeccControlAction.STOP:default:C()}}}else this._removeCameraControls(o,i.Id)}))}_updateParticipantAudioStream(A){const e=this._vidyoCore.Controllers.DeviceController.GetSelectedDevices().Speaker,t=this._vidyoCore.Controllers.DeviceController.GetSpeakerMuteState();let i=this._participantsAudios[A.Id];u.OperatingSystemInfoProvider.IsSafari()&&u.OperatingSystemInfoProvider.IsMobileOrTabletDevice()?!t&&"boolean"!=typeof e&&e.Id?(i||(i=this._createParticipantAudio(A),this._participantsAudios[A.Id]=i),this._setSinkId(i,e.Id),i.ended&&i.load()):i&&(i.srcObject=null,delete this._participantsAudios[A.Id]):(i||(i=this._createParticipantAudio(A),this._participantsAudios[A.Id]=i),"boolean"!=typeof e&&e.Id?(i.muted=t,this._setSinkId(i,e.Id)):i.muted=!0,i.ended&&i.load())}_createParticipantAudio(A){const e=A.GetMediaStream(),t=new Audio;if(t.id=A.Id,t.autoplay=!0,t.srcObject=e,(u.OperatingSystemInfoProvider.IsChrome()||u.OperatingSystemInfoProvider.IsEdge())&&e.addEventListener("addtrack",(()=>{t.load(),this._vidyoCore.Controllers.P2PController.IsConnected&&t.addEventListener("loadedmetadata",(()=>{t.load()}),{once:!0})})),u.OperatingSystemInfoProvider.IsSafari()&&t.addEventListener("pause",(()=>{this._vidyoCore.Controllers.LogController.LogDebug((()=>`Force reload paused <audio id=${t.id}>`)),t.play()})),t.addEventListener("loadedmetadata",(()=>t.ended&&t.load())),this._vidyoCore.Controllers.LogController.IsLevelAndCategoryEnabled(p.VidyoLogLevel.debug,p.VidyoLogCategory.VidyoDevelopment)){let A=e.getTracks()[0],i="-1";A&&(i=A.id,A.onmute=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned ${A.kind} track ${i} muted`),p.VidyoLogCategory.VidyoDevelopment),A.onunmute=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned ${A.kind} track ${i} unmuted`),p.VidyoLogCategory.VidyoDevelopment)),t.onplaying=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} playing`),p.VidyoLogCategory.VidyoDevelopment),t.onwaiting=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} waiting`),p.VidyoLogCategory.VidyoDevelopment),t.onseeking=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} seeking`),p.VidyoLogCategory.VidyoDevelopment),t.onseeked=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} seeked`),p.VidyoLogCategory.VidyoDevelopment),t.onended=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} ended`),p.VidyoLogCategory.VidyoDevelopment),t.onloadeddata=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} loadeddata`),p.VidyoLogCategory.VidyoDevelopment),t.oncanplay=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} canplay`),p.VidyoLogCategory.VidyoDevelopment),t.oncanplaythrough=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} canplaythrough`),p.VidyoLogCategory.VidyoDevelopment),t.ondurationchange=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} durationchange`),p.VidyoLogCategory.VidyoDevelopment),t.ontimeupdate=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} timeupdate`),p.VidyoLogCategory.VidyoDevelopment),t.onplay=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} play`),p.VidyoLogCategory.VidyoDevelopment),t.onpause=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} pause`),p.VidyoLogCategory.VidyoDevelopment),t.onratechange=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} ratechange`),p.VidyoLogCategory.VidyoDevelopment),t.onvolumechange=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} volumechange`),p.VidyoLogCategory.VidyoDevelopment),t.onsuspend=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} suspend`),p.VidyoLogCategory.VidyoDevelopment),t.onemptied=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} emptied`),p.VidyoLogCategory.VidyoDevelopment),t.onstalled=()=>this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} stalled`),p.VidyoLogCategory.VidyoDevelopment),t.onloadedmetadata=()=>{this._vidyoCore.Controllers.LogController.LogDebug((()=>`IOWEBRTC-1317 cloned audio track ${i} loadedmetadata`),p.VidyoLogCategory.VidyoDevelopment),t.ended&&t.load()}}return t}_createApplicationPopup(A,e,t,i,o){let r=window.open("","","width=1280,height=720,status=0,menubar=0,toolbar=0,location=0");if(r){const n=e.getAttribute("data-participant-id"),a=e.cloneNode(!0),C=document.createElement("title");C.innerHTML=o,r.document.head.appendChild(C);const I=document.createElement("style");I.innerHTML=c.streamPopupStyle,r.document.head.appendChild(I);const E=a.querySelector("video");r.document.body.appendChild(a);const Q=a.querySelector(".popup-application img");Q.src=c.dockSVGImage;const d=a.querySelector(".stats-overlay"),h=()=>{r&&(r.document.body.innerHTML="",r.close())},p=()=>{const A=this._vidyoCore.Controllers.AdvancedSettingsController.ShowStatisticsOverlay.Value;if(!A)return;const e=this._vidyoCore.Controllers.StatisticsController.GetCallStats().ShareStatistics.Get(n);if(e&&d){e.ActualTileSize.SetValues(E.clientWidth,E.clientHeight),d.style.display=A?"block":"none";const t=["AudioDecodingMuted","AudioDecodingNormal","ParticipantIsActive","SSRCs"],i=this._statisticsToFormattedHTML(e,t,"screen");d.firstElementChild.innerHTML=l.default.Format(c.statisticsOverlayBlock,{lines:i})}},D=A=>{const e=a.querySelector(".video-display-name-wrapper");e&&e.classList.toggle("label-hidden",!A.showLabel)},y=(A,e)=>{this._vidyoCore.EventDispatcher.emitAsync(B.Events.VideoTileAdded,{element:A,participantId:n,audioEnabled:!1,videoEnabled:!A.classList.contains("video-muted"),isLocal:A.classList.contains("local-track"),isApplication:!0,isPinned:!1,isUndocked:e})},m=A=>{this._vidyoCore.EventDispatcher.emitAsync(B.Events.VideoTileRemoved,{element:A,isApplication:!0,participantId:n})};let S;const R=()=>{clearTimeout(S),r.onload=null,y(a,!0),this._onRecheckEachVideoSize(),this._vidyoCore.EventDispatcher.on(B.Events.StatisticsUpdate,s.RenderListeners,p),this._vidyoCore.EventDispatcher.on(B.Events.UpdateViewLabel,s.RenderListeners,D),this._vidyoCore.EventDispatcher.once(g.Events.Disconnecting,s.RenderListeners,h)};S=window.setTimeout(R,1e3),Q.onclick=h,setTimeout((()=>{E.srcObject=t.GetMediaStream()}),0),A.removeChild(e),m(e);const w=()=>{if(r.onbeforeunload=null,r.onpagehide=null,r.document.body.innerHTML="",this._vidyoCore.EventDispatcher.off(B.Events.StatisticsUpdate,p),this._vidyoCore.EventDispatcher.off(B.Events.UpdateViewLabel,D),m(a),this._streamPopups[i]&&delete this._streamPopups[i],this._vidyoCore.Controllers.CallStateController.MediaState.ShouldTransmitMedia){A.appendChild(e),y(e,!1);const i=e.querySelector("video"),o=()=>i&&t.IsActive;u.OperatingSystemInfoProvider.IsSafari()?setTimeout((()=>o()&&i.load()),250):o()&&i.play().catch((A=>{this._vidyoCore.Controllers.LogController.LogError((()=>`Unable to play a video. ${A}`))})),this._onRecheckEachVideoSize(),this._vidyoCore.EventDispatcher.emitAsync(B.Events.Update)}};r.onbeforeunload=w,r.onpagehide=w}return r}_initApplicationPopup(A,e,t,i,o,r){let n=e.querySelector(".popup-application");n&&(n.classList.remove("hide"),n.addEventListener("click",(()=>{let n=this._createApplicationPopup(A,e,t,r,i);n&&(this._onRecheckEachVideoSize(),this._streamPopups[r]={element:e,participantId:o,popup:n})})))}_initPinParticipantHandler(A,e){let t=A.querySelector(".pin-participant");t&&(t.classList.remove("hide"),t.addEventListener("click",(()=>{const t=A.closest(".js-vidyo-rendering-container");t&&this._removeCameraControls(t,A.dataset.participantId),this._vidyoCore.Controllers.ParticipantController.TogglePinParticipant(e)})))}_handleCallbackForFeccPanels(A){const e=this._parent.querySelectorAll("fecc-controls-view");e.length&&e.forEach((e=>{e&&A(e)}))}_resetFeccControlsPosition(){this._handleCallbackForFeccPanels((A=>{A.ResetPosition()}))}_feccControlsUpdateSize(){const A=this._getOrientation();u.OperatingSystemInfoProvider.IsMobileDevice()&&A===N.LANDSCAPE?this._handleCallbackForFeccPanels((A=>{A.SetCompactView(!0)})):this._handleCallbackForFeccPanels((A=>{A.SetCompactView(!1)}))}_updateFeccPanelLabels(){this._handleCallbackForFeccPanels((A=>{A.PresetsSelectTitle=this._vidyoCore.Controllers.RendererController.FeccPresetsSelectLabel,A.PresetsTitle=this._vidyoCore.Controllers.RendererController.FeccPresetsLabel}))}_initFeccHandler(A,e){const t=A.querySelector(".control-participant"),i=e.GetCameraId();t?i?this._vidyoCore.Controllers.DeviceController.IsRemoteCameraControllable(i).then((o=>{t.classList.toggle("hide",!o),o?(this._updateCameraControl(A,i,e.IsControlled,e),t.ondblclick=A=>A.stopPropagation(),t.onclick=t=>{e.IsControlled=!e.IsControlled,e.IsPinned||this._vidyoCore.Controllers.ParticipantController.PinParticipant(e.Id,!0),this._updateCameraControl(A,i,e.IsControlled,e),t.stopPropagation()}):this._updateCameraControl(A,null,!1,e)})):(this._updateCameraControl(A,null,!1,e),t.onclick=null,t.classList.add("hide"),e.IsControlled=!1):this._updateCameraControl(A,null,!1,e)}_onCameraListChanged(A){const e=this._vidyoCore.Controllers.ParticipantController.TryGetParticipant(A.participantUri),t=this._getVideoTileByDataParticipantId(A.participantUri,".video-type");e&&t&&this._initFeccHandler(t,e)}_onMicrophoneEnergyLevelUpdate(A){const e=A.isLocal?d.LocalParticipantId:A.participant.Id;if(!this._isAudioMeterDisabled(e))if(A.isLocal){const e=this._vidyoCore.Controllers.LocalStreamController.MicrophoneAudioStrem;e&&this._updateEnergyLevel(e.Id,A.audioLevel)}else A.participant&&this._updateEnergyLevel(A.participant.Id,A.audioLevel)}_onUpdateCameraControl(A){const e=this._vidyoCore.Controllers.ParticipantController.TryGetParticipant(A.participantId);if(e){const t=this._getVideoTileByDataParticipantId(e.Id,".video-type");if(t){const i=e.GetCameraId();this._updateCameraControl(t,i,A.show,e)}}}_onSpeakerPrivacyChanged(A){if(u.OperatingSystemInfoProvider.IsSafari()&&u.OperatingSystemInfoProvider.IsMobileOrTabletDevice())A?this._destroyAudioElements():this._updateAudioStreams();else{const e=this._vidyoCore.Controllers.DeviceController.GetSelectedDevices().Speaker;Object.keys(this._participantsAudios).forEach((t=>{const i=this._participantsAudios[t];!A&&"boolean"!=typeof e&&e.Id?(i.muted=!1,this._setSinkId(i,e.Id),i.ended&&i.load()):i.muted=!0}))}}_onSpeakerSelected(A){const e=this._vidyoCore.Controllers.DeviceController.GetSpeakerMuteState();u.OperatingSystemInfoProvider.IsSafari()&&u.OperatingSystemInfoProvider.IsMobileOrTabletDevice()?e||this._updateAudioStreams():Object.keys(this._participantsAudios).forEach((t=>{const i=this._participantsAudios[t];A.speakerId?(i.muted=e,this._setSinkId(i,A.speakerId)):i.muted=!0}))}_onStatisticsUpdate(){const A=this._vidyoCore.Controllers.AdvancedSettingsController.ShowStatisticsOverlay.Value;let e=this._vidyoCore.Controllers.StatisticsController.GetCallStats(),t=[];const i=(A,e)=>{const t=this._getVideoTileByDataParticipantId(A,e);return t?{videoTile:t,statsOverlay:t.querySelector(".stats-overlay")}:{}};if(e.ParticipantStatistics.All().forEach((e=>{const{videoTile:o,statsOverlay:r}=i(e.Id,".video-type");if(e.VideoFrameRateDecoded.Value<=1&&e.VideoResolutionReceived.Values.every((A=>A>0))){if(!(e.Id in this._blurredVideoTilesTimeouts)){const A=3e3;this._blurredVideoTilesTimeouts[e.Id]=setTimeout((()=>{o?.classList.add("blurred")}),A)}}else this._blurredVideoTilesTimeouts[e.Id]&&(clearTimeout(this._blurredVideoTilesTimeouts[e.Id]),delete this._blurredVideoTilesTimeouts[e.Id],o?.classList.remove("blurred"));if(A)if(r){this._setElementVisible(r,A),e.ActualTileSize.SetValues(o?.clientWidth,o?.clientHeight);const t=["AudioDecodingMuted","AudioDecodingNormal","ParticipantIsActive","SSRCs"],i=this._statisticsToFormattedHTML(e,t,"remote");r.firstElementChild.innerHTML=l.default.Format(c.statisticsOverlayBlock,{lines:i})}else{let A=`${e.AudioBytesReceived} audio bytes`,i=`${e.VideoPacketsReceived} video packets`;t.push([`Orphaned stream '${e.Id}'`,`${A}, ${i}`])}})),!A)return;e.ShareStatistics.All().forEach((e=>{const{videoTile:o,statsOverlay:r}=i(e.Id,".application-type");if(e.ActualTileSize.SetValues(o?.clientWidth,o?.clientHeight),r){this._setElementVisible(r,A);const t=["AudioDecodingMuted","AudioDecodingNormal","ParticipantIsActive","SSRCs"],i=this._statisticsToFormattedHTML(e,t,"screen");r.firstElementChild.innerHTML=l.default.Format(c.statisticsOverlayBlock,{lines:i})}else{let A=`${e.VideoPacketsReceived} video packets`;t.push([`Orphaned stream '${e.Id}'`,`${A}`])}}));let o=this._vidyoCore.Controllers.LocalStreamController.CameraVideoStream,r=this._parent.querySelectorAll(`[data-participant-id='${o.Id}'] .stats-overlay`)[0];if(r)if(this._setElementVisible(r,A),A){const A=["ShareStatistics","ParticipantStatistics","FillFromBandwidthSummaryStatistics","FillFromLocalMicrophoneStatistics","FillFromLocalVideoSourceStatistics","_activeParticipantsStatistics","_calculateStatisticsTotalBy"],i=this._statisticsToFormattedHTML(e,A,"local"),o=(this._statisticsToFormattedHTML(t,[],""),`${i}`);r.firstElementChild.innerHTML=l.default.Format(c.statisticsOverlayBlock,{lines:o})}else r.firstElementChild.innerHTML=""}_onUpdateStreamSource(A){const e=this._vidyoCore.Controllers.ParticipantController.TryGetParticipant(A),t=this._getVideoTileByDataParticipantId(A,".video-type");e&&t&&this._initFeccHandler(t,e)}_pushToAsyncQueue(A){return new Promise(((e,t)=>{this._actionsQueue.push(A,(A=>{A?t(A):e()}))}))}_removeVideoElement(A){A.removeEventListener("resize",this._onRecheckEachVideoSizeRef),document.pictureInPictureEnabled&&A===document.pictureInPictureElement&&document.exitPictureInPicture(),A.pause&&(A.pause(),A.src="",A.srcObject=null,A.load())}_removeVideoElements(A){const e=A.parentElement;if(e){let t=A.getElementsByTagName("video");Array.prototype.forEach.call(t,(A=>{this._removeVideoElement(A)})),e.removeChild(A)}}_setElementVisible(A,e){e?A.classList.remove("hide"):A.classList.add("hide")}_statisticsToArray(A,e=[]){let t=[];for(let i in A)e.indexOf(i)<0&&t.push([i,A[i].toString()]);return t}_statisticsToFormattedHTML(A,e=[],t){const i=this._statisticsToArray(A,e);let o;if(""==t)return i.map((A=>{let[e,t]=this._transformStatisticsOutputLine(A);return l.default.Format(c.statisticsBlockLine,{statKey:e,statValue:t})})).join("\n");let r=[];i.map((A=>{let[e,t]=this._transformStatisticsOutputLine(A);r.push([e,t])})),"local"==t?o=this._parseCallStatisticsData(r):"remote"==t?o=this._parseCallStatisticsDataParticipant(r):"screen"==t&&(o=this._parseCallStatisticsDataScreenShare(r));const n=this._generateTable(o).outerHTML,s=document.createElement("div");return s.classList.add("overlay-stats-colors"),s.innerHTML=n,s.outerHTML}_parseCallStatisticsData(A){const e=this._statisticsDataToKeyPairValue(A),t=JSON.parse(e.VideoRunnels).map((A=>`[${Object.values(A).map(((A,e)=>1===e&&"number"==typeof A?this._scaleDownToResolution[Math.floor(10*A)/10]:JSON.stringify(A))).join(", ")}]`)).join("\n");return{Bandwidth:{Send:e.AvailableSendBandwidth,Receive:e.AvailableRecieveBandwidth},Audio:{Codec:e.AudioCodec,Level:e.AudioLevel+" dB",BytesSent:e.AudioBytesSent,PacketsLost:e.AudioPacketsLost},Video:{Codec:e.VideoCodec,Resolution:e.VideoResolutionSent,"FPS Sent":e.VideoFrameRateSent,"FPS Input":e.VideoFrameRateInput,Bitrate:e.TransmitBitrate,QualityLimitedBy:""==e.VideoQualityLimitationReason?"N/A":e.VideoQualityLimitationReason},Network:{IP:e.Ip,P2P:e.P2PConnection,TURN:e.UsingTurnServer},Advanced:{SVC:{Layers:t,ScalabilityMode:e.ScalabilityMode,EncoderType:"true"===e.PowerEfficientEncoder?"Hardware":"Software",IFrames:e.VideoCodecIFrames,PacketsLost:e.VideoPacketsLost,BytesSent:e.VideoBytesSent,PLis:e.PlisReceived,Nacks:e.NacksReceived,Firs:e.FirsReceived},ID:e.Id}}}_parseCallStatisticsDataParticipantOrScreenshare(A,e){const t=this._statisticsDataToKeyPairValue(A),i={Codec:t.VideoCodec,Resolution:{Requested:t.VideoResolutionRequested,Received:t.VideoResolutionReceived,TileSize:t.ActualTileSize},FPS:{Received:t.VideoFrameRateReceived,Decoded:t.VideoFrameRateDecoded},Bitrate:t.VideoReceiveNetworkBitRate,Advanced:{DecoderInfo:{Decoder:t.Decoder,DecoderType:"true"===t.PowerEfficientDecoder?"Hardware":"Software",FrameDecodeTime:t.VideoFrameDecodeTime},IFrames:t.VideoCodecIFrames,PacketsReceived:t.VideoPacketsReceived,PacketsLost:t.VideoPacketsLost,PLis:t.PlisSent,Nacks:t.NacksSent,Firs:t.FirsSent,ID:t.Id}};return e?{Video:i}:{Audio:{Codec:t.AudioCodec,"Bytes Received":t.AudioBytesReceived},Video:i}}_statisticsDataToKeyPairValue(A){const e={};for(const[t,i]of A)e[t]=i;return e}_parseCallStatisticsDataParticipant(A){return this._parseCallStatisticsDataParticipantOrScreenshare(A,!1)}_parseCallStatisticsDataScreenShare(A){return this._parseCallStatisticsDataParticipantOrScreenshare(A,!0)}_generateTable(A){const e=document.createElement("table"),t=(e.createTHead(),e.createTBody());return function A(e,i="",o=""){for(let r in e){const n=e[r],s=t.insertRow(),g=s.insertCell(),a=s.insertCell();"Advanced"===r&&(s.style.display="none");const C=""===i;C||""!==i&&"object"==typeof n?g.innerHTML=`<br><b>${r}</b>`:g.textContent=`${r}`,"object"==typeof n?A(n,C?r:`${r}`,i):a.textContent=n,"Advanced"!==i&&"Advanced"!==o||s.setAttribute("advanced","advanced")}}(A),e}_transformStatisticsOutputLine([A,e]){const t=A=>{let e=parseFloat(A),t=["Kbit/s","Mbit/s","Gbit/s"],i=`${e} bit/s`;for(let A of t){if(!(e>=1e3))break;e/=1e3,i=`${Math.round(100*e)/100} ${A}`}return i},i={AvailableRecieveBandwidth:t,AvailableSendBandwidth:t,TransmitBitrate:t,VideoReceiveNetworkBitRate:t};return"function"==typeof i[A]&&(e=i[A](e)),[A,e]}_updateEnergyLevel(A,e){if(this._energyLevelCanvasContext[A]){const{canvas:t,canvasContext:i}=this._energyLevelCanvasContext[A];if(t&&i){let A=Math.max(e,this.audioLevelMinThreshold);A=Math.min(A,this.audioLevelMaxThreshold)-this.audioLevelMinThreshold;const o=A/this.audioLevelDynamicRange;i.clearRect(0,0,t.width,t.height),i.fillRect(0,0,t.width*o,t.height)}}}_updateLocalViewLabel(){const A=this._vidyoCore.Controllers.LocalStreamController.CameraVideoStream,e=this._parent.querySelector(`[data-stream-id='${A.Id}']`),t=this._vidyoCore.Controllers.DeviceController.GetSelectedDevices().Camera,i=this._vidyoCore.Controllers.ParticipantController.GetLocalParticipant();let o=this._vidyoCore.Controllers.UserController.UserDisplayName()||(i||{}).Name||"Preview";if("boolean"!=typeof t&&t.PreviewLabel&&(o=t.PreviewLabel),e){const A=e.querySelector(".video-display-name .video-display-name-main");A&&(A.innerHTML=l.default.toSecureString(o));const t=e.querySelector("div.text");t&&(t.innerHTML=l.default.toSecureString(o)[0])}}_updateLocalViewTag(){const A=this._vidyoCore.Controllers.LocalStreamController.CameraVideoStream,e=this._parent.querySelector(`[data-stream-id='${A.Id}']`),t=this._vidyoCore.Controllers.DeviceController.GetSelectedDevices().Camera;let i=null;if("boolean"!=typeof t&&t.PreviewTag&&(i=t.PreviewTag),e){const A=e.querySelector(".video-display-name .video-display-name-tag");A&&i&&(A.innerHTML=l.default.toSecureString(i))}}_updateShareWindowLocalViewLabel(A){let e,t;"window"===A?(e=this._vidyoCore.Controllers.LocalStreamController.WindowShareStream,t=this._vidyoCore.Controllers.DeviceController.GetWindowSharePreviewLabel()):(e=this._vidyoCore.Controllers.LocalStreamController.MonitorShareStream,t=this._vidyoCore.Controllers.DeviceController.GetMonitorSharePreviewLabel());const i=this._parent.querySelector(`[data-stream-id='${e.Id}']`);if(i){const A=i.querySelector(".video-display-name .video-display-name-main");A&&(A.innerHTML=l.default.toSecureString(t));const e=i.querySelector("div.text");e&&(e.innerHTML=l.default.toSecureString(t)[0])}}_updateShareWindowLocalEndLabel(A){let e,t;"window"===A?(e=this._vidyoCore.Controllers.LocalStreamController.WindowShareStream,t=this._vidyoCore.Controllers.DeviceController.GetWindowShareEndLabel()):(e=this._vidyoCore.Controllers.LocalStreamController.MonitorShareStream,t=this._vidyoCore.Controllers.DeviceController.GetMonitorShareEndLabel());const i=this._parent.querySelector(`[data-stream-id='${e.Id}']`);if(i){const A=i.querySelector(".end-share");A&&(A.innerHTML=l.default.toSecureString(t))}}_onDisableAudioEnergyMonitorChanged(A){A?(this._vidyoCore.Controllers.LogController.LogDebug((()=>"Stopping audio energy monitoring for renderer")),this._eachVideoElement((A=>{let e=A.querySelector(".volume-indicator");if(e){let A=e.getContext("2d");A&&A.clearRect(0,0,e.width,e.height)}}))):this._vidyoCore.Controllers.LogController.LogDebug((()=>"Start audio energy monitoring for renderer"))}_showStatisticsOverlayChanged(){const A=this._vidyoCore.Controllers.AdvancedSettingsController.ShowStatisticsOverlay.Value;this._parent?.querySelectorAll(".stats-overlay").forEach((e=>{this._setElementVisible(e,A)}))}}},52:function(A,e,t){var i=this&&this.__decorate||function(A,e,t,i){var o,r=arguments.length,n=r<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,t):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(A,e,t,i);else for(var s=A.length-1;s>=0;s--)(o=A[s])&&(n=(r<3?o(n):r>3?o(e,t,n):o(e,t))||n);return r>3&&n&&Object.defineProperty(e,t,n),n},o=this&&this.__importDefault||function(A){return A&&A.__esModule?A:{default:A}};Object.defineProperty(e,"__esModule",{value:!0}),e.UserMediaProvider=void 0;const r=t(4537),n=t(8382),s=t(2449),g=t(904),a=t(3110),C=t(2387),I=t(8943);t(6674);const B=o(t(8751)),c=t(8621);class E{constructor(A,e){this._vidyoCore=A,this._logger=e,this._windowShareQueue=[],this._videoStreamInterceptor=null,this._audioStreamInterceptor=null}static get Constraints(){return E._constraints}static get DefaultCameraDeviceId(){return E.defaultCameraDeviceID}static get BrowserSupportsPTZ(){return E._browserSupportsPTZ}static async CameraDeviceSupportsPTZ(A){let e=!1;if(E._browserSupportsPTZ){const t={deviceId:{exact:A},...E._ptzCapabilities};try{const A=await g.MediaDevicesProvider.GetMediaDevices().getUserMedia({video:t}),i=A.getVideoTracks()[0];if(i&&i.getCapabilities()){const A=i.getCapabilities();e=["pan","tilt","zoom"].some((e=>A[e]))}A.getTracks().forEach((A=>A.stop()))}catch(A){e=null}return Promise.resolve(e)}return Promise.resolve(e)}GetAudioTrack(A=!0,e,t){let i={audio:E._constraints.audio};return E._constraints.audio&&A instanceof a.Microphone&&A.Id&&(i.audio={deviceId:{exact:A.Id}},A.SignalType===I.VidyoDeviceAudioSignalType.VIDYO_DEVICEAUDIOSIGNALTYPE_Unprocessed&&(i.audio.autoGainControl=!1,i.audio.echoCancellation=!1,i.audio.noiseSuppression=!1)),g.MediaDevicesProvider.GetMediaDevices().getUserMedia(i).then((async A=>{const i=await(async A=>{if(t&&this._audioStreamInterceptor)try{const e=await this._audioStreamInterceptor(A);return this._vidyoCore.Controllers.LogController.LogWarning((()=>"Use modified audio stream")),e.getTracks()[0]?.addEventListener("ended",(()=>{A.getTracks().forEach((A=>A.stop()))}),{once:!0}),e}catch(A){this._vidyoCore.Controllers.LogController.LogError((()=>`${A}. Fallback to the original audio stream`))}return A})(A),o=(e?e(i):i).getAudioTracks()[0];if(!o)throw n.CouldNotGetAudioTrack;return o})).catch((()=>null))}GetVideoTrack(A=!0,e){let t={width:r.DefaultLocalStreamWidth,height:r.DefaultLocalStreamHeight,frameRate:r.DefaultLocalStreamFrameRate};E._browserSupportsPTZ&&Object.assign(t,E._ptzCapabilities),e&&Object.assign(t,e);let i=E._constraints.video?{video:t}:{video:!1},o=0;if(t.frameRate){const A=t.frameRate;t.frameRate={max:A,ideal:A}}E._constraints.video&&A instanceof s.Camera&&A.Id&&(i.video=Object.assign({},t,{deviceId:{exact:A.Id}}));const a=A=>g.MediaDevicesProvider.GetMediaDevices().getUserMedia(A).then((A=>{if(this._videoStreamInterceptor)try{return this._videoStreamInterceptor(A).then((e=>(this._vidyoCore.Controllers.LogController.LogWarning((()=>"Use modified stream")),e.getTracks()[0]?.addEventListener("ended",(()=>{A.getTracks().forEach((A=>A.stop()))}),{once:!0}),Promise.resolve(e)))).catch((e=>(this._vidyoCore.Controllers.LogController.LogError((()=>`${e}. Fallback to the original stream`)),Promise.resolve(A))))}catch(e){return this._vidyoCore.Controllers.LogController.LogError((()=>`${e}. Fallback to the original stream`)),Promise.resolve(A)}return Promise.resolve(A)})).then((A=>{let e=A.getVideoTracks()[0];if(!e)throw n.CouldNotGetVideoTrack;return e})).catch((e=>(this._logger.LogError((()=>`GetVideoTrack failed with ${e.name}: ${e.message}`)),"NotReadableError"===e.name&&o<E.getVideoTrackRetriesLimit?(++o,new Promise(((e,t)=>{setTimeout((()=>{this._logger.LogDebug((()=>`Retry GetVideoTrack - attempt ${o}/${E.getVideoTrackRetriesLimit}`)),a(A).then(e).catch(t)}),E.getVideoTrackRetryDelayMs)}))):Promise.reject(e))));return a(i)}GetWindowShareTrack(A){return"getDisplayMedia"in g.MediaDevicesProvider.GetMediaDevices()?this._getDisplayMediaTrack(A):Promise.reject(n.GetDisplayMediaIsNotSupported)}static InitializeMediaDevices(){const A=g.MediaDevicesProvider.GetMediaDevices();if(A.getSupportedConstraints){const e=A.getSupportedConstraints();Object.keys(E._ptzCapabilities).forEach((A=>{e[A]&&(E._ptzCapabilities[A]=e[A])})),E._browserSupportsPTZ=Object.values(E._ptzCapabilities).some((A=>A))}const{audio:e,video:t}=E._constraints;return A.enumerateDevices().then((i=>{const o=A=>i.some((e=>e.kind===A)),r={audio:e&&o("audioinput"),video:t&&o("videoinput")};return C.OperatingSystemInfoProvider.IsMobileOrTabletDevice()&&t&&o("videoinput")&&(r.video={facingMode:"user"}),r.video&&E._browserSupportsPTZ&&("boolean"==typeof r.video&&(r.video={}),Object.assign(r.video,E._ptzCapabilities)),A.getUserMedia(r).then((A=>(A.getTracks().forEach((A=>{try{if("video"===A.kind){const e=A.getCapabilities();E.defaultCameraDeviceID=e.deviceId}}catch(A){}finally{A.stop()}})),Promise.resolve(!0))))})).catch((()=>Promise.resolve(!1)))}RegisterLocalCameraStreamInterceptor(A){return"function"==typeof A?(this._videoStreamInterceptor=A,Promise.resolve(!0)):Promise.resolve(!1)}RegisterLocalMicrophoneStreamInterceptor(A){return"function"==typeof A?(this._audioStreamInterceptor=A,Promise.resolve(!0)):Promise.resolve(!1)}UnregisterLocalCameraStreamInterceptor(){return this._videoStreamInterceptor?(this._videoStreamInterceptor=null,Promise.resolve(!0)):Promise.resolve(!1)}UnregisterLocalMicrophoneStreamInterceptor(){return this._audioStreamInterceptor?(this._audioStreamInterceptor=null,Promise.resolve(!0)):Promise.resolve(!1)}_getDisplayMediaTrack(A){return new Promise(((e,t)=>{let i={};const o=A?.enableHighFramerate?r.DefaultHFPSLocalShareStreamFrameRate:r.DefaultLocalShareStreamFrameRate;i.video={frameRate:o};const s=A?.enableHighFramerate?r.DefaultHFPSLocalShareStreamWidth:r.DefaultLocalShareStreamWidth,a=A?.enableHighFramerate?r.DefaultHFPSLocalShareStreamHeight:r.DefaultLocalShareStreamHeight;if(C.OperatingSystemInfoProvider.IsSafari()){const A=B.default.Resolution;if((A.width/A.height).toFixed(3)>(s/a).toFixed(3)){const e=Math.min(s,A.width);i.video.width={max:e}}else{const e=Math.min(a,A.height);i.video.height={max:e}}}else i.video.height={max:a},i.video.width={max:s};A?.enableAudio&&(i.audio={autoGainControl:!1,echoCancellation:!0,noiseSuppression:!1,sampleRate:r.DefaultLocalShareAudioSamplingBitRate});const I=g.MediaDevicesProvider.GetMediaDevices();this._logger.LogDebug((()=>`calling getDisplayMedia with constraints ${JSON.stringify(i,null,2)}`)),"getDisplayMedia"in I?I.getDisplayMedia(i).then((A=>{A.getVideoTracks().length>0&&this._logger.LogDebug((()=>"getDisplayMedia: received video stream")),A.getAudioTracks().length>0&&this._logger.LogDebug((()=>"getDisplayMedia: received audio stream")),e(A)})).catch(t):t(n.CouldNotGetWindowShareTrack)}))}static SetAudioAndVideoConstraints({audio:A=!1,video:e=!1}={}){E._constraints.audio=A,E._constraints.video=e}}E._constraints=r.MediaConstraints,E.defaultCameraDeviceID="",E.getVideoTrackRetriesLimit=2,E.getVideoTrackRetryDelayMs=500,E._ptzCapabilities={pan:!1,tilt:!1,zoom:!1},E._browserSupportsPTZ=!1,i([(0,c.synchronized)("UserMediaProvider-video")],E.prototype,"GetVideoTrack",null),i([(0,c.synchronized)("UserMediaProvider-video")],E,"CameraDeviceSupportsPTZ",null),e.UserMediaProvider=E},54:function(A,e,t){var i=this&&this.__importDefault||function(A){return A&&A.__esModule?A:{default:A}};Object.defineProperty(e,"__esModule",{value:!0}),e.Collection=void 0;const o=i(t(5792));e.Collection=class{constructor(A){this._createDefaultValue=A,this._collection={}}Add(A){this._collection[A.Id]=A}All(){return Object.values(this._collection)}Create(A){let e=this._createDefaultValue(A);return this._collection[A]=e,e}Get(A){return this._collection[A]||this.Create(A),this._collection[A]}Remove(A){delete this._collection[A]}Where(A){return o.default.Filter(this._collection,A)}}},68:A=>{A.exports="data:application/wasm;base64,AGFzbQEAAAAB4gEgYAJ/fwF/YAN/f38AYAJ/fwBgA39/fwF/YAF/AX9gAX8AYAR/f39/AX9gAAF/YAAAYAV/f39/fwF/YAR/f39/AGAFf35+fn4AYAV/f39/fwBgA39+fwF+YAd/f39/f39/AX9gAn98AGACf3wBfGAEf35+fwBgB39/f39/f38AYAZ/fH9/f38Bf2ADf35/AX9gBn9/f39/fwBgC39/f39/f39/f39/AX9gA39/fwF8YAJ+fwF/YAJ8fwF8YAR/f39+AX5gAX8BfmACfn4BfGAEfn5+fgF/YAN+fn4Bf2ABfwF8AtADFANlbnYQX19zdGFja19jaGtfZmFpbAAIA2Vudg1jbG9ja19nZXR0aW1lAAADZW52CGdtdGltZV9yAAADZW52C2xvY2FsdGltZV9yAAADZW52DGdldHRpbWVvZmRheQAAA2VudgtnZXRhZGRyaW5mbwAGA2VudgxnYWlfc3RyZXJyb3IABANlbnYNX19zeXNfZmNudGw2NAADFndhc2lfc25hcHNob3RfcHJldmlldzEIZmRfY2xvc2UABANlbnYKX19zeXNfb3BlbgADFndhc2lfc25hcHNob3RfcHJldmlldzEHZmRfcmVhZAAGFndhc2lfc25hcHNob3RfcHJldmlldzEIZmRfd3JpdGUABgNlbnYLX19zeXNfaW9jdGwAAwNlbnYPX19zeXNfcHJsaW1pdDY0AAYDZW52EF9fc3lzX3VnZXRybGltaXQAAANlbnYPX19zeXNfc2V0cmxpbWl0AAADZW52FmVtc2NyaXB0ZW5fcmVzaXplX2hlYXAABANlbnYVZW1zY3JpcHRlbl9tZW1jcHlfYmlnAAMDZW52C3NldFRlbXBSZXQwAAUWd2FzaV9zbmFwc2hvdF9wcmV2aWV3MQdmZF9zZWVrAAkD7QbrBggGBgAAAwIAAwYEBAQOBgQDBAkBBgcIBwcAAgEKAgABAAAFBQAABQYCBQAAAgYFBAABAAUAAAUFBAMGAwkABQEAAAAFAAAABQAABQAAAgEBCgEFBgACBQYAAAQCBgICBgIGBQEBAgcIAAcIBwgHCAcIAgEBAAUFBwgHAAEACAgKFAgDFRIABwgHCAcHCAYDBwgHAAABBwgBBwgFBAACBwcDAwIFAgACBQUCBQUAAgUCBQIFAgUAAAACBQIFCgIFBQACBQIFAgUAAgUAAgUCAgUCAgUCBQUAAAAAAAACAgUCBQUCAgUKAgUCBQIFBQAABAIEAgMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMABAAEAgAEAgAEAgAEAwQDBAMEAwQDBAMCAAQDBAMCAAQDBAMCAAQDBAMEAwQDBAMEAwQEAwQDBAMEAwQEAwQDBAIABAQDBAMEAwQDBAMEAwQDBAMEAwQDBAMHCAcAAAAABQAABQAABQYFAwMDAAADAwgEAwUDBQAGBgYGAwMGCQkOAwUFAwQGCQABBQMAFgcIBQIDAQQABQMABgEEAAUDAAYCBQoPDwIFAAACBQkCBQUCBQIFAgYADAkCBQAAAAIFBAMEAwQDBAMDBAMEAwQDBAIABAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQEAwQ