@vkontakte/calls-sdk 2.8.13-dev.4ce2e1bb.0 → 2.8.13-dev.56ef08c8.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/CallsSDK.d.ts +5 -0
- package/abstract/BaseApi.d.ts +12 -8
- package/calls-sdk.cjs.js +7 -7
- package/calls-sdk.esm.js +3137 -2289
- package/classes/AudioFix.d.ts +2 -2
- package/classes/AudioOutput.d.ts +3 -3
- package/classes/MediaSource.d.ts +6 -2
- package/classes/SpecListener.d.ts +2 -2
- package/classes/VolumesDetector.d.ts +0 -1
- package/classes/codec/LibVPxDecoder.d.ts +2 -2
- package/classes/codec/LibVPxEncoder.d.ts +2 -2
- package/classes/codec/WebCodecsDecoder.d.ts +2 -2
- package/classes/codec/WebCodecsEncoder.d.ts +2 -2
- package/classes/codec/WorkerBase.d.ts +3 -3
- package/classes/conversation/Conversation.d.ts +1 -0
- package/classes/screenshare/ScreenCaptureReceiver.d.ts +2 -2
- package/classes/screenshare/ScreenCaptureSender.d.ts +2 -2
- package/classes/screenshare/StreamBuilder.d.ts +2 -2
- package/classes/stat/ApiCallStats.d.ts +12 -0
- package/classes/stat/CallLifecycleStats.d.ts +2 -2
- package/classes/stat/CodecStatsAggregator.d.ts +2 -2
- package/classes/stat/ConversationStats.d.ts +14 -2
- package/classes/stat/SdpStats.d.ts +38 -0
- package/classes/stat/StatAggregator.d.ts +10 -3
- package/classes/stat/StatClock.d.ts +28 -0
- package/classes/stat/StatDrainScheduler.d.ts +92 -0
- package/classes/stat/StatEventCollector.d.ts +50 -0
- package/classes/stat/StatPings.d.ts +2 -2
- package/classes/stat/StatQueue.d.ts +79 -0
- package/classes/stat/StatSignalingCommands.d.ts +2 -2
- package/classes/stat/StatUnloadJournal.d.ts +27 -0
- package/classes/transport/DirectTransport.d.ts +7 -2
- package/classes/transport/ServerTransport.d.ts +3 -2
- package/classes/transport/SimulcastSender.d.ts +2 -2
- package/classes/transport/Transport.d.ts +2 -2
- package/default/Api.d.ts +10 -1
- package/default/Signaling.d.ts +11 -3
- package/enums/SessionError.d.ts +10 -0
- package/enums/Stat.d.ts +13 -0
- package/package.json +1 -1
- package/static/ApiTransport.d.ts +4 -0
- package/static/Params.d.ts +28 -0
- package/static/SessionStore.d.ts +29 -0
- package/static/SimulcastInfo.d.ts +1 -0
- package/static/WebRTCUtils.d.ts +5 -5
- package/types/IEventualStatLog.d.ts +1 -1
package/calls-sdk.cjs.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @vkontakte/calls-sdk v2.8.13-dev.
|
|
3
|
-
* Tue,
|
|
2
|
+
* @vkontakte/calls-sdk v2.8.13-dev.56ef08c8.0
|
|
3
|
+
* Tue, 29 Sep 2026 06:03:08 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 re=25*1024*1024,ie=10,ae=`_okcls_logs_session_`,oe=3e4,se=`ok-calls-sdk-debug-logs`,ce=1,g=`sessions`,_=`chunks`,le=120*1e3,ue=new Set([`WARN`,`ERROR`]);function de(){return`${Date.now()}_${Math.random().toString(36).slice(2)}`}function fe(){let e=de();return pe(e),e}function pe(e){We.has(e)||We.set(e,[]),Ge.has(e)||Ge.set(e,0),Ke.has(e)||Ke.set(e,null)}function me(e){return Ke.get(e)??null}function he(e){let t=Ge.get(e)??0;return Ge.set(e,t+1),t}function ge(e,t){return`${e}:${String(t).padStart(12,`0`)}`}function _e(e){return new Blob([e]).size}function ve(){try{let e=window.localStorage;for(let t of Object.keys(e))t.indexOf(ae)===0&&e.removeItem(t)}catch(e){console.error(`Storage is blocked`,e)}}var v=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(se,ce);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(se);t.onsuccess=()=>e(),t.onerror=()=>e(),t.onblocked=()=>e()})}async getAllSessions(){let e=await this.open();if(!e)return[];let t=e.transaction(g,`readonly`),n=await this.requestToPromise(t.objectStore(g).getAll());return await this.txDone(t),n}async getSessionsByConversationId(e){let t=await this.open();if(!t)return[];let n=t.transaction(g,`readonly`),r=await this.requestToPromise(n.objectStore(g).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(g,`readonly`),r=await this.requestToPromise(n.objectStore(g).get(e));return await this.txDone(n),r?[r]:[]}async getChunksBySession(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).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(g,`readwrite`);return n.objectStore(g).put(e),await this.txDone(n),!0}async putSessionAndChunk(e,t){let n=await this.open();if(!n)return!1;let r=n.transaction([g,_],`readwrite`);return r.objectStore(g).put(e),r.objectStore(_).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([g,_],`readwrite`),i=r.objectStore(_),a=0;for(let e of n)a+=e.bytes,i.delete(e.id);return r.objectStore(g).delete(e),await this.txDone(r),a}async deleteChunks(e){let t=await this.open();if(!t||!e.length)return;let n=t.transaction(_,`readwrite`),r=n.objectStore(_);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>re&&n.length;){let e=n.shift();if(!e)break;r-=await this.deleteSession(e.sessionId)}for(;t.length>ie||t.length>1&&r>re;){let e=t.shift();if(!e)return;for(let t of e.sessions)r-=await this.deleteSession(t.sessionId)}t.length===1&&r>re&&await this.trimOldestChunks(t[0],r-re),e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),(t.length>ie||e.reduce((e,t)=>e+t.bytes,0)>re)&&await this.enforceRetentionPolicy()}createSchema(e){if(!e.objectStoreNames.contains(g)){let t=e.createObjectStore(g,{keyPath:`sessionId`});t.createIndex(`conversationId`,`conversationId`,{unique:!1}),t.createIndex(`updatedAt`,`updatedAt`,{unique:!1})}e.objectStoreNames.contains(_)||e.createObjectStore(_,{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 ye(e){return e.sessionId?v.getSessionBySessionId(e.sessionId):e.conversationId?v.getSessionsByConversationId(e.conversationId):[]}async function be(e,t,n,r){if(!r.length)return;let i=me(e)||t,a=r,o=JSON.stringify(a),s=_e(o);for(;s>re&&a.length>1;)a=a.slice(Math.floor(a.length/2)),o=JSON.stringify(a),s=_e(o);if(s>re)return;let c=a[0].t,l=a[a.length-1].t,[u]=await v.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:ge(e,n),sessionId:e,sequence:n,startTime:c,endTime:l,bytes:s,items:a};await v.putSessionAndChunk(f,p)&&await v.enforceRetentionPolicy()}function xe(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 Se(e){let t=We.get(e);if(!t?.length)return Ye;let n=t.splice(0),r=me(e),i=he(e);return Ye=Ye.then(()=>be(e,r,i,n)).catch(e=>{console.warn(`Failed to write debug log to storage`,e)}),Ye}function Ce(e){if(e)return Se(e);for(let e of We.keys())Se(e);return Ye}async function we(e){let t=[];for(let n of e.sort((e,t)=>e.startTime-t.startTime)){let e=await v.getChunksBySession(n.sessionId);for(let n of e)t.push(...n.items)}return t}async function Te(e){let t=await we(e);if(!t.length)return t;let n=t.sort(De),r=n[0].t,i=n[n.length-1].t;return[...await Ee(r,i,new Set(e.map(e=>e.sessionId))),...n].sort(De)}async function Ee(e,t,n){let r=(await v.getAllSessions()).filter(r=>!n.has(r.sessionId)&&r.conversationId===null&&r.endTime>=e-le&&r.startTime<=t),i=[];for(let n of r){let r=await v.getChunksBySession(n.sessionId);for(let n of r)n.endTime<e-le||n.startTime>t||i.push(...n.items.filter(n=>n.t>=e-le&&n.t<=e?!0:n.t>=e&&n.t<=t&&ue.has(n.l)))}return i}function De(e,t){return e.t-t.t}function Oe(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 ke(){Ce()}function Ae(){document.visibilityState===`hidden`&&Ce()}function je(e,t,n=qe){Ue||Me(),pe(n);let r=new Date,i={t:r.getTime(),l:e,d:xe(t),h:r.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`})};return We.get(n)?.push(i),Je||(Je=window.setTimeout(()=>{Je=null,Ce()},oe)),i}function Me(){Ue||(Ue=!0,ve(),v.open(),window.addEventListener(`pagehide`,ke),document.addEventListener(`visibilitychange`,Ae))}function Ne(){return Ue||Me(),Ce(),fe()}function Pe(e,t=qe){t&&(pe(t),Ke.set(t,e),e&&v.updateSessionConversationId(t,e))}async function Fe(){return await Ce(),(await v.getAllSessions()).sort((e,t)=>t.updatedAt-e.updatedAt)}async function Ie(e){return await Ce(),Te(await ye(e))}async function Le(e){return JSON.stringify(await Ie(e))}async function Re(e){let t=await Le(e),n=`logs_${e.sessionId||e.conversationId}_${Date.now()}.json`;return Oe(t,n),n}async function ze(e){await Ce();let t=e?await ye(e):await v.getAllSessions();for(let e of t)await v.deleteSession(e.sessionId)}async function Be(){await Ce();let e=await v.getStorageSummary(),t=await v.estimateStorage();return{supported:v.supported,callsCount:e.callsCount,sessionsCount:e.sessions.length,usedBytes:e.usedBytes,maxBytes:re,maxCalls:ie,quotaBytes:t?.quota,usageBytes:t?.usage}}async function Ve(){await Ce();let e=await we(await v.getAllSessions());return JSON.stringify(e.sort(De))}async function He(){let e=await Ve(),t=`logs_${Date.now()}.json`;return Oe(e,t),t}var Ue=!1,We=new Map,Ge=new Map,Ke=new Map,qe=fe(),Je=null,Ye=Promise.resolve();window.__VKCallsSDKLogs__=(e=!1)=>(Ue||Me(),e?Ve():He());var y=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(y,`_sessionKey`,void 0),h(y,`_sessionSecretKey`,void 0),h(y,`_accessToken`,void 0),h(y,`_userId`,null),h(y,`_reauthorizePromise`,null);var b=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()})}},x=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}(x||{}),S=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}(S||{}),C=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}(C||{}),Xe=e=>e.stop(),Ze=e=>e.getTracks().forEach(Xe),Qe=e=>e.getVideoTracks().forEach(Xe);async function $e(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){R.warn(`setVideoConstraints failed`,e)}}var et=class{constructor(){h(this,`_cameraPermissionStatus`,void 0),h(this,`_microphonePermissionStatus`,void 0),h(this,`_listener`,void 0)}static isSupported(){return T.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){R.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}},tt=`_okcls_`,nt=(()=>{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 rt(e){let t=nt?nt.getItem(tt+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function it(e,t){try{nt&&nt.setItem(tt+e,JSON.stringify(t))}catch{}}function at(e){nt&&nt.removeItem(tt+e)}var ot;(function(e){function t(e){return rt(e)||null}e.get=t;function n(e,t){it(e,t)}e.set=n;function r(e){at(e)}e.remove=r})(ot||(ot={}));var st=ot,ct=null,lt=null,ut=null,dt=[],ft=[],pt=[],mt=null,ht=null,gt=null,_t=!1,vt=!1,yt,bt,xt,St=null,Ct=null,wt=``,Tt=null,Et=[],Dt=null,Ot=navigator.appVersion,kt=navigator.appName,At=navigator.userAgent,jt={};function Mt(e,t){return Number(t.deviceId===`default`)-Number(e.deviceId===`default`)}var Nt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Nt).includes(e)}e.contains=t})(Nt||(Nt={}));var Pt=class{constructor(e,t=!1,n=M.videoMaxWidth,r=M.videoMaxHeight,i=M.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:M.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let t=w.getMicrophones(),n,r;if(ht&&(r=ht.groupId,n=ht.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!ht&&w.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:M.videoMinWidth,max:n,ideal:n},height:{min:M.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:M.videoAspectRatio},frameRate:{ideal:i}};let e=w.getCameras(),a,s;if(mt&&(s=mt.groupId,a=mt.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!mt&&w.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}),M.videoFacingMode&&(o.facingMode={ideal:M.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}},Ft=class extends Pt{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=M.displaySurface,w.browserName()===`Safari`){let n=Number(w.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:M.audioShareSystemInclude?`include`:`exclude`,windowAudio:M.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},It=class e{constructor(){h(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(t=null){if(e._lockId)throw t?.log(C.ERROR,`change_device`),R.warn(`Device change failed: MediaSource is busy`),Error(`MediaSource is busy`);e._lockId=this._lockId}free(){e._lockId===this._lockId&&(e._lockId=0)}};h(It,`_lockId`,0);async function Lt(){vt=!1,_t=!1,ct=null;let e={camera:w.getSavedCamera(),microphone:w.getSavedMicrophone(),output:w.getSavedOutput()};await zt(),Rt(`devicechange`,e),L.onDeviceChange()}function Rt(e,...t){if(jt[e])for(let n of jt[e])n(...t)}async function zt(){return ct||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!lt&&navigator.mediaDevices.addEventListener&&(lt=j.debounce(Lt,M.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,lt)),!ut&&et.isSupported()&&(ut=new et,await ut.init((e,t)=>{switch(t){case`denied`:case`prompt`:lt?.();break}})),ct=navigator.mediaDevices.enumerateDevices().then(e=>{dt=e.filter(e=>e.kind===`videoinput`?((e.label||ut?.getPermissionState(`camera`)===`granted`)&&(_t=!0),!0):!1),dt.sort(Mt),ft=e.filter(e=>e.kind===`audioinput`?((e.label||ut?.getPermissionState(`microphone`)===`granted`)&&(vt=!0),!0):!1),ft.sort(Mt),pt=e.filter(e=>e.kind===`audiooutput`),pt.sort(Mt);let t=mt?.deviceId??st.get(`videoinput`),n=ht?.deviceId??st.get(`audioinput`),r=gt?.deviceId??st.get(`audiooutput`);return mt=dt.find(e=>e.deviceId===t)||null,ht=ft.find(e=>e.deviceId===n)||null,gt=pt.find(e=>e.deviceId===r)||pt[0]||null,ct=Promise.resolve(e),e}).catch(()=>(ct=null,[]))))}async function Bt(){if(`userAgentData`in navigator)try{let{platformVersion:e}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!e){R.warn(`Can't to get OS version`);return}let t=parseInt(e.split(`.`)[0]);Tt=isNaN(t)?null:t}catch(e){R.warn(`Failed to get OS version`,e)}}function Vt(e){if(mt&&ht)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=>{!ht&&e.kind===k.audio?ht=t(w.getMicrophones(),e):!mt&&e.kind===k.video&&(mt=t(w.getCameras(),e))})}async function Ht(e,t,n=R,r=null){n.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative())));let i=(!e.isVideo()||w.hasCameraPermission())&&(!e.isAudio()||w.hasMicrophonePermission());!i&&!t&&L.onPermissionsRequested();let a=new It;try{a.busy(r);let t=await navigator.mediaDevices.getUserMedia(e.getNative());return w.releaseFirefoxMicrophonePermissionWarmup(),a.free(),i||await Lt(),Vt(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()?x.CAMERA_PERMISSION:x.MIC_PERMISSION;break;case`OverconstrainedError`:t=x.OVERCONSTRAINED;break;case`TypeError`:t=x.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?x.CAMERA_ACCESS:x.MIC_ACCESS;break;case`Error`:if(i.message===`MediaSource is busy`){t=e.isVideoRequested()?x.CAMERA_ACCESS:x.MIC_ACCESS;break}}if(e.canSimplify())return Ht(e.simplify(),t,n,r);let o=t||x.UNKNOWN;throw L.onPermissionsError(o,i),o}}async function Ut(e=R){if(!(St||w.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{w.hasMicrophonePermission()||L.onPermissionsRequested(),St=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(t){e.warn(`Firefox microphone permission warmup failed`,t)}}async function Wt(e,t=R,n=null){t.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let r=new It;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 x.SCREEN_PERMISSION;case`AbortError`:case`NotReadableError`:throw x.SCREEN_ACCESS;default:throw e}}finally{r.free()}}function Gt(){return Et.length||(Et=(()=>{let e,t=!1,n=0,r=`0`,i=At.match(/(opera|chrome|safari|firefox)\/?\s*(\d+)/i)||[];if(i[1]===`Safari`){if(e=At.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=At.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=At.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=At.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=At.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=At.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=At.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:kt,e&&e[1]||i[2]||Ot,t,n,r]})()),Et}var w;(function(e){async function t(){await zt(),await Bt()}e.init=t;function n(){return dt}e.getCameras=n;function r(){return ft}e.getMicrophones=r;function i(){return pt}e.getOutput=i;function a(){return dt.length>0}e.hasCamera=a;function o(){return ft.length>0}e.hasMicrophone=o;function s(){return mt}e.getSavedCamera=s;function c(){return ht}e.getSavedMicrophone=c;function l(){return gt}e.getSavedOutput=l;function u(){return M.videoFacingMode}e.getVideoFacingMode=u;function d(){return _t}e.hasCameraPermission=d;function f(){return vt}e.hasMicrophonePermission=f;function p(){return ut?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=p;function m(e=!1){return f()?a()&&e?d():!0:!1}e.hasPermissions=m;function ee(){St&&(Ze(St),St=null)}e.releaseFirefoxMicrophonePermissionWarmup=ee;async function te(e=!1,t=!0,n=!0,r=R,i=null){!e&&!t&&await Ut(r);let s=o()&&t,c=a()&&e,l;if(!s&&!c)l=new MediaStream;else try{l=await Ht(new Pt(s,c),void 0,r,i)}catch{l=new MediaStream}return!l.getVideoTracks().length&&n&&l.addTrack(w.getBlackMediaTrack()),!l.getAudioTracks().length&&n&&l.addTrack(w.getSilentMediaTrack()),l}e.getUserMedia=te;async function ne(e,t,n=R,r=null){return Wt(new Ft(e&&!M.consumerFastScreenShare?M.fastScreenShareWidth:0,e&&!M.consumerFastScreenShare?M.fastScreenShareHeight:0,M.getScreenFrameRate(e),t),n,r)}e.getScreenMedia=ne;async function h(e=!1,t,n=R,r=null){return Ht(new Pt(!1,!0,e?M.videoEffectMaxWidth:M.videoMaxWidth,e?M.videoEffectMaxHeight:M.videoMaxHeight,t),void 0,n,r)}e._getUserVideo=h;async function re(e,t,n=R,r=null){let i=t?.width||M.videoMaxWidth,a=t?.height||M.videoMaxHeight;return Ht(new Pt(!1,e||!0,i,a),void 0,n,r)}e.getUserVideo=re;async function ie(e,t=R,n=null){return Ht(new Pt(e||!0,!1),void 0,t,n)}e.getUserAudio=ie;async function ae(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return $e(n,t)}e.setResolution=ae;async function oe(e,t){let n=(await zt()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?mt=n:e===`audioinput`?ht=n:e===`audiooutput`&&(gt=n),st.set(e,t),n):null}e._saveDeviceId=oe;function se(){if(!xt||xt.readyState===`ended`){let e=w.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),w.browserName()===`Safari`&&n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),xt=t.stream.getAudioTracks()[0]}return Object.assign(xt.clone(),{enabled:!1})}e.getSilentMediaTrack=se;function ce(e=M.videoMinWidth,t=M.videoMinHeight){bt||(bt=document.createElement(`canvas`)),bt.width=e,bt.height=t;let n=bt.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!yt||yt.readyState===`ended`)&&(yt=bt.captureStream(M.videoFrameRate).getVideoTracks()[0]),Object.assign(yt.clone(),{enabled:!1})}e.getBlackMediaTrack=ce;function g(){return _()===null}e.isBrowserSupported=g;function _(){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=_;function le(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=le;function ue(){let e=w.browserName()===`Opera`,t=w.browserName()===`Yandex`;return e||t}e.isBrokenH264Decoder=ue;function de(){return w.browserName()===`Yandex`&&w.os()===`Windows`||M.simulcast}e.isBrokenVP9Encoder=de;function fe(){let e=w.browserName()===`Safari`&&Number(w.browserVersion())===17&&[4,5,6].includes(Number(w.browserSubVersion())),t=w.osVersion(),n=w.os()===`Windows`&&t!=null&&t>0&&t<13;return e||n}e.isBrokenVP9Decoder=fe;function pe(){return!(w.baseChromeVersion()&&w.isMobile())}e.canPreferH264=pe;function me(){let e=w.browserName(),t=Number(w.browserVersion());return e===`Safari`?t>=18:e===`Firefox`?t>=134:!0}e.isSimulcastSupportedByBrowser=me;function he(){return wt||(wt=(()=>{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(At))return t;return`Unknown`})()),wt}e.os=he;function ge(){return Tt}e.osVersion=ge;function _e(){return Ct===null&&(Ct=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Ot)),Ct}e.isMobile=_e;function ve(){return Gt()[0]}e.browserName=ve;function v(){return Gt()[1]}e.browserVersion=v;function ye(){return Gt()[3]}e.baseChromeVersion=ye;function be(){return Dt||(Dt=new(window.AudioContext||window.webkitAudioContext)),Dt.resume().catch(()=>{R.warn(`Failed to resume AudioContext`)}),Dt}e.getAudioContext=be;function xe(){return Gt()[4]}e.browserSubVersion=xe;function Se(){return w.baseChromeVersion()>=105&&!w.isMobile()}e.isAudioShareSupported=Se;function Ce(e,t){jt[e]||(jt[e]=[]),jt[e].push(t)}e.addEventListener=Ce;function we(e,t){if(jt[e])if(!t)delete jt[e];else{let n=jt[e].indexOf(t);n>-1&&jt[e].splice(n,1)}}e.removeEventListener=we})(w||(w={}));var T=w;function Kt(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 E(e){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},e||{})}var D=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}(D||{}),O=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(D).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)}},qt=function(e){return e.FpsLimit=`fps-limit`,e}({}),Jt=class extends b{constructor(e=R){super(),h(this,`FPS_LIMITS`,[13,20,Math.max(M.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()}},Yt=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}({}),k=function(e){return e.audio=`audio`,e.video=`video`,e.screen=`screen`,e.audioshare=`audioshare`,e}({}),Xt=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),Zt=class extends b{constructor(e=R,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`,E()),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||T.browserName()!==`Safari`||(this._cameraMuteRecoveredAt=Date.now(),this._logger?.log(C.ERROR,`camera_mute_recover`),this._debug.log(`[MediaSource] Safari camera mute recovery`),this.toggleVideo(!0).then(()=>this._logger?.log(C.ERROR,`camera_mute_recover_success`)).catch(e=>{this._logger?.log(C.ERROR,`camera_mute_recover_fail`),this._debug.warn(`[MediaSource] Camera mute recovery failed`,e)}))}),this._debug=e,this._logger=t,this._initDeviceChangeListener(),M.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),M.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Jt(this._debug),this._videoEffectsFpsLimiter.addEventListener(qt.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)),M.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[S.AUDIO],t=!0){if(this._stream)return;let n=e.includes(S.VIDEO),r=e.includes(S.AUDIO),i=e.includes(S.ANIMOJI),a=T.getBrowserSupportFailure();if(a)throw new O(x.UNSUPPORTED,{callError:{scope:`internal`,code:`environment`,description:a}});try{this._stream=await T.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 O(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(x.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Qe(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=T.getSavedMicrophone(),n=T.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{}},T.addEventListener(`devicechange`,this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&T.removeEventListener(`devicechange`,this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?`stream`:`video`,n=e||await T._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=n.getVideoTracks()[0],!this._stream)Ze(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);this._logger?.log(C.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(C.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 T.getUserAudio(void 0,this._debug,this._logger);if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Ze(t);else{let e=await this._applyAudioEffect();this._logger?.log(C.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(C.ERROR,`change_audio`),this._debug.error(`Microphone change failed`,e),e}}async _changeScreen(e,t,n){try{if(n=n||await T.getScreenMedia(e,t,this._debug,this._logger),!this._stream)Ze(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),this._logger?.log(C.DEVICE_CHANGED,`screen`),this._debug.log(`Screen capturing started`),this._screenTrack=r,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,M.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(C.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(!M.audioEffects||!this._audioEffectParams)return M.audioEffects?.pause(),this._micAudioTrack;M.audioEffects.isInitialized||await M.audioEffects.init(),M.audioEffects.resume(),M.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),M.audioEffects.setSource(this._micAudioTrack);let e=M.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=T.getSilentMediaTrack();return e.contentHint=`music`,e.stop(),e}getBlackScreenShareTrack(){let e=T.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(M.videoEffects),!M.videoEffects)return t;try{return M.videoEffects.setEffect(e,t)}catch(e){return this._debug.warn(`Video effect failed`,e),t}}_stopEffect(){if(M.videoEffects)try{M.videoEffects.stopEffect()}catch(e){this._debug.warn(`Video effect failed`,e)}}destroy(){this._destroyDeviceChangeListener(),T.releaseFirefoxMicrophonePermissionWarmup(),M.videoEffects&&(this._effect=null,M.videoEffects.destroy()),M.audioEffects&&M.audioEffects.destroy(),this._stream&&(Ze(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),T.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(S.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 T._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);this.cameraVideoTrack=e.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=T.getBlackMediaTrack(M.videoMinWidth,M.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 T.getUserAudio(void 0,this._debug,this._logger);this._micAudioTrack=e.getAudioTracks()[0],await t(await this._applyAudioEffect(),!0)}catch(e){throw M.audioEffects?.pause(),await t(T.getSilentMediaTrack(),!1),typeof e==`string`?Error(e):e}else M.audioEffects?.pause(),await t(T.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:M.noiseSuppression})}async videoEffect(e){if(!M.videoEffects)throw Error(`Video Effects library is not set`);if(this._logger?.log(C.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(!M.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||!j.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<M.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(e=>{this._debug.warn(`MediaSource handleVideoEffectsLowFps error`,e)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??M.videoFrameRate;return this._effect?Math.min(e,M.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await $e(e,{width:this._effect?M.videoEffectMaxWidth:M.videoMaxWidth,height:this._effect?M.videoEffectMaxHeight:M.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}},A=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e}(A||{}),Qt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},$t=`L1T2`,en=1.35,tn=[{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 nn(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 rn(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return t.length>0?t[t.length-1].bitrate:tn[0].bitrate}function an(e=Qt.WIDTH,t=Qt.HEIGHT,n=tn,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=rn(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=rn(Math.max(e,t),n)}return{streams:s.reverse()}}function on(e,t){let n=t.streams.findIndex(t=>t.rid===e);return n>=0?2**(t.streams.length-n-1):1}function sn(e,t,n,r){let i=n?Math.round(n*en):1/0;if(e.forEach(e=>{let n=t.streams.find(t=>t.rid===e.rid);e.scaleResolutionDownBy=on(e.rid,t),e.scalabilityMode=$t,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 cn=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 ln(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var un=/\r?\n/;function dn(e){return e.split(un)}function fn(e){return e.join(`\r
|
|
8
|
-
`)}var
|
|
9
|
-
`+fn(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),fn(s)}e.patchLocalSDP=f;function p(e,t,n,r,i,o){let s=dn(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),fn(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 re(e,t=A.USER){let n=String(e);return h.test(n)?(R.warn(`Already composite id [${e}] type supplied [${t}]`),n):t===A.GROUP?`g`+n:t===A.USER?`u`+n:(R.warn(`Unknown type [${t}] for id [${e}]`),n.match(ne)?`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||A.USER,e.deviceIdx)}e.composeId=oe;function se(e){if(e.decorativeUserId)return ie(e.decorativeUserId,e.idType||A.USER,e.deviceIdx)}e.composeDecorativeId=se;function ce(e){return e.participant?oe(e.participant):ie(e.participantId,e.participantType||A.USER,e.deviceIdx)}e.composeMessageId=ce;function g(e){return typeof e==`string`?_(le(e).compositeUserId).id:e}e.extractOkId=g;function _(e){let t=String(e),n=t.match(h);return n?{id:Number(n[2]),type:n[1]===`g`?A.GROUP:A.USER}:(R.warn(`Unsupported compositeId [${e}]`),{id:Number(t),type:A.USER})}e.decomposeId=_;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=dn(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=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=R){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=R){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!e||!n||n.kind!==k.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*pn/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=an(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)}`),sn(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});m.degradationPreference=f,m.encodings.length>0&&t.setParameters?.(m).then(()=>{let e=t.getParameters();a.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(e.encodings)}`)},e=>{a.error(`Failed to set sender parameters`,m,e)})}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 ve(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 M.filterObservers?t.filter(e=>!e.uid.observer):t}e.mapSharedParticipants=ve;function v(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=v;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={[A.USER]:0,[A.GROUP]:1},{compositeUserId:i,deviceIdx:a}=le(e.id),{compositeUserId:o,deviceIdx:s}=le(t.id),{id:c,type:l}=_(i),{id:u,type:d}=_(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 cn(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})(gn||(gn={}));var j=gn,_n=`__CALLS_SDK_DEVTOOLS_`,vn=class{set(e,t){try{this.getStorage().setItem(_n+e,JSON.stringify(t))}catch(t){R.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(_n+e);return t===null?null:JSON.parse(t)}catch(t){return R.warn(`DevTools: Failed to read option`,e,t),null}}remove(e){try{this.getStorage().removeItem(_n+e)}catch(t){R.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(_n)&&e.removeItem(n)}catch(e){R.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(_n)){let t=r.substring(21),i=e.getItem(r);if(i!==null)try{n[t]=JSON.parse(i)}catch{}}return n}catch(e){return R.warn(`DevTools: Failed to get all options`,e),{}}}getStorage(){return window.localStorage}},yn=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}},bn=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 vn,this.params=new yn(this.storage)}};h(bn,`instance`,null);var xn=bn.getInstance(),M=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`)&&(y.accessToken=t.apiAuth.accessToken,y.sessionKey=t.apiAuth.sessionKey,y.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=xn.params.applyOverrides(t);Object.assign(e._params,j.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 e._params.appVersion}static get apiClientVersion(){return 1.1}static get sdkVersion(){return`2.8.13-dev.4ce2e1bb.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||(T.isMobile()?Nt.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)=>R.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)=>R.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 T.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 T.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,appVersion:e._params.appVersion,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(M,`_params`,{platform:`WEB`,clientStatsPlatform:``,appVersion:`0.0.0`,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:!0,forwardEmptyIceCandidate:!1});var N=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 P(e,...t){let n=M.get(e);typeof n==`function`&&setTimeout(n,0,...t)}function F(e,t,...n){if(M.filterObservers){if(Array.isArray(t)){if(t=t.filter(e=>!e.observer),!t.length)return}else if(t.observer)return}P(e,t,...n)}function I(e){return Object.assign({},e)}function Sn(e){return e.slice()}var Cn;(function(e){function t(e,t,n){P(`onLocalStream`,e,I(t),n)}e.onLocalStream=t;function n(e,t,n){P(`onScreenStream`,e,I(t),n)}e.onScreenStream=n;function r(e,t,n){P(`onVmojiStream`,e,I(t),n)}e.onVmojiStream=r;function i(e,t){P(`onVmojiError`,e,t)}e.onVmojiError=i;function a(e,t,n){P(`onLocalStreamUpdate`,I(e),t,n)}e.onLocalStreamUpdate=a;function o(e,t){R.debug(`Local status:`,e),P(`onLocalStatus`,e,t)}e.onLocalStatus=o;function s(e,t,n){F(`onRemoteStream`,e,t,n)}e.onRemoteStream=s;function c(e,t,n){F(`onRemoteLive`,e,t,n)}e.onRemoteLive=c;function l(e,t,n){F(`onLocalLive`,e,t,n)}e.onLocalLive=l;function u(e,t,n){F(`onRemoteLiveUpdate`,e,t,n)}e.onRemoteLiveUpdate=u;function d(e,t,n){F(`onLocalLiveUpdate`,e,t,n)}e.onLocalLiveUpdate=d;function f(e,t,n){F(`onRemoteScreenStream`,e,t,n)}e.onRemoteScreenStream=f;function p(e,t,n){F(`onRemoteVmojiStream`,e,t,n)}e.onRemoteVmojiStream=p;function m(e,t,n,r){F(`onRemoteStreamSuspended`,e,t,n,r)}e.onRemoteStreamSuspended=m;function ee(e,t,n,r,i,a){F(`onConversation`,e,I(t),I(n),r,i,a)}e.onConversation=ee;function te(e,t){e&&P(`onConversationParticipantListChunk`,e,t)}e.onConversationParticipantListChunk=te;function ne(e,t,n,r){F(`onRemoteMediaSettings`,e,I(t),n,r)}e.onRemoteMediaSettings=ne;function h(e,t,n){F(`onLocalMediaSettings`,e,I(t),n)}e.onLocalMediaSettings=h;function re(e,t,n,r){F(`onRemoteSharedMovieInfo`,e,I(t),n,r)}e.onRemoteSharedMovieInfo=re;function ie(e,t,n,r){F(`onRemoteSharedMovieStoppedInfo`,e,I(t),n,r)}e.onRemoteSharedMovieStoppedInfo=ie;function ae(e,t,n,r){F(`onLocalSharedMovieInfo`,e,I(t),n,r)}e.onLocalSharedMovieInfo=ae;function oe(e,t,n,r){F(`onLocalSharedMovieStoppedInfo`,e,I(t),n,r)}e.onLocalSharedMovieStoppedInfo=oe;function se(e,t,n,r){F(`onRemoteSharedUrl`,e,t,n,r)}e.onRemoteSharedUrl=se;function ce(e,t,n){F(`onParticipantAdded`,e,t,n)}e.onParticipantAdded=ce;function g(e,t,n){F(`onParticipantJoined`,e,t,n)}e.onParticipantJoined=g;function _(e,t=!1,n){P(`onLocalParticipantState`,I(e),t,n)}e.onLocalParticipantState=_;function le(e,t,n,r){F(`onRemoteParticipantState`,e,I(t),n,r)}e.onRemoteParticipantState=le;function ue(e,t,n){P(`onRemoteParticipantsState`,e,t,n)}e.onRemoteParticipantsState=ue;function de(e,t,n=null,r){R.debug(`Remote status:`,t,e),F(`onRemoteStatus`,e,t,n,r)}e.onRemoteStatus=de;function fe(){P(`onPermissionsRequested`)}e.onPermissionsRequested=fe;function pe(e,t){P(`onPermissionsError`,e,t)}e.onPermissionsError=pe;function me(e,t,n){F(`onRemoteRemoved`,e,t,n)}e.onRemoteRemoved=me;function he(e,t,n,r){P(`onCallState`,e,t,I(n),r)}e.onCallState=he;function ge(e,t,n){P(`onDeviceSwitched`,e,t,n)}e.onDeviceSwitched=ge;function _e(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null,u){let d=c?Sn(c):void 0;P(`onMuteStates`,I(e),Sn(t),Sn(n),r,i,a,o,s,d,l,u)}e.onMuteStates=_e;function ve(e,t,n=!1,r){F(`onRolesChanged`,e,Sn(t),n,r)}e.onRolesChanged=ve;function v(e,t=!1,n){P(`onLocalRolesChanged`,Sn(e),t,n)}e.onLocalRolesChanged=v;function ye(e,t,n,r,i){F(`onPinnedParticipant`,e,t,n,r,i)}e.onPinnedParticipant=ye;function be(e,t,n){P(`onLocalPin`,e,t,n)}e.onLocalPin=be;function xe(e,t){P(`onOptionsChanged`,Sn(e),t)}e.onOptionsChanged=xe;function Se(e){P(`onCallAccepted`,e)}e.onCallAccepted=Se;function Ce(e){P(`onCallActive`,e)}e.onCallActive=Ce;function we(e,t,n){F(`onAcceptedCall`,e,t,n)}e.onAcceptedCall=we;function Te(e){P(`onRateNeeded`,e)}e.onRateNeeded=Te;function Ee(e,t){F(`onSpeakerChanged`,e,t)}e.onSpeakerChanged=Ee;function De(e,t){P(`onVolumesDetected`,Sn(e),t)}e.onVolumesDetected=De;function Oe(e,t){P(`onLocalVolume`,e,t)}e.onLocalVolume=Oe;function ke(e,t,n){P(`onJoinStatus`,e,t,n)}e.onJoinStatus=ke;function Ae(e,t){P(`onHangup`,e,t)}e.onHangup=Ae;function je(e){P(`onMultipartyChatCreated`,I(e))}e.onMultipartyChatCreated=je;function Me(){P(`onDeviceChange`)}e.onDeviceChange=Me;function Ne(e){P(`onFingerprintChange`,e)}e.onFingerprintChange=Ne;function Pe(){P(`onTokenExpired`)}e.onTokenExpired=Pe;function Fe(e,t,n=!1,r){P(`onChatMessage`,e,t,n,r)}e.onChatMessage=Fe;function Ie(e,t,n=!1,r){P(`onCustomData`,e,t,n,r)}e.onCustomData=Ie;function Le(e,t,n,r,i,a,o=null,s){P(`onRecordStarted`,e,t,n,r,i,a,o,s)}e.onRecordStarted=Le;function Re(e=null,t,n){P(`onRecordStopped`,e,t,n)}e.onRecordStopped=Re;function ze(e,t){P(`onLocalNetworkStatusChanged`,e,t)}e.onLocalNetworkStatusChanged=ze;function Be(e,t){P(`onNetworkStatusChanged`,e,t)}e.onNetworkStatusChanged=Be;function Ve(e,...t){P(`onDebugMessage`,e,...t)}e.onDebugMessage=Ve;function He(e,t,...n){P(`onDebugMessageWithContext`,e,t,...n)}e.onDebugMessageWithContext=He;function Ue(e,t){P(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=Ue;function We(){P(`onAutoplayError`)}e.onAutoplayError=We;function Ge(e,t,n,r,i,a){P(`onChatRoomUpdated`,e,t,n,r,i,a)}e.onChatRoomUpdated=Ge;function Ke(e,t){P(`onPromoted`,e,t)}e.onPromoted=Ke;function qe(e,t){P(`onRemoteMixedAudioStream`,e,t)}e.onRemoteMixedAudioStream=qe;function Je(e,t){P(`onJoinLinkChanged`,e,t)}e.onJoinLinkChanged=Je;function Ye(e,t){P(`onRoomsUpdated`,e,t)}e.onRoomsUpdated=Ye;function y(e,t,n,r,i){P(`onRoomUpdated`,e,t,n,r,i)}e.onRoomUpdated=y;function b(e,t){P(`onRoomParticipantsUpdated`,e,t)}e.onRoomParticipantsUpdated=b;function x(e,t){P(`onRoomSwitched`,e,t)}e.onRoomSwitched=x;function S(e,t){P(`onRoomStart`,e,t)}e.onRoomStart=S;function C(e,t=null,n){P(`onFeedback`,e,t,n)}e.onFeedback=C;function Xe(e,t){P(`onFeaturesPerRoleChanged`,e,t)}e.onFeaturesPerRoleChanged=Xe;function Ze(e,t){P(`onParticipantVmojiUpdate`,e,t)}e.onParticipantVmojiUpdate=Ze;function Qe(e,t,n){P(`onAsrSet`,e,t,n)}e.onAsrSet=Qe;function $e(e,t,n,r){P(`onAsrStarted`,e,t,n,r)}e.onAsrStarted=$e;function et(e,t){P(`onAsrStopped`,e,t)}e.onAsrStopped=et;function tt(e,t,n,r,i){P(`onAsrTranscription`,e,t,n,r,i)}e.onAsrTranscription=tt;function nt(e,t,n){P(`onParticipantIdChanged`,e,t,n)}e.onParticipantIdChanged=nt;function rt(e,t){P(`onVideoSuspendSuggest`,e,t)}e.onVideoSuspendSuggest=rt;function it(e){P(`onSignalingMessage`,typeof e==`string`?e:I(e))}e.onSignalingMessage=it;function at(e,t){P(`onPromotionApproved`,e,t)}e.onPromotionApproved=at;function ot(e,t){P(`onPeerRegistered`,e,t)}e.onPeerRegistered=ot;function st(e,t){P(`onNonFatalError`,e,t)}e.onNonFatalError=st})(Cn||(Cn={}));var L=Cn,wn=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),Tn;(function(e){let t=`📞`,n=()=>({sessionId:null,conversationId:null}),r=(e,t,...n)=>{L.onDebugMessage(t,...n),L.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(M.debugLog&&je(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,M.debugLog&&Me()}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 re(e=null){let t=null,n=e;function r(){!M.debugLog||t||(t=Ne(),n&&Pe(n,t))}let i=()=>(r(),{sessionId:t,conversationId:n});return{get sessionId(){return t},get conversationId(){return n},setConversationId(e){n=e,t&&Pe(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=re;function ie(e,...t){}e.test=ie})(Tn||(Tn={}));var R=Tn,z=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)){R.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 R.error(`Can't hold previous active, error: ${e}`),Error(`Cannot switch call: hold failed`)}}this._conversations.has(e)&&(this._activeId=e,L.onCallActive(e));let r=this._conversations.get(e);if(r&&r?.isCallHeld)try{await r.hold(!1,n)}catch(e){throw R.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 R.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()}}},En=class extends Error{constructor(e){super(e?`Signaling disposed. Command ${e}`:`Signaling disposed`),this.name=`SignalingDisposedError`}},Dn=class extends Error{constructor(e){super(e?`Producer connection closed. Command ${e}`:`Producer connection closed`),this.name=`ProducerConnectionClosedError`}},On=class extends b{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}},B=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}(B||{});function kn(e){return e.stopStream}function An(e){return e.keyFrameRequested}function jn(e){if(kn(e))return`ss`;if(An(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 V=function(e){return e.CAMERA=`CAMERA`,e.SCREEN=`SCREEN`,e.STREAM=`STREAM`,e.MOVIE=`MOVIE`,e.ANIMOJI=`ANIMOJI`,e.SHARED_URL=`SHARED_URL`,e}({}),Mn=`s`,Nn=`m`;function Pn(e){return e.participantId+(e.mediaType?`:`+Mn+e.mediaType:``)+(e.streamName?`:`+Nn+e.streamName:``)}function Fn(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 Mn:r=In(n.slice(1));break;case Nn: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:j.compose(n,a),mediaType:r,streamName:i}}function In(e){for(let t of Object.keys(V))if(t===e)return V[t];return null}function Ln(){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),Rn(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 Rn(e){return e.buffer!==void 0}function zn(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 Bn=0,Vn=1,Hn=2,Un=3,Wn=4,Gn=5,Kn=6,qn=7,Jn=0,Yn=1,Xn=2,Zn=0,Qn=0,$n=0,er=1,tr=class{constructor(e=R){h(this,`participantIdRegistry`,null),h(this,`_debug`,void 0),this._debug=e}setParticipantIdRegistry(e){this.participantIdRegistry=e}serializeUpdateDisplayLayout(e,t){let n=Ln();l.Int.enc(n,Bn),l.Int.enc(n,Zn),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=Ln();if(this.writeStreamDesc(t,i),kn(r))l.Int.enc(i,Yn);else if(An(r))l.Int.enc(i,Xn);else if(l.Int.enc(i,Jn),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,$n);break;case`cn`:l.Int.enc(i,er);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=Ln();return l.Int.enc(n,Vn),l.Int.enc(n,Zn),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=Ln();return l.Int.enc(n,Hn),l.Int.enc(n,Zn),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=Ln();return l.Int.enc(n,Un),l.Int.enc(n,Zn),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=Ln();return l.Int.enc(n,Wn),l.Int.enc(n,Zn),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=Ln();return l.Int.enc(n,Gn),l.Int.enc(n,Zn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=Ln();return l.Int.enc(n,Kn),l.Int.enc(n,Zn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=Ln();l.Int.enc(n,qn),l.Int.enc(n,Zn),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?zn(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await ln(e)):zn(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==Zn){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==Qn){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Bn:return this.deserializeUpdateDisplayLayoutResponse(t);case Vn: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=zn(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=Pn(this.participantIdRegistry?.getStreamDescription(e));r[i]=l.Int.dec(t)}}),{type:`response`,sequence:t,response:B.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:B.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:n}}},H=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}(H||{}),nr=1e3;function U(e,t,n=0){return t in e&&e[t]?e[t]:n}function rr(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function ir(e,t){return n=>n[e]===t}function ar(e){return(t,n)=>n[e]-t[e]}function or(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function sr(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function cr(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>[t,e[t]]).reduce((e,t)=>(e[t[0]]=j.isObject(t[1])?cr(t[1]):t[1],e),{})}function lr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function ur(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(lr).then(sr)}function dr(e){let t=e.filter(ir(`type`,`candidate-pair`)).sort(ar(`priority`)).find(rr(ir(`nominated`,!0),ir(`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(ir(`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(ir(`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}}),cr(n)}function fr(e,t,n=!1){let r=or(`id`,e);return(n?e.filter(rr(ir(`type`,`remote-inbound-rtp`))):e.filter(rr(ir(`type`,`inbound-rtp`),ir(`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:U(e,`bytesReceived`),bytesSent:U(e,`bytesSent`),headerBytesReceived:U(e,`headerBytesReceived`),headerBytesSent:U(e,`headerBytesSent`),jitter:U(e,`jitter`),packetsLost:U(e,`packetsLost`),packetsReceived:U(e,`packetsReceived`),packetsSent:U(e,`packetsSent`),fractionLost:U(e,`fractionLost`),pliCount:U(e,`pliCount`),firCount:U(e,`firCount`),nackCount:U(e,`nackCount`),userId:t[n],freezeCount:U(e,`freezeCount`,0),totalFreezesDuration:U(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=U(e,`framesDecoded`),n=U(e,`totalInterFrameDelay`),r=U(e,`totalSquaredInterFrameDelay`),i=U(e,`encoderImplementation`),a=U(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=U(e,`totalEncodeTime`)??0),i===`audio`&&(c.totalSamplesReceived=U(e,`totalSamplesReceived`),c.concealedSamples=U(e,`concealedSamples`),c.insertedSamplesForDeceleration=U(e,`insertedSamplesForDeceleration`),c.removedSamplesForAcceleration=U(e,`removedSamplesForAcceleration`),c.silentConcealedSamples=U(e,`silentConcealedSamples`),c.concealmentEvents=U(e,`concealmentEvents`),c.totalAudioEnergy=U(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 cr(c)}).filter(e=>!!e)}function pr(e,t,n=!1){if(!t||!t.rtps.length||!e.rtps.length)return e;let r,i;n&&(r=or(`ssrc`,e?.remoteRtps||[]),i=or(`ssrc`,t?.remoteRtps||[]));let a=or(`ssrc`,e.rtps),o=or(`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===k.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 mr(e,t,n={},r=!1){let i=await ur(e),a={timestamp:Date.now(),transport:dr(i),rtps:fr(i,n)};return r&&(a.remoteRtps=fr(i,n,!0)),t?pr(a,t,r):(await j.delay(nr),mr(e,a,n,r))}function hr(e){performance.clearMarks(e),performance.mark(e)}function gr(e){performance.clearMarks(e)}function _r(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 vr(e){return`${H.SCREENSHARE_FIRST_FRAME}_${yr(e)}`}function yr(e){return typeof e==`string`?e:JSON.stringify(e)}var W={distinctById:sr,rtcStatsToArray:lr,extractTransport:dr,extractRtps:fr,delta:pr,collectStats:mr,setMark:hr,clearMark:gr,measureMark:_r,getMarkNameScreenshareFirstFrame:vr},br=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(br||{}),G=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(G||{}),K=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}(K||{}),xr=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),Sr=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}({}),Cr={connected:{wt:H.WEBTRANSPORT_CONNECTED,ws:H.WEBSOCKET_CONNECTED},reconnected:{wt:H.WEBTRANSPORT_RECONNECTED,ws:H.WEBSOCKET_RECONNECTED},failed_pings:{wt:H.WEBTRANSPORT_FAILED_PINGS,ws:H.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:H.WEBTRANSPORT_FAILED_EXCEPTION,ws:H.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:H.WEBTRANSPORT_TIMEOUT,ws:H.WEBSOCKET_TIMEOUT},restart:{wt:H.WEBTRANSPORT_RESTART,ws:H.WEBSOCKET_RESTART}},q=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}(q||{}),J=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}(J||{}),wr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(wr||{}),{isObject:Tr,isObjectsEquals:Er}=j;function Dr(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||Tr(e.bitrates)&&Tr(t.bitrates)&&!Er(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Or=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function kr(e,t){return!(!Dr(e.camera,t.camera)||!Dr(e.screenSharing,t.screenSharing)||!Dr(e.fastScreenSharing,t.fastScreenSharing))}function Ar(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 jr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Mr=200;function Nr(e){for(let t of e.values())if(t.type===`outbound-rtp`&&(t.packetsSent??0)>0)return!0;return!1}var Pr=class{constructor(e,t,n=Mr){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(Nr)){this._state=`stopped`,this._onFirstMediaSent();return}}catch{}this._scheduleNextPoll()}}_scheduleNextPoll(){this._state===`polling`&&(this._timer=setTimeout(()=>{this._timer=null,this._poll()},this._pollIntervalMs))}},Fr=class extends b{constructor(e,t,n=null){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_state`,q.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||q.IDLE}stopFirstMediaSentProbe(){this._firstMediaSentProbeStopped=!0,this._disposeFirstMediaSentProbe()}_startFirstMediaSentProbe(){this._disposeFirstMediaSentProbe(),!(!this._pc||!this._onFirstMediaSent||this._firstMediaSentProbeStopped)&&(this._firstMediaSentProbe=new Pr(this._pc,this._onFirstMediaSent),this._firstMediaSentProbe.start())}_disposeFirstMediaSentProbe(){this._firstMediaSentProbe?.destroy(),this._firstMediaSentProbe=null}},Ir=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}},Lr=.25,Rr=.35,zr=85,Br=.1,Vr=1.5,Hr=.1,Ur=1,Wr=.6,Gr=.3,Kr=class extends b{constructor(e,t=R){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 Ir(Lr,Lr),loss:new Ir(Rr,Rr),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)/zr);for(let e=0;e<r;e++)n*=1-Br;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)/Vr);for(let e=0;e<r;e++)n*=1-Hr;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*Ur;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>=Wr?`good`:e>=Gr?`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>M.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}},qr=30*1e3,Jr=class e extends Fr{constructor(e,t,n,r,i,a=R,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 ha(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new Kr(n,this._debug),this.subscribe(this._signaling,G.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Yt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Yt.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(C.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===q.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||[q.IDLE,q.CLOSED,q.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(C.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(q.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){kr(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(q.CONNECTING)}_createPeerConnection(){let e=new RTCPeerConnection({iceServers:M.iceServers,iceTransportPolicy:M.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={},M.vmoji&&this._createDataChannel(e,wr.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(M.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(q.FAILED)):(this._debug.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(q.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 K.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case K.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case K.CUSTOM_DATA:Object.hasOwn(e.data,`sdk`)&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,n=j.getPeerIdString(e.peerId);j.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(C.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(C.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,M.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)):M.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:M.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===q.IDLE||e===q.OPENED?this._setState(q.CONNECTING):this._setState(q.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(C.ERROR,`iceConnectionState-fallback`),this._markConnected());break}}_markConnected(){this._neverConnected=!1,this._setState(q.CONNECTED),this._stopReconnection(),this._pc&&j.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(C.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(C.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(q.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()},M.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(J.SERVER).catch(e=>{e instanceof En||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(C.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(C.ERROR,`iceRestart-direct`),this._requestTopologySwitch()},M.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(C.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(C.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(C.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(C.ERROR,`setLocalDescription-direct`),e}}static _patchLocalDescription(e){let t=!!T.baseChromeVersion();return e.sdp=j.patchLocalSDP(e.sdp,M.preferH264&&T.canPreferH264(),T.isBrokenH264Decoder(),M.preferVP9,t&&M.audioNack),e}static _patchRemoteDescription(e){return e.sdp=j.patchRemoteSDP(e.sdp,!1,!1,M.preferVP9,T.isBrokenVP9Encoder(),T.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(C.ERROR,`replaceTrack-direct`)})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}W.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,this._codecStatsAggregator?.reportUsage(t);let n={inbound:{topology:J.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`inbound-rtp`?(e.userId=this._participantId,!0):!1)},outbound:{topology:J.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:J.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,M.statisticsInterval)})};this._statInterval=window.setTimeout(e,M.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(!M.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=Or.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=Or.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=Or.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Or.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>qr)||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=j.sdpFingerprint(e);if(t===null){this._debug.warn(`Fingerprint calculation is unsupported`);return}this._fingerprint===null?this._fingerprint=t:(L.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=j.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}]`)}}},Yr=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),Xr=16,Zr=class e{constructor(e,t,n,r=R){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(Xr)}}_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}},Qr,$r=class{constructor(){h(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};Qr=$r,h($r,`_instance`,null),h($r,`getInstance`,()=>(Qr._instance||(Qr._instance=new Qr),Qr._instance));var ei=class{constructor(e=R){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=Fn(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:K.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:K.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:K.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:K.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:K.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:K.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:K.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 V.CAMERA;case 1:return V.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=Yr.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:K.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},Y=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}({}),ti=class{constructor(e=R,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:Y.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 Y.READY:s=!0,c||(c=!0,a());break;case Y.ERROR:s?m(e.data.error):p(e.data.error);break;case Y.FRAME:t(e.data);break;case Y.DEBUG:this._debug.debug(e.data.message);break;case Y.LOG_ERROR:this._logger?.log(C.ERROR,e.data.message);break}},this._sendToWorker(Y.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`)}},ni=class extends ti{constructor(e=R,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(Y.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r,debug:R.enabled()},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`LibVPxDecoder destroyed`)}static isBrowserSupported(){return`WebAssembly`in window&&`Worker`in window}},ri=class extends ti{constructor(e=R,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(Y.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&&!T.isBrokenVP9Decoder()&&T.browserName()!==`Firefox`}},ii=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}},ai=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=W.getMarkNameScreenshareFirstFrame(this._participantId),r=W.measureMark(n);r!==null&&this._statAggregator?.logEventualStat({name:H.SCREENSHARE_FIRST_FRAME,value:r,width:e,height:t})}},oi=65536,si=`MARK_SCREENSHARE_FREEZE_DURATION`,ci=class e{constructor(e,t,n,r,i,a=R){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 ai(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)%oi!==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(){W.clearMark(si),W.clearMark(W.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){W.setMark(si);return}let t=W.measureMark(si);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},li=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")}},ui=class extends li{constructor(e,t=R){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)&&!(T.browserName()===`Safari`&&Number(T.browserVersion())===15)}},di=class extends li{constructor(e,t=R){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:k.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&&ri.isBrowserSupported()}},fi=class extends ci{constructor(e,t,n,r,i,a=R,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,`_webCodecsRetryAttempted`,!1),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 ii(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!di.isBrowserSupported()?this._renderer=new ui(this._onStream,this._debug):this._renderer=new di(this._onStream,this._debug)}_initDecoder(e=!1){e||!ri.isBrowserSupported()?this._decoder=new ni(this._debug,this._logger):this._decoder=new ri(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=>{if(this._decoderBusy=!1,this._decoder instanceof ri&&typeof e==`string`&&e.includes(`EncodingError`)){this._decoderQueue=[],!this._webCodecsRetryAttempted&&e.includes(`reset because error during decoding`)?(this._webCodecsRetryAttempted=!0,this._debug.warn(`StreamBuilder retry WebCodecs with software decoder`),this._onKeyFrameRequested?.()):this._switchToLibVPXDecoder();return}this._decodeQueue()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()}).catch(e=>{this._debug.warn(`StreamBuilder decoder init failed`,e),this._decoder instanceof ri&&this._switchToLibVPXDecoder()})}_switchToLibVPXDecoder(){this._debug.warn(`StreamBuilder switch to LibVPX decoder`),this._decoderQueue=[],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),this._onKeyFrameRequested?.()}_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 ui.isBrowserSupported()||di.isBrowserSupported()}},pi=1,mi=1,hi=2,gi=0,_i=1,vi=2,yi=4,bi=8;function xi(e,t,n,r,i,a,o){let s=0;t&&(s|=_i),n&&(s|=vi),r&&(s|=yi),o||(s|=bi);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,pi),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,gi),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 Si(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&_i),l=!!(s&vi),u=!!(s&yi),d=!!(s&bi);if(n!==pi)throw Error(`Unexpected protocol version. Got ${n}, expected ${pi}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function Ci(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==pi||t.getUint8(1)!==mi||t.getUint16(2)!==gi)}function wi(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==pi||t.getUint8(1)!==hi||t.getUint16(2)!==gi?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function Ti(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,pi),n.setUint8(1,mi),n.setUint16(2,e),t}var Ei=2**15-1,Di=1,Oi=5,ki=5,Ai=class e{constructor(e,t=R){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)-Oi);r-n>ki&&(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}},ji=class e extends ci{constructor(e,t,n,r,i=R){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(Di)),f.element(f.ID.TrackUID,f.number(Di)),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 Ai(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>Ei&&(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(Di),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"`)}},Mi=class{constructor(e,t,n,r,i,a=null,o=R,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=Si(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=M.screenShareWebmBuilder&&ji.isBrowserSupported()?new ji(n,e,this._onStat,this._statAggregator,this._debug):new fi(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=Ti(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`)}},Ni=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}},Pi=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 Ni(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):``}},Fi=1e3,Ii=class extends ti{constructor(e,t,n,r,i=R,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:R.enabled()})}_encode(e,t){let n=e.data.buffer;this._sendToWorker(Y.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)},Fi),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(Y.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},Li=class extends ti{constructor(e,t,n,r,i,a,o=R,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(Y.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(Y.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}},Ri=2100,zi=600,Bi=1.2,Vi=.8,Hi=2e3,Ui=8e3,Wi=8e3,Gi=16e3,Ki=4,qi=2e3,Ji=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(Ji||{}),Yi=class{constructor(e,t,n,r,i,a,o,s=R){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=Ri,i&&(this._highDelayThreshold=zi),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} -> ${Ji[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>Hi){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Ki),this._probing=!1);let n=Vi*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*Vi),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*Wi/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Ji[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=Ui+this._upPenalty*Wi;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*Bi,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*Wi/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Ji[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>Gi&&(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>qi){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}`)}}},Xi=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}},Zi=65536,Qi=50,$i=400,ea=1e6,ta=3e5,na=3e4,ra=2e3,ia=5,aa=0,oa=class{constructor(e,t,n,r,i=R,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 Xi(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 Pi),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=M.consumerScreenDataChannelPacketSize-11,this._datachannel=t,this._signaling=n,this._fastSharing=r,this._congestionControlEnabled=M.screenShareCongestionControl||this._fastSharing,this._width=e.getSettings().width,this._height=e.getSettings().height,this._maxFrameDelay=this._fastSharing?M.screenShareCongestionControlThreshold:M.screenShareCongestionControlThreshold*2;let o=M.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=${M.screenShareCongestionControlThreshold}`),this._congestionControl=new Yi(l,s,c,this._congestionControlEnabled,this._fastSharing,M.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(Li.isBrowserSupported()){let t=this._fastSharing;this._encoder=new Li(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new Ii(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{Ci(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=wi(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 ii(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+Zi)%Zi>ia&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>ra&&(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(),j.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 j.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 Pi;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=xi(e,t,n,r,aa,this._encoder.isVP9(),i),o={sequence:aa,data:a};return aa=(aa+1)%Zi,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 Li.isBrowserSupported()||Ii.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(ta,Math.min(ea,Math.round(n*Qi))),maxBitrate:Math.round(n*$i)}}_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>na){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t).catch(e=>{!(e instanceof En)&&!(e instanceof Dn)&&this._debug.warn(`Unable to send sharing stats`,e)})),this._lastSharingStat=e}}},sa=class{constructor(e,t,n,r=R,i=null){h(this,`_pc`,null),h(this,`_transceiver`,null),h(this,`_currentSimulcastInfo`,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(),!M.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}this._pc=e,this._transceiver=t,t.direction=`sendonly`,await t.sender.replaceTrack(r),t.sender.setStreams(n),await this._applyCurrentMediaState(),this._debug.log(`SimulcastSender: Prepared mid=${t.mid} encodings=${JSON.stringify(t.sender.getParameters().encodings)}`)}finalizeAnswer(e){if(!this._pc||!this._transceiver?.mid)return e;this._pc.getTransceivers().forEach(e=>{e.mid===null&&e.stop()});let t=dn(e),n=this._findMediaSection(t,this._transceiver.mid);if(n){for(let e=n.start;e<n.end;e++)if(t[e].startsWith(`a=simulcast:send `)){t[e]=t[e].replaceAll(`~`,``);break}let e=this._mediaSource.getStream()?.getVideoTracks()[0];e&&this._getConfig(Qt.WIDTH,Qt.HEIGHT,e.getSettings().frameRate).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}})}return fn(t)}async sync({force:e=!1}={}){if(!this._transceiver||!this._currentSimulcastInfo||!this._mediaSource.mediaSettings.isVideoEnabled)return;let t=this._mediaSource.getStream()?.getVideoTracks()[0];if(!t)return;let n=this._getTrackConfig(t);if(!e&&nn(this._currentSimulcastInfo,n.simulcastInfo))return;let r=await this._applyConfig(n,!0);r&&(this._debug.log(`SimulcastSender: Sync ${n.width}x${n.height} encodings=${JSON.stringify(r.encodings)}`),await this._changeSimulcast({mediaSource:Xt.CAMERA,simulcastInfo:n.simulcastInfo}))}replaceTrack(e){let t=this._transceiver,n=t?.sender.track;if(!t||e.kind!==k.video||!n||n.contentHint!==e.contentHint)return!1;let r=this._mediaSource.mediaSettings.isVideoEnabled;return t.sender.replaceTrack(e).then(()=>{if(!r)return;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(C.ERROR,`replaceTrack-single`)}),!0}reset(){this._pc=null,this._transceiver=null,this._currentSimulcastInfo=null}_findTransceiver(e){for(let t of e.getTransceivers())if((t.sender.track?.kind??t.receiver.track?.kind)===k.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}_getConfig(e,t,n=30){let r=this._getCameraSettings(),i=r?.maxFramerate?Math.min(n||30,r.maxFramerate):n||30,a=r?.bitrates?.generic?.length?r.bitrates.generic:void 0;return{width:e,height:t,simulcastInfo:an(e,t,a,i),maxDimension:r?.maxDimension,maxBitrate:!a&&r?.maxBitrateK?r.maxBitrateK*1024:void 0}}_getTrackConfig(e){let t=e.getSettings();return this._getConfig(t.width??Qt.WIDTH,t.height??Qt.HEIGHT,t.frameRate)}async _applyConfig(e,t=!1){let n=this._transceiver;if(!n)return null;let r=n.sender.getParameters();if(r.encodings.length<=1)return null;sn(r.encodings,e.simulcastInfo,e.maxDimension,e.maxBitrate);try{await n.sender.setParameters(r)}catch(e){if(this._debug.error(`SimulcastSender: Failed to set sender parameters`,r,e),!t)throw e}return this._currentSimulcastInfo=e.simulcastInfo,r}async _applyCurrentMediaState(){let e=this._mediaSource.getStream()?.getVideoTracks()[0];if(!e)return;let t=this._mediaSource.mediaSettings.isVideoEnabled?this._getTrackConfig(e):this._getConfig(M.videoMinWidth,M.videoMinHeight,e.getSettings().frameRate),n=await this._applyConfig(t);n&&this._debug.log(`SimulcastSender: Current media state ${t.width}x${t.height} encodings=${JSON.stringify(n.encodings)}`)}async _syncReplacedTrack(e){let t=this._getTrackConfig(e);this._currentSimulcastInfo=t.simulcastInfo,await this._changeSimulcast({mediaSource:Xt.CAMERA,simulcastInfo:t.simulcastInfo})}async _changeSimulcast(e){try{await this._signaling.changeSimulcast(e)}catch(e){if(!(e instanceof Dn))throw e}}},ca=90,la=4294967295,ua=class e extends Fr{constructor(e,t,n,r=R,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 sa(e,t,()=>this._serverSettings.camera,r,i),this.subscribe(this._signaling,G.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Yt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Yt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Yt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._debug.debug(`ServerTransport: Created`)}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!==q.IDLE&&e!==q.CLOSED&&e!==q.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(q.FAILED)):(this._debug.debug(`ServerTransport: Closed`),this._setState(q.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){kr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(M.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 ha(this,this._signaling,this._statAggregator,!1,this._debug)}_closeConnection(){this._signaling.resetProducerConnection(),this._ssrcMap={},this._ssrcMapUpdated=!0,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=j.debounce(e=>{this._pc&&this._onConnectionStateChange(this._pc,e)},500),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new ei(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,wr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,wr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,wr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),M.asrDataChannel&&this._createDataChannel(this._pc,wr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new Zr(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),M.vmoji&&this._createDataChannel(this._pc,wr.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(M.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(C.ERROR,`addTrack-single`),this.close(e);return}this._startFirstMediaSentProbe(),this._createDataChannel(this._pc,wr.consumerScreenShare,e=>{this._consumerScreen=e,this._consumerScreen.binaryType=`arraybuffer`;let t=this._mediaSource.getScreenTrack();t&&(!M.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(t)}),e||this._allocateConsumer(),this._setState(q.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==q.OPENED&&(this._setState(q.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&&(this._ssrcMap={},this._ssrcMapUpdated=!0,dn(e.sdp).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Yr.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Yr.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3])}))}_createCaptureSender(e){let t=this._mediaSource.mediaSettings;!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new oa(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 Mi(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!==k.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(T.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)})}j.applyVideoTrackSettings(e,n,a??n.track,this._prevConsumerSettings,t,this._debug)}),this._prevConsumerSettings=t}if(this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&M.consumerFastScreenShare){let e=this._serverSettings.fastScreenSharing;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{!n.track||n.track.kind!==k.video||n.track.contentHint!==`motion`||j.applyVideoTrackSettings(e,n,n.track,this._prevConsumerFastSharingSettings,t,this._debug)}),this._prevConsumerFastSharingSettings=t}}}_onScreenSharingStatus(e){e.track?(!M.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,M.statisticsInterval)};this._statInterval=window.setTimeout(e,M.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 W.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent(X.REMOTE_DATA_STATS,{inbound:{topology:J.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`inbound-rtp`)},outbound:{topology:J.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:J.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=Yr.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=xa.get();!M.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e).catch(e=>{e instanceof En||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(C.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(C.ERROR,`createAnswer-single`),e}try{if(!this._pc)throw Error(`Interrupt allocation`);n.sdp=j.patchLocalSDP(n.sdp,!1,T.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(C.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(C.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:j.patchRemoteSDP(e,!1,!1,!1,T.isBrokenVP9Encoder(),T.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===k.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===k.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(C.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case K.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case K.REALLOC_CON:this._reconnect();break;case K.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case K.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case K.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case K.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(),M.breakVideoPayloadTypes&&(this._debug.log(`test mode enabled, video switched off`),this._signaling.requestTestMode(`breakVideoPayloadTypes`,null).catch(e=>{e instanceof En||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(C.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(C.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===q.IDLE||t===q.OPENED?this._setState(q.CONNECTING):e.iceConnectionState===`checking`&&this._setState(q.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(q.RECONNECTING);break;case`connected`:this._setState(q.CONNECTED),j.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(this._logger?.log(C.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(C.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===k.audio&&e.contentHint===`music`&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e===k.screen&&M.consumerFastScreenShare&&this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return this._logger?.log(C.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(C.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(C.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(C.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&la,o=Math.ceil(a/ca);return Math.min(100,Math.max(0,o))}async _monitorRtpShare(){let e=$r.getInstance().value;if(!this._mediaSource.mediaSettings.isFastScreenSharingEnabled||!M.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(e=>e.track?.kind===k.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 re=25*1024*1024,ie=10,ae=`_okcls_logs_session_`,oe=3e4,se=`ok-calls-sdk-debug-logs`,ce=1,g=`sessions`,_=`chunks`,le=120*1e3,ue=new Set([`WARN`,`ERROR`]);function de(){return`${Date.now()}_${Math.random().toString(36).slice(2)}`}function fe(){let e=de();return pe(e),e}function pe(e){We.has(e)||We.set(e,[]),Ge.has(e)||Ge.set(e,0),Ke.has(e)||Ke.set(e,null)}function me(e){return Ke.get(e)??null}function he(e){let t=Ge.get(e)??0;return Ge.set(e,t+1),t}function ge(e,t){return`${e}:${String(t).padStart(12,`0`)}`}function _e(e){return new Blob([e]).size}function ve(){try{let e=window.localStorage;for(let t of Object.keys(e))t.indexOf(ae)===0&&e.removeItem(t)}catch(e){console.error(`Storage is blocked`,e)}}var v=new class{constructor(){h(this,`_db`,null),h(this,`_dbPromise`,null),h(this,`_dbName`,se),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(this._dbName,ce);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 clearForTests(){if(this._supported=this.isSupported(),this._dbName===se&&(this._dbName=`${se}-test-${Math.random().toString(36).slice(2)}`,this.close()),this._supported){let e=await this.open();if(e){let t=e.transaction([g,_],`readwrite`);t.objectStore(g).clear(),t.objectStore(_).clear(),await this.txDone(t).catch(e=>console.warn(`Failed to clear debug log storage`,e))}}this.close()}async getAllSessions(){let e=await this.open();if(!e)return[];let t=e.transaction(g,`readonly`),n=await this.requestToPromise(t.objectStore(g).getAll());return await this.txDone(t),n}async getSessionsByConversationId(e){let t=await this.open();if(!t)return[];let n=t.transaction(g,`readonly`),r=await this.requestToPromise(n.objectStore(g).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(g,`readonly`),r=await this.requestToPromise(n.objectStore(g).get(e));return await this.txDone(n),r?[r]:[]}async getChunksBySession(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).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(g,`readwrite`);return n.objectStore(g).put(e),await this.txDone(n),!0}async putSessionAndChunk(e,t){let n=await this.open();if(!n)return!1;let r=n.transaction([g,_],`readwrite`);return r.objectStore(g).put(e),r.objectStore(_).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([g,_],`readwrite`),i=r.objectStore(_),a=0;for(let e of n)a+=e.bytes,i.delete(e.id);return r.objectStore(g).delete(e),await this.txDone(r),a}async deleteChunks(e){let t=await this.open();if(!t||!e.length)return;let n=t.transaction(_,`readwrite`),r=n.objectStore(_);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>re&&n.length;){let e=n.shift();if(!e)break;r-=await this.deleteSession(e.sessionId)}for(;t.length>ie||t.length>1&&r>re;){let e=t.shift();if(!e)return;for(let t of e.sessions)r-=await this.deleteSession(t.sessionId)}t.length===1&&r>re&&await this.trimOldestChunks(t[0],r-re),e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),(t.length>ie||e.reduce((e,t)=>e+t.bytes,0)>re)&&await this.enforceRetentionPolicy()}createSchema(e){if(!e.objectStoreNames.contains(g)){let t=e.createObjectStore(g,{keyPath:`sessionId`});t.createIndex(`conversationId`,`conversationId`,{unique:!1}),t.createIndex(`updatedAt`,`updatedAt`,{unique:!1})}e.objectStoreNames.contains(_)||e.createObjectStore(_,{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 ye(e){return e.sessionId?v.getSessionBySessionId(e.sessionId):e.conversationId?v.getSessionsByConversationId(e.conversationId):[]}async function be(e,t,n,r){if(!r.length)return;let i=me(e)||t,a=r,o=JSON.stringify(a),s=_e(o);for(;s>re&&a.length>1;)a=a.slice(Math.floor(a.length/2)),o=JSON.stringify(a),s=_e(o);if(s>re)return;let c=a[0].t,l=a[a.length-1].t,[u]=await v.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:ge(e,n),sessionId:e,sequence:n,startTime:c,endTime:l,bytes:s,items:a};await v.putSessionAndChunk(f,p)&&await v.enforceRetentionPolicy()}function xe(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 Se(e){let t=We.get(e);if(!t?.length)return Ye;let n=t.splice(0),r=me(e),i=he(e);return Ye=Ye.then(()=>be(e,r,i,n)).catch(e=>{console.warn(`Failed to write debug log to storage`,e)}),Ye}function Ce(e){if(e)return Se(e);for(let e of We.keys())Se(e);return Ye}async function we(e){let t=[];for(let n of e.sort((e,t)=>e.startTime-t.startTime)){let e=await v.getChunksBySession(n.sessionId);for(let n of e)t.push(...n.items)}return t}async function Te(e){let t=await we(e);if(!t.length)return t;let n=t.sort(De),r=n[0].t,i=n[n.length-1].t;return[...await Ee(r,i,new Set(e.map(e=>e.sessionId))),...n].sort(De)}async function Ee(e,t,n){let r=(await v.getAllSessions()).filter(r=>!n.has(r.sessionId)&&r.conversationId===null&&r.endTime>=e-le&&r.startTime<=t),i=[];for(let n of r){let r=await v.getChunksBySession(n.sessionId);for(let n of r)n.endTime<e-le||n.startTime>t||i.push(...n.items.filter(n=>n.t>=e-le&&n.t<=e?!0:n.t>=e&&n.t<=t&&ue.has(n.l)))}return i}function De(e,t){return e.t-t.t}function Oe(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 ke(){Ce()}function Ae(){document.visibilityState===`hidden`&&Ce()}function je(e,t,n=qe){Ue||Me(),pe(n);let r=new Date,i={t:r.getTime(),l:e,d:xe(t),h:r.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`})};return We.get(n)?.push(i),Je||(Je=window.setTimeout(()=>{Je=null,Ce()},oe)),i}function Me(){Ue||(Ue=!0,ve(),v.open(),window.addEventListener(`pagehide`,ke),document.addEventListener(`visibilitychange`,Ae))}function Ne(){return Ue||Me(),Ce(),fe()}function Pe(e,t=qe){t&&(pe(t),Ke.set(t,e),e&&v.updateSessionConversationId(t,e))}async function Fe(){return await Ce(),(await v.getAllSessions()).sort((e,t)=>t.updatedAt-e.updatedAt)}async function Ie(e){return await Ce(),Te(await ye(e))}async function Le(e){return JSON.stringify(await Ie(e))}async function Re(e){let t=await Le(e),n=`logs_${e.sessionId||e.conversationId}_${Date.now()}.json`;return Oe(t,n),n}async function ze(e){await Ce();let t=e?await ye(e):await v.getAllSessions();for(let e of t)await v.deleteSession(e.sessionId)}async function Be(){await Ce();let e=await v.getStorageSummary(),t=await v.estimateStorage();return{supported:v.supported,callsCount:e.callsCount,sessionsCount:e.sessions.length,usedBytes:e.usedBytes,maxBytes:re,maxCalls:ie,quotaBytes:t?.quota,usageBytes:t?.usage}}async function Ve(){await Ce();let e=await we(await v.getAllSessions());return JSON.stringify(e.sort(De))}async function He(){let e=await Ve(),t=`logs_${Date.now()}.json`;return Oe(e,t),t}var Ue=!1,We=new Map,Ge=new Map,Ke=new Map,qe=fe(),Je=null,Ye=Promise.resolve();window.__VKCallsSDKLogs__=(e=!1)=>(Ue||Me(),e?Ve():He());var y=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(y,`_sessionKey`,void 0),h(y,`_sessionSecretKey`,void 0),h(y,`_accessToken`,void 0),h(y,`_userId`,null),h(y,`_reauthorizePromise`,null);var b=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()})}},x=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}(x||{}),S=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}(S||{}),C=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}(C||{}),Xe=e=>e.stop(),Ze=e=>e.getTracks().forEach(Xe),Qe=e=>e.getVideoTracks().forEach(Xe);async function $e(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 et=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}},tt=`_okcls_`,nt=(()=>{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 rt(e){let t=nt?nt.getItem(tt+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function it(e,t){try{nt&&nt.setItem(tt+e,JSON.stringify(t))}catch{}}function at(e){nt&&nt.removeItem(tt+e)}var ot;(function(e){function t(e){return rt(e)||null}e.get=t;function n(e,t){it(e,t)}e.set=n;function r(e){at(e)}e.remove=r})(ot||(ot={}));var w=ot,st=null,ct=null,lt=null,ut=[],dt=[],ft=[],pt=[],mt=null,ht=null,gt=null,_t=!1,vt=!1,yt,bt,xt,St=null,Ct=null,wt=``,Tt=null,Et=[],Dt=null,Ot=navigator.appVersion,kt=navigator.appName,At=navigator.userAgent,jt={};function Mt(e,t){return Number(t.deviceId===`default`)-Number(e.deviceId===`default`)}var Nt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Nt).includes(e)}e.contains=t})(Nt||(Nt={}));var Pt=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(ht&&(r=ht.groupId,n=ht.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!ht&&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(mt&&(s=mt.groupId,a=mt.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!mt&&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}},Ft=class extends Pt{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})}},It=class e{constructor(){h(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(t=null){if(e._lockId)throw t?.log(C.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(It,`_lockId`,0);async function Lt(){vt=!1,_t=!1,st=null;let e={camera:T.getSavedCamera(),microphone:T.getSavedMicrophone(),output:T.getSavedOutput()};await zt(),Rt(`devicechange`,e),R.onDeviceChange()}function Rt(e,...t){if(jt[e])for(let n of jt[e])n(...t)}async function zt(){return st||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!ct&&navigator.mediaDevices.addEventListener&&(ct=M.debounce(Lt,N.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,ct)),!lt&&et.isSupported()&&(lt=new et,await lt.init((e,t)=>{switch(t){case`denied`:case`prompt`:ct?.();break}})),st=navigator.mediaDevices.enumerateDevices().then(e=>{ut=e,z.debug(`Devices`,e),dt=e.filter(e=>e.kind===`videoinput`?((e.label||lt?.getPermissionState(`camera`)===`granted`)&&(_t=!0),!0):!1),dt.sort(Mt),ft=e.filter(e=>e.kind===`audioinput`?((e.label||lt?.getPermissionState(`microphone`)===`granted`)&&(vt=!0),!0):!1),ft.sort(Mt),pt=e.filter(e=>e.kind===`audiooutput`),pt.sort(Mt);let t=mt?.deviceId??w.get(`videoinput`),n=ht?.deviceId??w.get(`audioinput`),r=gt?.deviceId??w.get(`audiooutput`);return mt=dt.find(e=>e.deviceId===t)||null,ht=ft.find(e=>e.deviceId===n)||null,gt=pt.find(e=>e.deviceId===r)||pt[0]||null,st=Promise.resolve(e),e}).catch(()=>(st=null,[]))))}async function Bt(){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]);Tt=isNaN(t)?null:t}catch(e){z.warn(`Failed to get OS version`,e)}}function Vt(e){if(mt&&ht)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=>{!ht&&e.kind===A.audio?ht=t(T.getMicrophones(),e):!mt&&e.kind===A.video&&(mt=t(T.getCameras(),e))})}async function Ht(e,t,n=z,r=null){n.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative())));let i=(!e.isVideo()||T.hasCameraPermission())&&(!e.isAudio()||T.hasMicrophonePermission());!i&&!t&&R.onPermissionsRequested();let a=new It;try{a.busy(r);let t=await navigator.mediaDevices.getUserMedia(e.getNative());return T.releaseFirefoxMicrophonePermissionWarmup(),a.free(),n.debug(`Got media`,t.getTracks().map(e=>`${e.kind}: ${e.label}`)),i||await Lt(),Vt(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()?x.CAMERA_PERMISSION:x.MIC_PERMISSION;break;case`OverconstrainedError`:t=x.OVERCONSTRAINED;break;case`TypeError`:t=x.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?x.CAMERA_ACCESS:x.MIC_ACCESS;break;case`Error`:if(i.message===`MediaSource is busy`){t=e.isVideoRequested()?x.CAMERA_ACCESS:x.MIC_ACCESS;break}}if(e.canSimplify())return Ht(e.simplify(),t,n,r);let o=t||x.UNKNOWN;throw R.onPermissionsError(o,i),o}}async function Ut(e=z){if(!(St||T.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{T.hasMicrophonePermission()||R.onPermissionsRequested(),St=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(t){e.warn(`Firefox microphone permission warmup failed`,t)}}async function Wt(e,t=z,n=null){t.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let r=new It;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 x.SCREEN_PERMISSION;case`AbortError`:case`NotReadableError`:throw x.SCREEN_ACCESS;default:throw e}}finally{r.free()}}function Gt(){return Et.length||(Et=(()=>{let e,t=!1,n=0,r=`0`,i=At.match(/(opera|chrome|safari|firefox)\/?\s*(\d+)/i)||[];if(i[1]===`Safari`){if(e=At.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=At.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=At.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=At.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=At.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=At.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=At.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:kt,e&&e[1]||i[2]||Ot,t,n,r]})()),Et}var T;(function(e){async function t(){await zt(),await Bt()}e.init=t;function n(){return dt}e.getCameras=n;function r(){return ft}e.getMicrophones=r;function i(){return pt}e.getOutput=i;function a(){return dt.length>0}e.hasCamera=a;function o(){return ft.length>0}e.hasMicrophone=o;function s(){return mt}e.getSavedCamera=s;function c(){return ht}e.getSavedMicrophone=c;function l(){return gt}e.getSavedOutput=l;function u(){let e=T.getSavedOutput();return e&&e.deviceId===w.get(`audiooutput`)?e:null}e.getChosenOutput=u;function d(){return ut}e.getDevices=d;function f(){return N.videoFacingMode}e.getVideoFacingMode=f;function p(){return _t}e.hasCameraPermission=p;function m(){return vt}e.hasMicrophonePermission=m;function ee(){return lt?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=ee;function te(e=!1){return m()?a()&&e?p():!0:!1}e.hasPermissions=te;function ne(){St&&(Ze(St),St=null)}e.releaseFirefoxMicrophonePermissionWarmup=ne;async function h(e=!1,t=!0,n=!0,r=z,i=null){!e&&!t&&await Ut(r);let s=o()&&t,c=a()&&e,l;if(!s&&!c)l=new MediaStream;else try{l=await Ht(new Pt(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=h;async function re(e,t,n=z,r=null){return Wt(new Ft(e&&!N.consumerFastScreenShare?N.fastScreenShareWidth:0,e&&!N.consumerFastScreenShare?N.fastScreenShareHeight:0,N.getScreenFrameRate(e),t),n,r)}e.getScreenMedia=re;async function ie(e=!1,t,n=z,r=null){return Ht(new Pt(!1,!0,e?N.videoEffectMaxWidth:N.videoMaxWidth,e?N.videoEffectMaxHeight:N.videoMaxHeight,t),void 0,n,r)}e._getUserVideo=ie;async function ae(e,t,n=z,r=null){let i=t?.width||N.videoMaxWidth,a=t?.height||N.videoMaxHeight;return Ht(new Pt(!1,e||!0,i,a),void 0,n,r)}e.getUserVideo=ae;async function oe(e,t=z,n=null){return Ht(new Pt(e||!0,!1),void 0,t,n)}e.getUserAudio=oe;async function se(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return $e(n,t)}e.setResolution=se;async function ce(e,t){let n=(await zt()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?mt=n:e===`audioinput`?ht=n:e===`audiooutput`&&(gt=n),w.set(e,t),n):null}e._saveDeviceId=ce;function g(){if(!xt||xt.readyState===`ended`){let e=T.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),T.browserName()===`Safari`&&n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),xt=t.stream.getAudioTracks()[0]}return Object.assign(xt.clone(),{enabled:!1})}e.getSilentMediaTrack=g;function _(e=N.videoMinWidth,t=N.videoMinHeight){bt||(bt=document.createElement(`canvas`)),bt.width=e,bt.height=t;let n=bt.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!yt||yt.readyState===`ended`)&&(yt=bt.captureStream(N.videoFrameRate).getVideoTracks()[0]),Object.assign(yt.clone(),{enabled:!1})}e.getBlackMediaTrack=_;function le(){return ue()===null}e.isBrowserSupported=le;function ue(){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=ue;function de(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=de;function fe(){let e=T.browserName()===`Opera`,t=T.browserName()===`Yandex`;return e||t}e.isBrokenH264Decoder=fe;function pe(){return T.browserName()===`Yandex`&&T.os()===`Windows`||N.simulcast}e.isBrokenVP9Encoder=pe;function me(){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=me;function he(){return!(T.baseChromeVersion()&&T.isMobile())}e.canPreferH264=he;function ge(){let e=T.browserName(),t=Number(T.browserVersion());return e===`Safari`?t>=18:e===`Firefox`?t>=134:!0}e.isSimulcastSupportedByBrowser=ge;function _e(){return wt||(wt=(()=>{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(At))return t;return`Unknown`})()),wt}e.os=_e;function ve(){return Tt}e.osVersion=ve;function v(){return Ct===null&&(Ct=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Ot)),Ct}e.isMobile=v;function ye(){return Gt()[0]}e.browserName=ye;function be(){return Gt()[1]}e.browserVersion=be;function xe(){return Gt()[3]}e.baseChromeVersion=xe;function Se(){return Dt||(Dt=new(window.AudioContext||window.webkitAudioContext)),Dt.resume().catch(()=>{z.warn(`Failed to resume AudioContext`)}),Dt}e.getAudioContext=Se;function Ce(){return Gt()[4]}e.browserSubVersion=Ce;function we(){return T.baseChromeVersion()>=105&&!T.isMobile()}e.isAudioShareSupported=we;function Te(e,t){jt[e]||(jt[e]=[]),jt[e].push(t)}e.addEventListener=Te;function Ee(e,t){if(jt[e])if(!t)delete jt[e];else{let n=jt[e].indexOf(t);n>-1&&jt[e].splice(n,1)}}e.removeEventListener=Ee})(T||(T={}));var E=T;function Kt(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)}},qt=function(e){return e.FpsLimit=`fps-limit`,e}({}),Jt=class extends b{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()}},Yt=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}({}),Xt=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),Zt=class extends b{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,`_micTrackSetAt`,0),h(this,`_micMuteRecoveredAt`,0),h(this,`videoTrackMuteHandler`,()=>{!this._mediaSettings.isVideoEnabled||this._cameraMuteRecoveredAt>=this._cameraTrackSetAt||E.browserName()!==`Safari`||(this._cameraMuteRecoveredAt=Date.now(),this._logger?.log(C.ERROR,`camera_mute_recover`),this._debug.log(`[MediaSource] Safari camera mute recovery`),this.toggleVideo(!0).then(()=>this._logger?.log(C.ERROR,`camera_mute_recover_success`)).catch(e=>{this._logger?.log(C.ERROR,`camera_mute_recover_fail`),this._debug.warn(`[MediaSource] Camera mute recovery failed`,e)}))}),h(this,`micTrackMuteHandler`,()=>{!this._mediaSettings.isAudioEnabled||this._micMuteRecoveredAt>=this._micTrackSetAt||E.browserName()!==`Safari`||(this._micMuteRecoveredAt=Date.now(),this._logger?.log(C.ERROR,`mic_mute_recover`),this._debug.log(`[MediaSource] Safari mic mute recovery`),this.toggleAudio(!0).then(()=>this._logger?.log(C.ERROR,`mic_mute_recover_success`)).catch(e=>{this._logger?.log(C.ERROR,`mic_mute_recover_fail`),this._debug.warn(`[MediaSource] Mic mute recovery failed`,e)}))}),this._debug=e,this._logger=t,this._initDeviceChangeListener(),N.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),N.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Jt(this._debug),this._videoEffectsFpsLimiter.addEventListener(qt.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=[S.AUDIO],t=!0){if(this._stream)return;let n=e.includes(S.VIDEO),r=e.includes(S.AUDIO),i=e.includes(S.ANIMOJI),a=E.getBrowserSupportFailure();if(a)throw new k(x.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._setMicAudioTrack(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(x.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Qe(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_setMicAudioTrack(e){this._micAudioTrack&&this._micAudioTrack.removeEventListener(`mute`,this.micTrackMuteHandler),this._micAudioTrack=e,this._micAudioTrack&&(this._micTrackSetAt=Date.now(),this._micAudioTrack.addEventListener(`mute`,this.micTrackMuteHandler))}_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)Ze(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);this._logger?.log(C.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(C.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._setMicAudioTrack(t.getAudioTracks()[0]),!this._stream)Ze(t);else{let e=await this._applyAudioEffect();this._logger?.log(C.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(C.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)Ze(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),this._logger?.log(C.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(C.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&&(Ze(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._setMicAudioTrack(null))}async resumeLocalMedia(e){if(!this._lastMediaSettings)return;let t=[];if((e?e.isAudioEnabled:this._lastMediaSettings.isAudioEnabled)&&(t.push(S.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._setMicAudioTrack(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(C.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 $e(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||{}),Qt={HEIGHT:720,WIDTH:1280,BITRATE:1e6,FPS:30},$t=60,en=`L1T2`,tn=1.35,nn=[{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 rn(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 an(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return t.length>0?t[t.length-1].bitrate:nn[0].bitrate}function on(e){return!Number.isFinite(e)||e<=0?Qt.FPS:Math.min(Math.round(e),$t)}function sn(e=Qt.WIDTH,t=Qt.HEIGHT,n=nn,r=Qt.FPS){let i=Math.max(e,t),a=on(r),o=1;i>=960?o=3:i>=480&&(o=2);let s=[`h`,`m`,`l`].slice(3-o),c=[],l=an(i,n);for(let r=0;r<o;r++){let i=s[r];c.push({rid:i,width:e,height:t,fps:a,bitrate:l}),e=Math.round(e/2),t=Math.round(t/2),l=an(Math.max(e,t),n)}return{streams:c.reverse()}}function cn(e,t){let n=t.streams.findIndex(t=>t.rid===e);return n>=0?2**(t.streams.length-n-1):1}function ln(e,t,n,r){let i=n?Math.round(n*tn):1/0;if(e.forEach(e=>{let n=t.streams.find(t=>t.rid===e.rid);e.scaleResolutionDownBy=cn(e.rid,t),e.scalabilityMode=en,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 un=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 dn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var fn=/\r?\n/;function pn(e){return e.split(fn)}function mn(e){return e.join(`\r
|
|
8
|
+
`)}var hn=533,gn=`a=fmtp:`,_n=`sps-pps-idr-in-keyframe=1`,vn;(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()===gn+i[1]?` `:`;`;e[r]+=t+_n}}}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=pn(e);if(d(s),!n&&!i&&!a&&!o)return mn(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
|
+
`+mn(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),mn(s)}e.patchLocalSDP=f;function p(e,t,n,r,i,o){let s=pn(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),mn(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 re(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=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 ce(e){return e.participant?oe(e.participant):ie(e.participantId,e.participantType||j.USER,e.deviceIdx)}e.composeMessageId=ce;function g(e){return typeof e==`string`?_(le(e).compositeUserId).id:e}e.extractOkId=g;function _(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=_;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=pn(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=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*hn/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=sn(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)}`),ln(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});m.degradationPreference=f,m.encodings.length>0&&t.setParameters?.(m).then(()=>{let e=t.getParameters();a.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(e.encodings)}`)},e=>{a.error(`Failed to set sender parameters`,m,e)})}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 ve(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=ve;function v(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=v;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}=_(i),{id:u,type:d}=_(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 un(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})(vn||(vn={}));var M=vn,yn=`__CALLS_SDK_DEVTOOLS_`,bn=class{set(e,t){try{this.getStorage().setItem(yn+e,JSON.stringify(t))}catch(t){z.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(yn+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(yn+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(yn)&&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(yn)){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}},xn=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}},Sn=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 bn,this.params=new xn(this.storage)}};h(Sn,`instance`,null);var Cn=Sn.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`)&&(y.accessToken=t.apiAuth.accessToken,y.sessionKey=t.apiAuth.sessionKey,y.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=Cn.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 e._params.appVersion}static get apiClientVersion(){return 1.1}static get sdkVersion(){return`2.8.13-dev.56ef08c8.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 autoStartStats(){return e._params.autoStartStats}static get statQueueEnabled(){return e._params.statQueueEnabled}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()?Nt.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 switchTopologyOnReconnectFromAnySide(){return e._params.switchTopologyOnReconnectFromAnySide}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,appVersion:e._params.appVersion,autoStartStats:e._params.autoStartStats,statQueueEnabled:e._params.statQueueEnabled,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:``,appVersion:`0.0.0`,autoStartStats:!0,statQueueEnabled:!1,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,switchTopologyOnReconnectFromAnySide:!1,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:!0,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 wn(e){return e.slice()}var Tn;(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 re(e,t,n,r){I(`onRemoteSharedMovieInfo`,e,L(t),n,r)}e.onRemoteSharedMovieInfo=re;function ie(e,t,n,r){I(`onRemoteSharedMovieStoppedInfo`,e,L(t),n,r)}e.onRemoteSharedMovieStoppedInfo=ie;function ae(e,t,n,r){I(`onLocalSharedMovieInfo`,e,L(t),n,r)}e.onLocalSharedMovieInfo=ae;function oe(e,t,n,r){I(`onLocalSharedMovieStoppedInfo`,e,L(t),n,r)}e.onLocalSharedMovieStoppedInfo=oe;function se(e,t,n,r){I(`onRemoteSharedUrl`,e,t,n,r)}e.onRemoteSharedUrl=se;function ce(e,t,n){I(`onParticipantAdded`,e,t,n)}e.onParticipantAdded=ce;function g(e,t,n){I(`onParticipantJoined`,e,t,n)}e.onParticipantJoined=g;function _(e,t=!1,n){F(`onLocalParticipantState`,L(e),t,n)}e.onLocalParticipantState=_;function le(e,t,n,r){I(`onRemoteParticipantState`,e,L(t),n,r)}e.onRemoteParticipantState=le;function ue(e,t,n){F(`onRemoteParticipantsState`,e,t,n)}e.onRemoteParticipantsState=ue;function de(e,t,n=null,r){z.debug(`Remote status:`,t,e),I(`onRemoteStatus`,e,t,n,r)}e.onRemoteStatus=de;function fe(){F(`onPermissionsRequested`)}e.onPermissionsRequested=fe;function pe(e,t){F(`onPermissionsError`,e,t)}e.onPermissionsError=pe;function me(e,t,n){I(`onRemoteRemoved`,e,t,n)}e.onRemoteRemoved=me;function he(e,t,n,r){F(`onCallState`,e,t,L(n),r)}e.onCallState=he;function ge(e,t,n){F(`onDeviceSwitched`,e,t,n)}e.onDeviceSwitched=ge;function _e(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null,u){let d=c?wn(c):void 0;F(`onMuteStates`,L(e),wn(t),wn(n),r,i,a,o,s,d,l,u)}e.onMuteStates=_e;function ve(e,t,n=!1,r){I(`onRolesChanged`,e,wn(t),n,r)}e.onRolesChanged=ve;function v(e,t=!1,n){F(`onLocalRolesChanged`,wn(e),t,n)}e.onLocalRolesChanged=v;function ye(e,t,n,r,i){I(`onPinnedParticipant`,e,t,n,r,i)}e.onPinnedParticipant=ye;function be(e,t,n){F(`onLocalPin`,e,t,n)}e.onLocalPin=be;function xe(e,t){F(`onOptionsChanged`,wn(e),t)}e.onOptionsChanged=xe;function Se(e){F(`onCallAccepted`,e)}e.onCallAccepted=Se;function Ce(e){F(`onCallActive`,e)}e.onCallActive=Ce;function we(e,t,n){I(`onAcceptedCall`,e,t,n)}e.onAcceptedCall=we;function Te(e){F(`onRateNeeded`,e)}e.onRateNeeded=Te;function Ee(e,t){I(`onSpeakerChanged`,e,t)}e.onSpeakerChanged=Ee;function De(e,t){F(`onVolumesDetected`,wn(e),t)}e.onVolumesDetected=De;function Oe(e,t){F(`onLocalVolume`,e,t)}e.onLocalVolume=Oe;function ke(e,t,n){F(`onJoinStatus`,e,t,n)}e.onJoinStatus=ke;function Ae(e,t){F(`onHangup`,e,t)}e.onHangup=Ae;function je(e){F(`onMultipartyChatCreated`,L(e))}e.onMultipartyChatCreated=je;function Me(){F(`onDeviceChange`)}e.onDeviceChange=Me;function Ne(e){F(`onFingerprintChange`,e)}e.onFingerprintChange=Ne;function Pe(){F(`onTokenExpired`)}e.onTokenExpired=Pe;function Fe(e,t,n=!1,r){F(`onChatMessage`,e,t,n,r)}e.onChatMessage=Fe;function Ie(e,t,n=!1,r){F(`onCustomData`,e,t,n,r)}e.onCustomData=Ie;function Le(e,t,n,r,i,a,o=null,s){F(`onRecordStarted`,e,t,n,r,i,a,o,s)}e.onRecordStarted=Le;function Re(e=null,t,n){F(`onRecordStopped`,e,t,n)}e.onRecordStopped=Re;function ze(e,t){F(`onLocalNetworkStatusChanged`,e,t)}e.onLocalNetworkStatusChanged=ze;function Be(e,t){F(`onNetworkStatusChanged`,e,t)}e.onNetworkStatusChanged=Be;function Ve(e,...t){F(`onDebugMessage`,e,...t)}e.onDebugMessage=Ve;function He(e,t,...n){F(`onDebugMessageWithContext`,e,t,...n)}e.onDebugMessageWithContext=He;function Ue(e,t){F(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=Ue;function We(){F(`onAutoplayError`)}e.onAutoplayError=We;function Ge(e,t,n,r,i,a){F(`onChatRoomUpdated`,e,t,n,r,i,a)}e.onChatRoomUpdated=Ge;function Ke(e,t){F(`onPromoted`,e,t)}e.onPromoted=Ke;function qe(e,t){F(`onRemoteMixedAudioStream`,e,t)}e.onRemoteMixedAudioStream=qe;function Je(e,t){F(`onJoinLinkChanged`,e,t)}e.onJoinLinkChanged=Je;function Ye(e,t){F(`onRoomsUpdated`,e,t)}e.onRoomsUpdated=Ye;function y(e,t,n,r,i){F(`onRoomUpdated`,e,t,n,r,i)}e.onRoomUpdated=y;function b(e,t){F(`onRoomParticipantsUpdated`,e,t)}e.onRoomParticipantsUpdated=b;function x(e,t){F(`onRoomSwitched`,e,t)}e.onRoomSwitched=x;function S(e,t){F(`onRoomStart`,e,t)}e.onRoomStart=S;function C(e,t=null,n){F(`onFeedback`,e,t,n)}e.onFeedback=C;function Xe(e,t){F(`onFeaturesPerRoleChanged`,e,t)}e.onFeaturesPerRoleChanged=Xe;function Ze(e,t){F(`onParticipantVmojiUpdate`,e,t)}e.onParticipantVmojiUpdate=Ze;function Qe(e,t,n){F(`onAsrSet`,e,t,n)}e.onAsrSet=Qe;function $e(e,t,n,r){F(`onAsrStarted`,e,t,n,r)}e.onAsrStarted=$e;function et(e,t){F(`onAsrStopped`,e,t)}e.onAsrStopped=et;function tt(e,t,n,r,i){F(`onAsrTranscription`,e,t,n,r,i)}e.onAsrTranscription=tt;function nt(e,t,n){F(`onParticipantIdChanged`,e,t,n)}e.onParticipantIdChanged=nt;function rt(e,t){F(`onVideoSuspendSuggest`,e,t)}e.onVideoSuspendSuggest=rt;function it(e){F(`onSignalingMessage`,typeof e==`string`?e:L(e))}e.onSignalingMessage=it;function at(e,t){F(`onPromotionApproved`,e,t)}e.onPromotionApproved=at;function ot(e,t){F(`onPeerRegistered`,e,t)}e.onPeerRegistered=ot;function w(e,t){F(`onNonFatalError`,e,t)}e.onNonFatalError=w})(Tn||(Tn={}));var R=Tn,En=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),Dn;(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&&je(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&&Me()}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 re(e=null){let t=null,n=e;function r(){!N.debugLog||t||(t=Ne(),n&&Pe(n,t))}let i=()=>(r(),{sessionId:t,conversationId:n});return{get sessionId(){return t},get conversationId(){return n},setConversationId(e){n=e,t&&Pe(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=re;function ie(e,...t){}e.test=ie})(Dn||(Dn={}));var z=Dn,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()}}},On=class extends Error{constructor(e){super(e?`Signaling disposed. Command ${e}`:`Signaling disposed`),this.name=`SignalingDisposedError`}},kn=class extends Error{constructor(e){super(e?`Producer connection closed. Command ${e}`:`Producer connection closed`),this.name=`ProducerConnectionClosedError`}},An=class extends b{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 jn(e){return e.stopStream}function Mn(e){return e.keyFrameRequested}function Nn(e){if(jn(e))return`ss`;if(Mn(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}({}),Pn=`s`,Fn=`m`;function In(e){return e.participantId+(e.mediaType?`:`+Pn+e.mediaType:``)+(e.streamName?`:`+Fn+e.streamName:``)}function Ln(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 Pn:r=Rn(n.slice(1));break;case Fn: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 Rn(e){for(let t of Object.keys(H))if(t===e)return H[t];return null}function zn(){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),Bn(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 Bn(e){return e.buffer!==void 0}function Vn(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 Hn=0,Un=1,Wn=2,Gn=3,Kn=4,qn=5,Jn=6,Yn=7,Xn=0,Zn=1,Qn=2,$n=0,er=0,tr=0,nr=1,rr=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=zn();l.Int.enc(n,Hn),l.Int.enc(n,$n),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=zn();if(this.writeStreamDesc(t,i),jn(r))l.Int.enc(i,Zn);else if(Mn(r))l.Int.enc(i,Qn);else if(l.Int.enc(i,Xn),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,tr);break;case`cn`:l.Int.enc(i,nr);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=zn();return l.Int.enc(n,Un),l.Int.enc(n,$n),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=zn();return l.Int.enc(n,Wn),l.Int.enc(n,$n),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=zn();return l.Int.enc(n,Gn),l.Int.enc(n,$n),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=zn();return l.Int.enc(n,Kn),l.Int.enc(n,$n),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=zn();return l.Int.enc(n,qn),l.Int.enc(n,$n),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=zn();return l.Int.enc(n,Jn),l.Int.enc(n,$n),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=zn();l.Int.enc(n,Yn),l.Int.enc(n,$n),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?Vn(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await dn(e)):Vn(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==$n){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==er){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Hn:return this.deserializeUpdateDisplayLayoutResponse(t);case Un: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=Vn(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=In(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.API_CALL=`api_call`,e.SDP_CREATE_OFFER=`sdp_create_offer`,e.SDP_CREATE_ANSWER=`sdp_create_answer`,e.SDP_SET_LOCAL_OFFER=`sdp_set_local_offer`,e.SDP_SET_LOCAL_PRANSWER=`sdp_set_local_pranswer`,e.SDP_SET_LOCAL_ANSWER=`sdp_set_local_answer`,e.SDP_SET_LOCAL_ROLLBACK=`sdp_set_local_rollback`,e.SDP_SET_REMOTE_OFFER=`sdp_set_remote_offer`,e.SDP_SET_REMOTE_PRANSWER=`sdp_set_remote_pranswer`,e.SDP_SET_REMOTE_ANSWER=`sdp_set_remote_answer`,e.SDP_SET_REMOTE_ROLLBACK=`sdp_set_remote_rollback`,e.SDP_GENERATED=`sdp_generated`,e.SDP_RECEIVED=`sdp_received`,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||{}),ir=1e3;function W(e,t,n=0){return t in e&&e[t]?e[t]:n}function ar(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function or(e,t){return n=>n[e]===t}function sr(e){return(t,n)=>n[e]-t[e]}function cr(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function lr(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function ur(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])?ur(t[1]):t[1],e),{})}function dr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function fr(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(dr).then(lr)}function pr(e){let t=e.filter(or(`type`,`candidate-pair`)).sort(sr(`priority`)).find(ar(or(`nominated`,!0),or(`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(or(`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(or(`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}}),ur(n)}function mr(e,t,n=!1){let r=cr(`id`,e);return(n?e.filter(ar(or(`type`,`remote-inbound-rtp`))):e.filter(ar(or(`type`,`inbound-rtp`),or(`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 ur(c)}).filter(e=>!!e)}function hr(e,t,n=!1){if(!t||!t.rtps.length||!e.rtps.length)return e;let r,i;n&&(r=cr(`ssrc`,e?.remoteRtps||[]),i=cr(`ssrc`,t?.remoteRtps||[]));let a=cr(`ssrc`,e.rtps),o=cr(`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 gr(e,t,n={},r=!1){let i=await fr(e),a={timestamp:Date.now(),transport:pr(i),rtps:mr(i,n)};return r&&(a.remoteRtps=mr(i,n,!0)),t?hr(a,t,r):(await M.delay(ir),gr(e,a,n,r))}function _r(e){performance.clearMarks(e),performance.mark(e)}function vr(e){performance.clearMarks(e)}function yr(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 br(e){return`${U.SCREENSHARE_FIRST_FRAME}_${xr(e)}`}function xr(e){return typeof e==`string`?e:JSON.stringify(e)}var G={distinctById:lr,rtcStatsToArray:dr,extractTransport:pr,extractRtps:mr,delta:hr,collectStats:gr,setMark:_r,clearMark:vr,measureMark:yr,getMarkNameScreenshareFirstFrame:br},Sr=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(Sr||{}),Cr=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(Cr||{}),K=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}(K||{}),wr=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),Tr=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}({}),Er={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}},q=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}(q||{}),J=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}(J||{}),Dr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(Dr||{}),{isObject:Or,isObjectsEquals:kr}=M;function Ar(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||Or(e.bitrates)&&Or(t.bitrates)&&!kr(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var jr=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Mr(e,t){return!(!Ar(e.camera,t.camera)||!Ar(e.screenSharing,t.screenSharing)||!Ar(e.fastScreenSharing,t.fastScreenSharing))}function Nr(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 Pr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Fr={offer:U.SDP_CREATE_OFFER,answer:U.SDP_CREATE_ANSWER},Ir={offer:U.SDP_SET_LOCAL_OFFER,pranswer:U.SDP_SET_LOCAL_PRANSWER,answer:U.SDP_SET_LOCAL_ANSWER,rollback:U.SDP_SET_LOCAL_ROLLBACK},Lr={offer:U.SDP_SET_REMOTE_OFFER,pranswer:U.SDP_SET_REMOTE_PRANSWER,answer:U.SDP_SET_REMOTE_ANSWER,rollback:U.SDP_SET_REMOTE_ROLLBACK},Rr={local_address:null,remote_address:null,transport:null},zr=class{constructor(e){h(this,`_statAggregator`,void 0),h(this,`_pc`,null),h(this,`_gatheringStartedAt`,0),h(this,`_remoteSdpReceivedAt`,0),h(this,`_handleGatheringStateChange`,()=>{this._pc?.iceGatheringState===`gathering`&&(this._gatheringStartedAt=Date.now())}),this._statAggregator=e}observe(e){this.stop(),this._pc=e,this._gatheringStartedAt=Date.now(),this._remoteSdpReceivedAt=0,e.addEventListener(`icegatheringstatechange`,this._handleGatheringStateChange)}stop(){this._pc?.removeEventListener(`icegatheringstatechange`,this._handleGatheringStateChange),this._pc=null}logSdpGenerated(e){this._log({name:U.SDP_GENERATED,value:0,string_value:e,...Rr})}logCandidateGenerated(e){let t=Vr(e.candidate);t&&this._log({name:U.SDP_GENERATED,value:Math.max(0,Date.now()-this._gatheringStartedAt),string_value:t.type,local_address:t.address,remote_address:null,transport:t.protocol})}logSdpReceived(e){this._remoteSdpReceivedAt=Date.now(),this._log({name:U.SDP_RECEIVED,value:0,string_value:e,...Rr})}logCandidateReceived(e){let t=Vr(e.candidate);t&&this._log({name:U.SDP_RECEIVED,value:this._remoteSdpReceivedAt>0?Math.max(0,Date.now()-this._remoteSdpReceivedAt):0,string_value:t.type,local_address:null,remote_address:t.address,transport:t.protocol})}logCreateFailed(e,t){let n=Fr[e];n&&this._logFailure(n,t,{remote:e===`answer`?this._pc?.remoteDescription:void 0})}logSetLocalFailed(e,t){this._logFailure(Ir[e.type],t,{local:e,remote:this._pc?.remoteDescription})}logSetRemoteFailed(e,t){this._logFailure(Lr[e.type],t,{local:this._pc?.localDescription,remote:e})}destroy(){this.stop()}_logFailure(e,t,n){this._log({name:e,value:0,string_value:JSON.stringify({error:t instanceof Error?t.message:String(t),local:Br(n.local),remote:Br(n.remote)}),...Rr})}_log(e){this._statAggregator?.logEventualStat(e)}};function Br(e){return e?{type:e.type,sdp:e.sdp}:void 0}function Vr(e){let t=e?.split(` `)??[],n=t.indexOf(`typ`),r=t[2]?.toLowerCase(),i=t[4],a=n===-1?void 0:t[n+1];return r===void 0||i===void 0||a===void 0||!Wr(i)?null:{protocol:r,address:i,type:a}}var Hr=/^\d{1,3}(\.\d{1,3}){3}$/,Ur=/^[0-9a-f:]+$/i;function Wr(e){return Hr.test(e)||e.includes(`:`)&&Ur.test(e)}var Gr=200;function Kr(e){for(let t of e.values())if(t.type===`outbound-rtp`&&(t.packetsSent??0)>0)return!0;return!1}var qr=class{constructor(e,t,n=Gr){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(Kr)){this._state=`stopped`,this._onFirstMediaSent();return}}catch{}this._scheduleNextPoll()}}_scheduleNextPoll(){this._state===`polling`&&(this._timer=setTimeout(()=>{this._timer=null,this._poll()},this._pollIntervalMs))}},Jr=class extends b{constructor(e,t,n=null){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_state`,q.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||q.IDLE}stopFirstMediaSentProbe(){this._firstMediaSentProbeStopped=!0,this._disposeFirstMediaSentProbe()}_startFirstMediaSentProbe(){this._disposeFirstMediaSentProbe(),!(!this._pc||!this._onFirstMediaSent||this._firstMediaSentProbeStopped)&&(this._firstMediaSentProbe=new qr(this._pc,this._onFirstMediaSent),this._firstMediaSentProbe.start())}_disposeFirstMediaSentProbe(){this._firstMediaSentProbe?.destroy(),this._firstMediaSentProbe=null}},Yr=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}},Xr=.25,Zr=.35,Qr=85,$r=.1,ei=1.5,ti=.1,ni=1,ri=.6,ii=.3,ai=class extends b{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 Yr(Xr,Xr),loss:new Yr(Zr,Zr),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)/Qr);for(let e=0;e<r;e++)n*=1-$r;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)/ei);for(let e=0;e<r;e++)n*=1-ti;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*ni;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>=ri?`good`:e>=ii?`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(Y.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}},oi=30*1e3,si=class e extends Jr{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,`_sdpStats`,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 ka(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new ai(n,this._debug),this._sdpStats=new zr(this._statAggregator),this.subscribe(this._signaling,Cr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Yt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Yt.SOURCE_CHANGED,this._applySettings.bind(this)),this.subscribe(this._directStatReporter,Y.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(C.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===q.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||[q.IDLE,q.CLOSED,q.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(C.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(q.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){Mr(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(q.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._sdpStats.observe(e),this._prevConsumerSettings={},N.vmoji&&this._createDataChannel(e,Dr.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._sdpStats.stop(),this._lastStat=null,this._remoteStream){let e=this._remoteStream;e.getTracks().forEach(t=>{t.stop(),this._triggerEvent(Y.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(q.FAILED)):(this._debug.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(q.CLOSED)),this._triggerEvent(Y.PEER_CONNECTION_CLOSED)}_setState(e){this._state!==e&&(this._debug.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent(Y.STATE_CHANGED,e))}_onSignalingNotification(e){switch(e.notification){case K.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case K.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case K.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._sdpStats.logCandidateReceived(t.candidate),this._addIceCandidate(n,t.candidate).catch(this.close.bind(this))):t.sdp&&(this._sdpStats.logSdpReceived(t.sdp.type),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(C.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(C.ERROR,`setRemoteDescription-direct`),this._sdpStats.logSetRemoteFailed(n,e),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(Y.REMOTE_TRACK_REMOVED,this._remoteStream,e.track)}),this._triggerEvent(Y.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}),this._sdpStats.logCandidateGenerated(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===q.IDLE||e===q.OPENED?this._setState(q.CONNECTING):this._setState(q.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(C.ERROR,`iceConnectionState-fallback`),this._markConnected());break}}_markConnected(){this._neverConnected=!1,this._setState(q.CONNECTED),this._stopReconnection(),this._pc&&M.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(C.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(C.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(q.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(e=!1){(this._isMaster||e)&&this._signaling.ready&&(this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(J.SERVER).catch(e=>{e instanceof On||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(C.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(C.ERROR,`iceRestart-direct`),this._requestTopologySwitch(N.switchTopologyOnReconnectFromAnySide)},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}),this._sdpStats.logSdpGenerated(`offer`),r=e._patchLocalDescription(r)}catch(e){throw this._debug.error(`Unable to create offer`,e,{participantId:this._participantId}),this._logger?.log(C.ERROR,`createOffer-direct`),this._sdpStats.logCreateFailed(`offer`,e),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(C.ERROR,`setLocalDescription-direct`),this._sdpStats.logSetLocalFailed(r,e),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}),this._sdpStats.logSdpGenerated(`answer`),t=e._patchLocalDescription(t)}catch(e){throw this._debug.error(`Unable to create answer`,e,{participantId:this._participantId}),this._logger?.log(C.ERROR,`createAnswer-direct`),this._sdpStats.logCreateFailed(`answer`,e),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(C.ERROR,`setLocalDescription-direct`),this._sdpStats.logSetLocalFailed(t,e),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(C.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:J.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`inbound-rtp`?(e.userId=this._participantId,!0):!1)},outbound:{topology:J.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:J.DIRECT,transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(n),this._directStatReporter.reportLocal(n),this._triggerEvent(Y.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=jr.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=jr.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=jr.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=jr.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>oi)||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(Y.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}]`)}}},ci=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),li=16,ui=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(li)}}_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}},di,fi=class{constructor(){h(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};di=fi,h(fi,`_instance`,null),h(fi,`getInstance`,()=>(di._instance||(di._instance=new di),di._instance));var pi=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=Ln(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:K.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:K.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:K.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:K.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:K.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:K.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:K.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=ci.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:K.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},mi=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}({}),hi=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:mi.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 mi.READY:s=!0,c||(c=!0,a());break;case mi.ERROR:s?m(e.data.error):p(e.data.error);break;case mi.FRAME:t(e.data);break;case mi.DEBUG:this._debug.debug(e.data.message);break;case mi.LOG_ERROR:this._logger?.log(C.ERROR,e.data.message);break}},this._sendToWorker(mi.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`)}},gi=class extends hi{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(mi.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}},_i=class extends hi{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(mi.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`}},vi=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}},yi=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})}},bi=65536,xi=`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 yi(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)%bi!==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(xi),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(xi);return}let t=G.measureMark(xi);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")}},wi=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)}},Ti=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&&_i.isBrowserSupported()}},Ei=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,`_webCodecsRetryAttempted`,!1),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 vi(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Ti.isBrowserSupported()?this._renderer=new wi(this._onStream,this._debug):this._renderer=new Ti(this._onStream,this._debug)}_initDecoder(e=!1){e||!_i.isBrowserSupported()?this._decoder=new gi(this._debug,this._logger):this._decoder=new _i(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=>{if(this._decoderBusy=!1,this._decoder instanceof _i&&typeof e==`string`&&e.includes(`EncodingError`)){this._decoderQueue=[],!this._webCodecsRetryAttempted&&e.includes(`reset because error during decoding`)?(this._webCodecsRetryAttempted=!0,this._debug.warn(`StreamBuilder retry WebCodecs with software decoder`),this._onKeyFrameRequested?.()):this._switchToLibVPXDecoder();return}this._decodeQueue()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()}).catch(e=>{this._debug.warn(`StreamBuilder decoder init failed`,e),this._decoder instanceof _i&&this._switchToLibVPXDecoder()})}_switchToLibVPXDecoder(){this._debug.warn(`StreamBuilder switch to LibVPX decoder`),this._decoderQueue=[],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),this._onKeyFrameRequested?.()}_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 wi.isBrowserSupported()||Ti.isBrowserSupported()}},Di=1,Oi=1,ki=2,Ai=0,ji=1,Mi=2,Ni=4,Pi=8;function Fi(e,t,n,r,i,a,o){let s=0;t&&(s|=ji),n&&(s|=Mi),r&&(s|=Ni),o||(s|=Pi);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,Di),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,Ai),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 Ii(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&ji),l=!!(s&Mi),u=!!(s&Ni),d=!!(s&Pi);if(n!==Di)throw Error(`Unexpected protocol version. Got ${n}, expected ${Di}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function Li(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==Di||t.getUint8(1)!==Oi||t.getUint16(2)!==Ai)}function Ri(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==Di||t.getUint8(1)!==ki||t.getUint16(2)!==Ai?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function zi(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,Di),n.setUint8(1,Oi),n.setUint16(2,e),t}var Bi=2**15-1,Vi=1,Hi=5,Ui=5,Wi=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)-Hi);r-n>Ui&&(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}},Gi=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(Vi)),f.element(f.ID.TrackUID,f.number(Vi)),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 Wi(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>Bi&&(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(Vi),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"`)}},Ki=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=Ii(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&&Gi.isBrowserSupported()?new Gi(n,e,this._onStat,this._statAggregator,this._debug):new Ei(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=zi(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`)}},qi=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}},Ji=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 qi(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):``}},Yi=1e3,Xi=class extends hi{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(mi.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)},Yi),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(mi.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},Zi=class extends hi{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(mi.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(mi.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}},Qi=2100,$i=600,ea=1.2,ta=.8,na=2e3,ra=8e3,ia=8e3,aa=16e3,oa=4,sa=2e3,ca=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(ca||{}),la=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=Qi,i&&(this._highDelayThreshold=$i),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} -> ${ca[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>na){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,oa),this._probing=!1);let n=ta*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*ta),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*ia/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${ca[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=ra+this._upPenalty*ia;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*ea,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*ia/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${ca[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>aa&&(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>sa){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}`)}}},ua=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}},da=65536,fa=50,pa=400,ma=1e6,ha=3e5,ga=3e4,_a=2e3,va=5,ya=0,ba=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 ua(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 Ji),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 la(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(Zi.isBrowserSupported()){let t=this._fastSharing;this._encoder=new Zi(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new Xi(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{Li(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=Ri(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 vi(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+da)%da>va&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>_a&&(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 Ji;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=Fi(e,t,n,r,ya,this._encoder.isVP9(),i),o={sequence:ya,data:a};return ya=(ya+1)%da,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 Zi.isBrowserSupported()||Xi.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(ha,Math.min(ma,Math.round(n*fa))),maxBitrate:Math.round(n*pa)}}_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>ga){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t).catch(e=>{!(e instanceof On)&&!(e instanceof kn)&&this._debug.warn(`Unable to send sharing stats`,e)})),this._lastSharingStat=e}}},xa=class{constructor(e,t,n,r=z,i=null){h(this,`_pc`,null),h(this,`_transceiver`,null),h(this,`_currentSimulcastInfo`,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}this._pc=e,this._transceiver=t,t.direction=`sendonly`,await t.sender.replaceTrack(r),t.sender.setStreams(n),await this._applyCurrentMediaState(),this._debug.log(`SimulcastSender: Prepared mid=${t.mid} encodings=${JSON.stringify(t.sender.getParameters().encodings)}`)}finalizeAnswer(e){if(!this._pc||!this._transceiver?.mid)return e;this._pc.getTransceivers().forEach(e=>{e.mid===null&&e.stop()});let t=pn(e),n=this._findMediaSection(t,this._transceiver.mid);if(n){for(let e=n.start;e<n.end;e++)if(t[e].startsWith(`a=simulcast:send `)){t[e]=t[e].replaceAll(`~`,``);break}let e=this._mediaSource.getStream()?.getVideoTracks()[0];e&&this._getConfig(Qt.WIDTH,Qt.HEIGHT,e.getSettings().frameRate).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}})}return mn(t)}async sync({force:e=!1}={}){if(!this._transceiver||!this._currentSimulcastInfo||!this._mediaSource.mediaSettings.isVideoEnabled)return;let t=this._mediaSource.getStream()?.getVideoTracks()[0];if(!t)return;let n=this._getTrackConfig(t);if(!e&&rn(this._currentSimulcastInfo,n.simulcastInfo))return;let r=await this._applyConfig(n,!0);r&&(this._debug.log(`SimulcastSender: Sync ${n.width}x${n.height} encodings=${JSON.stringify(r.encodings)}`),await this._changeSimulcast({mediaSource:Xt.CAMERA,simulcastInfo:n.simulcastInfo}))}replaceTrack(e){let t=this._transceiver,n=t?.sender.track;if(!t||e.kind!==A.video||!n||n.contentHint!==e.contentHint)return!1;let r=this._mediaSource.mediaSettings.isVideoEnabled;return t.sender.replaceTrack(e).then(()=>{if(!r)return;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(C.ERROR,`replaceTrack-single`)}),!0}reset(){this._pc=null,this._transceiver=null,this._currentSimulcastInfo=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}_getConfig(e,t,n=30){let r=this._getCameraSettings(),i=r?.maxFramerate?Math.min(n||30,r.maxFramerate):n||30,a=r?.bitrates?.generic?.length?r.bitrates.generic:void 0;return{width:e,height:t,simulcastInfo:sn(e,t,a,i),maxDimension:r?.maxDimension,maxBitrate:!a&&r?.maxBitrateK?r.maxBitrateK*1024:void 0}}_getTrackConfig(e){let t=e.getSettings();return this._getConfig(t.width??Qt.WIDTH,t.height??Qt.HEIGHT,t.frameRate)}async _applyConfig(e,t=!1){let n=this._transceiver;if(!n)return null;let r=n.sender.getParameters();if(r.encodings.length<=1)return null;ln(r.encodings,e.simulcastInfo,e.maxDimension,e.maxBitrate);try{await n.sender.setParameters(r)}catch(e){if(this._debug.error(`SimulcastSender: Failed to set sender parameters`,r,e),!t)throw e}return this._currentSimulcastInfo=e.simulcastInfo,r}async _applyCurrentMediaState(){let e=this._mediaSource.getStream()?.getVideoTracks()[0];if(!e)return;let t=this._mediaSource.mediaSettings.isVideoEnabled?this._getTrackConfig(e):this._getConfig(N.videoMinWidth,N.videoMinHeight,e.getSettings().frameRate),n=await this._applyConfig(t);n&&this._debug.log(`SimulcastSender: Current media state ${t.width}x${t.height} encodings=${JSON.stringify(n.encodings)}`)}async _syncReplacedTrack(e){let t=this._getTrackConfig(e);this._currentSimulcastInfo=t.simulcastInfo,await this._changeSimulcast({mediaSource:Xt.CAMERA,simulcastInfo:t.simulcastInfo})}async _changeSimulcast(e){try{await this._signaling.changeSimulcast(e)}catch(e){if(!(e instanceof kn))throw e}}},Sa=90,Ca=4294967295,wa=class e extends Jr{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,`_sdpStats`,void 0),h(this,`_codecStatsAggregator`,void 0),h(this,`_simulcast`,void 0),this._debug=r,this._logger=i,this._statAggregator=a,this._sdpStats=new zr(a),this._codecStatsAggregator=o,this._serverSettings=n,this._simulcast=new xa(e,t,()=>this._serverSettings.camera,r,i),this.subscribe(this._signaling,Cr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Yt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Yt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Yt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._debug.debug(`ServerTransport: Created`)}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!==q.IDLE&&e!==q.CLOSED&&e!==q.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(q.FAILED)):(this._debug.debug(`ServerTransport: Closed`),this._setState(q.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){Mr(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 ka(this,this._signaling,this._statAggregator,!1,this._debug)}_closeConnection(){this._signaling.resetProducerConnection(),this._ssrcMap={},this._ssrcMapUpdated=!0,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._sdpStats.stop(),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(Y.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._sdpStats.observe(this._pc),this._participantIdRegistry=new pi(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,Dr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,Dr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,Dr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),N.asrDataChannel&&this._createDataChannel(this._pc,Dr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new ui(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),N.vmoji&&this._createDataChannel(this._pc,Dr.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(C.ERROR,`addTrack-single`),this.close(e);return}this._startFirstMediaSentProbe(),this._createDataChannel(this._pc,Dr.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(q.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==q.OPENED&&(this._setState(q.RECONNECTING),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent(Y.SIGNALLED_ACTIVE_PARTICIPANTS,e)}_signalStalledParticipants(e){this._triggerEvent(Y.SIGNALLED_STALLED_PARTICIPANTS,e)}_signalSpeakerChanged(e){this._triggerEvent(Y.SIGNALLED_SPEAKER_CHANGED,e)}_signalNetworkStatus(e){this._triggerEvent(Y.NETWORK_STATUS,e)}_updateSSRCMap(e){e&&(this._ssrcMap={},this._ssrcMapUpdated=!0,pn(e.sdp).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${ci.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${ci.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3])}))}_createCaptureSender(e){let t=this._mediaSource.mediaSettings;!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new ba(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 Ki(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent(Y.REMOTE_STREAM_SECOND,e,t)},e=>{this._triggerEvent(Y.REMOTE_STREAM_SECOND,e,null)},e=>{this._triggerEvent(Y.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(Y.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(Y.REMOTE_DATA_STATS,{inbound:{topology:J.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`inbound-rtp`)},outbound:{topology:J.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:J.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=ci.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(Y.AUDIO_MIX_STALL,i)}this._statBytes[n]={bytesReceived:t.bytesReceived,stalled:i}}_allocateConsumer(){if(!this._signaling.ready)return;let e=Fa.get();!N.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e).catch(e=>{e instanceof On||this._debug.warn(`ServerTransport: Unable to allocate consumer`,e)})}async _processOffer(e,t){if(!this._pc)throw Error(`Interrupt allocation`);this._sdpStats.logSdpReceived(e.type);try{await this._pc.setRemoteDescription(e)}catch(t){throw this._debug.error(`[single] unable to set remote offer`,t),this._logger?.log(C.ERROR,`setRemoteDescription-single`),this._sdpStats.logSetRemoteFailed(e,t),t}if(await this._simulcast.configureFromRemoteOffer(this._pc),await this._handleTracks(),this._debug.debug(`[single] create local answer`),!this._pc)throw Error(`Interrupt allocation`);let n;try{n=await this._pc.createAnswer(),this._sdpStats.logSdpGenerated(`answer`)}catch(e){throw this._debug.error(`[single] unable to create answer`,e),this._logger?.log(C.ERROR,`createAnswer-single`),this._sdpStats.logCreateFailed(`answer`,e),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(C.ERROR,`setLocalDescription-single`),this._sdpStats.logSetLocalFailed(n,e),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(C.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(C.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case K.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case K.REALLOC_CON:this._reconnect();break;case K.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case K.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case K.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case K.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent(Y.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 On||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(Y.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(C.ERROR,`ontrack-empty-stream`),n.addTrack(t.track)),this._rtpReceiversByStreamId[n.id]=t.receiver,this._triggerEvent(Y.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(C.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===q.IDLE||t===q.OPENED?this._setState(q.CONNECTING):e.iceConnectionState===`checking`&&this._setState(q.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(q.RECONNECTING);break;case`connected`:this._setState(q.CONNECTED),M.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(this._logger?.log(C.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(C.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(C.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(C.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(C.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(C.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=fi.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(`
|
|
10
10
|
degradationPreference updated for fast share RTP Sender
|
|
11
11
|
Actual senderStats: ${JSON.stringify(e)}
|
|
12
12
|
serverSettings: ${JSON.stringify(this._serverSettings.fastScreenSharing)}
|
|
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}({}),da=class extends b{constructor(e,t,n,r,i=R,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`,q.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,G.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Yt.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,Yt.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this.subscribe(this._mediaSource,Yt.SOURCE_READY,this._updateVadTrack),this._createVad(),this._createAnimojiTransport(),e===J.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===J.DIRECT&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===J.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===J.DIRECT&&this._directTransport&&this._directTransport.open(t),this._topology===J.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===J.DIRECT&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===J.SERVER&&(this._serverTransport?.removeParticipant(e),this._setStates([e],q.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(),M.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===J.SERVER?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){M.vmoji&&t.isMe&&M.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===J.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===K.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(C.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===J.SERVER&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===J.DIRECT){let t=e.offerTo||[],n=e.offerToTypes||[],r=e.offerToDeviceIdxs||[],i=t.length&&n.length?j.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 Jr(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,J.DIRECT))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new ua(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,J.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===q.CONNECTED&&this._topology===J.DIRECT&&this._releaseServerTransport(),(e===q.CLOSED||e===q.FAILED)&&(this._releaseDirectTransport(),this._topology===J.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===J.DIRECT&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===q.CONNECTED&&this._topology===J.SERVER&&this._releaseDirectTransport(),(e===q.CLOSED||e===q.FAILED)&&(this._releaseServerTransport(),this._topology===J.SERVER&&(this._allocated=[],this._opened=[])),this._topology===J.SERVER&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===J.SERVER&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===J.SERVER&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===J.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===J.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===k.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(){M.vad&&(this._vadController=new M.vad.VadController(this._mediaSource.getSendAudioTrack(),M.vadOptions),this._vadController.setLogger((e,...t)=>R.send(e,...t),`VAD`),this._vadController.init().catch(e=>{R.warn(`[Transport] VAD init failed, continuing without VAD`,e),this._vadController?.destroy(),this._vadController=null}))}_createAnimojiTransport(){if(!M.vmoji)return;this._animojiReceiver=new M.vmoji.AnimojiReceiver((e,t)=>this._onAnimojiStream(e,t),e=>this._onAnimojiStream(e,null),e=>{this._triggerEvent(`ANIMOJI_ERROR`,e)},M.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new M.vmoji.AnimojiSender(e,this._signaling.getPeerId(),M.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:M.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===J.SERVER?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(this._logger?.log(C.PAT_WAITING_TIME_ERROR,`noTransport`),this._debug.error(`Cannot get stream waiting time, server transport is not initialized`),0):(this._logger?.log(C.PAT_WAITING_TIME_ERROR,`wrongTopology`),this._debug.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},fa=`videochat-epi`,pa=5e3,ma=500,ha=class extends b{constructor(e,t,n=null,r=!1,i=R){super(),h(this,`_previousPerfStatReportTimestamp`,0),h(this,`_previousNetworkStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReport`,null),h(this,`_previousRemoteInboundRtps`,new Map),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===q.CONNECTED||!this._directTopology&&e===q.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now(),this._previousRemoteInboundRtps.clear())}),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._previousRemoteInboundRtps.clear(),this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(fa)||``,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&&M.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+pa<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+ma<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),M.callStatReportEnabled&&this._previousCallStatReportTimestamp+M.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(fa,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,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:_a(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:_a(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),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(M.simulcast&&(i.is_simulcast=!0),navigator.hardwareConcurrency&&(i.cpu_hardware_concurrency=navigator.hardwareConcurrency),n&&!va(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!va(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!va(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&&!va(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=ya(n/e*1e3),i.removed_audio_samples_for_acceleration=ya(r/e*1e3),i.concealed_audio_samples=ya(a/e*1e3),i.concealed_silent_audio_samples=ya(o/e*1e3),i.concealment_audio_avg_size=ya(a/s),i.total_audio_energy=t.total_audio_energy}ga(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),ga(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=this._calculatePacketLoss(e.remoteInbound.rtps);a.video!==void 0&&(i.video_loss=a.video),a.audio!==void 0&&(i.audio_loss=a.audio),this._statAggregator?.logCallStat(i),M.enableLogPerfStatReport&&this._debug.log(`Sent call stats`,i),this._previousCallStatReport=t}_calculatePacketLoss(e){let t=new Map,n={audio:{lost:0,received:0},video:{lost:0,received:0}};for(let r of e){if(r.kind!==`audio`&&r.kind!==`video`)continue;let e=`${r.kind}:${r.ssrc}`,i={packetsLost:r.packetsLost,packetsReceived:r.packetsReceived},a=this._previousRemoteInboundRtps.get(e);t.set(e,i),a&&(n[r.kind].lost+=Math.max(0,i.packetsLost-a.packetsLost),n[r.kind].received+=Math.max(0,i.packetsReceived-a.packetsReceived))}this._previousRemoteInboundRtps=t;let r={};for(let e of[`audio`,`video`]){let{lost:t,received:i}=n[e];t+i>0&&(r[e]=t/(t+i)*100)}return r}};function ga(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function _a(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function va(e){return e===void 0}function ya(e){return Number.isNaN(e)?0:e}var ba;(function(e){function t(){return{estimatedPerformanceIndex:ha.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:+!!M.asrDataChannel,animojiDataChannelVersion:M.vmoji?M.vmojiOptions.protocolVersion:1,animojiBackendRender:!M.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:M.videoTracksCount,red:!0,audioShare:M.audioShare,fastScreenShare:M.fastScreenShare,videoSuspend:M.videoSuspend,simulcast:M.simulcast,simulcastNativeOrder:!0,consumerFastScreenShare:M.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:M.consumerFastScreenShareQualityOnDemand,transparentAudio:M.transparentAudio}}e.get=t})(ba||(ba={}));var xa=ba,Sa={producerScreenTrack:()=>!0,videoTracksCount:()=>M.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>M.movieShare,useParticipantListChunk:()=>M.useParticipantListChunk,useRooms:()=>M.useRooms,vmoji:()=>!!M.vmoji,useCallsToContacts:()=>M.useCallsToContacts,useChatRooms:()=>M.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!M.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>M.enableSessionStateUpdates,addParticipant:()=>M.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>M.waitForAdminInGroupCalls,hold:()=>M.hold},Ca=class{static getFlags(){let e=Object.values(Sa),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(Sa).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},wa=63n,Ta=16383n,Ea=1073741823,Da=4611686018427387903n,Oa=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=wa)return new Uint8Array([Number(t)]);if(t<=Ta)return new Uint8Array([64|Number(t>>8n),Number(t&255n)]);if(t<=BigInt(Ea))return new Uint8Array([128|Number(t>>24n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);if(t<=Da)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`)}},ka=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}},Aa=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 Oa,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}}},ja=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 ka,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}}},Ma=class{static isBrowserSupported(){return!(!(`WebTransport`in window&&typeof WebTransport==`function`)||T.browserName()===`Safari`)}constructor(e,t={},n=R){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 Aa(this.compression),this.decoder=new ja(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}},Na=function(e){return e.EMPTY_ENDPOINT=`EMPTY_ENDPOINT`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.ABORTED=`ABORTED`,e}({}),Pa=class{constructor(e=R,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`,xr.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!==br.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=xr.WEBTRANSPORT,this.socket=new Ma(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:xr.WEBSOCKET,remote:!0});return}let e=this._buildUrl(this.endpoint,!1);this.currentType=xr.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`,M.platform),r.set(`appVersion`,M.appVersion),r.set(`version`,String(M.protocolVersion)),r.set(`device`,M.device),r.set(`capabilities`,Ca.getFlags()),r.set(`clientType`,M.clientType),this.connectionType&&r.set(`tgt`,this.connectionType),this.connectionType===br.RETRY&&this.lastStamp&&r.set(`recoverTs`,String(this.lastStamp)),M.useParticipantListChunk&&(r.set(`partIdx`,String(M.participantListChunkInitIndex)),M.participantListChunkInitCount!==null&&r.set(`partCount`,String(M.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&&Ma.isBrowserSupported()&&this.wtEndpoint!==null&&M.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===xr.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>=M.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=br.RETRY,this._connect()},e)}_getReconnectDelay(){return Math.min(M.signalingReconnectMaxDelay,M.signalingReconnectDelay*2**this.reconnectCount)}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=M.signalingReconnectMaxCount)&&(this.doctorTimer=window.setTimeout(()=>{this.handlers.onConnectionDead(),this.forceWebSocket=!0,this._disconnect(4e3),this._scheduleReconnect(0)},M.waitMessageDelay))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}},Fa=`open`,Ia=10,La={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`},Ra={[La.CONVERSATION_ENDED]:`conversation-ended`,[La.OBSOLETE_CLIENT]:`obsolete-client`,[La.INVALID_TOKEN]:`invalid-token`,[La.PARTICIPANT_NOT_FOUND]:`participant-not-found`,[La.ILLEGAL_PARTICIPANT_STATE]:`illegal-participant-state`,[La.SERVICE_UNAVAILABLE]:`service-unavailable`};function za(e,t){return e.errorMessage??e.message??e.error??t}var Ba=new Set([D.CALLER_IS_BLOCKED,D.ENDED,D.NOT_FOUND,D.PARTICIPANT_LIMIT_REACHED,D.SERVICE_UNAVAILABLE]),Va=class e extends On{static get WAIT_CONNECTION_DELAY(){return M.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return M.waitResponseDelay}get ready(){return!this.disposed&&this.transport.readyState!==null}constructor(e=R,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 tr(e),this.transport=new Pa(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=t=>{if(this.producerNotificationDataChannel!==e)return;let n=this.participantIdRegistry?.handleMessage(t.data);n&&this._handleMessage(n)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(t=>{this.producerCommandDataChannel===e&&t&&this._handleMessage(t)}).catch(e=>{this._debug.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}resetProducerConnection(e=new Dn){this.producerCommandDataChannelEnabled=!1,this.producerNotificationDataChannel&&(this.producerNotificationDataChannel.onmessage=null,this.producerNotificationDataChannel=null),this.producerCommandDataChannel&&(this.producerCommandDataChannel.onmessage=null,this.producerCommandDataChannel=null);let t=[...this.datachannelCommandsQueue];this.datachannelCommandsQueue=[];for(let e of Object.values(this.responseHandlers))e.route===`producer`&&(t.push(e),delete this.responseHandlers[e.sequence]);t.forEach(t=>{window.clearTimeout(t.responseTimer),t.reject(e instanceof Dn?new Dn(t.name):e,!0)})}async connect(e){return new Promise((t,n)=>{if(this.transport.readyState!==null&&this.transport.readyState<WebSocket.CLOSING){this._logger?.log(C.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(B.HANGUP,{reason:e},!1)}async sendCandidate(e,t){return this._send(B.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(B.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,n){let r=Object.assign({sdp:t},n);return this._send(B.TRANSMIT_DATA,{participantId:e,data:r},!0,Ia)}async acceptCall(e){return this._send(B.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(B.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Ia)}async changeParticipantState(e,t){let n={participantState:{state:e}};return t&&(n.participantId=t),this._sendRaw(B.CHANGE_PARTICIPANT_STATE,n)}async hold(e){let t=xa.get();return this._send(B.HOLD,{hold:e,capabilities:e?void 0:t})}async putHandsDown(){return this._send(B.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(B.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(B.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(B.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let n={capabilities:t};return e&&(n.description=e.sdp),this._send(B.ALLOCATE_CONSUMER,n)}async acceptProducer(e,t,n){let r={description:e.sdp,sessionId:n};return t.length&&(r.ssrcs=t),this._send(B.ACCEPT_PRODUCER,r)}async changePriorities(e){return this._send(B.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(B.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(B.ADD_MOVIE,e)}async updateMovie(e){return this._send(B.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(B.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(B.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(B.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(B.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(B.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(B.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(B.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(B.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(B.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(B.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(B.RECORD_PUBLISH,e)}async getRecordStatus(){return this._send(B.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(B.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(B.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(B.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(B.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(B.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(B.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(B.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(B.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,n){let r={participantId:e,roles:t};return n&&(r.revoke=!0),this._sendRaw(B.GRANT_ROLES,r)}async muteParticipant(e,t,n,r=null){return this._sendRaw(B.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:n,roomId:r})}async enableFeatureForRoles(e,t){return this._sendRaw(B.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(B.PIN_PARTICIPANT,r)}async updateMediaModifiers(e){return this._send(B.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(B.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(B.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(B.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(B.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(B.GET_WAITING_HALL,r)}async promoteParticipant(e,t=!1){let n={};return e&&(n.participantId=e),t&&(n.demote=t),this._sendRaw(B.PROMOTE_PARTICIPANT,n)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(B.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(B.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(B.FEEDBACK,{key:e})}async getHandQueue(){return this._send(B.GET_HAND_QUEUE)}dispose(e=new En){this._terminate(e)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(B.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(B.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(B.ASR_START,e)}async stopAsr(e){return this._send(B.ASR_STOP,e)}async requestAsr(e){return this._send(B.REQUEST_ASR,{request:e},!1)}async _send(e,t={},n=!0,r=0){if(t.participantId){let e=j.decomposeParticipantId(t.participantId),n=j.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 En(e);switch(t.route){case`producer`:this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===Fa&&this._handleCommandsQueue(this.datachannelCommandsQueue);break;case`websocket`:if(this.transport.readyState===null){this._logger?.log(C.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(C.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}`;W.setMark(l);let u={sequence:c,name:e,route:this._isDataChannelCommand(e)?`producer`:`websocket`,statMarkName:l,params:t,responseTimer:0,needResponse:n,resolve:a,reject:s};i(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===B.UPDATE_DISPLAY_LAYOUT||e===B.REPORT_PERF_STAT||e===B.REPORT_SHARING_STAT||e===B.REQUEST_ASR||e===B.ENABLE_VIDEO_SUSPEND||e===B.ENABLE_VIDEO_SUSPEND_SUGGEST||e===B.REPORT_NETWORK_STAT||e===B.CHANGE_SIMULCAST:!1}_onOpen(){this._debug.debug(`[signaling] socket opened`),this._logger?.log(C.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._logTransportStat(this.connectionType===br.RETRY?Sr.RECONNECTED:Sr.CONNECTED)}_onMessage(e){if(e.data===`ping`){this._statPings?.mark(this._getSocketType()),this._markTransportStat(Sr.FAILED_PINGS),L.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);L.onSignalingMessage(t),this._handleMessage(t)}catch(t){this._logger?.log(C.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(Sr.RESTART),this._triggerEvent(G.RECONNECT,e),e.conversation.topology&&this._triggerEvent(G.NOTIFICATION,{type:`notification`,notification:K.TOPOLOGY_CHANGED,topology:e.conversation.topology}),this._resolvePendingRecordCommands(e)),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===K.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(G.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:this._logger?.log(C.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(C.SOCKET_ACTION,`error-${e.error}`);let t=this._getSocketType(),n=e.error?this._createSignalingCallError(e.error,e.errorCode,t):void 0,r=za(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 La.SERVICE_UNAVAILABLE:let i=new O(D.SERVICE_UNAVAILABLE,{callError:n,message:r,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(G.NOTIFICATION,{notification:K.CLOSED_CONVERSATION,callError:n,reason:D.SERVICE_UNAVAILABLE});break;case La.CONVERSATION_ENDED:this.conversationReject?this.conversationReject(new O(e.reason||x.SIGNALING_FAILED,{callError:n,message:r,remote:!0})):this._triggerEvent(G.NOTIFICATION,{notification:K.CLOSED_CONVERSATION,callError:n,reason:e.reason});break;case La.ILLEGAL_PARTICIPANT_STATE:case La.PARTICIPANT_NOT_FOUND:this._throwError(new O(x.SIGNALING_FAILED,{callError:n,message:r,remote:!0}));break;case La.OBSOLETE_CLIENT:this.conversationReject?.(new O(e.reason||D.OBSOLETE_CLIENT,{callError:n,message:r,remote:!0}));break;case La.INVALID_TOKEN:default:if(e.sequence||t===xr.WEBTRANSPORT)break;if(this.connected)this._throwError(new O(e.reason||x.SIGNALING_FAILED,{callError:n??{scope:`unknown`,description:`signaling-unrecognized-error`},message:r,remote:!0}));else if(!e.sequence){let t=new O(e.reason||x.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(G.FAILED,e)}_onError(e){this._logger?.log(C.SOCKET_ACTION,`error`),this._debug.error(`[signaling] signaling error`,e),this._logTransportStat(Sr.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(C.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.producerCommandDataChannelEnabled=!1,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 En?new En(t.name):e,!0)}),n?.(e),!0}_fail(e){this._terminate(e)&&this._throwError(e)}_isRecordCommand(e){return e===B.RECORD_START||e===B.RECORD_STOP}_resolvePendingRecordCommands(e){if(!M.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===B.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(G.NOTIFICATION,{...n,notification:K.PARTICIPANT_ADDED,type:`notification`,participant:e});return}let r=this.responseHandlers[n.sequence];window.clearTimeout(r.responseTimer);let i=W.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(C.SOCKET_ACTION,`response-error`),r.reject(Error(za(n,`Response error [${r.name}]`)),!0)):this.transport.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],this._logger?.log(C.SOCKET_ACTION,`response-timeout`),r.reject(Error(za(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),t.route===`producer`){if(this.producerCommandDataChannel?.readyState!==Fa){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 B.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case B.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case B.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case B.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case B.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case B.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case B.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case B.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===B.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]=jn(t[e]));return{layouts:n}}_waitConnectionMessage(){let t=this._getSocketType();this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new O(x.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===br.RETRY?Sr.RECONNECTED:Sr.CONNECTED;this._markTransportStat(t,e.source)}_onTransportFailed(e){switch(e.failure){case Na.EMPTY_ENDPOINT:this.conversationReject?.(new O(x.SIGNALING_FAILED,{callError:{scope:`internal`,code:`configuration`,description:`signaling-endpoint-missing`},message:e.message,remote:e.remote}));break;case Na.NETWORK_ERROR:this._fail(new O(D.NETWORK_ERROR,{callError:{scope:`network`,source:e.source,code:`reconnect-exhausted`,description:`connection-failed`}}));break;case Na.ABORTED:this._debug.debug(`[signaling] aborted reconnect`),this._fail(new O(D.CANCELED));break}}_onTransportReconnectScheduled(e){this.connectionType=br.RETRY,this._debug.log(`[signaling] reconnect signaling after ${e.delay}ms (${e.count})`),this._logger?.log(C.SOCKET_ACTION,`reconnect`)}_onTransportConnectionDead(){this._debug.warn(`[signaling] socket is dead, trying to reconnect`),this._logTransportStat(Sr.FAILED_PINGS)}_attachNotificationCallError(e){e.callError||!e.reason||e.reason===D.FAILED||e.reason===D.UNKNOWN_ERROR||!Ba.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=Ra[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=Cr[e][t];W.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=Cr[e][n];this._statAggregator?.logEventualStat({name:r,...t})}},Ha=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(Ha||{}),Ua=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(Ua||{}),Wa=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(Wa||{}),Ga=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(Ga||{}),Ka=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}(Ka||{});function qa(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function Ja(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 Ya=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(Ya||{}),Z=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(Z||{}),Xa=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(Xa||{}),Za=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(Za||{});function Qa(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var $a=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}($a||{});function eo(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var to;(function(e){function t(e){let t=e?.transport??e?.lastEffective??N.WAITING,n={transport:t,stalled:e?.stalled??!1,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===q.CONNECTED?N.CONNECTED:e===q.CONNECTING||e===q.OPENED?N.CONNECTING:e===q.RECONNECTING?N.RECONNECT:null}e.fromTransportState=n;function r(e){return[N.HANGUP,N.ERROR,N.ONHOLD].includes(e.transport)?e.transport:e.transport===N.RECONNECT||e.transport===N.CONNECTED&&e.stalled?N.RECONNECT:e.sessionStateApplicable&&e.sessionState?.connected===!1?e.sessionStateConnectedBySpeaker&&e.transport===N.CONNECTED?N.CONNECTED:N.CONNECTING:e.transport}e.computeEffective=r;function i(e,t,n=!1){return e.sessionState=t,e.sessionStateConnectedBySpeaker=t?.connected===!1&&n,c(e)}e.setSessionState=i;function a(e,t){return e.transport=t,t!==N.CONNECTED&&(e.sessionStateConnectedBySpeaker=!1),c(e)}e.setTransport=a;function o(e,t){return e.stalled=t,c(e)}e.setStalled=o;function s(e,t){return e.sessionStateApplicable=t,t||(e.sessionStateConnectedBySpeaker=!1),c(e)}e.setSessionStateApplicable=s;function c(e){let t=r(e);return e.lastEffective===t?{status:t,shouldNotify:!1}:(e.lastEffective=t,{status:t,shouldNotify:!0})}})(to||(to={}));var no=to,ro=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 io(e){try{return btoa(JSON.stringify(e))}catch(t){R.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function ao(e){try{return JSON.parse(atob(e))}catch(t){R.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var oo=(e,t)=>j.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function so(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 co(e,t){switch(e){case S.AUDIO:return!!t.isAudioEnabled;case S.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case S.VIDEO:return!!t.isVideoEnabled;case S.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function lo(e,t){return j.objectReduce(e,(e,n,r)=>{switch(n){case Ya.MUTE:case Ya.MUTE_PERMANENT:co(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function uo(e){let{muteStates:t={},mediaSettings:n}=e;return lo(t,n)}function fo(e,t){let n=e.conversation.participants.find(t=>j.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return lo(t,r)}function po(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 mo(e,t){let n=[],r=po(e),i=po(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 ho(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}function go(e){let t,n=!1,r,i=async()=>{let t=!1,i;for(;n;){let a=r;n=!1;try{await e(a),t=!1}catch(e){t=!0,i=e}!t&&n&&Object.is(r,a)&&(n=!1)}if(t)throw i};return e=>(r=e,n=!0,t??(t=i().finally(()=>{t=void 0})),t)}var _o=class{constructor(e,t=R,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(C.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&e.packetsSent>0&&(this._fixNoPacketsApplied=!0,this._logger?.log(C.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (no packets)`),this._toggleAudioPromise=this._mediaSource.toggleAudio(T.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(C.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(this._debug.log(`[AudioFix] Fixed RV`),this._logger?.log(C.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,this._logger?.log(C.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===k.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===k.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)}))}},vo=class{constructor(e,t=!1,n=R,r=null){h(this,`_audioElement`,null),h(this,`_debug`,void 0),h(this,`_preparedAudioElement`,void 0),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,`_logger`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t,this._debug=n,this._logger=r,this._preparedAudioElement=this._prepareAudioElement()}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=T.getSavedOutput();e&&await this._audioElement.setSinkId?.(e.deviceId)}catch(e){throw this._logger?.log(C.ERROR,`change_output`),this._debug.error(`[audio] Output change failed`,e),e}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(M.muteMode)return;let e=this._getTracks();if(!e.length)return;let t=this._preparedAudioElement??this._createAudioElement();t.muted=!1,t.volume=this._volume,t.preload=`auto`;let n=()=>{this._debug.warn(`[audio] Error on play audio`),L.onAutoplayError()},r=e=>{this._debug.debug(`[audio] Play audio`),t.srcObject=null,t.srcObject=new MediaStream(e),t.load();let r=t.play();r&&r.catch(n)},i=()=>{this._debug.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?r(e):this._debug.warn(`[audio] Broken audio tracks`)};t.onpause=i,t.onstalled=i,t.onerror=i,t.onloadeddata=()=>{this._statFirstMediaReceived.measure()},r(e),this._audioElement=t;let a=T.getSavedOutput()?.deviceId;a&&t.setSinkId?.(a).catch(e=>{this._debug.warn(`[audio] Failed to set output device '${a}'`,e)})}_stopAudioElement(){this._audioElement&&(this._audioElement.onpause=null,this._audioElement.onstalled=null,this._audioElement.onerror=null,this._audioElement.onloadeddata=null,this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_createAudioElement(){let e=T.browserName()!==`Safari`||T.isMobile()||M.safariAudioElement;return document.createElement(e?`audio`:`video`)}_prepareAudioElement(){if(M.muteMode||T.browserName()!==`Safari`||T.isMobile())return null;let e=this._createAudioElement();return e.load(),e}_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 yo(e,t){e||xo(t,`response-empty`),e.id||xo(t,`id-empty`),e.endpoint||xo(t,`endpoint-empty`),!bo(e.stun_server)&&!bo(e.turn_server)&&xo(t,`ice-servers-empty`)}function bo(e){return Array.isArray(e?.urls)&&e.urls.length>0}function xo(e,t){let n=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),r=e===`fastStart`||e===`fastJoin`;throw new O(r?e===`fastStart`?D.FAST_START_ERROR:D.FAST_JOIN_ERROR:D.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 So=90,Co=3,wo=class extends b{constructor(e=R){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}),L.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>So?this._debug.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=Co)&&(this._debug.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},To=class{constructor({api:e,debug:t,getParticipants:n,isMe:r,updateDisplayLayout:i,onNonFatalError:a}){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,`_onNonFatalError`,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,this._onNonFatalError=a}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))Fn(t).participantId===e&&delete this._requestedLayouts[t];for(let t of Object.keys(this._uncertainLayouts))Fn(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,M.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{let i=this._getRequestLayouts(t);if(!i){n.forEach(({resolve:e})=>e());return}r=i;let a=this._forceNextFlush||Object.keys(this._uncertainLayouts).length>0;this._forceNextFlush=!1;let o=this._getDiff(r,a);o.length&&await this._updateDisplayLayout(o),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=[],r=this._getParticipants();for(let i of e){let e=typeof i.uid==`object`?i.uid:Q.fromId(i.uid),a=this._api.getCachedParticipantIdByExternalId(e);if(!a){this._debug.log(`Unknown participant external ID ${typeof i.uid==`object`?Q.toString(i.uid):i.uid}`),n.push(e.id);continue}if(!r[a]&&!this._isMe(a))continue;let o=Pn({participantId:a,mediaType:i.mediaType,streamName:i.streamName});t[o]={uid:i.uid,mediaType:i.mediaType,width:i.width,height:i.height,fit:i.cover?`cv`:`cn`,...i.priority===void 0?{}:{priority:i.priority},...i.streamName===void 0?{}:{streamName:i.streamName}}}return n.length?(this._onNonFatalError(`Participant ID mapping not found for external IDs "${Array.from(new Set(n)).join(`", "`)}" while handling requestDisplayLayout`),null):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}},Eo=44100,Do=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=T.getAudioContext();this._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,T.browserName()===`Safari`&&(this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),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=Eo/this._fftBins.length,t=Math.ceil(M.voiceParams.minFreq/e),n=Math.floor(M.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*M.voiceParams.smoothing+t*(1-M.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)}},Oo=class extends b{constructor(e){super(),h(this,`_detector`,null),h(this,`_interval`,null);let t=()=>{this._detector&&L.onLocalVolume(this._detector.getLevel().real,e.mediaSettings.isAudioEnabled),this._interval=window.setTimeout(t,M.voiceParams.interval)};this._interval=window.setTimeout(t,M.voiceParams.interval);let n=()=>{let t=e.getSendAudioTrack();t&&this.init(t)};this.subscribe(e,Yt.SOURCE_CHANGED,t=>{t.kind===k.audio&&e.mediaSettings.isAudioEnabled&&n()}),this.subscribe(e,Yt.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new Do(`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()}},ko=class{constructor(e,t=R){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}}},Ao=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),jo=class extends b{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===k.audio&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new Do(e,n)),!this._interval)){let e=()=>{this._collectVolumes(),this._interval=window.setTimeout(e,M.voiceParams.interval)};this._interval=window.setTimeout(e,M.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,n){if(n.kind!==k.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===J.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(Yr.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(`${Yr.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===J.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology===J.SERVER&&M.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},Mo=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),No=class extends b{constructor(e,t,n){super(),h(this,`_speakerId`,null),h(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===J.SERVER,this.subscribe(e,Ao.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>M.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*M.voiceParams.speakerLevelMultiplier&&(this._speakerId=n,this._triggerEvent(`SPEAKER_CHANGED`,n))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent(`SPEAKER_CHANGED`,e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e===J.SERVER}},Po=15e3,Fo=15e3,Io=class extends b{constructor(e,t,n,r=R,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,Ao.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()===J.DIRECT?Po:M.specListenerParams.connectionTimeout}_getVolumeTimeout(){return this._transport.getTopology()===J.DIRECT?Fo:M.specListenerParams.volumeTimeout}_onTransportStateChanged(e,t){t===q.OPENED&&(this._connectionTimeout||(this._connectionTimeoutSuppressed=!1,this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),this._getConnectionTimeout()))),t===q.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===q.FAILED&&this._connectionTimeout&&(this._debug.warn(`Transport failed, send callSpecError`),this._logger?.log(C.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!==q.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(C.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(C.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&this._debug.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},Lo=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()===J.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}},Ro=`invalid-error-metadata`,zo=64,Bo=new Set(Object.values(D)),Vo=new Set(Object.values(x)),Ho={[D.CANCELED]:{type:`semantic`,reason:`canceled`},[D.REJECTED]:{type:`semantic`,reason:`rejected`},[D.REMOVED]:{type:`semantic`,reason:`removed`},[D.HUNGUP]:{type:`semantic`,reason:`hangup`},[D.MISSED]:{type:`semantic`,reason:`missed`},[D.BUSY]:{type:`semantic`,reason:`busy`},[D.FAILED]:{type:`failed`},[D.NETWORK_ERROR]:{type:`requires-call-error`},[D.KILLED]:{type:`semantic`,reason:`killed`},[D.BANNED]:{type:`semantic`,reason:`banned`},[D.HAS_ACTIVE_CALL]:{type:`semantic`,reason:`initially_closed`},[D.CALLER_IS_BLOCKED]:{type:`requires-call-error`},[D.NOT_FRIENDS]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1103,description:`friendship-required`}},[D.CALLEE_IS_OFFLINE]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1102,description:`target-user-unavailable`}},[D.CALLEE_UNAVAILABLE]:{type:`semantic`,reason:`unavailable`},[D.CALLER_IS_REJECTED]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1113,description:`caller-is-rejected`}},[D.UNKNOWN_ERROR]:{type:`failed`},[D.UNSUPPORTED]:{type:`direct-error`,error:{scope:`internal`,code:`observer-mode`,description:`video-tracks-count-must-be-zero`}},[D.SERVICE_DISABLED]:{type:`direct-error`,error:{scope:`server`,source:`api`,code:1101,description:`vchat-service-disabled`}},[D.SERVICE_UNAVAILABLE]:{type:`requires-call-error`},[D.EXTERNAL_API_ERROR]:{type:`requires-call-error`},[D.SOCKET_CLOSED]:{type:`semantic`,reason:`socket_closed`},[D.ENDED]:{type:`requires-call-error`},[D.KILLED_WITHOUT_DELETE]:{type:`semantic`,reason:`killed_without_delete`},[D.ANOTHER_DEVICE]:{type:`semantic`,reason:`another_device`},[D.NOT_FOUND]:{type:`requires-call-error`},[D.VCHAT_DETAILED_ERROR]:{type:`requires-call-error`},[D.TIMEOUT]:{type:`semantic`,reason:`timeout`},[D.PARTICIPANT_LIMIT_REACHED]:{type:`requires-call-error`},[D.FAST_START_ERROR]:{type:`failed`},[D.FAST_JOIN_ERROR]:{type:`failed`},[D.CALL_TIMEOUT]:{type:`semantic`,reason:`call_timeout`},[D.OBSOLETE_CLIENT]:{type:`semantic`,reason:`obsolete_client`}},Uo={[x.MIC_CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`mic-camera-permission`}},[x.CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-permission`}},[x.MIC_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-permission`}},[x.CAMERA_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-access`}},[x.MIC_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-access`}},[x.MIC_NOT_FOUND]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-not-found`}},[x.SCREEN_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-permission`}},[x.SCREEN_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-access`}},[x.CONNECTION]:{type:`direct-error`,error:{scope:`network`,source:`rtc`,code:`connection`,description:`connection-failed`}},[x.NETWORK]:{type:`requires-call-error`},[x.UNKNOWN]:{type:`failed`},[x.UNSUPPORTED]:{type:`requires-call-error`},[x.SIGNALING_FAILED]:{type:`requires-call-error`},[x.API]:{type:`requires-call-error`},[x.AUTH]:{type:`requires-call-error`},[x.OVERCONSTRAINED]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`overconstrained`}}};function Wo(e){if(typeof e!=`string`&&typeof e!=`number`||typeof e==`number`&&!Number.isFinite(e))return Ro;let t=String(e).trim();if(!t)return Ro;let n=t.toLowerCase().replace(/[\s_:]+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``);return!n||!/^[a-z0-9.-]+$/.test(n)?Ro:n.length>zo?`${n.slice(0,zo-3)}...`:n}function Go(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 Ko(e){let t=Wo(e.description);if(e.scope===`unknown`)return`unknown:${t}`;let n=Wo(e.code);return e.scope===`internal`?`internal:${n}:${t}`:`${e.scope}:${e.source}:${n}:${t}`}function qo(e,t){return t===null?e.type===`direct-error`?{reason:`error`,string_value:Ko(e.error)}:{reason:`failed`}:Go(t)?{reason:`error`,string_value:Ko(t)}:{reason:`failed`}}function Jo(e){if(e.hangup){let t=Ho[e.hangup];return t?t.type===`semantic`?e.hangup===D.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}:qo(t,e.callError):{reason:`failed`}}if(e.error){let t=Uo[e.error];return t?qo(t,e.callError):{reason:`failed`}}return{reason:`failed`}}function Yo(e){return e instanceof O?Jo(e):typeof e==`string`&&(Bo.has(e)||Vo.has(e))?Jo(new O(e)):{reason:`failed`}}var Xo={wallNow:()=>Date.now(),monotonicNow:()=>performance.now()};function Zo(e){return e===`anonym_join`?`join`:e}var Qo=class{constructor(e,t=Xo){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=Zo(e),this._lifecycleStartedAtMonotonic=this._clock.monotonicNow(),t&&(this._conversationId=t),this._record({name:H.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:H.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:H.CALL_ACCEPTED_OUTGOING}))}markIncomingAccepted(e){!this._canRecord()||this._accepted||(this._accepted=!0,this._record({name:H.CALL_ACCEPTED_INCOMING,...e&&{string_value:`concurrent`}}))}markFirstMediaSent(){!this._canRecord()||this._firstMediaSent||(this._firstMediaSent=!0,this._record({name:H.FIRST_MEDIA_SENT}))}markFinished(e){this._finish(Yo(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:H.CALL_FINISH,reason:e,...t&&{string_value:t}},void 0,!0))}_ensureConversationId(){this._conversationId||(this._conversationId=j.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}})}},$o=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`));M.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:H.CODEC_USAGE,codec_implementation:e.codecName,value:Number.parseFloat(e.totalEncodeTime.toFixed(3)),call_topology:e.topology===J.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()}},es=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=W.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})}},ts=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]}},ns=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}},rs=class{constructor(){h(this,`count`,0),h(this,`minVal`,1/0),h(this,`maxVal`,-1/0),h(this,`mean`,new ns),h(this,`p50`,new ts(.5)),h(this,`p95`,new ts(.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}},is=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByTransport`,{ws:new rs,wt:new rs}),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(){[xr.WEBSOCKET,xr.WEBTRANSPORT].forEach(e=>{if(!this.trackerByTransport[e].hasData)return;let t=this.trackerByTransport[e].snapshot();this._logger.logClientStats({name:H.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 rs,wt:new rs},this.lastSeen={}}},as=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 rs,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:H.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()}},os=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 Lo(e,t,n,r),this.lifecycle=new Qo(this.logger),this.statAggregator=new es(this.logger),this.codecStatsAggregator=new $o(this.logger,r),this.pings=new is(this.logger),this.signalingCommands=new as(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()}},ss=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===J.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===J.DIRECT&&this.mark(`direct_outgoing`)}markOnJoin(e){this.mark(e===J.DIRECT?`direct_join`:`server_join_server`,e===J.DIRECT)}markTopologyChanged(e){this._isFinished||e!==J.SERVER||(this._callType=`server_change_topology`)}mark(e,t=!1){(!this._isCallMarked||t)&&(this._isCallMarked=!0,this._callType=e,W.setMark(H.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&this._statAggregator.logEventualStat({name:H.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},cs=1e3,ls=1e4;function us(e,t,n,r){return new O(e,{callError:{scope:`external`,source:`api`,code:t,description:n},message:r})}var ds=15,$=class e extends b{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`,R.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`,jr()),h(this,`_serverTimeOffset`,0),h(this,`_delayedHangup`,!1),h(this,`_onFastHangup`,void 0),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,`_toggleLocalVideo`,go(e=>{if(this._mediaSource)return this._stats.logger.log(C.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)})),h(this,`_toggleLocalAudio`,go(e=>{if(this._mediaSource)return this._stats.logger.log(C.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)})),h(this,`_changeMediaSettings`,j.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 os(e,t,()=>this._conversation?.id||null,()=>this._transport?.getTopology()??this._conversation?.topology),this._api=e,this._signaling=new Va(this._debug,this._stats.logger,this._stats.statAggregator,this._stats.pings,this._stats.signalingCommands),this._signalingActor=new ko(this._onSignalingNotification.bind(this),this._debug),this._displayLayoutRequester=new To({api:this._api,debug:this._debug,getParticipants:()=>this._participants,isMe:e=>this._isMe(e),updateDisplayLayout:e=>this.updateDisplayLayout(e),onNonFatalError:e=>this._onNonFatalError(e)}),this._onUnload=()=>{this._stopFirstMediaSentProbe(),this._conversation&&this._api&&this._sendHangupApi(this._conversation.id,this._state===`IDLE`?D.CANCELED:D.HUNGUP),this._stats.destroy()},window.addEventListener(`pagehide`,this._onUnload),this._statFirstMediaReceived=new ss(this._stats.statAggregator),this._audioOutput=new vo(this._statFirstMediaReceived,M.transparentAudio,this._debug,this._stats.logger),M.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),cs))}static current(){return z.getActive()??(M.hold?null:z.getFirst())}static hangupAfterInit(e){let t=fs;if(t){if(typeof e==`function`&&(t._onFastHangup=e),t._delayedHangup===!1&&!t._conversation){t._delayedHangup=!0,t._abortController?.abort(new O(D.CANCELED));return}t._conversation&&t.hangup({onFastHangup:e,reason:D.CANCELED})}}static id(){return z.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`}get isIncomingRinging(){return this._conversation?.direction===Ha.INCOMING&&this._state===`IDLE`}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=z.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}getCachedParticipantIdByExternalId(e){return this._api.getCachedParticipantIdByExternalId(e)}_onNonFatalError(e){L.onNonFatalError(Error(e),this.id)}getIncomingCallerExternalId(){return this._conversation?.direction===Ha.INCOMING?Object.values(this._participants).find(e=>!this._isMe(e.id))?.externalId??null:null}_buildInternalParams(){let e={deviceId:this._api.deviceId(),sdkVersion:M.sdkVersion,clientAppKey:M.apiKey,platform:M.platform,protocolVersion:M.protocolVersion,domainId:M.domain,capabilities:Ca.getFlags()};return JSON.stringify(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??j.uuid(),d=(e?.length??0)+(s?.length??0),f=t===Ua.USER&&d===1?M.calleeUnavailableWaitingTime:void 0;this._stats.lifecycle.markInitializationStarted({source:`outgoing`,conversationId:u}),this._debug.setConversationId(u),fs=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===Ua.CHAT||e&&e.length>1?this._logWithMediaSettings(C.OUTGOING_MULTIPARTY_CALL,l):this._logWithMediaSettings(C.OUTGOING_CALL,l);let d=await this._startConversation({opponentIds:e,opponentType:t,direction:Ha.OUTGOING,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:u});if(!this._conversation)throw new O(D.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 O(D.CANCELED);if(this._debug.debug(`Outgoing call`,{opponentIds:e,opponentType:t,mediaOptions:n}),this._processConnectionSharedMovieInfo(d),this._processConversationUrlSharingInfo(d),L.onLocalStream(this._mediaSource.getStream(),this._mediaSource.mediaSettings,this.id),L.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),void 0,this.id),this._onConversationParticipantListChunk(d),this._processPinnedParticipants(d),L.onLocalStatus(N.WAITING,this.id),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),this._conversation?.concurrent){let e=z.get(this._conversation.id);e&&e!==this&&e._close(new O(D.HUNGUP,{remote:!0}))}return z.add(this),await z.setActive(this.id),fs=null,this._conversation.concurrent&&await this._acceptConcurrent(),f&&!this._registeredPeerReceived&&this._state!==`CLOSE`&&(this._calleeUnavailableTimer=window.setTimeout(()=>{this._calleeUnavailableTimer=null,this._close(new O(D.CALLEE_UNAVAILABLE),{signalingReason:D.CANCELED})},f)),this._conversation}catch(e){throw fs=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}),fs=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&&M.videoTracksCount>0)throw this._debug.error(`Observer mode: please set videoTracksCount=0`),new O(D.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(C.JOIN_CONVERSATION,n);let r=await this._joinConversation(e);if(!this._conversation)throw new O(D.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`conversation`,description:`not-initialized-after-join`}});return this._conversation.observer=t,L.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`),z.add(this),fs=null,this._signaling.readyToSend(),L.onLocalStatus(this._conversation.waitForAdmin?N.WAIT_FOR_ADMIN:N.WAITING_HALL,this.id),this._conversation):this._onJoinPart2(r)}catch(e){throw fs=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 O(D.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 O(D.CANCELED);this._processConnectionSharedMovieInfo(e),this._processConversationUrlSharingInfo(e),this._processConnectionAsrInfo(e);let r=this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);L.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),r,this.id),this._onConversationParticipantListChunk(e),this._processPinnedParticipants(e),L.onLocalStatus(N.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),t&&(this._state=`ACTIVE`),this._changeFeatureSet(),t&&(z.add(this),n?await this._holdLocally():await z.setActive(this.id),fs=null);let i=this._extractLocalParticipantFromConnection(e);if(i){let e=j.mapParticipantState(i);Object.keys(e).length>0&&L.onLocalParticipantState(e,!1,this.id)}return t&&this._openTransport(Object.values(this._participants),!1),this._conversation}catch(e){throw fs=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to join conversation`}),e}}_extractExternalRooms(e){let t=[],n=[];return e.forEach(e=>{let{room:r,missingParticipantIds:i}=this._convertRoomToExternal(e);r&&n.push(r),t.push(...i)}),this._reportMissingExternalIds(t,`EXTRACT_EXTERNAL_ROOMS`),n.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=A.USER,n,r,i,a){if(z.has(e))throw new O(D.HAS_ACTIVE_CALL);z.reserve(e),this._reservedId=e,this._stats.lifecycle.markInitializationStarted({source:`incoming`,conversationId:e}),this._debug.setConversationId(e),fs=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 O(D.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(C.PUSH,`rejected`),new O(D.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(C.PUSH,`accepted`),z.add(this),fs=null,this._delayedHangup)throw new O(D.CANCELED)}catch(e){throw fs=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to handle inbound call push`,signalingReason:e instanceof O&&e.hangup===D.BUSY?D.BUSY:void 0}),e}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(Ka.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(Ka.WAIT_FOR_ADMIN),n=e.conversation.options.includes(Ka.ADMIN_IS_HERE);return!t||t&&n?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(t=>j.comparePeerId(t.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(Ka.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new O(D.UNKNOWN_ERROR,{callError:{scope:`internal`,code:`accept`,description:`runtime-not-initialized`}});this._state=`PROCESSING`;let e=this._mediaSource.mediaSettings;this._logWithMediaSettings(C.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),L.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 j.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=ho(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(C.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 O(D.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(C.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(L.onCallAccepted(this.id),L.onLocalStream(this._mediaSource.getStream(),t,this.id),L.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),a,this.id),await this._emitHeldParticipantsStatus(),M.useParticipantListChunk){let e=await this._getInitialParticiapntListChunk(),t=this._participants;e?.participants?.forEach(e=>{let n=t[j.composeId(e)];n&&(n.movieShareInfos=e.movieShareInfos)}),this._onConversationParticipantListChunk({participants:e})}return L.onLocalStatus(N.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0),this._processConversationUrlSharingInfo(),this._processConnectionAsrInfo(),z.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(C.ERROR,`declineIncoming`),this._debug.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);let t=e?.reason;this._state=`PROCESSING`,this._debug.debug(`Decline incoming call`),this._logWithMediaSettings(C.DECLINE_INCOMING,this.mediaSettings),this._participantState=Z.HUNGUP;let n=t??D.REJECTED,r=new O(n);this._finishLifecycle(r),this._onFastHangup=e?.onFastHangup??this._onFastHangup;let i=this._conversation?.id;i&&typeof this._onFastHangup==`function`&&this._sendHangup(i,n,this._onFastHangup),this._close(r,{signalingReason:n})}hangup(e){if(this._hangupPromise)return this._hangupPromise;let t=e?.reason;this._clearCalleeUnavailableWatchdog(),this._debug.debug(`Hangup`);let n=t??(this._state===`ACTIVE`||this._state===`HELD`?D.HUNGUP:D.CANCELED),r=new O(n),i=this._conversation?.id??null;this._onFastHangup=e?.onFastHangup??this._onFastHangup,this._stats.logger.log(C.HANGUP,n),this._finishLifecycle(r);let a=!!i&&typeof this._onFastHangup==`function`;return i&&a&&this._sendHangup(i,n,this._onFastHangup),this._hangupPromise=this._signaling.hangup(n).then(()=>void 0).catch(e=>{if(!(e instanceof En))throw e}).finally(()=>(i!=null&&!a&&this._sendHangupApi(i,n),this._close(r))),this._emitHangupOnce(r,i),this._cleanupTransport(),this._cleanupMediaSource(),this._hangupPromise}async addParticipant(e,t){if(!this._signaling.ready){this._close(new O(D.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:D.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(j.composeId(e),e,r)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new O(D.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:D.UNKNOWN_ERROR);let i=n.participants;for(let e of i)await this._onAddParticipant(j.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()===J.SERVER&&this._forceOpenTransportForAloneInCall()}_allocateParticipantTransport(e,t){this._transport&&(this._transport.getTopology()===J.DIRECT&&(t=this._directTransportIsMaster??(this._directTransportIsMaster=t)),this._transport.allocate(e,t))}_closeParticipantTransport(e){let t=this._transport?.getTopology()===J.DIRECT&&this._transport.opened().includes(e);this._transport?.close(e),t&&(this._directTransportIsMaster=void 0)}_cleanupRegistry(){z.remove(this._reservedId),z.remove(this.id),this._reservedId=null}_emitHangupOnce(e,t){this._hangupEmitted||(this._hangupEmitted=!0,L.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?D.FAILED:void 0),r=n&&this._signaling.ready?this._signaling.hangup(n):void 0;this._signaling.readyToSend(!1),e.error||this._stats.logger.log(C.ERROR,e.hangup);let i=this._conversation&&this._conversation.id;if([D.CANCELED,D.NOT_FRIENDS,D.CALLEE_IS_OFFLINE,D.CALLEE_UNAVAILABLE,D.CALLER_IS_BLOCKED,D.CALLER_IS_REJECTED,D.HAS_ACTIVE_CALL].indexOf(e.hangup)!==-1||e.hangup===D.REJECTED&&!e.remote){this._emitHangupOnce(e,i),this._destroy(r);return}if(e.hangup===D.HUNGUP&&(!e.remote||this._isCalledState())){this._emitHangupOnce(e,i),this._destroy(r);return}if(e.hangup===D.MISSED&&!e.remote){this._emitHangupOnce(e,i),this._destroy(r);return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===D.SOCKET_CLOSED||e.hangup===D.NOT_FOUND)&&z.getActive()&&!this._conversation){this._disposeSignaling(r),this._cleanupMediaSource();return}if(e.hangup===D.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 O(D.UNKNOWN_ERROR),i)}_sendHangup(e,t,n){typeof n==`function`?n({conversationId:e,reason:t,internalParams:this._buildInternalParams()},this._abortController?.signal).then(e=>{e?.success||this._debug.error(`Fast hangup was not successful`,e)}).catch(e=>{this._debug.error(`Fast hangup error`,e)}):this._sendHangupApi(e,t)}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._delayedHangup&&t)try{this._sendHangup(t,D.CANCELED,this._onFastHangup)}catch{}this._api.cleanup(),this._api.setAbortSignal(void 0),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 M.iceServers=mo(r,n),M.wssBase=t.endpoint,t.wt_endpoint&&(M.wtsBase=t.wt_endpoint),M.wssToken=t.token,t.client_type&&(M.clientType=t.client_type),t.external_user_type&&(M.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:n,wt_endpoint:r,token:i,client_type:a}){M.iceServers=mo(t,e),M.wssBase=n,M.wssToken=i,r&&(M.wtsBase=r),a&&(M.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??j.uuid();if(z.has(d))throw new O(D.HAS_ACTIVE_CALL);z.reserve(d),this._reservedId=d,this._debug.debug(`Conversation: start`,{conversationId:d,opponentIds:e,opponentType:t,direction:n});let f=r.includes(S.VIDEO),p,m;if(l){let e;try{if(e=await l({internalParams:this._buildInternalParams(),conversationId:d,externalIds:c,payload:i,opponentType:t,mediaOptions:r,isVideo:f,joiningAllowed:a,requireAuthToJoin:o},this._abortController?.signal),!e)throw us(D.FAST_START_ERROR,`invalid-response`,`fast-start-response-empty`);if(!e.internalCallerParams){let t=e.rejectedParticipants[0]?.status;throw us(D.FAST_START_ERROR,t?`fast-start`:`invalid-response`,t??`fast-start-internal-caller-params-empty`,JSON.stringify(e))}}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new O(D.CANCELED):e instanceof O?e:e instanceof Error?new O(D.FAST_START_ERROR,{message:e.message}):new O(D.FAST_START_ERROR,{message:String(e)})}try{let t=JSON.parse(e.internalCallerParams);p={endpoint:t.endpoint,wt_endpoint:t.wtEndpoint,id:d,is_concurrent:t.isConcurrent,client_type:t.clientType,rejected_participants:e.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:t.stun,turn_server:t.turn,token:new URL(t.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastStart`,p),m=`fastStart`}catch{throw us(D.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`;yo(p,m),this._setConversationParams(p),this._stats.lifecycle.bindConversationId(p.id);let ee=await this._connectSignaling(br.START,p);return this._setConversation(p,ee,n),this._stats.lifecycle.markCallStarted(),ee}async _joinConversation(e){W.setMark(H.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&&z.has(t))throw new O(D.HAS_ACTIVE_CALL);let c=n.includes(S.VIDEO),l,u;if(s){if(!i)throw new O(D.FAST_JOIN_ERROR,{callError:{scope:`internal`,code:`fast-join`,description:`join-link-required`}});let e;try{if(e=await s({joinLink:i,isVideo:c,internalParams:this._buildInternalParams()},this._abortController?.signal),!e)throw us(D.FAST_JOIN_ERROR,`invalid-response`,`fast-join-response-empty`);if(!e.internalCallerParams)throw us(D.FAST_JOIN_ERROR,`invalid-response`,`fast-join-internal-caller-params-empty`,JSON.stringify(e));if(!e.conversationId)throw us(D.FAST_JOIN_ERROR,`invalid-response`,`fast-join-conversation-id-empty`,JSON.stringify(e))}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new O(D.CANCELED):e instanceof O?e:e instanceof Error?new O(D.FAST_JOIN_ERROR,{message:e.message}):new O(D.FAST_JOIN_ERROR,{message:String(e)})}try{let t=JSON.parse(e.internalCallerParams);if(z.has(e.conversationId))throw new O(D.HAS_ACTIVE_CALL);l={endpoint:t.endpoint,wt_endpoint:t.wtEndpoint,id:e.conversationId,is_concurrent:t.isConcurrent,client_type:t.clientType,stun_server:t.stun,turn_server:t.turn,token:new URL(t.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastJoin`,l),u=`fastJoin`}catch(e){throw e instanceof O?e:us(D.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 O(D.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),yo(l,u),l.id){if(z.has(l.id))throw new O(D.HAS_ACTIVE_CALL);z.reserve(l.id),this._reservedId=l.id}this._setConversationParams(l);let d=await this._connectSignaling(br.JOIN,l);return this._setConversation(l,d,Ha.JOINING),this._stats.lifecycle.markCallStarted(),d}async _prepareConversation(e,t=A.USER,n,r,i){W.setMark(H.SIGNALING_CONNECTED),this._debug.debug(`Conversation: push`,{conversationId:e,type:t,peerId:n});let a=this._api.getUserId();if(!a)throw new O(D.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:M.wssBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:M.wssToken}),l.token=n.token,l.endpoint=s,M.wtsBase&&(c=this._buildSignalingEndpoint({baseEndpoint:M.wtsBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:M.wssToken}),l.wt_endpoint=c)}else{let n=await this._getConversationParams(e);o=n.device_idx||0,s=i??this._buildSignalingEndpoint({baseEndpoint:M.wssBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:M.wssToken,conversationParams:n}),l.token=n.token,l.endpoint=s,l.device_idx=o,M.wtsBase&&(c=this._buildSignalingEndpoint({baseEndpoint:M.wtsBase,userId:a,type:t,deviceIdx:o,conversationId:e,token:M.wssToken,conversationParams:n}),l.wt_endpoint=c)}let u=await this._connectSignaling(br.ACCEPT,l);return z.callsLength>=M.maxParallelCalls||!M.hold&&z.callsLength>0?(this._debug.log(`Push rejected (busy)`),this._stats.logger.log(C.PUSH,`busy`),Promise.reject(new O(D.BUSY))):(this._setConversation(l,u,Ha.INCOMING,t),u)}_createParticipant(e,t,n=!0){let r=Object.assign({id:null,externalId:null,mediaSettings:E(),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;if(!i){let e=this._getParticipantId(t??r.id);e&&(r.externalId=e)}return n&&i&&this._api.cacheExternalId(t??r.id,r.externalId),t&&this._api.mapDecorativeId(t,r.id),r.observedIds?.length&&r.externalId&&(r.externalId.observer=!0),e.markers&&(r.markers=this._denormalizeMarkers(r.id,e.markers)),r.connectionStatus=no.create(r.connectionStatus),r}_getParticipantId(e){let t=this._api.userId(e);if(t)return t;let{compositeUserId:n,deviceIdx:r}=j.decomposeParticipantId(e),{id:i,type:a}=j.decomposeId(n);return a===A.GROUP?Q.fromId(String(i),void 0,r):null}_cacheParticipantExternalIds(e){e.forEach(e=>{let t=j.composeId(e),n=Q.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=j.composeDecorativeId(e),i=Q.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(r,t))}})}_setConversation(e,t,n,r=A.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 O(D.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=j.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||J.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&&(M.forceRelayPolicy=e.p2p_forbidden),this._stats.logger.log(C.RELAY_POLICY,M.forceRelayPolicy?`1`:`0`);let l=z.get(this._conversation.id);if(l&&l!==this)this._conversation.concurrent=!0;else if(!M.hold&&z.callsLength>0)throw new O(D.HAS_ACTIVE_CALL);this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new O(D.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||J.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 Zt(this._debug,this._stats.logger);return this.subscribe(e,Yt.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,Yt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new _o(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,G.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,G.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,G.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return this._stats.statAggregator.logEventualStat({name:H.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(Wa.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}_onConversationParticipantListChunk(e){let t=e.participants;t&&L.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=j.mapSharedParticipants(e.participants.reduce((e,n)=>{let r=j.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&&(M.externalUserType=n);let r=this._participants;for(let n of e){let e=j.composeId(n);if(R.test(`Conversation:RegisterParticipant`,e),this._isMe(e)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(this._debug.debug(`Local roles changed: ${n.roles}`),L.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],D.HUNGUP);continue}let i=j.composeDecorativeId(n);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(n,!0,!0),mediaSettings:E(n.mediaSettings),participantState:j.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}`),L.onRolesChanged(a.externalId,n.roles,!0,this.id)),a&&a.isOnHold&&L.onRemoteStatus([a.externalId],N.ONHOLD,null,this.id)}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let n=async()=>{let n=oo(e,Ya.MUTE),r=oo(e,Ya.MUTE_PERMANENT);for(let i of[n,r])i.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:i,stateUpdated:!0})};j.setImmediate(()=>n().catch(e=>this._debug.error(e)))}_remoteParticipantSessionState(e,t){if(!(!M.enableSessionStateUpdates||this._isMe(e)))return t}_buildConnectionStatus(e,t,n,r=!1){return no.create({transport:r?N.ONHOLD:no.fromTransportState(n)??N.WAITING,sessionState:this._remoteParticipantSessionState(e,t),sessionStateApplicable:this._isParticipantSessionStateApplicable(e)})}_isParticipantSessionStateApplicable(e){return M.enableSessionStateUpdates&&!this._isMe(e)&&this._conversation?.topology===J.SERVER}_setTransportStatus(e,t){return no.setTransport(e.connectionStatus,t)}_setSessionState(e,t){let n=no.setSessionStateApplicable(e.connectionStatus,this._isParticipantSessionStateApplicable(e.id));this._emitParticipantTransition(e,n);let r=e.connectionStatus.sessionStateApplicable&&e.id===this._activeSpeakerId&&e.connectionStatus.transport===N.CONNECTED,i=no.setSessionState(e.connectionStatus,t,r);return this._emitParticipantTransition(e,i),i}_emitParticipantTransition(e,t,n=null){t.shouldNotify&&L.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(e),r=this._getParticipantId(e),{deviceIdx:i}=j.decomposeParticipantId(e);return this._createParticipant({id:e,externalId:r?{...r,deviceIdx:i}:void 0},n,!1)}_getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId??null;if(M.useParticipantListChunk)return this._getExistedParticipantByIdOrCreate(e).externalId;let t=this._participants;if(t[e]?.externalId)return t[e].externalId;let n=this._api.getCachedExternalIdByParticipantId(e);if(n)return n;let r=this._getParticipantId(e);return r&&this._api.cacheExternalId(e,r),r}_getExternalIdsByParticipantIds(e){let t=[],n=[];return e.forEach(e=>{let r=this._getExternalIdByParticipantId(e);r?t.push(r):n.push(e)}),{externalIds:t,missingIds:n}}_reportMissingExternalIds(e,t){e.length&&this._onNonFatalError(`External ID mapping not found for participants "${Array.from(new Set(e)).join(`", "`)}" while handling ${t}`)}_reportMissingExternalIdsById(e,t){e.length&&this._onNonFatalError(`Participant ID mapping not found for external IDs "${Array.from(new Set(e)).join(`", "`)}" while handling ${t}`)}_registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(M.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=so(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=fo(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 da(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 wo(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===Ha.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 jo(this._transport),this.subscribe(this._volumesDetector,Ao.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new No(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,Mo.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Oo(this._mediaSource))}_createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Io(this._transport,this._volumesDetector,this._participants,this._debug,this._stats.logger))}_logDevices(){let e=T.getCameras().length,t=T.getMicrophones().length;this._debug.debug(`Cameras: `+e+(T.hasCameraPermission()?`✔`:`✖`)+`, Microphones: `+t+(T.hasMicrophonePermission()?`✔`:`✖`)),this._stats.logger.log(C.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===D.HUNGUP?this._setParticipantsStatus([e],N.HANGUP):this._setParticipantsStatus([e],N.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],L.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 En||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=j.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(t,!0,!0),mediaSettings:E(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],N.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(C.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}_onRemoveParticipant(e){this._debug.debug(`Remove participant [${e}]`);let t=[],n=this._participants;for(let r=0;r<=ds;r++){let i=n[j.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}for(let e of t)this._closeParticipantTransport(e.id);this._stats.logger.log(C.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(x.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(x.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(x.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)}toggleLocalVideo(e){return this._toggleLocalVideo(e)}toggleLocalAudio(e){return this._toggleLocalAudio(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=xa.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,N.WAITING),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._state===`ACTIVE`){let e=this._conversation?.direction===Ha.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(),L.onLocalStatus(N.ONHOLD,this.id),await e}async _resumeLocalMedia(e,t){this._restoreStateAfterHold(),await this._mediaSource?.resumeLocalMedia(e),L.onLocalStatus(t,this.id),this._mediaSource&&L.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?N.WAIT_FOR_ADMIN:N.WAITING_HALL}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[Pn(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=[],i=this._participants;for(let a of e){let e=typeof a.uid==`object`?a.uid:Q.fromId(a.uid),o=this._api.getCachedParticipantIdByExternalId(e);if(!o){let t=Q.toString(e);this._debug.log(`Unknown participant external ID ${t}`),r.push(e.id);continue}let s=Pn({participantId:o,mediaType:a.mediaType,streamName:a.streamName}),c=i[o];c?n.push(()=>{c.lastRequestedLayouts[s]=a}):this._isMe(o)&&n.push(()=>{this._myLastRequestedLayouts[s]=a}),kn(a)?(this._isMe(o)&&n.push(()=>{delete this._myLastRequestedLayouts[s]}),this._streamIdByStreamDescription.has(s)&&!this._cooldownTimestampByStreamDescription.has(s)&&this._cooldownTimestampByStreamDescription.set(s,Date.now())):(this._cooldownTimestampByStreamDescription.delete(s),!this._streamIdByStreamDescription.has(s)&&M.videoTracksCount>0&&this._streamIdByStreamDescription.set(s,null),t[s]=a),a.mediaType===V.SCREEN&&!kn(a)&&W.setMark(W.getMarkNameScreenshareFirstFrame(o))}if(r.length){this._reportMissingExternalIdsById(r,`updateDisplayLayout`);return}let a=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>M.videoTracksCount;){let e=a.next();if(e.done){this._debug.error(`Cannot accommodate all streaming requests: tracks available `+M.videoTracksCount+`; requested streams: `+Array.from(this._streamIdByStreamDescription.keys()));break}this._stopStreaming(e.value),t[e.value]={stopStream:!0}}if(this._transport?.getTopology()!==J.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=Fn(e),r=t[n.participantId],i=this._conversation?.externalId,a=this._isMe(n.participantId);if(r||a){switch(n.mediaType){case V.STREAM:case V.MOVIE:if(n.streamName){let e={stream:null,streamName:n.streamName,mediaType:n.mediaType};a?L.onLocalLive(i,e,this.id):L.onRemoteLive(r.externalId,e,this.id)}break;case V.CAMERA:L.onRemoteStream(r.externalId,null,this.id);break;case V.SCREEN:L.onRemoteScreenStream(r.externalId,null,this.id);break}this._stats.logger.log(C.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=Fn(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=Qa(t):(this._debug.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=Za.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 ps(`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]+ls>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 O(D.REMOVED))):(this._updateConversation(e),this._waitingHallHoldPending?(await this._signaling.hold(!0),await this._onJoinPart2(e,!1),this._waitingHallHoldPending=!1):z.getActive()&&M.hold?(await this._signaling.hold(!0),await this._onJoinPart2(e,!0,!0),this._waitingHallHoldPending=!1):await this._onJoinPart2(e))),L.onPromoted(e.demote,this.id)}_onChatRoomUpdated(e,t=0,n=[],r,i){this._debug.log(`Chat room updated: ${e}`);let a=[],o=[];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{let t=this._getExternalIdByParticipantId(e.id.id);t?a.push(t):o.push(e.id.id)}});let{externalIds:s,missingIds:c}=this._getExternalIdsByParticipantIds(r??[]);o.push(...c);let{externalIds:l,missingIds:u}=this._getExternalIdsByParticipantIds(i??[]);o.push(...u),this._reportMissingExternalIds(o,`CHAT_ROOM_UPDATED`),L.onChatRoomUpdated(e,t,a,s,l,this.id)}_onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let n of e.data)if(this._isMe(n.participantId))L.onLocalLiveUpdate(t,n,this.id);else{let e=this._getExternalIdByParticipantId(n.participantId);e&&L.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))L.onLocalSharedMovieInfo(n,e,t,this.id);else{let n=this._getExternalIdByParticipantId(e.initiatorId);n&&L.onRemoteSharedMovieInfo(n,e,t,this.id)}}_processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(e=>this._isMe(j.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&&L.onAsrSet({externalId:e,movieId:r.movieId},n,this.id)}else n&&L.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&&L.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))L.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)),L.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&&L.onRemoteSharedUrl(e,i,a,this.id)}}_onFeaturesPerRoleChanged(e){this._debug.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),L.onFeaturesPerRoleChanged(e.featuresPerRole,this.id)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let t=this._getStreamDescriptionById(e.streamId);if(t){let e=Fn(t),n=this._getParticipant(e.participantId);L.onRemoteScreenStream(n.externalId,null,this.id);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:n,participantId:r}=t;if(n===V.ANIMOJI)return;let i=this._getParticipant(r);if(n===V.SCREEN&&!e.fastScreenShare){this._debug.log(`skipping participant-sources-update notification since screenshare will be received over datachannel`);return}let a=Pn(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(C.PAT_OUTDATED_RESPONSE);return}i&&e.suspend!==void 0&&n&&(this._debug.debug(`participant-sources-update: mediaType=${n}, suspend=${e.suspend}`),L.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(C.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(C.PAT_ERROR,`streamNotFound`),this._debug.error(`Could not find stream by ID: ${s}`);return}this._stats.logger.log(C.PAT_ALLOCATED),this._streamIdByStreamDescription.set(a,s);let l=e.participantStreamDescription?.mediaType;if(l===V.STREAM||l===V.MOVIE){if(e.participantStreamDescription?.streamName){let t={streamName:e.participantStreamDescription.streamName,stream:c,mediaType:l};n?L.onLocalLive(o,t,this.id):L.onRemoteLive(o,t,this.id)}}else l===V.SCREEN?L.onRemoteScreenStream(i.externalId,c,this.id):n||L.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(Pn(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(Pn(e)))return e}else{let e={participantId:t,mediaType:V.CAMERA};if(this._streamIdByStreamDescription.has(Pn(e)))return e;let n={participantId:t,mediaType:V.SCREEN};if(this._streamIdByStreamDescription.has(Pn(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?j.includesOneOf(this._conversation.roles,[$a.ADMIN,$a.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!j.includesOneOf(this._conversation.roles,[$a.ADMIN,$a.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()===J.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===J.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Ja(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=ao(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=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}=this._resolveWaitingHallExternalIds(a,`getWaitingHall`),s=null;return a.length&&i.hasMore&&(s=io(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}_resolveWaitingHallExternalIds(e,t){let n=[],r=[],i=[];return e.length&&e.forEach(e=>{if(e.externalId){let t=Q.fromSignaling(e.externalId);n.push(e.id.addedTs),r.push(t),this._api.cacheExternalId(e.id.id,t)}else{let t=this._getExternalIdByParticipantId(e.id.id);t?(r.push(t),n.push(e.id.addedTs)):i.push(e.id.id)}}),this._reportMissingExternalIds(i,t),{externalIds:r,timestamps:n}}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}=this._resolveWaitingHallExternalIds(t,`getAudienceModeHands`);return{timestamps:r,participants:n,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!j.includesOneOf(this._conversation.options,[Ka.WAITING_HALL,Ka.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<M.videoMinWidth||e.height<M.videoMinHeight)throw Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<M.videoMinWidth||t.height<M.videoMinHeight)throw Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");M.videoEffectMaxHeight=t.height,M.videoEffectMaxWidth=t.width}M.videoMaxWidth=e.width,M.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:M.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 j.mapSharedParticipants(r.map(e=>{let t=j.composeId(e);return this._createParticipant({id:t,externalId:Q.fromSignalingParticipant(e,!0,!0),mediaSettings:E(e.mediaSettings),participantState:j.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)},j.composeDecorativeId(e))}))}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[j.composeId(e)]);await this._registerParticipants(i);let a=this._transport?.getState();return n.participants.forEach(e=>{let t=j.composeId(e),n=r[t];this._updateParticipantExternalId(n,e),this._setSessionState(n,this._remoteParticipantSessionState(t,e.sessionState)),n.isOnHold||this._setTransportStatus(n,no.fromTransportState(a)??N.WAITING),n.movieShareInfos=e.movieShareInfos,Object.assign(n.mediaSettings,E(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=M.participantListChunkInitIndex,t=M.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===k.audio&&this._mediaSource&&(this._audioFix=new _o(this._mediaSource,this._debug,this._stats.logger)),L.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;L.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){L.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.externalId?L.onRemoteMediaSettings(r.externalId,t,r.markers,this.id):this._reportMissingExternalIds([e],`REMOTE_MEDIA_SETTINGS`)),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(n=>n.id===t||j.comparePeerId(n.peerId,e.peerId))}_changeLocalParticipantState(e){this._debug.debug(`Local participant state force changed by admin`,e),[`ACTIVE`,`HELD`].includes(this._state)&&L.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)&&(n.externalId?L.onRemoteParticipantState(n.externalId,n.participantState,n.markers,this.id):this._reportMissingExternalIds([e],`REMOTE_PARTICIPANT_STATE`))}_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&&L.onLocalParticipantState(r,!0,this.id),n.length&&L.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}`),L.onRolesChanged(e.externalId,e.roles,!0,this.id))}_onSignalingNotification(e){switch(e.notification){case K.ACCEPTED_CALL:return this._onAcceptedCall(e);case K.HUNGUP:return this._onHungup(e);case K.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case K.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case K.CLOSED_CONVERSATION:return this._onClosedConversation(e);case K.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case K.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case K.SESSION_STATE:return this._onSessionState(e);case K.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case K.RATE_CALL_DATA:return this._onNeedRate();case K.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case K.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case K.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case K.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case K.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case K.REGISTERED_PEER:return this._onPeerRegistered(e);case K.SWITCH_MICRO:return this._onMicSwitched(e);case K.CHAT_MESSAGE:return this._onChatMessage(e);case K.CUSTOM_DATA:return this._onCustomData(e);case K.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case K.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case K.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case K.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case K.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case K.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case K.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case K.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case K.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case K.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case K.FEEDBACK:return this._onFeedback(e);case K.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case K.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case K.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case K.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case K.ROOMS_UPDATED:return this._onRoomsUpdated(e);case K.ROOM_UPDATED:return this._onRoomUpdated(e);case K.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case K.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case K.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case K.ASR_STARTED:return this._onAsrStart(e);case K.ASR_STOPPED:return this._onAsrStop(e);case K.PROMOTION_APPROVED:return this._onPromotionApproved(e);case K.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case K.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e);case K.HOLD:return this._onParticipantHold(e);case K.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}L.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=j.composeId(n),i=n.roles||[];if(this._isMe(e)){eo(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:uo(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=E(n.mediaSettings);Kt(t,a.mediaSettings)||this._changeRemoteMediaSettings(e,t);let r=j.mapParticipantState(n),o=a.participantState;j.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),eo(i,a.roles)||this._onRolesChanged(a.id,i),!!n.onHold!=!!a.isOnHold&&(a.isOnHold=!!n.onHold,this._setParticipantsStatus([a],n.onHold?N.ONHOLD:N.CONNECTED))}}let i=this._participants;for(let e of n)r.indexOf(e)<0&&i[e]&&this._removeParticipant(i[e],D.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=j.composeMessageId(e),n=j.getPeerIdString(e.peerId);if(this._debug.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){if(this._conversation.concurrent)return;this._close(new O(D.MISSED),{errorText:`Call accepted on other device`});return}this._conversation?.direction===Ha.OUTGOING&&!this._conversation.concurrent&&this._stats.lifecycle.markOutgoingAccepted();let r=this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t);r=this._registerParticipantInCache(this._createParticipant({id:t,externalId:e.externalId?Q.fromSignaling(e.externalId,e.deviceIdx):void 0,mediaSettings:E(e.mediaSettings)},n))}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=E(e.mediaSettings),this._logWithMediaSettings(C.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===Ha.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);if(i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),[`ACTIVE`,`HELD`].includes(this._state)){if(!r.externalId){this._reportMissingExternalIds([t],`ACCEPTED_CALL`);return}L.onAcceptedCall(r.externalId,Ca.parseCapabilities(e.capabilities),this.id)}}async _onHungup(e){this._debug.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=j.composeMessageId(e);if(this._conversation&&this._isMe(t)){let t={remote:!0,callError:e.callError,message:void 0};e.reason===D.OBSOLETE_CLIENT&&e.errorCode&&(t.message=e.errorCode),this._close(new O(e.reason,t));return}this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}if(this._closeParticipantTransport(t),n.state=e.reason===D.REJECTED?Z.REJECTED:Z.HUNGUP,this._state!==`CLOSE`){let t=e.reason===D.OBSOLETE_CLIENT?D.OBSOLETE_CLIENT:D.HUNGUP;this._removeParticipant(n,t)}}_onSessionState(e){if(!M.enableSessionStateUpdates)return;let t=j.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=no.fromTransportState(this._transport?.getState());e&&this._setTransportStatus(n,e)}this._setSessionState(n,{connected:e.connected})}async _reconcileParticipantSessionStates(e){if(!M.enableSessionStateUpdates||!e.length)return;let t=this._participants;for(let n of e){let e=j.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||L.onRemoteStatus([e.externalId],e.connectionStatus.lastEffective,null,this.id)}async _onAddedParticipant(e){this._debug.debug(`Participant added [${e.participantId}]`);let t=j.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=j.composeDecorativeId(r);this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(r,!0,!0),mediaSettings:E(r.mediaSettings),state:r.state,participantState:j.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=E(e.participant?.mediaSettings),n.participantState=j.mapParticipantState(e.participant),n.roles=e.participant?.roles||[],this._updateParticipantSessionState(n,t,e.participant.sessionState),this._setParticipantsStatus([n],N.WAITING),r&&this._emitParticipantEffectiveStatusIfSessionOverridesTransport(n),this._state!==`IDLE`&&this._transport&&this._allocateParticipantTransport(n.id,!0),L.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=j.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=j.composeDecorativeId(r);this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(r,!0,!0),mediaSettings:E(r.mediaSettings),state:r.state,participantState:j.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===Ha.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=Z.ACCEPTED,n.mediaSettings=E(e.mediaSettings),n.participantState=j.mapParticipantState(e.participant),n.roles=e.participant.roles||[],this._updateParticipantSessionState(n,t,e.participant.sessionState),e.participant.onHold?(n.isOnHold=!0,this._setParticipantsStatus([n],N.ONHOLD)):this._transport?.isAllocated(n.id)?this._setParticipantsStatus([n],N.CONNECTED):this._setParticipantsStatus([n],N.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)),L.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 O(e.reason,{remote:!0,callError:e.callError}))}_onMediaSettingsChanged(e){let t=j.composeMessageId(e);this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteMediaSettings(t,E(e.mediaSettings))}async _onParticipantStateChanged(e){let t=j.composeMessageId(e),n=j.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)?j.mapParticipantState({participantState:t}):void 0]);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(),L.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource||this._state===`HELD`)return;let t=this._mediaSource.mediaSettings,n=E(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=Ar(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===V.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=Ar(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){this._registeredPeerReceived=!0,this._clearCalleeUnavailableWatchdog();let t=j.composeMessageId(e),n=this._getParticipant(t);n&&(n.clientType=e.clientType,n.platform=e.platform,L.onPeerRegistered(this.id,[n.externalId]))}async _onMicSwitched(e){L.onDeviceSwitched(S.AUDIO,!e.mute,this.id),await this.toggleLocalAudio(!e.mute)}_onChatMessage(e){let t=j.composeMessageId(e),n=this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}L.onChatMessage(e.message,n,e.direct,this.id)}_onCustomData(e){if(Object.hasOwn(e.data,`sdk`))return;let t=j.composeMessageId(e),n=this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}L.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?L.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);L.onRecordStopped(n,t??null,this.id)}else L.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&&L.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?L.onRecordStarted(n,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e,this.id):this._warnParticipantNotInConversation(t.initiator)}else L.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&&L.onAsrSet({externalId:n,movieId:t.movieId},e,this.id)}else L.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&&L.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}L.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}L.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),L.onAsrStopped(t,this.id)}_onAsrTranscription(e){if(!this._conversation)return;let t=this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}L.onAsrTranscription(t,e.text,e.timestamp,e.duration,this.id)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!eo(this._conversation.roles,t)){this._debug.debug(`Local roles changed: ${t}`),this._conversation.roles=t,L.onLocalRolesChanged(t,!1,this.id),this._processMuteState({mediaOptions:oo(this._getMuteStatesForCurrentRoom(),Ya.MUTE_PERMANENT),stateUpdated:!0}),j.includesOneOf(t,[$a.ADMIN,$a.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=this._getParticipant(e);n&&!eo(n.roles,t)&&(this._debug.debug(`Roles for participant [${e}] changed: ${t}`),n.roles=t,L.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;L.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&&L.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!==Ya.MUTE&&i!==Ya.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===Ya.MUTE_PERMANENT&&!n&&(l[e]=Ya.MUTE),!(!t.includes(e)||r)))switch(e){case S.VIDEO:u.isVideoEnabled&&(L.onDeviceSwitched(S.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case S.AUDIO:u.isAudioEnabled&&(L.onDeviceSwitched(S.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case S.SCREEN_SHARING:u.isScreenSharingEnabled&&(L.onDeviceSwitched(S.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case S.AUDIO_SHARING:u.isAudioSharingEnabled&&(L.onDeviceSwitched(S.AUDIO_SHARING,!1,this.id),await this.toggleScreenCapturing({captureScreen:u.isScreenSharingEnabled,fastScreenSharing:u.isFastScreenSharingEnabled,captureAudio:!1}));break}}L.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))L.onLocalPin(!0,r,this.id);else{let t=this._getExternalIdByParticipantId(i);t&&L.onPinnedParticipant(t,!0,this._denormalizeMarkers(e,n),r,this.id)}if(this._isMe(e))L.onLocalPin(t,r,this.id);else{let i=this._getExternalIdByParticipantId(e);i&&L.onPinnedParticipant(i,t,this._denormalizeMarkers(e,n),r,this.id)}this._conversation.pinnedParticipantIdByRoom.set(r,t?null:e)}_onOptionsChanged(e){this._conversation&&!qa(this._conversation.options,e)&&(this._conversation.options=e,L.onOptionsChanged(e,this.id),e.includes(Ka.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&L.onLocalStatus(N.WAITING_HALL,this.id):e.includes(Ka.WAIT_FOR_ADMIN)&&this._conversation.restricted&&L.onLocalStatus(N.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,$r.getInstance().value=i,L.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),L.onNetworkStatusChanged(t,this.id)}}async _emitHeldParticipantsStatus(){let e=Object.values(this._participants).filter(e=>e.isOnHold).map(e=>e.externalId);e.length&&L.onRemoteStatus(e,N.ONHOLD,null,this.id)}async _onRemoteStreamSecond(e,t){let n=this._getParticipant(e);n&&L.onRemoteScreenStream(n.externalId,t,this.id)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){L.onVmojiStream(t,this._mediaSource.mediaSettings,this.id);return}let n=this._getParticipant(e);n&&L.onRemoteVmojiStream(n.externalId,t,this.id)}_onAnimojiError(e){try{let t=this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,L.onVmojiError({...e,externalId:t},this.id))}catch(e){this._debug.warn(`_onAnimojiError failed`,e)}}_onPeerConnectionClosed(e){this._state!==`HELD`&&(e===J.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy())}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(Ga.ADD_PARTICIPANT);L.onCallState(e,t,this._conversation,this.id)}}_changeFeaturesPerRole(){this._conversation&&L.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{},this.id)}_changeNeedRate(){this._conversation&&this._conversation.needRate&&L.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})}L.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=no.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&&(L.onSpeakerChanged(n.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}}async _onTransportStateChanged(e,t){this._debug.debug(`Transport state has changed: ${t}`,e);let n=no.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===q.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===q.CONNECTED&&(T.releaseFirefoxMicrophonePermissionWarmup(),L.onLocalStatus(N.CONNECTED,this.id),this._transport?.getTopology()===J.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e),this._displayLayoutRequester.resend()}this._state!==`HELD`&&((e===q.CONNECTING||e===q.RECONNECTING)&&this._areTransportParticipantsOnHold()||(e===q.CONNECTING&&L.onLocalStatus(N.CONNECTING,this.id),e===q.RECONNECTING&&L.onLocalStatus(N.RECONNECT,this.id),e===q.FAILED&&this._transport&&this._transport.allocated().length===0&&this._close(new O(D.FAILED,{callError:{scope:`network`,source:`rtc`,code:`connection-failed`,description:`transport-failed`}}),{errorText:`Transport failed`,signalingReason:D.FAILED})))}_areTransportParticipantsOnHold(){if(!M.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(Yr.AUDIO_MIX))this._debug.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),L.onRemoteMixedAudioStream(t,this.id);else if(e.startsWith(Yr.TRANSPARENT_AUDIO_TRACK_PREFIX))this._debug.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(Yr.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);this._debug.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${t}]`),this._registerParticipant({id:e},t),r=this._getParticipant(e),this._setParticipantsStatus([r],N.WAITING),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(L.onSpeakerChanged(r.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(r.id)&&this._allocateParticipantTransport(r.id,!1),n.kind===k.audio&&(this._audioOutput.add(e,n),M.preserveAudioTracks||(r.remoteAudioTrack=n,t.removeTrack(n))),r.remoteStream!==t&&t.getTracks().length){if(r.remoteStream=t,r.secondStream)return;L.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 k.audio:this._removeAudioTrack(e,t,n);break;case k.video:case k.screen:this._removeVideoTrack(e,t,n);break}}async _removeAudioTrack(e,t,n){if(e!==Yr.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===J.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation){this._conversation.topology=e;for(let e of Object.values(this._participants)){let t=no.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),L.onLocalStatus(e?N.RECONNECT:N.CONNECTED,this.id))}_onRemoteSignalledStall(e){let t={},n=[],r=[];this._debug.debug(`Participants stalled:`,e);let i=this._participants;for(let r of e){t[r]=!0;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._setParticipantsStalled(n,!0),r.length&&this._setParticipantsStalled(r,!1),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){!T.hasMicrophone()||!this._audioFix||!this.mediaSettings?.isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!T.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}),L.onJoinStatus(t,e,this.id))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()===J.SERVER&&e.length)try{await this.updateDisplayLayout(e)}catch(e){this._debug.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){this._updateParticipantsStatus(e,e=>e.isOnHold&&![N.ONHOLD,N.HANGUP,N.ERROR].includes(t)?null:this._setTransportStatus(e,t),n)}_setParticipantsStalled(e,t){this._updateParticipantsStatus(e,e=>no.setStalled(e.connectionStatus,t))}_updateParticipantsStatus(e,t,n=null){let r=e.reduce((e,n)=>{let r=t(n);if(r?.shouldNotify){var i;(e[i=r.status]??(e[i]=[])).push(n.externalId)}return e},{});for(let[e,t]of Object.entries(r))L.onRemoteStatus(t,e,n,this.id)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),L.onJoinLinkChanged(e.joinLink,this.id)}_onRoomsUpdated(e){if(this._isCalledState())return;let t={},n=[],r=[];for(let i of Object.keys(Xa)){let a=e.updates[i];a&&(a?.rooms?.forEach(e=>{let{room:t,missingParticipantIds:i}=this._convertRoomToExternal(e);t&&n.push(t),r.push(...i)}),t[i]={rooms:n,roomIds:a?.roomIds,deactivated:a?.deactivated})}this._reportMissingExternalIds(r,`ROOMS_UPDATED`),L.onRoomsUpdated(t,this.id)}_onRoomUpdated(e){let{room:t,missingParticipantIds:n}=this._convertRoomToExternal(e.room||null);e.events.some(e=>e===Xa.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()||(this._reportMissingExternalIds(n,`ROOM_UPDATED`),L.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null,this.id))}_convertRoomToExternal(e){if(!e)return{room:null,missingParticipantIds:[]};let t=[],{externalIds:n,missingIds:r}=this._getExternalIdsByParticipantIds(e.participantIds??[]),{externalIds:i,missingIds:a}=this._getExternalIdsByParticipantIds(e.addParticipantIds??[]),{externalIds:o,missingIds:s}=this._getExternalIdsByParticipantIds(e.removeParticipantIds??[]);t.push(...r,...a,...s);let c;if(e.pinnedParticipantId){let n=this._getExternalIdByParticipantId(e.pinnedParticipantId);n?c=n:t.push(e.pinnedParticipantId)}return{room:{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:n,addParticipantIds:i,removeParticipantIds:o,participants:e.participants?.participants?this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:c,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs},missingParticipantIds:t}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=[],{externalIds:i,missingIds:a}=this._getExternalIdsByParticipantIds(e.addedParticipantIds??[]);r.push(...a);let o=e.addedParticipants;if(i.length&&o?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);o=(await this._signaling.getParticipants(e)).participants}let s=o?.map(e=>{let r=j.composeId(e);return this._createParticipant({id:r,externalId:Q.fromSignalingParticipant(e,!0,!0),mediaSettings:E(e.mediaSettings),participantState:j.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},j.composeDecorativeId(e))})||[],c=!1;for(let e of s)e.id===this._conversation?.compositeUserId&&(c=!0),this._registerParticipantInCache(e);this._transport?.getState()===q.IDLE&&!this._isCalledState()&&this._openTransport(s,!0);let l=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);e?l.push(e):r.push(t.GRID.id)}}if(this._reportMissingExternalIds(r,`ROOM_PARTICIPANTS_UPDATED`),c&&await this._onRoomSwitched(n),l){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=this._getExternalIdByParticipantId(e);if(t){for(let e of l)if(Q.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let u={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:j.mapSharedParticipants(s),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:l};this._isCalledState()||L.onRoomParticipantsUpdated(u,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()){L.onRoomStart(e,this.id);return}this._isCalledState()||L.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[j.composeId(t)])||[],!0);let{room:n}=this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&L.onRoomsUpdated({[Xa.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)}L.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);L.onParticipantIdChanged(a,o,this.id);let s=j.compose(n,a.deviceIdx),c=j.compose(t,a.deviceIdx);if(this._api.cacheExternalId(s,o),this._api.mapDecorativeId(s,c),i)this._conversation.externalId=o;else{let e=this._participants;e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==J.SERVER||(this._debug.debug(`Video suspend suggested`,e),L.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],N.ONHOLD);else{let e=this._transport?.getTopology()===J.DIRECT?N.CONNECTING:N.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()===J.SERVER&&this._transport?.getState()===q.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]}},fs=null,ps=class e extends Error{constructor(t,n){super(t),h(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},ms=null,hs=null,gs=64*1024;function _s(){ms=null,hs=null}function vs(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function ys(e=null,t){let n=vs(e??M.apiBaseUrl);if(n)return n;if((t??M.apiEnv)!==`AUTO`)return M.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 R.debug(`Resolved API endpoint`,t),t}catch(e){return R.warn(`Failed to resolve API endpoint using DNS, default is used`,e),M.apiEndpoint(t)}}async function bs(){return ms||hs||(hs=ys(),ms=await hs,hs=null,ms)}async function xs(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await bs();let r=Ds(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${ms}/fb.do`,i)}async function Ss(e,t={},n=!1,r){return await bs(),ws(Ds(e,t,n),r)}async function Cs(e,t={},n=!1){await bs();let r=Ds(e,t,n);return ws(r,void 0,new Blob([r]).size<=gs)}async function ws(e,t,n=!1){let r=`${t??ms}/fb.do`,i=new AbortController,a=new O(x.NETWORK,{callError:{scope:`network`,source:`api`,code:`timeout`,description:`request-timeout`}}),o=setTimeout(()=>i.abort(a),M.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&&!Ts(o))throw new O(x.API,{callError:{scope:`server`,source:`api`,code:`http-${t.status}`,description:`http-error`}});if(Ts(o))throw o;return o}catch(e){throw e instanceof O?e:i.signal.aborted?a:Ts(e)?e:new O(x.NETWORK,{callError:{scope:`network`,source:`api`,code:`fetch-failed`,description:`request-failed`}})}finally{clearTimeout(o)}}function Ts(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.error_code==`number`&&typeof t.error_msg==`string`}async function Es(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();R.debug(`Form data sent successfully`,r)}catch(e){throw R.warn(`Failed to send form data`,e),e}}function Ds(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=M.apiKey),n||(y.sessionKey?t.session_key=y.sessionKey:y.accessToken&&(t.access_token=y.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 Os=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){}getCachedParticipantIdByExternalId(e){return null}getCachedExternalIdByParticipantId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}hangupConversation(e,t=D.HUNGUP,n){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}async getInbounds(){return[]}},ks=class e{constructor(){h(this,`_participantIdToExternalId`,new Map),h(this,`_externalIdToParticipantId`,new Map),h(this,`_decorativeIdToInitialId`,new Map),h(this,`_initialIdToDecorativeId`,new Map)}static _normalizeType(e){return e.type===ro.GROUP?{...e,type:ro.USER}:e}getExternalId(e){let t=this._initialIdToDecorativeId.get(e)??e,n=this._participantIdToExternalId.get(t);return n==null?null:Q.fromString(n)}getParticipantId(t){let n=Q.toString(e._normalizeType(t)),r=this._externalIdToParticipantId.get(n);return r==null?null:this._decorativeIdToInitialId.get(r)??r}cache(t,n){let r=e._normalizeType(n),i=Q.toString(r);this._participantIdToExternalId.set(t,i),this._externalIdToParticipantId.set(i,t)}mapDecorativeId(e,t){this._decorativeIdToInitialId.set(e,t),this._initialIdToDecorativeId.set(t,e)}unmapDecorativeId(e){let t=this._initialIdToDecorativeId.get(e);t&&this._decorativeIdToInitialId.delete(t),this._initialIdToDecorativeId.delete(e)}getDecorativeIdByInitialId(e){return this._initialIdToDecorativeId.get(e)}clear(){this._participantIdToExternalId.clear(),this._externalIdToParticipantId.clear(),this._decorativeIdToInitialId.clear(),this._initialIdToDecorativeId.clear()}},As=`anonymLogin:`,js=700,Ms=3e3;function Ns(e){let t=e.error_code;switch(t){case 2:return Ps(D.SERVICE_UNAVAILABLE,t,`service-unavailable`);case 4:return e.error_msg.includes(`participants.limit.exceeded`)?Ps(D.PARTICIPANT_LIMIT_REACHED,t,`participants-limit-exceeded`):Ps(x.API,t,`request-error`);case 300:return Ps(D.NOT_FOUND,t,`not-found`);case 1101:return Ps(D.SERVICE_DISABLED,t,`vchat-service-disabled`);case 1102:return Ps(D.CALLEE_IS_OFFLINE,t,`target-user-unavailable`);case 1103:return Ps(D.NOT_FRIENDS,t,`friendship-required`);case 1104:return Fs(t,`youla-api-error`);case 1106:return Fs(t,`vk-api-error`);case 1113:return Ps(D.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 Ps(r?D.OBSOLETE_CLIENT:D.VCHAT_DETAILED_ERROR,t,n??`detailed-error`,r?n:void 0)}default:return Ps(x.API,t,`api-error`)}}function Ps(e,t,n,r){return{type:e,callError:{scope:`server`,source:`api`,code:t,description:n},message:r}}function Fs(e,t){return{type:D.EXTERNAL_API_ERROR,callError:{scope:`external`,source:`api`,code:e,description:t}}}var Is=class extends Os{constructor(...e){super(...e),h(this,`_uuid`,void 0),h(this,`_idCache`,new ks)}async _callUnsafe(e,t={},n=!1){let r=async i=>{try{return await Ss(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(R.debug(`${e} network error, attempt ${i}: ${n.join(`
|
|
14
|
-
`)}`),this._abortSignal?.aborted&&(R.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),i<M.apiMaxAttempt)return await j.delay(Math.min(i*js,Ms),{signal:this._abortSignal}),r(i)}throw R.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(R.warn(`Api call error`,i),i instanceof O)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),Ls(i)){let e=Ns(i);throw a.callError=e.callError,a.message=e.message??a.message,new O(e.type,a)}throw new O(x.API,a)}}userId(e){if(y.isEmpty()){let{compositeUserId:t}=j.decomposeParticipantId(e),{id:n}=j.decomposeId(t);return Q.fromId(String(n))}return this._idCache.getExternalId(e)}async authorize(){if(this._ensureUuid(),!M.apiKey)throw new O(x.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:M.apiClientVersion,client_type:`SDK_JS`}};return M.authToken&&(t.session_data.auth_token=M.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 O?e:(e?.error_code===401&&(this._removeCachedAnonymLogin(),L.onTokenExpired()),new O(x.AUTH,{message:e?.error_msg,code:e?.error_code,callError:{scope:`server`,source:`api`,code:e?.error_code??`authentication`,description:`authentication-failed`}}))})}_getAnonymLoginCacheKey(){return M.authToken?`${As}${M.authToken}`:null}_getCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();if(!e)return null;let t=st.get(e);return Rs(t)?t:(t&&st.remove(e),null)}_setCachedAnonymLogin(e){let t=this._getAnonymLoginCacheKey();!t||!Rs(e)||st.set(t,{session_key:e.session_key,session_secret_key:e.session_secret_key,uid:e.uid})}_removeCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();e&&st.remove(e)}_reauthorize(){return this._removeCachedAnonymLogin(),y.reauthorize(()=>this.authorize())}_applyAnonymLogin(e){e.uid&&(y.userId=Number(e.uid)),y.sessionKey=e.session_key,y.sessionSecretKey=e.session_secret_key}async _sendClientStats(e,t=!0){try{(await Cs(`vchat.clientStats`,e))?.items_responses?.forEach(e=>{e.errors&&R.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:M.appVersion,sdk_type:`WEB`,sdk_version:M.sdkVersion,version:1,items:e};M.clientStatsPlatform&&(t.platform=M.clientStatsPlatform);let n={data:JSON.stringify(t)};this._sendClientStats(n).catch(e=>R.error(`[vchat.clientStats]`,e))}async uploadDebugLogs(e,t,n,r){let i={conversationId:e,webrtcPlatform:M.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()),Es(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:M.protocolVersion,capabilities:Ca.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 Ua.USER:u.uids=t.join(`,`);break;case Ua.GROUP:u.gid=t[0];break;case Ua.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=st.get(`uuid`);e||(e=j.uuid(),st.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:M.protocolVersion};return r&&(d.createJoinLink=!0),n&&(d.payload=n),M.domain&&(d.domainId=M.domain),M.externalDomain&&(d.externalDomain=M.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 y.userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:M.protocolVersion,capabilities:Ca.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),M.anonymToken&&(i.anonymToken=M.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}getCachedParticipantIdByExternalId(e){return this._idCache.getParticipantId(e)}getCachedExternalIdByParticipantId(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)}async getConversationParams(e){let t={};return M.anonymToken&&(t.anonymToken=M.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return y.userId}setUserId(e){y.userId=e}hangupConversation(e,t=D.HUNGUP,n){let r={conversationId:e,reason:t};M.anonymToken&&(r.anonymToken=M.anonymToken),n?.peerId&&(r.peerId=n.peerId),xs(`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 Ls(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}function Rs(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 zs=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(zs||{}),Bs=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),Vs=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}},Hs=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=j.uuid(),this._apiKey=t,this._callToken=n,this._apiEnv=e,this._baseApiUrl=r}async authorize(){let e=await Ss(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:M.apiClientVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await ys(this._baseApiUrl,this._apiEnv));return j.isObject(e)&&!(`error_msg`in e)?(this._sessionKey=e.session_key,!0):!1}async hangupConversation(e,t){let n={conversationId:e,reason:D.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey};t?.peerId&&(n.peerId=t.peerId),await Ss(`vchat.hangupConversation`,n,!0,await ys(this._baseApiUrl,this._apiEnv))}},Us,Ws=null,Gs={getCameras:T.getCameras,getMicrophones:T.getMicrophones,getOutput:T.getOutput,getVideoFacingMode:T.getVideoFacingMode,hasCamera:T.hasCamera,hasMicrophone:T.hasMicrophone,getSavedCamera:T.getSavedCamera,getSavedMicrophone:T.getSavedMicrophone,getSavedOutput:T.getSavedOutput,hasCameraPermission:T.hasCameraPermission,hasMicrophonePermission:T.hasMicrophonePermission,hasPermissions:T.hasPermissions,getUserMedia:T.getUserMedia,getUserVideo:T.getUserVideo,getUserAudio:T.getUserAudio,setResolution:T.setResolution,isBrowserSupported:T.isBrowserSupported,isScreenCapturingSupported:T.isScreenCapturingSupported,os:T.os,isMobile:T.isMobile,browserName:T.browserName,browserVersion:T.browserVersion,baseChromeVersion:T.baseChromeVersion,getAudioContext:T.getAudioContext,isAudioShareSupported:T.isAudioShareSupported},Ks={participantMarkerCompare:j.participantMarkerCompare};function qs(e){Ws=e}function Js(e){M.videoEffects=e}function Ys(e){M.audioEffects=e}function Xs(e,t={}){M.vad=e,M.vadOptions=t}function Zs(e,t=null,n={},r=1){M.vmoji=e,M.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function Qs(e){M.set(e),Us||(Us=new Is),c.default.disableLog(!M.debug),R.toggle(M.debug),R.log(`Calls SDK ${M.sdkVersion}`,e),await T.init();let t=T.getBrowserSupportFailure();if(t)throw new O(x.UNSUPPORTED,{callError:{scope:`internal`,code:`environment`,description:t}});R.log(`UserAgent:`,navigator.userAgent),R.log(`Screen resolution:`,`${window.screen.width}x${window.screen.height}`),R.log(`Permissions:`,`Camera: ${T.hasCameraPermission()}, Mic: ${T.hasMicrophonePermission()}`),R.log(`Simulcast:`,`${e.simulcast} => ${M.simulcast}`)}async function $s(e,t=[S.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),tc([],Ua.USER,t,n,r,i,a,c,o,s)}function ec(e,t=[]){let n=e.getIncomingCallerExternalId();return n?t.length===1&&t[0].id===n.id&&t[0].type===n.type:!1}async function tc(e,t=Ua.USER,n,r=``,i=!1,a=!1,o,s,c,l){if(!M.hold&&z.getActive())throw R.error(`There is already active call`),new O(D.HAS_ACTIVE_CALL);let u=z.getAll().find(e=>e.isIncomingRinging);if(!M.hold&&u&&!ec(u,s))throw R.error(`There is already incoming call`),new O(D.HAS_ACTIVE_CALL);return new $(new Is,Ws).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function nc(e,t){return rc(e,A.USER,void 0,t)}async function rc(e,t=A.USER,n,r,i,a){if(e===$.id())throw Error(`Push has already been processed`);return new $(new Is,Ws).onPush(e,t,n,r,i,a)}async function ic(){return Us.getInbounds()}async function ac(e,t){return e&&(M.authToken=e),t!==void 0&&M.apiBaseUrl!==t&&(M.apiBaseUrl=t,_s()),Us.authorize()}async function oc(e=[S.AUDIO],t){return jl(t).accept(e)}async function sc(e){let t=Ol(e?.conversationId);if(t)return t.decline(e)}async function cc(e,t=[S.AUDIO]){return lc(e,t)}async function lc(e,t,n){if(!M.hold&&z.callsLength>0)throw R.error(`There is already active call`),new O(D.HAS_ACTIVE_CALL);return new $(new Is,Ws).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function uc(e,t=[S.AUDIO],n,r,i,a){if(!M.hold&&z.callsLength>0)throw R.error(`There is already active call`),new O(D.HAS_ACTIVE_CALL);return n&&(M.anonymToken=n),new $(new Is,Ws).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a,anonymous:!!M.anonymToken})}function dc(e){let t=Ol(e?.conversationId);return t?t.hangup(e):($.hangupAfterInit(e?.onFastHangup),Promise.resolve())}async function fc(e,t){let n=Array.isArray(e)?e:[e],r=$.current();r&&await r.addParticipant(n,t)}async function pc(e,t){let n=$.current();if(n){let r=e.map(e=>j.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function mc(e,t=!1){let n=Ml(e,`removeParticipant`);if(n)try{await n.conversation.removeParticipant(j.decomposeParticipantId(n.participantId).compositeUserId,t)}catch(e){R.warn(`Failed to remove participant ${n.participantId}. Perhaps he is no longer on the call. ${e}`)}}async function hc(e,t=!1){let n=$.current();if(n)try{await n.removeParticipant(j.composeUserId(e),t)}catch(t){R.warn(`Failed to remove participant ${e}. Perhaps he is no longer on the call. ${t}`)}}async function gc(e,t){let n=$.current();if(e===`videoinput`&&Nt.contains(t))return M.videoFacingMode=t,n?(T.isMobile()&&n.stopVideoTrack(),n.changeDevice(e)):void 0;if(!await T._saveDeviceId(e,t))throw Error(`Device not found: ${t}`);if(n)return n.changeDevice(e)}async function _c(e,t){let n=typeof e==`object`?{...e,fastScreenSharing:e.captureScreen&&e.fastScreenSharing,captureAudio:e.captureScreen&&e.captureAudio&&M.audioShare}:{captureScreen:e,fastScreenSharing:!1,captureAudio:!1},r=Ol(t);return r?r.toggleScreenCapturing(n):Promise.reject()}function vc(e){let t=$.current();t&&t.toggleAnimojiCapturing(e)}async function yc(e,t=!1){let n=$.current();n&&await n.setVideoStream(e,t)}async function bc(e,t){let n=Ol(t);n&&await n.toggleLocalVideo(e)}async function xc(e,t){let n=Ol(t);n&&await n.toggleLocalAudio(e)}async function Sc(e){let t=$.current();if(t)return t.setLocalResolution(e)}async function Cc(e){let t=$.current();t&&await t.changePriorities(e)}async function wc(e,t){let n=$.current();if(n){if(t){let r=n.getCachedParticipantIdByExternalId(t);if(!r){kl(t,`changeParticipantState`,n);return}await n.changeParticipantState(e,r);return}await n.changeParticipantState(e)}}async function Tc(){let e=$.current();e&&await e.putHandsDown()}async function Ec(e){let t=$.current();t&&await t.updateDisplayLayout(e)}async function Dc(e){let t=$.current();t&&await t.requestDisplayLayout(e)}async function Oc(e,t,n=!1){let r=Ml(e,`grantRoles`);r&&await r.conversation.grantRoles(r.participantId,t,n)}async function kc(e,t,n,r=!1){let i=$.current();i&&await i.grantRoles(j.composeParticipantId(e,A.USER,t),n,r)}async function Ac({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){if(e){let i=Ml(e,`muteParticipant`);return i?i.conversation.muteParticipant(i.participantId,t,n,r):void 0}let i=$.current();i&&await i.muteParticipant(null,t,n,r)}async function jc({uid:e=null,muteStates:t,requestedMedia:n=[],deviceIdx:r=0,roomId:i=null}){let a=$.current();if(a){let o=e?j.composeParticipantId(e,A.USER,r):null;await a.muteParticipant(o,t,n,i)}}async function Mc(e,t=!1,n=null){let r=Ml(e,`pinParticipant`);r&&await r.conversation.pinParticipant(r.participantId,t,n)}async function Nc(e,t=!1,n=0,r=null){let i=$.current();i&&await i.pinParticipant(j.composeParticipantId(e,A.USER,n),t,r)}async function Pc(e){let t=$.current();t&&await t.updateMediaModifiers(e)}async function Fc(e){let t=$.current();t&&await t.enableVideoSuspend(e)}async function Ic(e){let t=$.current();t&&await t.enableVideoSuspendSuggest(e)}async function Lc(e){let t=$.current();t&&await t.changeOptions(e)}async function Rc(e,t=null){if(t){let n=Ml(t,`chatMessage`);return n?n.conversation.chatMessage(e,j.decomposeParticipantId(n.participantId).compositeUserId):void 0}let n=$.current();n&&await n.chatMessage(e,null)}async function zc(e,t=null){let n=$.current();if(n){let r=t?j.composeUserId(t):null;await n.chatMessage(e,r)}}async function Bc(e=10){let t=$.current();if(t)return t.chatHistory(e)}async function Vc(e,t=null){if(t){let n=Ml(t,`customData`);return n?n.conversation.customData(e,n.participantId):void 0}let n=$.current();n&&await n.customData(e,null)}async function Hc(e,t=null,n=0){let r=$.current();if(r){let i=t?j.composeParticipantId(t,A.USER,n):null;await r.customData(e,i)}}async function Uc(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await Us.createConversation(a??j.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function Wc(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=i.map(e=>Q.fromId(e));return(await Us.createConversation(j.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},a)).join_link}async function Gc(){let e=$.current();return e?e.createJoinLink():Promise.reject()}async function Kc(){let e=$.current();return e?e.removeJoinLink():Promise.reject()}async function qc(e,t){return Us.getAnonymTokenByLink(e,t)}function Jc(e){let t=$.current();t&&t.setVolume(e)}function Yc(e){M.forceRelayPolicy=e}async function Xc(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 Zc(e=null,t){let n=$.current();return n?n.stopStream(e,t):Promise.reject()}async function Qc(e=null){let t=$.current();return t?t.publishStream(e):Promise.reject()}async function $c(){let e=$.current();return e?e.getStreamInfo():Promise.reject()}async function el(e){let t=$.current();return t?t.addMovie(e):Promise.reject()}async function tl(e){let t=$.current();return t?t.updateMovie(e):Promise.reject()}async function nl(e){let t=$.current();return t?t.removeMovie(e):Promise.reject()}async function rl(e,t){let n=$.current();if(n){let r=[],i=[];for(let t of e){let e,a;t.addParticipantIds&&(e=[],t.addParticipantIds.forEach(t=>{let r=n.getCachedParticipantIdByExternalId(t);r?e.push(j.decomposeParticipantId(r).compositeUserId):i.push(t.id)})),t.removeParticipantIds&&(a=[],t.removeParticipantIds.forEach(e=>{let t=n.getCachedParticipantIdByExternalId(e);t?a.push(j.decomposeParticipantId(t).compositeUserId):i.push(e.id)})),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:a,countdownSec:t.countdownSec})}if(i.length){Al(i,`updateRooms`,n);return}return n.updateRooms(r,t)}return Promise.reject()}async function il(e,t){let n=$.current();return n?n.activateRooms(e,t):Promise.reject()}async function al(e=null,t=null){let n=$.current();if(!n)return Promise.reject();let r;if(t&&(r=n.getCachedParticipantIdByExternalId(t)??void 0,!r)){kl(t,`switchRoom`,n);return}return n.switchRoom(e,r)}async function ol(e){let t=$.current();return t?t.removeRooms(e):Promise.reject()}function sl(e){M.statisticsInterval=e;let t=$.current();if(t)return t.updateStatisticsInterval()}function cl(e){c.default.disableLog(!e),R.toggle(e)}function ll(e,...t){M.debugLog&&($.debugMessage(e,`[external]`,...t)||R.send(e,`[external]`,...t))}function ul(e,t,...n){M.debugLog&&($.debugMessageWithContext(e,t,`[external]`,...n)||R.send(e,`[external]`,...n))}var dl={list:Fe,get:Ie,getJson:Le,download:Re,clear:ze,stats:Be};function fl(){let e=[[`Calls SDK ${M.sdkVersion}`,M.toJSON()],[`UserAgent:`,navigator.userAgent],[`Screen resolution:`,`${window.screen.width}x${window.screen.height}`],[`Permissions:`,`Camera: ${T.hasCameraPermission()}, Mic: ${T.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:wn.LOG,d:e}))}async function pl(){let e=$.id(),t=$.debugSessionId();if(!t||!e)throw R.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let n=await Ie({sessionId:t});if(n.length===0)throw R.error(`[uploadDebugLogs]`,`No logs found`),Error(`No logs found`);let r=n[0].t,i=n[n.length-1].t;try{return Us?.uploadDebugLogs(e,r,i,JSON.stringify([...fl(),...n]))}catch(e){throw R.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function ml(e){let t=$.current();if(t)return t.videoEffect(e)}async function hl(e,t){let n=$.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function gl(e){let t=$.current();t&&await t.setAudioStream(e)}async function _l(e,t=null,n=null){let r=$.current();if(!r)return;let i=n??t?.id,a=null;if(t&&(a=r.getCachedParticipantIdByExternalId(t),!a)){kl(t,`setVmojiSvg`,r);return}r.setAnimojiSvg(e,a,i)}function vl(e){let t=$.current();t&&t.setAnimojiFill(e)}async function yl(e=null,t,n=!1){return jl().getWaitingHall(e,t,n)}async function bl(){return jl().getAudienceModeHands()}async function xl(e,t=!1){let n=jl(),r;if(e){let t=n.getCachedParticipantIdByExternalId(e);if(!t){kl(e,`promoteParticipant`,n);return}r=j.decomposeParticipantId(t).compositeUserId}return n.promoteParticipant(r,t)}async function Sl(e=!1){return jl().requestPromotion(e)}async function Cl(e=!1){return jl().acceptPromotion(e)}async function wl(e){return jl().getParticipantListChunk(e)}async function Tl(e){return jl().getParticipants(e)}async function El(e){return jl().feedback(e)}async function Dl(e,t,n){return jl(n).enableFeatureForRoles(e,t)}function Ol(e){return e?z.get(e)??null:$.current()??z.getFirst()}function kl(e,t,n){L.onNonFatalError(Error(`Participant ID mapping not found for external ID "${e.id}" while handling ${t}`),n.id)}function Al(e,t,n){let r=Array.from(new Set(e));L.onNonFatalError(Error(`Participant ID mapping not found for external IDs "${r.join(`", "`)}" while handling ${t}`),n.id)}function jl(e){let t=Ol(e);if(!t)throw Error(`Conversation not found`);return t}function Ml(e,t){let n=$.current();if(!n)return null;let r=n.getCachedParticipantIdByExternalId(e);return r?{conversation:n,participantId:r}:(kl(e,t,n),null)}async function Nl(e){await Us.removeHistoryRecords(e)}async function Pl(e){let t=$.current()??z.getFirst();t&&await t.startAsr(e)}async function Fl(e){let t=$.current()??z.getFirst();t&&await t.stopAsr(e)}async function Il(e){let t=$.current()??z.getFirst();t&&await t.requestAsr(e)}async function Ll(e){let t=$.current();return t?t.startUrlSharing(e):Promise.reject()}async function Rl(){let e=$.current();return e?e.stopUrlSharing():Promise.reject()}async function zl(e){await z.switchCall(e)}function Bl(){return z.getActiveId()}function Vl(){return $.getSyncedTime()}function Hl(){return M.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=xn),exports.Api=Is,exports.ApiExternal=Hs,exports.ArrayDequeue=Vs,exports.AuthData=y,exports.BaseLogger=m,exports.CallDirection=Ha,exports.CallType=Ua,exports.ChatRoomEventType=Wa,exports.ConversationFeature=Ga,exports.ConversationOption=Ka,exports.DebugMessageType=wn,exports.ExternalIdType=ro,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return Nt}}),exports.FatalError=x,exports.HangupReason=O,exports.HangupType=D,exports.MediaOption=S,exports.MediaTrackKind=k,exports.MediaType=V,exports.MuteState=Ya,exports.ParticipantState=Z,exports.ParticipantStateDataValue=Bs,exports.ParticipantStatus=N,exports.RecordRole=zs,exports.RoomsEventType=Xa,exports.Signaling=Va,exports.SignalingCommandType=B,exports.SignalingConnectionType=br,exports.SignalingNotification=K,exports.TransportTopology=J,exports.UserRole=$a,exports.UserType=A,exports.VolumeDetector=Do,exports.acceptCall=oc,exports.acceptPromotion=Cl,exports.activateRooms=il,exports.addMovie=el,exports.addParticipant=fc,exports.addParticipantInternal=pc,exports.authorize=ac,exports.browser=Gs,exports.callInternal=tc,exports.callTo=$s,exports.captureScreen=_c,exports.captureVmoji=vc,exports.changeAudioEffect=hl,exports.changeConversationOptions=Lc,exports.changeDevice=gc,exports.changeParticipantState=wc,exports.changePriorities=Cc,exports.changeVideoEffect=ml,exports.chatHistory=Bc,exports.chatMessage=Rc,exports.chatMessageInternal=zc,exports.createJoinLink=Gc,exports.customData=Vc,exports.customDataInternal=Hc,exports.debug=cl,exports.debugLogs=dl,exports.debugMessage=ll,exports.debugMessageWithContext=ul,exports.declineCall=sc,exports.enableFeatureForRoles=Dl,exports.enableVideoSuspend=Fc,exports.enableVideoSuspendSuggest=Ic,exports.feedback=El,exports.forceRelayPolicy=Yc,exports.getActiveCallId=Bl,exports.getAnonymTokenByLink=qc,exports.getAudienceModeHands=bl,exports.getInbounds=ic,exports.getParticipantListChunk=wl,exports.getParticipants=Tl,exports.getStreamInfo=$c,exports.getSyncedTime=Vl,exports.getWaitingHall=yl,exports.grantRoles=Oc,exports.grantRolesInternal=kc,exports.hangup=dc,exports.init=Qs,exports.joinCall=cc,exports.joinCallByLink=uc,exports.joinCallInternal=lc,exports.muteParticipant=Ac,exports.muteParticipantInternal=jc,exports.pinParticipant=Mc,exports.pinParticipantInternal=Nc,exports.processPush=nc,exports.processPushInternal=rc,exports.promoteParticipant=xl,exports.publishStream=Qc,exports.putHandsDown=Tc,exports.removeHistoryRecords=Nl,exports.removeJoinLink=Kc,exports.removeMovie=nl,exports.removeParticipant=mc,exports.removeParticipantInternal=hc,exports.removeRooms=ol,exports.requestAsr=Il,exports.requestDisplayLayout=Dc,exports.requestPromotion=Sl,exports.setAudioEffects=Ys,exports.setAudioStream=gl,exports.setLocalResolution=Sc,exports.setLogger=qs,exports.setMediaModifiers=Pc,exports.setStatisticsInterval=sl,exports.setVad=Xs,exports.setVideoEffects=Js,exports.setVideoStream=yc,exports.setVmoji=Zs,exports.setVmojiFill=vl,exports.setVmojiSvg=_l,exports.setVolume=Jc,exports.startAsr=Pl,exports.startAudienceConversation=Wc,exports.startConversation=Uc,exports.startStream=Xc,exports.startUrlSharing=Ll,exports.stopAsr=Fl,exports.stopStream=Zc,exports.stopUrlSharing=Rl,exports.switchCall=zl,exports.switchRoom=al,exports.toggleLocalAudio=xc,exports.toggleLocalVideo=bc,exports.updateDisplayLayout=Ec,exports.updateMovie=tl,exports.updateRooms=rl,exports.uploadDebugLogs=pl,exports.utils=Ks,exports.version=Hl;
|
|
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)}},Y=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}({}),Ta=class extends b{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`,q.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,Cr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Yt.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,Yt.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this.subscribe(this._mediaSource,Yt.SOURCE_READY,this._updateVadTrack),this._createVad(),this._createAnimojiTransport(),e===J.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===J.DIRECT&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===J.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===J.DIRECT&&this._directTransport&&this._directTransport.open(t),this._topology===J.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===J.DIRECT&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===J.SERVER&&(this._serverTransport?.removeParticipant(e),this._setStates([e],q.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===J.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===J.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===K.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(C.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===J.SERVER&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===J.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 si(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,J.DIRECT))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new wa(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,J.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===q.CONNECTED&&this._topology===J.DIRECT&&this._releaseServerTransport(),(e===q.CLOSED||e===q.FAILED)&&(this._releaseDirectTransport(),this._topology===J.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===J.DIRECT&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===q.CONNECTED&&this._topology===J.SERVER&&this._releaseDirectTransport(),(e===q.CLOSED||e===q.FAILED)&&(this._releaseServerTransport(),this._topology===J.SERVER&&(this._allocated=[],this._opened=[])),this._topology===J.SERVER&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===J.SERVER&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===J.SERVER&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===J.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===J.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===J.SERVER?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(this._logger?.log(C.PAT_WAITING_TIME_ERROR,`noTransport`),this._debug.error(`Cannot get stream waiting time, server transport is not initialized`),0):(this._logger?.log(C.PAT_WAITING_TIME_ERROR,`wrongTopology`),this._debug.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},Ea=`videochat-epi`,Da=5e3,Oa=500,ka=class extends b{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,`_previousRemoteInboundRtps`,new Map),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===q.CONNECTED||!this._directTopology&&e===q.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now(),this._previousRemoteInboundRtps.clear())}),this._signaling=t,this._directTopology=r,this._debug=i,this._statAggregator=n,this.subscribe(e,Y.REMOTE_DATA_STATS,this._handleStats.bind(this)),this.subscribe(e,Y.SCREEN_SHARING_STAT,this._handleScreenSharingStat.bind(this)),this.subscribe(e,Y.STATE_CHANGED,this._handleTransportStateChanged.bind(this))}destroy(){this._previousRemoteInboundRtps.clear(),this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(Ea)||``,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+Da<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+Oa<=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(Ea,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,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:ja(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:ja(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),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&&!Ma(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!Ma(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!Ma(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&&!Ma(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=Na(n/e*1e3),i.removed_audio_samples_for_acceleration=Na(r/e*1e3),i.concealed_audio_samples=Na(a/e*1e3),i.concealed_silent_audio_samples=Na(o/e*1e3),i.concealment_audio_avg_size=Na(a/s),i.total_audio_energy=t.total_audio_energy}Aa(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),Aa(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=this._calculatePacketLoss(e.remoteInbound.rtps);a.video!==void 0&&(i.video_loss=a.video),a.audio!==void 0&&(i.audio_loss=a.audio),this._statAggregator?.logCallStat(i),N.enableLogPerfStatReport&&this._debug.log(`Sent call stats`,i),this._previousCallStatReport=t}_calculatePacketLoss(e){let t=new Map,n={audio:{lost:0,received:0},video:{lost:0,received:0}};for(let r of e){if(r.kind!==`audio`&&r.kind!==`video`)continue;let e=`${r.kind}:${r.ssrc}`,i={packetsLost:r.packetsLost,packetsReceived:r.packetsReceived},a=this._previousRemoteInboundRtps.get(e);t.set(e,i),a&&(n[r.kind].lost+=Math.max(0,i.packetsLost-a.packetsLost),n[r.kind].received+=Math.max(0,i.packetsReceived-a.packetsReceived))}this._previousRemoteInboundRtps=t;let r={};for(let e of[`audio`,`video`]){let{lost:t,received:i}=n[e];t+i>0&&(r[e]=t/(t+i)*100)}return r}};function Aa(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function ja(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function Ma(e){return e===void 0}function Na(e){return Number.isNaN(e)?0:e}var Pa;(function(e){function t(){return{estimatedPerformanceIndex:ka.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})(Pa||(Pa={}));var Fa=Pa,Ia={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},La=class{static getFlags(){let e=Object.values(Ia),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(Ia).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},Ra=63n,za=16383n,Ba=1073741823,Va=4611686018427387903n,Ha=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=Ra)return new Uint8Array([Number(t)]);if(t<=za)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<=Va)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`)}},Ua=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 Ha,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}}},Ga=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 Ua,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}}},Ka=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 Ga(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}},qa=function(e){return e.EMPTY_ENDPOINT=`EMPTY_ENDPOINT`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.ABORTED=`ABORTED`,e}({}),Ja=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`,wr.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!==Sr.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=wr.WEBTRANSPORT,this.socket=new Ka(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:wr.WEBSOCKET,remote:!0});return}let e=this._buildUrl(this.endpoint,!1);this.currentType=wr.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`,N.appVersion),r.set(`version`,String(N.protocolVersion)),r.set(`device`,N.device),r.set(`capabilities`,La.getFlags()),r.set(`clientType`,N.clientType),this.connectionType&&r.set(`tgt`,this.connectionType),this.connectionType===Sr.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&&Ka.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===wr.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=Sr.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}},Ya=`open`,Xa=300,Za=10,Qa={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`},$a={[Qa.CONVERSATION_ENDED]:`conversation-ended`,[Qa.OBSOLETE_CLIENT]:`obsolete-client`,[Qa.INVALID_TOKEN]:`invalid-token`,[Qa.PARTICIPANT_NOT_FOUND]:`participant-not-found`,[Qa.ILLEGAL_PARTICIPANT_STATE]:`illegal-participant-state`,[Qa.SERVICE_UNAVAILABLE]:`service-unavailable`};function eo(e,t){return e.errorMessage??e.message??e.error??t}var to=new Set([O.CALLER_IS_BLOCKED,O.ENDED,O.NOT_FOUND,O.PARTICIPANT_LIMIT_REACHED,O.SERVICE_UNAVAILABLE]),no=class e extends An{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,`reconnectStartedAt`,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 rr(e),this.transport=new Ja(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=t=>{if(this.producerNotificationDataChannel!==e)return;let n=this.participantIdRegistry?.handleMessage(t.data);n&&this._handleMessage(n)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(t=>{this.producerCommandDataChannel===e&&t&&this._handleMessage(t)}).catch(e=>{this._debug.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}resetProducerConnection(e=new kn){this.producerCommandDataChannelEnabled=!1,this.producerNotificationDataChannel&&(this.producerNotificationDataChannel.onmessage=null,this.producerNotificationDataChannel=null),this.producerCommandDataChannel&&(this.producerCommandDataChannel.onmessage=null,this.producerCommandDataChannel=null);let t=[...this.datachannelCommandsQueue];this.datachannelCommandsQueue=[];for(let e of Object.values(this.responseHandlers))e.route===`producer`&&(t.push(e),delete this.responseHandlers[e.sequence]);t.forEach(t=>{window.clearTimeout(t.responseTimer),t.reject(e instanceof kn?new kn(t.name):e,!0)})}async connect(e){return new Promise((t,n)=>{if(this.transport.readyState!==null&&this.transport.readyState<WebSocket.CLOSING){this._logger?.log(C.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,Za)}async acceptCall(e){return this._send(V.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(V.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Za)}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=Fa.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 On){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 On(e);switch(t.route){case`producer`:this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===Ya&&this._handleCommandsQueue(this.datachannelCommandsQueue);break;case`websocket`:if(this.transport.readyState===null){this._logger?.log(C.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(C.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,route:this._isDataChannelCommand(e)?`producer`:`websocket`,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(C.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._logTransportStatSinceMark(this.connectionType===Sr.RETRY?Tr.RECONNECTED:Tr.CONNECTED)}_onMessage(e){if(e.data===`ping`){this._statPings?.mark(this._getSocketType()),this._markTransportStat(Tr.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(C.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._triggerEvent(Cr.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Cr.NOTIFICATION,{type:`notification`,notification:K.TOPOLOGY_CHANGED,topology:e.conversation.topology}),this._resolvePendingRecordCommands(e)),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===K.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(Cr.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:this._logger?.log(C.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(C.SOCKET_ACTION,`error-${e.error}`);let t=this._getSocketType(),n=e.error?this._createSignalingCallError(e.error,e.errorCode,t):void 0,r=eo(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 Qa.SERVICE_UNAVAILABLE:let i=new k(O.SERVICE_UNAVAILABLE,{callError:n,message:r,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Cr.NOTIFICATION,{notification:K.CLOSED_CONVERSATION,callError:n,reason:O.SERVICE_UNAVAILABLE});break;case Qa.CONVERSATION_ENDED:this.conversationReject?this.conversationReject(new k(e.reason||x.SIGNALING_FAILED,{callError:n,message:r,remote:!0})):this._triggerEvent(Cr.NOTIFICATION,{notification:K.CLOSED_CONVERSATION,callError:n,reason:e.reason});break;case Qa.ILLEGAL_PARTICIPANT_STATE:case Qa.PARTICIPANT_NOT_FOUND:this._throwError(new k(x.SIGNALING_FAILED,{callError:n,message:r,remote:!0}));break;case Qa.OBSOLETE_CLIENT:this.conversationReject?.(new k(e.reason||O.OBSOLETE_CLIENT,{callError:n,message:r,remote:!0}));break;case Qa.INVALID_TOKEN:default:if(e.sequence||t===wr.WEBTRANSPORT)break;if(this.connected)this._throwError(new k(e.reason||x.SIGNALING_FAILED,{callError:n??{scope:`unknown`,description:`signaling-unrecognized-error`},message:r,remote:!0}));else if(!e.sequence){let t=new k(e.reason||x.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(Cr.FAILED,e)}_onError(e){this._logger?.log(C.SOCKET_ACTION,`error`),this._debug.error(`[signaling] signaling error`,e),this._logTransportStat(Tr.FAILED_EXCEPTIONS,{string_value:this._describeErrorEvent(e)})}_describeErrorEvent(e){let t=e,n=t.error instanceof Error?t.error:null,r=[n?.name||t.errorInfo?.name,n?.message||t.errorInfo?.message||t.message].filter(Boolean).join(`: `)||`Unknown error`,i=t.errorInfo?.phase;return(i?`${i}: ${r}`:r).slice(0,Xa)}_onClose(e){this._logger?.log(C.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.producerCommandDataChannelEnabled=!1,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 On?new On(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(Cr.NOTIFICATION,{...n,notification:K.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(C.SOCKET_ACTION,`response-error`),r.reject(Error(eo(n,`Response error [${r.name}]`)),!0)):this.transport.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],this._logger?.log(C.SOCKET_ACTION,`response-timeout`),r.reject(Error(eo(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),t.route===`producer`){if(this.producerCommandDataChannel?.readyState!==Ya){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]=Nn(t[e]));return{layouts:n}}_waitConnectionMessage(){let t=this._getSocketType();this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new k(x.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===Sr.RETRY?Tr.RECONNECTED:Tr.CONNECTED;this._markTransportStat(t,e.source)}_onTransportFailed(e){switch(e.failure){case qa.EMPTY_ENDPOINT:this.conversationReject?.(new k(x.SIGNALING_FAILED,{callError:{scope:`internal`,code:`configuration`,description:`signaling-endpoint-missing`},message:e.message,remote:e.remote}));break;case qa.NETWORK_ERROR:this._logReconnectTimeout(),this._fail(new k(O.NETWORK_ERROR,{callError:{scope:`network`,source:e.source,code:`reconnect-exhausted`,description:`connection-failed`}}));break;case qa.ABORTED:this._debug.debug(`[signaling] aborted reconnect`),this._fail(new k(O.CANCELED));break}}_onTransportReconnectScheduled(e){this.connectionType=Sr.RETRY,this._debug.log(`[signaling] reconnect signaling after ${e.delay}ms (${e.count})`),this._logger?.log(C.SOCKET_ACTION,`reconnect`),e.count===1&&(this.reconnectStartedAt=performance.now())}_logReconnectTimeout(){this.reconnectStartedAt!==null&&(this._logTransportStat(Tr.TIMEOUT,{value:Math.round(performance.now()-this.reconnectStartedAt)}),this.reconnectStartedAt=null)}_onTransportConnectionDead(){this._debug.warn(`[signaling] socket is dead, trying to reconnect`),this._logTransportStatSinceMark(Tr.FAILED_PINGS)}_attachNotificationCallError(e){e.callError||!e.reason||e.reason===O.FAILED||e.reason===O.UNKNOWN_ERROR||!to.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=$a[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=Er[e][t];G.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=Er[e][n];this._statAggregator?.logEventualStat({name:r,...t})}_logTransportStatSinceMark(e){let t=this._getSocketType(),n=Er[e][t];this._statAggregator?.logEventualStatSinceMark({name:n})}},ro=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(ro||{}),io=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(io||{}),ao=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(ao||{}),oo=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(oo||{}),so=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}(so||{});function co(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function lo(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 uo=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(uo||{}),X=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(X||{}),fo=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(fo||{}),po=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(po||{});function mo(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var ho=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}(ho||{});function go(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var _o;(function(e){function t(e){let t=e?.transport??e?.lastEffective??P.WAITING,n={transport:t,stalled:e?.stalled??!1,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===q.CONNECTED?P.CONNECTED:e===q.CONNECTING||e===q.OPENED?P.CONNECTING:e===q.RECONNECTING?P.RECONNECT:null}e.fromTransportState=n;function r(e){return[P.HANGUP,P.ERROR,P.ONHOLD].includes(e.transport)?e.transport:e.transport===P.RECONNECT||e.transport===P.CONNECTED&&e.stalled?P.RECONNECT:e.sessionStateApplicable&&e.sessionState?.connected===!1?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,c(e)}e.setSessionState=i;function a(e,t){return e.transport=t,t!==P.CONNECTED&&(e.sessionStateConnectedBySpeaker=!1),c(e)}e.setTransport=a;function o(e,t){return e.stalled=t,c(e)}e.setStalled=o;function s(e,t){return e.sessionStateApplicable=t,t||(e.sessionStateConnectedBySpeaker=!1),c(e)}e.setSessionStateApplicable=s;function c(e){let t=r(e);return e.lastEffective===t?{status:t,shouldNotify:!1}:(e.lastEffective=t,{status:t,shouldNotify:!0})}})(_o||(_o={}));var vo=_o,yo=function(e){return e.USER=`USER`,e.ANONYM=`ANONYM`,e.GROUP=`GROUP`,e}({}),Z;(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})(Z||(Z={}));function bo(e){try{return btoa(JSON.stringify(e))}catch(t){z.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function xo(e){try{return JSON.parse(atob(e))}catch(t){z.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var So=(e,t)=>M.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function Co(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 wo(e,t){switch(e){case S.AUDIO:return!!t.isAudioEnabled;case S.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case S.VIDEO:return!!t.isVideoEnabled;case S.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function To(e,t){return M.objectReduce(e,(e,n,r)=>{switch(n){case uo.MUTE:case uo.MUTE_PERMANENT:wo(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function Eo(e){let{muteStates:t={},mediaSettings:n}=e;return To(t,n)}function Do(e,t){let n=e.conversation.participants.find(t=>M.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return To(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 ko(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 Ao(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}function jo(e){let t,n=!1,r,i=async()=>{let t=!1,i;for(;n;){let a=r;n=!1;try{await e(a),t=!1}catch(e){t=!0,i=e}!t&&n&&Object.is(r,a)&&(n=!1)}if(t)throw i};return e=>(r=e,n=!0,t??(t=i().finally(()=>{t=void 0})),t)}var Mo=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(C.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&e.packetsSent>0&&(this._fixNoPacketsApplied=!0,this._logger?.log(C.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(C.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(this._debug.log(`[AudioFix] Fixed RV`),this._logger?.log(C.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,this._logger?.log(C.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)}))}},No=class{constructor(e,t=!1,n=z,r=null){h(this,`_audioElement`,null),h(this,`_debug`,void 0),h(this,`_preparedAudioElement`,void 0),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,`_logger`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t,this._debug=n,this._logger=r,this._preparedAudioElement=this._prepareAudioElement()}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._preparedAudioElement=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),this._debug.debug(`[audio] Output device changed`,e))}catch(e){throw this._logger?.log(C.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=this._preparedAudioElement??this._prepareAudioElement()??this._createAudioElement();t.muted=!1,t.volume=this._volume,t.preload=`auto`;let n=()=>{this._debug.warn(`[audio] Error on play audio`),R.onAutoplayError()},r=e=>{this._debug.debug(`[audio] Play audio`),t.srcObject=null,t.srcObject=new MediaStream(e),t.load();let r=t.play();r&&r.catch(n)},i=()=>{this._debug.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?r(e):this._debug.warn(`[audio] Broken audio tracks`)};t.onpause=i,t.onstalled=i,t.onerror=i,t.onloadeddata=()=>{this._statFirstMediaReceived.measure()},r(e),this._audioElement=t;let a=E.getChosenOutput();a?t.setSinkId?.(a.deviceId).then(()=>{this._debug.debug(`[audio] Output device`,a)}).catch(e=>{this._debug.warn(`[audio] Failed to set output device`,a,e)}):this._debug.debug(`[audio] Output device: system default`)}_stopAudioElement(){this._audioElement&&(this._audioElement.onpause=null,this._audioElement.onstalled=null,this._audioElement.onerror=null,this._audioElement.onloadeddata=null,this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_createAudioElement(){let e=E.browserName()!==`Safari`||E.isMobile()||N.safariAudioElement;return document.createElement(e?`audio`:`video`)}_prepareAudioElement(){if(N.muteMode||E.browserName()!==`Safari`||E.isMobile())return null;let e=this._createAudioElement();return e.load(),e}_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 Po(e,t){e||Io(t,`response-empty`),e.id||Io(t,`id-empty`),e.endpoint||Io(t,`endpoint-empty`),!Fo(e.stun_server)&&!Fo(e.turn_server)&&Io(t,`ice-servers-empty`)}function Fo(e){return Array.isArray(e?.urls)&&e.urls.length>0}function Io(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 Lo=90,Ro=3,zo=class extends b{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>Lo?this._debug.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=Ro)&&(this._debug.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},Bo=class{constructor({api:e,debug:t,getParticipants:n,isMe:r,updateDisplayLayout:i,onNonFatalError:a}){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,`_onNonFatalError`,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,this._onNonFatalError=a}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))Ln(t).participantId===e&&delete this._requestedLayouts[t];for(let t of Object.keys(this._uncertainLayouts))Ln(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{let i=this._getRequestLayouts(t);if(!i){n.forEach(({resolve:e})=>e());return}r=i;let a=this._forceNextFlush||Object.keys(this._uncertainLayouts).length>0;this._forceNextFlush=!1;let o=this._getDiff(r,a);o.length&&await this._updateDisplayLayout(o),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=[],r=this._getParticipants();for(let i of e){let e=typeof i.uid==`object`?i.uid:Z.fromId(i.uid),a=this._api.getCachedParticipantIdByExternalId(e);if(!a){this._debug.log(`Unknown participant external ID ${typeof i.uid==`object`?Z.toString(i.uid):i.uid}`),n.push(e.id);continue}if(!r[a]&&!this._isMe(a))continue;let o=In({participantId:a,mediaType:i.mediaType,streamName:i.streamName});t[o]={uid:i.uid,mediaType:i.mediaType,width:i.width,height:i.height,fit:i.cover?`cv`:`cn`,...i.priority===void 0?{}:{priority:i.priority},...i.streamName===void 0?{}:{streamName:i.streamName}}}return n.length?(this._onNonFatalError(`Participant ID mapping not found for external IDs "${Array.from(new Set(n)).join(`", "`)}" while handling requestDisplayLayout`),null):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}},Vo=44100,Ho=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._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,E.browserName()===`Safari`&&(this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),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=Vo/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)}},Uo=class extends b{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,Yt.SOURCE_CHANGED,t=>{t.kind===A.audio&&e.mediaSettings.isAudioEnabled&&n()}),this.subscribe(e,Yt.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new Ho(`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()}},Wo=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}}},Go=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),Ko=class extends b{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,Y.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(e,Y.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,Y.SIGNALLED_ACTIVE_PARTICIPANTS,this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,Y.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 Ho(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===J.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){let t=this._detectors.get(ci.AUDIO_MIX);return t?t.getLevel():this._getTransparentAudioLevelByParticipantId(e)}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((e,n)=>{if(!n.startsWith(`${ci.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===J.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},qo=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),Jo=class extends b{constructor(e,t,n){super(),h(this,`_speakerId`,null),h(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===J.SERVER,this.subscribe(e,Go.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this.subscribe(t,Y.SIGNALLED_SPEAKER_CHANGED,this._onServerSpeakerChanged.bind(this)),this.subscribe(t,Y.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===J.SERVER}},Yo=15e3,Xo=15e3,Zo=class extends b{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,Y.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(t,Go.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()===J.DIRECT?Yo:N.specListenerParams.connectionTimeout}_getVolumeTimeout(){return this._transport.getTopology()===J.DIRECT?Xo:N.specListenerParams.volumeTimeout}_onTransportStateChanged(e,t){t===q.OPENED&&(this._connectionTimeout||(this._connectionTimeoutSuppressed=!1,this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),this._getConnectionTimeout()))),t===q.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===q.FAILED&&this._connectionTimeout&&(this._debug.warn(`Transport failed, send callSpecError`),this._logger?.log(C.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!==q.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(C.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(C.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&this._debug.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},Qo=function(e){return e[e.PARAM_SESSION_EXPIRED=102]=`PARAM_SESSION_EXPIRED`,e[e.PARAM_SESSION_KEY=103]=`PARAM_SESSION_KEY`,e[e.PARAM_SIGNATURE=104]=`PARAM_SIGNATURE`,e[e.AUTH_LOGIN=401]=`AUTH_LOGIN`,e}(Qo||{});function $o(e){return e===102||e===103||e===104}var es,ts=`ok-calls-sdk-stats`,ns=1,rs=`events`,is=100,as=5e3,os=10080*60*1e3,ss=5e3,cs=6e4,Q=class e{static isSupported(){return e._supported}static async append(t){let n=await e._open();if(!n)return null;let r=await e._runTransaction(n,`readwrite`,e=>{let n=e.add(t);return new Promise(e=>{n.onsuccess=()=>e(n.result)})}).catch(e=>(z.error(`[StatQueue] failed to append event`,e),null));return r===null?null:(e._appendsSinceEvictCheck+=1,e._appendsSinceEvictCheck>=is&&(e._appendsSinceEvictCheck=0,await e.evictToLimit(as)),r)}static async fillDelta(t,n){if(t.length===0)return;let r=await e._open();if(r)return e._runTransaction(r,`readwrite`,e=>new Promise(r=>{let i=t.length;for(let a of t){let t=e.get(a);t.onsuccess=()=>{let a=t.result;a&&typeof a.delta!=`number`&&e.put({...a,delta:n}),--i,i===0&&r()}}})).catch(e=>{z.error(`[StatQueue] failed to fill delta`,e)})}static async count(){let t=await e._open();return t?e._runTransaction(t,`readonly`,e=>{let t=e.count();return new Promise(e=>{t.onsuccess=()=>e(t.result)})}).catch(e=>(z.error(`[StatQueue] failed to count events`,e),0)):0}static async readOldest(t,n){let r=await e._open();return r?e._runTransaction(r,`readonly`,e=>{let r=e.index(`by_uid`).getAll(IDBKeyRange.only(t),n);return new Promise(e=>{r.onsuccess=()=>e(r.result)})}).catch(e=>(z.error(`[StatQueue] failed to read events`,e),[])):[]}static async remove(t){if(t.length===0)return;let n=await e._open();if(n)return e._runTransaction(n,`readwrite`,e=>{t.forEach(t=>e.delete(t))}).catch(e=>{z.error(`[StatQueue] failed to remove events`,e)})}static async listUids(){let t=await e._open();return t?e._runTransaction(t,`readonly`,e=>{let t=e.index(`by_uid`).openKeyCursor(null,`nextunique`),n=[];return new Promise(e=>{t.onsuccess=()=>{let r=t.result;if(!r){e(n);return}n.push(r.key),r.continue()}})}).catch(e=>(z.error(`[StatQueue] failed to list uids`,e),[])):[]}static async evictToLimit(t){let n=await e._open();if(!n)return;let r=1e3;for(;r>0;)if(--r,!await e._runTransaction(n,`readwrite`,async n=>{if(await new Promise(e=>{let t=n.count();t.onsuccess=()=>e(t.result)})<=t)return!1;let r=await e._readOldestRecord(n);return r?r.vcid===null?(n.delete(r.id),!0):(await e._deleteConversation(n,r.vcid),!0):!1}).catch(e=>(z.error(`[StatQueue] failed to evict events`,e),!1)))return}static async evictOlderThan(t,n=Date.now()){let r=await e._open();if(!r)return;let i=n-t;return e._runTransaction(r,`readwrite`,async t=>{let n=new Set;await new Promise(e=>{let r=t.openCursor();r.onsuccess=()=>{let t=r.result;if(!t){e();return}let a=t.value;a.ts<i&&(a.vcid===null?t.delete():n.add(a.vcid)),t.continue()}});for(let r of n)await e._deleteConversation(t,r)}).catch(e=>{z.error(`[StatQueue] failed to evict stale events`,e)})}static async __resetForTests(){if(e._appendsSinceEvictCheck=0,e._lastOpenFailureAt=null,e._supported=e._checkSupport(),e._dbName===ts&&(e._dbName=`${ts}-test-${Math.random().toString(36).slice(2)}`,e._close()),e._supported){let t=await e._open();t&&await e._runTransaction(t,`readwrite`,e=>{e.clear()}).catch(e=>{z.error(`[StatQueue] failed to reset storage`,e)})}e._close()}static _checkSupport(){return typeof window<`u`&&!!window.indexedDB}static _open(){if(!e._checkSupport())return e._supported=!1,Promise.resolve(null);if(e._dbPromise)return e._dbPromise;if(e._lastOpenFailureAt!==null&&Date.now()-e._lastOpenFailureAt<cs)return Promise.resolve(null);let t=!1,n=new Promise(n=>{let r=(r,i)=>{t||(t=!0,z.error(r,i),e._supported=!1,e._dbPromise=null,e._lastOpenFailureAt=Date.now(),n(null))},i;try{i=window.indexedDB.open(e._dbName,ns)}catch(e){r(`[StatQueue] storage is not accessible`,e);return}let a=window.setTimeout(()=>r(`[StatQueue] storage opening timed out`),ss);i.onupgradeneeded=()=>{e._createSchema(i.result)},i.onsuccess=()=>{if(window.clearTimeout(a),t){i.result.close();return}t=!0,e._db=i.result,e._supported=!0,e._lastOpenFailureAt=null,e._db.onversionchange=()=>e._close(),e._db.onclose=()=>e._close(),n(e._db)},i.onerror=()=>{window.clearTimeout(a),r(`[StatQueue] failed to open storage`,i.error)},i.onblocked=()=>{z.error(`[StatQueue] storage opening is blocked`)}});return t||(e._dbPromise=n),n}static _close(){e._db&&(e._db.close(),e._db=null),e._dbPromise=null}static _createSchema(e){if(e.objectStoreNames.contains(rs))return;let t=e.createObjectStore(rs,{keyPath:`id`,autoIncrement:!0});t.createIndex(`by_uid`,`uid`,{unique:!1}),t.createIndex(`by_vcid`,`vcid`,{unique:!1})}static _runTransaction(e,t,n){return new Promise((r,i)=>{let a=e.transaction(rs,t),o;a.oncomplete=()=>r(o),a.onerror=()=>i(a.error),a.onabort=()=>i(a.error),Promise.resolve(n(a.objectStore(rs))).then(e=>{o=e}).catch(e=>{try{a.abort()}catch{}i(e)})})}static _readOldestRecord(e){let t=e.openCursor();return new Promise(e=>{t.onsuccess=()=>e(t.result?t.result.value:null)})}static _deleteConversation(e,t){let n=e.index(`by_vcid`).getAllKeys(IDBKeyRange.only(t));return new Promise(t=>{n.onsuccess=()=>{n.result.forEach(t=>e.delete(t)),t()}})}};es=Q,h(Q,`_db`,null),h(Q,`_dbPromise`,null),h(Q,`_dbName`,ts),h(Q,`_supported`,es._checkSupport()),h(Q,`_appendsSinceEvictCheck`,0),h(Q,`_lastOpenFailureAt`,null);var ls=null,us=null,ds=64*1024;function fs(){ls=null,us=null}function ps(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function ms(e=null,t){let n=ps(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 hs(){return ls||us||(us=ms(),ls=await us,us=null,ls)}async function gs(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await hs();let r=Ss(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${ls}/fb.do`,i)}async function _s(e,t={},n=!1,r){return await hs(),ys(Ss(e,t,n),r)}async function vs(e,t={},n=!1){await hs();let r=Ss(e,t,n);return ys(r,void 0,new Blob([r]).size<=ds)}async function ys(e,t,n=!1){let r=`${t??ls}/fb.do`,i=new AbortController,a=new k(x.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&&!bs(o))throw new k(x.API,{callError:{scope:`server`,source:`api`,code:`http-${t.status}`,description:`http-error`}});if(bs(o))throw o;return o}catch(e){throw e instanceof k?e:i.signal.aborted?a:bs(e)?e:new k(x.NETWORK,{callError:{scope:`network`,source:`api`,code:`fetch-failed`,description:`request-failed`}})}finally{clearTimeout(o)}}function bs(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.error_code==`number`&&typeof t.error_msg==`string`}async function xs(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 Ss(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=N.apiKey),n||(y.sessionKey?t.session_key=y.sessionKey:y.accessToken&&(t.access_token=y.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 Cs=`sessions`,ws=5,Ts=class e{static remember(t,n){let r=e._read();r[String(t)]={...n,savedAt:Date.now()};let i=Object.keys(r);i.length>ws&&i.sort((e,t)=>r[e].savedAt-r[t].savedAt).slice(0,i.length-ws).forEach(e=>delete r[e]),e._write(r)}static get(t){return e._read()[String(t)]??null}static forget(t){let n=e._read();String(t)in n&&(delete n[String(t)],e._write(n))}static prune(t=Date.now()){let n=e._read(),r=!1;Object.keys(n).forEach(e=>{t-n[e].savedAt>6048e5&&(delete n[e],r=!0)}),r&&e._write(n)}static currentEndpoint(){return String(ps(N.apiBaseUrl)||N.apiEndpoint())}static _read(){let t=w.get(Cs);if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};return Object.entries(t).forEach(([t,r])=>{e._isValid(r)&&(n[t]=r)}),n}static _write(e){if(Object.keys(e).length===0){w.remove(Cs);return}w.set(Cs,e)}static _isValid(e){let t=e;return typeof t==`object`&&!!t&&typeof t.sessionKey==`string`&&t.sessionKey.length>0&&typeof t.endpoint==`string`&&typeof t.savedAt==`number`}},Es=15e3,Ds=class e{static setApi(t){e._api=t}static delta(){return e._delta}static ensure(){e._delta===null&&e._api&&e.get()}static get(){return e._delta===null?!e._api||!e._hasCredentials()||e._lastFailureAt!==null&&Date.now()-e._lastFailureAt<Es?Promise.resolve(0):(e._pending||(e._pending=e._measure().finally(()=>{e._pending=null})),e._pending):Promise.resolve(e._delta)}static noteAppended(t){if(e._delta!==null){Q.fillDelta([t],e._delta);return}e._idsAwaitingDelta.push(t)}static __resetForTests(){e._api=null,e._delta=null,e._pending=null,e._idsAwaitingDelta=[],e._lastFailureAt=null}static _hasCredentials(){return!!y.sessionKey||!!y.accessToken}static async _measure(){let t;try{let n=await e._api.getServerTime();t=Date.now()-n}catch{return e._lastFailureAt=Date.now(),0}e._lastFailureAt=null,e._delta=t;let n=e._idsAwaitingDelta;return e._idsAwaitingDelta=[],await Q.fillDelta(n,t),t}};h(Ds,`_api`,null),h(Ds,`_delta`,null),h(Ds,`_pending`,null),h(Ds,`_idsAwaitingDelta`,[]),h(Ds,`_lastFailureAt`,null);var Os=`okcls-stat-unload.`,ks=class e{static beginTabSession(){e._tabKey=null,e._entries=[]}static writeSync(t){let n=e._storage();if(!n)return!1;try{return e._tabKey||(e._tabKey=Os+M.uuid()),e._entries.length>0&&n.getItem(e._tabKey)===null&&(e._entries=[]),e._entries.push(t),n.setItem(e._tabKey,JSON.stringify(e._entries)),!0}catch(e){return z.error(`[StatUnloadJournal] failed to write`,e),!1}}static async drainToQueue(){let t=e._storage();if(!t)return 0;let n=[];try{for(let e=0;e<t.length;e+=1){let r=t.key(e);r&&r.startsWith(Os)&&n.push(r)}}catch(e){return z.error(`[StatUnloadJournal] failed to scan journals`,e),0}let r=0;e.beginTabSession();for(let i of n){let n=e._take(t,i);if(n===null)continue;let a=null;try{a=JSON.parse(n)}catch{z.error(`[StatUnloadJournal] dropping corrupted journal`,i)}if(Array.isArray(a))for(let t of a)e._isValidEntry(t)&&await Q.append(t)&&(r+=1)}return r}static __resetForTests(){e._tabKey=null,e._entries=[]}static _take(e,t){try{let n=e.getItem(t);return n===null?null:(e.removeItem(t),n)}catch(e){return z.error(`[StatUnloadJournal] failed to take journal`,e),null}}static _storage(){try{return window.localStorage}catch{return null}}static _isValidEntry(e){let t=e;return typeof t==`object`&&!!t&&typeof t.uid==`number`&&(t.vcid===null||typeof t.vcid==`string`)&&typeof t.ts==`number`&&(t.delta===void 0||t.delta===null||typeof t.delta==`number`)&&typeof t.ev==`object`&&t.ev!==null}};h(ks,`_tabKey`,null),h(ks,`_entries`,[]);var As=500,js=100,Ms=3e4,Ns=1e3,Ps=5e3,Fs=3e3,Is=`okcls-stat-drain`,Ls=class e{static setApi(t){e._api=t,Ds.setApi(t)}static start(t){e.setApi(t),ks.drainToQueue().catch(e=>z.error(`[StatDrainScheduler] failed to import unload journal`,e)).then(async()=>(Ts.prune(),await Q.evictOlderThan(os),await Q.evictToLimit(as),e._drain())).catch(e=>z.error(`[StatDrainScheduler] failed to start`,e))}static notifyAppended(){if(e._api){if(e._localCount+=1,e._localCount>=js){e._drain();return}e._state===`IDLE`&&e._arm(Ms)}}static notifyCallFinished(){if(e._api){if(e._directBuffer.length>0&&e._armDirect(Ns),e._state===`DRAINING`){e._callFinishedDuringDrain=!0;return}e._arm(Ns)}}static drainOnce(){return e._withLock(async()=>{let t=e._api;if(!t)return!1;let n=e._currentUserId(),r=await Q.listUids(),i=!1,a=null;for(let o of r)try{(o===n?await e._drainCurrent(t,o):await e._drainStored(t,o))===As&&(i=!0)}catch(e){a===null&&(a=e)}if(a!==null)throw a;return i})}static sendDirect(t){if(e._api){if(t.uid!==e._currentUserId()){z.error(`[StatDrainScheduler] direct send skipped: event belongs to another user`);return}e._directBuffer.push(t),e._directTimer===null&&e._armDirect(Fs)}}static __resetForTests(){Ds.__resetForTests(),e._clearTimer(),e._clearDirectTimer(),e._directBuffer=[],e._api=null,e._state=`IDLE`,e._localCount=0,e._callFinishedDuringDrain=!1,e._blockedSession=null}static _currentUserId(){return y.userId}static async _drainCurrent(t,n){if(e._isSessionBlocked())return 0;let r=await Q.readOldest(n,As);if(r.length===0)return 0;let i=await Ds.get(),a=r.map(t=>e._toClientStats(t,i)),o=r.map(e=>e.id);try{await t.logClientStats(a)}catch(t){if(e._isRetryable(t))throw t;if(e._isReauthorizeFailure(t))throw e._blockSession(),t;return z.error(`[StatDrainScheduler] batch rejected, dropping`,t),await Q.remove(o),r.length}return await Q.remove(o),r.length}static async _drainStored(t,n){let r=Ts.get(n);if(!r||r.endpoint!==Ts.currentEndpoint())return 0;let i=await Q.readOldest(n,As);if(i.length===0)return 0;let a=await Ds.get(),o=i.map(t=>e._toClientStats(t,a)),s=i.map(e=>e.id);try{await t.logClientStatsWith(r.sessionKey,o),z.debug(`[StatDrainScheduler] delivered`,i.length,`stored events of uid`,n)}catch(t){if(e._isAuthError(t))return z.error(`[StatDrainScheduler] stored session expired, skipping uid`,n),Ts.forget(n),0;if(e._isRetryable(t))throw t;return z.error(`[StatDrainScheduler] batch rejected, dropping`,t),await Q.remove(s),i.length}return await Q.remove(s),i.length}static _withLock(e){return typeof navigator>`u`||!navigator.locks?e():navigator.locks.request(Is,e)}static _isSessionError(e){return $o(e?.error_code)}static _isReauthorizeFailure(e){return e?.error===x.AUTH}static _blockSession(){e._blockedSession={key:y.sessionKey}}static _isSessionBlocked(){return e._blockedSession?e._blockedSession.key===y.sessionKey?!0:(e._blockedSession=null,!1):!1}static _isAuthError(t){let n=t?.error_code;return e._isSessionError(t)||n===Qo.AUTH_LOGIN}static _isRetryable(t){if(e._isSessionError(t))return!0;let n=t?.callError;return n?n.scope===`network`?!0:!(`code`in n)||typeof n.code!=`string`?!1:n.code.startsWith(`http-5`)||n.code===`http-429`:!1}static _toClientStats(e,t){return{...e.ev,vcid:e.vcid,timestamp:e.ts-(e.delta??t)}}static _clearDirectTimer(){e._directTimer!==null&&(window.clearTimeout(e._directTimer),e._directTimer=null)}static _armDirect(t){e._clearDirectTimer(),e._directTimer=window.setTimeout(()=>{e._directTimer=null,e._flushDirect()},t)}static async _flushDirect(){let t=e._api,n=e._directBuffer;if(e._directBuffer=[],!(!t||n.length===0))try{let r=await Ds.get();await t.logClientStats(n.map(t=>e._toClientStats(t,r)))}catch(e){z.error(`[StatDrainScheduler] direct send failed, events lost`,e)}}static _clearTimer(){e._timer!==null&&(window.clearTimeout(e._timer),e._timer=null)}static _arm(t){e._clearTimer(),e._state=`ARMED`,e._timer=window.setTimeout(()=>{e._timer=null,e._drain()},t)}static async _drain(){if(e._state!==`DRAINING`){e._clearTimer(),e._state=`DRAINING`,e._localCount=0,e._callFinishedDuringDrain=!1;try{if(await e.drainOnce()){e._arm(Ps);return}if(e._callFinishedDuringDrain){e._arm(Ns);return}if(e._localCount>0){e._arm(Ms);return}e._state=`IDLE`}catch(t){z.error(`[StatDrainScheduler] drain failed`,t),e._arm(Ms)}}}};h(Ls,`_api`,null),h(Ls,`_state`,`IDLE`),h(Ls,`_timer`,null),h(Ls,`_localCount`,0),h(Ls,`_callFinishedDuringDrain`,!1),h(Ls,`_blockedSession`,null),h(Ls,`_directBuffer`,[]),h(Ls,`_directTimer`,null);var Rs=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()===J.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}},zs=class e extends m{static __resetForTests(){e._pending=[],e._pendingOverflow=!1}static _remember(t){if(e._pending.length>=5e3){e._pendingOverflow||(e._pendingOverflow=!0,z.error(`[StatEventCollector] pending buffer is full, dropping events until userId is known`));return}e._pending.push(t)}static _takePending(){let t=e._pending;return e._pending=[],e._pendingOverflow=!1,t}constructor(e,t,n,r=()=>void 0){super(),h(this,`_externalLogger`,void 0),h(this,`_conversationIdProvider`,void 0),h(this,`_topologyProvider`,void 0),h(this,`_unloadMode`,!1),h(this,`_legacy`,void 0),this._externalLogger=t,this._conversationIdProvider=n,this._topologyProvider=r,this._legacy=N.statQueueEnabled?null:new Rs(e,t,n,r)}log(e,t,n=!1){this._externalLogger&&this._externalLogger.log(e,t,n)}enterUnloadMode(){this._legacy||(this._unloadMode=!0,ks.beginTabSession())}exitUnloadMode(){this._legacy||!this._unloadMode||(this._unloadMode=!1,ks.drainToQueue().then(e=>{e>0&&Ls.notifyAppended()}).catch(e=>z.error(`[StatEventCollector] failed to import unload journal`,e)))}logClientStats(t,n={}){if(this._legacy){this._legacy.logClientStats(t,n);return}let r={...t,call_topology:t.call_topology??this._getCallTopology()};Object.keys(r).forEach(e=>{r[e]===void 0&&delete r[e]}),Ds.ensure();let i={vcid:n.conversationId===void 0?this._getConversationId():n.conversationId,ts:n.occurredAt===void 0?Date.now():n.occurredAt,delta:Ds.delta(),ev:r},a=y.userId;if(a===null){e._remember(i);return}for(let t of e._takePending())this._store({...t,uid:a});this._store({...i,uid:a})}destroy(){if(this._legacy){this._legacy.destroy();return}}_store(e){this._unloadMode&&ks.writeSync(e)||Q.append(e).then(t=>{if(t!==null){typeof e.delta!=`number`&&Ds.noteAppended(t),Ls.notifyAppended();return}z.error(`[StatEventCollector] failed to store event, sending directly`),Ls.sendDirect(e)}).catch(e=>z.error(`[StatEventCollector] failed to store event`,e))}_getConversationId(){try{return this._conversationIdProvider()}catch{return null}}_getCallTopology(){try{return this._topologyProvider()===J.SERVER?`S`:`D`}catch{return`D`}}};h(zs,`_pending`,[]),h(zs,`_pendingOverflow`,!1);var Bs=class{constructor(e){h(this,`_statAggregator`,void 0),this._statAggregator=e}log(e,t,n){this._statAggregator?.logEventualStat({name:U.API_CALL,value:Math.round(t),api_method:e,string_value:n})}},Vs=`invalid-error-metadata`,Hs=64,Us=new Set(Object.values(O)),Ws=new Set(Object.values(x)),Gs={[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`}},Ks={[x.MIC_CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`mic-camera-permission`}},[x.CAMERA_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-permission`}},[x.MIC_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-permission`}},[x.CAMERA_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`camera-access`}},[x.MIC_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-access`}},[x.MIC_NOT_FOUND]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`microphone-not-found`}},[x.SCREEN_PERMISSION]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-permission`}},[x.SCREEN_ACCESS]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`screen-access`}},[x.CONNECTION]:{type:`direct-error`,error:{scope:`network`,source:`rtc`,code:`connection`,description:`connection-failed`}},[x.NETWORK]:{type:`requires-call-error`},[x.UNKNOWN]:{type:`failed`},[x.UNSUPPORTED]:{type:`requires-call-error`},[x.SIGNALING_FAILED]:{type:`requires-call-error`},[x.API]:{type:`requires-call-error`},[x.AUTH]:{type:`requires-call-error`},[x.OVERCONSTRAINED]:{type:`direct-error`,error:{scope:`internal`,code:`media`,description:`overconstrained`}}};function qs(e){if(typeof e!=`string`&&typeof e!=`number`||typeof e==`number`&&!Number.isFinite(e))return Vs;let t=String(e).trim();if(!t)return Vs;let n=t.toLowerCase().replace(/[\s_:]+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``);return!n||!/^[a-z0-9.-]+$/.test(n)?Vs:n.length>Hs?`${n.slice(0,Hs-3)}...`:n}function Js(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 Ys(e){let t=qs(e.description);if(e.scope===`unknown`)return`unknown:${t}`;let n=qs(e.code);return e.scope===`internal`?`internal:${n}:${t}`:`${e.scope}:${e.source}:${n}:${t}`}function Xs(e,t){return t===null?e.type===`direct-error`?{reason:`error`,string_value:Ys(e.error)}:{reason:`failed`}:Js(t)?{reason:`error`,string_value:Ys(t)}:{reason:`failed`}}function Zs(e){if(e.hangup){let t=Gs[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}:Xs(t,e.callError):{reason:`failed`}}if(e.error){let t=Ks[e.error];return t?Xs(t,e.callError):{reason:`failed`}}return{reason:`failed`}}function Qs(e){return e instanceof k?Zs(e):typeof e==`string`&&(Us.has(e)||Ws.has(e))?Zs(new k(e)):{reason:`failed`}}var $s={wallNow:()=>Date.now(),monotonicNow:()=>performance.now()};function ec(e){return e===`anonym_join`?`join`:e}var tc=class{constructor(e,t=$s){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=ec(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(Qs(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}})}},nc=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===J.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()}},rc=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){this._eventualLogs.add({data:e,occurredAt:Date.now()})}logEventualStatSinceMark(e){let t=G.measureMark(e.name);t!==null&&this.logEventualStat({...e,value: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}){let n={...this._lastCallStatContext??{}};for(let[t,r]of Object.entries(e))r!==void 0&&(r===null?delete n[t]:n[t]=r);this._logger.logClientStats(n,{occurredAt:t})}},ic=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]}},ac=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}},oc=class{constructor(){h(this,`count`,0),h(this,`minVal`,1/0),h(this,`maxVal`,-1/0),h(this,`mean`,new ac),h(this,`p50`,new ic(.5)),h(this,`p95`,new ic(.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}},sc=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByTransport`,{ws:new oc,wt:new oc}),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(){[wr.WEBSOCKET,wr.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 oc,wt:new oc},this.lastSeen={}}},cc=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 oc,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()}},lc=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),h(this,`apiCalls`,void 0),h(this,`_api`,void 0),h(this,`_unloading`,!1),this.logger=new zs(e,t,n,r),this.lifecycle=new tc(this.logger),this.statAggregator=new rc(this.logger),this.codecStatsAggregator=new nc(this.logger,r),this.pings=new sc(this.logger),this.signalingCommands=new cc(this.logger),this.apiCalls=new Bs(this.statAggregator),this._api=e,this._api.setApiCallStats(this.apiCalls)}prepareForUnload(){N.statQueueEnabled&&(this._unloading=!0,this.logger.enterUnloadMode(),this.pings.logMetrics(),this.signalingCommands.logMetrics())}restoreAfterUnload(){N.statQueueEnabled&&(this._unloading=!1,this.logger.exitUnloadMode())}logHangup(e){this.lifecycle.markFinished(e)}flushCallMetrics(){this.codecStatsAggregator.destroy(),this.pings.logMetrics(),this.pings.destroy(),this.signalingCommands.logMetrics(),this.signalingCommands.destroy()}destroy(){this._api.setApiCallStats(null),this.lifecycle.markTerminated(),this.lifecycle.destroy(),this.statAggregator.destroy(),this.codecStatsAggregator.destroy(),this.pings.destroy(),this.signalingCommands.destroy(),this.logger.destroy(),N.statQueueEnabled&&!this._unloading&&Ls.notifyCallFinished()}},uc=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===J.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===J.DIRECT&&this.mark(`direct_outgoing`)}markOnJoin(e){this.mark(e===J.DIRECT?`direct_join`:`server_join_server`,e===J.DIRECT)}markTopologyChanged(e){this._isFinished||e!==J.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.logEventualStatSinceMark({name:U.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},dc=1e3,fc=1e4;function pc(e,t,n,r){return new k(e,{callError:{scope:`external`,source:`api`,code:t,description:n},message:r})}var mc=15,$=class e extends b{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`,X.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`,Pr()),h(this,`_serverTimeOffset`,0),h(this,`_delayedHangup`,!1),h(this,`_onFastHangup`,void 0),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,`_onRestore`,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,`_toggleLocalVideo`,jo(e=>{if(this._mediaSource)return this._stats.logger.log(C.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)})),h(this,`_toggleLocalAudio`,jo(e=>{if(this._mediaSource)return this._stats.logger.log(C.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)})),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 lc(e,t,()=>this._conversation?.id||null,()=>this._transport?.getTopology()??this._conversation?.topology),this._api=e,this._signaling=new no(this._debug,this._stats.logger,this._stats.statAggregator,this._stats.pings,this._stats.signalingCommands),this._signalingActor=new Wo(this._onSignalingNotification.bind(this),this._debug),this._displayLayoutRequester=new Bo({api:this._api,debug:this._debug,getParticipants:()=>this._participants,isMe:e=>this._isMe(e),updateDisplayLayout:e=>this.updateDisplayLayout(e),onNonFatalError:e=>this._onNonFatalError(e)}),this._onUnload=()=>{this._stopFirstMediaSentProbe(),this._conversation&&this._api&&this._sendHangupApi(this._conversation.id,this._state===`IDLE`?O.CANCELED:O.HUNGUP),this._stats.prepareForUnload(),this._stats.destroy()},this._onRestore=()=>{this._stats.restoreAfterUnload()},window.addEventListener(`pagehide`,this._onUnload),window.addEventListener(`pageshow`,this._onRestore),this._statFirstMediaReceived=new uc(this._stats.statAggregator),this._audioOutput=new No(this._statFirstMediaReceived,N.transparentAudio,this._debug,this._stats.logger),N.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),dc))}static current(){return B.getActive()??(N.hold?null:B.getFirst())}static hangupAfterInit(e){let t=hc;if(t){if(typeof e==`function`&&(t._onFastHangup=e),t._delayedHangup===!1&&!t._conversation){t._delayedHangup=!0,t._abortController?.abort(new k(O.CANCELED));return}t._conversation&&t.hangup({onFastHangup:e,reason: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`}get isIncomingRinging(){return this._conversation?.direction===ro.INCOMING&&this._state===`IDLE`}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}getCachedParticipantIdByExternalId(e){return this._api.getCachedParticipantIdByExternalId(e)}_onNonFatalError(e){R.onNonFatalError(Error(e),this.id)}getIncomingCallerExternalId(){return this._conversation?.direction===ro.INCOMING?Object.values(this._participants).find(e=>!this._isMe(e.id))?.externalId??null:null}_buildInternalParams(){let e={deviceId:this._api.deviceId(),sdkVersion:N.sdkVersion,clientAppKey:N.apiKey,platform:N.platform,protocolVersion:N.protocolVersion,domainId:N.domain,capabilities:La.getFlags()};return JSON.stringify(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===io.USER&&d===1?N.calleeUnavailableWaitingTime:void 0;this._stats.lifecycle.markInitializationStarted({source:`outgoing`,conversationId:u}),this._debug.setConversationId(u),hc=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===io.CHAT||e&&e.length>1?this._logWithMediaSettings(C.OUTGOING_MULTIPARTY_CALL,l):this._logWithMediaSettings(C.OUTGOING_CALL,l);let d=await this._startConversation({opponentIds:e,opponentType:t,direction:ro.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=X.ACCEPTED,this._changeMediaSettings(l),await this._processConnection(d),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._signaling.readyToSend(),this._delayedHangup)throw new k(O.CANCELED);if(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(),this._conversation?.concurrent){let e=B.get(this._conversation.id);e&&e!==this&&e._close(new k(O.HUNGUP,{remote:!0}))}return B.add(this),await B.setActive(this.id),hc=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 hc=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}),hc=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(C.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),hc=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 hc=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=X.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),hc=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 hc=null,this._cleanupRegistry(),this._close(e,{errorText:`Unable to join conversation`}),e}}_extractExternalRooms(e){let t=[],n=[];return e.forEach(e=>{let{room:r,missingParticipantIds:i}=this._convertRoomToExternal(e);r&&n.push(r),t.push(...i)}),this._reportMissingExternalIds(t,`EXTRACT_EXTERNAL_ROOMS`),n.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,a&&this._api.setUserId(a),this._stats.lifecycle.markInitializationStarted({source:`incoming`,conversationId:e}),this._debug.setConversationId(e),hc=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);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===X.CALLED&&e.id===this._conversation?.userId))throw this._debug.log(`Push rejected (there is an active call)`),this._stats.logger.log(C.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(C.PUSH,`accepted`),B.add(this),hc=null,this._delayedHangup)throw new k(O.CANCELED)}catch(e){throw hc=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(so.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(so.WAIT_FOR_ADMIN),n=e.conversation.options.includes(so.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(so.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(C.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=X.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=Ao(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(C.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(C.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._stats.lifecycle.markIncomingAccepted(!1),this._participantState=X.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(C.ERROR,`declineIncoming`),this._debug.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);let t=e?.reason;this._state=`PROCESSING`,this._debug.debug(`Decline incoming call`),this._logWithMediaSettings(C.DECLINE_INCOMING,this.mediaSettings),this._participantState=X.HUNGUP;let n=t??O.REJECTED,r=new k(n);this._finishLifecycle(r),this._onFastHangup=e?.onFastHangup??this._onFastHangup;let i=this._conversation?.id;i&&typeof this._onFastHangup==`function`&&this._sendHangup(i,n,this._onFastHangup),this._close(r,{signalingReason:n})}hangup(e){if(this._hangupPromise)return this._hangupPromise;let t=e?.reason;this._clearCalleeUnavailableWatchdog(),this._debug.debug(`Hangup`);let n=t??(this._state===`ACTIVE`||this._state===`HELD`?O.HUNGUP:O.CANCELED),r=new k(n),i=this._conversation?.id??null;this._onFastHangup=e?.onFastHangup??this._onFastHangup,this._stats.logger.log(C.HANGUP,n),this._finishLifecycle(r);let a=!!i&&typeof this._onFastHangup==`function`;return i&&a&&this._sendHangup(i,n,this._onFastHangup),this._hangupPromise=this._signaling.hangup(n).then(()=>void 0).catch(e=>{if(!(e instanceof On))throw e}).finally(()=>(i!=null&&!a&&this._sendHangupApi(i,n),this._close(r))),this._emitHangupOnce(r,i),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(Z.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===X.CALLED||i.state===X.ACCEPTED)&&(this._transport.isAllocated(i.id)||this._allocateParticipantTransport(i.id,t)),i.state===X.ACCEPTED&&!n.has(i.id)&&r.push(i.id);r.length?this._transport.open(r,null,!!this._conversation?.observer):this._transport.getTopology()===J.SERVER&&this._forceOpenTransportForAloneInCall()}_allocateParticipantTransport(e,t){this._transport&&(this._transport.getTopology()===J.DIRECT&&(t=this._directTransportIsMaster??(this._directTransportIsMaster=t)),this._transport.allocate(e,t))}_closeParticipantTransport(e){let t=this._transport?.getTopology()===J.DIRECT&&this._transport.opened().includes(e);this._transport?.close(e),t&&(this._directTransportIsMaster=void 0)}_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(C.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,O.HAS_ACTIVE_CALL].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=X.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)}_sendHangup(e,t,n){typeof n==`function`?n({conversationId:e,reason:t,internalParams:this._buildInternalParams()},this._abortController?.signal).then(e=>{e?.success||this._debug.error(`Fast hangup was not successful`,e)}).catch(e=>{this._debug.error(`Fast hangup error`,e)}):this._sendHangupApi(e,t)}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=X.HUNGUP,this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._disposeSignaling(e),this._delayedHangup&&t)try{this._sendHangup(t,O.CANCELED,this._onFastHangup)}catch{}this._api.cleanup(),this._api.setAbortSignal(void 0),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=ko(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=ko(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(S.VIDEO),p,m;if(l){let e;try{if(e=await l({internalParams:this._buildInternalParams(),conversationId:d,externalIds:c,payload:i,opponentType:t,mediaOptions:r,isVideo:f,joiningAllowed:a,requireAuthToJoin:o},this._abortController?.signal),!e)throw pc(O.FAST_START_ERROR,`invalid-response`,`fast-start-response-empty`);if(!e.internalCallerParams){let t=e.rejectedParticipants[0]?.status;throw pc(O.FAST_START_ERROR,t?`fast-start`:`invalid-response`,t??`fast-start-internal-caller-params-empty`,JSON.stringify(e))}}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 t=JSON.parse(e.internalCallerParams);p={endpoint:t.endpoint,wt_endpoint:t.wtEndpoint,id:d,is_concurrent:t.isConcurrent,client_type:t.clientType,rejected_participants:e.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:t.stun,turn_server:t.turn,token:new URL(t.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastStart`,p),m=`fastStart`}catch{throw pc(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`;Po(p,m),this._setConversationParams(p),this._stats.lifecycle.bindConversationId(p.id);let ee=await this._connectSignaling(Sr.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(S.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;try{if(e=await s({joinLink:i,isVideo:c,internalParams:this._buildInternalParams()},this._abortController?.signal),!e)throw pc(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-response-empty`);if(!e.internalCallerParams)throw pc(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-internal-caller-params-empty`,JSON.stringify(e));if(!e.conversationId)throw pc(O.FAST_JOIN_ERROR,`invalid-response`,`fast-join-conversation-id-empty`,JSON.stringify(e))}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 t=JSON.parse(e.internalCallerParams);if(B.has(e.conversationId))throw new k(O.HAS_ACTIVE_CALL);l={endpoint:t.endpoint,wt_endpoint:t.wtEndpoint,id:e.conversationId,is_concurrent:t.isConcurrent,client_type:t.clientType,stun_server:t.stun,turn_server:t.turn,token:new URL(t.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastJoin`,l),u=`fastJoin`}catch(e){throw e instanceof k?e:pc(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),Po(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(Sr.JOIN,l);return this._setConversation(l,d,ro.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(Sr.ACCEPT,l);return B.callsLength>=N.maxParallelCalls||!N.hold&&B.callsLength>0?(this._debug.log(`Push rejected (busy)`),this._stats.logger.log(C.PUSH,`busy`),Promise.reject(new k(O.BUSY))):(this._setConversation(l,u,ro.INCOMING,t),u)}_createParticipant(e,t,n=!0){let r=Object.assign({id:null,externalId:null,mediaSettings:D(),participantState:{},state:X.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;if(!i){let e=this._getParticipantId(t??r.id);e&&(r.externalId=e)}return n&&i&&this._api.cacheExternalId(t??r.id,r.externalId),t&&this._api.mapDecorativeId(t,r.id),r.observedIds?.length&&r.externalId&&(r.externalId.observer=!0),e.markers&&(r.markers=this._denormalizeMarkers(r.id,e.markers)),r.connectionStatus=vo.create(r.connectionStatus),r}_getParticipantId(e){let t=this._api.userId(e);if(t)return t;let{compositeUserId:n,deviceIdx:r}=M.decomposeParticipantId(e),{id:i,type:a}=M.decomposeId(n);return a===j.GROUP?Z.fromId(String(i),void 0,r):null}_cacheParticipantExternalIds(e){e.forEach(e=>{let t=M.composeId(e),n=Z.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=M.composeDecorativeId(e),i=Z.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(r,t))}})}_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||J.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(C.RELAY_POLICY,N.forceRelayPolicy?`1`:`0`);let l=B.get(this._conversation.id);if(l&&l!==this)this._conversation.concurrent=!0;else if(!N.hold&&B.callsLength>0)throw new k(O.HAS_ACTIVE_CALL);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||J.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 Zt(this._debug,this._stats.logger);return this.subscribe(e,Yt.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,Yt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new Mo(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,Cr.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,Cr.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Cr.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return this._stats.statAggregator.logEventualStatSinceMark({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(ao.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===X.HUNGUP||n.state===X.REJECTED){r[n.id]&&await this._removeParticipant(r[n.id],O.HUNGUP);continue}let i=M.composeDecorativeId(n);this._registerParticipant({id:e,externalId:Z.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=So(e,uo.MUTE),r=So(e,uo.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 vo.create({transport:r?P.ONHOLD:vo.fromTransportState(n)??P.WAITING,sessionState:this._remoteParticipantSessionState(e,t),sessionStateApplicable:this._isParticipantSessionStateApplicable(e)})}_isParticipantSessionStateApplicable(e){return N.enableSessionStateUpdates&&!this._isMe(e)&&this._conversation?.topology===J.SERVER}_setTransportStatus(e,t){return vo.setTransport(e.connectionStatus,t)}_setSessionState(e,t){let n=vo.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=vo.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(e),r=this._getParticipantId(e),{deviceIdx:i}=M.decomposeParticipantId(e);return this._createParticipant({id:e,externalId:r?{...r,deviceIdx:i}:void 0},n,!1)}_getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId??null;if(N.useParticipantListChunk)return this._getExistedParticipantByIdOrCreate(e).externalId;let t=this._participants;if(t[e]?.externalId)return t[e].externalId;let n=this._api.getCachedExternalIdByParticipantId(e);if(n)return n;let r=this._getParticipantId(e);return r&&this._api.cacheExternalId(e,r),r}_getExternalIdsByParticipantIds(e){let t=[],n=[];return e.forEach(e=>{let r=this._getExternalIdByParticipantId(e);r?t.push(r):n.push(e)}),{externalIds:t,missingIds:n}}_reportMissingExternalIds(e,t){e.length&&this._onNonFatalError(`External ID mapping not found for participants "${Array.from(new Set(e)).join(`", "`)}" while handling ${t}`)}_reportMissingExternalIdsById(e,t){e.length&&this._onNonFatalError(`Participant ID mapping not found for external IDs "${Array.from(new Set(e)).join(`", "`)}" while handling ${t}`)}_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=Co(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=Do(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 Ta(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 zo(this._debug),this.subscribe(this._transport,Y.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,Y.LOCAL_STATE_CHANGED,this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,Y.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,Y.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,Y.AUDIO_MIX_STALL,this._onAudioMixStall.bind(this)),this.subscribe(this._transport,Y.REMOTE_DATA_STATS,this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,Y.SIGNALLED_STALLED_PARTICIPANTS,this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,Y.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this)),this.subscribe(this._transport,Y.NETWORK_STATUS,this._onNetworkStatus.bind(this)),this.subscribe(this._transport,Y.REMOTE_STREAM_SECOND,this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,Y.PEER_CONNECTION_CLOSED,this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,Y.ASR_TRANSCRIPTION,this._onAsrTranscription.bind(this)),this.subscribe(this._transport,Y.ANIMOJI_STREAM,this._onAnimojiStream.bind(this)),this.subscribe(this._transport,Y.ANIMOJI_ERROR,this._onAnimojiError.bind(this));let e=this._conversation.direction===ro.OUTGOING&&!this._conversation.concurrent,t=this._participants;for(let n of Object.values(t))(n.state===X.ACCEPTED||n.state===X.CALLED)&&this._allocateParticipantTransport(n.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Ko(this._transport),this.subscribe(this._volumesDetector,Go.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new Jo(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,qo.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Uo(this._mediaSource))}_createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Zo(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._debug.debug(`Devices`,E.getDevices()),this._stats.logger.log(C.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===X.CALLED||e.state===X.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),window.removeEventListener(`pageshow`,this._onRestore)}_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._audioOutput.destroy(),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 On||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===X.ACCEPTED||r.state===X.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:Z.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=X.HUNGUP,await this._removeParticipant(r,n)):this._transport&&(r.state=X.CALLED,this._allocateParticipantTransport(r.id,!0),this._stats.logger.log(C.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}_onRemoveParticipant(e){this._debug.debug(`Remove participant [${e}]`);let t=[],n=this._participants;for(let r=0;r<=mc;r++){let i=n[M.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}for(let e of t)this._closeParticipantTransport(e.id);this._stats.logger.log(C.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(x.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(x.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(x.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)}toggleLocalVideo(e){return this._toggleLocalVideo(e)}toggleLocalAudio(e){return this._toggleLocalAudio(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:Z.fromId(t.uid),r=Z.toString(e);n[r]=t.priority}let r=this._participants;for(let e of Object.values(r)){let r=Z.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=Fa.get();await this._signaling.hold(!1,n),this._restoreStateAfterHold();let r=null;if(this._state===`IDLE`&&this._participantState===X.ACCEPTED&&(r=Object.values(this._participants),r.some(e=>e.state===X.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===ro.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[In(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=[],i=this._participants;for(let a of e){let e=typeof a.uid==`object`?a.uid:Z.fromId(a.uid),o=this._api.getCachedParticipantIdByExternalId(e);if(!o){let t=Z.toString(e);this._debug.log(`Unknown participant external ID ${t}`),r.push(e.id);continue}let s=In({participantId:o,mediaType:a.mediaType,streamName:a.streamName}),c=i[o];c?n.push(()=>{c.lastRequestedLayouts[s]=a}):this._isMe(o)&&n.push(()=>{this._myLastRequestedLayouts[s]=a}),jn(a)?(this._isMe(o)&&n.push(()=>{delete this._myLastRequestedLayouts[s]}),this._streamIdByStreamDescription.has(s)&&!this._cooldownTimestampByStreamDescription.has(s)&&this._cooldownTimestampByStreamDescription.set(s,Date.now())):(this._cooldownTimestampByStreamDescription.delete(s),!this._streamIdByStreamDescription.has(s)&&N.videoTracksCount>0&&this._streamIdByStreamDescription.set(s,null),t[s]=a),a.mediaType===H.SCREEN&&!jn(a)&&G.setMark(G.getMarkNameScreenshareFirstFrame(o))}if(r.length){this._reportMissingExternalIdsById(r,`updateDisplayLayout`);return}let a=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>N.videoTracksCount;){let e=a.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()!==J.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=Ln(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(C.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=Ln(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=mo(t):(this._debug.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=po.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 gc(`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]+fc>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)}_onChatRoomUpdated(e,t=0,n=[],r,i){this._debug.log(`Chat room updated: ${e}`);let a=[],o=[];n.length&&n.forEach(e=>{if(e.externalId){let t=Z.fromSignaling(e.externalId);a.push(t),this._api.cacheExternalId(e.id.id,t)}else{let t=this._getExternalIdByParticipantId(e.id.id);t?a.push(t):o.push(e.id.id)}});let{externalIds:s,missingIds:c}=this._getExternalIdsByParticipantIds(r??[]);o.push(...c);let{externalIds:l,missingIds:u}=this._getExternalIdsByParticipantIds(i??[]);o.push(...u),this._reportMissingExternalIds(o,`CHAT_ROOM_UPDATED`),R.onChatRoomUpdated(e,t,a,s,l,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=Ln(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=In(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(C.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(C.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(C.PAT_ERROR,`streamNotFound`),this._debug.error(`Could not find stream by ID: ${s}`);return}this._stats.logger.log(C.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(In(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(In(e)))return e}else{let e={participantId:t,mediaType:H.CAMERA};if(this._streamIdByStreamDescription.has(In(e)))return e;let n={participantId:t,mediaType:H.SCREEN};if(this._streamIdByStreamDescription.has(In(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,[ho.ADMIN,ho.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!M.includesOneOf(this._conversation.roles,[ho.ADMIN,ho.CREATOR]))throw Error(`You don't have the required permission`)}_isCalledState(){return this._participantState===X.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()===J.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===J.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=lo(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=xo(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=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}=this._resolveWaitingHallExternalIds(a,`getWaitingHall`),s=null;return a.length&&i.hasMore&&(s=bo(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}_resolveWaitingHallExternalIds(e,t){let n=[],r=[],i=[];return e.length&&e.forEach(e=>{if(e.externalId){let t=Z.fromSignaling(e.externalId);n.push(e.id.addedTs),r.push(t),this._api.cacheExternalId(e.id.id,t)}else{let t=this._getExternalIdByParticipantId(e.id.id);t?(r.push(t),n.push(e.id.addedTs)):i.push(e.id.id)}}),this._reportMissingExternalIds(i,t),{externalIds:r,timestamps:n}}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}=this._resolveWaitingHallExternalIds(t,`getAudienceModeHands`);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,[so.WAITING_HALL,so.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:Z.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)},M.composeDecorativeId(e))}))}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,vo.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 Mo(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.externalId?R.onRemoteMediaSettings(r.externalId,t,r.markers,this.id):this._reportMissingExternalIds([e],`REMOTE_MEDIA_SETTINGS`)),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)&&(n.externalId?R.onRemoteParticipantState(n.externalId,n.participantState,n.markers,this.id):this._reportMissingExternalIds([e],`REMOTE_PARTICIPANT_STATE`))}_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 K.ACCEPTED_CALL:return this._onAcceptedCall(e);case K.HUNGUP:return this._onHungup(e);case K.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case K.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case K.CLOSED_CONVERSATION:return this._onClosedConversation(e);case K.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case K.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case K.SESSION_STATE:return this._onSessionState(e);case K.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case K.RATE_CALL_DATA:return this._onNeedRate();case K.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case K.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case K.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case K.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case K.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case K.REGISTERED_PEER:return this._onPeerRegistered(e);case K.SWITCH_MICRO:return this._onMicSwitched(e);case K.CHAT_MESSAGE:return this._onChatMessage(e);case K.CUSTOM_DATA:return this._onCustomData(e);case K.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case K.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case K.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case K.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case K.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case K.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case K.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case K.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case K.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case K.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case K.FEEDBACK:return this._onFeedback(e);case K.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case K.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case K.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case K.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case K.ROOMS_UPDATED:return this._onRoomsUpdated(e);case K.ROOM_UPDATED:return this._onRoomUpdated(e);case K.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case K.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case K.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case K.ASR_STARTED:return this._onAsrStart(e);case K.ASR_STOPPED:return this._onAsrStop(e);case K.PROMOTION_APPROVED:return this._onPromotionApproved(e);case K.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case K.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e);case K.HOLD:return this._onParticipantHold(e);case K.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)){go(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:Eo(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);Kt(t,a.mediaSettings)||this._changeRemoteMediaSettings(e,t);let r=M.mapParticipantState(n),o=a.participantState;M.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),go(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)){if(this._conversation.concurrent)return;this._close(new k(O.MISSED),{errorText:`Call accepted on other device`});return}this._conversation?.direction===ro.OUTGOING&&!this._conversation.concurrent&&this._stats.lifecycle.markOutgoingAccepted();let r=this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t);r=this._registerParticipantInCache(this._createParticipant({id:t,externalId:e.externalId?Z.fromSignaling(e.externalId,e.deviceIdx):void 0,mediaSettings:D(e.mediaSettings)},n))}else if(e.externalId){let t=Z.fromSignaling(e.externalId,e.deviceIdx);r.externalId=t,this._api.cacheExternalId(r.id,t)}r.state=X.ACCEPTED,r.mediaSettings=D(e.mediaSettings),this._logWithMediaSettings(C.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===ro.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);if(i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),[`ACTIVE`,`HELD`].includes(this._state)){if(!r.externalId){this._reportMissingExternalIds([t],`ACCEPTED_CALL`);return}R.onAcceptedCall(r.externalId,La.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._closeParticipantTransport(t),n.state=e.reason===O.REJECTED?X.REJECTED:X.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=vo.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=Z.fromSignalingParticipant(t)??Z.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!==X.HUNGUP&&n.state!==X.REJECTED){this._debug.debug(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=M.composeDecorativeId(r);this._registerParticipant({id:t,externalId:Z.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=X.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===X.ACCEPTED){this._debug.warn(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=M.composeDecorativeId(r);this._registerParticipant({id:t,externalId:Z.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===ro.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=X.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}):void 0]);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=Nr(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=Nr(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(S.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)&&!go(this._conversation.roles,t)){this._debug.debug(`Local roles changed: ${t}`),this._conversation.roles=t,R.onLocalRolesChanged(t,!1,this.id),this._processMuteState({mediaOptions:So(this._getMuteStatesForCurrentRoom(),uo.MUTE_PERMANENT),stateUpdated:!0}),M.includesOneOf(t,[ho.ADMIN,ho.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=this._getParticipant(e);n&&!go(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!==X.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!==uo.MUTE&&i!==uo.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===uo.MUTE_PERMANENT&&!n&&(l[e]=uo.MUTE),!(!t.includes(e)||r)))switch(e){case S.VIDEO:u.isVideoEnabled&&(R.onDeviceSwitched(S.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case S.AUDIO:u.isAudioEnabled&&(R.onDeviceSwitched(S.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case S.SCREEN_SHARING:u.isScreenSharingEnabled&&(R.onDeviceSwitched(S.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case S.AUDIO_SHARING:u.isAudioSharingEnabled&&(R.onDeviceSwitched(S.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&&!co(this._conversation.options,e)&&(this._conversation.options=e,R.onOptionsChanged(e,this.id),e.includes(so.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&R.onLocalStatus(P.WAITING_HALL,this.id):e.includes(so.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,fi.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===J.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy())}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(oo.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=vo.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=vo.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===q.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===q.CONNECTED&&(E.releaseFirefoxMicrophonePermissionWarmup(),R.onLocalStatus(P.CONNECTED,this.id),this._transport?.getTopology()===J.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e),this._displayLayoutRequester.resend()}this._state!==`HELD`&&((e===q.CONNECTING||e===q.RECONNECTING)&&this._areTransportParticipantsOnHold()||(e===q.CONNECTING&&R.onLocalStatus(P.CONNECTING,this.id),e===q.RECONNECTING&&R.onLocalStatus(P.RECONNECT,this.id),e===q.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(ci.AUDIO_MIX))this._debug.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),R.onRemoteMixedAudioStream(t,this.id);else if(e.startsWith(ci.TRANSPARENT_AUDIO_TRACK_PREFIX))this._debug.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(ci.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);this._debug.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${t}]`),this._registerParticipant({id:e},t),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!==ci.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===J.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation){this._conversation.topology=e;for(let e of Object.values(this._participants)){let t=vo.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){t[r]=!0;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._setParticipantsStalled(n,!0),r.length&&this._setParticipantsStalled(r,!1),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()===J.SERVER&&e.length)try{await this.updateDisplayLayout(e)}catch(e){this._debug.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){this._updateParticipantsStatus(e,e=>e.isOnHold&&![P.ONHOLD,P.HANGUP,P.ERROR].includes(t)?null:this._setTransportStatus(e,t),n)}_setParticipantsStalled(e,t){this._updateParticipantsStatus(e,e=>vo.setStalled(e.connectionStatus,t))}_updateParticipantsStatus(e,t,n=null){let r=e.reduce((e,n)=>{let r=t(n);if(r?.shouldNotify){var i;(e[i=r.status]??(e[i]=[])).push(n.externalId)}return e},{});for(let[e,t]of Object.entries(r))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={},n=[],r=[];for(let i of Object.keys(fo)){let a=e.updates[i];a&&(a?.rooms?.forEach(e=>{let{room:t,missingParticipantIds:i}=this._convertRoomToExternal(e);t&&n.push(t),r.push(...i)}),t[i]={rooms:n,roomIds:a?.roomIds,deactivated:a?.deactivated})}this._reportMissingExternalIds(r,`ROOMS_UPDATED`),R.onRoomsUpdated(t,this.id)}_onRoomUpdated(e){let{room:t,missingParticipantIds:n}=this._convertRoomToExternal(e.room||null);e.events.some(e=>e===fo.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()||(this._reportMissingExternalIds(n,`ROOM_UPDATED`),R.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null,this.id))}_convertRoomToExternal(e){if(!e)return{room:null,missingParticipantIds:[]};let t=[],{externalIds:n,missingIds:r}=this._getExternalIdsByParticipantIds(e.participantIds??[]),{externalIds:i,missingIds:a}=this._getExternalIdsByParticipantIds(e.addParticipantIds??[]),{externalIds:o,missingIds:s}=this._getExternalIdsByParticipantIds(e.removeParticipantIds??[]);t.push(...r,...a,...s);let c;if(e.pinnedParticipantId){let n=this._getExternalIdByParticipantId(e.pinnedParticipantId);n?c=n:t.push(e.pinnedParticipantId)}return{room:{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:n,addParticipantIds:i,removeParticipantIds:o,participants:e.participants?.participants?this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:c,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs},missingParticipantIds:t}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=[],{externalIds:i,missingIds:a}=this._getExternalIdsByParticipantIds(e.addedParticipantIds??[]);r.push(...a);let o=e.addedParticipants;if(i.length&&o?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);o=(await this._signaling.getParticipants(e)).participants}let s=o?.map(e=>{let r=M.composeId(e);return this._createParticipant({id:r,externalId:Z.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},M.composeDecorativeId(e))})||[],c=!1;for(let e of s)e.id===this._conversation?.compositeUserId&&(c=!0),this._registerParticipantInCache(e);this._transport?.getState()===q.IDLE&&!this._isCalledState()&&this._openTransport(s,!0);let l=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);e?l.push(e):r.push(t.GRID.id)}}if(this._reportMissingExternalIds(r,`ROOM_PARTICIPANTS_UPDATED`),c&&await this._onRoomSwitched(n),l){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=this._getExternalIdByParticipantId(e);if(t){for(let e of l)if(Z.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let u={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:M.mapSharedParticipants(s),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:l};this._isCalledState()||R.onRoomParticipantsUpdated(u,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{room:n}=this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&R.onRoomsUpdated({[fo.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=Z.fromSignaling(r,a.deviceIdx);R.onParticipantIdChanged(a,o,this.id);let s=M.compose(n,a.deviceIdx),c=M.compose(t,a.deviceIdx);if(this._api.cacheExternalId(s,o),this._api.mapDecorativeId(s,c),i)this._conversation.externalId=o;else{let e=this._participants;e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==J.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),this._audioOutput.destroy();else{let e=this._transport?.getTopology()===J.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()===J.SERVER&&this._transport?.getState()===q.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]}},hc=null,gc=class e extends Error{constructor(t,n){super(t),h(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},_c=class{constructor(){h(this,`_abortSignal`,void 0),h(this,`_apiCallStats`,null)}setApiCallStats(e){this._apiCallStats=e}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){return Promise.resolve()}logClientStatsWith(e,t){return Promise.resolve()}getCachedParticipantIdByExternalId(e){return null}getCachedExternalIdByParticipantId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}hangupConversation(e,t=O.HUNGUP,n){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}async getInbounds(){return[]}},vc=class e{constructor(){h(this,`_participantIdToExternalId`,new Map),h(this,`_externalIdToParticipantId`,new Map),h(this,`_decorativeIdToInitialId`,new Map),h(this,`_initialIdToDecorativeId`,new Map)}static _normalizeType(e){return e.type===yo.GROUP?{...e,type:yo.USER}:e}getExternalId(e){let t=this._initialIdToDecorativeId.get(e)??e,n=this._participantIdToExternalId.get(t);return n==null?null:Z.fromString(n)}getParticipantId(t){let n=Z.toString(e._normalizeType(t)),r=this._externalIdToParticipantId.get(n);return r==null?null:this._decorativeIdToInitialId.get(r)??r}cache(t,n){let r=e._normalizeType(n),i=Z.toString(r);this._participantIdToExternalId.set(t,i),this._externalIdToParticipantId.set(i,t)}mapDecorativeId(e,t){this._decorativeIdToInitialId.set(e,t),this._initialIdToDecorativeId.set(t,e)}unmapDecorativeId(e){let t=this._initialIdToDecorativeId.get(e);t&&this._decorativeIdToInitialId.delete(t),this._initialIdToDecorativeId.delete(e)}getDecorativeIdByInitialId(e){return this._initialIdToDecorativeId.get(e)}clear(){this._participantIdToExternalId.clear(),this._externalIdToParticipantId.clear(),this._decorativeIdToInitialId.clear(),this._initialIdToDecorativeId.clear()}},yc=`anonymLogin:`,bc=700,xc=3e3;function Sc(e){let t=e.error_code;switch(t){case 2:return Cc(O.SERVICE_UNAVAILABLE,t,`service-unavailable`);case 4:return e.error_msg.includes(`participants.limit.exceeded`)?Cc(O.PARTICIPANT_LIMIT_REACHED,t,`participants-limit-exceeded`):Cc(x.API,t,`request-error`);case 300:return Cc(O.NOT_FOUND,t,`not-found`);case 1101:return Cc(O.SERVICE_DISABLED,t,`vchat-service-disabled`);case 1102:return Cc(O.CALLEE_IS_OFFLINE,t,`target-user-unavailable`);case 1103:return Cc(O.NOT_FRIENDS,t,`friendship-required`);case 1104:return Tc(t,`youla-api-error`);case 1106:return Tc(t,`vk-api-error`);case 1113:return Cc(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 Cc(r?O.OBSOLETE_CLIENT:O.VCHAT_DETAILED_ERROR,t,n??`detailed-error`,r?n:void 0)}default:return Cc(x.API,t,`api-error`)}}function Cc(e,t,n,r){return{type:e,callError:{scope:`server`,source:`api`,code:t,description:n},message:r}}function wc(e){return e?.error_code===void 0?e instanceof k&&e.callError&&`code`in e.callError?String(e.callError.code):e instanceof Error?e.name:`network`:String(e.error_code)}function Tc(e,t){return{type:O.EXTERNAL_API_ERROR,callError:{scope:`external`,source:`api`,code:e,description:t}}}var Ec=class extends _c{constructor(...e){super(...e),h(this,`_uuid`,void 0),h(this,`_idCache`,new vc)}async _callUnsafe(e,t={},n=!1){let r=async i=>{let a=performance.now();try{let r=await _s(e,t,n);return this._apiCallStats?.log(e,performance.now()-a),r}catch(t){if(this._apiCallStats?.log(e,performance.now()-a,wc(t)),!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*bc,xc),{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;if($o(i?.error_code)&&r)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),Dc(i)){let e=Sc(i);throw a.callError=e.callError,a.message=e.message??a.message,new k(e.type,a)}throw new k(x.API,a)}}userId(e){if(y.isEmpty()){let{compositeUserId:t}=M.decomposeParticipantId(e),{id:n}=M.decomposeId(t);return Z.fromId(String(n))}return this._idCache.getExternalId(e)}async authorize(){if(this._ensureUuid(),!N.apiKey)throw new k(x.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}return this._anonymLogin(N.authToken).then(e=>{this._applyAnonymLogin(e),this._setCachedAnonymLogin(e)}).catch(e=>{throw e instanceof k?e:(e?.error_code===Qo.AUTH_LOGIN&&(this._removeCachedAnonymLogin(),R.onTokenExpired()),new k(x.AUTH,{message:e?.error_msg,code:e?.error_code,callError:{scope:`server`,source:`api`,code:e?.error_code??`authentication`,description:`authentication-failed`}}))})}_anonymLogin(e){let t={session_data:{version:2,device_id:this._uuid,client_version:N.apiClientVersion,client_type:`SDK_JS`}};return e&&(t.session_data.auth_token=e,t.session_data.version=3),this._callUnsafe(`auth.anonymLogin`,t,!0)}_getAnonymLoginCacheKey(){return N.authToken?`${yc}${N.authToken}`:null}_getCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();if(!e)return null;let t=w.get(e);return Oc(t)?t:(t&&w.remove(e),null)}_setCachedAnonymLogin(e){let t=this._getAnonymLoginCacheKey();!t||!Oc(e)||w.set(t,{session_key:e.session_key,session_secret_key:e.session_secret_key,uid:e.uid})}_removeCachedAnonymLogin(){let e=this._getAnonymLoginCacheKey();e&&w.remove(e)}_reauthorize(){return this._removeCachedAnonymLogin(),y.reauthorize(()=>this.authorize())}_applyAnonymLogin(e){e.uid&&(y.userId=Number(e.uid)),y.sessionKey=e.session_key,y.sessionSecretKey=e.session_secret_key,N.statQueueEnabled&&e.uid&&Ts.remember(Number(e.uid),{sessionKey:e.session_key,endpoint:Ts.currentEndpoint()})}_buildClientStatsData(e){let t={app_version:N.appVersion,sdk_type:`WEB`,sdk_version:N.sdkVersion,version:1,items:e};return N.clientStatsPlatform&&(t.platform=N.clientStatsPlatform),{data:JSON.stringify(t)}}_reportClientStatsItemErrors(e){e?.items_responses?.forEach(e=>{e.errors&&z.error(`[vchat.clientStats]`,e)})}async _sendClientStatsWith(e,t){let n=await _s(`vchat.clientStats`,{...t,session_key:e},!0);this._reportClientStatsItemErrors(n)}async _sendClientStats(e,t,n=!0){try{let n=t?await vs(`vchat.clientStats`,e):await _s(`vchat.clientStats`,e);this._reportClientStatsItemErrors(n)}catch(r){if(!n||!$o(r?.error_code))throw r;await this._reauthorize(),await this._sendClientStats(e,t,!1)}}async logClientStats(e){let t=this._buildClientStatsData(e);if(!N.statQueueEnabled){this._sendClientStats(t,!0).catch(e=>z.error(`[vchat.clientStats]`,e));return}await this._sendClientStats(t,!1)}async logClientStatsWith(e,t){await this._sendClientStatsWith(e,this._buildClientStatsData(t))}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()),xs(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:N.protocolVersion,capabilities:La.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 io.USER:u.uids=t.join(`,`);break;case io.GROUP:u.gid=t[0];break;case io.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=w.get(`uuid`);e||(e=M.uuid(),w.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(Z.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 y.userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:N.protocolVersion,capabilities:La.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),N.anonymToken&&(i.anonymToken=N.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}getCachedParticipantIdByExternalId(e){return this._idCache.getParticipantId(e)}getCachedExternalIdByParticipantId(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)}async getConversationParams(e){let t={};return N.anonymToken&&(t.anonymToken=N.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return y.userId}setUserId(e){y.userId=e,N.statQueueEnabled&&y.sessionKey&&Ts.remember(Number(e),{sessionKey:y.sessionKey,endpoint:Ts.currentEndpoint()})}hangupConversation(e,t=O.HUNGUP,n){let r={conversationId:e,reason:t};N.anonymToken&&(r.anonymToken=N.anonymToken),n?.peerId&&(r.peerId=n.peerId),gs(`vchat.hangupConversation`,r)}async removeHistoryRecords(e){await this._call(`vchat.removeHistoryRecords`,{recordIds:e.join(`,`)})}cleanup(){this._idCache.clear()}async getServerTime(){return(N.statQueueEnabled?await this._call(`system.getInfo`,{},!1,!1):await this._call(`system.getInfo`)).serverTime}async getInbounds(){let e=await this._call(`vchat.getInbounds`);return Array.isArray(e?.inbounds)?e.inbounds:[]}};function Dc(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}function Oc(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 kc=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(kc||{}),Ac=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),jc=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}},Mc=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 _s(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:N.apiClientVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await ms(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 _s(`vchat.hangupConversation`,n,!0,await ms(this._baseApiUrl,this._apiEnv))}},Nc,Pc=null,Fc=!1,Ic={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},Lc={participantMarkerCompare:M.participantMarkerCompare};function Rc(e){Pc=e}function zc(e){N.videoEffects=e}function Bc(e){N.audioEffects=e}function Vc(e,t={}){N.vad=e,N.vadOptions=t}function Hc(e,t=null,n={},r=1){N.vmoji=e,N.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function Uc(e){N.set(e),Nc||(Nc=new Ec),N.statQueueEnabled&&(Ds.setApi(Nc),N.autoStartStats&&Xc()),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(x.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 Wc(e,t=[S.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),Kc([],io.USER,t,n,r,i,a,c,o,s)}function Gc(e,t=[]){let n=e.getIncomingCallerExternalId();return n?t.length===1&&t[0].id===n.id&&t[0].type===n.type:!1}async function Kc(e,t=io.USER,n,r=``,i=!1,a=!1,o,s,c,l){if(!N.hold&&B.getActive())throw z.error(`There is already active call`),new k(O.HAS_ACTIVE_CALL);let u=B.getAll().find(e=>e.isIncomingRinging);if(!N.hold&&u&&!Gc(u,s))throw z.error(`There is already incoming call`),new k(O.HAS_ACTIVE_CALL);return new $(new Ec,Pc).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function qc(e,t){return Jc(e,j.USER,void 0,t)}async function Jc(e,t=j.USER,n,r,i,a){if(e===$.id())throw Error(`Push has already been processed`);return new $(new Ec,Pc).onPush(e,t,n,r,i,a)}async function Yc(){return Nc.getInbounds()}function Xc(){if(N.statQueueEnabled){if(!Nc){z.error(`[CallsSDK] startStats() called before init()`);return}Fc||(Fc=!0,Ls.start(Nc))}}async function Zc(e,t){return e&&(N.authToken=e),t!==void 0&&N.apiBaseUrl!==t&&(N.apiBaseUrl=t,fs()),Nc.authorize()}async function Qc(e=[S.AUDIO],t){return Cu(t).accept(e)}async function $c(e){let t=bu(e?.conversationId);if(t)return t.decline(e)}async function el(e,t=[S.AUDIO]){return tl(e,t)}async function tl(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 Ec,Pc).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function nl(e,t=[S.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 Ec,Pc).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a,anonymous:!!N.anonymToken})}function rl(e){let t=bu(e?.conversationId);return t?t.hangup(e):($.hangupAfterInit(e?.onFastHangup),Promise.resolve())}async function il(e,t){let n=Array.isArray(e)?e:[e],r=$.current();r&&await r.addParticipant(n,t)}async function al(e,t){let n=$.current();if(n){let r=e.map(e=>M.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function ol(e,t=!1){let n=wu(e,`removeParticipant`);if(n)try{await n.conversation.removeParticipant(M.decomposeParticipantId(n.participantId).compositeUserId,t)}catch(e){z.warn(`Failed to remove participant ${n.participantId}. Perhaps he is no longer on the call. ${e}`)}}async function sl(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 cl(e,t){let n=$.current();if(e===`videoinput`&&Nt.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 ll(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=bu(t);return r?r.toggleScreenCapturing(n):Promise.reject()}function ul(e){let t=$.current();t&&t.toggleAnimojiCapturing(e)}async function dl(e,t=!1){let n=$.current();n&&await n.setVideoStream(e,t)}async function fl(e,t){let n=bu(t);n&&await n.toggleLocalVideo(e)}async function pl(e,t){let n=bu(t);n&&await n.toggleLocalAudio(e)}async function ml(e){let t=$.current();if(t)return t.setLocalResolution(e)}async function hl(e){let t=$.current();t&&await t.changePriorities(e)}async function gl(e,t){let n=$.current();if(n){if(t){let r=n.getCachedParticipantIdByExternalId(t);if(!r){xu(t,`changeParticipantState`,n);return}await n.changeParticipantState(e,r);return}await n.changeParticipantState(e)}}async function _l(){let e=$.current();e&&await e.putHandsDown()}async function vl(e){let t=$.current();t&&await t.updateDisplayLayout(e)}async function yl(e){let t=$.current();t&&await t.requestDisplayLayout(e)}async function bl(e,t,n=!1){let r=wu(e,`grantRoles`);r&&await r.conversation.grantRoles(r.participantId,t,n)}async function xl(e,t,n,r=!1){let i=$.current();i&&await i.grantRoles(M.composeParticipantId(e,j.USER,t),n,r)}async function Sl({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){if(e){let i=wu(e,`muteParticipant`);return i?i.conversation.muteParticipant(i.participantId,t,n,r):void 0}let i=$.current();i&&await i.muteParticipant(null,t,n,r)}async function Cl({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 wl(e,t=!1,n=null){let r=wu(e,`pinParticipant`);r&&await r.conversation.pinParticipant(r.participantId,t,n)}async function Tl(e,t=!1,n=0,r=null){let i=$.current();i&&await i.pinParticipant(M.composeParticipantId(e,j.USER,n),t,r)}async function El(e){let t=$.current();t&&await t.updateMediaModifiers(e)}async function Dl(e){let t=$.current();t&&await t.enableVideoSuspend(e)}async function Ol(e){let t=$.current();t&&await t.enableVideoSuspendSuggest(e)}async function kl(e){let t=$.current();t&&await t.changeOptions(e)}async function Al(e,t=null){if(t){let n=wu(t,`chatMessage`);return n?n.conversation.chatMessage(e,M.decomposeParticipantId(n.participantId).compositeUserId):void 0}let n=$.current();n&&await n.chatMessage(e,null)}async function jl(e,t=null){let n=$.current();if(n){let r=t?M.composeUserId(t):null;await n.chatMessage(e,r)}}async function Ml(e=10){let t=$.current();if(t)return t.chatHistory(e)}async function Nl(e,t=null){if(t){let n=wu(t,`customData`);return n?n.conversation.customData(e,n.participantId):void 0}let n=$.current();n&&await n.customData(e,null)}async function Pl(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 Fl(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await Nc.createConversation(a??M.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function Il(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=i.map(e=>Z.fromId(e));return(await Nc.createConversation(M.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},a)).join_link}async function Ll(){let e=$.current();return e?e.createJoinLink():Promise.reject()}async function Rl(){let e=$.current();return e?e.removeJoinLink():Promise.reject()}async function zl(e,t){return Nc.getAnonymTokenByLink(e,t)}function Bl(e){let t=$.current();t&&t.setVolume(e)}function Vl(e){N.forceRelayPolicy=e}async function Hl(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 Ul(e=null,t){let n=$.current();return n?n.stopStream(e,t):Promise.reject()}async function Wl(e=null){let t=$.current();return t?t.publishStream(e):Promise.reject()}async function Gl(){let e=$.current();return e?e.getStreamInfo():Promise.reject()}async function Kl(e){let t=$.current();return t?t.addMovie(e):Promise.reject()}async function ql(e){let t=$.current();return t?t.updateMovie(e):Promise.reject()}async function Jl(e){let t=$.current();return t?t.removeMovie(e):Promise.reject()}async function Yl(e,t){let n=$.current();if(n){let r=[],i=[];for(let t of e){let e,a;t.addParticipantIds&&(e=[],t.addParticipantIds.forEach(t=>{let r=n.getCachedParticipantIdByExternalId(t);r?e.push(M.decomposeParticipantId(r).compositeUserId):i.push(t.id)})),t.removeParticipantIds&&(a=[],t.removeParticipantIds.forEach(e=>{let t=n.getCachedParticipantIdByExternalId(e);t?a.push(M.decomposeParticipantId(t).compositeUserId):i.push(e.id)})),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:a,countdownSec:t.countdownSec})}if(i.length){Su(i,`updateRooms`,n);return}return n.updateRooms(r,t)}return Promise.reject()}async function Xl(e,t){let n=$.current();return n?n.activateRooms(e,t):Promise.reject()}async function Zl(e=null,t=null){let n=$.current();if(!n)return Promise.reject();let r;if(t&&(r=n.getCachedParticipantIdByExternalId(t)??void 0,!r)){xu(t,`switchRoom`,n);return}return n.switchRoom(e,r)}async function Ql(e){let t=$.current();return t?t.removeRooms(e):Promise.reject()}function $l(e){N.statisticsInterval=e;let t=$.current();if(t)return t.updateStatisticsInterval()}function eu(e){c.default.disableLog(!e),z.toggle(e)}function tu(e,...t){N.debugLog&&($.debugMessage(e,`[external]`,...t)||z.send(e,`[external]`,...t))}function nu(e,t,...n){N.debugLog&&($.debugMessageWithContext(e,t,`[external]`,...n)||z.send(e,`[external]`,...n))}var ru={list:Fe,get:Ie,getJson:Le,download:Re,clear:ze,stats:Be};function iu(){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()}`],[`Devices:`,E.getDevices()]],t=new Date,n=t.getTime(),r=t.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`});return e.map(e=>({h:r,t:n,l:En.LOG,d:e}))}async function au(){let e=$.id(),t=$.debugSessionId();if(!t||!e)throw z.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let n=await Ie({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 Nc?.uploadDebugLogs(e,r,i,JSON.stringify([...iu(),...n]))}catch(e){throw z.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function ou(e){let t=$.current();if(t)return t.videoEffect(e)}async function su(e,t){let n=$.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function cu(e){let t=$.current();t&&await t.setAudioStream(e)}async function lu(e,t=null,n=null){let r=$.current();if(!r)return;let i=n??t?.id,a=null;if(t&&(a=r.getCachedParticipantIdByExternalId(t),!a)){xu(t,`setVmojiSvg`,r);return}r.setAnimojiSvg(e,a,i)}function uu(e){let t=$.current();t&&t.setAnimojiFill(e)}async function du(e=null,t,n=!1){return Cu().getWaitingHall(e,t,n)}async function fu(){return Cu().getAudienceModeHands()}async function pu(e,t=!1){let n=Cu(),r;if(e){let t=n.getCachedParticipantIdByExternalId(e);if(!t){xu(e,`promoteParticipant`,n);return}r=M.decomposeParticipantId(t).compositeUserId}return n.promoteParticipant(r,t)}async function mu(e=!1){return Cu().requestPromotion(e)}async function hu(e=!1){return Cu().acceptPromotion(e)}async function gu(e){return Cu().getParticipantListChunk(e)}async function _u(e){return Cu().getParticipants(e)}async function vu(e){return Cu().feedback(e)}async function yu(e,t,n){return Cu(n).enableFeatureForRoles(e,t)}function bu(e){return e?B.get(e)??null:$.current()??B.getFirst()}function xu(e,t,n){R.onNonFatalError(Error(`Participant ID mapping not found for external ID "${e.id}" while handling ${t}`),n.id)}function Su(e,t,n){let r=Array.from(new Set(e));R.onNonFatalError(Error(`Participant ID mapping not found for external IDs "${r.join(`", "`)}" while handling ${t}`),n.id)}function Cu(e){let t=bu(e);if(!t)throw Error(`Conversation not found`);return t}function wu(e,t){let n=$.current();if(!n)return null;let r=n.getCachedParticipantIdByExternalId(e);return r?{conversation:n,participantId:r}:(xu(e,t,n),null)}async function Tu(e){await Nc.removeHistoryRecords(e)}async function Eu(e){let t=$.current()??B.getFirst();t&&await t.startAsr(e)}async function Du(e){let t=$.current()??B.getFirst();t&&await t.stopAsr(e)}async function Ou(e){let t=$.current()??B.getFirst();t&&await t.requestAsr(e)}async function ku(e){let t=$.current();return t?t.startUrlSharing(e):Promise.reject()}async function Au(){let e=$.current();return e?e.stopUrlSharing():Promise.reject()}async function ju(e){await B.switchCall(e)}function Mu(){return B.getActiveId()}function Nu(){return $.getSyncedTime()}function Pu(){return N.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=Cn),exports.Api=Ec,exports.ApiExternal=Mc,exports.ArrayDequeue=jc,exports.AuthData=y,exports.BaseLogger=m,exports.CallDirection=ro,exports.CallType=io,exports.ChatRoomEventType=ao,exports.ConversationFeature=oo,exports.ConversationOption=so,exports.DebugMessageType=En,exports.ExternalIdType=yo,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return Nt}}),exports.FatalError=x,exports.HangupReason=k,exports.HangupType=O,exports.MediaOption=S,exports.MediaTrackKind=A,exports.MediaType=H,exports.MuteState=uo,exports.ParticipantState=X,exports.ParticipantStateDataValue=Ac,exports.ParticipantStatus=P,exports.RecordRole=kc,exports.RoomsEventType=fo,exports.Signaling=no,exports.SignalingCommandType=V,exports.SignalingConnectionType=Sr,exports.SignalingNotification=K,exports.TransportTopology=J,exports.UserRole=ho,exports.UserType=j,exports.VolumeDetector=Ho,exports.acceptCall=Qc,exports.acceptPromotion=hu,exports.activateRooms=Xl,exports.addMovie=Kl,exports.addParticipant=il,exports.addParticipantInternal=al,exports.authorize=Zc,exports.browser=Ic,exports.callInternal=Kc,exports.callTo=Wc,exports.captureScreen=ll,exports.captureVmoji=ul,exports.changeAudioEffect=su,exports.changeConversationOptions=kl,exports.changeDevice=cl,exports.changeParticipantState=gl,exports.changePriorities=hl,exports.changeVideoEffect=ou,exports.chatHistory=Ml,exports.chatMessage=Al,exports.chatMessageInternal=jl,exports.createJoinLink=Ll,exports.customData=Nl,exports.customDataInternal=Pl,exports.debug=eu,exports.debugLogs=ru,exports.debugMessage=tu,exports.debugMessageWithContext=nu,exports.declineCall=$c,exports.enableFeatureForRoles=yu,exports.enableVideoSuspend=Dl,exports.enableVideoSuspendSuggest=Ol,exports.feedback=vu,exports.forceRelayPolicy=Vl,exports.getActiveCallId=Mu,exports.getAnonymTokenByLink=zl,exports.getAudienceModeHands=fu,exports.getInbounds=Yc,exports.getParticipantListChunk=gu,exports.getParticipants=_u,exports.getStreamInfo=Gl,exports.getSyncedTime=Nu,exports.getWaitingHall=du,exports.grantRoles=bl,exports.grantRolesInternal=xl,exports.hangup=rl,exports.init=Uc,exports.joinCall=el,exports.joinCallByLink=nl,exports.joinCallInternal=tl,exports.muteParticipant=Sl,exports.muteParticipantInternal=Cl,exports.pinParticipant=wl,exports.pinParticipantInternal=Tl,exports.processPush=qc,exports.processPushInternal=Jc,exports.promoteParticipant=pu,exports.publishStream=Wl,exports.putHandsDown=_l,exports.removeHistoryRecords=Tu,exports.removeJoinLink=Rl,exports.removeMovie=Jl,exports.removeParticipant=ol,exports.removeParticipantInternal=sl,exports.removeRooms=Ql,exports.requestAsr=Ou,exports.requestDisplayLayout=yl,exports.requestPromotion=mu,exports.setAudioEffects=Bc,exports.setAudioStream=cu,exports.setLocalResolution=ml,exports.setLogger=Rc,exports.setMediaModifiers=El,exports.setStatisticsInterval=$l,exports.setVad=Vc,exports.setVideoEffects=zc,exports.setVideoStream=dl,exports.setVmoji=Hc,exports.setVmojiFill=uu,exports.setVmojiSvg=lu,exports.setVolume=Bl,exports.startAsr=Eu,exports.startAudienceConversation=Il,exports.startConversation=Fl,exports.startStats=Xc,exports.startStream=Hl,exports.startUrlSharing=ku,exports.stopAsr=Du,exports.stopStream=Ul,exports.stopUrlSharing=Au,exports.switchCall=ju,exports.switchRoom=Zl,exports.toggleLocalAudio=pl,exports.toggleLocalVideo=fl,exports.updateDisplayLayout=vl,exports.updateMovie=ql,exports.updateRooms=Yl,exports.uploadDebugLogs=au,exports.utils=Lc,exports.version=Pu;
|