@vkontakte/calls-sdk 2.8.13-dev.901f3b4d.0 → 2.8.13-dev.9394b771.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/calls-sdk.cjs.js CHANGED
@@ -1,12 +1,12 @@
1
1
  /*!
2
- * @vkontakte/calls-sdk v2.8.13-dev.901f3b4d.0
3
- * Thu, 15 Oct 2026 20:13:47 GMT
2
+ * @vkontakte/calls-sdk v2.8.13-dev.9394b771.0
3
+ * Fri, 16 Oct 2026 11:29:22 GMT
4
4
  * https://calls-sdk.cdn-vk.ru/doc/latest/index.html
5
5
  */
6
6
 
7
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))}}}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 Xe=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()})}},b=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}(b||{}),x=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}(x||{}),S=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}(S||{}),Ze=null,Qe=``,$e=null,et=[],tt=navigator.appVersion,nt=navigator.appName,rt=navigator.userAgent;function it(){return et.length||(et=(()=>{let e,t=!1,n=0,r=`0`,i=rt.match(/(opera|chrome|safari|firefox)\/?\s*(\d+)/i)||[];if(i[1]===`Safari`){if(e=rt.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=rt.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=rt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=rt.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=rt.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=rt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=rt.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=rt.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=rt.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:nt,e&&e[1]||i[2]||tt,t,n,r]})()),et}var C;(function(e){async function t(e){if(`userAgentData`in navigator)try{let{platformVersion:t}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!t){e(`Can't to get OS version`);return}let n=parseInt(t.split(`.`)[0]);$e=isNaN(n)?null:n}catch(t){e(`Failed to get OS version`,t)}}e.initOsVersion=t;function n(){return r()===null}e.isBrowserSupported=n;function r(){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=r;function i(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=i;function a(){let e=navigator.mediaDevices;return typeof e?.getUserMedia==`function`&&typeof e?.getSupportedConstraints==`function`&&e.getSupportedConstraints().deviceId===!0}e.canSelectAudioInput=a;function o(){if(typeof HTMLMediaElement>`u`||typeof HTMLMediaElement.prototype.setSinkId!=`function`)return!1;let e=C.os();if([`iPhone`,`iPad`].includes(e)||e===`MacOS`&&navigator.maxTouchPoints>1)return!1;if(C.browserName()!==`Safari`)return!0;let t=Number(C.browserVersion()),n=Number(C.browserSubVersion());return e===`MacOS`&&(t>18||t===18&&n>=4)}e.canSelectAudioOutput=o;function s(){let e=C.browserName()===`Opera`,t=C.browserName()===`Yandex`;return e||t}e.isBrokenH264Decoder=s;function c(){return C.browserName()===`Yandex`&&C.os()===`Windows`}e.isBrokenVP9Encoder=c;function l(){let e=C.browserName()===`Safari`&&Number(C.browserVersion())===17&&[4,5,6].includes(Number(C.browserSubVersion())),t=C.osVersion(),n=C.os()===`Windows`&&t!=null&&t>0&&t<13;return e||n}e.isBrokenVP9Decoder=l;function u(){return!(C.baseChromeVersion()&&C.isMobile())}e.canPreferH264=u;function d(){let e=C.browserName(),t=Number(C.browserVersion());return e===`Safari`?t>=18:e===`Firefox`?t>=134:!0}e.isSimulcastSupportedByBrowser=d;function f(){return Qe||(Qe=(()=>{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(rt))return t;return`Unknown`})()),Qe}e.os=f;function p(){return $e}e.osVersion=p;function m(){return Ze===null&&(Ze=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(tt)),Ze}e.isMobile=m;function ee(){return it()[0]}e.browserName=ee;function te(){return it()[1]}e.browserVersion=te;function ne(){return it()[3]}e.baseChromeVersion=ne;function h(){return it()[4]}e.browserSubVersion=h;function re(){return C.baseChromeVersion()>=105&&!C.isMobile()}e.isAudioShareSupported=re})(C||(C={}));var w=C,at=e=>e.stop(),ot=e=>e.getTracks().forEach(at),st=e=>e.getVideoTracks().forEach(at);async function ct(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 lt=class{constructor(){h(this,`_cameraPermissionStatus`,void 0),h(this,`_microphonePermissionStatus`,void 0),h(this,`_listener`,void 0)}static isSupported(){return w.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}},ut=`_okcls_`,dt=(()=>{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 ft(e){let t=dt?dt.getItem(ut+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function pt(e,t){try{dt&&dt.setItem(ut+e,JSON.stringify(t))}catch{}}function mt(e){dt&&dt.removeItem(ut+e)}var ht;(function(e){function t(e){return ft(e)||null}e.get=t;function n(e,t){pt(e,t)}e.set=n;function r(e){mt(e)}e.remove=r})(ht||(ht={}));var gt=ht,_t=null,vt=null,yt=null,bt=[],xt=[],St=[],Ct=[],wt=null,Tt=null,Et=null,Dt=!1,Ot=!1,kt,At,jt,Mt=null,Nt=null,Pt={},Ft=new Set;function It(e,t){return Number(t.deviceId===`default`)-Number(e.deviceId===`default`)}var Lt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Lt).includes(e)}e.contains=t})(Lt||(Lt={}));var Rt=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(Tt&&(r=Tt.groupId,n=Tt.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!Tt&&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: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(wt&&(s=wt.groupId,a=wt.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!wt&&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}),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}},zt=class extends Rt{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,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:N.audioShareSystemInclude?`include`:`exclude`,windowAudio:N.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},Bt=class e{constructor(){h(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(t=null){if(e._lockId)throw t?.log(S.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(Bt,`_lockId`,0);async function Vt(){Ot=!1,Dt=!1,_t=null;let e={camera:T.getSavedCamera(),microphone:T.getSavedMicrophone(),output:T.getSavedOutput()};await Ut(),Ht(`devicechange`,e),R.onDeviceChange()}function Ht(e,...t){if(Pt[e])for(let n of Pt[e])n(...t)}async function Ut(){return _t||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!vt&&navigator.mediaDevices.addEventListener&&(vt=M.debounce(Vt,N.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,vt)),!yt&&lt.isSupported()&&(yt=new lt,await yt.init((e,t)=>{switch(t){case`denied`:case`prompt`:vt?.();break}})),_t=navigator.mediaDevices.enumerateDevices().then(e=>{bt=e,z.debug(`Devices`,e),xt=e.filter(e=>e.kind===`videoinput`?((e.label||yt?.getPermissionState(`camera`)===`granted`)&&(Dt=!0),!0):!1),xt.sort(It),St=e.filter(e=>e.kind===`audioinput`?((e.label||yt?.getPermissionState(`microphone`)===`granted`)&&(Ot=!0),!0):!1),St.sort(It),Ct=e.filter(e=>e.kind===`audiooutput`),Ct.sort(It);let t=wt?.deviceId??gt.get(`videoinput`),n=Tt?.deviceId??gt.get(`audioinput`),r=Et?.deviceId??gt.get(`audiooutput`);return wt=xt.find(e=>e.deviceId===t)||null,Tt=St.find(e=>e.deviceId===n)||null,Et=Ct.find(e=>e.deviceId===r)||Ct[0]||null,_t=Promise.resolve(e),e}).catch(()=>(_t=null,[]))))}function Wt(e){if(wt&&Tt)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=>{!Tt&&e.kind===A.audio?Tt=t(T.getMicrophones(),e):!wt&&e.kind===A.video&&(wt=t(T.getCameras(),e))})}async function Gt(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 Bt;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 Vt(),Wt(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()?b.CAMERA_PERMISSION:b.MIC_PERMISSION;break;case`OverconstrainedError`:t=b.OVERCONSTRAINED;break;case`TypeError`:t=b.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?b.CAMERA_ACCESS:b.MIC_ACCESS;break;case`Error`:if(i.message===`MediaSource is busy`){t=e.isVideoRequested()?b.CAMERA_ACCESS:b.MIC_ACCESS;break}}if(e.canSimplify())return Gt(e.simplify(),t,n,r);let o=t||b.UNKNOWN;throw R.onPermissionsError(o,i),o}}async function Kt(e=z){if(!(Mt||w.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{T.hasMicrophonePermission()||R.onPermissionsRequested(),Mt=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(t){e.warn(`Firefox microphone permission warmup failed`,t)}}async function qt(e,t=z,n=null){t.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let r=new Bt;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 b.SCREEN_PERMISSION;case`AbortError`:case`NotReadableError`:throw b.SCREEN_ACCESS;default:throw e}}finally{r.free()}}var T;(function(e){async function t(){await Ut(),await w.initOsVersion(z.warn)}e.init=t;function n(){return xt}e.getCameras=n;function r(){return St}e.getMicrophones=r;function i(){return Ct}e.getOutput=i;function a(){return xt.length>0}e.hasCamera=a;function o(){return St.length>0}e.hasMicrophone=o;function s(){return wt}e.getSavedCamera=s;function c(){return Tt}e.getSavedMicrophone=c;function l(){return Et}e.getSavedOutput=l;function u(){let e=T.getSavedOutput();return e&&e.deviceId===gt.get(`audiooutput`)?e:null}e.getChosenOutput=u;function d(){return bt}e.getDevices=d;function f(){return N.videoFacingMode}e.getVideoFacingMode=f;function p(){return Dt}e.hasCameraPermission=p;function m(){return Ot}e.hasMicrophonePermission=m;function ee(){return yt?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=ee;function te(e=!1){return m()?a()&&e?p():!0:!1}e.hasPermissions=te;function ne(){Mt&&(ot(Mt),Mt=null)}e.releaseFirefoxMicrophonePermissionWarmup=ne;async function h(e=!1,t=!0,n=!0,r=z,i=null){!e&&!t&&await Kt(r);let s=o()&&t,c=a()&&e,l;if(!s&&!c)l=new MediaStream;else try{l=await Gt(new Rt(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 qt(new zt(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 Gt(new Rt(!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 Gt(new Rt(!1,e||!0,i,a),void 0,n,r)}e.getUserVideo=ae;async function oe(e,t=z,n=null){return Gt(new Rt(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 ct(n,t)}e.setResolution=se;async function ce(e,t){let n=(await Ut()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?wt=n:e===`audioinput`?Tt=n:e===`audiooutput`&&(Et=n),gt.set(e,t),n):null}e._saveDeviceId=ce;function g(){if(!jt||jt.readyState===`ended`){let e=T.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(),jt=t.stream.getAudioTracks()[0]}return Object.assign(jt.clone(),{enabled:!1})}e.getSilentMediaTrack=g;function _(e=N.videoMinWidth,t=N.videoMinHeight){At||(At=document.createElement(`canvas`)),At.width=e,At.height=t;let n=At.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!kt||kt.readyState===`ended`)&&(kt=At.captureStream(N.videoFrameRate).getVideoTracks()[0]),Object.assign(kt.clone(),{enabled:!1})}e.getBlackMediaTrack=_;function le(e){Ft.add(e),Nt&&T.getAudioContext()}e.retainAudioContext=le;function ue(e){Ft.delete(e)&&Ft.size===0&&Nt?.suspend().catch(e=>z.warn(`Failed to suspend AudioContext`,e))}e.releaseAudioContext=ue;function de(){return Nt||(Nt=new(window.AudioContext||window.webkitAudioContext)),Nt.resume().catch(()=>{z.warn(`Failed to resume AudioContext`)}),Nt}e.getAudioContext=de;function fe(e,t){Pt[e]||(Pt[e]=[]),Pt[e].push(t)}e.addEventListener=fe;function pe(e,t){if(Pt[e])if(!t)delete Pt[e];else{let n=Pt[e].indexOf(t);n>-1&&Pt[e].splice(n,1)}}e.removeEventListener=pe})(T||(T={}));var E=T;function Jt(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)}},Yt=function(e){return e.FpsLimit=`fps-limit`,e}({}),Xt=class extends Xe{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()}},Zt=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}({}),Qt=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),$t=class extends Xe{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||w.browserName()!==`Safari`||(this._cameraMuteRecoveredAt=Date.now(),this._logger?.log(S.ERROR,`camera_mute_recover`),this._debug.log(`[MediaSource] Safari camera mute recovery`),this.toggleVideo(!0).then(()=>this._logger?.log(S.ERROR,`camera_mute_recover_success`)).catch(e=>{this._logger?.log(S.ERROR,`camera_mute_recover_fail`),this._debug.warn(`[MediaSource] Camera mute recovery failed`,e)}))}),h(this,`micTrackMuteHandler`,()=>{!this._mediaSettings.isAudioEnabled||this._micMuteRecoveredAt>=this._micTrackSetAt||w.browserName()!==`Safari`||(this._micMuteRecoveredAt=Date.now(),this._logger?.log(S.ERROR,`mic_mute_recover`),this._debug.log(`[MediaSource] Safari mic mute recovery`),this.toggleAudio(!0).then(()=>this._logger?.log(S.ERROR,`mic_mute_recover_success`)).catch(e=>{this._logger?.log(S.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 Xt(this._debug),this._videoEffectsFpsLimiter.addEventListener(Yt.FpsLimit,this.handleVideoEffectsLowFps.bind(this))),E.retainAudioContext(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=[x.AUDIO],t=!0){if(this._stream)return;let n=e.includes(x.VIDEO),r=e.includes(x.AUDIO),i=e.includes(x.ANIMOJI),a=w.getBrowserSupportFailure();if(a)throw new k(b.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(b.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&st(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)ot(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);this._logger?.log(S.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(S.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)ot(t);else{let e=await this._applyAudioEffect();this._logger?.log(S.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(S.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)ot(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),this._logger?.log(S.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(S.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&&(ot(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),E.releaseAudioContext(this),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(x.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(S.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 ct(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||{}),en={HEIGHT:720,WIDTH:1280,BITRATE:1e6,FPS:30},tn=60,nn=`L1T2`,rn=1.35,an=[{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 on(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 sn(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return t.length>0?t[t.length-1].bitrate:an[0].bitrate}function cn(e){return!Number.isFinite(e)||e<=0?en.FPS:Math.min(Math.round(e),tn)}function ln(e=en.WIDTH,t=en.HEIGHT,n=an,r=en.FPS){let i=Math.max(e,t),a=cn(r),o=1;i>=960?o=3:i>=480&&(o=2);let s=[`h`,`m`,`l`].slice(3-o),c=[],l=sn(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=sn(Math.max(e,t),n)}return{streams:c.reverse()}}function un(e,t){let n=t.streams.findIndex(t=>t.rid===e);return n>=0?2**(t.streams.length-n-1):1}function dn(e,t,n,r){let i=n?Math.round(n*rn):1/0;if(e.forEach(e=>{let n=t.streams.find(t=>t.rid===e.rid);e.scaleResolutionDownBy=un(e.rid,t),e.scalabilityMode=nn,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 fn=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 pn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var mn=/\r?\n/;function hn(e){return e.split(mn)}function gn(e){return e.join(`\r
8
8
  `)}var _n=533,vn=`a=fmtp:`,yn=`sps-pps-idr-in-keyframe=1`,bn;(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()===vn+i[1]?` `:`;`;e[r]+=t+yn}}}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=hn(e);if(d(s),!n&&!i&&!a&&!o)return gn(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
- `+gn(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),gn(s)}e.patchLocalSDP=f;function p(e,t,n,r,i,o){let s=hn(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),gn(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=hn(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*_n/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=ln(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)}`),dn(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 fn(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})(bn||(bn={}));var M=bn,xn=`__CALLS_SDK_DEVTOOLS_`,Sn=class{set(e,t){try{this.getStorage().setItem(xn+e,JSON.stringify(t))}catch(t){z.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(xn+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(xn+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(xn)&&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(xn)){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}},Cn=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}},wn=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 Sn,this.params=new Cn(this.storage)}};h(wn,`instance`,null);var Tn=wn.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=Tn.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.901f3b4d.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`;case`CALLS_CHELSEA`:return`https://api-chelsea.calls-test.oneme.ru/api`;case`CALLS_KERZH`:return`https://api-kerzh.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 signalingReconnectMaxDuration(){return e._params.signalingReconnectMaxDuration}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||(w.isMobile()?Lt.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 iceCandidateErrorStatEnabled(){return e._params.iceCandidateErrorStatEnabled}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 w.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 w.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,iceCandidateErrorStatEnabled:e._params.iceCandidateErrorStatEnabled,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,signalingReconnectMaxDuration:6e4,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,iceCandidateErrorStatEnabled:!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 En(e){return e.slice()}var Dn;(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?En(c):void 0;F(`onMuteStates`,L(e),En(t),En(n),r,i,a,o,s,d,l,u)}e.onMuteStates=_e;function ve(e,t,n=!1,r){I(`onRolesChanged`,e,En(t),n,r)}e.onRolesChanged=ve;function v(e,t=!1,n){F(`onLocalRolesChanged`,En(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`,En(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`,En(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(e){F(`onClientStats`,e)}e.onClientStats=We;function Ge(){F(`onAutoplayError`)}e.onAutoplayError=Ge;function Ke(e,t,n,r,i,a){F(`onChatRoomUpdated`,e,t,n,r,i,a)}e.onChatRoomUpdated=Ke;function qe(e,t){F(`onPromoted`,e,t)}e.onPromoted=qe;function Je(e,t){F(`onRemoteMixedAudioStream`,e,t)}e.onRemoteMixedAudioStream=Je;function Ye(e,t){F(`onJoinLinkChanged`,e,t)}e.onJoinLinkChanged=Ye;function y(e,t){F(`onRoomsUpdated`,e,t)}e.onRoomsUpdated=y;function Xe(e,t,n,r,i){F(`onRoomUpdated`,e,t,n,r,i)}e.onRoomUpdated=Xe;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 Ze(e,t=null,n){F(`onFeedback`,e,t,n)}e.onFeedback=Ze;function Qe(e,t){F(`onFeaturesPerRoleChanged`,e,t)}e.onFeaturesPerRoleChanged=Qe;function $e(e,t){F(`onParticipantVmojiUpdate`,e,t)}e.onParticipantVmojiUpdate=$e;function et(e,t,n){F(`onAsrSet`,e,t,n)}e.onAsrSet=et;function tt(e,t,n,r){F(`onAsrStarted`,e,t,n,r)}e.onAsrStarted=tt;function nt(e,t){F(`onAsrStopped`,e,t)}e.onAsrStopped=nt;function rt(e,t,n,r,i){F(`onAsrTranscription`,e,t,n,r,i)}e.onAsrTranscription=rt;function it(e,t,n){F(`onParticipantIdChanged`,e,t,n)}e.onParticipantIdChanged=it;function C(e,t){F(`onVideoSuspendSuggest`,e,t)}e.onVideoSuspendSuggest=C;function w(e){F(`onSignalingMessage`,typeof e==`string`?e:L(e))}e.onSignalingMessage=w;function at(e,t){F(`onPromotionApproved`,e,t)}e.onPromotionApproved=at;function ot(e,t){F(`onPeerRegistered`,e,t)}e.onPeerRegistered=ot;function st(e,t){F(`onNonFatalError`,e,t)}e.onNonFatalError=st})(Dn||(Dn={}));var R=Dn,On=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),kn;(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})(kn||(kn={}));var z=kn,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()}}},An=class extends Error{constructor(e){super(e?`Signaling disposed. Command ${e}`:`Signaling disposed`),this.name=`SignalingDisposedError`}},jn=class extends Error{constructor(e){super(e?`Producer connection closed. Command ${e}`:`Producer connection closed`),this.name=`ProducerConnectionClosedError`}},Mn=class extends Xe{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 Nn(e){return e.stopStream}function Pn(e){return e.keyFrameRequested}function Fn(e){if(Nn(e))return`ss`;if(Pn(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}({}),In=`s`,Ln=`m`;function Rn(e){return e.participantId+(e.mediaType?`:`+In+e.mediaType:``)+(e.streamName?`:`+Ln+e.streamName:``)}function zn(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 In:r=Bn(n.slice(1));break;case Ln: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 Bn(e){for(let t of Object.keys(H))if(t===e)return H[t];return null}function Vn(){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),Hn(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 Hn(e){return e.buffer!==void 0}function Un(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 Wn=0,Gn=1,Kn=2,qn=3,Jn=4,Yn=5,Xn=6,Zn=7,Qn=0,$n=1,er=2,tr=0,nr=0,rr=0,ir=1,ar=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=Vn();l.Int.enc(n,Wn),l.Int.enc(n,tr),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=Vn();if(this.writeStreamDesc(t,i),Nn(r))l.Int.enc(i,$n);else if(Pn(r))l.Int.enc(i,er);else if(l.Int.enc(i,Qn),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,rr);break;case`cn`:l.Int.enc(i,ir);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=Vn();return l.Int.enc(n,Gn),l.Int.enc(n,tr),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=Vn();return l.Int.enc(n,Kn),l.Int.enc(n,tr),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=Vn();return l.Int.enc(n,qn),l.Int.enc(n,tr),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=Vn();return l.Int.enc(n,Jn),l.Int.enc(n,tr),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=Vn();return l.Int.enc(n,Yn),l.Int.enc(n,tr),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=Vn();return l.Int.enc(n,Xn),l.Int.enc(n,tr),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=Vn();l.Int.enc(n,Zn),l.Int.enc(n,tr),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?Un(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await pn(e)):Un(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==tr){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==nr){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Wn:return this.deserializeUpdateDisplayLayoutResponse(t);case Gn: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=Un(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=Rn(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.CONNECTION_STATE_CHANGED=`connection_state_changed`,e.SIGNALING_STATE_CHANGED=`signaling_state_changed`,e.GATHERING_STATE_CHANGED=`gathering_state_changed`,e.ICE_RESTART=`ice_restart`,e.ICE_CANDIDATES_CHANGED=`ice_candidates_changed`,e.ICE_CANDIDATE_GATHERING_FAILED=`ice_candidate_gathering_failed`,e.ICE_CANDIDATE_ADD_FAILED=`ice_candidate_add_failed`,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.CLIENT_REQUESTED_SERVER_TOPOLOGY=`client_requested_server_topology`,e.VIDEO_ENCODER_CHANGED_BY_NETWORK_ADAPTER=`video_encoder_changed_by_network_adapter`,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||{}),or=1e3;function W(e,t,n=0){return t in e&&e[t]?e[t]:n}function sr(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function cr(e,t){return n=>n[e]===t}function lr(e){return(t,n)=>n[e]-t[e]}function ur(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function dr(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function fr(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])?fr(t[1]):t[1],e),{})}function pr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function mr(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(pr).then(dr)}function hr(e){let t=e.filter(cr(`type`,`candidate-pair`)).sort(lr(`priority`)).find(sr(cr(`nominated`,!0),cr(`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(cr(`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(cr(`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}}),fr(n)}function gr(e,t,n=!1){let r=ur(`id`,e);return(n?e.filter(sr(cr(`type`,`remote-inbound-rtp`))):e.filter(sr(cr(`type`,`inbound-rtp`),cr(`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 fr(c)}).filter(e=>!!e)}function _r(e,t,n=!1){if(!t||!t.rtps.length||!e.rtps.length)return e;let r,i;n&&(r=ur(`ssrc`,e?.remoteRtps||[]),i=ur(`ssrc`,t?.remoteRtps||[]));let a=ur(`ssrc`,e.rtps),o=ur(`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 vr(e,t,n={},r=!1){let i=await mr(e),a={timestamp:Date.now(),transport:hr(i),rtps:gr(i,n)};return r&&(a.remoteRtps=gr(i,n,!0)),t?_r(a,t,r):(await M.delay(or),vr(e,a,n,r))}function yr(e){performance.clearMarks(e),performance.mark(e)}function br(e){performance.clearMarks(e)}function xr(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 Sr(e){return`${U.SCREENSHARE_FIRST_FRAME}_${Cr(e)}`}function Cr(e){return typeof e==`string`?e:JSON.stringify(e)}var G={distinctById:dr,rtcStatsToArray:pr,extractTransport:hr,extractRtps:gr,delta:_r,collectStats:vr,setMark:yr,clearMark:br,measureMark:xr,getMarkNameScreenshareFirstFrame:Sr},wr=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(wr||{}),Tr=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(Tr||{}),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||{}),Er=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),Dr=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}({}),Or={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||{}),kr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(kr||{}),{isObject:Ar,isObjectsEquals:jr}=M;function Mr(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||Ar(e.bitrates)&&Ar(t.bitrates)&&!jr(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Nr=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Pr(e,t){return!(!Mr(e.camera,t.camera)||!Mr(e.screenSharing,t.screenSharing)||!Mr(e.fastScreenSharing,t.fastScreenSharing))}function Fr(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 Ir(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Lr={offer:U.SDP_CREATE_OFFER,answer:U.SDP_CREATE_ANSWER},Rr={offer:U.SDP_SET_LOCAL_OFFER,pranswer:U.SDP_SET_LOCAL_PRANSWER,answer:U.SDP_SET_LOCAL_ANSWER,rollback:U.SDP_SET_LOCAL_ROLLBACK},zr={offer:U.SDP_SET_REMOTE_OFFER,pranswer:U.SDP_SET_REMOTE_PRANSWER,answer:U.SDP_SET_REMOTE_ANSWER,rollback:U.SDP_SET_REMOTE_ROLLBACK},Br=120*1e3,Vr={local_address:null,remote_address:null,transport:null},Hr=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,...Vr})}logCandidateGenerated(e){let t=Wr(e.candidate);t&&this._log({name:U.SDP_GENERATED,value:this._intervalSince(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,...Vr})}logCandidateReceived(e){let t=Wr(e.candidate);t&&this._log({name:U.SDP_RECEIVED,value:this._remoteSdpReceivedAt>0?this._intervalSince(this._remoteSdpReceivedAt):0,string_value:t.type,local_address:null,remote_address:t.address,transport:t.protocol})}logCreateFailed(e,t){let n=Lr[e];n&&this._logFailure(n,t,{remote:e===`answer`?this._pc?.remoteDescription:void 0})}logSetLocalFailed(e,t){this._logFailure(Rr[e.type],t,{local:e,remote:this._pc?.remoteDescription})}logSetRemoteFailed(e,t){this._logFailure(zr[e.type],t,{local:this._pc?.localDescription,remote:e})}destroy(){this.stop()}_intervalSince(e){return Math.min(Br,Math.max(0,Date.now()-e))}_logFailure(e,t,n){this._log({name:e,value:0,string_value:JSON.stringify({error:t instanceof Error?t.message:String(t),local:Ur(n.local),remote:Ur(n.remote)}),...Vr})}_log(e){this._statAggregator?.logEventualStat(e)}};function Ur(e){return e?{type:e.type,sdp:e.sdp}:void 0}function Wr(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||!qr(i)?null:{protocol:r,address:i,type:a}}var Gr=/^\d{1,3}(\.\d{1,3}){3}$/,Kr=/^[0-9a-f:]+$/i;function qr(e){return Gr.test(e)||e.includes(`:`)&&Kr.test(e)}var Jr=/[?&]transport=(tcp|udp)/i,Yr={stable:`stable`,"have-local-offer":`have.local.offer`,"have-local-pranswer":`have.local.answer`,"have-remote-offer":`have.remote.offer`,"have-remote-pranswer":`have.remote.answer`,closed:`closed`},Xr=class{constructor(e){h(this,`_statAggregator`,void 0),h(this,`_pc`,null),h(this,`_lastSignalingStateChange`,0),h(this,`_lastGatheringStateChange`,0),h(this,`_lastConnectionState`,null),h(this,`_handleConnectionStateChange`,()=>{this._pc&&this._logConnectionState(this._pc.connectionState)}),h(this,`_handleSignalingStateChange`,()=>{let e=this._pc?.signalingState;this._log({name:U.SIGNALING_STATE_CHANGED,value:this._sinceLastChange(`_lastSignalingStateChange`),string_value:e?Yr[e]:void 0})}),h(this,`_handleGatheringStateChange`,()=>{let e=this._pc?.iceGatheringState,t=this._sinceLastChange(`_lastGatheringStateChange`);this._log({name:U.GATHERING_STATE_CHANGED,value:e===`new`?0:t,string_value:e})}),h(this,`_handleIceCandidateError`,e=>{if(!N.iceCandidateErrorStatEnabled)return;let t=e;this._log({name:U.ICE_CANDIDATE_GATHERING_FAILED,value:t.errorCode,string_value:t.errorText,local_address:t.address??``,remote_url:t.url,transport:Jr.exec(t.url??``)?.[1]?.toLowerCase()??null})}),this._statAggregator=e}observe(e){this.stop(),this._pc=e,this._lastSignalingStateChange=0,this._lastGatheringStateChange=0,this._lastConnectionState=null,e.addEventListener(`connectionstatechange`,this._handleConnectionStateChange),e.addEventListener(`signalingstatechange`,this._handleSignalingStateChange),e.addEventListener(`icegatheringstatechange`,this._handleGatheringStateChange),e.addEventListener(`icecandidateerror`,this._handleIceCandidateError)}stop(){this._pc&&(this._pc.connectionState!==`new`&&this._logConnectionState(this._pc.connectionState),this._logConnectionState(`closed`),this._pc.removeEventListener(`connectionstatechange`,this._handleConnectionStateChange),this._pc.removeEventListener(`signalingstatechange`,this._handleSignalingStateChange),this._pc.removeEventListener(`icegatheringstatechange`,this._handleGatheringStateChange),this._pc.removeEventListener(`icecandidateerror`,this._handleIceCandidateError),this._pc=null)}logIceRestart(){this._log({name:U.ICE_RESTART})}logIceCandidateAddFailed(e,t){this._log({name:U.ICE_CANDIDATE_ADD_FAILED,value:t instanceof DOMException?t.code:0,string_value:t instanceof Error?`${t.name}: ${t.message}`:String(t),remote_url:e.candidate})}_sinceLastChange(e){let t=Date.now(),n=this[e]===0?0:t-this[e];return this[e]=t,n}_logConnectionState(e){e!==this._lastConnectionState&&(this._lastConnectionState=e,this._log({name:U.CONNECTION_STATE_CHANGED,connection_state:e}))}_log(e){this._statAggregator?.logEventualStat(e)}},Zr=function(e){return e.NO_CONNECTION_TIMEOUT=`no_connection_timeout`,e.CONNECTION_FAILED=`connection_failed`,e.SUCCESS_CONNECTION=`success_connection`,e.NO_DATA_TIMEOUT=`no_data_timeout`,e.SUCCESS_AUDIO=`success_audio`,e.CONNECTION_ACCEPTED_FAILED=`connection_accepted_failed`,e}({}),Qr=function(e){return e.GOOD=`good`,e.BAD_1=`bad_1`,e.BAD_2=`bad_2`,e}({}),$r=class{constructor(e){h(this,`_statAggregator`,void 0),this._statAggregator=e}logServerTopologyRequested(e,t){this._statAggregator?.logEventualStat({name:U.CLIENT_REQUESTED_SERVER_TOPOLOGY,value:t,string_value:e})}logVideoEncoderChanged(e){let t=e.mimeType?.replace(`video/`,``)??``;this._statAggregator?.logEventualStat({name:U.VIDEO_ENCODER_CHANGED_BY_NETWORK_ADAPTER,string_value:JSON.stringify({rtt:Math.round(e.rtt),loss:Math.round(e.loss),network_quality:e.networkQuality,codec_old:t,codec_new:t,source:e.source})})}},ei=200;function ti(e){for(let t of e.values())if(t.type===`outbound-rtp`&&(t.packetsSent??0)>0)return!0;return!1}var ni=class{constructor(e,t,n=ei){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(ti)){this._state=`stopped`,this._onFirstMediaSent();return}}catch{}this._scheduleNextPoll()}}_scheduleNextPoll(){this._state===`polling`&&(this._timer=setTimeout(()=>{this._timer=null,this._poll()},this._pollIntervalMs))}},ri=class extends Xe{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 ni(this._pc,this._onFirstMediaSent),this._firstMediaSentProbe.start())}_disposeFirstMediaSentProbe(){this._firstMediaSentProbe?.destroy(),this._firstMediaSentProbe=null}},ii=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}},ai=.25,oi=.35,si=85,ci=.1,li=1.5,ui=.1,di=1,fi=.6,pi=.3,mi=class extends Xe{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 ii(ai,ai),loss:new ii(oi,oi),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)/si);for(let e=0;e<r;e++)n*=1-ci;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)/li);for(let e=0;e<r;e++)n*=1-ui;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*di;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>=fi?`good`:e>=pi?`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}},hi=30*1e3,gi=class e extends ri{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,`_connectionStartedAt`,0),h(this,`_connectionLostAt`,0),h(this,`_serverRequestedOnNoConnection`,!1),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,`_peerConnectionStats`,void 0),h(this,`_networkAdaptationStats`,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 za(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new mi(n,this._debug),this._sdpStats=new Hr(this._statAggregator),this._peerConnectionStats=new Xr(this._statAggregator),this._networkAdaptationStats=new $r(this._statAggregator),this.subscribe(this._signaling,Tr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Zt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Zt.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(S.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._connectionStartedAt=Date.now(),!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(S.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){Pr(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,this._connectionStartedAt=Date.now(),this._serverRequestedOnNoConnection=!1;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._peerConnectionStats.observe(e),this._prevConsumerSettings={},N.vmoji&&this._createDataChannel(e,kr.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._peerConnectionStats.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(S.ERROR,`addIceCandidate-direct`),this._peerConnectionStats.logIceCandidateAddFailed(t,e),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(S.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(S.ERROR,`iceConnectionState-fallback`),this._markConnected());break}}_markConnected(){this._serverRequestedOnNoConnection&&(this._networkAdaptationStats.logServerTopologyRequested(Zr.SUCCESS_CONNECTION,Date.now()-this._connectionStartedAt),this._serverRequestedOnNoConnection=!1),this._neverConnected=!1,this._setState(q.CONNECTED),this._stopReconnection(),this._pc&&M.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(S.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(S.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._connectionLostAt=Date.now(),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch({reason:Zr.NO_CONNECTION_TIMEOUT}):this._startIceRestart()},N.transportConnectionWaitTime))}_requestTopologySwitch({reason:e,fromAnySide:t=!1}){if((this._isMaster||t)&&this._signaling.ready){this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId});let t=e===Zr.CONNECTION_FAILED?this._connectionLostAt:this._connectionStartedAt;this._networkAdaptationStats.logServerTopologyRequested(e,Date.now()-t),e===Zr.NO_CONNECTION_TIMEOUT&&(this._serverRequestedOnNoConnection=!0),this._signaling.switchTopology(J.SERVER).catch(e=>{e instanceof An||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._peerConnectionStats.logIceRestart(),this._logger?.log(S.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(S.ERROR,`iceRestart-direct`),this._requestTopologySwitch({reason:Zr.CONNECTION_FAILED,fromAnySide: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(S.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(S.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(S.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(S.ERROR,`setLocalDescription-direct`),this._sdpStats.logSetLocalFailed(t,e),e}}static _patchLocalDescription(e){let t=!!w.baseChromeVersion();return e.sdp=M.patchLocalSDP(e.sdp,N.preferH264&&w.canPreferH264(),w.isBrokenH264Decoder(),N.preferVP9,t&&N.audioNack),e}static _patchRemoteDescription(e){return e.sdp=M.patchRemoteSDP(e.sdp,!1,!1,N.preferVP9,w.isBrokenVP9Encoder()||N.simulcast,w.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(S.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=Nr.L1T1,s=Qr.GOOD;if(r?(this._lastBadConnection=Date.now(),i?(s=Qr.BAD_1,a=this._videoMaxDimensionsForNet.bad,o=Nr.L1T2):(s=Qr.BAD_2,a=this._videoMaxDimensionsForNet.worst,o=Nr.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Nr.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>hi)||this._lastVideoMaxDimension===a)return;let c=this._serverSettings.camera;if(!c||!await this._isSVCSupported(e,o))return;this._debug.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a});let l=e.outbound.rtps.find(e=>e.kind===`video`);this._networkAdaptationStats.logVideoEncoderChanged({rtt:t.currentRoundTripTime,loss:t.lostPercent,networkQuality:s,mimeType:l?.mimeType,source:`camera`}),this._lastVideoMaxDimension=a;let u={...this._serverSettings,camera:{...c,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(u)}_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}]`)}}},_i=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),vi=16,yi=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(vi)}}_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}},bi,xi=class{constructor(){h(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};bi=xi,h(xi,`_instance`,null),h(xi,`getInstance`,()=>(bi._instance||(bi._instance=new bi),bi._instance));var Si=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=zn(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=_i.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}}},Ci=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}({}),wi=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:Ci.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 Ci.READY:s=!0,c||(c=!0,a());break;case Ci.ERROR:s?m(e.data.error):p(e.data.error);break;case Ci.FRAME:t(e.data);break;case Ci.DEBUG:this._debug.debug(e.data.message);break;case Ci.LOG_ERROR:this._logger?.log(S.ERROR,e.data.message);break}},this._sendToWorker(Ci.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}_formatWorkerError(e){let t=e.message||e.error?.message||`Unknown worker error`,n=[[e.filename,e.lineno,e.colno].filter(Boolean).join(`:`),[e.error?.name,e.error?.stack].filter(Boolean).join(`: `)].filter(Boolean).join(` `);return`${this.constructor.name} Worker crashed: ${t}${n?` (${n})`:``}`}_formatWorkerMessageError(e){return`${this.constructor.name} Worker message error${e.origin?` from ${e.origin}`:``}`}static isBrowserSupported(){throw Error(`Not implemented`)}},Ti=class extends wi{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(Ci.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}},Ei=class extends wi{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(Ci.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&&!w.isBrokenVP9Decoder()&&w.browserName()!==`Firefox`}},Di=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}},Oi=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})}},ki=65536,Ai=`MARK_SCREENSHARE_FREEZE_DURATION`,ji=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 Oi(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)%ki!==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(Ai),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(Ai);return}let t=G.measureMark(Ai);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},Mi=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")}},Ni=class extends Mi{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)&&!(w.browserName()===`Safari`&&Number(w.browserVersion())===15)}},Pi=class extends Mi{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&&Ei.isBrowserSupported()}},Fi=class extends ji{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 Di(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Pi.isBrowserSupported()?this._renderer=new Ni(this._onStream,this._debug):this._renderer=new Pi(this._onStream,this._debug)}_initDecoder(e=!1){e||!Ei.isBrowserSupported()?this._decoder=new Ti(this._debug,this._logger):this._decoder=new Ei(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 Ei&&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 Ei&&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 Ni.isBrowserSupported()||Pi.isBrowserSupported()}},Ii=1,Li=1,Ri=2,zi=0,Bi=1,Vi=2,Hi=4,Ui=8;function Wi(e,t,n,r,i,a,o){let s=0;t&&(s|=Bi),n&&(s|=Vi),r&&(s|=Hi),o||(s|=Ui);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,Ii),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,zi),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 Gi(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&Bi),l=!!(s&Vi),u=!!(s&Hi),d=!!(s&Ui);if(n!==Ii)throw Error(`Unexpected protocol version. Got ${n}, expected ${Ii}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function Ki(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==Ii||t.getUint8(1)!==Li||t.getUint16(2)!==zi)}function qi(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==Ii||t.getUint8(1)!==Ri||t.getUint16(2)!==zi?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function Ji(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,Ii),n.setUint8(1,Li),n.setUint16(2,e),t}var Yi=2**15-1,Xi=1,Zi=5,Qi=5,$i=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)-Zi);r-n>Qi&&(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}},ea=class e extends ji{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(Xi)),f.element(f.ID.TrackUID,f.number(Xi)),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 $i(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>Yi&&(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(Xi),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"`)}},ta=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=Gi(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&&ea.isBrowserSupported()?new ea(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=Ji(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`)}},na=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}},ra=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 na(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):``}},ia=1e3,aa=class extends wi{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(Ci.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)},ia),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(Ci.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},oa=class extends wi{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(Ci.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(Ci.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}},sa=2100,ca=600,la=1.2,ua=.8,da=2e3,fa=8e3,pa=8e3,ma=16e3,ha=4,ga=2e3,_a=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(_a||{}),va=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=sa,i&&(this._highDelayThreshold=ca),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} -> ${_a[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>da){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,ha),this._probing=!1);let n=ua*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*ua),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*pa/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${_a[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=fa+this._upPenalty*pa;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*la,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*pa/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${_a[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>ma&&(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>ga){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}`)}}},ya=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}},ba=65536,xa=50,Sa=400,Ca=1e6,wa=3e5,Ta=3e4,Ea=2e3,Da=5,Oa=0,ka=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 ya(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 ra),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 va(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(oa.isBrowserSupported()){let t=this._fastSharing;this._encoder=new oa(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new aa(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{Ki(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=qi(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 Di(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+ba)%ba>Da&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>Ea&&(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 ra;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=Wi(e,t,n,r,Oa,this._encoder.isVP9(),i),o={sequence:Oa,data:a};return Oa=(Oa+1)%ba,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 oa.isBrowserSupported()||aa.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(wa,Math.min(Ca,Math.round(n*xa))),maxBitrate:Math.round(n*Sa)}}_checkCcFeedback(e){let t=this._feedback.update(e.seq,e.ts2);if(t===null)this._debug.debug(`cc: update failed, seq=${e.seq}`);else if(t.end){this._lastDeliveredFrameSeq=t.seq;let e=t.recv-t.sent;e>0&&(this._lastFrameDelay=e),this._handleQueue()}}_sendSharingStat(){let e=Date.now();if(e-this._lastSharingStat>Ta){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t).catch(e=>{!(e instanceof An)&&!(e instanceof jn)&&this._debug.warn(`Unable to send sharing stats`,e)})),this._lastSharingStat=e}}},Aa=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=hn(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(en.WIDTH,en.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 gn(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&&on(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:Qt.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(S.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:ln(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??en.WIDTH,t.height??en.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;dn(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:Qt.CAMERA,simulcastInfo:t.simulcastInfo})}async _changeSimulcast(e){try{await this._signaling.changeSimulcast(e)}catch(e){if(!(e instanceof jn))throw e}}},ja=90,Ma=4294967295,Na=class e extends ri{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,`_peerConnectionStats`,void 0),h(this,`_codecStatsAggregator`,void 0),h(this,`_simulcast`,void 0),this._debug=r,this._logger=i,this._statAggregator=a,this._sdpStats=new Hr(a),this._peerConnectionStats=new Xr(a),this._codecStatsAggregator=o,this._serverSettings=n,this._simulcast=new Aa(e,t,()=>this._serverSettings.camera,r,i),this.subscribe(this._signaling,Tr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Zt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Zt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Zt.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){Pr(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 za(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._peerConnectionStats.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._peerConnectionStats.observe(this._pc),this._participantIdRegistry=new Si(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,kr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,kr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,kr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),N.asrDataChannel&&this._createDataChannel(this._pc,kr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new yi(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),N.vmoji&&this._createDataChannel(this._pc,kr.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(S.ERROR,`addTrack-single`),this.close(e);return}this._startFirstMediaSentProbe(),this._createDataChannel(this._pc,kr.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(e=!1){this.getState()!==q.OPENED&&(e&&this._peerConnectionStats.logIceRestart(),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,hn(e.sdp).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${_i.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${_i.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 ka(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 ta(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=_i.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=Ga.get();!N.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e).catch(e=>{e instanceof An||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(S.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(S.ERROR,`createAnswer-single`),this._sdpStats.logCreateFailed(`answer`,e),e}try{if(!this._pc)throw Error(`Interrupt allocation`);n.sdp=M.patchLocalSDP(n.sdp,!1,w.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(S.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(S.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,w.isBrokenVP9Encoder()||N.simulcast,w.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(S.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 An||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(S.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(S.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect(!0);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(S.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(S.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(S.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(S.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(S.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(S.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&Ma,o=Math.ceil(a/ja);return Math.min(100,Math.max(0,o))}async _monitorRtpShare(){let e=xi.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(`
9
+ `+gn(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),gn(s)}e.patchLocalSDP=f;function p(e,t,n,r,i,o){let s=hn(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),gn(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=hn(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*_n/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=ln(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)}`),dn(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 fn(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})(bn||(bn={}));var M=bn,xn=`__CALLS_SDK_DEVTOOLS_`,Sn=class{set(e,t){try{this.getStorage().setItem(xn+e,JSON.stringify(t))}catch(t){z.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(xn+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(xn+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(xn)&&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(xn)){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}},Cn=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}},wn=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 Sn,this.params=new Cn(this.storage)}};h(wn,`instance`,null);var Tn=wn.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=Tn.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.9394b771.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`;case`CALLS_CHELSEA`:return`https://api-chelsea.calls-test.oneme.ru/api`;case`CALLS_KERZH`:return`https://api-kerzh.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 signalingReconnectMaxDuration(){return e._params.signalingReconnectMaxDuration}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||(w.isMobile()?Lt.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 iceCandidateErrorStatEnabled(){return e._params.iceCandidateErrorStatEnabled}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 w.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 w.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,iceCandidateErrorStatEnabled:e._params.iceCandidateErrorStatEnabled,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,signalingReconnectMaxDuration:6e4,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,iceCandidateErrorStatEnabled:!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 En(e){return e.slice()}var Dn;(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?En(c):void 0;F(`onMuteStates`,L(e),En(t),En(n),r,i,a,o,s,d,l,u)}e.onMuteStates=_e;function ve(e,t,n=!1,r){I(`onRolesChanged`,e,En(t),n,r)}e.onRolesChanged=ve;function v(e,t=!1,n){F(`onLocalRolesChanged`,En(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`,En(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`,En(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(e){F(`onClientStats`,e)}e.onClientStats=We;function Ge(){F(`onAutoplayError`)}e.onAutoplayError=Ge;function Ke(e,t,n,r,i,a){F(`onChatRoomUpdated`,e,t,n,r,i,a)}e.onChatRoomUpdated=Ke;function qe(e,t){F(`onPromoted`,e,t)}e.onPromoted=qe;function Je(e,t){F(`onRemoteMixedAudioStream`,e,t)}e.onRemoteMixedAudioStream=Je;function Ye(e,t){F(`onJoinLinkChanged`,e,t)}e.onJoinLinkChanged=Ye;function y(e,t){F(`onRoomsUpdated`,e,t)}e.onRoomsUpdated=y;function Xe(e,t,n,r,i){F(`onRoomUpdated`,e,t,n,r,i)}e.onRoomUpdated=Xe;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 Ze(e,t=null,n){F(`onFeedback`,e,t,n)}e.onFeedback=Ze;function Qe(e,t){F(`onFeaturesPerRoleChanged`,e,t)}e.onFeaturesPerRoleChanged=Qe;function $e(e,t){F(`onParticipantVmojiUpdate`,e,t)}e.onParticipantVmojiUpdate=$e;function et(e,t,n){F(`onAsrSet`,e,t,n)}e.onAsrSet=et;function tt(e,t,n,r){F(`onAsrStarted`,e,t,n,r)}e.onAsrStarted=tt;function nt(e,t){F(`onAsrStopped`,e,t)}e.onAsrStopped=nt;function rt(e,t,n,r,i){F(`onAsrTranscription`,e,t,n,r,i)}e.onAsrTranscription=rt;function it(e,t,n){F(`onParticipantIdChanged`,e,t,n)}e.onParticipantIdChanged=it;function C(e,t){F(`onVideoSuspendSuggest`,e,t)}e.onVideoSuspendSuggest=C;function w(e){F(`onSignalingMessage`,typeof e==`string`?e:L(e))}e.onSignalingMessage=w;function at(e,t){F(`onPromotionApproved`,e,t)}e.onPromotionApproved=at;function ot(e,t){F(`onPeerRegistered`,e,t)}e.onPeerRegistered=ot;function st(e,t){F(`onNonFatalError`,e,t)}e.onNonFatalError=st})(Dn||(Dn={}));var R=Dn,On=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),kn;(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})(kn||(kn={}));var z=kn,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()}}},An=class extends Error{constructor(e){super(e?`Signaling disposed. Command ${e}`:`Signaling disposed`),this.name=`SignalingDisposedError`}},jn=class extends Error{constructor(e){super(e?`Producer connection closed. Command ${e}`:`Producer connection closed`),this.name=`ProducerConnectionClosedError`}},Mn=class extends Xe{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 Nn(e){return e.stopStream}function Pn(e){return e.keyFrameRequested}function Fn(e){if(Nn(e))return`ss`;if(Pn(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}({}),In=`s`,Ln=`m`;function Rn(e){return e.participantId+(e.mediaType?`:`+In+e.mediaType:``)+(e.streamName?`:`+Ln+e.streamName:``)}function zn(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 In:r=Bn(n.slice(1));break;case Ln: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 Bn(e){for(let t of Object.keys(H))if(t===e)return H[t];return null}function Vn(){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),Hn(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 Hn(e){return e.buffer!==void 0}function Un(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 Wn=0,Gn=1,Kn=2,qn=3,Jn=4,Yn=5,Xn=6,Zn=7,Qn=0,$n=1,er=2,tr=0,nr=0,rr=0,ir=1,ar=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=Vn();l.Int.enc(n,Wn),l.Int.enc(n,tr),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=Vn();if(this.writeStreamDesc(t,i),Nn(r))l.Int.enc(i,$n);else if(Pn(r))l.Int.enc(i,er);else if(l.Int.enc(i,Qn),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,rr);break;case`cn`:l.Int.enc(i,ir);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=Vn();return l.Int.enc(n,Gn),l.Int.enc(n,tr),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=Vn();return l.Int.enc(n,Kn),l.Int.enc(n,tr),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=Vn();return l.Int.enc(n,qn),l.Int.enc(n,tr),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=Vn();return l.Int.enc(n,Jn),l.Int.enc(n,tr),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=Vn();return l.Int.enc(n,Yn),l.Int.enc(n,tr),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=Vn();return l.Int.enc(n,Xn),l.Int.enc(n,tr),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=Vn();l.Int.enc(n,Zn),l.Int.enc(n,tr),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?Un(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await pn(e)):Un(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==tr){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==nr){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Wn:return this.deserializeUpdateDisplayLayoutResponse(t);case Gn: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=Un(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=Rn(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.CONNECTION_STATE_CHANGED=`connection_state_changed`,e.SIGNALING_STATE_CHANGED=`signaling_state_changed`,e.GATHERING_STATE_CHANGED=`gathering_state_changed`,e.ICE_RESTART=`ice_restart`,e.ICE_CANDIDATES_CHANGED=`ice_candidates_changed`,e.ICE_CANDIDATE_GATHERING_FAILED=`ice_candidate_gathering_failed`,e.ICE_CANDIDATE_ADD_FAILED=`ice_candidate_add_failed`,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.CLIENT_REQUESTED_SERVER_TOPOLOGY=`client_requested_server_topology`,e.VIDEO_ENCODER_CHANGED_BY_NETWORK_ADAPTER=`video_encoder_changed_by_network_adapter`,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||{}),or=1e3;function W(e,t,n=0){return t in e&&e[t]?e[t]:n}function sr(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function cr(e,t){return n=>n[e]===t}function lr(e){return(t,n)=>n[e]-t[e]}function ur(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function dr(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function fr(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])?fr(t[1]):t[1],e),{})}function pr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function mr(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(pr).then(dr)}function hr(e){let t=e.filter(cr(`type`,`candidate-pair`)).sort(lr(`priority`)).find(sr(cr(`nominated`,!0),cr(`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(cr(`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(cr(`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}}),fr(n)}function gr(e,t,n=!1){let r=ur(`id`,e);return(n?e.filter(sr(cr(`type`,`remote-inbound-rtp`))):e.filter(sr(cr(`type`,`inbound-rtp`),cr(`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 fr(c)}).filter(e=>!!e)}function _r(e,t,n=!1){if(!t||!t.rtps.length||!e.rtps.length)return e;let r,i;n&&(r=ur(`ssrc`,e?.remoteRtps||[]),i=ur(`ssrc`,t?.remoteRtps||[]));let a=ur(`ssrc`,e.rtps),o=ur(`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 vr(e,t,n={},r=!1){let i=await mr(e),a={timestamp:Date.now(),transport:hr(i),rtps:gr(i,n)};return r&&(a.remoteRtps=gr(i,n,!0)),t?_r(a,t,r):(await M.delay(or),vr(e,a,n,r))}function yr(e){performance.clearMarks(e),performance.mark(e)}function br(e){performance.clearMarks(e)}function xr(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 Sr(e){return`${U.SCREENSHARE_FIRST_FRAME}_${Cr(e)}`}function Cr(e){return typeof e==`string`?e:JSON.stringify(e)}var G={distinctById:dr,rtcStatsToArray:pr,extractTransport:hr,extractRtps:gr,delta:_r,collectStats:vr,setMark:yr,clearMark:br,measureMark:xr,getMarkNameScreenshareFirstFrame:Sr},wr=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(wr||{}),Tr=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(Tr||{}),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||{}),Er=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),Dr=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}({}),Or={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||{}),kr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(kr||{}),{isObject:Ar,isObjectsEquals:jr}=M;function Mr(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||Ar(e.bitrates)&&Ar(t.bitrates)&&!jr(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Nr=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Pr(e,t){return!(!Mr(e.camera,t.camera)||!Mr(e.screenSharing,t.screenSharing)||!Mr(e.fastScreenSharing,t.fastScreenSharing))}function Fr(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 Ir(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Lr={offer:U.SDP_CREATE_OFFER,answer:U.SDP_CREATE_ANSWER},Rr={offer:U.SDP_SET_LOCAL_OFFER,pranswer:U.SDP_SET_LOCAL_PRANSWER,answer:U.SDP_SET_LOCAL_ANSWER,rollback:U.SDP_SET_LOCAL_ROLLBACK},zr={offer:U.SDP_SET_REMOTE_OFFER,pranswer:U.SDP_SET_REMOTE_PRANSWER,answer:U.SDP_SET_REMOTE_ANSWER,rollback:U.SDP_SET_REMOTE_ROLLBACK},Br=120*1e3,Vr={local_address:null,remote_address:null,transport:null},Hr=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,...Vr})}logCandidateGenerated(e){let t=Wr(e.candidate);t&&this._log({name:U.SDP_GENERATED,value:this._intervalSince(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,...Vr})}logCandidateReceived(e){let t=Wr(e.candidate);t&&this._log({name:U.SDP_RECEIVED,value:this._remoteSdpReceivedAt>0?this._intervalSince(this._remoteSdpReceivedAt):0,string_value:t.type,local_address:null,remote_address:t.address,transport:t.protocol})}logCreateFailed(e,t){let n=Lr[e];n&&this._logFailure(n,t,{remote:e===`answer`?this._pc?.remoteDescription:void 0})}logSetLocalFailed(e,t){this._logFailure(Rr[e.type],t,{local:e,remote:this._pc?.remoteDescription})}logSetRemoteFailed(e,t){this._logFailure(zr[e.type],t,{local:this._pc?.localDescription,remote:e})}destroy(){this.stop()}_intervalSince(e){return Math.min(Br,Math.max(0,Date.now()-e))}_logFailure(e,t,n){this._log({name:e,value:0,string_value:JSON.stringify({error:t instanceof Error?t.message:String(t),local:Ur(n.local),remote:Ur(n.remote)}),...Vr})}_log(e){this._statAggregator?.logEventualStat(e)}};function Ur(e){return e?{type:e.type,sdp:e.sdp}:void 0}function Wr(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||!qr(i)?null:{protocol:r,address:i,type:a}}var Gr=/^\d{1,3}(\.\d{1,3}){3}$/,Kr=/^[0-9a-f:]+$/i;function qr(e){return Gr.test(e)||e.includes(`:`)&&Kr.test(e)}var Jr=/[?&]transport=(tcp|udp)/i,Yr={stable:`stable`,"have-local-offer":`have.local.offer`,"have-local-pranswer":`have.local.answer`,"have-remote-offer":`have.remote.offer`,"have-remote-pranswer":`have.remote.answer`,closed:`closed`},Xr=class{constructor(e){h(this,`_statAggregator`,void 0),h(this,`_pc`,null),h(this,`_lastSignalingStateChange`,0),h(this,`_lastGatheringStateChange`,0),h(this,`_lastConnectionState`,null),h(this,`_handleConnectionStateChange`,()=>{this._pc&&this._logConnectionState(this._pc.connectionState)}),h(this,`_handleSignalingStateChange`,()=>{let e=this._pc?.signalingState;this._log({name:U.SIGNALING_STATE_CHANGED,value:this._sinceLastChange(`_lastSignalingStateChange`),string_value:e?Yr[e]:void 0})}),h(this,`_handleGatheringStateChange`,()=>{let e=this._pc?.iceGatheringState,t=this._sinceLastChange(`_lastGatheringStateChange`);this._log({name:U.GATHERING_STATE_CHANGED,value:e===`new`?0:t,string_value:e})}),h(this,`_handleIceCandidateError`,e=>{if(!N.iceCandidateErrorStatEnabled)return;let t=e;this._log({name:U.ICE_CANDIDATE_GATHERING_FAILED,value:t.errorCode,string_value:t.errorText,local_address:t.address??``,remote_url:t.url,transport:Jr.exec(t.url??``)?.[1]?.toLowerCase()??null})}),this._statAggregator=e}observe(e){this.stop(),this._pc=e,this._lastSignalingStateChange=0,this._lastGatheringStateChange=0,this._lastConnectionState=null,e.addEventListener(`connectionstatechange`,this._handleConnectionStateChange),e.addEventListener(`signalingstatechange`,this._handleSignalingStateChange),e.addEventListener(`icegatheringstatechange`,this._handleGatheringStateChange),e.addEventListener(`icecandidateerror`,this._handleIceCandidateError)}stop(){this._pc&&(this._pc.connectionState!==`new`&&this._logConnectionState(this._pc.connectionState),this._logConnectionState(`closed`),this._pc.removeEventListener(`connectionstatechange`,this._handleConnectionStateChange),this._pc.removeEventListener(`signalingstatechange`,this._handleSignalingStateChange),this._pc.removeEventListener(`icegatheringstatechange`,this._handleGatheringStateChange),this._pc.removeEventListener(`icecandidateerror`,this._handleIceCandidateError),this._pc=null)}logIceRestart(){this._log({name:U.ICE_RESTART})}logIceCandidateAddFailed(e,t){this._log({name:U.ICE_CANDIDATE_ADD_FAILED,value:t instanceof DOMException?t.code:0,string_value:t instanceof Error?`${t.name}: ${t.message}`:String(t),remote_url:e.candidate})}_sinceLastChange(e){let t=Date.now(),n=this[e]===0?0:t-this[e];return this[e]=t,n}_logConnectionState(e){e!==this._lastConnectionState&&(this._lastConnectionState=e,this._log({name:U.CONNECTION_STATE_CHANGED,connection_state:e}))}_log(e){this._statAggregator?.logEventualStat(e)}},Zr=function(e){return e.NO_CONNECTION_TIMEOUT=`no_connection_timeout`,e.CONNECTION_FAILED=`connection_failed`,e.SUCCESS_CONNECTION=`success_connection`,e.NO_DATA_TIMEOUT=`no_data_timeout`,e.SUCCESS_AUDIO=`success_audio`,e.CONNECTION_ACCEPTED_FAILED=`connection_accepted_failed`,e}({}),Qr=function(e){return e.GOOD=`good`,e.BAD_1=`bad_1`,e.BAD_2=`bad_2`,e}({}),$r=class{constructor(e){h(this,`_statAggregator`,void 0),this._statAggregator=e}logServerTopologyRequested(e,t){this._statAggregator?.logEventualStat({name:U.CLIENT_REQUESTED_SERVER_TOPOLOGY,value:t,string_value:e})}logVideoEncoderChanged(e){let t=e.mimeType?.replace(`video/`,``)??``;this._statAggregator?.logEventualStat({name:U.VIDEO_ENCODER_CHANGED_BY_NETWORK_ADAPTER,string_value:JSON.stringify({rtt:Math.round(e.rtt),loss:Math.round(e.loss),network_quality:e.networkQuality,codec_old:t,codec_new:t,source:e.source})})}},ei=200;function ti(e){for(let t of e.values())if(t.type===`outbound-rtp`&&(t.packetsSent??0)>0)return!0;return!1}var ni=class{constructor(e,t,n=ei){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(ti)){this._state=`stopped`,this._onFirstMediaSent();return}}catch{}this._scheduleNextPoll()}}_scheduleNextPoll(){this._state===`polling`&&(this._timer=setTimeout(()=>{this._timer=null,this._poll()},this._pollIntervalMs))}},ri=class extends Xe{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 ni(this._pc,this._onFirstMediaSent),this._firstMediaSentProbe.start())}_disposeFirstMediaSentProbe(){this._firstMediaSentProbe?.destroy(),this._firstMediaSentProbe=null}},ii=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}},ai=.25,oi=.35,si=85,ci=.1,li=1.5,ui=.1,di=1,fi=.6,pi=.3,mi=class extends Xe{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 ii(ai,ai),loss:new ii(oi,oi),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)/si);for(let e=0;e<r;e++)n*=1-ci;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)/li);for(let e=0;e<r;e++)n*=1-ui;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*di;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>=fi?`good`:e>=pi?`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}},hi=30*1e3,gi=class e extends ri{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,`_connectionStartedAt`,0),h(this,`_connectionLostAt`,0),h(this,`_serverRequestedOnNoConnection`,!1),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,`_peerConnectionStats`,void 0),h(this,`_networkAdaptationStats`,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 za(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new mi(n,this._debug),this._sdpStats=new Hr(this._statAggregator),this._peerConnectionStats=new Xr(this._statAggregator),this._networkAdaptationStats=new $r(this._statAggregator),this.subscribe(this._signaling,Tr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Zt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Zt.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(S.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._connectionStartedAt=Date.now(),!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(S.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){Pr(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,this._connectionStartedAt=Date.now(),this._serverRequestedOnNoConnection=!1;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._peerConnectionStats.observe(e),this._prevConsumerSettings={},N.vmoji&&this._createDataChannel(e,kr.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._peerConnectionStats.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(S.ERROR,`addIceCandidate-direct`),this._peerConnectionStats.logIceCandidateAddFailed(t,e),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(S.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(S.ERROR,`iceConnectionState-fallback`),this._markConnected());break}}_markConnected(){this._serverRequestedOnNoConnection&&(this._networkAdaptationStats.logServerTopologyRequested(Zr.SUCCESS_CONNECTION,Date.now()-this._connectionStartedAt),this._serverRequestedOnNoConnection=!1),this._neverConnected=!1,this._setState(q.CONNECTED),this._stopReconnection(),this._pc&&M.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(S.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(S.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._connectionLostAt=Date.now(),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch({reason:Zr.NO_CONNECTION_TIMEOUT}):this._startIceRestart()},N.transportConnectionWaitTime))}_requestTopologySwitch({reason:e,fromAnySide:t=!1}){if((this._isMaster||t)&&this._signaling.ready){this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId});let t=e===Zr.CONNECTION_FAILED?this._connectionLostAt:this._connectionStartedAt;this._networkAdaptationStats.logServerTopologyRequested(e,Date.now()-t),e===Zr.NO_CONNECTION_TIMEOUT&&(this._serverRequestedOnNoConnection=!0),this._signaling.switchTopology(J.SERVER).catch(e=>{e instanceof An||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._peerConnectionStats.logIceRestart(),this._logger?.log(S.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(S.ERROR,`iceRestart-direct`),this._requestTopologySwitch({reason:Zr.CONNECTION_FAILED,fromAnySide: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(S.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(S.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(S.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(S.ERROR,`setLocalDescription-direct`),this._sdpStats.logSetLocalFailed(t,e),e}}static _patchLocalDescription(e){let t=!!w.baseChromeVersion();return e.sdp=M.patchLocalSDP(e.sdp,N.preferH264&&w.canPreferH264(),w.isBrokenH264Decoder(),N.preferVP9,t&&N.audioNack),e}static _patchRemoteDescription(e){return e.sdp=M.patchRemoteSDP(e.sdp,!1,!1,N.preferVP9,w.isBrokenVP9Encoder()||N.simulcast,w.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(S.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=Nr.L1T1,s=Qr.GOOD;if(r?(this._lastBadConnection=Date.now(),i?(s=Qr.BAD_1,a=this._videoMaxDimensionsForNet.bad,o=Nr.L1T2):(s=Qr.BAD_2,a=this._videoMaxDimensionsForNet.worst,o=Nr.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Nr.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>hi)||this._lastVideoMaxDimension===a)return;let c=this._serverSettings.camera;if(!c||!await this._isSVCSupported(e,o))return;this._debug.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a});let l=e.outbound.rtps.find(e=>e.kind===`video`);this._networkAdaptationStats.logVideoEncoderChanged({rtt:t.currentRoundTripTime,loss:t.lostPercent,networkQuality:s,mimeType:l?.mimeType,source:`camera`}),this._lastVideoMaxDimension=a;let u={...this._serverSettings,camera:{...c,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(u)}_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}]`)}}},_i=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),vi=16,yi=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(vi)}}_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}},bi,xi=class{constructor(){h(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};bi=xi,h(xi,`_instance`,null),h(xi,`getInstance`,()=>(bi._instance||(bi._instance=new bi),bi._instance));var Si=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=zn(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=_i.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}}},Ci=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}({}),wi=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:Ci.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 Ci.READY:s=!0,c||(c=!0,a());break;case Ci.ERROR:s?m(e.data.error):p(e.data.error);break;case Ci.FRAME:t(e.data);break;case Ci.DEBUG:this._debug.debug(e.data.message);break;case Ci.LOG_ERROR:this._logger?.log(S.ERROR,e.data.message);break}},this._sendToWorker(Ci.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}_formatWorkerError(e){let t=e.message||e.error?.message||`Unknown worker error`,n=[[e.filename,e.lineno,e.colno].filter(Boolean).join(`:`),[e.error?.name,e.error?.stack].filter(Boolean).join(`: `)].filter(Boolean).join(` `);return`${this.constructor.name} Worker crashed: ${t}${n?` (${n})`:``}`}_formatWorkerMessageError(e){return`${this.constructor.name} Worker message error${e.origin?` from ${e.origin}`:``}`}static isBrowserSupported(){throw Error(`Not implemented`)}},Ti=class extends wi{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(Ci.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}},Ei=class extends wi{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(Ci.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&&!w.isBrokenVP9Decoder()&&w.browserName()!==`Firefox`}},Di=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}},Oi=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})}},ki=65536,Ai=`MARK_SCREENSHARE_FREEZE_DURATION`,ji=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 Oi(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)%ki!==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(Ai),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(Ai);return}let t=G.measureMark(Ai);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},Mi=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")}},Ni=class extends Mi{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)&&!(w.browserName()===`Safari`&&Number(w.browserVersion())===15)}},Pi=class extends Mi{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&&Ei.isBrowserSupported()}},Fi=class extends ji{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 Di(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Pi.isBrowserSupported()?this._renderer=new Ni(this._onStream,this._debug):this._renderer=new Pi(this._onStream,this._debug)}_initDecoder(e=!1){e||!Ei.isBrowserSupported()?this._decoder=new Ti(this._debug,this._logger):this._decoder=new Ei(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 Ei&&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 Ei&&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 Ni.isBrowserSupported()||Pi.isBrowserSupported()}},Ii=1,Li=1,Ri=2,zi=0,Bi=1,Vi=2,Hi=4,Ui=8;function Wi(e,t,n,r,i,a,o){let s=0;t&&(s|=Bi),n&&(s|=Vi),r&&(s|=Hi),o||(s|=Ui);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,Ii),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,zi),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 Gi(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&Bi),l=!!(s&Vi),u=!!(s&Hi),d=!!(s&Ui);if(n!==Ii)throw Error(`Unexpected protocol version. Got ${n}, expected ${Ii}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function Ki(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==Ii||t.getUint8(1)!==Li||t.getUint16(2)!==zi)}function qi(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==Ii||t.getUint8(1)!==Ri||t.getUint16(2)!==zi?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function Ji(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,Ii),n.setUint8(1,Li),n.setUint16(2,e),t}var Yi=2**15-1,Xi=1,Zi=5,Qi=5,$i=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)-Zi);r-n>Qi&&(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}},ea=class e extends ji{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(Xi)),f.element(f.ID.TrackUID,f.number(Xi)),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 $i(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>Yi&&(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(Xi),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"`)}},ta=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=Gi(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&&ea.isBrowserSupported()?new ea(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=Ji(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`)}},na=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}},ra=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 na(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):``}},ia=1e3,aa=class extends wi{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(Ci.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)},ia),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(Ci.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},oa=class extends wi{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(Ci.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(Ci.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}},sa=2100,ca=600,la=1.2,ua=.8,da=2e3,fa=8e3,pa=8e3,ma=16e3,ha=4,ga=2e3,_a=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(_a||{}),va=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=sa,i&&(this._highDelayThreshold=ca),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} -> ${_a[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>da){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,ha),this._probing=!1);let n=ua*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*ua),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*pa/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${_a[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=fa+this._upPenalty*pa;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*la,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*pa/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${_a[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>ma&&(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>ga){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}`)}}},ya=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}},ba=65536,xa=50,Sa=400,Ca=1e6,wa=3e5,Ta=3e4,Ea=2e3,Da=5,Oa=0,ka=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 ya(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 ra),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 va(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(oa.isBrowserSupported()){let t=this._fastSharing;this._encoder=new oa(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new aa(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{Ki(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=qi(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 Di(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+ba)%ba>Da&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>Ea&&(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 ra;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=Wi(e,t,n,r,Oa,this._encoder.isVP9(),i),o={sequence:Oa,data:a};return Oa=(Oa+1)%ba,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 oa.isBrowserSupported()||aa.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(wa,Math.min(Ca,Math.round(n*xa))),maxBitrate:Math.round(n*Sa)}}_checkCcFeedback(e){let t=this._feedback.update(e.seq,e.ts2);if(t===null)this._debug.debug(`cc: update failed, seq=${e.seq}`);else if(t.end){this._lastDeliveredFrameSeq=t.seq;let e=t.recv-t.sent;e>0&&(this._lastFrameDelay=e),this._handleQueue()}}_sendSharingStat(){let e=Date.now();if(e-this._lastSharingStat>Ta){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t).catch(e=>{!(e instanceof An)&&!(e instanceof jn)&&this._debug.warn(`Unable to send sharing stats`,e)})),this._lastSharingStat=e}}},Aa=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=hn(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(en.WIDTH,en.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 gn(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&&on(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:Qt.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(S.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:ln(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??en.WIDTH,t.height??en.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;dn(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:Qt.CAMERA,simulcastInfo:t.simulcastInfo})}async _changeSimulcast(e){try{await this._signaling.changeSimulcast(e)}catch(e){if(!(e instanceof jn))throw e}}},ja=90,Ma=4294967295,Na=class e extends ri{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,`_peerConnectionStats`,void 0),h(this,`_codecStatsAggregator`,void 0),h(this,`_simulcast`,void 0),this._debug=r,this._logger=i,this._statAggregator=a,this._sdpStats=new Hr(a),this._peerConnectionStats=new Xr(a),this._codecStatsAggregator=o,this._serverSettings=n,this._simulcast=new Aa(e,t,()=>this._serverSettings.camera,r,i),this.subscribe(this._signaling,Tr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Zt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Zt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Zt.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){Pr(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 za(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._peerConnectionStats.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._peerConnectionStats.observe(this._pc),this._participantIdRegistry=new Si(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,kr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,kr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,kr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),N.asrDataChannel&&this._createDataChannel(this._pc,kr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new yi(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),N.vmoji&&this._createDataChannel(this._pc,kr.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(S.ERROR,`addTrack-single`),this.close(e);return}this._startFirstMediaSentProbe(),this._createDataChannel(this._pc,kr.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(e=!1){this.getState()!==q.OPENED&&(e&&this._peerConnectionStats.logIceRestart(),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,hn(e.sdp).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${_i.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${_i.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 ka(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 ta(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=_i.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=Ga.get();!N.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e).catch(e=>{e instanceof An||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(S.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(S.ERROR,`createAnswer-single`),this._sdpStats.logCreateFailed(`answer`,e),e}try{if(!this._pc)throw Error(`Interrupt allocation`);n.sdp=M.patchLocalSDP(n.sdp,!1,w.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(S.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(S.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,w.isBrokenVP9Encoder()||N.simulcast,w.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(S.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 An||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(S.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(S.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect(!0);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(S.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(S.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(S.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(S.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(S.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(S.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&Ma,o=Math.ceil(a/ja);return Math.min(100,Math.max(0,o))}async _monitorRtpShare(){let e=xi.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)}
package/calls-sdk.esm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * @vkontakte/calls-sdk v2.8.13-dev.901f3b4d.0
3
- * Thu, 15 Oct 2026 20:13:47 GMT
2
+ * @vkontakte/calls-sdk v2.8.13-dev.9394b771.0
3
+ * Fri, 16 Oct 2026 11:29:22 GMT
4
4
  * https://calls-sdk.cdn-vk.ru/doc/latest/index.html
5
5
  */
6
6
 
@@ -2208,7 +2208,7 @@ var Cn = Sn.getInstance(), N = class e {
2208
2208
  return 1.1;
2209
2209
  }
2210
2210
  static get sdkVersion() {
2211
- return "2.8.13-dev.901f3b4d.0";
2211
+ return "2.8.13-dev.9394b771.0";
2212
2212
  }
2213
2213
  static get debug() {
2214
2214
  return e._params.debug;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/calls-sdk",
3
- "version": "2.8.13-dev.901f3b4d.0",
3
+ "version": "2.8.13-dev.9394b771.0",
4
4
  "author": "vk.com",
5
5
  "description": "Library for video calls based on the vk.com platform",
6
6
  "homepage": "https://vk.com",
@@ -14,9 +14,9 @@
14
14
  "**/*.d.ts"
15
15
  ],
16
16
  "dependencies": {
17
- "@vkontakte/calls-audio-effects": "1.4.2-dev.cbbd651d.0",
17
+ "@vkontakte/calls-audio-effects": "1.4.2-dev.4a2ab040.0",
18
18
  "@vkontakte/calls-video-effects": "2.2.3-beta.7",
19
- "@vkontakte/calls-vmoji": "1.0.10-dev.30e09d41.0",
19
+ "@vkontakte/calls-vmoji": "1.0.10-dev.1b7a636b.0",
20
20
  "@vkontakte/libvpx": "2.0.9",
21
21
  "bit-buffer": "0.2.5",
22
22
  "fflate": "^0.8.2",