@vkontakte/calls-sdk 2.8.12-dev.8a7f9c02.0 → 2.8.12-dev.8bd84f52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/calls-sdk.cjs.js CHANGED
@@ -1,20 +1,14 @@
1
1
  /*!
2
- * @vkontakte/calls-sdk v2.8.12-dev.8a7f9c02.0
3
- * Wed, 26 Aug 2026 08:49:54 GMT
2
+ * @vkontakte/calls-sdk v2.8.12-dev.8bd84f52.0
3
+ * Mon, 31 Aug 2026 12:55:07 GMT
4
4
  * https://calls-sdk.cdn-vk.ru/doc/latest/index.html
5
5
  */
6
6
 
7
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("webrtc-adapter");c=s(c);let l=require("messagepack"),u=require("@vkontakte/libvpx");u=s(u);let d=require("bit-buffer"),f=require("simple-ebml-builder");f=s(f);let p=require("fflate");p=s(p);var m=class{log(e,t,n=!1){}destroy(){}};function ee(e){"@babel/helpers - typeof";return ee=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},ee(e)}function te(e,t){if(ee(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(ee(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function ne(e){var t=te(e,`string`);return ee(t)==`symbol`?t:t+``}function h(e,t,n){return(t=ne(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var g=25*1024*1024,re=10,ie=`_okcls_logs_session_`,ae=3e4,oe=`ok-calls-sdk-debug-logs`,se=1,_=`sessions`,v=`chunks`,ce=120*1e3,le=new Set([`WARN`,`ERROR`]);function ue(){return`${Date.now()}_${Math.random().toString(36).slice(2)}`}function de(){let e=ue();return fe(e),e}function fe(e){Ue.has(e)||Ue.set(e,[]),We.has(e)||We.set(e,0),Ge.has(e)||Ge.set(e,null)}function pe(e){return Ge.get(e)??null}function me(e){let t=We.get(e)??0;return We.set(e,t+1),t}function he(e,t){return`${e}:${String(t).padStart(12,`0`)}`}function ge(e){return new Blob([e]).size}function _e(){try{let e=window.localStorage;for(let t of Object.keys(e))t.indexOf(ie)===0&&e.removeItem(t)}catch(e){console.error(`Storage is blocked`,e)}}var y=new class{constructor(){h(this,`_db`,null),h(this,`_dbPromise`,null),h(this,`_supported`,this.isSupported())}get supported(){return this._supported}open(){return this.isSupported()?(this._dbPromise||(this._dbPromise=new Promise(e=>{let t=window.indexedDB.open(oe,se);t.onupgradeneeded=()=>{this.createSchema(t.result)},t.onsuccess=()=>{this._db=t.result,this._supported=!0,this._db.onversionchange=()=>{this.close()},e(this._db)},t.onerror=()=>{console.warn(`Failed to open debug log storage`,t.error),this._supported=!1,this._dbPromise=null,e(null)},t.onblocked=()=>{console.warn(`Debug log storage opening is blocked`)}})),this._dbPromise):(this._supported=!1,Promise.resolve(null))}close(){this._db&&(this._db.close(),this._db=null),this._dbPromise=null}async deleteDatabaseForTests(){this.close(),this._supported=this.isSupported(),this._supported&&await new Promise(e=>{let t=window.indexedDB.deleteDatabase(oe);t.onsuccess=()=>e(),t.onerror=()=>e(),t.onblocked=()=>e()})}async getAllSessions(){let e=await this.open();if(!e)return[];let t=e.transaction(_,`readonly`),n=await this.requestToPromise(t.objectStore(_).getAll());return await this.txDone(t),n}async getSessionsByConversationId(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).index(`conversationId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.startTime-t.startTime)}async getSessionBySessionId(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).get(e));return await this.txDone(n),r?[r]:[]}async getChunksBySession(e){let t=await this.open();if(!t)return[];let n=t.transaction(v,`readonly`),r=await this.requestToPromise(n.objectStore(v).index(`sessionId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.sequence-t.sequence)}async putSession(e){let t=await this.open();if(!t)return!1;let n=t.transaction(_,`readwrite`);return n.objectStore(_).put(e),await this.txDone(n),!0}async putSessionAndChunk(e,t){let n=await this.open();if(!n)return!1;let r=n.transaction([_,v],`readwrite`);return r.objectStore(_).put(e),r.objectStore(v).put(t),await this.txDone(r),!0}async updateSessionConversationId(e,t){let[n]=await this.getSessionBySessionId(e);n&&await this.putSession({...n,conversationId:t,updatedAt:Math.max(n.updatedAt,Date.now())})}async deleteSession(e){let t=await this.open();if(!t)return 0;let n=await this.getChunksBySession(e),r=t.transaction([_,v],`readwrite`),i=r.objectStore(v),a=0;for(let e of n)a+=e.bytes,i.delete(e.id);return r.objectStore(_).delete(e),await this.txDone(r),a}async deleteChunks(e){let t=await this.open();if(!t||!e.length)return;let n=t.transaction(v,`readwrite`),r=n.objectStore(v);for(let t of e)r.delete(t.id);await this.txDone(n)}async estimateStorage(){return navigator.storage?.estimate?navigator.storage.estimate().catch(()=>null):null}async getStorageSummary(){let e=await this.getAllSessions();return{sessions:e,callsCount:this.groupSessions(this.getCallSessions(e)).length,usedBytes:e.reduce((e,t)=>e+t.bytes,0)}}async enforceRetentionPolicy(){let e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),r=e.reduce((e,t)=>e+t.bytes,0);for(;r>g&&n.length;){let e=n.shift();if(!e)break;r-=await this.deleteSession(e.sessionId)}for(;t.length>re||t.length>1&&r>g;){let e=t.shift();if(!e)return;for(let t of e.sessions)r-=await this.deleteSession(t.sessionId)}t.length===1&&r>g&&await this.trimOldestChunks(t[0],r-g),e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),(t.length>re||e.reduce((e,t)=>e+t.bytes,0)>g)&&await this.enforceRetentionPolicy()}createSchema(e){if(!e.objectStoreNames.contains(_)){let t=e.createObjectStore(_,{keyPath:`sessionId`});t.createIndex(`conversationId`,`conversationId`,{unique:!1}),t.createIndex(`updatedAt`,`updatedAt`,{unique:!1})}e.objectStoreNames.contains(v)||e.createObjectStore(v,{keyPath:`id`}).createIndex(`sessionId`,`sessionId`,{unique:!1})}isSupported(){return typeof window<`u`&&!!window.indexedDB}requestToPromise(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}txDone(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}getCallKey(e){return e.conversationId||e.sessionId}getCallSessions(e){return e.filter(e=>e.conversationId!==null)}getGlobalSessions(e){return e.filter(e=>e.conversationId===null).sort((e,t)=>e.updatedAt===t.updatedAt?e.startTime===t.startTime?e.sessionId.localeCompare(t.sessionId):e.startTime-t.startTime:e.updatedAt-t.updatedAt)}groupSessions(e){let t=new Map;for(let n of e){let e=this.getCallKey(n),r=t.get(e);r||(r={key:e,sessions:[],bytes:0,startTime:n.startTime,updatedAt:0},t.set(e,r)),r.sessions.push(n),r.bytes+=n.bytes,r.startTime=Math.min(r.startTime,n.startTime),r.updatedAt=Math.max(r.updatedAt,n.updatedAt)}return Array.from(t.values()).sort((e,t)=>e.updatedAt===t.updatedAt?e.startTime===t.startTime?e.key.localeCompare(t.key):e.startTime-t.startTime:e.updatedAt-t.updatedAt)}async updateSessionFromChunks(e){let t=await this.getChunksBySession(e.sessionId);if(!t.length){await this.deleteSession(e.sessionId);return}let n=t.reduce((e,t)=>e+t.bytes,0),r=t.reduce((e,t)=>e+t.items.length,0),i=t[0].startTime,a=t[t.length-1].endTime;await this.putSession({...e,startTime:i,endTime:a,updatedAt:a,bytes:n,entriesCount:r})}async trimOldestChunks(e,t){let n=[];for(let t of e.sessions){let e=await this.getChunksBySession(t.sessionId);n.push(...e.map(e=>({...e,session:t})))}n.sort((e,t)=>e.startTime===t.startTime?e.sequence-t.sequence:e.startTime-t.startTime);let r=n.slice(0,Math.max(n.length-1,0)),i=0,a=new Map,o=[];for(let e of r)if(o.push(e),i+=e.bytes,a.set(e.sessionId,e.session),i>=t)break;await this.deleteChunks(o);for(let e of a.values())await this.updateSessionFromChunks(e);return i}};async function ve(e){return e.sessionId?y.getSessionBySessionId(e.sessionId):e.conversationId?y.getSessionsByConversationId(e.conversationId):[]}async function ye(e,t,n,r){if(!r.length)return;let i=pe(e)||t,a=r,o=JSON.stringify(a),s=ge(o);for(;s>g&&a.length>1;)a=a.slice(Math.floor(a.length/2)),o=JSON.stringify(a),s=ge(o);if(s>g)return;let c=a[0].t,l=a[a.length-1].t,[u]=await y.getSessionBySessionId(e),d=u||{sessionId:e,conversationId:i,startTime:c,endTime:l,updatedAt:l,bytes:0,entriesCount:0},f={...d,conversationId:i||d.conversationId,startTime:Math.min(d.startTime,c),endTime:Math.max(d.endTime,l),updatedAt:Math.max(d.updatedAt,l),bytes:d.bytes+s,entriesCount:d.entriesCount+a.length},p={id:he(e,n),sessionId:e,sequence:n,startTime:c,endTime:l,bytes:s,items:a};await y.putSessionAndChunk(f,p)&&await y.enforceRetentionPolicy()}function be(e){let t=new WeakSet;try{return JSON.parse(JSON.stringify(e,(e,n)=>{if(n instanceof Error||typeof n==`bigint`||typeof n==`function`||typeof n==`symbol`)return String(n);if(n&&typeof n==`object`){if(t.has(n))return`[Circular]`;t.add(n)}return n}))}catch{return e.map(e=>String(e))}}function xe(e){let t=Ue.get(e);if(!t?.length)return Je;let n=t.splice(0),r=pe(e),i=me(e);return Je=Je.then(()=>ye(e,r,i,n)).catch(e=>{console.warn(`Failed to write debug log to storage`,e)}),Je}function Se(e){if(e)return xe(e);for(let e of Ue.keys())xe(e);return Je}async function Ce(e){let t=[];for(let n of e.sort((e,t)=>e.startTime-t.startTime)){let e=await y.getChunksBySession(n.sessionId);for(let n of e)t.push(...n.items)}return t}async function we(e){let t=await Ce(e);if(!t.length)return t;let n=t.sort(Ee),r=n[0].t,i=n[n.length-1].t;return[...await Te(r,i,new Set(e.map(e=>e.sessionId))),...n].sort(Ee)}async function Te(e,t,n){let r=(await y.getAllSessions()).filter(r=>!n.has(r.sessionId)&&r.conversationId===null&&r.endTime>=e-ce&&r.startTime<=t),i=[];for(let n of r){let r=await y.getChunksBySession(n.sessionId);for(let n of r)n.endTime<e-ce||n.startTime>t||i.push(...n.items.filter(n=>n.t>=e-ce&&n.t<=e?!0:n.t>=e&&n.t<=t&&le.has(n.l)))}return i}function Ee(e,t){return e.t-t.t}function De(e,t){let n=document.createElement(`a`),r=new Blob([e],{type:`text/json`}),i=URL.createObjectURL(r);n.href=i,n.download=t,n.click(),URL.revokeObjectURL(i)}function Oe(){Se()}function ke(){document.visibilityState===`hidden`&&Se()}function Ae(e,t,n=Ke){He||je(),fe(n);let r=new Date,i={t:r.getTime(),l:e,d:be(t),h:r.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`})};return Ue.get(n)?.push(i),qe||(qe=window.setTimeout(()=>{qe=null,Se()},ae)),i}function je(){He||(He=!0,_e(),y.open(),window.addEventListener(`pagehide`,Oe),document.addEventListener(`visibilitychange`,ke))}function Me(){return He||je(),Se(),de()}function Ne(e,t=Ke){t&&(fe(t),Ge.set(t,e),e&&y.updateSessionConversationId(t,e))}async function Pe(){return await Se(),(await y.getAllSessions()).sort((e,t)=>t.updatedAt-e.updatedAt)}async function Fe(e){return await Se(),we(await ve(e))}async function Ie(e){return JSON.stringify(await Fe(e))}async function Le(e){let t=await Ie(e),n=`logs_${e.sessionId||e.conversationId}_${Date.now()}.json`;return De(t,n),n}async function Re(e){await Se();let t=e?await ve(e):await y.getAllSessions();for(let e of t)await y.deleteSession(e.sessionId)}async function ze(){await Se();let e=await y.getStorageSummary(),t=await y.estimateStorage();return{supported:y.supported,callsCount:e.callsCount,sessionsCount:e.sessions.length,usedBytes:e.usedBytes,maxBytes:g,maxCalls:re,quotaBytes:t?.quota,usageBytes:t?.usage}}async function Be(){await Se();let e=await Ce(await y.getAllSessions());return JSON.stringify(e.sort(Ee))}async function Ve(){let e=await Be(),t=`logs_${Date.now()}.json`;return De(e,t),t}var He=!1,Ue=new Map,We=new Map,Ge=new Map,Ke=de(),qe=null,Je=Promise.resolve();window.__VKCallsSDKLogs__=(e=!1)=>(He||je(),e?Be():Ve());var b=class e{static get sessionKey(){return e._sessionKey}static set sessionKey(t){e._sessionKey=t}static get sessionSecretKey(){return e._sessionSecretKey}static set sessionSecretKey(t){e._sessionSecretKey=t}static get accessToken(){return e._accessToken}static set accessToken(t){e._accessToken=t}static get userId(){return e._userId}static set userId(t){e._userId=t}static isEmpty(){return!e._sessionKey}static reauthorize(t){return e._reauthorizePromise||(e._reauthorizePromise=t().finally(()=>{e._reauthorizePromise=null})),e._reauthorizePromise}};h(b,`_sessionKey`,void 0),h(b,`_sessionSecretKey`,void 0),h(b,`_accessToken`,void 0),h(b,`_userId`,null),h(b,`_reauthorizePromise`,null);var x=class{constructor(){h(this,`_handlers`,{}),h(this,`_listeners`,[])}_triggerEvent(e,...t){if(Object.hasOwn(this._handlers,e))for(let n of this._handlers[e])n.apply(this,t)}addEventListener(e,t){if(typeof t!=`function`)throw Error(`Listener should be a function`);return Object.hasOwn(this._handlers,e)||(this._handlers[e]=[]),this._handlers[e].push(t),{dispose:this.removeEventListener.bind(this,e,t)}}removeEventListener(e,t){if(!Object.hasOwn(this._handlers,e))return;t||delete this._handlers[e];let n=this._handlers[e].indexOf(t);n>=0&&this._handlers[e].splice(n,1)}subscribe(e,t,n){let r=e.addEventListener(t,n);this._listeners.push(r)}unsubscribe(){this._listeners.forEach(e=>{e.dispose()})}},S=function(e){return e.MIC_CAMERA_PERMISSION=`mic_camera`,e.CAMERA_PERMISSION=`camera`,e.MIC_PERMISSION=`mic`,e.CAMERA_ACCESS=`cameralock`,e.MIC_ACCESS=`miclock`,e.MIC_NOT_FOUND=`nomic`,e.SCREEN_PERMISSION=`screenpermission`,e.SCREEN_ACCESS=`screenlock`,e.CONNECTION=`connection`,e.NETWORK=`network`,e.UNKNOWN=`unknown`,e.UNSUPPORTED=`unsupported`,e.SIGNALING_FAILED=`signalingfailed`,e.API=`api`,e.AUTH=`auth`,e.OVERCONSTRAINED=`overconstrained`,e}(S||{}),C=function(e){return e.AUDIO=`AUDIO`,e.VIDEO=`VIDEO`,e.SCREEN_SHARING=`SCREEN_SHARING`,e.MOVIE_SHARING=`MOVIE_SHARING`,e.AUDIO_SHARING=`AUDIO_SHARING`,e.ANIMOJI=`ANIMOJI`,e}(C||{}),w=function(e){return e.ACCEPT_CONCURRENT=`callAcceptConcurrent`,e.ACCEPT_INCOMING=`callAcceptIncoming`,e.ACCEPTED_OUTGOING=`callAcceptedOutgoing`,e.ADD_PARTICIPANT=`callAddParticipant`,e.CALL_SPEC_ERROR=`callSpecError`,e.DECLINE_INCOMING=`callDeclineIncoming`,e.DEVICE_CHANGED=`callDeviceChanged`,e.DEVICES=`callDevices`,e.ERROR=`callError`,e.HANGUP=`callHangup`,e.ICE_CONNECTION_STATE=`callIceConnectionState`,e.ICE_CONNECTION_TYPE=`callIceConnectionType`,e.ICE_RESTART=`callIceRestart`,e.JOIN_CONVERSATION=`callJoinConversation`,e.MEDIA_STATUS=`callMediaStatus`,e.OUTGOING_CALL=`callStart`,e.OUTGOING_MULTIPARTY_CALL=`callStartMultiparty`,e.PAT_ALLOCATED=`patAllocate`,e.PAT_DEALLOCATED=`patDeallocate`,e.PAT_ERROR=`patError`,e.PAT_OUTDATED_RESPONSE=`patOutdatedResponse`,e.PAT_WAITING_TIME_ERROR=`patWaitingTimeError`,e.POOR_CONNECTION=`callPoorConnection`,e.PUSH=`callPush`,e.RECONNECT=`callReconnect`,e.RELAY_POLICY=`callForceRelay`,e.REMOVE_PARTICIPANT=`callRemoveParticipant`,e.SOCKET_ACTION=`callSocketAction`,e.TOPOLOGY_CHANGE_REQUESTED=`callTopologyChangeRequested`,e}(w||{}),Ye=e=>e.stop(),Xe=e=>e.getTracks().forEach(Ye),Ze=e=>e.getVideoTracks().forEach(Ye);async function Qe(e,t){try{let n=typeof t.width==`number`?t.width:void 0,r=typeof t.height==`number`?t.height:void 0;await e.applyConstraints({...t,...n&&{width:{max:n,ideal:n}},...r&&{height:{max:r,ideal:r}}})}catch(e){z.warn(`setVideoConstraints failed`,e)}}var $e=class{constructor(){h(this,`_cameraPermissionStatus`,void 0),h(this,`_microphonePermissionStatus`,void 0),h(this,`_listener`,void 0)}static isSupported(){return E.browserName()!==`Firefox`&&`permissions`in navigator&&`PermissionStatus`in window}async init(e){try{let[t,n]=await Promise.all([navigator.permissions.query({name:`camera`}),navigator.permissions.query({name:`microphone`})]);this._cameraPermissionStatus=t,this._microphonePermissionStatus=n,this._listener=e,this._cameraPermissionStatus.onchange=e=>this.handlePermissionChange(e),this._microphonePermissionStatus.onchange=e=>this.handlePermissionChange(e)}catch(e){z.warn(`NavigatorPermissions init error`,e)}}handlePermissionChange(e){let t=e.target;if(t instanceof PermissionStatus){let{name:e,state:n}=t;switch(e){case`audio_capture`:this._listener(`microphone`,n);break;case`video_capture`:this._listener(`camera`,n);break}}}getPermissionState(e){switch(e){case`camera`:return this._cameraPermissionStatus?.state??null;case`microphone`:return this._microphonePermissionStatus?.state??null}return null}},et=`_okcls_`,tt=(()=>{try{let e=Date.now().toString(),t=window.localStorage,n=!1;return t.setItem(e,e),n=t.getItem(e)===e,t.removeItem(e),n?t:null}catch{return null}})();function nt(e){let t=tt?tt.getItem(et+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function rt(e,t){try{tt&&tt.setItem(et+e,JSON.stringify(t))}catch{}}function it(e){tt&&tt.removeItem(et+e)}var at;(function(e){function t(e){return nt(e)||null}e.get=t;function n(e,t){rt(e,t)}e.set=n;function r(e){it(e)}e.remove=r})(at||(at={}));var ot=at,st=null,ct=null,lt=null,ut=[],dt=[],ft=[],pt=null,mt=null,ht=null,gt=!1,_t=!1,vt,yt,bt,xt=null,St=null,Ct=``,wt=null,Tt=[],Et=null,Dt=navigator.appVersion,Ot=navigator.appName,kt=navigator.userAgent,At={};function jt(e,t){return Number(t.deviceId===`default`)-Number(e.deviceId===`default`)}var Mt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Mt).includes(e)}e.contains=t})(Mt||(Mt={}));var Nt=class{constructor(e,t=!1,n=N.videoMaxWidth,r=N.videoMaxHeight,i=N.videoFrameRate){h(this,`audio`,void 0),h(this,`video`,void 0),h(this,`needVideo`,void 0),h(this,`lastSimplifyWasReached`,void 0),h(this,`supportedConstraints`,void 0),h(this,`isVideoRequested`,()=>this.needVideo),this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let a=!1;if(e){a={noiseSuppression:N.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let t=T.getMicrophones(),n,r;if(mt&&(r=mt.groupId,n=mt.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!mt&&T.os()===`MacOS`&&t.find(e=>e.label.includes(`iPhone`))){let e=t.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));e&&(r=e.groupId,n=e.deviceId)}r&&this.supportedConstraints.groupId?a.groupId={exact:r}:n&&(a.deviceId={exact:n})}let o=!1;if(t){o={width:{min:N.videoMinWidth,max:n,ideal:n},height:{min:N.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:N.videoAspectRatio},frameRate:{ideal:i}};let e=T.getCameras(),a,s;if(pt&&(s=pt.groupId,a=pt.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!pt&&T.os()===`MacOS`&&e.find(e=>e.label.includes(`iPhone`))){let t=e.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));t&&(s=t.groupId,a=t.deviceId)}s&&this.supportedConstraints.groupId?o.groupId={exact:s}:a&&(o.deviceId={exact:a}),N.videoFacingMode&&(o.facingMode={ideal:N.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=a,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video==`object`&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio==`object`&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let e=typeof this.video==`object`&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio==`object`&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||e)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Pt=class extends Nt{constructor(e,t,n,r){if(super(!1,!0),h(this,`captureController`,void 0),this.captureController=`CaptureController`in window?new CaptureController:null,typeof this.video==`object`?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode,delete this.video.width,delete this.video.height):this.video={},this.video.cursor=`motion`,e&&(this.video.width=e),t&&(this.video.height=t),this.video.frameRate=n,this.video.displaySurface=N.displaySurface,T.browserName()===`Safari`){let n=Number(T.browserVersion());n===16?(e&&(this.video.width={max:e}),t&&(this.video.height={max:t})):n===17&&(delete this.video.width,delete this.video.height)}r&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:N.audioShareSystemInclude?`include`:`exclude`,windowAudio:N.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},Ft=class e{constructor(){h(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(t=null){if(e._lockId)throw t?.log(w.ERROR,`change_device`),z.warn(`Device change failed: MediaSource is busy`),Error(`MediaSource is busy`);e._lockId=this._lockId}free(){e._lockId===this._lockId&&(e._lockId=0)}};h(Ft,`_lockId`,0);async function It(){_t=!1,gt=!1,st=null;let e={camera:T.getSavedCamera(),microphone:T.getSavedMicrophone(),output:T.getSavedOutput()};await Rt(),Lt(`devicechange`,e),R.onDeviceChange()}function Lt(e,...t){if(At[e])for(let n of At[e])n(...t)}async function Rt(){return st||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!ct&&navigator.mediaDevices.addEventListener&&(ct=M.debounce(It,N.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,ct)),!lt&&$e.isSupported()&&(lt=new $e,await lt.init((e,t)=>{switch(t){case`denied`:case`prompt`:ct?.();break}})),st=navigator.mediaDevices.enumerateDevices().then(e=>{ut=e.filter(e=>e.kind===`videoinput`?((e.label||lt?.getPermissionState(`camera`)===`granted`)&&(gt=!0),!0):!1),ut.sort(jt),dt=e.filter(e=>e.kind===`audioinput`?((e.label||lt?.getPermissionState(`microphone`)===`granted`)&&(_t=!0),!0):!1),dt.sort(jt),ft=e.filter(e=>e.kind===`audiooutput`),ft.sort(jt);let t=pt?.deviceId??ot.get(`videoinput`),n=mt?.deviceId??ot.get(`audioinput`),r=ht?.deviceId??ot.get(`audiooutput`);return pt=ut.find(e=>e.deviceId===t)||null,mt=dt.find(e=>e.deviceId===n)||null,ht=ft.find(e=>e.deviceId===r)||ft[0]||null,st=Promise.resolve(e),e}).catch(()=>(st=null,[]))))}async function zt(){if(`userAgentData`in navigator)try{let{platformVersion:e}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!e){z.warn(`Can't to get OS version`);return}let t=parseInt(e.split(`.`)[0]);wt=isNaN(t)?null:t}catch(e){z.warn(`Failed to get OS version`,e)}}function Bt(e){if(pt&&mt)return;let t=(e,t)=>{let n=t.getSettings()?.deviceId;return e.find(e=>e.deviceId===n||e.label===t.label)||null};e?.getTracks().forEach(e=>{!mt&&e.kind===A.audio?mt=t(T.getMicrophones(),e):!pt&&e.kind===A.video&&(pt=t(T.getCameras(),e))})}async function Vt(e,t,n=z,r=null){n.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative()))),T.releaseFirefoxMicrophonePermissionWarmup();let i=(!e.isVideo()||T.hasCameraPermission())&&(!e.isAudio()||T.hasMicrophonePermission());!i&&!t&&R.onPermissionsRequested();let a=new Ft;try{a.busy(r);let t=await navigator.mediaDevices.getUserMedia(e.getNative());return a.free(),i||await It(),Bt(t),t}catch(i){switch(a.free(),n.error(`getUserMedia error`,i),i.name){case`PermissionDeniedError`:case`PermissionDismissedError`:case`NotAllowedError`:case`SecurityError`:case`DOMException`:case`NotFoundError`:t=e.isVideoRequested()?S.CAMERA_PERMISSION:S.MIC_PERMISSION;break;case`OverconstrainedError`:t=S.OVERCONSTRAINED;break;case`TypeError`:t=S.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?S.CAMERA_ACCESS:S.MIC_ACCESS;break;case`Error`:if(i.message===`MediaSource is busy`){t=e.isVideoRequested()?S.CAMERA_ACCESS:S.MIC_ACCESS;break}}if(e.canSimplify())return Vt(e.simplify(),t,n,r);let o=t||S.UNKNOWN;throw R.onPermissionsError(o,i),o}}async function Ht(e=z){if(!(xt||T.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{T.hasMicrophonePermission()||R.onPermissionsRequested(),xt=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(t){e.warn(`Firefox microphone permission warmup failed`,t)}}async function Ut(e,t=z,n=null){t.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let r=new Ft;try{r.busy(n);let i=await navigator.mediaDevices.getDisplayMedia(e.getNative()),a=i?.getVideoTracks()[0];if(a){let n=a.getSettings()?.displaySurface;if(t.debug(`Got display media track: ${a.id} (${n})`),a.contentHint=`text`,e.captureController&&(n===`browser`||n===`window`))try{e.captureController.setFocusBehavior(`no-focus-change`)}catch(e){t.warn(`Failed to set focus behavior`,e)}}return i}catch(e){switch(e.name){case`PermissionDeniedError`:case`NotAllowedError`:case`SecurityError`:throw S.SCREEN_PERMISSION;case`AbortError`:case`NotReadableError`:throw S.SCREEN_ACCESS;default:throw e}}finally{r.free()}}function Wt(){return Tt.length||(Tt=(()=>{let e,t=!1,n=0,r=`0`,i=kt.match(/(opera|chrome|safari|firefox)\/?\s*(\d+)/i)||[];if(i[1]===`Safari`){if(e=kt.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=kt.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=kt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=kt.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=kt.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=kt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=kt.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=kt.match(/\bEdge?\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(window.opr!==void 0&&/^(.+\.)?ok.ru$/.test(window.location.host))return[`Opera`,`Hidden`,t,n,r]}return e=kt.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:Ot,e&&e[1]||i[2]||Dt,t,n,r]})()),Tt}var T;(function(e){async function t(){await Rt(),await zt()}e.init=t;function n(){return ut}e.getCameras=n;function r(){return dt}e.getMicrophones=r;function i(){return ft}e.getOutput=i;function a(){return ut.length>0}e.hasCamera=a;function o(){return dt.length>0}e.hasMicrophone=o;function s(){return pt}e.getSavedCamera=s;function c(){return mt}e.getSavedMicrophone=c;function l(){return ht}e.getSavedOutput=l;function u(){return N.videoFacingMode}e.getVideoFacingMode=u;function d(){return gt}e.hasCameraPermission=d;function f(){return _t}e.hasMicrophonePermission=f;function p(){return lt?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=p;function m(e=!1){return f()?a()&&e?d():!0:!1}e.hasPermissions=m;function ee(){xt&&(Xe(xt),xt=null)}e.releaseFirefoxMicrophonePermissionWarmup=ee;async function te(e=!1,t=!0,n=!0,r=z,i=null){!e&&!t?await Ht(r):T.releaseFirefoxMicrophonePermissionWarmup();let s=o()&&t,c=a()&&e,l;if(!s&&!c)l=new MediaStream;else try{l=await Vt(new Nt(s,c),void 0,r,i)}catch{l=new MediaStream}return!l.getVideoTracks().length&&n&&l.addTrack(T.getBlackMediaTrack()),!l.getAudioTracks().length&&n&&l.addTrack(T.getSilentMediaTrack()),l}e.getUserMedia=te;async function ne(e,t,n=z,r=null){return Ut(new Pt(e&&!N.consumerFastScreenShare?N.fastScreenShareWidth:0,e&&!N.consumerFastScreenShare?N.fastScreenShareHeight:0,N.getScreenFrameRate(e),t),n,r)}e.getScreenMedia=ne;async function h(e=!1,t,n=z,r=null){return Vt(new Nt(!1,!0,e?N.videoEffectMaxWidth:N.videoMaxWidth,e?N.videoEffectMaxHeight:N.videoMaxHeight,t),void 0,n,r)}e._getUserVideo=h;async function g(e,t,n=z,r=null){let i=t?.width||N.videoMaxWidth,a=t?.height||N.videoMaxHeight;return Vt(new Nt(!1,e||!0,i,a),void 0,n,r)}e.getUserVideo=g;async function re(e,t=z,n=null){return Vt(new Nt(e||!0,!1),void 0,t,n)}e.getUserAudio=re;async function ie(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return Qe(n,t)}e.setResolution=ie;async function ae(e,t){let n=(await Rt()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?pt=n:e===`audioinput`?mt=n:e===`audiooutput`&&(ht=n),ot.set(e,t),n):null}e._saveDeviceId=ae;function oe(){if(!bt||bt.readyState===`ended`){let e=T.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),bt=t.stream.getAudioTracks()[0]}return Object.assign(bt.clone(),{enabled:!1})}e.getSilentMediaTrack=oe;function se(e=N.videoMinWidth,t=N.videoMinHeight){yt||(yt=document.createElement(`canvas`)),yt.width=e,yt.height=t;let n=yt.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!vt||vt.readyState===`ended`)&&(vt=yt.captureStream(N.videoFrameRate).getVideoTracks()[0]),Object.assign(vt.clone(),{enabled:!1})}e.getBlackMediaTrack=se;function _(){return v()===null}e.isBrowserSupported=_;function v(){try{let e=window;return e.navigator.mediaDevices?`getUserMedia`in e.navigator.mediaDevices?e.RTCPeerConnection?e.RTCIceCandidate?e.RTCSessionDescription?e.HTMLCanvasElement?e.HTMLCanvasElement.prototype.captureStream?e.RTCRtpSender?e.RTCRtpSender.prototype.replaceTrack?e.RTCRtpSender.prototype.getParameters?`sendBeacon`in e.navigator?null:`send-beacon-unavailable`:`rtp-sender-get-parameters-unavailable`:`rtp-sender-replace-track-unavailable`:`rtp-sender-unavailable`:`canvas-capture-stream-unavailable`:`html-canvas-unavailable`:`rtc-session-description-unavailable`:`rtc-ice-candidate-unavailable`:`rtc-peer-connection-unavailable`:`get-user-media-unavailable`:`media-devices-unavailable`}catch{return`support-check-failed`}}e.getBrowserSupportFailure=v;function ce(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=ce;function le(){let e=T.browserName()===`Opera`,t=T.browserName()===`Yandex`;return e||t}e.isBrokenH264Decoder=le;function ue(){return T.browserName()===`Yandex`&&T.os()===`Windows`||N.simulcast}e.isBrokenVP9Encoder=ue;function de(){let e=T.browserName()===`Safari`&&Number(T.browserVersion())===17&&[4,5,6].includes(Number(T.browserSubVersion())),t=T.osVersion(),n=T.os()===`Windows`&&t!=null&&t>0&&t<13;return e||n}e.isBrokenVP9Decoder=de;function fe(){return!(T.baseChromeVersion()&&T.isMobile())}e.canPreferH264=fe;function pe(){let e=T.browserName(),t=Number(T.browserVersion());return e===`Safari`?t>=18:e===`Firefox`?t>=134:!0}e.isSimulcastSupportedByBrowser=pe;function me(){return Ct||(Ct=(()=>{let e={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let t in e)if(Object.hasOwn(e,t)&&e[t].test(kt))return t;return`Unknown`})()),Ct}e.os=me;function he(){return wt}e.osVersion=he;function ge(){return St===null&&(St=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Dt)),St}e.isMobile=ge;function _e(){return Wt()[0]}e.browserName=_e;function y(){return Wt()[1]}e.browserVersion=y;function ve(){return Wt()[3]}e.baseChromeVersion=ve;function ye(){return Et||(Et=new(window.AudioContext||window.webkitAudioContext)),Et.resume().catch(()=>{z.warn(`Failed to resume AudioContext`)}),Et}e.getAudioContext=ye;function be(){return Wt()[4]}e.browserSubVersion=be;function xe(){return T.baseChromeVersion()>=105&&!T.isMobile()}e.isAudioShareSupported=xe;function Se(e,t){At[e]||(At[e]=[]),At[e].push(t)}e.addEventListener=Se;function Ce(e,t){if(At[e])if(!t)delete At[e];else{let n=At[e].indexOf(t);n>-1&&At[e].splice(n,1)}}e.removeEventListener=Ce})(T||(T={}));var E=T;function Gt(e,t){return!(e.isAudioEnabled!==t.isAudioEnabled||e.isVideoEnabled!==t.isVideoEnabled||e.isScreenSharingEnabled!==t.isScreenSharingEnabled||e.isFastScreenSharingEnabled!==t.isFastScreenSharingEnabled||e.isAudioSharingEnabled!==t.isAudioSharingEnabled||e.isAnimojiEnabled!==t.isAnimojiEnabled)}function D(e){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},e||{})}var O=function(e){return e.CANCELED=`CANCELED`,e.REJECTED=`REJECTED`,e.REMOVED=`REMOVED`,e.HUNGUP=`HUNGUP`,e.MISSED=`MISSED`,e.BUSY=`BUSY`,e.FAILED=`FAILED`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.KILLED=`KILLED`,e.BANNED=`BANNED`,e.HAS_ACTIVE_CALL=`HAS_ACTIVE_CALL`,e.CALLER_IS_BLOCKED=`CALLER_IS_BLOCKED`,e.NOT_FRIENDS=`NOT_FRIENDS`,e.CALLEE_IS_OFFLINE=`CALLEE_IS_OFFLINE`,e.CALLEE_UNAVAILABLE=`CALLEE_UNAVAILABLE`,e.CALLER_IS_REJECTED=`CALLER_IS_REJECTED`,e.UNKNOWN_ERROR=`UNKNOWN_ERROR`,e.UNSUPPORTED=`UNSUPPORTED`,e.SERVICE_DISABLED=`SERVICE_DISABLED`,e.SERVICE_UNAVAILABLE=`SERVICE_UNAVAILABLE`,e.EXTERNAL_API_ERROR=`EXTERNAL_API_ERROR`,e.SOCKET_CLOSED=`SOCKET_CLOSED`,e.ENDED=`ENDED`,e.KILLED_WITHOUT_DELETE=`KILLED_WITHOUT_DELETE`,e.ANOTHER_DEVICE=`ANOTHER_DEVICE`,e.NOT_FOUND=`NOT_FOUND`,e.VCHAT_DETAILED_ERROR=`VCHAT_DETAILED_ERROR`,e.TIMEOUT=`TIMEOUT`,e.PARTICIPANT_LIMIT_REACHED=`PARTICIPANT_LIMIT_REACHED`,e.FAST_START_ERROR=`FAST_START_ERROR`,e.FAST_JOIN_ERROR=`FAST_JOIN_ERROR`,e.CALL_TIMEOUT=`CALL_TIMEOUT`,e.OBSOLETE_CLIENT=`OBSOLETE_CLIENT`,e}(O||{}),k=class e extends Error{constructor(t,n){super(),h(this,`message`,void 0),h(this,`hangup`,void 0),h(this,`error`,void 0),h(this,`code`,void 0),h(this,`remote`,void 0),h(this,`custom_error`,void 0),h(this,`callError`,void 0),this.name=`HangupReason`,this.code=n&&n.code||0,this.remote=n&&n.remote||!1,this.custom_error=n?.custom_error??null,this.callError=n?.callError??null,Object.values(O).indexOf(t)>-1?this.hangup=t:this.error=t;let r=[];this.error&&r.push(`error`),this.remote&&r.push(`remote`),this.code&&r.push(`code: ${this.code}`),n&&n.message&&r.push(`message: '${n.message}'`),this.message=t+(r.length?` (${r.join(`, `)})`:``),Error.captureStackTrace&&Error.captureStackTrace(this,e)}},Kt=function(e){return e.FpsLimit=`fps-limit`,e}({}),qt=class extends x{constructor(e=z){super(),h(this,`FPS_LIMITS`,[13,20,Math.max(N.videoFrameRate,25)]),h(this,`THRESHOLD`,.8),h(this,`HISTORY_LENGTH`,10),h(this,`_fpsMeterUnsubscribe`,null),h(this,`_fpsHistory`,{cursor:0,arr:[]}),h(this,`_fpsLimitCursor`,this.FPS_LIMITS.length-1),h(this,`_debug`,void 0),this._debug=e}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(e){this._debug.warn(`VideoEffectsFpsLimiter error`,e)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let e=this._fpsHistory.arr.reduce((e,t)=>e+t,0)/this.HISTORY_LENGTH,t=this.FPS_LIMITS[this._fpsLimitCursor];e<t*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),t!==this.fpsLimit&&this._triggerEvent(`fps-limit`,this.fpsLimit)}}_assertsVideoEffect(e){if(!(`addFpsMeterListener`in e))throw Error(`Outdated VideoEffect version`)}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}},Jt=function(e){return e.SOURCE_CHANGED=`SOURCE_CHANGED`,e.SOURCE_READY=`SOURCE_READY`,e.TRACK_REPLACED=`TRACK_REPLACED`,e.SCREEN_STATUS=`SCREEN_STATUS`,e.ANIMOJI_STATUS=`ANIMOJI_STATUS`,e}({}),A=function(e){return e.audio=`audio`,e.video=`video`,e.screen=`screen`,e.audioshare=`audioshare`,e}({}),Yt=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),Xt=class extends x{constructor(e=z,t=null){super(),h(this,`_stream`,null),h(this,`_screenTrack`,null),h(this,`_audioShareTrack`,null),h(this,`_screenShareTrack`,null),h(this,`_sendVideoTrack`,null),h(this,`_cameraVideoTrack`,null),h(this,`_micAudioTrack`,null),h(this,`_audioEffectsTrack`,null),h(this,`_mediaSettings`,D()),h(this,`_lastMediaSettings`,null),h(this,`_videoStatusOnScreenCapturingEnabled`,!1),h(this,`_effect`,null),h(this,`_audioEffectParams`,null),h(this,`_onDeviceChange`,void 0),h(this,`_animojiEnabled`,!1),h(this,`_videoEffectsFpsLimiter`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_cameraTrackSetAt`,0),h(this,`_cameraMuteRecoveredAt`,0),h(this,`videoTrackMuteHandler`,()=>{!this._mediaSettings.isVideoEnabled||this._cameraMuteRecoveredAt>=this._cameraTrackSetAt||E.browserName()!==`Safari`||(this._cameraMuteRecoveredAt=Date.now(),this._logger?.log(w.ERROR,`camera_mute_recover`),this._debug.log(`[MediaSource] Safari camera mute recovery`),this.toggleVideo(!0).then(()=>this._logger?.log(w.ERROR,`camera_mute_recover_success`)).catch(e=>{this._logger?.log(w.ERROR,`camera_mute_recover_fail`),this._debug.warn(`[MediaSource] Camera mute recovery failed`,e)}))}),this._debug=e,this._logger=t,this._initDeviceChangeListener(),N.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),N.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new qt(this._debug),this._videoEffectsFpsLimiter.addEventListener(Kt.FpsLimit,this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener(`mute`,this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&(this._cameraTrackSetAt=Date.now(),this._cameraVideoTrack.addEventListener(`mute`,this.videoTrackMuteHandler)),N.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[C.AUDIO],t=!0){if(this._stream)return;let n=e.includes(C.VIDEO),r=e.includes(C.AUDIO),i=e.includes(C.ANIMOJI),a=E.getBrowserSupportFailure();if(a)throw new k(S.UNSUPPORTED,{callError:{scope:`internal`,code:`environment`,description:a}});try{this._stream=await E.getUserMedia(n,r,t,this._debug,this._logger),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=n&&this._stream.getVideoTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=r&&this._stream.getAudioTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=i&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=i,this._triggerEvent(`SOURCE_READY`)}catch(e){throw new k(e)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(e=>!e.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,n){let r=this.getStream(),i=this.getSendAudioTrack(),a=this.getSendVideoTrack(n);if(!r||!i&&!a&&!t)throw Error(`No local stream found`);i&&!t&&e.addTrack(i,r),a&&!t&&e.addTrack(a,r)}getMediaSettings(){return this._mediaSettings}get mediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case`videoinput`:if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case`audioinput`:if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(S.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Ze(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_initDeviceChangeListener(){!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices||!navigator.mediaDevices.addEventListener||(this._onDeviceChange=async e=>{if(!this._stream)return;let t=E.getSavedMicrophone(),n=E.getSavedCamera(),r=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,i=this._mediaSettings.isVideoEnabled&&n?.groupId!==e.camera?.groupId;try{r&&await this._changeAudioInput(),i&&await this._changeVideoInput()}catch{}},E.addEventListener(`devicechange`,this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&E.removeEventListener(`devicechange`,this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?`stream`:`video`,n=e||await E._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=n.getVideoTracks()[0],!this._stream)Xe(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);this._logger?.log(w.DEVICE_CHANGED,t),this._debug.log(`Video stream changed`),await this._replaceLocalTrack(e),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}}catch(e){throw this._logger?.log(w.ERROR,`change_video`),this._debug.warn(`Camera change failed`,e),e}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await E.getUserAudio(void 0,this._debug,this._logger);if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Xe(t);else{let e=await this._applyAudioEffect();this._logger?.log(w.DEVICE_CHANGED,`audio`),this._debug.log(`Audio stream changed`,e),await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})}}catch(e){throw this._logger?.log(w.ERROR,`change_audio`),this._debug.error(`Microphone change failed`,e),e}}async _changeScreen(e,t,n){try{if(n=n||await E.getScreenMedia(e,t,this._debug,this._logger),!this._stream)Xe(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),this._logger?.log(w.DEVICE_CHANGED,`screen`),this._debug.log(`Screen capturing started`),this._screenTrack=r,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,N.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(r.contentHint=`motion`,this._screenShareTrack=r),n.getAudioTracks().length>0){let e=n.getAudioTracks()[0];e.contentHint=`music`,this._audioShareTrack=e,await this._addLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&this._debug.debug(`Audio share requested but not captured`),this._triggerEvent(`SCREEN_STATUS`,{track:r}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`})}}catch(e){throw this._logger?.log(w.ERROR,`screen`),this._debug.warn(`Screen capturing failed`,e),e}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent(`SCREEN_STATUS`,{track:null}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`}))}async stopAudioShareTrack(){if(this._audioShareTrack){let e=this.getSilentAudioShareTrack();await this._replaceTrack(this._audioShareTrack,e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!N.audioEffects||!this._audioEffectParams)return N.audioEffects?.pause(),this._micAudioTrack;N.audioEffects.isInitialized||await N.audioEffects.init(),N.audioEffects.resume(),N.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),N.audioEffects.setSource(this._micAudioTrack);let e=N.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=E.getSilentMediaTrack();return e.contentHint=`music`,e.stop(),e}getBlackScreenShareTrack(){let e=E.getBlackMediaTrack();return e.contentHint=`motion`,e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let n=this._stream.getTracks().filter(t=>t.kind===e.kind),r=n.find(t=>t.contentHint===e.contentHint)??n.find(e=>e!==this._audioEffectsTrack);r?.id!==e.id&&(r?await this._replaceTrack(r,e,t):await this._addLocalTrack(e,t))}async _replaceTrack(e,t,n){this._stream&&(e!==this._audioEffectsTrack&&e.stop(),this._stream.removeTrack(e),this._stream.addTrack(t),this._triggerEvent(`TRACK_REPLACED`,t,n))}async _addLocalTrack(e,t){this._stream&&(this._stream.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(N.videoEffects),!N.videoEffects)return t;try{return N.videoEffects.setEffect(e,t)}catch(e){return this._debug.warn(`Video effect failed`,e),t}}_stopEffect(){if(N.videoEffects)try{N.videoEffects.stopEffect()}catch(e){this._debug.warn(`Video effect failed`,e)}}destroy(){this._destroyDeviceChangeListener(),E.releaseFirefoxMicrophonePermissionWarmup(),N.videoEffects&&(this._effect=null,N.videoEffects.destroy()),N.audioEffects&&N.audioEffects.destroy(),this._stream&&(Xe(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),E.getAudioContext()?.suspend().catch(e=>this._debug.error(e)),this._videoEffectsFpsLimiter?.destroy()}async stopLocalMedia(){this._mediaSettings.isScreenSharingEnabled&&await this.disableScreenCapturing(),this._stream&&(this._lastMediaSettings={...this._mediaSettings},this._stream.getAudioTracks().length>0&&await this.toggleAudio(!1),this._stream.getVideoTracks().length>0&&await this.toggleVideo(!1),this.cameraVideoTrack=null,this._micAudioTrack=null)}async resumeLocalMedia(e){if(!this._lastMediaSettings)return;let t=[];if((e?e.isAudioEnabled:this._lastMediaSettings.isAudioEnabled)&&(t.push(C.AUDIO),await this.toggleAudio(!0)),await this.request(t),this._lastMediaSettings=null,this._stream)for(let e of this._stream.getTracks())this._triggerEvent(`TRACK_REPLACED`,e)}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return this._disableScreenCapture()}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;this.cameraVideoTrack?.stop();let t;if(e){let e=await E._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);this.cameraVideoTrack=e.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=E.getBlackMediaTrack(N.videoMinWidth,N.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent(`ANIMOJI_STATUS`,!e);return}this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(e,t)=>{await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=t,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})};if(e)try{let e=await E.getUserAudio(void 0,this._debug,this._logger);this._micAudioTrack=e.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(e){throw N.audioEffects?.pause(),t(E.getSilentMediaTrack(),!1),typeof e==`string`?Error(e):e}else N.audioEffects?.pause(),t(E.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent(`ANIMOJI_STATUS`,e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async setResolution({video:e,effect:t}){if(!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw Error(`Local stream not found`);if(!this.cameraVideoTrack)throw Error(`Local video track not found`);let n=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,n)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(e=>!e.contentHint);if(!e)throw Error(`Local audio track not found`);if(e.enabled)return e.applyConstraints({noiseSuppression:N.noiseSuppression})}async videoEffect(e){if(!N.videoEffects)throw Error(`Video Effects library is not set`);if(this._logger?.log(w.DEVICE_CHANGED,`effect_${e?.effect||`none`}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let e=this.cameraVideoTrack.clone(),t=new MediaStream([e]);await this._applyVideoConstraints(e),await this._changeVideoInput(t)}catch(e){this._effect=t;let n=this.cameraVideoTrack.clone(),r=new MediaStream([n]);throw await this._changeVideoInput(r),e}}}async audioEffect(e){if(!N.audioEffects)throw Error(`Audio Effects library is not set`);if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!M.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let e=this._micAudioTrack.clone(),t=new MediaStream([e]);await this._changeAudioInput(t)}catch(e){this._audioEffectParams=t;let n=this._micAudioTrack.clone(),r=new MediaStream([n]);throw await this._changeAudioInput(r),e}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<N.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(e=>{this._debug.warn(`MediaSource handleVideoEffectsLowFps error`,e)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??N.videoFrameRate;return this._effect?Math.min(e,N.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await Qe(e,{width:this._effect?N.videoEffectMaxWidth:N.videoMaxWidth,height:this._effect?N.videoEffectMaxHeight:N.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}},j=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e}(j||{}),Zt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Qt=`L1T2`,$t=[{dimension:320,bitrate:18e4},{dimension:520,bitrate:4e5},{dimension:640,bitrate:5e5},{dimension:960,bitrate:9e5},{dimension:1280,bitrate:12e5},{dimension:1920,bitrate:25e5},{dimension:2560,bitrate:35e5},{dimension:3840,bitrate:5e6}],en={h:1,m:2,l:4};function tn(e,t){return!e||!t?e===t:e.streams.length===t.streams.length?e.streams.every((e,n)=>M.isObjectsEquals(e,t.streams[n])):!1}function nn(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return length>0?t[length-1].bitrate:$t[0].bitrate}function rn(e=Zt.WIDTH,t=Zt.HEIGHT,n=$t){let r=[`h`,`m`,`l`],i=Math.max(e,t),a=1;i>=960?a=3:i>=480&&(a=2);let o={streams:[]},s=nn(i,n)??Zt.BITRATE;for(let i=0;i<a;i++){let a=r[i];o.streams.push({rid:a,width:e,height:t,fps:30,bitrate:s}),e=Math.round(e/2),t=Math.round(t/2),s=nn(Math.max(e,t),n)??Math.round(s/2)}return o}function an(e){return e?en[e]??1:1}var on=typeof Object.fromEntries==`function`?Object.fromEntries:function(e){if(!e||!e[Symbol.iterator])throw Error(`Object.fromEntries() requires a single iterable argument`);let t={};for(let[n,r]of e)t[n]=r;return t};async function sn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var cn=533,ln=`a=fmtp:`,un=`sps-pps-idr-in-keyframe=1`,dn;(function(e){let t=/[\r\n]+/;function n(e,t){let n=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),r,i=[];for(r=0;r<e.length;++r){let a=e[r].match(n);a&&a.length===3&&a[2]===t&&i.push(a[1])}return i}function r(e,t,n){let r=e.split(` `),i=r.slice(0,3),a;for(a=3;a<r.length;a++)n.includes(r[a])&&i.push(r[a]);for(a=3;a<r.length;a++)!n.includes(r[a])&&!t.includes(r[a])&&i.push(r[a]);return i.join(` `)}function i(e,t,n,i){let a,o=`m=`+t;for(a=0;a<e.length;++a)e[a].startsWith(o)&&(e[a]=r(e[a],n,i))}function a(e,t){let n=RegExp(`a=fmtp:(\\d+)`);for(let r=0;r<e.length;++r){let i=e[r].match(n);if(i&&i.length===2&&t.includes(i[1])){let t=e[r].trim()===ln+i[1]?` `:`;`;e[r]+=t+un}}}function o(e,t,r=`video`){let a=n(e,t);if(!a.length)return;let o=a.slice(0),s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`),c;for(c=0;c<e.length;++c){let t=e[c].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}let l=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`);for(c=e.length;c--;){let t=e[c].match(l);t&&t.length===3&&o.includes(t[2])&&e.splice(c,1)}i(e,r,o,[])}function s(e,t,n,r){let i=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),a,o=[];for(a=t;a<n;++a){let t=e[a].match(i);t&&t.length===3&&t[2]===r&&o.push(t[1])}if(!o.length)return o;let s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`);for(a=t;a<n;++a){let t=e[a].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}return o}function c(e,t,n,i){let a=s(e,t,n,i);if(!a.length)return n+1;let o=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`),c=0,l=n;for(;l>=t;){let t=e[l].match(o);t&&t.length===3&&a.includes(t[2])&&(e.splice(l,1),c++),l--}return e[t]=r(e[t],a,[]),n-c+1}function l(e,t,n,r){let i=-1,a=-1,o=!1;for(let s=0;s<e.length;++s)if(i>=0&&e[s].startsWith(`m=`)&&(a=s-1,o&&(s=c(e,i,a,t)),i=-1,a=-1,o=!1),e[s].startsWith(`m=video`)&&(i=s),i>=0){let t=n===`remote`&&r===`encoder`||n===`local`&&r===`decoder`?`recvonly`:`sendonly`;(e[s].startsWith(`a=${t}`)||e[s].startsWith(`a=sendrecv`))&&(o=!0)}a=e.length-1,i>=0&&o&&c(e,i,a,t)}function u(e,t){let r=n(e,`H264`);t&&i(e,`video`,[],r),a(e,r)}function d(e){i(e,`video`,[],n(e,`VP9`))}function f(e){[`G722`,`PCMU`,`PCMA`,`CN`,`telephone-event`].forEach(t=>{o(e,t,`audio`)})}function p(e,r,a,o,s=!1){let c=e.split(t);if(f(c),!r&&!a&&!o&&!s)return c.join(`\r
8
- `);function p(e){let t=[`a=rtcp-fb:111 nack`,`a=rtcp-fb:111 nack pli`],n=e.findIndex(e=>e.startsWith(`a=rtcp-fb:111`));return~n&&(e[n]=e[n]+`\r
9
- `+t.join(`\r
10
- `)),e}function m(e){let t=n(e,`red`);t.length>0&&i(e,`audio`,[],t)}return a?l(c,`H264`,`local`,`decoder`):u(c,r),o&&d(c),m(c),s&&p(c),c.join(`\r
11
- `)}e.patchLocalSDP=p;function m(e,n,r,i,a,s){let c=e.split(t);return r?o(c,`H264`):n&&u(c,n),a&&s?o(c,`VP9`):a?l(c,`VP9`,`remote`,`encoder`):s?l(c,`VP9`,`remote`,`decoder`):i&&d(c),f(c),c.join(`\r
12
- `)}e.patchRemoteSDP=m;function ee(e){return e?`${e.type||`WEB_SOCKET`}_${e.id}`:`_`}e.getPeerIdString=ee;function te(e,t){return e&&e.id===t.id&&(e.type||`WEB_SOCKET`)===(t.type||`WEB_SOCKET`)}e.comparePeerId=te;async function ne(e){let t={local:null,remote:null};if(!e||!e.getStats)return t;try{let n=await e.getStats(null),r=null;if(n.forEach(e=>{e.type===`transport`&&e.selectedCandidatePairId?r=n.get(e.selectedCandidatePairId):e.type===`candidate-pair`&&e.state===`succeeded`&&!r&&(!Object.hasOwn(e,`selected`)||e.selected)&&(r=e)}),r?.localCandidateId){let e=n.get(r.localCandidateId);e&&(t.local={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}if(r?.remoteCandidateId){let e=n.get(r.remoteCandidateId);e&&(t.remote={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}return t}catch{return t}}e.getPeerConnectionHostInfo=ne;let h=/^-?[0-9]+$/,g=/^([gu])(-?[0-9]+)$/;function re(e,t=j.USER){let n=String(e);return g.test(n)?(z.warn(`Already composite id [${e}] type supplied [${t}]`),n):t===j.GROUP?`g`+n:t===j.USER?`u`+n:(z.warn(`Unknown type [${t}] for id [${e}]`),n.match(h)?`u`+n:n)}e.composeUserId=re;function ie(e,t,n=0){return ae(re(e,t),n)}e.composeParticipantId=ie;function ae(e,t){return t?e+`:d`+t:e}e.compose=ae;function oe(e){return ie(e.id,e.idType||j.USER,e.deviceIdx)}e.composeId=oe;function se(e){if(e.decorativeUserId)return ie(e.decorativeUserId,e.idType||j.USER,e.deviceIdx)}e.composeDecorativeId=se;function _(e){return e.participant?oe(e.participant):ie(e.participantId,e.participantType||j.USER,e.deviceIdx)}e.composeMessageId=_;function v(e){return typeof e==`string`?ce(le(e).compositeUserId).id:e}e.extractOkId=v;function ce(e){let t=String(e),n=t.match(g);return n?{id:Number(n[2]),type:n[1]===`g`?j.GROUP:j.USER}:(z.warn(`Unsupported compositeId [${e}]`),{id:Number(t),type:j.USER})}e.decomposeId=ce;function le(e){let t=e.split(`:d`);return{compositeUserId:t[0],deviceIdx:t.length>1?parseInt(t[1],10):0}}e.decomposeParticipantId=le;function ue(){let e=window.crypto?.randomUUID?.();if(e)return e;let t=`0123456789abcdefghijklmnopqrstuvwxyz`.split(``),n=Array(36),r=0,i,a;for(a=0;a<36;a++)a===8||a===13||a===18||a===23?n[a]=`-`:a===14?n[a]=`4`:(r<=2&&(r=33554432+Math.random()*16777216|0),i=r&15,r>>=4,n[a]=t[a===19?i&3|8:i]);return n.join(``)}e.uuid=ue;function de(e,t){let n;function r(...r){let i=this;n&&window.clearTimeout(n),n=window.setTimeout(()=>{e.apply(i,r)},t)}return r}e.debounce=de;function fe(e){if(!window.BigInt)return null;let t=``,n=e.split(`
13
- `);for(let e of n)if(e.startsWith(`a=fingerprint`)){let n=e.split(` `);if(n.length===2){t=n[1];break}}if(!t)return BigInt(-1);let r=t.split(`:`),i=BigInt(0);for(let e=Math.min(7,r.length-1);e>=0;e--){let t=BigInt(parseInt(r[e],16));i<<=BigInt(8),i|=t}return BigInt.asIntN(64,i)}e.sdpFingerprint=fe;async function pe(e,{signal:t}={}){return new Promise((n,r)=>{if(t?.aborted)return r(t.reason);let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason)};t?.addEventListener(`abort`,a,{once:!0})})}e.delay=pe;function me(e,t,n,r=z){let i=[];return e.getSenders().forEach(e=>he(t,e,e.track,n,i,r)),i}e.applySettings=me;function he(e,t,n,r,i,a=z){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!e||!n||n.kind!==A.video)return;let o=n.getSettings();if(!o)return;let s=e.maxBitrateK?e.maxBitrateK*1024:null,c=o.width,l=o.height,u=c&&l&&e.maxDimension?Math.max(1,Math.max(c,l)/e.maxDimension):null,d=e.maxFramerate||null;if(c&&l&&e.maxDimension&&e.maxDimension>Math.max(c,l)){let e=Math.round(c*l/256),t=(Math.round(e*cn/1e4)+1)*1e4;s=s===null?t:Math.min(t,s)}let f=e.degradationPreference||`balanced`,p=r[n.id];if(p&&p.bitrate===s&&p.scaleResolutionDownBy===u&&p.maxFramerate===d&&p.degradationPreference===f){i[n.id]=p;return}i[n.id]={bitrate:s,scaleResolutionDownBy:u,maxFramerate:d,degradationPreference:f};let m=t.getParameters();if(m.encodings||(m.encodings=[{}]),m.encodings.length>1&&c&&l&&e.maxDimension){let t=Math.round(e.maxDimension*1.35),n=Math.max(c,l),r=rn(c,l,e?.bitrates?.generic),i=r.streams.length;a.log(`applyVideoTrackSettings: maxDim=${e.maxDimension} targetDim=${t} track=${c}x${l} sim=${JSON.stringify(r)}`),m.encodings.forEach((e,a)=>{e.scaleResolutionDownBy=an(e.rid);let o=Math.round(n/e.scaleResolutionDownBy);a<i-1?e.active=o<t:a>=i?e.active=!1:e.active=!0,a<i?e.maxBitrate=r.streams[a].bitrate:e.maxBitrate=0,e.scalabilityMode=Qt})}else m.encodings.forEach(t=>{e?.scalabilityMode&&(t.scalabilityMode=e.scalabilityMode),s?t.maxBitrate=s:delete t.maxBitrate,u?t.scaleResolutionDownBy=u:delete t.scaleResolutionDownBy,d?t.maxFramerate=d:delete t.maxFramerate});if(m.degradationPreference=f,m.encodings.length>0){t.setParameters?.(m).catch(e=>{a.error(`Failed to set sender parameters`,m,e)});let e=t.getParameters();a.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(e.encodings)}`)}}e.applyVideoTrackSettings=he;function ge(e,t){Array.isArray(t)||(t=[t]);for(let n of t)if(e.includes(n))return!0;return!1}e.includesOneOf=ge;function _e(e){return Object.entries(e.participantState?.state||{}).reduce((t,[n,r])=>(e.participantState&&(t[n]={ts:e.participantState.stateUpdateTs[n],state:r}),t),{})}e.mapParticipantState=_e;function y(e){let t=e.map(e=>({uid:e.externalId,mediaSettings:e.mediaSettings,status:e.connectionStatus.lastEffective,muteStates:e.muteStates,unmuteOptions:e.unmuteOptions,participantState:e.participantState,markers:e.markers,movieShareInfos:e.movieShareInfos,roles:e.roles}));return N.filterObservers?t.filter(e=>!e.uid.observer):t}e.mapSharedParticipants=y;function ve(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let i of n)if(!Object.hasOwn(r,i)||e[i].state!==t[i].state||e[i].ts!==t[i].ts)return!1;return!0}e.isEqualParticipantState=ve;function ye(e,t,n=!1){let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let i of r){if(!Object.hasOwn(t,i))return!1;let r=e[i],a=t[i];if(n&&Te(r)&&Te(a))return ye(r,a,n);if(r!==a)return!1}return!0}e.isObjectsEquals=ye;function be(e,t){if(e.length!==t.length)return!1;for(let n of e)if(t.indexOf(n)<0)return!1;return!0}e.isArraysEquals=be;function xe(e){return!Object.keys(e).length}e.isEmptyObject=xe;function Se(e,t){if(!e&&!t)return 0;if(!e||!t)return e?-1:1;return r(t.rank,e.rank)||r(e.ts,t.ts)||n(e,t);function n(e,t){let n={[j.USER]:0,[j.GROUP]:1},{compositeUserId:i,deviceIdx:a}=le(e.id),{compositeUserId:o,deviceIdx:s}=le(t.id),{id:c,type:l}=ce(i),{id:u,type:d}=ce(o);return r(n[l],n[d])||r(c,u)||r(a,s)}function r(e,t){return e<t?-1:e===t?0:1}}e.participantMarkerCompare=Se;function Ce(e,t){return on(Object.entries(e).filter(([,e])=>Array.isArray(t)?!t.includes(e):e!==t))}e.objectFilterOutValues=Ce;function we(e,t,n){let r=n;for(let n in e)Object.hasOwn(e,n)&&(r=t(r,e[n],n));return r}e.objectReduce=we,e.setImmediate=(()=>{let e=1,t={},n=null;return typeof MessageChannel<`u`&&(n=new MessageChannel,n.port1.onmessage=e=>{let n=e.data;t[n]&&(t[n](),delete t[n])}),function(r){if(n&&document.visibilityState===`hidden`){let i=e;return e=e>=2**53-1?1:e+1,t[i]=r,n.port2.postMessage(i),()=>{t[i]&&delete t[i]}}let i=setTimeout(r,0);return()=>clearTimeout(i)}})();function Te(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}e.isObject=Te;function Ee(e,n,r,i){function a(e,t){let n=0,r=e.length,i=!1;for(let a=0;a<e.length;a++)if(!i&&e[a].startsWith(`m=video`)&&(n=a),e[a].startsWith(`a=mid:`+t)&&(i=!0),i&&e[a].startsWith(`m=`)){r=a;break}return{start:n,end:r}}function o(e,t,n,r,i,a,o){let s=`a=rid:`+r+` send`;for(let r=t;r<n;r++)e[r]===s&&(e[r]=s+` max-width=`+a+`;max-height=`+o+`;max-br=`+i)}let s=n?.sender;if(s&&s.track&&n.mid){let c=e.split(t),{start:l,end:u}=a(c,n.mid),d=s.getParameters();if(d.encodings)return d.encodings.forEach(e=>{let t=e.rid,n=e.maxBitrate,a=e.scaleResolutionDownBy;r&&i&&a&&o(c,l,u,t,n,``+Math.round(r/a),``+Math.round(i/a))}),c.join(`\r
14
- `)}return e}e.patchSimulcastAnswerSdp=Ee})(dn||(dn={}));var M=dn,fn=`__CALLS_SDK_DEVTOOLS_`,pn=class{set(e,t){try{this.getStorage().setItem(fn+e,JSON.stringify(t))}catch(t){z.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(fn+e);return t===null?null:JSON.parse(t)}catch(t){return z.warn(`DevTools: Failed to read option`,e,t),null}}remove(e){try{this.getStorage().removeItem(fn+e)}catch(t){z.warn(`DevTools: Failed to remove option`,e,t)}}clear(){try{let e=this.getStorage(),t=Object.keys(e);for(let n of t)n.startsWith(fn)&&e.removeItem(n)}catch(e){z.warn(`DevTools: Failed to clear options`,e)}}getAll(){try{let e=this.getStorage(),t=Object.keys(e),n={};for(let r of t)if(r.startsWith(fn)){let t=r.substring(21),i=e.getItem(r);if(i!==null)try{n[t]=JSON.parse(i)}catch{}}return n}catch(e){return z.warn(`DevTools: Failed to get all options`,e),{}}}getStorage(){return window.localStorage}},mn=class{constructor(e){h(this,`storage`,void 0),this.storage=e}set(e,t){this.storage.set(e,t),console.debug(`DevTools: ${String(e)} override set to ${t}`)}get(e){return this.storage.get(e)}clear(e){this.storage.remove(e),console.debug(`DevTools: ${String(e)} override cleared`)}clearAll(){this.storage.clear(),console.debug(`DevTools: All overrides cleared`)}getAll(){return this.storage.getAll()}applyOverrides(e){let t=this.getAll(),n={...e},r=Object.keys(t);if(r.length>0){console.debug(`DevTools: Current overrides:`,t);for(let e of r)t[e]!==void 0&&(n[e]=t[e]);console.debug(`DevTools: Overrides applied`)}return n}},hn=class e{static getInstance(){return e.instance||(e.instance=new e),e.instance}constructor(){h(this,`params`,void 0),h(this,`storage`,void 0),this.storage=new pn,this.params=new mn(this.storage)}};h(hn,`instance`,null);var gn=hn.getInstance(),N=class e{static set(t){Object.hasOwn(t,`voiceParams`)&&(Object.assign(e._params.voiceParams,t.voiceParams),delete t.voiceParams),Object.hasOwn(t,`specListenerParams`)&&(Object.assign(e._params.specListenerParams,t.specListenerParams),delete t.specListenerParams),Object.hasOwn(t,`apiAuth`)&&(b.accessToken=t.apiAuth.accessToken,b.sessionKey=t.apiAuth.sessionKey,b.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=gn.params.applyOverrides(t);Object.assign(e._params,M.objectFilterOutValues(n,void 0))}static getScreenFrameRate(t){return t?e._params.fastScreenShareFrameRate:e._params.screenFrameRate}static get(t){return e._params[t]}static get appName(){return`ok.calls.sdk.js`}static get appVersion(){return 1.1}static get sdkVersion(){return`2.8.12-dev.8a7f9c02.0`}static get debug(){return e._params.debug}static get protocolVersion(){return e._params.joinFromMultipleDevices?6:5}static get platform(){return e._params.platform}static set platform(t){e._params.platform=t}static get clientStatsPlatform(){return e._params.clientStatsPlatform}static set clientStatsPlatform(t){e._params.clientStatsPlatform=t}static get clientType(){return e._params.clientType}static set clientType(t){e._params.clientType=t}static get externalUserType(){return e._params.externalUserType}static set externalUserType(t){e._params.externalUserType=t}static get device(){return e._params.device}static get apiKey(){return e._params.apiKey}static get apiEnv(){return e._params.apiEnv}static get apiBaseUrl(){return e._params.apiBaseUrl}static set apiBaseUrl(t){e._params.apiBaseUrl=t}static apiEndpoint(t){switch(t??e.apiEnv){case`AUTO`:case`PROD`:return`https://api.mycdn.me`;case`CALLS`:return`https://calls.okcdn.ru`;case`PROD_OK`:return`https://api.ok.ru`;case`TEST`:return`https://apitest.ok.ru/api`;case`VIDEOTEST`:return`https://videotestapi.ok.ru/api`;case`CALLSTEST`:return`https://calls-test.okcdn.ru/api`;case`CALLS_BETA`:return`https://api-beta.calls-test.oneme.ru/api`;case`CALLS_BENDER`:return`https://api-bender.calls-test.oneme.ru/api`;case`CALLS_MAMES`:return`https://calls-mames.okcdn.ru/api`;case`CALLS_MARS`:return`https://api-mars.calls-test.oneme.ru/api`;default:return e._params.apiEnv}}static get apiTimeout(){return e._params.apiTimeout}static get apiMaxAttempt(){return e._params.apiMaxAttempt}static get authToken(){return e._params.authToken}static set authToken(t){e._params.authToken=t}static get anonymToken(){return e._params.anonymToken}static set anonymToken(t){e._params.anonymToken=t}static get domain(){return e._params.domain}static get externalDomain(){return e._params.externalDomain}static get iceServers(){return e._params.iceServers}static set iceServers(t){e._params.iceServers=t}static get wssBase(){return e._params.wssBase}static set wssBase(t){e._params.wssBase=t}static get wtsBase(){return e._params.wtsBase}static set wtsBase(t){e._params.wtsBase=t}static get wssToken(){return e._params.wssToken}static set wssToken(t){e._params.wssToken=t}static get signalingReconnectDelay(){return e._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return e._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return e._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return e._params.waitConnectionDelay}static get waitResponseDelay(){return e._params.waitResponseDelay}static get waitMessageDelay(){return e._params.waitMessageDelay}static get waitAnotherTabDelay(){return e._params.waitAnotherTabDelay}static get calleeUnavailableWaitingTime(){return e._params.calleeUnavailableWaitingTime}static get debugLog(){return e._params.debugLog}static get forceRelayPolicy(){return e._params.forceRelayPolicy}static set forceRelayPolicy(t){e._params.forceRelayPolicy=t}static get videoMinWidth(){return e._params.videoMinWidth}static get videoMaxWidth(){return e._params.videoMaxWidth}static set videoMaxWidth(t){e._params.videoMaxWidth=t}static get videoMinHeight(){return e._params.videoMinHeight}static get videoMaxHeight(){return e._params.videoMaxHeight}static set videoMaxHeight(t){e._params.videoMaxHeight=t}static get videoAspectRatio(){return e._params.videoAspectRatio}static get videoFrameRate(){return e._params.videoFrameRate}static get videoFacingMode(){return e._params.videoFacingMode||(E.isMobile()?Mt.USER:null)}static set videoFacingMode(t){e._params.videoFacingMode=t}static get displaySurface(){return e._params.displaySurface}static get audioEffects(){return e._params.audioEffects}static set audioEffects(t){e._params.audioEffects=t,e._params.audioEffects?.setLogger((e,...t)=>z.send(e,...t))}static get videoEffects(){return e._params.videoEffects}static set videoEffects(t){e._params.videoEffects=t,e._params.videoEffects?.setLogger((e,...t)=>z.send(e,...t))}static get videoEffectMaxWidth(){return e._params.videoEffectMaxWidth}static set videoEffectMaxWidth(t){e._params.videoEffectMaxWidth=t}static get videoEffectMaxHeight(){return e._params.videoEffectMaxHeight}static set videoEffectMaxHeight(t){e._params.videoEffectMaxHeight=t}static get vmoji(){return e._params.vmoji?.isBrowserSupported()?e._params.vmoji:null}static set vmoji(t){e._params.vmoji=t}static get vmojiOptions(){return e._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(t){e._params.vmojiOptions=t}static get voiceParams(){return e._params.voiceParams}static get specListenerParams(){return e._params.specListenerParams}static get iceRestartWaitTime(){return e._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return e._params.transportConnectionWaitTime}static get statisticsInterval(){return e._params.statisticsInterval}static set statisticsInterval(t){e._params.statisticsInterval=t}static get networkStatisticsInterval(){return e._params.networkStatisticsInterval}static get perfStatReportEnabled(){return e._params.perfStatReportEnabled}static get callStatReportEnabled(){return e._params.callStatReportEnabled}static get enableLogPerfStatReport(){return e._params.enableLogPerfStatReport}static get asrDataChannel(){return e._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return e._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return e._params.screenShareWebmBuilder}static get noiseSuppression(){return e._params.noiseSuppression}static get preferH264(){return e._params.preferH264}static get preferVP9(){return e._params.preferVP9}static get audioNack(){return e._params.audioNack}static get movieShare(){return e._params.movieShare&&e.videoTracksCount>0}static get videoTracksCount(){return Number(e._params.videoTracksCount)}static get requestDisplayLayoutThrottleMs(){return Number(e._params.requestDisplayLayoutThrottleMs)}static get breakVideoPayloadTypes(){return e._params.breakVideoPayloadTypes}static get useCallsToContacts(){return e._params.useCallsToContacts}static get useParticipantListChunk(){return e._params.useParticipantListChunk&&e.videoTracksCount>0}static get useRooms(){return e._params.useRooms}static get useChatRooms(){return e._params.useChatRooms}static get addParticipant(){return e._params.addParticipant}static get waitForAdminInGroupCalls(){return e._params.waitForAdminInGroupCalls}static get hold(){return e._params.hold}static get maxParallelCalls(){return e._params.maxParallelCalls}static get participantListChunkInitIndex(){return e._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return e._params.participantListChunkInitCount??null}static get filterObservers(){return e._params.filterObservers}static get muteMode(){return e._params.muteMode}static get preserveAudioTracks(){return e._params.preserveAudioTracks}static get audioShare(){return E.isAudioShareSupported()&&e._params.audioShare}static get audioShareWindowInclude(){return e._params.audioShareWindowInclude}static get audioShareSystemInclude(){return e._params.audioShareSystemInclude}static get fastScreenShare(){return e._params.fastScreenShare}static get screenShareCongestionControl(){return e._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return e._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return e._params.fastScreenShareWidth}static get fastScreenShareHeight(){return e._params.fastScreenShareHeight}static get consumerFastScreenShare(){return e._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return e._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return e._params.videoSuspend}static get enumerateDevicesDelay(){return e._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return e._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return e._params.enableVideoEffectsFpsDegradation}static get simulcast(){return E.isSimulcastSupportedByBrowser()&&e._params.simulcast}static get webtransport(){return e._params.webtransport}static get waitForRecordResponse(){return e._params.waitForRecordResponse}static get transparentAudio(){return e._params.transparentAudio}static get enableSessionStateUpdates(){return e._params.enableSessionStateUpdates}static get safariAudioElement(){return e._params.safariAudioElement}static get forwardEmptyIceCandidate(){return e._params.forwardEmptyIceCandidate}static toJSON(){return{apiKey:e._params.apiKey,apiEnv:e._params.apiEnv,audioShare:e._params.audioShare,audioShareWindowInclude:e._params.audioShareWindowInclude,audioShareSystemInclude:e._params.audioShareSystemInclude,useCallsToContacts:e._params.useCallsToContacts,useParticipantListChunk:e._params.useParticipantListChunk,useRooms:e._params.useRooms,useChatRooms:e._params.useChatRooms,addParticipant:e._params.addParticipant,fastScreenShare:e._params.fastScreenShare,participantListChunkInitCount:e._params.participantListChunkInitCount,screenShareCongestionControl:e._params.screenShareCongestionControl,screenShareCongestionControlThreshold:e._params.screenShareCongestionControlThreshold,videoTracksCount:e._params.videoTracksCount,requestDisplayLayoutThrottleMs:e._params.requestDisplayLayoutThrottleMs,asrDataChannel:e._params.asrDataChannel,videoMaxHeight:e._params.videoMaxHeight,videoMaxWidth:e._params.videoMaxWidth,videoEffectMaxHeight:e._params.videoEffectMaxHeight,videoEffectMaxWidth:e._params.videoEffectMaxWidth,videoSuspend:e._params.videoSuspend,debugLog:e._params.debugLog,callStatReportEnabled:e._params.callStatReportEnabled,joinFromMultipleDevices:e._params.joinFromMultipleDevices,movieShare:e._params.movieShare,clientType:e._params.clientType,clientStatsPlatform:e._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:e._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:e._params.switchVideoAtBadNetwork,simulcast:e._params.simulcast,webtransport:e._params.webtransport,waitForRecordResponse:e._params.waitForRecordResponse,transparentAudio:e._params.transparentAudio,enableSessionStateUpdates:e._params.enableSessionStateUpdates,safariAudioElement:e._params.safariAudioElement,forwardEmptyIceCandidate:e._params.forwardEmptyIceCandidate}}};h(N,`_params`,{platform:`WEB`,clientStatsPlatform:``,clientType:`PORTAL`,externalUserType:``,device:`browser`,apiKey:``,authToken:``,anonymToken:``,apiEnv:`AUTO`,apiBaseUrl:null,domain:``,externalDomain:``,iceServers:[],wssBase:``,wtsBase:``,wssToken:``,signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,apiTimeout:5e3,apiMaxAttempt:10,forceRelayPolicy:!1,videoMinWidth:428,videoMinHeight:240,videoMaxWidth:1280,videoMaxHeight:720,videoAspectRatio:16/9,videoFrameRate:25,screenFrameRate:15,videoFacingMode:null,displaySurface:`monitor`,audioEffects:null,videoEffects:null,videoEffectMaxWidth:640,videoEffectMaxHeight:360,vmoji:null,vmojiOptions:null,iceRestartWaitTime:2e4,transportConnectionWaitTime:5e3,statisticsInterval:5e3,networkStatisticsInterval:2e4,perfStatReportEnabled:!0,callStatReportEnabled:!1,enableLogPerfStatReport:!1,voiceParams:{smoothing:.8,minFreq:200,maxFreq:5e3,interval:500,threshold:.35,speakerLevelMultiplier:1.8},specListenerParams:{connectionTimeout:1e4,volumeTimeout:1e4},asrDataChannel:!1,consumerScreenDataChannelPacketSize:64*1024,screenShareWebmBuilder:!1,noiseSuppression:!0,preferH264:!1,preferVP9:!1,audioNack:!0,videoTracksCount:30,requestDisplayLayoutThrottleMs:750,movieShare:!1,useCallsToContacts:!1,useParticipantListChunk:!1,useRooms:!1,useChatRooms:!1,addParticipant:!1,waitForAdminInGroupCalls:!1,hold:!1,maxParallelCalls:2,participantListChunkInitIndex:0,participantListChunkInitCount:null,breakVideoPayloadTypes:!1,joinFromMultipleDevices:!1,filterObservers:!1,muteMode:!1,preserveAudioTracks:!1,audioShare:!1,audioShareWindowInclude:!1,audioShareSystemInclude:!1,fastScreenShare:!1,screenShareCongestionControl:!1,screenShareCongestionControlThreshold:2100,consumerFastScreenShare:!1,consumerFastScreenShareQualityOnDemand:!1,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,waitForRecordResponse:!1,transparentAudio:!1,enableSessionStateUpdates:!1,safariAudioElement:!1,forwardEmptyIceCandidate:!1});var P=function(e){return e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.WAITING=`WAITING`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`,e.RECONNECT=`RECONNECT`,e.ERROR=`ERROR`,e.HANGUP=`HANGUP`,e.PERMISSIONS=`PERMISSIONS`,e.ONHOLD=`ONHOLD`,e}({});function F(e,...t){let n=N.get(e);typeof n==`function`&&setTimeout(n,0,...t)}function I(e,t,...n){if(N.filterObservers){if(Array.isArray(t)){if(t=t.filter(e=>!e.observer),!t.length)return}else if(t.observer)return}F(e,t,...n)}function L(e){return Object.assign({},e)}function _n(e){return e.slice()}var vn;(function(e){function t(e,t,n){F(`onLocalStream`,e,L(t),n)}e.onLocalStream=t;function n(e,t,n){F(`onScreenStream`,e,L(t),n)}e.onScreenStream=n;function r(e,t,n){F(`onVmojiStream`,e,L(t),n)}e.onVmojiStream=r;function i(e,t){F(`onVmojiError`,e,t)}e.onVmojiError=i;function a(e,t,n){F(`onLocalStreamUpdate`,L(e),t,n)}e.onLocalStreamUpdate=a;function o(e,t){z.debug(`Local status:`,e),F(`onLocalStatus`,e,t)}e.onLocalStatus=o;function s(e,t,n){I(`onRemoteStream`,e,t,n)}e.onRemoteStream=s;function c(e,t,n){I(`onRemoteLive`,e,t,n)}e.onRemoteLive=c;function l(e,t,n){I(`onLocalLive`,e,t,n)}e.onLocalLive=l;function u(e,t,n){I(`onRemoteLiveUpdate`,e,t,n)}e.onRemoteLiveUpdate=u;function d(e,t,n){I(`onLocalLiveUpdate`,e,t,n)}e.onLocalLiveUpdate=d;function f(e,t,n){I(`onRemoteScreenStream`,e,t,n)}e.onRemoteScreenStream=f;function p(e,t,n){I(`onRemoteVmojiStream`,e,t,n)}e.onRemoteVmojiStream=p;function m(e,t,n,r){I(`onRemoteStreamSuspended`,e,t,n,r)}e.onRemoteStreamSuspended=m;function ee(e,t,n,r,i,a){I(`onConversation`,e,L(t),L(n),r,i,a)}e.onConversation=ee;function te(e,t){e&&F(`onConversationParticipantListChunk`,e,t)}e.onConversationParticipantListChunk=te;function ne(e,t,n,r){I(`onRemoteMediaSettings`,e,L(t),n,r)}e.onRemoteMediaSettings=ne;function h(e,t,n){I(`onLocalMediaSettings`,e,L(t),n)}e.onLocalMediaSettings=h;function g(e,t,n,r){I(`onRemoteSharedMovieInfo`,e,L(t),n,r)}e.onRemoteSharedMovieInfo=g;function re(e,t,n,r){I(`onRemoteSharedMovieStoppedInfo`,e,L(t),n,r)}e.onRemoteSharedMovieStoppedInfo=re;function ie(e,t,n,r){I(`onLocalSharedMovieInfo`,e,L(t),n,r)}e.onLocalSharedMovieInfo=ie;function ae(e,t,n,r){I(`onLocalSharedMovieStoppedInfo`,e,L(t),n,r)}e.onLocalSharedMovieStoppedInfo=ae;function oe(e,t,n,r){I(`onRemoteSharedUrl`,e,t,n,r)}e.onRemoteSharedUrl=oe;function se(e,t,n){I(`onParticipantAdded`,e,t,n)}e.onParticipantAdded=se;function _(e,t,n){I(`onParticipantJoined`,e,t,n)}e.onParticipantJoined=_;function v(e,t=!1,n){F(`onLocalParticipantState`,L(e),t,n)}e.onLocalParticipantState=v;function ce(e,t,n,r){I(`onRemoteParticipantState`,e,L(t),n,r)}e.onRemoteParticipantState=ce;function le(e,t,n){F(`onRemoteParticipantsState`,e,t,n)}e.onRemoteParticipantsState=le;function ue(e,t,n=null,r){z.debug(`Remote status:`,t,e),I(`onRemoteStatus`,e,t,n,r)}e.onRemoteStatus=ue;function de(){F(`onPermissionsRequested`)}e.onPermissionsRequested=de;function fe(e,t){F(`onPermissionsError`,e,t)}e.onPermissionsError=fe;function pe(e,t,n){I(`onRemoteRemoved`,e,t,n)}e.onRemoteRemoved=pe;function me(e,t,n,r){F(`onCallState`,e,t,L(n),r)}e.onCallState=me;function he(e,t,n){F(`onDeviceSwitched`,e,t,n)}e.onDeviceSwitched=he;function ge(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null,u){let d=c?_n(c):void 0;F(`onMuteStates`,L(e),_n(t),_n(n),r,i,a,o,s,d,l,u)}e.onMuteStates=ge;function _e(e,t,n=!1,r){I(`onRolesChanged`,e,_n(t),n,r)}e.onRolesChanged=_e;function y(e,t=!1,n){F(`onLocalRolesChanged`,_n(e),t,n)}e.onLocalRolesChanged=y;function ve(e,t,n,r,i){I(`onPinnedParticipant`,e,t,n,r,i)}e.onPinnedParticipant=ve;function ye(e,t,n){F(`onLocalPin`,e,t,n)}e.onLocalPin=ye;function be(e,t){F(`onOptionsChanged`,_n(e),t)}e.onOptionsChanged=be;function xe(e){F(`onCallAccepted`,e)}e.onCallAccepted=xe;function Se(e){F(`onCallActive`,e)}e.onCallActive=Se;function Ce(e,t,n){I(`onAcceptedCall`,e,t,n)}e.onAcceptedCall=Ce;function we(e){F(`onRateNeeded`,e)}e.onRateNeeded=we;function Te(e,t){I(`onSpeakerChanged`,e,t)}e.onSpeakerChanged=Te;function Ee(e,t){F(`onVolumesDetected`,_n(e),t)}e.onVolumesDetected=Ee;function De(e,t){F(`onLocalVolume`,e,t)}e.onLocalVolume=De;function Oe(e,t,n){F(`onJoinStatus`,e,t,n)}e.onJoinStatus=Oe;function ke(e,t){F(`onHangup`,e,t)}e.onHangup=ke;function Ae(e){F(`onMultipartyChatCreated`,L(e))}e.onMultipartyChatCreated=Ae;function je(){F(`onDeviceChange`)}e.onDeviceChange=je;function Me(e){F(`onFingerprintChange`,e)}e.onFingerprintChange=Me;function Ne(){F(`onTokenExpired`)}e.onTokenExpired=Ne;function Pe(e,t,n=!1,r){F(`onChatMessage`,e,t,n,r)}e.onChatMessage=Pe;function Fe(e,t,n=!1,r){F(`onCustomData`,e,t,n,r)}e.onCustomData=Fe;function Ie(e,t,n,r,i,a,o=null,s){F(`onRecordStarted`,e,t,n,r,i,a,o,s)}e.onRecordStarted=Ie;function Le(e=null,t,n){F(`onRecordStopped`,e,t,n)}e.onRecordStopped=Le;function Re(e,t){F(`onLocalNetworkStatusChanged`,e,t)}e.onLocalNetworkStatusChanged=Re;function ze(e,t){F(`onNetworkStatusChanged`,e,t)}e.onNetworkStatusChanged=ze;function Be(e,...t){F(`onDebugMessage`,e,...t)}e.onDebugMessage=Be;function Ve(e,t,...n){F(`onDebugMessageWithContext`,e,t,...n)}e.onDebugMessageWithContext=Ve;function He(e,t){F(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=He;function Ue(){F(`onAutoplayError`)}e.onAutoplayError=Ue;function We(e,t,n,r,i,a){F(`onChatRoomUpdated`,e,t,n,r,i,a)}e.onChatRoomUpdated=We;function Ge(e,t){F(`onPromoted`,e,t)}e.onPromoted=Ge;function Ke(e,t){F(`onRemoteMixedAudioStream`,e,t)}e.onRemoteMixedAudioStream=Ke;function qe(e,t){F(`onJoinLinkChanged`,e,t)}e.onJoinLinkChanged=qe;function Je(e,t){F(`onRoomsUpdated`,e,t)}e.onRoomsUpdated=Je;function b(e,t,n,r,i){F(`onRoomUpdated`,e,t,n,r,i)}e.onRoomUpdated=b;function x(e,t){F(`onRoomParticipantsUpdated`,e,t)}e.onRoomParticipantsUpdated=x;function S(e,t){F(`onRoomSwitched`,e,t)}e.onRoomSwitched=S;function C(e,t){F(`onRoomStart`,e,t)}e.onRoomStart=C;function w(e,t=null,n){F(`onFeedback`,e,t,n)}e.onFeedback=w;function Ye(e,t){F(`onFeaturesPerRoleChanged`,e,t)}e.onFeaturesPerRoleChanged=Ye;function Xe(e,t){F(`onParticipantVmojiUpdate`,e,t)}e.onParticipantVmojiUpdate=Xe;function Ze(e,t,n){F(`onAsrSet`,e,t,n)}e.onAsrSet=Ze;function Qe(e,t,n,r){F(`onAsrStarted`,e,t,n,r)}e.onAsrStarted=Qe;function $e(e,t){F(`onAsrStopped`,e,t)}e.onAsrStopped=$e;function et(e,t,n,r,i){F(`onAsrTranscription`,e,t,n,r,i)}e.onAsrTranscription=et;function tt(e,t,n){F(`onParticipantIdChanged`,e,t,n)}e.onParticipantIdChanged=tt;function nt(e,t){F(`onVideoSuspendSuggest`,e,t)}e.onVideoSuspendSuggest=nt;function rt(e){F(`onSignalingMessage`,typeof e==`string`?e:L(e))}e.onSignalingMessage=rt;function it(e,t){F(`onPromotionApproved`,e,t)}e.onPromotionApproved=it;function at(e,t){F(`onPeerRegistered`,e,t)}e.onPeerRegistered=at})(vn||(vn={}));var R=vn,yn=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),bn;(function(e){let t=`📞`,n=()=>({sessionId:null,conversationId:null}),r=(e,t,...n)=>{R.onDebugMessage(t,...n),R.onDebugMessageWithContext(t,{conversationId:e.conversationId},...n)},i=console.debug.bind(console,t),a=console.log.bind(console,t),o=console.warn.bind(console,t),s=console.error.bind(console,t),c=!1;function l(e){if(!e)return n();try{return e()}catch{return n()}}function u(e,t,n){let u=l(n);if(N.debugLog&&Ae(e,t,u.sessionId||void 0),c)switch(e){case`DEBUG`:i(...t);break;case`LOG`:a(...t);break;case`WARN`:o(...t);break;case`ERROR`:s(...t);break}else r(u,e,...t)}function d(...e){u(`DEBUG`,e)}e.debug=d;function f(...e){u(`LOG`,e)}e.log=f;function p(...e){u(`WARN`,e)}e.warn=p;function m(...e){u(`ERROR`,e)}e.error=m;function ee(){return c}e.enabled=ee;function te(e){c=e,N.debugLog&&je()}e.toggle=te;function ne(e,...t){switch(e){case`DEBUG`:d(...t);break;case`LOG`:f(...t);break;case`WARN`:p(...t);break;case`ERROR`:m(...t);break}}e.send=ne;function h(e){return{debug:(...t)=>u(`DEBUG`,t,e),log:(...t)=>u(`LOG`,t,e),warn:(...t)=>u(`WARN`,t,e),error:(...t)=>u(`ERROR`,t,e)}}e.createLogger=h;function g(e=null){let t=null,n=e;function r(){!N.debugLog||t||(t=Me(),n&&Ne(n,t))}let i=()=>(r(),{sessionId:t,conversationId:n});return{get sessionId(){return t},get conversationId(){return n},setConversationId(e){n=e,t&&Ne(n,t)},send:(e,...t)=>u(e,t,i),debug:(...e)=>u(`DEBUG`,e,i),log:(...e)=>u(`LOG`,e,i),warn:(...e)=>u(`WARN`,e,i),error:(...e)=>u(`ERROR`,e,i)}}e.createSessionLogger=g;function re(e,...t){}e.test=re})(bn||(bn={}));var z=bn,B=new class{constructor(){h(this,`_conversations`,new Map),h(this,`_reserved`,new Set),h(this,`_activeId`,null),h(this,`_mutex`,!1),h(this,`_pendingRemovals`,new Set)}reserve(e){if(this._conversations.has(e)||this._reserved.has(e))throw Error(`CallRegistry: conversation ${e} already exists`);this._reserved.add(e)}add(e){let t=e.id;if(this._conversations.has(t)){z.warn(`CallRegistry: conversation ${t} already exists, skip duplicate add`),this._reserved.delete(t);return}this._conversations.set(t,e),this._reserved.delete(t)}remove(e){if(e){if(this._reserved.delete(e),this._mutex){this._pendingRemovals.add(e);return}this._conversations.delete(e),this._activeId===e&&(this._activeId=null)}}get(e){return this._conversations.get(e)}getActive(){return this._activeId?this._conversations.get(this._activeId)??null:null}getFirst(){return this._conversations.values().next().value??null}getActiveId(){return this._activeId}has(e){return this._conversations.has(e)||this._reserved.has(e)}getAll(){return Array.from(this._conversations.values())}get callsLength(){return this._conversations.size}async setActive(e){if(!(this._activeId===e||!this._conversations.has(e)||this._mutex)){this._mutex=!0;try{let t=this.getActive(),n;if(t){n=t.mediaSettings;try{await t.hold(!0)}catch(e){throw z.error(`Can't hold previous active, error: ${e}`),Error(`Cannot switch call: hold failed`)}}this._conversations.has(e)&&(this._activeId=e,R.onCallActive(e));let r=this._conversations.get(e);if(r&&r?.isCallHeld)try{await r.hold(!1,n)}catch(e){throw z.error(`Can't hold next active, error: ${e}`),Error(`Cannot switch call: hold failed`)}}finally{this._mutex=!1,this._flushPendingRemovals()}}}async setHold(e){if(!(this._activeId!==e||!this._conversations.has(e)||this._mutex)){this._mutex=!0;try{let e=this.getActive();if(e)try{await e.hold(!0)}catch(e){throw z.error(`Can't hold previous active, error: ${e}`),Error(`Cannot switch call: hold failed`)}this._activeId=null}finally{this._mutex=!1,this._flushPendingRemovals()}}}async switchCall(e){this._activeId===e?await this.setHold(e):await this.setActive(e)}clear(){this._conversations.clear(),this._reserved.clear(),this._pendingRemovals.clear(),this._activeId=null}_flushPendingRemovals(){if(this._pendingRemovals.size!==0){for(let e of this._pendingRemovals)this._conversations.delete(e),this._activeId===e&&(this._activeId=null);this._pendingRemovals.clear()}}},xn=class extends Error{constructor(e){super(e?`Signaling disposed. Command ${e}`:`Signaling disposed`),this.name=`SignalingDisposedError`}},Sn=class extends x{constructor(...e){super(...e),h(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}readyToSend(e=!0){}async requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}},V=function(e){return e.RECOVER=`recover`,e.ACCEPT_CALL=`accept-call`,e.ADD_PARTICIPANT=`add-participant`,e.REMOVE_PARTICIPANT=`remove-participant`,e.HANGUP=`hangup`,e.TRANSMIT_DATA=`transmit-data`,e.ACCEPT_PRODUCER=`accept-producer`,e.ALLOCATE_CONSUMER=`allocate-consumer`,e.CHANGE_MEDIA_SETTINGS=`change-media-settings`,e.CHANGE_PARTICIPANT_STATE=`change-participant-state`,e.CHANGE_STREAM_PRIORITIES=`change-streams-priorities`,e.UPDATE_DISPLAY_LAYOUT=`update-display-layout`,e.REPORT_PERF_STAT=`report-perf-stat`,e.REPORT_SHARING_STAT=`report-sharing-stat`,e.REPORT_NETWORK_STAT=`report-network-stat`,e.RECORD_START=`record-start`,e.RECORD_STOP=`record-stop`,e.RECORD_PUBLISH=`record-publish`,e.RECORD_SET_CONF=`record-set-conf`,e.RECORD_GET_STATUS=`record-get-status`,e.SWITCH_MICRO=`switch-micro`,e.SWITCH_TOPOLOGY=`switch-topology`,e.REQUEST_REALLOC=`request-realloc`,e.CHAT_MESSAGE=`chat-message`,e.CHAT_HISTORY=`chat-history`,e.CUSTOM_DATA=`custom-data`,e.GRANT_ROLES=`grant-roles`,e.MUTE_PARTICIPANT=`mute-participant`,e.ENABLE_FEATURE_FOR_ROLES=`enable-feature-for-roles`,e.PIN_PARTICIPANT=`pin-participant`,e.UPDATE_MEDIA_MODIFIERS=`update-media-modifiers`,e.CHANGE_OPTIONS=`change-options`,e.GET_WAITING_HALL=`get-waiting-hall`,e.GET_PARTICIPANT_LIST_CHUNK=`get-participant-list-chunk`,e.GET_PARTICIPANTS=`get-participants`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.REQUEST_TEST_MODE=`request-test-mode`,e.ADD_MOVIE=`add-movie`,e.UPDATE_MOVIE=`update-movie`,e.REMOVE_MOVIE=`remove-movie`,e.START_URL_SHARING=`start-url-sharing`,e.STOP_URL_SHARING=`stop-url-sharing`,e.GET_ROOMS=`get-rooms`,e.UPDATE_ROOMS=`update-rooms`,e.ACTIVATE_ROOMS=`activate-rooms`,e.REMOVE_ROOMS=`remove-rooms`,e.SWITCH_ROOM=`switch-room`,e.FEEDBACK=`feedback`,e.ASR_START=`asr-start`,e.ASR_STOP=`asr-stop`,e.REQUEST_ASR=`request-asr`,e.REQUEST_PROMOTION=`request-promotion`,e.ACCEPT_PROMOTION=`accept-promotion`,e.GET_HAND_QUEUE=`get-hand-queue`,e.ENABLE_VIDEO_SUSPEND=`enable-video-suspend`,e.ENABLE_VIDEO_SUSPEND_SUGGEST=`enable-video-suspend-suggest`,e.HOLD=`hold`,e.PUT_HANDS_DOWN=`put-hands-down`,e.CHANGE_SIMULCAST=`change-simulcast`,e}(V||{});function Cn(e){return e.stopStream}function wn(e){return e.keyFrameRequested}function Tn(e){if(Cn(e))return`ss`;if(wn(e))return`kf`;let t=``;return e.priority!==void 0&&(t+=`p=`+e.priority),e.width!==void 0&&e.height!==void 0&&(t!==``&&(t+=`:`),t+=`sz=`+Math.round(e.width)+`x`+Math.round(e.height)),e.fit!==void 0&&(t!==``&&(t+=`:`),t+=`fit=`+e.fit),t}var H=function(e){return e.CAMERA=`CAMERA`,e.SCREEN=`SCREEN`,e.STREAM=`STREAM`,e.MOVIE=`MOVIE`,e.ANIMOJI=`ANIMOJI`,e.SHARED_URL=`SHARED_URL`,e}({}),En=`s`,Dn=`m`;function On(e){return e.participantId+(e.mediaType?`:`+En+e.mediaType:``)+(e.streamName?`:`+Dn+e.streamName:``)}function kn(e){let t=e.split(`:`),n=t.shift();if(!n)throw Error(`Illegal stream description: `+e);let r=null,i,a=0;for(let n of t)switch(n.charAt(0)){case En:r=An(n.slice(1));break;case Dn:i=n.slice(1);break;case`d`:a=Number.parseInt(n.slice(1),10);break;default:throw Error(`Unexpected parameter type `+n.charAt(0)+` in stream description `+e)}return{participantId:M.compose(n,a),mediaType:r,streamName:i}}function An(e){for(let t of Object.keys(H))if(t===e)return H[t];return null}function jn(){let e=new DataView(new ArrayBuffer(64)),t=0;function n(n){if(t+n>e.byteLength){let r=new Uint8Array(Math.max(t+n,e.byteLength+64));r.set(new Uint8Array(e.buffer.slice(0,t))),e=new DataView(r.buffer)}}return{put(r){if(n(r.byteLength),Mn(r)){let n=r.buffer;new Uint8Array(e.buffer).set(new Uint8Array(n),t)}else new Uint8Array(e.buffer).set(new Uint8Array(r),t);t+=r.byteLength},putI8(r){n(1),e.setInt8(t,r),++t},putI16(r){n(2),e.setInt16(t,r),t+=2},putI32(r){n(4),e.setInt32(t,r),t+=4},putI64(r){n(8);let i=r<0;i&&(r=-r);let a=r/4294967296|0,o=r%4294967296|0;i&&(o=~o+1|0,a=o===0?~a+1|0:~a),e.setUint32(t,a),e.setUint32(t+4,o),t+=8},putUi8(r){n(1),e.setUint8(t,r),++t},putUi16(r){n(2),e.setUint16(t,r),t+=2},putUi32(r){n(4),e.setUint32(t,r),t+=4},putUi64(r){n(8),e.setUint32(t,r/4294967296|0),e.setUint32(t+4,r%4294967296),t+=8},putF(r){n(8),e.setFloat64(t,r),t+=8},ui8array(){return new Uint8Array(e.buffer.slice(0,t))}}}function Mn(e){return e.buffer!==void 0}function Nn(e){let t=ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),n=0;return{peek(){return t.getUint8(n)},get(e){n+=e;let r=t.byteOffset;return t.buffer.slice(r+n-e,r+n)},getI8(){return t.getInt8(n++)},getI16(){return n+=2,t.getInt16(n-2)},getI32(){return n+=4,t.getInt32(n-4)},getI64(){n+=8;let e=t.getInt32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getUi8(){return t.getUint8(n++)},getUi16(){return n+=2,t.getUint16(n-2)},getUi32(){return n+=4,t.getUint32(n-4)},getUi64(){n+=8;let e=t.getUint32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getF32(){return n+=4,t.getFloat32(n-4)},getF64(){return n+=8,t.getFloat64(n-8)}}}var Pn=0,Fn=1,In=2,Ln=3,Rn=4,zn=5,Bn=6,Vn=7,Hn=0,Un=1,Wn=2,Gn=0,Kn=0,qn=0,Jn=1,Yn=class{constructor(e=z){h(this,`participantIdRegistry`,null),h(this,`_debug`,void 0),this._debug=e}setParticipantIdRegistry(e){this.participantIdRegistry=e}serializeUpdateDisplayLayout(e,t){let n=jn();l.Int.enc(n,Pn),l.Int.enc(n,Gn),l.Int.enc(n,e),l.Nil.enc(n,null);let r=[];for(let e in t)Object.hasOwn(t,e)&&this.writeLayout(t,e,r);return l.Arr.enc(n,r),l.Nil.enc(n,null),n.ui8array().buffer}writeLayout(e,t,n){let r=e[t],i=jn();if(this.writeStreamDesc(t,i),Cn(r))l.Int.enc(i,Un);else if(wn(r))l.Int.enc(i,Wn);else if(l.Int.enc(i,Hn),r.priority===void 0?l.Nil.enc(i,null):l.Int.enc(i,r.priority),r.width!==void 0&&r.height!==void 0?(l.Int.enc(i,Math.round(r.width)),l.Int.enc(i,Math.round(r.height))):(l.Nil.enc(i,null),l.Nil.enc(i,null)),r.fit!==void 0)switch(r.fit){case`cv`:l.Int.enc(i,qn);break;case`cn`:l.Int.enc(i,Jn);break;default:l.Nil.enc(i,null)}else l.Nil.enc(i,null);n.push(i.ui8array().buffer)}writeStreamDesc(e,t){if(this.participantIdRegistry){let n=this.participantIdRegistry.getCompactId(e);if(n!==void 0){l.Int.enc(t,n);return}}l.Str.enc(t,e)}serializePerfStatReport(e,t){let n=jn();return l.Int.enc(n,Fn),l.Int.enc(n,Gn),l.Int.enc(n,e),l.Int.enc(n,t.framesDecoded),l.Int.enc(n,t.framesReceived),n.ui8array().buffer}serializeSharingStatReport(e,t){let n=jn();return l.Int.enc(n,In),l.Int.enc(n,Gn),l.Int.enc(n,e),l.Int.enc(n,t.minDelay),l.Int.enc(n,t.maxDelay),l.Int.enc(n,t.avgDelay),l.Int.enc(n,t.largeDelayDuration),n.ui8array().buffer}serializeRequestAsr(e,t){let n=jn();return l.Int.enc(n,Ln),l.Int.enc(n,Gn),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=jn();return l.Int.enc(n,Rn),l.Int.enc(n,Gn),l.Int.enc(n,e),l.Int.enc(n,t.timestamp),l.Int.enc(n,t.sendBitrate),n.ui8array().buffer}serializeEnableVideoSuspend(e,t){let n=jn();return l.Int.enc(n,zn),l.Int.enc(n,Gn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=jn();return l.Int.enc(n,Bn),l.Int.enc(n,Gn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=jn();l.Int.enc(n,Vn),l.Int.enc(n,Gn),l.Int.enc(n,e);let r=t.simulcastInfo.streams.length;l.Int.enc(n,t.mediaSource),l.Int.enc(n,r);for(let e of t.simulcastInfo.streams)l.Str.enc(n,e.rid),l.Int.enc(n,e.width),l.Int.enc(n,e.height),l.Int.enc(n,e.fps),l.Int.enc(n,e.bitrate/1e3);return n.ui8array().buffer}async deserializeCommandResponse(e){let t;t=e instanceof Blob?Nn(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await sn(e)):Nn(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==Gn){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==Kn){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Pn:return this.deserializeUpdateDisplayLayoutResponse(t);case Fn:return this.deserializeReportPerfStatResponse(t);default:this._debug.warn(`unsupported command response commandType: `+n);return}}deserializeUpdateDisplayLayoutResponse(e){let t=l.Int.dec(e),n=l.Arr.dec(e),r={};return n.forEach(e=>{let t=Nn(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=On(this.participantIdRegistry?.getStreamDescription(e));r[i]=l.Int.dec(t)}}),{type:`response`,sequence:t,response:V.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:r}}deserializeReportPerfStatResponse(e){let t=l.Int.dec(e),n=l.Int.dec(e);return{type:`response`,sequence:t,response:V.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:n}}},U=function(e){return e.CALL_INIT=`call_init`,e.CALL_START=`call_start`,e.CALL_ACCEPTED_OUTGOING=`call_accepted_outgoing`,e.CALL_ACCEPTED_INCOMING=`call_accepted_incoming`,e.FIRST_MEDIA_SENT=`first_media_sent`,e.CALL_FINISH=`call_finish`,e.CODEC_USAGE=`codec_usage`,e.SIGNALING_CONNECTED=`signaling_connected`,e.SCREENSHARE_FIRST_FRAME=`screen_share_first_frame`,e.FIRST_MEDIA_RECEIVED=`first_media_received`,e.CALL_DECLINED_OR_HANGED_LOCALLY=`CallDeclinedOrHangedLocally`,e.USER_FEEDBACK_RECEIVED=`UserFeedbackReceived`,e.SIGNALING_PING_SUMMARY=`signaling_ping_summary`,e.SIGNALING_COMMAND_SUMMARY=`signaling_command_summary`,e.WEBSOCKET_CONNECTED=`websocket_connected`,e.WEBSOCKET_RECONNECTED=`websocket_reconnected`,e.WEBSOCKET_FAILED_PINGS=`websocket_failed_pings`,e.WEBSOCKET_FAILED_EXCEPTION=`websocket_failed_exception`,e.WEBSOCKET_TIMEOUT=`websocket_timeout`,e.WEBSOCKET_RESTART=`websocket_restart`,e.WEBTRANSPORT_CONNECTED=`webtransport_connected`,e.WEBTRANSPORT_RECONNECTED=`webtransport_reconnected`,e.WEBTRANSPORT_FAILED_PINGS=`webtransport_failed_pings`,e.WEBTRANSPORT_FAILED_EXCEPTION=`webtransport_failed_exception`,e.WEBTRANSPORT_TIMEOUT=`webtransport_timeout`,e.WEBTRANSPORT_RESTART=`webtransport_restart`,e}(U||{}),Xn=1e3;function W(e,t,n=0){return t in e&&e[t]?e[t]:n}function Zn(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function Qn(e,t){return n=>n[e]===t}function $n(e){return(t,n)=>n[e]-t[e]}function er(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function tr(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function nr(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>[t,e[t]]).reduce((e,t)=>(e[t[0]]=M.isObject(t[1])?nr(t[1]):t[1],e),{})}function rr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function ir(e){let t=[];return RTCRtpReceiver.prototype.getStats?(t.push(...e.getReceivers().map(e=>e.getStats())),t.push(...e.getSenders().map(e=>e.getStats()))):t.push(e.getStats()),Promise.all(t).then(rr).then(tr)}function ar(e){let t=e.filter(Qn(`type`,`candidate-pair`)).sort($n(`priority`)).find(Zn(Qn(`nominated`,!0),Qn(`selected`,!0)));if(!t)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let n={timestamp:t.timestamp,availableOutgoingBitrate:t.availableOutgoingBitrate||0,totalRoundTripTime:t.totalRoundTripTime||0,currentRoundTripTime:t.currentRoundTripTime||0,bytesSent:t.bytesSent||0,bytesReceived:t.bytesReceived||0},r=e.find(Qn(`id`,t.remoteCandidateId));r&&Object.assign(n,{remote:{type:r.candidateType,address:r.ip||r.address,port:r.port,protocol:r.protocol}});let i=e.find(Qn(`id`,t.localCandidateId));return i&&Object.assign(n,{local:{type:i.candidateType,address:i.ip||i.address,port:i.port,protocol:i.protocol,relayProtocol:i.relayProtocol,networkType:i.networkType}}),nr(n)}function or(e,t,n=!1){let r=er(`id`,e);return(n?e.filter(Zn(Qn(`type`,`remote-inbound-rtp`))):e.filter(Zn(Qn(`type`,`inbound-rtp`),Qn(`type`,`outbound-rtp`)))).map(e=>{let n=Number(e.ssrc),i=e.mediaType||e.kind,a=e.remoteId||e.trackId,o=e.type,s=e.codecId;if(!o||!n||!i)return null;let c={ssrc:n,type:o,kind:i,bytesReceived:W(e,`bytesReceived`),bytesSent:W(e,`bytesSent`),headerBytesReceived:W(e,`headerBytesReceived`),headerBytesSent:W(e,`headerBytesSent`),jitter:W(e,`jitter`),packetsLost:W(e,`packetsLost`),packetsReceived:W(e,`packetsReceived`),packetsSent:W(e,`packetsSent`),fractionLost:W(e,`fractionLost`),pliCount:W(e,`pliCount`),firCount:W(e,`firCount`),nackCount:W(e,`nackCount`),userId:t[n],freezeCount:W(e,`freezeCount`,0),totalFreezesDuration:W(e,`totalFreezesDuration`,0)},l=`mid`in e&&typeof e.mid==`string`?e.mid:void 0,u=`rid`in e&&typeof e.rid==`string`?e.rid:void 0;if(l&&(c.mid=l),u&&(c.rid=u),i===`video`){let t=W(e,`framesDecoded`),n=W(e,`totalInterFrameDelay`),r=W(e,`totalSquaredInterFrameDelay`),i=W(e,`encoderImplementation`),a=W(e,`decoderImplementation`);i&&(c.encoderImplementation=i),a&&(c.decoderImplementation=a),c.interframeDelayVariance=(r-n*n/t)/t}if(i===`video`&&c.type===`outbound-rtp`&&(c.totalEncodeTime=W(e,`totalEncodeTime`)??0),i===`audio`&&(c.totalSamplesReceived=W(e,`totalSamplesReceived`),c.concealedSamples=W(e,`concealedSamples`),c.insertedSamplesForDeceleration=W(e,`insertedSamplesForDeceleration`),c.removedSamplesForAcceleration=W(e,`removedSamplesForAcceleration`),c.silentConcealedSamples=W(e,`silentConcealedSamples`),c.concealmentEvents=W(e,`concealmentEvents`),c.totalAudioEnergy=W(e,`totalAudioEnergy`)),s&&r[s]){let e=r[s];c.clockRate=e.clockRate,c.mimeType=e.mimeType,i===`audio`&&e.sdpFmtpLine&&(c.sdpFmtpLine=e.sdpFmtpLine)}if(a&&r[a]){let e=r[a];c.frameHeight=e.frameHeight,c.frameWidth=e.frameWidth,c.framesDecoded=e.framesDecoded,c.framesReceived=e.framesReceived,c.framesDropped=e.framesDropped}return nr(c)}).filter(e=>!!e)}function sr(e,t,n=!1){if(!t||!t.rtps.length||!e.rtps.length)return e;let r,i;n&&(r=er(`ssrc`,e?.remoteRtps||[]),i=er(`ssrc`,t?.remoteRtps||[]));let a=er(`ssrc`,e.rtps),o=er(`ssrc`,t.rtps),s=(e.timestamp-t.timestamp)/1e3;return!a||!o||Object.keys(a).forEach(c=>{let l=a[c],u=o[c];if(!(!l||!u)){if(l.bytesReceived&&l.bytesReceived>u.bytesReceived&&(l.bandwidth=Math.round((l.bytesReceived-u.bytesReceived)/s),l.bandwidth+=Math.round((l.headerBytesReceived-u.headerBytesReceived)/s)),l.bytesSent&&l.bytesSent>u.bytesSent&&(l.bandwidth=Math.round((l.bytesSent-u.bytesSent)/s),l.bandwidth+=Math.round((l.headerBytesSent-u.headerBytesSent)/s)),l.packetsReceived)if(l.packetsReceived>u.packetsReceived||l.packetsLost>u.packetsLost){let e=l.packetsLost-u.packetsLost,t=l.packetsReceived-u.packetsReceived;l.packetLoss=parseFloat((100*e/(e+t)).toFixed(2))}else l.packetLoss=0;if(l.freezeCount>u.freezeCount&&(l.freezeCountDelta=l.freezeCount-u.freezeCount),l.totalFreezesDuration>u.totalFreezesDuration&&(l.totalFreezesDurationDelta=l.totalFreezesDuration-u.totalFreezesDuration),l.framesDropped&&u.framesDropped&&l.framesDropped>u.framesDropped&&(l.framesDroppedDelta=parseFloat(((l.framesDropped-u.framesDropped)/s).toFixed(0))),n&&l.type===`outbound-rtp`&&l.kind===A.video){let n=r?.[c],a=i?.[c],o=e=>e??0,s=Math.max(0,o(n?.packetsLost)-o(a?.packetsLost)),d=Math.max(1,l.packetsSent-u.packetsSent);e.transport.averageNetStat={currentRoundTripTime:(e.transport.currentRoundTripTime+t.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(s/d*100)}}}}),e}async function cr(e,t,n={},r=!1){let i=await ir(e),a={timestamp:Date.now(),transport:ar(i),rtps:or(i,n)};return r&&(a.remoteRtps=or(i,n,!0)),t?sr(a,t,r):(await M.delay(Xn),cr(e,a,n,r))}function lr(e){performance.clearMarks(e),performance.mark(e)}function ur(e){performance.clearMarks(e)}function dr(e){let t=performance.getEntriesByName(e)[0];if(t===void 0)return null;let n=Math.round(performance.now()-t.startTime);return performance.clearMarks(e),n}function fr(e){return`${U.SCREENSHARE_FIRST_FRAME}_${pr(e)}`}function pr(e){return typeof e==`string`?e:JSON.stringify(e)}var G={distinctById:tr,rtcStatsToArray:rr,extractTransport:ar,extractRtps:or,delta:sr,collectStats:cr,setMark:lr,clearMark:ur,measureMark:dr,getMarkNameScreenshareFirstFrame:fr},mr=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(mr||{}),K=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(K||{}),q=function(e){return e.TRANSMITTED_DATA=`transmitted-data`,e.ACCEPTED_CALL=`accepted-call`,e.HUNGUP=`hungup`,e.PARTICIPANT_ADDED=`participant-added`,e.PARTICIPANT_JOINED=`participant-joined`,e.CLOSED_CONVERSATION=`closed-conversation`,e.MEDIA_SETTINGS_CHANGED=`media-settings-changed`,e.PARTICIPANT_STATE_CHANGED=`participant-state-changed`,e.PARTICIPANTS_STATE_CHANGED=`participants-state-changed`,e.RATE_CALL_DATA=`rate-call-data`,e.FEATURE_SET_CHANGED=`feature-set-changed`,e.TOPOLOGY_CHANGED=`topology-changed`,e.PRODUCER_UPDATED=`producer-updated`,e.CONSUMER_ANSWERED=`consumer-answered`,e.MULTIPARTY_CHAT_CREATED=`multiparty-chat-created`,e.FORCE_MEDIA_SETTINGS_CHANGE=`force-media-settings-change`,e.SETTINGS_UPDATE=`settings-update`,e.VIDEO_QUALITY_UPDATE=`video-quality-update`,e.REGISTERED_PEER=`registered-peer`,e.SWITCH_MICRO=`switch-micro`,e.RECORD_STARTED=`record-started`,e.RECORD_STOPPED=`record-stopped`,e.REALLOC_CON=`realloc-con`,e.AUDIO_ACTIVITY=`audio-activity`,e.SPEAKER_CHANGED=`speaker-changed`,e.SESSION_STATE=`session-state`,e.STALLED_ACTIVITY=`stalled-activity`,e.CHAT_MESSAGE=`chat-message`,e.CUSTOM_DATA=`custom-data`,e.ROLES_CHANGED=`roles-changed`,e.MUTE_PARTICIPANT=`mute-participant`,e.PIN_PARTICIPANT=`pin-participant`,e.OPTIONS_CHANGED=`options-changed`,e.NETWORK_STATUS=`network-status`,e.PARTICIPANT_SOURCES_UPDATE=`participant-sources-update`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.CHAT_ROOM_UPDATED=`chat-room-updated`,e.PROMOTION_APPROVED=`promotion-approved`,e.JOIN_LINK_CHANGED=`join-link-changed`,e.FEEDBACK=`feedback`,e.MOVIE_UPDATE_NOTIFICATION=`movie-update-notification`,e.MOVIE_SHARE_STARTED=`movie-share-started`,e.MOVIE_SHARE_STOPPED=`movie-share-stopped`,e.URL_SHARING_INFO_UPDATED=`url-sharing-info-updated`,e.ROOM_UPDATED=`room-updated`,e.ROOMS_UPDATED=`rooms-updated`,e.ROOM_PARTICIPANTS_UPDATED=`room-participants-updated`,e.FEATURES_PER_ROLE_CHANGED=`features-per-role-changed`,e.PARTICIPANT_ANIMOJI_CHANGED=`participant-animoji-changed`,e.ASR_STARTED=`asr-started`,e.ASR_STOPPED=`asr-stopped`,e.DECORATIVE_PARTICIPANT_ID_CHANGED=`decorative-participant-id-changed`,e.VIDEO_SUSPEND_SUGGEST=`video-suspend-suggest`,e.HOLD=`hold`,e}(q||{}),hr=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),gr=function(e){return e.CONNECTED=`connected`,e.RECONNECTED=`reconnected`,e.FAILED_PINGS=`failed_pings`,e.FAILED_EXCEPTIONS=`failed_exception`,e.TIMEOUT=`timeout`,e.RESTART=`restart`,e}({}),_r={connected:{wt:U.WEBTRANSPORT_CONNECTED,ws:U.WEBSOCKET_CONNECTED},reconnected:{wt:U.WEBTRANSPORT_RECONNECTED,ws:U.WEBSOCKET_RECONNECTED},failed_pings:{wt:U.WEBTRANSPORT_FAILED_PINGS,ws:U.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:U.WEBTRANSPORT_FAILED_EXCEPTION,ws:U.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:U.WEBTRANSPORT_TIMEOUT,ws:U.WEBSOCKET_TIMEOUT},restart:{wt:U.WEBTRANSPORT_RESTART,ws:U.WEBSOCKET_RESTART}},J=function(e){return e.IDLE=`IDLE`,e.OPENED=`OPENED`,e.CONNECTING=`CONNECTING`,e.RECONNECTING=`RECONNECTING`,e.CONNECTED=`CONNECTED`,e.CLOSED=`CLOSED`,e.FAILED=`FAILED`,e}(J||{}),Y=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}(Y||{}),vr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(vr||{}),{isObject:yr,isObjectsEquals:br}=M;function xr(e,t){return e===null||t===null?e===null&&t===null:e.maxDimension!==t.maxDimension||e.maxBitrateK!==t.maxBitrateK||e.maxFramerate!==t.maxFramerate||e.degradationPreference!==t.degradationPreference||e.scalabilityMode!==t.scalabilityMode||yr(e.bitrates)&&yr(t.bitrates)&&!br(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Sr=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Cr(e,t){return!(!xr(e.camera,t.camera)||!xr(e.screenSharing,t.screenSharing)||!xr(e.fastScreenSharing,t.fastScreenSharing))}function wr(e,t){return{camera:Object.assign({},e.camera,t.camera),screenSharing:Object.assign({},e.screenSharing,t.screenSharing),fastScreenSharing:Object.assign({},e.fastScreenSharing,t.fastScreenSharing)}}function Tr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Er=200;function Dr(e){for(let t of e.values())if(t.type===`outbound-rtp`&&(t.packetsSent??0)>0)return!0;return!1}var Or=class{constructor(e,t,n=Er){h(this,`_peerConnection`,void 0),h(this,`_onFirstMediaSent`,void 0),h(this,`_pollIntervalMs`,void 0),h(this,`_timer`,null),h(this,`_state`,`idle`),this._peerConnection=e,this._onFirstMediaSent=t,this._pollIntervalMs=n}start(){this._state===`idle`&&(this._state=`polling`,this._poll())}destroy(){this._state!==`stopped`&&(this._state=`stopped`,this._timer!==null&&(clearTimeout(this._timer),this._timer=null))}async _getStatsReports(){return(await Promise.all(this._peerConnection.getSenders().map(async e=>{try{return await e.getStats()}catch{return null}}))).filter(e=>e!==null)}async _poll(){if(this._state===`polling`){try{let e=await this._getStatsReports();if(this._state!==`polling`)return;if(e.some(Dr)){this._state=`stopped`,this._onFirstMediaSent();return}}catch{}this._scheduleNextPoll()}}_scheduleNextPoll(){this._state===`polling`&&(this._timer=setTimeout(()=>{this._timer=null,this._poll()},this._pollIntervalMs))}},kr=class extends x{constructor(e,t,n=null){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_state`,J.IDLE),h(this,`_pc`,null),h(this,`_onFirstMediaSent`,void 0),h(this,`_firstMediaSentProbe`,null),h(this,`_firstMediaSentProbeStopped`,!1),this._signaling=e,this._mediaSource=t,this._onFirstMediaSent=n}getState(){return this._state||J.IDLE}stopFirstMediaSentProbe(){this._firstMediaSentProbeStopped=!0,this._disposeFirstMediaSentProbe()}_startFirstMediaSentProbe(){this._disposeFirstMediaSentProbe(),!(!this._pc||!this._onFirstMediaSent||this._firstMediaSentProbeStopped)&&(this._firstMediaSentProbe=new Or(this._pc,this._onFirstMediaSent),this._firstMediaSentProbe.start())}_disposeFirstMediaSentProbe(){this._firstMediaSentProbe?.destroy(),this._firstMediaSentProbe=null}},Ar=class{constructor(e,t=null){h(this,`weightUp`,void 0),h(this,`weightDown`,void 0),h(this,`value`,NaN),this.weightUp=e,this.weightDown=t??e}set(e){this.value=e}update(e){return this.value=Number.parseFloat(this.getNext(e).toFixed(3)),this.value}getNext(e){if(isNaN(this.value))return e;let t=e<this.value?this.weightDown:this.weightUp;return this.value*(1-t)+e*t}getValue(){return this.value}},jr=.25,Mr=.35,Nr=85,Pr=.1,Fr=1.5,Ir=.1,Lr=1,Rr=.6,zr=.3,Br=class extends x{constructor(e,t=z){super(),h(this,`_signaling`,void 0),h(this,`_localNetworkStat`,void 0),h(this,`_remoteNetworkStat`,void 0),h(this,`_lastNetworkStat`,void 0),h(this,`_networkLimits`,{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}}),h(this,`_lastStatSentTimestamp`,0),h(this,`_currentState`,`good`),h(this,`_debug`,void 0),this._debug=t,this._signaling=e,this._localNetworkStat={rtt:new Ar(jr,jr),loss:new Ar(Mr,Mr),bitrate:0},this._remoteNetworkStat={rtt:0,loss:0,bitrate:0},this._lastNetworkStat={rtt:0,loss:0,date:0}}_calcRttRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.rtt)/Nr);for(let e=0;e<r;e++)n*=1-Pr;return n}_calcLossRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.loss)/Fr);for(let e=0;e<r;e++)n*=1-Ir;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*Lr;return Math.min(n,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,n){return n?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=Rr?`good`:e>=zr?`medium`:`bad`}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol===`tcp`,n=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),r=e.inbound.rtps.reduce((e,t)=>Math.max(e,t.packetLoss||0),0),i={rtt:this._localNetworkStat.rtt.update(n),loss:this._localNetworkStat.loss.update(r)};if(t){let t=e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0);i.bitrate=t,this._localNetworkStat.bitrate=t}let a=Date.now(),o=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),s=Math.max(Math.round(o*10)/10,.1),c=this._getNetworkState(s);(t||c!==this._currentState||a-this._lastStatSentTimestamp>N.networkStatisticsInterval)&&(this._lastStatSentTimestamp=a,this._signaling.customData({sdk:Object.assign({type:`bad-net`},i)},null).catch(e=>{this._debug.warn(`Unable to send [bad-net]`,e)})),this._currentState=c,this._triggerEvent(X.NETWORK_STATUS,s)}reportRemote(e){let{rtt:t,loss:n,bitrate:r}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=n||0,this._remoteNetworkStat.bitrate=r||0}},Vr=30*1e3,Hr=class e extends kr{constructor(e,t,n,r,i,a=z,o=null,s=null,c=null,l=null){super(n,r,l),h(this,`_participantId`,void 0),h(this,`_isMaster`,void 0),h(this,`_remoteSDP`,{}),h(this,`_remoteCandidates`,{}),h(this,`_lastRemoteSDP`,null),h(this,`_animojiDataChannel`,null),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_remoteAnimojiVersion`,1),h(this,`_isOpen`,!1),h(this,`_remotePeerId`,null),h(this,`_statInterval`,null),h(this,`_settingsInterval`,null),h(this,`_failedOnCreate`,null),h(this,`_remoteStream`,null),h(this,`_iceRestartTimeout`,null),h(this,`_reconnectionTimeout`,null),h(this,`_reconnectionPrevented`,!1),h(this,`_remoteHold`,!1),h(this,`_lastStat`,null),h(this,`_fingerprint`,null),h(this,`_neverConnected`,!0),h(this,`_serverSettings`,void 0),h(this,`_prevConsumerSettings`,{}),h(this,`_networkLimitsForVideo`,{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}}),h(this,`_videoMaxDimensionsForNet`,{worst:320,bad:640,good:1280}),h(this,`_lastVideoMaxDimension`,this._videoMaxDimensionsForNet.good),h(this,`_lastBadConnection`,0),h(this,`_perfStatReporter`,void 0),h(this,`_directStatReporter`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),this._participantId=e,this._isMaster=t,this._serverSettings=i,this._debug=a,this._logger=o,this._statAggregator=s,this._codecStatsAggregator=c,this._perfStatReporter=new la(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new Br(n,this._debug),this.subscribe(this._signaling,K.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._applySettings.bind(this)),this.subscribe(this._directStatReporter,X.NETWORK_STATUS,this._onNetworkStatus.bind(this));try{this._pc=this._createPeerConnection()}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this._failedOnCreate=e;return}if(this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(w.ERROR,`addTrack-direct`),this._debug.error(`Unable to add media source tracks`,e,{participantId:this._participantId}),this._failedOnCreate=e;return}this._createOffer(!1).catch(e=>{this._state===J.IDLE?this._failedOnCreate=e:this.close(e)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return!this._pc||[J.IDLE,J.CLOSED,J.FAILED].includes(this.getState())}async open(e=null){if(this._isOpen){this._debug.warn(`DirectTransport: Already opened`,{participantId:this._participantId});return}if(this._failedOnCreate){this._finishClose(this._failedOnCreate);return}if(this._debug.debug(`DirectTransport: Open transport`,{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(w.ERROR,`addTrack-direct`),this._debug.error(`DirectTransport: Unable to add media source tracks`,e,{participantId:this._participantId}),this.close(e);return}this._startFirstMediaSentProbe(),this._setState(J.OPENED);let t=e;if(!e){let e=Object.keys(this._remoteSDP);t=e[e.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){Cr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setRemoteHold(e){if(this._remoteHold!==e){if(this._remoteHold=e,e){this._stopReconnection(),this._stopStatInterval(),this._stopSettingsInterval(),this._isOpen&&(this._disposePeerConnection(),this._remoteSDP={},this._remoteCandidates={},this._lastRemoteSDP=null);return}this._isOpen&&this._recreatePeerConnection()}}_recreatePeerConnection(){this._debug.log(`Recreating peer connection after remote unhold`,{participantId:this._participantId});try{this._pc=this._createPeerConnection()}catch(e){this._debug.error(`Failed to recreate RTCPeerConnection:`,e),this.close(e);return}this._neverConnected=!0;try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._debug.error(`Unable to add media source tracks after unhold`,e,{participantId:this._participantId});return}this._startFirstMediaSentProbe(),this._startSettingsInterval(),this._isMaster&&this._createOffer(!1).catch(e=>{this._debug.error(`Unable to create offer after unhold`,e,{participantId:this._participantId})}),this._setState(J.CONNECTING)}_createPeerConnection(){let e=new RTCPeerConnection({iceServers:N.iceServers,iceTransportPolicy:N.forceRelayPolicy?`relay`:`all`});return e.onicecandidate=this._handleIceCandidate.bind(this),e.ontrack=this._onAddTrack.bind(this),e.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),e.onconnectionstatechange=this._onConnectionStateChange.bind(this),e.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},N.vmoji&&this._createDataChannel(e,vr.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),e}_disposePeerConnection(){if(this._disposeFirstMediaSentProbe(),this._lastStat=null,this._remoteStream){let e=this._remoteStream;e.getTracks().forEach(t=>{t.stop(),this._triggerEvent(X.REMOTE_TRACK_REMOVED,e,t)}),this._remoteStream=null}this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close(),this._animojiDataChannel=null),this._pc&&(this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.oniceconnectionstatechange=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._pc.close(),this._pc=null)}setAnimojiTransport(e,t){if(N.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&this._finishClose(e)}_finishClose(e){this._isOpen=!1,this._stopReconnection(),this._stopStatInterval(),this._stopSettingsInterval(),this._disposePeerConnection(),this._onNetworkStatus(1),this.unsubscribe(),e?(this._debug.error(`DirectTransport: Closed`,e,{participantId:this._participantId}),this._setState(J.FAILED)):(this._debug.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(J.CLOSED)),this._triggerEvent(X.PEER_CONNECTION_CLOSED)}_setState(e){this._state!==e&&(this._debug.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent(X.STATE_CHANGED,e))}_onSignalingNotification(e){switch(e.notification){case q.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case q.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case q.CUSTOM_DATA:Object.hasOwn(e.data,`sdk`)&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,n=M.getPeerIdString(e.peerId);M.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(n,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(n,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){this._debug.debug(`Add remote ice candidate`,{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(e){throw this._logger?.log(w.ERROR,`addIceCandidate-direct`),this._debug.error(`Unable to add remote ice candidate`,e,{participantId:this._participantId,candidate:t}),e}}else this._debug.debug(`Cache remote ice candidate`,{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){this._debug.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let n of t)try{await this._addIceCandidate(e,n)}catch{}}async _setRemoteDescription(t,n){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===t)&&this._pc){if(this._lastRemoteSDP?.sdp===n.sdp)return;this._lastRemoteSDP=n,n=e._patchRemoteDescription(n),this._debug.debug(`Add remote description`,{participantId:this._participantId,sdp:n}),this._calcFingerprint(n.sdp);try{await this._pc.setRemoteDescription(n),await this._setRemoteCandidates(t),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(e){throw this._logger?.log(w.ERROR,`setRemoteDescription-direct`),this._debug.error(`Unable to set remote description`,e,{participantId:this._participantId,sdp:n}),e}}else this._remoteSDP[t]=n}_processAnimojiProtocolVersion(e){let t=Math.min(e,N.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){this._debug.debug(`Added remote track`,{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=e=>{this._triggerEvent(X.REMOTE_TRACK_REMOVED,this._remoteStream,e.track)}),this._triggerEvent(X.REMOTE_TRACK_ADDED,this._remoteStream,e.track)}async _handleIceCandidate(e){this._signaling.ready&&(e.candidate?(this._debug.debug(`Local ice candidate`,{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate)):N.forwardEmptyIceCandidate&&(this._debug.debug(`ICE gathering complete, forwarding empty candidate`,{participantId:this._participantId}),await this._signaling.sendCandidate(this._participantId,{candidate:``})))}_onSignalingStateChange(){this._debug.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:N.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case`have-local-offer`:let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(Error());break;case`have-remote-offer`:this._createAnswer().then(t=>this._signaling.sendSdp(this._participantId,t,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case`checking`:{let e=this.getState();e===J.IDLE||e===J.OPENED?this._setState(J.CONNECTING):this._setState(J.RECONNECTING);break}case`connected`:case`completed`:this._pc?.connectionState!==`connected`&&(this._debug.warn(`DirectTransport: marking connected via iceConnectionState fallback`,{participantId:this._participantId,connectionState:this._pc?.connectionState,iceConnectionState:this._pc?.iceConnectionState}),this._logger?.log(w.ERROR,`iceConnectionState-fallback`),this._markConnected());break}}_markConnected(){this._neverConnected=!1,this._setState(J.CONNECTED),this._stopReconnection(),this._pc&&M.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(w.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))}),this._startStatInterval()}_onConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),this._logger?.log(w.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case`connected`:this._markConnected();break;case`failed`:case`disconnected`:this._remoteHold?this._debug.log(`Remote participant on hold, skipping reconnection`,{participantId:this._participantId}):this._reconnectionPrevented?this.close(Error(`Ice connection ${this._pc.connectionState}`)):(this._setState(J.RECONNECTING),this._startReconnection());break;case`closed`:this._remoteHold||this.close(Error(`Ice connection closed`));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(this._debug.log(`Waiting for reconnection...`,{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},N.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(Y.SERVER).catch(e=>{e instanceof xn||this._debug.warn(`Unable to switch topology DIRECT to SERVER`,e)}))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(this._logger?.log(w.ICE_RESTART),this._debug.log(`Ice restart`,{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):this._debug.debug(`Waiting for ice restart...`,{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,this._debug.error(`Ice restart failed`,{participantId:this._participantId}),this._logger?.log(w.ERROR,`iceRestart-direct`),this._requestTopologySwitch()},N.iceRestartWaitTime)}async _createOffer(t){let n={iceRestart:t,offerToReceiveAudio:!0,offerToReceiveVideo:!0};this._debug.debug(`Create offer`,{participantId:this._participantId,options:n});let r;try{r=await this._pc?.createOffer(n),this._debug.debug(`Created offer`,{participantId:this._participantId,offer:r}),r=e._patchLocalDescription(r)}catch(e){throw this._debug.error(`Unable to create offer`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`createOffer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`setLocalDescription-direct`),e}}async _createAnswer(){this._debug.debug(`Create answer`,{participantId:this._participantId});let t;try{t=await this._pc?.createAnswer(),this._debug.debug(`Created answer`,{participantId:this._participantId,answer:t}),t=e._patchLocalDescription(t)}catch(e){throw this._debug.error(`Unable to create answer`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`createAnswer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,answer:t}),this._calcFingerprint(t.sdp),await this._pc?.setLocalDescription(t),t}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`setLocalDescription-direct`),e}}static _patchLocalDescription(e){let t=!!E.baseChromeVersion();return e.sdp=M.patchLocalSDP(e.sdp,N.preferH264&&E.canPreferH264(),E.isBrokenH264Decoder(),N.preferVP9,t&&N.audioNack),e}static _patchRemoteDescription(e){return e.sdp=M.patchRemoteSDP(e.sdp,!1,!1,N.preferVP9,E.isBrokenVP9Encoder(),E.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(e=>{this._debug.error(`DirectTransport: Unable to replace track`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`replaceTrack-direct`)})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}G.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,this._codecStatsAggregator?.reportUsage(t);let n={inbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`inbound-rtp`?(e.userId=this._participantId,!0):!1)},outbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(n),this._directStatReporter.reportLocal(n),this._triggerEvent(X.REMOTE_DATA_STATS,n),this._statInterval=window.setTimeout(e,N.statisticsInterval)})};this._statInterval=window.setTimeout(e,N.statisticsInterval)}async _isSVCSupported(e,t){let n=this._mediaSource.getSendVideoTrack(),r=e.outbound.rtps.find(e=>e.kind===`video`);if(!r?.mimeType||!r?.bandwidth||!n)return!1;let i=n.getSettings();if(!i.width||!i.height||!i.frameRate)return!1;let a={type:`webrtc`,video:{contentType:r.mimeType,width:i.width,height:i.height,bitrate:r.bandwidth,framerate:i.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(a)).supported||!1}catch(e){return this._debug.warn(`Failed to get encodingInfo`,a,e),!1}}async _checkPPTNetwork(e){if(!N.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,n=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,r=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,i=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,a=this._videoMaxDimensionsForNet.good,o=Sr.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=Sr.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=Sr.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Sr.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Vr)||this._lastVideoMaxDimension===a)return;let s=this._serverSettings.camera;if(!s||!await this._isSVCSupported(e,o))return;this._debug.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a}),this._lastVideoMaxDimension=a;let c={...this._serverSettings,camera:{...s,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(c)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[``]=e,this._triggerEvent(X.NETWORK_STATUS,t)}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=M.sdpFingerprint(e);if(t===null){this._debug.warn(`Fingerprint calculation is unsupported`);return}this._fingerprint===null?this._fingerprint=t:(R.onFingerprintChange((this._fingerprint^t).toString()),this._fingerprint=null)}_applySettings(){let e=this._mediaSource.mediaSettings.isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState===`connected`&&(this._prevConsumerSettings=M.applySettings(this._pc,e,this._prevConsumerSettings,this._debug))}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{negotiated:!0,id:1});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),r.onerror=e=>{this._debug.error(`[${t}] data channel error`,e)},n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)}}},Ur=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),Wr=16,Gr=class e{constructor(e,t,n,r=z){h(this,`_datachannel`,void 0),h(this,`_participantIdRegistry`,void 0),h(this,`_asrCallback`,void 0),h(this,`_textDecoder`,void 0),h(this,`_debug`,void 0),this._debug=r,this._debug.debug(`AsrReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._asrCallback=n,this._textDecoder=new TextDecoder,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}static parse(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint8(1);if(r!==0)throw Error(`Unsupported message type. Message type: ${r}`);let i=t.getUint16(2),a=t.getUint32(4),o=t.getUint32(8),s=t.getUint32(12);if(n!==1)throw Error(`Unexpected protocol version. Got ${n}, expected 1`);return{sequence:i,ssrc:a,timestamp:o,duration:s,data:e.slice(Wr)}}_onDataChannelMessage(t){let n=e.parse(t),r=this._participantIdRegistry?.getStreamDescription(n.ssrc)?.participantId;if(!r){this._debug.warn(`Participant id for ssrc ${n.ssrc} not found in registry`);return}let i={participantId:r,text:this._textDecoder.decode(n.data),timestamp:n.timestamp,duration:n.duration};this._asrCallback(i)}destroy(){this._datachannel.onmessage=null}},Kr,qr=class{constructor(){h(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};Kr=qr,h(qr,`_instance`,null),h(qr,`getInstance`,()=>(Kr._instance||(Kr._instance=new Kr),Kr._instance));var Jr=class{constructor(e=z){h(this,`streamDescriptionByCompactId`,new Map),h(this,`compactIdByStreamDescription`,new Map),h(this,`_debug`,void 0),this._debug=e}getStreamDescription(e){return this.streamDescriptionByCompactId.get(e)}getCompactId(e){return this.compactIdByStreamDescription.get(e)}handleMessage(e){let t=new Uint8Array(e),n=t[0],r=t.subarray(1);switch(n){case 1:let e=(0,l.decode)(r);return Object.entries(e).forEach(([e,t])=>{let n=kn(e);this.streamDescriptionByCompactId.set(t,n),this.compactIdByStreamDescription.set(e,t)}),null;case 2:case 4:let t=(0,l.decode)(r),i=[];for(let e of t){let t=this.getStreamDescription(e);t&&i.push(t.participantId)}return n===2?{type:`notification`,notification:q.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:q.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:q.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:q.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:o[0],maxDimension:o[1]},mediaType:this._decodeMediaType(o[2])};case 6:let s=(0,l.decode)(r),c={};for(let[e,t]of Object.entries(s)){let n=this.getStreamDescription(Number(e))?.participantId;n&&(c[n]=t/100)}return{type:`notification`,notification:q.NETWORK_STATUS,statuses:c};case 7:return this._createParticipantSourcesUpdateNotification(r);case 8:{let e=(0,l.decode)(r).map(e=>{let[t,n,r,i,a,o,s]=e;return{participantId:this.getStreamDescription(t)?.participantId,gain:n,pause:r,offset:i,mute:a,liveStatus:o,startTimeMs:s}});return{type:`notification`,notification:q.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:q.VIDEO_SUSPEND_SUGGEST,bandwidth:u};default:return this._debug.debug(`unsupported message type: `+n),null}}_decodeMediaType(e){if(e===null)return null;switch(e){case 0:return H.CAMERA;case 1:return H.SCREEN;default:throw Error(`Unsupported media type: ${e}`)}}_createParticipantSourcesUpdateNotification(e){let t=(0,l.decode)(e),n=[];for(let[e,r]of Object.entries(t)){let t=r[0],i=r[1],a=r[2],o=!!r[3],s=r[4]===null?void 0:!!r[4],c;if(t!==null){if(c=this.getStreamDescription(t),!c){this._debug.error(`could not uncompress participant ID ${t}`);continue}}else c=null;if(a===null){this._debug.error(`unexpected null sequenceNumber`,e,r);continue}let l=Ur.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+`-`+e,u=i?i>>>0:null;n.push({participantStreamDescription:c,streamId:l,rtpTimestamp:u,sequenceNumber:a,fastScreenShare:o,suspend:s})}return{type:`notification`,notification:q.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},Yr=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({}),Xr=class{constructor(e=z,t=null){h(this,`_worker`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._debug=e,this._logger=t}async _createWorker(e,t,n=[],r={},i=[]){return new Promise((a,o)=>{let s=!1,c=!1,l=n.join(`,`),u=new Blob([e,`exports.default(${l});`],{type:`application/javascript; charset=utf-8`}),d=window.URL.createObjectURL(u),f=new Worker(d);window.URL.revokeObjectURL(d),this._worker=f;let p=e=>{c||(c=!0,o(e))},m=e=>{if(this._debug.warn(e),!s){p(e);return}t({type:Yr.FRAME,error:e})};f.onerror=e=>{e.preventDefault?.(),m(this._formatWorkerError(e))},f.onmessageerror=e=>{e.preventDefault?.(),m(this._formatWorkerMessageError(e))},f.onmessage=e=>{switch(e.data.type){case Yr.READY:s=!0,c||(c=!0,a());break;case Yr.ERROR:s?m(e.data.error):p(e.data.error);break;case Yr.FRAME:t(e.data);break;case Yr.DEBUG:this._debug.debug(e.data.message);break;case Yr.LOG_ERROR:this._logger?.log(w.ERROR,e.data.message);break}},this._sendToWorker(Yr.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}_formatWorkerError(e){let t=e.message||e.error?.message||`Unknown worker error`,n=[[e.filename,e.lineno,e.colno].filter(Boolean).join(`:`),[e.error?.name,e.error?.stack].filter(Boolean).join(`: `)].filter(Boolean).join(` `);return`${this.constructor.name} Worker crashed: ${t}${n?` (${n})`:``}`}_formatWorkerMessageError(e){return`${this.constructor.name} Worker message error${e.origin?` from ${e.origin}`:``}`}static isBrowserSupported(){throw Error(`Not implemented`)}},Zr=class extends Xr{constructor(e=z,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`LibVPxDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n)=>{let r=null,i=null,a=!0,o=!1;function s(){return t({locateFile:n}).then(e=>i=e)}function c(t,n,s,c){if(!i){self.postMessage({type:e.LOG_ERROR,message:`decoder-init-fail-libvpx`}),self.postMessage({type:e.FRAME,error:`Fatal initialization error`});return}if(a!==s&&(a=s,r&&(r=null,self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec changed to ${s?`VP9`:`VP8`} - reinitialize`}))),!r&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec ${s?`VP9`:`VP8`}`}),r=new i.VpxDecoder,r.debug(c),!r.init(s?i.VpxType.VP9:i.VpxType.VP8))){r=null,self.postMessage({type:e.FRAME,error:`Decoder failed to create`});return}try{r.allocateBuffer(n.byteLength).set(new Uint8Array(n))}catch(t){self.postMessage({type:e.DEBUG,message:t}),r=null,self.postMessage({type:e.FRAME,error:String(t)});return}if(r.decode()&&r.nextImage())o=!1;else{self.postMessage({type:e.FRAME,error:`Decode failed`}),l();return}let u=r.getImageBuffer();if(!u){self.postMessage({type:e.FRAME,error:`No decoded data`});return}let d=r.getImageWidth(),f=r.getImageHeight();r.nextImage()&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxDecoder-drop`}));let p=new Uint8ClampedArray(u.byteLength);p.set(u),self.postMessage({type:e.FRAME,data:p.buffer,width:d,height:f},[p.buffer])}function l(){o||(self.postMessage({type:e.FRAME,requestKeyFrame:!0}),o=!0)}s().then(()=>{self.onmessage=t=>{switch(t.data.type){case e.FRAME:c(t.data.timestamp,t.data.data,t.data.isVP9,t.data.debug);break}},self.postMessage({type:e.READY})}).catch(t=>{self.postMessage({type:e.ERROR,error:String(t)})})}})(),exports={default:workerExports};",r=>{r.error?(this._debug.warn(`LibVPxDecoder`,r.error),t(r.error)):r.requestKeyFrame?(this._debug.debug(`LibVPxDecoder requests key frame`),n()):e(new ImageData(new Uint8ClampedArray(r.data),r.width,r.height))},[u.default,u.default.getUrl])}decodeFrame(e,t,n,r){this._sendToWorker(Yr.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r,debug:z.enabled()},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`LibVPxDecoder destroyed`)}static isBrowserSupported(){return`WebAssembly`in window&&`Worker`in window}},Qr=class extends Xr{constructor(e=z,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`WebCodecsDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return n=>{let r=null,i=`no-preference`,a=!0,o=!1,s=!1,c=null,l=null;function u(e){return e instanceof Error?[e.name,e.message,e.stack].filter(Boolean).join(`: `):String(e)}function d(e,n){try{self.postMessage({type:t.FRAME,error:`WebCodecsDecoder ${e} failed: ${u(n)}`})}catch{}}function f(){self.postMessage({type:t.READY})}function p(e,n,r,i=!1){try{c={timestamp:e,data:n,isVP9:r,keyFrame:i};let a=h(r);if(o&&!i){self.postMessage({type:t.FRAME,error:`WebCodecsDecoder waiting for keyframe`}),m();return}else o&&i&&(o=!1,s=!1,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder got keyframe. Start decoding`}));let l=new EncodedVideoChunk({type:i?`key`:`delta`,timestamp:e,data:n});a.decode(l)}catch(e){_(`because failed call decode: ${u(e)}`),d(`decode`,e);return}v(i)}self.onmessage=e=>{try{switch(e.data.type){case t.INIT:f();break;case t.FRAME:p(e.data.timestamp,e.data.data,e.data.isVP9,e.data.keyFrame);break}}catch(e){d(`message`,e)}};function m(){s||(self.postMessage({type:t.FRAME,requestKeyFrame:!0}),s=!0)}function h(e){if(a!==e&&(a=e,_(`because codec is changed to ${a?`VP9`:`VP8`}`)),!r){o=!0,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec ${a?`VP9`:`VP8`}`}),r=new VideoDecoder({output:e=>{y(),g(e)},error:e=>{y(),_(`because error during decoding: ${u(e)}`),i===`prefer-software`?self.postMessage({type:t.FRAME,error:`WebCodecsDecoder failed, reinitialize: `+u(e)}):(i=`prefer-software`,c&&c.keyFrame&&p(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${u(e)}`}))}});try{r.configure(b(a,i))}catch(e){throw _(`because failed configure: ${u(e)}`),d(`configure`,e),e}}return r}function g(e){try{let r=n?[e]:[];self.postMessage({type:t.FRAME,data:e},r)}catch(n){try{self.postMessage({type:t.FRAME,data:e})}catch(e){d(`postMessage`,e),d(`postMessage transfer`,n)}}finally{try{e.close()}catch{}}}function _(e){if(r){try{r&&r.state!==`closed`&&r.close()}catch{}r=null,self.postMessage({type:t.FRAME,error:`WebCodecsDecoder reset ${e}`})}}function v(e=!1){l=setTimeout(()=>{_(`because of decode timeout`)},3e3)}function y(){l&&clearTimeout(l),l=null}function b(t,n){return{codec:t?e.VP9:e.VP8,hardwareAcceleration:n}}}})(),exports={default:workerExports};",r=>{r.error?(this._debug.warn(`WebCodecsDecoder`,r.error),t(r.error)):r.requestKeyFrame?(this._debug.debug(`WebCodecsDecoder requests key frame`),n()):(e(r.data),r.data.close())},[!0])}decodeFrame(e,t,n,r=!1){this._sendToWorker(Yr.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`WebCodecsDecoder destroyed`)}static isBrowserSupported(){return`VideoDecoder`in window&&`Worker`in window&&`VideoFrame`in window&&!E.isBrokenVP9Decoder()&&E.browserName()!==`Firefox`}},$r=class{constructor(e=null,t=0){h(this,`_counter`,0),h(this,`_interval`,0),h(this,`_lastCalculationTime`,Date.now()),h(this,`_onCalculated`,null),this._onCalculated=e,t&&(this._interval=window.setInterval(()=>this.calculate(),t))}increment(e=1){this._counter+=e}calculate(){let e=Date.now(),t=e-this._lastCalculationTime,n=Math.round(this._counter*1e3/t);return this._counter=0,this._lastCalculationTime=e,this._onCalculated?.(n),n}destroy(){window.clearInterval(this._interval),this._interval=0}},ei=class{constructor(e,t){h(this,`_participantId`,void 0),h(this,`_statAggregator`,void 0),h(this,`_firstFrameReceived`,!1),this._participantId=e,this._statAggregator=t}measure(e,t){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let n=G.getMarkNameScreenshareFirstFrame(this._participantId),r=G.measureMark(n);r!==null&&this._statAggregator?.logEventualStat({name:U.SCREENSHARE_FIRST_FRAME,value:r,width:e,height:t})}},ti=65536,ni=`MARK_SCREENSHARE_FREEZE_DURATION`,ri=class e{constructor(e,t,n,r,i,a=z){h(this,`_participantId`,void 0),h(this,`_onStream`,void 0),h(this,`_onStat`,void 0),h(this,`_onKeyFrameRequested`,void 0),h(this,`_statScreenShareFirstFrame`,void 0),h(this,`_debug`,void 0),h(this,`_chunks`,[]),this._participantId=e,this._onStream=t,this._onStat=n,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new ei(e,r),this._debug=a}appendChunk(t){let n=this._chunks.length;if(t.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),n&&(this._debug.warn(`[FrameBuilder] Cleanup buffer`,Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!n||(this._chunks[n-1].sequence+1)%ti!==t.sequence){this._debug.warn(`[FrameBuilder] Got incorrect chunk`);return}if(this._chunks.push(t),t.end){let n=this._processFrameData(),{width:r,height:i}=e.getFrameSize(n);this._processFrame({timestamp:t.timestamp,frameData:n,isVP9:t.isVP9,keyframe:t.keyframe,width:r,height:i}),this._statScreenShareFirstFrame.measure(r,i)}}destroy(){G.clearMark(ni),G.clearMark(G.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let e=this._chunks;this._chunks=[];let t=e.reduce((e,t)=>e+t.data.byteLength,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(new Uint8Array(t.data),r),r+=t.data.byteLength;return n}static getFrameSize(e){let t={width:0,height:0},n=new d.BitStream(e.buffer);n.bigEndian=!0,n.index+=2;let r=n.readBits(1),i=n.readBits(1)<<1|r;return i===3&&n.index++,n.readBits(1)===1||n.readBits(1)!==0?t:(n.index++,n.index++,n.index+=24,i>=2&&n.index++,n.readBits(3)===7?(i===1||i===3)&&n.index++:(n.index++,(i===1||i===3)&&(n.index+=3)),t.width=n.readBits(16)+1,t.height=n.readBits(16)+1,t)}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(e){if(e){G.setMark(ni);return}let t=G.measureMark(ni);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},ii=class{constructor(e){h(this,`_onStream`,void 0),this._onStream=e}async drawFrame(e){throw Error("Method `drawFrame` is not supported by this implementation")}async drawImage(e){throw Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}},ai=class extends ii{constructor(e,t=z){super(e),h(this,`_useImageBitmap`,void 0),h(this,`_canvas`,null),h(this,`_canvasContext`,null),h(this,`_stream`,null),h(this,`_track`,null),h(this,`_debug`,void 0),this._debug=t,this._debug.debug(`CanvasRenderer started`),this._useImageBitmap=`ImageBitmap`in window}_createStream(e,t){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.width=e,this._canvas.height=t,this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`0`,this._canvas.style.zIndex=`5000`,document.body.appendChild(this._canvas),this._useImageBitmap?this._canvasContext=this._canvas.getContext(`bitmaprenderer`):this._canvasContext=this._canvas.getContext(`2d`),this._stream=this._canvas.captureStream(0),this._track=this._stream.getVideoTracks()[0],this._track.contentHint=`text`)}_removeStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null,this._track=null),this._canvasContext=null;try{this._canvas&&document.body.removeChild(this._canvas)}catch{}this._canvas=null}_requestCanvasFrame(){this._track&&this._track.requestFrame?this._track.requestFrame():this._stream&&this._stream.requestFrame&&this._stream.requestFrame()}async _drawImage(e){this._track||(this._createStream(e.width,e.height),this._onStream(this._stream));let t=this._canvas;if(t.width=e.width,t.height=e.height,this._useImageBitmap){let t;if(e instanceof ImageBitmap)t=e;else{let{width:n,height:r,data:i}=e,a=n*r*4;if(i.byteLength!==a){this._debug.warn(`Bad frame buffer`,{w:n,h:r,got:i.byteLength,expected:a});return}t=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){this._debug.warn(`Canvas context is null`),t.close();return}this._canvasContext.transferFromImageBitmap(t),t.close()}else{let n=this._canvasContext;n.clearRect(0,0,t.width,t.height),n.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t=`createImageBitmap`in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),this._debug.debug(`CanvasRenderer destroyed`)}static isBrowserSupported(){return(`CanvasCaptureMediaStream`in window||`CanvasCaptureMediaStreamTrack`in window)&&!(E.browserName()===`Safari`&&Number(E.browserVersion())===15)}},oi=class extends ii{constructor(e,t=z){super(e),h(this,`_generator`,void 0),h(this,`_writer`,void 0),h(this,`_stream`,void 0),h(this,`_debug`,void 0),this._debug=t,this._debug.debug(`TrackGeneratorRenderer started`),this._generator=new MediaStreamTrackGenerator({kind:A.video}),this._writer=this._generator.writable.getWriter(),this._stream=new MediaStream([this._generator]),this._onStream(this._stream)}async drawFrame(e){await this._writer.write(e)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),this._debug.debug(`TrackGeneratorRenderer destroyed`)}static isBrowserSupported(){return`VideoFrame`in window&&`MediaStreamTrackGenerator`in window&&Qr.isBrowserSupported()}},si=class extends ri{constructor(e,t,n,r,i,a=z,o=null){super(e,t,n,r,i,a),h(this,`_renderer`,void 0),h(this,`_decoder`,void 0),h(this,`_decoderReady`,!1),h(this,`_decoderBusy`,!1),h(this,`_decoderQueue`,[]),h(this,`_fpsMeter`,void 0),h(this,`_logger`,void 0),this._logger=o,this._debug.debug(`StreamBuilder started for participant [${e}]`),this._initFpsMeter(),this._initRenderer(),this._initDecoder()}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_initFpsMeter(){this._fpsMeter=new $r(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!oi.isBrowserSupported()?this._renderer=new ai(this._onStream,this._debug):this._renderer=new oi(this._onStream,this._debug)}_initDecoder(e=!1){e||!Qr.isBrowserSupported()?this._decoder=new Zr(this._debug,this._logger):this._decoder=new Qr(this._debug,this._logger),this._decoder.init(async e=>{this._decoderBusy=!1,`VideoFrame`in window&&e instanceof VideoFrame?await this._renderer.drawFrame(e):await this._renderer.drawImage(e),this._fpsMeter.increment(),this._decodeQueue()},e=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof Qr&&typeof e==`string`&&e.includes(`EncodingError`)&&this._switchToLibVPXDecoder()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()}).catch(e=>{this._debug.warn(`StreamBuilder decoder init failed`,e),this._decoder instanceof Qr&&this._switchToLibVPXDecoder()})}_switchToLibVPXDecoder(){this._debug.warn(`StreamBuilder switch to LibVPX decoder`),this._fpsMeter&&this._fpsMeter.destroy(),this._decoder&&(this._decoderReady=!1,this._decoderBusy=!1,this._decoder.destroy()),this._renderer&&this._renderer.destroy(),this._initFpsMeter(),this._initRenderer(!0),this._initDecoder(!0)}_decodeQueue(){if(!this._decoderReady||this._decoderBusy)return;let e=this._decoderQueue.shift();e&&(this._decoderBusy=!0,this._decoder.decodeFrame(e.timestamp,e.frameData,e.isVP9,e.keyframe))}destroy(){super.destroy(),this._fpsMeter.destroy(),this._decoder.destroy(),this._renderer.destroy(),this._debug.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return ai.isBrowserSupported()||oi.isBrowserSupported()}},ci=1,li=1,ui=2,di=0,fi=1,pi=2,mi=4,hi=8;function gi(e,t,n,r,i,a,o){let s=0;t&&(s|=fi),n&&(s|=pi),r&&(s|=mi),o||(s|=hi);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,ci),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,di),l.setUint8(10,s),!o)return c;let u=new Uint8Array(c.byteLength+o.byteLength);return u.set(new Uint8Array(c),0),u.set(new Uint8Array(o),c.byteLength),u.buffer}function _i(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint16(1),i=t.getUint32(3),a=t.getUint8(7)===1,o=t.getUint16(8),s=t.getUint8(10),c=!!(s&fi),l=!!(s&pi),u=!!(s&mi),d=!!(s&hi);if(n!==ci)throw Error(`Unexpected protocol version. Got ${n}, expected ${ci}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function vi(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==ci||t.getUint8(1)!==li||t.getUint16(2)!==di)}function yi(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==ci||t.getUint8(1)!==ui||t.getUint16(2)!==di?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function bi(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,ci),n.setUint8(1,li),n.setUint16(2,e),t}var xi=2**15-1,Si=1,Ci=5,wi=5,Ti=class e{constructor(e,t=z){h(this,`_mediaSource`,void 0),h(this,`_codec`,void 0),h(this,`_sourceBuffer`,null),h(this,`_queue`,[]),h(this,`_clearBufferTill`,0),h(this,`_debug`,void 0),this._mediaSource=new MediaSource,this._codec=e,this._debug=t;let n=()=>{this._mediaSource.removeEventListener(`sourceopen`,n),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener(`sourceopen`,n,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let e=this._sourceBuffer.buffered.start(0);e<this._clearBufferTill&&(this._sourceBuffer.remove(e,this._clearBufferTill),this._debug.debug(`[WebmBuilder] SourceBuffer cleanup from ${e} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let t=this._queue;this._queue=[];let n=e._buildQueue(t);this._sourceBuffer.appendBuffer(n)}static _buildQueue(e){if(!e.length)return new Uint8Array;if(e.length===1)return f.build(e[0]);let t=e.reduce((e,t)=>e+t.countSize(),0),n=new Uint8Array(t),r=0;for(let t of e){let e=f.build(t);n.set(e,r),r+=e.byteLength}return n}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode=`sequence`,this._sourceBuffer.addEventListener(`updateend`,()=>this._handleQueue())}changeType(e){return this._codec=e,this._sourceBuffer?.changeType(e)}append(e,t=!1){this._queue.push(e),t&&this._handleQueue()}cleanup(){this._mediaSource?.readyState===`open`&&this._sourceBuffer?.abort();let e=this._sourceBuffer?.buffered,t=e?.length;if(!t)return;let n=e.start(0),r=Math.max(0,e.end(t-1)-Ci);r-n>wi&&(this._clearBufferTill=r)}destroy(){this._queue=[],this._mediaSource.readyState===`open`&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},Ei=class e extends ri{constructor(e,t,n,r,i=z){super(e,t,n,r,void 0,i),h(this,`_mediaBuffer`,null),h(this,`_video`,null),h(this,`_stream`,null),h(this,`_earliestTimestamp`,0),h(this,`_clusterStartTime`,0),h(this,`_lastFrameTimestamp`,0),this._debug.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return f.element(f.ID.EBML,[f.element(f.ID.EBMLVersion,f.number(1)),f.element(f.ID.EBMLReadVersion,f.number(1)),f.element(f.ID.EBMLMaxIDLength,f.number(4)),f.element(f.ID.EBMLMaxSizeLength,f.number(8)),f.element(f.ID.DocType,f.string(`webm`)),f.element(f.ID.DocTypeVersion,f.number(2)),f.element(f.ID.DocTypeReadVersion,f.number(2))])}static _genSegmentHeader(e,t,n){let r=f.element(f.ID.Info,[f.element(f.ID.TimecodeScale,f.number(1e6)),f.element(f.ID.MuxingApp,f.string(`vk-webm-builder`)),f.element(f.ID.WritingApp,f.string(`vk-webm-builder`))]),i=[f.element(f.ID.PixelWidth,f.number(e)),f.element(f.ID.PixelHeight,f.number(t))],a=f.element(f.ID.Tracks,f.element(f.ID.TrackEntry,[f.element(f.ID.TrackNumber,f.number(Si)),f.element(f.ID.TrackUID,f.number(Si)),f.element(f.ID.TrackType,f.number(1)),f.element(f.ID.FlagLacing,f.number(0)),f.element(f.ID.DefaultDuration,f.number(1e9)),f.element(f.ID.CodecID,f.string(`V_${n.toUpperCase()}`)),f.element(f.ID.Video,i)]));return f.unknownSizeElement(f.ID.Segment,[r,a])}static _genClusterHeader(e){return f.unknownSizeElement(f.ID.Cluster,[f.element(f.ID.Timecode,f.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new Ti(e,this._debug),this._video=document.createElement(`video`),this._video.autoplay=!0,this._video.controls=!1,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,this._video.src=URL.createObjectURL(this._mediaBuffer.mediaSource),document.body.appendChild(this._video);let t=()=>{if(this._video?.src){this._debug.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let e=this._video.seekable;e.length&&(this._video.currentTime=e.end(e.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>this._debug.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(t){let n=t.isVP9?`vp9`:`vp8`;this._mediaBuffer?this._mediaBuffer.codec!==n&&this._mediaBuffer.changeType(n):this._createVideo(n);let r=t.timestamp;if(r<=this._lastFrameTimestamp&&(r=this._lastFrameTimestamp+10,this._debug.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=r,this._earliestTimestamp)r-=this._earliestTimestamp;else{if(!t.keyframe)return;this._earliestTimestamp=r,r=0}if(t.keyframe){this._clusterStartTime=r,this._mediaBuffer?.cleanup(),this._debug.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let i=e._genWebmHeader();this._mediaBuffer?.append(i);let a=e._genSegmentHeader(t.width,t.height,n);this._mediaBuffer?.append(a)}let i=Math.round(r-this._clusterStartTime);if(i>xi&&(this._clusterStartTime=r,i=0),i===0){this._debug.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let t=e._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(t)}let a=f.element(f.ID.SimpleBlock,[f.vintEncodedNumber(Si),f.bytes(e._intToU16BE(i)),f.number(!!t.keyframe<<7),f.bytes(t.frameData)]);this._mediaBuffer?.append(a,!0)}destroy(){super.destroy(),this._video&&(this._video.onpause=null,this._video.onwaiting=null,this._video.onstalled=null,this._video.onerror=null,this._video.pause(),this._video.src=``,document.body.removeChild(this._video)),this._mediaBuffer&&(this._mediaBuffer.destroy(),this._mediaBuffer=null),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),this._debug.debug(`[WebmBuilder] destroyed for participant [${this._participantId}]`)}static isBrowserSupported(){return`captureStream`in window.HTMLVideoElement?.prototype&&window.MediaSource?.isTypeSupported(`video/webm; codecs="vp8"`)&&window.MediaSource?.isTypeSupported(`video/webm; codecs="vp9"`)}},Di=class{constructor(e,t,n,r,i,a=null,o=z,s=null){h(this,`_datachannel`,void 0),h(this,`_participantIdRegistry`,null),h(this,`_streamBuilders`,{}),h(this,`_onStream`,()=>{}),h(this,`_onEos`,()=>{}),h(this,`_onStat`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),this._debug=o,this._logger=s,this._statAggregator=a,this._debug.debug(`ScreenCaptureReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._onStream=n,this._onEos=r,this._onStat=i,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}_onDataChannelMessage(e){let t=_i(e),n=this._participantIdRegistry?.getStreamDescription(t.ssrc)?.participantId;if(!n){this._debug.warn(`Participant id for ssrc ${t.ssrc} not found in registry`);return}if(t.eos){this.close(n),this._onEos(n);return}let r=this._streamBuilders[n];if(!r){let e=e=>this._onStream(n,e);r=N.screenShareWebmBuilder&&Ei.isBrowserSupported()?new Ei(n,e,this._onStat,this._statAggregator,this._debug):new si(n,e,this._onStat,this._statAggregator,()=>{this._requestKeyFrame(t.ssrc)},this._debug,this._logger),this._streamBuilders[n]=r}r.appendChunk(t)}_requestKeyFrame(e){if(!(!this._datachannel||this._datachannel.readyState!==`open`))try{let t=bi(e);this._datachannel.send(t),this._debug.debug(`ScreenCaptureReceiver request for keyframe for ssrc ${e}`)}catch(e){this._debug.warn(`Failed to send keyframe request`,e)}}close(e){let t=this._streamBuilders[e];t&&(t.destroy(),delete this._streamBuilders[e])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(e=>e.destroy()),this._streamBuilders={},this._participantIdRegistry=null,this._debug.debug(`ScreenCaptureReceiver destroyed`)}},Oi=class{constructor(e,t,n){h(this,`_prev`,void 0),h(this,`_next`,void 0),h(this,`_data`,void 0),this._next=n,n&&(n.prev=this),this._prev=t,t&&(t.next=this),this._data=e}get prev(){return this._prev}set prev(e){this._prev=e}get next(){return this._next}set next(e){this._next=e}get data(){return this._data}},ki=class{constructor(){h(this,`_head`,null),h(this,`_tail`,null),h(this,`_length`,0)}get length(){return this._length}push(...e){for(let t of e)this._tail=new Oi(t,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(e){this._tail&&(this._tail.next=e._head),this._head||(this._head=e._head),this._tail=e._tail,this._length+=e._length,e.clear()}shift(){if(!this._length||!this._head)return null;let e=this._head;return this._head=e.next,this._head&&(e.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),e.data}bisect(){if(this.length){let e=this.length>1?Math.floor(this.length/2):1;for(let t=0;t<e;t++)this.shift()}}head(){return this._head?.data||null}tail(){return this._tail?.data||null}clear(){this._head=null,this._tail=null,this._length=0}toString(){let e=[],t=this._head;for(;t!==null;)e.push(t.data),t=t.next;return e.length?JSON.stringify(e,(e,t)=>t instanceof Error?String(t):t):``}},Ai=1e3,ji=class extends Xr{constructor(e,t,n,r,i=z,a=null){super(i,a),h(this,`_sourceTrack`,void 0),h(this,`_onFrame`,void 0),h(this,`_useCongestionControl`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_useImageCapture`,void 0),h(this,`_video`,null),h(this,`_imageCapture`,null),h(this,`_canvas`,null),h(this,`_canvasCtx`,null),h(this,`_frameReadTimeout`,0),h(this,`_lastFrame`,null),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useImageCapture=`ImageCapture`in window&&ImageCapture.prototype.grabFrame!==void 0&&`ImageBitmap`in window,(e.readyState!==`live`||!e.enabled||e.muted)&&(this._useImageCapture=!1)}_createDom(){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`160px`,this._canvas.style.zIndex=`5000`,this._canvasCtx=this._canvas.getContext(`2d`),document.body.appendChild(this._canvas)),!this._video&&!this._useImageCapture&&(this._video=document.createElement(`video`),this._video.controls=!1,this._video.autoplay=!1,this._video.preload=`auto`,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,document.body.appendChild(this._video))}_removeDom(){try{this._canvas&&document.body.removeChild(this._canvas),this._video&&document.body.removeChild(this._video)}catch{}this._canvasCtx=null,this._canvas=null,this._video=null}async _createStream(e){if(!this._canvas)throw Error(`Canvas not found`);if(!this._video&&!this._useImageCapture)throw Error(`Video element not found`);return new Promise((t,n)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let r=this._video;r.srcObject=new MediaStream([e]),r.onloadeddata=e=>t(),r.onerror=()=>n(Error(`Video element error`));let i=r.play(),a=()=>n(Error(`Autoplay is disabled`));i?i.catch(a):a()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw Error(`Fatal error`);this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw Error(`Destroyed`);return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw Error(`Destroyed`);let t=e.width,n=e.height;return this._canvas.width=t,this._canvas.height=n,this._canvasCtx.clearRect(0,0,t,n),this._canvasCtx.drawImage(e,0,0,t,n),this._canvasCtx?.getImageData(0,0,t,n)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;this._debug.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createStream(this._sourceTrack),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n,r,i)=>{let a;function o(o,s){return t({locateFile:n}).then(t=>{if(a=new t.VpxEncoder,a.debug(s),!a.init(o?t.VpxType.VP9:t.VpxType.VP8))throw self.postMessage({type:e.LOG_ERROR,message:`encoder-init-fail-libvpx`}),Error(`LibVPxEncoder failed to create`);if(r){let e=Math.round(i/1e3);a.setTargetBitrate(e)}else a.setMaxQuantizer(10),a.setTargetBitrate(1024)})}function s(t,n,r,i){let o=a.allocateImage(t,n);if(!o){self.postMessage({type:e.FRAME,error:`No buffer data`});return}o.set(new Uint8Array(r));let s=Math.round(performance.now());if(!a.encode(s,150,i)){self.postMessage({type:e.FRAME,error:`Encode failed`});return}let c=a.readFrame();if(!c){self.postMessage({type:e.FRAME,error:`No encoded data`});return}a.readFrame()&&(self.postMessage({type:e.DEBUG,message:`LibVPxEncoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxEncoder-drop`}));let l=new Uint8Array(c.byteLength);l.set(c),self.postMessage({type:e.FRAME,frameType:i?`key`:`delta`,timestamp:s,duration:150,width:t,height:n,data:l.buffer},[l.buffer])}function c(e,t){let n=Math.round(e/1e3);a.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case e.INIT:o(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:e.READY})).catch(t=>self.postMessage({type:e.ERROR,error:String(t)}));break;case e.FRAME:s(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case e.SET_BITRATE:c(t.data.bitrate,t.data.useCbr);break}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[u.default,u.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:z.enabled()})}_encode(e,t){let n=e.data.buffer;this._sendToWorker(Yr.FRAME,{width:e.width,height:e.height,imageData:n,keyFrame:t},[n])}_requestFrameVideo(e){let t=this._drawFrameVideo();this._encode(t,e)}_requestFrameBitmap(e){window.clearTimeout(this._frameReadTimeout),this._frameReadTimeout=window.setTimeout(()=>{if(this._lastFrame){let t=this._drawFrameData(this._lastFrame);this._encode(t,e)}else this._onFrame(null)},Ai),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let n=this._drawFrameData(t);this._encode(n,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,n){this._sendToWorker(Yr.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},Mi=class extends Xr{constructor(e,t,n,r,i,a,o=z,s=null){super(o,s),h(this,`_sourceTrack`,void 0),h(this,`_trackProcessor`,void 0),h(this,`_onFrame`,void 0),h(this,`_useCongestionControl`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_useCbr`,void 0),h(this,`_frameRate`,void 0),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useCbr=i,this._frameRate=a,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,n=this._trackProcessor.readable;this._debug.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return()=>{let n,r,i,a,o,s,c=null,l=0,u=!1,d=0,f,p,m=!1,h=!1,g=null;function _(e){return e instanceof Error?[e.name,e.message,e.stack].filter(Boolean).join(`: `):String(e)}function v(e,n){try{self.postMessage({type:t.FRAME,error:`WebCodecsEncoder ${e} failed: ${_(n)}`})}catch{}}function y(e,n){try{self.postMessage({type:t.ERROR,error:`WebCodecsEncoder ${e} failed: ${_(n)}`})}catch{}}function b(e){try{n=e.readable,r=n.getReader(),i=e.width,a=e.height,o=e.isVP9,s=e.framerate,f=e.useCongestionControl,p=e.maxBitrate,f&&(d=p,m=e.useCbr),T(),C(),self.postMessage({type:t.READY})}catch(e){y(`init`,e)}}function x(e){e&&!h&&(h=!0),self.clearTimeout(l),l=self.setTimeout(()=>{c&&S(c,h)},1e3),!u&&(u=!0,r.read().finally(()=>{u=!1,self.clearTimeout(l)}).then(({done:e,value:t})=>{if(c?.close(),c=null,!(e||!t)){if(!g){r.releaseLock(),n.cancel();return}c=t,S(t,h)}}).catch(e=>{v(`read`,e)}))}function S(e,t){try{let n=e.codedWidth!==i||e.codedHeight!==a;n&&(i=e.codedWidth,a=e.codedHeight,t=!0),!g||g.state===`closed`?(T(),C()):n&&C(),g?.encode(e,{keyFrame:t}),t&&(h=!1)}catch(e){g&&g.state===`closed`&&(g=null),v(`encode`,e)}}function C(){if(!g)throw Error(`encoder is not initialized`);let t={framerate:s,codec:o?e.VP9:e.VP8,width:i,height:a,latencyMode:`realtime`,bitrateMode:m?`constant`:`variable`};d>0&&(t.bitrate=d),g.configure(t)}function w(e,t,n){try{d=e,m=t,s=n,(!g||g.state===`closed`)&&T(),C()}catch(e){v(`setBitrate`,e)}}function T(){g=new VideoEncoder({output:e=>{try{let n;e.data?n=e.data:(n=new ArrayBuffer(e.byteLength),e.copyTo(n)),self.postMessage({type:t.FRAME,frameType:e.type,timestamp:e.timestamp,duration:e.duration,width:i,height:a,data:n},[n])}catch(e){v(`output`,e)}},error:e=>{g&&g.state===`closed`&&(g=null),v(`codec`,e)}})}self.onmessage=e=>{try{switch(e.data.type){case t.INIT:b(e.data);break;case t.FRAME:x(e.data.keyFrame);break;case t.SET_BITRATE:w(e.data.bitrate,e.data.useCbr,e.data.fps);break}}catch(e){v(`message`,e)}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[],{readable:n,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[n])}requestFrame(e=!1){this._sendToWorker(Yr.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(Yr.SET_BITRATE,{bitrate:e,useCbr:t,fps:n})}isVP9(){return!0}destroy(){this._removeWorker(),this._debug.debug(`WebCodecsEncoder destroyed`)}static isBrowserSupported(){return`VideoEncoder`in window&&`Worker`in window&&`EncodedVideoChunk`in window&&`MediaStreamTrackProcessor`in window}},Ni=2100,Pi=600,Fi=1.2,Ii=.8,Li=2e3,Ri=8e3,zi=8e3,Bi=16e3,Vi=4,Hi=2e3,Ui=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(Ui||{}),Wi=class{constructor(e,t,n,r,i,a,o,s=z){h(this,`_onCongestion`,void 0),h(this,`_ccEnabled`,void 0),h(this,`_fastSharing`,void 0),h(this,`_trendDelayThreshold`,void 0),h(this,`_highDelayThreshold`,void 0),h(this,`_targetFps`,void 0),h(this,`_minBitrate`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_targetBitrate`,void 0),h(this,`_lastDown`,void 0),h(this,`_lastUp`,void 0),h(this,`_lastProbing`,void 0),h(this,`_lastCheckDelay`,void 0),h(this,`_upPenalty`,0),h(this,`_probing`,void 0),h(this,`_delayAvgShort`,-1),h(this,`_delayAvgLong`,-1),h(this,`_minDelay`,Number.MAX_VALUE),h(this,`_maxDelay`,0),h(this,`_largeDelayDuration`,0),h(this,`_lastFpsCalcMs`,void 0),h(this,`_frames`,0),h(this,`_fps`,0),h(this,`_debug`,void 0),this._onCongestion=e,this._ccEnabled=r,this._debug=s,this._minBitrate=t,this._maxBitrate=n,this._fastSharing=i,this._targetFps=o,a>0?this._highDelayThreshold=a:this._highDelayThreshold=Ni,i&&(this._highDelayThreshold=Pi),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let c=Date.now();this._lastDown=0,this._lastUp=c,this._lastProbing=c,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(e,t,n){let r=Date.now();if(this._calcFps(r),this._calcDelay(t,r),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let i=0,a=this._delayAvgShort-this._delayAvgLong,o=Math.round(Math.abs(a)*100/this._delayAvgLong),s=a>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,c=this._delayAvgShort>this._highDelayThreshold;s||c?i=2:Math.abs(a)<40&&o<10&&!c&&(i=1);let l=Math.round(this._targetBitrate/1e3),u=n;e%20==0&&this._debug.debug(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Ui[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>Li){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Vi),this._probing=!1);let n=Ii*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*Ii),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*zi/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Ui[i]}`),this._debug.log(`#${e}: cc: DOWN delay=${t} bitrate=${u} target=${l} -> newBitrate=${r} penalty=${s}s`),this._setBitrate(n,!0),this._targetBitrate=n}this._lastDown=r}let f=r-this._lastUp,p=Ri+this._upPenalty*zi;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*Fi,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*zi/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Ui[i]}`),this._debug.log(`#${e}: cc: UP bitrate=${u} target=${c} -> newBitrate=${s} penalty=${l}s`),this._setBitrate(n,!1),this._targetBitrate=n,this._probing=!0,this._lastProbing=r,this._lastUp=r}}let m=r-this._lastProbing;this._probing&&m>Bi&&(this._probing=!1);let ee=r-this._lastDown;this._upPenalty>0&&ee>3*p&&(this._debug.log(`#${e}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(e,t){this._fastSharing&&(t=!0);let n=this._targetFps;this._fps>0&&(n=this._fps),this._onCongestion(e,t,n)}_calcDelay(e,t){if(!(e<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=e,this._delayAvgLong=e),this._delayAvgShort=Math.round((this._delayAvgShort*3+e)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+e)/24),e>0&&e<this._minDelay?this._minDelay=e:e>this._maxDelay&&(this._maxDelay=e),this._lastCheckDelay===0&&(this._lastCheckDelay=t),e>Hi){let e=t-this._lastCheckDelay;this._largeDelayDuration+=e}this._lastCheckDelay=t}}reconfigure(e,t){this._minBitrate=e,this._maxBitrate=t}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let e={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,e}_calcFps(e){this._frames++;let t=e-this._lastFpsCalcMs;if(t>5e3){this._lastFpsCalcMs=e;let n=this._fps,r=this._frames*1e3/t;this._fps===0?this._fps=Math.round(r):this._fps=Math.round((this._fps*3+r)/4),this._frames=0,this._fps!==n&&this._debug.log(`cc: fps=${this._fps}`)}}},Gi=class{constructor(e){h(this,`_maxSize`,void 0),h(this,`_size`,0),h(this,`_buffer`,void 0),h(this,`_head`,0),h(this,`_tail`,0),this._maxSize=e,this._buffer=Array(e)}add(e,t,n,r,i){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let a=this._tail;return this._buffer[this._tail]={seq:e,ts:t,size:n,sent:Date.now(),start:r,end:i,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,a}update(e,t){let n=this.get(e);return n===null?null:(n.ts2=t,n.recv=Date.now(),n)}get(e){let t=this._head;for(let n=0;n<this._maxSize;n++){let n=this._buffer[t];if(e===n?.seq)return n;if(t=++t%this._maxSize,t===this._tail)break}return null}getServerBitrateK(e){let t=0,n=0,r=-1,i=-1,a=this._tail;for(let t=0;t<this._maxSize;t++){a>0?--a:a=this._maxSize-1;let t=this._buffer[a];if(!t||(i===-1&&(i=t.ts2,n=0),i>=0&&(n+=t.size),r=t.ts2,i-r>=e)||a===this._head)break}if(r>=0&&i>=0){let e=i-r;t=Math.round(e>0?n*8/e:0)}return t}getCurrentDelay(){let e=this._tail;for(let t=0;t<this._maxSize;t++){e>0?--e:e=this._maxSize-1;let t=this._buffer[e];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(e===this._head)break}return 0}getMaxBandwidth(){let e=0,t=0,n=-1,r=-1,i=this._tail;for(let a=0;a<this._maxSize;a++){i>0?--i:i=this._maxSize-1;let a=this._buffer[i];if(a){if(r===-1&&a.end&&!a.start&&(r=a.ts2,t=0),n===-1&&r>=0&&a.start&&!a.end&&(n=a.ts2),n>=0&&r>=0){let i=r-n;e=i>0?t*8/i:0;break}if(r>=0&&(t+=a.size),i===this._head)break}}return Math.round(e)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}},Ki=65536,qi=50,Ji=400,Yi=1e6,Xi=3e5,Zi=3e4,Qi=2e3,$i=5,ea=0,ta=class{constructor(e,t,n,r,i=z,a=null){h(this,`_encoder`,void 0),h(this,`_datachannel`,void 0),h(this,`_signaling`,void 0),h(this,`_fastSharing`,void 0),h(this,`_destroyed`,!1),h(this,`_needKeyframe`,!0),h(this,`DATA_SIZE`,void 0),h(this,`_congestionControl`,void 0),h(this,`_frameNum`,0),h(this,`_width`,void 0),h(this,`_height`,void 0),h(this,`_feedback`,new Gi(1024)),h(this,`_lastSentFrameSeq`,0),h(this,`_lastDeliveredFrameSeq`,0),h(this,`_lastFrameDelay`,0),h(this,`_lastFramerateReduced`,Date.now()),h(this,`_lastSharingStat`,Date.now()),h(this,`_congestionControlEnabled`,void 0),h(this,`_queue`,new ki),h(this,`_fpsMeter`,void 0),h(this,`_maxFrameDelay`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._debug=i,this._logger=a,this._debug.debug(`ScreenCaptureSender started`),this.DATA_SIZE=N.consumerScreenDataChannelPacketSize-11,this._datachannel=t,this._signaling=n,this._fastSharing=r,this._congestionControlEnabled=N.screenShareCongestionControl||this._fastSharing,this._width=e.getSettings().width,this._height=e.getSettings().height,this._maxFrameDelay=this._fastSharing?N.screenShareCongestionControlThreshold:N.screenShareCongestionControlThreshold*2;let o=N.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),l=this._onCongestionCallback.bind(this);this._debug.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${N.screenShareCongestionControlThreshold}`),this._congestionControl=new Wi(l,s,c,this._congestionControlEnabled,this._fastSharing,N.screenShareCongestionControlThreshold,o,this._debug);let u=(e,t)=>{if(this._destroyed)return;if(!e){this._debug.warn(`requestFrame failed, keyFrame: `+this._needKeyframe,t),this._needKeyframe=!0,this._handleQueue();return}(e.width!==this._width||e.height!==this._height)&&(this._width=e.width,this._height=e.height,this._onResize(this._width,this._height));let n=this._sliceFrame(e);this._queue.merge(n),this._handleQueue(),this._sendSharingStat()};if(Mi.isBrowserSupported()){let t=this._fastSharing;this._encoder=new Mi(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new ji(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{vi(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=yi(e.data);t!==null&&this._checkCcFeedback(t)},this._encoder.init().then(()=>this._handleQueue()).catch(e=>this._debug.warn(`ScreenCaptureSender init failed`,e)),this._fpsMeter=new $r(e=>this._debug.log(`[ScreenCaptureSender] fps: ${e}`),5e3)}_handleQueue(){if(this._destroyed)return;let e=this._queue.shift();if(!e){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Ki)%Ki>$i&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>Qi&&(this._lastFramerateReduced=e,this._debug.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(e)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),M.setImmediate(()=>this._handleQueue());return}if(e.isLast){this._frameNum++,this._fpsMeter.increment(),e.isKey&&this._debug.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(e.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),n=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,n)}else M.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let e=this._queue.head();for(;e;){if(e.isFirst&&e.isKey)return!0;this._queue.shift(),e=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(e){let t=e.type===`key`,n=e.data.byteLength,r=new ki;for(let i=0;i<n;i+=this.DATA_SIZE){let a=e.data.slice(i,i+this.DATA_SIZE),o=i===0,s=n<=i+a.byteLength,c=this._wrapHeader(e.timestamp,o,s,t,a);r.push({data:c.data,sequence:c.sequence,frameSize:n,isFirst:o,isLast:s,isKey:t,timestamp:e.timestamp})}return r}_wrapHeader(e,t,n,r,i){let a=gi(e,t,n,r,ea,this._encoder.isVP9(),i),o={sequence:ea,data:a};return ea=(ea+1)%Ki,o}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(e){if(!this._datachannel||this._datachannel.readyState!==`open`)return!1;try{return this._datachannel.send(e.data),this._feedback.add(e.sequence,e.timestamp,e.data.byteLength,e.isFirst,e.isLast),e.isLast&&(this._lastSentFrameSeq=e.sequence),!0}catch(e){return this._debug.warn(`Error sending chunk to DataChannel`,e),!1}}destroy(){this._queue.clear(),this._fpsMeter.destroy(),this._datachannel.onmessage=null,this._feedback.clear(),this._datachannel.readyState===`open`&&this._datachannel.send(this._stopPacket()),this._destroyed=!0,this._encoder.destroy(),this._debug.debug(`ScreenCaptureSender destroyed`)}static isBrowserSupported(){return Mi.isBrowserSupported()||ji.isBrowserSupported()}_onCongestionCallback(e,t,n){this._encoder.setBitrate(e,t,n)}_onResize(e,t){let{minBitrate:n,maxBitrate:r}=this._calcMinMaxBitrate(e,t),i=Math.round(n/1e3),a=Math.round(r/1e3);this._debug.log(`cc: resize to ${e}x${t}, minBitrate=${i} maxBitrate=${a}`),this._congestionControl.reconfigure(n,r)}_calcMinMaxBitrate(e,t){(e===void 0||e<640)&&(e=640),(t===void 0||t<360)&&(t=360);let n=e*t/256;return{minBitrate:Math.max(Xi,Math.min(Yi,Math.round(n*qi))),maxBitrate:Math.round(n*Ji)}}_checkCcFeedback(e){let t=this._feedback.update(e.seq,e.ts2);if(t===null)this._debug.debug(`cc: update failed, seq=${e.seq}`);else if(t.end){this._lastDeliveredFrameSeq=t.seq;let e=t.recv-t.sent;e>0&&(this._lastFrameDelay=e),this._handleQueue()}}_sendSharingStat(){let e=Date.now();if(e-this._lastSharingStat>Zi){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t).catch(e=>{e instanceof xn||this._debug.warn(`Unable to send sharing stats`,e)})),this._lastSharingStat=e}}},na=90,ra=4294967295,ia=class e extends kr{constructor(e,t,n,r=z,i=null,a=null,o=null,s=null){super(e,t,s),h(this,`_producerNotification`,null),h(this,`_producerCommand`,null),h(this,`_producerScreen`,null),h(this,`_consumerScreen`,null),h(this,`_asr`,null),h(this,`_animojiDataChannel`,null),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_isOpen`,!1),h(this,`_observer`,!1),h(this,`_reconnectionPrevented`,!1),h(this,`_statInterval`,null),h(this,`_settingsInterval`,null),h(this,`_monitorRtpShareInterval`,null),h(this,`_statBytes`,{}),h(this,`_ssrcMap`,{}),h(this,`_ssrcMapUpdated`,!1),h(this,`_perfStatReporter`,void 0),h(this,`_producerOfferIsProcessing`,!1),h(this,`_producerNextOffer`,null),h(this,`_producerNextSessionId`,null),h(this,`_lastStat`,null),h(this,`_serverSettings`,void 0),h(this,`_prevConsumerSettings`,{}),h(this,`_prevConsumerFastSharingSettings`,{}),h(this,`_asrTrack`,null),h(this,`_captureSender`,null),h(this,`_captureReceiver`,null),h(this,`_participantIdRegistry`,null),h(this,`_disabledSenders`,new Set),h(this,`_rtpReceiversByStreamId`,{}),h(this,`_producerSessionId`,``),h(this,`_newAudioShareTrack`,null),h(this,`_simulcastInfo`,null),h(this,`_isSimulcastNegotiated`,!1),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),this._debug=r,this._logger=i,this._statAggregator=a,this._codecStatsAggregator=o,this.subscribe(this._signaling,K.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=n,this._debug.debug(`ServerTransport: Created`)}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!==J.IDLE&&e!==J.CLOSED&&e!==J.FAILED&&this._startStatInterval()}open(e=!1){if(this._isOpen){this._debug.log(`ServerTransport: Already opened connections`);return}this._isOpen=!0,this._observer=e,this._openConnection()}close(e){this._isOpen&&(this._isOpen=!1,this._closeConnection(),this.unsubscribe(),e?(this._debug.error(`ServerTransport: Closed`,e),this._setState(J.FAILED)):(this._debug.debug(`ServerTransport: Closed`),this._setState(J.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){Cr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(N.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,this._participantIdRegistry&&e.setParticipantIdRegistry(this._participantIdRegistry),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}async onCameraResolutionChanged(){this._isSimulcastNegotiated&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new la(this,this._signaling,this._statAggregator,!1,this._debug)}_closeConnection(){this._disposeFirstMediaSentProbe(),this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcastInfo=null,this._isSimulcastNegotiated=!1,this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,e._closeDataChannel(this._producerNotification),e._closeDataChannel(this._producerCommand),e._closeDataChannel(this._producerScreen),e._closeDataChannel(this._consumerScreen),e._closeDataChannel(this._asr),e._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent(X.PEER_CONNECTION_CLOSED)}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{ordered:!0});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)},r.onerror=e=>{let n=e.error;this._debug.error(`[${t}] data channel error`,n?.errorDetail,n?.message)}}_openConnection(e=!1){this._debug.debug(`ServerTransport: Open single connection`);try{this._pc=new RTCPeerConnection}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=M.debounce(e=>{this._pc&&this._onConnectionStateChange(this._pc,e)},500),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Jr(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,vr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,vr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,vr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),N.asrDataChannel&&this._createDataChannel(this._pc,vr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new Gr(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),N.vmoji&&this._createDataChannel(this._pc,vr.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(e),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(e),this._animojiSender?.setProtocolVersion(N.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(e){this._debug.error(`ServerTransport: Unable to add media source tracks`,e),this._logger?.log(w.ERROR,`addTrack-single`),this.close(e);return}this._startFirstMediaSentProbe(),this._createDataChannel(this._pc,vr.consumerScreenShare,e=>{this._consumerScreen=e,this._consumerScreen.binaryType=`arraybuffer`;let t=this._mediaSource.getScreenTrack();t&&(!N.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(t)}),e||this._allocateConsumer(),this._setState(J.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==J.OPENED&&(this._setState(J.RECONNECTING),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent(X.SIGNALLED_ACTIVE_PARTICIPANTS,e)}_signalStalledParticipants(e){this._triggerEvent(X.SIGNALLED_STALLED_PARTICIPANTS,e)}_signalSpeakerChanged(e){this._triggerEvent(X.SIGNALLED_SPEAKER_CHANGED,e)}_signalNetworkStatus(e){this._triggerEvent(X.NETWORK_STATUS,e)}_updateSSRCMap(e){e&&e.sdp.split(`
15
- `).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Ur.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Ur.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.mediaSettings;!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new ta(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled,this._debug,this._logger))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Di(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent(X.REMOTE_STREAM_SECOND,e,t)},e=>{this._triggerEvent(X.REMOTE_STREAM_SECOND,e,null)},e=>{this._triggerEvent(X.SCREEN_SHARING_STAT,e)},this._statAggregator,this._debug,this._logger))}_removeCaptureReceiver(){this._captureReceiver?.destroy(),this._captureReceiver=null}_applyConsumerSettings(){let e=this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{if(!n.track||n.track.kind!==A.video||n.track.contentHint===`motion`)return;let r=!this._disabledSenders.has(n),i=e.maxDimension!==0;if(r&&!i){this._debug.log(`Disabling video upload`),this._disabledSenders.add(n),n.replaceTrack(E.getBlackMediaTrack()).catch(e=>{this._debug.error(`Could not disable video upload`,e)});return}let a=this._mediaSource.getSendVideoTrack();if(!r&&i&&a){this._debug.log(`Enabling video upload`),this._disabledSenders.delete(n);let e=n.track;e.enabled=a.enabled,n.replaceTrack(a).then(()=>e.stop()).catch(e=>{this._debug.error(`Could not enable video upload`,e)})}M.applyVideoTrackSettings(e,n,a??n.track,this._prevConsumerSettings,t,this._debug)}),this._prevConsumerSettings=t}if(this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&N.consumerFastScreenShare){let e=this._serverSettings.fastScreenSharing;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{!n.track||n.track.kind!==A.video||n.track.contentHint!==`motion`||M.applyVideoTrackSettings(e,n,n.track,this._prevConsumerFastSharingSettings,t,this._debug)}),this._prevConsumerFastSharingSettings=t}}}_onScreenSharingStatus(e){e.track?(!N.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent(X.STATE_CHANGED,e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(e=>{this._reportStats(e),this._detectStaleTracks(e),this._codecStatsAggregator?.reportUsage(e)}).catch(()=>{}),this._statInterval=window.setTimeout(e,N.statisticsInterval)};this._statInterval=window.setTimeout(e,N.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await G.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent(X.REMOTE_DATA_STATS,{inbound:{topology:Y.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`inbound-rtp`)},outbound:{topology:Y.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:Y.SERVER,transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(e=>e.type===`inbound-rtp`&&e.kind===`audio`&&this._ssrcMap[e.ssrc]===`mix`);if(!t)return;let n=Ur.AUDIO_MIX,r=this._statBytes[n],i=!1;if(r){let e=t.bytesReceived-r.bytesReceived;e>=0&&e<=5&&(i=!0),r.stalled!==i&&this._triggerEvent(X.AUDIO_MIX_STALL,i)}this._statBytes[n]={bytesReceived:t.bytesReceived,stalled:i}}_allocateConsumer(){if(!this._signaling.ready)return;let e=ha.get();!N.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e).catch(e=>{e instanceof xn||this._debug.warn(`ServerTransport: Unable to allocate consumer`,e)})}async _processOffer(e,t){if(!this._pc)throw Error(`Interrupt allocation`);let n=N.simulcast;try{await this._pc.setRemoteDescription(e)}catch(e){throw this._debug.error(`[single] unable to set remote offer`,e),this._logger?.log(w.ERROR,`setRemoteDescription-single`),e}let r=this._findFirstSimTransceiver();if(N.simulcast)if(r){this._debug.log(`_processOffer: caps.simulcast=${N.simulcast} mid=${r.mid} dir=${r.direction}`);let e=this._mediaSource.getStream();this._isSimulcastNegotiated=await this._setupSimulcastTransceiver(e,r),this._debug.log(`_processOffer: simulcastInfo`,this._isSimulcastNegotiated),this._isSimulcastNegotiated||(this._debug.log(`_processOffer: simulcast transceiver not found in server offer mid=${r.mid}, disable simulcast`),n=!1)}else this._debug.log(`_processOffer: simulcast transceiver not found in server offer, disable simulcast`),n=!1;let i;try{if(await this._handleTracks(),this._debug.debug(`[single] create local answer`),!this._pc)throw Error(`Interrupt allocation`);i=await this._pc.createAnswer()}catch(e){throw this._debug.error(`[single] unable to create answer`,e),this._logger?.log(w.ERROR,`createAnswer-single`),e}try{if(!this._pc)throw Error(`Interrupt allocation`);i.sdp=M.patchLocalSDP(i.sdp,!1,E.isBrokenH264Decoder(),!1),this._debug.debug(`[single] set local answer`,{answer:i}),await this._pc.setLocalDescription(i)}catch(e){throw this._debug.error(`[single] unable to set local answer`,e),this._logger?.log(w.ERROR,`setLocalDescription-single`),e}if(n&&r){i.sdp=M.patchSimulcastAnswerSdp(i.sdp,r,Zt.WIDTH,Zt.HEIGHT);for(let e of this._pc.getTransceivers())e.mid===null&&e.stop()}try{this._debug.debug(`[single] transmit local answer`,{answer:i}),this._updateSSRCMap(e),await this._signaling.acceptProducer(i,Object.keys(this._ssrcMap),t),this._debug.debug(`[single] remote offer has been processed`)}catch(e){this._debug.warn(`[single] unable to send local answer`,e),this._logger?.log(w.ERROR,`acceptProducer`)}n&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!==A.video)continue;let n=e.sender.getParameters();if(!(!n.encodings||n.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return!1;t.direction=`sendonly`;let n=e.getVideoTracks()[0];await t.sender.replaceTrack(n),t.sender.setStreams(e);let r=t.sender.getParameters();if(!r.encodings||r.encodings.length<=1)return this._debug.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(r.encodings)}`),!1;let i=rn(Zt.WIDTH,Zt.HEIGHT,this._serverSettings.camera?.bitrates?.generic),a=0,o=1;for(let e of r.encodings)e.scalabilityMode=Qt,e.active=!0,a>=i.streams.length?e.maxBitrate=0:e.maxBitrate=i.streams[a].bitrate,e.scaleResolutionDownBy=o,o*=2,a++;await t.sender.setParameters(r);let s=n.getSettings();return this._debug.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${s.width}x${s.height} encodings=${JSON.stringify(r.encodings)}`),!0}async _acceptProducer(e,t){if(this._producerOfferIsProcessing){this._producerNextOffer=e,this._producerNextSessionId=t,this._debug.debug(`[single] wait until other remote offer is processed`);return}this._producerOfferIsProcessing=!0;let n={type:`offer`,sdp:M.patchRemoteSDP(e,!1,!1,!1,E.isBrokenVP9Encoder(),E.isBrokenVP9Decoder())};if(this._debug.debug(`[single] set remote offer`,{offer:n}),!this._pc)throw Error(`Interrupt allocation`);try{if(await this._processOffer(n,t),this._producerOfferIsProcessing=!1,this._producerNextOffer&&this._producerNextSessionId){this._debug.debug(`[single] there is other unprocessed remote offer, process it`);let e=this._producerNextOffer,t=this._producerNextSessionId;this._producerNextOffer=null,this._producerNextSessionId=null,await this._acceptProducer(e,t)}}catch(e){this.close(e)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===A.video);if(!e||!e.sender){this._debug.warn(`Cannot find screenshare transceiver`);return}try{e.direction=`sendonly`,await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===A.audio);if(!e||!e.sender){this._debug.warn(`Cannot find audioshare transceiver`);return}e.sender.track!==null&&this._debug.warn(`Unexpected track assigned to audioshare`);try{e.direction=`sendonly`,await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(w.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case q.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case q.REALLOC_CON:this._reconnect();break;case q.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case q.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case q.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case q.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent(X.ASR_TRANSCRIPTION,e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),N.breakVideoPayloadTypes&&(this._debug.log(`test mode enabled, video switched off`),this._signaling.requestTestMode(`breakVideoPayloadTypes`,null).catch(e=>{e instanceof xn||this._debug.warn(`Unable to enable signaling test mode`,e)})),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description,e.sessionId)}_onAddTrack(e,t){this._debug.debug(`[single] remote track (added)`,{track:t.track});let n=t.streams[0];n?(n.onremovetrack||(n.onremovetrack=e=>{this._triggerEvent(X.REMOTE_TRACK_REMOVED,n.id,n,e.track)}),n.getTracks().find(e=>e.id===t.track.id)||(this._debug.warn(`[single] remote track missing from stream, re-adding`,{streamId:n.id,trackId:t.track.id}),this._logger?.log(w.ERROR,`ontrack-empty-stream`),n.addTrack(t.track)),this._rtpReceiversByStreamId[n.id]=t.receiver,this._triggerEvent(X.REMOTE_TRACK_ADDED,n.id,n,t.track)):this._debug.error(`[single] unable to get media stream from track event`)}_onSignalingStateChange(e,t){this._debug.debug(`[single] signaling state changed`,{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(this._debug.debug(`[single] connection state changed`,{state:e.connectionState},t),this._logger?.log(w.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect();break;case`connecting`:let t=this.getState();t===J.IDLE||t===J.OPENED?this._setState(J.CONNECTING):e.iceConnectionState===`checking`&&this._setState(J.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(J.RECONNECTING);break;case`connected`:this._setState(J.CONNECTED),M.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(this._logger?.log(w.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))});break}}_onReplacedTrack(e,t){if(this._pc){this._debug.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let n=(e,t)=>{e.replaceTrack(t).catch(e=>{this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(w.ERROR,`replaceTrack-single`)})};if(this._debug.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),this._isSimulcastNegotiated&&e.kind===A.video){let t=this._pc?.getTransceivers().find(t=>t.direction===`sendonly`&&t.sender?.track?.kind===A.video&&t.sender.track.contentHint===e.contentHint)?.sender;t?.track?(n(t,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):this._debug.warn(`_onReplacedTrack: simulcast video transceiver not found`)}else{let t=this._pc?.getSenders().find(t=>t.track&&t.track.kind===e.kind&&!this._disabledSenders.has(t)&&t.track.contentHint===e.contentHint);t?.track?n(t,e):e.kind===A.audio&&e.contentHint===`music`&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e===A.screen&&N.consumerFastScreenShare&&this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`noConnection`),this._debug.error(`Cannot get stream waiting time, peer connection is not initialized`),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`oldBrowser`),this._debug.error(`Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported`),0;let n=this._rtpReceiversByStreamId[e];if(!n)return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`noReceiver`),this._debug.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let r=n.getSynchronizationSources();if(!r||!r.length)return this._debug.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let i=r[0].rtpTimestamp;if(!Number.isInteger(i))return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`timestampNotInteger`),this._debug.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${i}`),0;let a=t-i&ra,o=Math.ceil(a/na);return Math.min(100,Math.max(0,o))}async _changeSimulcastInfo(e,t){let n=this._mediaSource.mediaSettings.isVideoEnabled,r=this._findFirstSimTransceiver();if(!this._isSimulcastNegotiated||!n||!r||!r.sender)return;let i=this._mediaSource.getStream();if(!i)return;let a=i.getVideoTracks()[0],o=a.getSettings().width,s=a.getSettings().height,c=rn(o,s,this._serverSettings.camera?.bitrates?.generic),l=t||!tn(this._simulcastInfo,c);if(!c.streams.length||!l)return;let u=r.sender.getParameters();if(u.encodings.length||(u.encodings=[{}]),!(u.encodings.length<=1)){if(this._debug.log(`_changeSimulcastInfo: ${o}x${s} command: ${JSON.stringify(c)} `),e){let e=0;for(let t of u.encodings)t.scaleResolutionDownBy=an(t.rid),t.scalabilityMode=Qt,e>=c.streams.length?(t.maxBitrate=0,t.active=!1):(t.active=!0,t.maxBitrate=c.streams[e].bitrate),e++;await r.sender.setParameters?.(u).catch(e=>{this._debug.error(`Failed to set sender parameters`,u,e)}),this._debug.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(u.encodings)} `)}if(this._simulcastInfo=c,c.streams.length){let e={mediaSource:Yt.CAMERA,simulcastInfo:c};await this._signaling.changeSimulcast(e)}}}async _monitorRtpShare(){let e=qr.getInstance().value;if(!this._mediaSource.mediaSettings.isFastScreenSharingEnabled||!N.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(e=>e.track?.kind===A.video&&e.track?.contentHint===`motion`);t&&(await t.getStats()).forEach(e=>{if(e.type===`outbound-rtp`&&this._serverSettings.fastScreenSharing&&e.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&e.frameWidth<window.screen.width){let n=t.getParameters();n.degradationPreference=`maintain-resolution`,t.setParameters(n),this._debug.log(`
7
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("webrtc-adapter");c=s(c);let l=require("messagepack"),u=require("@vkontakte/libvpx");u=s(u);let d=require("bit-buffer"),f=require("simple-ebml-builder");f=s(f);let p=require("fflate");p=s(p);var m=class{log(e,t,n=!1){}destroy(){}};function ee(e){"@babel/helpers - typeof";return ee=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},ee(e)}function te(e,t){if(ee(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(ee(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function ne(e){var t=te(e,`string`);return ee(t)==`symbol`?t:t+``}function h(e,t,n){return(t=ne(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var g=25*1024*1024,re=10,ie=`_okcls_logs_session_`,ae=3e4,oe=`ok-calls-sdk-debug-logs`,se=1,_=`sessions`,v=`chunks`,ce=120*1e3,le=new Set([`WARN`,`ERROR`]);function ue(){return`${Date.now()}_${Math.random().toString(36).slice(2)}`}function de(){let e=ue();return fe(e),e}function fe(e){Ue.has(e)||Ue.set(e,[]),We.has(e)||We.set(e,0),Ge.has(e)||Ge.set(e,null)}function pe(e){return Ge.get(e)??null}function me(e){let t=We.get(e)??0;return We.set(e,t+1),t}function he(e,t){return`${e}:${String(t).padStart(12,`0`)}`}function ge(e){return new Blob([e]).size}function _e(){try{let e=window.localStorage;for(let t of Object.keys(e))t.indexOf(ie)===0&&e.removeItem(t)}catch(e){console.error(`Storage is blocked`,e)}}var y=new class{constructor(){h(this,`_db`,null),h(this,`_dbPromise`,null),h(this,`_supported`,this.isSupported())}get supported(){return this._supported}open(){return this.isSupported()?(this._dbPromise||(this._dbPromise=new Promise(e=>{let t=window.indexedDB.open(oe,se);t.onupgradeneeded=()=>{this.createSchema(t.result)},t.onsuccess=()=>{this._db=t.result,this._supported=!0,this._db.onversionchange=()=>{this.close()},e(this._db)},t.onerror=()=>{console.warn(`Failed to open debug log storage`,t.error),this._supported=!1,this._dbPromise=null,e(null)},t.onblocked=()=>{console.warn(`Debug log storage opening is blocked`)}})),this._dbPromise):(this._supported=!1,Promise.resolve(null))}close(){this._db&&(this._db.close(),this._db=null),this._dbPromise=null}async deleteDatabaseForTests(){this.close(),this._supported=this.isSupported(),this._supported&&await new Promise(e=>{let t=window.indexedDB.deleteDatabase(oe);t.onsuccess=()=>e(),t.onerror=()=>e(),t.onblocked=()=>e()})}async getAllSessions(){let e=await this.open();if(!e)return[];let t=e.transaction(_,`readonly`),n=await this.requestToPromise(t.objectStore(_).getAll());return await this.txDone(t),n}async getSessionsByConversationId(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).index(`conversationId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.startTime-t.startTime)}async getSessionBySessionId(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).get(e));return await this.txDone(n),r?[r]:[]}async getChunksBySession(e){let t=await this.open();if(!t)return[];let n=t.transaction(v,`readonly`),r=await this.requestToPromise(n.objectStore(v).index(`sessionId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.sequence-t.sequence)}async putSession(e){let t=await this.open();if(!t)return!1;let n=t.transaction(_,`readwrite`);return n.objectStore(_).put(e),await this.txDone(n),!0}async putSessionAndChunk(e,t){let n=await this.open();if(!n)return!1;let r=n.transaction([_,v],`readwrite`);return r.objectStore(_).put(e),r.objectStore(v).put(t),await this.txDone(r),!0}async updateSessionConversationId(e,t){let[n]=await this.getSessionBySessionId(e);n&&await this.putSession({...n,conversationId:t,updatedAt:Math.max(n.updatedAt,Date.now())})}async deleteSession(e){let t=await this.open();if(!t)return 0;let n=await this.getChunksBySession(e),r=t.transaction([_,v],`readwrite`),i=r.objectStore(v),a=0;for(let e of n)a+=e.bytes,i.delete(e.id);return r.objectStore(_).delete(e),await this.txDone(r),a}async deleteChunks(e){let t=await this.open();if(!t||!e.length)return;let n=t.transaction(v,`readwrite`),r=n.objectStore(v);for(let t of e)r.delete(t.id);await this.txDone(n)}async estimateStorage(){return navigator.storage?.estimate?navigator.storage.estimate().catch(()=>null):null}async getStorageSummary(){let e=await this.getAllSessions();return{sessions:e,callsCount:this.groupSessions(this.getCallSessions(e)).length,usedBytes:e.reduce((e,t)=>e+t.bytes,0)}}async enforceRetentionPolicy(){let e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),r=e.reduce((e,t)=>e+t.bytes,0);for(;r>g&&n.length;){let e=n.shift();if(!e)break;r-=await this.deleteSession(e.sessionId)}for(;t.length>re||t.length>1&&r>g;){let e=t.shift();if(!e)return;for(let t of e.sessions)r-=await this.deleteSession(t.sessionId)}t.length===1&&r>g&&await this.trimOldestChunks(t[0],r-g),e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),(t.length>re||e.reduce((e,t)=>e+t.bytes,0)>g)&&await this.enforceRetentionPolicy()}createSchema(e){if(!e.objectStoreNames.contains(_)){let t=e.createObjectStore(_,{keyPath:`sessionId`});t.createIndex(`conversationId`,`conversationId`,{unique:!1}),t.createIndex(`updatedAt`,`updatedAt`,{unique:!1})}e.objectStoreNames.contains(v)||e.createObjectStore(v,{keyPath:`id`}).createIndex(`sessionId`,`sessionId`,{unique:!1})}isSupported(){return typeof window<`u`&&!!window.indexedDB}requestToPromise(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}txDone(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}getCallKey(e){return e.conversationId||e.sessionId}getCallSessions(e){return e.filter(e=>e.conversationId!==null)}getGlobalSessions(e){return e.filter(e=>e.conversationId===null).sort((e,t)=>e.updatedAt===t.updatedAt?e.startTime===t.startTime?e.sessionId.localeCompare(t.sessionId):e.startTime-t.startTime:e.updatedAt-t.updatedAt)}groupSessions(e){let t=new Map;for(let n of e){let e=this.getCallKey(n),r=t.get(e);r||(r={key:e,sessions:[],bytes:0,startTime:n.startTime,updatedAt:0},t.set(e,r)),r.sessions.push(n),r.bytes+=n.bytes,r.startTime=Math.min(r.startTime,n.startTime),r.updatedAt=Math.max(r.updatedAt,n.updatedAt)}return Array.from(t.values()).sort((e,t)=>e.updatedAt===t.updatedAt?e.startTime===t.startTime?e.key.localeCompare(t.key):e.startTime-t.startTime:e.updatedAt-t.updatedAt)}async updateSessionFromChunks(e){let t=await this.getChunksBySession(e.sessionId);if(!t.length){await this.deleteSession(e.sessionId);return}let n=t.reduce((e,t)=>e+t.bytes,0),r=t.reduce((e,t)=>e+t.items.length,0),i=t[0].startTime,a=t[t.length-1].endTime;await this.putSession({...e,startTime:i,endTime:a,updatedAt:a,bytes:n,entriesCount:r})}async trimOldestChunks(e,t){let n=[];for(let t of e.sessions){let e=await this.getChunksBySession(t.sessionId);n.push(...e.map(e=>({...e,session:t})))}n.sort((e,t)=>e.startTime===t.startTime?e.sequence-t.sequence:e.startTime-t.startTime);let r=n.slice(0,Math.max(n.length-1,0)),i=0,a=new Map,o=[];for(let e of r)if(o.push(e),i+=e.bytes,a.set(e.sessionId,e.session),i>=t)break;await this.deleteChunks(o);for(let e of a.values())await this.updateSessionFromChunks(e);return i}};async function ve(e){return e.sessionId?y.getSessionBySessionId(e.sessionId):e.conversationId?y.getSessionsByConversationId(e.conversationId):[]}async function ye(e,t,n,r){if(!r.length)return;let i=pe(e)||t,a=r,o=JSON.stringify(a),s=ge(o);for(;s>g&&a.length>1;)a=a.slice(Math.floor(a.length/2)),o=JSON.stringify(a),s=ge(o);if(s>g)return;let c=a[0].t,l=a[a.length-1].t,[u]=await y.getSessionBySessionId(e),d=u||{sessionId:e,conversationId:i,startTime:c,endTime:l,updatedAt:l,bytes:0,entriesCount:0},f={...d,conversationId:i||d.conversationId,startTime:Math.min(d.startTime,c),endTime:Math.max(d.endTime,l),updatedAt:Math.max(d.updatedAt,l),bytes:d.bytes+s,entriesCount:d.entriesCount+a.length},p={id:he(e,n),sessionId:e,sequence:n,startTime:c,endTime:l,bytes:s,items:a};await y.putSessionAndChunk(f,p)&&await y.enforceRetentionPolicy()}function be(e){let t=new WeakSet;try{return JSON.parse(JSON.stringify(e,(e,n)=>{if(n instanceof Error||typeof n==`bigint`||typeof n==`function`||typeof n==`symbol`)return String(n);if(n&&typeof n==`object`){if(t.has(n))return`[Circular]`;t.add(n)}return n}))}catch{return e.map(e=>String(e))}}function xe(e){let t=Ue.get(e);if(!t?.length)return Je;let n=t.splice(0),r=pe(e),i=me(e);return Je=Je.then(()=>ye(e,r,i,n)).catch(e=>{console.warn(`Failed to write debug log to storage`,e)}),Je}function Se(e){if(e)return xe(e);for(let e of Ue.keys())xe(e);return Je}async function Ce(e){let t=[];for(let n of e.sort((e,t)=>e.startTime-t.startTime)){let e=await y.getChunksBySession(n.sessionId);for(let n of e)t.push(...n.items)}return t}async function we(e){let t=await Ce(e);if(!t.length)return t;let n=t.sort(Ee),r=n[0].t,i=n[n.length-1].t;return[...await Te(r,i,new Set(e.map(e=>e.sessionId))),...n].sort(Ee)}async function Te(e,t,n){let r=(await y.getAllSessions()).filter(r=>!n.has(r.sessionId)&&r.conversationId===null&&r.endTime>=e-ce&&r.startTime<=t),i=[];for(let n of r){let r=await y.getChunksBySession(n.sessionId);for(let n of r)n.endTime<e-ce||n.startTime>t||i.push(...n.items.filter(n=>n.t>=e-ce&&n.t<=e?!0:n.t>=e&&n.t<=t&&le.has(n.l)))}return i}function Ee(e,t){return e.t-t.t}function De(e,t){let n=document.createElement(`a`),r=new Blob([e],{type:`text/json`}),i=URL.createObjectURL(r);n.href=i,n.download=t,n.click(),URL.revokeObjectURL(i)}function Oe(){Se()}function ke(){document.visibilityState===`hidden`&&Se()}function Ae(e,t,n=Ke){He||je(),fe(n);let r=new Date,i={t:r.getTime(),l:e,d:be(t),h:r.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`})};return Ue.get(n)?.push(i),qe||(qe=window.setTimeout(()=>{qe=null,Se()},ae)),i}function je(){He||(He=!0,_e(),y.open(),window.addEventListener(`pagehide`,Oe),document.addEventListener(`visibilitychange`,ke))}function Me(){return He||je(),Se(),de()}function Ne(e,t=Ke){t&&(fe(t),Ge.set(t,e),e&&y.updateSessionConversationId(t,e))}async function Pe(){return await Se(),(await y.getAllSessions()).sort((e,t)=>t.updatedAt-e.updatedAt)}async function Fe(e){return await Se(),we(await ve(e))}async function Ie(e){return JSON.stringify(await Fe(e))}async function Le(e){let t=await Ie(e),n=`logs_${e.sessionId||e.conversationId}_${Date.now()}.json`;return De(t,n),n}async function Re(e){await Se();let t=e?await ve(e):await y.getAllSessions();for(let e of t)await y.deleteSession(e.sessionId)}async function ze(){await Se();let e=await y.getStorageSummary(),t=await y.estimateStorage();return{supported:y.supported,callsCount:e.callsCount,sessionsCount:e.sessions.length,usedBytes:e.usedBytes,maxBytes:g,maxCalls:re,quotaBytes:t?.quota,usageBytes:t?.usage}}async function Be(){await Se();let e=await Ce(await y.getAllSessions());return JSON.stringify(e.sort(Ee))}async function Ve(){let e=await Be(),t=`logs_${Date.now()}.json`;return De(e,t),t}var He=!1,Ue=new Map,We=new Map,Ge=new Map,Ke=de(),qe=null,Je=Promise.resolve();window.__VKCallsSDKLogs__=(e=!1)=>(He||je(),e?Be():Ve());var b=class e{static get sessionKey(){return e._sessionKey}static set sessionKey(t){e._sessionKey=t}static get sessionSecretKey(){return e._sessionSecretKey}static set sessionSecretKey(t){e._sessionSecretKey=t}static get accessToken(){return e._accessToken}static set accessToken(t){e._accessToken=t}static get userId(){return e._userId}static set userId(t){e._userId=t}static isEmpty(){return!e._sessionKey}static reauthorize(t){return e._reauthorizePromise||(e._reauthorizePromise=t().finally(()=>{e._reauthorizePromise=null})),e._reauthorizePromise}};h(b,`_sessionKey`,void 0),h(b,`_sessionSecretKey`,void 0),h(b,`_accessToken`,void 0),h(b,`_userId`,null),h(b,`_reauthorizePromise`,null);var x=class{constructor(){h(this,`_handlers`,{}),h(this,`_listeners`,[])}_triggerEvent(e,...t){if(Object.hasOwn(this._handlers,e))for(let n of this._handlers[e])n.apply(this,t)}addEventListener(e,t){if(typeof t!=`function`)throw Error(`Listener should be a function`);return Object.hasOwn(this._handlers,e)||(this._handlers[e]=[]),this._handlers[e].push(t),{dispose:this.removeEventListener.bind(this,e,t)}}removeEventListener(e,t){if(!Object.hasOwn(this._handlers,e))return;t||delete this._handlers[e];let n=this._handlers[e].indexOf(t);n>=0&&this._handlers[e].splice(n,1)}subscribe(e,t,n){let r=e.addEventListener(t,n);this._listeners.push(r)}unsubscribe(){this._listeners.forEach(e=>{e.dispose()})}},S=function(e){return e.MIC_CAMERA_PERMISSION=`mic_camera`,e.CAMERA_PERMISSION=`camera`,e.MIC_PERMISSION=`mic`,e.CAMERA_ACCESS=`cameralock`,e.MIC_ACCESS=`miclock`,e.MIC_NOT_FOUND=`nomic`,e.SCREEN_PERMISSION=`screenpermission`,e.SCREEN_ACCESS=`screenlock`,e.CONNECTION=`connection`,e.NETWORK=`network`,e.UNKNOWN=`unknown`,e.UNSUPPORTED=`unsupported`,e.SIGNALING_FAILED=`signalingfailed`,e.API=`api`,e.AUTH=`auth`,e.OVERCONSTRAINED=`overconstrained`,e}(S||{}),C=function(e){return e.AUDIO=`AUDIO`,e.VIDEO=`VIDEO`,e.SCREEN_SHARING=`SCREEN_SHARING`,e.MOVIE_SHARING=`MOVIE_SHARING`,e.AUDIO_SHARING=`AUDIO_SHARING`,e.ANIMOJI=`ANIMOJI`,e}(C||{}),w=function(e){return e.ACCEPT_CONCURRENT=`callAcceptConcurrent`,e.ACCEPT_INCOMING=`callAcceptIncoming`,e.ACCEPTED_OUTGOING=`callAcceptedOutgoing`,e.ADD_PARTICIPANT=`callAddParticipant`,e.CALL_SPEC_ERROR=`callSpecError`,e.DECLINE_INCOMING=`callDeclineIncoming`,e.DEVICE_CHANGED=`callDeviceChanged`,e.DEVICES=`callDevices`,e.ERROR=`callError`,e.HANGUP=`callHangup`,e.ICE_CONNECTION_STATE=`callIceConnectionState`,e.ICE_CONNECTION_TYPE=`callIceConnectionType`,e.ICE_RESTART=`callIceRestart`,e.JOIN_CONVERSATION=`callJoinConversation`,e.MEDIA_STATUS=`callMediaStatus`,e.OUTGOING_CALL=`callStart`,e.OUTGOING_MULTIPARTY_CALL=`callStartMultiparty`,e.PAT_ALLOCATED=`patAllocate`,e.PAT_DEALLOCATED=`patDeallocate`,e.PAT_ERROR=`patError`,e.PAT_OUTDATED_RESPONSE=`patOutdatedResponse`,e.PAT_WAITING_TIME_ERROR=`patWaitingTimeError`,e.POOR_CONNECTION=`callPoorConnection`,e.PUSH=`callPush`,e.RECONNECT=`callReconnect`,e.RELAY_POLICY=`callForceRelay`,e.REMOVE_PARTICIPANT=`callRemoveParticipant`,e.SOCKET_ACTION=`callSocketAction`,e.TOPOLOGY_CHANGE_REQUESTED=`callTopologyChangeRequested`,e}(w||{}),Ye=e=>e.stop(),Xe=e=>e.getTracks().forEach(Ye),Ze=e=>e.getVideoTracks().forEach(Ye);async function Qe(e,t){try{let n=typeof t.width==`number`?t.width:void 0,r=typeof t.height==`number`?t.height:void 0;await e.applyConstraints({...t,...n&&{width:{max:n,ideal:n}},...r&&{height:{max:r,ideal:r}}})}catch(e){z.warn(`setVideoConstraints failed`,e)}}var $e=class{constructor(){h(this,`_cameraPermissionStatus`,void 0),h(this,`_microphonePermissionStatus`,void 0),h(this,`_listener`,void 0)}static isSupported(){return E.browserName()!==`Firefox`&&`permissions`in navigator&&`PermissionStatus`in window}async init(e){try{let[t,n]=await Promise.all([navigator.permissions.query({name:`camera`}),navigator.permissions.query({name:`microphone`})]);this._cameraPermissionStatus=t,this._microphonePermissionStatus=n,this._listener=e,this._cameraPermissionStatus.onchange=e=>this.handlePermissionChange(e),this._microphonePermissionStatus.onchange=e=>this.handlePermissionChange(e)}catch(e){z.warn(`NavigatorPermissions init error`,e)}}handlePermissionChange(e){let t=e.target;if(t instanceof PermissionStatus){let{name:e,state:n}=t;switch(e){case`audio_capture`:this._listener(`microphone`,n);break;case`video_capture`:this._listener(`camera`,n);break}}}getPermissionState(e){switch(e){case`camera`:return this._cameraPermissionStatus?.state??null;case`microphone`:return this._microphonePermissionStatus?.state??null}return null}},et=`_okcls_`,tt=(()=>{try{let e=Date.now().toString(),t=window.localStorage,n=!1;return t.setItem(e,e),n=t.getItem(e)===e,t.removeItem(e),n?t:null}catch{return null}})();function nt(e){let t=tt?tt.getItem(et+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function rt(e,t){try{tt&&tt.setItem(et+e,JSON.stringify(t))}catch{}}function it(e){tt&&tt.removeItem(et+e)}var at;(function(e){function t(e){return nt(e)||null}e.get=t;function n(e,t){rt(e,t)}e.set=n;function r(e){it(e)}e.remove=r})(at||(at={}));var ot=at,st=null,ct=null,lt=null,ut=[],dt=[],ft=[],pt=null,mt=null,ht=null,gt=!1,_t=!1,vt,yt,bt,xt=null,St=null,Ct=``,wt=null,Tt=[],Et=null,Dt=navigator.appVersion,Ot=navigator.appName,kt=navigator.userAgent,At={};function jt(e,t){return Number(t.deviceId===`default`)-Number(e.deviceId===`default`)}var Mt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Mt).includes(e)}e.contains=t})(Mt||(Mt={}));var Nt=class{constructor(e,t=!1,n=N.videoMaxWidth,r=N.videoMaxHeight,i=N.videoFrameRate){h(this,`audio`,void 0),h(this,`video`,void 0),h(this,`needVideo`,void 0),h(this,`lastSimplifyWasReached`,void 0),h(this,`supportedConstraints`,void 0),h(this,`isVideoRequested`,()=>this.needVideo),this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let a=!1;if(e){a={noiseSuppression:N.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let t=T.getMicrophones(),n,r;if(mt&&(r=mt.groupId,n=mt.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!mt&&T.os()===`MacOS`&&t.find(e=>e.label.includes(`iPhone`))){let e=t.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));e&&(r=e.groupId,n=e.deviceId)}r&&this.supportedConstraints.groupId?a.groupId={exact:r}:n&&(a.deviceId={exact:n})}let o=!1;if(t){o={width:{min:N.videoMinWidth,max:n,ideal:n},height:{min:N.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:N.videoAspectRatio},frameRate:{ideal:i}};let e=T.getCameras(),a,s;if(pt&&(s=pt.groupId,a=pt.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!pt&&T.os()===`MacOS`&&e.find(e=>e.label.includes(`iPhone`))){let t=e.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));t&&(s=t.groupId,a=t.deviceId)}s&&this.supportedConstraints.groupId?o.groupId={exact:s}:a&&(o.deviceId={exact:a}),N.videoFacingMode&&(o.facingMode={ideal:N.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=a,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video==`object`&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio==`object`&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let e=typeof this.video==`object`&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio==`object`&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||e)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Pt=class extends Nt{constructor(e,t,n,r){if(super(!1,!0),h(this,`captureController`,void 0),this.captureController=`CaptureController`in window?new CaptureController:null,typeof this.video==`object`?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode,delete this.video.width,delete this.video.height):this.video={},this.video.cursor=`motion`,e&&(this.video.width=e),t&&(this.video.height=t),this.video.frameRate=n,this.video.displaySurface=N.displaySurface,T.browserName()===`Safari`){let n=Number(T.browserVersion());n===16?(e&&(this.video.width={max:e}),t&&(this.video.height={max:t})):n===17&&(delete this.video.width,delete this.video.height)}r&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:N.audioShareSystemInclude?`include`:`exclude`,windowAudio:N.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},Ft=class e{constructor(){h(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(t=null){if(e._lockId)throw t?.log(w.ERROR,`change_device`),z.warn(`Device change failed: MediaSource is busy`),Error(`MediaSource is busy`);e._lockId=this._lockId}free(){e._lockId===this._lockId&&(e._lockId=0)}};h(Ft,`_lockId`,0);async function It(){_t=!1,gt=!1,st=null;let e={camera:T.getSavedCamera(),microphone:T.getSavedMicrophone(),output:T.getSavedOutput()};await Rt(),Lt(`devicechange`,e),R.onDeviceChange()}function Lt(e,...t){if(At[e])for(let n of At[e])n(...t)}async function Rt(){return st||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!ct&&navigator.mediaDevices.addEventListener&&(ct=M.debounce(It,N.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,ct)),!lt&&$e.isSupported()&&(lt=new $e,await lt.init((e,t)=>{switch(t){case`denied`:case`prompt`:ct?.();break}})),st=navigator.mediaDevices.enumerateDevices().then(e=>{ut=e.filter(e=>e.kind===`videoinput`?((e.label||lt?.getPermissionState(`camera`)===`granted`)&&(gt=!0),!0):!1),ut.sort(jt),dt=e.filter(e=>e.kind===`audioinput`?((e.label||lt?.getPermissionState(`microphone`)===`granted`)&&(_t=!0),!0):!1),dt.sort(jt),ft=e.filter(e=>e.kind===`audiooutput`),ft.sort(jt);let t=pt?.deviceId??ot.get(`videoinput`),n=mt?.deviceId??ot.get(`audioinput`),r=ht?.deviceId??ot.get(`audiooutput`);return pt=ut.find(e=>e.deviceId===t)||null,mt=dt.find(e=>e.deviceId===n)||null,ht=ft.find(e=>e.deviceId===r)||ft[0]||null,st=Promise.resolve(e),e}).catch(()=>(st=null,[]))))}async function zt(){if(`userAgentData`in navigator)try{let{platformVersion:e}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!e){z.warn(`Can't to get OS version`);return}let t=parseInt(e.split(`.`)[0]);wt=isNaN(t)?null:t}catch(e){z.warn(`Failed to get OS version`,e)}}function Bt(e){if(pt&&mt)return;let t=(e,t)=>{let n=t.getSettings()?.deviceId;return e.find(e=>e.deviceId===n||e.label===t.label)||null};e?.getTracks().forEach(e=>{!mt&&e.kind===A.audio?mt=t(T.getMicrophones(),e):!pt&&e.kind===A.video&&(pt=t(T.getCameras(),e))})}async function Vt(e,t,n=z,r=null){n.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative()))),T.releaseFirefoxMicrophonePermissionWarmup();let i=(!e.isVideo()||T.hasCameraPermission())&&(!e.isAudio()||T.hasMicrophonePermission());!i&&!t&&R.onPermissionsRequested();let a=new Ft;try{a.busy(r);let t=await navigator.mediaDevices.getUserMedia(e.getNative());return a.free(),i||await It(),Bt(t),t}catch(i){switch(a.free(),n.error(`getUserMedia error`,i),i.name){case`PermissionDeniedError`:case`PermissionDismissedError`:case`NotAllowedError`:case`SecurityError`:case`DOMException`:case`NotFoundError`:t=e.isVideoRequested()?S.CAMERA_PERMISSION:S.MIC_PERMISSION;break;case`OverconstrainedError`:t=S.OVERCONSTRAINED;break;case`TypeError`:t=S.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?S.CAMERA_ACCESS:S.MIC_ACCESS;break;case`Error`:if(i.message===`MediaSource is busy`){t=e.isVideoRequested()?S.CAMERA_ACCESS:S.MIC_ACCESS;break}}if(e.canSimplify())return Vt(e.simplify(),t,n,r);let o=t||S.UNKNOWN;throw R.onPermissionsError(o,i),o}}async function Ht(e=z){if(!(xt||T.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{T.hasMicrophonePermission()||R.onPermissionsRequested(),xt=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(t){e.warn(`Firefox microphone permission warmup failed`,t)}}async function Ut(e,t=z,n=null){t.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let r=new Ft;try{r.busy(n);let i=await navigator.mediaDevices.getDisplayMedia(e.getNative()),a=i?.getVideoTracks()[0];if(a){let n=a.getSettings()?.displaySurface;if(t.debug(`Got display media track: ${a.id} (${n})`),a.contentHint=`text`,e.captureController&&(n===`browser`||n===`window`))try{e.captureController.setFocusBehavior(`no-focus-change`)}catch(e){t.warn(`Failed to set focus behavior`,e)}}return i}catch(e){switch(e.name){case`PermissionDeniedError`:case`NotAllowedError`:case`SecurityError`:throw S.SCREEN_PERMISSION;case`AbortError`:case`NotReadableError`:throw S.SCREEN_ACCESS;default:throw e}}finally{r.free()}}function Wt(){return Tt.length||(Tt=(()=>{let e,t=!1,n=0,r=`0`,i=kt.match(/(opera|chrome|safari|firefox)\/?\s*(\d+)/i)||[];if(i[1]===`Safari`){if(e=kt.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=kt.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=kt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=kt.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=kt.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=kt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=kt.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=kt.match(/\bEdge?\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(window.opr!==void 0&&/^(.+\.)?ok.ru$/.test(window.location.host))return[`Opera`,`Hidden`,t,n,r]}return e=kt.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:Ot,e&&e[1]||i[2]||Dt,t,n,r]})()),Tt}var T;(function(e){async function t(){await Rt(),await zt()}e.init=t;function n(){return ut}e.getCameras=n;function r(){return dt}e.getMicrophones=r;function i(){return ft}e.getOutput=i;function a(){return ut.length>0}e.hasCamera=a;function o(){return dt.length>0}e.hasMicrophone=o;function s(){return pt}e.getSavedCamera=s;function c(){return mt}e.getSavedMicrophone=c;function l(){return ht}e.getSavedOutput=l;function u(){return N.videoFacingMode}e.getVideoFacingMode=u;function d(){return gt}e.hasCameraPermission=d;function f(){return _t}e.hasMicrophonePermission=f;function p(){return lt?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=p;function m(e=!1){return f()?a()&&e?d():!0:!1}e.hasPermissions=m;function ee(){xt&&(Xe(xt),xt=null)}e.releaseFirefoxMicrophonePermissionWarmup=ee;async function te(e=!1,t=!0,n=!0,r=z,i=null){!e&&!t?await Ht(r):T.releaseFirefoxMicrophonePermissionWarmup();let s=o()&&t,c=a()&&e,l;if(!s&&!c)l=new MediaStream;else try{l=await Vt(new Nt(s,c),void 0,r,i)}catch{l=new MediaStream}return!l.getVideoTracks().length&&n&&l.addTrack(T.getBlackMediaTrack()),!l.getAudioTracks().length&&n&&l.addTrack(T.getSilentMediaTrack()),l}e.getUserMedia=te;async function ne(e,t,n=z,r=null){return Ut(new Pt(e&&!N.consumerFastScreenShare?N.fastScreenShareWidth:0,e&&!N.consumerFastScreenShare?N.fastScreenShareHeight:0,N.getScreenFrameRate(e),t),n,r)}e.getScreenMedia=ne;async function h(e=!1,t,n=z,r=null){return Vt(new Nt(!1,!0,e?N.videoEffectMaxWidth:N.videoMaxWidth,e?N.videoEffectMaxHeight:N.videoMaxHeight,t),void 0,n,r)}e._getUserVideo=h;async function g(e,t,n=z,r=null){let i=t?.width||N.videoMaxWidth,a=t?.height||N.videoMaxHeight;return Vt(new Nt(!1,e||!0,i,a),void 0,n,r)}e.getUserVideo=g;async function re(e,t=z,n=null){return Vt(new Nt(e||!0,!1),void 0,t,n)}e.getUserAudio=re;async function ie(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return Qe(n,t)}e.setResolution=ie;async function ae(e,t){let n=(await Rt()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?pt=n:e===`audioinput`?mt=n:e===`audiooutput`&&(ht=n),ot.set(e,t),n):null}e._saveDeviceId=ae;function oe(){if(!bt||bt.readyState===`ended`){let e=T.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),bt=t.stream.getAudioTracks()[0]}return Object.assign(bt.clone(),{enabled:!1})}e.getSilentMediaTrack=oe;function se(e=N.videoMinWidth,t=N.videoMinHeight){yt||(yt=document.createElement(`canvas`)),yt.width=e,yt.height=t;let n=yt.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!vt||vt.readyState===`ended`)&&(vt=yt.captureStream(N.videoFrameRate).getVideoTracks()[0]),Object.assign(vt.clone(),{enabled:!1})}e.getBlackMediaTrack=se;function _(){return v()===null}e.isBrowserSupported=_;function v(){try{let e=window;return e.navigator.mediaDevices?`getUserMedia`in e.navigator.mediaDevices?e.RTCPeerConnection?e.RTCIceCandidate?e.RTCSessionDescription?e.HTMLCanvasElement?e.HTMLCanvasElement.prototype.captureStream?e.RTCRtpSender?e.RTCRtpSender.prototype.replaceTrack?e.RTCRtpSender.prototype.getParameters?`sendBeacon`in e.navigator?null:`send-beacon-unavailable`:`rtp-sender-get-parameters-unavailable`:`rtp-sender-replace-track-unavailable`:`rtp-sender-unavailable`:`canvas-capture-stream-unavailable`:`html-canvas-unavailable`:`rtc-session-description-unavailable`:`rtc-ice-candidate-unavailable`:`rtc-peer-connection-unavailable`:`get-user-media-unavailable`:`media-devices-unavailable`}catch{return`support-check-failed`}}e.getBrowserSupportFailure=v;function ce(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=ce;function le(){let e=T.browserName()===`Opera`,t=T.browserName()===`Yandex`;return e||t}e.isBrokenH264Decoder=le;function ue(){return T.browserName()===`Yandex`&&T.os()===`Windows`||N.simulcast}e.isBrokenVP9Encoder=ue;function de(){let e=T.browserName()===`Safari`&&Number(T.browserVersion())===17&&[4,5,6].includes(Number(T.browserSubVersion())),t=T.osVersion(),n=T.os()===`Windows`&&t!=null&&t>0&&t<13;return e||n}e.isBrokenVP9Decoder=de;function fe(){return!(T.baseChromeVersion()&&T.isMobile())}e.canPreferH264=fe;function pe(){let e=T.browserName(),t=Number(T.browserVersion());return e===`Safari`?t>=18:e===`Firefox`?t>=134:!0}e.isSimulcastSupportedByBrowser=pe;function me(){return Ct||(Ct=(()=>{let e={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let t in e)if(Object.hasOwn(e,t)&&e[t].test(kt))return t;return`Unknown`})()),Ct}e.os=me;function he(){return wt}e.osVersion=he;function ge(){return St===null&&(St=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Dt)),St}e.isMobile=ge;function _e(){return Wt()[0]}e.browserName=_e;function y(){return Wt()[1]}e.browserVersion=y;function ve(){return Wt()[3]}e.baseChromeVersion=ve;function ye(){return Et||(Et=new(window.AudioContext||window.webkitAudioContext)),Et.resume().catch(()=>{z.warn(`Failed to resume AudioContext`)}),Et}e.getAudioContext=ye;function be(){return Wt()[4]}e.browserSubVersion=be;function xe(){return T.baseChromeVersion()>=105&&!T.isMobile()}e.isAudioShareSupported=xe;function Se(e,t){At[e]||(At[e]=[]),At[e].push(t)}e.addEventListener=Se;function Ce(e,t){if(At[e])if(!t)delete At[e];else{let n=At[e].indexOf(t);n>-1&&At[e].splice(n,1)}}e.removeEventListener=Ce})(T||(T={}));var E=T;function Gt(e,t){return!(e.isAudioEnabled!==t.isAudioEnabled||e.isVideoEnabled!==t.isVideoEnabled||e.isScreenSharingEnabled!==t.isScreenSharingEnabled||e.isFastScreenSharingEnabled!==t.isFastScreenSharingEnabled||e.isAudioSharingEnabled!==t.isAudioSharingEnabled||e.isAnimojiEnabled!==t.isAnimojiEnabled)}function D(e){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},e||{})}var O=function(e){return e.CANCELED=`CANCELED`,e.REJECTED=`REJECTED`,e.REMOVED=`REMOVED`,e.HUNGUP=`HUNGUP`,e.MISSED=`MISSED`,e.BUSY=`BUSY`,e.FAILED=`FAILED`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.KILLED=`KILLED`,e.BANNED=`BANNED`,e.HAS_ACTIVE_CALL=`HAS_ACTIVE_CALL`,e.CALLER_IS_BLOCKED=`CALLER_IS_BLOCKED`,e.NOT_FRIENDS=`NOT_FRIENDS`,e.CALLEE_IS_OFFLINE=`CALLEE_IS_OFFLINE`,e.CALLEE_UNAVAILABLE=`CALLEE_UNAVAILABLE`,e.CALLER_IS_REJECTED=`CALLER_IS_REJECTED`,e.UNKNOWN_ERROR=`UNKNOWN_ERROR`,e.UNSUPPORTED=`UNSUPPORTED`,e.SERVICE_DISABLED=`SERVICE_DISABLED`,e.SERVICE_UNAVAILABLE=`SERVICE_UNAVAILABLE`,e.EXTERNAL_API_ERROR=`EXTERNAL_API_ERROR`,e.SOCKET_CLOSED=`SOCKET_CLOSED`,e.ENDED=`ENDED`,e.KILLED_WITHOUT_DELETE=`KILLED_WITHOUT_DELETE`,e.ANOTHER_DEVICE=`ANOTHER_DEVICE`,e.NOT_FOUND=`NOT_FOUND`,e.VCHAT_DETAILED_ERROR=`VCHAT_DETAILED_ERROR`,e.TIMEOUT=`TIMEOUT`,e.PARTICIPANT_LIMIT_REACHED=`PARTICIPANT_LIMIT_REACHED`,e.FAST_START_ERROR=`FAST_START_ERROR`,e.FAST_JOIN_ERROR=`FAST_JOIN_ERROR`,e.CALL_TIMEOUT=`CALL_TIMEOUT`,e.OBSOLETE_CLIENT=`OBSOLETE_CLIENT`,e}(O||{}),k=class e extends Error{constructor(t,n){super(),h(this,`message`,void 0),h(this,`hangup`,void 0),h(this,`error`,void 0),h(this,`code`,void 0),h(this,`remote`,void 0),h(this,`custom_error`,void 0),h(this,`callError`,void 0),this.name=`HangupReason`,this.code=n&&n.code||0,this.remote=n&&n.remote||!1,this.custom_error=n?.custom_error??null,this.callError=n?.callError??null,Object.values(O).indexOf(t)>-1?this.hangup=t:this.error=t;let r=[];this.error&&r.push(`error`),this.remote&&r.push(`remote`),this.code&&r.push(`code: ${this.code}`),n&&n.message&&r.push(`message: '${n.message}'`),this.message=t+(r.length?` (${r.join(`, `)})`:``),Error.captureStackTrace&&Error.captureStackTrace(this,e)}},Kt=function(e){return e.FpsLimit=`fps-limit`,e}({}),qt=class extends x{constructor(e=z){super(),h(this,`FPS_LIMITS`,[13,20,Math.max(N.videoFrameRate,25)]),h(this,`THRESHOLD`,.8),h(this,`HISTORY_LENGTH`,10),h(this,`_fpsMeterUnsubscribe`,null),h(this,`_fpsHistory`,{cursor:0,arr:[]}),h(this,`_fpsLimitCursor`,this.FPS_LIMITS.length-1),h(this,`_debug`,void 0),this._debug=e}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(e){this._debug.warn(`VideoEffectsFpsLimiter error`,e)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let e=this._fpsHistory.arr.reduce((e,t)=>e+t,0)/this.HISTORY_LENGTH,t=this.FPS_LIMITS[this._fpsLimitCursor];e<t*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),t!==this.fpsLimit&&this._triggerEvent(`fps-limit`,this.fpsLimit)}}_assertsVideoEffect(e){if(!(`addFpsMeterListener`in e))throw Error(`Outdated VideoEffect version`)}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}},Jt=function(e){return e.SOURCE_CHANGED=`SOURCE_CHANGED`,e.SOURCE_READY=`SOURCE_READY`,e.TRACK_REPLACED=`TRACK_REPLACED`,e.SCREEN_STATUS=`SCREEN_STATUS`,e.ANIMOJI_STATUS=`ANIMOJI_STATUS`,e}({}),A=function(e){return e.audio=`audio`,e.video=`video`,e.screen=`screen`,e.audioshare=`audioshare`,e}({}),Yt=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),Xt=class extends x{constructor(e=z,t=null){super(),h(this,`_stream`,null),h(this,`_screenTrack`,null),h(this,`_audioShareTrack`,null),h(this,`_screenShareTrack`,null),h(this,`_sendVideoTrack`,null),h(this,`_cameraVideoTrack`,null),h(this,`_micAudioTrack`,null),h(this,`_audioEffectsTrack`,null),h(this,`_mediaSettings`,D()),h(this,`_lastMediaSettings`,null),h(this,`_videoStatusOnScreenCapturingEnabled`,!1),h(this,`_effect`,null),h(this,`_audioEffectParams`,null),h(this,`_onDeviceChange`,void 0),h(this,`_animojiEnabled`,!1),h(this,`_videoEffectsFpsLimiter`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_cameraTrackSetAt`,0),h(this,`_cameraMuteRecoveredAt`,0),h(this,`videoTrackMuteHandler`,()=>{!this._mediaSettings.isVideoEnabled||this._cameraMuteRecoveredAt>=this._cameraTrackSetAt||E.browserName()!==`Safari`||(this._cameraMuteRecoveredAt=Date.now(),this._logger?.log(w.ERROR,`camera_mute_recover`),this._debug.log(`[MediaSource] Safari camera mute recovery`),this.toggleVideo(!0).then(()=>this._logger?.log(w.ERROR,`camera_mute_recover_success`)).catch(e=>{this._logger?.log(w.ERROR,`camera_mute_recover_fail`),this._debug.warn(`[MediaSource] Camera mute recovery failed`,e)}))}),this._debug=e,this._logger=t,this._initDeviceChangeListener(),N.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),N.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new qt(this._debug),this._videoEffectsFpsLimiter.addEventListener(Kt.FpsLimit,this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener(`mute`,this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&(this._cameraTrackSetAt=Date.now(),this._cameraVideoTrack.addEventListener(`mute`,this.videoTrackMuteHandler)),N.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[C.AUDIO],t=!0){if(this._stream)return;let n=e.includes(C.VIDEO),r=e.includes(C.AUDIO),i=e.includes(C.ANIMOJI),a=E.getBrowserSupportFailure();if(a)throw new k(S.UNSUPPORTED,{callError:{scope:`internal`,code:`environment`,description:a}});try{this._stream=await E.getUserMedia(n,r,t,this._debug,this._logger),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=n&&this._stream.getVideoTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=r&&this._stream.getAudioTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=i&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=i,this._triggerEvent(`SOURCE_READY`)}catch(e){throw new k(e)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){let e=this._stream?.getAudioTracks().filter(e=>!e.contentHint)??[];return e.find(e=>e.enabled)??e[0]??null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,n){let r=this.getStream(),i=this.getSendAudioTrack(),a=this.getSendVideoTrack(n);if(!r||!i&&!a&&!t)throw Error(`No local stream found`);i&&!t&&e.addTrack(i,r),a&&!t&&e.addTrack(a,r)}getMediaSettings(){return this._mediaSettings}get mediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case`videoinput`:if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case`audioinput`:if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(S.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Ze(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_initDeviceChangeListener(){!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices||!navigator.mediaDevices.addEventListener||(this._onDeviceChange=async e=>{if(!this._stream)return;let t=E.getSavedMicrophone(),n=E.getSavedCamera(),r=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,i=this._mediaSettings.isVideoEnabled&&n?.groupId!==e.camera?.groupId;try{r&&await this._changeAudioInput(),i&&await this._changeVideoInput()}catch{}},E.addEventListener(`devicechange`,this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&E.removeEventListener(`devicechange`,this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?`stream`:`video`,n=e||await E._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=n.getVideoTracks()[0],!this._stream)Xe(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);this._logger?.log(w.DEVICE_CHANGED,t),this._debug.log(`Video stream changed`),await this._replaceLocalTrack(e),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}}catch(e){throw this._logger?.log(w.ERROR,`change_video`),this._debug.warn(`Camera change failed`,e),e}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await E.getUserAudio(void 0,this._debug,this._logger);if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Xe(t);else{let e=await this._applyAudioEffect();this._logger?.log(w.DEVICE_CHANGED,`audio`),this._debug.log(`Audio stream changed`,e),await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})}}catch(e){throw this._logger?.log(w.ERROR,`change_audio`),this._debug.error(`Microphone change failed`,e),e}}async _changeScreen(e,t,n){try{if(n=n||await E.getScreenMedia(e,t,this._debug,this._logger),!this._stream)Xe(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),this._logger?.log(w.DEVICE_CHANGED,`screen`),this._debug.log(`Screen capturing started`),this._screenTrack=r,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,N.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(r.contentHint=`motion`,this._screenShareTrack=r),n.getAudioTracks().length>0){let e=n.getAudioTracks()[0];e.contentHint=`music`,this._audioShareTrack=e,await this._addLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&this._debug.debug(`Audio share requested but not captured`),this._triggerEvent(`SCREEN_STATUS`,{track:r}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`})}}catch(e){throw this._logger?.log(w.ERROR,`screen`),this._debug.warn(`Screen capturing failed`,e),e}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent(`SCREEN_STATUS`,{track:null}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`}))}async stopAudioShareTrack(){if(this._audioShareTrack){let e=this.getSilentAudioShareTrack();await this._replaceTrack(this._audioShareTrack,e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!N.audioEffects||!this._audioEffectParams)return N.audioEffects?.pause(),this._micAudioTrack;N.audioEffects.isInitialized||await N.audioEffects.init(),N.audioEffects.resume(),N.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),N.audioEffects.setSource(this._micAudioTrack);let e=N.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=E.getSilentMediaTrack();return e.contentHint=`music`,e.stop(),e}getBlackScreenShareTrack(){let e=E.getBlackMediaTrack();return e.contentHint=`motion`,e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let n=this._stream.getTracks().filter(t=>t.kind===e.kind),r=n.find(t=>t.contentHint===e.contentHint)??n.find(e=>e!==this._audioEffectsTrack);r?.id!==e.id&&(r?await this._replaceTrack(r,e,t):await this._addLocalTrack(e,t))}async _replaceTrack(e,t,n){this._stream&&(e!==this._audioEffectsTrack&&e.stop(),this._stream.removeTrack(e),this._stream.addTrack(t),this._triggerEvent(`TRACK_REPLACED`,t,n))}async _addLocalTrack(e,t){this._stream&&(this._stream.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(N.videoEffects),!N.videoEffects)return t;try{return N.videoEffects.setEffect(e,t)}catch(e){return this._debug.warn(`Video effect failed`,e),t}}_stopEffect(){if(N.videoEffects)try{N.videoEffects.stopEffect()}catch(e){this._debug.warn(`Video effect failed`,e)}}destroy(){this._destroyDeviceChangeListener(),E.releaseFirefoxMicrophonePermissionWarmup(),N.videoEffects&&(this._effect=null,N.videoEffects.destroy()),N.audioEffects&&N.audioEffects.destroy(),this._stream&&(Xe(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),E.getAudioContext()?.suspend().catch(e=>this._debug.error(e)),this._videoEffectsFpsLimiter?.destroy()}async stopLocalMedia(){this._mediaSettings.isScreenSharingEnabled&&await this.disableScreenCapturing(),this._stream&&(this._lastMediaSettings={...this._mediaSettings},this._stream.getAudioTracks().length>0&&await this.toggleAudio(!1),this._stream.getVideoTracks().length>0&&await this.toggleVideo(!1),this.cameraVideoTrack=null,this._micAudioTrack=null)}async resumeLocalMedia(e){if(!this._lastMediaSettings)return;let t=[];if((e?e.isAudioEnabled:this._lastMediaSettings.isAudioEnabled)&&(t.push(C.AUDIO),await this.toggleAudio(!0)),await this.request(t),this._lastMediaSettings=null,this._stream)for(let e of this._stream.getTracks())this._triggerEvent(`TRACK_REPLACED`,e)}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return this._disableScreenCapture()}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;this.cameraVideoTrack?.stop();let t;if(e){let e=await E._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);this.cameraVideoTrack=e.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=E.getBlackMediaTrack(N.videoMinWidth,N.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent(`ANIMOJI_STATUS`,!e);return}this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(e,t)=>{await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=t,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})};if(e)try{let e=await E.getUserAudio(void 0,this._debug,this._logger);this._micAudioTrack=e.getAudioTracks()[0],await t(await this._applyAudioEffect(),!0)}catch(e){throw N.audioEffects?.pause(),await t(E.getSilentMediaTrack(),!1),typeof e==`string`?Error(e):e}else N.audioEffects?.pause(),await t(E.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent(`ANIMOJI_STATUS`,e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async setResolution({video:e,effect:t}){if(!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw Error(`Local stream not found`);if(!this.cameraVideoTrack)throw Error(`Local video track not found`);let n=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,n)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(e=>!e.contentHint);if(!e)throw Error(`Local audio track not found`);if(e.enabled)return e.applyConstraints({noiseSuppression:N.noiseSuppression})}async videoEffect(e){if(!N.videoEffects)throw Error(`Video Effects library is not set`);if(this._logger?.log(w.DEVICE_CHANGED,`effect_${e?.effect||`none`}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let e=this.cameraVideoTrack.clone(),t=new MediaStream([e]);await this._applyVideoConstraints(e),await this._changeVideoInput(t)}catch(e){this._effect=t;let n=this.cameraVideoTrack.clone(),r=new MediaStream([n]);throw await this._changeVideoInput(r),e}}}async audioEffect(e){if(!N.audioEffects)throw Error(`Audio Effects library is not set`);if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!M.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let e=this._micAudioTrack.clone(),t=new MediaStream([e]);await this._changeAudioInput(t)}catch(e){this._audioEffectParams=t;let n=this._micAudioTrack.clone(),r=new MediaStream([n]);throw await this._changeAudioInput(r),e}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<N.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(e=>{this._debug.warn(`MediaSource handleVideoEffectsLowFps error`,e)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??N.videoFrameRate;return this._effect?Math.min(e,N.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await Qe(e,{width:this._effect?N.videoEffectMaxWidth:N.videoMaxWidth,height:this._effect?N.videoEffectMaxHeight:N.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}},j=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e}(j||{}),Zt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Qt=`L1T2`,$t=1.35,en=[{dimension:320,bitrate:18e4},{dimension:520,bitrate:4e5},{dimension:640,bitrate:5e5},{dimension:960,bitrate:9e5},{dimension:1280,bitrate:12e5},{dimension:1920,bitrate:25e5},{dimension:2560,bitrate:35e5},{dimension:3840,bitrate:5e6}];function tn(e,t){return!e||!t?e===t:e.streams.length===t.streams.length?e.streams.every((e,n)=>{let r=t.streams[n];return e.rid===r.rid&&e.width===r.width&&e.height===r.height&&e.fps===r.fps&&e.bitrate===r.bitrate}):!1}function nn(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return t.length>0?t[t.length-1].bitrate:en[0].bitrate}function rn(e=Zt.WIDTH,t=Zt.HEIGHT,n=en,r=30){let i=Math.max(e,t),a=1;i>=960?a=3:i>=480&&(a=2);let o=[`h`,`m`,`l`].slice(3-a),s=[],c=nn(i,n);for(let i=0;i<a;i++){let a=o[i];s.push({rid:a,width:e,height:t,fps:r,bitrate:c}),e=Math.round(e/2),t=Math.round(t/2),c=nn(Math.max(e,t),n)}return{streams:s.reverse()}}function an(e,t){let n=t.streams.findIndex(t=>t.rid===e);return n>=0?2**(t.streams.length-n-1):1}function on(e,t,n,r){let i=n?Math.round(n*$t):1/0;if(e.forEach(e=>{let n=t.streams.find(t=>t.rid===e.rid);e.scaleResolutionDownBy=an(e.rid,t),e.scalabilityMode=Qt,n?(e.active=n.rid===`l`||Math.max(n.width,n.height)<i,e.maxBitrate=n.bitrate,e.maxFramerate=n.fps):(e.active=!1,e.maxBitrate=0,delete e.maxFramerate)}),r)for(let n=t.streams.length-1;n>=0;n--){let{rid:i}=t.streams[n],a=e.find(e=>e.rid===i);if(a?.active){a.maxBitrate=r;break}}}var sn=typeof Object.fromEntries==`function`?Object.fromEntries:function(e){if(!e||!e[Symbol.iterator])throw Error(`Object.fromEntries() requires a single iterable argument`);let t={};for(let[n,r]of e)t[n]=r;return t};async function cn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var ln=/\r?\n/;function un(e){return e.split(ln)}function dn(e){return e.join(`\r
8
+ `)}var fn=533,pn=`a=fmtp:`,mn=`sps-pps-idr-in-keyframe=1`,hn;(function(e){function t(e,t){let n=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),r,i=[];for(r=0;r<e.length;++r){let a=e[r].match(n);a&&a.length===3&&a[2]===t&&i.push(a[1])}return i}function n(e,t,n){let r=e.split(` `),i=r.slice(0,3),a;for(a=3;a<r.length;a++)n.includes(r[a])&&i.push(r[a]);for(a=3;a<r.length;a++)!n.includes(r[a])&&!t.includes(r[a])&&i.push(r[a]);return i.join(` `)}function r(e,t,r,i){let a,o=`m=`+t;for(a=0;a<e.length;++a)e[a].startsWith(o)&&(e[a]=n(e[a],r,i))}function i(e,t){let n=RegExp(`a=fmtp:(\\d+)`);for(let r=0;r<e.length;++r){let i=e[r].match(n);if(i&&i.length===2&&t.includes(i[1])){let t=e[r].trim()===pn+i[1]?` `:`;`;e[r]+=t+mn}}}function a(e,n,i=`video`){let a=t(e,n);if(!a.length)return;let o=a.slice(0),s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`),c;for(c=0;c<e.length;++c){let t=e[c].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}let l=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`);for(c=e.length;c--;){let t=e[c].match(l);t&&t.length===3&&o.includes(t[2])&&e.splice(c,1)}r(e,i,o,[])}function o(e,t,n,r){let i=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),a,o=[];for(a=t;a<n;++a){let t=e[a].match(i);t&&t.length===3&&t[2]===r&&o.push(t[1])}if(!o.length)return o;let s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`);for(a=t;a<n;++a){let t=e[a].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}return o}function s(e,t,r,i){let a=o(e,t,r,i);if(!a.length)return r+1;let s=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`),c=0,l=r;for(;l>=t;){let t=e[l].match(s);t&&t.length===3&&a.includes(t[2])&&(e.splice(l,1),c++),l--}return e[t]=n(e[t],a,[]),r-c+1}function c(e,t,n,r){let i=-1,a=-1,o=!1;for(let c=0;c<e.length;++c)if(i>=0&&e[c].startsWith(`m=`)&&(a=c-1,o&&(c=s(e,i,a,t)),i=-1,a=-1,o=!1),e[c].startsWith(`m=video`)&&(i=c),i>=0){let t=n===`remote`&&r===`encoder`||n===`local`&&r===`decoder`?`recvonly`:`sendonly`;(e[c].startsWith(`a=${t}`)||e[c].startsWith(`a=sendrecv`))&&(o=!0)}a=e.length-1,i>=0&&o&&s(e,i,a,t)}function l(e,n){let a=t(e,`H264`);n&&r(e,`video`,[],a),i(e,a)}function u(e){r(e,`video`,[],t(e,`VP9`))}function d(e){[`G722`,`PCMU`,`PCMA`,`CN`,`telephone-event`].forEach(t=>{a(e,t,`audio`)})}function f(e,n,i,a,o=!1){let s=un(e);if(d(s),!n&&!i&&!a&&!o)return dn(s);function f(e){let t=[`a=rtcp-fb:111 nack`,`a=rtcp-fb:111 nack pli`],n=e.findIndex(e=>e.startsWith(`a=rtcp-fb:111`));return~n&&(e[n]=e[n]+`\r
9
+ `+dn(t)),e}function p(e){let n=t(e,`red`);n.length>0&&r(e,`audio`,[],n)}return i?c(s,`H264`,`local`,`decoder`):l(s,n),a&&u(s),p(s),o&&f(s),dn(s)}e.patchLocalSDP=f;function p(e,t,n,r,i,o){let s=un(e);return n?a(s,`H264`):t&&l(s,t),i&&o?a(s,`VP9`):i?c(s,`VP9`,`remote`,`encoder`):o?c(s,`VP9`,`remote`,`decoder`):r&&u(s),d(s),dn(s)}e.patchRemoteSDP=p;function m(e){return e?`${e.type||`WEB_SOCKET`}_${e.id}`:`_`}e.getPeerIdString=m;function ee(e,t){return e&&e.id===t.id&&(e.type||`WEB_SOCKET`)===(t.type||`WEB_SOCKET`)}e.comparePeerId=ee;async function te(e){let t={local:null,remote:null};if(!e||!e.getStats)return t;try{let n=await e.getStats(null),r=null;if(n.forEach(e=>{e.type===`transport`&&e.selectedCandidatePairId?r=n.get(e.selectedCandidatePairId):e.type===`candidate-pair`&&e.state===`succeeded`&&!r&&(!Object.hasOwn(e,`selected`)||e.selected)&&(r=e)}),r?.localCandidateId){let e=n.get(r.localCandidateId);e&&(t.local={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}if(r?.remoteCandidateId){let e=n.get(r.remoteCandidateId);e&&(t.remote={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}return t}catch{return t}}e.getPeerConnectionHostInfo=te;let ne=/^-?[0-9]+$/,h=/^([gu])(-?[0-9]+)$/;function g(e,t=j.USER){let n=String(e);return h.test(n)?(z.warn(`Already composite id [${e}] type supplied [${t}]`),n):t===j.GROUP?`g`+n:t===j.USER?`u`+n:(z.warn(`Unknown type [${t}] for id [${e}]`),n.match(ne)?`u`+n:n)}e.composeUserId=g;function re(e,t,n=0){return ie(g(e,t),n)}e.composeParticipantId=re;function ie(e,t){return t?e+`:d`+t:e}e.compose=ie;function ae(e){return re(e.id,e.idType||j.USER,e.deviceIdx)}e.composeId=ae;function oe(e){if(e.decorativeUserId)return re(e.decorativeUserId,e.idType||j.USER,e.deviceIdx)}e.composeDecorativeId=oe;function se(e){return e.participant?ae(e.participant):re(e.participantId,e.participantType||j.USER,e.deviceIdx)}e.composeMessageId=se;function _(e){return typeof e==`string`?v(ce(e).compositeUserId).id:e}e.extractOkId=_;function v(e){let t=String(e),n=t.match(h);return n?{id:Number(n[2]),type:n[1]===`g`?j.GROUP:j.USER}:(z.warn(`Unsupported compositeId [${e}]`),{id:Number(t),type:j.USER})}e.decomposeId=v;function ce(e){let t=e.split(`:d`);return{compositeUserId:t[0],deviceIdx:t.length>1?parseInt(t[1],10):0}}e.decomposeParticipantId=ce;function le(){let e=window.crypto?.randomUUID?.();if(e)return e;let t=`0123456789abcdefghijklmnopqrstuvwxyz`.split(``),n=Array(36),r=0,i,a;for(a=0;a<36;a++)a===8||a===13||a===18||a===23?n[a]=`-`:a===14?n[a]=`4`:(r<=2&&(r=33554432+Math.random()*16777216|0),i=r&15,r>>=4,n[a]=t[a===19?i&3|8:i]);return n.join(``)}e.uuid=le;function ue(e,t){let n;function r(...r){let i=this;n&&window.clearTimeout(n),n=window.setTimeout(()=>{e.apply(i,r)},t)}return r}e.debounce=ue;function de(e){if(!window.BigInt)return null;let t=``,n=un(e);for(let e of n)if(e.startsWith(`a=fingerprint`)){let n=e.split(` `);if(n.length===2){t=n[1];break}}if(!t)return BigInt(-1);let r=t.split(`:`),i=BigInt(0);for(let e=Math.min(7,r.length-1);e>=0;e--){let t=BigInt(parseInt(r[e],16));i<<=BigInt(8),i|=t}return BigInt.asIntN(64,i)}e.sdpFingerprint=de;async function fe(e,{signal:t}={}){return new Promise((n,r)=>{if(t?.aborted)return r(t.reason);let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason)};t?.addEventListener(`abort`,a,{once:!0})})}e.delay=fe;function pe(e,t,n,r=z){let i=[];return e.getSenders().forEach(e=>me(t,e,e.track,n,i,r)),i}e.applySettings=pe;function me(e,t,n,r,i,a=z){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!e||!n||n.kind!==A.video)return;let o=n.getSettings();if(!o)return;let s=e.maxBitrateK?e.maxBitrateK*1024:null,c=o.width,l=o.height,u=c&&l&&e.maxDimension?Math.max(1,Math.max(c,l)/e.maxDimension):null,d=e.maxFramerate||null;if(c&&l&&e.maxDimension&&e.maxDimension>Math.max(c,l)){let e=Math.round(c*l/256),t=(Math.round(e*fn/1e4)+1)*1e4;s=s===null?t:Math.min(t,s)}let f=e.degradationPreference||`balanced`,p=r[n.id];if(p&&p.bitrate===s&&p.scaleResolutionDownBy===u&&p.maxFramerate===d&&p.degradationPreference===f){i[n.id]=p;return}i[n.id]={bitrate:s,scaleResolutionDownBy:u,maxFramerate:d,degradationPreference:f};let m=t.getParameters();if(m.encodings||(m.encodings=[{}]),m.encodings.length>1&&c&&l&&e.maxDimension){let t=Math.round(e.maxDimension*1.35),n=e.bitrates?.generic?.length?e.bitrates.generic:void 0,r=o.frameRate||30,i=rn(c,l,n,d?Math.min(r,d):r);a.log(`applyVideoTrackSettings: maxDim=${e.maxDimension} targetDim=${t} track=${c}x${l} sim=${JSON.stringify(i)}`),on(m.encodings,i,e.maxDimension,n?void 0:s??void 0)}else m.encodings.forEach(t=>{e?.scalabilityMode&&(t.scalabilityMode=e.scalabilityMode),s?t.maxBitrate=s:delete t.maxBitrate,u?t.scaleResolutionDownBy=u:delete t.scaleResolutionDownBy,d?t.maxFramerate=d:delete t.maxFramerate});if(m.degradationPreference=f,m.encodings.length>0){t.setParameters?.(m).catch(e=>{a.error(`Failed to set sender parameters`,m,e)});let e=t.getParameters();a.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(e.encodings)}`)}}e.applyVideoTrackSettings=me;function he(e,t){Array.isArray(t)||(t=[t]);for(let n of t)if(e.includes(n))return!0;return!1}e.includesOneOf=he;function ge(e){return Object.entries(e.participantState?.state||{}).reduce((t,[n,r])=>(e.participantState&&(t[n]={ts:e.participantState.stateUpdateTs[n],state:r}),t),{})}e.mapParticipantState=ge;function _e(e){let t=e.map(e=>({uid:e.externalId,mediaSettings:e.mediaSettings,status:e.connectionStatus.lastEffective,muteStates:e.muteStates,unmuteOptions:e.unmuteOptions,participantState:e.participantState,markers:e.markers,movieShareInfos:e.movieShareInfos,roles:e.roles}));return N.filterObservers?t.filter(e=>!e.uid.observer):t}e.mapSharedParticipants=_e;function y(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let i of n)if(!Object.hasOwn(r,i)||e[i].state!==t[i].state||e[i].ts!==t[i].ts)return!1;return!0}e.isEqualParticipantState=y;function ve(e,t,n=!1){let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let i of r){if(!Object.hasOwn(t,i))return!1;let r=e[i],a=t[i];if(n&&we(r)&&we(a))return ve(r,a,n);if(r!==a)return!1}return!0}e.isObjectsEquals=ve;function ye(e,t){if(e.length!==t.length)return!1;for(let n of e)if(t.indexOf(n)<0)return!1;return!0}e.isArraysEquals=ye;function be(e){return!Object.keys(e).length}e.isEmptyObject=be;function xe(e,t){if(!e&&!t)return 0;if(!e||!t)return e?-1:1;return r(t.rank,e.rank)||r(e.ts,t.ts)||n(e,t);function n(e,t){let n={[j.USER]:0,[j.GROUP]:1},{compositeUserId:i,deviceIdx:a}=ce(e.id),{compositeUserId:o,deviceIdx:s}=ce(t.id),{id:c,type:l}=v(i),{id:u,type:d}=v(o);return r(n[l],n[d])||r(c,u)||r(a,s)}function r(e,t){return e<t?-1:e===t?0:1}}e.participantMarkerCompare=xe;function Se(e,t){return sn(Object.entries(e).filter(([,e])=>Array.isArray(t)?!t.includes(e):e!==t))}e.objectFilterOutValues=Se;function Ce(e,t,n){let r=n;for(let n in e)Object.hasOwn(e,n)&&(r=t(r,e[n],n));return r}e.objectReduce=Ce,e.setImmediate=(()=>{let e=1,t={},n=null;return typeof MessageChannel<`u`&&(n=new MessageChannel,n.port1.onmessage=e=>{let n=e.data;t[n]&&(t[n](),delete t[n])}),function(r){if(n&&document.visibilityState===`hidden`){let i=e;return e=e>=2**53-1?1:e+1,t[i]=r,n.port2.postMessage(i),()=>{t[i]&&delete t[i]}}let i=setTimeout(r,0);return()=>clearTimeout(i)}})();function we(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}e.isObject=we})(hn||(hn={}));var M=hn,gn=`__CALLS_SDK_DEVTOOLS_`,_n=class{set(e,t){try{this.getStorage().setItem(gn+e,JSON.stringify(t))}catch(t){z.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(gn+e);return t===null?null:JSON.parse(t)}catch(t){return z.warn(`DevTools: Failed to read option`,e,t),null}}remove(e){try{this.getStorage().removeItem(gn+e)}catch(t){z.warn(`DevTools: Failed to remove option`,e,t)}}clear(){try{let e=this.getStorage(),t=Object.keys(e);for(let n of t)n.startsWith(gn)&&e.removeItem(n)}catch(e){z.warn(`DevTools: Failed to clear options`,e)}}getAll(){try{let e=this.getStorage(),t=Object.keys(e),n={};for(let r of t)if(r.startsWith(gn)){let t=r.substring(21),i=e.getItem(r);if(i!==null)try{n[t]=JSON.parse(i)}catch{}}return n}catch(e){return z.warn(`DevTools: Failed to get all options`,e),{}}}getStorage(){return window.localStorage}},vn=class{constructor(e){h(this,`storage`,void 0),this.storage=e}set(e,t){this.storage.set(e,t),console.debug(`DevTools: ${String(e)} override set to ${t}`)}get(e){return this.storage.get(e)}clear(e){this.storage.remove(e),console.debug(`DevTools: ${String(e)} override cleared`)}clearAll(){this.storage.clear(),console.debug(`DevTools: All overrides cleared`)}getAll(){return this.storage.getAll()}applyOverrides(e){let t=this.getAll(),n={...e},r=Object.keys(t);if(r.length>0){console.debug(`DevTools: Current overrides:`,t);for(let e of r)t[e]!==void 0&&(n[e]=t[e]);console.debug(`DevTools: Overrides applied`)}return n}},yn=class e{static getInstance(){return e.instance||(e.instance=new e),e.instance}constructor(){h(this,`params`,void 0),h(this,`storage`,void 0),this.storage=new _n,this.params=new vn(this.storage)}};h(yn,`instance`,null);var bn=yn.getInstance(),N=class e{static set(t){Object.hasOwn(t,`voiceParams`)&&(Object.assign(e._params.voiceParams,t.voiceParams),delete t.voiceParams),Object.hasOwn(t,`specListenerParams`)&&(Object.assign(e._params.specListenerParams,t.specListenerParams),delete t.specListenerParams),Object.hasOwn(t,`apiAuth`)&&(b.accessToken=t.apiAuth.accessToken,b.sessionKey=t.apiAuth.sessionKey,b.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=bn.params.applyOverrides(t);Object.assign(e._params,M.objectFilterOutValues(n,void 0))}static getScreenFrameRate(t){return t?e._params.fastScreenShareFrameRate:e._params.screenFrameRate}static get(t){return e._params[t]}static get appName(){return`ok.calls.sdk.js`}static get appVersion(){return 1.1}static get sdkVersion(){return`2.8.12-dev.8bd84f52.0`}static get debug(){return e._params.debug}static get protocolVersion(){return e._params.joinFromMultipleDevices?6:5}static get platform(){return e._params.platform}static set platform(t){e._params.platform=t}static get clientStatsPlatform(){return e._params.clientStatsPlatform}static set clientStatsPlatform(t){e._params.clientStatsPlatform=t}static get clientType(){return e._params.clientType}static set clientType(t){e._params.clientType=t}static get externalUserType(){return e._params.externalUserType}static set externalUserType(t){e._params.externalUserType=t}static get device(){return e._params.device}static get apiKey(){return e._params.apiKey}static get apiEnv(){return e._params.apiEnv}static get apiBaseUrl(){return e._params.apiBaseUrl}static set apiBaseUrl(t){e._params.apiBaseUrl=t}static apiEndpoint(t){switch(t??e.apiEnv){case`AUTO`:case`PROD`:return`https://api.mycdn.me`;case`CALLS`:return`https://calls.okcdn.ru`;case`PROD_OK`:return`https://api.ok.ru`;case`TEST`:return`https://apitest.ok.ru/api`;case`VIDEOTEST`:return`https://videotestapi.ok.ru/api`;case`CALLSTEST`:return`https://calls-test.okcdn.ru/api`;case`CALLS_BETA`:return`https://api-beta.calls-test.oneme.ru/api`;case`CALLS_BENDER`:return`https://api-bender.calls-test.oneme.ru/api`;case`CALLS_MAMES`:return`https://calls-mames.okcdn.ru/api`;case`CALLS_MARS`:return`https://api-mars.calls-test.oneme.ru/api`;default:return e._params.apiEnv}}static get apiTimeout(){return e._params.apiTimeout}static get apiMaxAttempt(){return e._params.apiMaxAttempt}static get authToken(){return e._params.authToken}static set authToken(t){e._params.authToken=t}static get anonymToken(){return e._params.anonymToken}static set anonymToken(t){e._params.anonymToken=t}static get domain(){return e._params.domain}static get externalDomain(){return e._params.externalDomain}static get iceServers(){return e._params.iceServers}static set iceServers(t){e._params.iceServers=t}static get wssBase(){return e._params.wssBase}static set wssBase(t){e._params.wssBase=t}static get wtsBase(){return e._params.wtsBase}static set wtsBase(t){e._params.wtsBase=t}static get wssToken(){return e._params.wssToken}static set wssToken(t){e._params.wssToken=t}static get signalingReconnectDelay(){return e._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return e._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return e._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return e._params.waitConnectionDelay}static get waitResponseDelay(){return e._params.waitResponseDelay}static get waitMessageDelay(){return e._params.waitMessageDelay}static get waitAnotherTabDelay(){return e._params.waitAnotherTabDelay}static get calleeUnavailableWaitingTime(){return e._params.calleeUnavailableWaitingTime}static get debugLog(){return e._params.debugLog}static get forceRelayPolicy(){return e._params.forceRelayPolicy}static set forceRelayPolicy(t){e._params.forceRelayPolicy=t}static get videoMinWidth(){return e._params.videoMinWidth}static get videoMaxWidth(){return e._params.videoMaxWidth}static set videoMaxWidth(t){e._params.videoMaxWidth=t}static get videoMinHeight(){return e._params.videoMinHeight}static get videoMaxHeight(){return e._params.videoMaxHeight}static set videoMaxHeight(t){e._params.videoMaxHeight=t}static get videoAspectRatio(){return e._params.videoAspectRatio}static get videoFrameRate(){return e._params.videoFrameRate}static get videoFacingMode(){return e._params.videoFacingMode||(E.isMobile()?Mt.USER:null)}static set videoFacingMode(t){e._params.videoFacingMode=t}static get displaySurface(){return e._params.displaySurface}static get audioEffects(){return e._params.audioEffects}static set audioEffects(t){e._params.audioEffects=t,e._params.audioEffects?.setLogger((e,...t)=>z.send(e,...t))}static get vad(){return e._params.vad}static set vad(t){e._params.vad=t}static get vadOptions(){return e._params.vadOptions}static set vadOptions(t){e._params.vadOptions=t}static get videoEffects(){return e._params.videoEffects}static set videoEffects(t){e._params.videoEffects=t,e._params.videoEffects?.setLogger((e,...t)=>z.send(e,...t))}static get videoEffectMaxWidth(){return e._params.videoEffectMaxWidth}static set videoEffectMaxWidth(t){e._params.videoEffectMaxWidth=t}static get videoEffectMaxHeight(){return e._params.videoEffectMaxHeight}static set videoEffectMaxHeight(t){e._params.videoEffectMaxHeight=t}static get vmoji(){return e._params.vmoji?.isBrowserSupported()?e._params.vmoji:null}static set vmoji(t){e._params.vmoji=t}static get vmojiOptions(){return e._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(t){e._params.vmojiOptions=t}static get voiceParams(){return e._params.voiceParams}static get specListenerParams(){return e._params.specListenerParams}static get iceRestartWaitTime(){return e._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return e._params.transportConnectionWaitTime}static get statisticsInterval(){return e._params.statisticsInterval}static set statisticsInterval(t){e._params.statisticsInterval=t}static get networkStatisticsInterval(){return e._params.networkStatisticsInterval}static get perfStatReportEnabled(){return e._params.perfStatReportEnabled}static get callStatReportEnabled(){return e._params.callStatReportEnabled}static get enableLogPerfStatReport(){return e._params.enableLogPerfStatReport}static get asrDataChannel(){return e._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return e._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return e._params.screenShareWebmBuilder}static get noiseSuppression(){return e._params.noiseSuppression}static get preferH264(){return e._params.preferH264}static get preferVP9(){return e._params.preferVP9}static get audioNack(){return e._params.audioNack}static get movieShare(){return e._params.movieShare&&e.videoTracksCount>0}static get videoTracksCount(){return Number(e._params.videoTracksCount)}static get requestDisplayLayoutThrottleMs(){return Number(e._params.requestDisplayLayoutThrottleMs)}static get breakVideoPayloadTypes(){return e._params.breakVideoPayloadTypes}static get useCallsToContacts(){return e._params.useCallsToContacts}static get useParticipantListChunk(){return e._params.useParticipantListChunk&&e.videoTracksCount>0}static get useRooms(){return e._params.useRooms}static get useChatRooms(){return e._params.useChatRooms}static get addParticipant(){return e._params.addParticipant}static get waitForAdminInGroupCalls(){return e._params.waitForAdminInGroupCalls}static get hold(){return e._params.hold}static get maxParallelCalls(){return e._params.maxParallelCalls}static get participantListChunkInitIndex(){return e._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return e._params.participantListChunkInitCount??null}static get filterObservers(){return e._params.filterObservers}static get muteMode(){return e._params.muteMode}static get preserveAudioTracks(){return e._params.preserveAudioTracks}static get audioShare(){return E.isAudioShareSupported()&&e._params.audioShare}static get audioShareWindowInclude(){return e._params.audioShareWindowInclude}static get audioShareSystemInclude(){return e._params.audioShareSystemInclude}static get fastScreenShare(){return e._params.fastScreenShare}static get screenShareCongestionControl(){return e._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return e._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return e._params.fastScreenShareWidth}static get fastScreenShareHeight(){return e._params.fastScreenShareHeight}static get consumerFastScreenShare(){return e._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return e._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return e._params.videoSuspend}static get enumerateDevicesDelay(){return e._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return e._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return e._params.enableVideoEffectsFpsDegradation}static get simulcast(){return E.isSimulcastSupportedByBrowser()&&e._params.simulcast}static get webtransport(){return e._params.webtransport}static get waitForRecordResponse(){return e._params.waitForRecordResponse}static get transparentAudio(){return e._params.transparentAudio}static get enableSessionStateUpdates(){return e._params.enableSessionStateUpdates}static get safariAudioElement(){return e._params.safariAudioElement}static get forwardEmptyIceCandidate(){return e._params.forwardEmptyIceCandidate}static toJSON(){return{apiKey:e._params.apiKey,apiEnv:e._params.apiEnv,audioShare:e._params.audioShare,audioShareWindowInclude:e._params.audioShareWindowInclude,audioShareSystemInclude:e._params.audioShareSystemInclude,useCallsToContacts:e._params.useCallsToContacts,useParticipantListChunk:e._params.useParticipantListChunk,useRooms:e._params.useRooms,useChatRooms:e._params.useChatRooms,addParticipant:e._params.addParticipant,fastScreenShare:e._params.fastScreenShare,participantListChunkInitCount:e._params.participantListChunkInitCount,screenShareCongestionControl:e._params.screenShareCongestionControl,screenShareCongestionControlThreshold:e._params.screenShareCongestionControlThreshold,videoTracksCount:e._params.videoTracksCount,requestDisplayLayoutThrottleMs:e._params.requestDisplayLayoutThrottleMs,asrDataChannel:e._params.asrDataChannel,videoMaxHeight:e._params.videoMaxHeight,videoMaxWidth:e._params.videoMaxWidth,videoEffectMaxHeight:e._params.videoEffectMaxHeight,videoEffectMaxWidth:e._params.videoEffectMaxWidth,videoSuspend:e._params.videoSuspend,debugLog:e._params.debugLog,callStatReportEnabled:e._params.callStatReportEnabled,joinFromMultipleDevices:e._params.joinFromMultipleDevices,movieShare:e._params.movieShare,clientType:e._params.clientType,clientStatsPlatform:e._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:e._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:e._params.switchVideoAtBadNetwork,simulcast:e._params.simulcast,webtransport:e._params.webtransport,waitForRecordResponse:e._params.waitForRecordResponse,transparentAudio:e._params.transparentAudio,enableSessionStateUpdates:e._params.enableSessionStateUpdates,safariAudioElement:e._params.safariAudioElement,forwardEmptyIceCandidate:e._params.forwardEmptyIceCandidate}}};h(N,`_params`,{platform:`WEB`,clientStatsPlatform:``,clientType:`PORTAL`,externalUserType:``,device:`browser`,apiKey:``,authToken:``,anonymToken:``,apiEnv:`AUTO`,apiBaseUrl:null,domain:``,externalDomain:``,iceServers:[],wssBase:``,wtsBase:``,wssToken:``,signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,apiTimeout:5e3,apiMaxAttempt:10,forceRelayPolicy:!1,videoMinWidth:428,videoMinHeight:240,videoMaxWidth:1280,videoMaxHeight:720,videoAspectRatio:16/9,videoFrameRate:25,screenFrameRate:15,videoFacingMode:null,displaySurface:`monitor`,audioEffects:null,vad:null,vadOptions:{},videoEffects:null,videoEffectMaxWidth:640,videoEffectMaxHeight:360,vmoji:null,vmojiOptions:null,iceRestartWaitTime:2e4,transportConnectionWaitTime:5e3,statisticsInterval:5e3,networkStatisticsInterval:2e4,perfStatReportEnabled:!0,callStatReportEnabled:!1,enableLogPerfStatReport:!1,voiceParams:{smoothing:.8,minFreq:200,maxFreq:5e3,interval:500,threshold:.35,speakerLevelMultiplier:1.8},specListenerParams:{connectionTimeout:1e4,volumeTimeout:1e4},asrDataChannel:!1,consumerScreenDataChannelPacketSize:64*1024,screenShareWebmBuilder:!1,noiseSuppression:!0,preferH264:!1,preferVP9:!1,audioNack:!0,videoTracksCount:30,requestDisplayLayoutThrottleMs:750,movieShare:!1,useCallsToContacts:!1,useParticipantListChunk:!1,useRooms:!1,useChatRooms:!1,addParticipant:!1,waitForAdminInGroupCalls:!1,hold:!1,maxParallelCalls:2,participantListChunkInitIndex:0,participantListChunkInitCount:null,breakVideoPayloadTypes:!1,joinFromMultipleDevices:!1,filterObservers:!1,muteMode:!1,preserveAudioTracks:!1,audioShare:!1,audioShareWindowInclude:!1,audioShareSystemInclude:!1,fastScreenShare:!1,screenShareCongestionControl:!1,screenShareCongestionControlThreshold:2100,consumerFastScreenShare:!1,consumerFastScreenShareQualityOnDemand:!1,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,waitForRecordResponse:!1,transparentAudio:!1,enableSessionStateUpdates:!1,safariAudioElement:!1,forwardEmptyIceCandidate:!1});var P=function(e){return e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.WAITING=`WAITING`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`,e.RECONNECT=`RECONNECT`,e.ERROR=`ERROR`,e.HANGUP=`HANGUP`,e.PERMISSIONS=`PERMISSIONS`,e.ONHOLD=`ONHOLD`,e}({});function F(e,...t){let n=N.get(e);typeof n==`function`&&setTimeout(n,0,...t)}function I(e,t,...n){if(N.filterObservers){if(Array.isArray(t)){if(t=t.filter(e=>!e.observer),!t.length)return}else if(t.observer)return}F(e,t,...n)}function L(e){return Object.assign({},e)}function xn(e){return e.slice()}var Sn;(function(e){function t(e,t,n){F(`onLocalStream`,e,L(t),n)}e.onLocalStream=t;function n(e,t,n){F(`onScreenStream`,e,L(t),n)}e.onScreenStream=n;function r(e,t,n){F(`onVmojiStream`,e,L(t),n)}e.onVmojiStream=r;function i(e,t){F(`onVmojiError`,e,t)}e.onVmojiError=i;function a(e,t,n){F(`onLocalStreamUpdate`,L(e),t,n)}e.onLocalStreamUpdate=a;function o(e,t){z.debug(`Local status:`,e),F(`onLocalStatus`,e,t)}e.onLocalStatus=o;function s(e,t,n){I(`onRemoteStream`,e,t,n)}e.onRemoteStream=s;function c(e,t,n){I(`onRemoteLive`,e,t,n)}e.onRemoteLive=c;function l(e,t,n){I(`onLocalLive`,e,t,n)}e.onLocalLive=l;function u(e,t,n){I(`onRemoteLiveUpdate`,e,t,n)}e.onRemoteLiveUpdate=u;function d(e,t,n){I(`onLocalLiveUpdate`,e,t,n)}e.onLocalLiveUpdate=d;function f(e,t,n){I(`onRemoteScreenStream`,e,t,n)}e.onRemoteScreenStream=f;function p(e,t,n){I(`onRemoteVmojiStream`,e,t,n)}e.onRemoteVmojiStream=p;function m(e,t,n,r){I(`onRemoteStreamSuspended`,e,t,n,r)}e.onRemoteStreamSuspended=m;function ee(e,t,n,r,i,a){I(`onConversation`,e,L(t),L(n),r,i,a)}e.onConversation=ee;function te(e,t){e&&F(`onConversationParticipantListChunk`,e,t)}e.onConversationParticipantListChunk=te;function ne(e,t,n,r){I(`onRemoteMediaSettings`,e,L(t),n,r)}e.onRemoteMediaSettings=ne;function h(e,t,n){I(`onLocalMediaSettings`,e,L(t),n)}e.onLocalMediaSettings=h;function g(e,t,n,r){I(`onRemoteSharedMovieInfo`,e,L(t),n,r)}e.onRemoteSharedMovieInfo=g;function re(e,t,n,r){I(`onRemoteSharedMovieStoppedInfo`,e,L(t),n,r)}e.onRemoteSharedMovieStoppedInfo=re;function ie(e,t,n,r){I(`onLocalSharedMovieInfo`,e,L(t),n,r)}e.onLocalSharedMovieInfo=ie;function ae(e,t,n,r){I(`onLocalSharedMovieStoppedInfo`,e,L(t),n,r)}e.onLocalSharedMovieStoppedInfo=ae;function oe(e,t,n,r){I(`onRemoteSharedUrl`,e,t,n,r)}e.onRemoteSharedUrl=oe;function se(e,t,n){I(`onParticipantAdded`,e,t,n)}e.onParticipantAdded=se;function _(e,t,n){I(`onParticipantJoined`,e,t,n)}e.onParticipantJoined=_;function v(e,t=!1,n){F(`onLocalParticipantState`,L(e),t,n)}e.onLocalParticipantState=v;function ce(e,t,n,r){I(`onRemoteParticipantState`,e,L(t),n,r)}e.onRemoteParticipantState=ce;function le(e,t,n){F(`onRemoteParticipantsState`,e,t,n)}e.onRemoteParticipantsState=le;function ue(e,t,n=null,r){z.debug(`Remote status:`,t,e),I(`onRemoteStatus`,e,t,n,r)}e.onRemoteStatus=ue;function de(){F(`onPermissionsRequested`)}e.onPermissionsRequested=de;function fe(e,t){F(`onPermissionsError`,e,t)}e.onPermissionsError=fe;function pe(e,t,n){I(`onRemoteRemoved`,e,t,n)}e.onRemoteRemoved=pe;function me(e,t,n,r){F(`onCallState`,e,t,L(n),r)}e.onCallState=me;function he(e,t,n){F(`onDeviceSwitched`,e,t,n)}e.onDeviceSwitched=he;function ge(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null,u){let d=c?xn(c):void 0;F(`onMuteStates`,L(e),xn(t),xn(n),r,i,a,o,s,d,l,u)}e.onMuteStates=ge;function _e(e,t,n=!1,r){I(`onRolesChanged`,e,xn(t),n,r)}e.onRolesChanged=_e;function y(e,t=!1,n){F(`onLocalRolesChanged`,xn(e),t,n)}e.onLocalRolesChanged=y;function ve(e,t,n,r,i){I(`onPinnedParticipant`,e,t,n,r,i)}e.onPinnedParticipant=ve;function ye(e,t,n){F(`onLocalPin`,e,t,n)}e.onLocalPin=ye;function be(e,t){F(`onOptionsChanged`,xn(e),t)}e.onOptionsChanged=be;function xe(e){F(`onCallAccepted`,e)}e.onCallAccepted=xe;function Se(e){F(`onCallActive`,e)}e.onCallActive=Se;function Ce(e,t,n){I(`onAcceptedCall`,e,t,n)}e.onAcceptedCall=Ce;function we(e){F(`onRateNeeded`,e)}e.onRateNeeded=we;function Te(e,t){I(`onSpeakerChanged`,e,t)}e.onSpeakerChanged=Te;function Ee(e,t){F(`onVolumesDetected`,xn(e),t)}e.onVolumesDetected=Ee;function De(e,t){F(`onLocalVolume`,e,t)}e.onLocalVolume=De;function Oe(e,t,n){F(`onJoinStatus`,e,t,n)}e.onJoinStatus=Oe;function ke(e,t){F(`onHangup`,e,t)}e.onHangup=ke;function Ae(e){F(`onMultipartyChatCreated`,L(e))}e.onMultipartyChatCreated=Ae;function je(){F(`onDeviceChange`)}e.onDeviceChange=je;function Me(e){F(`onFingerprintChange`,e)}e.onFingerprintChange=Me;function Ne(){F(`onTokenExpired`)}e.onTokenExpired=Ne;function Pe(e,t,n=!1,r){F(`onChatMessage`,e,t,n,r)}e.onChatMessage=Pe;function Fe(e,t,n=!1,r){F(`onCustomData`,e,t,n,r)}e.onCustomData=Fe;function Ie(e,t,n,r,i,a,o=null,s){F(`onRecordStarted`,e,t,n,r,i,a,o,s)}e.onRecordStarted=Ie;function Le(e=null,t,n){F(`onRecordStopped`,e,t,n)}e.onRecordStopped=Le;function Re(e,t){F(`onLocalNetworkStatusChanged`,e,t)}e.onLocalNetworkStatusChanged=Re;function ze(e,t){F(`onNetworkStatusChanged`,e,t)}e.onNetworkStatusChanged=ze;function Be(e,...t){F(`onDebugMessage`,e,...t)}e.onDebugMessage=Be;function Ve(e,t,...n){F(`onDebugMessageWithContext`,e,t,...n)}e.onDebugMessageWithContext=Ve;function He(e,t){F(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=He;function Ue(){F(`onAutoplayError`)}e.onAutoplayError=Ue;function We(e,t,n,r,i,a){F(`onChatRoomUpdated`,e,t,n,r,i,a)}e.onChatRoomUpdated=We;function Ge(e,t){F(`onPromoted`,e,t)}e.onPromoted=Ge;function Ke(e,t){F(`onRemoteMixedAudioStream`,e,t)}e.onRemoteMixedAudioStream=Ke;function qe(e,t){F(`onJoinLinkChanged`,e,t)}e.onJoinLinkChanged=qe;function Je(e,t){F(`onRoomsUpdated`,e,t)}e.onRoomsUpdated=Je;function b(e,t,n,r,i){F(`onRoomUpdated`,e,t,n,r,i)}e.onRoomUpdated=b;function x(e,t){F(`onRoomParticipantsUpdated`,e,t)}e.onRoomParticipantsUpdated=x;function S(e,t){F(`onRoomSwitched`,e,t)}e.onRoomSwitched=S;function C(e,t){F(`onRoomStart`,e,t)}e.onRoomStart=C;function w(e,t=null,n){F(`onFeedback`,e,t,n)}e.onFeedback=w;function Ye(e,t){F(`onFeaturesPerRoleChanged`,e,t)}e.onFeaturesPerRoleChanged=Ye;function Xe(e,t){F(`onParticipantVmojiUpdate`,e,t)}e.onParticipantVmojiUpdate=Xe;function Ze(e,t,n){F(`onAsrSet`,e,t,n)}e.onAsrSet=Ze;function Qe(e,t,n,r){F(`onAsrStarted`,e,t,n,r)}e.onAsrStarted=Qe;function $e(e,t){F(`onAsrStopped`,e,t)}e.onAsrStopped=$e;function et(e,t,n,r,i){F(`onAsrTranscription`,e,t,n,r,i)}e.onAsrTranscription=et;function tt(e,t,n){F(`onParticipantIdChanged`,e,t,n)}e.onParticipantIdChanged=tt;function nt(e,t){F(`onVideoSuspendSuggest`,e,t)}e.onVideoSuspendSuggest=nt;function rt(e){F(`onSignalingMessage`,typeof e==`string`?e:L(e))}e.onSignalingMessage=rt;function it(e,t){F(`onPromotionApproved`,e,t)}e.onPromotionApproved=it;function at(e,t){F(`onPeerRegistered`,e,t)}e.onPeerRegistered=at})(Sn||(Sn={}));var R=Sn,Cn=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),wn;(function(e){let t=`📞`,n=()=>({sessionId:null,conversationId:null}),r=(e,t,...n)=>{R.onDebugMessage(t,...n),R.onDebugMessageWithContext(t,{conversationId:e.conversationId},...n)},i=console.debug.bind(console,t),a=console.log.bind(console,t),o=console.warn.bind(console,t),s=console.error.bind(console,t),c=!1;function l(e){if(!e)return n();try{return e()}catch{return n()}}function u(e,t,n){let u=l(n);if(N.debugLog&&Ae(e,t,u.sessionId||void 0),c)switch(e){case`DEBUG`:i(...t);break;case`LOG`:a(...t);break;case`WARN`:o(...t);break;case`ERROR`:s(...t);break}else r(u,e,...t)}function d(...e){u(`DEBUG`,e)}e.debug=d;function f(...e){u(`LOG`,e)}e.log=f;function p(...e){u(`WARN`,e)}e.warn=p;function m(...e){u(`ERROR`,e)}e.error=m;function ee(){return c}e.enabled=ee;function te(e){c=e,N.debugLog&&je()}e.toggle=te;function ne(e,...t){switch(e){case`DEBUG`:d(...t);break;case`LOG`:f(...t);break;case`WARN`:p(...t);break;case`ERROR`:m(...t);break}}e.send=ne;function h(e){return{debug:(...t)=>u(`DEBUG`,t,e),log:(...t)=>u(`LOG`,t,e),warn:(...t)=>u(`WARN`,t,e),error:(...t)=>u(`ERROR`,t,e)}}e.createLogger=h;function g(e=null){let t=null,n=e;function r(){!N.debugLog||t||(t=Me(),n&&Ne(n,t))}let i=()=>(r(),{sessionId:t,conversationId:n});return{get sessionId(){return t},get conversationId(){return n},setConversationId(e){n=e,t&&Ne(n,t)},send:(e,...t)=>u(e,t,i),debug:(...e)=>u(`DEBUG`,e,i),log:(...e)=>u(`LOG`,e,i),warn:(...e)=>u(`WARN`,e,i),error:(...e)=>u(`ERROR`,e,i)}}e.createSessionLogger=g;function re(e,...t){}e.test=re})(wn||(wn={}));var z=wn,B=new class{constructor(){h(this,`_conversations`,new Map),h(this,`_reserved`,new Set),h(this,`_activeId`,null),h(this,`_mutex`,!1),h(this,`_pendingRemovals`,new Set)}reserve(e){if(this._conversations.has(e)||this._reserved.has(e))throw Error(`CallRegistry: conversation ${e} already exists`);this._reserved.add(e)}add(e){let t=e.id;if(this._conversations.has(t)){z.warn(`CallRegistry: conversation ${t} already exists, skip duplicate add`),this._reserved.delete(t);return}this._conversations.set(t,e),this._reserved.delete(t)}remove(e){if(e){if(this._reserved.delete(e),this._mutex){this._pendingRemovals.add(e);return}this._conversations.delete(e),this._activeId===e&&(this._activeId=null)}}get(e){return this._conversations.get(e)}getActive(){return this._activeId?this._conversations.get(this._activeId)??null:null}getFirst(){return this._conversations.values().next().value??null}getActiveId(){return this._activeId}has(e){return this._conversations.has(e)||this._reserved.has(e)}getAll(){return Array.from(this._conversations.values())}get callsLength(){return this._conversations.size}async setActive(e){if(!(this._activeId===e||!this._conversations.has(e)||this._mutex)){this._mutex=!0;try{let t=this.getActive(),n;if(t){n=t.mediaSettings;try{await t.hold(!0)}catch(e){throw z.error(`Can't hold previous active, error: ${e}`),Error(`Cannot switch call: hold failed`)}}this._conversations.has(e)&&(this._activeId=e,R.onCallActive(e));let r=this._conversations.get(e);if(r&&r?.isCallHeld)try{await r.hold(!1,n)}catch(e){throw z.error(`Can't hold next active, error: ${e}`),Error(`Cannot switch call: hold failed`)}}finally{this._mutex=!1,this._flushPendingRemovals()}}}async setHold(e){if(!(this._activeId!==e||!this._conversations.has(e)||this._mutex)){this._mutex=!0;try{let e=this.getActive();if(e)try{await e.hold(!0)}catch(e){throw z.error(`Can't hold previous active, error: ${e}`),Error(`Cannot switch call: hold failed`)}this._activeId=null}finally{this._mutex=!1,this._flushPendingRemovals()}}}async switchCall(e){this._activeId===e?await this.setHold(e):await this.setActive(e)}clear(){this._conversations.clear(),this._reserved.clear(),this._pendingRemovals.clear(),this._activeId=null}_flushPendingRemovals(){if(this._pendingRemovals.size!==0){for(let e of this._pendingRemovals)this._conversations.delete(e),this._activeId===e&&(this._activeId=null);this._pendingRemovals.clear()}}},Tn=class extends Error{constructor(e){super(e?`Signaling disposed. Command ${e}`:`Signaling disposed`),this.name=`SignalingDisposedError`}},En=class extends x{constructor(...e){super(...e),h(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}readyToSend(e=!0){}async requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}},V=function(e){return e.RECOVER=`recover`,e.ACCEPT_CALL=`accept-call`,e.ADD_PARTICIPANT=`add-participant`,e.REMOVE_PARTICIPANT=`remove-participant`,e.HANGUP=`hangup`,e.TRANSMIT_DATA=`transmit-data`,e.ACCEPT_PRODUCER=`accept-producer`,e.ALLOCATE_CONSUMER=`allocate-consumer`,e.CHANGE_MEDIA_SETTINGS=`change-media-settings`,e.CHANGE_PARTICIPANT_STATE=`change-participant-state`,e.CHANGE_STREAM_PRIORITIES=`change-streams-priorities`,e.UPDATE_DISPLAY_LAYOUT=`update-display-layout`,e.REPORT_PERF_STAT=`report-perf-stat`,e.REPORT_SHARING_STAT=`report-sharing-stat`,e.REPORT_NETWORK_STAT=`report-network-stat`,e.RECORD_START=`record-start`,e.RECORD_STOP=`record-stop`,e.RECORD_PUBLISH=`record-publish`,e.RECORD_SET_CONF=`record-set-conf`,e.RECORD_GET_STATUS=`record-get-status`,e.SWITCH_MICRO=`switch-micro`,e.SWITCH_TOPOLOGY=`switch-topology`,e.REQUEST_REALLOC=`request-realloc`,e.CHAT_MESSAGE=`chat-message`,e.CHAT_HISTORY=`chat-history`,e.CUSTOM_DATA=`custom-data`,e.GRANT_ROLES=`grant-roles`,e.MUTE_PARTICIPANT=`mute-participant`,e.ENABLE_FEATURE_FOR_ROLES=`enable-feature-for-roles`,e.PIN_PARTICIPANT=`pin-participant`,e.UPDATE_MEDIA_MODIFIERS=`update-media-modifiers`,e.CHANGE_OPTIONS=`change-options`,e.GET_WAITING_HALL=`get-waiting-hall`,e.GET_PARTICIPANT_LIST_CHUNK=`get-participant-list-chunk`,e.GET_PARTICIPANTS=`get-participants`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.REQUEST_TEST_MODE=`request-test-mode`,e.ADD_MOVIE=`add-movie`,e.UPDATE_MOVIE=`update-movie`,e.REMOVE_MOVIE=`remove-movie`,e.START_URL_SHARING=`start-url-sharing`,e.STOP_URL_SHARING=`stop-url-sharing`,e.GET_ROOMS=`get-rooms`,e.UPDATE_ROOMS=`update-rooms`,e.ACTIVATE_ROOMS=`activate-rooms`,e.REMOVE_ROOMS=`remove-rooms`,e.SWITCH_ROOM=`switch-room`,e.FEEDBACK=`feedback`,e.ASR_START=`asr-start`,e.ASR_STOP=`asr-stop`,e.REQUEST_ASR=`request-asr`,e.REQUEST_PROMOTION=`request-promotion`,e.ACCEPT_PROMOTION=`accept-promotion`,e.GET_HAND_QUEUE=`get-hand-queue`,e.ENABLE_VIDEO_SUSPEND=`enable-video-suspend`,e.ENABLE_VIDEO_SUSPEND_SUGGEST=`enable-video-suspend-suggest`,e.HOLD=`hold`,e.PUT_HANDS_DOWN=`put-hands-down`,e.CHANGE_SIMULCAST=`change-simulcast`,e}(V||{});function Dn(e){return e.stopStream}function On(e){return e.keyFrameRequested}function kn(e){if(Dn(e))return`ss`;if(On(e))return`kf`;let t=``;return e.priority!==void 0&&(t+=`p=`+e.priority),e.width!==void 0&&e.height!==void 0&&(t!==``&&(t+=`:`),t+=`sz=`+Math.round(e.width)+`x`+Math.round(e.height)),e.fit!==void 0&&(t!==``&&(t+=`:`),t+=`fit=`+e.fit),t}var H=function(e){return e.CAMERA=`CAMERA`,e.SCREEN=`SCREEN`,e.STREAM=`STREAM`,e.MOVIE=`MOVIE`,e.ANIMOJI=`ANIMOJI`,e.SHARED_URL=`SHARED_URL`,e}({}),An=`s`,jn=`m`;function Mn(e){return e.participantId+(e.mediaType?`:`+An+e.mediaType:``)+(e.streamName?`:`+jn+e.streamName:``)}function Nn(e){let t=e.split(`:`),n=t.shift();if(!n)throw Error(`Illegal stream description: `+e);let r=null,i,a=0;for(let n of t)switch(n.charAt(0)){case An:r=Pn(n.slice(1));break;case jn:i=n.slice(1);break;case`d`:a=Number.parseInt(n.slice(1),10);break;default:throw Error(`Unexpected parameter type `+n.charAt(0)+` in stream description `+e)}return{participantId:M.compose(n,a),mediaType:r,streamName:i}}function Pn(e){for(let t of Object.keys(H))if(t===e)return H[t];return null}function Fn(){let e=new DataView(new ArrayBuffer(64)),t=0;function n(n){if(t+n>e.byteLength){let r=new Uint8Array(Math.max(t+n,e.byteLength+64));r.set(new Uint8Array(e.buffer.slice(0,t))),e=new DataView(r.buffer)}}return{put(r){if(n(r.byteLength),In(r)){let n=r.buffer;new Uint8Array(e.buffer).set(new Uint8Array(n),t)}else new Uint8Array(e.buffer).set(new Uint8Array(r),t);t+=r.byteLength},putI8(r){n(1),e.setInt8(t,r),++t},putI16(r){n(2),e.setInt16(t,r),t+=2},putI32(r){n(4),e.setInt32(t,r),t+=4},putI64(r){n(8);let i=r<0;i&&(r=-r);let a=r/4294967296|0,o=r%4294967296|0;i&&(o=~o+1|0,a=o===0?~a+1|0:~a),e.setUint32(t,a),e.setUint32(t+4,o),t+=8},putUi8(r){n(1),e.setUint8(t,r),++t},putUi16(r){n(2),e.setUint16(t,r),t+=2},putUi32(r){n(4),e.setUint32(t,r),t+=4},putUi64(r){n(8),e.setUint32(t,r/4294967296|0),e.setUint32(t+4,r%4294967296),t+=8},putF(r){n(8),e.setFloat64(t,r),t+=8},ui8array(){return new Uint8Array(e.buffer.slice(0,t))}}}function In(e){return e.buffer!==void 0}function Ln(e){let t=ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),n=0;return{peek(){return t.getUint8(n)},get(e){n+=e;let r=t.byteOffset;return t.buffer.slice(r+n-e,r+n)},getI8(){return t.getInt8(n++)},getI16(){return n+=2,t.getInt16(n-2)},getI32(){return n+=4,t.getInt32(n-4)},getI64(){n+=8;let e=t.getInt32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getUi8(){return t.getUint8(n++)},getUi16(){return n+=2,t.getUint16(n-2)},getUi32(){return n+=4,t.getUint32(n-4)},getUi64(){n+=8;let e=t.getUint32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getF32(){return n+=4,t.getFloat32(n-4)},getF64(){return n+=8,t.getFloat64(n-8)}}}var Rn=0,zn=1,Bn=2,Vn=3,Hn=4,Un=5,Wn=6,Gn=7,Kn=0,qn=1,Jn=2,Yn=0,Xn=0,Zn=0,Qn=1,$n=class{constructor(e=z){h(this,`participantIdRegistry`,null),h(this,`_debug`,void 0),this._debug=e}setParticipantIdRegistry(e){this.participantIdRegistry=e}serializeUpdateDisplayLayout(e,t){let n=Fn();l.Int.enc(n,Rn),l.Int.enc(n,Yn),l.Int.enc(n,e),l.Nil.enc(n,null);let r=[];for(let e in t)Object.hasOwn(t,e)&&this.writeLayout(t,e,r);return l.Arr.enc(n,r),l.Nil.enc(n,null),n.ui8array().buffer}writeLayout(e,t,n){let r=e[t],i=Fn();if(this.writeStreamDesc(t,i),Dn(r))l.Int.enc(i,qn);else if(On(r))l.Int.enc(i,Jn);else if(l.Int.enc(i,Kn),r.priority===void 0?l.Nil.enc(i,null):l.Int.enc(i,r.priority),r.width!==void 0&&r.height!==void 0?(l.Int.enc(i,Math.round(r.width)),l.Int.enc(i,Math.round(r.height))):(l.Nil.enc(i,null),l.Nil.enc(i,null)),r.fit!==void 0)switch(r.fit){case`cv`:l.Int.enc(i,Zn);break;case`cn`:l.Int.enc(i,Qn);break;default:l.Nil.enc(i,null)}else l.Nil.enc(i,null);n.push(i.ui8array().buffer)}writeStreamDesc(e,t){if(this.participantIdRegistry){let n=this.participantIdRegistry.getCompactId(e);if(n!==void 0){l.Int.enc(t,n);return}}l.Str.enc(t,e)}serializePerfStatReport(e,t){let n=Fn();return l.Int.enc(n,zn),l.Int.enc(n,Yn),l.Int.enc(n,e),l.Int.enc(n,t.framesDecoded),l.Int.enc(n,t.framesReceived),n.ui8array().buffer}serializeSharingStatReport(e,t){let n=Fn();return l.Int.enc(n,Bn),l.Int.enc(n,Yn),l.Int.enc(n,e),l.Int.enc(n,t.minDelay),l.Int.enc(n,t.maxDelay),l.Int.enc(n,t.avgDelay),l.Int.enc(n,t.largeDelayDuration),n.ui8array().buffer}serializeRequestAsr(e,t){let n=Fn();return l.Int.enc(n,Vn),l.Int.enc(n,Yn),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=Fn();return l.Int.enc(n,Hn),l.Int.enc(n,Yn),l.Int.enc(n,e),l.Int.enc(n,t.timestamp),l.Int.enc(n,t.sendBitrate),n.ui8array().buffer}serializeEnableVideoSuspend(e,t){let n=Fn();return l.Int.enc(n,Un),l.Int.enc(n,Yn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=Fn();return l.Int.enc(n,Wn),l.Int.enc(n,Yn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=Fn();l.Int.enc(n,Gn),l.Int.enc(n,Yn),l.Int.enc(n,e);let r=t.simulcastInfo.streams.length;l.Int.enc(n,t.mediaSource),l.Int.enc(n,r);for(let e of t.simulcastInfo.streams)l.Str.enc(n,e.rid),l.Int.enc(n,e.width),l.Int.enc(n,e.height),l.Int.enc(n,e.fps),l.Int.enc(n,e.bitrate/1e3);return n.ui8array().buffer}async deserializeCommandResponse(e){let t;t=e instanceof Blob?Ln(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await cn(e)):Ln(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==Yn){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==Xn){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Rn:return this.deserializeUpdateDisplayLayoutResponse(t);case zn:return this.deserializeReportPerfStatResponse(t);default:this._debug.warn(`unsupported command response commandType: `+n);return}}deserializeUpdateDisplayLayoutResponse(e){let t=l.Int.dec(e),n=l.Arr.dec(e),r={};return n.forEach(e=>{let t=Ln(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=Mn(this.participantIdRegistry?.getStreamDescription(e));r[i]=l.Int.dec(t)}}),{type:`response`,sequence:t,response:V.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:r}}deserializeReportPerfStatResponse(e){let t=l.Int.dec(e),n=l.Int.dec(e);return{type:`response`,sequence:t,response:V.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:n}}},U=function(e){return e.CALL_INIT=`call_init`,e.CALL_START=`call_start`,e.CALL_ACCEPTED_OUTGOING=`call_accepted_outgoing`,e.CALL_ACCEPTED_INCOMING=`call_accepted_incoming`,e.FIRST_MEDIA_SENT=`first_media_sent`,e.CALL_FINISH=`call_finish`,e.CODEC_USAGE=`codec_usage`,e.SIGNALING_CONNECTED=`signaling_connected`,e.SCREENSHARE_FIRST_FRAME=`screen_share_first_frame`,e.FIRST_MEDIA_RECEIVED=`first_media_received`,e.CALL_DECLINED_OR_HANGED_LOCALLY=`CallDeclinedOrHangedLocally`,e.USER_FEEDBACK_RECEIVED=`UserFeedbackReceived`,e.SIGNALING_PING_SUMMARY=`signaling_ping_summary`,e.SIGNALING_COMMAND_SUMMARY=`signaling_command_summary`,e.WEBSOCKET_CONNECTED=`websocket_connected`,e.WEBSOCKET_RECONNECTED=`websocket_reconnected`,e.WEBSOCKET_FAILED_PINGS=`websocket_failed_pings`,e.WEBSOCKET_FAILED_EXCEPTION=`websocket_failed_exception`,e.WEBSOCKET_TIMEOUT=`websocket_timeout`,e.WEBSOCKET_RESTART=`websocket_restart`,e.WEBTRANSPORT_CONNECTED=`webtransport_connected`,e.WEBTRANSPORT_RECONNECTED=`webtransport_reconnected`,e.WEBTRANSPORT_FAILED_PINGS=`webtransport_failed_pings`,e.WEBTRANSPORT_FAILED_EXCEPTION=`webtransport_failed_exception`,e.WEBTRANSPORT_TIMEOUT=`webtransport_timeout`,e.WEBTRANSPORT_RESTART=`webtransport_restart`,e}(U||{}),er=1e3;function W(e,t,n=0){return t in e&&e[t]?e[t]:n}function tr(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function nr(e,t){return n=>n[e]===t}function rr(e){return(t,n)=>n[e]-t[e]}function ir(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function ar(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function or(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>[t,e[t]]).reduce((e,t)=>(e[t[0]]=M.isObject(t[1])?or(t[1]):t[1],e),{})}function sr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function cr(e){let t=[];return RTCRtpReceiver.prototype.getStats?(t.push(...e.getReceivers().map(e=>e.getStats())),t.push(...e.getSenders().map(e=>e.getStats()))):t.push(e.getStats()),Promise.all(t).then(sr).then(ar)}function lr(e){let t=e.filter(nr(`type`,`candidate-pair`)).sort(rr(`priority`)).find(tr(nr(`nominated`,!0),nr(`selected`,!0)));if(!t)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let n={timestamp:t.timestamp,availableOutgoingBitrate:t.availableOutgoingBitrate||0,totalRoundTripTime:t.totalRoundTripTime||0,currentRoundTripTime:t.currentRoundTripTime||0,bytesSent:t.bytesSent||0,bytesReceived:t.bytesReceived||0},r=e.find(nr(`id`,t.remoteCandidateId));r&&Object.assign(n,{remote:{type:r.candidateType,address:r.ip||r.address,port:r.port,protocol:r.protocol}});let i=e.find(nr(`id`,t.localCandidateId));return i&&Object.assign(n,{local:{type:i.candidateType,address:i.ip||i.address,port:i.port,protocol:i.protocol,relayProtocol:i.relayProtocol,networkType:i.networkType}}),or(n)}function ur(e,t,n=!1){let r=ir(`id`,e);return(n?e.filter(tr(nr(`type`,`remote-inbound-rtp`))):e.filter(tr(nr(`type`,`inbound-rtp`),nr(`type`,`outbound-rtp`)))).map(e=>{let n=Number(e.ssrc),i=e.mediaType||e.kind,a=e.remoteId||e.trackId,o=e.type,s=e.codecId;if(!o||!n||!i)return null;let c={ssrc:n,type:o,kind:i,bytesReceived:W(e,`bytesReceived`),bytesSent:W(e,`bytesSent`),headerBytesReceived:W(e,`headerBytesReceived`),headerBytesSent:W(e,`headerBytesSent`),jitter:W(e,`jitter`),packetsLost:W(e,`packetsLost`),packetsReceived:W(e,`packetsReceived`),packetsSent:W(e,`packetsSent`),fractionLost:W(e,`fractionLost`),pliCount:W(e,`pliCount`),firCount:W(e,`firCount`),nackCount:W(e,`nackCount`),userId:t[n],freezeCount:W(e,`freezeCount`,0),totalFreezesDuration:W(e,`totalFreezesDuration`,0)},l=`mid`in e&&typeof e.mid==`string`?e.mid:void 0,u=`rid`in e&&typeof e.rid==`string`?e.rid:void 0;if(l&&(c.mid=l),u&&(c.rid=u),i===`video`){let t=W(e,`framesDecoded`),n=W(e,`totalInterFrameDelay`),r=W(e,`totalSquaredInterFrameDelay`),i=W(e,`encoderImplementation`),a=W(e,`decoderImplementation`);i&&(c.encoderImplementation=i),a&&(c.decoderImplementation=a),c.interframeDelayVariance=(r-n*n/t)/t}if(i===`video`&&c.type===`outbound-rtp`&&(c.totalEncodeTime=W(e,`totalEncodeTime`)??0),i===`audio`&&(c.totalSamplesReceived=W(e,`totalSamplesReceived`),c.concealedSamples=W(e,`concealedSamples`),c.insertedSamplesForDeceleration=W(e,`insertedSamplesForDeceleration`),c.removedSamplesForAcceleration=W(e,`removedSamplesForAcceleration`),c.silentConcealedSamples=W(e,`silentConcealedSamples`),c.concealmentEvents=W(e,`concealmentEvents`),c.totalAudioEnergy=W(e,`totalAudioEnergy`)),s&&r[s]){let e=r[s];c.clockRate=e.clockRate,c.mimeType=e.mimeType,i===`audio`&&e.sdpFmtpLine&&(c.sdpFmtpLine=e.sdpFmtpLine)}if(a&&r[a]){let e=r[a];c.frameHeight=e.frameHeight,c.frameWidth=e.frameWidth,c.framesDecoded=e.framesDecoded,c.framesReceived=e.framesReceived,c.framesDropped=e.framesDropped}return or(c)}).filter(e=>!!e)}function dr(e,t,n=!1){if(!t||!t.rtps.length||!e.rtps.length)return e;let r,i;n&&(r=ir(`ssrc`,e?.remoteRtps||[]),i=ir(`ssrc`,t?.remoteRtps||[]));let a=ir(`ssrc`,e.rtps),o=ir(`ssrc`,t.rtps),s=(e.timestamp-t.timestamp)/1e3;return!a||!o||Object.keys(a).forEach(c=>{let l=a[c],u=o[c];if(!(!l||!u)){if(l.bytesReceived&&l.bytesReceived>u.bytesReceived&&(l.bandwidth=Math.round((l.bytesReceived-u.bytesReceived)/s),l.bandwidth+=Math.round((l.headerBytesReceived-u.headerBytesReceived)/s)),l.bytesSent&&l.bytesSent>u.bytesSent&&(l.bandwidth=Math.round((l.bytesSent-u.bytesSent)/s),l.bandwidth+=Math.round((l.headerBytesSent-u.headerBytesSent)/s)),l.packetsReceived)if(l.packetsReceived>u.packetsReceived||l.packetsLost>u.packetsLost){let e=l.packetsLost-u.packetsLost,t=l.packetsReceived-u.packetsReceived;l.packetLoss=parseFloat((100*e/(e+t)).toFixed(2))}else l.packetLoss=0;if(l.freezeCount>u.freezeCount&&(l.freezeCountDelta=l.freezeCount-u.freezeCount),l.totalFreezesDuration>u.totalFreezesDuration&&(l.totalFreezesDurationDelta=l.totalFreezesDuration-u.totalFreezesDuration),l.framesDropped&&u.framesDropped&&l.framesDropped>u.framesDropped&&(l.framesDroppedDelta=parseFloat(((l.framesDropped-u.framesDropped)/s).toFixed(0))),n&&l.type===`outbound-rtp`&&l.kind===A.video){let n=r?.[c],a=i?.[c],o=e=>e??0,s=Math.max(0,o(n?.packetsLost)-o(a?.packetsLost)),d=Math.max(1,l.packetsSent-u.packetsSent);e.transport.averageNetStat={currentRoundTripTime:(e.transport.currentRoundTripTime+t.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(s/d*100)}}}}),e}async function fr(e,t,n={},r=!1){let i=await cr(e),a={timestamp:Date.now(),transport:lr(i),rtps:ur(i,n)};return r&&(a.remoteRtps=ur(i,n,!0)),t?dr(a,t,r):(await M.delay(er),fr(e,a,n,r))}function pr(e){performance.clearMarks(e),performance.mark(e)}function mr(e){performance.clearMarks(e)}function hr(e){let t=performance.getEntriesByName(e)[0];if(t===void 0)return null;let n=Math.round(performance.now()-t.startTime);return performance.clearMarks(e),n}function gr(e){return`${U.SCREENSHARE_FIRST_FRAME}_${_r(e)}`}function _r(e){return typeof e==`string`?e:JSON.stringify(e)}var G={distinctById:ar,rtcStatsToArray:sr,extractTransport:lr,extractRtps:ur,delta:dr,collectStats:fr,setMark:pr,clearMark:mr,measureMark:hr,getMarkNameScreenshareFirstFrame:gr},vr=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(vr||{}),K=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(K||{}),q=function(e){return e.TRANSMITTED_DATA=`transmitted-data`,e.ACCEPTED_CALL=`accepted-call`,e.HUNGUP=`hungup`,e.PARTICIPANT_ADDED=`participant-added`,e.PARTICIPANT_JOINED=`participant-joined`,e.CLOSED_CONVERSATION=`closed-conversation`,e.MEDIA_SETTINGS_CHANGED=`media-settings-changed`,e.PARTICIPANT_STATE_CHANGED=`participant-state-changed`,e.PARTICIPANTS_STATE_CHANGED=`participants-state-changed`,e.RATE_CALL_DATA=`rate-call-data`,e.FEATURE_SET_CHANGED=`feature-set-changed`,e.TOPOLOGY_CHANGED=`topology-changed`,e.PRODUCER_UPDATED=`producer-updated`,e.CONSUMER_ANSWERED=`consumer-answered`,e.MULTIPARTY_CHAT_CREATED=`multiparty-chat-created`,e.FORCE_MEDIA_SETTINGS_CHANGE=`force-media-settings-change`,e.SETTINGS_UPDATE=`settings-update`,e.VIDEO_QUALITY_UPDATE=`video-quality-update`,e.REGISTERED_PEER=`registered-peer`,e.SWITCH_MICRO=`switch-micro`,e.RECORD_STARTED=`record-started`,e.RECORD_STOPPED=`record-stopped`,e.REALLOC_CON=`realloc-con`,e.AUDIO_ACTIVITY=`audio-activity`,e.SPEAKER_CHANGED=`speaker-changed`,e.SESSION_STATE=`session-state`,e.STALLED_ACTIVITY=`stalled-activity`,e.CHAT_MESSAGE=`chat-message`,e.CUSTOM_DATA=`custom-data`,e.ROLES_CHANGED=`roles-changed`,e.MUTE_PARTICIPANT=`mute-participant`,e.PIN_PARTICIPANT=`pin-participant`,e.OPTIONS_CHANGED=`options-changed`,e.NETWORK_STATUS=`network-status`,e.PARTICIPANT_SOURCES_UPDATE=`participant-sources-update`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.CHAT_ROOM_UPDATED=`chat-room-updated`,e.PROMOTION_APPROVED=`promotion-approved`,e.JOIN_LINK_CHANGED=`join-link-changed`,e.FEEDBACK=`feedback`,e.MOVIE_UPDATE_NOTIFICATION=`movie-update-notification`,e.MOVIE_SHARE_STARTED=`movie-share-started`,e.MOVIE_SHARE_STOPPED=`movie-share-stopped`,e.URL_SHARING_INFO_UPDATED=`url-sharing-info-updated`,e.ROOM_UPDATED=`room-updated`,e.ROOMS_UPDATED=`rooms-updated`,e.ROOM_PARTICIPANTS_UPDATED=`room-participants-updated`,e.FEATURES_PER_ROLE_CHANGED=`features-per-role-changed`,e.PARTICIPANT_ANIMOJI_CHANGED=`participant-animoji-changed`,e.ASR_STARTED=`asr-started`,e.ASR_STOPPED=`asr-stopped`,e.DECORATIVE_PARTICIPANT_ID_CHANGED=`decorative-participant-id-changed`,e.VIDEO_SUSPEND_SUGGEST=`video-suspend-suggest`,e.HOLD=`hold`,e}(q||{}),yr=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),br=function(e){return e.CONNECTED=`connected`,e.RECONNECTED=`reconnected`,e.FAILED_PINGS=`failed_pings`,e.FAILED_EXCEPTIONS=`failed_exception`,e.TIMEOUT=`timeout`,e.RESTART=`restart`,e}({}),xr={connected:{wt:U.WEBTRANSPORT_CONNECTED,ws:U.WEBSOCKET_CONNECTED},reconnected:{wt:U.WEBTRANSPORT_RECONNECTED,ws:U.WEBSOCKET_RECONNECTED},failed_pings:{wt:U.WEBTRANSPORT_FAILED_PINGS,ws:U.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:U.WEBTRANSPORT_FAILED_EXCEPTION,ws:U.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:U.WEBTRANSPORT_TIMEOUT,ws:U.WEBSOCKET_TIMEOUT},restart:{wt:U.WEBTRANSPORT_RESTART,ws:U.WEBSOCKET_RESTART}},J=function(e){return e.IDLE=`IDLE`,e.OPENED=`OPENED`,e.CONNECTING=`CONNECTING`,e.RECONNECTING=`RECONNECTING`,e.CONNECTED=`CONNECTED`,e.CLOSED=`CLOSED`,e.FAILED=`FAILED`,e}(J||{}),Y=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}(Y||{}),Sr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(Sr||{}),{isObject:Cr,isObjectsEquals:wr}=M;function Tr(e,t){return e===null||t===null?e===null&&t===null:e.maxDimension!==t.maxDimension||e.maxBitrateK!==t.maxBitrateK||e.maxFramerate!==t.maxFramerate||e.degradationPreference!==t.degradationPreference||e.scalabilityMode!==t.scalabilityMode||Cr(e.bitrates)&&Cr(t.bitrates)&&!wr(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Er=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Dr(e,t){return!(!Tr(e.camera,t.camera)||!Tr(e.screenSharing,t.screenSharing)||!Tr(e.fastScreenSharing,t.fastScreenSharing))}function Or(e,t){return{camera:Object.assign({},e.camera,t.camera),screenSharing:Object.assign({},e.screenSharing,t.screenSharing),fastScreenSharing:Object.assign({},e.fastScreenSharing,t.fastScreenSharing)}}function kr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Ar=200;function jr(e){for(let t of e.values())if(t.type===`outbound-rtp`&&(t.packetsSent??0)>0)return!0;return!1}var Mr=class{constructor(e,t,n=Ar){h(this,`_peerConnection`,void 0),h(this,`_onFirstMediaSent`,void 0),h(this,`_pollIntervalMs`,void 0),h(this,`_timer`,null),h(this,`_state`,`idle`),this._peerConnection=e,this._onFirstMediaSent=t,this._pollIntervalMs=n}start(){this._state===`idle`&&(this._state=`polling`,this._poll())}destroy(){this._state!==`stopped`&&(this._state=`stopped`,this._timer!==null&&(clearTimeout(this._timer),this._timer=null))}async _getStatsReports(){return(await Promise.all(this._peerConnection.getSenders().map(async e=>{try{return await e.getStats()}catch{return null}}))).filter(e=>e!==null)}async _poll(){if(this._state===`polling`){try{let e=await this._getStatsReports();if(this._state!==`polling`)return;if(e.some(jr)){this._state=`stopped`,this._onFirstMediaSent();return}}catch{}this._scheduleNextPoll()}}_scheduleNextPoll(){this._state===`polling`&&(this._timer=setTimeout(()=>{this._timer=null,this._poll()},this._pollIntervalMs))}},Nr=class extends x{constructor(e,t,n=null){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_state`,J.IDLE),h(this,`_pc`,null),h(this,`_onFirstMediaSent`,void 0),h(this,`_firstMediaSentProbe`,null),h(this,`_firstMediaSentProbeStopped`,!1),this._signaling=e,this._mediaSource=t,this._onFirstMediaSent=n}getState(){return this._state||J.IDLE}stopFirstMediaSentProbe(){this._firstMediaSentProbeStopped=!0,this._disposeFirstMediaSentProbe()}_startFirstMediaSentProbe(){this._disposeFirstMediaSentProbe(),!(!this._pc||!this._onFirstMediaSent||this._firstMediaSentProbeStopped)&&(this._firstMediaSentProbe=new Mr(this._pc,this._onFirstMediaSent),this._firstMediaSentProbe.start())}_disposeFirstMediaSentProbe(){this._firstMediaSentProbe?.destroy(),this._firstMediaSentProbe=null}},Pr=class{constructor(e,t=null){h(this,`weightUp`,void 0),h(this,`weightDown`,void 0),h(this,`value`,NaN),this.weightUp=e,this.weightDown=t??e}set(e){this.value=e}update(e){return this.value=Number.parseFloat(this.getNext(e).toFixed(3)),this.value}getNext(e){if(isNaN(this.value))return e;let t=e<this.value?this.weightDown:this.weightUp;return this.value*(1-t)+e*t}getValue(){return this.value}},Fr=.25,Ir=.35,Lr=85,Rr=.1,zr=1.5,Br=.1,Vr=1,Hr=.6,Ur=.3,Wr=class extends x{constructor(e,t=z){super(),h(this,`_signaling`,void 0),h(this,`_localNetworkStat`,void 0),h(this,`_remoteNetworkStat`,void 0),h(this,`_lastNetworkStat`,void 0),h(this,`_networkLimits`,{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}}),h(this,`_lastStatSentTimestamp`,0),h(this,`_currentState`,`good`),h(this,`_debug`,void 0),this._debug=t,this._signaling=e,this._localNetworkStat={rtt:new Pr(Fr,Fr),loss:new Pr(Ir,Ir),bitrate:0},this._remoteNetworkStat={rtt:0,loss:0,bitrate:0},this._lastNetworkStat={rtt:0,loss:0,date:0}}_calcRttRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.rtt)/Lr);for(let e=0;e<r;e++)n*=1-Rr;return n}_calcLossRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.loss)/zr);for(let e=0;e<r;e++)n*=1-Br;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*Vr;return Math.min(n,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,n){return n?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=Hr?`good`:e>=Ur?`medium`:`bad`}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol===`tcp`,n=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),r=e.inbound.rtps.reduce((e,t)=>Math.max(e,t.packetLoss||0),0),i={rtt:this._localNetworkStat.rtt.update(n),loss:this._localNetworkStat.loss.update(r)};if(t){let t=e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0);i.bitrate=t,this._localNetworkStat.bitrate=t}let a=Date.now(),o=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),s=Math.max(Math.round(o*10)/10,.1),c=this._getNetworkState(s);(t||c!==this._currentState||a-this._lastStatSentTimestamp>N.networkStatisticsInterval)&&(this._lastStatSentTimestamp=a,this._signaling.customData({sdk:Object.assign({type:`bad-net`},i)},null).catch(e=>{this._debug.warn(`Unable to send [bad-net]`,e)})),this._currentState=c,this._triggerEvent(X.NETWORK_STATUS,s)}reportRemote(e){let{rtt:t,loss:n,bitrate:r}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=n||0,this._remoteNetworkStat.bitrate=r||0}},Gr=30*1e3,Kr=class e extends Nr{constructor(e,t,n,r,i,a=z,o=null,s=null,c=null,l=null){super(n,r,l),h(this,`_participantId`,void 0),h(this,`_isMaster`,void 0),h(this,`_remoteSDP`,{}),h(this,`_remoteCandidates`,{}),h(this,`_lastRemoteSDP`,null),h(this,`_animojiDataChannel`,null),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_remoteAnimojiVersion`,1),h(this,`_isOpen`,!1),h(this,`_remotePeerId`,null),h(this,`_statInterval`,null),h(this,`_settingsInterval`,null),h(this,`_failedOnCreate`,null),h(this,`_remoteStream`,null),h(this,`_iceRestartTimeout`,null),h(this,`_reconnectionTimeout`,null),h(this,`_reconnectionPrevented`,!1),h(this,`_remoteHold`,!1),h(this,`_lastStat`,null),h(this,`_fingerprint`,null),h(this,`_neverConnected`,!0),h(this,`_serverSettings`,void 0),h(this,`_prevConsumerSettings`,{}),h(this,`_networkLimitsForVideo`,{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}}),h(this,`_videoMaxDimensionsForNet`,{worst:320,bad:640,good:1280}),h(this,`_lastVideoMaxDimension`,this._videoMaxDimensionsForNet.good),h(this,`_lastBadConnection`,0),h(this,`_perfStatReporter`,void 0),h(this,`_directStatReporter`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),this._participantId=e,this._isMaster=t,this._serverSettings=i,this._debug=a,this._logger=o,this._statAggregator=s,this._codecStatsAggregator=c,this._perfStatReporter=new ma(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new Wr(n,this._debug),this.subscribe(this._signaling,K.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._applySettings.bind(this)),this.subscribe(this._directStatReporter,X.NETWORK_STATUS,this._onNetworkStatus.bind(this));try{this._pc=this._createPeerConnection()}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this._failedOnCreate=e;return}if(this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(w.ERROR,`addTrack-direct`),this._debug.error(`Unable to add media source tracks`,e,{participantId:this._participantId}),this._failedOnCreate=e;return}this._createOffer(!1).catch(e=>{this._state===J.IDLE?this._failedOnCreate=e:this.close(e)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return!this._pc||[J.IDLE,J.CLOSED,J.FAILED].includes(this.getState())}async open(e=null){if(this._isOpen){this._debug.warn(`DirectTransport: Already opened`,{participantId:this._participantId});return}if(this._failedOnCreate){this._finishClose(this._failedOnCreate);return}if(this._debug.debug(`DirectTransport: Open transport`,{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(w.ERROR,`addTrack-direct`),this._debug.error(`DirectTransport: Unable to add media source tracks`,e,{participantId:this._participantId}),this.close(e);return}this._startFirstMediaSentProbe(),this._setState(J.OPENED);let t=e;if(!e){let e=Object.keys(this._remoteSDP);t=e[e.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){Dr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setRemoteHold(e){if(this._remoteHold!==e){if(this._remoteHold=e,e){this._stopReconnection(),this._stopStatInterval(),this._stopSettingsInterval(),this._isOpen&&(this._disposePeerConnection(),this._remoteSDP={},this._remoteCandidates={},this._lastRemoteSDP=null);return}this._isOpen&&this._recreatePeerConnection()}}_recreatePeerConnection(){this._debug.log(`Recreating peer connection after remote unhold`,{participantId:this._participantId});try{this._pc=this._createPeerConnection()}catch(e){this._debug.error(`Failed to recreate RTCPeerConnection:`,e),this.close(e);return}this._neverConnected=!0;try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._debug.error(`Unable to add media source tracks after unhold`,e,{participantId:this._participantId});return}this._startFirstMediaSentProbe(),this._startSettingsInterval(),this._isMaster&&this._createOffer(!1).catch(e=>{this._debug.error(`Unable to create offer after unhold`,e,{participantId:this._participantId})}),this._setState(J.CONNECTING)}_createPeerConnection(){let e=new RTCPeerConnection({iceServers:N.iceServers,iceTransportPolicy:N.forceRelayPolicy?`relay`:`all`});return e.onicecandidate=this._handleIceCandidate.bind(this),e.ontrack=this._onAddTrack.bind(this),e.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),e.onconnectionstatechange=this._onConnectionStateChange.bind(this),e.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},N.vmoji&&this._createDataChannel(e,Sr.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),e}_disposePeerConnection(){if(this._disposeFirstMediaSentProbe(),this._lastStat=null,this._remoteStream){let e=this._remoteStream;e.getTracks().forEach(t=>{t.stop(),this._triggerEvent(X.REMOTE_TRACK_REMOVED,e,t)}),this._remoteStream=null}this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close(),this._animojiDataChannel=null),this._pc&&(this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.oniceconnectionstatechange=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._pc.close(),this._pc=null)}setAnimojiTransport(e,t){if(N.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&this._finishClose(e)}_finishClose(e){this._isOpen=!1,this._stopReconnection(),this._stopStatInterval(),this._stopSettingsInterval(),this._disposePeerConnection(),this._onNetworkStatus(1),this.unsubscribe(),e?(this._debug.error(`DirectTransport: Closed`,e,{participantId:this._participantId}),this._setState(J.FAILED)):(this._debug.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(J.CLOSED)),this._triggerEvent(X.PEER_CONNECTION_CLOSED)}_setState(e){this._state!==e&&(this._debug.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent(X.STATE_CHANGED,e))}_onSignalingNotification(e){switch(e.notification){case q.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case q.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case q.CUSTOM_DATA:Object.hasOwn(e.data,`sdk`)&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,n=M.getPeerIdString(e.peerId);M.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(n,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(n,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){this._debug.debug(`Add remote ice candidate`,{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(e){throw this._logger?.log(w.ERROR,`addIceCandidate-direct`),this._debug.error(`Unable to add remote ice candidate`,e,{participantId:this._participantId,candidate:t}),e}}else this._debug.debug(`Cache remote ice candidate`,{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){this._debug.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let n of t)try{await this._addIceCandidate(e,n)}catch{}}async _setRemoteDescription(t,n){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===t)&&this._pc){if(this._lastRemoteSDP?.sdp===n.sdp)return;this._lastRemoteSDP=n,n=e._patchRemoteDescription(n),this._debug.debug(`Add remote description`,{participantId:this._participantId,sdp:n}),this._calcFingerprint(n.sdp);try{await this._pc.setRemoteDescription(n),await this._setRemoteCandidates(t),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(e){throw this._logger?.log(w.ERROR,`setRemoteDescription-direct`),this._debug.error(`Unable to set remote description`,e,{participantId:this._participantId,sdp:n}),e}}else this._remoteSDP[t]=n}_processAnimojiProtocolVersion(e){let t=Math.min(e,N.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){this._debug.debug(`Added remote track`,{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=e=>{this._triggerEvent(X.REMOTE_TRACK_REMOVED,this._remoteStream,e.track)}),this._triggerEvent(X.REMOTE_TRACK_ADDED,this._remoteStream,e.track)}async _handleIceCandidate(e){this._signaling.ready&&(e.candidate?(this._debug.debug(`Local ice candidate`,{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate)):N.forwardEmptyIceCandidate&&(this._debug.debug(`ICE gathering complete, forwarding empty candidate`,{participantId:this._participantId}),await this._signaling.sendCandidate(this._participantId,{candidate:``})))}_onSignalingStateChange(){this._debug.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:N.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case`have-local-offer`:let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(Error());break;case`have-remote-offer`:this._createAnswer().then(t=>this._signaling.sendSdp(this._participantId,t,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case`checking`:{let e=this.getState();e===J.IDLE||e===J.OPENED?this._setState(J.CONNECTING):this._setState(J.RECONNECTING);break}case`connected`:case`completed`:this._pc?.connectionState!==`connected`&&(this._debug.warn(`DirectTransport: marking connected via iceConnectionState fallback`,{participantId:this._participantId,connectionState:this._pc?.connectionState,iceConnectionState:this._pc?.iceConnectionState}),this._logger?.log(w.ERROR,`iceConnectionState-fallback`),this._markConnected());break}}_markConnected(){this._neverConnected=!1,this._setState(J.CONNECTED),this._stopReconnection(),this._pc&&M.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(w.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))}),this._startStatInterval()}_onConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),this._logger?.log(w.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case`connected`:this._markConnected();break;case`failed`:case`disconnected`:this._remoteHold?this._debug.log(`Remote participant on hold, skipping reconnection`,{participantId:this._participantId}):this._reconnectionPrevented?this.close(Error(`Ice connection ${this._pc.connectionState}`)):(this._setState(J.RECONNECTING),this._startReconnection());break;case`closed`:this._remoteHold||this.close(Error(`Ice connection closed`));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(this._debug.log(`Waiting for reconnection...`,{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},N.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(Y.SERVER).catch(e=>{e instanceof Tn||this._debug.warn(`Unable to switch topology DIRECT to SERVER`,e)}))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(this._logger?.log(w.ICE_RESTART),this._debug.log(`Ice restart`,{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):this._debug.debug(`Waiting for ice restart...`,{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,this._debug.error(`Ice restart failed`,{participantId:this._participantId}),this._logger?.log(w.ERROR,`iceRestart-direct`),this._requestTopologySwitch()},N.iceRestartWaitTime)}async _createOffer(t){let n={iceRestart:t,offerToReceiveAudio:!0,offerToReceiveVideo:!0};this._debug.debug(`Create offer`,{participantId:this._participantId,options:n});let r;try{r=await this._pc?.createOffer(n),this._debug.debug(`Created offer`,{participantId:this._participantId,offer:r}),r=e._patchLocalDescription(r)}catch(e){throw this._debug.error(`Unable to create offer`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`createOffer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`setLocalDescription-direct`),e}}async _createAnswer(){this._debug.debug(`Create answer`,{participantId:this._participantId});let t;try{t=await this._pc?.createAnswer(),this._debug.debug(`Created answer`,{participantId:this._participantId,answer:t}),t=e._patchLocalDescription(t)}catch(e){throw this._debug.error(`Unable to create answer`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`createAnswer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,answer:t}),this._calcFingerprint(t.sdp),await this._pc?.setLocalDescription(t),t}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`setLocalDescription-direct`),e}}static _patchLocalDescription(e){let t=!!E.baseChromeVersion();return e.sdp=M.patchLocalSDP(e.sdp,N.preferH264&&E.canPreferH264(),E.isBrokenH264Decoder(),N.preferVP9,t&&N.audioNack),e}static _patchRemoteDescription(e){return e.sdp=M.patchRemoteSDP(e.sdp,!1,!1,N.preferVP9,E.isBrokenVP9Encoder(),E.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(e=>{this._debug.error(`DirectTransport: Unable to replace track`,e,{participantId:this._participantId}),this._logger?.log(w.ERROR,`replaceTrack-direct`)})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}G.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,this._codecStatsAggregator?.reportUsage(t);let n={inbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`inbound-rtp`?(e.userId=this._participantId,!0):!1)},outbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(n),this._directStatReporter.reportLocal(n),this._triggerEvent(X.REMOTE_DATA_STATS,n),this._statInterval=window.setTimeout(e,N.statisticsInterval)})};this._statInterval=window.setTimeout(e,N.statisticsInterval)}async _isSVCSupported(e,t){let n=this._mediaSource.getSendVideoTrack(),r=e.outbound.rtps.find(e=>e.kind===`video`);if(!r?.mimeType||!r?.bandwidth||!n)return!1;let i=n.getSettings();if(!i.width||!i.height||!i.frameRate)return!1;let a={type:`webrtc`,video:{contentType:r.mimeType,width:i.width,height:i.height,bitrate:r.bandwidth,framerate:i.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(a)).supported||!1}catch(e){return this._debug.warn(`Failed to get encodingInfo`,a,e),!1}}async _checkPPTNetwork(e){if(!N.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,n=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,r=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,i=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,a=this._videoMaxDimensionsForNet.good,o=Er.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=Er.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=Er.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Er.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Gr)||this._lastVideoMaxDimension===a)return;let s=this._serverSettings.camera;if(!s||!await this._isSVCSupported(e,o))return;this._debug.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a}),this._lastVideoMaxDimension=a;let c={...this._serverSettings,camera:{...s,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(c)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[``]=e,this._triggerEvent(X.NETWORK_STATUS,t)}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=M.sdpFingerprint(e);if(t===null){this._debug.warn(`Fingerprint calculation is unsupported`);return}this._fingerprint===null?this._fingerprint=t:(R.onFingerprintChange((this._fingerprint^t).toString()),this._fingerprint=null)}_applySettings(){let e=this._mediaSource.mediaSettings.isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState===`connected`&&(this._prevConsumerSettings=M.applySettings(this._pc,e,this._prevConsumerSettings,this._debug))}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{negotiated:!0,id:1});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),r.onerror=e=>{this._debug.error(`[${t}] data channel error`,e)},n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)}}},qr=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),Jr=16,Yr=class e{constructor(e,t,n,r=z){h(this,`_datachannel`,void 0),h(this,`_participantIdRegistry`,void 0),h(this,`_asrCallback`,void 0),h(this,`_textDecoder`,void 0),h(this,`_debug`,void 0),this._debug=r,this._debug.debug(`AsrReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._asrCallback=n,this._textDecoder=new TextDecoder,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}static parse(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint8(1);if(r!==0)throw Error(`Unsupported message type. Message type: ${r}`);let i=t.getUint16(2),a=t.getUint32(4),o=t.getUint32(8),s=t.getUint32(12);if(n!==1)throw Error(`Unexpected protocol version. Got ${n}, expected 1`);return{sequence:i,ssrc:a,timestamp:o,duration:s,data:e.slice(Jr)}}_onDataChannelMessage(t){let n=e.parse(t),r=this._participantIdRegistry?.getStreamDescription(n.ssrc)?.participantId;if(!r){this._debug.warn(`Participant id for ssrc ${n.ssrc} not found in registry`);return}let i={participantId:r,text:this._textDecoder.decode(n.data),timestamp:n.timestamp,duration:n.duration};this._asrCallback(i)}destroy(){this._datachannel.onmessage=null}},Xr,Zr=class{constructor(){h(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};Xr=Zr,h(Zr,`_instance`,null),h(Zr,`getInstance`,()=>(Xr._instance||(Xr._instance=new Xr),Xr._instance));var Qr=class{constructor(e=z){h(this,`streamDescriptionByCompactId`,new Map),h(this,`compactIdByStreamDescription`,new Map),h(this,`_debug`,void 0),this._debug=e}getStreamDescription(e){return this.streamDescriptionByCompactId.get(e)}getCompactId(e){return this.compactIdByStreamDescription.get(e)}handleMessage(e){let t=new Uint8Array(e),n=t[0],r=t.subarray(1);switch(n){case 1:let e=(0,l.decode)(r);return Object.entries(e).forEach(([e,t])=>{let n=Nn(e);this.streamDescriptionByCompactId.set(t,n),this.compactIdByStreamDescription.set(e,t)}),null;case 2:case 4:let t=(0,l.decode)(r),i=[];for(let e of t){let t=this.getStreamDescription(e);t&&i.push(t.participantId)}return n===2?{type:`notification`,notification:q.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:q.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:q.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:q.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:o[0],maxDimension:o[1]},mediaType:this._decodeMediaType(o[2])};case 6:let s=(0,l.decode)(r),c={};for(let[e,t]of Object.entries(s)){let n=this.getStreamDescription(Number(e))?.participantId;n&&(c[n]=t/100)}return{type:`notification`,notification:q.NETWORK_STATUS,statuses:c};case 7:return this._createParticipantSourcesUpdateNotification(r);case 8:{let e=(0,l.decode)(r).map(e=>{let[t,n,r,i,a,o,s]=e;return{participantId:this.getStreamDescription(t)?.participantId,gain:n,pause:r,offset:i,mute:a,liveStatus:o,startTimeMs:s}});return{type:`notification`,notification:q.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:q.VIDEO_SUSPEND_SUGGEST,bandwidth:u};default:return this._debug.debug(`unsupported message type: `+n),null}}_decodeMediaType(e){if(e===null)return null;switch(e){case 0:return H.CAMERA;case 1:return H.SCREEN;default:throw Error(`Unsupported media type: ${e}`)}}_createParticipantSourcesUpdateNotification(e){let t=(0,l.decode)(e),n=[];for(let[e,r]of Object.entries(t)){let t=r[0],i=r[1],a=r[2],o=!!r[3],s=r[4]===null?void 0:!!r[4],c;if(t!==null){if(c=this.getStreamDescription(t),!c){this._debug.error(`could not uncompress participant ID ${t}`);continue}}else c=null;if(a===null){this._debug.error(`unexpected null sequenceNumber`,e,r);continue}let l=qr.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+`-`+e,u=i?i>>>0:null;n.push({participantStreamDescription:c,streamId:l,rtpTimestamp:u,sequenceNumber:a,fastScreenShare:o,suspend:s})}return{type:`notification`,notification:q.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},$r=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({}),ei=class{constructor(e=z,t=null){h(this,`_worker`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._debug=e,this._logger=t}async _createWorker(e,t,n=[],r={},i=[]){return new Promise((a,o)=>{let s=!1,c=!1,l=n.join(`,`),u=new Blob([e,`exports.default(${l});`],{type:`application/javascript; charset=utf-8`}),d=window.URL.createObjectURL(u),f=new Worker(d);window.URL.revokeObjectURL(d),this._worker=f;let p=e=>{c||(c=!0,o(e))},m=e=>{if(this._debug.warn(e),!s){p(e);return}t({type:$r.FRAME,error:e})};f.onerror=e=>{e.preventDefault?.(),m(this._formatWorkerError(e))},f.onmessageerror=e=>{e.preventDefault?.(),m(this._formatWorkerMessageError(e))},f.onmessage=e=>{switch(e.data.type){case $r.READY:s=!0,c||(c=!0,a());break;case $r.ERROR:s?m(e.data.error):p(e.data.error);break;case $r.FRAME:t(e.data);break;case $r.DEBUG:this._debug.debug(e.data.message);break;case $r.LOG_ERROR:this._logger?.log(w.ERROR,e.data.message);break}},this._sendToWorker($r.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}_formatWorkerError(e){let t=e.message||e.error?.message||`Unknown worker error`,n=[[e.filename,e.lineno,e.colno].filter(Boolean).join(`:`),[e.error?.name,e.error?.stack].filter(Boolean).join(`: `)].filter(Boolean).join(` `);return`${this.constructor.name} Worker crashed: ${t}${n?` (${n})`:``}`}_formatWorkerMessageError(e){return`${this.constructor.name} Worker message error${e.origin?` from ${e.origin}`:``}`}static isBrowserSupported(){throw Error(`Not implemented`)}},ti=class extends ei{constructor(e=z,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`LibVPxDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n)=>{let r=null,i=null,a=!0,o=!1;function s(){return t({locateFile:n}).then(e=>i=e)}function c(t,n,s,c){if(!i){self.postMessage({type:e.LOG_ERROR,message:`decoder-init-fail-libvpx`}),self.postMessage({type:e.FRAME,error:`Fatal initialization error`});return}if(a!==s&&(a=s,r&&(r=null,self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec changed to ${s?`VP9`:`VP8`} - reinitialize`}))),!r&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec ${s?`VP9`:`VP8`}`}),r=new i.VpxDecoder,r.debug(c),!r.init(s?i.VpxType.VP9:i.VpxType.VP8))){r=null,self.postMessage({type:e.FRAME,error:`Decoder failed to create`});return}try{r.allocateBuffer(n.byteLength).set(new Uint8Array(n))}catch(t){self.postMessage({type:e.DEBUG,message:t}),r=null,self.postMessage({type:e.FRAME,error:String(t)});return}if(r.decode()&&r.nextImage())o=!1;else{self.postMessage({type:e.FRAME,error:`Decode failed`}),l();return}let u=r.getImageBuffer();if(!u){self.postMessage({type:e.FRAME,error:`No decoded data`});return}let d=r.getImageWidth(),f=r.getImageHeight();r.nextImage()&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxDecoder-drop`}));let p=new Uint8ClampedArray(u.byteLength);p.set(u),self.postMessage({type:e.FRAME,data:p.buffer,width:d,height:f},[p.buffer])}function l(){o||(self.postMessage({type:e.FRAME,requestKeyFrame:!0}),o=!0)}s().then(()=>{self.onmessage=t=>{switch(t.data.type){case e.FRAME:c(t.data.timestamp,t.data.data,t.data.isVP9,t.data.debug);break}},self.postMessage({type:e.READY})}).catch(t=>{self.postMessage({type:e.ERROR,error:String(t)})})}})(),exports={default:workerExports};",r=>{r.error?(this._debug.warn(`LibVPxDecoder`,r.error),t(r.error)):r.requestKeyFrame?(this._debug.debug(`LibVPxDecoder requests key frame`),n()):e(new ImageData(new Uint8ClampedArray(r.data),r.width,r.height))},[u.default,u.default.getUrl])}decodeFrame(e,t,n,r){this._sendToWorker($r.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r,debug:z.enabled()},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`LibVPxDecoder destroyed`)}static isBrowserSupported(){return`WebAssembly`in window&&`Worker`in window}},ni=class extends ei{constructor(e=z,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`WebCodecsDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return n=>{let r=null,i=`no-preference`,a=!0,o=!1,s=!1,c=null,l=null;function u(e){return e instanceof Error?[e.name,e.message,e.stack].filter(Boolean).join(`: `):String(e)}function d(e,n){try{self.postMessage({type:t.FRAME,error:`WebCodecsDecoder ${e} failed: ${u(n)}`})}catch{}}function f(){self.postMessage({type:t.READY})}function p(e,n,r,i=!1){try{c={timestamp:e,data:n,isVP9:r,keyFrame:i};let a=h(r);if(o&&!i){self.postMessage({type:t.FRAME,error:`WebCodecsDecoder waiting for keyframe`}),m();return}else o&&i&&(o=!1,s=!1,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder got keyframe. Start decoding`}));let l=new EncodedVideoChunk({type:i?`key`:`delta`,timestamp:e,data:n});a.decode(l)}catch(e){_(`because failed call decode: ${u(e)}`),d(`decode`,e);return}v(i)}self.onmessage=e=>{try{switch(e.data.type){case t.INIT:f();break;case t.FRAME:p(e.data.timestamp,e.data.data,e.data.isVP9,e.data.keyFrame);break}}catch(e){d(`message`,e)}};function m(){s||(self.postMessage({type:t.FRAME,requestKeyFrame:!0}),s=!0)}function h(e){if(a!==e&&(a=e,_(`because codec is changed to ${a?`VP9`:`VP8`}`)),!r){o=!0,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec ${a?`VP9`:`VP8`}`}),r=new VideoDecoder({output:e=>{y(),g(e)},error:e=>{y(),_(`because error during decoding: ${u(e)}`),i===`prefer-software`?self.postMessage({type:t.FRAME,error:`WebCodecsDecoder failed, reinitialize: `+u(e)}):(i=`prefer-software`,c&&c.keyFrame&&p(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${u(e)}`}))}});try{r.configure(b(a,i))}catch(e){throw _(`because failed configure: ${u(e)}`),d(`configure`,e),e}}return r}function g(e){try{let r=n?[e]:[];self.postMessage({type:t.FRAME,data:e},r)}catch(n){try{self.postMessage({type:t.FRAME,data:e})}catch(e){d(`postMessage`,e),d(`postMessage transfer`,n)}}finally{try{e.close()}catch{}}}function _(e){if(r){try{r&&r.state!==`closed`&&r.close()}catch{}r=null,self.postMessage({type:t.FRAME,error:`WebCodecsDecoder reset ${e}`})}}function v(e=!1){l=setTimeout(()=>{_(`because of decode timeout`)},3e3)}function y(){l&&clearTimeout(l),l=null}function b(t,n){return{codec:t?e.VP9:e.VP8,hardwareAcceleration:n}}}})(),exports={default:workerExports};",r=>{r.error?(this._debug.warn(`WebCodecsDecoder`,r.error),t(r.error)):r.requestKeyFrame?(this._debug.debug(`WebCodecsDecoder requests key frame`),n()):(e(r.data),r.data.close())},[!0])}decodeFrame(e,t,n,r=!1){this._sendToWorker($r.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`WebCodecsDecoder destroyed`)}static isBrowserSupported(){return`VideoDecoder`in window&&`Worker`in window&&`VideoFrame`in window&&!E.isBrokenVP9Decoder()&&E.browserName()!==`Firefox`}},ri=class{constructor(e=null,t=0){h(this,`_counter`,0),h(this,`_interval`,0),h(this,`_lastCalculationTime`,Date.now()),h(this,`_onCalculated`,null),this._onCalculated=e,t&&(this._interval=window.setInterval(()=>this.calculate(),t))}increment(e=1){this._counter+=e}calculate(){let e=Date.now(),t=e-this._lastCalculationTime,n=Math.round(this._counter*1e3/t);return this._counter=0,this._lastCalculationTime=e,this._onCalculated?.(n),n}destroy(){window.clearInterval(this._interval),this._interval=0}},ii=class{constructor(e,t){h(this,`_participantId`,void 0),h(this,`_statAggregator`,void 0),h(this,`_firstFrameReceived`,!1),this._participantId=e,this._statAggregator=t}measure(e,t){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let n=G.getMarkNameScreenshareFirstFrame(this._participantId),r=G.measureMark(n);r!==null&&this._statAggregator?.logEventualStat({name:U.SCREENSHARE_FIRST_FRAME,value:r,width:e,height:t})}},ai=65536,oi=`MARK_SCREENSHARE_FREEZE_DURATION`,si=class e{constructor(e,t,n,r,i,a=z){h(this,`_participantId`,void 0),h(this,`_onStream`,void 0),h(this,`_onStat`,void 0),h(this,`_onKeyFrameRequested`,void 0),h(this,`_statScreenShareFirstFrame`,void 0),h(this,`_debug`,void 0),h(this,`_chunks`,[]),this._participantId=e,this._onStream=t,this._onStat=n,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new ii(e,r),this._debug=a}appendChunk(t){let n=this._chunks.length;if(t.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),n&&(this._debug.warn(`[FrameBuilder] Cleanup buffer`,Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!n||(this._chunks[n-1].sequence+1)%ai!==t.sequence){this._debug.warn(`[FrameBuilder] Got incorrect chunk`);return}if(this._chunks.push(t),t.end){let n=this._processFrameData(),{width:r,height:i}=e.getFrameSize(n);this._processFrame({timestamp:t.timestamp,frameData:n,isVP9:t.isVP9,keyframe:t.keyframe,width:r,height:i}),this._statScreenShareFirstFrame.measure(r,i)}}destroy(){G.clearMark(oi),G.clearMark(G.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let e=this._chunks;this._chunks=[];let t=e.reduce((e,t)=>e+t.data.byteLength,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(new Uint8Array(t.data),r),r+=t.data.byteLength;return n}static getFrameSize(e){let t={width:0,height:0},n=new d.BitStream(e.buffer);n.bigEndian=!0,n.index+=2;let r=n.readBits(1),i=n.readBits(1)<<1|r;return i===3&&n.index++,n.readBits(1)===1||n.readBits(1)!==0?t:(n.index++,n.index++,n.index+=24,i>=2&&n.index++,n.readBits(3)===7?(i===1||i===3)&&n.index++:(n.index++,(i===1||i===3)&&(n.index+=3)),t.width=n.readBits(16)+1,t.height=n.readBits(16)+1,t)}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(e){if(e){G.setMark(oi);return}let t=G.measureMark(oi);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},ci=class{constructor(e){h(this,`_onStream`,void 0),this._onStream=e}async drawFrame(e){throw Error("Method `drawFrame` is not supported by this implementation")}async drawImage(e){throw Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}},li=class extends ci{constructor(e,t=z){super(e),h(this,`_useImageBitmap`,void 0),h(this,`_canvas`,null),h(this,`_canvasContext`,null),h(this,`_stream`,null),h(this,`_track`,null),h(this,`_debug`,void 0),this._debug=t,this._debug.debug(`CanvasRenderer started`),this._useImageBitmap=`ImageBitmap`in window}_createStream(e,t){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.width=e,this._canvas.height=t,this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`0`,this._canvas.style.zIndex=`5000`,document.body.appendChild(this._canvas),this._useImageBitmap?this._canvasContext=this._canvas.getContext(`bitmaprenderer`):this._canvasContext=this._canvas.getContext(`2d`),this._stream=this._canvas.captureStream(0),this._track=this._stream.getVideoTracks()[0],this._track.contentHint=`text`)}_removeStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null,this._track=null),this._canvasContext=null;try{this._canvas&&document.body.removeChild(this._canvas)}catch{}this._canvas=null}_requestCanvasFrame(){this._track&&this._track.requestFrame?this._track.requestFrame():this._stream&&this._stream.requestFrame&&this._stream.requestFrame()}async _drawImage(e){this._track||(this._createStream(e.width,e.height),this._onStream(this._stream));let t=this._canvas;if(t.width=e.width,t.height=e.height,this._useImageBitmap){let t;if(e instanceof ImageBitmap)t=e;else{let{width:n,height:r,data:i}=e,a=n*r*4;if(i.byteLength!==a){this._debug.warn(`Bad frame buffer`,{w:n,h:r,got:i.byteLength,expected:a});return}t=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){this._debug.warn(`Canvas context is null`),t.close();return}this._canvasContext.transferFromImageBitmap(t),t.close()}else{let n=this._canvasContext;n.clearRect(0,0,t.width,t.height),n.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t=`createImageBitmap`in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),this._debug.debug(`CanvasRenderer destroyed`)}static isBrowserSupported(){return(`CanvasCaptureMediaStream`in window||`CanvasCaptureMediaStreamTrack`in window)&&!(E.browserName()===`Safari`&&Number(E.browserVersion())===15)}},ui=class extends ci{constructor(e,t=z){super(e),h(this,`_generator`,void 0),h(this,`_writer`,void 0),h(this,`_stream`,void 0),h(this,`_debug`,void 0),this._debug=t,this._debug.debug(`TrackGeneratorRenderer started`),this._generator=new MediaStreamTrackGenerator({kind:A.video}),this._writer=this._generator.writable.getWriter(),this._stream=new MediaStream([this._generator]),this._onStream(this._stream)}async drawFrame(e){await this._writer.write(e)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),this._debug.debug(`TrackGeneratorRenderer destroyed`)}static isBrowserSupported(){return`VideoFrame`in window&&`MediaStreamTrackGenerator`in window&&ni.isBrowserSupported()}},di=class extends si{constructor(e,t,n,r,i,a=z,o=null){super(e,t,n,r,i,a),h(this,`_renderer`,void 0),h(this,`_decoder`,void 0),h(this,`_decoderReady`,!1),h(this,`_decoderBusy`,!1),h(this,`_decoderQueue`,[]),h(this,`_fpsMeter`,void 0),h(this,`_logger`,void 0),this._logger=o,this._debug.debug(`StreamBuilder started for participant [${e}]`),this._initFpsMeter(),this._initRenderer(),this._initDecoder()}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_initFpsMeter(){this._fpsMeter=new ri(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!ui.isBrowserSupported()?this._renderer=new li(this._onStream,this._debug):this._renderer=new ui(this._onStream,this._debug)}_initDecoder(e=!1){e||!ni.isBrowserSupported()?this._decoder=new ti(this._debug,this._logger):this._decoder=new ni(this._debug,this._logger),this._decoder.init(async e=>{this._decoderBusy=!1,`VideoFrame`in window&&e instanceof VideoFrame?await this._renderer.drawFrame(e):await this._renderer.drawImage(e),this._fpsMeter.increment(),this._decodeQueue()},e=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof ni&&typeof e==`string`&&e.includes(`EncodingError`)&&this._switchToLibVPXDecoder()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()}).catch(e=>{this._debug.warn(`StreamBuilder decoder init failed`,e),this._decoder instanceof ni&&this._switchToLibVPXDecoder()})}_switchToLibVPXDecoder(){this._debug.warn(`StreamBuilder switch to LibVPX decoder`),this._fpsMeter&&this._fpsMeter.destroy(),this._decoder&&(this._decoderReady=!1,this._decoderBusy=!1,this._decoder.destroy()),this._renderer&&this._renderer.destroy(),this._initFpsMeter(),this._initRenderer(!0),this._initDecoder(!0)}_decodeQueue(){if(!this._decoderReady||this._decoderBusy)return;let e=this._decoderQueue.shift();e&&(this._decoderBusy=!0,this._decoder.decodeFrame(e.timestamp,e.frameData,e.isVP9,e.keyframe))}destroy(){super.destroy(),this._fpsMeter.destroy(),this._decoder.destroy(),this._renderer.destroy(),this._debug.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return li.isBrowserSupported()||ui.isBrowserSupported()}},fi=1,pi=1,mi=2,hi=0,gi=1,_i=2,vi=4,yi=8;function bi(e,t,n,r,i,a,o){let s=0;t&&(s|=gi),n&&(s|=_i),r&&(s|=vi),o||(s|=yi);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,fi),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,hi),l.setUint8(10,s),!o)return c;let u=new Uint8Array(c.byteLength+o.byteLength);return u.set(new Uint8Array(c),0),u.set(new Uint8Array(o),c.byteLength),u.buffer}function xi(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint16(1),i=t.getUint32(3),a=t.getUint8(7)===1,o=t.getUint16(8),s=t.getUint8(10),c=!!(s&gi),l=!!(s&_i),u=!!(s&vi),d=!!(s&yi);if(n!==fi)throw Error(`Unexpected protocol version. Got ${n}, expected ${fi}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function Si(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==fi||t.getUint8(1)!==pi||t.getUint16(2)!==hi)}function Ci(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==fi||t.getUint8(1)!==mi||t.getUint16(2)!==hi?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function wi(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,fi),n.setUint8(1,pi),n.setUint16(2,e),t}var Ti=2**15-1,Ei=1,Di=5,Oi=5,ki=class e{constructor(e,t=z){h(this,`_mediaSource`,void 0),h(this,`_codec`,void 0),h(this,`_sourceBuffer`,null),h(this,`_queue`,[]),h(this,`_clearBufferTill`,0),h(this,`_debug`,void 0),this._mediaSource=new MediaSource,this._codec=e,this._debug=t;let n=()=>{this._mediaSource.removeEventListener(`sourceopen`,n),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener(`sourceopen`,n,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let e=this._sourceBuffer.buffered.start(0);e<this._clearBufferTill&&(this._sourceBuffer.remove(e,this._clearBufferTill),this._debug.debug(`[WebmBuilder] SourceBuffer cleanup from ${e} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let t=this._queue;this._queue=[];let n=e._buildQueue(t);this._sourceBuffer.appendBuffer(n)}static _buildQueue(e){if(!e.length)return new Uint8Array;if(e.length===1)return f.build(e[0]);let t=e.reduce((e,t)=>e+t.countSize(),0),n=new Uint8Array(t),r=0;for(let t of e){let e=f.build(t);n.set(e,r),r+=e.byteLength}return n}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode=`sequence`,this._sourceBuffer.addEventListener(`updateend`,()=>this._handleQueue())}changeType(e){return this._codec=e,this._sourceBuffer?.changeType(e)}append(e,t=!1){this._queue.push(e),t&&this._handleQueue()}cleanup(){this._mediaSource?.readyState===`open`&&this._sourceBuffer?.abort();let e=this._sourceBuffer?.buffered,t=e?.length;if(!t)return;let n=e.start(0),r=Math.max(0,e.end(t-1)-Di);r-n>Oi&&(this._clearBufferTill=r)}destroy(){this._queue=[],this._mediaSource.readyState===`open`&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},Ai=class e extends si{constructor(e,t,n,r,i=z){super(e,t,n,r,void 0,i),h(this,`_mediaBuffer`,null),h(this,`_video`,null),h(this,`_stream`,null),h(this,`_earliestTimestamp`,0),h(this,`_clusterStartTime`,0),h(this,`_lastFrameTimestamp`,0),this._debug.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return f.element(f.ID.EBML,[f.element(f.ID.EBMLVersion,f.number(1)),f.element(f.ID.EBMLReadVersion,f.number(1)),f.element(f.ID.EBMLMaxIDLength,f.number(4)),f.element(f.ID.EBMLMaxSizeLength,f.number(8)),f.element(f.ID.DocType,f.string(`webm`)),f.element(f.ID.DocTypeVersion,f.number(2)),f.element(f.ID.DocTypeReadVersion,f.number(2))])}static _genSegmentHeader(e,t,n){let r=f.element(f.ID.Info,[f.element(f.ID.TimecodeScale,f.number(1e6)),f.element(f.ID.MuxingApp,f.string(`vk-webm-builder`)),f.element(f.ID.WritingApp,f.string(`vk-webm-builder`))]),i=[f.element(f.ID.PixelWidth,f.number(e)),f.element(f.ID.PixelHeight,f.number(t))],a=f.element(f.ID.Tracks,f.element(f.ID.TrackEntry,[f.element(f.ID.TrackNumber,f.number(Ei)),f.element(f.ID.TrackUID,f.number(Ei)),f.element(f.ID.TrackType,f.number(1)),f.element(f.ID.FlagLacing,f.number(0)),f.element(f.ID.DefaultDuration,f.number(1e9)),f.element(f.ID.CodecID,f.string(`V_${n.toUpperCase()}`)),f.element(f.ID.Video,i)]));return f.unknownSizeElement(f.ID.Segment,[r,a])}static _genClusterHeader(e){return f.unknownSizeElement(f.ID.Cluster,[f.element(f.ID.Timecode,f.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new ki(e,this._debug),this._video=document.createElement(`video`),this._video.autoplay=!0,this._video.controls=!1,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,this._video.src=URL.createObjectURL(this._mediaBuffer.mediaSource),document.body.appendChild(this._video);let t=()=>{if(this._video?.src){this._debug.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let e=this._video.seekable;e.length&&(this._video.currentTime=e.end(e.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>this._debug.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(t){let n=t.isVP9?`vp9`:`vp8`;this._mediaBuffer?this._mediaBuffer.codec!==n&&this._mediaBuffer.changeType(n):this._createVideo(n);let r=t.timestamp;if(r<=this._lastFrameTimestamp&&(r=this._lastFrameTimestamp+10,this._debug.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=r,this._earliestTimestamp)r-=this._earliestTimestamp;else{if(!t.keyframe)return;this._earliestTimestamp=r,r=0}if(t.keyframe){this._clusterStartTime=r,this._mediaBuffer?.cleanup(),this._debug.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let i=e._genWebmHeader();this._mediaBuffer?.append(i);let a=e._genSegmentHeader(t.width,t.height,n);this._mediaBuffer?.append(a)}let i=Math.round(r-this._clusterStartTime);if(i>Ti&&(this._clusterStartTime=r,i=0),i===0){this._debug.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let t=e._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(t)}let a=f.element(f.ID.SimpleBlock,[f.vintEncodedNumber(Ei),f.bytes(e._intToU16BE(i)),f.number(!!t.keyframe<<7),f.bytes(t.frameData)]);this._mediaBuffer?.append(a,!0)}destroy(){super.destroy(),this._video&&(this._video.onpause=null,this._video.onwaiting=null,this._video.onstalled=null,this._video.onerror=null,this._video.pause(),this._video.src=``,document.body.removeChild(this._video)),this._mediaBuffer&&(this._mediaBuffer.destroy(),this._mediaBuffer=null),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),this._debug.debug(`[WebmBuilder] destroyed for participant [${this._participantId}]`)}static isBrowserSupported(){return`captureStream`in window.HTMLVideoElement?.prototype&&window.MediaSource?.isTypeSupported(`video/webm; codecs="vp8"`)&&window.MediaSource?.isTypeSupported(`video/webm; codecs="vp9"`)}},ji=class{constructor(e,t,n,r,i,a=null,o=z,s=null){h(this,`_datachannel`,void 0),h(this,`_participantIdRegistry`,null),h(this,`_streamBuilders`,{}),h(this,`_onStream`,()=>{}),h(this,`_onEos`,()=>{}),h(this,`_onStat`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),this._debug=o,this._logger=s,this._statAggregator=a,this._debug.debug(`ScreenCaptureReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._onStream=n,this._onEos=r,this._onStat=i,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}_onDataChannelMessage(e){let t=xi(e),n=this._participantIdRegistry?.getStreamDescription(t.ssrc)?.participantId;if(!n){this._debug.warn(`Participant id for ssrc ${t.ssrc} not found in registry`);return}if(t.eos){this.close(n),this._onEos(n);return}let r=this._streamBuilders[n];if(!r){let e=e=>this._onStream(n,e);r=N.screenShareWebmBuilder&&Ai.isBrowserSupported()?new Ai(n,e,this._onStat,this._statAggregator,this._debug):new di(n,e,this._onStat,this._statAggregator,()=>{this._requestKeyFrame(t.ssrc)},this._debug,this._logger),this._streamBuilders[n]=r}r.appendChunk(t)}_requestKeyFrame(e){if(!(!this._datachannel||this._datachannel.readyState!==`open`))try{let t=wi(e);this._datachannel.send(t),this._debug.debug(`ScreenCaptureReceiver request for keyframe for ssrc ${e}`)}catch(e){this._debug.warn(`Failed to send keyframe request`,e)}}close(e){let t=this._streamBuilders[e];t&&(t.destroy(),delete this._streamBuilders[e])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(e=>e.destroy()),this._streamBuilders={},this._participantIdRegistry=null,this._debug.debug(`ScreenCaptureReceiver destroyed`)}},Mi=class{constructor(e,t,n){h(this,`_prev`,void 0),h(this,`_next`,void 0),h(this,`_data`,void 0),this._next=n,n&&(n.prev=this),this._prev=t,t&&(t.next=this),this._data=e}get prev(){return this._prev}set prev(e){this._prev=e}get next(){return this._next}set next(e){this._next=e}get data(){return this._data}},Ni=class{constructor(){h(this,`_head`,null),h(this,`_tail`,null),h(this,`_length`,0)}get length(){return this._length}push(...e){for(let t of e)this._tail=new Mi(t,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(e){this._tail&&(this._tail.next=e._head),this._head||(this._head=e._head),this._tail=e._tail,this._length+=e._length,e.clear()}shift(){if(!this._length||!this._head)return null;let e=this._head;return this._head=e.next,this._head&&(e.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),e.data}bisect(){if(this.length){let e=this.length>1?Math.floor(this.length/2):1;for(let t=0;t<e;t++)this.shift()}}head(){return this._head?.data||null}tail(){return this._tail?.data||null}clear(){this._head=null,this._tail=null,this._length=0}toString(){let e=[],t=this._head;for(;t!==null;)e.push(t.data),t=t.next;return e.length?JSON.stringify(e,(e,t)=>t instanceof Error?String(t):t):``}},Pi=1e3,Fi=class extends ei{constructor(e,t,n,r,i=z,a=null){super(i,a),h(this,`_sourceTrack`,void 0),h(this,`_onFrame`,void 0),h(this,`_useCongestionControl`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_useImageCapture`,void 0),h(this,`_video`,null),h(this,`_imageCapture`,null),h(this,`_canvas`,null),h(this,`_canvasCtx`,null),h(this,`_frameReadTimeout`,0),h(this,`_lastFrame`,null),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useImageCapture=`ImageCapture`in window&&ImageCapture.prototype.grabFrame!==void 0&&`ImageBitmap`in window,(e.readyState!==`live`||!e.enabled||e.muted)&&(this._useImageCapture=!1)}_createDom(){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`160px`,this._canvas.style.zIndex=`5000`,this._canvasCtx=this._canvas.getContext(`2d`),document.body.appendChild(this._canvas)),!this._video&&!this._useImageCapture&&(this._video=document.createElement(`video`),this._video.controls=!1,this._video.autoplay=!1,this._video.preload=`auto`,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,document.body.appendChild(this._video))}_removeDom(){try{this._canvas&&document.body.removeChild(this._canvas),this._video&&document.body.removeChild(this._video)}catch{}this._canvasCtx=null,this._canvas=null,this._video=null}async _createStream(e){if(!this._canvas)throw Error(`Canvas not found`);if(!this._video&&!this._useImageCapture)throw Error(`Video element not found`);return new Promise((t,n)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let r=this._video;r.srcObject=new MediaStream([e]),r.onloadeddata=e=>t(),r.onerror=()=>n(Error(`Video element error`));let i=r.play(),a=()=>n(Error(`Autoplay is disabled`));i?i.catch(a):a()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw Error(`Fatal error`);this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw Error(`Destroyed`);return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw Error(`Destroyed`);let t=e.width,n=e.height;return this._canvas.width=t,this._canvas.height=n,this._canvasCtx.clearRect(0,0,t,n),this._canvasCtx.drawImage(e,0,0,t,n),this._canvasCtx?.getImageData(0,0,t,n)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;this._debug.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createStream(this._sourceTrack),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n,r,i)=>{let a;function o(o,s){return t({locateFile:n}).then(t=>{if(a=new t.VpxEncoder,a.debug(s),!a.init(o?t.VpxType.VP9:t.VpxType.VP8))throw self.postMessage({type:e.LOG_ERROR,message:`encoder-init-fail-libvpx`}),Error(`LibVPxEncoder failed to create`);if(r){let e=Math.round(i/1e3);a.setTargetBitrate(e)}else a.setMaxQuantizer(10),a.setTargetBitrate(1024)})}function s(t,n,r,i){let o=a.allocateImage(t,n);if(!o){self.postMessage({type:e.FRAME,error:`No buffer data`});return}o.set(new Uint8Array(r));let s=Math.round(performance.now());if(!a.encode(s,150,i)){self.postMessage({type:e.FRAME,error:`Encode failed`});return}let c=a.readFrame();if(!c){self.postMessage({type:e.FRAME,error:`No encoded data`});return}a.readFrame()&&(self.postMessage({type:e.DEBUG,message:`LibVPxEncoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxEncoder-drop`}));let l=new Uint8Array(c.byteLength);l.set(c),self.postMessage({type:e.FRAME,frameType:i?`key`:`delta`,timestamp:s,duration:150,width:t,height:n,data:l.buffer},[l.buffer])}function c(e,t){let n=Math.round(e/1e3);a.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case e.INIT:o(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:e.READY})).catch(t=>self.postMessage({type:e.ERROR,error:String(t)}));break;case e.FRAME:s(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case e.SET_BITRATE:c(t.data.bitrate,t.data.useCbr);break}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[u.default,u.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:z.enabled()})}_encode(e,t){let n=e.data.buffer;this._sendToWorker($r.FRAME,{width:e.width,height:e.height,imageData:n,keyFrame:t},[n])}_requestFrameVideo(e){let t=this._drawFrameVideo();this._encode(t,e)}_requestFrameBitmap(e){window.clearTimeout(this._frameReadTimeout),this._frameReadTimeout=window.setTimeout(()=>{if(this._lastFrame){let t=this._drawFrameData(this._lastFrame);this._encode(t,e)}else this._onFrame(null)},Pi),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let n=this._drawFrameData(t);this._encode(n,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,n){this._sendToWorker($r.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},Ii=class extends ei{constructor(e,t,n,r,i,a,o=z,s=null){super(o,s),h(this,`_sourceTrack`,void 0),h(this,`_trackProcessor`,void 0),h(this,`_onFrame`,void 0),h(this,`_useCongestionControl`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_useCbr`,void 0),h(this,`_frameRate`,void 0),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useCbr=i,this._frameRate=a,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,n=this._trackProcessor.readable;this._debug.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return()=>{let n,r,i,a,o,s,c=null,l=0,u=!1,d=0,f,p,m=!1,h=!1,g=null;function _(e){return e instanceof Error?[e.name,e.message,e.stack].filter(Boolean).join(`: `):String(e)}function v(e,n){try{self.postMessage({type:t.FRAME,error:`WebCodecsEncoder ${e} failed: ${_(n)}`})}catch{}}function y(e,n){try{self.postMessage({type:t.ERROR,error:`WebCodecsEncoder ${e} failed: ${_(n)}`})}catch{}}function b(e){try{n=e.readable,r=n.getReader(),i=e.width,a=e.height,o=e.isVP9,s=e.framerate,f=e.useCongestionControl,p=e.maxBitrate,f&&(d=p,m=e.useCbr),T(),C(),self.postMessage({type:t.READY})}catch(e){y(`init`,e)}}function x(e){e&&!h&&(h=!0),self.clearTimeout(l),l=self.setTimeout(()=>{c&&S(c,h)},1e3),!u&&(u=!0,r.read().finally(()=>{u=!1,self.clearTimeout(l)}).then(({done:e,value:t})=>{if(c?.close(),c=null,!(e||!t)){if(!g){r.releaseLock(),n.cancel();return}c=t,S(t,h)}}).catch(e=>{v(`read`,e)}))}function S(e,t){try{let n=e.codedWidth!==i||e.codedHeight!==a;n&&(i=e.codedWidth,a=e.codedHeight,t=!0),!g||g.state===`closed`?(T(),C()):n&&C(),g?.encode(e,{keyFrame:t}),t&&(h=!1)}catch(e){g&&g.state===`closed`&&(g=null),v(`encode`,e)}}function C(){if(!g)throw Error(`encoder is not initialized`);let t={framerate:s,codec:o?e.VP9:e.VP8,width:i,height:a,latencyMode:`realtime`,bitrateMode:m?`constant`:`variable`};d>0&&(t.bitrate=d),g.configure(t)}function w(e,t,n){try{d=e,m=t,s=n,(!g||g.state===`closed`)&&T(),C()}catch(e){v(`setBitrate`,e)}}function T(){g=new VideoEncoder({output:e=>{try{let n;e.data?n=e.data:(n=new ArrayBuffer(e.byteLength),e.copyTo(n)),self.postMessage({type:t.FRAME,frameType:e.type,timestamp:e.timestamp,duration:e.duration,width:i,height:a,data:n},[n])}catch(e){v(`output`,e)}},error:e=>{g&&g.state===`closed`&&(g=null),v(`codec`,e)}})}self.onmessage=e=>{try{switch(e.data.type){case t.INIT:b(e.data);break;case t.FRAME:x(e.data.keyFrame);break;case t.SET_BITRATE:w(e.data.bitrate,e.data.useCbr,e.data.fps);break}}catch(e){v(`message`,e)}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[],{readable:n,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[n])}requestFrame(e=!1){this._sendToWorker($r.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker($r.SET_BITRATE,{bitrate:e,useCbr:t,fps:n})}isVP9(){return!0}destroy(){this._removeWorker(),this._debug.debug(`WebCodecsEncoder destroyed`)}static isBrowserSupported(){return`VideoEncoder`in window&&`Worker`in window&&`EncodedVideoChunk`in window&&`MediaStreamTrackProcessor`in window}},Li=2100,Ri=600,zi=1.2,Bi=.8,Vi=2e3,Hi=8e3,Ui=8e3,Wi=16e3,Gi=4,Ki=2e3,qi=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(qi||{}),Ji=class{constructor(e,t,n,r,i,a,o,s=z){h(this,`_onCongestion`,void 0),h(this,`_ccEnabled`,void 0),h(this,`_fastSharing`,void 0),h(this,`_trendDelayThreshold`,void 0),h(this,`_highDelayThreshold`,void 0),h(this,`_targetFps`,void 0),h(this,`_minBitrate`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_targetBitrate`,void 0),h(this,`_lastDown`,void 0),h(this,`_lastUp`,void 0),h(this,`_lastProbing`,void 0),h(this,`_lastCheckDelay`,void 0),h(this,`_upPenalty`,0),h(this,`_probing`,void 0),h(this,`_delayAvgShort`,-1),h(this,`_delayAvgLong`,-1),h(this,`_minDelay`,Number.MAX_VALUE),h(this,`_maxDelay`,0),h(this,`_largeDelayDuration`,0),h(this,`_lastFpsCalcMs`,void 0),h(this,`_frames`,0),h(this,`_fps`,0),h(this,`_debug`,void 0),this._onCongestion=e,this._ccEnabled=r,this._debug=s,this._minBitrate=t,this._maxBitrate=n,this._fastSharing=i,this._targetFps=o,a>0?this._highDelayThreshold=a:this._highDelayThreshold=Li,i&&(this._highDelayThreshold=Ri),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let c=Date.now();this._lastDown=0,this._lastUp=c,this._lastProbing=c,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(e,t,n){let r=Date.now();if(this._calcFps(r),this._calcDelay(t,r),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let i=0,a=this._delayAvgShort-this._delayAvgLong,o=Math.round(Math.abs(a)*100/this._delayAvgLong),s=a>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,c=this._delayAvgShort>this._highDelayThreshold;s||c?i=2:Math.abs(a)<40&&o<10&&!c&&(i=1);let l=Math.round(this._targetBitrate/1e3),u=n;e%20==0&&this._debug.debug(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${qi[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>Vi){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Gi),this._probing=!1);let n=Bi*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*Bi),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*Ui/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${qi[i]}`),this._debug.log(`#${e}: cc: DOWN delay=${t} bitrate=${u} target=${l} -> newBitrate=${r} penalty=${s}s`),this._setBitrate(n,!0),this._targetBitrate=n}this._lastDown=r}let f=r-this._lastUp,p=Hi+this._upPenalty*Ui;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*zi,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*Ui/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${qi[i]}`),this._debug.log(`#${e}: cc: UP bitrate=${u} target=${c} -> newBitrate=${s} penalty=${l}s`),this._setBitrate(n,!1),this._targetBitrate=n,this._probing=!0,this._lastProbing=r,this._lastUp=r}}let m=r-this._lastProbing;this._probing&&m>Wi&&(this._probing=!1);let ee=r-this._lastDown;this._upPenalty>0&&ee>3*p&&(this._debug.log(`#${e}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(e,t){this._fastSharing&&(t=!0);let n=this._targetFps;this._fps>0&&(n=this._fps),this._onCongestion(e,t,n)}_calcDelay(e,t){if(!(e<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=e,this._delayAvgLong=e),this._delayAvgShort=Math.round((this._delayAvgShort*3+e)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+e)/24),e>0&&e<this._minDelay?this._minDelay=e:e>this._maxDelay&&(this._maxDelay=e),this._lastCheckDelay===0&&(this._lastCheckDelay=t),e>Ki){let e=t-this._lastCheckDelay;this._largeDelayDuration+=e}this._lastCheckDelay=t}}reconfigure(e,t){this._minBitrate=e,this._maxBitrate=t}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let e={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,e}_calcFps(e){this._frames++;let t=e-this._lastFpsCalcMs;if(t>5e3){this._lastFpsCalcMs=e;let n=this._fps,r=this._frames*1e3/t;this._fps===0?this._fps=Math.round(r):this._fps=Math.round((this._fps*3+r)/4),this._frames=0,this._fps!==n&&this._debug.log(`cc: fps=${this._fps}`)}}},Yi=class{constructor(e){h(this,`_maxSize`,void 0),h(this,`_size`,0),h(this,`_buffer`,void 0),h(this,`_head`,0),h(this,`_tail`,0),this._maxSize=e,this._buffer=Array(e)}add(e,t,n,r,i){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let a=this._tail;return this._buffer[this._tail]={seq:e,ts:t,size:n,sent:Date.now(),start:r,end:i,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,a}update(e,t){let n=this.get(e);return n===null?null:(n.ts2=t,n.recv=Date.now(),n)}get(e){let t=this._head;for(let n=0;n<this._maxSize;n++){let n=this._buffer[t];if(e===n?.seq)return n;if(t=++t%this._maxSize,t===this._tail)break}return null}getServerBitrateK(e){let t=0,n=0,r=-1,i=-1,a=this._tail;for(let t=0;t<this._maxSize;t++){a>0?--a:a=this._maxSize-1;let t=this._buffer[a];if(!t||(i===-1&&(i=t.ts2,n=0),i>=0&&(n+=t.size),r=t.ts2,i-r>=e)||a===this._head)break}if(r>=0&&i>=0){let e=i-r;t=Math.round(e>0?n*8/e:0)}return t}getCurrentDelay(){let e=this._tail;for(let t=0;t<this._maxSize;t++){e>0?--e:e=this._maxSize-1;let t=this._buffer[e];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(e===this._head)break}return 0}getMaxBandwidth(){let e=0,t=0,n=-1,r=-1,i=this._tail;for(let a=0;a<this._maxSize;a++){i>0?--i:i=this._maxSize-1;let a=this._buffer[i];if(a){if(r===-1&&a.end&&!a.start&&(r=a.ts2,t=0),n===-1&&r>=0&&a.start&&!a.end&&(n=a.ts2),n>=0&&r>=0){let i=r-n;e=i>0?t*8/i:0;break}if(r>=0&&(t+=a.size),i===this._head)break}}return Math.round(e)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}},Xi=65536,Zi=50,Qi=400,$i=1e6,ea=3e5,ta=3e4,na=2e3,ra=5,ia=0,aa=class{constructor(e,t,n,r,i=z,a=null){h(this,`_encoder`,void 0),h(this,`_datachannel`,void 0),h(this,`_signaling`,void 0),h(this,`_fastSharing`,void 0),h(this,`_destroyed`,!1),h(this,`_needKeyframe`,!0),h(this,`DATA_SIZE`,void 0),h(this,`_congestionControl`,void 0),h(this,`_frameNum`,0),h(this,`_width`,void 0),h(this,`_height`,void 0),h(this,`_feedback`,new Yi(1024)),h(this,`_lastSentFrameSeq`,0),h(this,`_lastDeliveredFrameSeq`,0),h(this,`_lastFrameDelay`,0),h(this,`_lastFramerateReduced`,Date.now()),h(this,`_lastSharingStat`,Date.now()),h(this,`_congestionControlEnabled`,void 0),h(this,`_queue`,new Ni),h(this,`_fpsMeter`,void 0),h(this,`_maxFrameDelay`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._debug=i,this._logger=a,this._debug.debug(`ScreenCaptureSender started`),this.DATA_SIZE=N.consumerScreenDataChannelPacketSize-11,this._datachannel=t,this._signaling=n,this._fastSharing=r,this._congestionControlEnabled=N.screenShareCongestionControl||this._fastSharing,this._width=e.getSettings().width,this._height=e.getSettings().height,this._maxFrameDelay=this._fastSharing?N.screenShareCongestionControlThreshold:N.screenShareCongestionControlThreshold*2;let o=N.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),l=this._onCongestionCallback.bind(this);this._debug.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${N.screenShareCongestionControlThreshold}`),this._congestionControl=new Ji(l,s,c,this._congestionControlEnabled,this._fastSharing,N.screenShareCongestionControlThreshold,o,this._debug);let u=(e,t)=>{if(this._destroyed)return;if(!e){this._debug.warn(`requestFrame failed, keyFrame: `+this._needKeyframe,t),this._needKeyframe=!0,this._handleQueue();return}(e.width!==this._width||e.height!==this._height)&&(this._width=e.width,this._height=e.height,this._onResize(this._width,this._height));let n=this._sliceFrame(e);this._queue.merge(n),this._handleQueue(),this._sendSharingStat()};if(Ii.isBrowserSupported()){let t=this._fastSharing;this._encoder=new Ii(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new Fi(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{Si(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=Ci(e.data);t!==null&&this._checkCcFeedback(t)},this._encoder.init().then(()=>this._handleQueue()).catch(e=>this._debug.warn(`ScreenCaptureSender init failed`,e)),this._fpsMeter=new ri(e=>this._debug.log(`[ScreenCaptureSender] fps: ${e}`),5e3)}_handleQueue(){if(this._destroyed)return;let e=this._queue.shift();if(!e){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Xi)%Xi>ra&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>na&&(this._lastFramerateReduced=e,this._debug.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(e)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),M.setImmediate(()=>this._handleQueue());return}if(e.isLast){this._frameNum++,this._fpsMeter.increment(),e.isKey&&this._debug.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(e.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),n=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,n)}else M.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let e=this._queue.head();for(;e;){if(e.isFirst&&e.isKey)return!0;this._queue.shift(),e=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(e){let t=e.type===`key`,n=e.data.byteLength,r=new Ni;for(let i=0;i<n;i+=this.DATA_SIZE){let a=e.data.slice(i,i+this.DATA_SIZE),o=i===0,s=n<=i+a.byteLength,c=this._wrapHeader(e.timestamp,o,s,t,a);r.push({data:c.data,sequence:c.sequence,frameSize:n,isFirst:o,isLast:s,isKey:t,timestamp:e.timestamp})}return r}_wrapHeader(e,t,n,r,i){let a=bi(e,t,n,r,ia,this._encoder.isVP9(),i),o={sequence:ia,data:a};return ia=(ia+1)%Xi,o}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(e){if(!this._datachannel||this._datachannel.readyState!==`open`)return!1;try{return this._datachannel.send(e.data),this._feedback.add(e.sequence,e.timestamp,e.data.byteLength,e.isFirst,e.isLast),e.isLast&&(this._lastSentFrameSeq=e.sequence),!0}catch(e){return this._debug.warn(`Error sending chunk to DataChannel`,e),!1}}destroy(){this._queue.clear(),this._fpsMeter.destroy(),this._datachannel.onmessage=null,this._feedback.clear(),this._datachannel.readyState===`open`&&this._datachannel.send(this._stopPacket()),this._destroyed=!0,this._encoder.destroy(),this._debug.debug(`ScreenCaptureSender destroyed`)}static isBrowserSupported(){return Ii.isBrowserSupported()||Fi.isBrowserSupported()}_onCongestionCallback(e,t,n){this._encoder.setBitrate(e,t,n)}_onResize(e,t){let{minBitrate:n,maxBitrate:r}=this._calcMinMaxBitrate(e,t),i=Math.round(n/1e3),a=Math.round(r/1e3);this._debug.log(`cc: resize to ${e}x${t}, minBitrate=${i} maxBitrate=${a}`),this._congestionControl.reconfigure(n,r)}_calcMinMaxBitrate(e,t){(e===void 0||e<640)&&(e=640),(t===void 0||t<360)&&(t=360);let n=e*t/256;return{minBitrate:Math.max(ea,Math.min($i,Math.round(n*Zi))),maxBitrate:Math.round(n*Qi)}}_checkCcFeedback(e){let t=this._feedback.update(e.seq,e.ts2);if(t===null)this._debug.debug(`cc: update failed, seq=${e.seq}`);else if(t.end){this._lastDeliveredFrameSeq=t.seq;let e=t.recv-t.sent;e>0&&(this._lastFrameDelay=e),this._handleQueue()}}_sendSharingStat(){let e=Date.now();if(e-this._lastSharingStat>ta){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t).catch(e=>{e instanceof Tn||this._debug.warn(`Unable to send sharing stats`,e)})),this._lastSharingStat=e}}},oa=class{constructor(e,t,n,r=z,i=null){h(this,`_pc`,null),h(this,`_transceiver`,null),h(this,`_simulcastInfo`,null),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_getCameraSettings`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._signaling=e,this._mediaSource=t,this._getCameraSettings=n,this._debug=r,this._logger=i}async configureFromRemoteOffer(e){if(this.reset(),!N.simulcast)return;let t=this._findTransceiver(e);if(!t){this._debug.debug(`SimulcastSender: Multi-encoding video transceiver not found`);return}let n=this._mediaSource.getStream(),r=n?.getVideoTracks()[0];if(!n||!r){this._debug.debug(`SimulcastSender: Camera stream or track not found`);return}let i=this._getTrackConfig(r,Zt.WIDTH,Zt.HEIGHT);this._pc=e,this._transceiver=t,this._simulcastInfo=i.simulcastInfo,t.direction=`sendonly`,await t.sender.replaceTrack(r),t.sender.setStreams(n);let a=t.sender.getParameters();on(a.encodings,i.simulcastInfo),await t.sender.setParameters(a),this._debug.log(`SimulcastSender: Prepared mid=${t.mid} track=${i.width}x${i.height} encodings=${JSON.stringify(a.encodings)}`)}finalizeAnswer(e){if(!this._pc||!this._transceiver?.mid||!this._simulcastInfo)return e;this._pc.getTransceivers().forEach(e=>{e.mid===null&&e.stop()});let t=un(e),n=this._findMediaSection(t,this._transceiver.mid);return n?(this._simulcastInfo.streams.forEach(e=>{let r=`a=rid:${e.rid} send`;for(let i=n.start;i<n.end;i++)if(t[i]===r||t[i].startsWith(r+` `)){t[i]=`${r} max-width=${e.width};max-height=${e.height};max-fps=${e.fps};max-br=${e.bitrate}`;break}}),dn(t)):e}async sync({force:e=!1}={}){let t=this._transceiver;if(!t||!this._simulcastInfo||!this._mediaSource.mediaSettings.isVideoEnabled)return;let n=this._mediaSource.getStream()?.getVideoTracks()[0];if(!n)return;let r=t.sender.getParameters();if(r.encodings.length<=1)return;let i=this._getTrackConfig(n);if(!(!e&&tn(this._simulcastInfo,i.simulcastInfo))){on(r.encodings,i.simulcastInfo,i.maxDimension,i.maxBitrate);try{await t.sender.setParameters(r)}catch(e){this._debug.error(`SimulcastSender: Failed to set sender parameters`,r,e)}this._simulcastInfo=i.simulcastInfo,this._debug.log(`SimulcastSender: Sync ${i.width}x${i.height} encodings=${JSON.stringify(r.encodings)}`),await this._signaling.changeSimulcast({mediaSource:Yt.CAMERA,simulcastInfo:i.simulcastInfo})}}replaceTrack(e){let t=this._transceiver,n=t?.sender.track;return!t||!this._simulcastInfo||e.kind!==A.video||!n||n.contentHint!==e.contentHint?!1:(t.sender.replaceTrack(e).then(()=>{let{width:t,height:n}=e.getSettings();t&&n&&this._syncReplacedTrack(e).catch(e=>{this._debug.error(`SimulcastSender: Failed to sync replaced track`,e)})}).catch(e=>{this._debug.error(`SimulcastSender: Unable to replace track`,e),this._logger?.log(w.ERROR,`replaceTrack-single`)}),!0)}reset(){this._pc=null,this._transceiver=null,this._simulcastInfo=null}_findTransceiver(e){for(let t of e.getTransceivers())if((t.sender.track?.kind??t.receiver.track?.kind)===A.video&&t.sender.getParameters().encodings.length>1)return t;return null}_findMediaSection(e,t){let n=-1;for(let r=0;r<e.length;r++)if(e[r].startsWith(`m=`)&&(n=r),e[r]===`a=mid:${t}`){if(n<0||!e[n].startsWith(`m=video`))return null;let t=e.findIndex((e,t)=>t>r&&e.startsWith(`m=`));return{start:n,end:t<0?e.length:t}}return null}_getTrackConfig(e,t,n){let r=e.getSettings();t??(t=r.width??Zt.WIDTH),n??(n=r.height??Zt.HEIGHT);let i=r.frameRate||30,a=this._getCameraSettings(),o=a?.maxFramerate?Math.min(i,a.maxFramerate):i,s=a?.bitrates?.generic?.length?a.bitrates.generic:void 0;return{width:t,height:n,simulcastInfo:rn(t,n,s,o),maxDimension:a?.maxDimension,maxBitrate:!s&&a?.maxBitrateK?a.maxBitrateK*1024:void 0}}async _syncReplacedTrack(e){let t=this._getTrackConfig(e);this._simulcastInfo=t.simulcastInfo,await this._signaling.changeSimulcast({mediaSource:Yt.CAMERA,simulcastInfo:t.simulcastInfo})}},sa=90,ca=4294967295,la=class e extends Nr{constructor(e,t,n,r=z,i=null,a=null,o=null,s=null){super(e,t,s),h(this,`_producerNotification`,null),h(this,`_producerCommand`,null),h(this,`_producerScreen`,null),h(this,`_consumerScreen`,null),h(this,`_asr`,null),h(this,`_animojiDataChannel`,null),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_isOpen`,!1),h(this,`_observer`,!1),h(this,`_reconnectionPrevented`,!1),h(this,`_statInterval`,null),h(this,`_settingsInterval`,null),h(this,`_monitorRtpShareInterval`,null),h(this,`_statBytes`,{}),h(this,`_ssrcMap`,{}),h(this,`_ssrcMapUpdated`,!1),h(this,`_perfStatReporter`,void 0),h(this,`_producerOfferIsProcessing`,!1),h(this,`_producerNextOffer`,null),h(this,`_producerNextSessionId`,null),h(this,`_lastStat`,null),h(this,`_serverSettings`,void 0),h(this,`_prevConsumerSettings`,{}),h(this,`_prevConsumerFastSharingSettings`,{}),h(this,`_asrTrack`,null),h(this,`_captureSender`,null),h(this,`_captureReceiver`,null),h(this,`_participantIdRegistry`,null),h(this,`_disabledSenders`,new Set),h(this,`_rtpReceiversByStreamId`,{}),h(this,`_producerSessionId`,``),h(this,`_newAudioShareTrack`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),h(this,`_simulcast`,void 0),this._debug=r,this._logger=i,this._statAggregator=a,this._codecStatsAggregator=o,this._serverSettings=n,this._simulcast=new oa(e,t,()=>this._serverSettings.camera,r,i),this.subscribe(this._signaling,K.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._debug.debug(`ServerTransport: Created`)}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!==J.IDLE&&e!==J.CLOSED&&e!==J.FAILED&&this._startStatInterval()}open(e=!1){if(this._isOpen){this._debug.log(`ServerTransport: Already opened connections`);return}this._isOpen=!0,this._observer=e,this._openConnection()}close(e){this._isOpen&&(this._isOpen=!1,this._closeConnection(),this.unsubscribe(),e?(this._debug.error(`ServerTransport: Closed`,e),this._setState(J.FAILED)):(this._debug.debug(`ServerTransport: Closed`),this._setState(J.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){Dr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(N.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,this._participantIdRegistry&&e.setParticipantIdRegistry(this._participantIdRegistry),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}async onCameraResolutionChanged(){await this._simulcast.sync()}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new ma(this,this._signaling,this._statAggregator,!1,this._debug)}_closeConnection(){this._disposeFirstMediaSentProbe(),this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcast.reset(),this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,e._closeDataChannel(this._producerNotification),e._closeDataChannel(this._producerCommand),e._closeDataChannel(this._producerScreen),e._closeDataChannel(this._consumerScreen),e._closeDataChannel(this._asr),e._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent(X.PEER_CONNECTION_CLOSED)}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{ordered:!0});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)},r.onerror=e=>{let n=e.error;this._debug.error(`[${t}] data channel error`,n?.errorDetail,n?.message)}}_openConnection(e=!1){this._debug.debug(`ServerTransport: Open single connection`);try{this._pc=new RTCPeerConnection}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=M.debounce(e=>{this._pc&&this._onConnectionStateChange(this._pc,e)},500),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Qr(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,Sr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,Sr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,Sr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),N.asrDataChannel&&this._createDataChannel(this._pc,Sr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new Yr(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),N.vmoji&&this._createDataChannel(this._pc,Sr.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(e),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(e),this._animojiSender?.setProtocolVersion(N.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(e){this._debug.error(`ServerTransport: Unable to add media source tracks`,e),this._logger?.log(w.ERROR,`addTrack-single`),this.close(e);return}this._startFirstMediaSentProbe(),this._createDataChannel(this._pc,Sr.consumerScreenShare,e=>{this._consumerScreen=e,this._consumerScreen.binaryType=`arraybuffer`;let t=this._mediaSource.getScreenTrack();t&&(!N.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(t)}),e||this._allocateConsumer(),this._setState(J.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==J.OPENED&&(this._setState(J.RECONNECTING),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent(X.SIGNALLED_ACTIVE_PARTICIPANTS,e)}_signalStalledParticipants(e){this._triggerEvent(X.SIGNALLED_STALLED_PARTICIPANTS,e)}_signalSpeakerChanged(e){this._triggerEvent(X.SIGNALLED_SPEAKER_CHANGED,e)}_signalNetworkStatus(e){this._triggerEvent(X.NETWORK_STATUS,e)}_updateSSRCMap(e){e&&un(e.sdp).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${qr.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${qr.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.mediaSettings;!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new aa(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled,this._debug,this._logger))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new ji(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent(X.REMOTE_STREAM_SECOND,e,t)},e=>{this._triggerEvent(X.REMOTE_STREAM_SECOND,e,null)},e=>{this._triggerEvent(X.SCREEN_SHARING_STAT,e)},this._statAggregator,this._debug,this._logger))}_removeCaptureReceiver(){this._captureReceiver?.destroy(),this._captureReceiver=null}_applyConsumerSettings(){let e=this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{if(!n.track||n.track.kind!==A.video||n.track.contentHint===`motion`)return;let r=!this._disabledSenders.has(n),i=e.maxDimension!==0;if(r&&!i){this._debug.log(`Disabling video upload`),this._disabledSenders.add(n),n.replaceTrack(E.getBlackMediaTrack()).catch(e=>{this._debug.error(`Could not disable video upload`,e)});return}let a=this._mediaSource.getSendVideoTrack();if(!r&&i&&a){this._debug.log(`Enabling video upload`),this._disabledSenders.delete(n);let e=n.track;e.enabled=a.enabled,n.replaceTrack(a).then(()=>e.stop()).catch(e=>{this._debug.error(`Could not enable video upload`,e)})}M.applyVideoTrackSettings(e,n,a??n.track,this._prevConsumerSettings,t,this._debug)}),this._prevConsumerSettings=t}if(this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&N.consumerFastScreenShare){let e=this._serverSettings.fastScreenSharing;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{!n.track||n.track.kind!==A.video||n.track.contentHint!==`motion`||M.applyVideoTrackSettings(e,n,n.track,this._prevConsumerFastSharingSettings,t,this._debug)}),this._prevConsumerFastSharingSettings=t}}}_onScreenSharingStatus(e){e.track?(!N.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent(X.STATE_CHANGED,e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(e=>{this._reportStats(e),this._detectStaleTracks(e),this._codecStatsAggregator?.reportUsage(e)}).catch(()=>{}),this._statInterval=window.setTimeout(e,N.statisticsInterval)};this._statInterval=window.setTimeout(e,N.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await G.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent(X.REMOTE_DATA_STATS,{inbound:{topology:Y.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`inbound-rtp`)},outbound:{topology:Y.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:Y.SERVER,transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(e=>e.type===`inbound-rtp`&&e.kind===`audio`&&this._ssrcMap[e.ssrc]===`mix`);if(!t)return;let n=qr.AUDIO_MIX,r=this._statBytes[n],i=!1;if(r){let e=t.bytesReceived-r.bytesReceived;e>=0&&e<=5&&(i=!0),r.stalled!==i&&this._triggerEvent(X.AUDIO_MIX_STALL,i)}this._statBytes[n]={bytesReceived:t.bytesReceived,stalled:i}}_allocateConsumer(){if(!this._signaling.ready)return;let e=ba.get();!N.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e).catch(e=>{e instanceof Tn||this._debug.warn(`ServerTransport: Unable to allocate consumer`,e)})}async _processOffer(e,t){if(!this._pc)throw Error(`Interrupt allocation`);try{await this._pc.setRemoteDescription(e)}catch(e){throw this._debug.error(`[single] unable to set remote offer`,e),this._logger?.log(w.ERROR,`setRemoteDescription-single`),e}await this._simulcast.configureFromRemoteOffer(this._pc);let n;try{if(await this._handleTracks(),this._debug.debug(`[single] create local answer`),!this._pc)throw Error(`Interrupt allocation`);n=await this._pc.createAnswer()}catch(e){throw this._debug.error(`[single] unable to create answer`,e),this._logger?.log(w.ERROR,`createAnswer-single`),e}try{if(!this._pc)throw Error(`Interrupt allocation`);n.sdp=M.patchLocalSDP(n.sdp,!1,E.isBrokenH264Decoder(),!1),this._debug.debug(`[single] set local answer`,{answer:n}),await this._pc.setLocalDescription(n)}catch(e){throw this._debug.error(`[single] unable to set local answer`,e),this._logger?.log(w.ERROR,`setLocalDescription-single`),e}n.sdp=this._simulcast.finalizeAnswer(n.sdp);try{this._debug.debug(`[single] transmit local answer`,{answer:n}),this._updateSSRCMap(e),await this._signaling.acceptProducer(n,Object.keys(this._ssrcMap),t),this._debug.debug(`[single] remote offer has been processed`)}catch(e){this._debug.warn(`[single] unable to send local answer`,e),this._logger?.log(w.ERROR,`acceptProducer`)}await this._simulcast.sync({force:!0})}async _acceptProducer(e,t){if(this._producerOfferIsProcessing){this._producerNextOffer=e,this._producerNextSessionId=t,this._debug.debug(`[single] wait until other remote offer is processed`);return}this._producerOfferIsProcessing=!0;let n={type:`offer`,sdp:M.patchRemoteSDP(e,!1,!1,!1,E.isBrokenVP9Encoder(),E.isBrokenVP9Decoder())};if(this._debug.debug(`[single] set remote offer`,{offer:n}),!this._pc)throw Error(`Interrupt allocation`);try{if(await this._processOffer(n,t),this._producerOfferIsProcessing=!1,this._producerNextOffer&&this._producerNextSessionId){this._debug.debug(`[single] there is other unprocessed remote offer, process it`);let e=this._producerNextOffer,t=this._producerNextSessionId;this._producerNextOffer=null,this._producerNextSessionId=null,await this._acceptProducer(e,t)}}catch(e){this.close(e)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===A.video);if(!e||!e.sender){this._debug.warn(`Cannot find screenshare transceiver`);return}try{e.direction=`sendonly`,await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===A.audio);if(!e||!e.sender){this._debug.warn(`Cannot find audioshare transceiver`);return}e.sender.track!==null&&this._debug.warn(`Unexpected track assigned to audioshare`);try{e.direction=`sendonly`,await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(w.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case q.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case q.REALLOC_CON:this._reconnect();break;case q.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case q.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case q.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case q.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent(X.ASR_TRANSCRIPTION,e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),N.breakVideoPayloadTypes&&(this._debug.log(`test mode enabled, video switched off`),this._signaling.requestTestMode(`breakVideoPayloadTypes`,null).catch(e=>{e instanceof Tn||this._debug.warn(`Unable to enable signaling test mode`,e)})),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description,e.sessionId)}_onAddTrack(e,t){this._debug.debug(`[single] remote track (added)`,{track:t.track});let n=t.streams[0];n?(n.onremovetrack||(n.onremovetrack=e=>{this._triggerEvent(X.REMOTE_TRACK_REMOVED,n.id,n,e.track)}),n.getTracks().find(e=>e.id===t.track.id)||(this._debug.warn(`[single] remote track missing from stream, re-adding`,{streamId:n.id,trackId:t.track.id}),this._logger?.log(w.ERROR,`ontrack-empty-stream`),n.addTrack(t.track)),this._rtpReceiversByStreamId[n.id]=t.receiver,this._triggerEvent(X.REMOTE_TRACK_ADDED,n.id,n,t.track)):this._debug.error(`[single] unable to get media stream from track event`)}_onSignalingStateChange(e,t){this._debug.debug(`[single] signaling state changed`,{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(this._debug.debug(`[single] connection state changed`,{state:e.connectionState},t),this._logger?.log(w.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect();break;case`connecting`:let t=this.getState();t===J.IDLE||t===J.OPENED?this._setState(J.CONNECTING):e.iceConnectionState===`checking`&&this._setState(J.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(J.RECONNECTING);break;case`connected`:this._setState(J.CONNECTED),M.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(this._logger?.log(w.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))});break}}_onReplacedTrack(e,t){if(this._pc){this._debug.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let n=(e,t)=>{e.replaceTrack(t).catch(e=>{this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(w.ERROR,`replaceTrack-single`)})};if(this._debug.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),!this._simulcast.replaceTrack(e)){let t=this._pc?.getSenders().find(t=>t.track&&t.track.kind===e.kind&&!this._disabledSenders.has(t)&&t.track.contentHint===e.contentHint);t?.track?n(t,e):e.kind===A.audio&&e.contentHint===`music`&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e===A.screen&&N.consumerFastScreenShare&&this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`noConnection`),this._debug.error(`Cannot get stream waiting time, peer connection is not initialized`),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`oldBrowser`),this._debug.error(`Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported`),0;let n=this._rtpReceiversByStreamId[e];if(!n)return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`noReceiver`),this._debug.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let r=n.getSynchronizationSources();if(!r||!r.length)return this._debug.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let i=r[0].rtpTimestamp;if(!Number.isInteger(i))return this._logger?.log(w.PAT_WAITING_TIME_ERROR,`timestampNotInteger`),this._debug.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${i}`),0;let a=t-i&ca,o=Math.ceil(a/sa);return Math.min(100,Math.max(0,o))}async _monitorRtpShare(){let e=Zr.getInstance().value;if(!this._mediaSource.mediaSettings.isFastScreenSharingEnabled||!N.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(e=>e.track?.kind===A.video&&e.track?.contentHint===`motion`);t&&(await t.getStats()).forEach(e=>{if(e.type===`outbound-rtp`&&this._serverSettings.fastScreenSharing&&e.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&e.frameWidth<window.screen.width){let n=t.getParameters();n.degradationPreference=`maintain-resolution`,t.setParameters(n),this._debug.log(`
16
10
  degradationPreference updated for fast share RTP Sender
17
11
  Actual senderStats: ${JSON.stringify(e)}
18
12
  serverSettings: ${JSON.stringify(this._serverSettings.fastScreenSharing)}
19
- `)}})}_startMonitorRtpShareInterval(){let e=5e3;if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,e)};this._monitorRtpShareInterval=window.setTimeout(t,e)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}},X=function(e){return e.REMOTE_TRACK_ADDED=`REMOTE_TRACK_ADDED`,e.REMOTE_TRACK_REMOVED=`REMOTE_TRACK_REMOVED`,e.REMOTE_STREAM_SECOND=`REMOTE_STREAM_SECOND`,e.AUDIO_MIX_STALL=`AUDIO_MIX_STALL`,e.REMOTE_DATA_STATS=`REMOTE_DATA_STATS`,e.STATE_CHANGED=`STATE_CHANGED`,e.LOCAL_STATE_CHANGED=`LOCAL_STATE_CHANGED`,e.SIGNALLED_ACTIVE_PARTICIPANTS=`SIGNALLED_ACTIVE_PARTICIPANTS`,e.SIGNALLED_SPEAKER_CHANGED=`SIGNALLED_SPEAKER_CHANGED`,e.SIGNALLED_STALLED_PARTICIPANTS=`SIGNALLED_STALLED_PARTICIPANTS`,e.TOPOLOGY_CHANGED=`TOPOLOGY_CHANGED`,e.NETWORK_STATUS=`NETWORK_STATUS`,e.PEER_CONNECTION_CLOSED=`PEER_CONNECTION_CLOSED`,e.ASR_TRANSCRIPTION=`ASR_TRANSCRIPTION`,e.ANIMOJI_STREAM=`ANIMOJI_STREAM`,e.ANIMOJI_ERROR=`ANIMOJI_ERROR`,e.SCREEN_SHARING_STAT=`SCREEN_SHARING_STAT`,e}({}),aa=class extends x{constructor(e,t,n,r,i=z,a=null,o=null,s=null,c=null){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_topology`,void 0),h(this,`_allocated`,[]),h(this,`_opened`,[]),h(this,`_directTransport`,null),h(this,`_serverTransport`,null),h(this,`_serverSettings`,void 0),h(this,`_dtListeners`,[]),h(this,`_stListeners`,[]),h(this,`_states`,{}),h(this,`_localState`,J.IDLE),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),h(this,`_onFirstMediaSent`,void 0),h(this,`_firstMediaSentProbeStopped`,!1),this._signaling=t,this._mediaSource=n,this._topology=e,this._serverSettings=r,this._debug=i,this._logger=a,this._statAggregator=o,this._codecStatsAggregator=s,this._onFirstMediaSent=c,this.subscribe(this._signaling,K.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e===Y.SERVER&&(this._serverTransport=this._createServerTransport())}updateSettings(e){this._debug.log(`Update transport settings`,e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(this._debug.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){this._debug.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology===Y.DIRECT&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===Y.SERVER&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,n=!1,r=!1){this._debug.log(`Trying open participant`,{participantIds:e});let i=r;for(let t of e){if(this._opened.indexOf(t)!==-1){this._debug.warn(`The participant [${t}] has already had opened transport`);continue}if(this._allocated.indexOf(t)===-1){this._debug.warn(`The participant [${t}] has no allocated transport`);continue}this._opened.push(t),i=!0}i&&(this._topology===Y.DIRECT&&this._directTransport&&this._directTransport.open(t),this._topology===Y.SERVER&&this._serverTransport&&(this._serverTransport.open(n),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),this._debug.debug(`The transport has been opened`,e))}close(e){let t=this._allocated.indexOf(e),n=this._opened.indexOf(e);t<0&&this._debug.warn(`The participant [${e}] transport has already deallocated`),this._topology===Y.DIRECT&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===Y.SERVER&&(this._serverTransport?.removeParticipant(e),this._setStates([e],J.CLOSED)),n>=0&&this._opened.splice(n,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.stopFirstMediaSentProbe(),this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),N.audioEffects?.destroy(),this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}stopFirstMediaSentProbe(){this._firstMediaSentProbeStopped||(this._firstMediaSentProbeStopped=!0,this._directTransport?.stopFirstMediaSentProbe(),this._serverTransport?.stopFirstMediaSentProbe())}holdClose(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}setRemoteHold(e){this._directTransport?.setRemoteHold(e)}getTopology(){return this._topology}isAllocated(e){return this._allocated.indexOf(e)>=0}allocated(){return this._allocated.slice()}opened(){return this._opened.slice()}getState(){return this._topology===Y.SERVER?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){N.vmoji&&t.isMe&&N.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology===Y.SERVER&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let n=e.filter(e=>this._states[e]===t?!1:(this._states[e]=t,!0));n.length&&this._triggerEvent(`STATE_CHANGED`,n,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent(`LOCAL_STATE_CHANGED`,e))}_onSignalingNotification(e){if(e.notification===q.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_handleFirstMediaSent(){this._firstMediaSentProbeStopped||(this.stopFirstMediaSentProbe(),this._onFirstMediaSent?.())}_getFirstMediaSentCallback(){return!this._onFirstMediaSent||this._firstMediaSentProbeStopped?null:this._handleFirstMediaSent.bind(this)}_onTopologyChanged(e){if(e.topology!==this._topology){if(this._debug.log(`Topology changed ${this._topology} -> ${e.topology}`),this._logger?.log(w.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===Y.SERVER&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===Y.DIRECT){let t=e.offerTo||[],n=e.offerToTypes||[],r=e.offerToDeviceIdxs||[],i=t.length&&n.length?M.composeParticipantId(t[0],n[0],r[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){this._debug.error(`Topology changed to DIRECT, but the list of allocated participants is empty`);return}this._allocated.length>1&&this._debug.warn(`Topology changed to DIRECT, but the allocated participants count more then one`);let a=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let e=i===a;this._directTransport=this._createDirectTransport(a,e)}this._opened.indexOf(a)>=0&&this._directTransport.open()}this._triggerEvent(`TOPOLOGY_CHANGED`,this._topology)}}_createDirectTransport(e,t=!1){let n=new Hr(e,t,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator,this._getFirstMediaSentCallback());return this._dtListeners.length>0&&this._debug.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(n.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this,e)),n.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this,e)),n.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),n.addEventListener(`STATE_CHANGED`,this._onDirectTransportChanged.bind(this)),n.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),n.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,Y.DIRECT))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new ia(this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator,this._getFirstMediaSentCallback());return this._stListeners.length>0&&this._debug.warn(`The list of server transport listeners is not empty`),this._stListeners=[],this._stListeners.push(e.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this)),e.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this)),e.addEventListener(`AUDIO_MIX_STALL`,this._onServerAudioMixStall.bind(this)),e.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),e.addEventListener(`STATE_CHANGED`,this._onServerTransportChanged.bind(this)),e.addEventListener(`SIGNALLED_ACTIVE_PARTICIPANTS`,this._onTransportActiveParticipants.bind(this)),e.addEventListener(`SIGNALLED_SPEAKER_CHANGED`,this._onTransportSpeakerChanged.bind(this)),e.addEventListener(`SIGNALLED_STALLED_PARTICIPANTS`,this._onTransportStalledParticipants.bind(this)),e.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),e.addEventListener(`REMOTE_STREAM_SECOND`,this._onRemoteStreamSecond.bind(this)),e.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,Y.SERVER)),e.addEventListener(`ASR_TRANSCRIPTION`,this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e===J.CONNECTED&&this._topology===Y.DIRECT&&this._releaseServerTransport(),(e===J.CLOSED||e===J.FAILED)&&(this._releaseDirectTransport(),this._topology===Y.DIRECT)){let e=this._opened.indexOf(t);e>=0&&this._opened.splice(e,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology===Y.DIRECT&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===J.CONNECTED&&this._topology===Y.SERVER&&this._releaseDirectTransport(),(e===J.CLOSED||e===J.FAILED)&&(this._releaseServerTransport(),this._topology===Y.SERVER&&(this._allocated=[],this._opened=[])),this._topology===Y.SERVER&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_SPEAKER_CHANGED`,e)}_onTransportNetworkStatus(e){this._triggerEvent(`NETWORK_STATUS`,e)}_onRemoteStreamSecond(e,t){this._triggerEvent(`REMOTE_STREAM_SECOND`,e,t)}_onPeerConnectionClosed(e){this._triggerEvent(`PEER_CONNECTION_CLOSED`,e)}_onServerAudioMixStall(e){this._topology===Y.SERVER&&this._triggerEvent(`AUDIO_MIX_STALL`,e)}_onRemoteDataStats(e){this._triggerEvent(`REMOTE_DATA_STATS`,e)}_onRemoteTrackAdded(e,t,n){this._triggerEvent(`REMOTE_TRACK_ADDED`,e,t,n)}_onRemoteTrackRemoved(e,t,n){this._triggerEvent(`REMOTE_TRACK_REMOVED`,e,t,n)}_onAsrTranscription(e){this._triggerEvent(`ASR_TRANSCRIPTION`,e)}_onSourceChanged(){let e=this._mediaSource.getStream();e&&this._animojiSender?.setStream(e)}_onAnimojiStream(e,t){this._triggerEvent(`ANIMOJI_STREAM`,e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createAnimojiTransport(){if(!N.vmoji)return;this._animojiReceiver=new N.vmoji.AnimojiReceiver((e,t)=>this._onAnimojiStream(e,t),e=>this._onAnimojiStream(e,null),e=>{this._triggerEvent(`ANIMOJI_ERROR`,e)},N.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new N.vmoji.AnimojiSender(e,this._signaling.getPeerId(),N.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:N.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=e=>this._animojiReceiver?.receive(e)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology===Y.SERVER?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(this._logger?.log(w.PAT_WAITING_TIME_ERROR,`noTransport`),this._debug.error(`Cannot get stream waiting time, server transport is not initialized`),0):(this._logger?.log(w.PAT_WAITING_TIME_ERROR,`wrongTopology`),this._debug.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},oa=`videochat-epi`,sa=5e3,ca=500,la=class extends x{constructor(e,t,n=null,r=!1,i=z){super(),h(this,`_previousPerfStatReportTimestamp`,0),h(this,`_previousNetworkStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReport`,null),h(this,`_screenShareStats`,[]),h(this,`_signaling`,void 0),h(this,`_directTopology`,void 0),h(this,`_debug`,void 0),h(this,`_statAggregator`,void 0),h(this,`_handleScreenSharingStat`,e=>{this._screenShareStats.push(e)}),h(this,`_handleTransportStateChanged`,e=>{(this._directTopology&&e===J.CONNECTED||!this._directTopology&&e===J.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())}),this._signaling=t,this._directTopology=r,this._debug=i,this._statAggregator=n,this.subscribe(e,X.REMOTE_DATA_STATS,this._handleStats.bind(this)),this.subscribe(e,X.SCREEN_SHARING_STAT,this._handleScreenSharingStat.bind(this)),this.subscribe(e,X.STATE_CHANGED,this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(oa)||``,10);return isNaN(e)?0:e}catch{return 0}}async _handleStats(e){if(!e.inbound||!e.inbound.rtps)return;let t=Date.now();!this._directTopology&&N.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+sa<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+ca<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),N.callStatReportEnabled&&this._previousCallStatReportTimestamp+N.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((e,t)=>(t.kind===`video`&&(e.framesDecoded+=t.framesDecoded||0,e.framesReceived+=t.framesReceived||0),e),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let e=await this._signaling.reportPerfStat(t);localStorage.setItem(oa,e.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0)};if(t.timestamp)try{await this._signaling.reportNetworkStat(t)}catch{}}_reportCallStats(e){let t={call_topology:this._directTopology?`D`:`S`,stat_time_delta:0,nack_received:0,pli_received:0,fir_received:0,frames_dropped:0,jitter_video:0,jitter_audio:0,interframe_delay_variance:0,nack_sent:0,pli_sent:0,fir_sent:0,total_audio_samples_received:0,concealed_audio_samples:0,silent_concealed_audio_samples:0,inserted_audio_samples_for_deceleration:0,removed_audio_samples_for_acceleration:0,audio_concealment_events:0,total_audio_energy:0,inbound_video_count:0,inbound_audio_count:0,packets_lost_video:0,packets_sent_video:0,packets_lost_audio:0,packets_sent_audio:0,freeze_count:0,total_freezes_duration:0,rtt:Math.round(e.inbound.transport.currentRoundTripTime*1e3),ss_freeze_count:0,ss_total_freezes_duration:0,local_address:da(e.inbound.transport.local),local_connection_type:e.inbound.transport.local?.type,network_type:e.inbound.transport.local?.networkType,transport:e.inbound.transport.local?.protocol,remote_address:da(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let n=!1,r=!1;for(e.inbound.rtps.reduce((e,t)=>(t.kind===`video`?(n=!0,t.framesReceived&&(e.jitter_video=e.jitter_video*e.inbound_video_count/(e.inbound_video_count+1)+t.jitter*1e3/(e.inbound_video_count+1),e.interframe_delay_variance=e.interframe_delay_variance*e.inbound_video_count/(e.inbound_video_count+1)+(t.interframeDelayVariance||0)*1e6/(e.inbound_video_count+1),e.inbound_video_count++),e.frames_dropped+=t.framesDropped||0,e.nack_sent+=t.nackCount,e.pli_sent+=t.pliCount,e.fir_sent+=t.firCount,e.freeze_count+=t.freezeCountDelta||0,e.total_freezes_duration+=t.totalFreezesDurationDelta||0):(r=!0,t.totalSamplesReceived&&(e.jitter_audio=e.jitter_audio*e.inbound_audio_count/(e.inbound_audio_count+1)+t.jitter*1e3/(e.inbound_audio_count+1),e.total_audio_energy=e.total_audio_energy*e.inbound_audio_count/(e.inbound_audio_count+1)+(t.totalAudioEnergy||0)/(e.inbound_audio_count+1),e.inbound_audio_count++),e.total_audio_samples_received+=t.totalSamplesReceived||0,e.inserted_audio_samples_for_deceleration+=t.insertedSamplesForDeceleration||0,e.removed_audio_samples_for_acceleration+=t.removedSamplesForAcceleration||0,e.concealed_audio_samples+=t.concealedSamples||0,e.silent_concealed_audio_samples+=t.silentConcealedSamples||0,e.audio_concealment_events+=t.concealmentEvents||0),e),t),e.outbound.rtps.reduce((e,t)=>(t.kind===`video`?(e.nack_received+=t.nackCount,e.pli_received+=t.pliCount,e.fir_received+=t.firCount,e.packets_sent_video+=t.packetsSent):e.packets_sent_audio+=t.packetsSent,e),t),e.remoteInbound.rtps.reduce((e,t)=>(t.kind===`video`?e.packets_lost_video+=t.packetsLost:e.packets_lost_audio+=t.packetsLost,e),t);this._screenShareStats.length;){let e=this._screenShareStats.pop();e?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=e.freeze_duration)}let i={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(N.simulcast&&(i.is_simulcast=!0),navigator.hardwareConcurrency&&(i.cpu_hardware_concurrency=navigator.hardwareConcurrency),n&&!fa(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!fa(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!fa(t.interframe_delay_variance)&&(i.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(i.freeze_count=t.freeze_count,i.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(i.ss_freeze_count=t.ss_freeze_count,i.ss_total_freezes_duration=t.ss_total_freezes_duration),r&&!fa(t.total_audio_samples_received)){let e=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),n=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),r=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),a=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),o=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),s=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);i.inserted_audio_samples_for_deceleration=pa(n/e*1e3),i.removed_audio_samples_for_acceleration=pa(r/e*1e3),i.concealed_audio_samples=pa(a/e*1e3),i.concealed_silent_audio_samples=pa(o/e*1e3),i.concealment_audio_avg_size=pa(a/s),i.total_audio_energy=t.total_audio_energy}ua(t,`local_address`,`local_connection_type`,`network_type`,`transport`)&&(i.local_address=t.local_address,i.local_connection_type=t.local_connection_type,i.network_type=t.network_type,i.transport=t.transport),ua(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),o=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);a>0&&(i.video_loss=pa(Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video)/a*100)),o>0&&(i.audio_loss=pa(Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio)/o*100)),this._statAggregator?.logCallStat(i),N.enableLogPerfStatReport&&this._debug.log(`Sent call stats`,i),this._previousCallStatReport=t}};function ua(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function da(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function fa(e){return e===void 0}function pa(e){return Number.isNaN(e)?0:e}var ma;(function(e){function t(){return{estimatedPerformanceIndex:la.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:+!!N.asrDataChannel,animojiDataChannelVersion:N.vmoji?N.vmojiOptions.protocolVersion:1,animojiBackendRender:!N.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:N.videoTracksCount,red:!0,audioShare:N.audioShare,fastScreenShare:N.fastScreenShare,videoSuspend:N.videoSuspend,simulcast:N.simulcast,consumerFastScreenShare:N.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:N.consumerFastScreenShareQualityOnDemand,transparentAudio:N.transparentAudio}}e.get=t})(ma||(ma={}));var ha=ma,ga={producerScreenTrack:()=>!0,videoTracksCount:()=>N.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>N.movieShare,useParticipantListChunk:()=>N.useParticipantListChunk,useRooms:()=>N.useRooms,vmoji:()=>!!N.vmoji,useCallsToContacts:()=>N.useCallsToContacts,useChatRooms:()=>N.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!N.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>N.enableSessionStateUpdates,addParticipant:()=>N.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>N.waitForAdminInGroupCalls,hold:()=>N.hold},_a=class{static getFlags(){let e=Object.values(ga),t=0;for(let n=0;n<e.length;n++)e[n]()&&(t|=1<<n);return t.toString(16).toUpperCase()}static parseCapabilities(e){let t=parseInt(e||`0`,16);return Object.keys(ga).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},va=63n,ya=16383n,ba=1073741823,xa=4611686018427387903n,Sa=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=va)return new Uint8Array([Number(t)]);if(t<=ya)return new Uint8Array([64|Number(t>>8n),Number(t&255n)]);if(t<=BigInt(ba))return new Uint8Array([128|Number(t>>24n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);if(t<=xa)return new Uint8Array([192|Number(t>>56n),Number(t>>48n&255n),Number(t>>40n&255n),Number(t>>32n&255n),Number(t>>24n&255n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);throw RangeError(`Number is too large to encode using varint`)}},Ca=class{decode(e){let t=this.getNumBytesForLengthInteger(e);if(t<0)throw Error(`Invalid length prefix`);if(e.length<t)return null;let n=BigInt(0);switch(t){case 1:n=BigInt(e[0]&63);break;case 2:n=BigInt(e[0]&63)<<8n|BigInt(e[1]);break;case 4:n=BigInt(e[0]&63)<<24n|BigInt(e[1])<<16n|BigInt(e[2])<<8n|BigInt(e[3]);break;case 8:n=BigInt(e[0]&63)<<56n|BigInt(e[1])<<48n|BigInt(e[2])<<40n|BigInt(e[3])<<32n|BigInt(e[4])<<24n|BigInt(e[5])<<16n|BigInt(e[6])<<8n|BigInt(e[7]);break}return n}getNumBytesForLengthInteger(e){let t=e[0]&192;return t===0?1:t===64?2:t===128?4:t===192?8:-1}},wa=class{constructor(e){h(this,`encoder`,void 0),h(this,`compression`,void 0),h(this,`lengthEncoder`,void 0),this.encoder=new TextEncoder,this.lengthEncoder=new Sa,this.compression=e??null}encode(e){let t=this.encoder.encode(e);t=this.compress(t);let n=this.lengthEncoder.encode(t.length),r=new Uint8Array(n.length+t.length);return r.set(n),r.set(t,n.length),r}compress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gzipSync(e);case`deflate`:return p.zlibSync(e);case`deflate-raw`:return p.deflateSync(e);default:return e}}},Ta=class{constructor(e){h(this,`decoder`,void 0),h(this,`compression`,void 0),h(this,`lengthDecoder`,void 0),h(this,`buffer`,void 0),h(this,`expectedLength`,void 0),h(this,`offset`,void 0),h(this,`lengthPrefixLength`,void 0),this.decoder=new TextDecoder,this.lengthDecoder=new Ca,this.compression=e??null,this.buffer=new Uint8Array,this.expectedLength=null,this.offset=0}decode(e){let t=[];for(this.buffer=new Uint8Array([...this.buffer,...e]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return t;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return t;let e=this.buffer.subarray(this.offset,this.offset+this.expectedLength);e=this.decompress(e),t.push(this.decoder.decode(e)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return t}readLength(e){if(e.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(e),this.lengthPrefixLength<0)throw Error(`Invalid length prefix`);let t=this.lengthDecoder.decode(e.subarray(0,this.lengthPrefixLength));return t===null?null:Number(t)}decompress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gunzipSync(e);case`deflate`:return p.unzlibSync(e);case`deflate-raw`:return p.inflateSync(e);default:return e}}},Ea=class{static isBrowserSupported(){return!(!(`WebTransport`in window&&typeof WebTransport==`function`)||E.browserName()===`Safari`)}constructor(e,t={},n=z){h(this,`onopen`,null),h(this,`onmessage`,null),h(this,`onerror`,null),h(this,`onclose`,null),h(this,`readyState`,WebSocket.CONNECTING),h(this,`webTransport`,null),h(this,`writer`,null),h(this,`url`,void 0),h(this,`options`,void 0),h(this,`compression`,void 0),h(this,`encoder`,void 0),h(this,`decoder`,void 0),h(this,`_debug`,void 0),this._debug=n,this.url=e,this.options=t,this.compression=this.getCompressionTypeFromUrl(e),this.encoder=new wa(this.compression),this.decoder=new Ta(this.compression),this.connect()}async send(e){if(this.readyState!==WebSocket.OPEN){this._debug.warn(`[WebTransport] Attempt to send data before webtransport is open`);return}let t=this.writer;if(!t){this._debug.warn(`[WebTransport] Attempt to send data before stream is ready`);return}try{await t.ready;let n=this.encoder.encode(e);await t.write(n)}catch(e){this.handleStreamError(`send`,e)}}close(e=1e3,t=``){this.readyState===WebSocket.CLOSING||this.readyState===WebSocket.CLOSED||(this.readyState=WebSocket.CLOSING,this.requestNativeClose(e,t))}getCompressionTypeFromUrl(e){try{let t=new URL(e).searchParams.get(`compression`);switch(t){case`gzip`:case`deflate`:case`deflate-raw`:return t;default:return null}}catch(e){return this._debug.log(`[WebTransport] Exception while parsing compression`,e),null}}async connect(){try{let e=new WebTransport(this.url,{...this.options});if(this.webTransport=e,this.observeClosed(e),await e.ready,this.readyState!==WebSocket.CONNECTING)return;this._debug.debug(`[WebTransport] WebTransport connected to `+this.url);let t=await e.createBidirectionalStream();if(this.readyState!==WebSocket.CONNECTING)return;this.writer=t.writable.getWriter(),this.readyState=WebSocket.OPEN,this.emitEvent(`open`,this.onopen,new Event(`open`)),this.readyState===WebSocket.OPEN&&this.readLoop(t.readable)}catch(e){if(!this.webTransport){queueMicrotask(()=>this.fail(`connect`,e));return}this.fail(`connect`,e)}}observeClosed(e){e.closed.then(({closeCode:e,reason:t})=>{this.finishClose(e,t)},e=>{let t=this.readyState===WebSocket.CONNECTING?`connect`:`session`;this.fail(t,e),this.finishClose(1006,``)}).catch(e=>{this._debug.error(`[WebTransport] Failed to process native close`,e)})}async readLoop(e){let t=e.getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e){this.close(1e3,`Stream Closed`);return}if(n)for(let e of this.decoder.decode(n))this.emitEvent(`message`,this.onmessage,new MessageEvent(`message`,{data:e}))}}catch(e){this.handleStreamError(`read`,e)}finally{t.releaseLock()}}fail(e,t){this.readyState===WebSocket.CLOSING||this.readyState===WebSocket.CLOSED||(this.readyState=WebSocket.CLOSING,this._debug.error(`[WebTransport] ${e} failed`,t),this.emitEvent(`error`,this.onerror,this.createErrorEvent(t,e)),this.requestNativeClose(1006,`${e} failed`))}handleStreamError(e,t){let n=typeof t==`object`&&t&&`source`in t?t.source:void 0;if(n===`session`)return;let r=n===void 0&&t instanceof Error&&t.name===`WebTransportError`&&t.message.startsWith(`Session closed`);this.fail(r?`session`:e,t)}requestNativeClose(e,t){if(!this.webTransport){this.finishClose(1006,`Connection Failed`);return}try{this.webTransport.close({closeCode:e,reason:t})}catch(e){this._debug.warn(`[WebTransport] Native close failed synchronously`,e),this.finishClose(1006,`Close Failed`)}}finishClose(e,t){this.readyState!==WebSocket.CLOSED&&(this.writer=null,this.readyState=WebSocket.CLOSED,this.emitEvent(`close`,this.onclose,new CloseEvent(`close`,{code:e,reason:t})))}emitEvent(e,t,n){try{t?.call(this,n)}catch(t){this._debug.error(`[WebTransport] ${e} handler failed`,t)}}createErrorEvent(e,t){let n=new Event(`error`),r=e instanceof Error?e:null;return n.error=e,n.errorInfo={phase:t,name:r?.name,message:r?.message||String(e),stack:r?.stack,readyState:this.readyState,compression:this.compression},n}},Da=function(e){return e.EMPTY_ENDPOINT=`EMPTY_ENDPOINT`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.ABORTED=`ABORTED`,e}({}),Oa=class{constructor(e=z,t){h(this,`handlers`,void 0),h(this,`socket`,null),h(this,`endpoint`,``),h(this,`wtEndpoint`,null),h(this,`peerId`,null),h(this,`lastStamp`,0),h(this,`connectionType`,void 0),h(this,`reconnectCount`,0),h(this,`reconnectTimer`,0),h(this,`doctorTimer`,0),h(this,`forceWebSocket`,!1),h(this,`abortSignal`,void 0),h(this,`manualClose`,!1),h(this,`currentType`,hr.WEBSOCKET),h(this,`_debug`,void 0),this.handlers=t,this._debug=e}get readyState(){return this.socket?.readyState??null}get type(){return this.currentType}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e||null}setPeerId(e){this.peerId=e}setLastStamp(e){this.lastStamp=e}setAbortSignal(e){this.abortSignal=e}resetReconnectCount(){this.reconnectCount=0}connect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING||(e!==mr.RETRY&&(this.forceWebSocket=!1,this.reconnectCount=0),this.manualClose=!1,this.connectionType=e,this._connect())}close(e){this.manualClose=!0,this._disconnect(e),window.clearTimeout(this.reconnectTimer),this.reconnectTimer=0,this.lastStamp=0}async send(e){await this.socket?.send(e)}_connect(){if(this._canUseWebTransport()){this._connectWebTransport();return}this._connectWebSocket()}_connectWebTransport(){if(!this.wtEndpoint){this._connectWebSocket();return}let e=this._buildUrl(this.wtEndpoint,!0);this.currentType=hr.WEBTRANSPORT,this.socket=new Ea(e,{congestionControl:`low-latency`},this._debug),this._setSocketHandlers()}_connectWebSocket(){if(!this.endpoint){this.handlers.onFailed({failure:`EMPTY_ENDPOINT`,message:`Unable to connect to the signaling: endpoint is not set`,source:hr.WEBSOCKET,remote:!0});return}let e=this._buildUrl(this.endpoint,!1);this.currentType=hr.WEBSOCKET,this.socket=new WebSocket(e),this._setSocketHandlers()}_setSocketHandlers(){this.socket&&(this.handlers.onConnecting({connectionType:this.connectionType,source:this.currentType}),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor())}_buildUrl(e,t){let n=new URL(e),r=n.searchParams;return r.set(`platform`,N.platform),r.set(`appVersion`,String(N.appVersion)),r.set(`version`,String(N.protocolVersion)),r.set(`device`,N.device),r.set(`capabilities`,_a.getFlags()),r.set(`clientType`,N.clientType),this.connectionType&&r.set(`tgt`,this.connectionType),this.connectionType===mr.RETRY&&this.lastStamp&&r.set(`recoverTs`,String(this.lastStamp)),N.useParticipantListChunk&&(r.set(`partIdx`,String(N.participantListChunkInitIndex)),N.participantListChunkInitCount!==null&&r.set(`partCount`,String(N.participantListChunkInitCount))),t&&(r.set(`compression`,`deflate-raw`),r.set(`ua`,navigator.userAgent)),this.peerId!==null&&r.set(`peerId`,String(this.peerId)),n.toString()}_canUseWebTransport(){return!this.forceWebSocket&&Ea.isBrowserSupported()&&this.wtEndpoint!==null&&N.webtransport}_onOpen(){this._startDoctor(),this.handlers.onOpen()}_onMessage(e){this._startDoctor(),this.handlers.onMessage(e)}_onError(e){this.handlers.onError(e)}_onClose(e){if(this._stopDoctor(),this.handlers.onClose(e),!this.manualClose){if(this.abortSignal?.aborted){this.handlers.onFailed({failure:`ABORTED`,message:`Signaling connection aborted`,source:this.currentType});return}this.forceWebSocket=!0,this._scheduleReconnect(this.currentType===hr.WEBTRANSPORT?0:void 0)}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e)),this.socket=null,this._stopDoctor()}_scheduleReconnect(e=this._getReconnectDelay()){if(this.reconnectCount>=N.signalingReconnectMaxCount){this.handlers.onFailed({failure:`NETWORK_ERROR`,message:`Unable to connect to the signaling: reconnect attempts exhausted`,source:this.currentType});return}this.reconnectCount++,this.handlers.onReconnectScheduled({count:this.reconnectCount,delay:e}),this.reconnectTimer=window.setTimeout(()=>{this.connectionType=mr.RETRY,this._connect()},e)}_getReconnectDelay(){return Math.min(N.signalingReconnectMaxDelay,N.signalingReconnectDelay*2**this.reconnectCount)}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=N.signalingReconnectMaxCount)&&(this.doctorTimer=window.setTimeout(()=>{this.handlers.onConnectionDead(),this.forceWebSocket=!0,this._disconnect(4e3),this._scheduleReconnect(0)},N.waitMessageDelay))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}},ka=`open`,Aa=10,ja={CONVERSATION_ENDED:`conversation-ended`,OBSOLETE_CLIENT:`gen.obsoleteClient`,INVALID_TOKEN:`invalid-token`,PARTICIPANT_NOT_FOUND:`participant-not-found`,ILLEGAL_PARTICIPANT_STATE:`illegal-participant-state`,SERVICE_UNAVAILABLE:`service-unavailable`},Ma={[ja.CONVERSATION_ENDED]:`conversation-ended`,[ja.OBSOLETE_CLIENT]:`obsolete-client`,[ja.INVALID_TOKEN]:`invalid-token`,[ja.PARTICIPANT_NOT_FOUND]:`participant-not-found`,[ja.ILLEGAL_PARTICIPANT_STATE]:`illegal-participant-state`,[ja.SERVICE_UNAVAILABLE]:`service-unavailable`};function Na(e,t){return e.errorMessage??e.message??e.error??t}var Pa=new Set([O.CALLER_IS_BLOCKED,O.ENDED,O.NOT_FOUND,O.PARTICIPANT_LIMIT_REACHED,O.SERVICE_UNAVAILABLE]),Fa=class e extends Sn{static get WAIT_CONNECTION_DELAY(){return N.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return N.waitResponseDelay}get ready(){return!this.disposed&&this.transport.readyState!==null}constructor(e=z,t=null,n=null,r=null,i=null){super(),h(this,`transport`,void 0),h(this,`sequence`,1),h(this,`lastStamp`,0),h(this,`websocketCommandsQueue`,[]),h(this,`datachannelCommandsQueue`,[]),h(this,`incomingCache`,[]),h(this,`responseHandlers`,{}),h(this,`disposed`,!1),h(this,`connectionType`,void 0),h(this,`conversationResolve`,null),h(this,`conversationReject`,null),h(this,`connected`,!1),h(this,`listenersReady`,!1),h(this,`peerId`,null),h(this,`connectionMessageWaitTimer`,0),h(this,`participantIdRegistry`,null),h(this,`producerNotificationDataChannel`,null),h(this,`producerCommandDataChannel`,null),h(this,`producerCommandDataChannelEnabled`,!1),h(this,`producerCommandSerializationService`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_statPings`,void 0),h(this,`_statSignalingCommands`,void 0),this._debug=e,this._logger=t,this._statAggregator=n,this._statPings=r,this._statSignalingCommands=i,this.producerCommandSerializationService=new Yn(e),this.transport=new Oa(e,{onConnecting:this._onTransportConnecting.bind(this),onOpen:this._onOpen.bind(this),onMessage:this._onMessage.bind(this),onError:this._onError.bind(this),onClose:this._onClose.bind(this),onFailed:this._onTransportFailed.bind(this),onReconnectScheduled:this._onTransportReconnectScheduled.bind(this),onConnectionDead:this._onTransportConnectionDead.bind(this)})}setAbortSignal(e){super.setAbortSignal(e),this.transport.setAbortSignal(e)}setEndpoint(e){this.transport.setEndpoint(e)}setWebTransportEndpoint(e){this.transport.setWebTransportEndpoint(e)}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=e=>{let t=this.participantIdRegistry?.handleMessage(e.data);t&&this._handleMessage(t)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=e=>{this.producerCommandSerializationService.deserializeCommandResponse(e.data).then(e=>{e&&this._handleMessage(e)}).catch(e=>{this._debug.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}async connect(e){return new Promise((t,n)=>{if(this.transport.readyState!==null&&this.transport.readyState<WebSocket.CLOSING){this._logger?.log(w.SOCKET_ACTION,`already_opened`),n(Error(`Socket already opened`));return}this.conversationResolve=e=>{t(e),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=e=>{n(e),this.conversationResolve=null,this.conversationReject=null},this.connectionType=e,this.transport.connect(e)})}getNextCommandSequenceNumber(){return this.sequence}hangup(e){return this._send(V.HANGUP,{reason:e},!1)}async sendCandidate(e,t){return this._send(V.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(V.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,n){let r=Object.assign({sdp:t},n);return this._send(V.TRANSMIT_DATA,{participantId:e,data:r},!0,Aa)}async acceptCall(e){return this._send(V.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(V.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Aa)}async changeParticipantState(e,t){let n={participantState:{state:e}};return t&&(n.participantId=t),this._sendRaw(V.CHANGE_PARTICIPANT_STATE,n)}async hold(e){let t=ha.get();return this._send(V.HOLD,{hold:e,capabilities:e?void 0:t})}async putHandsDown(){return this._send(V.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(V.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(V.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(V.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let n={capabilities:t};return e&&(n.description=e.sdp),this._send(V.ALLOCATE_CONSUMER,n)}async acceptProducer(e,t,n){let r={description:e.sdp,sessionId:n};return t.length&&(r.ssrcs=t),this._send(V.ACCEPT_PRODUCER,r)}async changePriorities(e){return this._send(V.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(V.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(V.ADD_MOVIE,e)}async updateMovie(e){return this._send(V.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(V.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(V.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(V.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(V.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(V.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(V.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(V.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(V.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(V.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(V.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(V.RECORD_PUBLISH,e)}async getRecordStatus(){return this._send(V.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(V.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(V.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(V.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(V.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(V.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(V.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(V.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(V.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,n){let r={participantId:e,roles:t};return n&&(r.revoke=!0),this._sendRaw(V.GRANT_ROLES,r)}async muteParticipant(e,t,n,r=null){return this._sendRaw(V.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:n,roomId:r})}async enableFeatureForRoles(e,t){return this._sendRaw(V.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,n){let r={participantId:e,roomId:n};return t&&(r.unpin=!0),this._sendRaw(V.PIN_PARTICIPANT,r)}async updateMediaModifiers(e){return this._send(V.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(V.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(V.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(V.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(V.CHANGE_OPTIONS,{options:e})}async getWaitingHall(e=null,t,n=!1){let r={};return e&&(r.fromId=e),t&&(r.count=t),n&&(r.backward=n),this._send(V.GET_WAITING_HALL,r)}async promoteParticipant(e,t=!1){let n={};return e&&(n.participantId=e),t&&(n.demote=t),this._sendRaw(V.PROMOTE_PARTICIPANT,n)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(V.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(V.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(V.FEEDBACK,{key:e})}async getHandQueue(){return this._send(V.GET_HAND_QUEUE)}dispose(e=new xn){this._terminate(e)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(V.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(V.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(V.ASR_START,e)}async stopAsr(e){return this._send(V.ASR_STOP,e)}async requestAsr(e){return this._send(V.REQUEST_ASR,{request:e},!1)}async _send(e,t={},n=!0,r=0){if(t.participantId){let e=M.decomposeParticipantId(t.participantId),n=M.decomposeId(e.compositeUserId);t=Object.assign({},t,{participantId:n.id,participantType:n.type}),e.deviceIdx&&(t.deviceIdx=e.deviceIdx)}return this._sendRaw(e,t,n,r)}async _sendRaw(e,t={},n=!0,r=0){let i=t=>{if(this.disposed)throw new xn(e);if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===ka&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(this.transport.readyState===null){this._logger?.log(w.SOCKET_ACTION,`not_opened`),this._debug.warn(`[signaling] socket is not opened`),t.reject(Error(`Socket not opened [${e}]`),!0);return}this.transport.readyState>WebSocket.OPEN&&(this._logger?.log(w.SOCKET_ACTION,`invalid_state`),this._debug.warn(`[signaling] socket is not opened, state ${this.transport.readyState}`)),this.websocketCommandsQueue.push(t),this.transport.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((a,o)=>{let s=(t,n=!1)=>{!r||n?o(t):(this._debug.debug(`[signaling] resending a signaling message`,e,u.sequence),r--,i(u))},c=this.sequence++,l=`${e}_${c}`;G.setMark(l);let u={sequence:c,name:e,statMarkName:l,params:t,responseTimer:0,needResponse:n,resolve:a,reject:s};i(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===V.UPDATE_DISPLAY_LAYOUT||e===V.REPORT_PERF_STAT||e===V.REPORT_SHARING_STAT||e===V.REQUEST_ASR||e===V.ENABLE_VIDEO_SUSPEND||e===V.ENABLE_VIDEO_SUSPEND_SUGGEST||e===V.REPORT_NETWORK_STAT||e===V.CHANGE_SIMULCAST:!1}_onOpen(){this._debug.debug(`[signaling] socket opened`),this._logger?.log(w.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._logTransportStat(this.connectionType===mr.RETRY?gr.RECONNECTED:gr.CONNECTED)}_onMessage(e){if(e.data===`ping`){this._statPings?.mark(this._getSocketType()),this._markTransportStat(gr.FAILED_PINGS),R.onSignalingMessage(e.data),this.transport.readyState===WebSocket.OPEN&&this.transport.send(`pong`).catch(e=>this._debug.warn(`[signaling] unable to send pong`,e));return}try{let t=JSON.parse(e.data);R.onSignalingMessage(t),this._handleMessage(t)}catch(t){this._logger?.log(w.SOCKET_ACTION,`parse_error`),this._debug.error(`[signaling] unable to parse message`,t,e.data)}}_handleMessage(e){switch(e.type){case`notification`:this._attachNotificationCallError(e),e.notification===`connection`?(this._debug.debug(`[signaling] signaling connected`,e),this.connected=!0,this.transport.resetReconnectCount(),this.transport.setEndpoint(e.endpoint),e.peerId&&this.peerId!==e.peerId.id&&(this.peerId=e.peerId.id,this.transport.setPeerId(e.peerId.id)),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat(gr.RESTART),this._triggerEvent(K.RECONNECT,e),e.conversation.topology&&this._triggerEvent(K.NOTIFICATION,{type:`notification`,notification:q.TOPOLOGY_CHANGED,topology:e.conversation.topology}),this._resolvePendingRecordCommands(e)),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===q.ACCEPTED_CALL&&e.peerId.id===this.peerId&&e.peerId.type===`WEB_TRANSPORT`||this._handleMessage(e)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(K.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:this._logger?.log(w.SOCKET_ACTION,`unknown_message`),this._debug.warn(`[signaling] unhandled message`,e)}e.stamp&&(this.lastStamp=e.stamp,this.transport.setLastStamp(e.stamp))}_handleErrorMessage(e){this._logger?.log(w.SOCKET_ACTION,`error-${e.error}`);let t=this._getSocketType(),n=e.error?this._createSignalingCallError(e.error,e.errorCode,t):void 0,r=Na(e,`Unknown signaling error`);switch(this._debug.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case ja.SERVICE_UNAVAILABLE:let i=new k(O.SERVICE_UNAVAILABLE,{callError:n,message:r,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(K.NOTIFICATION,{notification:q.CLOSED_CONVERSATION,callError:n,reason:O.SERVICE_UNAVAILABLE});break;case ja.CONVERSATION_ENDED:this.conversationReject?this.conversationReject(new k(e.reason||S.SIGNALING_FAILED,{callError:n,message:r,remote:!0})):this._triggerEvent(K.NOTIFICATION,{notification:q.CLOSED_CONVERSATION,callError:n,reason:e.reason});break;case ja.ILLEGAL_PARTICIPANT_STATE:case ja.PARTICIPANT_NOT_FOUND:this._throwError(new k(S.SIGNALING_FAILED,{callError:n,message:r,remote:!0}));break;case ja.OBSOLETE_CLIENT:this.conversationReject?.(new k(e.reason||O.OBSOLETE_CLIENT,{callError:n,message:r,remote:!0}));break;case ja.INVALID_TOKEN:default:if(e.sequence||t===hr.WEBTRANSPORT)break;if(this.connected)this._throwError(new k(e.reason||S.SIGNALING_FAILED,{callError:n??{scope:`unknown`,description:`signaling-unrecognized-error`},message:r,remote:!0}));else if(!e.sequence){let t=new k(e.reason||S.SIGNALING_FAILED,{callError:n??{scope:`unknown`,description:`signaling-unrecognized-error`},message:r,remote:!0});this.conversationReject?.(t),this.dispose(t)}}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(K.FAILED,e)}_onError(e){this._logger?.log(w.SOCKET_ACTION,`error`),this._debug.error(`[signaling] signaling error`,e),this._logTransportStat(gr.FAILED_EXCEPTIONS,{string_value:this._serializeErrorEvent(e)})}_serializeErrorEvent(e){let t=e,n=t.error instanceof Error?t.error:null;return JSON.stringify({eventType:e.type,socketType:this._getSocketType(),readyState:this.transport.readyState,errorName:n?.name||t.errorInfo?.name,errorMessage:n?.message||t.errorInfo?.message||t.message,errorStack:n?.stack||t.errorInfo?.stack,errorInfo:t.errorInfo})}_onClose(e){this._logger?.log(w.SOCKET_ACTION,`closed`),this._debug.debug(`[signaling] connection closed`,{code:e.code,reason:e.reason}),this.connected=!1}_terminate(e){if(this.disposed)return!1;this.disposed=!0,this.transport.close(),this._stopWaitConnectionMessage();let t=[...this.websocketCommandsQueue,...this.datachannelCommandsQueue,...Object.values(this.responseHandlers)],n=this.conversationReject;return this.websocketCommandsQueue=[],this.datachannelCommandsQueue=[],this.responseHandlers={},this.incomingCache=[],this.conversationResolve=null,this.conversationReject=null,this.connected=!1,this.listenersReady=!1,this.lastStamp=0,this.producerNotificationDataChannel&&(this.producerNotificationDataChannel.onmessage=null,this.producerNotificationDataChannel=null),this.producerCommandDataChannel&&(this.producerCommandDataChannel.onmessage=null,this.producerCommandDataChannel=null),super.setAbortSignal(void 0),this.transport.setAbortSignal(void 0),t.forEach(t=>{window.clearTimeout(t.responseTimer),t.reject(e instanceof xn?new xn(t.name):e,!0)}),n?.(e),!0}_fail(e){this._terminate(e)&&this._throwError(e)}_isRecordCommand(e){return e===V.RECORD_START||e===V.RECORD_STOP}_resolvePendingRecordCommands(e){if(!N.waitForRecordResponse)return;let t=Object.values(this.responseHandlers).filter(e=>this._isRecordCommand(e.name));if(t.length===0)return;let n=new Map;n.set(null,!!e.conversation?.recordInfo);for(let t of e.rooms?.rooms??[])t.id!==void 0&&n.set(t.id,!!t.recordInfo);for(let e of t){let t=e.params.roomId??null,r=n.get(t)??!1,i=e.name===V.RECORD_START;window.clearTimeout(e.responseTimer),delete this.responseHandlers[e.sequence],this._debug.debug(`[signaling] resolve pending record command [${e.sequence}] via reconnect state`),i===r?e.resolve({type:`response`,sequence:e.sequence,response:e.name}):e.reject(Error(`Recording state mismatch`),!0)}}_handleCommandResponse(t,n){if(!Object.hasOwn(this.responseHandlers,n.sequence))return;let r=this.responseHandlers[n.sequence];window.clearTimeout(r.responseTimer);let i=G.measureMark(r.statMarkName);i!==null&&this._statSignalingCommands?.mark(r.name,i,this._getSocketType()),this._debug.debug(`[signaling] command response [${n.sequence}]`,n),t?(delete this.responseHandlers[n.sequence],r.resolve(n)):n.type===`error`?(delete this.responseHandlers[n.sequence],this._logger?.log(w.SOCKET_ACTION,`response-error`),r.reject(Error(Na(n,`Response error [${r.name}]`)),!0)):this.transport.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],this._logger?.log(w.SOCKET_ACTION,`response-timeout`),r.reject(Error(Na(n,`Response timeout [${r.name}]`)))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(t,n),e.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(this._debug.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==ka){t.reject(Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}t.needResponse?this._startResponseTimer(t):this._resolveCommandWithoutResponse(t);let e=this._serializeBinary(t);e!==null&&this.producerCommandDataChannel.send(e)}else{if(this.transport.readyState!==WebSocket.OPEN){t.reject(Error(`Invalid state or socket already closed`));continue}t.needResponse&&this._startResponseTimer(t),this.transport.send(this._serializeJson(t)).then(()=>{t.needResponse||this._resolveCommandWithoutResponse(t)},e=>{window.clearTimeout(t.responseTimer),delete this.responseHandlers[t.sequence],t.reject(e,!0)})}}}_startResponseTimer(t){t.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:t.name,sequence:t.sequence,type:`timeout`}),e.WAIT_RESPONSE_DELAY),this.responseHandlers[t.sequence]=t}_resolveCommandWithoutResponse(e){e.resolve({type:`response`,sequence:e.sequence,response:e.name})}_serializeBinary(e){switch(e.name){case V.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case V.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case V.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case V.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case V.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case V.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case V.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case V.CHANGE_SIMULCAST:return this.producerCommandSerializationService.serializeChangeSimulcast(e.sequence,e.params)}return this._debug.warn(`[signaling] cannot get binary data for data channel command: `+e.name),null}_serializeJson(e){let t;t=e.name===V.UPDATE_DISPLAY_LAYOUT?this._convertDisplayLayout(e.params):e.params;let n=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(n)}_convertDisplayLayout(e){let t=e,n={};for(let e in t)Object.hasOwn(t,e)&&(n[e]=Tn(t[e]));return{layouts:n}}_waitConnectionMessage(){let t=this._getSocketType();this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new k(S.SIGNALING_FAILED,{callError:{scope:`network`,source:t,code:`timeout`,description:`connection-timeout`},message:`Unable to connect to the signaling: connection timeout`,remote:!0}))},e.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_onTransportConnecting(e){let t=e.connectionType===mr.RETRY?gr.RECONNECTED:gr.CONNECTED;this._markTransportStat(t,e.source)}_onTransportFailed(e){switch(e.failure){case Da.EMPTY_ENDPOINT:this.conversationReject?.(new k(S.SIGNALING_FAILED,{callError:{scope:`internal`,code:`configuration`,description:`signaling-endpoint-missing`},message:e.message,remote:e.remote}));break;case Da.NETWORK_ERROR:this._fail(new k(O.NETWORK_ERROR,{callError:{scope:`network`,source:e.source,code:`reconnect-exhausted`,description:`connection-failed`}}));break;case Da.ABORTED:this._debug.debug(`[signaling] aborted reconnect`),this._fail(new k(O.CANCELED));break}}_onTransportReconnectScheduled(e){this.connectionType=mr.RETRY,this._debug.log(`[signaling] reconnect signaling after ${e.delay}ms (${e.count})`),this._logger?.log(w.SOCKET_ACTION,`reconnect`)}_onTransportConnectionDead(){this._debug.warn(`[signaling] socket is dead, trying to reconnect`),this._logTransportStat(gr.FAILED_PINGS)}_attachNotificationCallError(e){e.callError||!e.reason||e.reason===O.FAILED||e.reason===O.UNKNOWN_ERROR||!Pa.has(e.reason)&&!e.errorCode||(e.callError={scope:`server`,source:this._getSocketType(),code:e.errorCode||`protocol`,description:String(e.reason)})}_createSignalingCallError(e,t,n){let r=Ma[e];if(r)return{scope:`server`,source:n,code:t??`protocol`,description:r}}_getSocketType(){return this.transport.type}_markTransportStat(e,t=this._getSocketType()){let n=_r[e][t];G.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=_r[e][n];this._statAggregator?.logEventualStat({name:r,...t})}},Ia=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(Ia||{}),La=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(La||{}),Ra=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(Ra||{}),za=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(za||{}),Ba=function(e){return e.REQUIRE_AUTH_TO_JOIN=`REQUIRE_AUTH_TO_JOIN`,e.AUDIENCE_MODE=`AUDIENCE_MODE`,e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.ADMIN_IS_HERE=`ADMIN_IS_HERE`,e.ASR=`ASR`,e.FEEDBACK=`FEEDBACK`,e.RECURRING=`RECURRING`,e}(Ba||{});function Va(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function Ha(e,t){let n=new Set(e);for(let[e,r]of Object.entries(t))r?n.add(e):n.delete(e);return Array.from(n)}var Ua=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(Ua||{}),Z=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(Z||{}),Wa=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(Wa||{}),Ga=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(Ga||{});function Ka(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var qa=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}(qa||{});function Ja(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var Ya;(function(e){function t(e){let t=e?.transport??e?.lastEffective??P.WAITING,n={transport:t,sessionState:e?.sessionState,sessionStateApplicable:e?.sessionStateApplicable??!1,sessionStateConnectedBySpeaker:e?.sessionStateConnectedBySpeaker??!1,lastEffective:e?.lastEffective??t};return n.lastEffective=r(n),n}e.create=t;function n(e){return e===J.CONNECTED?P.CONNECTED:e===J.CONNECTING||e===J.OPENED?P.CONNECTING:e===J.RECONNECTING?P.RECONNECT:null}e.fromTransportState=n;function r(e){return[P.HANGUP,P.ERROR,P.ONHOLD].includes(e.transport)?e.transport:e.sessionStateApplicable&&e.sessionState?.connected===!1?e.transport===P.RECONNECT?P.RECONNECT:e.sessionStateConnectedBySpeaker&&e.transport===P.CONNECTED?P.CONNECTED:P.CONNECTING:e.transport}e.computeEffective=r;function i(e,t,n=!1){return e.sessionState=t,e.sessionStateConnectedBySpeaker=t?.connected===!1&&n,s(e)}e.setSessionState=i;function a(e,t){return e.transport=t,t!==P.CONNECTED&&(e.sessionStateConnectedBySpeaker=!1),s(e)}e.setTransport=a;function o(e,t){return e.sessionStateApplicable=t,t||(e.sessionStateConnectedBySpeaker=!1),s(e)}e.setSessionStateApplicable=o;function s(e){let t=r(e);return e.lastEffective===t?{status:t,shouldNotify:!1}:(e.lastEffective=t,{status:t,shouldNotify:!0})}})(Ya||(Ya={}));var Xa=Ya,Za=function(e){return e.USER=`USER`,e.ANONYM=`ANONYM`,e.GROUP=`GROUP`,e}({}),Q;(function(e){function t(e){return e.length?typeof e[0]==`object`?e:e.map(e=>n(e)):[]}e.fromIds=t;function n(e,t=`USER`,n=0){return{id:e,type:t,deviceIdx:n}}e.fromId=n;function r(e,t=!0,n=!1){let r=t?e.decorativeExternalUserId:e.externalId,a=e.deviceIdx??0;if(r)return i(r,a);if(n&&t&&e.externalId)return i(e.externalId,a)}e.fromSignalingParticipant=r;function i(e,t=0){let n=e.type===`ANONYM`?`ANONYM`:`USER`;return{id:e.id,type:n,deviceIdx:t}}e.fromSignaling=i;function a(e){return e.id}e.toSignaling=a;function o(e){let t=e.deviceIdx||0;return`{"id":"${e.id}","type":"${e.type}","deviceIdx":${t}}`}e.toString=o;function s(e,t=`USER`,r=0){return o(n(e,t,r))}e.fromIdToString=s;function c(e){try{return JSON.parse(e)}catch{throw Error(`Failed to parse ExternalId from string '${e}'`)}}e.fromString=c;function l(e,t){return e.id===t.id&&e.type===t.type&&e.deviceIdx===t.deviceIdx}e.compare=l;function u(e){return e?.deviceIdx||0}e.getDeviceIdx=u})(Q||(Q={}));function Qa(e){try{return btoa(JSON.stringify(e))}catch(t){z.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function $a(e){try{return JSON.parse(atob(e))}catch(t){z.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var eo=(e,t)=>M.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function to(e){if(e.conversation?.muteStates)return e.conversation.muteStates;if(e.muteState&&e.muteOptions)return e.muteOptions.reduce((t,n)=>(t[n]=e.muteState,t),{})}function no(e,t){switch(e){case C.AUDIO:return!!t.isAudioEnabled;case C.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case C.VIDEO:return!!t.isVideoEnabled;case C.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function ro(e,t){return M.objectReduce(e,(e,n,r)=>{switch(n){case Ua.MUTE:case Ua.MUTE_PERMANENT:no(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function io(e){let{muteStates:t={},mediaSettings:n}=e;return ro(t,n)}function ao(e,t){let n=e.conversation.participants.find(t=>M.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return ro(t,r)}function oo(e){if(!e)return null;let t=Array.from(new Set((e.urls??[]).map(e=>e.trim()).filter(e=>e.length>0)));return t.length?{...e,urls:t}:null}function so(e,t){let n=[],r=oo(e),i=oo(t);if(r&&n.push(r),i){let e=[...i.urls];e.push(`${e[e.length-1]}?transport=tcp`),n.push({...i,urls:e})}return n}function co(e,t){let n=new Uint8Array(t),r=0,i=0;for(;r<e.length&&i<t;){let a=e[r++],o=a>>4,s=a&15;if(o===15){let t;do t=e[r++],o+=t;while(t===255)}for(let a=0;a<o&&!(i>=t);a++)n[i++]=e[r++];if(r>=e.length||i>=t)break;let c=e[r]|e[r+1]<<8;if(r+=2,s===15){let t;do t=e[r++],s+=t;while(t===255)}s+=4;let l=i-c;for(let e=0;e<s&&!(i>=t);e++)n[i++]=n[l+e]}return n}var lo=class{constructor(e,t=z,n=null){h(this,`_fixNoPacketsApplied`,!1),h(this,`_fixNoPacketsChecked`,!1),h(this,`_fixTooManyPacketsApplied`,!1),h(this,`_fixTooManyPacketsSucceeded`,!1),h(this,`_fixTooManyPacketsFailed`,!1),h(this,`_fixTooManyPacketsTime`,void 0),h(this,`_mediaSource`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_lastPacketsSent`,void 0),h(this,`_lastPacketsSentTime`,void 0),h(this,`_toggleAudioPromise`,null),h(this,`_fixNoPacketsAppliedVideo`,!1),this._mediaSource=e,this._debug=t,this._logger=n}_fixAudioDeviceNoPackets(e){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,this._logger?.log(w.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&(this._fixNoPacketsApplied=!0,this._logger?.log(w.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (no packets)`),this._toggleAudioPromise=this._mediaSource.toggleAudio(E.getMicrophonePermissionState()!==`denied`),this._toggleAudioPromise.catch(()=>void 0))}}_fixAudioDeviceTooManyPackets(e){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let t=Date.now();if(!this._lastPacketsSentTime)e.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent);else if(t-this._lastPacketsSentTime>500){let n=(e.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent,this._fixTooManyPacketsApplied?n>75?(this._debug.log(`[AudioFix] Failed to fix RV`),this._logger?.log(w.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(this._debug.log(`[AudioFix] Fixed RV`),this._logger?.log(w.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,this._logger?.log(w.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (too many packets)`),this._mediaSource.toggleAudio(!0).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (too many packets)`,e)}),this._fixTooManyPacketsTime=t)}}fix(e){if(!this._mediaSource)return;let t=e.find(e=>e.kind===A.audio);t&&(this._fixAudioDeviceNoPackets(t),this._fixAudioDeviceTooManyPackets(t))}fixVideo(e){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let t=e.find(e=>e.kind===A.video);t&&!t.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.mediaSettings.isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (no packets): video restart`,e)}))}},uo=class{constructor(e,t=!1,n=z,r=null){h(this,`_audioElement`,null),h(this,`_audioTracks`,new Map),h(this,`_allowMultipleTracks`,void 0),h(this,`_volume`,1),h(this,`_features`,{setSinkId:!!Audio.prototype.setSinkId}),h(this,`_statFirstMediaReceived`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t,this._debug=n,this._logger=r}add(e,t){this._allowMultipleTracks||this._clearTracks();let n=this._audioTracks.get(e);n&&n!==t&&(this._removeTrackFromAudioElement(n),n.stop()),this._audioTracks.set(e,t),this._audioElement?this._addTrackToAudioElement(t):this._initAudioElement()}remove(e,t){let n=this._audioTracks.get(e);if(!n){t.stop();return}if(n!==t){t.stop();return}if(!this._allowMultipleTracks){this.destroy();return}this._removeTrackFromAudioElement(t),t.stop(),this._audioTracks.delete(e),this._audioTracks.size||this.destroy()}get volume(){return this._volume}set volume(e){this._volume=Math.max(0,Math.min(1,e)),this._audioElement&&(this._audioElement.volume=this._volume)}destroy(){!this._audioElement&&!this._audioTracks.size||(this._stopAudioElement(),this._audioElement=null,this._audioTracks.clear())}async changeOutput(){try{if(!this._features.setSinkId)throw Error(`Feature "setSinkId" is not supported`);if(!this._audioElement)return;let e=E.getSavedOutput();e&&await this._audioElement.setSinkId?.(e.deviceId)}catch(e){throw this._logger?.log(w.ERROR,`change_output`),this._debug.error(`[audio] Output change failed`,e),e}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(N.muteMode)return;let e=this._getTracks();if(!e.length)return;let t=E.browserName()!==`Safari`||E.isMobile()||N.safariAudioElement,n=document.createElement(t?`audio`:`video`);n.muted=!1,n.volume=this._volume,n.preload=`auto`;let r=()=>{this._debug.warn(`[audio] Error on play audio`),R.onAutoplayError()},i=e=>{this._debug.debug(`[audio] Play audio`),n.srcObject=null,n.srcObject=new MediaStream(e),n.load();let t=n.play();t&&t.catch(r)},a=()=>{this._debug.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?i(e):this._debug.warn(`[audio] Broken audio tracks`)};n.onpause=a,n.onstalled=a,n.onerror=a,n.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(e),this._audioElement=n;let o=E.getSavedOutput()?.deviceId;o&&n.setSinkId?.(o).catch(e=>{this._debug.warn(`[audio] Failed to set output device '${o}'`,e)})}_stopAudioElement(){this._audioElement&&(this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_addTrackToAudioElement(e){if(!this._audioElement)return;this._debug.debug(`[audio] Adding track ${e}`);let t=this._audioElement.srcObject;t||(t=new MediaStream,this._audioElement.srcObject=t),t.addTrack(e)}_removeTrackFromAudioElement(e){this._audioElement?.srcObject&&(this._debug.debug(`[audio] Removing track ${e}`),this._audioElement.srcObject.removeTrack(e))}_clearTracks(){for(let e of this._audioTracks.values())this._removeTrackFromAudioElement(e),e.stop();this._audioTracks.clear()}};function fo(e,t){e||mo(t,`response-empty`),e.id||mo(t,`id-empty`),e.endpoint||mo(t,`endpoint-empty`),!po(e.stun_server)&&!po(e.turn_server)&&mo(t,`ice-servers-empty`)}function po(e){return Array.isArray(e?.urls)&&e.urls.length>0}function mo(e,t){let n=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),r=e===`fastStart`||e===`fastJoin`;throw new k(r?e===`fastStart`?O.FAST_START_ERROR:O.FAST_JOIN_ERROR:O.UNKNOWN_ERROR,{message:`Invalid ${e} response: ${t}`,callError:r?{scope:`external`,source:`api`,code:`invalid-response`,description:`${n}-${t}`}:{scope:`server`,source:`api`,code:`invalid-response`,description:`${n}-${t}`}})}var ho=90,go=3,_o=class extends x{constructor(e=z){super(),h(this,`_lastMemoryStat`,{percent:0,bytes:0}),h(this,`_debug`,void 0),this._debug=e}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(e=>{e.userId=(typeof e.userId==`string`&&t[e.userId]||null)?.externalId}),R.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),n=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>ho?this._debug.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=go)&&(this._debug.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},vo=class{constructor({api:e,debug:t,getParticipants:n,isMe:r,updateDisplayLayout:i}){h(this,`_api`,void 0),h(this,`_debug`,void 0),h(this,`_getParticipants`,void 0),h(this,`_isMe`,void 0),h(this,`_updateDisplayLayout`,void 0),h(this,`_requestedLayouts`,{}),h(this,`_uncertainLayouts`,{}),h(this,`_pendingRequests`,null),h(this,`_pendingPromises`,[]),h(this,`_lastRequests`,null),h(this,`_timer`,null),h(this,`_inFlight`,!1),h(this,`_lastFlushAt`,null),h(this,`_generation`,0),h(this,`_forceNextFlush`,!1),this._api=e,this._debug=t,this._getParticipants=n,this._isMe=r,this._updateDisplayLayout=i}request(e){this._pendingRequests=e.slice(),this._lastRequests=e.slice();let t=new Promise((e,t)=>{this._pendingPromises.push({resolve:e,reject:t})});return this._schedule(),t}resend(){this._lastRequests&&(this._pendingRequests=this._lastRequests.slice(),this._forceNextFlush=!0,this._schedule())}cleanupParticipant(e){for(let t of Object.keys(this._requestedLayouts))kn(t).participantId===e&&delete this._requestedLayouts[t];for(let t of Object.keys(this._uncertainLayouts))kn(t).participantId===e&&delete this._uncertainLayouts[t]}clear(){this._generation++,this._timer!==null&&(window.clearTimeout(this._timer),this._timer=null),this._pendingPromises.forEach(({resolve:e})=>e()),this._requestedLayouts={},this._uncertainLayouts={},this._pendingRequests=null,this._pendingPromises=[],this._lastRequests=null,this._inFlight=!1,this._lastFlushAt=null,this._forceNextFlush=!1}_schedule(){if(this._inFlight||this._timer!==null)return;let e=this._lastFlushAt===null?0:Math.max(0,N.requestDisplayLayoutThrottleMs-(Date.now()-this._lastFlushAt));this._timer=window.setTimeout(()=>{this._timer=null,this._flush()},e)}async _flush(){if(this._inFlight||!this._pendingRequests)return;this._inFlight=!0;let e=this._generation,t=this._pendingRequests,n=this._pendingPromises;this._pendingRequests=null,this._pendingPromises=[];let r={};try{r=this._getRequestLayouts(t);let i=this._forceNextFlush||Object.keys(this._uncertainLayouts).length>0;this._forceNextFlush=!1;let a=this._getDiff(r,i);a.length&&await this._updateDisplayLayout(a),e===this._generation&&(this._requestedLayouts=r,this._uncertainLayouts={}),n.forEach(({resolve:e})=>e())}catch(t){e===this._generation?(this._uncertainLayouts={...this._uncertainLayouts,...r},n.forEach(({reject:e})=>e(t))):n.forEach(({resolve:e})=>e())}finally{e===this._generation&&(this._lastFlushAt=Date.now(),this._inFlight=!1,this._pendingRequests&&this._schedule())}}_getRequestLayouts(e){let t={},n=this._getParticipants();for(let r of e){let e=typeof r.uid==`object`?r.uid:Q.fromId(r.uid),i=this._api.getCachedOkIdByExternalId(e);if(!i){this._debug.log(`Unknown participant external ID ${typeof r.uid==`object`?Q.toString(r.uid):r.uid}`);continue}if(!n[i]&&!this._isMe(i))continue;let a=On({participantId:i,mediaType:r.mediaType,streamName:r.streamName});t[a]={uid:r.uid,mediaType:r.mediaType,width:r.width,height:r.height,fit:r.cover?`cv`:`cn`,...r.priority===void 0?{}:{priority:r.priority},...r.streamName===void 0?{}:{streamName:r.streamName}}}return t}_getDiff(e,t=!1){let n=[];if(t){let t={...this._requestedLayouts,...this._uncertainLayouts};n.push(...Object.values(e));for(let[r,i]of Object.entries(t))e[r]||n.push({uid:i.uid,mediaType:i.mediaType,stopStream:!0,...i.streamName===void 0?{}:{streamName:i.streamName}});return n}for(let[t,r]of Object.entries(e)){let e=this._requestedLayouts[t];(!e||this._isChanged(e,r))&&n.push(r)}for(let[t,r]of Object.entries(this._requestedLayouts))e[t]||n.push({uid:r.uid,mediaType:r.mediaType,stopStream:!0,...r.streamName===void 0?{}:{streamName:r.streamName}});return n}_isChanged(e,t){let n=e,r=t;return n.width!==r.width||n.height!==r.height||n.fit!==r.fit||n.priority!==r.priority}},yo=44100,bo=class{constructor(e,t){h(this,`_analyser`,null),h(this,`_gainNode`,null),h(this,`_fftBins`,null),h(this,`_mediaStreamSource`,null),h(this,`_lastSmoothedLevel`,0),h(this,`_trackId`,void 0),h(this,`_track`,void 0),h(this,`_stream`,void 0),this._trackId=e,this._track=t,this._stream=new MediaStream([t]);try{let e=E.getAudioContext();this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),this._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=e.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let e=yo/this._fftBins.length,t=Math.ceil(N.voiceParams.minFreq/e),n=Math.floor(N.voiceParams.maxFreq/e);return this._fftBins.subarray(t,n)}getLevel(){let e=this._getBins(),t=e.reduce((e,t)=>e+t,0)/e.length/255,n=this._lastSmoothedLevel*N.voiceParams.smoothing+t*(1-N.voiceParams.smoothing);return this._lastSmoothedLevel=n,{real:t,smoothed:n}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}},xo=class extends x{constructor(e){super(),h(this,`_detector`,null),h(this,`_interval`,null);let t=()=>{this._detector&&R.onLocalVolume(this._detector.getLevel().real,e.mediaSettings.isAudioEnabled),this._interval=window.setTimeout(t,N.voiceParams.interval)};this._interval=window.setTimeout(t,N.voiceParams.interval);let n=()=>{let t=e.getSendAudioTrack();t&&this.init(t)};this.subscribe(e,Jt.SOURCE_CHANGED,t=>{t.kind===A.audio&&e.mediaSettings.isAudioEnabled&&n()}),this.subscribe(e,Jt.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new bo(`local`,e.clone())}_stopDetector(){this._detector&&(this._detector.track.stop(),this._detector.destroy(),this._detector=null)}destroy(){this.unsubscribe(),this._interval&&(window.clearTimeout(this._interval),this._interval=null),this._stopDetector()}},So=class{constructor(e,t=z){h(this,`processor`,void 0),h(this,`queue`,[]),h(this,`isProcessing`,!1),h(this,`_debug`,void 0),this.processor=e,this._debug=t}add(e){this.queue.push(e),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let e=this.queue.shift();if(e)try{await this.processor(e)}catch{this._debug.error(`Can't process message ${JSON.stringify(e)}`)}}this.isProcessing=!1}}},Co=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),wo=class extends x{constructor(e){super(),h(this,`_detectors`,new Map),h(this,`_interval`,null),h(this,`_activeParticipants`,void 0),h(this,`_removedParticipants`,void 0),h(this,`_topology`,void 0),this._topology=e.getTopology(),this.subscribe(e,X.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(e,X.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,X.SIGNALLED_ACTIVE_PARTICIPANTS,this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,X.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._destroyDetectors()}_onRemoteTrackAdded(e,t,n){if(n.kind===A.audio&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new bo(e,n)),!this._interval)){let e=()=>{this._collectVolumes(),this._interval=window.setTimeout(e,N.voiceParams.interval)};this._interval=window.setTimeout(e,N.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,n){if(n.kind!==A.audio)return;let r=this._detectors.get(e);!r||r.track!==n||(r.destroy(),this._detectors.delete(e))}_collectVolumes(){if(!this._detectors.size)return;let e={};if(this._topology===Y.SERVER){if(this._activeParticipants)for(let t of this._activeParticipants){let n=this._getAudioTrackLevelByParticipantId(t);n&&(e[t]=n)}if(this._removedParticipants){for(let t of this._removedParticipants)e[t]={real:0,smoothed:0};this._removedParticipants=null}}else for(let[t,n]of this._detectors.entries())e[t]=n.getLevel();this._triggerEvent(`VOLUMES_DETECTED`,e)}_getAudioTrackLevelByParticipantId(e){if(this._isTransparentAudioMode())return this._getTransparentAudioLevelByParticipantId(e);let t=this._detectors.get(Ur.AUDIO_MIX);return t?t.getLevel():null}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((e,n)=>{if(!n.startsWith(`${Ur.TRANSPARENT_AUDIO_TRACK_PREFIX}-`))return;let r=e.getLevel();(!t||r.real>t.real)&&(t=r)}),t}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){this._topology=e,this._destroyDetectors(),e===Y.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology===Y.SERVER&&N.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},To=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),Eo=class extends x{constructor(e,t,n){super(),h(this,`_speakerId`,null),h(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===Y.SERVER,this.subscribe(e,Co.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this.subscribe(t,X.SIGNALLED_SPEAKER_CHANGED,this._onServerSpeakerChanged.bind(this)),this.subscribe(t,X.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,n=null;if(Object.keys(e).forEach(r=>{let i=e[r].smoothed;i>t&&i>N.voiceParams.threshold&&(t=i,n=r)}),n&&n!==this._speakerId){let r=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>r*N.voiceParams.speakerLevelMultiplier&&(this._speakerId=n,this._triggerEvent(`SPEAKER_CHANGED`,n))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent(`SPEAKER_CHANGED`,e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e===Y.SERVER}},Do=15e3,Oo=15e3,ko=class extends x{constructor(e,t,n,r=z,i=null){super(),h(this,`_transport`,void 0),h(this,`_volumes`,{}),h(this,`_participants`,{}),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_connectionTimeout`,0),h(this,`_connectionTimeoutSuppressed`,!1),h(this,`_volumeTimeout`,0),this._transport=e,this._participants=n,this._debug=r,this._logger=i,this.subscribe(e,X.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(t,Co.VOLUMES_DETECTED,this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}onParticipantHoldChanged(){this._connectionTimeout||!this._connectionTimeoutSuppressed||this._reportConnectionTimeout()}_getConnectionTimeout(){return this._transport.getTopology()===Y.DIRECT?Do:N.specListenerParams.connectionTimeout}_getVolumeTimeout(){return this._transport.getTopology()===Y.DIRECT?Oo:N.specListenerParams.volumeTimeout}_onTransportStateChanged(e,t){t===J.OPENED&&(this._connectionTimeout||(this._connectionTimeoutSuppressed=!1,this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),this._getConnectionTimeout()))),t===J.CONNECTED&&(this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),this._getVolumeTimeout())),this._volumeTimeout&&(window.clearTimeout(this._volumeTimeout),this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),this._getVolumeTimeout()))),t===J.FAILED&&this._connectionTimeout&&(this._debug.warn(`Transport failed, send callSpecError`),this._logger?.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){this._reportConnectionTimeout(),this._connectionTimeout=0}_reportConnectionTimeout(){let e=!1,t=!1;Object.entries(this._transport.getStates()).forEach(([n,r])=>{if(r!==J.CONNECTED){if(this._participants[n]?.isOnHold){e=!0;return}t=!0}}),this._connectionTimeoutSuppressed=e&&!t,t&&(this._debug.warn(`There is not connected transport, send callSpecError`),this._logger?.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0||this._participants[t]?.isOnHold)return;let n=`UNKNOWN`,r=this._participants[t];r&&r.platform&&(n=r.platform),e.indexOf(n)<0&&(e.push(n),this._logger?.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&this._debug.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},Ao=class extends m{constructor(e,t,n,r=()=>void 0){super(),h(this,`_externalLogger`,void 0),h(this,`_api`,void 0),h(this,`_conversationIdProvider`,void 0),h(this,`_topologyProvider`,void 0),h(this,`_batchInterval`,3e3),h(this,`_batchedClientStats`,[]),h(this,`_batchTimeout`,null),h(this,`_serverTimeDelta`,0),h(this,`_waitingForServerTime`,!0),h(this,`_deferredClientStats`,[]),this._api=e,this._externalLogger=t,this._conversationIdProvider=n,this._topologyProvider=r,this._calculateServerTimeDelta()}log(e,t,n=!1){this._externalLogger&&this._externalLogger.log(e,t,n)}logClientStats(e,t=!1){let n=typeof t==`boolean`?{immediately:t}:t,r={...e,call_topology:e.call_topology??this._getCallTopology()};if(n.deferUntilServerTime&&this._waitingForServerTime){this._deferredClientStats.push({data:r,options:{...n}}),n.immediately&&this._flushDeferredClientStats();return}this._logClientStats(r,n)}destroy(){this._flushDeferredClientStats(),this._sendBatch(),this._stopTimeout()}_logClientStats(e,t){let n={...e,vcid:t.conversationId===void 0?this._getConversationId():t.conversationId,timestamp:t.occurredAt===void 0?this._now():t.occurredAt-this._serverTimeDelta};Object.keys(n).forEach(e=>{n[e]===void 0&&delete n[e]}),this._batchedClientStats.push(n),(t.immediately||!this._batchTimeout)&&this._sendBatch()}_getConversationId(){try{return this._conversationIdProvider()}catch{return null}}_getCallTopology(){try{return this._topologyProvider()===Y.SERVER?`S`:`D`}catch{return`D`}}_sendBatch(){this._stopTimeout();let e=!1;this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendClientStats(e){this._api.logClientStats(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}finally{this._flushDeferredClientStats()}}_flushDeferredClientStats(){if(!this._waitingForServerTime)return;this._waitingForServerTime=!1;let e=this._deferredClientStats;this._deferredClientStats=[];for(let{data:t,options:n}of e)this._logClientStats(t,n)}_now(){return Date.now()-this._serverTimeDelta}},jo=`invalid-error-metadata`,Mo=64,No=new Set(Object.values(O)),Po=new Set(Object.values(S)),Fo={[O.CANCELED]:{type:`semantic`,reason:`canceled`},[O.REJECTED]:{type:`semantic`,reason:`rejected`},[O.REMOVED]:{type:`semantic`,reason:`removed`},[O.HUNGUP]:{type:`semantic`,reason:`hangup`},[O.MISSED]:{type:`semantic`,reason:`missed`},[O.BUSY]:{type:`semantic`,reason:`busy`},[O.FAILED]:{type:`failed`},[O.NETWORK_ERROR]:{type:`requires-call-error`},[O.KILLED]:{type:`semantic`,reason:`killed`},[O.BANNED]:{type:`semantic`,reason:`banned`},[O.HAS_ACTIVE_CALL]:{type:`semantic`,reason:`initially_closed`},[O.CALLER_IS_BLOCKED]:{type:`requires-call-error`},[O.NOT_FRIENDS]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1103,description:`friendship-required`}},[O.CALLEE_IS_OFFLINE]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1102,description:`target-user-unavailable`}},[O.CALLEE_UNAVAILABLE]:{type:`semantic`,reason:`unavailable`},[O.CALLER_IS_REJECTED]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1113,description:`caller-is-rejected`}},[O.UNKNOWN_ERROR]:{type:`failed`},[O.UNSUPPORTED]:{type:`direct-error`,error:{scope:`internal`,code:`observer-mode`,description:`video-tracks-count-must-be-zero`}},[O.SERVICE_DISABLED]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1101,description:`vchat-service-disabled`}},[O.SERVICE_UNAVAILABLE]:{type:`requires-call-error`},[O.EXTERNAL_API_ERROR]:{type:`requires-call-error`},[O.SOCKET_CLOSED]:{type:`semantic`,reason:`socket_closed`},[O.ENDED]:{type:`requires-call-error`},[O.KILLED_WITHOUT_DELETE]:{type:`semantic`,reason:`killed_without_delete`},[O.ANOTHER_DEVICE]:{type:`semantic`,reason:`another_device`},[O.NOT_FOUND]:{type:`requires-call-error`},[O.VCHAT_DETAILED_ERROR]:{type:`requires-call-error`},[O.TIMEOUT]:{type:`semantic`,reason:`timeout`},[O.PARTICIPANT_LIMIT_REACHED]:{type:`requires-call-error`},[O.FAST_START_ERROR]:{type:`failed`},[O.FAST_JOIN_ERROR]:{type:`failed`},[O.CALL_TIMEOUT]:{type:`semantic`,reason:`call_timeout`},[O.OBSOLETE_CLIENT]:{type:`semantic`,reason:`obsolete_client`}},Io={[S.MIC_CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`mic-camera-permission`}},[S.CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-permission`}},[S.MIC_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-permission`}},[S.CAMERA_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-access`}},[S.MIC_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-access`}},[S.MIC_NOT_FOUND]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-not-found`}},[S.SCREEN_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-permission`}},[S.SCREEN_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-access`}},[S.CONNECTION]:{type:`direct-error`,error:{scope:`network`,source:`rtc`,code:`connection`,description:`connection-failed`}},[S.NETWORK]:{type:`requires-call-error`},[S.UNKNOWN]:{type:`failed`},[S.UNSUPPORTED]:{type:`requires-call-error`},[S.SIGNALING_FAILED]:{type:`requires-call-error`},[S.API]:{type:`requires-call-error`},[S.AUTH]:{type:`requires-call-error`},[S.OVERCONSTRAINED]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`overconstrained`}}};function Lo(e){if(typeof e!=`string`&&typeof e!=`number`||typeof e==`number`&&!Number.isFinite(e))return jo;let t=String(e).trim();if(!t)return jo;let n=t.toLowerCase().replace(/[\s_:]+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``);return!n||!/^[a-z0-9.-]+$/.test(n)?jo:n.length>Mo?`${n.slice(0,Mo-3)}...`:n}function Ro(e){if(!e||typeof e!=`object`)return!1;let t=e;switch(t.scope){case`unknown`:case`internal`:return!0;case`external`:return t.source===`api`;case`server`:return t.source===`api`||t.source===`ws`||t.source===`wt`;case`network`:return t.source===`api`||t.source===`rtc`||t.source===`ws`||t.source===`wt`;default:return!1}}function zo(e){let t=Lo(e.description);if(e.scope===`unknown`)return`unknown:${t}`;let n=Lo(e.code);return e.scope===`internal`?`internal:${n}:${t}`:`${e.scope}:${e.source}:${n}:${t}`}function Bo(e,t){return t===null?e.type===`direct-error`?{reason:`error`,string_value:zo(e.error)}:{reason:`failed`}:Ro(t)?{reason:`error`,string_value:zo(t)}:{reason:`failed`}}function Vo(e){if(e.hangup){let t=Fo[e.hangup];return t?t.type===`semantic`?e.hangup===O.OBSOLETE_CLIENT&&e.custom_error?.vchat_detailed_api_error.code?{reason:t.reason,string_value:e.custom_error.vchat_detailed_api_error.code}:{reason:t.reason}:Bo(t,e.callError):{reason:`failed`}}if(e.error){let t=Io[e.error];return t?Bo(t,e.callError):{reason:`failed`}}return{reason:`failed`}}function Ho(e){return e instanceof k?Vo(e):typeof e==`string`&&(No.has(e)||Po.has(e))?Vo(new k(e)):{reason:`failed`}}var Uo={wallNow:()=>Date.now(),monotonicNow:()=>performance.now()};function Wo(e){return e===`anonym_join`?`join`:e}var Go=class{constructor(e,t=Uo){h(this,`_logger`,void 0),h(this,`_clock`,void 0),h(this,`_conversationId`,null),h(this,`_callStartLabel`,null),h(this,`_lifecycleStartedAtMonotonic`,0),h(this,`_pendingEvents`,[]),h(this,`_callStarted`,!1),h(this,`_accepted`,!1),h(this,`_firstMediaSent`,!1),h(this,`_finished`,!1),h(this,`_destroyed`,!1),this._logger=e,this._clock=t}get firstMediaSentReported(){return this._firstMediaSent}get terminated(){return this._finished||this._destroyed}markInitializationStarted({source:e,conversationId:t}){if(this._destroyed||this._callStartLabel!==null)return;let n=this._clock.wallNow();this._callStartLabel=Wo(e),this._lifecycleStartedAtMonotonic=this._clock.monotonicNow(),t&&(this._conversationId=t),this._record({name:U.CALL_INIT,source:e},n)}bindConversationId(e){this._destroyed||this._conversationId||!e||(this._conversationId=e,this._flushPendingEvents())}markCallStarted(){!this._canRecord()||this._callStarted||!this._callStartLabel||(this._callStarted=!0,this._record({name:U.CALL_START,value:this._durationSince(this._lifecycleStartedAtMonotonic),string_value:JSON.stringify({labels:[this._callStartLabel]})}))}markOutgoingAccepted(){!this._canRecord()||this._accepted||(this._accepted=!0,this._record({name:U.CALL_ACCEPTED_OUTGOING}))}markIncomingAccepted(e){!this._canRecord()||this._accepted||(this._accepted=!0,this._record({name:U.CALL_ACCEPTED_INCOMING,...e&&{string_value:`concurrent`}}))}markFirstMediaSent(){!this._canRecord()||this._firstMediaSent||(this._firstMediaSent=!0,this._record({name:U.FIRST_MEDIA_SENT}))}markFinished(e){this._finish(Ho(e))}markTerminated(){this._finish({reason:`terminated`})}destroy(){this._destroyed||(this._destroyed=!0,this._pendingEvents=[])}_canRecord(){return this._callStartLabel!==null&&!this._finished&&!this._destroyed}_durationSince(e){return Math.max(0,Math.round(this._clock.monotonicNow()-e))}_finish({reason:e,string_value:t}){this._canRecord()&&(this._finished=!0,this._ensureConversationId(),this._record({name:U.CALL_FINISH,reason:e,...t&&{string_value:t}},void 0,!0))}_ensureConversationId(){this._conversationId||(this._conversationId=M.uuid(),this._flushPendingEvents())}_record(e,t=this._clock.wallNow(),n=!1){if(this._destroyed)return;let r={data:e,occurredAt:t,immediately:n};if(!this._conversationId){this._pendingEvents.push(r);return}this._logEvent(r)}_flushPendingEvents(){if(!this._conversationId||!this._pendingEvents.length)return;let e=this._pendingEvents;this._pendingEvents=[];for(let t of e)this._logEvent(t)}_logEvent({data:e,occurredAt:t,immediately:n}){this._logger.logClientStats(e,{conversationId:this._conversationId,deferUntilServerTime:!0,occurredAt:t,...n&&{immediately:!0}})}},Ko=class{constructor(e,t){h(this,`_logger`,void 0),h(this,`_codecUsages`,new Map),h(this,`getCurrentTransportTopology`,void 0),this._logger=e,this.getCurrentTransportTopology=t}reportUsage(e){let t=this.getCurrentTransportTopology();if(!t)return;let n=e.rtps.filter(e=>e.type===`outbound-rtp`&&!e.mid?.endsWith(`s`));N.simulcast&&(n=n.reduce((e,t)=>{if(t.kind!==`video`)return e.concat(t);let n=e.find(e=>e.kind===`video`);return n?n.totalEncodeTime=(n.totalEncodeTime??0)+(t.totalEncodeTime??0):e.push(t),e},[])),n.forEach(e=>{let n=e.kind,r=e.mimeType;if((n===`audio`||n===`video`)&&r){let i=[r,`encoder`,e.encoderImplementation].filter(Boolean).join(`/`);this.saveUsage({kind:n,codecName:i,totalEncodeTime:(e.totalEncodeTime??0)*1e3,audioCodecParams:e.sdpFmtpLine,topology:t})}})}saveUsage({kind:e,codecName:t,totalEncodeTime:n,audioCodecParams:r,topology:i}){let a=this._codecUsages.get(e);if(a&&a.codecName!==t&&this.report(a),a&&a.codecName===t){this._codecUsages.set(e,{...a,totalEncodeTime:n,topology:i});return}this._codecUsages.set(e,{kind:e,codecName:t,audioCodecParams:r,totalEncodeTime:n,topology:i})}report(e){if(e.kind===`video`&&e.totalEncodeTime===0)return;let t={name:U.CODEC_USAGE,codec_implementation:e.codecName,value:Number.parseFloat(e.totalEncodeTime.toFixed(3)),call_topology:e.topology===Y.DIRECT?`D`:`S`};e.audioCodecParams&&(t.string_value=e.audioCodecParams),this._logger.logClientStats(t)}destroy(){this._codecUsages.forEach(e=>{this.report(e)}),this._codecUsages.clear()}},qo=class{constructor(e){h(this,`_logger`,void 0),h(this,`_eventualLogs`,new Set),h(this,`_lastCallStatContext`,null),this._logger=e}logCallStat(e){this._lastCallStatContext=this._getCallStatContext(e),this._flushEventualStats(),this._logger.logClientStats(e)}logEventualStat(e){let t=Date.now();e.value===void 0&&(e.value=G.measureMark(e.name)),e.value!==null&&this._eventualLogs.add({data:e,occurredAt:t})}destroy(){this._flushEventualStats()}_getCallStatContext(e){return{call_topology:e.call_topology,local_address:e.local_address,local_connection_type:e.local_connection_type,network_type:e.network_type,remote_address:e.remote_address,remote_connection_type:e.remote_connection_type,transport:e.transport}}_flushEventualStats(){let e=[...this._eventualLogs];for(let t of e)this._logEventualStat(t),this._eventualLogs.delete(t)}_logEventualStat({data:e,occurredAt:t}){this._logger.logClientStats({...e,...this._lastCallStatContext??{}},{occurredAt:t})}},Jo=class{constructor(e){if(h(this,`q`,void 0),h(this,`inits`,[]),h(this,`n`,[1,2,3,4,5]),h(this,`np`,[1,1,1,1,1]),h(this,`qv`,[]),!(e>0&&e<1))throw Error(`q must be in (0,1)`);this.q=e}add(e){if(this.inits.length<5){this.inits.push(e),this.inits.length===5&&this.bootstrap();return}let t=0;if(e<this.qv[0])this.qv[0]=e,t=0;else if(e>=this.qv[4])this.qv[4]=e,t=3;else for(;!(e<this.qv[t+1]);)t++;for(let e=0;e<5;e++)this.n[e]+=e<=t?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let e=1;e<=3;e++){let t=this.np[e]-this.n[e];if(t>=1&&this.n[e+1]-this.n[e]>1||t<=-1&&this.n[e]-this.n[e-1]>1){let n=Math.sign(t),r=this.qv[e]+n/(this.n[e+1]-this.n[e-1])*((this.n[e]-this.n[e-1]+n)*(this.qv[e+1]-this.qv[e])/(this.n[e+1]-this.n[e])+(this.n[e+1]-this.n[e]-n)*(this.qv[e]-this.qv[e-1])/(this.n[e]-this.n[e-1]));r>this.qv[e-1]&&r<this.qv[e+1]?this.qv[e]=r:this.qv[e]=this.qv[e]+n*(this.qv[e+n]-this.qv[e])/(this.n[e+n]-this.n[e]),this.n[e]+=n}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let e=[...this.inits].sort((e,t)=>e-t),t=this.q*(e.length-1),n=Math.floor(t),r=t-n;return n+1<e.length?e[n]*(1-r)+e[n+1]*r:e[n]}return this.qv[2]}bootstrap(){this.inits.sort((e,t)=>e-t),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}},Yo=class{constructor(){h(this,`n`,0),h(this,`mean`,0)}add(e){this.n++;let t=e-this.mean;this.mean+=t/this.n}get avg(){return this.n?this.mean:NaN}},Xo=class{constructor(){h(this,`count`,0),h(this,`minVal`,1/0),h(this,`maxVal`,-1/0),h(this,`mean`,new Yo),h(this,`p50`,new Jo(.5)),h(this,`p95`,new Jo(.95))}add(e){e<this.minVal&&(this.minVal=e),e>this.maxVal&&(this.maxVal=e),this.mean.add(e),this.p50.add(e),this.p95.add(e),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}},Zo=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByTransport`,{ws:new Xo,wt:new Xo}),h(this,`lastSeen`,{}),this._logger=e}mark(e){let t=Date.now(),n=this.lastSeen[e];if(typeof n==`number`){let r=t-n;r>=0&&this.trackerByTransport[e].add(r)}this.lastSeen[e]=t}logMetrics(){[hr.WEBSOCKET,hr.WEBTRANSPORT].forEach(e=>{if(!this.trackerByTransport[e].hasData)return;let t=this.trackerByTransport[e].snapshot();this._logger.logClientStats({name:U.SIGNALING_PING_SUMMARY,min_value:t.min,max_value:t.max,avg_value:t.avg,median_value:t.median,p95_value:t.p95,values_count:t.count,signaling_transport:e})})}destroy(){this.trackerByTransport={ws:new Xo,wt:new Xo},this.lastSeen={}}},Qo=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByCommand`,new Map),this._logger=e}mark(e,t,n){let r=`${e}|${n}`,i;this.trackerByCommand.has(r)?i=this.trackerByCommand.get(r):(i=new Xo,this.trackerByCommand.set(r,i)),i.add(t)}logMetrics(){for(let[e,t]of this.trackerByCommand.entries()){if(!t.hasData)continue;let[n,r]=e.split(`|`),i=t.snapshot();this._logger.logClientStats({name:U.SIGNALING_COMMAND_SUMMARY,api_method:n,min_value:i.min,max_value:i.max,avg_value:i.avg,median_value:i.median,p95_value:i.p95,values_count:i.count,signaling_transport:r})}}destroy(){this.trackerByCommand.clear()}},$o=class{constructor(e,t,n,r){h(this,`logger`,void 0),h(this,`lifecycle`,void 0),h(this,`statAggregator`,void 0),h(this,`codecStatsAggregator`,void 0),h(this,`pings`,void 0),h(this,`signalingCommands`,void 0),this.logger=new Ao(e,t,n,r),this.lifecycle=new Go(this.logger),this.statAggregator=new qo(this.logger),this.codecStatsAggregator=new Ko(this.logger,r),this.pings=new Zo(this.logger),this.signalingCommands=new Qo(this.logger)}logHangup(e){this.lifecycle.markFinished(e)}flushCallMetrics(){this.codecStatsAggregator.destroy(),this.pings.logMetrics(),this.pings.destroy(),this.signalingCommands.logMetrics(),this.signalingCommands.destroy()}destroy(){this.lifecycle.markTerminated(),this.lifecycle.destroy(),this.statAggregator.destroy(),this.codecStatsAggregator.destroy(),this.pings.destroy(),this.signalingCommands.destroy(),this.logger.destroy()}},es=class{constructor(e){h(this,`_statAggregator`,void 0),h(this,`_isCallMarked`,!1),h(this,`_isFinished`,!1),h(this,`_callType`,null),this._statAggregator=e}markAcceptCall(e){this.mark(e===Y.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===Y.DIRECT&&this.mark(`direct_outgoing`)}markOnJoin(e){this.mark(e===Y.DIRECT?`direct_join`:`server_join_server`,e===Y.DIRECT)}markTopologyChanged(e){this._isFinished||e!==Y.SERVER||(this._callType=`server_change_topology`)}mark(e,t=!1){(!this._isCallMarked||t)&&(this._isCallMarked=!0,this._callType=e,G.setMark(U.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&this._statAggregator.logEventualStat({name:U.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},ts=1e3,ns=1e4;function rs(e,t,n,r){return new k(e,{callError:{scope:`external`,source:`api`,code:t,description:n},message:r})}var is=15,$=class e extends x{constructor(e,t){super(),h(this,`_api`,void 0),h(this,`_signaling`,void 0),h(this,`_signalingActor`,void 0),h(this,`_displayLayoutRequester`,void 0),h(this,`_mediaSource`,null),h(this,`_conversation`,null),h(this,`_myLastRequestedLayouts`,{}),h(this,`_state`,`IDLE`),h(this,`_previousState`,null),h(this,`_waitingHallHoldPending`,!1),h(this,`_participantState`,Z.CALLED),h(this,`_participants`,{}),h(this,`_directTransportIsMaster`,void 0),h(this,`_transport`,null),h(this,`_debugInfo`,null),h(this,`_debug`,z.createSessionLogger()),h(this,`_volumesDetector`,null),h(this,`_speakerDetector`,null),h(this,`_localVolumeDetector`,null),h(this,`_specListener`,null),h(this,`_activeSpeakerId`,null),h(this,`_lastSignalledActiveSpeakerId`,null),h(this,`_isRealTimeAsrRequested`,!1),h(this,`_serverSettings`,Tr()),h(this,`_serverTimeOffset`,0),h(this,`_delayedHangup`,!1),h(this,`_hangupEmitted`,!1),h(this,`_hangupPromise`,null),h(this,`_abortController`,null),h(this,`_registeredPeerReceived`,!1),h(this,`_calleeUnavailableTimer`,null),h(this,`_reservedId`,null),h(this,`_onUnload`,void 0),h(this,`_audioOutput`,void 0),h(this,`_stats`,void 0),h(this,`_lastStalled`,{}),h(this,`_audioMixStalled`,!1),h(this,`_audioFix`,null),h(this,`_streamByStreamId`,new Map),h(this,`_streamIdByStreamDescription`,new Map),h(this,`_streamWaitTimerByStreamDescription`,new Map),h(this,`_sequenceNumberByStreamDescription`,new Map),h(this,`_cooldownTimestampByStreamDescription`,new Map),h(this,`_cooldownQueueCleanupTimer`,null),h(this,`_statFirstMediaReceived`,void 0),h(this,`_changeMediaSettings`,M.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(e){if(this._debug.warn(`changeMediaSettings failed with error`,e),e.message===`chatRoom.maxShareCountExceeded`)return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100)),this._stats=new $o(e,t,()=>this._conversation?.id||null,()=>this._transport?.getTopology()??this._conversation?.topology),this._api=e,this._signaling=new Fa(this._debug,this._stats.logger,this._stats.statAggregator,this._stats.pings,this._stats.signalingCommands),this._signalingActor=new So(this._onSignalingNotification.bind(this),this._debug),this._displayLayoutRequester=new vo({api:this._api,debug:this._debug,getParticipants:()=>this._participants,isMe:e=>this._isMe(e),updateDisplayLayout:e=>this.updateDisplayLayout(e)}),this._onUnload=()=>{this._stopFirstMediaSentProbe(),this._conversation&&this._api&&this._api.hangupConversation(this._conversation.id,this._state===`IDLE`?O.CANCELED:O.HUNGUP),this._stats.destroy()},window.addEventListener(`pagehide`,this._onUnload),this._statFirstMediaReceived=new es(this._stats.statAggregator),this._audioOutput=new uo(this._statFirstMediaReceived,N.transparentAudio,this._debug,this._stats.logger),N.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),ts))}static current(){return B.getActive()??(N.hold?null:B.getFirst())}static hangupAfterInit(){let e=as;e&&e._delayedHangup===!1&&!e._conversation&&(e._delayedHangup=!0,e._abortController?.abort(new k(O.CANCELED)))}static id(){return B.getActiveId()}get id(){return this._conversation?.id??``}get externalId(){return this._conversation?.externalId}get mediaSettings(){return this._mediaSource?.mediaSettings}get isCallHeld(){return this._state===`HELD`}static debugSessionId(){return e.current()?.debugSessionId??null}static debugMessage(t,...n){let r=e.current();return r?(r._debug.send(t,...n),!0):!1}static debugMessageWithContext(e,t,...n){let r=B.get(t);return r?(r._debug.send(e,...n),!0):!1}static getSyncedTime(){return Date.now()+(e.current()?._serverTimeOffset??0)}get debugSessionId(){return this._debug.sessionId}getCachedRawOkIdByExternalId(e){return this._api.getCachedRawOkIdByExternalId(e)}async onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r=``,joiningAllowed:i=!1,requireAuthToJoin:a=!1,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l}){let u=l??M.uuid(),d=(e?.length??0)+(s?.length??0),f=t===La.USER&&d===1?N.calleeUnavailableWaitingTime:void 0;this._stats.lifecycle.markInitializationStarted({source:`outgoing`,conversationId:u}),this._debug.setConversationId(u),as=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(n);let l=this._mediaSource.mediaSettings;t===La.CHAT||e&&e.length>1?this._logWithMediaSettings(w.OUTGOING_MULTIPARTY_CALL,l):this._logWithMediaSettings(w.OUTGOING_CALL,l);let d=await this._startConversation({opponentIds:e,opponentType:t,direction:Ia.OUTGOING,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:u});if(!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`not-initialized-after-start`}});if(this._participantState=Z.ACCEPTED,this._changeMediaSettings(l),await this._processConnection(d),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._signaling.readyToSend(),this._delayedHangup)throw new k(O.CANCELED);return this._debug.debug(`Outgoing call`,{opponentIds:e,opponentType:t,mediaOptions:n}),this._processConnectionSharedMovieInfo(d),this._processConversationUrlSharingInfo(d),R.onLocalStream(this._mediaSource.getStream(),this._mediaSource.mediaSettings,this.id),R.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),void 0,this.id),this._onConversationParticipantListChunk(d),this._processPinnedParticipants(d),R.onLocalStatus(P.WAITING,this.id),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),B.add(this),await B.setActive(this.id),as=null,this._conversation.concurrent&&await this._acceptConcurrent(),f&&!this._registeredPeerReceived&&this._state!==`CLOSE`&&(this._calleeUnavailableTimer=window.setTimeout(()=>{this._calleeUnavailableTimer=null,this._close(new k(O.CALLEE_UNAVAILABLE),{signalingReason:O.CANCELED})},f)),this._conversation}catch(e){throw as=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to start conversation`}),e}}async onJoin(e){this._stats.lifecycle.markInitializationStarted({source:e.anonymous?`anonym_join`:`join`,conversationId:e.conversationId}),as=this,this._state=`PROCESSING`,this._debug.setConversationId(e.conversationId??null),this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let t=!!e.observedIds?.length;if(t&&N.videoTracksCount>0)throw this._debug.error(`Observer mode: please set videoTracksCount=0`),new k(O.UNSUPPORTED,{callError:{scope:`internal`,code:`observer-mode`,description:`video-tracks-count-must-be-zero`}});this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!t);let n=this._mediaSource.mediaSettings;this._logWithMediaSettings(w.JOIN_CONVERSATION,n);let r=await this._joinConversation(e);if(!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`not-initialized-after-join`}});return this._conversation.observer=t,R.onLocalStream(this._mediaSource.getStream(),n,this.id),this._conversation.waitForAdmin||this._conversation.waitingHall?(this._debug.log(this._conversation.waitForAdmin?`Wait for admin`:`In waiting hall`),B.add(this),as=null,this._signaling.readyToSend(),R.onLocalStatus(this._conversation.waitForAdmin?P.WAIT_FOR_ADMIN:P.WAITING_HALL,this.id),this._conversation):this._onJoinPart2(r)}catch(e){throw as=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to join conversation`}),e}}async _onJoinPart2(e,t=!0,n=!1){this._debug.debug(`Join conversation part 2`);try{if(this._participantState=Z.ACCEPTED,!this._conversation||!this._mediaSource)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`join`,description:`runtime-not-initialized`}});if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!n&&!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.mediaSettings),await this._processConnection(e),t&&(this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener()),this._signaling.readyToSend(),this._state===`CLOSE`)return this._conversation;if(this._delayedHangup)throw new k(O.CANCELED);this._processConnectionSharedMovieInfo(e),this._processConversationUrlSharingInfo(e),this._processConnectionAsrInfo(e);let r=this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);R.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),r,this.id),this._onConversationParticipantListChunk(e),this._processPinnedParticipants(e),R.onLocalStatus(P.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),t&&(this._state=`ACTIVE`),this._changeFeatureSet(),t&&(B.add(this),n?await this._holdLocally():await B.setActive(this.id),as=null);let i=this._extractLocalParticipantFromConnection(e);if(i){let e=M.mapParticipantState(i);Object.keys(e).length>0&&R.onLocalParticipantState(e,!1,this.id)}return t&&this._openTransport(Object.values(this._participants),!1),this._conversation}catch(e){throw as=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to join conversation`}),e}}_extractExternalRooms(e){return e.map(this._convertRoomToExternal.bind(this)).filter(e=>!!e)}_extractExternalRoomsData(e,t){if(!e||!e.length)return;let n={rooms:this._extractExternalRooms(e)};return t&&(n.roomId=t),n}async onPush(e,t=j.USER,n,r,i,a){if(B.has(e))throw new k(O.HAS_ACTIVE_CALL);B.reserve(e),this._reservedId=e,this._stats.lifecycle.markInitializationStarted({source:`incoming`,conversationId:e}),this._debug.setConversationId(e),as=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal),a&&this._api.setUserId(a);try{let a=await this._prepareConversation(e,t,n,r,i);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`incoming-not-initialized`}});if(!a.conversation.participants.find(e=>e.state===Z.CALLED&&e.id===this._conversation?.userId))throw this._debug.log(`Push rejected (there is an active call)`),this._stats.logger.log(w.PUSH,`rejected`),new k(O.REJECTED);if(await this._processConnection(a),this._extractConnectionUrlSharingInfo(a),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._processPinnedParticipants(a),this._signaling.readyToSend(),this._stats.lifecycle.markCallStarted(),this._stats.logger.log(w.PUSH,`accepted`),B.add(this),as=null,this._delayedHangup)throw new k(O.CANCELED)}catch(e){throw as=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to handle inbound call push`,signalingReason:e instanceof k&&e.hangup===O.BUSY?O.BUSY:void 0}),e}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(Ba.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(Ba.WAIT_FOR_ADMIN),n=e.conversation.options.includes(Ba.ADMIN_IS_HERE);return!t||t&&n?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(t=>M.comparePeerId(t.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(Ba.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`accept`,description:`runtime-not-initialized`}});this._state=`PROCESSING`;let e=this._mediaSource.mediaSettings;this._logWithMediaSettings(w.ACCEPT_CONCURRENT,e),this._debug.debug(`Concurrent call`,{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.mediaSettings),this._stats.lifecycle.markIncomingAccepted(!0),R.onCallAccepted(this.id),this._state=`ACTIVE`,this._participantState=Z.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0)}catch(e){this._close(e,{errorText:`Unable to accept concurrent call`})}}_getMainRoomParticipants(){let e=this._participants;return M.mapSharedParticipants(Object.values(e).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,n]=e.split(`:`),r=parseInt(t,10);if(isNaN(r))throw Error(`Invalid original length in prefix`);let i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);try{let e=co(a,r).reduce((e,t)=>(e+=String.fromCharCode(t),e),``),{srcp:t,stne:n,tkn:i,trne:o,trnp:s,trnu:c,wse:l,wte:u}=JSON.parse(e);return{token:i,endpoint:l,wt_endpoint:u,turn_server:{urls:o.split(`,`),username:c,credential:s},stun_server:{urls:n.split(`,`)},client_type:t}}catch(e){throw this._close(e,{errorText:`Can't decompress conversation params`}),e}}async accept(e){if(this._state!==`IDLE`)throw this._stats.logger.log(w.ERROR,`acceptIncoming`),this._debug.error(`Unable to accept a call - invalid state`),Error(`Unable to accept a call - invalid state`);if(!this._mediaSource||!this._conversation||!this._transport)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`accept`,description:`runtime-not-initialized`}});this._state=`PROCESSING`,this._debug.setConversationId(this._conversation.id),this._debug.debug(`Accept incoming call`,e);try{await this._mediaSource.request(e);let t=this._mediaSource.mediaSettings;this._logWithMediaSettings(w.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._stats.lifecycle.markIncomingAccepted(!1),this._participantState=Z.ACCEPTED;let n=this._getMuteStatesForCurrentRoom(),r=Object.keys(n);r.length&&this._onMuteParticipant({muteStates:n,mediaOptions:r,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let i=await this._signaling.getRooms(this._isCallAdmin());if(i.rooms?.rooms?.length){let e=this._participants;i.rooms.rooms.forEach(t=>{t.participantIds?.forEach(t=>{e[t]&&(e[t].isInRoom=!0)})})}this._conversation.roomId=i.rooms?.roomId||null;let a=this._extractExternalRoomsData(i.rooms?.rooms,i.rooms?.roomId);if(R.onCallAccepted(this.id),R.onLocalStream(this._mediaSource.getStream(),t,this.id),R.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),a,this.id),await this._emitHeldParticipantsStatus(),N.useParticipantListChunk){let e=await this._getInitialParticiapntListChunk(),t=this._participants;e?.participants?.forEach(e=>{let n=t[M.composeId(e)];n&&(n.movieShareInfos=e.movieShareInfos)}),this._onConversationParticipantListChunk({participants:e})}return R.onLocalStatus(P.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0),this._processConversationUrlSharingInfo(),this._processConnectionAsrInfo(),B.setActive(this.id).catch(e=>{this._debug.error(e),this._close(e,{errorText:`Unable to activated accepted call`})}),this._conversation}catch(e){throw this._close(e,{errorText:`Unable to accept call`}),e}}async decline(e){if(this._state!==`IDLE`)throw this._stats.logger.log(w.ERROR,`declineIncoming`),this._debug.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);this._state=`PROCESSING`,this._debug.debug(`Decline incoming call`),this._logWithMediaSettings(w.DECLINE_INCOMING,this.mediaSettings),this._participantState=Z.HUNGUP;let t=e??O.REJECTED,n=new k(t);this._finishLifecycle(n),this._close(n,{signalingReason:t})}hangup(e){if(this._hangupPromise)return this._hangupPromise;this._clearCalleeUnavailableWatchdog(),this._debug.debug(`Hangup`);let t=e??(this._state===`ACTIVE`||this._state===`HELD`?O.HUNGUP:O.CANCELED),n=new k(t),r=this._conversation?.id??null;return this._stats.logger.log(w.HANGUP,t),this._finishLifecycle(n),this._hangupPromise=this._signaling.hangup(t).then(()=>void 0).catch(e=>{if(!(e instanceof xn))throw e}).finally(()=>this._close(n)),this._emitHangupOnce(n,r),this._cleanupTransport(),this._cleanupMediaSource(),this._hangupPromise}async addParticipant(e,t){if(!this._signaling.ready){this._close(new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`add-participant`,description:`signaling-not-ready`}}),{errorText:`Unable to add participant`});return}let n=await this._signaling.addParticipant(e.map(Q.toSignaling),t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:O.UNKNOWN_ERROR);let i=n.participants;if(!i&&n.rejectedParticipants?.length)throw Error(n.rejectedParticipants[0].reason);for(let e of i)await this._onAddParticipant(M.composeId(e),e,r)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`add-participant`,description:`signaling-not-ready`}}),{errorText:`Unable to add participant`});return}let n=await this._signaling.addParticipantLegacy(e,t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:O.UNKNOWN_ERROR);let i=n.participants;for(let e of i)await this._onAddParticipant(M.composeId(e),e,r)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let n=new Set(this._transport.opened()),r=[];for(let i of e)(i.state===Z.CALLED||i.state===Z.ACCEPTED)&&(this._transport.isAllocated(i.id)||this._allocateParticipantTransport(i.id,t)),i.state===Z.ACCEPTED&&!n.has(i.id)&&r.push(i.id);r.length?this._transport.open(r,null,!!this._conversation?.observer):this._transport.getTopology()===Y.SERVER&&this._forceOpenTransportForAloneInCall()}_allocateParticipantTransport(e,t){this._transport&&(this._transport.getTopology()===Y.DIRECT&&(t=this._directTransportIsMaster??(this._directTransportIsMaster=t)),this._transport.allocate(e,t))}_cleanupRegistry(){B.remove(this._reservedId),B.remove(this.id),this._reservedId=null}_emitHangupOnce(e,t){this._hangupEmitted||(this._hangupEmitted=!0,R.onHangup(e,t))}_close(e,t={}){this._clearCalleeUnavailableWatchdog(),t.errorText&&this._debug.error(t.errorText,e),this._debug.debug(`Close conversation`,e),this._finishLifecycle(e),this._stats.flushCallMetrics();let n=t.signalingReason??(e.error?O.FAILED:void 0),r=n&&this._signaling.ready?this._signaling.hangup(n):void 0;this._signaling.readyToSend(!1),e.error||this._stats.logger.log(w.ERROR,e.hangup);let i=this._conversation&&this._conversation.id;if([O.CANCELED,O.NOT_FRIENDS,O.CALLEE_IS_OFFLINE,O.CALLEE_UNAVAILABLE,O.CALLER_IS_BLOCKED,O.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===O.REJECTED&&!e.remote){this._emitHangupOnce(e,i),this._destroy(r);return}if(e.hangup===O.HUNGUP&&(!e.remote||this._isCalledState())){this._emitHangupOnce(e,i),this._destroy(r);return}if(e.hangup===O.MISSED&&!e.remote){this._emitHangupOnce(e,i),this._destroy(r);return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===O.SOCKET_CLOSED||e.hangup===O.NOT_FOUND)&&B.getActive()&&!this._conversation){this._disposeSignaling(r),this._cleanupMediaSource();return}if(e.hangup===O.BUSY&&!e.remote){this._disposeSignaling(r),this._cleanupMediaSource();return}this._state=`CLOSE`,this._participantState=Z.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._disposeSignaling(r),this._api.cleanup(),this._api.setAbortSignal(void 0),this._stats.destroy(),this._cleanupRegistry(),this._conversation=null,this._myLastRequestedLayouts={},this._displayLayoutRequester.clear(),this._delayedHangup=!1,this._abortController=null,this._emitHangupOnce(e||new k(O.UNKNOWN_ERROR),i)}destroy(){this._destroy()}_destroy(e){this._clearCalleeUnavailableWatchdog();let t=this._conversation&&this._conversation.id;if(this._debug.debug(`Destroy conversation`,{conversationId:t}),this._stopFirstMediaSentProbe(),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state=`CLOSE`,this._participantState=Z.HUNGUP,this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._disposeSignaling(e),this._api.cleanup(),this._api.setAbortSignal(void 0),this._delayedHangup&&t)try{this._api.hangupConversation(t,O.CANCELED)}catch{}this._cleanupListeners(),this._stats.destroy(),this._cleanupRegistry(),this._conversation=null,this._myLastRequestedLayouts={},this._displayLayoutRequester.clear(),this._delayedHangup=!1,this._abortController=null}async _getConversationParams(e){let t=await this._api.getConversationParams(e);this._debug.debug(`Api.getConversationParams`,t);let{turn_server:n,stun_server:r}=t;return N.iceServers=so(r,n),N.wssBase=t.endpoint,t.wt_endpoint&&(N.wtsBase=t.wt_endpoint),N.wssToken=t.token,t.client_type&&(N.clientType=t.client_type),t.external_user_type&&(N.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:n,wt_endpoint:r,token:i,client_type:a}){N.iceServers=so(t,e),N.wssBase=n,N.wssToken=i,r&&(N.wtsBase=r),a&&(N.clientType=a)}_buildSignalingEndpoint({baseEndpoint:e,userId:t,type:n,deviceIdx:r,conversationId:i,token:a,conversationParams:o}){let s=new URL(e),c=s.searchParams;return c.set(`userId`,String(t)),c.set(`entityType`,n),c.set(`deviceIdx`,String(r)),c.set(`conversationId`,i),c.set(`token`,a),o?.isp_as_no&&c.set(`ispAsNo`,String(o.isp_as_no)),o?.isp_as_org&&c.set(`ispAsOrg`,o.isp_as_org),o?.loc_cc&&c.set(`locCc`,o.loc_cc),o?.loc_reg&&c.set(`locReg`,o.loc_reg),s.toString()}_clearCalleeUnavailableWatchdog(){this._calleeUnavailableTimer!==null&&(window.clearTimeout(this._calleeUnavailableTimer),this._calleeUnavailableTimer=null)}async _startConversation({opponentIds:e,opponentType:t,direction:n,mediaOptions:r,payload:i=``,joiningAllowed:a=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:l,conversationId:u}){let d=u??M.uuid();if(B.has(d))throw new k(O.HAS_ACTIVE_CALL);B.reserve(d),this._reservedId=d,this._debug.debug(`Conversation: start`,{conversationId:d,opponentIds:e,opponentType:t,direction:n});let f=r.includes(C.VIDEO),p,m;if(l){let e={deviceId:this._api.deviceId(),sdkVersion:N.sdkVersion,clientAppKey:N.apiKey,platform:N.platform,protocolVersion:N.protocolVersion,domainId:N.domain,capabilities:_a.getFlags()},n=JSON.stringify(e),s;try{if(s=await l({internalParams:n,conversationId:d,externalIds:c,payload:i,opponentType:t,mediaOptions:r,isVideo:f,joiningAllowed:a,requireAuthToJoin:o},this._abortController?.signal),!s)throw rs(O.FAST_START_ERROR,`invalid-response`,`fast-start-response-empty`);if(!s.internalCallerParams){let e=s.rejectedParticipants[0]?.status;throw rs(O.FAST_START_ERROR,e?`fast-start`:`invalid-response`,e??`fast-start-internal-caller-params-empty`,JSON.stringify(s))}}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new k(O.CANCELED):e instanceof k?e:e instanceof Error?new k(O.FAST_START_ERROR,{message:e.message}):new k(O.FAST_START_ERROR,{message:String(e)})}try{let e=JSON.parse(s.internalCallerParams);p={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:d,is_concurrent:e.isConcurrent,client_type:e.clientType,rejected_participants:s.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastStart`,p),m=`fastStart`}catch{throw rs(O.FAST_START_ERROR,`invalid-response`,`fast-start-internal-caller-params-invalid`)}}else p=await this._api.startConversation(d,e,t,f,i,a,o,{onlyAdminCanShareMovie:s},c),this._debug.debug(`Api.startConversation`,p),m=`startConversation`;fo(p,m),this._setConversationParams(p),this._stats.lifecycle.bindConversationId(p.id);let ee=await this._connectSignaling(mr.START,p);return this._setConversation(p,ee,n),this._stats.lifecycle.markCallStarted(),ee}async _joinConversation(e){G.setMark(U.SIGNALING_CONNECTED);let{conversationId:t,mediaOptions:n,chatId:r,joinLink:i,observedIds:a,payload:o,onFastJoin:s}=e;if(this._debug.debug(`Conversation: join`,{conversationId:t,joinLink:i,observedIds:a}),t&&B.has(t))throw new k(O.HAS_ACTIVE_CALL);let c=n.includes(C.VIDEO),l,u;if(s){if(!i)throw new k(O.FAST_JOIN_ERROR,{callError:{scope:`internal`,code:`fast-join`,description:`join-link-required`}});let e={deviceId:this._api.deviceId(),sdkVersion:N.sdkVersion,clientAppKey:N.apiKey,platform:N.platform,protocolVersion:N.protocolVersion,domainId:N.domain,capabilities:_a.getFlags()},t=JSON.stringify(e),n;try{if(n=await s({joinLink:i,isVideo:c,internalParams:t},this._abortController?.signal),!n)throw rs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-response-empty`);if(!n.internalCallerParams)throw rs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-internal-caller-params-empty`,JSON.stringify(n));if(!n.conversationId)throw rs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-conversation-id-empty`,JSON.stringify(n))}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new k(O.CANCELED):e instanceof k?e:e instanceof Error?new k(O.FAST_JOIN_ERROR,{message:e.message}):new k(O.FAST_JOIN_ERROR,{message:String(e)})}try{let e=JSON.parse(n.internalCallerParams);if(B.has(n.conversationId))throw new k(O.HAS_ACTIVE_CALL);l={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:n.conversationId,is_concurrent:e.isConcurrent,client_type:e.clientType,stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastJoin`,l),u=`fastJoin`}catch(e){throw e instanceof k?e:rs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-internal-caller-params-invalid`)}}else if(t)l=await this._api.joinConversation(t,c,r),u=`joinConversation`;else if(i)l=await this._api.joinConversationByLink(i,c,a,o),u=`joinConversationByLink`;else throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`join`,description:`target-missing`}});if(this._debug.debug(`Api.joinConversation`,l),l.id&&this._stats.lifecycle.bindConversationId(l.id),fo(l,u),l.id){if(B.has(l.id))throw new k(O.HAS_ACTIVE_CALL);B.reserve(l.id),this._reservedId=l.id}this._setConversationParams(l);let d=await this._connectSignaling(mr.JOIN,l);return this._setConversation(l,d,Ia.JOINING),this._stats.lifecycle.markCallStarted(),d}async _prepareConversation(e,t=j.USER,n,r,i){G.setMark(U.SIGNALING_CONNECTED),this._debug.debug(`Conversation: push`,{conversationId:e,type:t,peerId:n});let a=this._api.getUserId();if(!a)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`incoming`,description:`user-id-missing`}});let o=0,s=``,c=``,l={id:e,peerId:n,endpoint:s,wt_endpoint:c,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:``};if(r){let n=this._decodeExternalConversationParams(r);this._setConversationParams(n),s=i??this._buildSignalingEndpoint({baseEndpoint:N.wssBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken}),l.token=n.token,l.endpoint=s,N.wtsBase&&(c=this._buildSignalingEndpoint({baseEndpoint:N.wtsBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken}),l.wt_endpoint=c)}else{let n=await this._getConversationParams(e);o=n.device_idx||0,s=i??this._buildSignalingEndpoint({baseEndpoint:N.wssBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken,conversationParams:n}),l.token=n.token,l.endpoint=s,l.device_idx=o,N.wtsBase&&(c=this._buildSignalingEndpoint({baseEndpoint:N.wtsBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken,conversationParams:n}),l.wt_endpoint=c)}let u=await this._connectSignaling(mr.ACCEPT,l);return B.callsLength>=N.maxParallelCalls||!N.hold&&B.callsLength>0?(this._debug.log(`Push rejected (busy)`),this._stats.logger.log(w.PUSH,`busy`),Promise.reject(new k(O.BUSY))):(this._setConversation(l,u,Ia.INCOMING,t),u)}_createParticipant(e,t,n=!0){let r=Object.assign({id:null,externalId:null,mediaSettings:D(),participantState:{},state:Z.CALLED,connectionStatus:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e),i=!!r.externalId;return i||(r.externalId=this._getParticipantId(t??r.id)),n&&i&&this._api.cacheExternalId(t??r.id,r.externalId),t&&this._api.mapDecorativeId(t,r.id),r.observedIds?.length&&(r.externalId.observer=!0),e.markers&&(r.markers=this._denormalizeMarkers(r.id,e.markers)),r.connectionStatus=Xa.create(r.connectionStatus),r}_getParticipantId(e){try{return this._api.userId(e)}catch(e){throw this._close(e instanceof k?e:new k(O.NETWORK_ERROR,{callError:{scope:`network`,source:`api`,code:`fetch-failed`,description:`request-failed`}}),{errorText:e}),e}}_cacheParticipantExternalIds(e){e.forEach(e=>{let t=M.composeId(e),n=Q.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=M.composeDecorativeId(e),i=Q.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(e.decorativeUserId,e.id))}})}_setConversation(e,t,n,r=j.USER){let{participants:i}=t.conversation;t.conversationParams?.serverTime&&(this._serverTimeOffset=t.conversationParams.serverTime-Date.now()),this._cacheParticipantExternalIds(i);let a=this._api.getUserId(),o=this._extractLocalParticipantFromConnection(t),s=e.device_idx||0;if(!a){if(!o)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`anonymous-local-participant-missing`}});a=Number(o.id),o.idType&&(r=o.idType),o.deviceIdx&&(s=o.deviceIdx),this._api.setUserId(a)}let c=M.composeParticipantId(a,r,s);this._conversation={userId:a,compositeUserId:c,externalId:this._getExternalIdByParticipantId(c),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||Y.DIRECT,direction:n,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:o?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},this._debug.setConversationId(t.conversation.id||e.id),e.p2p_forbidden&&(N.forceRelayPolicy=e.p2p_forbidden),this._stats.logger.log(w.RELAY_POLICY,N.forceRelayPolicy?`1`:`0`),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`update-without-conversation`}});this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||Y.DIRECT,this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1,this._cacheParticipantExternalIds(e.conversation.participants??[])}_createMediaSource(){let e=new Xt(this._debug,this._stats.logger);return this.subscribe(e,Jt.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new lo(e,this._debug,this._stats.logger),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,K.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,K.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,K.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return this._stats.statAggregator.logEventualStat({name:U.SIGNALING_CONNECTED}),n}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(Ra.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}_onConversationParticipantListChunk(e){let t=e.participants;t&&R.onConversationParticipantListChunk(this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)),this.id)}_createParticipantListChunk(e){return{participants:[],countBefore:0,countAfter:0,markerFound:!1,...e}}_participantListChunkToExternalChunk(e){let t=this._participants,n=M.mapSharedParticipants(e.participants.reduce((e,n)=>{let r=M.composeId(n);return t[r]&&e.push(t[r]),e},[]));return{...e,participants:n}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let e of t)await this._registerParticipants(e?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let n=e[0]?.externalId?.type;n&&(N.externalUserType=n);let r=this._participants;for(let n of e){let e=M.composeId(n);if(z.test(`Conversation:RegisterParticipant`,e),this._isMe(e)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(this._debug.debug(`Local roles changed: ${n.roles}`),R.onLocalRolesChanged(this._conversation.roles,!0,this.id)),this._registerParticipantLocalMuteState(n);continue}if(n.state===Z.HUNGUP||n.state===Z.REJECTED){r[n.id]&&await this._removeParticipant(r[n.id],O.HUNGUP);continue}let i=M.composeDecorativeId(n);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(n,!0,!0),mediaSettings:D(n.mediaSettings),participantState:M.mapParticipantState(n),state:n.state,roles:n.roles||[],connectionStatus:this._buildConnectionStatus(e,n.sessionState,void 0,n.onHold),isOnHold:!!n.onHold,muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(e,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},i);let a=this._getParticipant(e);a&&n.roles&&n.roles.length&&(this._debug.debug(`Roles for participant [${e}] changed: ${n.roles}`),R.onRolesChanged(a.externalId,n.roles,!0,this.id)),a&&a.isOnHold&&R.onRemoteStatus([a.externalId],P.ONHOLD,null,this.id)}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let n=async()=>{let n=eo(e,Ua.MUTE),r=eo(e,Ua.MUTE_PERMANENT);for(let i of[n,r])i.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:i,stateUpdated:!0})};M.setImmediate(()=>n().catch(e=>this._debug.error(e)))}_remoteParticipantSessionState(e,t){if(!(!N.enableSessionStateUpdates||this._isMe(e)))return t}_buildConnectionStatus(e,t,n,r=!1){return Xa.create({transport:r?P.ONHOLD:Xa.fromTransportState(n)??P.WAITING,sessionState:this._remoteParticipantSessionState(e,t),sessionStateApplicable:this._isParticipantSessionStateApplicable(e)})}_isParticipantSessionStateApplicable(e){return N.enableSessionStateUpdates&&!this._isMe(e)&&this._conversation?.topology===Y.SERVER}_setTransportStatus(e,t){return Xa.setTransport(e.connectionStatus,t)}_setSessionState(e,t){let n=Xa.setSessionStateApplicable(e.connectionStatus,this._isParticipantSessionStateApplicable(e.id));this._emitParticipantTransition(e,n);let r=e.connectionStatus.sessionStateApplicable&&e.id===this._activeSpeakerId&&e.connectionStatus.transport===P.CONNECTED,i=Xa.setSessionState(e.connectionStatus,t,r);return this._emitParticipantTransition(e,i),i}_emitParticipantTransition(e,t,n=null){t.shouldNotify&&R.onRemoteStatus([e.externalId],t.status,n,this.id)}_registerParticipantInCache(e){return this._participants[e.id]=e,e}_getExistedParticipantByIdOrCreate(e){let t=this._participants[e];if(t)return t;let n=this._api.getDecorativeIdByInitialId(M.decomposeId(e).id),r=n?M.composeUserId(n):void 0,i=this._getParticipantId(e),{deviceIdx:a}=M.decomposeParticipantId(e);return this._createParticipant({id:e,externalId:{...i,deviceIdx:a}},r,!1)}_getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(N.useParticipantListChunk)return this._getExistedParticipantByIdOrCreate(e).externalId;let t=this._participants;if(t[e]?.externalId)return t[e].externalId;{let t=this._getParticipantId(e);return this._api.cacheExternalId(e,t),t}}_getExternalIdsByOkIdsFromCache(e){return e.map(e=>this._api.getCachedExternalIdByOkId(e)??Q.fromId(String(e)))}_getOrCacheExternalIdByCompositeId(e){let t=M.extractOkId(e),n=this._api.getCachedExternalIdByOkId(t);if(n)return n;let r=Q.fromId(String(t));return this._api.cacheExternalId(e,r),r}_registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(N.useParticipantListChunk){let n=this._registerParticipantInCache(this._getExistedParticipantByIdOrCreate(e));return n.markers=this._denormalizeMarkers(n.id,t),n}return this._participants[e]}_warnParticipantNotInConversation(e){this._debug.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let n=Object.values(t).find(e=>`ts`in e&&`rank`in e);return Object.entries(t).reduce((t,[r,i])=>(t[r]={...n,...i,id:e},t),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let n=to(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=ao(e,r));let i=Object.keys(r),a=this._conversation?.roomId;i.length&&this._onMuteParticipant({muteStates:r,mediaOptions:i,muteAll:!0,stateUpdated:!0,roomId:a},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}_processPinnedParticipants(e){e.conversation.pinnedParticipantId?this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}_allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new aa(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._stats.logger,this._stats.statAggregator,this._stats.codecStatsAggregator,this._getFirstMediaSentCallback()),this._debugInfo=new _o(this._debug),this.subscribe(this._transport,X.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,X.LOCAL_STATE_CHANGED,this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,X.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,X.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,X.AUDIO_MIX_STALL,this._onAudioMixStall.bind(this)),this.subscribe(this._transport,X.REMOTE_DATA_STATS,this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,X.SIGNALLED_STALLED_PARTICIPANTS,this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,X.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this)),this.subscribe(this._transport,X.NETWORK_STATUS,this._onNetworkStatus.bind(this)),this.subscribe(this._transport,X.REMOTE_STREAM_SECOND,this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,X.PEER_CONNECTION_CLOSED,this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,X.ASR_TRANSCRIPTION,this._onAsrTranscription.bind(this)),this.subscribe(this._transport,X.ANIMOJI_STREAM,this._onAnimojiStream.bind(this)),this.subscribe(this._transport,X.ANIMOJI_ERROR,this._onAnimojiError.bind(this));let e=this._conversation.direction===Ia.OUTGOING&&!this._conversation.concurrent,t=this._participants;for(let n of Object.values(t))(n.state===Z.ACCEPTED||n.state===Z.CALLED)&&this._allocateParticipantTransport(n.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new wo(this._transport),this.subscribe(this._volumesDetector,Co.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new Eo(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,To.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new xo(this._mediaSource))}_createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new ko(this._transport,this._volumesDetector,this._participants,this._debug,this._stats.logger))}_logDevices(){let e=E.getCameras().length,t=E.getMicrophones().length;this._debug.debug(`Cameras: `+e+(E.hasCameraPermission()?`✔`:`✖`)+`, Microphones: `+t+(E.hasMicrophonePermission()?`✔`:`✖`)),this._stats.logger.log(w.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){this._stats.logger.log(e,[t?.isAudioEnabled&&`audio`,t?.isVideoEnabled&&`video`].filter(Boolean).join(`_`))}async _removeParticipant(e,t){if(e.state===Z.CALLED||e.state===Z.ACCEPTED||this._state===`CLOSE`)return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let n=this._participants;if(n[e.id]){t===O.HUNGUP?this._setParticipantsStatus([e],P.HANGUP):this._setParticipantsStatus([e],P.ERROR,t),e.mediaSource?.disconnect(),this._displayLayoutRequester.cleanupParticipant(e.id),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[t,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(t),this._sequenceNumberByStreamDescription.delete(t),this._cooldownTimestampByStreamDescription.delete(t),this._streamWaitTimerByStreamDescription.has(t)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(t)),this._streamWaitTimerByStreamDescription.delete(t)),this._sendUpdateDisplayLayout({[t]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete n[e.id],R.onRemoteRemoved(e.externalId,e.markers,this.id)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener(`pagehide`,this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}_cleanupParticipants(){Object.values(this._participants).forEach(e=>{e.remoteStream?.getTracks().forEach(e=>e.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(e=>e.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){this._debug.debug(`cleaning up participant-agnostic streams`),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(e=>{e.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_finishLifecycle(e){this._stopFirstMediaSentProbe(),this._stats.logHangup(e)}_getFirstMediaSentCallback(){let{lifecycle:e}=this._stats;return e.firstMediaSentReported||e.terminated?null:()=>e.markFirstMediaSent()}_stopFirstMediaSentProbe(){this._transport?.stopFirstMediaSentProbe?.()}_cleanupTransportForHold(){this._transport&&(this._transport.holdClose(),this._transport=null),this._debugInfo&&(this._debugInfo=null),this._cleanupSpeakerDetector(),this._cleanupSpecListener()}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_disposeSignaling(e){if(!e){this._signaling.dispose();return}e.catch(e=>{e instanceof xn||this._debug.warn(`[signaling] unable to send hangup`,e)}).finally(()=>this._signaling.dispose())}async _onAddParticipant(e,t,n){this._debug.debug(`Add new participant [${e}]`);let r=this._getParticipant(e);r&&this._updateParticipantExternalId(r,t);let i=!r;if(r&&(r.state===Z.ACCEPTED||r.state===Z.CALLED)){this._debug.warn(`Participant [${r.id}:${r.state}] is already in conversation`);return}if(!r){let n=M.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(t,!0,!0),mediaSettings:D(t.mediaSettings),state:t.state,roles:t.roles||[],connectionStatus:this._buildConnectionStatus(e,t.sessionState,this._transport?.getState(),t.onHold),isOnHold:!!t.onHold,muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},n),r=this._getParticipant(e)}this._setParticipantsStatus([r],P.WAITING),i&&this._emitParticipantEffectiveStatusIfSessionOverridesTransport(r),n?(r.state=Z.HUNGUP,await this._removeParticipant(r,n)):this._transport&&(r.state=Z.CALLED,this._allocateParticipantTransport(r.id,!0),this._stats.logger.log(w.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}_onRemoveParticipant(e){this._debug.debug(`Remove participant [${e}]`);let t=[],n=this._participants;for(let r=0;r<=is;r++){let i=n[M.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let e of t)this._transport.close(e.id);this._stats.logger.log(w.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(S.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(S.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(S.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,n=null){if(!this._transport||!this._conversation)return;let r=!t,i=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let t=n??this._conversation.externalId.id;this._transport.setAnimojiSvg(i,{svg:e,userId:t,isMe:r});return}this._transport.setAnimojiSvg(i,{svg:e,isMe:r})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return this._stats.logger.log(w.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return this._stats.logger.log(w.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},n={};for(let t of e){let e=typeof t.uid==`object`?t.uid:Q.fromId(t.uid),r=Q.toString(e);n[r]=t.priority}let r=this._participants;for(let e of Object.values(r)){let r=Q.toString(e.externalId);Object.hasOwn(n,r)&&(t[e.id]=n[r])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[t,n]of Object.entries(e))if(t.length>5||n.length>5)throw Error(`key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded`);t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async hold(e,t){if(e){if(this._state===`HELD`)return;if(this._isWaitingForPromotion()){this._waitingHallHoldPending=!0,await this._holdLocally();return}await Promise.all([this._holdLocally(),this._signaling.hold(!0)]);return}if(this._isWaitingForPromotion()){this._waitingHallHoldPending=!1,this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),await this._resumeLocalMedia(t,this._getWaitingForPromotionStatus());return}let n=ha.get();await this._signaling.hold(!1,n),this._restoreStateAfterHold();let r=null;if(this._state===`IDLE`&&this._participantState===Z.ACCEPTED&&(r=Object.values(this._participants),r.some(e=>e.state===Z.ACCEPTED)&&(this._state=`ACTIVE`,this._changeFeatureSet())),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),await this._resumeLocalMedia(t,P.WAITING),this._state===`ACTIVE`){let e=this._conversation?.direction===Ia.OUTGOING&&!this._conversation.concurrent;this._openTransport(r??Object.values(this._participants),e)}}async _holdLocally(){this._state!==`HELD`&&(this._previousState=this._state,this._state=`HELD`);let e=this._mediaSource?.stopLocalMedia();this._cleanupTransportForHold(),R.onLocalStatus(P.ONHOLD,this.id),await e}async _resumeLocalMedia(e,t){this._restoreStateAfterHold(),await this._mediaSource?.resumeLocalMedia(e),R.onLocalStatus(t,this.id),this._mediaSource&&R.onLocalStream(this._mediaSource?.getStream()??null,this._mediaSource.mediaSettings,this.id)}_restoreStateAfterHold(){this._state===`HELD`&&(this._state=this._previousState||`ACTIVE`,this._previousState=null)}_isWaitingForPromotion(){return!!this._conversation?.waitingHall||!!this._conversation?.waitForAdmin}_getWaitingForPromotionStatus(){return this._conversation?.waitForAdmin?P.WAIT_FOR_ADMIN:P.WAITING_HALL}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[On(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready)return;this._debug.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},n=[],r=this._participants;for(let i of e){let e=typeof i.uid==`object`?i.uid:Q.fromId(i.uid),a=this._api.getCachedOkIdByExternalId(e);if(!a){let t=Q.toString(e);this._debug.log(`Unknown participant external ID ${t}`);continue}let o=On({participantId:a,mediaType:i.mediaType,streamName:i.streamName}),s=r[a];s?n.push(()=>{s.lastRequestedLayouts[o]=i}):this._isMe(a)&&n.push(()=>{this._myLastRequestedLayouts[o]=i}),Cn(i)?(this._isMe(a)&&n.push(()=>{delete this._myLastRequestedLayouts[o]}),this._streamIdByStreamDescription.has(o)&&!this._cooldownTimestampByStreamDescription.has(o)&&this._cooldownTimestampByStreamDescription.set(o,Date.now())):(this._cooldownTimestampByStreamDescription.delete(o),!this._streamIdByStreamDescription.has(o)&&N.videoTracksCount>0&&this._streamIdByStreamDescription.set(o,null),t[o]=i),i.mediaType===H.SCREEN&&!Cn(i)&&G.setMark(G.getMarkNameScreenshareFirstFrame(a))}let i=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>N.videoTracksCount;){let e=i.next();if(e.done){this._debug.error(`Cannot accommodate all streaming requests: tracks available `+N.videoTracksCount+`; requested streams: `+Array.from(this._streamIdByStreamDescription.keys()));break}this._stopStreaming(e.value),t[e.value]={stopStream:!0}}if(this._transport?.getTopology()!==Y.SERVER){n.forEach(e=>e());return}await this._sendUpdateDisplayLayout(t),n.forEach(e=>e())}async requestDisplayLayout(e){return this._displayLayoutRequester.request(e)}async feedback(e){return this._signaling.feedback(e)}_stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(this._debug.log(`Client asked to stop streaming before stream became available`,e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let t=this._participants,n=kn(e),r=t[n.participantId],i=this._conversation?.externalId,a=this._isMe(n.participantId);if(r||a){switch(n.mediaType){case H.STREAM:case H.MOVIE:if(n.streamName){let e={stream:null,streamName:n.streamName,mediaType:n.mediaType};a?R.onLocalLive(i,e,this.id):R.onRemoteLive(r.externalId,e,this.id)}break;case H.CAMERA:R.onRemoteStream(r.externalId,null,this.id);break;case H.SCREEN:R.onRemoteScreenStream(r.externalId,null,this.id);break}this._stats.logger.log(w.PAT_DEALLOCATED)}else this._debug.log(`Cannot find participant to stop streaming: ${n.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;this._debug.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let n;try{if(n=await this._signaling.updateDisplayLayout(e),!n)return}catch(n){if(this._debug.warn(`Failed to update display layout ${JSON.stringify(e)}. ${n}`),t)throw n;return}let r=[],i=this._participants;for(let[e,t]of Object.entries(n.errorCodeByParticipantId||{})){let n=kn(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=Ka(t):(this._debug.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=Ga.UNKNOWN_ERROR),r.push({externalId:a.externalId,errorReason:e})}}if(r&&r.length&&(this._debug.warn(`Could not allocate one or more participants`,r),t))throw new os(`Could not allocate one or more participants`,r)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let n=t.next();if(n.done)break;let r=n.value;if(r[1]+ns>Date.now())break;let i=r[0];await this._stopStreaming(i),e[i]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;this._debug.log(`Received participant sources update notification`,t);for(let e of t)this._waitForStreamIfNeeded(e)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(this._debug.log(`Promoted in audience mode`,!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.mediaSettings)):(this._debug.log(`Promoted in waiting hall`,!e.demote),e.demote?(this._debug.log(`Kicked from waiting hall`),this._close(new k(O.REMOVED))):(this._updateConversation(e),this._waitingHallHoldPending?(await this._signaling.hold(!0),await this._onJoinPart2(e,!1),this._waitingHallHoldPending=!1):B.getActive()&&N.hold?(await this._signaling.hold(!0),await this._onJoinPart2(e,!0,!0),this._waitingHallHoldPending=!1):await this._onJoinPart2(e))),R.onPromoted(e.demote,this.id)}async _onChatRoomUpdated(e,t=0,n=[],r,i){this._debug.log(`Chat room updated: ${e}`);let a=[];n.length&&n.forEach(e=>{if(e.externalId){let t=Q.fromSignaling(e.externalId);a.push(t),this._api.cacheExternalId(e.id.id,t)}else a.push(this._getOrCacheExternalIdByCompositeId(e.id.id))});let o=r?.map(e=>this._getOrCacheExternalIdByCompositeId(e))??[],s=i?.map(e=>this._getOrCacheExternalIdByCompositeId(e))??[];R.onChatRoomUpdated(e,t,a,o,s,this.id)}_onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let n of e.data)if(this._isMe(n.participantId))R.onLocalLiveUpdate(t,n,this.id);else{let e=this._getExternalIdByParticipantId(n.participantId);e&&R.onRemoteLiveUpdate(e,n,this.id)}}_onSharedMovieInfoStarted(e){this._debug.log(`Shared movie started data received: ${e.notification}`),this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}_processSharedMovieInfos(e,t=null){e&&e.forEach(e=>this._processSharedMovieInfo(e,t))}_processSharedMovieInfo(e,t=null){if(!e)return;let n=this._conversation?.externalId;if(this._isMe(e.initiatorId))R.onLocalSharedMovieInfo(n,e,t,this.id);else{let n=this._getExternalIdByParticipantId(e.initiatorId);n&&R.onRemoteSharedMovieInfo(n,e,t,this.id)}}_processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(e=>this._isMe(M.composeId(e)));this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}_processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let t of e.rooms.rooms)t.asrInfo&&this._conversation?.asrInfoByRoom.set(t.id,t.asrInfo);let n=e?.rooms?.roomId??this._conversation?.roomId??null,r=this._conversation?.asrInfoByRoom.get(n);if(r){let e=this._getExternalIdByParticipantId(r.initiatorId);e&&R.onAsrSet({externalId:e,movieId:r.movieId},n,this.id)}else n&&R.onAsrSet(null,n,this.id)}_processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,n=this._conversation.roomId,r=t.get(n);if(r&&!this._isMe(r.initiatorId)){let e=this._getExternalIdByParticipantId(r.initiatorId);e&&R.onRemoteSharedUrl(e,r.sharedUrl,n,this.id)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let n of e.rooms.rooms)n.urlSharingInfo?t.set(n.id,n.urlSharingInfo):t.delete(n.id)}_onSharedMovieInfoStopped(e){this._debug.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:n,movieId:r,source:i,roomId:a=null}=e,o={initiatorId:n,movieId:r,source:i};if(this._isMe(n))R.onLocalSharedMovieStoppedInfo(t,o,a,this.id);else{let e=this._getExternalIdByParticipantId(n);if(e){let t=this._participants[n];t?.movieShareInfos&&(t.movieShareInfos=t.movieShareInfos.filter(e=>e&&e.movieId!==r)),R.onRemoteSharedMovieStoppedInfo(e,o,a,this.id)}}}_onUrlSharingInfoUpdated(e){if(this._debug.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:n}=this._conversation,{initiatorId:r,sharedUrl:i,roomId:a=null}=e;if(i?t.set(a,{sharedUrl:i,initiatorId:r}):t.delete(a),!(!i&&a!==n&&t.has(n))&&(!i||!this._isMe(r))){let e=this._getExternalIdByParticipantId(r);e&&R.onRemoteSharedUrl(e,i,a,this.id)}}_onFeaturesPerRoleChanged(e){this._debug.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),R.onFeaturesPerRoleChanged(e.featuresPerRole,this.id)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let t=this._getStreamDescriptionById(e.streamId);if(t){let e=kn(t),n=this._getParticipant(e.participantId);R.onRemoteScreenStream(n.externalId,null,this.id);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:n,participantId:r}=t;if(n===H.ANIMOJI)return;let i=this._getParticipant(r);if(n===H.SCREEN&&!e.fastScreenShare){this._debug.log(`skipping participant-sources-update notification since screenshare will be received over datachannel`);return}let a=On(t),o=this._sequenceNumberByStreamDescription.get(a);if(o&&o>e.sequenceNumber){this._debug.warn(`Participant ${r} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${o}`),this._stats.logger.log(w.PAT_OUTDATED_RESPONSE);return}i&&e.suspend!==void 0&&n&&(this._debug.debug(`participant-sources-update: mediaType=${n}, suspend=${e.suspend}`),R.onRemoteStreamSuspended(i.externalId,n,e.suspend,this.id));let s=e.streamId,c=e.rtpTimestamp?this._getWaitingTime(s,e.rtpTimestamp):0;if(c<=0){this._streamWaitTimerByStreamDescription.delete(a);let t=this._conversation?.externalId,n=this._isMe(r);if(!i&&!n){this._stats.logger.log(w.PAT_ERROR,`participantMissing`),this._debug.error(`Could not find participant by ID: ${r}`);return}let o=n?t:i.externalId,c=this._streamByStreamId.get(s);if(!c){this._stats.logger.log(w.PAT_ERROR,`streamNotFound`),this._debug.error(`Could not find stream by ID: ${s}`);return}this._stats.logger.log(w.PAT_ALLOCATED),this._streamIdByStreamDescription.set(a,s);let l=e.participantStreamDescription?.mediaType;if(l===H.STREAM||l===H.MOVIE){if(e.participantStreamDescription?.streamName){let t={streamName:e.participantStreamDescription.streamName,stream:c,mediaType:l};n?R.onLocalLive(o,t,this.id):R.onRemoteLive(o,t,this.id)}}else l===H.SCREEN?R.onRemoteScreenStream(i.externalId,c,this.id):n||R.onRemoteStream(i.externalId,c,this.id)}else{this._debug.debug(`Waiting for ${c} until stream ${s} for ${a} is switched`);let t=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),c);this._streamWaitTimerByStreamDescription.set(a,t)}}_getStreamDescriptionById(e){for(let[t,n]of this._streamIdByStreamDescription.entries())if(n===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(On(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(On(e)))return e}else{let e={participantId:t,mediaType:H.CAMERA};if(this._streamIdByStreamDescription.has(On(e)))return e;let n={participantId:t,mediaType:H.SCREEN};if(this._streamIdByStreamDescription.has(On(n)))return n}return this._debug.error(`Received unrequested allocation`,e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw Error(`transport is not initialized`)}_isCallAdmin(){return this._conversation?M.includesOneOf(this._conversation.roles,[qa.ADMIN,qa.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!M.includesOneOf(this._conversation.roles,[qa.ADMIN,qa.CREATOR]))throw Error(`You don't have the required permission`)}_isCalledState(){return this._participantState===Z.CALLED}async grantRoles(e,t,n){this._checkAdminRole(),await this._signaling.grantRoles(e,t,n)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,n=[],r=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,n,r)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,n=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,n),this._conversation?.pinnedParticipantIdByRoom.set(n,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===Y.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===Y.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Ha(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=$a(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=e?M.composeUserId(e):r.id}let i=await this._signaling.getWaitingHall(r,t,n);if(i.error)return Promise.reject(i.message);let a=i.participants||[],{externalIds:o}=await this._resolveWaitingHallExternalIds(a),s=null;return a.length&&i.hasMore&&(s=Qa(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=[],n=[];return e.length&&e.forEach(e=>{if(e.externalId){let r=Q.fromSignaling(e.externalId);t.push(e.id.addedTs),n.push(r),this._api.cacheExternalId(e.id.id,r)}else n.push(this._getOrCacheExternalIdByCompositeId(e.id.id)),t.push(e.id.addedTs)}),{externalIds:n,timestamps:t}}async getAudienceModeHands(){if(!this._signaling.ready)throw Error(`Signaling is not ready`);let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:n,timestamps:r}=await this._resolveWaitingHallExternalIds(t);return{timestamps:r,participants:n,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!M.includesOneOf(this._conversation.options,[Ba.WAITING_HALL,Ba.AUDIENCE_MODE]))throw Error(`Unable to promote a participant in the conversation with current options`);if(this._checkAdminRole(),!e&&t)throw Error(`participantId is required`);await this._signaling.promoteParticipant(e,t)}catch(t){throw this._debug.warn(`Failed to promote participant ${e}. ${t}`),t}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let e=t.messages.length-1;e>=0;e--){let n=t.messages[e];this._onChatMessage(n)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let e=(await this._api.createJoinLink(this._conversation.id)).join_link;if(e)return this._conversation.joinLink=e,e}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:n,lang:r}){let i={movieId:e,lang:r};(t||t===0)&&(i.gain=t),n&&(i.metadata=n);let a=await this._signaling.addMovie(i);if(a.error)throw Error(a.error);return{movieId:a.movieId,streamType:a.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw Error(t.error)}async removeMovie(e){let t={movieId:e},n=await this._signaling.removeMovie(t);if(n.error)throw Error(n.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw Error(e.error)}async updateRooms(e,t){let n=await this._signaling.updateRooms(e,t);if(n.error)throw Error(n.error)}async activateRooms(e,t){let n=await this._signaling.activateRooms(e,t);if(n.error)throw Error(n.error)}async switchRoom(e,t){let n=await this._signaling.switchRoom(e,t);if(n.error)throw Error(n.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw Error(t.error)}async startStream(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o={movieId:n,name:t,privacy:r,groupId:i,roomId:a,streamMovie:!e},s=await this._signaling.startStream(o);if(s.error)return Promise.reject(Error(s.message))}async stopStream(e=null,t){let n=await this._signaling.stopStream({roomId:e,...t&&{remove:t}});if(n.error)return Promise.reject(Error(n.message))}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<N.videoMinWidth||e.height<N.videoMinHeight)throw Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<N.videoMinWidth||t.height<N.videoMinHeight)throw Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");N.videoEffectMaxHeight=t.height,N.videoEffectMaxWidth=t.width}N.videoMaxWidth=e.width,N.videoMaxHeight=e.height,this._debug.debug(`Set local video resolution:`,`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:``)),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(e=>({id:e.id,type:N.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),n=await this._signaling.getParticipants(t);if(n.error)throw Error(n.error);let r=n.participants,i=this._transport?.getState();return M.mapSharedParticipants(r.map(e=>{let t=M.composeId(e);return this._createParticipant({id:t,externalId:Q.fromSignalingParticipant(e,!0,!0),mediaSettings:D(e.mediaSettings),participantState:M.mapParticipantState(e),state:e.state,roles:e.roles||[],connectionStatus:this._buildConnectionStatus(t,e.sessionState,i,e.onHold),isOnHold:!!e.onHold,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(t,e.markers)},e.decorativeUserId)}))}async getParticipantListChunk(e){this._debug.log(`Request participant list chunk`,e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw Error(t.error);let n=this._createParticipantListChunk(t.chunk),r=this._participants,i=n.participants.filter(e=>!r[M.composeId(e)]);await this._registerParticipants(i);let a=this._transport?.getState();return n.participants.forEach(e=>{let t=M.composeId(e),n=r[t];this._updateParticipantExternalId(n,e),this._setSessionState(n,this._remoteParticipantSessionState(t,e.sessionState)),n.isOnHold||this._setTransportStatus(n,Xa.fromTransportState(a)??P.WAITING),n.movieShareInfos=e.movieShareInfos,Object.assign(n.mediaSettings,D(e.mediaSettings)),Object.assign(n.muteStates,e.muteStates),n.unmuteOptions=e.unmuteOptions??n.unmuteOptions,this._openTransport([n],!0)}),this._participantListChunkToExternalChunk(n)}async _getInitialParticiapntListChunk(){let e=N.participantListChunkInitIndex,t=N.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:`GRID`,fromIdx:e,count:t});return this._debug.debug(`Get initial participant list chunk`,n.chunk),n.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.mediaSettings;this._debug.debug(`Local media stream changed`,t),e.kind===A.audio&&this._mediaSource&&(this._audioFix=new lo(this._mediaSource,this._debug,this._stats.logger)),R.onLocalStreamUpdate(t,e.kind,this.id),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this.mediaSettings;this._debug.log(`Screen sharing changed`,e.track,t);let n=e.track?new MediaStream([e.track]):null;R.onScreenStream(n,t,this.id)}_changeRemoteMediaSettings(e,t){this._debug.debug(`Remote media settings changed [${e}]`,t);let n=this._conversation?.externalId;if(this._isMe(e)&&n){R.onLocalMediaSettings(n,t,this.id);return}let r=this._getParticipant(e);if(!r){this._warnParticipantNotInConversation(e);return}r.mediaSettings=t,[`ACTIVE`,`HELD`].includes(this._state)&&R.onRemoteMediaSettings(r.externalId,t,r.markers,this.id),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(n=>n.id===t||M.comparePeerId(n.peerId,e.peerId))}_changeLocalParticipantState(e){this._debug.debug(`Local participant state force changed by admin`,e),[`ACTIVE`,`HELD`].includes(this._state)&&R.onLocalParticipantState(e,!1,this.id)}async _changeRemoteParticipantState(e,t){this._debug.debug(`Remote participant state changed [${e}]`,t);let n=this._getParticipant(e);if(!n){this._warnParticipantNotInConversation(e);return}n.participantState=t||{},[`ACTIVE`,`HELD`].includes(this._state)&&R.onRemoteParticipantState(n.externalId,n.participantState,n.markers,this.id)}_changeMultipleParticipantState(e,t){this._debug.debug(`Multiple participants state changed`,e);let n=[],r,i=this._participants;e.forEach((e,t)=>{if(this._isMe(t))r=e;else{let r=i[t];if(!r){this._warnParticipantNotInConversation(t);return}r.participantState=e,n.push({externalId:r.externalId,participantState:{...e},markers:r.markers})}}),[`ACTIVE`,`HELD`].includes(this._state)&&(r&&R.onLocalParticipantState(r,!0,this.id),n.length&&R.onRemoteParticipantsState(n,t,this.id))}_invokeRolesChangedCallbackIfNeeded(e){this._state===`ACTIVE`&&e.roles&&e.roles.length&&(this._debug.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),R.onRolesChanged(e.externalId,e.roles,!0,this.id))}_onSignalingNotification(e){switch(e.notification){case q.ACCEPTED_CALL:return this._onAcceptedCall(e);case q.HUNGUP:return this._onHungup(e);case q.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case q.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case q.CLOSED_CONVERSATION:return this._onClosedConversation(e);case q.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case q.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case q.SESSION_STATE:return this._onSessionState(e);case q.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case q.RATE_CALL_DATA:return this._onNeedRate();case q.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case q.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case q.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case q.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case q.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case q.REGISTERED_PEER:return this._onPeerRegistered(e);case q.SWITCH_MICRO:return this._onMicSwitched(e);case q.CHAT_MESSAGE:return this._onChatMessage(e);case q.CUSTOM_DATA:return this._onCustomData(e);case q.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case q.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case q.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case q.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case q.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case q.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case q.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case q.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case q.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case q.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case q.FEEDBACK:return this._onFeedback(e);case q.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case q.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case q.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case q.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case q.ROOMS_UPDATED:return this._onRoomsUpdated(e);case q.ROOM_UPDATED:return this._onRoomUpdated(e);case q.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case q.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case q.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case q.ASR_STARTED:return this._onAsrStart(e);case q.ASR_STOPPED:return this._onAsrStop(e);case q.PROMOTION_APPROVED:return this._onPromotionApproved(e);case q.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case q.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e);case q.HOLD:return this._onParticipantHold(e);case q.TOPOLOGY_CHANGED:return this._onSignalingTopologyChanged(e)}}_onSignalingTopologyChanged(e){this._conversation&&e.topology!==this._conversation.topology&&(this._debug.log(`Signaling topology changed while transport is down: ${this._conversation.topology} -> ${e.topology}`),this._conversation.topology=e.topology)}_onPromotionApproved(e){let t=this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}R.onPromotionApproved(t,this.id)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversationParams?.serverTime&&(this._serverTimeOffset=e.conversationParams.serverTime-Date.now()),e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let n=Object.keys(this._participants),r=[];for(let n of e.conversation.participants){let e=M.composeId(n),i=n.roles||[];if(this._isMe(e)){Ja(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:io(n),unmuteOptions:n.unmuteOptions})};continue}r.push(e);let a=this._getParticipant(e);if(!a)await this._onJoinedParticipant({participantId:n.id,participant:n,mediaSettings:n.mediaSettings});else{this._updateParticipantSessionState(a,e,n.sessionState);let t=D(n.mediaSettings);Gt(t,a.mediaSettings)||this._changeRemoteMediaSettings(e,t);let r=M.mapParticipantState(n),o=a.participantState;M.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),Ja(i,a.roles)||this._onRolesChanged(a.id,i),!!n.onHold!=!!a.isOnHold&&(a.isOnHold=!!n.onHold,this._setParticipantsStatus([a],n.onHold?P.ONHOLD:P.CONNECTED))}}let i=this._participants;for(let e of n)r.indexOf(e)<0&&i[e]&&this._removeParticipant(i[e],O.HUNGUP)}let n=[...e.participants?.participants??[],...e.rooms?.rooms.flatMap(e=>e.participants?.participants??[])??[]];await this._reconcileParticipantSessionStates(n);let r=e.rooms?.roomId??null;if(!this._conversation){this._debug.warn(`Conversation is empty, but should be filled`);return}this._conversation.roomId===r?this._processMuteStates(e,!0):await this._onRoomSwitched(r),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){this._debug.error(`Signaling failed`,e),this._close(e)}async _onAcceptedCall(e){let t=M.composeMessageId(e),n=M.getPeerIdString(e.peerId);if(this._debug.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new k(O.MISSED),{errorText:`Call accepted on other device`});return}this._conversation?.direction===Ia.OUTGOING&&!this._conversation.concurrent&&this._stats.lifecycle.markOutgoingAccepted();let r=this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t),i=n?M.composeUserId(n,e.participantType):void 0;r=this._registerParticipantInCache(this._createParticipant({id:t,mediaSettings:D(e.mediaSettings)},i))}r.state=Z.ACCEPTED,r.mediaSettings=D(e.mediaSettings),this._logWithMediaSettings(w.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===Ia.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),this._state===`ACTIVE`&&this._transport&&this._transport.open([r.id],n),this._changeRemoteMediaSettings(t,r.mediaSettings),await this._changeRemoteParticipantState(t);let i=Object.keys(r.muteStates);i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),[`ACTIVE`,`HELD`].includes(this._state)&&R.onAcceptedCall(r.externalId,_a.parseCapabilities(e.capabilities),this.id)}async _onHungup(e){this._debug.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=M.composeMessageId(e);if(this._conversation&&this._isMe(t)){let t={remote:!0,callError:e.callError,message:void 0};e.reason===O.OBSOLETE_CLIENT&&e.errorCode&&(t.message=e.errorCode),this._close(new k(e.reason,t));return}this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}if(this._transport&&this._transport.close(t),n.state=e.reason===O.REJECTED?Z.REJECTED:Z.HUNGUP,this._state!==`CLOSE`){let t=e.reason===O.OBSOLETE_CLIENT?O.OBSOLETE_CLIENT:O.HUNGUP;this._removeParticipant(n,t)}}_onSessionState(e){if(!N.enableSessionStateUpdates)return;let t=M.composeMessageId(e);if(this._isMe(t))return;this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}if(e.connected){let e=Xa.fromTransportState(this._transport?.getState());e&&this._setTransportStatus(n,e)}this._setSessionState(n,{connected:e.connected})}async _reconcileParticipantSessionStates(e){if(!N.enableSessionStateUpdates||!e.length)return;let t=this._participants;for(let n of e){let e=M.composeId(n),r=t[e];r&&!this._isMe(e)&&(this._updateParticipantExternalId(r,n),this._updateParticipantSessionState(r,e,n.sessionState))}}_updateParticipantExternalId(e,t){let n=Q.fromSignalingParticipant(t)??Q.fromSignalingParticipant(t,!1);n&&(e.externalId=n,this._api.cacheExternalId(e.id,n))}_updateParticipantSessionState(e,t,n){return this._setSessionState(e,this._remoteParticipantSessionState(t,n))}_emitParticipantEffectiveStatusIfSessionOverridesTransport(e){e.connectionStatus.sessionState?.connected!==!1||e.connectionStatus.lastEffective===e.connectionStatus.transport||R.onRemoteStatus([e.externalId],e.connectionStatus.lastEffective,null,this.id)}async _onAddedParticipant(e){this._debug.debug(`Participant added [${e.participantId}]`);let t=M.composeMessageId(e),n=this._getParticipant(t);n&&this._updateParticipantExternalId(n,e.participant);let r=!n;if(n&&n.state!==Z.HUNGUP&&n.state!==Z.REJECTED){this._debug.debug(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(r,!0,!0),mediaSettings:D(r.mediaSettings),state:r.state,participantState:M.mapParticipantState(r),roles:r.roles||[],connectionStatus:this._buildConnectionStatus(t,r.sessionState,this._transport?.getState(),r.onHold),isOnHold:!!r.onHold,muteStates:r.muteStates||{},unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[]},i),n=this._getParticipant(t)}n.state=Z.CALLED,n.mediaSettings=D(e.participant?.mediaSettings),n.participantState=M.mapParticipantState(e.participant),n.roles=e.participant?.roles||[],this._updateParticipantSessionState(n,t,e.participant.sessionState),this._setParticipantsStatus([n],P.WAITING),r&&this._emitParticipantEffectiveStatusIfSessionOverridesTransport(n),this._state!==`IDLE`&&this._transport&&this._allocateParticipantTransport(n.id,!0),R.onParticipantAdded(n.externalId,n.markers,this.id),this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n)}async _onJoinedParticipant(e){this._debug.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markOnJoin(this._transport?.getTopology());let t=M.composeMessageId(e),n=this._getParticipant(t);n&&this._updateParticipantExternalId(n,e.participant);let r=!n;if(n&&n.state===Z.ACCEPTED){this._debug.warn(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(r,!0,!0),mediaSettings:D(r.mediaSettings),state:r.state,participantState:M.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},movieShareInfos:r.movieShareInfos,unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[],connectionStatus:this._buildConnectionStatus(t,r.sessionState,this._transport?.getState(),r.onHold),markers:this._denormalizeMarkers(t,r.markers),isOnHold:!!r.onHold},i),n=this._getParticipant(t)}this._conversation&&this._conversation.direction===Ia.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=Z.ACCEPTED,n.mediaSettings=D(e.mediaSettings),n.participantState=M.mapParticipantState(e.participant),n.roles=e.participant.roles||[],this._updateParticipantSessionState(n,t,e.participant.sessionState),e.participant.onHold?(n.isOnHold=!0,this._setParticipantsStatus([n],P.ONHOLD)):this._transport?.isAllocated(n.id)?this._setParticipantsStatus([n],P.CONNECTED):this._setParticipantsStatus([n],P.WAITING),r&&this._emitParticipantEffectiveStatusIfSessionOverridesTransport(n),this._state!==`IDLE`&&this._transport&&(this._transport.isAllocated(n.id)||this._allocateParticipantTransport(n.id,!0),this._transport.open([n.id],null,!!this._conversation?.observer)),R.onParticipantJoined(n.externalId,n.markers,this.id),this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n);let i=Object.keys(n.muteStates);i.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),this._processSharedMovieInfos(n.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new k(e.reason,{remote:!0,callError:e.callError}))}_onMediaSettingsChanged(e){let t=M.composeMessageId(e);this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteMediaSettings(t,D(e.mediaSettings))}async _onParticipantStateChanged(e){let t=M.composeMessageId(e),n=M.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(n):(this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,n))}_onParticipantsStateChanged(e){let{participants:t,roomId:n}=e;t.map(({id:e,markers:t})=>this._registerParticipantAndSetMarkersIfChunkEnabled(e,t));let r=new Map,i=t.map(({id:e,participantState:t})=>[e,this._getExternalIdByParticipantId(e)&&M.mapParticipantState({participantState:t})]);try{i.forEach(([e,t])=>{t&&r.set(e,t)}),this._changeMultipleParticipantState(r,n)}catch(e){this._debug.warn(`_onParticipantsStateChanged: Failed to get external ids. ${e}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),R.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.mediaSettings,n=D(e.mediaSettings);t.isAudioEnabled!==n.isAudioEnabled&&await this._mediaSource.toggleAudio(n.isAudioEnabled),t.isVideoEnabled!==n.isVideoEnabled&&await this._mediaSource.toggleVideo(n.isVideoEnabled),t.isScreenSharingEnabled!==n.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:n.isScreenSharingEnabled,fastScreenSharing:n.isFastScreenSharingEnabled,captureAudio:n.isAudioSharingEnabled})}_onSettingsUpdate(e){this._debug.debug(`Got settings update notification`,e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=wr(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){this._debug.debug(`Got video quality update notification`,e);let t={maxBitrateK:Math.round(e.quality.maxBitrate/1024),maxDimension:e.quality.maxDimension},n;n=e.mediaType&&e.mediaType===H.SCREEN?{camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,t)}:{camera:Object.assign({},this._serverSettings.camera,t),screenSharing:null,fastScreenSharing:null},this._serverSettings=wr(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){this._registeredPeerReceived=!0,this._clearCalleeUnavailableWatchdog();let t=M.composeMessageId(e),n=this._getParticipant(t);n&&(n.clientType=e.clientType,n.platform=e.platform),R.onPeerRegistered(this.id,[n.externalId])}async _onMicSwitched(e){R.onDeviceSwitched(C.AUDIO,!e.mute,this.id),await this.toggleLocalAudio(!e.mute)}_onChatMessage(e){let t=M.composeMessageId(e),n=this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}R.onChatMessage(e.message,n,e.direct,this.id)}_onCustomData(e){if(Object.hasOwn(e.data,`sdk`))return;let t=M.composeMessageId(e),n=this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}R.onCustomData(e.data,n,e.direct,this.id)}_onRecordInfo(e,t=null){if(!this._conversation||!e)return;let n=this._conversation.recordsInfoByRoom.get(t);if(n?.recordMovieId!==e?.recordMovieId||n?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let n=this._getExternalIdByParticipantId(e.initiator);n?R.onRecordStarted(n,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t,this.id):this._warnParticipantNotInConversation(e.initiator)}}_onStopRecordInfo({participant:e,recordMovieId:t},n=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(n);if(!(!r||r.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(n,null),e){let t=this._getExternalIdByParticipantId(e);R.onRecordStopped(n,t??null,this.id)}else R.onRecordStopped(n,null,this.id)}_changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let n=this._getExternalIdByParticipantId(t);n&&R.onPinnedParticipant(n,!1,null,e,this.id)}}_changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let n=this._getExternalIdByParticipantId(t.initiator);n?R.onRecordStarted(n,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e,this.id):this._warnParticipantNotInConversation(t.initiator)}else R.onRecordStopped(e,null,this.id)}_changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let n=this._getExternalIdByParticipantId(t.initiatorId);n&&R.onAsrSet({externalId:n,movieId:t.movieId},e,this.id)}else R.onAsrSet(null,e,this.id)}_changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,n=t.get(e);if(n){let t=this._getExternalIdByParticipantId(n.initiatorId);t&&R.onRemoteSharedUrl(t,n.sharedUrl,e,this.id)}}_onParticipantAnimojiChanged(e){if(this._conversation){let t=this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}R.onParticipantVmojiUpdate(t,this.id)}}_onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,n=e.roomId||null;this._conversation.asrInfoByRoom.set(n,t);let r=this._getExternalIdByParticipantId(t.initiatorId);if(!r){this._warnParticipantNotInConversation(t.initiatorId);return}R.onAsrStarted(r,t.movieId,n,this.id)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),R.onAsrStopped(t,this.id)}_onAsrTranscription(e){if(!this._conversation)return;let t=this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}R.onAsrTranscription(t,e.text,e.timestamp,e.duration,this.id)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!Ja(this._conversation.roles,t)){this._debug.debug(`Local roles changed: ${t}`),this._conversation.roles=t,R.onLocalRolesChanged(t,!1,this.id),this._processMuteState({mediaOptions:eo(this._getMuteStatesForCurrentRoom(),Ua.MUTE_PERMANENT),stateUpdated:!0}),M.includesOneOf(t,[qa.ADMIN,qa.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=this._getParticipant(e);n&&!Ja(n.roles,t)&&(this._debug.debug(`Roles for participant [${e}] changed: ${t}`),n.roles=t,R.onRolesChanged(n.externalId,t,!1,this.id))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:n,muteStates:r={},unmuteOptions:i=[],mediaOptions:a=[],roomId:o=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){this._debug.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let t=this._getParticipant(e.participantId);if(t){this._debug.debug(`Mute states for participant [${e.participantId}] changed`,r);let o=e.adminId?this._getExternalIdByParticipantId(e.adminId):null;R.onMuteStates(r,i,a,n,e.unmute,t.externalId,o,e.stateUpdated,e.requestedMedia,e.roomId,this.id)}return}if(e.requestedMedia?.length||(n&&!t?this._setMuteStatesForRoomId(r,o):n||(this._conversation.muteStatesPersonal=r)),e.adminId&&this._isMe(e.adminId)){n&&R.onMuteStates(r,i,a,n,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId,this.id);return}await this._processMuteState({mediaOptions:a,muteAll:n,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:i,muteStates:r})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let n=this._getMuteStatesForRoomId(t),r=this._getMuteStatesForRoomId(e),i=Object.keys(n),a=Object.keys(r);this._processMuteState({mediaOptions:Array.from(new Set([...i,...a])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Z.ACCEPTED)return;let{mediaOptions:t=[],muteAll:n,unmute:r,stateUpdated:i,requestedMedia:a,roomId:o=null,unmuteOptions:s=[]}=e,c=e.adminId?this._getExternalIdByParticipantId(e.adminId):null,l=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(o)),u=this._mediaSource.mediaSettings,d=Object.entries(l);for(let[e,i]of d){let a=this._isCallAdmin()&&n;if(!(i!==Ua.MUTE&&i!==Ua.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===Ua.MUTE_PERMANENT&&!n&&(l[e]=Ua.MUTE),!(!t.includes(e)||r)))switch(e){case C.VIDEO:u.isVideoEnabled&&(R.onDeviceSwitched(C.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case C.AUDIO:u.isAudioEnabled&&(R.onDeviceSwitched(C.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case C.SCREEN_SHARING:u.isScreenSharingEnabled&&(R.onDeviceSwitched(C.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case C.AUDIO_SHARING:u.isAudioSharingEnabled&&(R.onDeviceSwitched(C.AUDIO_SHARING,!1,this.id),await this.toggleScreenCapturing({captureScreen:u.isScreenSharingEnabled,fastScreenSharing:u.isFastScreenSharingEnabled,captureAudio:!1}));break}}R.onMuteStates(l,s,t,n,r,null,c,i,a,o,this.id)}_onPinParticipant(e,t=!1,n,r=null){if(!this._conversation)return;let i=this._conversation.pinnedParticipantIdByRoom.get(r);if(i&&i!==e)if(this._isMe(i))R.onLocalPin(!0,r,this.id);else{let t=this._getExternalIdByParticipantId(i);t&&R.onPinnedParticipant(t,!0,this._denormalizeMarkers(e,n),r,this.id)}if(this._isMe(e))R.onLocalPin(t,r,this.id);else{let i=this._getExternalIdByParticipantId(e);i&&R.onPinnedParticipant(i,t,this._denormalizeMarkers(e,n),r,this.id)}this._conversation.pinnedParticipantIdByRoom.set(r,t?null:e)}_onOptionsChanged(e){this._conversation&&!Va(this._conversation.options,e)&&(this._conversation.options=e,R.onOptionsChanged(e,this.id),e.includes(Ba.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&R.onLocalStatus(P.WAITING_HALL,this.id):e.includes(Ba.WAIT_FOR_ADMIN)&&this._conversation.restricted&&R.onLocalStatus(P.WAIT_FOR_ADMIN,this.id))}async _onNetworkStatus(e){if(this._conversation){let t=[],n=this._participants;for(let[r,i]of Object.entries(e)){let e;if(this._isMe(r)||r===``)e=this._conversation.networkRating;else if(n[r])e=n[r].networkRating;else continue;if(e!==i)if(this._isMe(r)||r===``)this._conversation.networkRating=i,qr.getInstance().value=i,R.onLocalNetworkStatusChanged(i,this.id);else{let e=n[r];e.networkRating=i,t.push({uid:e.externalId,rating:i})}}if(t.length===0)return;this._debug.log(`Received network status update: `,e),R.onNetworkStatusChanged(t,this.id)}}async _emitHeldParticipantsStatus(){let e=Object.values(this._participants).filter(e=>e.isOnHold).map(e=>e.externalId);e.length&&R.onRemoteStatus(e,P.ONHOLD,null,this.id)}async _onRemoteStreamSecond(e,t){let n=this._getParticipant(e);n&&R.onRemoteScreenStream(n.externalId,t,this.id)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){R.onVmojiStream(t,this._mediaSource.mediaSettings,this.id);return}let n=this._getParticipant(e);n&&R.onRemoteVmojiStream(n.externalId,t,this.id)}_onAnimojiError(e){try{let t=this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,R.onVmojiError({...e,externalId:t},this.id))}catch(e){this._debug.warn(`_onAnimojiError failed`,e)}}_onPeerConnectionClosed(e){this._state!==`HELD`&&(e===Y.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy())}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(za.ADD_PARTICIPANT);R.onCallState(e,t,this._conversation,this.id)}}_changeFeaturesPerRole(){this._conversation&&R.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{},this.id)}_changeNeedRate(){this._conversation&&this._conversation.needRate&&R.onRateNeeded(this.id)}async _onVolumesDetected(e){let t=[];for(let[n,r]of Object.entries(e)){let e=this._getParticipant(n);e&&e.externalId&&t.push({uid:e.externalId,volume:r.real})}R.onVolumesDetected(t,this.id)}async _onSpeakerChanged(e){let t=this._activeSpeakerId;if(this._activeSpeakerId=e,t&&t!==e){let e=this._getParticipant(t);if(e?.connectionStatus.sessionStateConnectedBySpeaker){e.connectionStatus.sessionStateConnectedBySpeaker=!1;let t=this._setTransportStatus(e,e.connectionStatus.transport);this._emitParticipantTransition(e,t)}}let n=this._getParticipant(e);if(n){if(n.connectionStatus.sessionStateApplicable&&n.connectionStatus.sessionState?.connected===!1){let e=Xa.fromTransportState(this._transport?.getState());e&&this._setTransportStatus(n,e),n.connectionStatus.sessionStateConnectedBySpeaker=!0;let t=this._setTransportStatus(n,n.connectionStatus.transport);this._emitParticipantTransition(n,t)}this._lastSignalledActiveSpeakerId!==e&&(R.onSpeakerChanged(n.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}}async _onTransportStateChanged(e,t){this._debug.debug(`Transport state has changed: ${t}`,e);let n=Xa.fromTransportState(t);if(!n)return;let r=this._participants,i=[],a=e.reduce((e,n)=>{if(n in r){let a=r[n];e.push(a),t===J.CONNECTED&&(a.remoteStream||(a.mediaSettings&&this._changeRemoteMediaSettings(n,a.mediaSettings),this._changeRemoteParticipantState(n,a.participantState)),i.push(...Object.values(a.lastRequestedLayouts)))}else this._warnParticipantNotInConversation(n);return e},[]);a.length&&(this._updateDisplayLayoutFromCache(i),this._setParticipantsStatus(a,n))}async _onTransportLocalStateChanged(e){if(this._debug.debug(`Local transport state has changed: ${e}`),e===J.CONNECTED&&(E.releaseFirefoxMicrophonePermissionWarmup(),R.onLocalStatus(P.CONNECTED,this.id),this._transport?.getTopology()===Y.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e),this._displayLayoutRequester.resend()}this._state!==`HELD`&&((e===J.CONNECTING||e===J.RECONNECTING)&&this._areTransportParticipantsOnHold()||(e===J.CONNECTING&&R.onLocalStatus(P.CONNECTING,this.id),e===J.RECONNECTING&&R.onLocalStatus(P.RECONNECT,this.id),e===J.FAILED&&this._transport&&this._transport.allocated().length===0&&this._close(new k(O.FAILED,{callError:{scope:`network`,source:`rtc`,code:`connection-failed`,description:`transport-failed`}}),{errorText:`Transport failed`,signalingReason:O.FAILED})))}_areTransportParticipantsOnHold(){if(!N.hold||!this._transport)return!1;let e=this._transport.opened().length?this._transport.opened():this._transport.allocated();if(!e.length)return!1;let t=this._participants;return e.every(e=>t[e]?.isOnHold)}_onRemoteTrackAdded(e,t,n){if(e.endsWith(Ur.AUDIO_MIX))this._debug.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),R.onRemoteMixedAudioStream(t,this.id);else if(e.startsWith(Ur.TRANSPARENT_AUDIO_TRACK_PREFIX))this._debug.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(Ur.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))this._debug.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{this._debug.debug(`Remote track added on the participant [${e}]`,{kind:n.kind});let r=this._getParticipant(e);if(!r){let t=this._api.getDecorativeIdByInitialId(e),n=t?M.composeUserId(t):void 0;this._debug.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${n}]`),this._registerParticipant({id:e},n),r=this._getParticipant(e),this._setParticipantsStatus([r],P.WAITING),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(R.onSpeakerChanged(r.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(r.id)&&this._allocateParticipantTransport(r.id,!1),n.kind===A.audio&&(this._audioOutput.add(e,n),N.preserveAudioTracks||(r.remoteAudioTrack=n,t.removeTrack(n))),r.remoteStream!==t&&t.getTracks().length){if(r.remoteStream=t,r.secondStream)return;R.onRemoteStream(r.externalId,t,this.id)}r.mediaSettings&&this._changeRemoteMediaSettings(e,r.mediaSettings)}}_onRemoteTrackRemoved(e,t,n){switch(this._debug.debug(`[${e}] remote track (removed)`,{track:n}),n.kind){case A.audio:this._removeAudioTrack(e,t,n);break;case A.video:case A.screen:this._removeVideoTrack(e,t,n);break}}async _removeAudioTrack(e,t,n){if(e!==Ur.AUDIO_MIX){let n=this._getParticipant(e);if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(e,n)}_removeVideoTrack(e,t,n){}_onTopologyChanged(e){if(this._state===`HELD`){this._conversation&&(this._conversation.topology=e);return}if(this._statFirstMediaReceived.markTopologyChanged(e),e===Y.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation){this._conversation.topology=e;for(let e of Object.values(this._participants)){let t=Xa.setSessionStateApplicable(e.connectionStatus,this._isParticipantSessionStateApplicable(e.id));this._emitParticipantTransition(e,t)}this._changeFeatureSet(),this._forceOpenTransportForAloneInCall()}this._audioOutput.destroy()}_onAudioMixStall(e){this._audioMixStalled!==e&&!this.isCallHeld&&(this._audioMixStalled=e,this._debug.debug(`Audio mix stalled:`,e),R.onLocalStatus(e?P.RECONNECT:P.CONNECTED,this.id))}_onRemoteSignalledStall(e){let t={},n=[],r=[];this._debug.debug(`Participants stalled:`,e);let i=this._participants;for(let r of e){if(t[r]=!0,!this._lastStalled[r]){let e=i[r];e&&n.push(e)}delete this._lastStalled[r]}for(let e of Object.keys(this._lastStalled)){let t=i[e];t&&r.push(t)}n.length&&this._setParticipantsStatus(n,P.RECONNECT),r.length&&this._setParticipantsStatus(r,P.CONNECTED),this._lastStalled=t}_onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,this._participants),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!E.hasMicrophone()||!this._audioFix||!this.mediaSettings?.isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!E.hasCamera()||!this._audioFix||!this.mediaSettings?.isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!==`CLOSE`||!1;e&&(this._debug.debug(`Toggle join availability`,{available:t,chatId:e}),R.onJoinStatus(t,e,this.id))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()===Y.SERVER&&e.length)try{await this.updateDisplayLayout(e)}catch(e){this._debug.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){if(!e.length)return;let r=e.reduce((e,n)=>{var r;if(n.isOnHold&&![P.ONHOLD,P.HANGUP,P.ERROR].includes(t))return e;let i=this._setTransportStatus(n,t);return i.shouldNotify&&(e[r=i.status]??(e[r]=[])).push(n.externalId),e},{});for(let[e,t]of Object.entries(r))t.length&&R.onRemoteStatus(t,e,n,this.id)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),R.onJoinLinkChanged(e.joinLink,this.id)}_onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let n of Object.keys(Wa)){let r=e.updates[n];r&&(t[n]={rooms:r?.rooms?.map(this._convertRoomToExternal.bind(this))||[],roomIds:r?.roomIds,deactivated:r?.deactivated})}R.onRoomsUpdated(t,this.id)}_onRoomUpdated(e){let t=this._convertRoomToExternal(e.room||null);e.events.some(e=>e===Wa.UPDATE)&&(e.muteStates!==void 0&&this._setMuteStatesForRoomId(e.muteStates,e.roomId),e.recordInfo!==void 0&&this._conversation?.recordsInfoByRoom.set(e.roomId,e.recordInfo),e.asrInfo!==void 0&&this._conversation?.asrInfoByRoom.set(e.roomId,e.asrInfo)),this._isCalledState()||R.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null,this.id)}_convertRoomToExternal(e){if(!e)return null;let t=e.participantIds?.map(e=>this._getExternalIdByParticipantId(e))||[],n=e.addParticipantIds?.map(e=>this._getExternalIdByParticipantId(e))||[],r=e.removeParticipantIds?.map?.(e=>this._getExternalIdByParticipantId(e))||[],i=e.pinnedParticipantId?this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:n,removeParticipantIds:r,participants:e.participants?.participants?this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:i,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=e.addedParticipantIds?.map(e=>M.decomposeId(e).id)||[],i=this._getExternalIdsByOkIdsFromCache(r),a=e.addedParticipants;if(i.length&&a?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);a=(await this._signaling.getParticipants(e)).participants}let o=a?.map(e=>{let r=M.composeId(e);return this._createParticipant({id:r,externalId:Q.fromSignalingParticipant(e,!0,!0),mediaSettings:D(e.mediaSettings),participantState:M.mapParticipantState(e),state:e.state,roles:e.roles||[],connectionStatus:this._buildConnectionStatus(r,e.sessionState,t,e.onHold),isOnHold:!!e.onHold,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(r,e.markers),isInRoom:n!==null},e.decorativeUserId)})||[],s=!1;for(let e of o)e.id===this._conversation?.compositeUserId&&(s=!0),this._registerParticipantInCache(e);this._transport?.getState()===J.IDLE&&!this._isCalledState()&&this._openTransport(o,!0);let c=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);c.push(e)}}if(s&&await this._onRoomSwitched(n),c){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=this._getExternalIdByParticipantId(e);if(t){for(let e of c)if(Q.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let l={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:M.mapSharedParticipants(o),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:c};this._isCalledState()||R.onRoomParticipantsUpdated(l,this.id)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let n=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){R.onRoomStart(e,this.id);return}this._isCalledState()||R.onRoomSwitched(e,this.id),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,n),this._changeAsrInfoForRoom(),this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let n=t?.rooms?.rooms??[],r=[];for(let t of n){let n=t.id??null;if(this._setMuteStatesForRoomId(t.muteStates,n),this._conversation?.recordsInfoByRoom.set(n,t.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(n,t.pinnedParticipantId??null),t.asrInfo&&this._conversation?.asrInfoByRoom.set(n,t.asrInfo),t.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(n,t.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(n),e){let e=this._participants;await this._registerParticipants(t?.participants?.participants?.filter(t=>!e[M.composeId(t)])||[],!0);let n=this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&R.onRoomsUpdated({[Wa.UPDATE]:{rooms:r}},this.id)}_onFeedback(e){let t=[];for(let n of e.feedback){let e={...n,items:[]};for(let t of n.items){let n=this._getExternalIdByParticipantId(t.participantId);n?e.items.push({...t,participantId:n}):this._warnParticipantNotInConversation(t.participantId)}t.push(e)}R.onFeedback(t,e.roomId,this.id)}_onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:n,decorativeExternalParticipantId:r}=e,i=this._isMe(t);this._debug.debug(`Decorative participant id changed [${t}]`,e);let a=this._getExternalIdByParticipantId(t);if(!a){this._warnParticipantNotInConversation(t);return}let o=Q.fromSignaling(r,a.deviceIdx);if(R.onParticipantIdChanged(a,o,this.id),this._api.cacheExternalId(n,o),this._api.mapDecorativeId(n,t),i)this._conversation.externalId=o;else{let e=this._participants;e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==Y.SERVER||(this._debug.debug(`Video suspend suggested`,e),R.onVideoSuspendSuggest(e.bandwidth,this.id))}async _onParticipantHold(e){this._debug.debug(`Participant hold suggested`,e);let t=this._getParticipant(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}if(t.isOnHold=e.hold,this._specListener?.onParticipantHoldChanged(),this._transport?.setRemoteHold(e.hold),e.hold)this._setParticipantsStatus([t],P.ONHOLD);else{let e=this._transport?.getTopology()===Y.DIRECT?P.CONNECTING:P.CONNECTED;this._setParticipantsStatus([t],e)}}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()===Y.SERVER&&this._transport?.getState()===J.IDLE&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){let n=this._createParticipant(e,t);this._registerParticipantInCache(n)}_getParticipant(e){return this._participants[e]}},as=null,os=class e extends Error{constructor(t,n){super(t),h(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},ss=null,cs=null,ls=64*1024;function us(){ss=null,cs=null}function ds(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function fs(e=null,t){let n=ds(e??N.apiBaseUrl);if(n)return n;if((t??N.apiEnv)!==`AUTO`)return N.apiEndpoint(t);try{let e=atob(`aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ=`),t=(await(await fetch(e,{method:`GET`,mode:`cors`,cache:`no-cache`})).json())?.Answer[0]?.data;if(!t)throw Error(`Wrong DNS response`);return z.debug(`Resolved API endpoint`,t),t}catch(e){return z.warn(`Failed to resolve API endpoint using DNS, default is used`,e),N.apiEndpoint(t)}}async function ps(){return ss||cs||(cs=fs(),ss=await cs,cs=null,ss)}async function ms(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await ps();let r=bs(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${ss}/fb.do`,i)}async function hs(e,t={},n=!1,r){return await ps(),_s(bs(e,t,n),r)}async function gs(e,t={},n=!1){await ps();let r=bs(e,t,n);return _s(r,void 0,new Blob([r]).size<=ls)}async function _s(e,t,n=!1){let r=`${t??ss}/fb.do`,i=new AbortController,a=new k(S.NETWORK,{callError:{scope:`network`,source:`api`,code:`timeout`,description:`request-timeout`}}),o=setTimeout(()=>i.abort(a),N.apiTimeout);try{let t=await fetch(r,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:e,signal:i.signal,...n&&{keepalive:!0}}),a=await t.text(),o;try{o=JSON.parse(a)}catch{o={result:a}}if(!t.ok&&!vs(o))throw new k(S.API,{callError:{scope:`server`,source:`api`,code:`http-${t.status}`,description:`http-error`}});if(vs(o))throw o;return o}catch(e){throw e instanceof k?e:i.signal.aborted?a:vs(e)?e:new k(S.NETWORK,{callError:{scope:`network`,source:`api`,code:`fetch-failed`,description:`request-failed`}})}finally{clearTimeout(o)}}function vs(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.error_code==`number`&&typeof t.error_msg==`string`}async function ys(e,t){try{let n=await fetch(e,{method:`POST`,body:t});if(!n.ok)throw Error(`HTTP error! status: ${n.status}`);let r=await n.text();z.debug(`Form data sent successfully`,r)}catch(e){throw z.warn(`Failed to send form data`,e),e}}function bs(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=N.apiKey),n||(b.sessionKey?t.session_key=b.sessionKey:b.accessToken&&(t.access_token=b.accessToken));for(let[e,n]of Object.entries(t))typeof n==`object`&&(t[e]=JSON.stringify(n));let r=``;for(let[e,n]of Object.entries(t))r&&(r+=`&`),r+=`${e}=${encodeURIComponent(n)}`;return r}var xs=class{constructor(){h(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}async createJoinLink(e){return{join_link:`nop`}}async removeJoinLink(e){return{success:!0}}async getAnonymTokenByLink(e,t){return``}log(e){}logClientStats(e){}getCachedOkIdByExternalId(e){return null}getCachedRawOkIdByExternalId(e){return null}getCachedExternalIdByOkId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}replaceByInitialIdIdIfExists(e){return typeof e==`string`?parseInt(e,10):e}hangupConversation(e,t=O.HUNGUP){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}async getInbounds(){return[]}},Ss=class e{constructor(){h(this,`_okIdToExternalId`,new Map),h(this,`_externalIdToOkId`,new Map),h(this,`_decorativeIdToInitialId`,new Map),h(this,`_initialIdToDecorativeId`,new Map)}static _normalizeType(e){return e.type===Za.GROUP?{...e,type:Za.USER}:e}getOkId(t){let n=Q.toString(e._normalizeType(t)),r=this._externalIdToOkId.get(n);return r==null?null:this.replaceByInitialIdIdIfExists(r)}getExternalId(e){let t=this.getDecorativeIdByInitialId(e)??e,n=this._okIdToExternalId.get(t);return n==null?null:Q.fromString(n)}hasByExternalId(t){return this._externalIdToOkId.has(Q.toString(e._normalizeType(t)))}hasByOkId(e){return this._okIdToExternalId.has(e)}cache(t,n){let r=M.extractOkId(t),i=e._normalizeType(n),a=Q.toString(i);this._okIdToExternalId.set(r,a),this._externalIdToOkId.set(a,r)}mapDecorativeId(e,t){let n=M.extractOkId(e),r=M.extractOkId(t);this._decorativeIdToInitialId.set(n,r),this._initialIdToDecorativeId.set(r,n)}unmapDecorativeId(e){let t=M.extractOkId(e),n=this.getDecorativeIdByInitialId(t);n&&this._decorativeIdToInitialId.delete(n),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=M.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=M.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}getParticipantIdByExternalId(e){let t=this.getOkId(e);return t==null?null:M.composeParticipantId(t,j.USER,e.deviceIdx??0)}clear(){this._okIdToExternalId.clear(),this._externalIdToOkId.clear(),this._decorativeIdToInitialId.clear(),this._initialIdToDecorativeId.clear()}},Cs=`anonymLogin:`,ws=700,Ts=3e3;function Es(e){let t=e.error_code;switch(t){case 2:return Ds(O.SERVICE_UNAVAILABLE,t,`service-unavailable`);case 4:return e.error_msg.includes(`participants.limit.exceeded`)?Ds(O.PARTICIPANT_LIMIT_REACHED,t,`participants-limit-exceeded`):Ds(S.API,t,`request-error`);case 300:return Ds(O.NOT_FOUND,t,`not-found`);case 1101:return Ds(O.SERVICE_DISABLED,t,`vchat-service-disabled`);case 1102:return Ds(O.CALLEE_IS_OFFLINE,t,`target-user-unavailable`);case 1103:return Ds(O.NOT_FRIENDS,t,`friendship-required`);case 1104:return Os(t,`youla-api-error`);case 1106:return Os(t,`vk-api-error`);case 1113:return Ds(O.CALLER_IS_REJECTED,t,`caller-is-rejected`);case 1114:{let n=e.custom_error?.vchat_detailed_api_error?.code,r=n?.startsWith(`obsolete_client`);return Ds(r?O.OBSOLETE_CLIENT:O.VCHAT_DETAILED_ERROR,t,n??`detailed-error`,r?n:void 0)}default:return Ds(S.API,t,`api-error`)}}function Ds(e,t,n,r){return{type:e,callError:{scope:`server`,source:`api`,code:t,description:n},message:r}}function Os(e,t){return{type:O.EXTERNAL_API_ERROR,callError:{scope:`external`,source:`api`,code:e,description:t}}}var ks=class extends xs{constructor(...e){super(...e),h(this,`_uuid`,void 0),h(this,`_idCache`,new Ss)}async _callUnsafe(e,t={},n=!1){let r=async i=>{try{return await hs(e,t,n)}catch(t){if(!t||typeof t!=`object`||!Object.hasOwn(t,`error_msg`)){i++;let n=t&&(typeof t==`object`||typeof t==`function`)?Object.getOwnPropertyNames(t).map(e=>`${e}: ${JSON.stringify(t[e])}`):[String(t)];if(z.debug(`${e} network error, attempt ${i}: ${n.join(`
20
- `)}`),this._abortSignal?.aborted&&(z.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),i<N.apiMaxAttempt)return await M.delay(Math.min(i*ws,Ts),{signal:this._abortSignal}),r(i)}throw z.warn(e,`error`,t),t}};return r(0)}async _call(e,t={},n=!1,r=!0){try{return await this._callUnsafe(e,t,n)}catch(i){if(z.warn(`Api call error`,i),i instanceof k)throw i;switch(i?.error_code){case 102:case 103:case 104:if(!r)break;return await this._reauthorize(),this._call(e,t,n,!1)}let a={message:i?.error_msg,code:i?.error_code};if(i.custom_error&&(a.custom_error=i.custom_error),As(i)){let e=Es(i);throw a.callError=e.callError,a.message=e.message??a.message,new k(e.type,a)}throw new k(S.API,a)}}userId(e){let{compositeUserId:t}=M.decomposeParticipantId(e),{id:n}=M.decomposeId(t);return b.isEmpty()?Q.fromId(String(n)):this._idCache.getExternalId(n)||Q.fromId(String(n))}async authorize(){if(this._ensureUuid(),!N.apiKey)throw new k(S.API,{message:`Required argument apiAppKey not passed`,callError:{scope:`internal`,code:`configuration`,description:`api-key-missing`}});let e=this._getCachedAnonymLogin();if(e){this._applyAnonymLogin(e);return}let t={session_data:{version:2,device_id:this._uuid,client_version:N.appVersion,client_type:`SDK_JS`}};return N.authToken&&(t.session_data.auth_token=N.authToken,t.session_data.version=3),this._callUnsafe(`auth.anonymLogin`,t,!0).then(e=>{this._applyAnonymLogin(e),this._setCachedAnonymLogin(e)}).catch(e=>{throw e instanceof k?e:(e?.error_code===401&&(this._removeCachedAnonymLogin(),R.onTokenExpired()),new k(S.AUTH,{message:e?.error_msg,code:e?.error_code,callError:{scope:`server`,source:`api`,code:e?.error_code??`authentication`,description:`authentication-failed`}}))})}_getAnonymLoginCacheKey(){return N.authToken?`${Cs}${N.authToken}`:null}_getCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();if(!e)return null;let t=ot.get(e);return js(t)?t:(t&&ot.remove(e),null)}_setCachedAnonymLogin(e){let t=this._getAnonymLoginCacheKey();!t||!js(e)||ot.set(t,{session_key:e.session_key,session_secret_key:e.session_secret_key,uid:e.uid})}_removeCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();e&&ot.remove(e)}_reauthorize(){return this._removeCachedAnonymLogin(),b.reauthorize(()=>this.authorize())}_applyAnonymLogin(e){e.uid&&(b.userId=Number(e.uid)),b.sessionKey=e.session_key,b.sessionSecretKey=e.session_secret_key}async _sendClientStats(e,t=!0){try{(await gs(`vchat.clientStats`,e))?.items_responses?.forEach(e=>{e.errors&&z.error(`[vchat.clientStats]`,e)})}catch(n){let r=n?.error_code===102||n?.error_code===103||n?.error_code===104;if(!t||!r)throw n;await this._reauthorize(),await this._sendClientStats(e,!1)}}logClientStats(e){let t={app_version:String(N.appVersion),sdk_type:`WEB`,sdk_version:N.sdkVersion,version:1,items:e};N.clientStatsPlatform&&(t.platform=N.clientStatsPlatform);let n={data:JSON.stringify(t)};this._sendClientStats(n).catch(e=>z.error(`[vchat.clientStats]`,e))}async uploadDebugLogs(e,t,n,r){let i={conversationId:e,webrtcPlatform:N.platform,startTime:t,endTime:n},a=await this._callUnsafe(`vchat.getLogUploadUrl`,i),o=new FormData,s=new Blob([r],{type:`application/json`});o.append(`file`,s,`log.json`);let c=new URL(a.upload_url);return c.searchParams.append(`size`,s.size.toString()),ys(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:N.protocolVersion,capabilities:_a.getFlags()};return n&&(r.chatId=n),this._call(`vchat.joinConversation`,r)}async createConversation(e,t=``,n=!1,{onlyAdminCanShareMovie:r,audienceMode:i,audioOnly:a,waitForAdmin:o,closedConversation:s}={},c){let l=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:n,onlyAdminCanShareMovie:r,waitForAdmin:o,closedConversation:s,audienceMode:i,audioOnly:a,externalIds:c});return this._startConversation(l)}async startConversation(e,t,n,r=!1,i=``,a=!1,o=!1,{onlyAdminCanShareMovie:s,waitForAdmin:c}={},l){let u=this._preareStartConversationData({conversationId:e,isVideo:r,joiningAllowed:a,payload:i,requireAuthToJoin:o,onlyAdminCanShareMovie:s,waitForAdmin:c,externalIds:l});if(t&&t.length)switch(n){case La.USER:u.uids=t.join(`,`);break;case La.GROUP:u.gid=t[0];break;case La.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=ot.get(`uuid`);e||(e=M.uuid(),ot.set(`uuid`,e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:n=``,joiningAllowed:r=!1,requireAuthToJoin:i=!1,onlyAdminCanShareMovie:a,waitForAdmin:o,audienceMode:s=!1,audioOnly:c=!1,closedConversation:l=!1,externalIds:u}){let d={conversationId:e,isVideo:t,protocolVersion:N.protocolVersion};return r&&(d.createJoinLink=!0),n&&(d.payload=n),N.domain&&(d.domainId=N.domain),N.externalDomain&&(d.externalDomain=N.externalDomain),i&&(d.requireAuthToJoin=!0),a!==void 0&&(d.onlyAdminCanShareMovie=a),o!==void 0&&(d.waitForAdmin=o),s&&(d.audienceMode=s),c&&(d.audioOnly=c),l&&(d.closed=l),u&&(d.externalIds=u.map(Q.toSignaling).join(`,`)),d}async _startConversation(e){return this._call(`vchat.startConversation`,e)}async createJoinLink(e){return this._call(`vchat.createJoinLink`,{conversationId:e})}async removeJoinLink(e){return this._call(`vchat.removeJoinLink`,{conversationId:e})}async getAnonymTokenByLink(e,t){let n={joinLink:e};t&&(n.anonymName=t);let r=await this._call(`vchat.getAnonymTokenByLink`,n);return b.userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:N.protocolVersion,capabilities:_a.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),N.anonymToken&&(i.anonymToken=N.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}getCachedOkIdByExternalId(e){return this._idCache.getParticipantIdByExternalId(e)}getCachedRawOkIdByExternalId(e){return this._idCache.getOkId(e)}getCachedExternalIdByOkId(e){return this._idCache.getExternalId(e)}cacheExternalId(e,t){this._idCache.cache(e,t)}mapDecorativeId(e,t){this._idCache.mapDecorativeId(e,t)}unmapDecorativeId(e){this._idCache.unmapDecorativeId(e)}getDecorativeIdByInitialId(e){return this._idCache.getDecorativeIdByInitialId(e)}replaceByInitialIdIdIfExists(e){return this._idCache.replaceByInitialIdIdIfExists(e)}async getConversationParams(e){let t={};return N.anonymToken&&(t.anonymToken=N.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return b.userId}setUserId(e){b.userId=e}hangupConversation(e,t=O.HUNGUP){let n={conversationId:e,reason:t};N.anonymToken&&(n.anonymToken=N.anonymToken),ms(`vchat.hangupConversation`,n)}async removeHistoryRecords(e){await this._call(`vchat.removeHistoryRecords`,{recordIds:e.join(`,`)})}cleanup(){this._idCache.clear()}async getServerTime(){return(await this._call(`system.getInfo`)).serverTime}async getInbounds(){let e=await this._call(`vchat.getInbounds`);return Array.isArray(e?.inbounds)?e.inbounds:[]}};function As(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}function js(e){return typeof e==`object`&&!!e&&`session_key`in e&&`session_secret_key`in e&&typeof e.session_key==`string`&&e.session_key.length>0&&typeof e.session_secret_key==`string`&&e.session_secret_key.length>0}var Ms=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(Ms||{}),Ns=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),Ps=class{constructor(e){h(this,`_queue`,void 0),h(this,`_readCursor`,void 0),h(this,`_writeCursor`,void 0),h(this,`_moveReadCursor`,void 0),h(this,`_left`,void 0),this._queue=Array(e).fill(null),this._readCursor=this._writeCursor=this._left=0,this._moveReadCursor=!1}get length(){return this._queue.length}get left(){return this._left}toArray(){return Array.from(this._queue)}add(e){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=e,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(e){return(e+1)%this._queue.length}next(){let e=this._queue[this._readCursor];return e&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),--this._left),e}},Fs=class{constructor(e,t,n,r=null){h(this,`_uuid`,void 0),h(this,`_apiKey`,void 0),h(this,`_callToken`,void 0),h(this,`_apiEnv`,void 0),h(this,`_baseApiUrl`,void 0),h(this,`_sessionKey`,void 0),this._uuid=M.uuid(),this._apiKey=t,this._callToken=n,this._apiEnv=e,this._baseApiUrl=r}async authorize(){let e=await hs(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:N.appVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await fs(this._baseApiUrl,this._apiEnv));return M.isObject(e)&&!(`error_msg`in e)?(this._sessionKey=e.session_key,!0):!1}async hangupConversation(e){await hs(`vchat.hangupConversation`,{conversationId:e,reason:O.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},!0,await fs(this._baseApiUrl,this._apiEnv))}},Is,Ls=null,Rs={getCameras:E.getCameras,getMicrophones:E.getMicrophones,getOutput:E.getOutput,getVideoFacingMode:E.getVideoFacingMode,hasCamera:E.hasCamera,hasMicrophone:E.hasMicrophone,getSavedCamera:E.getSavedCamera,getSavedMicrophone:E.getSavedMicrophone,getSavedOutput:E.getSavedOutput,hasCameraPermission:E.hasCameraPermission,hasMicrophonePermission:E.hasMicrophonePermission,hasPermissions:E.hasPermissions,getUserMedia:E.getUserMedia,getUserVideo:E.getUserVideo,getUserAudio:E.getUserAudio,setResolution:E.setResolution,isBrowserSupported:E.isBrowserSupported,isScreenCapturingSupported:E.isScreenCapturingSupported,os:E.os,isMobile:E.isMobile,browserName:E.browserName,browserVersion:E.browserVersion,baseChromeVersion:E.baseChromeVersion,getAudioContext:E.getAudioContext,isAudioShareSupported:E.isAudioShareSupported},zs={participantMarkerCompare:M.participantMarkerCompare};function Bs(e){Ls=e}function Vs(e){N.videoEffects=e}function Hs(e){N.audioEffects=e}function Us(e,t=null,n={},r=1){N.vmoji=e,N.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function Ws(e){N.set(e),Is||(Is=new ks),c.default.disableLog(!N.debug),z.toggle(N.debug),z.log(`Calls SDK ${N.sdkVersion}`,e),await E.init();let t=E.getBrowserSupportFailure();if(t)throw new k(S.UNSUPPORTED,{callError:{scope:`internal`,code:`environment`,description:t}});z.log(`UserAgent:`,navigator.userAgent),z.log(`Screen resolution:`,`${window.screen.width}x${window.screen.height}`),z.log(`Permissions:`,`Camera: ${E.hasCameraPermission()}, Mic: ${E.hasMicrophonePermission()}`),z.log(`Simulcast:`,`${e.simulcast} => ${N.simulcast}`)}async function Gs(e,t=[C.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),Ks([],La.USER,t,n,r,i,a,c,o,s)}async function Ks(e,t=La.USER,n,r=``,i=!1,a=!1,o,s,c,l){if(!N.hold&&B.callsLength>0)throw z.error(`There is already active call`),new k(O.HAS_ACTIVE_CALL);return new $(new ks,Ls).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function qs(e,t){return Js(e,j.USER,void 0,t)}async function Js(e,t=j.USER,n,r,i,a){if(e===$.id())throw Error(`Push has already been processed`);return new $(new ks,Ls).onPush(e,t,n,r,i,a)}async function Ys(){return Is.getInbounds()}async function Xs(e,t){return e&&(N.authToken=e),t!==void 0&&N.apiBaseUrl!==t&&(N.apiBaseUrl=t,us()),Is.authorize()}async function Zs(e=[C.AUDIO],t){return bl(t).accept(e)}async function Qs(e,t){let n=yl(e);if(n)return n.decline(t?.reason)}async function $s(e,t=[C.AUDIO]){return ec(e,t)}async function ec(e,t,n){if(!N.hold&&B.callsLength>0)throw z.error(`There is already active call`),new k(O.HAS_ACTIVE_CALL);return new $(new ks,Ls).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function tc(e,t=[C.AUDIO],n,r,i,a){if(!N.hold&&B.callsLength>0)throw z.error(`There is already active call`),new k(O.HAS_ACTIVE_CALL);return n&&(N.anonymToken=n),new $(new ks,Ls).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a,anonymous:!!N.anonymToken})}function nc(e,t){let n=yl(e);return n?n.hangup(t?.reason):($.hangupAfterInit(),Promise.resolve())}async function rc(e,t){let n=Array.isArray(e)?e:[e],r=$.current();r&&await r.addParticipant(n,t)}async function ic(e,t){let n=$.current();if(n){let r=e.map(e=>M.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function ac(e,t=!1){let n=$.current()?.getCachedRawOkIdByExternalId(e)??null;if(!n){z.warn(`removeParticipant: externalId not found in cache`,e);return}return oc(n,t)}async function oc(e,t=!1){let n=$.current();if(n)try{await n.removeParticipant(M.composeUserId(e),t)}catch(t){z.warn(`Failed to remove participant ${e}. Perhaps he is no longer on the call. ${t}`)}}async function sc(e,t){let n=$.current();if(e===`videoinput`&&Mt.contains(t))return N.videoFacingMode=t,n?(E.isMobile()&&n.stopVideoTrack(),n.changeDevice(e)):void 0;if(!await E._saveDeviceId(e,t))throw Error(`Device not found: ${t}`);if(n)return n.changeDevice(e)}async function cc(e,t){let n=typeof e==`object`?{...e,fastScreenSharing:e.captureScreen&&e.fastScreenSharing,captureAudio:e.captureScreen&&e.captureAudio&&N.audioShare}:{captureScreen:e,fastScreenSharing:!1,captureAudio:!1},r=yl(t);return r?r.toggleScreenCapturing(n):Promise.reject()}function lc(e){let t=$.current();t&&t.toggleAnimojiCapturing(e)}async function uc(e,t=!1){let n=$.current();n&&await n.setVideoStream(e,t)}async function dc(e,t){let n=yl(t);n&&await n.toggleLocalVideo(e)}async function fc(e,t){let n=yl(t);n&&await n.toggleLocalAudio(e)}async function pc(e){let t=$.current();if(t)return t.setLocalResolution(e)}async function mc(e){let t=$.current();t&&await t.changePriorities(e)}async function hc(e,t){let n=$.current();if(n){let r;if(t){let e=n.getCachedRawOkIdByExternalId(t);if(!e){z.warn(`changeParticipantState: externalId not found in cache`,t);return}r=M.composeParticipantId(e,j.USER,t.deviceIdx)}await n.changeParticipantState(e,r)}}async function gc(){let e=$.current();e&&await e.putHandsDown()}async function _c(e){let t=$.current();t&&await t.updateDisplayLayout(e)}async function vc(e){let t=$.current();t&&await t.requestDisplayLayout(e)}async function yc(e,t,n=!1){let r=$.current()?.getCachedRawOkIdByExternalId(e)??null;if(!r){z.warn(`grantRoles: externalId not found in cache`,e);return}return bc(r,Q.getDeviceIdx(e),t,n)}async function bc(e,t,n,r=!1){let i=$.current();i&&await i.grantRoles(M.composeParticipantId(e,j.USER,t),n,r)}async function xc({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){let i=null;return e&&(i=$.current()?.getCachedRawOkIdByExternalId(e)??null,i||z.warn(`muteParticipant: externalId not found in cache`,e)),Sc({uid:i,muteStates:t,requestedMedia:n,deviceIdx:Q.getDeviceIdx(e),roomId:r})}async function Sc({uid:e=null,muteStates:t,requestedMedia:n=[],deviceIdx:r=0,roomId:i=null}){let a=$.current();if(a){let o=e?M.composeParticipantId(e,j.USER,r):null;await a.muteParticipant(o,t,n,i)}}async function Cc(e,t=!1,n=null){let r=$.current()?.getCachedRawOkIdByExternalId(e)??null;if(!r){z.warn(`pinParticipant: externalId not found in cache`,e);return}return wc(r,t,Q.getDeviceIdx(e),n)}async function wc(e,t=!1,n=0,r=null){let i=$.current();i&&await i.pinParticipant(M.composeParticipantId(e,j.USER,n),t,r)}async function Tc(e){let t=$.current();t&&await t.updateMediaModifiers(e)}async function Ec(e){let t=$.current();t&&await t.enableVideoSuspend(e)}async function Dc(e){let t=$.current();t&&await t.enableVideoSuspendSuggest(e)}async function Oc(e){let t=$.current();t&&await t.changeOptions(e)}async function kc(e,t=null){let n=null;return t&&(n=$.current()?.getCachedRawOkIdByExternalId(t)??null,n||z.warn(`chatMessage: externalId not found in cache`,t)),Ac(e,n)}async function Ac(e,t=null){let n=$.current();if(n){let r=t?M.composeUserId(t):null;await n.chatMessage(e,r)}}async function jc(e=10){let t=$.current();if(t)return t.chatHistory(e)}async function Mc(e,t=null){let n=null;return t&&(n=$.current()?.getCachedRawOkIdByExternalId(t)??null,n||z.warn(`customData: externalId not found in cache`,t)),Nc(e,n,Q.getDeviceIdx(t))}async function Nc(e,t=null,n=0){let r=$.current();if(r){let i=t?M.composeParticipantId(t,j.USER,n):null;await r.customData(e,i)}}async function Pc(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await Is.createConversation(a??M.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function Fc(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=i.map(e=>Q.fromId(e));return(await Is.createConversation(M.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},a)).join_link}async function Ic(){let e=$.current();return e?e.createJoinLink():Promise.reject()}async function Lc(){let e=$.current();return e?e.removeJoinLink():Promise.reject()}async function Rc(e,t){return Is.getAnonymTokenByLink(e,t)}function zc(e){let t=$.current();t&&t.setVolume(e)}function Bc(e){N.forceRelayPolicy=e}async function Vc(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o=$.current();return o?o.startStream(e,t,n,r,i,a):Promise.reject()}async function Hc(e=null,t){let n=$.current();return n?n.stopStream(e,t):Promise.reject()}async function Uc(e=null){let t=$.current();return t?t.publishStream(e):Promise.reject()}async function Wc(){let e=$.current();return e?e.getStreamInfo():Promise.reject()}async function Gc(e){let t=$.current();return t?t.addMovie(e):Promise.reject()}async function Kc(e){let t=$.current();return t?t.updateMovie(e):Promise.reject()}async function qc(e){let t=$.current();return t?t.removeMovie(e):Promise.reject()}async function Jc(e,t){let n=$.current();if(n){let r=[];for(let t of e){let e,i;t.addParticipantIds&&(e=[],t.addParticipantIds.forEach(t=>{let r=n.getCachedRawOkIdByExternalId(t);r?e.push(M.composeUserId(r)):z.warn(`updateRooms addParticipant: externalId not found in cache`,t)})),t.removeParticipantIds&&(i=[],t.removeParticipantIds.forEach(e=>{let t=n.getCachedRawOkIdByExternalId(e);t?i.push(M.composeUserId(t)):z.warn(`updateRooms removeParticipant: externalId not found in cache`,e)})),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:i,countdownSec:t.countdownSec})}return n.updateRooms(r,t)}return Promise.reject()}async function Yc(e,t){let n=$.current();return n?n.activateRooms(e,t):Promise.reject()}async function Xc(e=null,t=null){let n=$.current();if(!n)return Promise.reject();let r;if(t){let e=n.getCachedRawOkIdByExternalId(t);if(!e){z.warn(`switchRoom: externalId not found in cache`,t);return}let i=Q.getDeviceIdx(t);r=M.composeParticipantId(e,j.USER,i)}return n.switchRoom(e,r)}async function Zc(e){let t=$.current();return t?t.removeRooms(e):Promise.reject()}function Qc(e){N.statisticsInterval=e;let t=$.current();if(t)return t.updateStatisticsInterval()}function $c(e){c.default.disableLog(!e),z.toggle(e)}function el(e,...t){N.debugLog&&($.debugMessage(e,`[external]`,...t)||z.send(e,`[external]`,...t))}function tl(e,t,...n){N.debugLog&&($.debugMessageWithContext(e,t,`[external]`,...n)||z.send(e,`[external]`,...n))}var nl={list:Pe,get:Fe,getJson:Ie,download:Le,clear:Re,stats:ze};function rl(){let e=[[`Calls SDK ${N.sdkVersion}`,N.toJSON()],[`UserAgent:`,navigator.userAgent],[`Screen resolution:`,`${window.screen.width}x${window.screen.height}`],[`Permissions:`,`Camera: ${E.hasCameraPermission()}, Mic: ${E.hasMicrophonePermission()}`]],t=new Date,n=t.getTime(),r=t.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`});return e.map(e=>({h:r,t:n,l:yn.LOG,d:e}))}async function il(){let e=$.id(),t=$.debugSessionId();if(!t||!e)throw z.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let n=await Fe({sessionId:t});if(n.length===0)throw z.error(`[uploadDebugLogs]`,`No logs found`),Error(`No logs found`);let r=n[0].t,i=n[n.length-1].t;try{return Is?.uploadDebugLogs(e,r,i,JSON.stringify([...rl(),...n]))}catch(e){throw z.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function al(e){let t=$.current();if(t)return t.videoEffect(e)}async function ol(e,t){let n=$.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function sl(e){let t=$.current();t&&await t.setAudioStream(e)}async function cl(e,t=null,n=null){let r=$.current();if(!r)return;let i=n??t?.id,a=null;if(t){let e=r.getCachedRawOkIdByExternalId(t);if(!e)throw Error(`Could not get user id to set animoji svg`);a=M.composeParticipantId(e,j.USER,Q.getDeviceIdx(t))}r.setAnimojiSvg(e,a,i)}function ll(e){let t=$.current();t&&t.setAnimojiFill(e)}async function ul(e=null,t,n=!1){return bl().getWaitingHall(e,t,n)}async function dl(){return bl().getAudienceModeHands()}async function fl(e,t=!1){let n=bl(),r;if(e){let t=n.getCachedRawOkIdByExternalId(e);if(!t){z.warn(`promoteParticipant: externalId not found in cache`,e);return}r=M.composeUserId(t)}return n.promoteParticipant(r,t)}async function pl(e=!1){return bl().requestPromotion(e)}async function ml(e=!1){return bl().acceptPromotion(e)}async function hl(e){return bl().getParticipantListChunk(e)}async function gl(e){return bl().getParticipants(e)}async function _l(e){return bl().feedback(e)}async function vl(e,t,n){return bl(n).enableFeatureForRoles(e,t)}function yl(e){return e?B.get(e)??null:$.current()??B.getFirst()}function bl(e){let t=yl(e);if(!t)throw Error(`Conversation not found`);return t}async function xl(e){await Is.removeHistoryRecords(e)}async function Sl(e){let t=$.current()??B.getFirst();t&&await t.startAsr(e)}async function Cl(e){let t=$.current()??B.getFirst();t&&await t.stopAsr(e)}async function wl(e){let t=$.current()??B.getFirst();t&&await t.requestAsr(e)}async function Tl(e){let t=$.current();return t?t.startUrlSharing(e):Promise.reject()}async function El(){let e=$.current();return e?e.stopUrlSharing():Promise.reject()}async function Dl(e){await B.switchCall(e)}function Ol(){return B.getActiveId()}function kl(){return $.getSyncedTime()}function Al(){return N.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=gn),exports.Api=ks,exports.ApiExternal=Fs,exports.ArrayDequeue=Ps,exports.AuthData=b,exports.BaseLogger=m,exports.CallDirection=Ia,exports.CallType=La,exports.ChatRoomEventType=Ra,exports.ConversationFeature=za,exports.ConversationOption=Ba,exports.DebugMessageType=yn,exports.ExternalIdType=Za,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return Mt}}),exports.FatalError=S,exports.HangupReason=k,exports.HangupType=O,exports.MediaOption=C,exports.MediaTrackKind=A,exports.MediaType=H,exports.MuteState=Ua,exports.ParticipantState=Z,exports.ParticipantStateDataValue=Ns,exports.ParticipantStatus=P,exports.RecordRole=Ms,exports.RoomsEventType=Wa,exports.Signaling=Fa,exports.SignalingCommandType=V,exports.SignalingConnectionType=mr,exports.SignalingNotification=q,exports.TransportTopology=Y,exports.UserRole=qa,exports.UserType=j,exports.VolumeDetector=bo,exports.acceptCall=Zs,exports.acceptPromotion=ml,exports.activateRooms=Yc,exports.addMovie=Gc,exports.addParticipant=rc,exports.addParticipantInternal=ic,exports.authorize=Xs,exports.browser=Rs,exports.callInternal=Ks,exports.callTo=Gs,exports.captureScreen=cc,exports.captureVmoji=lc,exports.changeAudioEffect=ol,exports.changeConversationOptions=Oc,exports.changeDevice=sc,exports.changeParticipantState=hc,exports.changePriorities=mc,exports.changeVideoEffect=al,exports.chatHistory=jc,exports.chatMessage=kc,exports.chatMessageInternal=Ac,exports.createJoinLink=Ic,exports.customData=Mc,exports.customDataInternal=Nc,exports.debug=$c,exports.debugLogs=nl,exports.debugMessage=el,exports.debugMessageWithContext=tl,exports.declineCall=Qs,exports.enableFeatureForRoles=vl,exports.enableVideoSuspend=Ec,exports.enableVideoSuspendSuggest=Dc,exports.feedback=_l,exports.forceRelayPolicy=Bc,exports.getActiveCallId=Ol,exports.getAnonymTokenByLink=Rc,exports.getAudienceModeHands=dl,exports.getInbounds=Ys,exports.getParticipantListChunk=hl,exports.getParticipants=gl,exports.getStreamInfo=Wc,exports.getSyncedTime=kl,exports.getWaitingHall=ul,exports.grantRoles=yc,exports.grantRolesInternal=bc,exports.hangup=nc,exports.init=Ws,exports.joinCall=$s,exports.joinCallByLink=tc,exports.joinCallInternal=ec,exports.muteParticipant=xc,exports.muteParticipantInternal=Sc,exports.pinParticipant=Cc,exports.pinParticipantInternal=wc,exports.processPush=qs,exports.processPushInternal=Js,exports.promoteParticipant=fl,exports.publishStream=Uc,exports.putHandsDown=gc,exports.removeHistoryRecords=xl,exports.removeJoinLink=Lc,exports.removeMovie=qc,exports.removeParticipant=ac,exports.removeParticipantInternal=oc,exports.removeRooms=Zc,exports.requestAsr=wl,exports.requestDisplayLayout=vc,exports.requestPromotion=pl,exports.setAudioEffects=Hs,exports.setAudioStream=sl,exports.setLocalResolution=pc,exports.setLogger=Bs,exports.setMediaModifiers=Tc,exports.setStatisticsInterval=Qc,exports.setVideoEffects=Vs,exports.setVideoStream=uc,exports.setVmoji=Us,exports.setVmojiFill=ll,exports.setVmojiSvg=cl,exports.setVolume=zc,exports.startAsr=Sl,exports.startAudienceConversation=Fc,exports.startConversation=Pc,exports.startStream=Vc,exports.startUrlSharing=Tl,exports.stopAsr=Cl,exports.stopStream=Hc,exports.stopUrlSharing=El,exports.switchCall=Dl,exports.switchRoom=Xc,exports.toggleLocalAudio=fc,exports.toggleLocalVideo=dc,exports.updateDisplayLayout=_c,exports.updateMovie=Kc,exports.updateRooms=Jc,exports.uploadDebugLogs=il,exports.utils=zs,exports.version=Al;
13
+ `)}})}_startMonitorRtpShareInterval(){let e=5e3;if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,e)};this._monitorRtpShareInterval=window.setTimeout(t,e)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}},X=function(e){return e.REMOTE_TRACK_ADDED=`REMOTE_TRACK_ADDED`,e.REMOTE_TRACK_REMOVED=`REMOTE_TRACK_REMOVED`,e.REMOTE_STREAM_SECOND=`REMOTE_STREAM_SECOND`,e.AUDIO_MIX_STALL=`AUDIO_MIX_STALL`,e.REMOTE_DATA_STATS=`REMOTE_DATA_STATS`,e.STATE_CHANGED=`STATE_CHANGED`,e.LOCAL_STATE_CHANGED=`LOCAL_STATE_CHANGED`,e.SIGNALLED_ACTIVE_PARTICIPANTS=`SIGNALLED_ACTIVE_PARTICIPANTS`,e.SIGNALLED_SPEAKER_CHANGED=`SIGNALLED_SPEAKER_CHANGED`,e.SIGNALLED_STALLED_PARTICIPANTS=`SIGNALLED_STALLED_PARTICIPANTS`,e.TOPOLOGY_CHANGED=`TOPOLOGY_CHANGED`,e.NETWORK_STATUS=`NETWORK_STATUS`,e.PEER_CONNECTION_CLOSED=`PEER_CONNECTION_CLOSED`,e.ASR_TRANSCRIPTION=`ASR_TRANSCRIPTION`,e.ANIMOJI_STREAM=`ANIMOJI_STREAM`,e.ANIMOJI_ERROR=`ANIMOJI_ERROR`,e.SCREEN_SHARING_STAT=`SCREEN_SHARING_STAT`,e}({}),ua=class extends x{constructor(e,t,n,r,i=z,a=null,o=null,s=null,c=null){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_topology`,void 0),h(this,`_allocated`,[]),h(this,`_opened`,[]),h(this,`_directTransport`,null),h(this,`_serverTransport`,null),h(this,`_serverSettings`,void 0),h(this,`_dtListeners`,[]),h(this,`_stListeners`,[]),h(this,`_states`,{}),h(this,`_localState`,J.IDLE),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),h(this,`_onFirstMediaSent`,void 0),h(this,`_firstMediaSentProbeStopped`,!1),h(this,`_vadController`,null),h(this,`_updateVadTrack`,()=>{this._vadController?.setSendTrack(this._mediaSource.getSendAudioTrack())}),this._signaling=t,this._mediaSource=n,this._topology=e,this._serverSettings=r,this._debug=i,this._logger=a,this._statAggregator=o,this._codecStatsAggregator=s,this._onFirstMediaSent=c,this.subscribe(this._signaling,K.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_READY,this._updateVadTrack),this._createVad(),this._createAnimojiTransport(),e===Y.SERVER&&(this._serverTransport=this._createServerTransport())}updateSettings(e){this._debug.log(`Update transport settings`,e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(this._debug.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){this._debug.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology===Y.DIRECT&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===Y.SERVER&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,n=!1,r=!1){this._debug.log(`Trying open participant`,{participantIds:e});let i=r;for(let t of e){if(this._opened.indexOf(t)!==-1){this._debug.warn(`The participant [${t}] has already had opened transport`);continue}if(this._allocated.indexOf(t)===-1){this._debug.warn(`The participant [${t}] has no allocated transport`);continue}this._opened.push(t),i=!0}i&&(this._topology===Y.DIRECT&&this._directTransport&&this._directTransport.open(t),this._topology===Y.SERVER&&this._serverTransport&&(this._serverTransport.open(n),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),this._debug.debug(`The transport has been opened`,e))}close(e){let t=this._allocated.indexOf(e),n=this._opened.indexOf(e);t<0&&this._debug.warn(`The participant [${e}] transport has already deallocated`),this._topology===Y.DIRECT&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===Y.SERVER&&(this._serverTransport?.removeParticipant(e),this._setStates([e],J.CLOSED)),n>=0&&this._opened.splice(n,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.stopFirstMediaSentProbe(),this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),N.audioEffects?.destroy(),this._vadController?.destroy(),this._vadController=null,this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}stopFirstMediaSentProbe(){this._firstMediaSentProbeStopped||(this._firstMediaSentProbeStopped=!0,this._directTransport?.stopFirstMediaSentProbe(),this._serverTransport?.stopFirstMediaSentProbe())}holdClose(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._vadController?.destroy(),this._vadController=null,this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}setRemoteHold(e){this._directTransport?.setRemoteHold(e)}getTopology(){return this._topology}isAllocated(e){return this._allocated.indexOf(e)>=0}allocated(){return this._allocated.slice()}opened(){return this._opened.slice()}getState(){return this._topology===Y.SERVER?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){N.vmoji&&t.isMe&&N.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology===Y.SERVER&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let n=e.filter(e=>this._states[e]===t?!1:(this._states[e]=t,!0));n.length&&this._triggerEvent(`STATE_CHANGED`,n,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent(`LOCAL_STATE_CHANGED`,e))}_onSignalingNotification(e){if(e.notification===q.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_handleFirstMediaSent(){this._firstMediaSentProbeStopped||(this.stopFirstMediaSentProbe(),this._onFirstMediaSent?.())}_getFirstMediaSentCallback(){return!this._onFirstMediaSent||this._firstMediaSentProbeStopped?null:this._handleFirstMediaSent.bind(this)}_onTopologyChanged(e){if(e.topology!==this._topology){if(this._debug.log(`Topology changed ${this._topology} -> ${e.topology}`),this._logger?.log(w.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===Y.SERVER&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===Y.DIRECT){let t=e.offerTo||[],n=e.offerToTypes||[],r=e.offerToDeviceIdxs||[],i=t.length&&n.length?M.composeParticipantId(t[0],n[0],r[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){this._debug.error(`Topology changed to DIRECT, but the list of allocated participants is empty`);return}this._allocated.length>1&&this._debug.warn(`Topology changed to DIRECT, but the allocated participants count more then one`);let a=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let e=i===a;this._directTransport=this._createDirectTransport(a,e)}this._opened.indexOf(a)>=0&&this._directTransport.open()}this._triggerEvent(`TOPOLOGY_CHANGED`,this._topology)}}_createDirectTransport(e,t=!1){let n=new Kr(e,t,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator,this._getFirstMediaSentCallback());return this._dtListeners.length>0&&this._debug.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(n.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this,e)),n.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this,e)),n.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),n.addEventListener(`STATE_CHANGED`,this._onDirectTransportChanged.bind(this)),n.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),n.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,Y.DIRECT))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new la(this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator,this._getFirstMediaSentCallback());return this._stListeners.length>0&&this._debug.warn(`The list of server transport listeners is not empty`),this._stListeners=[],this._stListeners.push(e.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this)),e.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this)),e.addEventListener(`AUDIO_MIX_STALL`,this._onServerAudioMixStall.bind(this)),e.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),e.addEventListener(`STATE_CHANGED`,this._onServerTransportChanged.bind(this)),e.addEventListener(`SIGNALLED_ACTIVE_PARTICIPANTS`,this._onTransportActiveParticipants.bind(this)),e.addEventListener(`SIGNALLED_SPEAKER_CHANGED`,this._onTransportSpeakerChanged.bind(this)),e.addEventListener(`SIGNALLED_STALLED_PARTICIPANTS`,this._onTransportStalledParticipants.bind(this)),e.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),e.addEventListener(`REMOTE_STREAM_SECOND`,this._onRemoteStreamSecond.bind(this)),e.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,Y.SERVER)),e.addEventListener(`ASR_TRANSCRIPTION`,this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e===J.CONNECTED&&this._topology===Y.DIRECT&&this._releaseServerTransport(),(e===J.CLOSED||e===J.FAILED)&&(this._releaseDirectTransport(),this._topology===Y.DIRECT)){let e=this._opened.indexOf(t);e>=0&&this._opened.splice(e,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology===Y.DIRECT&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===J.CONNECTED&&this._topology===Y.SERVER&&this._releaseDirectTransport(),(e===J.CLOSED||e===J.FAILED)&&(this._releaseServerTransport(),this._topology===Y.SERVER&&(this._allocated=[],this._opened=[])),this._topology===Y.SERVER&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_SPEAKER_CHANGED`,e)}_onTransportNetworkStatus(e){this._triggerEvent(`NETWORK_STATUS`,e)}_onRemoteStreamSecond(e,t){this._triggerEvent(`REMOTE_STREAM_SECOND`,e,t)}_onPeerConnectionClosed(e){this._triggerEvent(`PEER_CONNECTION_CLOSED`,e)}_onServerAudioMixStall(e){this._topology===Y.SERVER&&this._triggerEvent(`AUDIO_MIX_STALL`,e)}_onRemoteDataStats(e){this._triggerEvent(`REMOTE_DATA_STATS`,e)}_onRemoteTrackAdded(e,t,n){this._triggerEvent(`REMOTE_TRACK_ADDED`,e,t,n)}_onRemoteTrackRemoved(e,t,n){this._triggerEvent(`REMOTE_TRACK_REMOVED`,e,t,n)}_onAsrTranscription(e){this._triggerEvent(`ASR_TRANSCRIPTION`,e)}_onSourceChanged(e){let t=this._mediaSource.getStream();t&&this._animojiSender?.setStream(t),(!e||e.kind===A.audio)&&this._updateVadTrack()}_onAnimojiStream(e,t){this._triggerEvent(`ANIMOJI_STREAM`,e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createVad(){N.vad&&(this._vadController=new N.vad.VadController(this._mediaSource.getSendAudioTrack(),N.vadOptions),this._vadController.setLogger((e,...t)=>z.send(e,...t),`VAD`),this._vadController.init().catch(e=>{z.warn(`[Transport] VAD init failed, continuing without VAD`,e),this._vadController?.destroy(),this._vadController=null}))}_createAnimojiTransport(){if(!N.vmoji)return;this._animojiReceiver=new N.vmoji.AnimojiReceiver((e,t)=>this._onAnimojiStream(e,t),e=>this._onAnimojiStream(e,null),e=>{this._triggerEvent(`ANIMOJI_ERROR`,e)},N.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new N.vmoji.AnimojiSender(e,this._signaling.getPeerId(),N.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:N.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=e=>this._animojiReceiver?.receive(e)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology===Y.SERVER?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(this._logger?.log(w.PAT_WAITING_TIME_ERROR,`noTransport`),this._debug.error(`Cannot get stream waiting time, server transport is not initialized`),0):(this._logger?.log(w.PAT_WAITING_TIME_ERROR,`wrongTopology`),this._debug.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},da=`videochat-epi`,fa=5e3,pa=500,ma=class extends x{constructor(e,t,n=null,r=!1,i=z){super(),h(this,`_previousPerfStatReportTimestamp`,0),h(this,`_previousNetworkStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReport`,null),h(this,`_screenShareStats`,[]),h(this,`_signaling`,void 0),h(this,`_directTopology`,void 0),h(this,`_debug`,void 0),h(this,`_statAggregator`,void 0),h(this,`_handleScreenSharingStat`,e=>{this._screenShareStats.push(e)}),h(this,`_handleTransportStateChanged`,e=>{(this._directTopology&&e===J.CONNECTED||!this._directTopology&&e===J.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())}),this._signaling=t,this._directTopology=r,this._debug=i,this._statAggregator=n,this.subscribe(e,X.REMOTE_DATA_STATS,this._handleStats.bind(this)),this.subscribe(e,X.SCREEN_SHARING_STAT,this._handleScreenSharingStat.bind(this)),this.subscribe(e,X.STATE_CHANGED,this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(da)||``,10);return isNaN(e)?0:e}catch{return 0}}async _handleStats(e){if(!e.inbound||!e.inbound.rtps)return;let t=Date.now();!this._directTopology&&N.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+fa<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+pa<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),N.callStatReportEnabled&&this._previousCallStatReportTimestamp+N.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((e,t)=>(t.kind===`video`&&(e.framesDecoded+=t.framesDecoded||0,e.framesReceived+=t.framesReceived||0),e),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let e=await this._signaling.reportPerfStat(t);localStorage.setItem(da,e.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0)};if(t.timestamp)try{await this._signaling.reportNetworkStat(t)}catch{}}_reportCallStats(e){let t={call_topology:this._directTopology?`D`:`S`,stat_time_delta:0,nack_received:0,pli_received:0,fir_received:0,frames_dropped:0,jitter_video:0,jitter_audio:0,interframe_delay_variance:0,nack_sent:0,pli_sent:0,fir_sent:0,total_audio_samples_received:0,concealed_audio_samples:0,silent_concealed_audio_samples:0,inserted_audio_samples_for_deceleration:0,removed_audio_samples_for_acceleration:0,audio_concealment_events:0,total_audio_energy:0,inbound_video_count:0,inbound_audio_count:0,packets_lost_video:0,packets_sent_video:0,packets_lost_audio:0,packets_sent_audio:0,freeze_count:0,total_freezes_duration:0,rtt:Math.round(e.inbound.transport.currentRoundTripTime*1e3),ss_freeze_count:0,ss_total_freezes_duration:0,local_address:ga(e.inbound.transport.local),local_connection_type:e.inbound.transport.local?.type,network_type:e.inbound.transport.local?.networkType,transport:e.inbound.transport.local?.protocol,remote_address:ga(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let n=!1,r=!1;for(e.inbound.rtps.reduce((e,t)=>(t.kind===`video`?(n=!0,t.framesReceived&&(e.jitter_video=e.jitter_video*e.inbound_video_count/(e.inbound_video_count+1)+t.jitter*1e3/(e.inbound_video_count+1),e.interframe_delay_variance=e.interframe_delay_variance*e.inbound_video_count/(e.inbound_video_count+1)+(t.interframeDelayVariance||0)*1e6/(e.inbound_video_count+1),e.inbound_video_count++),e.frames_dropped+=t.framesDropped||0,e.nack_sent+=t.nackCount,e.pli_sent+=t.pliCount,e.fir_sent+=t.firCount,e.freeze_count+=t.freezeCountDelta||0,e.total_freezes_duration+=t.totalFreezesDurationDelta||0):(r=!0,t.totalSamplesReceived&&(e.jitter_audio=e.jitter_audio*e.inbound_audio_count/(e.inbound_audio_count+1)+t.jitter*1e3/(e.inbound_audio_count+1),e.total_audio_energy=e.total_audio_energy*e.inbound_audio_count/(e.inbound_audio_count+1)+(t.totalAudioEnergy||0)/(e.inbound_audio_count+1),e.inbound_audio_count++),e.total_audio_samples_received+=t.totalSamplesReceived||0,e.inserted_audio_samples_for_deceleration+=t.insertedSamplesForDeceleration||0,e.removed_audio_samples_for_acceleration+=t.removedSamplesForAcceleration||0,e.concealed_audio_samples+=t.concealedSamples||0,e.silent_concealed_audio_samples+=t.silentConcealedSamples||0,e.audio_concealment_events+=t.concealmentEvents||0),e),t),e.outbound.rtps.reduce((e,t)=>(t.kind===`video`?(e.nack_received+=t.nackCount,e.pli_received+=t.pliCount,e.fir_received+=t.firCount,e.packets_sent_video+=t.packetsSent):e.packets_sent_audio+=t.packetsSent,e),t),e.remoteInbound.rtps.reduce((e,t)=>(t.kind===`video`?e.packets_lost_video+=t.packetsLost:e.packets_lost_audio+=t.packetsLost,e),t);this._screenShareStats.length;){let e=this._screenShareStats.pop();e?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=e.freeze_duration)}let i={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(N.simulcast&&(i.is_simulcast=!0),navigator.hardwareConcurrency&&(i.cpu_hardware_concurrency=navigator.hardwareConcurrency),n&&!_a(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!_a(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!_a(t.interframe_delay_variance)&&(i.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(i.freeze_count=t.freeze_count,i.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(i.ss_freeze_count=t.ss_freeze_count,i.ss_total_freezes_duration=t.ss_total_freezes_duration),r&&!_a(t.total_audio_samples_received)){let e=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),n=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),r=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),a=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),o=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),s=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);i.inserted_audio_samples_for_deceleration=va(n/e*1e3),i.removed_audio_samples_for_acceleration=va(r/e*1e3),i.concealed_audio_samples=va(a/e*1e3),i.concealed_silent_audio_samples=va(o/e*1e3),i.concealment_audio_avg_size=va(a/s),i.total_audio_energy=t.total_audio_energy}ha(t,`local_address`,`local_connection_type`,`network_type`,`transport`)&&(i.local_address=t.local_address,i.local_connection_type=t.local_connection_type,i.network_type=t.network_type,i.transport=t.transport),ha(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),o=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);a>0&&(i.video_loss=va(Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video)/a*100)),o>0&&(i.audio_loss=va(Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio)/o*100)),this._statAggregator?.logCallStat(i),N.enableLogPerfStatReport&&this._debug.log(`Sent call stats`,i),this._previousCallStatReport=t}};function ha(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function ga(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function _a(e){return e===void 0}function va(e){return Number.isNaN(e)?0:e}var ya;(function(e){function t(){return{estimatedPerformanceIndex:ma.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:+!!N.asrDataChannel,animojiDataChannelVersion:N.vmoji?N.vmojiOptions.protocolVersion:1,animojiBackendRender:!N.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:N.videoTracksCount,red:!0,audioShare:N.audioShare,fastScreenShare:N.fastScreenShare,videoSuspend:N.videoSuspend,simulcast:N.simulcast,simulcastNativeOrder:!0,consumerFastScreenShare:N.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:N.consumerFastScreenShareQualityOnDemand,transparentAudio:N.transparentAudio}}e.get=t})(ya||(ya={}));var ba=ya,xa={producerScreenTrack:()=>!0,videoTracksCount:()=>N.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>N.movieShare,useParticipantListChunk:()=>N.useParticipantListChunk,useRooms:()=>N.useRooms,vmoji:()=>!!N.vmoji,useCallsToContacts:()=>N.useCallsToContacts,useChatRooms:()=>N.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!N.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>N.enableSessionStateUpdates,addParticipant:()=>N.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>N.waitForAdminInGroupCalls,hold:()=>N.hold},Sa=class{static getFlags(){let e=Object.values(xa),t=0;for(let n=0;n<e.length;n++)e[n]()&&(t|=1<<n);return t.toString(16).toUpperCase()}static parseCapabilities(e){let t=parseInt(e||`0`,16);return Object.keys(xa).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},Ca=63n,wa=16383n,Ta=1073741823,Ea=4611686018427387903n,Da=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=Ca)return new Uint8Array([Number(t)]);if(t<=wa)return new Uint8Array([64|Number(t>>8n),Number(t&255n)]);if(t<=BigInt(Ta))return new Uint8Array([128|Number(t>>24n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);if(t<=Ea)return new Uint8Array([192|Number(t>>56n),Number(t>>48n&255n),Number(t>>40n&255n),Number(t>>32n&255n),Number(t>>24n&255n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);throw RangeError(`Number is too large to encode using varint`)}},Oa=class{decode(e){let t=this.getNumBytesForLengthInteger(e);if(t<0)throw Error(`Invalid length prefix`);if(e.length<t)return null;let n=BigInt(0);switch(t){case 1:n=BigInt(e[0]&63);break;case 2:n=BigInt(e[0]&63)<<8n|BigInt(e[1]);break;case 4:n=BigInt(e[0]&63)<<24n|BigInt(e[1])<<16n|BigInt(e[2])<<8n|BigInt(e[3]);break;case 8:n=BigInt(e[0]&63)<<56n|BigInt(e[1])<<48n|BigInt(e[2])<<40n|BigInt(e[3])<<32n|BigInt(e[4])<<24n|BigInt(e[5])<<16n|BigInt(e[6])<<8n|BigInt(e[7]);break}return n}getNumBytesForLengthInteger(e){let t=e[0]&192;return t===0?1:t===64?2:t===128?4:t===192?8:-1}},ka=class{constructor(e){h(this,`encoder`,void 0),h(this,`compression`,void 0),h(this,`lengthEncoder`,void 0),this.encoder=new TextEncoder,this.lengthEncoder=new Da,this.compression=e??null}encode(e){let t=this.encoder.encode(e);t=this.compress(t);let n=this.lengthEncoder.encode(t.length),r=new Uint8Array(n.length+t.length);return r.set(n),r.set(t,n.length),r}compress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gzipSync(e);case`deflate`:return p.zlibSync(e);case`deflate-raw`:return p.deflateSync(e);default:return e}}},Aa=class{constructor(e){h(this,`decoder`,void 0),h(this,`compression`,void 0),h(this,`lengthDecoder`,void 0),h(this,`buffer`,void 0),h(this,`expectedLength`,void 0),h(this,`offset`,void 0),h(this,`lengthPrefixLength`,void 0),this.decoder=new TextDecoder,this.lengthDecoder=new Oa,this.compression=e??null,this.buffer=new Uint8Array,this.expectedLength=null,this.offset=0}decode(e){let t=[];for(this.buffer=new Uint8Array([...this.buffer,...e]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return t;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return t;let e=this.buffer.subarray(this.offset,this.offset+this.expectedLength);e=this.decompress(e),t.push(this.decoder.decode(e)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return t}readLength(e){if(e.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(e),this.lengthPrefixLength<0)throw Error(`Invalid length prefix`);let t=this.lengthDecoder.decode(e.subarray(0,this.lengthPrefixLength));return t===null?null:Number(t)}decompress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gunzipSync(e);case`deflate`:return p.unzlibSync(e);case`deflate-raw`:return p.inflateSync(e);default:return e}}},ja=class{static isBrowserSupported(){return!(!(`WebTransport`in window&&typeof WebTransport==`function`)||E.browserName()===`Safari`)}constructor(e,t={},n=z){h(this,`onopen`,null),h(this,`onmessage`,null),h(this,`onerror`,null),h(this,`onclose`,null),h(this,`readyState`,WebSocket.CONNECTING),h(this,`webTransport`,null),h(this,`writer`,null),h(this,`url`,void 0),h(this,`options`,void 0),h(this,`compression`,void 0),h(this,`encoder`,void 0),h(this,`decoder`,void 0),h(this,`_debug`,void 0),this._debug=n,this.url=e,this.options=t,this.compression=this.getCompressionTypeFromUrl(e),this.encoder=new ka(this.compression),this.decoder=new Aa(this.compression),this.connect()}async send(e){if(this.readyState!==WebSocket.OPEN){this._debug.warn(`[WebTransport] Attempt to send data before webtransport is open`);return}let t=this.writer;if(!t){this._debug.warn(`[WebTransport] Attempt to send data before stream is ready`);return}try{await t.ready;let n=this.encoder.encode(e);await t.write(n)}catch(e){this.handleStreamError(`send`,e)}}close(e=1e3,t=``){this.readyState===WebSocket.CLOSING||this.readyState===WebSocket.CLOSED||(this.readyState=WebSocket.CLOSING,this.requestNativeClose(e,t))}getCompressionTypeFromUrl(e){try{let t=new URL(e).searchParams.get(`compression`);switch(t){case`gzip`:case`deflate`:case`deflate-raw`:return t;default:return null}}catch(e){return this._debug.log(`[WebTransport] Exception while parsing compression`,e),null}}async connect(){try{let e=new WebTransport(this.url,{...this.options});if(this.webTransport=e,this.observeClosed(e),await e.ready,this.readyState!==WebSocket.CONNECTING)return;this._debug.debug(`[WebTransport] WebTransport connected to `+this.url);let t=await e.createBidirectionalStream();if(this.readyState!==WebSocket.CONNECTING)return;this.writer=t.writable.getWriter(),this.readyState=WebSocket.OPEN,this.emitEvent(`open`,this.onopen,new Event(`open`)),this.readyState===WebSocket.OPEN&&this.readLoop(t.readable)}catch(e){if(!this.webTransport){queueMicrotask(()=>this.fail(`connect`,e));return}this.fail(`connect`,e)}}observeClosed(e){e.closed.then(({closeCode:e,reason:t})=>{this.finishClose(e,t)},e=>{let t=this.readyState===WebSocket.CONNECTING?`connect`:`session`;this.fail(t,e),this.finishClose(1006,``)}).catch(e=>{this._debug.error(`[WebTransport] Failed to process native close`,e)})}async readLoop(e){let t=e.getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e){this.close(1e3,`Stream Closed`);return}if(n)for(let e of this.decoder.decode(n))this.emitEvent(`message`,this.onmessage,new MessageEvent(`message`,{data:e}))}}catch(e){this.handleStreamError(`read`,e)}finally{t.releaseLock()}}fail(e,t){this.readyState===WebSocket.CLOSING||this.readyState===WebSocket.CLOSED||(this.readyState=WebSocket.CLOSING,this._debug.error(`[WebTransport] ${e} failed`,t),this.emitEvent(`error`,this.onerror,this.createErrorEvent(t,e)),this.requestNativeClose(1006,`${e} failed`))}handleStreamError(e,t){let n=typeof t==`object`&&t&&`source`in t?t.source:void 0;if(n===`session`)return;let r=n===void 0&&t instanceof Error&&t.name===`WebTransportError`&&t.message.startsWith(`Session closed`);this.fail(r?`session`:e,t)}requestNativeClose(e,t){if(!this.webTransport){this.finishClose(1006,`Connection Failed`);return}try{this.webTransport.close({closeCode:e,reason:t})}catch(e){this._debug.warn(`[WebTransport] Native close failed synchronously`,e),this.finishClose(1006,`Close Failed`)}}finishClose(e,t){this.readyState!==WebSocket.CLOSED&&(this.writer=null,this.readyState=WebSocket.CLOSED,this.emitEvent(`close`,this.onclose,new CloseEvent(`close`,{code:e,reason:t})))}emitEvent(e,t,n){try{t?.call(this,n)}catch(t){this._debug.error(`[WebTransport] ${e} handler failed`,t)}}createErrorEvent(e,t){let n=new Event(`error`),r=e instanceof Error?e:null;return n.error=e,n.errorInfo={phase:t,name:r?.name,message:r?.message||String(e),stack:r?.stack,readyState:this.readyState,compression:this.compression},n}},Ma=function(e){return e.EMPTY_ENDPOINT=`EMPTY_ENDPOINT`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.ABORTED=`ABORTED`,e}({}),Na=class{constructor(e=z,t){h(this,`handlers`,void 0),h(this,`socket`,null),h(this,`endpoint`,``),h(this,`wtEndpoint`,null),h(this,`peerId`,null),h(this,`lastStamp`,0),h(this,`connectionType`,void 0),h(this,`reconnectCount`,0),h(this,`reconnectTimer`,0),h(this,`doctorTimer`,0),h(this,`forceWebSocket`,!1),h(this,`abortSignal`,void 0),h(this,`manualClose`,!1),h(this,`currentType`,yr.WEBSOCKET),h(this,`_debug`,void 0),this.handlers=t,this._debug=e}get readyState(){return this.socket?.readyState??null}get type(){return this.currentType}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e||null}setPeerId(e){this.peerId=e}setLastStamp(e){this.lastStamp=e}setAbortSignal(e){this.abortSignal=e}resetReconnectCount(){this.reconnectCount=0}connect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING||(e!==vr.RETRY&&(this.forceWebSocket=!1,this.reconnectCount=0),this.manualClose=!1,this.connectionType=e,this._connect())}close(e){this.manualClose=!0,this._disconnect(e),window.clearTimeout(this.reconnectTimer),this.reconnectTimer=0,this.lastStamp=0}async send(e){await this.socket?.send(e)}_connect(){if(this._canUseWebTransport()){this._connectWebTransport();return}this._connectWebSocket()}_connectWebTransport(){if(!this.wtEndpoint){this._connectWebSocket();return}let e=this._buildUrl(this.wtEndpoint,!0);this.currentType=yr.WEBTRANSPORT,this.socket=new ja(e,{congestionControl:`low-latency`},this._debug),this._setSocketHandlers()}_connectWebSocket(){if(!this.endpoint){this.handlers.onFailed({failure:`EMPTY_ENDPOINT`,message:`Unable to connect to the signaling: endpoint is not set`,source:yr.WEBSOCKET,remote:!0});return}let e=this._buildUrl(this.endpoint,!1);this.currentType=yr.WEBSOCKET,this.socket=new WebSocket(e),this._setSocketHandlers()}_setSocketHandlers(){this.socket&&(this.handlers.onConnecting({connectionType:this.connectionType,source:this.currentType}),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor())}_buildUrl(e,t){let n=new URL(e),r=n.searchParams;return r.set(`platform`,N.platform),r.set(`appVersion`,String(N.appVersion)),r.set(`version`,String(N.protocolVersion)),r.set(`device`,N.device),r.set(`capabilities`,Sa.getFlags()),r.set(`clientType`,N.clientType),this.connectionType&&r.set(`tgt`,this.connectionType),this.connectionType===vr.RETRY&&this.lastStamp&&r.set(`recoverTs`,String(this.lastStamp)),N.useParticipantListChunk&&(r.set(`partIdx`,String(N.participantListChunkInitIndex)),N.participantListChunkInitCount!==null&&r.set(`partCount`,String(N.participantListChunkInitCount))),t&&(r.set(`compression`,`deflate-raw`),r.set(`ua`,navigator.userAgent)),this.peerId!==null&&r.set(`peerId`,String(this.peerId)),n.toString()}_canUseWebTransport(){return!this.forceWebSocket&&ja.isBrowserSupported()&&this.wtEndpoint!==null&&N.webtransport}_onOpen(){this._startDoctor(),this.handlers.onOpen()}_onMessage(e){this._startDoctor(),this.handlers.onMessage(e)}_onError(e){this.handlers.onError(e)}_onClose(e){if(this._stopDoctor(),this.handlers.onClose(e),!this.manualClose){if(this.abortSignal?.aborted){this.handlers.onFailed({failure:`ABORTED`,message:`Signaling connection aborted`,source:this.currentType});return}this.forceWebSocket=!0,this._scheduleReconnect(this.currentType===yr.WEBTRANSPORT?0:void 0)}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e)),this.socket=null,this._stopDoctor()}_scheduleReconnect(e=this._getReconnectDelay()){if(this.reconnectCount>=N.signalingReconnectMaxCount){this.handlers.onFailed({failure:`NETWORK_ERROR`,message:`Unable to connect to the signaling: reconnect attempts exhausted`,source:this.currentType});return}this.reconnectCount++,this.handlers.onReconnectScheduled({count:this.reconnectCount,delay:e}),this.reconnectTimer=window.setTimeout(()=>{this.connectionType=vr.RETRY,this._connect()},e)}_getReconnectDelay(){return Math.min(N.signalingReconnectMaxDelay,N.signalingReconnectDelay*2**this.reconnectCount)}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=N.signalingReconnectMaxCount)&&(this.doctorTimer=window.setTimeout(()=>{this.handlers.onConnectionDead(),this.forceWebSocket=!0,this._disconnect(4e3),this._scheduleReconnect(0)},N.waitMessageDelay))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}},Pa=`open`,Fa=10,Ia={CONVERSATION_ENDED:`conversation-ended`,OBSOLETE_CLIENT:`gen.obsoleteClient`,INVALID_TOKEN:`invalid-token`,PARTICIPANT_NOT_FOUND:`participant-not-found`,ILLEGAL_PARTICIPANT_STATE:`illegal-participant-state`,SERVICE_UNAVAILABLE:`service-unavailable`},La={[Ia.CONVERSATION_ENDED]:`conversation-ended`,[Ia.OBSOLETE_CLIENT]:`obsolete-client`,[Ia.INVALID_TOKEN]:`invalid-token`,[Ia.PARTICIPANT_NOT_FOUND]:`participant-not-found`,[Ia.ILLEGAL_PARTICIPANT_STATE]:`illegal-participant-state`,[Ia.SERVICE_UNAVAILABLE]:`service-unavailable`};function Ra(e,t){return e.errorMessage??e.message??e.error??t}var za=new Set([O.CALLER_IS_BLOCKED,O.ENDED,O.NOT_FOUND,O.PARTICIPANT_LIMIT_REACHED,O.SERVICE_UNAVAILABLE]),Ba=class e extends En{static get WAIT_CONNECTION_DELAY(){return N.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return N.waitResponseDelay}get ready(){return!this.disposed&&this.transport.readyState!==null}constructor(e=z,t=null,n=null,r=null,i=null){super(),h(this,`transport`,void 0),h(this,`sequence`,1),h(this,`lastStamp`,0),h(this,`websocketCommandsQueue`,[]),h(this,`datachannelCommandsQueue`,[]),h(this,`incomingCache`,[]),h(this,`responseHandlers`,{}),h(this,`disposed`,!1),h(this,`connectionType`,void 0),h(this,`conversationResolve`,null),h(this,`conversationReject`,null),h(this,`connected`,!1),h(this,`listenersReady`,!1),h(this,`peerId`,null),h(this,`connectionMessageWaitTimer`,0),h(this,`participantIdRegistry`,null),h(this,`producerNotificationDataChannel`,null),h(this,`producerCommandDataChannel`,null),h(this,`producerCommandDataChannelEnabled`,!1),h(this,`producerCommandSerializationService`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_statPings`,void 0),h(this,`_statSignalingCommands`,void 0),this._debug=e,this._logger=t,this._statAggregator=n,this._statPings=r,this._statSignalingCommands=i,this.producerCommandSerializationService=new $n(e),this.transport=new Na(e,{onConnecting:this._onTransportConnecting.bind(this),onOpen:this._onOpen.bind(this),onMessage:this._onMessage.bind(this),onError:this._onError.bind(this),onClose:this._onClose.bind(this),onFailed:this._onTransportFailed.bind(this),onReconnectScheduled:this._onTransportReconnectScheduled.bind(this),onConnectionDead:this._onTransportConnectionDead.bind(this)})}setAbortSignal(e){super.setAbortSignal(e),this.transport.setAbortSignal(e)}setEndpoint(e){this.transport.setEndpoint(e)}setWebTransportEndpoint(e){this.transport.setWebTransportEndpoint(e)}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=e=>{let t=this.participantIdRegistry?.handleMessage(e.data);t&&this._handleMessage(t)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=e=>{this.producerCommandSerializationService.deserializeCommandResponse(e.data).then(e=>{e&&this._handleMessage(e)}).catch(e=>{this._debug.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}async connect(e){return new Promise((t,n)=>{if(this.transport.readyState!==null&&this.transport.readyState<WebSocket.CLOSING){this._logger?.log(w.SOCKET_ACTION,`already_opened`),n(Error(`Socket already opened`));return}this.conversationResolve=e=>{t(e),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=e=>{n(e),this.conversationResolve=null,this.conversationReject=null},this.connectionType=e,this.transport.connect(e)})}getNextCommandSequenceNumber(){return this.sequence}hangup(e){return this._send(V.HANGUP,{reason:e},!1)}async sendCandidate(e,t){return this._send(V.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(V.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,n){let r=Object.assign({sdp:t},n);return this._send(V.TRANSMIT_DATA,{participantId:e,data:r},!0,Fa)}async acceptCall(e){return this._send(V.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(V.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Fa)}async changeParticipantState(e,t){let n={participantState:{state:e}};return t&&(n.participantId=t),this._sendRaw(V.CHANGE_PARTICIPANT_STATE,n)}async hold(e){let t=ba.get();return this._send(V.HOLD,{hold:e,capabilities:e?void 0:t})}async putHandsDown(){return this._send(V.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(V.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(V.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(V.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let n={capabilities:t};return e&&(n.description=e.sdp),this._send(V.ALLOCATE_CONSUMER,n)}async acceptProducer(e,t,n){let r={description:e.sdp,sessionId:n};return t.length&&(r.ssrcs=t),this._send(V.ACCEPT_PRODUCER,r)}async changePriorities(e){return this._send(V.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(V.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(V.ADD_MOVIE,e)}async updateMovie(e){return this._send(V.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(V.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(V.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(V.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(V.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(V.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(V.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(V.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(V.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(V.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(V.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(V.RECORD_PUBLISH,e)}async getRecordStatus(){return this._send(V.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(V.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(V.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(V.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(V.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(V.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(V.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(V.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(V.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,n){let r={participantId:e,roles:t};return n&&(r.revoke=!0),this._sendRaw(V.GRANT_ROLES,r)}async muteParticipant(e,t,n,r=null){return this._sendRaw(V.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:n,roomId:r})}async enableFeatureForRoles(e,t){return this._sendRaw(V.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,n){let r={participantId:e,roomId:n};return t&&(r.unpin=!0),this._sendRaw(V.PIN_PARTICIPANT,r)}async updateMediaModifiers(e){return this._send(V.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(V.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(V.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(V.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(V.CHANGE_OPTIONS,{options:e})}async getWaitingHall(e=null,t,n=!1){let r={};return e&&(r.fromId=e),t&&(r.count=t),n&&(r.backward=n),this._send(V.GET_WAITING_HALL,r)}async promoteParticipant(e,t=!1){let n={};return e&&(n.participantId=e),t&&(n.demote=t),this._sendRaw(V.PROMOTE_PARTICIPANT,n)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(V.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(V.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(V.FEEDBACK,{key:e})}async getHandQueue(){return this._send(V.GET_HAND_QUEUE)}dispose(e=new Tn){this._terminate(e)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(V.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(V.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(V.ASR_START,e)}async stopAsr(e){return this._send(V.ASR_STOP,e)}async requestAsr(e){return this._send(V.REQUEST_ASR,{request:e},!1)}async _send(e,t={},n=!0,r=0){if(t.participantId){let e=M.decomposeParticipantId(t.participantId),n=M.decomposeId(e.compositeUserId);t=Object.assign({},t,{participantId:n.id,participantType:n.type}),e.deviceIdx&&(t.deviceIdx=e.deviceIdx)}return this._sendRaw(e,t,n,r)}async _sendRaw(e,t={},n=!0,r=0){let i=t=>{if(this.disposed)throw new Tn(e);if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===Pa&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(this.transport.readyState===null){this._logger?.log(w.SOCKET_ACTION,`not_opened`),this._debug.warn(`[signaling] socket is not opened`),t.reject(Error(`Socket not opened [${e}]`),!0);return}this.transport.readyState>WebSocket.OPEN&&(this._logger?.log(w.SOCKET_ACTION,`invalid_state`),this._debug.warn(`[signaling] socket is not opened, state ${this.transport.readyState}`)),this.websocketCommandsQueue.push(t),this.transport.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((a,o)=>{let s=(t,n=!1)=>{!r||n?o(t):(this._debug.debug(`[signaling] resending a signaling message`,e,u.sequence),r--,i(u))},c=this.sequence++,l=`${e}_${c}`;G.setMark(l);let u={sequence:c,name:e,statMarkName:l,params:t,responseTimer:0,needResponse:n,resolve:a,reject:s};i(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===V.UPDATE_DISPLAY_LAYOUT||e===V.REPORT_PERF_STAT||e===V.REPORT_SHARING_STAT||e===V.REQUEST_ASR||e===V.ENABLE_VIDEO_SUSPEND||e===V.ENABLE_VIDEO_SUSPEND_SUGGEST||e===V.REPORT_NETWORK_STAT||e===V.CHANGE_SIMULCAST:!1}_onOpen(){this._debug.debug(`[signaling] socket opened`),this._logger?.log(w.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._logTransportStat(this.connectionType===vr.RETRY?br.RECONNECTED:br.CONNECTED)}_onMessage(e){if(e.data===`ping`){this._statPings?.mark(this._getSocketType()),this._markTransportStat(br.FAILED_PINGS),R.onSignalingMessage(e.data),this.transport.readyState===WebSocket.OPEN&&this.transport.send(`pong`).catch(e=>this._debug.warn(`[signaling] unable to send pong`,e));return}try{let t=JSON.parse(e.data);R.onSignalingMessage(t),this._handleMessage(t)}catch(t){this._logger?.log(w.SOCKET_ACTION,`parse_error`),this._debug.error(`[signaling] unable to parse message`,t,e.data)}}_handleMessage(e){switch(e.type){case`notification`:this._attachNotificationCallError(e),e.notification===`connection`?(this._debug.debug(`[signaling] signaling connected`,e),this.connected=!0,this.transport.resetReconnectCount(),this.transport.setEndpoint(e.endpoint),e.peerId&&this.peerId!==e.peerId.id&&(this.peerId=e.peerId.id,this.transport.setPeerId(e.peerId.id)),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat(br.RESTART),this._triggerEvent(K.RECONNECT,e),e.conversation.topology&&this._triggerEvent(K.NOTIFICATION,{type:`notification`,notification:q.TOPOLOGY_CHANGED,topology:e.conversation.topology}),this._resolvePendingRecordCommands(e)),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===q.ACCEPTED_CALL&&e.peerId.id===this.peerId&&e.peerId.type===`WEB_TRANSPORT`||this._handleMessage(e)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(K.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:this._logger?.log(w.SOCKET_ACTION,`unknown_message`),this._debug.warn(`[signaling] unhandled message`,e)}e.stamp&&(this.lastStamp=e.stamp,this.transport.setLastStamp(e.stamp))}_handleErrorMessage(e){this._logger?.log(w.SOCKET_ACTION,`error-${e.error}`);let t=this._getSocketType(),n=e.error?this._createSignalingCallError(e.error,e.errorCode,t):void 0,r=Ra(e,`Unknown signaling error`);switch(this._debug.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case Ia.SERVICE_UNAVAILABLE:let i=new k(O.SERVICE_UNAVAILABLE,{callError:n,message:r,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(K.NOTIFICATION,{notification:q.CLOSED_CONVERSATION,callError:n,reason:O.SERVICE_UNAVAILABLE});break;case Ia.CONVERSATION_ENDED:this.conversationReject?this.conversationReject(new k(e.reason||S.SIGNALING_FAILED,{callError:n,message:r,remote:!0})):this._triggerEvent(K.NOTIFICATION,{notification:q.CLOSED_CONVERSATION,callError:n,reason:e.reason});break;case Ia.ILLEGAL_PARTICIPANT_STATE:case Ia.PARTICIPANT_NOT_FOUND:this._throwError(new k(S.SIGNALING_FAILED,{callError:n,message:r,remote:!0}));break;case Ia.OBSOLETE_CLIENT:this.conversationReject?.(new k(e.reason||O.OBSOLETE_CLIENT,{callError:n,message:r,remote:!0}));break;case Ia.INVALID_TOKEN:default:if(e.sequence||t===yr.WEBTRANSPORT)break;if(this.connected)this._throwError(new k(e.reason||S.SIGNALING_FAILED,{callError:n??{scope:`unknown`,description:`signaling-unrecognized-error`},message:r,remote:!0}));else if(!e.sequence){let t=new k(e.reason||S.SIGNALING_FAILED,{callError:n??{scope:`unknown`,description:`signaling-unrecognized-error`},message:r,remote:!0});this.conversationReject?.(t),this.dispose(t)}}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(K.FAILED,e)}_onError(e){this._logger?.log(w.SOCKET_ACTION,`error`),this._debug.error(`[signaling] signaling error`,e),this._logTransportStat(br.FAILED_EXCEPTIONS,{string_value:this._serializeErrorEvent(e)})}_serializeErrorEvent(e){let t=e,n=t.error instanceof Error?t.error:null;return JSON.stringify({eventType:e.type,socketType:this._getSocketType(),readyState:this.transport.readyState,errorName:n?.name||t.errorInfo?.name,errorMessage:n?.message||t.errorInfo?.message||t.message,errorStack:n?.stack||t.errorInfo?.stack,errorInfo:t.errorInfo})}_onClose(e){this._logger?.log(w.SOCKET_ACTION,`closed`),this._debug.debug(`[signaling] connection closed`,{code:e.code,reason:e.reason}),this.connected=!1}_terminate(e){if(this.disposed)return!1;this.disposed=!0,this.transport.close(),this._stopWaitConnectionMessage();let t=[...this.websocketCommandsQueue,...this.datachannelCommandsQueue,...Object.values(this.responseHandlers)],n=this.conversationReject;return this.websocketCommandsQueue=[],this.datachannelCommandsQueue=[],this.responseHandlers={},this.incomingCache=[],this.conversationResolve=null,this.conversationReject=null,this.connected=!1,this.listenersReady=!1,this.lastStamp=0,this.producerNotificationDataChannel&&(this.producerNotificationDataChannel.onmessage=null,this.producerNotificationDataChannel=null),this.producerCommandDataChannel&&(this.producerCommandDataChannel.onmessage=null,this.producerCommandDataChannel=null),super.setAbortSignal(void 0),this.transport.setAbortSignal(void 0),t.forEach(t=>{window.clearTimeout(t.responseTimer),t.reject(e instanceof Tn?new Tn(t.name):e,!0)}),n?.(e),!0}_fail(e){this._terminate(e)&&this._throwError(e)}_isRecordCommand(e){return e===V.RECORD_START||e===V.RECORD_STOP}_resolvePendingRecordCommands(e){if(!N.waitForRecordResponse)return;let t=Object.values(this.responseHandlers).filter(e=>this._isRecordCommand(e.name));if(t.length===0)return;let n=new Map;n.set(null,!!e.conversation?.recordInfo);for(let t of e.rooms?.rooms??[])t.id!==void 0&&n.set(t.id,!!t.recordInfo);for(let e of t){let t=e.params.roomId??null,r=n.get(t)??!1,i=e.name===V.RECORD_START;window.clearTimeout(e.responseTimer),delete this.responseHandlers[e.sequence],this._debug.debug(`[signaling] resolve pending record command [${e.sequence}] via reconnect state`),i===r?e.resolve({type:`response`,sequence:e.sequence,response:e.name}):e.reject(Error(`Recording state mismatch`),!0)}}_handleCommandResponse(t,n){if(!Object.hasOwn(this.responseHandlers,n.sequence)){if(n.participants)for(let e of n.participants)this._triggerEvent(K.NOTIFICATION,{...n,notification:q.PARTICIPANT_ADDED,type:`notification`,participant:e});return}let r=this.responseHandlers[n.sequence];window.clearTimeout(r.responseTimer);let i=G.measureMark(r.statMarkName);i!==null&&this._statSignalingCommands?.mark(r.name,i,this._getSocketType()),this._debug.debug(`[signaling] command response [${n.sequence}]`,n),t?(delete this.responseHandlers[n.sequence],r.resolve(n)):n.type===`error`?(delete this.responseHandlers[n.sequence],this._logger?.log(w.SOCKET_ACTION,`response-error`),r.reject(Error(Ra(n,`Response error [${r.name}]`)),!0)):this.transport.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],this._logger?.log(w.SOCKET_ACTION,`response-timeout`),r.reject(Error(Ra(n,`Response timeout [${r.name}]`)))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(t,n),e.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(this._debug.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Pa){t.reject(Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}t.needResponse?this._startResponseTimer(t):this._resolveCommandWithoutResponse(t);let e=this._serializeBinary(t);e!==null&&this.producerCommandDataChannel.send(e)}else{if(this.transport.readyState!==WebSocket.OPEN){t.reject(Error(`Invalid state or socket already closed`));continue}t.needResponse&&this._startResponseTimer(t),this.transport.send(this._serializeJson(t)).then(()=>{t.needResponse||this._resolveCommandWithoutResponse(t)},e=>{window.clearTimeout(t.responseTimer),delete this.responseHandlers[t.sequence],t.reject(e,!0)})}}}_startResponseTimer(t){t.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:t.name,sequence:t.sequence,type:`timeout`}),e.WAIT_RESPONSE_DELAY),this.responseHandlers[t.sequence]=t}_resolveCommandWithoutResponse(e){e.resolve({type:`response`,sequence:e.sequence,response:e.name})}_serializeBinary(e){switch(e.name){case V.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case V.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case V.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case V.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case V.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case V.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case V.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case V.CHANGE_SIMULCAST:return this.producerCommandSerializationService.serializeChangeSimulcast(e.sequence,e.params)}return this._debug.warn(`[signaling] cannot get binary data for data channel command: `+e.name),null}_serializeJson(e){let t;t=e.name===V.UPDATE_DISPLAY_LAYOUT?this._convertDisplayLayout(e.params):e.params;let n=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(n)}_convertDisplayLayout(e){let t=e,n={};for(let e in t)Object.hasOwn(t,e)&&(n[e]=kn(t[e]));return{layouts:n}}_waitConnectionMessage(){let t=this._getSocketType();this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new k(S.SIGNALING_FAILED,{callError:{scope:`network`,source:t,code:`timeout`,description:`connection-timeout`},message:`Unable to connect to the signaling: connection timeout`,remote:!0}))},e.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_onTransportConnecting(e){let t=e.connectionType===vr.RETRY?br.RECONNECTED:br.CONNECTED;this._markTransportStat(t,e.source)}_onTransportFailed(e){switch(e.failure){case Ma.EMPTY_ENDPOINT:this.conversationReject?.(new k(S.SIGNALING_FAILED,{callError:{scope:`internal`,code:`configuration`,description:`signaling-endpoint-missing`},message:e.message,remote:e.remote}));break;case Ma.NETWORK_ERROR:this._fail(new k(O.NETWORK_ERROR,{callError:{scope:`network`,source:e.source,code:`reconnect-exhausted`,description:`connection-failed`}}));break;case Ma.ABORTED:this._debug.debug(`[signaling] aborted reconnect`),this._fail(new k(O.CANCELED));break}}_onTransportReconnectScheduled(e){this.connectionType=vr.RETRY,this._debug.log(`[signaling] reconnect signaling after ${e.delay}ms (${e.count})`),this._logger?.log(w.SOCKET_ACTION,`reconnect`)}_onTransportConnectionDead(){this._debug.warn(`[signaling] socket is dead, trying to reconnect`),this._logTransportStat(br.FAILED_PINGS)}_attachNotificationCallError(e){e.callError||!e.reason||e.reason===O.FAILED||e.reason===O.UNKNOWN_ERROR||!za.has(e.reason)&&!e.errorCode||(e.callError={scope:`server`,source:this._getSocketType(),code:e.errorCode||`protocol`,description:String(e.reason)})}_createSignalingCallError(e,t,n){let r=La[e];if(r)return{scope:`server`,source:n,code:t??`protocol`,description:r}}_getSocketType(){return this.transport.type}_markTransportStat(e,t=this._getSocketType()){let n=xr[e][t];G.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=xr[e][n];this._statAggregator?.logEventualStat({name:r,...t})}},Va=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(Va||{}),Ha=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(Ha||{}),Ua=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(Ua||{}),Wa=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(Wa||{}),Ga=function(e){return e.REQUIRE_AUTH_TO_JOIN=`REQUIRE_AUTH_TO_JOIN`,e.AUDIENCE_MODE=`AUDIENCE_MODE`,e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.ADMIN_IS_HERE=`ADMIN_IS_HERE`,e.ASR=`ASR`,e.FEEDBACK=`FEEDBACK`,e.RECURRING=`RECURRING`,e}(Ga||{});function Ka(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function qa(e,t){let n=new Set(e);for(let[e,r]of Object.entries(t))r?n.add(e):n.delete(e);return Array.from(n)}var Ja=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(Ja||{}),Z=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(Z||{}),Ya=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(Ya||{}),Xa=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(Xa||{});function Za(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var Qa=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}(Qa||{});function $a(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var eo;(function(e){function t(e){let t=e?.transport??e?.lastEffective??P.WAITING,n={transport:t,sessionState:e?.sessionState,sessionStateApplicable:e?.sessionStateApplicable??!1,sessionStateConnectedBySpeaker:e?.sessionStateConnectedBySpeaker??!1,lastEffective:e?.lastEffective??t};return n.lastEffective=r(n),n}e.create=t;function n(e){return e===J.CONNECTED?P.CONNECTED:e===J.CONNECTING||e===J.OPENED?P.CONNECTING:e===J.RECONNECTING?P.RECONNECT:null}e.fromTransportState=n;function r(e){return[P.HANGUP,P.ERROR,P.ONHOLD].includes(e.transport)?e.transport:e.sessionStateApplicable&&e.sessionState?.connected===!1?e.transport===P.RECONNECT?P.RECONNECT:e.sessionStateConnectedBySpeaker&&e.transport===P.CONNECTED?P.CONNECTED:P.CONNECTING:e.transport}e.computeEffective=r;function i(e,t,n=!1){return e.sessionState=t,e.sessionStateConnectedBySpeaker=t?.connected===!1&&n,s(e)}e.setSessionState=i;function a(e,t){return e.transport=t,t!==P.CONNECTED&&(e.sessionStateConnectedBySpeaker=!1),s(e)}e.setTransport=a;function o(e,t){return e.sessionStateApplicable=t,t||(e.sessionStateConnectedBySpeaker=!1),s(e)}e.setSessionStateApplicable=o;function s(e){let t=r(e);return e.lastEffective===t?{status:t,shouldNotify:!1}:(e.lastEffective=t,{status:t,shouldNotify:!0})}})(eo||(eo={}));var to=eo,no=function(e){return e.USER=`USER`,e.ANONYM=`ANONYM`,e.GROUP=`GROUP`,e}({}),Q;(function(e){function t(e){return e.length?typeof e[0]==`object`?e:e.map(e=>n(e)):[]}e.fromIds=t;function n(e,t=`USER`,n=0){return{id:e,type:t,deviceIdx:n}}e.fromId=n;function r(e,t=!0,n=!1){let r=t?e.decorativeExternalUserId:e.externalId,a=e.deviceIdx??0;if(r)return i(r,a);if(n&&t&&e.externalId)return i(e.externalId,a)}e.fromSignalingParticipant=r;function i(e,t=0){let n=e.type===`ANONYM`?`ANONYM`:`USER`;return{id:e.id,type:n,deviceIdx:t}}e.fromSignaling=i;function a(e){return e.id}e.toSignaling=a;function o(e){let t=e.deviceIdx||0;return`{"id":"${e.id}","type":"${e.type}","deviceIdx":${t}}`}e.toString=o;function s(e,t=`USER`,r=0){return o(n(e,t,r))}e.fromIdToString=s;function c(e){try{return JSON.parse(e)}catch{throw Error(`Failed to parse ExternalId from string '${e}'`)}}e.fromString=c;function l(e,t){return e.id===t.id&&e.type===t.type&&e.deviceIdx===t.deviceIdx}e.compare=l;function u(e){return e?.deviceIdx||0}e.getDeviceIdx=u})(Q||(Q={}));function ro(e){try{return btoa(JSON.stringify(e))}catch(t){z.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function io(e){try{return JSON.parse(atob(e))}catch(t){z.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var ao=(e,t)=>M.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function oo(e){if(e.conversation?.muteStates)return e.conversation.muteStates;if(e.muteState&&e.muteOptions)return e.muteOptions.reduce((t,n)=>(t[n]=e.muteState,t),{})}function so(e,t){switch(e){case C.AUDIO:return!!t.isAudioEnabled;case C.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case C.VIDEO:return!!t.isVideoEnabled;case C.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function co(e,t){return M.objectReduce(e,(e,n,r)=>{switch(n){case Ja.MUTE:case Ja.MUTE_PERMANENT:so(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function lo(e){let{muteStates:t={},mediaSettings:n}=e;return co(t,n)}function uo(e,t){let n=e.conversation.participants.find(t=>M.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return co(t,r)}function fo(e){if(!e)return null;let t=Array.from(new Set((e.urls??[]).map(e=>e.trim()).filter(e=>e.length>0)));return t.length?{...e,urls:t}:null}function po(e,t){let n=[],r=fo(e),i=fo(t);if(r&&n.push(r),i){let e=[...i.urls];e.push(`${e[e.length-1]}?transport=tcp`),n.push({...i,urls:e})}return n}function mo(e,t){let n=new Uint8Array(t),r=0,i=0;for(;r<e.length&&i<t;){let a=e[r++],o=a>>4,s=a&15;if(o===15){let t;do t=e[r++],o+=t;while(t===255)}for(let a=0;a<o&&!(i>=t);a++)n[i++]=e[r++];if(r>=e.length||i>=t)break;let c=e[r]|e[r+1]<<8;if(r+=2,s===15){let t;do t=e[r++],s+=t;while(t===255)}s+=4;let l=i-c;for(let e=0;e<s&&!(i>=t);e++)n[i++]=n[l+e]}return n}var ho=class{constructor(e,t=z,n=null){h(this,`_fixNoPacketsApplied`,!1),h(this,`_fixNoPacketsChecked`,!1),h(this,`_fixTooManyPacketsApplied`,!1),h(this,`_fixTooManyPacketsSucceeded`,!1),h(this,`_fixTooManyPacketsFailed`,!1),h(this,`_fixTooManyPacketsTime`,void 0),h(this,`_mediaSource`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_lastPacketsSent`,void 0),h(this,`_lastPacketsSentTime`,void 0),h(this,`_toggleAudioPromise`,null),h(this,`_fixNoPacketsAppliedVideo`,!1),this._mediaSource=e,this._debug=t,this._logger=n}_fixAudioDeviceNoPackets(e){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,this._logger?.log(w.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&e.packetsSent>0&&(this._fixNoPacketsApplied=!0,this._logger?.log(w.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (no packets)`),this._toggleAudioPromise=this._mediaSource.toggleAudio(E.getMicrophonePermissionState()!==`denied`),this._toggleAudioPromise.catch(()=>void 0))}}_fixAudioDeviceTooManyPackets(e){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let t=Date.now();if(!this._lastPacketsSentTime)e.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent);else if(t-this._lastPacketsSentTime>500){let n=(e.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent,this._fixTooManyPacketsApplied?n>75?(this._debug.log(`[AudioFix] Failed to fix RV`),this._logger?.log(w.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(this._debug.log(`[AudioFix] Fixed RV`),this._logger?.log(w.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,this._logger?.log(w.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (too many packets)`),this._mediaSource.toggleAudio(!0).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (too many packets)`,e)}),this._fixTooManyPacketsTime=t)}}fix(e){if(!this._mediaSource)return;let t=e.find(e=>e.kind===A.audio);t&&(this._fixAudioDeviceNoPackets(t),this._fixAudioDeviceTooManyPackets(t))}fixVideo(e){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let t=e.find(e=>e.kind===A.video);t&&!t.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.mediaSettings.isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (no packets): video restart`,e)}))}},go=class{constructor(e,t=!1,n=z,r=null){h(this,`_audioElement`,null),h(this,`_audioTracks`,new Map),h(this,`_allowMultipleTracks`,void 0),h(this,`_volume`,1),h(this,`_features`,{setSinkId:!!Audio.prototype.setSinkId}),h(this,`_statFirstMediaReceived`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t,this._debug=n,this._logger=r}add(e,t){this._allowMultipleTracks||this._clearTracks();let n=this._audioTracks.get(e);n&&n!==t&&(this._removeTrackFromAudioElement(n),n.stop()),this._audioTracks.set(e,t),this._audioElement?this._addTrackToAudioElement(t):this._initAudioElement()}remove(e,t){let n=this._audioTracks.get(e);if(!n){t.stop();return}if(n!==t){t.stop();return}if(!this._allowMultipleTracks){this.destroy();return}this._removeTrackFromAudioElement(t),t.stop(),this._audioTracks.delete(e),this._audioTracks.size||this.destroy()}get volume(){return this._volume}set volume(e){this._volume=Math.max(0,Math.min(1,e)),this._audioElement&&(this._audioElement.volume=this._volume)}destroy(){!this._audioElement&&!this._audioTracks.size||(this._stopAudioElement(),this._audioElement=null,this._audioTracks.clear())}async changeOutput(){try{if(!this._features.setSinkId)throw Error(`Feature "setSinkId" is not supported`);if(!this._audioElement)return;let e=E.getSavedOutput();e&&await this._audioElement.setSinkId?.(e.deviceId)}catch(e){throw this._logger?.log(w.ERROR,`change_output`),this._debug.error(`[audio] Output change failed`,e),e}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(N.muteMode)return;let e=this._getTracks();if(!e.length)return;let t=E.browserName()!==`Safari`||E.isMobile()||N.safariAudioElement,n=document.createElement(t?`audio`:`video`);n.muted=!1,n.volume=this._volume,n.preload=`auto`;let r=()=>{this._debug.warn(`[audio] Error on play audio`),R.onAutoplayError()},i=e=>{this._debug.debug(`[audio] Play audio`),n.srcObject=null,n.srcObject=new MediaStream(e),n.load();let t=n.play();t&&t.catch(r)},a=()=>{this._debug.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?i(e):this._debug.warn(`[audio] Broken audio tracks`)};n.onpause=a,n.onstalled=a,n.onerror=a,n.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(e),this._audioElement=n;let o=E.getSavedOutput()?.deviceId;o&&n.setSinkId?.(o).catch(e=>{this._debug.warn(`[audio] Failed to set output device '${o}'`,e)})}_stopAudioElement(){this._audioElement&&(this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_addTrackToAudioElement(e){if(!this._audioElement)return;this._debug.debug(`[audio] Adding track ${e}`);let t=this._audioElement.srcObject;t||(t=new MediaStream,this._audioElement.srcObject=t),t.addTrack(e)}_removeTrackFromAudioElement(e){this._audioElement?.srcObject&&(this._debug.debug(`[audio] Removing track ${e}`),this._audioElement.srcObject.removeTrack(e))}_clearTracks(){for(let e of this._audioTracks.values())this._removeTrackFromAudioElement(e),e.stop();this._audioTracks.clear()}};function _o(e,t){e||yo(t,`response-empty`),e.id||yo(t,`id-empty`),e.endpoint||yo(t,`endpoint-empty`),!vo(e.stun_server)&&!vo(e.turn_server)&&yo(t,`ice-servers-empty`)}function vo(e){return Array.isArray(e?.urls)&&e.urls.length>0}function yo(e,t){let n=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),r=e===`fastStart`||e===`fastJoin`;throw new k(r?e===`fastStart`?O.FAST_START_ERROR:O.FAST_JOIN_ERROR:O.UNKNOWN_ERROR,{message:`Invalid ${e} response: ${t}`,callError:r?{scope:`external`,source:`api`,code:`invalid-response`,description:`${n}-${t}`}:{scope:`server`,source:`api`,code:`invalid-response`,description:`${n}-${t}`}})}var bo=90,xo=3,So=class extends x{constructor(e=z){super(),h(this,`_lastMemoryStat`,{percent:0,bytes:0}),h(this,`_debug`,void 0),this._debug=e}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(e=>{e.userId=(typeof e.userId==`string`&&t[e.userId]||null)?.externalId}),R.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),n=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>bo?this._debug.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=xo)&&(this._debug.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},Co=class{constructor({api:e,debug:t,getParticipants:n,isMe:r,updateDisplayLayout:i}){h(this,`_api`,void 0),h(this,`_debug`,void 0),h(this,`_getParticipants`,void 0),h(this,`_isMe`,void 0),h(this,`_updateDisplayLayout`,void 0),h(this,`_requestedLayouts`,{}),h(this,`_uncertainLayouts`,{}),h(this,`_pendingRequests`,null),h(this,`_pendingPromises`,[]),h(this,`_lastRequests`,null),h(this,`_timer`,null),h(this,`_inFlight`,!1),h(this,`_lastFlushAt`,null),h(this,`_generation`,0),h(this,`_forceNextFlush`,!1),this._api=e,this._debug=t,this._getParticipants=n,this._isMe=r,this._updateDisplayLayout=i}request(e){this._pendingRequests=e.slice(),this._lastRequests=e.slice();let t=new Promise((e,t)=>{this._pendingPromises.push({resolve:e,reject:t})});return this._schedule(),t}resend(){this._lastRequests&&(this._pendingRequests=this._lastRequests.slice(),this._forceNextFlush=!0,this._schedule())}cleanupParticipant(e){for(let t of Object.keys(this._requestedLayouts))Nn(t).participantId===e&&delete this._requestedLayouts[t];for(let t of Object.keys(this._uncertainLayouts))Nn(t).participantId===e&&delete this._uncertainLayouts[t]}clear(){this._generation++,this._timer!==null&&(window.clearTimeout(this._timer),this._timer=null),this._pendingPromises.forEach(({resolve:e})=>e()),this._requestedLayouts={},this._uncertainLayouts={},this._pendingRequests=null,this._pendingPromises=[],this._lastRequests=null,this._inFlight=!1,this._lastFlushAt=null,this._forceNextFlush=!1}_schedule(){if(this._inFlight||this._timer!==null)return;let e=this._lastFlushAt===null?0:Math.max(0,N.requestDisplayLayoutThrottleMs-(Date.now()-this._lastFlushAt));this._timer=window.setTimeout(()=>{this._timer=null,this._flush()},e)}async _flush(){if(this._inFlight||!this._pendingRequests)return;this._inFlight=!0;let e=this._generation,t=this._pendingRequests,n=this._pendingPromises;this._pendingRequests=null,this._pendingPromises=[];let r={};try{r=this._getRequestLayouts(t);let i=this._forceNextFlush||Object.keys(this._uncertainLayouts).length>0;this._forceNextFlush=!1;let a=this._getDiff(r,i);a.length&&await this._updateDisplayLayout(a),e===this._generation&&(this._requestedLayouts=r,this._uncertainLayouts={}),n.forEach(({resolve:e})=>e())}catch(t){e===this._generation?(this._uncertainLayouts={...this._uncertainLayouts,...r},n.forEach(({reject:e})=>e(t))):n.forEach(({resolve:e})=>e())}finally{e===this._generation&&(this._lastFlushAt=Date.now(),this._inFlight=!1,this._pendingRequests&&this._schedule())}}_getRequestLayouts(e){let t={},n=this._getParticipants();for(let r of e){let e=typeof r.uid==`object`?r.uid:Q.fromId(r.uid),i=this._api.getCachedOkIdByExternalId(e);if(!i){this._debug.log(`Unknown participant external ID ${typeof r.uid==`object`?Q.toString(r.uid):r.uid}`);continue}if(!n[i]&&!this._isMe(i))continue;let a=Mn({participantId:i,mediaType:r.mediaType,streamName:r.streamName});t[a]={uid:r.uid,mediaType:r.mediaType,width:r.width,height:r.height,fit:r.cover?`cv`:`cn`,...r.priority===void 0?{}:{priority:r.priority},...r.streamName===void 0?{}:{streamName:r.streamName}}}return t}_getDiff(e,t=!1){let n=[];if(t){let t={...this._requestedLayouts,...this._uncertainLayouts};n.push(...Object.values(e));for(let[r,i]of Object.entries(t))e[r]||n.push({uid:i.uid,mediaType:i.mediaType,stopStream:!0,...i.streamName===void 0?{}:{streamName:i.streamName}});return n}for(let[t,r]of Object.entries(e)){let e=this._requestedLayouts[t];(!e||this._isChanged(e,r))&&n.push(r)}for(let[t,r]of Object.entries(this._requestedLayouts))e[t]||n.push({uid:r.uid,mediaType:r.mediaType,stopStream:!0,...r.streamName===void 0?{}:{streamName:r.streamName}});return n}_isChanged(e,t){let n=e,r=t;return n.width!==r.width||n.height!==r.height||n.fit!==r.fit||n.priority!==r.priority}},wo=44100,To=class{constructor(e,t){h(this,`_analyser`,null),h(this,`_gainNode`,null),h(this,`_fftBins`,null),h(this,`_mediaStreamSource`,null),h(this,`_lastSmoothedLevel`,0),h(this,`_trackId`,void 0),h(this,`_track`,void 0),h(this,`_stream`,void 0),this._trackId=e,this._track=t,this._stream=new MediaStream([t]);try{let e=E.getAudioContext();this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),this._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=e.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let e=wo/this._fftBins.length,t=Math.ceil(N.voiceParams.minFreq/e),n=Math.floor(N.voiceParams.maxFreq/e);return this._fftBins.subarray(t,n)}getLevel(){let e=this._getBins(),t=e.reduce((e,t)=>e+t,0)/e.length/255,n=this._lastSmoothedLevel*N.voiceParams.smoothing+t*(1-N.voiceParams.smoothing);return this._lastSmoothedLevel=n,{real:t,smoothed:n}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}},Eo=class extends x{constructor(e){super(),h(this,`_detector`,null),h(this,`_interval`,null);let t=()=>{this._detector&&R.onLocalVolume(this._detector.getLevel().real,e.mediaSettings.isAudioEnabled),this._interval=window.setTimeout(t,N.voiceParams.interval)};this._interval=window.setTimeout(t,N.voiceParams.interval);let n=()=>{let t=e.getSendAudioTrack();t&&this.init(t)};this.subscribe(e,Jt.SOURCE_CHANGED,t=>{t.kind===A.audio&&e.mediaSettings.isAudioEnabled&&n()}),this.subscribe(e,Jt.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new To(`local`,e.clone())}_stopDetector(){this._detector&&(this._detector.track.stop(),this._detector.destroy(),this._detector=null)}destroy(){this.unsubscribe(),this._interval&&(window.clearTimeout(this._interval),this._interval=null),this._stopDetector()}},Do=class{constructor(e,t=z){h(this,`processor`,void 0),h(this,`queue`,[]),h(this,`isProcessing`,!1),h(this,`_debug`,void 0),this.processor=e,this._debug=t}add(e){this.queue.push(e),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let e=this.queue.shift();if(e)try{await this.processor(e)}catch{this._debug.error(`Can't process message ${JSON.stringify(e)}`)}}this.isProcessing=!1}}},Oo=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),ko=class extends x{constructor(e){super(),h(this,`_detectors`,new Map),h(this,`_interval`,null),h(this,`_activeParticipants`,void 0),h(this,`_removedParticipants`,void 0),h(this,`_topology`,void 0),this._topology=e.getTopology(),this.subscribe(e,X.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(e,X.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,X.SIGNALLED_ACTIVE_PARTICIPANTS,this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,X.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._destroyDetectors()}_onRemoteTrackAdded(e,t,n){if(n.kind===A.audio&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new To(e,n)),!this._interval)){let e=()=>{this._collectVolumes(),this._interval=window.setTimeout(e,N.voiceParams.interval)};this._interval=window.setTimeout(e,N.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,n){if(n.kind!==A.audio)return;let r=this._detectors.get(e);!r||r.track!==n||(r.destroy(),this._detectors.delete(e))}_collectVolumes(){if(!this._detectors.size)return;let e={};if(this._topology===Y.SERVER){if(this._activeParticipants)for(let t of this._activeParticipants){let n=this._getAudioTrackLevelByParticipantId(t);n&&(e[t]=n)}if(this._removedParticipants){for(let t of this._removedParticipants)e[t]={real:0,smoothed:0};this._removedParticipants=null}}else for(let[t,n]of this._detectors.entries())e[t]=n.getLevel();this._triggerEvent(`VOLUMES_DETECTED`,e)}_getAudioTrackLevelByParticipantId(e){if(this._isTransparentAudioMode())return this._getTransparentAudioLevelByParticipantId(e);let t=this._detectors.get(qr.AUDIO_MIX);return t?t.getLevel():null}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((e,n)=>{if(!n.startsWith(`${qr.TRANSPARENT_AUDIO_TRACK_PREFIX}-`))return;let r=e.getLevel();(!t||r.real>t.real)&&(t=r)}),t}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){this._topology=e,this._destroyDetectors(),e===Y.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology===Y.SERVER&&N.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},Ao=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),jo=class extends x{constructor(e,t,n){super(),h(this,`_speakerId`,null),h(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===Y.SERVER,this.subscribe(e,Oo.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this.subscribe(t,X.SIGNALLED_SPEAKER_CHANGED,this._onServerSpeakerChanged.bind(this)),this.subscribe(t,X.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,n=null;if(Object.keys(e).forEach(r=>{let i=e[r].smoothed;i>t&&i>N.voiceParams.threshold&&(t=i,n=r)}),n&&n!==this._speakerId){let r=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>r*N.voiceParams.speakerLevelMultiplier&&(this._speakerId=n,this._triggerEvent(`SPEAKER_CHANGED`,n))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent(`SPEAKER_CHANGED`,e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e===Y.SERVER}},Mo=15e3,No=15e3,Po=class extends x{constructor(e,t,n,r=z,i=null){super(),h(this,`_transport`,void 0),h(this,`_volumes`,{}),h(this,`_participants`,{}),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_connectionTimeout`,0),h(this,`_connectionTimeoutSuppressed`,!1),h(this,`_volumeTimeout`,0),this._transport=e,this._participants=n,this._debug=r,this._logger=i,this.subscribe(e,X.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(t,Oo.VOLUMES_DETECTED,this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}onParticipantHoldChanged(){this._connectionTimeout||!this._connectionTimeoutSuppressed||this._reportConnectionTimeout()}_getConnectionTimeout(){return this._transport.getTopology()===Y.DIRECT?Mo:N.specListenerParams.connectionTimeout}_getVolumeTimeout(){return this._transport.getTopology()===Y.DIRECT?No:N.specListenerParams.volumeTimeout}_onTransportStateChanged(e,t){t===J.OPENED&&(this._connectionTimeout||(this._connectionTimeoutSuppressed=!1,this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),this._getConnectionTimeout()))),t===J.CONNECTED&&(this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),this._getVolumeTimeout())),this._volumeTimeout&&(window.clearTimeout(this._volumeTimeout),this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),this._getVolumeTimeout()))),t===J.FAILED&&this._connectionTimeout&&(this._debug.warn(`Transport failed, send callSpecError`),this._logger?.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){this._reportConnectionTimeout(),this._connectionTimeout=0}_reportConnectionTimeout(){let e=!1,t=!1;Object.entries(this._transport.getStates()).forEach(([n,r])=>{if(r!==J.CONNECTED){if(this._participants[n]?.isOnHold){e=!0;return}t=!0}}),this._connectionTimeoutSuppressed=e&&!t,t&&(this._debug.warn(`There is not connected transport, send callSpecError`),this._logger?.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0||this._participants[t]?.isOnHold)return;let n=`UNKNOWN`,r=this._participants[t];r&&r.platform&&(n=r.platform),e.indexOf(n)<0&&(e.push(n),this._logger?.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&this._debug.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},Fo=class extends m{constructor(e,t,n,r=()=>void 0){super(),h(this,`_externalLogger`,void 0),h(this,`_api`,void 0),h(this,`_conversationIdProvider`,void 0),h(this,`_topologyProvider`,void 0),h(this,`_batchInterval`,3e3),h(this,`_batchedClientStats`,[]),h(this,`_batchTimeout`,null),h(this,`_serverTimeDelta`,0),h(this,`_waitingForServerTime`,!0),h(this,`_deferredClientStats`,[]),this._api=e,this._externalLogger=t,this._conversationIdProvider=n,this._topologyProvider=r,this._calculateServerTimeDelta()}log(e,t,n=!1){this._externalLogger&&this._externalLogger.log(e,t,n)}logClientStats(e,t=!1){let n=typeof t==`boolean`?{immediately:t}:t,r={...e,call_topology:e.call_topology??this._getCallTopology()};if(n.deferUntilServerTime&&this._waitingForServerTime){this._deferredClientStats.push({data:r,options:{...n}}),n.immediately&&this._flushDeferredClientStats();return}this._logClientStats(r,n)}destroy(){this._flushDeferredClientStats(),this._sendBatch(),this._stopTimeout()}_logClientStats(e,t){let n={...e,vcid:t.conversationId===void 0?this._getConversationId():t.conversationId,timestamp:t.occurredAt===void 0?this._now():t.occurredAt-this._serverTimeDelta};Object.keys(n).forEach(e=>{n[e]===void 0&&delete n[e]}),this._batchedClientStats.push(n),(t.immediately||!this._batchTimeout)&&this._sendBatch()}_getConversationId(){try{return this._conversationIdProvider()}catch{return null}}_getCallTopology(){try{return this._topologyProvider()===Y.SERVER?`S`:`D`}catch{return`D`}}_sendBatch(){this._stopTimeout();let e=!1;this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendClientStats(e){this._api.logClientStats(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}finally{this._flushDeferredClientStats()}}_flushDeferredClientStats(){if(!this._waitingForServerTime)return;this._waitingForServerTime=!1;let e=this._deferredClientStats;this._deferredClientStats=[];for(let{data:t,options:n}of e)this._logClientStats(t,n)}_now(){return Date.now()-this._serverTimeDelta}},Io=`invalid-error-metadata`,Lo=64,Ro=new Set(Object.values(O)),zo=new Set(Object.values(S)),Bo={[O.CANCELED]:{type:`semantic`,reason:`canceled`},[O.REJECTED]:{type:`semantic`,reason:`rejected`},[O.REMOVED]:{type:`semantic`,reason:`removed`},[O.HUNGUP]:{type:`semantic`,reason:`hangup`},[O.MISSED]:{type:`semantic`,reason:`missed`},[O.BUSY]:{type:`semantic`,reason:`busy`},[O.FAILED]:{type:`failed`},[O.NETWORK_ERROR]:{type:`requires-call-error`},[O.KILLED]:{type:`semantic`,reason:`killed`},[O.BANNED]:{type:`semantic`,reason:`banned`},[O.HAS_ACTIVE_CALL]:{type:`semantic`,reason:`initially_closed`},[O.CALLER_IS_BLOCKED]:{type:`requires-call-error`},[O.NOT_FRIENDS]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1103,description:`friendship-required`}},[O.CALLEE_IS_OFFLINE]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1102,description:`target-user-unavailable`}},[O.CALLEE_UNAVAILABLE]:{type:`semantic`,reason:`unavailable`},[O.CALLER_IS_REJECTED]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1113,description:`caller-is-rejected`}},[O.UNKNOWN_ERROR]:{type:`failed`},[O.UNSUPPORTED]:{type:`direct-error`,error:{scope:`internal`,code:`observer-mode`,description:`video-tracks-count-must-be-zero`}},[O.SERVICE_DISABLED]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1101,description:`vchat-service-disabled`}},[O.SERVICE_UNAVAILABLE]:{type:`requires-call-error`},[O.EXTERNAL_API_ERROR]:{type:`requires-call-error`},[O.SOCKET_CLOSED]:{type:`semantic`,reason:`socket_closed`},[O.ENDED]:{type:`requires-call-error`},[O.KILLED_WITHOUT_DELETE]:{type:`semantic`,reason:`killed_without_delete`},[O.ANOTHER_DEVICE]:{type:`semantic`,reason:`another_device`},[O.NOT_FOUND]:{type:`requires-call-error`},[O.VCHAT_DETAILED_ERROR]:{type:`requires-call-error`},[O.TIMEOUT]:{type:`semantic`,reason:`timeout`},[O.PARTICIPANT_LIMIT_REACHED]:{type:`requires-call-error`},[O.FAST_START_ERROR]:{type:`failed`},[O.FAST_JOIN_ERROR]:{type:`failed`},[O.CALL_TIMEOUT]:{type:`semantic`,reason:`call_timeout`},[O.OBSOLETE_CLIENT]:{type:`semantic`,reason:`obsolete_client`}},Vo={[S.MIC_CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`mic-camera-permission`}},[S.CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-permission`}},[S.MIC_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-permission`}},[S.CAMERA_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-access`}},[S.MIC_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-access`}},[S.MIC_NOT_FOUND]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-not-found`}},[S.SCREEN_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-permission`}},[S.SCREEN_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-access`}},[S.CONNECTION]:{type:`direct-error`,error:{scope:`network`,source:`rtc`,code:`connection`,description:`connection-failed`}},[S.NETWORK]:{type:`requires-call-error`},[S.UNKNOWN]:{type:`failed`},[S.UNSUPPORTED]:{type:`requires-call-error`},[S.SIGNALING_FAILED]:{type:`requires-call-error`},[S.API]:{type:`requires-call-error`},[S.AUTH]:{type:`requires-call-error`},[S.OVERCONSTRAINED]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`overconstrained`}}};function Ho(e){if(typeof e!=`string`&&typeof e!=`number`||typeof e==`number`&&!Number.isFinite(e))return Io;let t=String(e).trim();if(!t)return Io;let n=t.toLowerCase().replace(/[\s_:]+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``);return!n||!/^[a-z0-9.-]+$/.test(n)?Io:n.length>Lo?`${n.slice(0,Lo-3)}...`:n}function Uo(e){if(!e||typeof e!=`object`)return!1;let t=e;switch(t.scope){case`unknown`:case`internal`:return!0;case`external`:return t.source===`api`;case`server`:return t.source===`api`||t.source===`ws`||t.source===`wt`;case`network`:return t.source===`api`||t.source===`rtc`||t.source===`ws`||t.source===`wt`;default:return!1}}function Wo(e){let t=Ho(e.description);if(e.scope===`unknown`)return`unknown:${t}`;let n=Ho(e.code);return e.scope===`internal`?`internal:${n}:${t}`:`${e.scope}:${e.source}:${n}:${t}`}function Go(e,t){return t===null?e.type===`direct-error`?{reason:`error`,string_value:Wo(e.error)}:{reason:`failed`}:Uo(t)?{reason:`error`,string_value:Wo(t)}:{reason:`failed`}}function Ko(e){if(e.hangup){let t=Bo[e.hangup];return t?t.type===`semantic`?e.hangup===O.OBSOLETE_CLIENT&&e.custom_error?.vchat_detailed_api_error.code?{reason:t.reason,string_value:e.custom_error.vchat_detailed_api_error.code}:{reason:t.reason}:Go(t,e.callError):{reason:`failed`}}if(e.error){let t=Vo[e.error];return t?Go(t,e.callError):{reason:`failed`}}return{reason:`failed`}}function qo(e){return e instanceof k?Ko(e):typeof e==`string`&&(Ro.has(e)||zo.has(e))?Ko(new k(e)):{reason:`failed`}}var Jo={wallNow:()=>Date.now(),monotonicNow:()=>performance.now()};function Yo(e){return e===`anonym_join`?`join`:e}var Xo=class{constructor(e,t=Jo){h(this,`_logger`,void 0),h(this,`_clock`,void 0),h(this,`_conversationId`,null),h(this,`_callStartLabel`,null),h(this,`_lifecycleStartedAtMonotonic`,0),h(this,`_pendingEvents`,[]),h(this,`_callStarted`,!1),h(this,`_accepted`,!1),h(this,`_firstMediaSent`,!1),h(this,`_finished`,!1),h(this,`_destroyed`,!1),this._logger=e,this._clock=t}get firstMediaSentReported(){return this._firstMediaSent}get terminated(){return this._finished||this._destroyed}markInitializationStarted({source:e,conversationId:t}){if(this._destroyed||this._callStartLabel!==null)return;let n=this._clock.wallNow();this._callStartLabel=Yo(e),this._lifecycleStartedAtMonotonic=this._clock.monotonicNow(),t&&(this._conversationId=t),this._record({name:U.CALL_INIT,source:e},n)}bindConversationId(e){this._destroyed||this._conversationId||!e||(this._conversationId=e,this._flushPendingEvents())}markCallStarted(){!this._canRecord()||this._callStarted||!this._callStartLabel||(this._callStarted=!0,this._record({name:U.CALL_START,value:this._durationSince(this._lifecycleStartedAtMonotonic),string_value:JSON.stringify({labels:[this._callStartLabel]})}))}markOutgoingAccepted(){!this._canRecord()||this._accepted||(this._accepted=!0,this._record({name:U.CALL_ACCEPTED_OUTGOING}))}markIncomingAccepted(e){!this._canRecord()||this._accepted||(this._accepted=!0,this._record({name:U.CALL_ACCEPTED_INCOMING,...e&&{string_value:`concurrent`}}))}markFirstMediaSent(){!this._canRecord()||this._firstMediaSent||(this._firstMediaSent=!0,this._record({name:U.FIRST_MEDIA_SENT}))}markFinished(e){this._finish(qo(e))}markTerminated(){this._finish({reason:`terminated`})}destroy(){this._destroyed||(this._destroyed=!0,this._pendingEvents=[])}_canRecord(){return this._callStartLabel!==null&&!this._finished&&!this._destroyed}_durationSince(e){return Math.max(0,Math.round(this._clock.monotonicNow()-e))}_finish({reason:e,string_value:t}){this._canRecord()&&(this._finished=!0,this._ensureConversationId(),this._record({name:U.CALL_FINISH,reason:e,...t&&{string_value:t}},void 0,!0))}_ensureConversationId(){this._conversationId||(this._conversationId=M.uuid(),this._flushPendingEvents())}_record(e,t=this._clock.wallNow(),n=!1){if(this._destroyed)return;let r={data:e,occurredAt:t,immediately:n};if(!this._conversationId){this._pendingEvents.push(r);return}this._logEvent(r)}_flushPendingEvents(){if(!this._conversationId||!this._pendingEvents.length)return;let e=this._pendingEvents;this._pendingEvents=[];for(let t of e)this._logEvent(t)}_logEvent({data:e,occurredAt:t,immediately:n}){this._logger.logClientStats(e,{conversationId:this._conversationId,deferUntilServerTime:!0,occurredAt:t,...n&&{immediately:!0}})}},Zo=class{constructor(e,t){h(this,`_logger`,void 0),h(this,`_codecUsages`,new Map),h(this,`getCurrentTransportTopology`,void 0),this._logger=e,this.getCurrentTransportTopology=t}reportUsage(e){let t=this.getCurrentTransportTopology();if(!t)return;let n=e.rtps.filter(e=>e.type===`outbound-rtp`&&!e.mid?.endsWith(`s`));N.simulcast&&(n=n.reduce((e,t)=>{if(t.kind!==`video`)return e.concat(t);let n=e.find(e=>e.kind===`video`);return n?n.totalEncodeTime=(n.totalEncodeTime??0)+(t.totalEncodeTime??0):e.push(t),e},[])),n.forEach(e=>{let n=e.kind,r=e.mimeType;if((n===`audio`||n===`video`)&&r){let i=[r,`encoder`,e.encoderImplementation].filter(Boolean).join(`/`);this.saveUsage({kind:n,codecName:i,totalEncodeTime:(e.totalEncodeTime??0)*1e3,audioCodecParams:e.sdpFmtpLine,topology:t})}})}saveUsage({kind:e,codecName:t,totalEncodeTime:n,audioCodecParams:r,topology:i}){let a=this._codecUsages.get(e);if(a&&a.codecName!==t&&this.report(a),a&&a.codecName===t){this._codecUsages.set(e,{...a,totalEncodeTime:n,topology:i});return}this._codecUsages.set(e,{kind:e,codecName:t,audioCodecParams:r,totalEncodeTime:n,topology:i})}report(e){if(e.kind===`video`&&e.totalEncodeTime===0)return;let t={name:U.CODEC_USAGE,codec_implementation:e.codecName,value:Number.parseFloat(e.totalEncodeTime.toFixed(3)),call_topology:e.topology===Y.DIRECT?`D`:`S`};e.audioCodecParams&&(t.string_value=e.audioCodecParams),this._logger.logClientStats(t)}destroy(){this._codecUsages.forEach(e=>{this.report(e)}),this._codecUsages.clear()}},Qo=class{constructor(e){h(this,`_logger`,void 0),h(this,`_eventualLogs`,new Set),h(this,`_lastCallStatContext`,null),this._logger=e}logCallStat(e){this._lastCallStatContext=this._getCallStatContext(e),this._flushEventualStats(),this._logger.logClientStats(e)}logEventualStat(e){let t=Date.now();e.value===void 0&&(e.value=G.measureMark(e.name)),e.value!==null&&this._eventualLogs.add({data:e,occurredAt:t})}destroy(){this._flushEventualStats()}_getCallStatContext(e){return{call_topology:e.call_topology,local_address:e.local_address,local_connection_type:e.local_connection_type,network_type:e.network_type,remote_address:e.remote_address,remote_connection_type:e.remote_connection_type,transport:e.transport}}_flushEventualStats(){let e=[...this._eventualLogs];for(let t of e)this._logEventualStat(t),this._eventualLogs.delete(t)}_logEventualStat({data:e,occurredAt:t}){this._logger.logClientStats({...e,...this._lastCallStatContext??{}},{occurredAt:t})}},$o=class{constructor(e){if(h(this,`q`,void 0),h(this,`inits`,[]),h(this,`n`,[1,2,3,4,5]),h(this,`np`,[1,1,1,1,1]),h(this,`qv`,[]),!(e>0&&e<1))throw Error(`q must be in (0,1)`);this.q=e}add(e){if(this.inits.length<5){this.inits.push(e),this.inits.length===5&&this.bootstrap();return}let t=0;if(e<this.qv[0])this.qv[0]=e,t=0;else if(e>=this.qv[4])this.qv[4]=e,t=3;else for(;!(e<this.qv[t+1]);)t++;for(let e=0;e<5;e++)this.n[e]+=e<=t?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let e=1;e<=3;e++){let t=this.np[e]-this.n[e];if(t>=1&&this.n[e+1]-this.n[e]>1||t<=-1&&this.n[e]-this.n[e-1]>1){let n=Math.sign(t),r=this.qv[e]+n/(this.n[e+1]-this.n[e-1])*((this.n[e]-this.n[e-1]+n)*(this.qv[e+1]-this.qv[e])/(this.n[e+1]-this.n[e])+(this.n[e+1]-this.n[e]-n)*(this.qv[e]-this.qv[e-1])/(this.n[e]-this.n[e-1]));r>this.qv[e-1]&&r<this.qv[e+1]?this.qv[e]=r:this.qv[e]=this.qv[e]+n*(this.qv[e+n]-this.qv[e])/(this.n[e+n]-this.n[e]),this.n[e]+=n}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let e=[...this.inits].sort((e,t)=>e-t),t=this.q*(e.length-1),n=Math.floor(t),r=t-n;return n+1<e.length?e[n]*(1-r)+e[n+1]*r:e[n]}return this.qv[2]}bootstrap(){this.inits.sort((e,t)=>e-t),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}},es=class{constructor(){h(this,`n`,0),h(this,`mean`,0)}add(e){this.n++;let t=e-this.mean;this.mean+=t/this.n}get avg(){return this.n?this.mean:NaN}},ts=class{constructor(){h(this,`count`,0),h(this,`minVal`,1/0),h(this,`maxVal`,-1/0),h(this,`mean`,new es),h(this,`p50`,new $o(.5)),h(this,`p95`,new $o(.95))}add(e){e<this.minVal&&(this.minVal=e),e>this.maxVal&&(this.maxVal=e),this.mean.add(e),this.p50.add(e),this.p95.add(e),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}},ns=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByTransport`,{ws:new ts,wt:new ts}),h(this,`lastSeen`,{}),this._logger=e}mark(e){let t=Date.now(),n=this.lastSeen[e];if(typeof n==`number`){let r=t-n;r>=0&&this.trackerByTransport[e].add(r)}this.lastSeen[e]=t}logMetrics(){[yr.WEBSOCKET,yr.WEBTRANSPORT].forEach(e=>{if(!this.trackerByTransport[e].hasData)return;let t=this.trackerByTransport[e].snapshot();this._logger.logClientStats({name:U.SIGNALING_PING_SUMMARY,min_value:t.min,max_value:t.max,avg_value:t.avg,median_value:t.median,p95_value:t.p95,values_count:t.count,signaling_transport:e})})}destroy(){this.trackerByTransport={ws:new ts,wt:new ts},this.lastSeen={}}},rs=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByCommand`,new Map),this._logger=e}mark(e,t,n){let r=`${e}|${n}`,i;this.trackerByCommand.has(r)?i=this.trackerByCommand.get(r):(i=new ts,this.trackerByCommand.set(r,i)),i.add(t)}logMetrics(){for(let[e,t]of this.trackerByCommand.entries()){if(!t.hasData)continue;let[n,r]=e.split(`|`),i=t.snapshot();this._logger.logClientStats({name:U.SIGNALING_COMMAND_SUMMARY,api_method:n,min_value:i.min,max_value:i.max,avg_value:i.avg,median_value:i.median,p95_value:i.p95,values_count:i.count,signaling_transport:r})}}destroy(){this.trackerByCommand.clear()}},is=class{constructor(e,t,n,r){h(this,`logger`,void 0),h(this,`lifecycle`,void 0),h(this,`statAggregator`,void 0),h(this,`codecStatsAggregator`,void 0),h(this,`pings`,void 0),h(this,`signalingCommands`,void 0),this.logger=new Fo(e,t,n,r),this.lifecycle=new Xo(this.logger),this.statAggregator=new Qo(this.logger),this.codecStatsAggregator=new Zo(this.logger,r),this.pings=new ns(this.logger),this.signalingCommands=new rs(this.logger)}logHangup(e){this.lifecycle.markFinished(e)}flushCallMetrics(){this.codecStatsAggregator.destroy(),this.pings.logMetrics(),this.pings.destroy(),this.signalingCommands.logMetrics(),this.signalingCommands.destroy()}destroy(){this.lifecycle.markTerminated(),this.lifecycle.destroy(),this.statAggregator.destroy(),this.codecStatsAggregator.destroy(),this.pings.destroy(),this.signalingCommands.destroy(),this.logger.destroy()}},as=class{constructor(e){h(this,`_statAggregator`,void 0),h(this,`_isCallMarked`,!1),h(this,`_isFinished`,!1),h(this,`_callType`,null),this._statAggregator=e}markAcceptCall(e){this.mark(e===Y.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===Y.DIRECT&&this.mark(`direct_outgoing`)}markOnJoin(e){this.mark(e===Y.DIRECT?`direct_join`:`server_join_server`,e===Y.DIRECT)}markTopologyChanged(e){this._isFinished||e!==Y.SERVER||(this._callType=`server_change_topology`)}mark(e,t=!1){(!this._isCallMarked||t)&&(this._isCallMarked=!0,this._callType=e,G.setMark(U.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&this._statAggregator.logEventualStat({name:U.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},os=1e3,ss=1e4;function cs(e,t,n,r){return new k(e,{callError:{scope:`external`,source:`api`,code:t,description:n},message:r})}var ls=15,$=class e extends x{constructor(e,t){super(),h(this,`_api`,void 0),h(this,`_signaling`,void 0),h(this,`_signalingActor`,void 0),h(this,`_displayLayoutRequester`,void 0),h(this,`_mediaSource`,null),h(this,`_conversation`,null),h(this,`_myLastRequestedLayouts`,{}),h(this,`_state`,`IDLE`),h(this,`_previousState`,null),h(this,`_waitingHallHoldPending`,!1),h(this,`_participantState`,Z.CALLED),h(this,`_participants`,{}),h(this,`_directTransportIsMaster`,void 0),h(this,`_transport`,null),h(this,`_debugInfo`,null),h(this,`_debug`,z.createSessionLogger()),h(this,`_volumesDetector`,null),h(this,`_speakerDetector`,null),h(this,`_localVolumeDetector`,null),h(this,`_specListener`,null),h(this,`_activeSpeakerId`,null),h(this,`_lastSignalledActiveSpeakerId`,null),h(this,`_isRealTimeAsrRequested`,!1),h(this,`_serverSettings`,kr()),h(this,`_serverTimeOffset`,0),h(this,`_delayedHangup`,!1),h(this,`_hangupEmitted`,!1),h(this,`_hangupPromise`,null),h(this,`_abortController`,null),h(this,`_registeredPeerReceived`,!1),h(this,`_calleeUnavailableTimer`,null),h(this,`_reservedId`,null),h(this,`_onUnload`,void 0),h(this,`_audioOutput`,void 0),h(this,`_stats`,void 0),h(this,`_lastStalled`,{}),h(this,`_audioMixStalled`,!1),h(this,`_audioFix`,null),h(this,`_streamByStreamId`,new Map),h(this,`_streamIdByStreamDescription`,new Map),h(this,`_streamWaitTimerByStreamDescription`,new Map),h(this,`_sequenceNumberByStreamDescription`,new Map),h(this,`_cooldownTimestampByStreamDescription`,new Map),h(this,`_cooldownQueueCleanupTimer`,null),h(this,`_statFirstMediaReceived`,void 0),h(this,`_changeMediaSettings`,M.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(e){if(this._debug.warn(`changeMediaSettings failed with error`,e),e.message===`chatRoom.maxShareCountExceeded`)return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100)),this._stats=new is(e,t,()=>this._conversation?.id||null,()=>this._transport?.getTopology()??this._conversation?.topology),this._api=e,this._signaling=new Ba(this._debug,this._stats.logger,this._stats.statAggregator,this._stats.pings,this._stats.signalingCommands),this._signalingActor=new Do(this._onSignalingNotification.bind(this),this._debug),this._displayLayoutRequester=new Co({api:this._api,debug:this._debug,getParticipants:()=>this._participants,isMe:e=>this._isMe(e),updateDisplayLayout:e=>this.updateDisplayLayout(e)}),this._onUnload=()=>{this._stopFirstMediaSentProbe(),this._conversation&&this._api&&this._sendHangupApi(this._conversation.id,this._state===`IDLE`?O.CANCELED:O.HUNGUP),this._stats.destroy()},window.addEventListener(`pagehide`,this._onUnload),this._statFirstMediaReceived=new as(this._stats.statAggregator),this._audioOutput=new go(this._statFirstMediaReceived,N.transparentAudio,this._debug,this._stats.logger),N.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),os))}static current(){return B.getActive()??(N.hold?null:B.getFirst())}static hangupAfterInit(){let e=us;e&&e._delayedHangup===!1&&!e._conversation&&(e._delayedHangup=!0,e._abortController?.abort(new k(O.CANCELED)))}static id(){return B.getActiveId()}get id(){return this._conversation?.id??``}get externalId(){return this._conversation?.externalId}get mediaSettings(){return this._mediaSource?.mediaSettings}get isCallHeld(){return this._state===`HELD`}static debugSessionId(){return e.current()?.debugSessionId??null}static debugMessage(t,...n){let r=e.current();return r?(r._debug.send(t,...n),!0):!1}static debugMessageWithContext(e,t,...n){let r=B.get(t);return r?(r._debug.send(e,...n),!0):!1}static getSyncedTime(){return Date.now()+(e.current()?._serverTimeOffset??0)}get debugSessionId(){return this._debug.sessionId}getCachedRawOkIdByExternalId(e){return this._api.getCachedRawOkIdByExternalId(e)}async onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r=``,joiningAllowed:i=!1,requireAuthToJoin:a=!1,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l}){let u=l??M.uuid(),d=(e?.length??0)+(s?.length??0),f=t===Ha.USER&&d===1?N.calleeUnavailableWaitingTime:void 0;this._stats.lifecycle.markInitializationStarted({source:`outgoing`,conversationId:u}),this._debug.setConversationId(u),us=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(n);let l=this._mediaSource.mediaSettings;t===Ha.CHAT||e&&e.length>1?this._logWithMediaSettings(w.OUTGOING_MULTIPARTY_CALL,l):this._logWithMediaSettings(w.OUTGOING_CALL,l);let d=await this._startConversation({opponentIds:e,opponentType:t,direction:Va.OUTGOING,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:u});if(!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`not-initialized-after-start`}});if(this._participantState=Z.ACCEPTED,this._changeMediaSettings(l),await this._processConnection(d),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._signaling.readyToSend(),this._delayedHangup)throw new k(O.CANCELED);return this._debug.debug(`Outgoing call`,{opponentIds:e,opponentType:t,mediaOptions:n}),this._processConnectionSharedMovieInfo(d),this._processConversationUrlSharingInfo(d),R.onLocalStream(this._mediaSource.getStream(),this._mediaSource.mediaSettings,this.id),R.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),void 0,this.id),this._onConversationParticipantListChunk(d),this._processPinnedParticipants(d),R.onLocalStatus(P.WAITING,this.id),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),B.add(this),await B.setActive(this.id),us=null,this._conversation.concurrent&&await this._acceptConcurrent(),f&&!this._registeredPeerReceived&&this._state!==`CLOSE`&&(this._calleeUnavailableTimer=window.setTimeout(()=>{this._calleeUnavailableTimer=null,this._close(new k(O.CALLEE_UNAVAILABLE),{signalingReason:O.CANCELED})},f)),this._conversation}catch(e){throw us=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to start conversation`}),e}}async onJoin(e){this._stats.lifecycle.markInitializationStarted({source:e.anonymous?`anonym_join`:`join`,conversationId:e.conversationId}),us=this,this._state=`PROCESSING`,this._debug.setConversationId(e.conversationId??null),this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let t=!!e.observedIds?.length;if(t&&N.videoTracksCount>0)throw this._debug.error(`Observer mode: please set videoTracksCount=0`),new k(O.UNSUPPORTED,{callError:{scope:`internal`,code:`observer-mode`,description:`video-tracks-count-must-be-zero`}});this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!t);let n=this._mediaSource.mediaSettings;this._logWithMediaSettings(w.JOIN_CONVERSATION,n);let r=await this._joinConversation(e);if(!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`not-initialized-after-join`}});return this._conversation.observer=t,R.onLocalStream(this._mediaSource.getStream(),n,this.id),this._conversation.waitForAdmin||this._conversation.waitingHall?(this._debug.log(this._conversation.waitForAdmin?`Wait for admin`:`In waiting hall`),B.add(this),us=null,this._signaling.readyToSend(),R.onLocalStatus(this._conversation.waitForAdmin?P.WAIT_FOR_ADMIN:P.WAITING_HALL,this.id),this._conversation):this._onJoinPart2(r)}catch(e){throw us=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to join conversation`}),e}}async _onJoinPart2(e,t=!0,n=!1){this._debug.debug(`Join conversation part 2`);try{if(this._participantState=Z.ACCEPTED,!this._conversation||!this._mediaSource)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`join`,description:`runtime-not-initialized`}});if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!n&&!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.mediaSettings),await this._processConnection(e),t&&(this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener()),this._signaling.readyToSend(),this._state===`CLOSE`)return this._conversation;if(this._delayedHangup)throw new k(O.CANCELED);this._processConnectionSharedMovieInfo(e),this._processConversationUrlSharingInfo(e),this._processConnectionAsrInfo(e);let r=this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);R.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),r,this.id),this._onConversationParticipantListChunk(e),this._processPinnedParticipants(e),R.onLocalStatus(P.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),t&&(this._state=`ACTIVE`),this._changeFeatureSet(),t&&(B.add(this),n?await this._holdLocally():await B.setActive(this.id),us=null);let i=this._extractLocalParticipantFromConnection(e);if(i){let e=M.mapParticipantState(i);Object.keys(e).length>0&&R.onLocalParticipantState(e,!1,this.id)}return t&&this._openTransport(Object.values(this._participants),!1),this._conversation}catch(e){throw us=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to join conversation`}),e}}_extractExternalRooms(e){return e.map(this._convertRoomToExternal.bind(this)).filter(e=>!!e)}_extractExternalRoomsData(e,t){if(!e||!e.length)return;let n={rooms:this._extractExternalRooms(e)};return t&&(n.roomId=t),n}async onPush(e,t=j.USER,n,r,i,a){if(B.has(e))throw new k(O.HAS_ACTIVE_CALL);B.reserve(e),this._reservedId=e,this._stats.lifecycle.markInitializationStarted({source:`incoming`,conversationId:e}),this._debug.setConversationId(e),us=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal),a&&this._api.setUserId(a);try{let a=await this._prepareConversation(e,t,n,r,i);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`incoming-not-initialized`}});if(!a.conversation.participants.find(e=>e.state===Z.CALLED&&e.id===this._conversation?.userId))throw this._debug.log(`Push rejected (there is an active call)`),this._stats.logger.log(w.PUSH,`rejected`),new k(O.REJECTED);if(await this._processConnection(a),this._extractConnectionUrlSharingInfo(a),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._processPinnedParticipants(a),this._signaling.readyToSend(),this._stats.lifecycle.markCallStarted(),this._stats.logger.log(w.PUSH,`accepted`),B.add(this),us=null,this._delayedHangup)throw new k(O.CANCELED)}catch(e){throw us=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to handle inbound call push`,signalingReason:e instanceof k&&e.hangup===O.BUSY?O.BUSY:void 0}),e}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(Ga.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(Ga.WAIT_FOR_ADMIN),n=e.conversation.options.includes(Ga.ADMIN_IS_HERE);return!t||t&&n?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(t=>M.comparePeerId(t.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(Ga.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`accept`,description:`runtime-not-initialized`}});this._state=`PROCESSING`;let e=this._mediaSource.mediaSettings;this._logWithMediaSettings(w.ACCEPT_CONCURRENT,e),this._debug.debug(`Concurrent call`,{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.mediaSettings),this._stats.lifecycle.markIncomingAccepted(!0),R.onCallAccepted(this.id),this._state=`ACTIVE`,this._participantState=Z.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0)}catch(e){this._close(e,{errorText:`Unable to accept concurrent call`})}}_getMainRoomParticipants(){let e=this._participants;return M.mapSharedParticipants(Object.values(e).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,n]=e.split(`:`),r=parseInt(t,10);if(isNaN(r))throw Error(`Invalid original length in prefix`);let i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);try{let e=mo(a,r).reduce((e,t)=>(e+=String.fromCharCode(t),e),``),{srcp:t,stne:n,tkn:i,trne:o,trnp:s,trnu:c,wse:l,wte:u}=JSON.parse(e);return{token:i,endpoint:l,wt_endpoint:u,turn_server:{urls:o.split(`,`),username:c,credential:s},stun_server:{urls:n.split(`,`)},client_type:t}}catch(e){throw this._close(e,{errorText:`Can't decompress conversation params`}),e}}async accept(e){if(this._state!==`IDLE`)throw this._stats.logger.log(w.ERROR,`acceptIncoming`),this._debug.error(`Unable to accept a call - invalid state`),Error(`Unable to accept a call - invalid state`);if(!this._mediaSource||!this._conversation||!this._transport)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`accept`,description:`runtime-not-initialized`}});this._state=`PROCESSING`,this._debug.setConversationId(this._conversation.id),this._debug.debug(`Accept incoming call`,e);try{await this._mediaSource.request(e);let t=this._mediaSource.mediaSettings;this._logWithMediaSettings(w.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._stats.lifecycle.markIncomingAccepted(!1),this._participantState=Z.ACCEPTED;let n=this._getMuteStatesForCurrentRoom(),r=Object.keys(n);r.length&&this._onMuteParticipant({muteStates:n,mediaOptions:r,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let i=await this._signaling.getRooms(this._isCallAdmin());if(i.rooms?.rooms?.length){let e=this._participants;i.rooms.rooms.forEach(t=>{t.participantIds?.forEach(t=>{e[t]&&(e[t].isInRoom=!0)})})}this._conversation.roomId=i.rooms?.roomId||null;let a=this._extractExternalRoomsData(i.rooms?.rooms,i.rooms?.roomId);if(R.onCallAccepted(this.id),R.onLocalStream(this._mediaSource.getStream(),t,this.id),R.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),a,this.id),await this._emitHeldParticipantsStatus(),N.useParticipantListChunk){let e=await this._getInitialParticiapntListChunk(),t=this._participants;e?.participants?.forEach(e=>{let n=t[M.composeId(e)];n&&(n.movieShareInfos=e.movieShareInfos)}),this._onConversationParticipantListChunk({participants:e})}return R.onLocalStatus(P.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0),this._processConversationUrlSharingInfo(),this._processConnectionAsrInfo(),B.setActive(this.id).catch(e=>{this._debug.error(e),this._close(e,{errorText:`Unable to activated accepted call`})}),this._conversation}catch(e){throw this._close(e,{errorText:`Unable to accept call`}),e}}async decline(e){if(this._state!==`IDLE`)throw this._stats.logger.log(w.ERROR,`declineIncoming`),this._debug.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);this._state=`PROCESSING`,this._debug.debug(`Decline incoming call`),this._logWithMediaSettings(w.DECLINE_INCOMING,this.mediaSettings),this._participantState=Z.HUNGUP;let t=e??O.REJECTED,n=new k(t);this._finishLifecycle(n),this._close(n,{signalingReason:t})}hangup(e){if(this._hangupPromise)return this._hangupPromise;this._clearCalleeUnavailableWatchdog(),this._debug.debug(`Hangup`);let t=e??(this._state===`ACTIVE`||this._state===`HELD`?O.HUNGUP:O.CANCELED),n=new k(t),r=this._conversation?.id??null;return this._stats.logger.log(w.HANGUP,t),this._finishLifecycle(n),this._hangupPromise=this._signaling.hangup(t).then(()=>void 0).catch(e=>{if(!(e instanceof Tn))throw e}).finally(()=>(r!=null&&this._sendHangupApi(r,t),this._close(n))),this._emitHangupOnce(n,r),this._cleanupTransport(),this._cleanupMediaSource(),this._hangupPromise}async addParticipant(e,t){if(!this._signaling.ready){this._close(new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`add-participant`,description:`signaling-not-ready`}}),{errorText:`Unable to add participant`});return}let n=await this._signaling.addParticipant(e.map(Q.toSignaling),t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:O.UNKNOWN_ERROR);let i=n.participants;if(!i&&n.rejectedParticipants?.length)throw Error(n.rejectedParticipants[0].reason);for(let e of i)await this._onAddParticipant(M.composeId(e),e,r)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`add-participant`,description:`signaling-not-ready`}}),{errorText:`Unable to add participant`});return}let n=await this._signaling.addParticipantLegacy(e,t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:O.UNKNOWN_ERROR);let i=n.participants;for(let e of i)await this._onAddParticipant(M.composeId(e),e,r)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let n=new Set(this._transport.opened()),r=[];for(let i of e)(i.state===Z.CALLED||i.state===Z.ACCEPTED)&&(this._transport.isAllocated(i.id)||this._allocateParticipantTransport(i.id,t)),i.state===Z.ACCEPTED&&!n.has(i.id)&&r.push(i.id);r.length?this._transport.open(r,null,!!this._conversation?.observer):this._transport.getTopology()===Y.SERVER&&this._forceOpenTransportForAloneInCall()}_allocateParticipantTransport(e,t){this._transport&&(this._transport.getTopology()===Y.DIRECT&&(t=this._directTransportIsMaster??(this._directTransportIsMaster=t)),this._transport.allocate(e,t))}_cleanupRegistry(){B.remove(this._reservedId),B.remove(this.id),this._reservedId=null}_emitHangupOnce(e,t){this._hangupEmitted||(this._hangupEmitted=!0,R.onHangup(e,t))}_sendHangupApi(e,t){let n=this._signaling.getPeerId(),r={};n!=null&&(r.peerId=String(n)),this._api.hangupConversation(e,t,r)}_close(e,t={}){this._clearCalleeUnavailableWatchdog(),t.errorText&&this._debug.error(t.errorText,e),this._debug.debug(`Close conversation`,e),this._finishLifecycle(e),this._stats.flushCallMetrics();let n=t.signalingReason??(e.error?O.FAILED:void 0),r=n&&this._signaling.ready?this._signaling.hangup(n):void 0;this._signaling.readyToSend(!1),e.error||this._stats.logger.log(w.ERROR,e.hangup);let i=this._conversation&&this._conversation.id;if([O.CANCELED,O.NOT_FRIENDS,O.CALLEE_IS_OFFLINE,O.CALLEE_UNAVAILABLE,O.CALLER_IS_BLOCKED,O.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===O.REJECTED&&!e.remote){this._emitHangupOnce(e,i),this._destroy(r);return}if(e.hangup===O.HUNGUP&&(!e.remote||this._isCalledState())){this._emitHangupOnce(e,i),this._destroy(r);return}if(e.hangup===O.MISSED&&!e.remote){this._emitHangupOnce(e,i),this._destroy(r);return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===O.SOCKET_CLOSED||e.hangup===O.NOT_FOUND)&&B.getActive()&&!this._conversation){this._disposeSignaling(r),this._cleanupMediaSource();return}if(e.hangup===O.BUSY&&!e.remote){this._disposeSignaling(r),this._cleanupMediaSource();return}this._state=`CLOSE`,this._participantState=Z.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._disposeSignaling(r),this._api.cleanup(),this._api.setAbortSignal(void 0),this._stats.destroy(),this._cleanupRegistry(),this._conversation=null,this._myLastRequestedLayouts={},this._displayLayoutRequester.clear(),this._delayedHangup=!1,this._abortController=null,this._emitHangupOnce(e||new k(O.UNKNOWN_ERROR),i)}destroy(){this._destroy()}_destroy(e){this._clearCalleeUnavailableWatchdog();let t=this._conversation&&this._conversation.id;if(this._debug.debug(`Destroy conversation`,{conversationId:t}),this._stopFirstMediaSentProbe(),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state=`CLOSE`,this._participantState=Z.HUNGUP,this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._disposeSignaling(e),this._api.cleanup(),this._api.setAbortSignal(void 0),this._delayedHangup&&t)try{this._sendHangupApi(t,O.CANCELED)}catch{}this._cleanupListeners(),this._stats.destroy(),this._cleanupRegistry(),this._conversation=null,this._myLastRequestedLayouts={},this._displayLayoutRequester.clear(),this._delayedHangup=!1,this._abortController=null}async _getConversationParams(e){let t=await this._api.getConversationParams(e);this._debug.debug(`Api.getConversationParams`,t);let{turn_server:n,stun_server:r}=t;return N.iceServers=po(r,n),N.wssBase=t.endpoint,t.wt_endpoint&&(N.wtsBase=t.wt_endpoint),N.wssToken=t.token,t.client_type&&(N.clientType=t.client_type),t.external_user_type&&(N.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:n,wt_endpoint:r,token:i,client_type:a}){N.iceServers=po(t,e),N.wssBase=n,N.wssToken=i,r&&(N.wtsBase=r),a&&(N.clientType=a)}_buildSignalingEndpoint({baseEndpoint:e,userId:t,type:n,deviceIdx:r,conversationId:i,token:a,conversationParams:o}){let s=new URL(e),c=s.searchParams;return c.set(`userId`,String(t)),c.set(`entityType`,n),c.set(`deviceIdx`,String(r)),c.set(`conversationId`,i),c.set(`token`,a),o?.isp_as_no&&c.set(`ispAsNo`,String(o.isp_as_no)),o?.isp_as_org&&c.set(`ispAsOrg`,o.isp_as_org),o?.loc_cc&&c.set(`locCc`,o.loc_cc),o?.loc_reg&&c.set(`locReg`,o.loc_reg),s.toString()}_clearCalleeUnavailableWatchdog(){this._calleeUnavailableTimer!==null&&(window.clearTimeout(this._calleeUnavailableTimer),this._calleeUnavailableTimer=null)}async _startConversation({opponentIds:e,opponentType:t,direction:n,mediaOptions:r,payload:i=``,joiningAllowed:a=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:l,conversationId:u}){let d=u??M.uuid();if(B.has(d))throw new k(O.HAS_ACTIVE_CALL);B.reserve(d),this._reservedId=d,this._debug.debug(`Conversation: start`,{conversationId:d,opponentIds:e,opponentType:t,direction:n});let f=r.includes(C.VIDEO),p,m;if(l){let e={deviceId:this._api.deviceId(),sdkVersion:N.sdkVersion,clientAppKey:N.apiKey,platform:N.platform,protocolVersion:N.protocolVersion,domainId:N.domain,capabilities:Sa.getFlags()},n=JSON.stringify(e),s;try{if(s=await l({internalParams:n,conversationId:d,externalIds:c,payload:i,opponentType:t,mediaOptions:r,isVideo:f,joiningAllowed:a,requireAuthToJoin:o},this._abortController?.signal),!s)throw cs(O.FAST_START_ERROR,`invalid-response`,`fast-start-response-empty`);if(!s.internalCallerParams){let e=s.rejectedParticipants[0]?.status;throw cs(O.FAST_START_ERROR,e?`fast-start`:`invalid-response`,e??`fast-start-internal-caller-params-empty`,JSON.stringify(s))}}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new k(O.CANCELED):e instanceof k?e:e instanceof Error?new k(O.FAST_START_ERROR,{message:e.message}):new k(O.FAST_START_ERROR,{message:String(e)})}try{let e=JSON.parse(s.internalCallerParams);p={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:d,is_concurrent:e.isConcurrent,client_type:e.clientType,rejected_participants:s.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastStart`,p),m=`fastStart`}catch{throw cs(O.FAST_START_ERROR,`invalid-response`,`fast-start-internal-caller-params-invalid`)}}else p=await this._api.startConversation(d,e,t,f,i,a,o,{onlyAdminCanShareMovie:s},c),this._debug.debug(`Api.startConversation`,p),m=`startConversation`;_o(p,m),this._setConversationParams(p),this._stats.lifecycle.bindConversationId(p.id);let ee=await this._connectSignaling(vr.START,p);return this._setConversation(p,ee,n),this._stats.lifecycle.markCallStarted(),ee}async _joinConversation(e){G.setMark(U.SIGNALING_CONNECTED);let{conversationId:t,mediaOptions:n,chatId:r,joinLink:i,observedIds:a,payload:o,onFastJoin:s}=e;if(this._debug.debug(`Conversation: join`,{conversationId:t,joinLink:i,observedIds:a}),t&&B.has(t))throw new k(O.HAS_ACTIVE_CALL);let c=n.includes(C.VIDEO),l,u;if(s){if(!i)throw new k(O.FAST_JOIN_ERROR,{callError:{scope:`internal`,code:`fast-join`,description:`join-link-required`}});let e={deviceId:this._api.deviceId(),sdkVersion:N.sdkVersion,clientAppKey:N.apiKey,platform:N.platform,protocolVersion:N.protocolVersion,domainId:N.domain,capabilities:Sa.getFlags()},t=JSON.stringify(e),n;try{if(n=await s({joinLink:i,isVideo:c,internalParams:t},this._abortController?.signal),!n)throw cs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-response-empty`);if(!n.internalCallerParams)throw cs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-internal-caller-params-empty`,JSON.stringify(n));if(!n.conversationId)throw cs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-conversation-id-empty`,JSON.stringify(n))}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new k(O.CANCELED):e instanceof k?e:e instanceof Error?new k(O.FAST_JOIN_ERROR,{message:e.message}):new k(O.FAST_JOIN_ERROR,{message:String(e)})}try{let e=JSON.parse(n.internalCallerParams);if(B.has(n.conversationId))throw new k(O.HAS_ACTIVE_CALL);l={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:n.conversationId,is_concurrent:e.isConcurrent,client_type:e.clientType,stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastJoin`,l),u=`fastJoin`}catch(e){throw e instanceof k?e:cs(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-internal-caller-params-invalid`)}}else if(t)l=await this._api.joinConversation(t,c,r),u=`joinConversation`;else if(i)l=await this._api.joinConversationByLink(i,c,a,o),u=`joinConversationByLink`;else throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`join`,description:`target-missing`}});if(this._debug.debug(`Api.joinConversation`,l),l.id&&this._stats.lifecycle.bindConversationId(l.id),_o(l,u),l.id){if(B.has(l.id))throw new k(O.HAS_ACTIVE_CALL);B.reserve(l.id),this._reservedId=l.id}this._setConversationParams(l);let d=await this._connectSignaling(vr.JOIN,l);return this._setConversation(l,d,Va.JOINING),this._stats.lifecycle.markCallStarted(),d}async _prepareConversation(e,t=j.USER,n,r,i){G.setMark(U.SIGNALING_CONNECTED),this._debug.debug(`Conversation: push`,{conversationId:e,type:t,peerId:n});let a=this._api.getUserId();if(!a)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`incoming`,description:`user-id-missing`}});let o=0,s=``,c=``,l={id:e,peerId:n,endpoint:s,wt_endpoint:c,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:``};if(r){let n=this._decodeExternalConversationParams(r);this._setConversationParams(n),s=i??this._buildSignalingEndpoint({baseEndpoint:N.wssBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken}),l.token=n.token,l.endpoint=s,N.wtsBase&&(c=this._buildSignalingEndpoint({baseEndpoint:N.wtsBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken}),l.wt_endpoint=c)}else{let n=await this._getConversationParams(e);o=n.device_idx||0,s=i??this._buildSignalingEndpoint({baseEndpoint:N.wssBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken,conversationParams:n}),l.token=n.token,l.endpoint=s,l.device_idx=o,N.wtsBase&&(c=this._buildSignalingEndpoint({baseEndpoint:N.wtsBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:N.wssToken,conversationParams:n}),l.wt_endpoint=c)}let u=await this._connectSignaling(vr.ACCEPT,l);return B.callsLength>=N.maxParallelCalls||!N.hold&&B.callsLength>0?(this._debug.log(`Push rejected (busy)`),this._stats.logger.log(w.PUSH,`busy`),Promise.reject(new k(O.BUSY))):(this._setConversation(l,u,Va.INCOMING,t),u)}_createParticipant(e,t,n=!0){let r=Object.assign({id:null,externalId:null,mediaSettings:D(),participantState:{},state:Z.CALLED,connectionStatus:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e),i=!!r.externalId;return i||(r.externalId=this._getParticipantId(t??r.id)),n&&i&&this._api.cacheExternalId(t??r.id,r.externalId),t&&this._api.mapDecorativeId(t,r.id),r.observedIds?.length&&(r.externalId.observer=!0),e.markers&&(r.markers=this._denormalizeMarkers(r.id,e.markers)),r.connectionStatus=to.create(r.connectionStatus),r}_getParticipantId(e){try{return this._api.userId(e)}catch(e){throw this._close(e instanceof k?e:new k(O.NETWORK_ERROR,{callError:{scope:`network`,source:`api`,code:`fetch-failed`,description:`request-failed`}}),{errorText:e}),e}}_cacheParticipantExternalIds(e){e.forEach(e=>{let t=M.composeId(e),n=Q.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=M.composeDecorativeId(e),i=Q.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(e.decorativeUserId,e.id))}})}_setConversation(e,t,n,r=j.USER){let{participants:i}=t.conversation;t.conversationParams?.serverTime&&(this._serverTimeOffset=t.conversationParams.serverTime-Date.now()),this._cacheParticipantExternalIds(i);let a=this._api.getUserId(),o=this._extractLocalParticipantFromConnection(t),s=e.device_idx||0;if(!a){if(!o)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`anonymous-local-participant-missing`}});a=Number(o.id),o.idType&&(r=o.idType),o.deviceIdx&&(s=o.deviceIdx),this._api.setUserId(a)}let c=M.composeParticipantId(a,r,s);this._conversation={userId:a,compositeUserId:c,externalId:this._getExternalIdByParticipantId(c),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||Y.DIRECT,direction:n,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:o?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},this._debug.setConversationId(t.conversation.id||e.id),e.p2p_forbidden&&(N.forceRelayPolicy=e.p2p_forbidden),this._stats.logger.log(w.RELAY_POLICY,N.forceRelayPolicy?`1`:`0`),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new k(O.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`update-without-conversation`}});this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||Y.DIRECT,this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1,this._cacheParticipantExternalIds(e.conversation.participants??[])}_createMediaSource(){let e=new Xt(this._debug,this._stats.logger);return this.subscribe(e,Jt.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new ho(e,this._debug,this._stats.logger),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,K.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,K.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,K.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return this._stats.statAggregator.logEventualStat({name:U.SIGNALING_CONNECTED}),n}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(Ua.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}_onConversationParticipantListChunk(e){let t=e.participants;t&&R.onConversationParticipantListChunk(this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)),this.id)}_createParticipantListChunk(e){return{participants:[],countBefore:0,countAfter:0,markerFound:!1,...e}}_participantListChunkToExternalChunk(e){let t=this._participants,n=M.mapSharedParticipants(e.participants.reduce((e,n)=>{let r=M.composeId(n);return t[r]&&e.push(t[r]),e},[]));return{...e,participants:n}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let e of t)await this._registerParticipants(e?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let n=e[0]?.externalId?.type;n&&(N.externalUserType=n);let r=this._participants;for(let n of e){let e=M.composeId(n);if(z.test(`Conversation:RegisterParticipant`,e),this._isMe(e)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(this._debug.debug(`Local roles changed: ${n.roles}`),R.onLocalRolesChanged(this._conversation.roles,!0,this.id)),this._registerParticipantLocalMuteState(n);continue}if(n.state===Z.HUNGUP||n.state===Z.REJECTED){r[n.id]&&await this._removeParticipant(r[n.id],O.HUNGUP);continue}let i=M.composeDecorativeId(n);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(n,!0,!0),mediaSettings:D(n.mediaSettings),participantState:M.mapParticipantState(n),state:n.state,roles:n.roles||[],connectionStatus:this._buildConnectionStatus(e,n.sessionState,void 0,n.onHold),isOnHold:!!n.onHold,muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(e,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},i);let a=this._getParticipant(e);a&&n.roles&&n.roles.length&&(this._debug.debug(`Roles for participant [${e}] changed: ${n.roles}`),R.onRolesChanged(a.externalId,n.roles,!0,this.id)),a&&a.isOnHold&&R.onRemoteStatus([a.externalId],P.ONHOLD,null,this.id)}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let n=async()=>{let n=ao(e,Ja.MUTE),r=ao(e,Ja.MUTE_PERMANENT);for(let i of[n,r])i.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:i,stateUpdated:!0})};M.setImmediate(()=>n().catch(e=>this._debug.error(e)))}_remoteParticipantSessionState(e,t){if(!(!N.enableSessionStateUpdates||this._isMe(e)))return t}_buildConnectionStatus(e,t,n,r=!1){return to.create({transport:r?P.ONHOLD:to.fromTransportState(n)??P.WAITING,sessionState:this._remoteParticipantSessionState(e,t),sessionStateApplicable:this._isParticipantSessionStateApplicable(e)})}_isParticipantSessionStateApplicable(e){return N.enableSessionStateUpdates&&!this._isMe(e)&&this._conversation?.topology===Y.SERVER}_setTransportStatus(e,t){return to.setTransport(e.connectionStatus,t)}_setSessionState(e,t){let n=to.setSessionStateApplicable(e.connectionStatus,this._isParticipantSessionStateApplicable(e.id));this._emitParticipantTransition(e,n);let r=e.connectionStatus.sessionStateApplicable&&e.id===this._activeSpeakerId&&e.connectionStatus.transport===P.CONNECTED,i=to.setSessionState(e.connectionStatus,t,r);return this._emitParticipantTransition(e,i),i}_emitParticipantTransition(e,t,n=null){t.shouldNotify&&R.onRemoteStatus([e.externalId],t.status,n,this.id)}_registerParticipantInCache(e){return this._participants[e.id]=e,e}_getExistedParticipantByIdOrCreate(e){let t=this._participants[e];if(t)return t;let n=this._api.getDecorativeIdByInitialId(M.decomposeId(e).id),r=n?M.composeUserId(n):void 0,i=this._getParticipantId(e),{deviceIdx:a}=M.decomposeParticipantId(e);return this._createParticipant({id:e,externalId:{...i,deviceIdx:a}},r,!1)}_getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(N.useParticipantListChunk)return this._getExistedParticipantByIdOrCreate(e).externalId;let t=this._participants;if(t[e]?.externalId)return t[e].externalId;{let t=this._getParticipantId(e);return this._api.cacheExternalId(e,t),t}}_getExternalIdsByOkIdsFromCache(e){return e.map(e=>this._api.getCachedExternalIdByOkId(e)??Q.fromId(String(e)))}_getOrCacheExternalIdByCompositeId(e){let t=M.extractOkId(e),n=this._api.getCachedExternalIdByOkId(t);if(n)return n;let r=Q.fromId(String(t));return this._api.cacheExternalId(e,r),r}_registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(N.useParticipantListChunk){let n=this._registerParticipantInCache(this._getExistedParticipantByIdOrCreate(e));return n.markers=this._denormalizeMarkers(n.id,t),n}return this._participants[e]}_warnParticipantNotInConversation(e){this._debug.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let n=Object.values(t).find(e=>`ts`in e&&`rank`in e);return Object.entries(t).reduce((t,[r,i])=>(t[r]={...n,...i,id:e},t),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let n=oo(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=uo(e,r));let i=Object.keys(r),a=this._conversation?.roomId;i.length&&this._onMuteParticipant({muteStates:r,mediaOptions:i,muteAll:!0,stateUpdated:!0,roomId:a},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}_processPinnedParticipants(e){e.conversation.pinnedParticipantId?this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}_allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new ua(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._stats.logger,this._stats.statAggregator,this._stats.codecStatsAggregator,this._getFirstMediaSentCallback()),this._debugInfo=new So(this._debug),this.subscribe(this._transport,X.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,X.LOCAL_STATE_CHANGED,this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,X.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,X.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,X.AUDIO_MIX_STALL,this._onAudioMixStall.bind(this)),this.subscribe(this._transport,X.REMOTE_DATA_STATS,this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,X.SIGNALLED_STALLED_PARTICIPANTS,this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,X.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this)),this.subscribe(this._transport,X.NETWORK_STATUS,this._onNetworkStatus.bind(this)),this.subscribe(this._transport,X.REMOTE_STREAM_SECOND,this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,X.PEER_CONNECTION_CLOSED,this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,X.ASR_TRANSCRIPTION,this._onAsrTranscription.bind(this)),this.subscribe(this._transport,X.ANIMOJI_STREAM,this._onAnimojiStream.bind(this)),this.subscribe(this._transport,X.ANIMOJI_ERROR,this._onAnimojiError.bind(this));let e=this._conversation.direction===Va.OUTGOING&&!this._conversation.concurrent,t=this._participants;for(let n of Object.values(t))(n.state===Z.ACCEPTED||n.state===Z.CALLED)&&this._allocateParticipantTransport(n.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new ko(this._transport),this.subscribe(this._volumesDetector,Oo.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new jo(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,Ao.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Eo(this._mediaSource))}_createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Po(this._transport,this._volumesDetector,this._participants,this._debug,this._stats.logger))}_logDevices(){let e=E.getCameras().length,t=E.getMicrophones().length;this._debug.debug(`Cameras: `+e+(E.hasCameraPermission()?`✔`:`✖`)+`, Microphones: `+t+(E.hasMicrophonePermission()?`✔`:`✖`)),this._stats.logger.log(w.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){this._stats.logger.log(e,[t?.isAudioEnabled&&`audio`,t?.isVideoEnabled&&`video`].filter(Boolean).join(`_`))}async _removeParticipant(e,t){if(e.state===Z.CALLED||e.state===Z.ACCEPTED||this._state===`CLOSE`)return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let n=this._participants;if(n[e.id]){t===O.HUNGUP?this._setParticipantsStatus([e],P.HANGUP):this._setParticipantsStatus([e],P.ERROR,t),e.mediaSource?.disconnect(),this._displayLayoutRequester.cleanupParticipant(e.id),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[t,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(t),this._sequenceNumberByStreamDescription.delete(t),this._cooldownTimestampByStreamDescription.delete(t),this._streamWaitTimerByStreamDescription.has(t)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(t)),this._streamWaitTimerByStreamDescription.delete(t)),this._sendUpdateDisplayLayout({[t]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete n[e.id],R.onRemoteRemoved(e.externalId,e.markers,this.id)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener(`pagehide`,this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}_cleanupParticipants(){Object.values(this._participants).forEach(e=>{e.remoteStream?.getTracks().forEach(e=>e.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(e=>e.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){this._debug.debug(`cleaning up participant-agnostic streams`),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(e=>{e.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_finishLifecycle(e){this._stopFirstMediaSentProbe(),this._stats.logHangup(e)}_getFirstMediaSentCallback(){let{lifecycle:e}=this._stats;return e.firstMediaSentReported||e.terminated?null:()=>e.markFirstMediaSent()}_stopFirstMediaSentProbe(){this._transport?.stopFirstMediaSentProbe?.()}_cleanupTransportForHold(){this._transport&&(this._transport.holdClose(),this._transport=null),this._debugInfo&&(this._debugInfo=null),this._cleanupSpeakerDetector(),this._cleanupSpecListener()}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_disposeSignaling(e){if(!e){this._signaling.dispose();return}e.catch(e=>{e instanceof Tn||this._debug.warn(`[signaling] unable to send hangup`,e)}).finally(()=>this._signaling.dispose())}async _onAddParticipant(e,t,n){this._debug.debug(`Add new participant [${e}]`);let r=this._getParticipant(e);r&&this._updateParticipantExternalId(r,t);let i=!r;if(r&&(r.state===Z.ACCEPTED||r.state===Z.CALLED)){this._debug.warn(`Participant [${r.id}:${r.state}] is already in conversation`);return}if(!r){let n=M.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(t,!0,!0),mediaSettings:D(t.mediaSettings),state:t.state,roles:t.roles||[],connectionStatus:this._buildConnectionStatus(e,t.sessionState,this._transport?.getState(),t.onHold),isOnHold:!!t.onHold,muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},n),r=this._getParticipant(e)}this._setParticipantsStatus([r],P.WAITING),i&&this._emitParticipantEffectiveStatusIfSessionOverridesTransport(r),n?(r.state=Z.HUNGUP,await this._removeParticipant(r,n)):this._transport&&(r.state=Z.CALLED,this._allocateParticipantTransport(r.id,!0),this._stats.logger.log(w.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}_onRemoveParticipant(e){this._debug.debug(`Remove participant [${e}]`);let t=[],n=this._participants;for(let r=0;r<=ls;r++){let i=n[M.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let e of t)this._transport.close(e.id);this._stats.logger.log(w.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(S.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(S.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(S.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,n=null){if(!this._transport||!this._conversation)return;let r=!t,i=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let t=n??this._conversation.externalId.id;this._transport.setAnimojiSvg(i,{svg:e,userId:t,isMe:r});return}this._transport.setAnimojiSvg(i,{svg:e,isMe:r})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return this._stats.logger.log(w.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return this._stats.logger.log(w.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},n={};for(let t of e){let e=typeof t.uid==`object`?t.uid:Q.fromId(t.uid),r=Q.toString(e);n[r]=t.priority}let r=this._participants;for(let e of Object.values(r)){let r=Q.toString(e.externalId);Object.hasOwn(n,r)&&(t[e.id]=n[r])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[t,n]of Object.entries(e))if(t.length>5||n.length>5)throw Error(`key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded`);t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async hold(e,t){if(e){if(this._state===`HELD`)return;if(this._isWaitingForPromotion()){this._waitingHallHoldPending=!0,await this._holdLocally();return}await Promise.all([this._holdLocally(),this._signaling.hold(!0)]);return}if(this._isWaitingForPromotion()){this._waitingHallHoldPending=!1,await this._resumeLocalMedia(t,this._getWaitingForPromotionStatus()),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener();return}let n=ba.get();await this._signaling.hold(!1,n),this._restoreStateAfterHold();let r=null;if(this._state===`IDLE`&&this._participantState===Z.ACCEPTED&&(r=Object.values(this._participants),r.some(e=>e.state===Z.ACCEPTED)&&(this._state=`ACTIVE`,this._changeFeatureSet())),await this._resumeLocalMedia(t,P.WAITING),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._state===`ACTIVE`){let e=this._conversation?.direction===Va.OUTGOING&&!this._conversation.concurrent;this._openTransport(r??Object.values(this._participants),e)}}async _holdLocally(){this._state!==`HELD`&&(this._previousState=this._state,this._state=`HELD`);let e=this._mediaSource?.stopLocalMedia();this._cleanupTransportForHold(),R.onLocalStatus(P.ONHOLD,this.id),await e}async _resumeLocalMedia(e,t){this._restoreStateAfterHold(),await this._mediaSource?.resumeLocalMedia(e),R.onLocalStatus(t,this.id),this._mediaSource&&R.onLocalStream(this._mediaSource?.getStream()??null,this._mediaSource.mediaSettings,this.id)}_restoreStateAfterHold(){this._state===`HELD`&&(this._state=this._previousState||`ACTIVE`,this._previousState=null)}_isWaitingForPromotion(){return!!this._conversation?.waitingHall||!!this._conversation?.waitForAdmin}_getWaitingForPromotionStatus(){return this._conversation?.waitForAdmin?P.WAIT_FOR_ADMIN:P.WAITING_HALL}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[Mn(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready)return;this._debug.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},n=[],r=this._participants;for(let i of e){let e=typeof i.uid==`object`?i.uid:Q.fromId(i.uid),a=this._api.getCachedOkIdByExternalId(e);if(!a){let t=Q.toString(e);this._debug.log(`Unknown participant external ID ${t}`);continue}let o=Mn({participantId:a,mediaType:i.mediaType,streamName:i.streamName}),s=r[a];s?n.push(()=>{s.lastRequestedLayouts[o]=i}):this._isMe(a)&&n.push(()=>{this._myLastRequestedLayouts[o]=i}),Dn(i)?(this._isMe(a)&&n.push(()=>{delete this._myLastRequestedLayouts[o]}),this._streamIdByStreamDescription.has(o)&&!this._cooldownTimestampByStreamDescription.has(o)&&this._cooldownTimestampByStreamDescription.set(o,Date.now())):(this._cooldownTimestampByStreamDescription.delete(o),!this._streamIdByStreamDescription.has(o)&&N.videoTracksCount>0&&this._streamIdByStreamDescription.set(o,null),t[o]=i),i.mediaType===H.SCREEN&&!Dn(i)&&G.setMark(G.getMarkNameScreenshareFirstFrame(a))}let i=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>N.videoTracksCount;){let e=i.next();if(e.done){this._debug.error(`Cannot accommodate all streaming requests: tracks available `+N.videoTracksCount+`; requested streams: `+Array.from(this._streamIdByStreamDescription.keys()));break}this._stopStreaming(e.value),t[e.value]={stopStream:!0}}if(this._transport?.getTopology()!==Y.SERVER){n.forEach(e=>e());return}await this._sendUpdateDisplayLayout(t),n.forEach(e=>e())}async requestDisplayLayout(e){return this._displayLayoutRequester.request(e)}async feedback(e){return this._signaling.feedback(e)}_stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(this._debug.log(`Client asked to stop streaming before stream became available`,e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let t=this._participants,n=Nn(e),r=t[n.participantId],i=this._conversation?.externalId,a=this._isMe(n.participantId);if(r||a){switch(n.mediaType){case H.STREAM:case H.MOVIE:if(n.streamName){let e={stream:null,streamName:n.streamName,mediaType:n.mediaType};a?R.onLocalLive(i,e,this.id):R.onRemoteLive(r.externalId,e,this.id)}break;case H.CAMERA:R.onRemoteStream(r.externalId,null,this.id);break;case H.SCREEN:R.onRemoteScreenStream(r.externalId,null,this.id);break}this._stats.logger.log(w.PAT_DEALLOCATED)}else this._debug.log(`Cannot find participant to stop streaming: ${n.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;this._debug.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let n;try{if(n=await this._signaling.updateDisplayLayout(e),!n)return}catch(n){if(this._debug.warn(`Failed to update display layout ${JSON.stringify(e)}. ${n}`),t)throw n;return}let r=[],i=this._participants;for(let[e,t]of Object.entries(n.errorCodeByParticipantId||{})){let n=Nn(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=Za(t):(this._debug.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=Xa.UNKNOWN_ERROR),r.push({externalId:a.externalId,errorReason:e})}}if(r&&r.length&&(this._debug.warn(`Could not allocate one or more participants`,r),t))throw new ds(`Could not allocate one or more participants`,r)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let n=t.next();if(n.done)break;let r=n.value;if(r[1]+ss>Date.now())break;let i=r[0];await this._stopStreaming(i),e[i]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;this._debug.log(`Received participant sources update notification`,t);for(let e of t)this._waitForStreamIfNeeded(e)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(this._debug.log(`Promoted in audience mode`,!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.mediaSettings)):(this._debug.log(`Promoted in waiting hall`,!e.demote),e.demote?(this._debug.log(`Kicked from waiting hall`),this._close(new k(O.REMOVED))):(this._updateConversation(e),this._waitingHallHoldPending?(await this._signaling.hold(!0),await this._onJoinPart2(e,!1),this._waitingHallHoldPending=!1):B.getActive()&&N.hold?(await this._signaling.hold(!0),await this._onJoinPart2(e,!0,!0),this._waitingHallHoldPending=!1):await this._onJoinPart2(e))),R.onPromoted(e.demote,this.id)}async _onChatRoomUpdated(e,t=0,n=[],r,i){this._debug.log(`Chat room updated: ${e}`);let a=[];n.length&&n.forEach(e=>{if(e.externalId){let t=Q.fromSignaling(e.externalId);a.push(t),this._api.cacheExternalId(e.id.id,t)}else a.push(this._getOrCacheExternalIdByCompositeId(e.id.id))});let o=r?.map(e=>this._getOrCacheExternalIdByCompositeId(e))??[],s=i?.map(e=>this._getOrCacheExternalIdByCompositeId(e))??[];R.onChatRoomUpdated(e,t,a,o,s,this.id)}_onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let n of e.data)if(this._isMe(n.participantId))R.onLocalLiveUpdate(t,n,this.id);else{let e=this._getExternalIdByParticipantId(n.participantId);e&&R.onRemoteLiveUpdate(e,n,this.id)}}_onSharedMovieInfoStarted(e){this._debug.log(`Shared movie started data received: ${e.notification}`),this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}_processSharedMovieInfos(e,t=null){e&&e.forEach(e=>this._processSharedMovieInfo(e,t))}_processSharedMovieInfo(e,t=null){if(!e)return;let n=this._conversation?.externalId;if(this._isMe(e.initiatorId))R.onLocalSharedMovieInfo(n,e,t,this.id);else{let n=this._getExternalIdByParticipantId(e.initiatorId);n&&R.onRemoteSharedMovieInfo(n,e,t,this.id)}}_processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(e=>this._isMe(M.composeId(e)));this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}_processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let t of e.rooms.rooms)t.asrInfo&&this._conversation?.asrInfoByRoom.set(t.id,t.asrInfo);let n=e?.rooms?.roomId??this._conversation?.roomId??null,r=this._conversation?.asrInfoByRoom.get(n);if(r){let e=this._getExternalIdByParticipantId(r.initiatorId);e&&R.onAsrSet({externalId:e,movieId:r.movieId},n,this.id)}else n&&R.onAsrSet(null,n,this.id)}_processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,n=this._conversation.roomId,r=t.get(n);if(r&&!this._isMe(r.initiatorId)){let e=this._getExternalIdByParticipantId(r.initiatorId);e&&R.onRemoteSharedUrl(e,r.sharedUrl,n,this.id)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let n of e.rooms.rooms)n.urlSharingInfo?t.set(n.id,n.urlSharingInfo):t.delete(n.id)}_onSharedMovieInfoStopped(e){this._debug.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:n,movieId:r,source:i,roomId:a=null}=e,o={initiatorId:n,movieId:r,source:i};if(this._isMe(n))R.onLocalSharedMovieStoppedInfo(t,o,a,this.id);else{let e=this._getExternalIdByParticipantId(n);if(e){let t=this._participants[n];t?.movieShareInfos&&(t.movieShareInfos=t.movieShareInfos.filter(e=>e&&e.movieId!==r)),R.onRemoteSharedMovieStoppedInfo(e,o,a,this.id)}}}_onUrlSharingInfoUpdated(e){if(this._debug.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:n}=this._conversation,{initiatorId:r,sharedUrl:i,roomId:a=null}=e;if(i?t.set(a,{sharedUrl:i,initiatorId:r}):t.delete(a),!(!i&&a!==n&&t.has(n))&&(!i||!this._isMe(r))){let e=this._getExternalIdByParticipantId(r);e&&R.onRemoteSharedUrl(e,i,a,this.id)}}_onFeaturesPerRoleChanged(e){this._debug.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),R.onFeaturesPerRoleChanged(e.featuresPerRole,this.id)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let t=this._getStreamDescriptionById(e.streamId);if(t){let e=Nn(t),n=this._getParticipant(e.participantId);R.onRemoteScreenStream(n.externalId,null,this.id);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:n,participantId:r}=t;if(n===H.ANIMOJI)return;let i=this._getParticipant(r);if(n===H.SCREEN&&!e.fastScreenShare){this._debug.log(`skipping participant-sources-update notification since screenshare will be received over datachannel`);return}let a=Mn(t),o=this._sequenceNumberByStreamDescription.get(a);if(o&&o>e.sequenceNumber){this._debug.warn(`Participant ${r} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${o}`),this._stats.logger.log(w.PAT_OUTDATED_RESPONSE);return}i&&e.suspend!==void 0&&n&&(this._debug.debug(`participant-sources-update: mediaType=${n}, suspend=${e.suspend}`),R.onRemoteStreamSuspended(i.externalId,n,e.suspend,this.id));let s=e.streamId,c=e.rtpTimestamp?this._getWaitingTime(s,e.rtpTimestamp):0;if(c<=0){this._streamWaitTimerByStreamDescription.delete(a);let t=this._conversation?.externalId,n=this._isMe(r);if(!i&&!n){this._stats.logger.log(w.PAT_ERROR,`participantMissing`),this._debug.error(`Could not find participant by ID: ${r}`);return}let o=n?t:i.externalId,c=this._streamByStreamId.get(s);if(!c){this._stats.logger.log(w.PAT_ERROR,`streamNotFound`),this._debug.error(`Could not find stream by ID: ${s}`);return}this._stats.logger.log(w.PAT_ALLOCATED),this._streamIdByStreamDescription.set(a,s);let l=e.participantStreamDescription?.mediaType;if(l===H.STREAM||l===H.MOVIE){if(e.participantStreamDescription?.streamName){let t={streamName:e.participantStreamDescription.streamName,stream:c,mediaType:l};n?R.onLocalLive(o,t,this.id):R.onRemoteLive(o,t,this.id)}}else l===H.SCREEN?R.onRemoteScreenStream(i.externalId,c,this.id):n||R.onRemoteStream(i.externalId,c,this.id)}else{this._debug.debug(`Waiting for ${c} until stream ${s} for ${a} is switched`);let t=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),c);this._streamWaitTimerByStreamDescription.set(a,t)}}_getStreamDescriptionById(e){for(let[t,n]of this._streamIdByStreamDescription.entries())if(n===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(Mn(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(Mn(e)))return e}else{let e={participantId:t,mediaType:H.CAMERA};if(this._streamIdByStreamDescription.has(Mn(e)))return e;let n={participantId:t,mediaType:H.SCREEN};if(this._streamIdByStreamDescription.has(Mn(n)))return n}return this._debug.error(`Received unrequested allocation`,e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw Error(`transport is not initialized`)}_isCallAdmin(){return this._conversation?M.includesOneOf(this._conversation.roles,[Qa.ADMIN,Qa.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!M.includesOneOf(this._conversation.roles,[Qa.ADMIN,Qa.CREATOR]))throw Error(`You don't have the required permission`)}_isCalledState(){return this._participantState===Z.CALLED}async grantRoles(e,t,n){this._checkAdminRole(),await this._signaling.grantRoles(e,t,n)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,n=[],r=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,n,r)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,n=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,n),this._conversation?.pinnedParticipantIdByRoom.set(n,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===Y.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===Y.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=qa(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=io(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=e?M.composeUserId(e):r.id}let i=await this._signaling.getWaitingHall(r,t,n);if(i.error)return Promise.reject(i.message);let a=i.participants||[],{externalIds:o}=await this._resolveWaitingHallExternalIds(a),s=null;return a.length&&i.hasMore&&(s=ro(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=[],n=[];return e.length&&e.forEach(e=>{if(e.externalId){let r=Q.fromSignaling(e.externalId);t.push(e.id.addedTs),n.push(r),this._api.cacheExternalId(e.id.id,r)}else n.push(this._getOrCacheExternalIdByCompositeId(e.id.id)),t.push(e.id.addedTs)}),{externalIds:n,timestamps:t}}async getAudienceModeHands(){if(!this._signaling.ready)throw Error(`Signaling is not ready`);let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:n,timestamps:r}=await this._resolveWaitingHallExternalIds(t);return{timestamps:r,participants:n,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!M.includesOneOf(this._conversation.options,[Ga.WAITING_HALL,Ga.AUDIENCE_MODE]))throw Error(`Unable to promote a participant in the conversation with current options`);if(this._checkAdminRole(),!e&&t)throw Error(`participantId is required`);await this._signaling.promoteParticipant(e,t)}catch(t){throw this._debug.warn(`Failed to promote participant ${e}. ${t}`),t}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let e=t.messages.length-1;e>=0;e--){let n=t.messages[e];this._onChatMessage(n)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let e=(await this._api.createJoinLink(this._conversation.id)).join_link;if(e)return this._conversation.joinLink=e,e}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:n,lang:r}){let i={movieId:e,lang:r};(t||t===0)&&(i.gain=t),n&&(i.metadata=n);let a=await this._signaling.addMovie(i);if(a.error)throw Error(a.error);return{movieId:a.movieId,streamType:a.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw Error(t.error)}async removeMovie(e){let t={movieId:e},n=await this._signaling.removeMovie(t);if(n.error)throw Error(n.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw Error(e.error)}async updateRooms(e,t){let n=await this._signaling.updateRooms(e,t);if(n.error)throw Error(n.error)}async activateRooms(e,t){let n=await this._signaling.activateRooms(e,t);if(n.error)throw Error(n.error)}async switchRoom(e,t){let n=await this._signaling.switchRoom(e,t);if(n.error)throw Error(n.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw Error(t.error)}async startStream(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o={movieId:n,name:t,privacy:r,groupId:i,roomId:a,streamMovie:!e},s=await this._signaling.startStream(o);if(s.error)return Promise.reject(Error(s.message))}async stopStream(e=null,t){let n=await this._signaling.stopStream({roomId:e,...t&&{remove:t}});if(n.error)return Promise.reject(Error(n.message))}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<N.videoMinWidth||e.height<N.videoMinHeight)throw Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<N.videoMinWidth||t.height<N.videoMinHeight)throw Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");N.videoEffectMaxHeight=t.height,N.videoEffectMaxWidth=t.width}N.videoMaxWidth=e.width,N.videoMaxHeight=e.height,this._debug.debug(`Set local video resolution:`,`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:``)),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(e=>({id:e.id,type:N.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),n=await this._signaling.getParticipants(t);if(n.error)throw Error(n.error);let r=n.participants,i=this._transport?.getState();return M.mapSharedParticipants(r.map(e=>{let t=M.composeId(e);return this._createParticipant({id:t,externalId:Q.fromSignalingParticipant(e,!0,!0),mediaSettings:D(e.mediaSettings),participantState:M.mapParticipantState(e),state:e.state,roles:e.roles||[],connectionStatus:this._buildConnectionStatus(t,e.sessionState,i,e.onHold),isOnHold:!!e.onHold,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(t,e.markers)},e.decorativeUserId)}))}async getParticipantListChunk(e){this._debug.log(`Request participant list chunk`,e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw Error(t.error);let n=this._createParticipantListChunk(t.chunk),r=this._participants,i=n.participants.filter(e=>!r[M.composeId(e)]);await this._registerParticipants(i);let a=this._transport?.getState();return n.participants.forEach(e=>{let t=M.composeId(e),n=r[t];this._updateParticipantExternalId(n,e),this._setSessionState(n,this._remoteParticipantSessionState(t,e.sessionState)),n.isOnHold||this._setTransportStatus(n,to.fromTransportState(a)??P.WAITING),n.movieShareInfos=e.movieShareInfos,Object.assign(n.mediaSettings,D(e.mediaSettings)),Object.assign(n.muteStates,e.muteStates),n.unmuteOptions=e.unmuteOptions??n.unmuteOptions,this._openTransport([n],!0)}),this._participantListChunkToExternalChunk(n)}async _getInitialParticiapntListChunk(){let e=N.participantListChunkInitIndex,t=N.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:`GRID`,fromIdx:e,count:t});return this._debug.debug(`Get initial participant list chunk`,n.chunk),n.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.mediaSettings;this._debug.debug(`Local media stream changed`,t),e.kind===A.audio&&this._mediaSource&&(this._audioFix=new ho(this._mediaSource,this._debug,this._stats.logger)),R.onLocalStreamUpdate(t,e.kind,this.id),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this.mediaSettings;this._debug.log(`Screen sharing changed`,e.track,t);let n=e.track?new MediaStream([e.track]):null;R.onScreenStream(n,t,this.id)}_changeRemoteMediaSettings(e,t){this._debug.debug(`Remote media settings changed [${e}]`,t);let n=this._conversation?.externalId;if(this._isMe(e)&&n){R.onLocalMediaSettings(n,t,this.id);return}let r=this._getParticipant(e);if(!r){this._warnParticipantNotInConversation(e);return}r.mediaSettings=t,[`ACTIVE`,`HELD`].includes(this._state)&&R.onRemoteMediaSettings(r.externalId,t,r.markers,this.id),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(n=>n.id===t||M.comparePeerId(n.peerId,e.peerId))}_changeLocalParticipantState(e){this._debug.debug(`Local participant state force changed by admin`,e),[`ACTIVE`,`HELD`].includes(this._state)&&R.onLocalParticipantState(e,!1,this.id)}async _changeRemoteParticipantState(e,t){this._debug.debug(`Remote participant state changed [${e}]`,t);let n=this._getParticipant(e);if(!n){this._warnParticipantNotInConversation(e);return}n.participantState=t||{},[`ACTIVE`,`HELD`].includes(this._state)&&R.onRemoteParticipantState(n.externalId,n.participantState,n.markers,this.id)}_changeMultipleParticipantState(e,t){this._debug.debug(`Multiple participants state changed`,e);let n=[],r,i=this._participants;e.forEach((e,t)=>{if(this._isMe(t))r=e;else{let r=i[t];if(!r){this._warnParticipantNotInConversation(t);return}r.participantState=e,n.push({externalId:r.externalId,participantState:{...e},markers:r.markers})}}),[`ACTIVE`,`HELD`].includes(this._state)&&(r&&R.onLocalParticipantState(r,!0,this.id),n.length&&R.onRemoteParticipantsState(n,t,this.id))}_invokeRolesChangedCallbackIfNeeded(e){this._state===`ACTIVE`&&e.roles&&e.roles.length&&(this._debug.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),R.onRolesChanged(e.externalId,e.roles,!0,this.id))}_onSignalingNotification(e){switch(e.notification){case q.ACCEPTED_CALL:return this._onAcceptedCall(e);case q.HUNGUP:return this._onHungup(e);case q.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case q.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case q.CLOSED_CONVERSATION:return this._onClosedConversation(e);case q.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case q.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case q.SESSION_STATE:return this._onSessionState(e);case q.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case q.RATE_CALL_DATA:return this._onNeedRate();case q.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case q.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case q.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case q.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case q.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case q.REGISTERED_PEER:return this._onPeerRegistered(e);case q.SWITCH_MICRO:return this._onMicSwitched(e);case q.CHAT_MESSAGE:return this._onChatMessage(e);case q.CUSTOM_DATA:return this._onCustomData(e);case q.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case q.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case q.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case q.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case q.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case q.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case q.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case q.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case q.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case q.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case q.FEEDBACK:return this._onFeedback(e);case q.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case q.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case q.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case q.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case q.ROOMS_UPDATED:return this._onRoomsUpdated(e);case q.ROOM_UPDATED:return this._onRoomUpdated(e);case q.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case q.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case q.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case q.ASR_STARTED:return this._onAsrStart(e);case q.ASR_STOPPED:return this._onAsrStop(e);case q.PROMOTION_APPROVED:return this._onPromotionApproved(e);case q.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case q.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e);case q.HOLD:return this._onParticipantHold(e);case q.TOPOLOGY_CHANGED:return this._onSignalingTopologyChanged(e)}}_onSignalingTopologyChanged(e){this._conversation&&e.topology!==this._conversation.topology&&(this._debug.log(`Signaling topology changed while transport is down: ${this._conversation.topology} -> ${e.topology}`),this._conversation.topology=e.topology)}_onPromotionApproved(e){let t=this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}R.onPromotionApproved(t,this.id)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversationParams?.serverTime&&(this._serverTimeOffset=e.conversationParams.serverTime-Date.now()),e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let n=Object.keys(this._participants),r=[];for(let n of e.conversation.participants){let e=M.composeId(n),i=n.roles||[];if(this._isMe(e)){$a(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:lo(n),unmuteOptions:n.unmuteOptions})};continue}r.push(e);let a=this._getParticipant(e);if(!a)await this._onJoinedParticipant({participantId:n.id,participant:n,mediaSettings:n.mediaSettings});else{this._updateParticipantSessionState(a,e,n.sessionState);let t=D(n.mediaSettings);Gt(t,a.mediaSettings)||this._changeRemoteMediaSettings(e,t);let r=M.mapParticipantState(n),o=a.participantState;M.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),$a(i,a.roles)||this._onRolesChanged(a.id,i),!!n.onHold!=!!a.isOnHold&&(a.isOnHold=!!n.onHold,this._setParticipantsStatus([a],n.onHold?P.ONHOLD:P.CONNECTED))}}let i=this._participants;for(let e of n)r.indexOf(e)<0&&i[e]&&this._removeParticipant(i[e],O.HUNGUP)}let n=[...e.participants?.participants??[],...e.rooms?.rooms.flatMap(e=>e.participants?.participants??[])??[]];await this._reconcileParticipantSessionStates(n);let r=e.rooms?.roomId??null;if(!this._conversation){this._debug.warn(`Conversation is empty, but should be filled`);return}this._conversation.roomId===r?this._processMuteStates(e,!0):await this._onRoomSwitched(r),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){this._debug.error(`Signaling failed`,e),this._close(e)}async _onAcceptedCall(e){let t=M.composeMessageId(e),n=M.getPeerIdString(e.peerId);if(this._debug.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new k(O.MISSED),{errorText:`Call accepted on other device`});return}this._conversation?.direction===Va.OUTGOING&&!this._conversation.concurrent&&this._stats.lifecycle.markOutgoingAccepted();let r=this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t),i=n?M.composeUserId(n,e.participantType):void 0;r=this._registerParticipantInCache(this._createParticipant({id:t,externalId:e.externalId?Q.fromSignaling(e.externalId,e.deviceIdx):void 0,mediaSettings:D(e.mediaSettings)},i))}else if(e.externalId){let t=Q.fromSignaling(e.externalId,e.deviceIdx);r.externalId=t,this._api.cacheExternalId(r.id,t)}r.state=Z.ACCEPTED,r.mediaSettings=D(e.mediaSettings),this._logWithMediaSettings(w.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===Va.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),this._state===`ACTIVE`&&this._transport&&this._transport.open([r.id],n),this._changeRemoteMediaSettings(t,r.mediaSettings),await this._changeRemoteParticipantState(t);let i=Object.keys(r.muteStates);i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),[`ACTIVE`,`HELD`].includes(this._state)&&R.onAcceptedCall(r.externalId,Sa.parseCapabilities(e.capabilities),this.id)}async _onHungup(e){this._debug.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=M.composeMessageId(e);if(this._conversation&&this._isMe(t)){let t={remote:!0,callError:e.callError,message:void 0};e.reason===O.OBSOLETE_CLIENT&&e.errorCode&&(t.message=e.errorCode),this._close(new k(e.reason,t));return}this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}if(this._transport&&this._transport.close(t),n.state=e.reason===O.REJECTED?Z.REJECTED:Z.HUNGUP,this._state!==`CLOSE`){let t=e.reason===O.OBSOLETE_CLIENT?O.OBSOLETE_CLIENT:O.HUNGUP;this._removeParticipant(n,t)}}_onSessionState(e){if(!N.enableSessionStateUpdates)return;let t=M.composeMessageId(e);if(this._isMe(t))return;this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}if(e.connected){let e=to.fromTransportState(this._transport?.getState());e&&this._setTransportStatus(n,e)}this._setSessionState(n,{connected:e.connected})}async _reconcileParticipantSessionStates(e){if(!N.enableSessionStateUpdates||!e.length)return;let t=this._participants;for(let n of e){let e=M.composeId(n),r=t[e];r&&!this._isMe(e)&&(this._updateParticipantExternalId(r,n),this._updateParticipantSessionState(r,e,n.sessionState))}}_updateParticipantExternalId(e,t){let n=Q.fromSignalingParticipant(t)??Q.fromSignalingParticipant(t,!1);n&&(e.externalId=n,this._api.cacheExternalId(e.id,n))}_updateParticipantSessionState(e,t,n){return this._setSessionState(e,this._remoteParticipantSessionState(t,n))}_emitParticipantEffectiveStatusIfSessionOverridesTransport(e){e.connectionStatus.sessionState?.connected!==!1||e.connectionStatus.lastEffective===e.connectionStatus.transport||R.onRemoteStatus([e.externalId],e.connectionStatus.lastEffective,null,this.id)}async _onAddedParticipant(e){this._debug.debug(`Participant added [${e.participantId}]`);let t=M.composeMessageId(e),n=this._getParticipant(t);n&&this._updateParticipantExternalId(n,e.participant);let r=!n;if(n&&n.state!==Z.HUNGUP&&n.state!==Z.REJECTED){this._debug.debug(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(r,!0,!0),mediaSettings:D(r.mediaSettings),state:r.state,participantState:M.mapParticipantState(r),roles:r.roles||[],connectionStatus:this._buildConnectionStatus(t,r.sessionState,this._transport?.getState(),r.onHold),isOnHold:!!r.onHold,muteStates:r.muteStates||{},unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[]},i),n=this._getParticipant(t)}n.state=Z.CALLED,n.mediaSettings=D(e.participant?.mediaSettings),n.participantState=M.mapParticipantState(e.participant),n.roles=e.participant?.roles||[],this._updateParticipantSessionState(n,t,e.participant.sessionState),this._setParticipantsStatus([n],P.WAITING),r&&this._emitParticipantEffectiveStatusIfSessionOverridesTransport(n),this._state!==`IDLE`&&this._transport&&this._allocateParticipantTransport(n.id,!0),R.onParticipantAdded(n.externalId,n.markers,this.id),this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n)}async _onJoinedParticipant(e){this._debug.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markOnJoin(this._transport?.getTopology());let t=M.composeMessageId(e),n=this._getParticipant(t);n&&this._updateParticipantExternalId(n,e.participant);let r=!n;if(n&&n.state===Z.ACCEPTED){this._debug.warn(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(r,!0,!0),mediaSettings:D(r.mediaSettings),state:r.state,participantState:M.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},movieShareInfos:r.movieShareInfos,unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[],connectionStatus:this._buildConnectionStatus(t,r.sessionState,this._transport?.getState(),r.onHold),markers:this._denormalizeMarkers(t,r.markers),isOnHold:!!r.onHold},i),n=this._getParticipant(t)}this._conversation&&this._conversation.direction===Va.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=Z.ACCEPTED,n.mediaSettings=D(e.mediaSettings),n.participantState=M.mapParticipantState(e.participant),n.roles=e.participant.roles||[],this._updateParticipantSessionState(n,t,e.participant.sessionState),e.participant.onHold?(n.isOnHold=!0,this._setParticipantsStatus([n],P.ONHOLD)):this._transport?.isAllocated(n.id)?this._setParticipantsStatus([n],P.CONNECTED):this._setParticipantsStatus([n],P.WAITING),r&&this._emitParticipantEffectiveStatusIfSessionOverridesTransport(n),this._state!==`IDLE`&&this._transport&&(this._transport.isAllocated(n.id)||this._allocateParticipantTransport(n.id,!0),this._transport.open([n.id],null,!!this._conversation?.observer)),R.onParticipantJoined(n.externalId,n.markers,this.id),this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n);let i=Object.keys(n.muteStates);i.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),this._processSharedMovieInfos(n.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new k(e.reason,{remote:!0,callError:e.callError}))}_onMediaSettingsChanged(e){let t=M.composeMessageId(e);this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteMediaSettings(t,D(e.mediaSettings))}async _onParticipantStateChanged(e){let t=M.composeMessageId(e),n=M.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(n):(this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,n))}_onParticipantsStateChanged(e){let{participants:t,roomId:n}=e;t.map(({id:e,markers:t})=>this._registerParticipantAndSetMarkersIfChunkEnabled(e,t));let r=new Map,i=t.map(({id:e,participantState:t})=>[e,this._getExternalIdByParticipantId(e)&&M.mapParticipantState({participantState:t})]);try{i.forEach(([e,t])=>{t&&r.set(e,t)}),this._changeMultipleParticipantState(r,n)}catch(e){this._debug.warn(`_onParticipantsStateChanged: Failed to get external ids. ${e}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),R.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource||this._state===`HELD`)return;let t=this._mediaSource.mediaSettings,n=D(e.mediaSettings);t.isAudioEnabled!==n.isAudioEnabled&&await this._mediaSource.toggleAudio(n.isAudioEnabled),t.isVideoEnabled!==n.isVideoEnabled&&await this._mediaSource.toggleVideo(n.isVideoEnabled),t.isScreenSharingEnabled!==n.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:n.isScreenSharingEnabled,fastScreenSharing:n.isFastScreenSharingEnabled,captureAudio:n.isAudioSharingEnabled})}_onSettingsUpdate(e){this._debug.debug(`Got settings update notification`,e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=Or(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){this._debug.debug(`Got video quality update notification`,e);let t={maxBitrateK:Math.round(e.quality.maxBitrate/1024),maxDimension:e.quality.maxDimension},n;n=e.mediaType&&e.mediaType===H.SCREEN?{camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,t)}:{camera:Object.assign({},this._serverSettings.camera,t),screenSharing:null,fastScreenSharing:null},this._serverSettings=Or(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){this._registeredPeerReceived=!0,this._clearCalleeUnavailableWatchdog();let t=M.composeMessageId(e),n=this._getParticipant(t);n&&(n.clientType=e.clientType,n.platform=e.platform,R.onPeerRegistered(this.id,[n.externalId]))}async _onMicSwitched(e){R.onDeviceSwitched(C.AUDIO,!e.mute,this.id),await this.toggleLocalAudio(!e.mute)}_onChatMessage(e){let t=M.composeMessageId(e),n=this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}R.onChatMessage(e.message,n,e.direct,this.id)}_onCustomData(e){if(Object.hasOwn(e.data,`sdk`))return;let t=M.composeMessageId(e),n=this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}R.onCustomData(e.data,n,e.direct,this.id)}_onRecordInfo(e,t=null){if(!this._conversation||!e)return;let n=this._conversation.recordsInfoByRoom.get(t);if(n?.recordMovieId!==e?.recordMovieId||n?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let n=this._getExternalIdByParticipantId(e.initiator);n?R.onRecordStarted(n,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t,this.id):this._warnParticipantNotInConversation(e.initiator)}}_onStopRecordInfo({participant:e,recordMovieId:t},n=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(n);if(!(!r||r.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(n,null),e){let t=this._getExternalIdByParticipantId(e);R.onRecordStopped(n,t??null,this.id)}else R.onRecordStopped(n,null,this.id)}_changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let n=this._getExternalIdByParticipantId(t);n&&R.onPinnedParticipant(n,!1,null,e,this.id)}}_changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let n=this._getExternalIdByParticipantId(t.initiator);n?R.onRecordStarted(n,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e,this.id):this._warnParticipantNotInConversation(t.initiator)}else R.onRecordStopped(e,null,this.id)}_changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let n=this._getExternalIdByParticipantId(t.initiatorId);n&&R.onAsrSet({externalId:n,movieId:t.movieId},e,this.id)}else R.onAsrSet(null,e,this.id)}_changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,n=t.get(e);if(n){let t=this._getExternalIdByParticipantId(n.initiatorId);t&&R.onRemoteSharedUrl(t,n.sharedUrl,e,this.id)}}_onParticipantAnimojiChanged(e){if(this._conversation){let t=this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}R.onParticipantVmojiUpdate(t,this.id)}}_onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,n=e.roomId||null;this._conversation.asrInfoByRoom.set(n,t);let r=this._getExternalIdByParticipantId(t.initiatorId);if(!r){this._warnParticipantNotInConversation(t.initiatorId);return}R.onAsrStarted(r,t.movieId,n,this.id)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),R.onAsrStopped(t,this.id)}_onAsrTranscription(e){if(!this._conversation)return;let t=this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}R.onAsrTranscription(t,e.text,e.timestamp,e.duration,this.id)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!$a(this._conversation.roles,t)){this._debug.debug(`Local roles changed: ${t}`),this._conversation.roles=t,R.onLocalRolesChanged(t,!1,this.id),this._processMuteState({mediaOptions:ao(this._getMuteStatesForCurrentRoom(),Ja.MUTE_PERMANENT),stateUpdated:!0}),M.includesOneOf(t,[Qa.ADMIN,Qa.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=this._getParticipant(e);n&&!$a(n.roles,t)&&(this._debug.debug(`Roles for participant [${e}] changed: ${t}`),n.roles=t,R.onRolesChanged(n.externalId,t,!1,this.id))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:n,muteStates:r={},unmuteOptions:i=[],mediaOptions:a=[],roomId:o=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){this._debug.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let t=this._getParticipant(e.participantId);if(t){this._debug.debug(`Mute states for participant [${e.participantId}] changed`,r);let o=e.adminId?this._getExternalIdByParticipantId(e.adminId):null;R.onMuteStates(r,i,a,n,e.unmute,t.externalId,o,e.stateUpdated,e.requestedMedia,e.roomId,this.id)}return}if(e.requestedMedia?.length||(n&&!t?this._setMuteStatesForRoomId(r,o):n||(this._conversation.muteStatesPersonal=r)),e.adminId&&this._isMe(e.adminId)){n&&R.onMuteStates(r,i,a,n,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId,this.id);return}await this._processMuteState({mediaOptions:a,muteAll:n,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:i,muteStates:r})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let n=this._getMuteStatesForRoomId(t),r=this._getMuteStatesForRoomId(e),i=Object.keys(n),a=Object.keys(r);this._processMuteState({mediaOptions:Array.from(new Set([...i,...a])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Z.ACCEPTED)return;let{mediaOptions:t=[],muteAll:n,unmute:r,stateUpdated:i,requestedMedia:a,roomId:o=null,unmuteOptions:s=[]}=e,c=e.adminId?this._getExternalIdByParticipantId(e.adminId):null,l=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(o)),u=this._mediaSource.mediaSettings,d=Object.entries(l);for(let[e,i]of d){let a=this._isCallAdmin()&&n;if(!(i!==Ja.MUTE&&i!==Ja.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===Ja.MUTE_PERMANENT&&!n&&(l[e]=Ja.MUTE),!(!t.includes(e)||r)))switch(e){case C.VIDEO:u.isVideoEnabled&&(R.onDeviceSwitched(C.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case C.AUDIO:u.isAudioEnabled&&(R.onDeviceSwitched(C.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case C.SCREEN_SHARING:u.isScreenSharingEnabled&&(R.onDeviceSwitched(C.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case C.AUDIO_SHARING:u.isAudioSharingEnabled&&(R.onDeviceSwitched(C.AUDIO_SHARING,!1,this.id),await this.toggleScreenCapturing({captureScreen:u.isScreenSharingEnabled,fastScreenSharing:u.isFastScreenSharingEnabled,captureAudio:!1}));break}}R.onMuteStates(l,s,t,n,r,null,c,i,a,o,this.id)}_onPinParticipant(e,t=!1,n,r=null){if(!this._conversation)return;let i=this._conversation.pinnedParticipantIdByRoom.get(r);if(i&&i!==e)if(this._isMe(i))R.onLocalPin(!0,r,this.id);else{let t=this._getExternalIdByParticipantId(i);t&&R.onPinnedParticipant(t,!0,this._denormalizeMarkers(e,n),r,this.id)}if(this._isMe(e))R.onLocalPin(t,r,this.id);else{let i=this._getExternalIdByParticipantId(e);i&&R.onPinnedParticipant(i,t,this._denormalizeMarkers(e,n),r,this.id)}this._conversation.pinnedParticipantIdByRoom.set(r,t?null:e)}_onOptionsChanged(e){this._conversation&&!Ka(this._conversation.options,e)&&(this._conversation.options=e,R.onOptionsChanged(e,this.id),e.includes(Ga.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&R.onLocalStatus(P.WAITING_HALL,this.id):e.includes(Ga.WAIT_FOR_ADMIN)&&this._conversation.restricted&&R.onLocalStatus(P.WAIT_FOR_ADMIN,this.id))}async _onNetworkStatus(e){if(this._conversation){let t=[],n=this._participants;for(let[r,i]of Object.entries(e)){let e;if(this._isMe(r)||r===``)e=this._conversation.networkRating;else if(n[r])e=n[r].networkRating;else continue;if(e!==i)if(this._isMe(r)||r===``)this._conversation.networkRating=i,Zr.getInstance().value=i,R.onLocalNetworkStatusChanged(i,this.id);else{let e=n[r];e.networkRating=i,t.push({uid:e.externalId,rating:i})}}if(t.length===0)return;this._debug.log(`Received network status update: `,e),R.onNetworkStatusChanged(t,this.id)}}async _emitHeldParticipantsStatus(){let e=Object.values(this._participants).filter(e=>e.isOnHold).map(e=>e.externalId);e.length&&R.onRemoteStatus(e,P.ONHOLD,null,this.id)}async _onRemoteStreamSecond(e,t){let n=this._getParticipant(e);n&&R.onRemoteScreenStream(n.externalId,t,this.id)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){R.onVmojiStream(t,this._mediaSource.mediaSettings,this.id);return}let n=this._getParticipant(e);n&&R.onRemoteVmojiStream(n.externalId,t,this.id)}_onAnimojiError(e){try{let t=this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,R.onVmojiError({...e,externalId:t},this.id))}catch(e){this._debug.warn(`_onAnimojiError failed`,e)}}_onPeerConnectionClosed(e){this._state!==`HELD`&&(e===Y.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy())}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(Wa.ADD_PARTICIPANT);R.onCallState(e,t,this._conversation,this.id)}}_changeFeaturesPerRole(){this._conversation&&R.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{},this.id)}_changeNeedRate(){this._conversation&&this._conversation.needRate&&R.onRateNeeded(this.id)}async _onVolumesDetected(e){let t=[];for(let[n,r]of Object.entries(e)){let e=this._getParticipant(n);e&&e.externalId&&t.push({uid:e.externalId,volume:r.real})}R.onVolumesDetected(t,this.id)}async _onSpeakerChanged(e){let t=this._activeSpeakerId;if(this._activeSpeakerId=e,t&&t!==e){let e=this._getParticipant(t);if(e?.connectionStatus.sessionStateConnectedBySpeaker){e.connectionStatus.sessionStateConnectedBySpeaker=!1;let t=this._setTransportStatus(e,e.connectionStatus.transport);this._emitParticipantTransition(e,t)}}let n=this._getParticipant(e);if(n){if(n.connectionStatus.sessionStateApplicable&&n.connectionStatus.sessionState?.connected===!1){let e=to.fromTransportState(this._transport?.getState());e&&this._setTransportStatus(n,e),n.connectionStatus.sessionStateConnectedBySpeaker=!0;let t=this._setTransportStatus(n,n.connectionStatus.transport);this._emitParticipantTransition(n,t)}this._lastSignalledActiveSpeakerId!==e&&(R.onSpeakerChanged(n.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}}async _onTransportStateChanged(e,t){this._debug.debug(`Transport state has changed: ${t}`,e);let n=to.fromTransportState(t);if(!n)return;let r=this._participants,i=[],a=e.reduce((e,n)=>{if(n in r){let a=r[n];e.push(a),t===J.CONNECTED&&(a.remoteStream||(a.mediaSettings&&this._changeRemoteMediaSettings(n,a.mediaSettings),this._changeRemoteParticipantState(n,a.participantState)),i.push(...Object.values(a.lastRequestedLayouts)))}else this._warnParticipantNotInConversation(n);return e},[]);a.length&&(this._updateDisplayLayoutFromCache(i),this._setParticipantsStatus(a,n))}async _onTransportLocalStateChanged(e){if(this._debug.debug(`Local transport state has changed: ${e}`),e===J.CONNECTED&&(E.releaseFirefoxMicrophonePermissionWarmup(),R.onLocalStatus(P.CONNECTED,this.id),this._transport?.getTopology()===Y.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e),this._displayLayoutRequester.resend()}this._state!==`HELD`&&((e===J.CONNECTING||e===J.RECONNECTING)&&this._areTransportParticipantsOnHold()||(e===J.CONNECTING&&R.onLocalStatus(P.CONNECTING,this.id),e===J.RECONNECTING&&R.onLocalStatus(P.RECONNECT,this.id),e===J.FAILED&&this._transport&&this._transport.allocated().length===0&&this._close(new k(O.FAILED,{callError:{scope:`network`,source:`rtc`,code:`connection-failed`,description:`transport-failed`}}),{errorText:`Transport failed`,signalingReason:O.FAILED})))}_areTransportParticipantsOnHold(){if(!N.hold||!this._transport)return!1;let e=this._transport.opened().length?this._transport.opened():this._transport.allocated();if(!e.length)return!1;let t=this._participants;return e.every(e=>t[e]?.isOnHold)}_onRemoteTrackAdded(e,t,n){if(e.endsWith(qr.AUDIO_MIX))this._debug.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),R.onRemoteMixedAudioStream(t,this.id);else if(e.startsWith(qr.TRANSPARENT_AUDIO_TRACK_PREFIX))this._debug.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(qr.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))this._debug.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{this._debug.debug(`Remote track added on the participant [${e}]`,{kind:n.kind});let r=this._getParticipant(e);if(!r){let t=this._api.getDecorativeIdByInitialId(e),n=t?M.composeUserId(t):void 0;this._debug.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${n}]`),this._registerParticipant({id:e},n),r=this._getParticipant(e),this._setParticipantsStatus([r],P.WAITING),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(R.onSpeakerChanged(r.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(r.id)&&this._allocateParticipantTransport(r.id,!1),n.kind===A.audio&&(this._audioOutput.add(e,n),N.preserveAudioTracks||(r.remoteAudioTrack=n,t.removeTrack(n))),r.remoteStream!==t&&t.getTracks().length){if(r.remoteStream=t,r.secondStream)return;R.onRemoteStream(r.externalId,t,this.id)}r.mediaSettings&&this._changeRemoteMediaSettings(e,r.mediaSettings)}}_onRemoteTrackRemoved(e,t,n){switch(this._debug.debug(`[${e}] remote track (removed)`,{track:n}),n.kind){case A.audio:this._removeAudioTrack(e,t,n);break;case A.video:case A.screen:this._removeVideoTrack(e,t,n);break}}async _removeAudioTrack(e,t,n){if(e!==qr.AUDIO_MIX){let n=this._getParticipant(e);if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(e,n)}_removeVideoTrack(e,t,n){}_onTopologyChanged(e){if(this._state===`HELD`){this._conversation&&(this._conversation.topology=e);return}if(this._statFirstMediaReceived.markTopologyChanged(e),e===Y.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation){this._conversation.topology=e;for(let e of Object.values(this._participants)){let t=to.setSessionStateApplicable(e.connectionStatus,this._isParticipantSessionStateApplicable(e.id));this._emitParticipantTransition(e,t)}this._changeFeatureSet(),this._forceOpenTransportForAloneInCall()}this._audioOutput.destroy()}_onAudioMixStall(e){this._audioMixStalled!==e&&!this.isCallHeld&&(this._audioMixStalled=e,this._debug.debug(`Audio mix stalled:`,e),R.onLocalStatus(e?P.RECONNECT:P.CONNECTED,this.id))}_onRemoteSignalledStall(e){let t={},n=[],r=[];this._debug.debug(`Participants stalled:`,e);let i=this._participants;for(let r of e){if(t[r]=!0,!this._lastStalled[r]){let e=i[r];e&&n.push(e)}delete this._lastStalled[r]}for(let e of Object.keys(this._lastStalled)){let t=i[e];t&&r.push(t)}n.length&&this._setParticipantsStatus(n,P.RECONNECT),r.length&&this._setParticipantsStatus(r,P.CONNECTED),this._lastStalled=t}_onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,this._participants),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!E.hasMicrophone()||!this._audioFix||!this.mediaSettings?.isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!E.hasCamera()||!this._audioFix||!this.mediaSettings?.isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!==`CLOSE`||!1;e&&(this._debug.debug(`Toggle join availability`,{available:t,chatId:e}),R.onJoinStatus(t,e,this.id))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()===Y.SERVER&&e.length)try{await this.updateDisplayLayout(e)}catch(e){this._debug.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){if(!e.length)return;let r=e.reduce((e,n)=>{var r;if(n.isOnHold&&![P.ONHOLD,P.HANGUP,P.ERROR].includes(t))return e;let i=this._setTransportStatus(n,t);return i.shouldNotify&&(e[r=i.status]??(e[r]=[])).push(n.externalId),e},{});for(let[e,t]of Object.entries(r))t.length&&R.onRemoteStatus(t,e,n,this.id)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),R.onJoinLinkChanged(e.joinLink,this.id)}_onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let n of Object.keys(Ya)){let r=e.updates[n];r&&(t[n]={rooms:r?.rooms?.map(this._convertRoomToExternal.bind(this))||[],roomIds:r?.roomIds,deactivated:r?.deactivated})}R.onRoomsUpdated(t,this.id)}_onRoomUpdated(e){let t=this._convertRoomToExternal(e.room||null);e.events.some(e=>e===Ya.UPDATE)&&(e.muteStates!==void 0&&this._setMuteStatesForRoomId(e.muteStates,e.roomId),e.recordInfo!==void 0&&this._conversation?.recordsInfoByRoom.set(e.roomId,e.recordInfo),e.asrInfo!==void 0&&this._conversation?.asrInfoByRoom.set(e.roomId,e.asrInfo)),this._isCalledState()||R.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null,this.id)}_convertRoomToExternal(e){if(!e)return null;let t=e.participantIds?.map(e=>this._getExternalIdByParticipantId(e))||[],n=e.addParticipantIds?.map(e=>this._getExternalIdByParticipantId(e))||[],r=e.removeParticipantIds?.map?.(e=>this._getExternalIdByParticipantId(e))||[],i=e.pinnedParticipantId?this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:n,removeParticipantIds:r,participants:e.participants?.participants?this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:i,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=e.addedParticipantIds?.map(e=>M.decomposeId(e).id)||[],i=this._getExternalIdsByOkIdsFromCache(r),a=e.addedParticipants;if(i.length&&a?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);a=(await this._signaling.getParticipants(e)).participants}let o=a?.map(e=>{let r=M.composeId(e);return this._createParticipant({id:r,externalId:Q.fromSignalingParticipant(e,!0,!0),mediaSettings:D(e.mediaSettings),participantState:M.mapParticipantState(e),state:e.state,roles:e.roles||[],connectionStatus:this._buildConnectionStatus(r,e.sessionState,t,e.onHold),isOnHold:!!e.onHold,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(r,e.markers),isInRoom:n!==null},e.decorativeUserId)})||[],s=!1;for(let e of o)e.id===this._conversation?.compositeUserId&&(s=!0),this._registerParticipantInCache(e);this._transport?.getState()===J.IDLE&&!this._isCalledState()&&this._openTransport(o,!0);let c=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);c.push(e)}}if(s&&await this._onRoomSwitched(n),c){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=this._getExternalIdByParticipantId(e);if(t){for(let e of c)if(Q.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let l={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:M.mapSharedParticipants(o),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:c};this._isCalledState()||R.onRoomParticipantsUpdated(l,this.id)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let n=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){R.onRoomStart(e,this.id);return}this._isCalledState()||R.onRoomSwitched(e,this.id),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,n),this._changeAsrInfoForRoom(),this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let n=t?.rooms?.rooms??[],r=[];for(let t of n){let n=t.id??null;if(this._setMuteStatesForRoomId(t.muteStates,n),this._conversation?.recordsInfoByRoom.set(n,t.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(n,t.pinnedParticipantId??null),t.asrInfo&&this._conversation?.asrInfoByRoom.set(n,t.asrInfo),t.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(n,t.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(n),e){let e=this._participants;await this._registerParticipants(t?.participants?.participants?.filter(t=>!e[M.composeId(t)])||[],!0);let n=this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&R.onRoomsUpdated({[Ya.UPDATE]:{rooms:r}},this.id)}_onFeedback(e){let t=[];for(let n of e.feedback){let e={...n,items:[]};for(let t of n.items){let n=this._getExternalIdByParticipantId(t.participantId);n?e.items.push({...t,participantId:n}):this._warnParticipantNotInConversation(t.participantId)}t.push(e)}R.onFeedback(t,e.roomId,this.id)}_onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:n,decorativeExternalParticipantId:r}=e,i=this._isMe(t);this._debug.debug(`Decorative participant id changed [${t}]`,e);let a=this._getExternalIdByParticipantId(t);if(!a){this._warnParticipantNotInConversation(t);return}let o=Q.fromSignaling(r,a.deviceIdx);if(R.onParticipantIdChanged(a,o,this.id),this._api.cacheExternalId(n,o),this._api.mapDecorativeId(n,t),i)this._conversation.externalId=o;else{let e=this._participants;e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==Y.SERVER||(this._debug.debug(`Video suspend suggested`,e),R.onVideoSuspendSuggest(e.bandwidth,this.id))}async _onParticipantHold(e){this._debug.debug(`Participant hold suggested`,e);let t=this._getParticipant(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}if(t.isOnHold=e.hold,this._specListener?.onParticipantHoldChanged(),this._transport?.setRemoteHold(e.hold),e.hold)this._setParticipantsStatus([t],P.ONHOLD);else{let e=this._transport?.getTopology()===Y.DIRECT?P.CONNECTING:P.CONNECTED;this._setParticipantsStatus([t],e)}}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()===Y.SERVER&&this._transport?.getState()===J.IDLE&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){let n=this._createParticipant(e,t);this._registerParticipantInCache(n)}_getParticipant(e){return this._participants[e]}},us=null,ds=class e extends Error{constructor(t,n){super(t),h(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},fs=null,ps=null,ms=64*1024;function hs(){fs=null,ps=null}function gs(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function _s(e=null,t){let n=gs(e??N.apiBaseUrl);if(n)return n;if((t??N.apiEnv)!==`AUTO`)return N.apiEndpoint(t);try{let e=atob(`aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ=`),t=(await(await fetch(e,{method:`GET`,mode:`cors`,cache:`no-cache`})).json())?.Answer[0]?.data;if(!t)throw Error(`Wrong DNS response`);return z.debug(`Resolved API endpoint`,t),t}catch(e){return z.warn(`Failed to resolve API endpoint using DNS, default is used`,e),N.apiEndpoint(t)}}async function vs(){return fs||ps||(ps=_s(),fs=await ps,ps=null,fs)}async function ys(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await vs();let r=Ts(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${fs}/fb.do`,i)}async function bs(e,t={},n=!1,r){return await vs(),Ss(Ts(e,t,n),r)}async function xs(e,t={},n=!1){await vs();let r=Ts(e,t,n);return Ss(r,void 0,new Blob([r]).size<=ms)}async function Ss(e,t,n=!1){let r=`${t??fs}/fb.do`,i=new AbortController,a=new k(S.NETWORK,{callError:{scope:`network`,source:`api`,code:`timeout`,description:`request-timeout`}}),o=setTimeout(()=>i.abort(a),N.apiTimeout);try{let t=await fetch(r,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:e,signal:i.signal,...n&&{keepalive:!0}}),a=await t.text(),o;try{o=JSON.parse(a)}catch{o={result:a}}if(!t.ok&&!Cs(o))throw new k(S.API,{callError:{scope:`server`,source:`api`,code:`http-${t.status}`,description:`http-error`}});if(Cs(o))throw o;return o}catch(e){throw e instanceof k?e:i.signal.aborted?a:Cs(e)?e:new k(S.NETWORK,{callError:{scope:`network`,source:`api`,code:`fetch-failed`,description:`request-failed`}})}finally{clearTimeout(o)}}function Cs(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.error_code==`number`&&typeof t.error_msg==`string`}async function ws(e,t){try{let n=await fetch(e,{method:`POST`,body:t});if(!n.ok)throw Error(`HTTP error! status: ${n.status}`);let r=await n.text();z.debug(`Form data sent successfully`,r)}catch(e){throw z.warn(`Failed to send form data`,e),e}}function Ts(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=N.apiKey),n||(b.sessionKey?t.session_key=b.sessionKey:b.accessToken&&(t.access_token=b.accessToken));for(let[e,n]of Object.entries(t))typeof n==`object`&&(t[e]=JSON.stringify(n));let r=``;for(let[e,n]of Object.entries(t))r&&(r+=`&`),r+=`${e}=${encodeURIComponent(n)}`;return r}var Es=class{constructor(){h(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}async createJoinLink(e){return{join_link:`nop`}}async removeJoinLink(e){return{success:!0}}async getAnonymTokenByLink(e,t){return``}log(e){}logClientStats(e){}getCachedOkIdByExternalId(e){return null}getCachedRawOkIdByExternalId(e){return null}getCachedExternalIdByOkId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}replaceByInitialIdIdIfExists(e){return typeof e==`string`?parseInt(e,10):e}hangupConversation(e,t=O.HUNGUP,n){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}async getInbounds(){return[]}},Ds=class e{constructor(){h(this,`_okIdToExternalId`,new Map),h(this,`_externalIdToOkId`,new Map),h(this,`_decorativeIdToInitialId`,new Map),h(this,`_initialIdToDecorativeId`,new Map)}static _normalizeType(e){return e.type===no.GROUP?{...e,type:no.USER}:e}getOkId(t){let n=Q.toString(e._normalizeType(t)),r=this._externalIdToOkId.get(n);return r==null?null:this.replaceByInitialIdIdIfExists(r)}getExternalId(e){let t=this.getDecorativeIdByInitialId(e)??e,n=this._okIdToExternalId.get(t);return n==null?null:Q.fromString(n)}hasByExternalId(t){return this._externalIdToOkId.has(Q.toString(e._normalizeType(t)))}hasByOkId(e){return this._okIdToExternalId.has(e)}cache(t,n){let r=M.extractOkId(t),i=e._normalizeType(n),a=Q.toString(i);this._okIdToExternalId.set(r,a),this._externalIdToOkId.set(a,r)}mapDecorativeId(e,t){let n=M.extractOkId(e),r=M.extractOkId(t);this._decorativeIdToInitialId.set(n,r),this._initialIdToDecorativeId.set(r,n)}unmapDecorativeId(e){let t=M.extractOkId(e),n=this.getDecorativeIdByInitialId(t);n&&this._decorativeIdToInitialId.delete(n),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=M.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=M.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}getParticipantIdByExternalId(e){let t=this.getOkId(e);return t==null?null:M.composeParticipantId(t,j.USER,e.deviceIdx??0)}clear(){this._okIdToExternalId.clear(),this._externalIdToOkId.clear(),this._decorativeIdToInitialId.clear(),this._initialIdToDecorativeId.clear()}},Os=`anonymLogin:`,ks=700,As=3e3;function js(e){let t=e.error_code;switch(t){case 2:return Ms(O.SERVICE_UNAVAILABLE,t,`service-unavailable`);case 4:return e.error_msg.includes(`participants.limit.exceeded`)?Ms(O.PARTICIPANT_LIMIT_REACHED,t,`participants-limit-exceeded`):Ms(S.API,t,`request-error`);case 300:return Ms(O.NOT_FOUND,t,`not-found`);case 1101:return Ms(O.SERVICE_DISABLED,t,`vchat-service-disabled`);case 1102:return Ms(O.CALLEE_IS_OFFLINE,t,`target-user-unavailable`);case 1103:return Ms(O.NOT_FRIENDS,t,`friendship-required`);case 1104:return Ns(t,`youla-api-error`);case 1106:return Ns(t,`vk-api-error`);case 1113:return Ms(O.CALLER_IS_REJECTED,t,`caller-is-rejected`);case 1114:{let n=e.custom_error?.vchat_detailed_api_error?.code,r=n?.startsWith(`obsolete_client`);return Ms(r?O.OBSOLETE_CLIENT:O.VCHAT_DETAILED_ERROR,t,n??`detailed-error`,r?n:void 0)}default:return Ms(S.API,t,`api-error`)}}function Ms(e,t,n,r){return{type:e,callError:{scope:`server`,source:`api`,code:t,description:n},message:r}}function Ns(e,t){return{type:O.EXTERNAL_API_ERROR,callError:{scope:`external`,source:`api`,code:e,description:t}}}var Ps=class extends Es{constructor(...e){super(...e),h(this,`_uuid`,void 0),h(this,`_idCache`,new Ds)}async _callUnsafe(e,t={},n=!1){let r=async i=>{try{return await bs(e,t,n)}catch(t){if(!t||typeof t!=`object`||!Object.hasOwn(t,`error_msg`)){i++;let n=t&&(typeof t==`object`||typeof t==`function`)?Object.getOwnPropertyNames(t).map(e=>`${e}: ${JSON.stringify(t[e])}`):[String(t)];if(z.debug(`${e} network error, attempt ${i}: ${n.join(`
14
+ `)}`),this._abortSignal?.aborted&&(z.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),i<N.apiMaxAttempt)return await M.delay(Math.min(i*ks,As),{signal:this._abortSignal}),r(i)}throw z.warn(e,`error`,t),t}};return r(0)}async _call(e,t={},n=!1,r=!0){try{return await this._callUnsafe(e,t,n)}catch(i){if(z.warn(`Api call error`,i),i instanceof k)throw i;switch(i?.error_code){case 102:case 103:case 104:if(!r)break;return await this._reauthorize(),this._call(e,t,n,!1)}let a={message:i?.error_msg,code:i?.error_code};if(i.custom_error&&(a.custom_error=i.custom_error),Fs(i)){let e=js(i);throw a.callError=e.callError,a.message=e.message??a.message,new k(e.type,a)}throw new k(S.API,a)}}userId(e){let{compositeUserId:t}=M.decomposeParticipantId(e),{id:n}=M.decomposeId(t);return b.isEmpty()?Q.fromId(String(n)):this._idCache.getExternalId(n)||Q.fromId(String(n))}async authorize(){if(this._ensureUuid(),!N.apiKey)throw new k(S.API,{message:`Required argument apiAppKey not passed`,callError:{scope:`internal`,code:`configuration`,description:`api-key-missing`}});let e=this._getCachedAnonymLogin();if(e){this._applyAnonymLogin(e);return}let t={session_data:{version:2,device_id:this._uuid,client_version:N.appVersion,client_type:`SDK_JS`}};return N.authToken&&(t.session_data.auth_token=N.authToken,t.session_data.version=3),this._callUnsafe(`auth.anonymLogin`,t,!0).then(e=>{this._applyAnonymLogin(e),this._setCachedAnonymLogin(e)}).catch(e=>{throw e instanceof k?e:(e?.error_code===401&&(this._removeCachedAnonymLogin(),R.onTokenExpired()),new k(S.AUTH,{message:e?.error_msg,code:e?.error_code,callError:{scope:`server`,source:`api`,code:e?.error_code??`authentication`,description:`authentication-failed`}}))})}_getAnonymLoginCacheKey(){return N.authToken?`${Os}${N.authToken}`:null}_getCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();if(!e)return null;let t=ot.get(e);return Is(t)?t:(t&&ot.remove(e),null)}_setCachedAnonymLogin(e){let t=this._getAnonymLoginCacheKey();!t||!Is(e)||ot.set(t,{session_key:e.session_key,session_secret_key:e.session_secret_key,uid:e.uid})}_removeCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();e&&ot.remove(e)}_reauthorize(){return this._removeCachedAnonymLogin(),b.reauthorize(()=>this.authorize())}_applyAnonymLogin(e){e.uid&&(b.userId=Number(e.uid)),b.sessionKey=e.session_key,b.sessionSecretKey=e.session_secret_key}async _sendClientStats(e,t=!0){try{(await xs(`vchat.clientStats`,e))?.items_responses?.forEach(e=>{e.errors&&z.error(`[vchat.clientStats]`,e)})}catch(n){let r=n?.error_code===102||n?.error_code===103||n?.error_code===104;if(!t||!r)throw n;await this._reauthorize(),await this._sendClientStats(e,!1)}}logClientStats(e){let t={app_version:String(N.appVersion),sdk_type:`WEB`,sdk_version:N.sdkVersion,version:1,items:e};N.clientStatsPlatform&&(t.platform=N.clientStatsPlatform);let n={data:JSON.stringify(t)};this._sendClientStats(n).catch(e=>z.error(`[vchat.clientStats]`,e))}async uploadDebugLogs(e,t,n,r){let i={conversationId:e,webrtcPlatform:N.platform,startTime:t,endTime:n},a=await this._callUnsafe(`vchat.getLogUploadUrl`,i),o=new FormData,s=new Blob([r],{type:`application/json`});o.append(`file`,s,`log.json`);let c=new URL(a.upload_url);return c.searchParams.append(`size`,s.size.toString()),ws(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:N.protocolVersion,capabilities:Sa.getFlags()};return n&&(r.chatId=n),this._call(`vchat.joinConversation`,r)}async createConversation(e,t=``,n=!1,{onlyAdminCanShareMovie:r,audienceMode:i,audioOnly:a,waitForAdmin:o,closedConversation:s}={},c){let l=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:n,onlyAdminCanShareMovie:r,waitForAdmin:o,closedConversation:s,audienceMode:i,audioOnly:a,externalIds:c});return this._startConversation(l)}async startConversation(e,t,n,r=!1,i=``,a=!1,o=!1,{onlyAdminCanShareMovie:s,waitForAdmin:c}={},l){let u=this._preareStartConversationData({conversationId:e,isVideo:r,joiningAllowed:a,payload:i,requireAuthToJoin:o,onlyAdminCanShareMovie:s,waitForAdmin:c,externalIds:l});if(t&&t.length)switch(n){case Ha.USER:u.uids=t.join(`,`);break;case Ha.GROUP:u.gid=t[0];break;case Ha.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=ot.get(`uuid`);e||(e=M.uuid(),ot.set(`uuid`,e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:n=``,joiningAllowed:r=!1,requireAuthToJoin:i=!1,onlyAdminCanShareMovie:a,waitForAdmin:o,audienceMode:s=!1,audioOnly:c=!1,closedConversation:l=!1,externalIds:u}){let d={conversationId:e,isVideo:t,protocolVersion:N.protocolVersion};return r&&(d.createJoinLink=!0),n&&(d.payload=n),N.domain&&(d.domainId=N.domain),N.externalDomain&&(d.externalDomain=N.externalDomain),i&&(d.requireAuthToJoin=!0),a!==void 0&&(d.onlyAdminCanShareMovie=a),o!==void 0&&(d.waitForAdmin=o),s&&(d.audienceMode=s),c&&(d.audioOnly=c),l&&(d.closed=l),u&&(d.externalIds=u.map(Q.toSignaling).join(`,`)),d}async _startConversation(e){return this._call(`vchat.startConversation`,e)}async createJoinLink(e){return this._call(`vchat.createJoinLink`,{conversationId:e})}async removeJoinLink(e){return this._call(`vchat.removeJoinLink`,{conversationId:e})}async getAnonymTokenByLink(e,t){let n={joinLink:e};t&&(n.anonymName=t);let r=await this._call(`vchat.getAnonymTokenByLink`,n);return b.userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:N.protocolVersion,capabilities:Sa.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),N.anonymToken&&(i.anonymToken=N.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}getCachedOkIdByExternalId(e){return this._idCache.getParticipantIdByExternalId(e)}getCachedRawOkIdByExternalId(e){return this._idCache.getOkId(e)}getCachedExternalIdByOkId(e){return this._idCache.getExternalId(e)}cacheExternalId(e,t){this._idCache.cache(e,t)}mapDecorativeId(e,t){this._idCache.mapDecorativeId(e,t)}unmapDecorativeId(e){this._idCache.unmapDecorativeId(e)}getDecorativeIdByInitialId(e){return this._idCache.getDecorativeIdByInitialId(e)}replaceByInitialIdIdIfExists(e){return this._idCache.replaceByInitialIdIdIfExists(e)}async getConversationParams(e){let t={};return N.anonymToken&&(t.anonymToken=N.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return b.userId}setUserId(e){b.userId=e}hangupConversation(e,t=O.HUNGUP,n){let r={conversationId:e,reason:t};N.anonymToken&&(r.anonymToken=N.anonymToken),n?.peerId&&(r.peerId=n.peerId),ys(`vchat.hangupConversation`,r)}async removeHistoryRecords(e){await this._call(`vchat.removeHistoryRecords`,{recordIds:e.join(`,`)})}cleanup(){this._idCache.clear()}async getServerTime(){return(await this._call(`system.getInfo`)).serverTime}async getInbounds(){let e=await this._call(`vchat.getInbounds`);return Array.isArray(e?.inbounds)?e.inbounds:[]}};function Fs(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}function Is(e){return typeof e==`object`&&!!e&&`session_key`in e&&`session_secret_key`in e&&typeof e.session_key==`string`&&e.session_key.length>0&&typeof e.session_secret_key==`string`&&e.session_secret_key.length>0}var Ls=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(Ls||{}),Rs=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),zs=class{constructor(e){h(this,`_queue`,void 0),h(this,`_readCursor`,void 0),h(this,`_writeCursor`,void 0),h(this,`_moveReadCursor`,void 0),h(this,`_left`,void 0),this._queue=Array(e).fill(null),this._readCursor=this._writeCursor=this._left=0,this._moveReadCursor=!1}get length(){return this._queue.length}get left(){return this._left}toArray(){return Array.from(this._queue)}add(e){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=e,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(e){return(e+1)%this._queue.length}next(){let e=this._queue[this._readCursor];return e&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),--this._left),e}},Bs=class{constructor(e,t,n,r=null){h(this,`_uuid`,void 0),h(this,`_apiKey`,void 0),h(this,`_callToken`,void 0),h(this,`_apiEnv`,void 0),h(this,`_baseApiUrl`,void 0),h(this,`_sessionKey`,void 0),this._uuid=M.uuid(),this._apiKey=t,this._callToken=n,this._apiEnv=e,this._baseApiUrl=r}async authorize(){let e=await bs(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:N.appVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await _s(this._baseApiUrl,this._apiEnv));return M.isObject(e)&&!(`error_msg`in e)?(this._sessionKey=e.session_key,!0):!1}async hangupConversation(e,t){let n={conversationId:e,reason:O.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey};t?.peerId&&(n.peerId=t.peerId),await bs(`vchat.hangupConversation`,n,!0,await _s(this._baseApiUrl,this._apiEnv))}},Vs,Hs=null,Us={getCameras:E.getCameras,getMicrophones:E.getMicrophones,getOutput:E.getOutput,getVideoFacingMode:E.getVideoFacingMode,hasCamera:E.hasCamera,hasMicrophone:E.hasMicrophone,getSavedCamera:E.getSavedCamera,getSavedMicrophone:E.getSavedMicrophone,getSavedOutput:E.getSavedOutput,hasCameraPermission:E.hasCameraPermission,hasMicrophonePermission:E.hasMicrophonePermission,hasPermissions:E.hasPermissions,getUserMedia:E.getUserMedia,getUserVideo:E.getUserVideo,getUserAudio:E.getUserAudio,setResolution:E.setResolution,isBrowserSupported:E.isBrowserSupported,isScreenCapturingSupported:E.isScreenCapturingSupported,os:E.os,isMobile:E.isMobile,browserName:E.browserName,browserVersion:E.browserVersion,baseChromeVersion:E.baseChromeVersion,getAudioContext:E.getAudioContext,isAudioShareSupported:E.isAudioShareSupported},Ws={participantMarkerCompare:M.participantMarkerCompare};function Gs(e){Hs=e}function Ks(e){N.videoEffects=e}function qs(e){N.audioEffects=e}function Js(e,t={}){N.vad=e,N.vadOptions=t}function Ys(e,t=null,n={},r=1){N.vmoji=e,N.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function Xs(e){N.set(e),Vs||(Vs=new Ps),c.default.disableLog(!N.debug),z.toggle(N.debug),z.log(`Calls SDK ${N.sdkVersion}`,e),await E.init();let t=E.getBrowserSupportFailure();if(t)throw new k(S.UNSUPPORTED,{callError:{scope:`internal`,code:`environment`,description:t}});z.log(`UserAgent:`,navigator.userAgent),z.log(`Screen resolution:`,`${window.screen.width}x${window.screen.height}`),z.log(`Permissions:`,`Camera: ${E.hasCameraPermission()}, Mic: ${E.hasMicrophonePermission()}`),z.log(`Simulcast:`,`${e.simulcast} => ${N.simulcast}`)}async function Zs(e,t=[C.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),Qs([],Ha.USER,t,n,r,i,a,c,o,s)}async function Qs(e,t=Ha.USER,n,r=``,i=!1,a=!1,o,s,c,l){if(!N.hold&&B.callsLength>0)throw z.error(`There is already active call`),new k(O.HAS_ACTIVE_CALL);return new $(new Ps,Hs).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function $s(e,t){return ec(e,j.USER,void 0,t)}async function ec(e,t=j.USER,n,r,i,a){if(e===$.id())throw Error(`Push has already been processed`);return new $(new Ps,Hs).onPush(e,t,n,r,i,a)}async function tc(){return Vs.getInbounds()}async function nc(e,t){return e&&(N.authToken=e),t!==void 0&&N.apiBaseUrl!==t&&(N.apiBaseUrl=t,hs()),Vs.authorize()}async function rc(e=[C.AUDIO],t){return El(t).accept(e)}async function ic(e,t){let n=Tl(e);if(n)return n.decline(t?.reason)}async function ac(e,t=[C.AUDIO]){return oc(e,t)}async function oc(e,t,n){if(!N.hold&&B.callsLength>0)throw z.error(`There is already active call`),new k(O.HAS_ACTIVE_CALL);return new $(new Ps,Hs).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function sc(e,t=[C.AUDIO],n,r,i,a){if(!N.hold&&B.callsLength>0)throw z.error(`There is already active call`),new k(O.HAS_ACTIVE_CALL);return n&&(N.anonymToken=n),new $(new Ps,Hs).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a,anonymous:!!N.anonymToken})}function cc(e,t){let n=Tl(e);return n?n.hangup(t?.reason):($.hangupAfterInit(),Promise.resolve())}async function lc(e,t){let n=Array.isArray(e)?e:[e],r=$.current();r&&await r.addParticipant(n,t)}async function uc(e,t){let n=$.current();if(n){let r=e.map(e=>M.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function dc(e,t=!1){let n=$.current()?.getCachedRawOkIdByExternalId(e)??null;if(!n){z.warn(`removeParticipant: externalId not found in cache`,e);return}return fc(n,t)}async function fc(e,t=!1){let n=$.current();if(n)try{await n.removeParticipant(M.composeUserId(e),t)}catch(t){z.warn(`Failed to remove participant ${e}. Perhaps he is no longer on the call. ${t}`)}}async function pc(e,t){let n=$.current();if(e===`videoinput`&&Mt.contains(t))return N.videoFacingMode=t,n?(E.isMobile()&&n.stopVideoTrack(),n.changeDevice(e)):void 0;if(!await E._saveDeviceId(e,t))throw Error(`Device not found: ${t}`);if(n)return n.changeDevice(e)}async function mc(e,t){let n=typeof e==`object`?{...e,fastScreenSharing:e.captureScreen&&e.fastScreenSharing,captureAudio:e.captureScreen&&e.captureAudio&&N.audioShare}:{captureScreen:e,fastScreenSharing:!1,captureAudio:!1},r=Tl(t);return r?r.toggleScreenCapturing(n):Promise.reject()}function hc(e){let t=$.current();t&&t.toggleAnimojiCapturing(e)}async function gc(e,t=!1){let n=$.current();n&&await n.setVideoStream(e,t)}async function _c(e,t){let n=Tl(t);n&&await n.toggleLocalVideo(e)}async function vc(e,t){let n=Tl(t);n&&await n.toggleLocalAudio(e)}async function yc(e){let t=$.current();if(t)return t.setLocalResolution(e)}async function bc(e){let t=$.current();t&&await t.changePriorities(e)}async function xc(e,t){let n=$.current();if(n){let r;if(t){let e=n.getCachedRawOkIdByExternalId(t);if(!e){z.warn(`changeParticipantState: externalId not found in cache`,t);return}r=M.composeParticipantId(e,j.USER,t.deviceIdx)}await n.changeParticipantState(e,r)}}async function Sc(){let e=$.current();e&&await e.putHandsDown()}async function Cc(e){let t=$.current();t&&await t.updateDisplayLayout(e)}async function wc(e){let t=$.current();t&&await t.requestDisplayLayout(e)}async function Tc(e,t,n=!1){let r=$.current()?.getCachedRawOkIdByExternalId(e)??null;if(!r){z.warn(`grantRoles: externalId not found in cache`,e);return}return Ec(r,Q.getDeviceIdx(e),t,n)}async function Ec(e,t,n,r=!1){let i=$.current();i&&await i.grantRoles(M.composeParticipantId(e,j.USER,t),n,r)}async function Dc({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){let i=null;return e&&(i=$.current()?.getCachedRawOkIdByExternalId(e)??null,i||z.warn(`muteParticipant: externalId not found in cache`,e)),Oc({uid:i,muteStates:t,requestedMedia:n,deviceIdx:Q.getDeviceIdx(e),roomId:r})}async function Oc({uid:e=null,muteStates:t,requestedMedia:n=[],deviceIdx:r=0,roomId:i=null}){let a=$.current();if(a){let o=e?M.composeParticipantId(e,j.USER,r):null;await a.muteParticipant(o,t,n,i)}}async function kc(e,t=!1,n=null){let r=$.current()?.getCachedRawOkIdByExternalId(e)??null;if(!r){z.warn(`pinParticipant: externalId not found in cache`,e);return}return Ac(r,t,Q.getDeviceIdx(e),n)}async function Ac(e,t=!1,n=0,r=null){let i=$.current();i&&await i.pinParticipant(M.composeParticipantId(e,j.USER,n),t,r)}async function jc(e){let t=$.current();t&&await t.updateMediaModifiers(e)}async function Mc(e){let t=$.current();t&&await t.enableVideoSuspend(e)}async function Nc(e){let t=$.current();t&&await t.enableVideoSuspendSuggest(e)}async function Pc(e){let t=$.current();t&&await t.changeOptions(e)}async function Fc(e,t=null){let n=null;return t&&(n=$.current()?.getCachedRawOkIdByExternalId(t)??null,n||z.warn(`chatMessage: externalId not found in cache`,t)),Ic(e,n)}async function Ic(e,t=null){let n=$.current();if(n){let r=t?M.composeUserId(t):null;await n.chatMessage(e,r)}}async function Lc(e=10){let t=$.current();if(t)return t.chatHistory(e)}async function Rc(e,t=null){let n=null;return t&&(n=$.current()?.getCachedRawOkIdByExternalId(t)??null,n||z.warn(`customData: externalId not found in cache`,t)),zc(e,n,Q.getDeviceIdx(t))}async function zc(e,t=null,n=0){let r=$.current();if(r){let i=t?M.composeParticipantId(t,j.USER,n):null;await r.customData(e,i)}}async function Bc(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await Vs.createConversation(a??M.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function Vc(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=i.map(e=>Q.fromId(e));return(await Vs.createConversation(M.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},a)).join_link}async function Hc(){let e=$.current();return e?e.createJoinLink():Promise.reject()}async function Uc(){let e=$.current();return e?e.removeJoinLink():Promise.reject()}async function Wc(e,t){return Vs.getAnonymTokenByLink(e,t)}function Gc(e){let t=$.current();t&&t.setVolume(e)}function Kc(e){N.forceRelayPolicy=e}async function qc(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o=$.current();return o?o.startStream(e,t,n,r,i,a):Promise.reject()}async function Jc(e=null,t){let n=$.current();return n?n.stopStream(e,t):Promise.reject()}async function Yc(e=null){let t=$.current();return t?t.publishStream(e):Promise.reject()}async function Xc(){let e=$.current();return e?e.getStreamInfo():Promise.reject()}async function Zc(e){let t=$.current();return t?t.addMovie(e):Promise.reject()}async function Qc(e){let t=$.current();return t?t.updateMovie(e):Promise.reject()}async function $c(e){let t=$.current();return t?t.removeMovie(e):Promise.reject()}async function el(e,t){let n=$.current();if(n){let r=[];for(let t of e){let e,i;t.addParticipantIds&&(e=[],t.addParticipantIds.forEach(t=>{let r=n.getCachedRawOkIdByExternalId(t);r?e.push(M.composeUserId(r)):z.warn(`updateRooms addParticipant: externalId not found in cache`,t)})),t.removeParticipantIds&&(i=[],t.removeParticipantIds.forEach(e=>{let t=n.getCachedRawOkIdByExternalId(e);t?i.push(M.composeUserId(t)):z.warn(`updateRooms removeParticipant: externalId not found in cache`,e)})),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:i,countdownSec:t.countdownSec})}return n.updateRooms(r,t)}return Promise.reject()}async function tl(e,t){let n=$.current();return n?n.activateRooms(e,t):Promise.reject()}async function nl(e=null,t=null){let n=$.current();if(!n)return Promise.reject();let r;if(t){let e=n.getCachedRawOkIdByExternalId(t);if(!e){z.warn(`switchRoom: externalId not found in cache`,t);return}let i=Q.getDeviceIdx(t);r=M.composeParticipantId(e,j.USER,i)}return n.switchRoom(e,r)}async function rl(e){let t=$.current();return t?t.removeRooms(e):Promise.reject()}function il(e){N.statisticsInterval=e;let t=$.current();if(t)return t.updateStatisticsInterval()}function al(e){c.default.disableLog(!e),z.toggle(e)}function ol(e,...t){N.debugLog&&($.debugMessage(e,`[external]`,...t)||z.send(e,`[external]`,...t))}function sl(e,t,...n){N.debugLog&&($.debugMessageWithContext(e,t,`[external]`,...n)||z.send(e,`[external]`,...n))}var cl={list:Pe,get:Fe,getJson:Ie,download:Le,clear:Re,stats:ze};function ll(){let e=[[`Calls SDK ${N.sdkVersion}`,N.toJSON()],[`UserAgent:`,navigator.userAgent],[`Screen resolution:`,`${window.screen.width}x${window.screen.height}`],[`Permissions:`,`Camera: ${E.hasCameraPermission()}, Mic: ${E.hasMicrophonePermission()}`]],t=new Date,n=t.getTime(),r=t.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`});return e.map(e=>({h:r,t:n,l:Cn.LOG,d:e}))}async function ul(){let e=$.id(),t=$.debugSessionId();if(!t||!e)throw z.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let n=await Fe({sessionId:t});if(n.length===0)throw z.error(`[uploadDebugLogs]`,`No logs found`),Error(`No logs found`);let r=n[0].t,i=n[n.length-1].t;try{return Vs?.uploadDebugLogs(e,r,i,JSON.stringify([...ll(),...n]))}catch(e){throw z.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function dl(e){let t=$.current();if(t)return t.videoEffect(e)}async function fl(e,t){let n=$.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function pl(e){let t=$.current();t&&await t.setAudioStream(e)}async function ml(e,t=null,n=null){let r=$.current();if(!r)return;let i=n??t?.id,a=null;if(t){let e=r.getCachedRawOkIdByExternalId(t);if(!e)throw Error(`Could not get user id to set animoji svg`);a=M.composeParticipantId(e,j.USER,Q.getDeviceIdx(t))}r.setAnimojiSvg(e,a,i)}function hl(e){let t=$.current();t&&t.setAnimojiFill(e)}async function gl(e=null,t,n=!1){return El().getWaitingHall(e,t,n)}async function _l(){return El().getAudienceModeHands()}async function vl(e,t=!1){let n=El(),r;if(e){let t=n.getCachedRawOkIdByExternalId(e);if(!t){z.warn(`promoteParticipant: externalId not found in cache`,e);return}r=M.composeUserId(t)}return n.promoteParticipant(r,t)}async function yl(e=!1){return El().requestPromotion(e)}async function bl(e=!1){return El().acceptPromotion(e)}async function xl(e){return El().getParticipantListChunk(e)}async function Sl(e){return El().getParticipants(e)}async function Cl(e){return El().feedback(e)}async function wl(e,t,n){return El(n).enableFeatureForRoles(e,t)}function Tl(e){return e?B.get(e)??null:$.current()??B.getFirst()}function El(e){let t=Tl(e);if(!t)throw Error(`Conversation not found`);return t}async function Dl(e){await Vs.removeHistoryRecords(e)}async function Ol(e){let t=$.current()??B.getFirst();t&&await t.startAsr(e)}async function kl(e){let t=$.current()??B.getFirst();t&&await t.stopAsr(e)}async function Al(e){let t=$.current()??B.getFirst();t&&await t.requestAsr(e)}async function jl(e){let t=$.current();return t?t.startUrlSharing(e):Promise.reject()}async function Ml(){let e=$.current();return e?e.stopUrlSharing():Promise.reject()}async function Nl(e){await B.switchCall(e)}function Pl(){return B.getActiveId()}function Fl(){return $.getSyncedTime()}function Il(){return N.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=bn),exports.Api=Ps,exports.ApiExternal=Bs,exports.ArrayDequeue=zs,exports.AuthData=b,exports.BaseLogger=m,exports.CallDirection=Va,exports.CallType=Ha,exports.ChatRoomEventType=Ua,exports.ConversationFeature=Wa,exports.ConversationOption=Ga,exports.DebugMessageType=Cn,exports.ExternalIdType=no,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return Mt}}),exports.FatalError=S,exports.HangupReason=k,exports.HangupType=O,exports.MediaOption=C,exports.MediaTrackKind=A,exports.MediaType=H,exports.MuteState=Ja,exports.ParticipantState=Z,exports.ParticipantStateDataValue=Rs,exports.ParticipantStatus=P,exports.RecordRole=Ls,exports.RoomsEventType=Ya,exports.Signaling=Ba,exports.SignalingCommandType=V,exports.SignalingConnectionType=vr,exports.SignalingNotification=q,exports.TransportTopology=Y,exports.UserRole=Qa,exports.UserType=j,exports.VolumeDetector=To,exports.acceptCall=rc,exports.acceptPromotion=bl,exports.activateRooms=tl,exports.addMovie=Zc,exports.addParticipant=lc,exports.addParticipantInternal=uc,exports.authorize=nc,exports.browser=Us,exports.callInternal=Qs,exports.callTo=Zs,exports.captureScreen=mc,exports.captureVmoji=hc,exports.changeAudioEffect=fl,exports.changeConversationOptions=Pc,exports.changeDevice=pc,exports.changeParticipantState=xc,exports.changePriorities=bc,exports.changeVideoEffect=dl,exports.chatHistory=Lc,exports.chatMessage=Fc,exports.chatMessageInternal=Ic,exports.createJoinLink=Hc,exports.customData=Rc,exports.customDataInternal=zc,exports.debug=al,exports.debugLogs=cl,exports.debugMessage=ol,exports.debugMessageWithContext=sl,exports.declineCall=ic,exports.enableFeatureForRoles=wl,exports.enableVideoSuspend=Mc,exports.enableVideoSuspendSuggest=Nc,exports.feedback=Cl,exports.forceRelayPolicy=Kc,exports.getActiveCallId=Pl,exports.getAnonymTokenByLink=Wc,exports.getAudienceModeHands=_l,exports.getInbounds=tc,exports.getParticipantListChunk=xl,exports.getParticipants=Sl,exports.getStreamInfo=Xc,exports.getSyncedTime=Fl,exports.getWaitingHall=gl,exports.grantRoles=Tc,exports.grantRolesInternal=Ec,exports.hangup=cc,exports.init=Xs,exports.joinCall=ac,exports.joinCallByLink=sc,exports.joinCallInternal=oc,exports.muteParticipant=Dc,exports.muteParticipantInternal=Oc,exports.pinParticipant=kc,exports.pinParticipantInternal=Ac,exports.processPush=$s,exports.processPushInternal=ec,exports.promoteParticipant=vl,exports.publishStream=Yc,exports.putHandsDown=Sc,exports.removeHistoryRecords=Dl,exports.removeJoinLink=Uc,exports.removeMovie=$c,exports.removeParticipant=dc,exports.removeParticipantInternal=fc,exports.removeRooms=rl,exports.requestAsr=Al,exports.requestDisplayLayout=wc,exports.requestPromotion=yl,exports.setAudioEffects=qs,exports.setAudioStream=pl,exports.setLocalResolution=yc,exports.setLogger=Gs,exports.setMediaModifiers=jc,exports.setStatisticsInterval=il,exports.setVad=Js,exports.setVideoEffects=Ks,exports.setVideoStream=gc,exports.setVmoji=Ys,exports.setVmojiFill=hl,exports.setVmojiSvg=ml,exports.setVolume=Gc,exports.startAsr=Ol,exports.startAudienceConversation=Vc,exports.startConversation=Bc,exports.startStream=qc,exports.startUrlSharing=jl,exports.stopAsr=kl,exports.stopStream=Jc,exports.stopUrlSharing=Ml,exports.switchCall=Nl,exports.switchRoom=nl,exports.toggleLocalAudio=vc,exports.toggleLocalVideo=_c,exports.updateDisplayLayout=Cc,exports.updateMovie=Qc,exports.updateRooms=el,exports.uploadDebugLogs=ul,exports.utils=Ws,exports.version=Il;