From f7bf21cc70e386c6b5dfead6635d676a10a4610d Mon Sep 17 00:00:00 2001 From: Bogdan Duduman Date: Wed, 22 Mar 2023 10:00:19 +0200 Subject: [PATCH] Update external api - web security fix for electron --- app/features/conference/external_api.js | 2 +- app/features/conference/external_api.min.js.map | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 app/features/conference/external_api.min.js.map diff --git a/app/features/conference/external_api.js b/app/features/conference/external_api.js index d39d91c7d..ddbe330cd 100644 --- a/app/features/conference/external_api.js +++ b/app/features/conference/external_api.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.JitsiMeetExternalAPI=t():e.JitsiMeetExternalAPI=t()}(self,(function(){return(()=>{var e={820:(e,t,n)=>{"use strict";n.d(t,{default:()=>j});var i=n(620),r=n.n(i);class s extends i{constructor(){var e,t;super(...arguments),t={},(e="_storage")in this?Object.defineProperty(this,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):this[e]=t}clear(){this._storage={}}get length(){return Object.keys(this._storage).length}getItem(e){return this._storage[e]}setItem(e,t){this._storage[e]=t}removeItem(e){delete this._storage[e]}key(e){const t=Object.keys(this._storage);if(!(t.length<=e))return t[e]}serialize(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(0===e.length)return JSON.stringify(this._storage);const t={...this._storage};return e.forEach((e=>{delete t[e]})),JSON.stringify(t)}}const o=new class extends i{constructor(){super();try{this._storage=window.localStorage,this._localStorageDisabled=!1}catch(e){}this._storage||(console.warn("Local storage is disabled."),this._storage=new s,this._localStorageDisabled=!0)}isLocalStorageDisabled(){return this._localStorageDisabled}clear(){this._storage.clear(),this.emit("changed")}get length(){return this._storage.length}getItem(e){return this._storage.getItem(e)}setItem(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this._storage.setItem(e,t),n||this.emit("changed")}removeItem(e){this._storage.removeItem(e),this.emit("changed")}key(e){return this._storage.key(e)}serialize(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(this.isLocalStorageDisabled())return this._storage.serialize(e);const t=this._storage.length,n={};for(let i=0;i0&&void 0!==arguments[0]?arguments[0]:{};this.postis=function(e){var t,n=e.scope,i=e.window,r=e.windowForEventListening||window,s=e.allowedOrigin,o={},a=[],c={},l=!1,d="__ready__",u=function(e){var t;try{t=JSON.parse(e.data)}catch(e){return}if((!s||e.origin===s)&&t&&t.postis&&t.scope===n){var i=o[t.method];if(i)for(var r=0;r{},this.postis.listen(f,(e=>this._receiveCallback(e)))}dispose(){this.postis.destroy()}send(e){this.postis.send({method:f,params:e})}setReceiveCallback(e){this._receiveCallback=e}}const y="request",_="response";class b{constructor(){let{backend:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._listeners=new Map,this._requestID=0,this._responseHandlers=new Map,this._unprocessedMessages=new Set,this.addListener=this.on,e&&this.setBackend(e)}_disposeBackend(){this._backend&&(this._backend.dispose(),this._backend=null)}_onMessageReceived(e){if(e.type===_){const t=this._responseHandlers.get(e.id);t&&(t(e),this._responseHandlers.delete(e.id))}else e.type===y?this.emit("request",e.data,((t,n)=>{this._backend.send({type:_,error:n,id:e.id,result:t})})):this.emit("event",e.data)}dispose(){this._responseHandlers.clear(),this._unprocessedMessages.clear(),this.removeAllListeners(),this._disposeBackend()}emit(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i{s=e(...n)||s})),s||this._unprocessedMessages.add(n),s}on(e,t){let n=this._listeners.get(e);return n||(n=new Set,this._listeners.set(e,n)),n.add(t),this._unprocessedMessages.forEach((e=>{t(...e)&&this._unprocessedMessages.delete(e)})),this}removeAllListeners(e){return e?this._listeners.delete(e):this._listeners.clear(),this}removeListener(e,t){const n=this._listeners.get(e);return n&&n.delete(t),this}sendEvent(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._backend&&this._backend.send({type:"event",data:e})}sendRequest(e){if(!this._backend)return Promise.reject(new Error("No transport backend defined!"));this._requestID++;const t=this._requestID;return new Promise(((n,i)=>{this._responseHandlers.set(t,(e=>{let{error:t,result:r}=e;void 0!==r?n(r):i(void 0!==t?t:new Error("Unexpected response format!"))})),this._backend.send({type:y,data:e,id:t})}))}setBackend(e){this._disposeBackend(),this._backend=e,this._backend.setReceiveCallback(this._onMessageReceived.bind(this))}}(function(e,t=!1,n="hash"){"string"==typeof e&&(e=new URL(e));const i="search"===n?e.search:e.hash,r={},s=(null==i?void 0:i.substr(1).split("&"))||[];if("hash"===n&&1===s.length){const e=s[0];if(e.startsWith("/")&&1===e.split("&").length)return r}return s.forEach((e=>{const n=e.split("="),i=n[0];if(!i||i.split(".").some((e=>c.includes(e))))return;let s;try{if(s=n[1],!t){const e=decodeURIComponent(s).replace(/\\&/,"&");s="undefined"===e?void 0:a.parse(e)}}catch(e){return void function(e,t=""){var n;console.error(t,e),null===(n=window.onerror)||void 0===n||n.call(window,t,void 0,void 0,void 0,e)}(e,`Failed to parse URL parameter value: ${String(s)}`)}r[i]=s})),r})(window.location).jitsi_meet_external_api_id;(window.JitsiMeetJS||(window.JitsiMeetJS={}),window.JitsiMeetJS.app||(window.JitsiMeetJS.app={}),window.JitsiMeetJS.app).setExternalTransportBackend=e=>undefined.setBackend(e);var w=n(860);const L=n.n(w)().getLogger("modules/API/external/functions.js");function k(e,t){return e.sendRequest({type:"devices",name:"setDevice",device:t})}const C=["css/all.css","libs/alwaysontop.min.js"],E={addBreakoutRoom:"add-breakout-room",answerKnockingParticipant:"answer-knocking-participant",approveVideo:"approve-video",askToUnmute:"ask-to-unmute",autoAssignToBreakoutRooms:"auto-assign-to-breakout-rooms",avatarUrl:"avatar-url",cancelPrivateChat:"cancel-private-chat",closeBreakoutRoom:"close-breakout-room",displayName:"display-name",e2eeKey:"e2ee-key",endConference:"end-conference",email:"email",grantModerator:"grant-moderator",hangup:"video-hangup",hideNotification:"hide-notification",initiatePrivateChat:"initiate-private-chat",joinBreakoutRoom:"join-breakout-room",localSubject:"local-subject",kickParticipant:"kick-participant",muteEveryone:"mute-everyone",overwriteConfig:"overwrite-config",overwriteNames:"overwrite-names",password:"password",pinParticipant:"pin-participant",rejectParticipant:"reject-participant",removeBreakoutRoom:"remove-breakout-room",resizeFilmStrip:"resize-film-strip",resizeLargeVideo:"resize-large-video",sendChatMessage:"send-chat-message",sendEndpointTextMessage:"send-endpoint-text-message",sendParticipantToRoom:"send-participant-to-room",sendTones:"send-tones",setFollowMe:"set-follow-me",setLargeVideoParticipant:"set-large-video-participant",setMediaEncryptionKey:"set-media-encryption-key",setNoiseSuppressionEnabled:"set-noise-suppression-enabled",setParticipantVolume:"set-participant-volume",setSubtitles:"set-subtitles",setTileView:"set-tile-view",setVideoQuality:"set-video-quality",showNotification:"show-notification",startRecording:"start-recording",startShareVideo:"start-share-video",stopRecording:"stop-recording",stopShareVideo:"stop-share-video",subject:"subject",submitFeedback:"submit-feedback",toggleAudio:"toggle-audio",toggleCamera:"toggle-camera",toggleCameraMirror:"toggle-camera-mirror",toggleChat:"toggle-chat",toggleE2EE:"toggle-e2ee",toggleFilmStrip:"toggle-film-strip",toggleLobby:"toggle-lobby",toggleModeration:"toggle-moderation",toggleNoiseSuppression:"toggle-noise-suppression",toggleParticipantsPane:"toggle-participants-pane",toggleRaiseHand:"toggle-raise-hand",toggleShareScreen:"toggle-share-screen",toggleSubtitles:"toggle-subtitles",toggleTileView:"toggle-tile-view",toggleVirtualBackgroundDialog:"toggle-virtual-background",toggleVideo:"toggle-video"},x={"avatar-changed":"avatarChanged","audio-availability-changed":"audioAvailabilityChanged","audio-mute-status-changed":"audioMuteStatusChanged","audio-or-video-sharing-toggled":"audioOrVideoSharingToggled","breakout-rooms-updated":"breakoutRoomsUpdated","browser-support":"browserSupport","camera-error":"cameraError","chat-updated":"chatUpdated","content-sharing-participants-changed":"contentSharingParticipantsChanged","data-channel-closed":"dataChannelClosed","data-channel-opened":"dataChannelOpened","device-list-changed":"deviceListChanged","display-name-change":"displayNameChange","email-change":"emailChange","error-occurred":"errorOccurred","endpoint-text-message-received":"endpointTextMessageReceived","face-landmark-detected":"faceLandmarkDetected","feedback-submitted":"feedbackSubmitted","feedback-prompt-displayed":"feedbackPromptDisplayed","filmstrip-display-changed":"filmstripDisplayChanged","incoming-message":"incomingMessage","knocking-participant":"knockingParticipant",log:"log","mic-error":"micError","moderation-participant-approved":"moderationParticipantApproved","moderation-participant-rejected":"moderationParticipantRejected","moderation-status-changed":"moderationStatusChanged","mouse-enter":"mouseEnter","mouse-leave":"mouseLeave","mouse-move":"mouseMove","outgoing-message":"outgoingMessage","participant-joined":"participantJoined","participant-kicked-out":"participantKickedOut","participant-left":"participantLeft","participant-role-changed":"participantRoleChanged","participants-pane-toggled":"participantsPaneToggled","password-required":"passwordRequired","peer-connection-failure":"peerConnectionFailure","prejoin-screen-loaded":"prejoinScreenLoaded","proxy-connection-event":"proxyConnectionEvent","raise-hand-updated":"raiseHandUpdated","recording-link-available":"recordingLinkAvailable","recording-status-changed":"recordingStatusChanged","video-ready-to-close":"readyToClose","video-conference-joined":"videoConferenceJoined","video-conference-left":"videoConferenceLeft","video-availability-changed":"videoAvailabilityChanged","video-mute-status-changed":"videoMuteStatusChanged","video-quality-changed":"videoQualityChanged","screen-sharing-status-changed":"screenSharingStatusChanged","dominant-speaker-changed":"dominantSpeakerChanged","subject-change":"subjectChange","suspend-detected":"suspendDetected","tile-view-changed":"tileViewChanged","toolbar-button-clicked":"toolbarButtonClicked"};let O=0;function R(e,t){e._numberOfParticipants+=t}function S(e){let t;return"string"==typeof e&&null!==String(e).match(/([0-9]*\.?[0-9]+)(em|pt|px|%)$/)?t=e:"number"==typeof e&&(t=`${e}px`),t}class j extends(r()){constructor(e){super();for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:{},url:`https://${e}/#jitsi_meet_external_api_id=${O}`})}(e,{configOverwrite:l,interfaceConfigOverwrite:d,jwt:u,lang:h,roomName:r,devices:f,userInfo:y,appData:{localStorageContent:L},release:w}),this._createIFrame(a,s,p),this._transport=new b({backend:new v({postisOptions:{allowedOrigin:new URL(this._url).origin,scope:`jitsi_meet_external_api_${O}`,window:this._frame.contentWindow}})}),Array.isArray(m)&&m.length>0&&this.invite(m),this._tmpE2EEKey=_,this._isLargeVideoVisible=!1,this._isPrejoinVideoVisible=!1,this._numberOfParticipants=0,this._participants={},this._myUserID=void 0,this._onStageParticipant=void 0,this._setupListeners(),O++}_createIFrame(e,t,n){const i=`jitsiConferenceFrame${O}`;this._frame=document.createElement("iframe"),this._frame.allow="camera; microphone; display-capture; autoplay; clipboard-write",this._frame.name=i,this._frame.id=i,this._setSize(e,t),this._frame.sandbox="allow-scripts allow-same-origin allow-popups allow-forms",this._frame.setAttribute("allowFullScreen","true"),this._frame.style.border=0,n&&(this._frame.onload=n),this._frame=this._parentNode.appendChild(this._frame),this._frame.src=this._url}_getAlwaysOnTopResources(){const e=this._frame.contentWindow,t=e.document;let n="";const i=t.querySelector("base");if(i&&i.href)n=i.href;else{const{protocol:t,host:i}=e.location;n=`${t}//${i}`}return C.map((e=>new URL(e,n).href))}_getFormattedDisplayName(e){const{formattedDisplayName:t}=this._participants[e]||{};return t}_getOnStageParticipant(){return this._onStageParticipant}_getLargeVideo(){const e=this.getIFrame();if(this._isLargeVideoVisible&&e&&e.contentWindow&&e.contentWindow.document)return e.contentWindow.document.getElementById("largeVideo")}_getPrejoinVideo(){const e=this.getIFrame();if(this._isPrejoinVideoVisible&&e&&e.contentWindow&&e.contentWindow.document)return e.contentWindow.document.getElementById("prejoinVideo")}_getParticipantVideo(e){const t=this.getIFrame();if(t&&t.contentWindow&&t.contentWindow.document)return void 0===e||e===this._myUserID?t.contentWindow.document.getElementById("localVideo_container"):t.contentWindow.document.querySelector(`#participant_${e} video`)}_setSize(e,t){const n=S(e),i=S(t);void 0!==n&&(this._height=e,this._frame.style.height=n),void 0!==i&&(this._width=t,this._frame.style.width=i)}_setupListeners(){this._transport.on("event",(e=>{let{name:t,...n}=e;const i=n.id;switch(t){case"video-conference-joined":void 0!==this._tmpE2EEKey&&(this.executeCommand(E.e2eeKey,this._tmpE2EEKey),this._tmpE2EEKey=void 0),this._myUserID=i,this._participants[i]={email:n.email,avatarURL:n.avatarURL};case"participant-joined":this._participants[i]=this._participants[i]||{},this._participants[i].displayName=n.displayName,this._participants[i].formattedDisplayName=n.formattedDisplayName,R(this,1);break;case"participant-left":R(this,-1),delete this._participants[i];break;case"display-name-change":{const e=this._participants[i];e&&(e.displayName=n.displayname,e.formattedDisplayName=n.formattedDisplayName);break}case"email-change":{const e=this._participants[i];e&&(e.email=n.email);break}case"avatar-changed":{const e=this._participants[i];e&&(e.avatarURL=n.avatarURL);break}case"on-stage-participant-changed":this._onStageParticipant=i,this.emit("largeVideoChanged");break;case"large-video-visibility-changed":this._isLargeVideoVisible=n.isVisible,this.emit("largeVideoChanged");break;case"prejoin-screen-loaded":this._participants[i]={displayName:n.displayName,formattedDisplayName:n.formattedDisplayName};break;case"on-prejoin-video-changed":this._isPrejoinVideoVisible=n.isVisible,this.emit("prejoinVideoChanged");break;case"video-conference-left":R(this,-1),delete this._participants[this._myUserID];break;case"video-quality-changed":this._videoQuality=n.videoQuality;break;case"breakout-rooms-updated":this.updateNumberOfParticipants(n.rooms);break;case"local-storage-changed":return o.setItem("jitsiLocalStorage",n.localStorageContent),!0}const r=x[t];return!!r&&(this.emit(r,n),!0)}))}updateNumberOfParticipants(e){if(!e||!Object.keys(e).length)return;const t=Object.keys(e).reduce(((t,n)=>{var i;return null!==(i=e[n])&&void 0!==i&&i.participants?Object.keys(e[n].participants).length+t:t}),0);this._numberOfParticipants=t}async getRoomsInfo(){return this._transport.sendRequest({name:"rooms-info"})}addEventListener(e,t){this.on(e,t)}addEventListeners(e){for(const t in e)this.addEventListener(t,e[t])}captureLargeVideoScreenshot(){return this._transport.sendRequest({name:"capture-largevideo-screenshot"})}dispose(){this.emit("_willDispose"),this._transport.dispose(),this.removeAllListeners(),this._frame&&this._frame.parentNode&&this._frame.parentNode.removeChild(this._frame)}executeCommand(e){if(e in E){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i(L.error(e),{})))}(this._transport)}getContentSharingParticipants(){return this._transport.sendRequest({name:"get-content-sharing-participants"})}getCurrentDevices(){return function(e){return e.sendRequest({type:"devices",name:"getCurrentDevices"}).catch((e=>(L.error(e),{})))}(this._transport)}getCustomAvatarBackgrounds(){return this._transport.sendRequest({name:"get-custom-avatar-backgrounds"})}getLivestreamUrl(){return this._transport.sendRequest({name:"get-livestream-url"})}getParticipantsInfo(){const e=Object.keys(this._participants),t=Object.values(this._participants);return t.forEach(((t,n)=>{t.participantId=e[n]})),t}getVideoQuality(){return this._videoQuality}isAudioAvailable(){return this._transport.sendRequest({name:"is-audio-available"})}isDeviceChangeAvailable(e){return function(e,t){return e.sendRequest({deviceType:t,type:"devices",name:"isDeviceChangeAvailable"})}(this._transport,e)}isDeviceListAvailable(){return function(e){return e.sendRequest({type:"devices",name:"isDeviceListAvailable"})}(this._transport)}isMultipleAudioInputSupported(){return function(e){return e.sendRequest({type:"devices",name:"isMultipleAudioInputSupported"})}(this._transport)}invite(e){return Array.isArray(e)&&0!==e.length?this._transport.sendRequest({name:"invite",invitees:e}):Promise.reject(new TypeError("Invalid Argument"))}isAudioMuted(){return this._transport.sendRequest({name:"is-audio-muted"})}isAudioDisabled(){return this._transport.sendRequest({name:"is-audio-disabled"})}isModerationOn(e){return this._transport.sendRequest({name:"is-moderation-on",mediaType:e})}isParticipantForceMuted(e,t){return this._transport.sendRequest({name:"is-participant-force-muted",participantId:e,mediaType:t})}isParticipantsPaneOpen(){return this._transport.sendRequest({name:"is-participants-pane-open"})}isSharingScreen(){return this._transport.sendRequest({name:"is-sharing-screen"})}isStartSilent(){return this._transport.sendRequest({name:"is-start-silent"})}getAvatarURL(e){const{avatarURL:t}=this._participants[e]||{};return t}getDeploymentInfo(){return this._transport.sendRequest({name:"deployment-info"})}getDisplayName(e){const{displayName:t}=this._participants[e]||{};return t}getEmail(e){const{email:t}=this._participants[e]||{};return t}getIFrame(){return this._frame}getNumberOfParticipants(){return this._numberOfParticipants}isVideoAvailable(){return this._transport.sendRequest({name:"is-video-available"})}isVideoMuted(){return this._transport.sendRequest({name:"is-video-muted"})}listBreakoutRooms(){return this._transport.sendRequest({name:"list-breakout-rooms"})}pinParticipant(e,t){this.executeCommand("pinParticipant",e,t)}removeEventListener(e){this.removeAllListeners(e)}removeEventListeners(e){e.forEach((e=>this.removeEventListener(e)))}resizeLargeVideo(e,t){e<=this._width&&t<=this._height&&this.executeCommand("resizeLargeVideo",e,t)}sendProxyConnectionEvent(e){this._transport.sendEvent({data:[e],name:"proxy-connection-event"})}setAudioInputDevice(e,t){return function(e,t,n){return k(e,{id:n,kind:"audioinput",label:t})}(this._transport,e,t)}setAudioOutputDevice(e,t){return function(e,t,n){return k(e,{id:n,kind:"audiooutput",label:t})}(this._transport,e,t)}setLargeVideoParticipant(e,t){this.executeCommand("setLargeVideoParticipant",e,t)}setVideoInputDevice(e,t){return function(e,t,n){return k(e,{id:n,kind:"videoinput",label:t})}(this._transport,e,t)}startRecording(e){this.executeCommand("startRecording",e)}stopRecording(e){this.executeCommand("stopRecording",e)}toggleE2EE(e){this.executeCommand("toggleE2EE",e)}async setMediaEncryptionKey(e){const{key:t,index:n}=e;if(t){const e=await crypto.subtle.exportKey("raw",t);this.executeCommand("setMediaEncryptionKey",JSON.stringify({exportedKey:Array.from(new Uint8Array(e)),index:n}))}else this.executeCommand("setMediaEncryptionKey",JSON.stringify({exportedKey:!1,index:n}))}}},872:(e,t,n)=>{e.exports=n(820).default},571:(e,t)=>{"use strict";const n=/"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*\:/;t.parse=function(e){const i="object"==typeof(arguments.length<=1?void 0:arguments[1])&&(arguments.length<=1?void 0:arguments[1]),r=(arguments.length<=1?0:arguments.length-1)>1||!i?arguments.length<=1?void 0:arguments[1]:void 0,s=(arguments.length<=1?0:arguments.length-1)>1&&(arguments.length<=2?void 0:arguments[2])||i||{},o=JSON.parse(e,r);return"ignore"===s.protoAction?o:o&&"object"==typeof o&&e.match(n)?(t.scan(o,s),o):o},t.scan=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[e];for(;n.length;){const e=n;n=[];for(const i of e){if(Object.prototype.hasOwnProperty.call(i,"__proto__")){if("remove"!==t.protoAction)throw new SyntaxError("Object contains forbidden prototype property");delete i.__proto__}for(const e in i){const t=i[e];t&&"object"==typeof t&&n.push(i[e])}}}},t.safeParse=function(e,n){try{return t.parse(e,n)}catch(e){return null}}},369:(e,t,n)=>{var i=n(7);function r(e,t){this.logStorage=e,this.stringifyObjects=!(!t||!t.stringifyObjects)&&t.stringifyObjects,this.storeInterval=t&&t.storeInterval?t.storeInterval:3e4,this.maxEntryLength=t&&t.maxEntryLength?t.maxEntryLength:1e4,Object.keys(i.levels).forEach(function(e){this[i.levels[e]]=function(){this._log.apply(this,arguments)}.bind(this,e)}.bind(this)),this.storeLogsIntervalID=null,this.queue=[],this.totalLen=0,this.outputCache=[]}r.prototype.stringify=function(e){try{return JSON.stringify(e)}catch(e){return"[object with circular refs?]"}},r.prototype.formatLogMessage=function(e){for(var t="",n=1,r=arguments.length;n=this.maxEntryLength&&this._flush(!0,!0)},r.prototype.start=function(){this._reschedulePublishInterval()},r.prototype._reschedulePublishInterval=function(){this.storeLogsIntervalID&&(window.clearTimeout(this.storeLogsIntervalID),this.storeLogsIntervalID=null),this.storeLogsIntervalID=window.setTimeout(this._flush.bind(this,!1,!0),this.storeInterval)},r.prototype.flush=function(){this._flush(!1,!0)},r.prototype._flush=function(e,t){this.totalLen>0&&(this.logStorage.isReady()||e)&&(this.logStorage.isReady()?(this.outputCache.length&&(this.outputCache.forEach(function(e){this.logStorage.storeLogs(e)}.bind(this)),this.outputCache=[]),this.logStorage.storeLogs(this.queue)):this.outputCache.push(this.queue),this.queue=[],this.totalLen=0),t&&this._reschedulePublishInterval()},r.prototype.stop=function(){this._flush(!1,!1)},e.exports=r},7:e=>{var t={trace:0,debug:1,info:2,log:3,warn:4,error:5};o.consoleTransport=console;var n=[o.consoleTransport];o.addGlobalTransport=function(e){-1===n.indexOf(e)&&n.push(e)},o.removeGlobalTransport=function(e){var t=n.indexOf(e);-1!==t&&n.splice(t,1)};var i={};function r(){var e={methodName:"",fileLocation:"",line:null,column:null},t=new Error,n=t.stack?t.stack.split("\n"):[];if(!n||n.length<3)return e;var i=null;return n[3]&&(i=n[3].match(/\s*at\s*(.+?)\s*\((\S*)\s*:(\d*)\s*:(\d*)\)/)),!i||i.length<=4?(0===n[2].indexOf("log@")?e.methodName=n[3].substr(0,n[3].indexOf("@")):e.methodName=n[2].substr(0,n[2].indexOf("@")),e):(e.methodName=i[1],e.fileLocation=i[2],e.line=i[3],e.column=i[4],e)}function s(){var e=arguments[0],s=arguments[1],o=Array.prototype.slice.call(arguments,2);if(!(t[s]1&&h.push("<"+a.methodName+">: ");var p=h.concat(o);u.bind(d).apply(d,p)}}}function o(e,n,i,r){this.id=n,this.options=r||{},this.transports=i,this.transports||(this.transports=[]),this.level=t[e];for(var o=Object.keys(t),a=0;a{var i=n(7),r=n(369),s={},o=[],a=i.levels.TRACE;e.exports={addGlobalTransport:function(e){i.addGlobalTransport(e)},removeGlobalTransport:function(e){i.removeGlobalTransport(e)},setGlobalOptions:function(e){i.setGlobalOptions(e)},getLogger:function(e,t,n){var r=new i(a,e,t,n);return e?(s[e]=s[e]||[],s[e].push(r)):o.push(r),r},setLogLevelById:function(e,t){for(var n=t?s[t]||[]:o,i=0;i{"use strict";var t,n="object"==typeof Reflect?Reflect:null,i=n&&"function"==typeof n.apply?n.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};t=n&&"function"==typeof n.ownKeys?n.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var r=Number.isNaN||function(e){return e!=e};function s(){s.init.call(this)}e.exports=s,e.exports.once=function(e,t){return new Promise((function(n,i){function r(n){e.removeListener(t,s),i(n)}function s(){"function"==typeof e.removeListener&&e.removeListener("error",r),n([].slice.call(arguments))}m(e,t,s,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&m(e,"error",t,{once:!0})}(e,r)}))},s.EventEmitter=s,s.prototype._events=void 0,s.prototype._eventsCount=0,s.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function c(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function l(e,t,n,i){var r,s,o,l;if(a(n),void 0===(s=e._events)?(s=e._events=Object.create(null),e._eventsCount=0):(void 0!==s.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),s=e._events),o=s[t]),void 0===o)o=s[t]=n,++e._eventsCount;else if("function"==typeof o?o=s[t]=i?[n,o]:[o,n]:i?o.unshift(n):o.push(n),(r=c(e))>0&&o.length>r&&!o.warned){o.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=o.length,l=d,console&&console.warn&&console.warn(l)}return e}function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function u(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=d.bind(i);return r.listener=n,i.wrapFn=r,r}function h(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var c=s[e];if(void 0===c)return!1;if("function"==typeof c)i(c,this,t);else{var l=c.length,d=g(c,l);for(n=0;n=0;s--)if(n[s]===t||n[s].listener===t){o=n[s].listener,r=s;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},s.prototype.listeners=function(e){return h(this,e,!0)},s.prototype.rawListeners=function(e){return h(this,e,!1)},s.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},s.prototype.listenerCount=p,s.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,n),s.exports}return n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n(872)})()})); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.JitsiMeetExternalAPI=t():e.JitsiMeetExternalAPI=t()}(self,(function(){return(()=>{var e={820:(e,t,n)=>{"use strict";n.d(t,{default:()=>N});var i=n(620),r=n.n(i);class s extends i{constructor(){var e,t,n;super(...arguments),e=this,n={},(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:String(t)}(t="_storage"))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}clear(){this._storage={}}get length(){return Object.keys(this._storage).length}getItem(e){return this._storage[e]}setItem(e,t){this._storage[e]=t}removeItem(e){delete this._storage[e]}key(e){const t=Object.keys(this._storage);if(!(t.length<=e))return t[e]}serialize(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(0===e.length)return JSON.stringify(this._storage);const t={...this._storage};return e.forEach((e=>{delete t[e]})),JSON.stringify(t)}}const o=new class extends i{constructor(){super();try{this._storage=window.localStorage,this._localStorageDisabled=!1}catch(e){}this._storage||(console.warn("Local storage is disabled."),this._storage=new s,this._localStorageDisabled=!0)}isLocalStorageDisabled(){return this._localStorageDisabled}clear(){this._storage.clear(),this.emit("changed")}get length(){return this._storage.length}getItem(e){return this._storage.getItem(e)}setItem(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this._storage.setItem(e,t),n||this.emit("changed")}removeItem(e){this._storage.removeItem(e),this.emit("changed")}key(e){return this._storage.key(e)}serialize(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(this.isLocalStorageDisabled())return this._storage.serialize(e);const t=this._storage.length,n={};for(let i=0;i0&&void 0!==arguments[0]?arguments[0]:{};this.postis=function(e){var t,n=e.scope,i=e.window,r=e.windowForEventListening||window,s=e.allowedOrigin,o={},a=[],c={},l=!1,d="__ready__",u=function(e){var t;try{t=JSON.parse(e.data)}catch(e){return}if((!s||e.origin===s)&&t&&t.postis&&t.scope===n){var i=o[t.method];if(i)for(var r=0;r{},this.postis.listen(_,(e=>this._receiveCallback(e)))}dispose(){this.postis.destroy()}send(e){this.postis.send({method:_,params:e})}setReceiveCallback(e){this._receiveCallback=e}}const w="request",L="response";class k{constructor(){let{backend:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._listeners=new Map,this._requestID=0,this._responseHandlers=new Map,this._unprocessedMessages=new Set,this.addListener=this.on,e&&this.setBackend(e)}_disposeBackend(){this._backend&&(this._backend.dispose(),this._backend=null)}_onMessageReceived(e){if(e.type===L){const t=this._responseHandlers.get(e.id);t&&(t(e),this._responseHandlers.delete(e.id))}else e.type===w?this.emit("request",e.data,((t,n)=>{this._backend.send({type:L,error:n,id:e.id,result:t})})):this.emit("event",e.data)}dispose(){this._responseHandlers.clear(),this._unprocessedMessages.clear(),this.removeAllListeners(),this._disposeBackend()}emit(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i{s=e(...n)||s})),s||this._unprocessedMessages.add(n),s}on(e,t){let n=this._listeners.get(e);return n||(n=new Set,this._listeners.set(e,n)),n.add(t),this._unprocessedMessages.forEach((e=>{t(...e)&&this._unprocessedMessages.delete(e)})),this}removeAllListeners(e){return e?this._listeners.delete(e):this._listeners.clear(),this}removeListener(e,t){const n=this._listeners.get(e);return n&&n.delete(t),this}sendEvent(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._backend&&this._backend.send({type:"event",data:e})}sendRequest(e){if(!this._backend)return Promise.reject(new Error("No transport backend defined!"));this._requestID++;const t=this._requestID;return new Promise(((n,i)=>{this._responseHandlers.set(t,(e=>{let{error:t,result:r}=e;void 0!==r?n(r):i(void 0!==t?t:new Error("Unexpected response format!"))})),this._backend.send({type:w,data:e,id:t})}))}setBackend(e){this._disposeBackend(),this._backend=e,this._backend.setReceiveCallback(this._onMessageReceived.bind(this))}}(function(e,t=!1,n="hash"){"string"==typeof e&&(e=new URL(e));const i="search"===n?e.search:e.hash,r={},s=i?.substr(1).split("&")||[];if("hash"===n&&1===s.length){const e=s[0];if(e.startsWith("/")&&1===e.split("&").length)return r}return s.forEach((e=>{const n=e.split("="),i=n[0];if(!i||i.split(".").some((e=>c.includes(e))))return;let s;try{if(s=n[1],!t){const e=decodeURIComponent(s).replace(/\\&/,"&");s="undefined"===e?void 0:a.parse(e)}}catch(e){return void function(e,t=""){console.error(t,e),window.onerror?.(t,void 0,void 0,void 0,e)}(e,`Failed to parse URL parameter value: ${String(s)}`)}r[i]=s})),r})(window.location).jitsi_meet_external_api_id;(window.JitsiMeetJS||(window.JitsiMeetJS={}),window.JitsiMeetJS.app||(window.JitsiMeetJS.app={}),window.JitsiMeetJS.app).setExternalTransportBackend=e=>undefined.setBackend(e);var C=n(860);const E=n.n(C)().getLogger("modules/API/external/functions.js");function x(e,t){return e.sendRequest({type:"devices",name:"setDevice",device:t})}const O=["css/all.css","libs/alwaysontop.min.js"],R={addBreakoutRoom:"add-breakout-room",answerKnockingParticipant:"answer-knocking-participant",approveVideo:"approve-video",askToUnmute:"ask-to-unmute",autoAssignToBreakoutRooms:"auto-assign-to-breakout-rooms",avatarUrl:"avatar-url",cancelPrivateChat:"cancel-private-chat",closeBreakoutRoom:"close-breakout-room",displayName:"display-name",e2eeKey:"e2ee-key",endConference:"end-conference",email:"email",grantModerator:"grant-moderator",hangup:"video-hangup",hideNotification:"hide-notification",initiatePrivateChat:"initiate-private-chat",joinBreakoutRoom:"join-breakout-room",localSubject:"local-subject",kickParticipant:"kick-participant",muteEveryone:"mute-everyone",overwriteConfig:"overwrite-config",overwriteNames:"overwrite-names",password:"password",pinParticipant:"pin-participant",rejectParticipant:"reject-participant",removeBreakoutRoom:"remove-breakout-room",resizeFilmStrip:"resize-film-strip",resizeLargeVideo:"resize-large-video",_requestDesktopSourcesResult:"_request-desktop-sources-result",sendChatMessage:"send-chat-message",sendEndpointTextMessage:"send-endpoint-text-message",sendParticipantToRoom:"send-participant-to-room",sendTones:"send-tones",setFollowMe:"set-follow-me",setLargeVideoParticipant:"set-large-video-participant",setMediaEncryptionKey:"set-media-encryption-key",setNoiseSuppressionEnabled:"set-noise-suppression-enabled",setParticipantVolume:"set-participant-volume",setSubtitles:"set-subtitles",setTileView:"set-tile-view",setVideoQuality:"set-video-quality",showNotification:"show-notification",startRecording:"start-recording",startShareVideo:"start-share-video",stopRecording:"stop-recording",stopShareVideo:"stop-share-video",subject:"subject",submitFeedback:"submit-feedback",toggleAudio:"toggle-audio",toggleCamera:"toggle-camera",toggleCameraMirror:"toggle-camera-mirror",toggleChat:"toggle-chat",toggleE2EE:"toggle-e2ee",toggleFilmStrip:"toggle-film-strip",toggleLobby:"toggle-lobby",toggleModeration:"toggle-moderation",toggleNoiseSuppression:"toggle-noise-suppression",toggleParticipantsPane:"toggle-participants-pane",toggleRaiseHand:"toggle-raise-hand",toggleShareScreen:"toggle-share-screen",toggleSubtitles:"toggle-subtitles",toggleTileView:"toggle-tile-view",toggleVirtualBackgroundDialog:"toggle-virtual-background",toggleVideo:"toggle-video"},S={"avatar-changed":"avatarChanged","audio-availability-changed":"audioAvailabilityChanged","audio-mute-status-changed":"audioMuteStatusChanged","audio-or-video-sharing-toggled":"audioOrVideoSharingToggled","breakout-rooms-updated":"breakoutRoomsUpdated","browser-support":"browserSupport","camera-error":"cameraError","chat-updated":"chatUpdated","content-sharing-participants-changed":"contentSharingParticipantsChanged","data-channel-closed":"dataChannelClosed","data-channel-opened":"dataChannelOpened","device-list-changed":"deviceListChanged","display-name-change":"displayNameChange","email-change":"emailChange","error-occurred":"errorOccurred","endpoint-text-message-received":"endpointTextMessageReceived","face-landmark-detected":"faceLandmarkDetected","feedback-submitted":"feedbackSubmitted","feedback-prompt-displayed":"feedbackPromptDisplayed","filmstrip-display-changed":"filmstripDisplayChanged","incoming-message":"incomingMessage","knocking-participant":"knockingParticipant",log:"log","mic-error":"micError","moderation-participant-approved":"moderationParticipantApproved","moderation-participant-rejected":"moderationParticipantRejected","moderation-status-changed":"moderationStatusChanged","mouse-enter":"mouseEnter","mouse-leave":"mouseLeave","mouse-move":"mouseMove","notification-triggered":"notificationTriggered","outgoing-message":"outgoingMessage","participant-joined":"participantJoined","participant-kicked-out":"participantKickedOut","participant-left":"participantLeft","participant-role-changed":"participantRoleChanged","participants-pane-toggled":"participantsPaneToggled","password-required":"passwordRequired","peer-connection-failure":"peerConnectionFailure","prejoin-screen-loaded":"prejoinScreenLoaded","proxy-connection-event":"proxyConnectionEvent","raise-hand-updated":"raiseHandUpdated","recording-link-available":"recordingLinkAvailable","recording-status-changed":"recordingStatusChanged","participant-menu-button-clicked":"participantMenuButtonClick","video-ready-to-close":"readyToClose","video-conference-joined":"videoConferenceJoined","video-conference-left":"videoConferenceLeft","video-availability-changed":"videoAvailabilityChanged","video-mute-status-changed":"videoMuteStatusChanged","video-quality-changed":"videoQualityChanged","screen-sharing-status-changed":"screenSharingStatusChanged","dominant-speaker-changed":"dominantSpeakerChanged","subject-change":"subjectChange","suspend-detected":"suspendDetected","tile-view-changed":"tileViewChanged","toolbar-button-clicked":"toolbarButtonClicked","_request-desktop-sources":"_requestDesktopSources"};let j=0;function I(e,t){e._numberOfParticipants+=t}function P(e){let t;return"string"==typeof e&&null!==String(e).match(/([0-9]*\.?[0-9]+)(em|pt|px|%)$/)?t=e:"number"==typeof e&&(t=`${e}px`),t}class N extends(r()){constructor(e){super();for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:{},url:`https://${e}/#jitsi_meet_external_api_id=${j}`})}(e,{configOverwrite:l,interfaceConfigOverwrite:u,jwt:p,lang:h,roomName:r,devices:_,userInfo:w,appData:{localStorageContent:E},release:C}),this._createIFrame(a,s,v),this._transport=new k({backend:new b({postisOptions:{allowedOrigin:new URL(this._url).origin,scope:`jitsi_meet_external_api_${j}`,window:this._frame.contentWindow}})}),Array.isArray(y)&&y.length>0&&this.invite(y),this._tmpE2EEKey=L,this._isLargeVideoVisible=!1,this._isPrejoinVideoVisible=!1,this._numberOfParticipants=0,this._participants={},this._myUserID=void 0,this._onStageParticipant=void 0,this._setupListeners(),j++}_createIFrame(e,t,n){const i=`jitsiConferenceFrame${j}`;this._frame=document.createElement("iframe"),this._frame.allow="camera; microphone; display-capture; autoplay; clipboard-write",this._frame.name=i,this._frame.id=i,this._setSize(e,t),this._frame.sandbox="allow-scripts allow-same-origin allow-popups allow-forms allow-downloads",this._frame.setAttribute("allowFullScreen","true"),this._frame.style.border=0,n&&(this._frame.onload=n),this._frame=this._parentNode.appendChild(this._frame),this._frame.src=this._url}_getAlwaysOnTopResources(){const e=this._frame.contentWindow,t=e.document;let n="";const i=t.querySelector("base");if(i&&i.href)n=i.href;else{const{protocol:t,host:i}=e.location;n=`${t}//${i}`}return O.map((e=>new URL(e,n).href))}_getFormattedDisplayName(e){const{formattedDisplayName:t}=this._participants[e]||{};return t}_getOnStageParticipant(){return this._onStageParticipant}_getLargeVideo(){const e=this.getIFrame();if(this._isLargeVideoVisible&&e&&e.contentWindow&&e.contentWindow.document)return e.contentWindow.document.getElementById("largeVideo")}_getPrejoinVideo(){const e=this.getIFrame();if(this._isPrejoinVideoVisible&&e&&e.contentWindow&&e.contentWindow.document)return e.contentWindow.document.getElementById("prejoinVideo")}_getParticipantVideo(e){const t=this.getIFrame();if(t&&t.contentWindow&&t.contentWindow.document)return void 0===e||e===this._myUserID?t.contentWindow.document.getElementById("localVideo_container"):t.contentWindow.document.querySelector(`#participant_${e} video`)}_setSize(e,t){const n=P(e),i=P(t);void 0!==n&&(this._height=e,this._frame.style.height=n),void 0!==i&&(this._width=t,this._frame.style.width=i)}_setupListeners(){this._transport.on("event",(e=>{let{name:t,...n}=e;const i=n.id;switch(t){case"video-conference-joined":void 0!==this._tmpE2EEKey&&(this.executeCommand(R.e2eeKey,this._tmpE2EEKey),this._tmpE2EEKey=void 0),this._myUserID=i,this._participants[i]={email:n.email,avatarURL:n.avatarURL};case"participant-joined":this._participants[i]=this._participants[i]||{},this._participants[i].displayName=n.displayName,this._participants[i].formattedDisplayName=n.formattedDisplayName,I(this,1);break;case"participant-left":I(this,-1),delete this._participants[i];break;case"display-name-change":{const e=this._participants[i];e&&(e.displayName=n.displayname,e.formattedDisplayName=n.formattedDisplayName);break}case"email-change":{const e=this._participants[i];e&&(e.email=n.email);break}case"avatar-changed":{const e=this._participants[i];e&&(e.avatarURL=n.avatarURL);break}case"on-stage-participant-changed":this._onStageParticipant=i,this.emit("largeVideoChanged");break;case"large-video-visibility-changed":this._isLargeVideoVisible=n.isVisible,this.emit("largeVideoChanged");break;case"prejoin-screen-loaded":this._participants[i]={displayName:n.displayName,formattedDisplayName:n.formattedDisplayName};break;case"on-prejoin-video-changed":this._isPrejoinVideoVisible=n.isVisible,this.emit("prejoinVideoChanged");break;case"video-conference-left":I(this,-1),delete this._participants[this._myUserID];break;case"video-quality-changed":this._videoQuality=n.videoQuality;break;case"breakout-rooms-updated":this.updateNumberOfParticipants(n.rooms);break;case"local-storage-changed":return o.setItem("jitsiLocalStorage",n.localStorageContent),!0}const r=S[t];return!!r&&(this.emit(r,n),!0)}))}updateNumberOfParticipants(e){if(!e||!Object.keys(e).length)return;const t=Object.keys(e).reduce(((t,n)=>{var i;return null!==(i=e[n])&&void 0!==i&&i.participants?Object.keys(e[n].participants).length+t:t}),0);this._numberOfParticipants=t}async getRoomsInfo(){return this._transport.sendRequest({name:"rooms-info"})}addEventListener(e,t){this.on(e,t)}addEventListeners(e){for(const t in e)this.addEventListener(t,e[t])}captureLargeVideoScreenshot(){return this._transport.sendRequest({name:"capture-largevideo-screenshot"})}dispose(){this.emit("_willDispose"),this._transport.dispose(),this.removeAllListeners(),this._frame&&this._frame.parentNode&&this._frame.parentNode.removeChild(this._frame)}executeCommand(e){if(e in R){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i(E.error(e),{})))}(this._transport)}getContentSharingParticipants(){return this._transport.sendRequest({name:"get-content-sharing-participants"})}getCurrentDevices(){return function(e){return e.sendRequest({type:"devices",name:"getCurrentDevices"}).catch((e=>(E.error(e),{})))}(this._transport)}getCustomAvatarBackgrounds(){return this._transport.sendRequest({name:"get-custom-avatar-backgrounds"})}getLivestreamUrl(){return this._transport.sendRequest({name:"get-livestream-url"})}getParticipantsInfo(){const e=Object.keys(this._participants),t=Object.values(this._participants);return t.forEach(((t,n)=>{t.participantId=e[n]})),t}getVideoQuality(){return this._videoQuality}isAudioAvailable(){return this._transport.sendRequest({name:"is-audio-available"})}isDeviceChangeAvailable(e){return function(e,t){return e.sendRequest({deviceType:t,type:"devices",name:"isDeviceChangeAvailable"})}(this._transport,e)}isDeviceListAvailable(){return function(e){return e.sendRequest({type:"devices",name:"isDeviceListAvailable"})}(this._transport)}isMultipleAudioInputSupported(){return function(e){return e.sendRequest({type:"devices",name:"isMultipleAudioInputSupported"})}(this._transport)}invite(e){return Array.isArray(e)&&0!==e.length?this._transport.sendRequest({name:"invite",invitees:e}):Promise.reject(new TypeError("Invalid Argument"))}isAudioMuted(){return this._transport.sendRequest({name:"is-audio-muted"})}isAudioDisabled(){return this._transport.sendRequest({name:"is-audio-disabled"})}isModerationOn(e){return this._transport.sendRequest({name:"is-moderation-on",mediaType:e})}isParticipantForceMuted(e,t){return this._transport.sendRequest({name:"is-participant-force-muted",participantId:e,mediaType:t})}isParticipantsPaneOpen(){return this._transport.sendRequest({name:"is-participants-pane-open"})}isSharingScreen(){return this._transport.sendRequest({name:"is-sharing-screen"})}isStartSilent(){return this._transport.sendRequest({name:"is-start-silent"})}getAvatarURL(e){const{avatarURL:t}=this._participants[e]||{};return t}getDeploymentInfo(){return this._transport.sendRequest({name:"deployment-info"})}getDisplayName(e){const{displayName:t}=this._participants[e]||{};return t}getEmail(e){const{email:t}=this._participants[e]||{};return t}getIFrame(){return this._frame}getNumberOfParticipants(){return this._numberOfParticipants}isVideoAvailable(){return this._transport.sendRequest({name:"is-video-available"})}isVideoMuted(){return this._transport.sendRequest({name:"is-video-muted"})}listBreakoutRooms(){return this._transport.sendRequest({name:"list-breakout-rooms"})}pinParticipant(e,t){this.executeCommand("pinParticipant",e,t)}removeEventListener(e){this.removeAllListeners(e)}removeEventListeners(e){e.forEach((e=>this.removeEventListener(e)))}resizeLargeVideo(e,t){e<=this._width&&t<=this._height&&this.executeCommand("resizeLargeVideo",e,t)}_requestDesktopSources(){return this._transport.sendRequest({name:"_request-desktop-sources"})}sendProxyConnectionEvent(e){this._transport.sendEvent({data:[e],name:"proxy-connection-event"})}setAudioInputDevice(e,t){return function(e,t,n){return x(e,{id:n,kind:"audioinput",label:t})}(this._transport,e,t)}setAudioOutputDevice(e,t){return function(e,t,n){return x(e,{id:n,kind:"audiooutput",label:t})}(this._transport,e,t)}setLargeVideoParticipant(e,t){this.executeCommand("setLargeVideoParticipant",e,t)}setVideoInputDevice(e,t){return function(e,t,n){return x(e,{id:n,kind:"videoinput",label:t})}(this._transport,e,t)}startRecording(e){this.executeCommand("startRecording",e)}stopRecording(e){this.executeCommand("stopRecording",e)}toggleE2EE(e){this.executeCommand("toggleE2EE",e)}async setMediaEncryptionKey(e){const{key:t,index:n}=e;if(t){const e=await crypto.subtle.exportKey("raw",t);this.executeCommand("setMediaEncryptionKey",JSON.stringify({exportedKey:Array.from(new Uint8Array(e)),index:n}))}else this.executeCommand("setMediaEncryptionKey",JSON.stringify({exportedKey:!1,index:n}))}}},872:(e,t,n)=>{e.exports=n(820).default},571:(e,t)=>{"use strict";const n=/"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*\:/;t.parse=function(e){const i="object"==typeof(arguments.length<=1?void 0:arguments[1])&&(arguments.length<=1?void 0:arguments[1]),r=(arguments.length<=1?0:arguments.length-1)>1||!i?arguments.length<=1?void 0:arguments[1]:void 0,s=(arguments.length<=1?0:arguments.length-1)>1&&(arguments.length<=2?void 0:arguments[2])||i||{},o=JSON.parse(e,r);return"ignore"===s.protoAction?o:o&&"object"==typeof o&&e.match(n)?(t.scan(o,s),o):o},t.scan=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[e];for(;n.length;){const e=n;n=[];for(const i of e){if(Object.prototype.hasOwnProperty.call(i,"__proto__")){if("remove"!==t.protoAction)throw new SyntaxError("Object contains forbidden prototype property");delete i.__proto__}for(const e in i){const t=i[e];t&&"object"==typeof t&&n.push(i[e])}}}},t.safeParse=function(e,n){try{return t.parse(e,n)}catch(e){return null}}},369:(e,t,n)=>{var i=n(7);function r(e,t){this.logStorage=e,this.stringifyObjects=!(!t||!t.stringifyObjects)&&t.stringifyObjects,this.storeInterval=t&&t.storeInterval?t.storeInterval:3e4,this.maxEntryLength=t&&t.maxEntryLength?t.maxEntryLength:1e4,Object.keys(i.levels).forEach(function(e){this[i.levels[e]]=function(){this._log.apply(this,arguments)}.bind(this,e)}.bind(this)),this.storeLogsIntervalID=null,this.queue=[],this.totalLen=0,this.outputCache=[]}r.prototype.stringify=function(e){try{return JSON.stringify(e)}catch(e){return"[object with circular refs?]"}},r.prototype.formatLogMessage=function(e){for(var t="",n=1,r=arguments.length;n=this.maxEntryLength&&this._flush(!0,!0)},r.prototype.start=function(){this._reschedulePublishInterval()},r.prototype._reschedulePublishInterval=function(){this.storeLogsIntervalID&&(window.clearTimeout(this.storeLogsIntervalID),this.storeLogsIntervalID=null),this.storeLogsIntervalID=window.setTimeout(this._flush.bind(this,!1,!0),this.storeInterval)},r.prototype.flush=function(){this._flush(!1,!0)},r.prototype._flush=function(e,t){this.totalLen>0&&(this.logStorage.isReady()||e)&&(this.logStorage.isReady()?(this.outputCache.length&&(this.outputCache.forEach(function(e){this.logStorage.storeLogs(e)}.bind(this)),this.outputCache=[]),this.logStorage.storeLogs(this.queue)):this.outputCache.push(this.queue),this.queue=[],this.totalLen=0),t&&this._reschedulePublishInterval()},r.prototype.stop=function(){this._flush(!1,!1)},e.exports=r},7:e=>{var t={trace:0,debug:1,info:2,log:3,warn:4,error:5};s.consoleTransport=console;var n=[s.consoleTransport];s.addGlobalTransport=function(e){-1===n.indexOf(e)&&n.push(e)},s.removeGlobalTransport=function(e){var t=n.indexOf(e);-1!==t&&n.splice(t,1)};var i={};function r(){var e=arguments[0],r=arguments[1],s=Array.prototype.slice.call(arguments,2);if(!(t[r]1&&u.push("<"+o.methodName+">: ");var p=u.concat(s);d.bind(l).apply(l,p)}}}function s(e,n,i,s){this.id=n,this.options=s||{},this.transports=i,this.transports||(this.transports=[]),this.level=t[e];for(var o=Object.keys(t),a=0;a{var i=n(7),r=n(369),s={},o=[],a=i.levels.TRACE;e.exports={addGlobalTransport:function(e){i.addGlobalTransport(e)},removeGlobalTransport:function(e){i.removeGlobalTransport(e)},setGlobalOptions:function(e){i.setGlobalOptions(e)},getLogger:function(e,t,n){var r=new i(a,e,t,n);return e?(s[e]=s[e]||[],s[e].push(r)):o.push(r),r},setLogLevelById:function(e,t){for(var n=t?s[t]||[]:o,i=0;i{"use strict";var t,n="object"==typeof Reflect?Reflect:null,i=n&&"function"==typeof n.apply?n.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};t=n&&"function"==typeof n.ownKeys?n.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var r=Number.isNaN||function(e){return e!=e};function s(){s.init.call(this)}e.exports=s,e.exports.once=function(e,t){return new Promise((function(n,i){function r(n){e.removeListener(t,s),i(n)}function s(){"function"==typeof e.removeListener&&e.removeListener("error",r),n([].slice.call(arguments))}m(e,t,s,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&m(e,"error",t,{once:!0})}(e,r)}))},s.EventEmitter=s,s.prototype._events=void 0,s.prototype._eventsCount=0,s.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function c(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function l(e,t,n,i){var r,s,o,l;if(a(n),void 0===(s=e._events)?(s=e._events=Object.create(null),e._eventsCount=0):(void 0!==s.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),s=e._events),o=s[t]),void 0===o)o=s[t]=n,++e._eventsCount;else if("function"==typeof o?o=s[t]=i?[n,o]:[o,n]:i?o.unshift(n):o.push(n),(r=c(e))>0&&o.length>r&&!o.warned){o.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=o.length,l=d,console&&console.warn&&console.warn(l)}return e}function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function u(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=d.bind(i);return r.listener=n,i.wrapFn=r,r}function p(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var c=s[e];if(void 0===c)return!1;if("function"==typeof c)i(c,this,t);else{var l=c.length,d=g(c,l);for(n=0;n=0;s--)if(n[s]===t||n[s].listener===t){o=n[s].listener,r=s;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},s.prototype.listeners=function(e){return p(this,e,!0)},s.prototype.rawListeners=function(e){return p(this,e,!1)},s.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):h.call(e,t)},s.prototype.listenerCount=h,s.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,n),s.exports}return n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n(872)})()})); //# sourceMappingURL=external_api.min.js.map \ No newline at end of file diff --git a/app/features/conference/external_api.min.js.map b/app/features/conference/external_api.min.js.map new file mode 100644 index 000000000..37730631c --- /dev/null +++ b/app/features/conference/external_api.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"external_api.min.js","mappings":"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","sources":["webpack://JitsiMeetExternalAPI/webpack/universalModuleDefinition","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/js-utils/jitsi-local-storage/index.js","webpack://JitsiMeetExternalAPI/./react/features/base/util/parseURLParams.ts","webpack://JitsiMeetExternalAPI/./react/features/base/util/uri.ts","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/js-utils/transport/postis.js","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/js-utils/transport/PostMessageTransportBackend.js","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/js-utils/transport/constants.js","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/js-utils/transport/Transport.js","webpack://JitsiMeetExternalAPI/./react/features/base/util/helpers.ts","webpack://JitsiMeetExternalAPI/./modules/API/constants.js","webpack://JitsiMeetExternalAPI/./modules/transport/index.js","webpack://JitsiMeetExternalAPI/./modules/API/external/functions.js","webpack://JitsiMeetExternalAPI/./modules/API/external/external_api.js","webpack://JitsiMeetExternalAPI/./modules/API/external/index.js","webpack://JitsiMeetExternalAPI/./node_modules/@hapi/bourne/lib/index.js","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/logger/lib/LogCollector.js","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/logger/lib/Logger.js","webpack://JitsiMeetExternalAPI/./node_modules/@jitsi/logger/lib/index.js","webpack://JitsiMeetExternalAPI/./node_modules/events/events.js","webpack://JitsiMeetExternalAPI/webpack/bootstrap","webpack://JitsiMeetExternalAPI/webpack/runtime/compat get default export","webpack://JitsiMeetExternalAPI/webpack/runtime/define property getters","webpack://JitsiMeetExternalAPI/webpack/runtime/hasOwnProperty shorthand","webpack://JitsiMeetExternalAPI/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JitsiMeetExternalAPI\"] = factory();\n\telse\n\t\troot[\"JitsiMeetExternalAPI\"] = factory();\n})(self, function() {\nreturn ","import EventEmitter from 'events';\n\n/**\n * Dummy implementation of Storage interface.\n */\nclass DummyLocalStorage extends EventEmitter {\n\n /**\n * The object used for storage.\n */\n _storage = {};\n\n /**\n * Empties all keys out of the storage.\n *\n * @returns {void}\n */\n clear() {\n this._storage = {};\n }\n\n /**\n * Returns the number of data items stored in the Storage object.\n *\n * @returns {number} - The number of data items stored in the Storage object.\n */\n get length() {\n return Object.keys(this._storage).length;\n }\n\n /**\n * Will return that key's value associated to the passed key name.\n *\n * @param {string} keyName - The key name.\n * @returns {*} - The key value.\n */\n getItem(keyName) {\n return this._storage[keyName];\n }\n\n /**\n * When passed a key name and value, will add that key to the storage,\n * or update that key's value if it already exists.\n *\n * @param {string} keyName - The key name.\n * @param {*} keyValue - The key value.\n * @returns {void}\n */\n setItem(keyName, keyValue) {\n this._storage[keyName] = keyValue;\n }\n\n /**\n * When passed a key name, will remove that key from the storage.\n *\n * @param {string} keyName - The key name.\n * @returns {void}\n */\n removeItem(keyName) {\n delete this._storage[keyName];\n }\n\n /**\n * When passed a number n, this method will return the name of the nth key in the storage.\n *\n * @param {number} idx - The index of the key.\n * @returns {string} - The nth key name.\n */\n key(n) {\n const keys = Object.keys(this._storage);\n\n if (keys.length <= n) {\n return undefined;\n }\n\n return keys[n];\n }\n\n /**\n * Serializes the content of the storage.\n *\n * @param {Array} ignore - Array with keys from the local storage to be ignored.\n * @returns {string} - The serialized content.\n */\n serialize(ignore = []) {\n if (ignore.length === 0) {\n return JSON.stringify(this._storage);\n }\n\n const storageCopy = { ...this._storage };\n\n ignore.forEach(key => {\n delete storageCopy[key];\n });\n\n return JSON.stringify(storageCopy);\n }\n}\n\n/**\n * Wrapper class for browser's local storage object.\n */\nclass JitsiLocalStorage extends EventEmitter {\n /**\n * @constructor\n * @param {Storage} storage browser's local storage object.\n */\n constructor() {\n super();\n\n try {\n this._storage = window.localStorage;\n this._localStorageDisabled = false;\n } catch (ignore) {\n // localStorage throws an exception.\n }\n\n if (!this._storage) { // Handles the case when window.localStorage is undefined or throws an exception.\n console.warn('Local storage is disabled.');\n this._storage = new DummyLocalStorage();\n this._localStorageDisabled = true;\n }\n }\n\n /**\n * Returns true if window.localStorage is disabled and false otherwise.\n *\n * @returns {boolean} - True if window.localStorage is disabled and false otherwise.\n */\n isLocalStorageDisabled() {\n return this._localStorageDisabled;\n }\n\n /**\n * Empties all keys out of the storage.\n *\n * @returns {void}\n */\n clear() {\n this._storage.clear();\n this.emit('changed');\n }\n\n /**\n * Returns the number of data items stored in the Storage object.\n *\n * @returns {number} - The number of data items stored in the Storage object.\n */\n get length() {\n return this._storage.length;\n }\n\n /**\n * Returns that passed key's value.\n * @param {string} keyName the name of the key you want to retrieve\n * the value of.\n * @returns {String|null} the value of the key. If the key does not exist,\n * null is returned.\n */\n getItem(keyName) {\n return this._storage.getItem(keyName);\n }\n\n /**\n * Adds a key to the storage, or update key's value if it already exists.\n * @param {string} keyName - the name of the key you want to create/update.\n * @param {string} keyValue - the value you want to give the key you are\n * creating/updating.\n * @param {boolean} dontEmitChangedEvent - If true a changed event won't be emitted.\n */\n setItem(keyName, keyValue, dontEmitChangedEvent = false) {\n this._storage.setItem(keyName, keyValue);\n\n if (!dontEmitChangedEvent) {\n this.emit('changed');\n }\n }\n\n /**\n * Remove a key from the storage.\n * @param {string} keyName the name of the key you want to remove.\n */\n removeItem(keyName) {\n this._storage.removeItem(keyName);\n this.emit('changed');\n }\n\n /**\n * Returns the name of the nth key in the list, or null if n is greater\n * than or equal to the number of key/value pairs in the object.\n *\n * @param {number} i - The index of the key in the list.\n * @returns {string}\n */\n key(i) {\n return this._storage.key(i);\n }\n\n /**\n * Serializes the content of the storage.\n *\n * @param {Array} ignore - Array with keys from the local storage to be ignored.\n * @returns {string} - The serialized content.\n */\n serialize(ignore = []) {\n if (this.isLocalStorageDisabled()) {\n return this._storage.serialize(ignore);\n }\n\n const length = this._storage.length;\n const localStorageContent = {};\n\n for (let i = 0; i < length; i++) {\n const key = this._storage.key(i);\n\n if (!ignore.includes(key)) {\n localStorageContent[key] = this._storage.getItem(key);\n }\n }\n\n return JSON.stringify(localStorageContent);\n }\n}\n\nexport const jitsiLocalStorage = new JitsiLocalStorage();\n","// @ts-ignore\nimport Bourne from '@hapi/bourne';\nimport { reportError } from './helpers';\n/**\n * A list if keys to ignore when parsing.\n *\n * @type {string[]}\n */\nconst blacklist = ['__proto__', 'constructor', 'prototype'];\n/**\n * Parses the query/search or fragment/hash parameters out of a specific URL and\n * returns them as a JS object.\n *\n * @param {URL} url - The URL to parse.\n * @param {boolean} dontParse - If falsy, some transformations (for parsing the\n * value as JSON) will be executed.\n * @param {string} source - If {@code 'search'}, the parameters will parsed out\n * of {@code url.search}; otherwise, out of {@code url.hash}.\n * @returns {Object}\n */\nexport function parseURLParams(url, dontParse = false, source = 'hash') {\n if (typeof url === 'string') {\n // eslint-disable-next-line no-param-reassign\n url = new URL(url);\n }\n const paramStr = source === 'search' ? url.search : url.hash;\n const params = {};\n const paramParts = paramStr?.substr(1).split('&') || [];\n // Detect and ignore hash params for hash routers.\n if (source === 'hash' && paramParts.length === 1) {\n const firstParam = paramParts[0];\n if (firstParam.startsWith('/') && firstParam.split('&').length === 1) {\n return params;\n }\n }\n paramParts.forEach(part => {\n const param = part.split('=');\n const key = param[0];\n if (!key || key.split('.').some(k => blacklist.includes(k))) {\n return;\n }\n let value;\n try {\n value = param[1];\n if (!dontParse) {\n const decoded = decodeURIComponent(value).replace(/\\\\&/, '&');\n value = decoded === 'undefined' ? undefined : Bourne.parse(decoded);\n }\n }\n catch (e) {\n reportError(e, `Failed to parse URL parameter value: ${String(value)}`);\n return;\n }\n params[key] = value;\n });\n return params;\n}\n","import { parseURLParams } from './parseURLParams';\nimport { normalizeNFKC } from './strings';\n/**\n * Http status codes.\n */\nexport var StatusCode;\n(function (StatusCode) {\n StatusCode[StatusCode[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n})(StatusCode || (StatusCode = {}));\n/**\n * The app linking scheme.\n * TODO: This should be read from the manifest files later.\n */\nexport const APP_LINK_SCHEME = 'org.jitsi.meet:';\n/**\n * A list of characters to be excluded/removed from the room component/segment\n * of a conference/meeting URI/URL. The list is based on RFC 3986 and the jxmpp\n * library utilized by jicofo.\n */\nconst _ROOM_EXCLUDE_PATTERN = '[\\\\:\\\\?#\\\\[\\\\]@!$&\\'()*+,;=>} The {@code Array} with URL parameter {@code String}s\n * constructed out of the specified {@code obj}.\n */\nfunction _objectToURLParamsArray(obj = {}) {\n const params = [];\n for (const key in obj) { // eslint-disable-line guard-for-in\n try {\n params.push(`${key}=${encodeURIComponent(JSON.stringify(obj[key]))}`);\n }\n catch (e) {\n console.warn(`Error encoding ${key}: ${e}`);\n }\n }\n return params;\n}\n/**\n * Parses a specific URI string into an object with the well-known properties of\n * the {@link Location} and/or {@link URL} interfaces implemented by Web\n * browsers. The parsing attempts to be in accord with IETF's RFC 3986.\n *\n * @param {string} str - The URI string to parse.\n * @public\n * @returns {{\n * hash: string,\n * host: (string|undefined),\n * hostname: (string|undefined),\n * pathname: string,\n * port: (string|undefined),\n * protocol: (string|undefined),\n * search: string\n * }}\n */\nexport function parseStandardURIString(str) {\n /* eslint-disable no-param-reassign */\n const obj = {\n toString: _standardURIToString\n };\n let regex;\n let match;\n // XXX A URI string as defined by RFC 3986 does not contain any whitespace.\n // Usually, a browser will have already encoded any whitespace. In order to\n // avoid potential later problems related to whitespace in URI, strip any\n // whitespace. Anyway, the Jitsi Meet app is not known to utilize unencoded\n // whitespace so the stripping is deemed safe.\n str = str.replace(/\\s/g, '');\n // protocol\n regex = new RegExp(URI_PROTOCOL_PATTERN, 'gi');\n match = regex.exec(str);\n if (match) {\n obj.protocol = match[1].toLowerCase();\n str = str.substring(regex.lastIndex);\n }\n // authority\n regex = new RegExp(`^${_URI_AUTHORITY_PATTERN}`, 'gi');\n match = regex.exec(str);\n if (match) {\n let authority = match[1].substring(/* // */ 2);\n str = str.substring(regex.lastIndex);\n // userinfo\n const userinfoEndIndex = authority.indexOf('@');\n if (userinfoEndIndex !== -1) {\n authority = authority.substring(userinfoEndIndex + 1);\n }\n // @ts-ignore\n obj.host = authority;\n // port\n const portBeginIndex = authority.lastIndexOf(':');\n if (portBeginIndex !== -1) {\n obj.port = authority.substring(portBeginIndex + 1);\n authority = authority.substring(0, portBeginIndex);\n }\n // hostname\n obj.hostname = authority;\n }\n // pathname\n regex = new RegExp(`^${_URI_PATH_PATTERN}`, 'gi');\n match = regex.exec(str);\n let pathname;\n if (match) {\n pathname = match[1];\n str = str.substring(regex.lastIndex);\n }\n if (pathname) {\n pathname.startsWith('/') || (pathname = `/${pathname}`);\n }\n else {\n pathname = '/';\n }\n obj.pathname = pathname;\n // query\n if (str.startsWith('?')) {\n let hashBeginIndex = str.indexOf('#', 1);\n if (hashBeginIndex === -1) {\n hashBeginIndex = str.length;\n }\n obj.search = str.substring(0, hashBeginIndex);\n str = str.substring(hashBeginIndex);\n }\n else {\n obj.search = ''; // Google Chrome\n }\n // fragment\n obj.hash = str.startsWith('#') ? str : '';\n /* eslint-enable no-param-reassign */\n return obj;\n}\n/**\n * Parses a specific URI which (supposedly) references a Jitsi Meet resource\n * (location).\n *\n * @param {(string|undefined)} uri - The URI to parse which (supposedly)\n * references a Jitsi Meet resource (location).\n * @public\n * @returns {{\n * contextRoot: string,\n * hash: string,\n * host: string,\n * hostname: string,\n * pathname: string,\n * port: string,\n * protocol: string,\n * room: (string|undefined),\n * search: string\n * }}\n */\nexport function parseURIString(uri) {\n if (typeof uri !== 'string') {\n return undefined;\n }\n const obj = parseStandardURIString(_fixURIStringScheme(uri));\n // XXX While the components/segments of pathname are URI encoded, Jitsi Meet\n // on the client and/or server sides still don't support certain characters.\n obj.pathname = obj.pathname.split('/').map((pathPart) => _fixPathPart(pathPart))\n .join('/');\n // Add the properties that are specific to a Jitsi Meet resource (location)\n // such as contextRoot, room:\n // contextRoot\n // @ts-ignore\n obj.contextRoot = getLocationContextRoot(obj);\n // The room (name) is the last component/segment of pathname.\n const { pathname } = obj;\n const contextRootEndIndex = pathname.lastIndexOf('/');\n obj.room = pathname.substring(contextRootEndIndex + 1) || undefined;\n if (contextRootEndIndex > 1) {\n // The part of the pathname from the beginning to the room name is the tenant.\n obj.tenant = pathname.substring(1, contextRootEndIndex);\n }\n return obj;\n}\n/**\n * Implements {@code href} and {@code toString} for the {@code Object} returned\n * by {@link #parseStandardURIString}.\n *\n * @param {Object} [thiz] - An {@code Object} returned by\n * {@code #parseStandardURIString} if any; otherwise, it is presumed that the\n * function is invoked on such an instance.\n * @returns {string}\n */\nfunction _standardURIToString(thiz) {\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-invalid-this\n const { hash, host, pathname, protocol, search } = thiz || this;\n let str = '';\n protocol && (str += protocol);\n // TODO userinfo\n host && (str += `//${host}`);\n str += pathname || '/';\n search && (str += search);\n hash && (str += hash);\n return str;\n}\n/**\n * Sometimes we receive strings that we don't know if already percent-encoded, or not, due to the\n * various sources we get URLs or room names. This function encapsulates the decoding in a safe way.\n *\n * @param {string} text - The text to decode.\n * @returns {string}\n */\nexport function safeDecodeURIComponent(text) {\n try {\n return decodeURIComponent(text);\n }\n catch (e) {\n // The text wasn't encoded.\n }\n return text;\n}\n/**\n * Attempts to return a {@code String} representation of a specific\n * {@code Object} which is supposed to represent a URL. Obviously, if a\n * {@code String} is specified, it is returned. If a {@code URL} is specified,\n * its {@code URL#href} is returned. Additionally, an {@code Object} similar to\n * the one accepted by the constructor of Web's ExternalAPI is supported on both\n * mobile/React Native and Web/React.\n *\n * @param {Object|string} obj - The URL to return a {@code String}\n * representation of.\n * @returns {string} - A {@code String} representation of the specified\n * {@code obj} which is supposed to represent a URL.\n */\nexport function toURLString(obj) {\n let str;\n switch (typeof obj) {\n case 'object':\n if (obj) {\n if (obj instanceof URL) {\n str = obj.href;\n }\n else {\n str = urlObjectToString(obj);\n }\n }\n break;\n case 'string':\n str = String(obj);\n break;\n }\n return str;\n}\n/**\n * Attempts to return a {@code String} representation of a specific\n * {@code Object} similar to the one accepted by the constructor\n * of Web's ExternalAPI.\n *\n * @param {Object} o - The URL to return a {@code String} representation of.\n * @returns {string} - A {@code String} representation of the specified\n * {@code Object}.\n */\nexport function urlObjectToString(o) {\n // First normalize the given url. It come as o.url or split into o.serverURL\n // and o.room.\n let tmp;\n if (o.serverURL && o.room) {\n tmp = new URL(o.room, o.serverURL).toString();\n }\n else if (o.room) {\n tmp = o.room;\n }\n else {\n tmp = o.url || '';\n }\n const url = parseStandardURIString(_fixURIStringScheme(tmp));\n // protocol\n if (!url.protocol) {\n let protocol = o.protocol || o.scheme;\n if (protocol) {\n // Protocol is supposed to be the scheme and the final ':'. Anyway,\n // do not make a fuss if the final ':' is not there.\n protocol.endsWith(':') || (protocol += ':');\n url.protocol = protocol;\n }\n }\n // authority & pathname\n let { pathname } = url;\n if (!url.host) {\n // Web's ExternalAPI domain\n //\n // It may be host/hostname and pathname with the latter denoting the\n // tenant.\n const domain = o.domain || o.host || o.hostname;\n if (domain) {\n const { host, hostname, pathname: contextRoot, port } = parseStandardURIString(\n // XXX The value of domain in supposed to be host/hostname\n // and, optionally, pathname. Make sure it is not taken for\n // a pathname only.\n _fixURIStringScheme(`${APP_LINK_SCHEME}//${domain}`));\n // authority\n if (host) {\n url.host = host;\n url.hostname = hostname;\n url.port = port;\n }\n // pathname\n pathname === '/' && contextRoot !== '/' && (pathname = contextRoot);\n }\n }\n // pathname\n // Web's ExternalAPI roomName\n const room = o.roomName || o.room;\n if (room\n && (url.pathname.endsWith('/')\n || !url.pathname.endsWith(`/${room}`))) {\n pathname.endsWith('/') || (pathname += '/');\n pathname += room;\n }\n url.pathname = pathname;\n // query/search\n // Web's ExternalAPI jwt and lang\n const { jwt, lang, release } = o;\n const search = new URLSearchParams(url.search);\n if (jwt) {\n search.set('jwt', jwt);\n }\n const { defaultLanguage } = o.configOverwrite || {};\n if (lang || defaultLanguage) {\n search.set('lang', lang || defaultLanguage);\n }\n if (release) {\n search.set('release', release);\n }\n const searchString = search.toString();\n if (searchString) {\n url.search = `?${searchString}`;\n }\n // fragment/hash\n let { hash } = url;\n for (const urlPrefix of ['config', 'interfaceConfig', 'devices', 'userInfo', 'appData']) {\n const urlParamsArray = _objectToURLParamsArray(o[`${urlPrefix}Overwrite`]\n || o[urlPrefix]\n || o[`${urlPrefix}Override`]);\n if (urlParamsArray.length) {\n let urlParamsString = `${urlPrefix}.${urlParamsArray.join(`&${urlPrefix}.`)}`;\n if (hash.length) {\n urlParamsString = `&${urlParamsString}`;\n }\n else {\n hash = '#';\n }\n hash += urlParamsString;\n }\n }\n url.hash = hash;\n return url.toString() || undefined;\n}\n/**\n * Adds hash params to URL.\n *\n * @param {URL} url - The URL.\n * @param {Object} hashParamsToAdd - A map with the parameters to be set.\n * @returns {URL} - The new URL.\n */\nexport function addHashParamsToURL(url, hashParamsToAdd = {}) {\n const params = parseURLParams(url);\n const urlParamsArray = _objectToURLParamsArray({\n ...params,\n ...hashParamsToAdd\n });\n if (urlParamsArray.length) {\n url.hash = `#${urlParamsArray.join('&')}`;\n }\n return url;\n}\n/**\n * Returns the decoded URI.\n *\n * @param {string} uri - The URI to decode.\n * @returns {string}\n */\nexport function getDecodedURI(uri) {\n return decodeURI(uri.replace(/^https?:\\/\\//i, ''));\n}\n/**\n * Adds new param to a url string. Checks whether to use '?' or '&' as a separator (checks for already existing params).\n *\n * @param {string} url - The url to modify.\n * @param {string} name - The param name to add.\n * @param {string} value - The value for the param.\n *\n * @returns {string} - The modified url.\n */\nexport function appendURLParam(url, name, value) {\n const newUrl = new URL(url);\n newUrl.searchParams.append(name, value);\n return newUrl.toString();\n}\n","/* eslint-disable */\n\n// Originally: https://github.com/adtile/postis\n//\n// The MIT License\n// \n// Copyright (c) 2015-2015 Adtile Technologies Inc. http://www.adtile.me\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction Postis(options) {\n var scope = options.scope;\n var targetWindow = options.window;\n var windowForEventListening = options.windowForEventListening || window;\n var allowedOrigin = options.allowedOrigin;\n var listeners = {};\n var sendBuffer = [];\n var listenBuffer = {};\n var ready = false;\n var readyMethod = \"__ready__\";\n var readynessCheck;\n\n var listener = function(event) {\n var data;\n try {\n data = JSON.parse(event.data);\n } catch (e) {\n return;\n }\n\n if (allowedOrigin && event.origin !== allowedOrigin) {\n return;\n }\n\n if (data && data.postis && data.scope === scope) {\n var listenersForMethod = listeners[data.method];\n if (listenersForMethod) {\n for (var i = 0; i < listenersForMethod.length; i++) {\n listenersForMethod[i].call(null, data.params);\n }\n } else {\n listenBuffer[data.method] = listenBuffer[data.method] || [];\n listenBuffer[data.method].push(data.params);\n }\n }\n };\n\n windowForEventListening.addEventListener(\"message\", listener, false);\n\n var postis = {\n listen: function (method, callback) {\n listeners[method] = listeners[method] || [];\n listeners[method].push(callback);\n\n var listenBufferForMethod = listenBuffer[method];\n if (listenBufferForMethod) {\n var listenersForMethod = listeners[method];\n for (var i = 0; i < listenersForMethod.length; i++) {\n for (var j = 0; j < listenBufferForMethod.length; j++) {\n listenersForMethod[i].call(null, listenBufferForMethod[j]);\n }\n }\n }\n delete listenBuffer[method];\n },\n\n send: function (opts) {\n var method = opts.method;\n\n if ((ready || opts.method === readyMethod) && (targetWindow && typeof targetWindow.postMessage === \"function\")) {\n targetWindow.postMessage(JSON.stringify({\n postis: true,\n scope: scope,\n method: method,\n params: opts.params\n }), \"*\");\n } else {\n sendBuffer.push(opts);\n }\n },\n\n ready: function (callback) {\n if (ready) {\n callback();\n } else {\n setTimeout(function () { postis.ready(callback); }, 50);\n }\n },\n\n destroy: function (callback) {\n clearInterval(readynessCheck);\n ready = false;\n if (windowForEventListening && typeof windowForEventListening.removeEventListener === \"function\") {\n windowForEventListening.removeEventListener(\"message\", listener);\n }\n callback && callback();\n }\n };\n\n var readyCheckID = +new Date() + Math.random() + \"\";\n\n readynessCheck = setInterval(function () {\n postis.send({\n method: readyMethod,\n params: readyCheckID\n });\n }, 50);\n\n postis.listen(readyMethod, function (id) {\n if (id === readyCheckID) {\n clearInterval(readynessCheck);\n ready = true;\n\n for (var i = 0; i < sendBuffer.length; i++) {\n postis.send(sendBuffer[i]);\n }\n sendBuffer = [];\n } else {\n postis.send({\n method: readyMethod,\n params: id\n });\n }\n });\n\n return postis;\n}\n\nexport default Postis;\n","import Postis from './postis.js';\n\n/**\n * The default options for postis.\n *\n * @type {Object}\n */\nconst DEFAULT_POSTIS_OPTIONS = {\n window: window.opener || window.parent\n};\n\n/**\n * The postis method used for all messages.\n *\n * @type {string}\n */\nconst POSTIS_METHOD_NAME = 'message';\n\n/**\n * Implements message transport using the postMessage API.\n */\nexport default class PostMessageTransportBackend {\n /**\n * Creates new PostMessageTransportBackend instance.\n *\n * @param {Object} options - Optional parameters for configuration of the\n * transport.\n */\n constructor({ postisOptions } = {}) {\n // eslint-disable-next-line new-cap\n this.postis = Postis({\n ...DEFAULT_POSTIS_OPTIONS,\n ...postisOptions\n });\n\n this._receiveCallback = () => {\n // Do nothing until a callback is set by the consumer of\n // PostMessageTransportBackend via setReceiveCallback.\n };\n\n this.postis.listen(\n POSTIS_METHOD_NAME,\n message => this._receiveCallback(message));\n }\n\n /**\n * Disposes the allocated resources.\n *\n * @returns {void}\n */\n dispose() {\n this.postis.destroy();\n }\n\n /**\n * Sends the passed message.\n *\n * @param {Object} message - The message to be sent.\n * @returns {void}\n */\n send(message) {\n this.postis.send({\n method: POSTIS_METHOD_NAME,\n params: message\n });\n }\n\n /**\n * Sets the callback for receiving data.\n *\n * @param {Function} callback - The new callback.\n * @returns {void}\n */\n setReceiveCallback(callback) {\n this._receiveCallback = callback;\n }\n}\n","/**\n * The message type for events.\n *\n * @type {string}\n */\nexport const MESSAGE_TYPE_EVENT = 'event';\n\n/**\n * The message type for requests.\n *\n * @type {string}\n */\nexport const MESSAGE_TYPE_REQUEST = 'request';\n\n/**\n * The message type for responses.\n *\n * @type {string}\n */\nexport const MESSAGE_TYPE_RESPONSE = 'response';\n","import {\n MESSAGE_TYPE_EVENT,\n MESSAGE_TYPE_REQUEST,\n MESSAGE_TYPE_RESPONSE\n} from './constants.js';\n\n/**\n* Stores the currnet transport backend that have to be used. Also implements\n* request/response mechanism.\n*/\nexport default class Transport {\n /**\n * Creates new instance.\n *\n * @param {Object} options - Optional parameters for configuration of the\n * transport backend.\n */\n constructor({ backend } = {}) {\n /**\n * Maps an event name and listener that have been added to the Transport\n * instance.\n *\n * @type {Map}\n */\n this._listeners = new Map();\n\n /**\n * The request ID counter used for the id property of the request. This\n * property is used to match the responses with the request.\n *\n * @type {number}\n */\n this._requestID = 0;\n\n /**\n * Maps an IDs of the requests and handlers that will process the\n * responses of those requests.\n *\n * @type {Map}\n */\n this._responseHandlers = new Map();\n\n /**\n * A set with the events and requests that were received but not\n * processed by any listener. They are later passed on every new\n * listener until they are processed.\n *\n * @type {Set}\n */\n this._unprocessedMessages = new Set();\n\n /**\n * Alias.\n */\n this.addListener = this.on;\n\n if (backend) {\n this.setBackend(backend);\n }\n }\n\n /**\n * Disposes the current transport backend.\n *\n * @returns {void}\n */\n _disposeBackend() {\n if (this._backend) {\n this._backend.dispose();\n this._backend = null;\n }\n }\n\n /**\n * Handles incoming messages from the transport backend.\n *\n * @param {Object} message - The message.\n * @returns {void}\n */\n _onMessageReceived(message) {\n if (message.type === MESSAGE_TYPE_RESPONSE) {\n const handler = this._responseHandlers.get(message.id);\n\n if (handler) {\n handler(message);\n this._responseHandlers.delete(message.id);\n }\n } else if (message.type === MESSAGE_TYPE_REQUEST) {\n this.emit('request', message.data, (result, error) => {\n this._backend.send({\n type: MESSAGE_TYPE_RESPONSE,\n error,\n id: message.id,\n result\n });\n });\n } else {\n this.emit('event', message.data);\n }\n }\n\n /**\n * Disposes the allocated resources.\n *\n * @returns {void}\n */\n dispose() {\n this._responseHandlers.clear();\n this._unprocessedMessages.clear();\n this.removeAllListeners();\n this._disposeBackend();\n }\n\n /**\n * Calls each of the listeners registered for the event named eventName, in\n * the order they were registered, passing the supplied arguments to each.\n *\n * @param {string} eventName - The name of the event.\n * @returns {boolean} True if the event has been processed by any listener,\n * false otherwise.\n */\n emit(eventName, ...args) {\n const listenersForEvent = this._listeners.get(eventName);\n let isProcessed = false;\n\n if (listenersForEvent && listenersForEvent.size) {\n listenersForEvent.forEach(listener => {\n isProcessed = listener(...args) || isProcessed;\n });\n }\n\n if (!isProcessed) {\n this._unprocessedMessages.add(args);\n }\n\n return isProcessed;\n }\n\n /**\n * Adds the listener function to the listeners collection for the event\n * named eventName.\n *\n * @param {string} eventName - The name of the event.\n * @param {Function} listener - The listener that will be added.\n * @returns {Transport} References to the instance of Transport class, so\n * that calls can be chained.\n */\n on(eventName, listener) {\n let listenersForEvent = this._listeners.get(eventName);\n\n if (!listenersForEvent) {\n listenersForEvent = new Set();\n this._listeners.set(eventName, listenersForEvent);\n }\n\n listenersForEvent.add(listener);\n\n this._unprocessedMessages.forEach(args => {\n if (listener(...args)) {\n this._unprocessedMessages.delete(args);\n }\n });\n\n return this;\n }\n\n /**\n * Removes all listeners, or those of the specified eventName.\n *\n * @param {string} [eventName] - The name of the event. If this parameter is\n * not specified all listeners will be removed.\n * @returns {Transport} References to the instance of Transport class, so\n * that calls can be chained.\n */\n removeAllListeners(eventName) {\n if (eventName) {\n this._listeners.delete(eventName);\n } else {\n this._listeners.clear();\n }\n\n return this;\n }\n\n /**\n * Removes the listener function from the listeners collection for the event\n * named eventName.\n *\n * @param {string} eventName - The name of the event.\n * @param {Function} listener - The listener that will be removed.\n * @returns {Transport} References to the instance of Transport class, so\n * that calls can be chained.\n */\n removeListener(eventName, listener) {\n const listenersForEvent = this._listeners.get(eventName);\n\n if (listenersForEvent) {\n listenersForEvent.delete(listener);\n }\n\n return this;\n }\n\n /**\n * Sends the passed event.\n *\n * @param {Object} event - The event to be sent.\n * @returns {void}\n */\n sendEvent(event = {}) {\n if (this._backend) {\n this._backend.send({\n type: MESSAGE_TYPE_EVENT,\n data: event\n });\n }\n }\n\n /**\n * Sending request.\n *\n * @param {Object} request - The request to be sent.\n * @returns {Promise}\n */\n sendRequest(request) {\n if (!this._backend) {\n return Promise.reject(new Error('No transport backend defined!'));\n }\n\n this._requestID++;\n\n const id = this._requestID;\n\n return new Promise((resolve, reject) => {\n this._responseHandlers.set(id, ({ error, result }) => {\n if (typeof result !== 'undefined') {\n resolve(result);\n\n // eslint-disable-next-line no-negated-condition\n } else if (typeof error !== 'undefined') {\n reject(error);\n } else { // no response\n reject(new Error('Unexpected response format!'));\n }\n });\n\n this._backend.send({\n type: MESSAGE_TYPE_REQUEST,\n data: request,\n id\n });\n });\n }\n\n /**\n * Changes the current backend transport.\n *\n * @param {Object} backend - The new transport backend that will be used.\n * @returns {void}\n */\n setBackend(backend) {\n this._disposeBackend();\n\n this._backend = backend;\n this._backend.setReceiveCallback(this._onMessageReceived.bind(this));\n }\n}\n","/**\n * A helper function that behaves similar to Object.assign, but only reassigns a\n * property in target if it's defined in source.\n *\n * @param {Object} target - The target object to assign the values into.\n * @param {Object} source - The source object.\n * @returns {Object}\n */\nexport function assignIfDefined(target, source) {\n const to = Object(target);\n for (const nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n const value = source[nextKey];\n if (typeof value !== 'undefined') {\n to[nextKey] = value;\n }\n }\n }\n return to;\n}\n/**\n * Creates a deferred object.\n *\n * @returns {{promise, resolve, reject}}\n */\nexport function createDeferred() {\n const deferred = {};\n deferred.promise = new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n });\n return deferred;\n}\nconst MATCH_OPERATOR_REGEXP = /[|\\\\{}()[\\]^$+*?.-]/g;\n/**\n * Escape RegExp special characters.\n *\n * Based on https://github.com/sindresorhus/escape-string-regexp.\n *\n * @param {string} s - The regexp string to escape.\n * @returns {string}\n */\nexport function escapeRegexp(s) {\n if (typeof s !== 'string') {\n throw new TypeError('Expected a string');\n }\n return s.replace(MATCH_OPERATOR_REGEXP, '\\\\$&');\n}\n/**\n * Returns the base URL of the app.\n *\n * @param {Object} w - Window object to use instead of the built in one.\n * @returns {string}\n */\nexport function getBaseUrl(w = window) {\n const doc = w.document;\n const base = doc.querySelector('base');\n if (base?.href) {\n return base.href;\n }\n const { protocol, host } = w.location;\n return `${protocol}//${host}`;\n}\n/**\n * Returns the namespace for all global variables, functions, etc that we need.\n *\n * @returns {Object} The namespace.\n *\n * NOTE: After React-ifying everything this should be the only global.\n */\nexport function getJitsiMeetGlobalNS() {\n if (!window.JitsiMeetJS) {\n window.JitsiMeetJS = {};\n }\n if (!window.JitsiMeetJS.app) {\n window.JitsiMeetJS.app = {};\n }\n return window.JitsiMeetJS.app;\n}\n/**\n * Prints the error and reports it to the global error handler.\n *\n * @param {Error} e - The error object.\n * @param {string} msg - A custom message to print in addition to the error.\n * @returns {void}\n */\nexport function reportError(e, msg = '') {\n console.error(msg, e);\n window.onerror?.(msg, undefined, undefined, undefined, e);\n}\n/**\n * Adds alpha to a color css string.\n *\n * @param {string} color - The color string either in rgb... Or #... Format.\n * @param {number} opacity -The opacity(alpha) to apply to the color. Can take a value between 0 and 1, including.\n * @returns {string} - The color with applied alpha.\n */\nexport function setColorAlpha(color, opacity) {\n if (!color) {\n return `rgba(0, 0, 0, ${opacity})`;\n }\n let b, g, r;\n try {\n if (color.startsWith('rgb')) {\n [r, g, b] = color.split('(')[1].split(')')[0].split(',').map(c => c.trim());\n }\n else if (color.startsWith('#')) {\n if (color.length === 4) {\n [r, g, b] = parseShorthandColor(color);\n }\n else {\n r = parseInt(color.substring(1, 3), 16);\n g = parseInt(color.substring(3, 5), 16);\n b = parseInt(color.substring(5, 7), 16);\n }\n }\n else {\n return color;\n }\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n catch {\n return color;\n }\n}\n/**\n * Gets the hexa rgb values for a shorthand css color.\n *\n * @param {string} color -\n * @returns {Array} - Array containing parsed r, g, b values of the color.\n */\nfunction parseShorthandColor(color) {\n let b, g, r;\n r = color.substring(1, 2);\n r += r;\n r = parseInt(r, 16);\n g = color.substring(2, 3);\n g += g;\n g = parseInt(g, 16);\n b = color.substring(3, 4);\n b += b;\n b = parseInt(b, 16);\n return [r, g, b];\n}\n/**\n * Sorts an object by a sort function, same functionality as array.sort().\n *\n * @param {Object} object - The data object.\n * @param {Function} callback - The sort function.\n * @returns {void}\n */\nexport function objectSort(object, callback) {\n return Object.entries(object)\n .sort(([, a], [, b]) => callback(a, b))\n .reduce((row, [key, value]) => {\n return { ...row,\n [key]: value };\n }, {});\n}\n","// XXX The function parseURLParams is exported by the feature base/util (as\n// defined in the terminology of react/). However, this file is (very likely)\n// bundled in external_api in addition to app.bundle and, consequently, it is\n// best to import as little as possible here (rather than the whole feature\n// base/util) in order to minimize the amount of source code bundled into\n// multiple bundles.\nimport { parseURLParams } from '../../react/features/base/util/parseURLParams';\n\n/**\n * JitsiMeetExternalAPI id - unique for a webpage.\n */\nexport const API_ID = parseURLParams(window.location).jitsi_meet_external_api_id;\n\n/**\n * The payload name for the datachannel/endpoint text message event.\n */\nexport const ENDPOINT_TEXT_MESSAGE_NAME = 'endpoint-text-message';\n","// FIXME: change to '../API' when we update to webpack2. If we do this now all\n// files from API modules will be included in external_api.js.\nimport { PostMessageTransportBackend, Transport } from '@jitsi/js-utils/transport';\n\nimport { getJitsiMeetGlobalNS } from '../../react/features/base/util';\nimport { API_ID } from '../API/constants';\n\n\nexport {\n PostMessageTransportBackend,\n Transport\n};\n\n/**\n * Option for the default low level transport.\n *\n * @type {Object}\n */\nconst postisOptions = {};\n\nif (typeof API_ID === 'number') {\n postisOptions.scope = `jitsi_meet_external_api_${API_ID}`;\n}\n\n/**\n * The instance of Transport class that will be used by Jitsi Meet.\n *\n * @type {Transport}\n */\nlet transport;\n\n/**\n * Returns the instance of Transport class that will be used by Jitsi Meet.\n *\n * @returns {Transport}\n */\nexport function getJitsiMeetTransport() {\n if (!transport) {\n transport = new Transport({ backend: new PostMessageTransportBackend({ postisOptions }) });\n }\n\n return transport;\n}\n\n/**\n * Sets the transport to passed transport.\n *\n * @param {Object} externalTransportBackend - The new transport.\n * @returns {void}\n */\ngetJitsiMeetGlobalNS().setExternalTransportBackend = externalTransportBackend =>\n transport.setBackend(externalTransportBackend);\n","// @flow\n\nimport Logger from '@jitsi/logger';\n\nconst logger = Logger.getLogger(__filename);\n\n/**\n * Returns Promise that resolves with result an list of available devices.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @returns {Promise}\n */\nexport function getAvailableDevices(transport: Object) {\n return transport.sendRequest({\n type: 'devices',\n name: 'getAvailableDevices'\n }).catch(e => {\n logger.error(e);\n\n return {};\n });\n}\n\n/**\n * Returns Promise that resolves with current selected devices.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @returns {Promise}\n */\nexport function getCurrentDevices(transport: Object) {\n return transport.sendRequest({\n type: 'devices',\n name: 'getCurrentDevices'\n }).catch(e => {\n logger.error(e);\n\n return {};\n });\n}\n\n/**\n * Returns Promise that resolves with true if the device change is available\n * and with false if not.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @param {string} [deviceType] - Values - 'output', 'input' or undefined.\n * Default - 'input'.\n * @returns {Promise}\n */\nexport function isDeviceChangeAvailable(transport: Object, deviceType: string) {\n return transport.sendRequest({\n deviceType,\n type: 'devices',\n name: 'isDeviceChangeAvailable'\n });\n}\n\n/**\n * Returns Promise that resolves with true if the device list is available\n * and with false if not.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @returns {Promise}\n */\nexport function isDeviceListAvailable(transport: Object) {\n return transport.sendRequest({\n type: 'devices',\n name: 'isDeviceListAvailable'\n });\n}\n\n/**\n * Returns Promise that resolves with true if multiple audio input is supported\n * and with false if not.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @returns {Promise}\n */\nexport function isMultipleAudioInputSupported(transport: Object) {\n return transport.sendRequest({\n type: 'devices',\n name: 'isMultipleAudioInputSupported'\n });\n}\n\n/**\n * Sets the audio input device to the one with the label or id that is passed.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @param {string} label - The label of the new device.\n * @param {string} id - The id of the new device.\n * @returns {Promise}\n */\nexport function setAudioInputDevice(transport: Object, label: string, id: string) {\n return _setDevice(transport, {\n id,\n kind: 'audioinput',\n label\n });\n}\n\n/**\n * Sets the audio output device to the one with the label or id that is passed.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @param {string} label - The label of the new device.\n * @param {string} id - The id of the new device.\n * @returns {Promise}\n */\nexport function setAudioOutputDevice(transport: Object, label: string, id: string) {\n return _setDevice(transport, {\n id,\n kind: 'audiooutput',\n label\n });\n}\n\n/**\n * Sets the currently used device to the one that is passed.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @param {Object} device - The new device to be used.\n * @returns {Promise}\n */\nfunction _setDevice(transport: Object, device) {\n return transport.sendRequest({\n type: 'devices',\n name: 'setDevice',\n device\n });\n}\n\n/**\n * Sets the video input device to the one with the label or id that is passed.\n *\n * @param {Transport} transport - The @code{Transport} instance responsible for\n * the external communication.\n * @param {string} label - The label of the new device.\n * @param {string} id - The id of the new device.\n * @returns {Promise}\n */\nexport function setVideoInputDevice(transport: Object, label: string, id: string) {\n return _setDevice(transport, {\n id,\n kind: 'videoinput',\n label\n });\n}\n","import { jitsiLocalStorage } from '@jitsi/js-utils/jitsi-local-storage';\nimport EventEmitter from 'events';\n\nimport { urlObjectToString } from '../../../react/features/base/util/uri';\nimport {\n PostMessageTransportBackend,\n Transport\n} from '../../transport';\n\nimport {\n getAvailableDevices,\n getCurrentDevices,\n isDeviceChangeAvailable,\n isDeviceListAvailable,\n isMultipleAudioInputSupported,\n setAudioInputDevice,\n setAudioOutputDevice,\n setVideoInputDevice\n} from './functions';\n\nconst ALWAYS_ON_TOP_FILENAMES = [\n 'css/all.css', 'libs/alwaysontop.min.js'\n];\n\n/**\n * Maps the names of the commands expected by the API with the name of the\n * commands expected by jitsi-meet.\n */\nconst commands = {\n addBreakoutRoom: 'add-breakout-room',\n answerKnockingParticipant: 'answer-knocking-participant',\n approveVideo: 'approve-video',\n askToUnmute: 'ask-to-unmute',\n autoAssignToBreakoutRooms: 'auto-assign-to-breakout-rooms',\n avatarUrl: 'avatar-url',\n cancelPrivateChat: 'cancel-private-chat',\n closeBreakoutRoom: 'close-breakout-room',\n displayName: 'display-name',\n e2eeKey: 'e2ee-key',\n endConference: 'end-conference',\n email: 'email',\n grantModerator: 'grant-moderator',\n hangup: 'video-hangup',\n hideNotification: 'hide-notification',\n initiatePrivateChat: 'initiate-private-chat',\n joinBreakoutRoom: 'join-breakout-room',\n localSubject: 'local-subject',\n kickParticipant: 'kick-participant',\n muteEveryone: 'mute-everyone',\n overwriteConfig: 'overwrite-config',\n overwriteNames: 'overwrite-names',\n password: 'password',\n pinParticipant: 'pin-participant',\n rejectParticipant: 'reject-participant',\n removeBreakoutRoom: 'remove-breakout-room',\n resizeFilmStrip: 'resize-film-strip',\n resizeLargeVideo: 'resize-large-video',\n _requestDesktopSourcesResult: '_request-desktop-sources-result',\n sendChatMessage: 'send-chat-message',\n sendEndpointTextMessage: 'send-endpoint-text-message',\n sendParticipantToRoom: 'send-participant-to-room',\n sendTones: 'send-tones',\n setFollowMe: 'set-follow-me',\n setLargeVideoParticipant: 'set-large-video-participant',\n setMediaEncryptionKey: 'set-media-encryption-key',\n setNoiseSuppressionEnabled: 'set-noise-suppression-enabled',\n setParticipantVolume: 'set-participant-volume',\n setSubtitles: 'set-subtitles',\n setTileView: 'set-tile-view',\n setVideoQuality: 'set-video-quality',\n showNotification: 'show-notification',\n startRecording: 'start-recording',\n startShareVideo: 'start-share-video',\n stopRecording: 'stop-recording',\n stopShareVideo: 'stop-share-video',\n subject: 'subject',\n submitFeedback: 'submit-feedback',\n toggleAudio: 'toggle-audio',\n toggleCamera: 'toggle-camera',\n toggleCameraMirror: 'toggle-camera-mirror',\n toggleChat: 'toggle-chat',\n toggleE2EE: 'toggle-e2ee',\n toggleFilmStrip: 'toggle-film-strip',\n toggleLobby: 'toggle-lobby',\n toggleModeration: 'toggle-moderation',\n toggleNoiseSuppression: 'toggle-noise-suppression',\n toggleParticipantsPane: 'toggle-participants-pane',\n toggleRaiseHand: 'toggle-raise-hand',\n toggleShareScreen: 'toggle-share-screen',\n toggleSubtitles: 'toggle-subtitles',\n toggleTileView: 'toggle-tile-view',\n toggleVirtualBackgroundDialog: 'toggle-virtual-background',\n toggleVideo: 'toggle-video'\n};\n\n/**\n * Maps the names of the events expected by the API with the name of the\n * events expected by jitsi-meet.\n */\nconst events = {\n 'avatar-changed': 'avatarChanged',\n 'audio-availability-changed': 'audioAvailabilityChanged',\n 'audio-mute-status-changed': 'audioMuteStatusChanged',\n 'audio-or-video-sharing-toggled': 'audioOrVideoSharingToggled',\n 'breakout-rooms-updated': 'breakoutRoomsUpdated',\n 'browser-support': 'browserSupport',\n 'camera-error': 'cameraError',\n 'chat-updated': 'chatUpdated',\n 'content-sharing-participants-changed': 'contentSharingParticipantsChanged',\n 'data-channel-closed': 'dataChannelClosed',\n 'data-channel-opened': 'dataChannelOpened',\n 'device-list-changed': 'deviceListChanged',\n 'display-name-change': 'displayNameChange',\n 'email-change': 'emailChange',\n 'error-occurred': 'errorOccurred',\n 'endpoint-text-message-received': 'endpointTextMessageReceived',\n 'face-landmark-detected': 'faceLandmarkDetected',\n 'feedback-submitted': 'feedbackSubmitted',\n 'feedback-prompt-displayed': 'feedbackPromptDisplayed',\n 'filmstrip-display-changed': 'filmstripDisplayChanged',\n 'incoming-message': 'incomingMessage',\n 'knocking-participant': 'knockingParticipant',\n 'log': 'log',\n 'mic-error': 'micError',\n 'moderation-participant-approved': 'moderationParticipantApproved',\n 'moderation-participant-rejected': 'moderationParticipantRejected',\n 'moderation-status-changed': 'moderationStatusChanged',\n 'mouse-enter': 'mouseEnter',\n 'mouse-leave': 'mouseLeave',\n 'mouse-move': 'mouseMove',\n 'notification-triggered': 'notificationTriggered',\n 'outgoing-message': 'outgoingMessage',\n 'participant-joined': 'participantJoined',\n 'participant-kicked-out': 'participantKickedOut',\n 'participant-left': 'participantLeft',\n 'participant-role-changed': 'participantRoleChanged',\n 'participants-pane-toggled': 'participantsPaneToggled',\n 'password-required': 'passwordRequired',\n 'peer-connection-failure': 'peerConnectionFailure',\n 'prejoin-screen-loaded': 'prejoinScreenLoaded',\n 'proxy-connection-event': 'proxyConnectionEvent',\n 'raise-hand-updated': 'raiseHandUpdated',\n 'recording-link-available': 'recordingLinkAvailable',\n 'recording-status-changed': 'recordingStatusChanged',\n 'participant-menu-button-clicked': 'participantMenuButtonClick',\n 'video-ready-to-close': 'readyToClose',\n 'video-conference-joined': 'videoConferenceJoined',\n 'video-conference-left': 'videoConferenceLeft',\n 'video-availability-changed': 'videoAvailabilityChanged',\n 'video-mute-status-changed': 'videoMuteStatusChanged',\n 'video-quality-changed': 'videoQualityChanged',\n 'screen-sharing-status-changed': 'screenSharingStatusChanged',\n 'dominant-speaker-changed': 'dominantSpeakerChanged',\n 'subject-change': 'subjectChange',\n 'suspend-detected': 'suspendDetected',\n 'tile-view-changed': 'tileViewChanged',\n 'toolbar-button-clicked': 'toolbarButtonClicked',\n '_request-desktop-sources': '_requestDesktopSources'\n};\n\n/**\n * Last id of api object.\n *\n * @type {number}\n */\nlet id = 0;\n\n/**\n * Adds given number to the numberOfParticipants property of given APIInstance.\n *\n * @param {JitsiMeetExternalAPI} APIInstance - The instance of the API.\n * @param {int} number - The number of participants to be added to\n * numberOfParticipants property (this parameter can be negative number if the\n * numberOfParticipants should be decreased).\n * @returns {void}\n */\nfunction changeParticipantNumber(APIInstance, number) {\n APIInstance._numberOfParticipants += number;\n}\n\n/**\n * Generates the URL for the iframe.\n *\n * @param {string} domain - The domain name of the server that hosts the\n * conference.\n * @param {string} [options] - Another optional parameters.\n * @param {Object} [options.configOverwrite] - Object containing configuration\n * options defined in config.js to be overridden.\n * @param {Object} [options.interfaceConfigOverwrite] - Object containing\n * configuration options defined in interface_config.js to be overridden.\n * @param {string} [options.jwt] - The JWT token if needed by jitsi-meet for\n * authentication.\n * @param {string} [options.lang] - The meeting's default language.\n * @param {string} [options.roomName] - The name of the room to join.\n * @returns {string} The URL.\n */\nfunction generateURL(domain, options = {}) {\n return urlObjectToString({\n ...options,\n url: `https://${domain}/#jitsi_meet_external_api_id=${id}`\n });\n}\n\n/**\n * Parses the arguments passed to the constructor. If the old format is used\n * the function translates the arguments to the new format.\n *\n * @param {Array} args - The arguments to be parsed.\n * @returns {Object} JS object with properties.\n */\nfunction parseArguments(args) {\n if (!args.length) {\n return {};\n }\n\n const firstArg = args[0];\n\n switch (typeof firstArg) {\n case 'string': // old arguments format\n case 'undefined': {\n // Not sure which format but we are trying to parse the old\n // format because if the new format is used everything will be undefined\n // anyway.\n const [\n roomName,\n width,\n height,\n parentNode,\n configOverwrite,\n interfaceConfigOverwrite,\n jwt,\n onload,\n lang\n ] = args;\n\n return {\n roomName,\n width,\n height,\n parentNode,\n configOverwrite,\n interfaceConfigOverwrite,\n jwt,\n onload,\n lang\n };\n }\n case 'object': // new arguments format\n return args[0];\n default:\n throw new Error('Can\\'t parse the arguments!');\n }\n}\n\n/**\n * Compute valid values for height and width. If a number is specified it's\n * treated as pixel units. If the value is expressed in px, em, pt or\n * percentage, it's used as is.\n *\n * @param {any} value - The value to be parsed.\n * @returns {string|undefined} The parsed value that can be used for setting\n * sizes through the style property. If invalid value is passed the method\n * returns undefined.\n */\nfunction parseSizeParam(value) {\n let parsedValue;\n\n // This regex parses values of the form 100px, 100em, 100pt or 100%.\n // Values like 100 or 100px are handled outside of the regex, and\n // invalid values will be ignored and the minimum will be used.\n const re = /([0-9]*\\.?[0-9]+)(em|pt|px|%)$/;\n\n if (typeof value === 'string' && String(value).match(re) !== null) {\n parsedValue = value;\n } else if (typeof value === 'number') {\n parsedValue = `${value}px`;\n }\n\n return parsedValue;\n}\n\n\n/**\n * The IFrame API interface class.\n */\nexport default class JitsiMeetExternalAPI extends EventEmitter {\n /**\n * Constructs new API instance. Creates iframe and loads Jitsi Meet in it.\n *\n * @param {string} domain - The domain name of the server that hosts the\n * conference.\n * @param {Object} [options] - Optional arguments.\n * @param {string} [options.roomName] - The name of the room to join.\n * @param {number|string} [options.width] - Width of the iframe. Check\n * parseSizeParam for format details.\n * @param {number|string} [options.height] - Height of the iframe. Check\n * parseSizeParam for format details.\n * @param {DOMElement} [options.parentNode] - The node that will contain the\n * iframe.\n * @param {Object} [options.configOverwrite] - Object containing\n * configuration options defined in config.js to be overridden.\n * @param {Object} [options.interfaceConfigOverwrite] - Object containing\n * configuration options defined in interface_config.js to be overridden.\n * @param {string} [options.jwt] - The JWT token if needed by jitsi-meet for\n * authentication.\n * @param {string} [options.lang] - The meeting's default language.\n * @param {string} [options.onload] - The onload function that will listen\n * for iframe onload event.\n * @param {Array} [options.invitees] - Array of objects containing\n * information about new participants that will be invited in the call.\n * @param {Array} [options.devices] - Array of objects containing\n * information about the initial devices that will be used in the call.\n * @param {Object} [options.userInfo] - Object containing information about\n * the participant opening the meeting.\n * @param {string} [options.e2eeKey] - The key used for End-to-End encryption.\n * THIS IS EXPERIMENTAL.\n * @param {string} [options.release] - The key used for specifying release if enabled on the backend.\n */\n constructor(domain, ...args) {\n super();\n const {\n roomName = '',\n width = '100%',\n height = '100%',\n parentNode = document.body,\n configOverwrite = {},\n interfaceConfigOverwrite = {},\n jwt = undefined,\n lang = undefined,\n onload = undefined,\n invitees,\n devices,\n userInfo,\n e2eeKey,\n release\n } = parseArguments(args);\n const localStorageContent = jitsiLocalStorage.getItem('jitsiLocalStorage');\n\n this._parentNode = parentNode;\n this._url = generateURL(domain, {\n configOverwrite,\n interfaceConfigOverwrite,\n jwt,\n lang,\n roomName,\n devices,\n userInfo,\n appData: {\n localStorageContent\n },\n release\n });\n this._createIFrame(height, width, onload);\n this._transport = new Transport({\n backend: new PostMessageTransportBackend({\n postisOptions: {\n allowedOrigin: new URL(this._url).origin,\n scope: `jitsi_meet_external_api_${id}`,\n window: this._frame.contentWindow\n }\n })\n });\n if (Array.isArray(invitees) && invitees.length > 0) {\n this.invite(invitees);\n }\n this._tmpE2EEKey = e2eeKey;\n this._isLargeVideoVisible = false;\n this._isPrejoinVideoVisible = false;\n this._numberOfParticipants = 0;\n this._participants = {};\n this._myUserID = undefined;\n this._onStageParticipant = undefined;\n this._setupListeners();\n id++;\n }\n\n /**\n * Creates the iframe element.\n *\n * @param {number|string} height - The height of the iframe. Check\n * parseSizeParam for format details.\n * @param {number|string} width - The with of the iframe. Check\n * parseSizeParam for format details.\n * @param {Function} onload - The function that will listen\n * for onload event.\n * @returns {void}\n *\n * @private\n */\n _createIFrame(height, width, onload) {\n const frameName = `jitsiConferenceFrame${id}`;\n\n this._frame = document.createElement('iframe');\n this._frame.allow = 'camera; microphone; display-capture; autoplay; clipboard-write';\n this._frame.name = frameName;\n this._frame.id = frameName;\n this._setSize(height, width);\n this._frame.sandbox = 'allow-scripts allow-same-origin allow-popups allow-forms allow-downloads';\n this._frame.setAttribute('allowFullScreen', 'true');\n this._frame.style.border = 0;\n\n if (onload) {\n // waits for iframe resources to load\n // and fires event when it is done\n this._frame.onload = onload;\n }\n\n this._frame = this._parentNode.appendChild(this._frame);\n\n this._frame.src = this._url;\n }\n\n /**\n * Returns arrays with the all resources for the always on top feature.\n *\n * @returns {Array}\n */\n _getAlwaysOnTopResources() {\n const iframeWindow = this._frame.contentWindow;\n const iframeDocument = iframeWindow.document;\n let baseURL = '';\n const base = iframeDocument.querySelector('base');\n\n if (base && base.href) {\n baseURL = base.href;\n } else {\n const { protocol, host } = iframeWindow.location;\n\n baseURL = `${protocol}//${host}`;\n }\n\n return ALWAYS_ON_TOP_FILENAMES.map(\n filename => new URL(filename, baseURL).href\n );\n }\n\n /**\n * Returns the formatted display name of a participant.\n *\n * @param {string} participantId - The id of the participant.\n * @returns {string} The formatted display name.\n */\n _getFormattedDisplayName(participantId) {\n const { formattedDisplayName }\n = this._participants[participantId] || {};\n\n return formattedDisplayName;\n }\n\n /**\n * Returns the id of the on stage participant.\n *\n * @returns {string} - The id of the on stage participant.\n */\n _getOnStageParticipant() {\n return this._onStageParticipant;\n }\n\n\n /**\n * Getter for the large video element in Jitsi Meet.\n *\n * @returns {HTMLElement|undefined} - The large video.\n */\n _getLargeVideo() {\n const iframe = this.getIFrame();\n\n if (!this._isLargeVideoVisible\n || !iframe\n || !iframe.contentWindow\n || !iframe.contentWindow.document) {\n return;\n }\n\n return iframe.contentWindow.document.getElementById('largeVideo');\n }\n\n /**\n * Getter for the prejoin video element in Jitsi Meet.\n *\n * @returns {HTMLElement|undefined} - The prejoin video.\n */\n _getPrejoinVideo() {\n const iframe = this.getIFrame();\n\n if (!this._isPrejoinVideoVisible\n || !iframe\n || !iframe.contentWindow\n || !iframe.contentWindow.document) {\n return;\n }\n\n return iframe.contentWindow.document.getElementById('prejoinVideo');\n }\n\n /**\n * Getter for participant specific video element in Jitsi Meet.\n *\n * @param {string|undefined} participantId - Id of participant to return the video for.\n *\n * @returns {HTMLElement|undefined} - The requested video. Will return the local video\n * by default if participantId is undefined.\n */\n _getParticipantVideo(participantId) {\n const iframe = this.getIFrame();\n\n if (!iframe\n || !iframe.contentWindow\n || !iframe.contentWindow.document) {\n return;\n }\n\n if (typeof participantId === 'undefined' || participantId === this._myUserID) {\n return iframe.contentWindow.document.getElementById('localVideo_container');\n }\n\n return iframe.contentWindow.document.querySelector(`#participant_${participantId} video`);\n }\n\n /**\n * Sets the size of the iframe element.\n *\n * @param {number|string} height - The height of the iframe.\n * @param {number|string} width - The with of the iframe.\n * @returns {void}\n *\n * @private\n */\n _setSize(height, width) {\n const parsedHeight = parseSizeParam(height);\n const parsedWidth = parseSizeParam(width);\n\n if (parsedHeight !== undefined) {\n this._height = height;\n this._frame.style.height = parsedHeight;\n }\n\n if (parsedWidth !== undefined) {\n this._width = width;\n this._frame.style.width = parsedWidth;\n }\n }\n\n /**\n * Setups listeners that are used internally for JitsiMeetExternalAPI.\n *\n * @returns {void}\n *\n * @private\n */\n _setupListeners() {\n this._transport.on('event', ({ name, ...data }) => {\n const userID = data.id;\n\n switch (name) {\n case 'video-conference-joined': {\n if (typeof this._tmpE2EEKey !== 'undefined') {\n this.executeCommand(commands.e2eeKey, this._tmpE2EEKey);\n this._tmpE2EEKey = undefined;\n }\n\n this._myUserID = userID;\n this._participants[userID] = {\n email: data.email,\n avatarURL: data.avatarURL\n };\n }\n\n // eslint-disable-next-line no-fallthrough\n case 'participant-joined': {\n this._participants[userID] = this._participants[userID] || {};\n this._participants[userID].displayName = data.displayName;\n this._participants[userID].formattedDisplayName\n = data.formattedDisplayName;\n changeParticipantNumber(this, 1);\n break;\n }\n case 'participant-left':\n changeParticipantNumber(this, -1);\n delete this._participants[userID];\n break;\n case 'display-name-change': {\n const user = this._participants[userID];\n\n if (user) {\n user.displayName = data.displayname;\n user.formattedDisplayName = data.formattedDisplayName;\n }\n break;\n }\n case 'email-change': {\n const user = this._participants[userID];\n\n if (user) {\n user.email = data.email;\n }\n break;\n }\n case 'avatar-changed': {\n const user = this._participants[userID];\n\n if (user) {\n user.avatarURL = data.avatarURL;\n }\n break;\n }\n case 'on-stage-participant-changed':\n this._onStageParticipant = userID;\n this.emit('largeVideoChanged');\n break;\n case 'large-video-visibility-changed':\n this._isLargeVideoVisible = data.isVisible;\n this.emit('largeVideoChanged');\n break;\n case 'prejoin-screen-loaded':\n this._participants[userID] = {\n displayName: data.displayName,\n formattedDisplayName: data.formattedDisplayName\n };\n break;\n case 'on-prejoin-video-changed':\n this._isPrejoinVideoVisible = data.isVisible;\n this.emit('prejoinVideoChanged');\n break;\n case 'video-conference-left':\n changeParticipantNumber(this, -1);\n delete this._participants[this._myUserID];\n break;\n case 'video-quality-changed':\n this._videoQuality = data.videoQuality;\n break;\n case 'breakout-rooms-updated':\n this.updateNumberOfParticipants(data.rooms);\n break;\n case 'local-storage-changed':\n jitsiLocalStorage.setItem('jitsiLocalStorage', data.localStorageContent);\n\n // Since this is internal event we don't need to emit it to the consumer of the API.\n return true;\n }\n\n const eventName = events[name];\n\n if (eventName) {\n this.emit(eventName, data);\n\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Update number of participants based on all rooms.\n *\n * @param {Object} rooms - Rooms available rooms in the conference.\n * @returns {void}\n */\n updateNumberOfParticipants(rooms) {\n if (!rooms || !Object.keys(rooms).length) {\n return;\n }\n\n const allParticipants = Object.keys(rooms).reduce((prev, roomItemKey) => {\n if (rooms[roomItemKey]?.participants) {\n return Object.keys(rooms[roomItemKey].participants).length + prev;\n }\n\n return prev;\n }, 0);\n\n this._numberOfParticipants = allParticipants;\n }\n\n\n /**\n * Returns the rooms info in the conference.\n *\n * @returns {Object} Rooms info.\n */\n async getRoomsInfo() {\n return this._transport.sendRequest({\n name: 'rooms-info'\n });\n }\n\n /**\n * Adds event listener to Meet Jitsi.\n *\n * @param {string} event - The name of the event.\n * @param {Function} listener - The listener.\n * @returns {void}\n *\n * @deprecated\n * NOTE: This method is not removed for backward comatability purposes.\n */\n addEventListener(event, listener) {\n this.on(event, listener);\n }\n\n /**\n * Adds event listeners to Meet Jitsi.\n *\n * @param {Object} listeners - The object key should be the name of\n * the event and value - the listener.\n * Currently we support the following\n * events:\n * {@code log} - receives event notifications whenever information has\n * been logged and has a log level specified within {@code config.apiLogLevels}.\n * The listener will receive object with the following structure:\n * {{\n * logLevel: the message log level\n * arguments: an array of strings that compose the actual log message\n * }}\n * {@code chatUpdated} - receives event notifications about chat state being\n * updated. The listener will receive object with the following structure:\n * {{\n * 'unreadCount': unreadCounter, // the unread message(s) counter,\n * 'isOpen': isOpen, // whether the chat panel is open or not\n * }}\n * {@code incomingMessage} - receives event notifications about incoming\n * messages. The listener will receive object with the following structure:\n * {{\n * 'from': from,//JID of the user that sent the message\n * 'nick': nick,//the nickname of the user that sent the message\n * 'message': txt//the text of the message\n * }}\n * {@code outgoingMessage} - receives event notifications about outgoing\n * messages. The listener will receive object with the following structure:\n * {{\n * 'message': txt//the text of the message\n * }}\n * {@code displayNameChanged} - receives event notifications about display\n * name change. The listener will receive object with the following\n * structure:\n * {{\n * jid: jid,//the JID of the participant that changed his display name\n * displayname: displayName //the new display name\n * }}\n * {@code participantJoined} - receives event notifications about new\n * participant.\n * The listener will receive object with the following structure:\n * {{\n * jid: jid //the jid of the participant\n * }}\n * {@code participantLeft} - receives event notifications about the\n * participant that left the room.\n * The listener will receive object with the following structure:\n * {{\n * jid: jid //the jid of the participant\n * }}\n * {@code videoConferenceJoined} - receives event notifications about the\n * local user has successfully joined the video conference.\n * The listener will receive object with the following structure:\n * {{\n * roomName: room //the room name of the conference\n * }}\n * {@code videoConferenceLeft} - receives event notifications about the\n * local user has left the video conference.\n * The listener will receive object with the following structure:\n * {{\n * roomName: room //the room name of the conference\n * }}\n * {@code screenSharingStatusChanged} - receives event notifications about\n * turning on/off the local user screen sharing.\n * The listener will receive object with the following structure:\n * {{\n * on: on //whether screen sharing is on\n * }}\n * {@code dominantSpeakerChanged} - receives event notifications about\n * change in the dominant speaker.\n * The listener will receive object with the following structure:\n * {{\n * id: participantId //participantId of the new dominant speaker\n * }}\n * {@code suspendDetected} - receives event notifications about detecting suspend event in host computer.\n * {@code readyToClose} - all hangup operations are completed and Jitsi Meet\n * is ready to be disposed.\n * @returns {void}\n *\n * @deprecated\n * NOTE: This method is not removed for backward comatability purposes.\n */\n addEventListeners(listeners) {\n for (const event in listeners) { // eslint-disable-line guard-for-in\n this.addEventListener(event, listeners[event]);\n }\n }\n\n /**\n * Captures the screenshot of the large video.\n *\n * @returns {Promise} - Resolves with a base64 encoded image data of the screenshot\n * if large video is detected, an error otherwise.\n */\n captureLargeVideoScreenshot() {\n return this._transport.sendRequest({\n name: 'capture-largevideo-screenshot'\n });\n }\n\n /**\n * Removes the listeners and removes the Jitsi Meet frame.\n *\n * @returns {void}\n */\n dispose() {\n this.emit('_willDispose');\n this._transport.dispose();\n this.removeAllListeners();\n if (this._frame && this._frame.parentNode) {\n this._frame.parentNode.removeChild(this._frame);\n }\n }\n\n /**\n * Executes command. The available commands are:\n * {@code displayName} - Sets the display name of the local participant to\n * the value passed in the arguments array.\n * {@code subject} - Sets the subject of the conference, the value passed\n * in the arguments array. Note: Available only for moderator.\n *\n * {@code toggleAudio} - Mutes / unmutes audio with no arguments.\n * {@code toggleVideo} - Mutes / unmutes video with no arguments.\n * {@code toggleFilmStrip} - Hides / shows the filmstrip with no arguments.\n *\n * If the command doesn't require any arguments the parameter should be set\n * to empty array or it may be omitted.\n *\n * @param {string} name - The name of the command.\n * @returns {void}\n */\n executeCommand(name, ...args) {\n if (!(name in commands)) {\n console.error('Not supported command name.');\n\n return;\n }\n this._transport.sendEvent({\n data: args,\n name: commands[name]\n });\n }\n\n /**\n * Executes commands. The available commands are:\n * {@code displayName} - Sets the display name of the local participant to\n * the value passed in the arguments array.\n * {@code toggleAudio} - Mutes / unmutes audio. No arguments.\n * {@code toggleVideo} - Mutes / unmutes video. No arguments.\n * {@code toggleFilmStrip} - Hides / shows the filmstrip. No arguments.\n * {@code toggleChat} - Hides / shows chat. No arguments.\n * {@code toggleShareScreen} - Starts / stops screen sharing. No arguments.\n *\n * @param {Object} commandList - The object with commands to be executed.\n * The keys of the object are the commands that will be executed and the\n * values are the arguments for the command.\n * @returns {void}\n */\n executeCommands(commandList) {\n for (const key in commandList) { // eslint-disable-line guard-for-in\n this.executeCommand(key, commandList[key]);\n }\n }\n\n /**\n * Returns Promise that resolves with a list of available devices.\n *\n * @returns {Promise}\n */\n getAvailableDevices() {\n return getAvailableDevices(this._transport);\n }\n\n /**\n * Gets a list of the currently sharing participant id's.\n *\n * @returns {Promise} - Resolves with the list of participant id's currently sharing.\n */\n getContentSharingParticipants() {\n return this._transport.sendRequest({\n name: 'get-content-sharing-participants'\n });\n }\n\n /**\n * Returns Promise that resolves with current selected devices.\n *\n * @returns {Promise}\n */\n getCurrentDevices() {\n return getCurrentDevices(this._transport);\n }\n\n /**\n * Returns any custom avatars backgrounds.\n *\n * @returns {Promise} - Resolves with the list of custom avatar backgrounds.\n */\n getCustomAvatarBackgrounds() {\n return this._transport.sendRequest({\n name: 'get-custom-avatar-backgrounds'\n });\n }\n\n /**\n * Returns the current livestream url.\n *\n * @returns {Promise} - Resolves with the current livestream URL if exists, with\n * undefined if not and rejects on failure.\n */\n getLivestreamUrl() {\n return this._transport.sendRequest({\n name: 'get-livestream-url'\n });\n }\n\n /**\n * Returns the conference participants information.\n *\n * @returns {Array} - Returns an array containing participants\n * information like participant id, display name, avatar URL and email.\n */\n getParticipantsInfo() {\n const participantIds = Object.keys(this._participants);\n const participantsInfo = Object.values(this._participants);\n\n participantsInfo.forEach((participant, idx) => {\n participant.participantId = participantIds[idx];\n });\n\n return participantsInfo;\n }\n\n /**\n * Returns the current video quality setting.\n *\n * @returns {number}\n */\n getVideoQuality() {\n return this._videoQuality;\n }\n\n /**\n * Check if the audio is available.\n *\n * @returns {Promise} - Resolves with true if the audio available, with\n * false if not and rejects on failure.\n */\n isAudioAvailable() {\n return this._transport.sendRequest({\n name: 'is-audio-available'\n });\n }\n\n /**\n * Returns Promise that resolves with true if the device change is available\n * and with false if not.\n *\n * @param {string} [deviceType] - Values - 'output', 'input' or undefined.\n * Default - 'input'.\n * @returns {Promise}\n */\n isDeviceChangeAvailable(deviceType) {\n return isDeviceChangeAvailable(this._transport, deviceType);\n }\n\n /**\n * Returns Promise that resolves with true if the device list is available\n * and with false if not.\n *\n * @returns {Promise}\n */\n isDeviceListAvailable() {\n return isDeviceListAvailable(this._transport);\n }\n\n /**\n * Returns Promise that resolves with true if multiple audio input is supported\n * and with false if not.\n *\n * @returns {Promise}\n */\n isMultipleAudioInputSupported() {\n return isMultipleAudioInputSupported(this._transport);\n }\n\n /**\n * Invite people to the call.\n *\n * @param {Array} invitees - The invitees.\n * @returns {Promise} - Resolves on success and rejects on failure.\n */\n invite(invitees) {\n if (!Array.isArray(invitees) || invitees.length === 0) {\n return Promise.reject(new TypeError('Invalid Argument'));\n }\n\n return this._transport.sendRequest({\n name: 'invite',\n invitees\n });\n }\n\n /**\n * Returns the audio mute status.\n *\n * @returns {Promise} - Resolves with the audio mute status and rejects on\n * failure.\n */\n isAudioMuted() {\n return this._transport.sendRequest({\n name: 'is-audio-muted'\n });\n }\n\n /**\n * Returns the audio disabled status.\n *\n * @returns {Promise} - Resolves with the audio disabled status and rejects on\n * failure.\n */\n isAudioDisabled() {\n return this._transport.sendRequest({\n name: 'is-audio-disabled'\n });\n }\n\n /**\n * Returns the moderation on status on the given mediaType.\n *\n * @param {string} mediaType - The media type for which to check moderation.\n * @returns {Promise} - Resolves with the moderation on status and rejects on\n * failure.\n */\n isModerationOn(mediaType) {\n return this._transport.sendRequest({\n name: 'is-moderation-on',\n mediaType\n });\n }\n\n /**\n * Returns force muted status of the given participant id for the given media type.\n *\n * @param {string} participantId - The id of the participant to check.\n * @param {string} mediaType - The media type for which to check.\n * @returns {Promise} - Resolves with the force muted status and rejects on\n * failure.\n */\n isParticipantForceMuted(participantId, mediaType) {\n return this._transport.sendRequest({\n name: 'is-participant-force-muted',\n participantId,\n mediaType\n });\n }\n\n /**\n * Returns whether the participants pane is open.\n *\n * @returns {Promise} - Resolves with true if the participants pane is open\n * and with false if not.\n */\n isParticipantsPaneOpen() {\n return this._transport.sendRequest({\n name: 'is-participants-pane-open'\n });\n }\n\n /**\n * Returns screen sharing status.\n *\n * @returns {Promise} - Resolves with screensharing status and rejects on failure.\n */\n isSharingScreen() {\n return this._transport.sendRequest({\n name: 'is-sharing-screen'\n });\n }\n\n /**\n * Returns whether meeting is started silent.\n *\n * @returns {Promise} - Resolves with start silent status.\n */\n isStartSilent() {\n return this._transport.sendRequest({\n name: 'is-start-silent'\n });\n }\n\n /**\n * Returns the avatar URL of a participant.\n *\n * @param {string} participantId - The id of the participant.\n * @returns {string} The avatar URL.\n */\n getAvatarURL(participantId) {\n const { avatarURL } = this._participants[participantId] || {};\n\n return avatarURL;\n }\n\n /**\n * Gets the deployment info.\n *\n * @returns {Promise} - Resolves with the deployment info object.\n */\n getDeploymentInfo() {\n return this._transport.sendRequest({\n name: 'deployment-info'\n });\n }\n\n /**\n * Returns the display name of a participant.\n *\n * @param {string} participantId - The id of the participant.\n * @returns {string} The display name.\n */\n getDisplayName(participantId) {\n const { displayName } = this._participants[participantId] || {};\n\n return displayName;\n }\n\n /**\n * Returns the email of a participant.\n *\n * @param {string} participantId - The id of the participant.\n * @returns {string} The email.\n */\n getEmail(participantId) {\n const { email } = this._participants[participantId] || {};\n\n return email;\n }\n\n /**\n * Returns the iframe that loads Jitsi Meet.\n *\n * @returns {HTMLElement} The iframe.\n */\n getIFrame() {\n return this._frame;\n }\n\n /**\n * Returns the number of participants in the conference from all rooms. The local\n * participant is included.\n *\n * @returns {int} The number of participants in the conference.\n */\n getNumberOfParticipants() {\n return this._numberOfParticipants;\n }\n\n /**\n * Check if the video is available.\n *\n * @returns {Promise} - Resolves with true if the video available, with\n * false if not and rejects on failure.\n */\n isVideoAvailable() {\n return this._transport.sendRequest({\n name: 'is-video-available'\n });\n }\n\n /**\n * Returns the audio mute status.\n *\n * @returns {Promise} - Resolves with the audio mute status and rejects on\n * failure.\n */\n isVideoMuted() {\n return this._transport.sendRequest({\n name: 'is-video-muted'\n });\n }\n\n /**\n * Returns the list of breakout rooms.\n *\n * @returns {Promise} Resolves with the list of breakout rooms.\n */\n listBreakoutRooms() {\n return this._transport.sendRequest({\n name: 'list-breakout-rooms'\n });\n }\n\n /**\n * Pins a participant's video on to the stage view.\n *\n * @param {string} participantId - Participant id (JID) of the participant\n * that needs to be pinned on the stage view.\n * @param {string} [videoType] - Indicates the type of thumbnail to be pinned when multistream support is enabled.\n * Accepts \"camera\" or \"desktop\" values. Default is \"camera\". Any invalid values will be ignored and default will\n * be used.\n * @returns {void}\n */\n pinParticipant(participantId, videoType) {\n this.executeCommand('pinParticipant', participantId, videoType);\n }\n\n /**\n * Removes event listener.\n *\n * @param {string} event - The name of the event.\n * @returns {void}\n *\n * @deprecated\n * NOTE: This method is not removed for backward comatability purposes.\n */\n removeEventListener(event) {\n this.removeAllListeners(event);\n }\n\n /**\n * Removes event listeners.\n *\n * @param {Array} eventList - Array with the names of the events.\n * @returns {void}\n *\n * @deprecated\n * NOTE: This method is not removed for backward comatability purposes.\n */\n removeEventListeners(eventList) {\n eventList.forEach(event => this.removeEventListener(event));\n }\n\n /**\n * Resizes the large video container as per the dimensions provided.\n *\n * @param {number} width - Width that needs to be applied on the large video container.\n * @param {number} height - Height that needs to be applied on the large video container.\n * @returns {void}\n */\n resizeLargeVideo(width, height) {\n if (width <= this._width && height <= this._height) {\n this.executeCommand('resizeLargeVideo', width, height);\n }\n }\n\n /**\n * Send request to request desktop sources.\n *\n * @returns {Promise} - Result.\n */\n _requestDesktopSources() {\n return this._transport.sendRequest({\n name: '_request-desktop-sources'\n });\n }\n\n /**\n * Passes an event along to the local conference participant to establish\n * or update a direct peer connection. This is currently used for developing\n * wireless screensharing with room integration and it is advised against to\n * use as its api may change.\n *\n * @param {Object} event - An object with information to pass along.\n * @param {Object} event.data - The payload of the event.\n * @param {string} event.from - The jid of the sender of the event. Needed\n * when a reply is to be sent regarding the event.\n * @returns {void}\n */\n sendProxyConnectionEvent(event) {\n this._transport.sendEvent({\n data: [ event ],\n name: 'proxy-connection-event'\n });\n }\n\n /**\n * Sets the audio input device to the one with the label or id that is\n * passed.\n *\n * @param {string} label - The label of the new device.\n * @param {string} deviceId - The id of the new device.\n * @returns {Promise}\n */\n setAudioInputDevice(label, deviceId) {\n return setAudioInputDevice(this._transport, label, deviceId);\n }\n\n /**\n * Sets the audio output device to the one with the label or id that is\n * passed.\n *\n * @param {string} label - The label of the new device.\n * @param {string} deviceId - The id of the new device.\n * @returns {Promise}\n */\n setAudioOutputDevice(label, deviceId) {\n return setAudioOutputDevice(this._transport, label, deviceId);\n }\n\n /**\n * Displays the given participant on the large video. If no participant id is specified,\n * dominant and pinned speakers will be taken into consideration while selecting the\n * the large video participant.\n *\n * @param {string} participantId - Jid of the participant to be displayed on the large video.\n * @param {string} [videoType] - Indicates the type of video to be set when multistream support is enabled.\n * Accepts \"camera\" or \"desktop\" values. Default is \"camera\". Any invalid values will be ignored and default will\n * be used.\n * @returns {void}\n */\n setLargeVideoParticipant(participantId, videoType) {\n this.executeCommand('setLargeVideoParticipant', participantId, videoType);\n }\n\n /**\n * Sets the video input device to the one with the label or id that is\n * passed.\n *\n * @param {string} label - The label of the new device.\n * @param {string} deviceId - The id of the new device.\n * @returns {Promise}\n */\n setVideoInputDevice(label, deviceId) {\n return setVideoInputDevice(this._transport, label, deviceId);\n }\n\n /**\n * Starts a file recording or streaming session depending on the passed on params.\n * For RTMP streams, `rtmpStreamKey` must be passed on. `rtmpBroadcastID` is optional.\n * For youtube streams, `youtubeStreamKey` must be passed on. `youtubeBroadcastID` is optional.\n * For dropbox recording, recording `mode` should be `file` and a dropbox oauth2 token must be provided.\n * For file recording, recording `mode` should be `file` and optionally `shouldShare` could be passed on.\n * No other params should be passed.\n *\n * @param {Object} options - An object with config options to pass along.\n * @param { string } options.mode - Recording mode, either `file` or `stream`.\n * @param { string } options.dropboxToken - Dropbox oauth2 token.\n * @param { boolean } options.shouldShare - Whether the recording should be shared with the participants or not.\n * Only applies to certain jitsi meet deploys.\n * @param { string } options.rtmpStreamKey - The RTMP stream key.\n * @param { string } options.rtmpBroadcastID - The RTMP broadcast ID.\n * @param { string } options.youtubeStreamKey - The youtube stream key.\n * @param { string } options.youtubeBroadcastID - The youtube broadcast ID.\n * @returns {void}\n */\n startRecording(options) {\n this.executeCommand('startRecording', options);\n }\n\n /**\n * Stops a recording or streaming session that is in progress.\n *\n * @param {string} mode - `file` or `stream`.\n * @returns {void}\n */\n stopRecording(mode) {\n this.executeCommand('stopRecording', mode);\n }\n\n /**\n * Sets e2ee enabled/disabled.\n *\n * @param {boolean} enabled - The new value for e2ee enabled.\n * @returns {void}\n */\n toggleE2EE(enabled) {\n this.executeCommand('toggleE2EE', enabled);\n }\n\n /**\n * Sets the key and keyIndex for e2ee.\n *\n * @param {Object} keyInfo - Json containing key information.\n * @param {CryptoKey} [keyInfo.encryptionKey] - The encryption key.\n * @param {number} [keyInfo.index] - The index of the encryption key.\n * @returns {void}\n */\n async setMediaEncryptionKey(keyInfo) {\n const { key, index } = keyInfo;\n\n if (key) {\n const exportedKey = await crypto.subtle.exportKey('raw', key);\n\n this.executeCommand('setMediaEncryptionKey', JSON.stringify({\n exportedKey: Array.from(new Uint8Array(exportedKey)),\n index }));\n } else {\n this.executeCommand('setMediaEncryptionKey', JSON.stringify({\n exportedKey: false,\n index }));\n }\n }\n}\n","// For legacy purposes, preserve the UMD of the public API of Jitsi Meet\n// external API (a.k.a. JitsiMeetExternalAPI).\nmodule.exports = require('./external_api').default;\n","'use strict';\n\n\nconst internals = {\n suspectRx: /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*\\:/\n};\n\n\nexports.parse = function (text, ...args) {\n\n // Normalize arguments\n\n const firstOptions = typeof args[0] === 'object' && args[0];\n const reviver = args.length > 1 || !firstOptions ? args[0] : undefined;\n const options = (args.length > 1 && args[1]) || firstOptions || {};\n\n // Parse normally, allowing exceptions\n\n const obj = JSON.parse(text, reviver);\n\n // options.protoAction: 'error' (default) / 'remove' / 'ignore'\n\n if (options.protoAction === 'ignore') {\n return obj;\n }\n\n // Ignore null and non-objects\n\n if (!obj ||\n typeof obj !== 'object') {\n\n return obj;\n }\n\n // Check original string for potential exploit\n\n if (!text.match(internals.suspectRx)) {\n return obj;\n }\n\n // Scan result for proto keys\n\n exports.scan(obj, options);\n\n return obj;\n};\n\n\nexports.scan = function (obj, options = {}) {\n\n let next = [obj];\n\n while (next.length) {\n const nodes = next;\n next = [];\n\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, '__proto__')) { // Avoid calling node.hasOwnProperty directly\n if (options.protoAction !== 'remove') {\n throw new SyntaxError('Object contains forbidden prototype property');\n }\n\n delete node.__proto__;\n }\n\n for (const key in node) {\n const value = node[key];\n if (value &&\n typeof value === 'object') {\n\n next.push(node[key]);\n }\n }\n }\n }\n};\n\n\nexports.safeParse = function (text, reviver) {\n\n try {\n return exports.parse(text, reviver);\n }\n catch (ignoreError) {\n return null;\n }\n};\n","/* Copyright @ 2016-present 8x8, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar Logger = require('./Logger.js');\n\n/**\n * Creates new LogCollector. Class implements LoggerTransport\n * and thus can be added as global transport in order to capture all the logs.\n *\n * It captures subsequent log lines created whenever Logger logs\n * a message and stores them in a queue in order to batch log entries. There are\n * time and size limit constraints which determine how often batch entries are\n * stored. Whenever one of these limits is exceeded the LogCollector\n * will use the logStorage object given as an argument to save\n * the batch log entry.\n *\n * @param {Object} logStorage an object which allows to store the logs collected\n * @param {function(string|object[])} logStorage.storeLogs a method called when\n * this LogCollector requests log entry storage. The method's argument\n * is an array which can contain strings and objects. If given\n * item is an object it means that it's an aggregated message. That is a message\n * which is the same as the previous one and it's representation has\n * the following format:\n * {\n * {string} text: 'the text of some duplicated message'\n * {number} count: 3 // how many times the message appeared in a row\n * }\n * If a message \"B\" after an aggregated message \"A\" is different, then it breaks\n * the sequence of \"A\". Which means that even if the next message \"C\" is\n * the same as \"A\" it will start a new aggregated message \"C\".\n * @param {function()} logStorage.isReady a method which should return\n * a boolean to tell the collector that it's ready to store. During the\n * time storage is not ready log batches will be cached and stored on the next\n * occasion (flush or interval timeout).\n *\n * @param {Object} options the LogCollector configuration options.\n * @param {number} options.maxEntryLength the size limit for a single log entry\n * to be stored. The LogCollector will push the entry as soon as it\n * reaches or exceeds this limit given that logStorage.isReady\n * returns true. Otherwise the log entry will be cached until the log\n * storage becomes ready. Note that the \"is ready\" condition is checked every\n * options.storeInterval milliseconds.\n * @param {number} options.storeInterval how often the logs should be stored in\n * case maxEntryLength was not exceeded.\n * @param {boolean} options.stringifyObjects indicates whether or not object\n * arguments should be \"stringified\" with JSON.stringify when a log\n * message is composed. Note that objects logged on the error log level are\n * always stringified.\n *\n * @constructor\n */\nfunction LogCollector(logStorage, options) {\n this.logStorage = logStorage;\n this.stringifyObjects = options && options.stringifyObjects ? options.stringifyObjects : false;\n this.storeInterval = options && options.storeInterval ? options.storeInterval: 30000;\n this.maxEntryLength = options && options.maxEntryLength ? options.maxEntryLength : 10000;\n // Bind the log method for each level to the corresponding method name\n // in order to implement \"global log transport\" object.\n Object.keys(Logger.levels).forEach(\n function (logLevel) {\n var methodName = Logger.levels[logLevel];\n this[methodName] = function () {\n this._log.apply(this, arguments);\n }.bind(this, logLevel);\n }.bind(this));\n /**\n * The ID of store logs interval if one is currently scheduled or\n * null otherwise.\n * @type {number|null}\n */\n this.storeLogsIntervalID = null;\n /**\n * The log messages that are to be batched into log entry when\n * {@link LogCollector._flush} method is called.\n * @type {string[]}\n */\n this.queue = [];\n /**\n * The total length of all messages currently stored in the {@link queue}.\n * @type {number}\n */\n this.totalLen = 0;\n /**\n * An array used to temporarily store log batches, before the storage gets\n * ready.\n * @type {string[]}\n */\n this.outputCache = [];\n}\n\n/**\n * Method called inside of {@link formatLogMessage} in order to covert an\n * Object argument to string. The conversion will happen when either\n * 'stringifyObjects' option is enabled or on the {@link Logger.levels.ERROR}\n * log level. The default implementation uses JSON.stringify and\n * returns \"[object with circular refs?]\" instead of an object if it fails.\n *\n * @param {object} someObject the object to be stringified.\n *\n * @return {string} the result of JSON.stringify or\n * \"[object with circular refs?]\" if any error occurs during \"stringification\".\n *\n * @protected\n */\nLogCollector.prototype.stringify = function (someObject) {\n try {\n return JSON.stringify(someObject);\n } catch (error) {\n return '[object with circular refs?]';\n }\n};\n\n/**\n * Formats log entry for the given logging level and arguments passed to the\n * Logger's log method. The first argument is log level and the next\n * arguments have to be captured using JS built-in 'arguments' variable.\n *\n * @param {Logger.levels} logLevel provides the logging level of the message to\n * be logged.\n * @param {Date} timestamp - The {@code Date} when a message has been logged.\n *\n * @return {string|null} a non-empty string representation of the log entry\n * crafted from the log arguments. If the return value is null then\n * the message wil be discarded by this LogCollector.\n *\n * @protected\n */\nLogCollector.prototype.formatLogMessage = function (\nlogLevel /* timestamp, arg2, arg3, arg4... */) {\n var msg = '';\n for (var i = 1, len = arguments.length; i < len; i++) {\n var arg = arguments[i];\n // objects logged on error level are always converted to JSON\n if ((this.stringifyObjects || logLevel === Logger.levels.ERROR) &&\n typeof arg === 'object') {\n arg = this.stringify(arg);\n }\n msg += arg;\n if (i !== len - 1) {\n msg += ' ';\n }\n }\n return msg.length ? msg : null;\n};\n\n/**\n * The log method bound to each of the logging levels in order to implement\n * \"global log transport\" object.\n *\n * @private\n */\nLogCollector.prototype._log = function() {\n\n // var logLevel = arguments[0]; first argument is the log level\n var timestamp = arguments[1];\n var msg = this.formatLogMessage.apply(this, arguments);\n if (msg) {\n // The same as the previous message aggregation logic\n var prevMessage = this.queue[this.queue.length - 1];\n var prevMessageText = prevMessage && prevMessage.text;\n if (prevMessageText === msg) {\n prevMessage.count += 1;\n } else {\n this.queue.push({\n text: msg,\n timestamp: timestamp,\n count: 1\n });\n this.totalLen += msg.length;\n }\n }\n\n if (this.totalLen >= this.maxEntryLength) {\n this._flush(true /* force */, true /* reschedule */);\n }\n};\n\n/**\n * Starts periodical \"store logs\" task which will be triggered at the interval\n * specified in the constructor options.\n */\nLogCollector.prototype.start = function () {\n this._reschedulePublishInterval();\n};\n\n/**\n * Reschedules the periodical \"store logs\" task which will store the next batch\n * log entry in the storage.\n * @private\n */\nLogCollector.prototype._reschedulePublishInterval = function () {\n if (this.storeLogsIntervalID) {\n window.clearTimeout(this.storeLogsIntervalID);\n this.storeLogsIntervalID = null;\n }\n // It's actually a timeout, because it is rescheduled on every flush\n this.storeLogsIntervalID = window.setTimeout(\n this._flush.bind(\n this, false /* do not force */, true /* reschedule */),\n this.storeInterval);\n};\n\n/**\n * Call this method to flush the log entry buffer and store it in the log\n * storage immediately (given that the storage is ready).\n */\nLogCollector.prototype.flush = function() {\n this._flush(\n false /* do not force, as it will not be stored anyway */,\n true /* reschedule next update */ );\n};\n\n/**\n * Stores the next batch log entry in the log storage.\n * @param {boolean} force enforce current logs batch to be stored or cached if\n * there is anything to be logged, but the storage is not ready yet. One of\n * legitimate reasons to force is when the logs length exceeds size limit which\n * could result in truncation.\n * @param {boolean} reschedule true if the next periodic task should be\n * scheduled after the log entry is stored. false will end the periodic\n * task cycle.\n * @private\n */\nLogCollector.prototype._flush = function(force, reschedule) {\n // Publish only if there's anything to be logged\n if (this.totalLen > 0 && (this.logStorage.isReady() || force)) {\n //FIXME avoid truncating\n // right now we don't care if the message size is \"slightly\" exceeded\n if (this.logStorage.isReady()) {\n // Sends all cached logs\n if (this.outputCache.length) {\n this.outputCache.forEach(\n function (cachedQueue) {\n this.logStorage.storeLogs(cachedQueue);\n }.bind(this)\n );\n // Clear the cache\n this.outputCache = [];\n }\n // Send current batch\n this.logStorage.storeLogs(this.queue);\n } else {\n this.outputCache.push(this.queue);\n }\n\n this.queue = [];\n this.totalLen = 0;\n }\n\n if (reschedule) {\n this._reschedulePublishInterval();\n }\n};\n\n/**\n * Stops the periodical \"store logs\" task and immediately stores any pending\n * log entries as a batch.\n */\nLogCollector.prototype.stop = function() {\n // Flush and stop publishing logs\n this._flush(false /* do not force */, false /* do not reschedule */);\n};\n\nmodule.exports = LogCollector;\n","/* Copyright @ 2015-present 8x8, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*jslint latedef:false*/\n\n/**\n * Ordered log levels.\n */\nvar levels = {\n \"trace\": 0,\n \"debug\": 1,\n \"info\": 2,\n \"log\": 3,\n \"warn\": 4,\n \"error\": 5\n};\n\n/**\n * The default transport - console\n * @type LoggerTransport\n */\nLogger.consoleTransport = console;\n\n/**\n * The array which stores currently registered global transports.\n * @type {[LoggerTransport]}\n */\nvar globalTransports = [ Logger.consoleTransport ];\n\n/**\n * Adds given {@link LoggerTransport} instance to the list of global\n * transports which means that it'll be used by all {@link Logger}s\n * @param {LoggerTransport} transport\n */\nLogger.addGlobalTransport = function(transport) {\n if (globalTransports.indexOf(transport) === -1) {\n globalTransports.push(transport);\n }\n};\n\n/**\n * Removes given {@link LoggerTransport} instance from the list of global\n * transports\n * @param {LoggerTransport} transport\n */\nLogger.removeGlobalTransport = function(transport) {\n var transportIdx = globalTransports.indexOf(transport);\n if (transportIdx !== -1) {\n globalTransports.splice(transportIdx, 1);\n }\n};\n\n/**\n * The global configuration options.\n */\nvar globalOptions = {};\n\n/**\n * Sets global options which will be used by all loggers. Changing these works\n * even after other loggers are created.\n */\nLogger.setGlobalOptions = function(options) {\n globalOptions = options || {};\n};\n\n/**\n * Parses Error's object stack trace and extracts information about the last\n * caller before the log method was called.\n * @returns JS object with info about the caller - method name, file location,\n * line and column.\n */\nfunction getCallerInfo() {\n var callerInfo = {\n methodName: \"\",\n fileLocation: \"\",\n line: null,\n column: null\n };\n //gets the part of the stack without the logger wrappers\n var error = new Error();\n var stack = error.stack? error.stack.split(\"\\n\") : [];\n if(!stack || stack.length < 3) {\n return callerInfo;\n }\n var m = null;\n if(stack[3]) {\n m = stack[3].match(/\\s*at\\s*(.+?)\\s*\\((\\S*)\\s*:(\\d*)\\s*:(\\d*)\\)/);\n }\n if(!m || m.length <= 4) {\n //Firefox && Safari\n if(stack[2].indexOf(\"log@\") === 0){\n //Safari\n callerInfo.methodName = stack[3].substr(0, stack[3].indexOf(\"@\"));\n } else {\n //Firefox\n callerInfo.methodName = stack[2].substr(0, stack[2].indexOf(\"@\"));\n }\n return callerInfo;\n }\n\n callerInfo.methodName = m[1];\n callerInfo.fileLocation = m[2];\n callerInfo.line = m[3];\n callerInfo.column = m[4];\n return callerInfo;\n}\n\n/**\n * Logs messages using the transports and level from the logger.\n * @param logger a logger instance.\n * @param level the log level of the message. See the levels variable.\n * @param arguments array with arguments that will be logged.\n */\nfunction log() {\n var logger = arguments[0], level = arguments[1],\n args = Array.prototype.slice.call(arguments, 2);\n if(levels[level] < logger.level) {\n return;\n }\n\n var callerInfo\n = !(logger.options.disableCallerInfo || globalOptions.disableCallerInfo) &&\n getCallerInfo();\n var transports = globalTransports.concat(logger.transports);\n for(var i = 0; i < transports.length; i++) {\n var t = transports[i];\n var l = t[level];\n if(l && typeof(l) === \"function\") {\n var logPrefixes = [];\n\n logPrefixes.push(new Date().toISOString());\n\n if (logger.id) {\n logPrefixes.push(\"[\" + logger.id + \"]\");\n }\n\n if (callerInfo && callerInfo.methodName.length > 1) {\n logPrefixes.push(\"<\" + callerInfo.methodName + \">: \");\n }\n\n var fullLogParts = logPrefixes.concat(args);\n\n l.bind(t).apply(t, fullLogParts);\n }\n }\n}\n\n/**\n *\n * Constructs new logger object.\n * @param level the logging level for the new logger\n * @param id optional identifier for the logger instance.\n * @param {LoggerTransport} transports optional list of handlers(objects) for\n * the logs. The handlers must support - log, warn, error, debug, info, trace.\n * @param options optional configuration file for how the logger should behave.\n * @param {boolean} options.disableCallerInfo Whether the call site of a logger\n * method invocation should be included in the log. Defaults to false, so the\n * call site will be included.\n */\nfunction Logger(level, id, transports, options) {\n this.id = id;\n this.options = options || {};\n this.transports = transports;\n if(!this.transports) {\n this.transports = [];\n }\n this.level = levels[level];\n var methods = Object.keys(levels);\n for(var i = 0; i < methods.length; i++){\n this[methods[i]] =\n log.bind(null, this, methods[i]);\n }\n}\n\n/**\n * Sets the log level for the logger.\n * @param level the new log level.\n */\nLogger.prototype.setLevel = function (level) {\n this.level = levels[level];\n};\nmodule.exports = Logger;\n\n/**\n * Enum for the supported log levels.\n */\nLogger.levels = {\n TRACE: \"trace\",\n DEBUG: \"debug\",\n INFO: \"info\",\n LOG: \"log\",\n WARN: \"warn\",\n ERROR: \"error\"\n};\n","/* Copyright @ 2015-present 8x8, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar Logger = require(\"./Logger\");\nvar LogCollector = require(\"./LogCollector\");\n\n/**\n * Definition of the log method\n * @name log_method\n * @function\n * @param {...*} log_args the arguments to be logged\n */\n/**\n * The logger's transport type definition.\n *\n * @typedef {object} LoggerTransport\n *\n * @property {log_method} trace method called to log on {@link Logger.levels.TRACE} logging level\n * @property {log_method} debug method called to log on {@link Logger.levels.DEBUG} logging level\n * @property {log_method} info method called to log on {@link Logger.levels.INFO} logging level\n * @property {log_method} log method called to log on {@link Logger.levels.LOG} logging level\n * @property {log_method} warn method called to log on {@link Logger.levels.WARN} logging level\n * @property {log_method} error method called to log on {@link Logger.levels.ERROR} logging level\n */\n\n/**\n * Map with the created loggers with ID.\n */\nvar idLoggers = {};\n\n/**\n * Array with the loggers without id.\n */\nvar loggers = [];\n\n/**\n * Log level for the lbrary.\n */\nvar curLevel = Logger.levels.TRACE;\n\n\nmodule.exports = {\n /**\n * Adds given {@link LoggerTransport} instance to the list of global\n * transports which means that it'll be used by all {@link Logger}s\n * @param {LoggerTransport} transport\n */\n addGlobalTransport: function(transport) {\n Logger.addGlobalTransport(transport);\n },\n /**\n * Removes given {@link LoggerTransport} instance from the list of global\n * transports\n * @param {LoggerTransport} transport\n */\n removeGlobalTransport: function(transport) {\n Logger.removeGlobalTransport(transport);\n },\n /**\n * Sets global options which will be used by all loggers. Changing these\n * works even after other loggers are created.\n */\n setGlobalOptions: function(options) {\n Logger.setGlobalOptions(options);\n },\n /**\n * Creates new logger.\n * @arguments the same as Logger constructor\n */\n getLogger: function(id, transports, options) {\n var logger = new Logger(curLevel, id, transports, options);\n if(id) {\n idLoggers[id] = idLoggers[id] || [];\n idLoggers[id].push(logger);\n } else {\n loggers.push(logger);\n }\n return logger;\n },\n /**\n * Changes the log level for the existing loggers by id.\n * @param level the new log level.\n * @param id if specified the level will be changed only for loggers with the\n * same id. Otherwise the operation will affect all loggers that don't\n * have id.\n */\n setLogLevelById: function(level, id) {\n var l = id? (idLoggers[id] || []) : loggers;\n for(var i = 0; i < l.length; i++) {\n l[i].setLevel(level);\n }\n },\n /**\n * Changes the log level for all existing loggers.\n * @param level the new log level.\n */\n setLogLevel: function (level) {\n curLevel = level;\n var i = 0;\n for(; i < loggers.length; i++) {\n loggers[i].setLevel(level);\n }\n\n for(var id in idLoggers) {\n var l = idLoggers[id] || [];\n for(i = 0; i < l.length; i++) {\n l[i].setLevel(level);\n }\n }\n },\n /**\n * The supported log levels.\n */\n levels: Logger.levels,\n /**\n * Exports the LogCollector.\n */\n LogCollector: LogCollector\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// startup\n// Load entry module and return exports\n// This entry module used 'module' so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(872);\n"],"names":["root","factory","exports","module","define","amd","self","DummyLocalStorage","EventEmitter","constructor","arguments","clear","this","_storage","length","Object","keys","getItem","keyName","setItem","keyValue","removeItem","key","n","serialize","ignore","undefined","JSON","stringify","storageCopy","forEach","jitsiLocalStorage","super","window","localStorage","_localStorageDisabled","console","warn","isLocalStorageDisabled","emit","dontEmitChangedEvent","i","localStorageContent","includes","blacklist","StatusCode","APP_LINK_SCHEME","_URI_AUTHORITY_PATTERN","_URI_PATH_PATTERN","URI_PROTOCOL_PATTERN","_fixURIStringScheme","uri","regex","RegExp","match","exec","protocol","toLowerCase","substring","lastIndex","startsWith","_objectToURLParamsArray","obj","params","push","encodeURIComponent","e","parseStandardURIString","str","toString","_standardURIToString","pathname","replace","authority","userinfoEndIndex","indexOf","host","portBeginIndex","lastIndexOf","port","hostname","hashBeginIndex","search","hash","thiz","DEFAULT_POSTIS_OPTIONS","opener","parent","POSTIS_METHOD_NAME","PostMessageTransportBackend","postisOptions","postis","options","readynessCheck","scope","targetWindow","windowForEventListening","allowedOrigin","listeners","sendBuffer","listenBuffer","ready","readyMethod","listener","event","data","parse","origin","listenersForMethod","method","call","addEventListener","listen","callback","listenBufferForMethod","j","send","opts","postMessage","setTimeout","destroy","clearInterval","removeEventListener","readyCheckID","Date","Math","random","setInterval","id","Postis","_receiveCallback","message","dispose","setReceiveCallback","MESSAGE_TYPE_REQUEST","MESSAGE_TYPE_RESPONSE","Transport","backend","_listeners","Map","_requestID","_responseHandlers","_unprocessedMessages","Set","addListener","on","setBackend","_disposeBackend","_backend","_onMessageReceived","type","handler","get","delete","result","error","removeAllListeners","eventName","_len","args","Array","_key","listenersForEvent","isProcessed","size","add","set","removeListener","sendEvent","sendRequest","request","Promise","reject","Error","resolve","_ref","bind","url","dontParse","source","URL","paramStr","paramParts","substr","split","firstParam","part","param","some","k","value","decoded","decodeURIComponent","msg","onerror","reportError","String","parseURLParams","location","jitsi_meet_external_api_id","JitsiMeetJS","app","setExternalTransportBackend","externalTransportBackend","transport","logger","Logger","_setDevice","device","name","ALWAYS_ON_TOP_FILENAMES","commands","addBreakoutRoom","answerKnockingParticipant","approveVideo","askToUnmute","autoAssignToBreakoutRooms","avatarUrl","cancelPrivateChat","closeBreakoutRoom","displayName","e2eeKey","endConference","email","grantModerator","hangup","hideNotification","initiatePrivateChat","joinBreakoutRoom","localSubject","kickParticipant","muteEveryone","overwriteConfig","overwriteNames","password","pinParticipant","rejectParticipant","removeBreakoutRoom","resizeFilmStrip","resizeLargeVideo","_requestDesktopSourcesResult","sendChatMessage","sendEndpointTextMessage","sendParticipantToRoom","sendTones","setFollowMe","setLargeVideoParticipant","setMediaEncryptionKey","setNoiseSuppressionEnabled","setParticipantVolume","setSubtitles","setTileView","setVideoQuality","showNotification","startRecording","startShareVideo","stopRecording","stopShareVideo","subject","submitFeedback","toggleAudio","toggleCamera","toggleCameraMirror","toggleChat","toggleE2EE","toggleFilmStrip","toggleLobby","toggleModeration","toggleNoiseSuppression","toggleParticipantsPane","toggleRaiseHand","toggleShareScreen","toggleSubtitles","toggleTileView","toggleVirtualBackgroundDialog","toggleVideo","events","changeParticipantNumber","APIInstance","number","_numberOfParticipants","parseSizeParam","parsedValue","JitsiMeetExternalAPI","domain","roomName","width","height","parentNode","document","body","configOverwrite","interfaceConfigOverwrite","jwt","lang","onload","invitees","devices","userInfo","release","parseArguments","_parentNode","_url","o","tmp","serverURL","room","scheme","endsWith","contextRoot","URLSearchParams","defaultLanguage","searchString","urlPrefix","urlParamsArray","urlParamsString","join","urlObjectToString","generateURL","appData","_createIFrame","_transport","_frame","contentWindow","isArray","invite","_tmpE2EEKey","_isLargeVideoVisible","_isPrejoinVideoVisible","_participants","_myUserID","_onStageParticipant","_setupListeners","frameName","createElement","allow","_setSize","sandbox","setAttribute","style","border","appendChild","src","_getAlwaysOnTopResources","iframeWindow","iframeDocument","baseURL","base","querySelector","href","map","filename","_getFormattedDisplayName","participantId","formattedDisplayName","_getOnStageParticipant","_getLargeVideo","iframe","getIFrame","getElementById","_getPrejoinVideo","_getParticipantVideo","parsedHeight","parsedWidth","_height","_width","userID","executeCommand","avatarURL","user","displayname","isVisible","_videoQuality","videoQuality","updateNumberOfParticipants","rooms","allParticipants","reduce","prev","roomItemKey","_rooms$roomItemKey","participants","async","addEventListeners","captureLargeVideoScreenshot","removeChild","_len2","_key2","executeCommands","commandList","getAvailableDevices","catch","getContentSharingParticipants","getCurrentDevices","getCustomAvatarBackgrounds","getLivestreamUrl","getParticipantsInfo","participantIds","participantsInfo","values","participant","idx","getVideoQuality","isAudioAvailable","isDeviceChangeAvailable","deviceType","isDeviceListAvailable","isMultipleAudioInputSupported","TypeError","isAudioMuted","isAudioDisabled","isModerationOn","mediaType","isParticipantForceMuted","isParticipantsPaneOpen","isSharingScreen","isStartSilent","getAvatarURL","getDeploymentInfo","getDisplayName","getEmail","getNumberOfParticipants","isVideoAvailable","isVideoMuted","listBreakoutRooms","videoType","removeEventListeners","eventList","_requestDesktopSources","sendProxyConnectionEvent","setAudioInputDevice","label","deviceId","kind","setAudioOutputDevice","setVideoInputDevice","mode","enabled","keyInfo","index","exportedKey","crypto","subtle","exportKey","from","Uint8Array","internals","text","firstOptions","reviver","protoAction","scan","next","nodes","node","prototype","hasOwnProperty","SyntaxError","__proto__","safeParse","ignoreError","require","LogCollector","logStorage","stringifyObjects","storeInterval","maxEntryLength","levels","logLevel","_log","apply","storeLogsIntervalID","queue","totalLen","outputCache","someObject","formatLogMessage","len","arg","ERROR","timestamp","prevMessage","count","_flush","start","_reschedulePublishInterval","clearTimeout","flush","force","reschedule","isReady","cachedQueue","storeLogs","stop","consoleTransport","globalTransports","addGlobalTransport","removeGlobalTransport","transportIdx","splice","globalOptions","log","level","slice","callerInfo","disableCallerInfo","methodName","fileLocation","line","column","stack","m","getCallerInfo","transports","concat","t","l","logPrefixes","toISOString","fullLogParts","methods","setGlobalOptions","setLevel","TRACE","DEBUG","INFO","LOG","WARN","idLoggers","loggers","curLevel","getLogger","setLogLevelById","setLogLevel","ReflectOwnKeys","R","Reflect","ReflectApply","target","receiver","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","Number","isNaN","init","once","emitter","errorListener","err","resolver","eventTargetAgnosticAddListener","flags","addErrorHandlerIfEventEmitter","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","_getMaxListeners","that","_addListener","prepend","existing","warning","create","newListener","unshift","warned","w","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","unwrap","evlistener","arr","ret","unwrapListeners","arrayClone","listenerCount","copy","wrapListener","defineProperty","enumerable","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","prependListener","prependOnceListener","list","position","originalListener","shift","pop","spliceOne","off","rawListeners","eventNames","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","prop"],"sourceRoot":""} \ No newline at end of file