@vkontakte/calls-sdk 2.8.11-dev.af7eda54.0 → 2.8.11-dev.c0a05ac7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CallsSDK.d.ts +20 -18
- package/abstract/BaseSignaling.d.ts +4 -5
- package/calls-sdk.cjs.js +9 -9
- package/calls-sdk.esm.js +3847 -3470
- package/classes/AudioFix.d.ts +5 -1
- package/classes/AudioOutput.d.ts +5 -1
- package/classes/CallRegistry.d.ts +22 -0
- package/classes/Conversation.d.ts +17 -7
- package/classes/DebugInfo.d.ts +3 -0
- package/classes/DisplayLayoutRequester.d.ts +39 -0
- package/classes/MediaSource.d.ts +12 -1
- package/classes/ParticipantIdRegistry.d.ts +3 -0
- package/classes/ProducerCommandSerializationService.d.ts +3 -0
- package/classes/SignalingActor.d.ts +3 -1
- package/classes/SpeakerDetector.d.ts +2 -1
- package/classes/SpecListener.d.ts +7 -1
- package/classes/{Logger.d.ts → StatsLogger.d.ts} +3 -10
- package/classes/VideoEffectsFpsLimiter.d.ts +3 -0
- package/classes/asr/AsrReceiver.d.ts +3 -1
- package/classes/codec/LibVPxDecoder.d.ts +3 -0
- package/classes/codec/LibVPxEncoder.d.ts +3 -1
- package/classes/codec/WebCodecsDecoder.d.ts +3 -0
- package/classes/codec/WebCodecsEncoder.d.ts +3 -1
- package/classes/codec/WorkerBase.d.ts +5 -0
- package/classes/screenshare/BaseStreamBuilder.d.ts +4 -1
- package/classes/screenshare/CanvasRenderer.d.ts +3 -1
- package/classes/screenshare/ScreenCaptureReceiver.d.ts +7 -1
- package/classes/screenshare/ScreenCaptureSender.d.ts +5 -1
- package/classes/screenshare/ScreenCongestionControl.d.ts +3 -1
- package/classes/screenshare/StreamBuilder.d.ts +5 -1
- package/classes/screenshare/TrackGeneratorRenderer.d.ts +3 -1
- package/classes/screenshare/WebmBuilder.d.ts +3 -1
- package/classes/stat/CodecStatsAggregator.d.ts +7 -7
- package/classes/stat/ConversationStats.d.ts +21 -0
- package/classes/stat/StatAggregator.d.ts +6 -6
- package/classes/stat/StatFirstMediaReceived.d.ts +4 -1
- package/classes/stat/StatPings.d.ts +9 -9
- package/classes/stat/StatScreenShareFirstFrame.d.ts +3 -1
- package/classes/stat/StatSignalingCommands.d.ts +8 -8
- package/classes/transport/BaseTransport.d.ts +1 -1
- package/classes/transport/DirectStatReporter.d.ts +3 -1
- package/classes/transport/DirectTransport.d.ts +9 -1
- package/classes/transport/PerfStatReporter.d.ts +5 -1
- package/classes/transport/ServerTransport.d.ts +10 -2
- package/classes/transport/Transport.d.ts +11 -14
- package/default/Signaling.d.ts +12 -1
- package/enums/SignalingNotification.d.ts +2 -1
- package/enums/TransportState.d.ts +10 -0
- package/enums/TransportTopology.d.ts +5 -0
- package/package.json +1 -1
- package/static/Capabilities.d.ts +5 -0
- package/static/Debug.d.ts +27 -8
- package/static/External.d.ts +146 -71
- package/static/Params.d.ts +98 -70
- package/static/Utils.d.ts +3 -2
- package/static/WebRTCUtils.d.ts +6 -4
- package/types/Capabilities.d.ts +24 -0
- package/types/Conversation.d.ts +1 -1
- package/types/FastStart.d.ts +1 -0
- package/types/ParticipantLayout.d.ts +33 -0
- package/types/SignalingMessage.d.ts +5 -1
- package/types/Statistics.d.ts +1 -1
- package/utils/DebugStorage.d.ts +1 -2
- package/classes/stat/EventMetricsService.d.ts +0 -9
package/calls-sdk.cjs.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @vkontakte/calls-sdk v2.8.11-dev.
|
|
3
|
-
*
|
|
2
|
+
* @vkontakte/calls-sdk v2.8.11-dev.c0a05ac7.0
|
|
3
|
+
* Mon, 08 Jun 2026 16:31:36 GMT
|
|
4
4
|
* https://calls-sdk.cdn-vk.ru/doc/latest/index.html
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("webrtc-adapter");c=s(c);let l=require("messagepack"),u=require("@vkontakte/libvpx");u=s(u);let d=require("bit-buffer"),f=require("simple-ebml-builder");f=s(f);let p=require("fflate");p=s(p);var m=class{log(e,t,n=!1){}destroy(){}};function h(e){"@babel/helpers - typeof";return h=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},h(e)}function ee(e,t){if(h(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(h(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function te(e){var t=ee(e,`string`);return h(t)==`symbol`?t:t+``}function g(e,t,n){return(t=te(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var _=class{constructor(){g(this,`_handlers`,{}),g(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()})}},ne=class extends _{constructor(...e){super(...e),g(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}setConversationId(e){}readyToSend(e=!0){}cleanup(){}requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}},v=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.CALLER_IS_REJECTED=`CALLER_IS_REJECTED`,e.UNKNOWN_ERROR=`UNKNOWN_ERROR`,e.UNSUPPORTED=`UNSUPPORTED`,e.OLD_VERSION=`OLD_VERSION`,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}(v||{}),y=class e extends Error{constructor(t,n){super(),g(this,`message`,void 0),g(this,`hangup`,void 0),g(this,`error`,void 0),g(this,`code`,void 0),g(this,`remote`,void 0),g(this,`custom_error`,void 0),this.name=`HangupReason`,this.code=n&&n.code||0,this.remote=n&&n.remote||!1,this.custom_error=n?.custom_error??null,Object.values(v).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)}},b=class e extends m{static setConversationIdProvider(t){e._conversationIdProvider=t}static create(t,n){e._instance||(e._instance=new e(t,n))}static log(t,n,r=!1){e._instance&&e._instance.log(t,n,r)}static logClientStats(t,n=!1){e._instance&&e._instance.logClientStats(t,n)}static logClientEvent(t,n=!1){e._instance&&e._instance.logClientEvent(t,n)}static destroy(){e._instance&&e._instance.destroy(),e._instance=null}constructor(e,t){super(),g(this,`_externalLogger`,void 0),g(this,`_api`,void 0),g(this,`_batchInterval`,3e3),g(this,`_batchedClientStats`,[]),g(this,`_batchedClientEvents`,[]),g(this,`_batchTimeout`,null),g(this,`_serverTimeDelta`,0),this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}log(e,t,n=!1){this._externalLogger&&this._externalLogger.log(e,t,n)}logClientStats(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(n).forEach(e=>{n[e]===void 0&&delete n[e]}),this._batchedClientStats.push(n),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(n),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}_getConversationId(){if(e._conversationIdProvider)try{return e._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}};g(b,`_instance`,void 0),g(b,`_conversationIdProvider`,null);var x=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}(x||{}),re=25*1024*1024,ie=10,ae=`_okcls_logs_session_`,oe=3e4,se=`ok-calls-sdk-debug-logs`,ce=1,S=`sessions`,le=`chunks`;function ue(){return`${Date.now()}_${Math.random().toString(36).slice(2)}`}function de(e){rt.has(e)||rt.set(e,[]),it.has(e)||it.set(e,0),at.has(e)||at.set(e,null)}function fe(e){return at.get(e)??null}function pe(e){let t=it.get(e)??0;return it.set(e,t+1),t}function me(e,t){return`${e}:${String(t).padStart(12,`0`)}`}function he(e){return new Blob([e]).size}function ge(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}function _e(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}function ve(){return typeof window<`u`&&!!window.indexedDB}function ye(){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)}}function be(){return ve()?tt||(tt=new Promise(e=>{let t=window.indexedDB.open(se,ce);t.onupgradeneeded=()=>{let e=t.result;if(!e.objectStoreNames.contains(S)){let t=e.createObjectStore(S,{keyPath:`sessionId`});t.createIndex(`conversationId`,`conversationId`,{unique:!1}),t.createIndex(`updatedAt`,`updatedAt`,{unique:!1})}e.objectStoreNames.contains(le)||e.createObjectStore(le,{keyPath:`id`}).createIndex(`sessionId`,`sessionId`,{unique:!1})},t.onsuccess=()=>{et=t.result,et.onversionchange=()=>{et?.close(),et=null,tt=null},e(et)},t.onerror=()=>{console.warn(`Failed to open debug log storage`,t.error),nt=!1,tt=null,e(null)},t.onblocked=()=>{console.warn(`Debug log storage opening is blocked`)}}),tt):(nt=!1,Promise.resolve(null))}function xe(e){return e.conversationId||e.sessionId}function Se(e){let t=new Map;for(let n of e){let e=xe(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 function Ce(e){let t=e.transaction(S,`readonly`),n=await ge(t.objectStore(S).getAll());return await _e(t),n}async function we(e,t){let n=e.transaction(S,`readonly`),r=await ge(n.objectStore(S).index(`conversationId`).getAll(t));return await _e(n),r.sort((e,t)=>e.startTime-t.startTime)}async function Te(e,t){let n=e.transaction(S,`readonly`),r=await ge(n.objectStore(S).get(t));return await _e(n),r?[r]:[]}async function Ee(e,t){return t.sessionId?Te(e,t.sessionId):t.conversationId?we(e,t.conversationId):[]}async function De(e,t){let n=e.transaction(le,`readonly`),r=await ge(n.objectStore(le).index(`sessionId`).getAll(t));return await _e(n),r.sort((e,t)=>e.sequence-t.sequence)}async function Oe(e,t){let n=await De(e,t),r=e.transaction([S,le],`readwrite`),i=r.objectStore(le),a=0;for(let e of n)a+=e.bytes,i.delete(e.id);return r.objectStore(S).delete(t),await _e(r),a}async function ke(e,t){let n=await De(e,t.sessionId);if(!n.length){await Oe(e,t.sessionId);return}let r=n.reduce((e,t)=>e+t.bytes,0),i=n.reduce((e,t)=>e+t.items.length,0),a=n[0].startTime,o=n[n.length-1].endTime,s=e.transaction(S,`readwrite`);s.objectStore(S).put({...t,startTime:a,endTime:o,updatedAt:o,bytes:r,entriesCount:i}),await _e(s)}async function Ae(e,t,n){let r=[];for(let n of t.sessions){let t=await De(e,n.sessionId);r.push(...t.map(e=>({...e,session:n})))}r.sort((e,t)=>e.startTime===t.startTime?e.sequence-t.sequence:e.startTime-t.startTime);let i=r.slice(0,Math.max(r.length-1,0)),a=0,o=new Map,s=e.transaction(le,`readwrite`),c=s.objectStore(le);for(let e of i)if(c.delete(e.id),a+=e.bytes,o.set(e.sessionId,e.session),a>=n)break;await _e(s);for(let t of o.values())await ke(e,t);return a}async function je(e){let t=await Ce(e),n=Se(t),r=n.reduce((e,t)=>e+t.bytes,0);for(;n.length>ie||n.length>1&&r>re;){let t=n.shift();if(!t)return;for(let n of t.sessions)r-=await Oe(e,n.sessionId)}n.length===1&&r>re&&await Ae(e,n[0],r-re),t=await Ce(e),n=Se(t),(n.length>ie||n.reduce((e,t)=>e+t.bytes,0)>re)&&await je(e)}async function Me(e,t,n,r){let i=await be();if(!i||!r.length)return;let a=fe(e)||t,o=r,s=JSON.stringify(o),c=he(s);for(;c>re&&o.length>1;)o=o.slice(Math.floor(o.length/2)),s=JSON.stringify(o),c=he(s);if(c>re)return;let l=o[0].t,u=o[o.length-1].t,d=i.transaction([S,le],`readwrite`),f=d.objectStore(S),p=await ge(f.get(e))||{sessionId:e,conversationId:a,startTime:l,endTime:u,updatedAt:u,bytes:0,entriesCount:0},m={...p,conversationId:a||p.conversationId,startTime:Math.min(p.startTime,l),endTime:Math.max(p.endTime,u),updatedAt:Math.max(p.updatedAt,u),bytes:p.bytes+c,entriesCount:p.entriesCount+o.length},h={id:me(e,n),sessionId:e,sequence:n,startTime:l,endTime:u,bytes:c,items:o};f.put(m),d.objectStore(le).put(h),await _e(d),await je(i)}function Ne(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 Pe(e){let t=rt.get(e);if(!t?.length)return ct;let n=t.splice(0),r=fe(e),i=pe(e);return ct=ct.then(()=>Me(e,r,i,n)).catch(e=>{console.warn(`Failed to write debug log to storage`,e)}),ct}function Fe(e){if(e)return Pe(e);for(let e of rt.keys())Pe(e);return ct}async function Ie(e,t){if(!t||!e)return;let n=await be();if(!n)return;let r=n.transaction(S,`readwrite`),i=r.objectStore(S),a=await ge(i.get(e));a&&i.put({...a,conversationId:t,updatedAt:Math.max(a.updatedAt,Date.now())}),await _e(r)}async function Le(e){let t=await be(),n=[];if(!t)return n;for(let r of e.sort((e,t)=>e.startTime-t.startTime)){let e=await De(t,r.sessionId);for(let t of e)n.push(...t.items)}return n}function Re(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 ze(){Fe()}function Be(){document.visibilityState===`hidden`&&Fe()}function Ve(e,t,n=ot){$e||He(),n||(n=Ue()),de(n);let r=new Date,i={t:r.getTime(),l:e,d:Ne(t),h:r.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`})};return rt.get(n)?.push(i),st||(st=window.setTimeout(()=>{st=null,Fe()},oe)),i}function He(){$e||($e=!0,ye(),Ue(),be(),window.addEventListener(`pagehide`,ze),document.addEventListener(`visibilitychange`,Be))}function Ue(e=!1){return $e?(Fe(),!e&&ot&&fe(ot)===null?(de(ot),ot):(ot=ue(),de(ot),ot)):(He(),ot)}function We(e,t=ot){t&&(de(t),at.set(t,e),Ie(t,e))}async function Ge(){await Fe();let e=await be();return e?(await Ce(e)).sort((e,t)=>t.updatedAt-e.updatedAt):[]}async function Ke(e){await Fe();let t=await be();return t?Le(await Ee(t,e)):[]}async function qe(e){return JSON.stringify(await Ke(e))}async function Je(e){let t=await qe(e),n=`logs_${e.sessionId||e.conversationId}_${Date.now()}.json`;return Re(t,n),n}async function Ye(e){await Fe();let t=await be();if(!t)return;let n=e?await Ee(t,e):await Ce(t);for(let e of n)await Oe(t,e.sessionId)}async function Xe(){await Fe();let e=await be(),t=e?await Ce(e):[],n=Se(t),r=navigator.storage?.estimate?await navigator.storage.estimate().catch(()=>null):null;return{supported:nt,callsCount:n.length,sessionsCount:t.length,usedBytes:t.reduce((e,t)=>e+t.bytes,0),maxBytes:re,maxCalls:ie,quotaBytes:r?.quota,usageBytes:r?.usage}}async function Ze(){await Fe();let e=await be();return e?JSON.stringify(await Le(await Ce(e))):`[]`}async function Qe(){let e=await Ze(),t=`logs_${Date.now()}.json`;return Re(e,t),t}var $e=!1,et=null,tt=null,nt=ve(),rt=new Map,it=new Map,at=new Map,ot=``,st=null,ct=Promise.resolve();window.__VKCallsSDKLogs__=(e=!1)=>($e||He(),e?Ze():Qe());var C=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 isEmpty(){return!e._sessionKey}};g(C,`_sessionKey`,void 0),g(C,`_sessionSecretKey`,void 0),g(C,`_accessToken`,void 0);var w=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}(w||{}),T=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}(T||{}),E=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}(E||{}),lt=e=>e.stop(),ut=e=>e.getTracks().forEach(lt),dt=e=>e.getVideoTracks().forEach(lt);async function ft(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){B.warn(`setVideoConstraints failed`,e)}}var pt=class{constructor(){g(this,`_cameraPermissionStatus`,void 0),g(this,`_microphonePermissionStatus`,void 0),g(this,`_listener`,void 0)}static isSupported(){return k.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){B.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){let t=null;switch(e){case`camera`:t=this._cameraPermissionStatus.state;break;case`microphone`:t=this._microphonePermissionStatus.state;break}return t}},mt=`_okcls_`,ht=(()=>{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 gt(e){let t=ht?ht.getItem(mt+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function _t(e,t){try{ht&&ht.setItem(mt+e,JSON.stringify(t))}catch{}}function vt(e){ht&&ht.removeItem(mt+e)}var yt;(function(e){function t(e){return gt(e)||null}e.get=t;function n(e,t){_t(e,t)}e.set=n;function r(e){vt(e)}e.remove=r})(yt||(yt={}));var bt=yt,xt=null,St=null,Ct=null,wt=[],Tt=[],Et=[],Dt=null,Ot=null,kt=null,At=!1,jt=!1,Mt,Nt,Pt,Ft=null,It=null,Lt=``,Rt=null,zt=[],Bt=null,Vt=navigator.appVersion,Ht=navigator.appName,D=navigator.userAgent,Ut={},Wt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Wt).includes(e)}e.contains=t})(Wt||(Wt={}));var Gt=class{constructor(e,t=!1,n=P.videoMaxWidth,r=P.videoMaxHeight,i=P.videoFrameRate){g(this,`audio`,void 0),g(this,`video`,void 0),g(this,`needVideo`,void 0),g(this,`lastSimplifyWasReached`,void 0),g(this,`supportedConstraints`,void 0),g(this,`isVideoRequested`,()=>this.needVideo),this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let a=!1;if(e){a={noiseSuppression:P.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let t=O.getMicrophones(),n,r;if(Ot&&(r=Ot.groupId,n=Ot.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!Ot&&O.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:P.videoMinWidth,max:n,ideal:n},height:{min:P.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:P.videoAspectRatio},frameRate:{ideal:i}};let e=O.getCameras(),a,s;if(Dt&&(s=Dt.groupId,a=Dt.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!Dt&&O.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}),P.videoFacingMode&&(o.facingMode={ideal:P.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}},Kt=class extends Gt{constructor(e,t,n,r){if(super(!1,!0),g(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):this.video={},this.video.cursor=`motion`,this.video.width=e,this.video.height=t,this.video.frameRate=n,this.video.displaySurface=P.displaySurface,O.browserName()===`Safari`){let n=Number(O.browserVersion());n===16?(this.video.width={max:e},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:P.audioShareSystemInclude?`include`:`exclude`,windowAudio:P.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},qt=class e{constructor(){g(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(){if(e._lockId)throw b.log(E.ERROR,`change_device`),B.warn(`Device change failed: MediaSource is busy`),Error(`MediaSource is busy`);e._lockId=this._lockId}free(){e._lockId===this._lockId&&(e._lockId=0)}};g(qt,`_lockId`,0);async function Jt(){jt=!1,At=!1,xt=null;let e={camera:O.getSavedCamera(),microphone:O.getSavedMicrophone(),output:O.getSavedOutput()};await Xt(),Yt(`devicechange`,e),z.onDeviceChange()}function Yt(e,...t){if(Ut[e])for(let n of Ut[e])n(...t)}async function Xt(){return xt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!St&&navigator.mediaDevices.addEventListener&&(St=N.debounce(Jt,P.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,St)),!Ct&&pt.isSupported()&&(Ct=new pt,await Ct.init((e,t)=>{switch(t){case`denied`:case`prompt`:St?.();break}})),xt=navigator.mediaDevices.enumerateDevices().then(e=>{wt=e.filter(e=>e.kind===`videoinput`?(e.label&&(At=!0),!0):!1),Tt=e.filter(e=>e.kind===`audioinput`?(e.label?jt=!0:O.isMobile()&&O.browserName()===`Firefox`&&(jt=At),!0):!1),Et=e.filter(e=>e.kind===`audiooutput`);let t=Dt?.deviceId??bt.get(`videoinput`),n=Ot?.deviceId??bt.get(`audioinput`),r=kt?.deviceId??bt.get(`audiooutput`);return Dt=wt.find(e=>e.deviceId===t)||null,Ot=Tt.find(e=>e.deviceId===n)||null,kt=Et.find(e=>e.deviceId===r)||Et[0]||null,xt=Promise.resolve(e),e}).catch(()=>(xt=null,[]))))}async function Zt(){if(`userAgentData`in navigator)try{let{platformVersion:e}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!e){B.warn(`Can't to get OS version`);return}let t=parseInt(e.split(`.`)[0]);Rt=isNaN(t)?null:t}catch(e){B.warn(`Failed to get OS version`,e)}}function Qt(e){if(Dt&&Ot)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=>{!Ot&&e.kind===j.audio?Ot=t(O.getMicrophones(),e):!Dt&&e.kind===j.video&&(Dt=t(O.getCameras(),e))})}async function $t(e,t){B.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative()))),O.releaseFirefoxMicrophonePermissionWarmup();let n=(!e.isVideo()||O.hasCameraPermission())&&(!e.isAudio()||O.hasMicrophonePermission());!n&&!t&&z.onPermissionsRequested();let r=new qt;try{r.busy();let t=await navigator.mediaDevices.getUserMedia(e.getNative());return r.free(),n||await Jt(),Qt(t),t}catch(n){switch(r.free(),B.error(`getUserMedia error`,n),n.name){case`PermissionDeniedError`:case`PermissionDismissedError`:case`NotAllowedError`:case`SecurityError`:case`DOMException`:case`NotFoundError`:t=e.isVideoRequested()?w.CAMERA_PERMISSION:w.MIC_PERMISSION;break;case`OverconstrainedError`:t=w.OVERCONSTRAINED;break;case`TypeError`:t=w.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?w.CAMERA_ACCESS:w.MIC_ACCESS;break;case`Error`:if(n.message===`MediaSource is busy`){t=e.isVideoRequested()?w.CAMERA_ACCESS:w.MIC_ACCESS;break}}if(e.canSimplify())return $t(e.simplify(),t);let i=t||w.UNKNOWN;throw z.onPermissionsError(i,n),i}}async function en(){if(!(Ft||O.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{O.hasMicrophonePermission()||z.onPermissionsRequested(),Ft=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(e){B.warn(`Firefox microphone permission warmup failed`,e)}}async function tn(e){B.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let t=new qt;try{t.busy();let n=await navigator.mediaDevices.getDisplayMedia(e.getNative()),r=n?.getVideoTracks()[0];if(r){let t=r.getSettings()?.displaySurface;if(B.debug(`Got display media track: ${r.id} (${t})`),r.contentHint=`text`,e.captureController&&(t===`browser`||t===`window`))try{e.captureController.setFocusBehavior(`no-focus-change`)}catch(e){B.warn(`Failed to set focus behavior`,e)}}return n}catch(e){switch(e.name){case`PermissionDeniedError`:case`NotAllowedError`:case`SecurityError`:throw w.SCREEN_PERMISSION;default:throw w.SCREEN_ACCESS}}finally{t.free()}}function nn(){return zt.length||(zt=(()=>{let e,t=!1,n=0,r=`0`,i=D.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return e=/\brv[ :]+(\d+)/g.exec(D),[`IE`,e&&e[1]||`Unknown`,t,n,r];if(i[1]===`Safari`){if(e=D.match(/\bEdge\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(e=D.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=D.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=D.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=D.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=D.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=D.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=D.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=D.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=D.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:Ht,e&&e[1]||i[2]||Vt,t,n,r]})()),zt}var O;(function(e){async function t(){await Xt(),await Zt()}e.init=t;function n(){return wt}e.getCameras=n;function r(){return Tt}e.getMicrophones=r;function i(){return Et}e.getOutput=i;function a(){return wt.length>0}e.hasCamera=a;function o(){return Tt.length>0}e.hasMicrophone=o;function s(){return Dt}e.getSavedCamera=s;function c(){return Ot}e.getSavedMicrophone=c;function l(){return kt}e.getSavedOutput=l;function u(){return P.videoFacingMode}e.getVideoFacingMode=u;function d(){return At}e.hasCameraPermission=d;function f(){return jt}e.hasMicrophonePermission=f;function p(){return Ct?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=p;function m(e=!1){return f()?a()&&e?d():!0:!1}e.hasPermissions=m;function h(){Ft&&(ut(Ft),Ft=null)}e.releaseFirefoxMicrophonePermissionWarmup=h;async function ee(e=!1,t=!0,n=!0){!e&&!t?await en():O.releaseFirefoxMicrophonePermissionWarmup();let r=o()&&t,i=a()&&e,s;if(!r&&!i)s=new MediaStream;else try{s=await $t(new Gt(r,i))}catch{s=new MediaStream}return!s.getVideoTracks().length&&n&&s.addTrack(O.getBlackMediaTrack()),!s.getAudioTracks().length&&n&&s.addTrack(O.getSilentMediaTrack()),s}e.getUserMedia=ee;async function te(e,t){return tn(new Kt(e&&!P.consumerFastScreenShare?P.fastScreenShareWidth:window.screen.width,e&&!P.consumerFastScreenShare?P.fastScreenShareHeight:window.screen.height,P.getScreenFrameRate(e),t))}e.getScreenMedia=te;async function g(e=!1,t){return $t(new Gt(!1,!0,e?P.videoEffectMaxWidth:P.videoMaxWidth,e?P.videoEffectMaxHeight:P.videoMaxHeight,t))}e._getUserVideo=g;async function _(e,t){let n=t?.width||P.videoMaxWidth,r=t?.height||P.videoMaxHeight;return $t(new Gt(!1,e||!0,n,r))}e.getUserVideo=_;async function ne(e){return $t(new Gt(e||!0,!1))}e.getUserAudio=ne;async function v(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return ft(n,t)}e.setResolution=v;async function y(e,t){let n=(await Xt()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?Dt=n:e===`audioinput`?Ot=n:e===`audiooutput`&&(kt=n),bt.set(e,t),n):null}e._saveDeviceId=y;function b(){if(!Pt||Pt.readyState===`ended`){let e=O.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),Pt=t.stream.getAudioTracks()[0]}return Object.assign(Pt.clone(),{enabled:!1})}e.getSilentMediaTrack=b;function x(e=P.videoMinWidth,t=P.videoMinHeight){Nt||(Nt=document.createElement(`canvas`)),Nt.width=e,Nt.height=t;let n=Nt.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!Mt||Mt.readyState===`ended`)&&(Mt=Nt.captureStream(P.videoFrameRate).getVideoTracks()[0]),Object.assign(Mt.clone(),{enabled:!1})}e.getBlackMediaTrack=x;function re(){if(pe()===`Edge`&&Number(me())<70)return!1;try{let e=window;return`mediaDevices`in e.navigator&&`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 navigator&&!0||!1}catch{return!1}}e.isBrowserSupported=re;function ie(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=ie;function ae(){let e=O.browserName()===`Safari`&&O.browserVersion()===`15`&&O.browserSubVersion()===`1`,t=O.browserName()===`Opera`,n=O.browserName()===`Yandex`;return e||t||n}e.isBrokenH264Decoder=ae;function oe(){return O.browserName()===`Yandex`&&O.os()===`Windows`||P.simulcast}e.isBrokenVP9Encoder=oe;function se(){let e=O.browserName()===`Safari`&&Number(O.browserVersion())===17&&[4,5,6].includes(Number(O.browserSubVersion())),t=O.os()===`Windows`&&O.osVersion()===10;return e||t}e.isBrokenVP9Decoder=se;function ce(){return O.browserName()===`Firefox`&&Number(O.browserVersion())<60}e.isOldDataChannelDescription=ce;function S(){return!(O.baseChromeVersion()&&O.isMobile())}e.canPreferH264=S;function le(){return!(O.browserName()===`Firefox`||O.browserName()===`Safari`)}e.isSimulcastSupportedByBrowser=le;function ue(){return Lt||(Lt=(()=>{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(D))return t;return`Unknown`})()),Lt}e.os=ue;function de(){return Rt}e.osVersion=de;function fe(){return It===null&&(It=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Vt)),It}e.isMobile=fe;function pe(){return nn()[0]}e.browserName=pe;function me(){return nn()[1]}e.browserVersion=me;function he(){return nn()[3]}e.baseChromeVersion=he;function ge(){return Bt||(Bt=new(window.AudioContext||window.webkitAudioContext)),Bt.resume().catch(()=>{B.warn(`Failed to resume AudioContext`)}),Bt}e.getAudioContext=ge;function _e(){return nn()[4]}e.browserSubVersion=_e;function ve(){return O.baseChromeVersion()>=105&&!O.isMobile()}e.isAudioShareSupported=ve;function ye(e,t){Ut[e]||(Ut[e]=[]),Ut[e].push(t)}e.addEventListener=ye;function be(e,t){if(Ut[e])if(!t)delete Ut[e];else{let n=Ut[e].indexOf(t);n>-1&&Ut[e].splice(n,1)}}e.removeEventListener=be})(O||(O={}));var k=O;function rn(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 A(e){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},e||{})}var an=function(e){return e.FpsLimit=`fps-limit`,e}({}),on=class extends _{constructor(...e){super(...e),g(this,`FPS_LIMITS`,[13,20,Math.max(P.videoFrameRate,25)]),g(this,`THRESHOLD`,.8),g(this,`HISTORY_LENGTH`,10),g(this,`_fpsMeterUnsubscribe`,null),g(this,`_fpsHistory`,{cursor:0,arr:[]}),g(this,`_fpsLimitCursor`,this.FPS_LIMITS.length-1)}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){B.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()}},sn=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}({}),j=function(e){return e.audio=`audio`,e.video=`video`,e.screen=`screen`,e.audioshare=`audioshare`,e}({}),cn=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),ln=class extends _{constructor(){super(),g(this,`_stream`,null),g(this,`_screenTrack`,null),g(this,`_audioShareTrack`,null),g(this,`_screenShareTrack`,null),g(this,`_sendVideoTrack`,null),g(this,`_cameraVideoTrack`,null),g(this,`_micAudioTrack`,null),g(this,`_audioEffectsTrack`,null),g(this,`_mediaSettings`,A()),g(this,`_videoStatusOnScreenCapturingEnabled`,!1),g(this,`_effect`,null),g(this,`_audioEffectParams`,null),g(this,`_onDeviceChange`,void 0),g(this,`_animojiEnabled`,!1),g(this,`_videoEffectsFpsLimiter`,void 0),g(this,`videoTrackMuteHandler`,()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)}),this._initDeviceChangeListener(),P.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),P.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new on,this._videoEffectsFpsLimiter.addEventListener(an.FpsLimit,this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener(`mute`,this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&this._cameraVideoTrack.addEventListener(`mute`,this.videoTrackMuteHandler),P.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[T.AUDIO],t=!0){if(this._stream)return;let n=e.includes(T.VIDEO),r=e.includes(T.AUDIO),i=e.includes(T.ANIMOJI);if(!k.isBrowserSupported())throw new y(w.UNSUPPORTED);try{this._stream=await k.getUserMedia(n,r,t),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=n&&this._stream.getVideoTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=r&&this._stream.getAudioTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=i&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=i,this._triggerEvent(`SOURCE_READY`)}catch(e){throw new y(e)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(e=>!e.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,n){let r=this.getStream(),i=this.getSendAudioTrack(),a=this.getSendVideoTrack(n);if(!r||!i&&!a&&!t)throw Error(`No local stream found`);i&&!t&&e.addTrack(i,r),a&&!t&&e.addTrack(a,r)}getMediaSettings(){return this._mediaSettings}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(w.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&dt(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_initDeviceChangeListener(){!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices||!navigator.mediaDevices.addEventListener||(this._onDeviceChange=async e=>{if(!this._stream)return;let t=k.getSavedMicrophone(),n=k.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{}},k.addEventListener(`devicechange`,this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&k.removeEventListener(`devicechange`,this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?`stream`:`video`,n=e||await k._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=n.getVideoTracks()[0],!this._stream)ut(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);b.log(E.DEVICE_CHANGED,t),B.log(`Video stream changed`),await this._replaceLocalTrack(e),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}}catch(e){throw b.log(E.ERROR,`change_video`),B.warn(`Camera change failed`,e),e}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await k.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)ut(t);else{let e=await this._applyAudioEffect();b.log(E.DEVICE_CHANGED,`audio`),B.log(`Audio stream changed`,e),await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})}}catch(e){throw b.log(E.ERROR,`change_audio`),B.error(`Microphone change failed`,e),e}}async _changeScreen(e,t,n){try{if(n=n||await k.getScreenMedia(e,t),!this._stream)ut(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),b.log(E.DEVICE_CHANGED,`screen`),B.log(`Screen capturing started`),this._screenTrack=r,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,P.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._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&B.debug(`Audio share requested but not captured`),this._triggerEvent(`SCREEN_STATUS`,{track:r}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`})}}catch(e){throw b.log(E.ERROR,`screen`),B.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){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!P.audioEffects||!this._audioEffectParams)return P.audioEffects?.pause(),this._micAudioTrack;P.audioEffects.isInitialized||await P.audioEffects.init(),P.audioEffects.resume(),P.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),P.audioEffects.setSource(this._micAudioTrack);let e=P.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=k.getSilentMediaTrack();return e.contentHint=`music`,e.stop(),e}getBlackScreenShareTrack(){let e=k.getBlackMediaTrack();return e.contentHint=`motion`,e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let n=this._stream.getTracks().find(t=>t.kind===e.kind&&t.contentHint===e.contentHint);n?.id!==e.id&&(n?(n!==this._audioEffectsTrack&&n.stop(),this._stream?.removeTrack(n),this._stream?.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)):(this._stream.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(P.videoEffects),!P.videoEffects)return t;try{return P.videoEffects.setEffect(e,t)}catch(e){return B.warn(`Video effect failed`,e),t}}_stopEffect(){if(P.videoEffects)try{P.videoEffects.stopEffect()}catch(e){B.warn(`Video effect failed`,e)}}destroy(){this._destroyDeviceChangeListener(),k.releaseFirefoxMicrophonePermissionWarmup(),P.videoEffects&&(this._effect=null,P.videoEffects.destroy()),P.audioEffects&&P.audioEffects.destroy(),this._stream&&(ut(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),k.getAudioContext()?.suspend().catch(e=>B.error(e)),this._videoEffectsFpsLimiter?.destroy()}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 k._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=e.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=k.getBlackMediaTrack(P.videoMinWidth,P.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 k.getUserAudio();this._micAudioTrack=e.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(e){throw P.audioEffects?.pause(),t(k.getSilentMediaTrack(),!1),typeof e==`string`?Error(e):e}else P.audioEffects?.pause(),t(k.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:P.noiseSuppression})}async videoEffect(e){if(!P.videoEffects)throw Error(`Video Effects library is not set`);if(b.log(E.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(!P.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||!N.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<P.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(e=>{B.warn(`MediaSource handleVideoEffectsLowFps error`,e)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??P.videoFrameRate;return this._effect?Math.min(e,P.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await ft(e,{width:this._effect?P.videoEffectMaxWidth:P.videoMaxWidth,height:this._effect?P.videoEffectMaxHeight:P.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}},M=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e}(M||{}),un={HEIGHT:720,WIDTH:1280,BITRATE:1e6},dn=`L1T2`,fn=[{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}],pn={h:1,m:2,l:4};function mn(e,t){return!e||!t?e===t:e.streams.length===t.streams.length?e.streams.every((e,n)=>N.isObjectsEquals(e,t.streams[n])):!1}function hn(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return length>0?t[length-1].bitrate:fn[0].bitrate}function gn(e=un.WIDTH,t=un.HEIGHT,n=fn){let r=[`h`,`m`,`l`],i=Math.max(e,t),a=1;i>=960?a=3:i>=480&&(a=2);let o={streams:[]},s=hn(i,n)??un.BITRATE;for(let i=0;i<a;i++){let a=r[i];o.streams.push({rid:a,width:e,height:t,fps:30,bitrate:s}),e=Math.round(e/2),t=Math.round(t/2),s=hn(Math.max(e,t),n)??Math.round(s/2)}return o}function _n(e){return e?pn[e]??1:1}var vn=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 yn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var bn=533,xn=`a=fmtp:`,Sn=`sps-pps-idr-in-keyframe=1`,Cn;(function(e){let t=/[\r\n]+/;function n(e,t){let n=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),r,i=[];for(r=0;r<e.length;++r){let a=e[r].match(n);a&&a.length===3&&a[2]===t&&i.push(a[1])}return i}function r(e,t,n){let r=e.split(` `),i=r.slice(0,3),a;for(a=3;a<r.length;a++)n.includes(r[a])&&i.push(r[a]);for(a=3;a<r.length;a++)!n.includes(r[a])&&!t.includes(r[a])&&i.push(r[a]);return i.join(` `)}function i(e,t,n,i){let a,o=`m=`+t;for(a=0;a<e.length;++a)e[a].startsWith(o)&&(e[a]=r(e[a],n,i))}function a(e,t){let n=RegExp(`a=fmtp:(\\d+)`);for(let r=0;r<e.length;++r){let i=e[r].match(n);if(i&&i.length===2&&t.includes(i[1])){let t=e[r].trim()===xn+i[1]?` `:`;`;e[r]+=t+Sn}}}function o(e,t,r=`video`){let a=n(e,t);if(!a.length)return;let o=a.slice(0),s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`),c;for(c=0;c<e.length;++c){let t=e[c].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}let l=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`);for(c=e.length;c--;){let t=e[c].match(l);t&&t.length===3&&o.includes(t[2])&&e.splice(c,1)}i(e,r,o,[])}function s(e,t,n,r){let i=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),a,o=[];for(a=t;a<n;++a){let t=e[a].match(i);t&&t.length===3&&t[2]===r&&o.push(t[1])}if(!o.length)return o;let s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`);for(a=t;a<n;++a){let t=e[a].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}return o}function c(e,t,n,i){let a=s(e,t,n,i);if(!a.length)return n+1;let o=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`),c=0,l=n;for(;l>=t;){let t=e[l].match(o);t&&t.length===3&&a.includes(t[2])&&(e.splice(l,1),c++),l--}return e[t]=r(e[t],a,[]),n-c+1}function l(e,t,n,r){let i=-1,a=-1,o=!1;for(let s=0;s<e.length;++s)if(i>=0&&e[s].startsWith(`m=`)&&(a=s-1,o&&(s=c(e,i,a,t)),i=-1,a=-1,o=!1),e[s].startsWith(`m=video`)&&(i=s),i>=0){let t=n===`remote`&&r===`encoder`||n===`local`&&r===`decoder`?`recvonly`:`sendonly`;(e[s].startsWith(`a=${t}`)||e[s].startsWith(`a=sendrecv`))&&(o=!0)}a=e.length-1,i>=0&&o&&c(e,i,a,t)}function u(e,t){let r=n(e,`H264`);t&&i(e,`video`,[],r),a(e,r)}function d(e){i(e,`video`,[],n(e,`VP9`))}function f(e){[`G722`,`PCMU`,`PCMA`,`CN`,`telephone-event`].forEach(t=>{o(e,t,`audio`)})}function p(e,r,a,o,s=!1){let c=e.split(t);if(f(c),!r&&!a&&!o&&!s)return c.join(`\r
|
|
7
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("webrtc-adapter");c=s(c);let l=require("messagepack"),u=require("@vkontakte/libvpx");u=s(u);let d=require("bit-buffer"),f=require("simple-ebml-builder");f=s(f);let p=require("fflate");p=s(p);var m=class{log(e,t,n=!1){}destroy(){}};function ee(e){"@babel/helpers - typeof";return ee=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},ee(e)}function te(e,t){if(ee(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(ee(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function ne(e){var t=te(e,`string`);return ee(t)==`symbol`?t:t+``}function h(e,t,n){return(t=ne(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var g=25*1024*1024,re=10,ie=`_okcls_logs_session_`,ae=3e4,oe=`ok-calls-sdk-debug-logs`,se=1,_=`sessions`,ce=`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(ie)===0&&e.removeItem(t)}catch(e){console.error(`Storage is blocked`,e)}}var v=new class{constructor(){h(this,`_db`,null),h(this,`_dbPromise`,null),h(this,`_supported`,this.isSupported())}get supported(){return this._supported}open(){return this.isSupported()?(this._dbPromise||(this._dbPromise=new Promise(e=>{let t=window.indexedDB.open(oe,se);t.onupgradeneeded=()=>{this.createSchema(t.result)},t.onsuccess=()=>{this._db=t.result,this._supported=!0,this._db.onversionchange=()=>{this.close()},e(this._db)},t.onerror=()=>{console.warn(`Failed to open debug log storage`,t.error),this._supported=!1,this._dbPromise=null,e(null)},t.onblocked=()=>{console.warn(`Debug log storage opening is blocked`)}})),this._dbPromise):(this._supported=!1,Promise.resolve(null))}close(){this._db&&(this._db.close(),this._db=null),this._dbPromise=null}async deleteDatabaseForTests(){this.close(),this._supported=this.isSupported(),this._supported&&await new Promise(e=>{let t=window.indexedDB.deleteDatabase(oe);t.onsuccess=()=>e(),t.onerror=()=>e(),t.onblocked=()=>e()})}async getAllSessions(){let e=await this.open();if(!e)return[];let t=e.transaction(_,`readonly`),n=await this.requestToPromise(t.objectStore(_).getAll());return await this.txDone(t),n}async getSessionsByConversationId(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).index(`conversationId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.startTime-t.startTime)}async getSessionBySessionId(e){let t=await this.open();if(!t)return[];let n=t.transaction(_,`readonly`),r=await this.requestToPromise(n.objectStore(_).get(e));return await this.txDone(n),r?[r]:[]}async getChunksBySession(e){let t=await this.open();if(!t)return[];let n=t.transaction(ce,`readonly`),r=await this.requestToPromise(n.objectStore(ce).index(`sessionId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.sequence-t.sequence)}async putSession(e){let t=await this.open();if(!t)return!1;let n=t.transaction(_,`readwrite`);return n.objectStore(_).put(e),await this.txDone(n),!0}async putSessionAndChunk(e,t){let n=await this.open();if(!n)return!1;let r=n.transaction([_,ce],`readwrite`);return r.objectStore(_).put(e),r.objectStore(ce).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([_,ce],`readwrite`),i=r.objectStore(ce),a=0;for(let e of n)a+=e.bytes,i.delete(e.id);return r.objectStore(_).delete(e),await this.txDone(r),a}async deleteChunks(e){let t=await this.open();if(!t||!e.length)return;let n=t.transaction(ce,`readwrite`),r=n.objectStore(ce);for(let t of e)r.delete(t.id);await this.txDone(n)}async estimateStorage(){return navigator.storage?.estimate?navigator.storage.estimate().catch(()=>null):null}async getStorageSummary(){let e=await this.getAllSessions();return{sessions:e,callsCount:this.groupSessions(this.getCallSessions(e)).length,usedBytes:e.reduce((e,t)=>e+t.bytes,0)}}async enforceRetentionPolicy(){let e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),r=e.reduce((e,t)=>e+t.bytes,0);for(;r>g&&n.length;){let e=n.shift();if(!e)break;r-=await this.deleteSession(e.sessionId)}for(;t.length>re||t.length>1&&r>g;){let e=t.shift();if(!e)return;for(let t of e.sessions)r-=await this.deleteSession(t.sessionId)}t.length===1&&r>g&&await this.trimOldestChunks(t[0],r-g),e=await this.getAllSessions(),t=this.groupSessions(this.getCallSessions(e)),n=this.getGlobalSessions(e),(t.length>re||e.reduce((e,t)=>e+t.bytes,0)>g)&&await this.enforceRetentionPolicy()}createSchema(e){if(!e.objectStoreNames.contains(_)){let t=e.createObjectStore(_,{keyPath:`sessionId`});t.createIndex(`conversationId`,`conversationId`,{unique:!1}),t.createIndex(`updatedAt`,`updatedAt`,{unique:!1})}e.objectStoreNames.contains(ce)||e.createObjectStore(ce,{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>g&&a.length>1;)a=a.slice(Math.floor(a.length/2)),o=JSON.stringify(a),s=_e(o);if(s>g)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()},ae)),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:g,maxCalls:re,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 isEmpty(){return!e._sessionKey}};h(y,`_sessionKey`,void 0),h(y,`_sessionSecretKey`,void 0),h(y,`_accessToken`,void 0);var b=class{constructor(){h(this,`_handlers`,{}),h(this,`_listeners`,[])}_triggerEvent(e,...t){if(Object.hasOwn(this._handlers,e))for(let n of this._handlers[e])n.apply(this,t)}addEventListener(e,t){if(typeof t!=`function`)throw Error(`Listener should be a function`);return Object.hasOwn(this._handlers,e)||(this._handlers[e]=[]),this._handlers[e].push(t),{dispose:this.removeEventListener.bind(this,e,t)}}removeEventListener(e,t){if(!Object.hasOwn(this._handlers,e))return;t||delete this._handlers[e];let n=this._handlers[e].indexOf(t);n>=0&&this._handlers[e].splice(n,1)}subscribe(e,t,n){let r=e.addEventListener(t,n);this._listeners.push(r)}unsubscribe(){this._listeners.forEach(e=>{e.dispose()})}},x=function(e){return e.MIC_CAMERA_PERMISSION=`mic_camera`,e.CAMERA_PERMISSION=`camera`,e.MIC_PERMISSION=`mic`,e.CAMERA_ACCESS=`cameralock`,e.MIC_ACCESS=`miclock`,e.MIC_NOT_FOUND=`nomic`,e.SCREEN_PERMISSION=`screenpermission`,e.SCREEN_ACCESS=`screenlock`,e.CONNECTION=`connection`,e.NETWORK=`network`,e.UNKNOWN=`unknown`,e.UNSUPPORTED=`unsupported`,e.SIGNALING_FAILED=`signalingfailed`,e.API=`api`,e.AUTH=`auth`,e.OVERCONSTRAINED=`overconstrained`,e}(x||{}),S=function(e){return e.AUDIO=`AUDIO`,e.VIDEO=`VIDEO`,e.SCREEN_SHARING=`SCREEN_SHARING`,e.MOVIE_SHARING=`MOVIE_SHARING`,e.AUDIO_SHARING=`AUDIO_SHARING`,e.ANIMOJI=`ANIMOJI`,e}(S||{}),C=function(e){return e.ACCEPT_CONCURRENT=`callAcceptConcurrent`,e.ACCEPT_INCOMING=`callAcceptIncoming`,e.ACCEPTED_OUTGOING=`callAcceptedOutgoing`,e.ADD_PARTICIPANT=`callAddParticipant`,e.CALL_SPEC_ERROR=`callSpecError`,e.DECLINE_INCOMING=`callDeclineIncoming`,e.DEVICE_CHANGED=`callDeviceChanged`,e.DEVICES=`callDevices`,e.ERROR=`callError`,e.HANGUP=`callHangup`,e.ICE_CONNECTION_STATE=`callIceConnectionState`,e.ICE_CONNECTION_TYPE=`callIceConnectionType`,e.ICE_RESTART=`callIceRestart`,e.JOIN_CONVERSATION=`callJoinConversation`,e.MEDIA_STATUS=`callMediaStatus`,e.OUTGOING_CALL=`callStart`,e.OUTGOING_MULTIPARTY_CALL=`callStartMultiparty`,e.PAT_ALLOCATED=`patAllocate`,e.PAT_DEALLOCATED=`patDeallocate`,e.PAT_ERROR=`patError`,e.PAT_OUTDATED_RESPONSE=`patOutdatedResponse`,e.PAT_WAITING_TIME_ERROR=`patWaitingTimeError`,e.POOR_CONNECTION=`callPoorConnection`,e.PUSH=`callPush`,e.RECONNECT=`callReconnect`,e.RELAY_POLICY=`callForceRelay`,e.REMOVE_PARTICIPANT=`callRemoveParticipant`,e.SOCKET_ACTION=`callSocketAction`,e.TOPOLOGY_CHANGE_REQUESTED=`callTopologyChangeRequested`,e}(C||{}),Xe=e=>e.stop(),Ze=e=>e.getTracks().forEach(Xe),Qe=e=>e.getVideoTracks().forEach(Xe);async function $e(e,t){try{let n=typeof t.width==`number`?t.width:void 0,r=typeof t.height==`number`?t.height:void 0;await e.applyConstraints({...t,...n&&{width:{max:n,ideal:n}},...r&&{height:{max:r,ideal:r}}})}catch(e){R.warn(`setVideoConstraints failed`,e)}}var et=class{constructor(){h(this,`_cameraPermissionStatus`,void 0),h(this,`_microphonePermissionStatus`,void 0),h(this,`_listener`,void 0)}static isSupported(){return T.browserName()!==`Firefox`&&`permissions`in navigator&&`PermissionStatus`in window}async init(e){try{let[t,n]=await Promise.all([navigator.permissions.query({name:`camera`}),navigator.permissions.query({name:`microphone`})]);this._cameraPermissionStatus=t,this._microphonePermissionStatus=n,this._listener=e,this._cameraPermissionStatus.onchange=e=>this.handlePermissionChange(e),this._microphonePermissionStatus.onchange=e=>this.handlePermissionChange(e)}catch(e){R.warn(`NavigatorPermissions init error`,e)}}handlePermissionChange(e){let t=e.target;if(t instanceof PermissionStatus){let{name:e,state:n}=t;switch(e){case`audio_capture`:this._listener(`microphone`,n);break;case`video_capture`:this._listener(`camera`,n);break}}}getPermissionState(e){let t=null;switch(e){case`camera`:t=this._cameraPermissionStatus.state;break;case`microphone`:t=this._microphonePermissionStatus.state;break}return t}},tt=`_okcls_`,nt=(()=>{try{let e=Date.now().toString(),t=window.localStorage,n=!1;return t.setItem(e,e),n=t.getItem(e)===e,t.removeItem(e),n?t:null}catch{return null}})();function rt(e){let t=nt?nt.getItem(tt+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function it(e,t){try{nt&&nt.setItem(tt+e,JSON.stringify(t))}catch{}}function at(e){nt&&nt.removeItem(tt+e)}var ot;(function(e){function t(e){return rt(e)||null}e.get=t;function n(e,t){it(e,t)}e.set=n;function r(e){at(e)}e.remove=r})(ot||(ot={}));var st=ot,ct=null,lt=null,ut=null,dt=[],ft=[],pt=[],mt=null,ht=null,gt=null,_t=!1,vt=!1,yt,bt,xt,St=null,Ct=null,wt=``,Tt=null,Et=[],Dt=null,Ot=navigator.appVersion,kt=navigator.appName,At=navigator.userAgent,jt={},Mt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Mt).includes(e)}e.contains=t})(Mt||(Mt={}));var Nt=class{constructor(e,t=!1,n=M.videoMaxWidth,r=M.videoMaxHeight,i=M.videoFrameRate){h(this,`audio`,void 0),h(this,`video`,void 0),h(this,`needVideo`,void 0),h(this,`lastSimplifyWasReached`,void 0),h(this,`supportedConstraints`,void 0),h(this,`isVideoRequested`,()=>this.needVideo),this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let a=!1;if(e){a={noiseSuppression:M.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let t=w.getMicrophones(),n,r;if(ht&&(r=ht.groupId,n=ht.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!ht&&w.os()===`MacOS`&&t.find(e=>e.label.includes(`iPhone`))){let e=t.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));e&&(r=e.groupId,n=e.deviceId)}r&&this.supportedConstraints.groupId?a.groupId={exact:r}:n&&(a.deviceId={exact:n})}let o=!1;if(t){o={width:{min:M.videoMinWidth,max:n,ideal:n},height:{min:M.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:M.videoAspectRatio},frameRate:{ideal:i}};let e=w.getCameras(),a,s;if(mt&&(s=mt.groupId,a=mt.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!mt&&w.os()===`MacOS`&&e.find(e=>e.label.includes(`iPhone`))){let t=e.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));t&&(s=t.groupId,a=t.deviceId)}s&&this.supportedConstraints.groupId?o.groupId={exact:s}:a&&(o.deviceId={exact:a}),M.videoFacingMode&&(o.facingMode={ideal:M.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=a,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video==`object`&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio==`object`&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let e=typeof this.video==`object`&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio==`object`&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||e)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Pt=class extends Nt{constructor(e,t,n,r){if(super(!1,!0),h(this,`captureController`,void 0),this.captureController=`CaptureController`in window?new CaptureController:null,typeof this.video==`object`?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode):this.video={},this.video.cursor=`motion`,this.video.width=e,this.video.height=t,this.video.frameRate=n,this.video.displaySurface=M.displaySurface,w.browserName()===`Safari`){let n=Number(w.browserVersion());n===16?(this.video.width={max:e},this.video.height={max:t}):n===17&&(delete this.video.width,delete this.video.height)}r&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:M.audioShareSystemInclude?`include`:`exclude`,windowAudio:M.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},Ft=class e{constructor(){h(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(t=null){if(e._lockId)throw t?.log(C.ERROR,`change_device`),R.warn(`Device change failed: MediaSource is busy`),Error(`MediaSource is busy`);e._lockId=this._lockId}free(){e._lockId===this._lockId&&(e._lockId=0)}};h(Ft,`_lockId`,0);async function It(){vt=!1,_t=!1,ct=null;let e={camera:w.getSavedCamera(),microphone:w.getSavedMicrophone(),output:w.getSavedOutput()};await Rt(),Lt(`devicechange`,e),L.onDeviceChange()}function Lt(e,...t){if(jt[e])for(let n of jt[e])n(...t)}async function Rt(){return ct||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!lt&&navigator.mediaDevices.addEventListener&&(lt=j.debounce(It,M.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,lt)),!ut&&et.isSupported()&&(ut=new et,await ut.init((e,t)=>{switch(t){case`denied`:case`prompt`:lt?.();break}})),ct=navigator.mediaDevices.enumerateDevices().then(e=>{dt=e.filter(e=>e.kind===`videoinput`?(e.label&&(_t=!0),!0):!1),ft=e.filter(e=>e.kind===`audioinput`?(e.label?vt=!0:w.isMobile()&&w.browserName()===`Firefox`&&(vt=_t),!0):!1),pt=e.filter(e=>e.kind===`audiooutput`);let t=mt?.deviceId??st.get(`videoinput`),n=ht?.deviceId??st.get(`audioinput`),r=gt?.deviceId??st.get(`audiooutput`);return mt=dt.find(e=>e.deviceId===t)||null,ht=ft.find(e=>e.deviceId===n)||null,gt=pt.find(e=>e.deviceId===r)||pt[0]||null,ct=Promise.resolve(e),e}).catch(()=>(ct=null,[]))))}async function zt(){if(`userAgentData`in navigator)try{let{platformVersion:e}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!e){R.warn(`Can't to get OS version`);return}let t=parseInt(e.split(`.`)[0]);Tt=isNaN(t)?null:t}catch(e){R.warn(`Failed to get OS version`,e)}}function Bt(e){if(mt&&ht)return;let t=(e,t)=>{let n=t.getSettings()?.deviceId;return e.find(e=>e.deviceId===n||e.label===t.label)||null};e?.getTracks().forEach(e=>{!ht&&e.kind===k.audio?ht=t(w.getMicrophones(),e):!mt&&e.kind===k.video&&(mt=t(w.getCameras(),e))})}async function Vt(e,t,n=R,r=null){n.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative()))),w.releaseFirefoxMicrophonePermissionWarmup();let i=(!e.isVideo()||w.hasCameraPermission())&&(!e.isAudio()||w.hasMicrophonePermission());!i&&!t&&L.onPermissionsRequested();let a=new Ft;try{a.busy(r);let t=await navigator.mediaDevices.getUserMedia(e.getNative());return a.free(),i||await It(),Bt(t),t}catch(i){switch(a.free(),n.error(`getUserMedia error`,i),i.name){case`PermissionDeniedError`:case`PermissionDismissedError`:case`NotAllowedError`:case`SecurityError`:case`DOMException`:case`NotFoundError`:t=e.isVideoRequested()?x.CAMERA_PERMISSION:x.MIC_PERMISSION;break;case`OverconstrainedError`:t=x.OVERCONSTRAINED;break;case`TypeError`:t=x.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?x.CAMERA_ACCESS:x.MIC_ACCESS;break;case`Error`:if(i.message===`MediaSource is busy`){t=e.isVideoRequested()?x.CAMERA_ACCESS:x.MIC_ACCESS;break}}if(e.canSimplify())return Vt(e.simplify(),t,n,r);let o=t||x.UNKNOWN;throw L.onPermissionsError(o,i),o}}async function Ht(e=R){if(!(St||w.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{w.hasMicrophonePermission()||L.onPermissionsRequested(),St=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(t){e.warn(`Firefox microphone permission warmup failed`,t)}}async function Ut(e,t=R,n=null){t.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let r=new Ft;try{r.busy(n);let i=await navigator.mediaDevices.getDisplayMedia(e.getNative()),a=i?.getVideoTracks()[0];if(a){let n=a.getSettings()?.displaySurface;if(t.debug(`Got display media track: ${a.id} (${n})`),a.contentHint=`text`,e.captureController&&(n===`browser`||n===`window`))try{e.captureController.setFocusBehavior(`no-focus-change`)}catch(e){t.warn(`Failed to set focus behavior`,e)}}return i}catch(e){switch(e.name){case`PermissionDeniedError`:case`NotAllowedError`:case`SecurityError`:throw x.SCREEN_PERMISSION;default:throw x.SCREEN_ACCESS}}finally{r.free()}}function Wt(){return Et.length||(Et=(()=>{let e,t=!1,n=0,r=`0`,i=At.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return e=/\brv[ :]+(\d+)/g.exec(At),[`IE`,e&&e[1]||`Unknown`,t,n,r];if(i[1]===`Safari`){if(e=At.match(/\bEdge\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=At.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=At.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=At.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=At.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=At.match(/\bEdge?\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(window.opr!==void 0&&/^(.+\.)?ok.ru$/.test(window.location.host))return[`Opera`,`Hidden`,t,n,r]}return e=At.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:kt,e&&e[1]||i[2]||Ot,t,n,r]})()),Et}var w;(function(e){async function t(){await Rt(),await zt()}e.init=t;function n(){return dt}e.getCameras=n;function r(){return ft}e.getMicrophones=r;function i(){return pt}e.getOutput=i;function a(){return dt.length>0}e.hasCamera=a;function o(){return ft.length>0}e.hasMicrophone=o;function s(){return mt}e.getSavedCamera=s;function c(){return ht}e.getSavedMicrophone=c;function l(){return gt}e.getSavedOutput=l;function u(){return M.videoFacingMode}e.getVideoFacingMode=u;function d(){return _t}e.hasCameraPermission=d;function f(){return vt}e.hasMicrophonePermission=f;function p(){return ut?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=p;function m(e=!1){return f()?a()&&e?d():!0:!1}e.hasPermissions=m;function ee(){St&&(Ze(St),St=null)}e.releaseFirefoxMicrophonePermissionWarmup=ee;async function te(e=!1,t=!0,n=!0,r=R,i=null){!e&&!t?await Ht(r):w.releaseFirefoxMicrophonePermissionWarmup();let s=o()&&t,c=a()&&e,l;if(!s&&!c)l=new MediaStream;else try{l=await Vt(new Nt(s,c),void 0,r,i)}catch{l=new MediaStream}return!l.getVideoTracks().length&&n&&l.addTrack(w.getBlackMediaTrack()),!l.getAudioTracks().length&&n&&l.addTrack(w.getSilentMediaTrack()),l}e.getUserMedia=te;async function ne(e,t,n=R,r=null){return Ut(new Pt(e&&!M.consumerFastScreenShare?M.fastScreenShareWidth:window.screen.width,e&&!M.consumerFastScreenShare?M.fastScreenShareHeight:window.screen.height,M.getScreenFrameRate(e),t),n,r)}e.getScreenMedia=ne;async function h(e=!1,t,n=R,r=null){return Vt(new Nt(!1,!0,e?M.videoEffectMaxWidth:M.videoMaxWidth,e?M.videoEffectMaxHeight:M.videoMaxHeight,t),void 0,n,r)}e._getUserVideo=h;async function g(e,t,n=R,r=null){let i=t?.width||M.videoMaxWidth,a=t?.height||M.videoMaxHeight;return Vt(new Nt(!1,e||!0,i,a),void 0,n,r)}e.getUserVideo=g;async function re(e,t=R,n=null){return Vt(new Nt(e||!0,!1),void 0,t,n)}e.getUserAudio=re;async function ie(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return $e(n,t)}e.setResolution=ie;async function ae(e,t){let n=(await Rt()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?mt=n:e===`audioinput`?ht=n:e===`audiooutput`&&(gt=n),st.set(e,t),n):null}e._saveDeviceId=ae;function oe(){if(!xt||xt.readyState===`ended`){let e=w.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),xt=t.stream.getAudioTracks()[0]}return Object.assign(xt.clone(),{enabled:!1})}e.getSilentMediaTrack=oe;function se(e=M.videoMinWidth,t=M.videoMinHeight){bt||(bt=document.createElement(`canvas`)),bt.width=e,bt.height=t;let n=bt.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!yt||yt.readyState===`ended`)&&(yt=bt.captureStream(M.videoFrameRate).getVideoTracks()[0]),Object.assign(yt.clone(),{enabled:!1})}e.getBlackMediaTrack=se;function _(){if(ve()===`Edge`&&Number(v())<70)return!1;try{let e=window;return`mediaDevices`in e.navigator&&`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 navigator&&!0||!1}catch{return!1}}e.isBrowserSupported=_;function ce(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=ce;function le(){let e=w.browserName()===`Safari`&&w.browserVersion()===`15`&&w.browserSubVersion()===`1`,t=w.browserName()===`Opera`,n=w.browserName()===`Yandex`;return e||t||n}e.isBrokenH264Decoder=le;function ue(){return w.browserName()===`Yandex`&&w.os()===`Windows`||M.simulcast}e.isBrokenVP9Encoder=ue;function de(){let e=w.browserName()===`Safari`&&Number(w.browserVersion())===17&&[4,5,6].includes(Number(w.browserSubVersion())),t=w.os()===`Windows`&&w.osVersion()===10;return e||t}e.isBrokenVP9Decoder=de;function fe(){return w.browserName()===`Firefox`&&Number(w.browserVersion())<60}e.isOldDataChannelDescription=fe;function pe(){return!(w.baseChromeVersion()&&w.isMobile())}e.canPreferH264=pe;function me(){return!(w.browserName()===`Firefox`||w.browserName()===`Safari`)}e.isSimulcastSupportedByBrowser=me;function he(){return wt||(wt=(()=>{let e={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let t in e)if(Object.hasOwn(e,t)&&e[t].test(At))return t;return`Unknown`})()),wt}e.os=he;function ge(){return Tt}e.osVersion=ge;function _e(){return Ct===null&&(Ct=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Ot)),Ct}e.isMobile=_e;function ve(){return Wt()[0]}e.browserName=ve;function v(){return Wt()[1]}e.browserVersion=v;function ye(){return Wt()[3]}e.baseChromeVersion=ye;function be(){return Dt||(Dt=new(window.AudioContext||window.webkitAudioContext)),Dt.resume().catch(()=>{R.warn(`Failed to resume AudioContext`)}),Dt}e.getAudioContext=be;function xe(){return Wt()[4]}e.browserSubVersion=xe;function Se(){return w.baseChromeVersion()>=105&&!w.isMobile()}e.isAudioShareSupported=Se;function Ce(e,t){jt[e]||(jt[e]=[]),jt[e].push(t)}e.addEventListener=Ce;function we(e,t){if(jt[e])if(!t)delete jt[e];else{let n=jt[e].indexOf(t);n>-1&&jt[e].splice(n,1)}}e.removeEventListener=we})(w||(w={}));var T=w;function Gt(e,t){return!(e.isAudioEnabled!==t.isAudioEnabled||e.isVideoEnabled!==t.isVideoEnabled||e.isScreenSharingEnabled!==t.isScreenSharingEnabled||e.isFastScreenSharingEnabled!==t.isFastScreenSharingEnabled||e.isAudioSharingEnabled!==t.isAudioSharingEnabled||e.isAnimojiEnabled!==t.isAnimojiEnabled)}function E(e){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},e||{})}var D=function(e){return e.CANCELED=`CANCELED`,e.REJECTED=`REJECTED`,e.REMOVED=`REMOVED`,e.HUNGUP=`HUNGUP`,e.MISSED=`MISSED`,e.BUSY=`BUSY`,e.FAILED=`FAILED`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.KILLED=`KILLED`,e.BANNED=`BANNED`,e.HAS_ACTIVE_CALL=`HAS_ACTIVE_CALL`,e.CALLER_IS_BLOCKED=`CALLER_IS_BLOCKED`,e.NOT_FRIENDS=`NOT_FRIENDS`,e.CALLEE_IS_OFFLINE=`CALLEE_IS_OFFLINE`,e.CALLER_IS_REJECTED=`CALLER_IS_REJECTED`,e.UNKNOWN_ERROR=`UNKNOWN_ERROR`,e.UNSUPPORTED=`UNSUPPORTED`,e.OLD_VERSION=`OLD_VERSION`,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}(D||{}),O=class e extends Error{constructor(t,n){super(),h(this,`message`,void 0),h(this,`hangup`,void 0),h(this,`error`,void 0),h(this,`code`,void 0),h(this,`remote`,void 0),h(this,`custom_error`,void 0),this.name=`HangupReason`,this.code=n&&n.code||0,this.remote=n&&n.remote||!1,this.custom_error=n?.custom_error??null,Object.values(D).indexOf(t)>-1?this.hangup=t:this.error=t;let r=[];this.error&&r.push(`error`),this.remote&&r.push(`remote`),this.code&&r.push(`code: ${this.code}`),n&&n.message&&r.push(`message: '${n.message}'`),this.message=t+(r.length?` (${r.join(`, `)})`:``),Error.captureStackTrace&&Error.captureStackTrace(this,e)}},Kt=function(e){return e.FpsLimit=`fps-limit`,e}({}),qt=class extends b{constructor(e=R){super(),h(this,`FPS_LIMITS`,[13,20,Math.max(M.videoFrameRate,25)]),h(this,`THRESHOLD`,.8),h(this,`HISTORY_LENGTH`,10),h(this,`_fpsMeterUnsubscribe`,null),h(this,`_fpsHistory`,{cursor:0,arr:[]}),h(this,`_fpsLimitCursor`,this.FPS_LIMITS.length-1),h(this,`_debug`,void 0),this._debug=e}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(e){this._debug.warn(`VideoEffectsFpsLimiter error`,e)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let e=this._fpsHistory.arr.reduce((e,t)=>e+t,0)/this.HISTORY_LENGTH,t=this.FPS_LIMITS[this._fpsLimitCursor];e<t*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),t!==this.fpsLimit&&this._triggerEvent(`fps-limit`,this.fpsLimit)}}_assertsVideoEffect(e){if(!(`addFpsMeterListener`in e))throw Error(`Outdated VideoEffect version`)}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}},Jt=function(e){return e.SOURCE_CHANGED=`SOURCE_CHANGED`,e.SOURCE_READY=`SOURCE_READY`,e.TRACK_REPLACED=`TRACK_REPLACED`,e.SCREEN_STATUS=`SCREEN_STATUS`,e.ANIMOJI_STATUS=`ANIMOJI_STATUS`,e}({}),k=function(e){return e.audio=`audio`,e.video=`video`,e.screen=`screen`,e.audioshare=`audioshare`,e}({}),Yt=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),Xt=class extends b{constructor(e=R,t=null){super(),h(this,`_stream`,null),h(this,`_screenTrack`,null),h(this,`_audioShareTrack`,null),h(this,`_screenShareTrack`,null),h(this,`_sendVideoTrack`,null),h(this,`_cameraVideoTrack`,null),h(this,`_micAudioTrack`,null),h(this,`_audioEffectsTrack`,null),h(this,`_mediaSettings`,E()),h(this,`_lastMediaSettings`,null),h(this,`_videoStatusOnScreenCapturingEnabled`,!1),h(this,`_effect`,null),h(this,`_audioEffectParams`,null),h(this,`_onDeviceChange`,void 0),h(this,`_animojiEnabled`,!1),h(this,`_videoEffectsFpsLimiter`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`videoTrackMuteHandler`,()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)}),this._debug=e,this._logger=t,this._initDeviceChangeListener(),M.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),M.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new qt(this._debug),this._videoEffectsFpsLimiter.addEventListener(Kt.FpsLimit,this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener(`mute`,this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&this._cameraVideoTrack.addEventListener(`mute`,this.videoTrackMuteHandler),M.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[S.AUDIO],t=!0){if(this._stream)return;let n=e.includes(S.VIDEO),r=e.includes(S.AUDIO),i=e.includes(S.ANIMOJI);if(!T.isBrowserSupported())throw new O(x.UNSUPPORTED);try{this._stream=await T.getUserMedia(n,r,t,this._debug,this._logger),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=n&&this._stream.getVideoTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=r&&this._stream.getAudioTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=i&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=i,this._triggerEvent(`SOURCE_READY`)}catch(e){throw new O(e)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(e=>!e.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,n){let r=this.getStream(),i=this.getSendAudioTrack(),a=this.getSendVideoTrack(n);if(!r||!i&&!a&&!t)throw Error(`No local stream found`);i&&!t&&e.addTrack(i,r),a&&!t&&e.addTrack(a,r)}getMediaSettings(){return this._mediaSettings}get mediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case`videoinput`:if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case`audioinput`:if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(x.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Qe(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_initDeviceChangeListener(){!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices||!navigator.mediaDevices.addEventListener||(this._onDeviceChange=async e=>{if(!this._stream)return;let t=T.getSavedMicrophone(),n=T.getSavedCamera(),r=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,i=this._mediaSettings.isVideoEnabled&&n?.groupId!==e.camera?.groupId;try{r&&await this._changeAudioInput(),i&&await this._changeVideoInput()}catch{}},T.addEventListener(`devicechange`,this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&T.removeEventListener(`devicechange`,this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?`stream`:`video`,n=e||await T._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=n.getVideoTracks()[0],!this._stream)Ze(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);this._logger?.log(C.DEVICE_CHANGED,t),this._debug.log(`Video stream changed`),await this._replaceLocalTrack(e),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}}catch(e){throw this._logger?.log(C.ERROR,`change_video`),this._debug.warn(`Camera change failed`,e),e}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await T.getUserAudio(void 0,this._debug,this._logger);if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Ze(t);else{let e=await this._applyAudioEffect();this._logger?.log(C.DEVICE_CHANGED,`audio`),this._debug.log(`Audio stream changed`,e),await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})}}catch(e){throw this._logger?.log(C.ERROR,`change_audio`),this._debug.error(`Microphone change failed`,e),e}}async _changeScreen(e,t,n){try{if(n=n||await T.getScreenMedia(e,t,this._debug,this._logger),!this._stream)Ze(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),this._logger?.log(C.DEVICE_CHANGED,`screen`),this._debug.log(`Screen capturing started`),this._screenTrack=r,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,M.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(r.contentHint=`motion`,this._screenShareTrack=r),n.getAudioTracks().length>0){let e=n.getAudioTracks()[0];e.contentHint=`music`,this._audioShareTrack=e,await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&this._debug.debug(`Audio share requested but not captured`),this._triggerEvent(`SCREEN_STATUS`,{track:r}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`})}}catch(e){throw this._logger?.log(C.ERROR,`screen`),this._debug.warn(`Screen capturing failed`,e),e}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent(`SCREEN_STATUS`,{track:null}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`}))}async stopAudioShareTrack(){if(this._audioShareTrack){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!M.audioEffects||!this._audioEffectParams)return M.audioEffects?.pause(),this._micAudioTrack;M.audioEffects.isInitialized||await M.audioEffects.init(),M.audioEffects.resume(),M.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),M.audioEffects.setSource(this._micAudioTrack);let e=M.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=T.getSilentMediaTrack();return e.contentHint=`music`,e.stop(),e}getBlackScreenShareTrack(){let e=T.getBlackMediaTrack();return e.contentHint=`motion`,e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let n=this._stream.getTracks().find(t=>t.kind===e.kind&&t.contentHint===e.contentHint);n?.id!==e.id&&(n?(n!==this._audioEffectsTrack&&n.stop(),this._stream?.removeTrack(n),this._stream?.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)):(this._stream.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(M.videoEffects),!M.videoEffects)return t;try{return M.videoEffects.setEffect(e,t)}catch(e){return this._debug.warn(`Video effect failed`,e),t}}_stopEffect(){if(M.videoEffects)try{M.videoEffects.stopEffect()}catch(e){this._debug.warn(`Video effect failed`,e)}}destroy(){this._destroyDeviceChangeListener(),T.releaseFirefoxMicrophonePermissionWarmup(),M.videoEffects&&(this._effect=null,M.videoEffects.destroy()),M.audioEffects&&M.audioEffects.destroy(),this._stream&&(Ze(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),T.getAudioContext()?.suspend().catch(e=>this._debug.error(e)),this._videoEffectsFpsLimiter?.destroy()}async stopLocalMedia(){this._mediaSettings.isScreenSharingEnabled&&await this.disableScreenCapturing(),this._stream&&(this._lastMediaSettings={...this._mediaSettings},this._stream.getAudioTracks().length>0&&await this.toggleAudio(!1),this._stream.getVideoTracks().length>0&&await this.toggleVideo(!1),this.cameraVideoTrack=null,this._micAudioTrack=null)}async resumeLocalMedia(){if(!this._lastMediaSettings)return;let e=[];if(this._lastMediaSettings.isAudioEnabled&&(e.push(S.AUDIO),await this.toggleAudio(!0)),await this.request(e),this._lastMediaSettings=null,this._stream)for(let e of this._stream.getTracks())this._triggerEvent(`TRACK_REPLACED`,e)}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return this._disableScreenCapture()}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;this.cameraVideoTrack?.stop();let t;if(e){let e=await T._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);this.cameraVideoTrack=e.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=T.getBlackMediaTrack(M.videoMinWidth,M.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent(`ANIMOJI_STATUS`,!e);return}this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(e,t)=>{await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=t,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})};if(e)try{let e=await T.getUserAudio(void 0,this._debug,this._logger);this._micAudioTrack=e.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(e){throw M.audioEffects?.pause(),t(T.getSilentMediaTrack(),!1),typeof e==`string`?Error(e):e}else M.audioEffects?.pause(),t(T.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent(`ANIMOJI_STATUS`,e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async setResolution({video:e,effect:t}){if(!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw Error(`Local stream not found`);if(!this.cameraVideoTrack)throw Error(`Local video track not found`);let n=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,n)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(e=>!e.contentHint);if(!e)throw Error(`Local audio track not found`);if(e.enabled)return e.applyConstraints({noiseSuppression:M.noiseSuppression})}async videoEffect(e){if(!M.videoEffects)throw Error(`Video Effects library is not set`);if(this._logger?.log(C.DEVICE_CHANGED,`effect_${e?.effect||`none`}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let e=this.cameraVideoTrack.clone(),t=new MediaStream([e]);await this._applyVideoConstraints(e),await this._changeVideoInput(t)}catch(e){this._effect=t;let n=this.cameraVideoTrack.clone(),r=new MediaStream([n]);throw await this._changeVideoInput(r),e}}}async audioEffect(e){if(!M.audioEffects)throw Error(`Audio Effects library is not set`);if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!j.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let e=this._micAudioTrack.clone(),t=new MediaStream([e]);await this._changeAudioInput(t)}catch(e){this._audioEffectParams=t;let n=this._micAudioTrack.clone(),r=new MediaStream([n]);throw await this._changeAudioInput(r),e}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<M.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(e=>{this._debug.warn(`MediaSource handleVideoEffectsLowFps error`,e)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??M.videoFrameRate;return this._effect?Math.min(e,M.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await $e(e,{width:this._effect?M.videoEffectMaxWidth:M.videoMaxWidth,height:this._effect?M.videoEffectMaxHeight:M.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}},A=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e}(A||{}),Zt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Qt=`L1T2`,$t=[{dimension:320,bitrate:18e4},{dimension:520,bitrate:4e5},{dimension:640,bitrate:5e5},{dimension:960,bitrate:9e5},{dimension:1280,bitrate:12e5},{dimension:1920,bitrate:25e5},{dimension:2560,bitrate:35e5},{dimension:3840,bitrate:5e6}],en={h:1,m:2,l:4};function tn(e,t){return!e||!t?e===t:e.streams.length===t.streams.length?e.streams.every((e,n)=>j.isObjectsEquals(e,t.streams[n])):!1}function nn(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return length>0?t[length-1].bitrate:$t[0].bitrate}function rn(e=Zt.WIDTH,t=Zt.HEIGHT,n=$t){let r=[`h`,`m`,`l`],i=Math.max(e,t),a=1;i>=960?a=3:i>=480&&(a=2);let o={streams:[]},s=nn(i,n)??Zt.BITRATE;for(let i=0;i<a;i++){let a=r[i];o.streams.push({rid:a,width:e,height:t,fps:30,bitrate:s}),e=Math.round(e/2),t=Math.round(t/2),s=nn(Math.max(e,t),n)??Math.round(s/2)}return o}function an(e){return e?en[e]??1:1}var on=typeof Object.fromEntries==`function`?Object.fromEntries:function(e){if(!e||!e[Symbol.iterator])throw Error(`Object.fromEntries() requires a single iterable argument`);let t={};for(let[n,r]of e)t[n]=r;return t};async function sn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var cn=533,ln=`a=fmtp:`,un=`sps-pps-idr-in-keyframe=1`,dn;(function(e){let t=/[\r\n]+/;function n(e,t){let n=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),r,i=[];for(r=0;r<e.length;++r){let a=e[r].match(n);a&&a.length===3&&a[2]===t&&i.push(a[1])}return i}function r(e,t,n){let r=e.split(` `),i=r.slice(0,3),a;for(a=3;a<r.length;a++)n.includes(r[a])&&i.push(r[a]);for(a=3;a<r.length;a++)!n.includes(r[a])&&!t.includes(r[a])&&i.push(r[a]);return i.join(` `)}function i(e,t,n,i){let a,o=`m=`+t;for(a=0;a<e.length;++a)e[a].startsWith(o)&&(e[a]=r(e[a],n,i))}function a(e,t){let n=RegExp(`a=fmtp:(\\d+)`);for(let r=0;r<e.length;++r){let i=e[r].match(n);if(i&&i.length===2&&t.includes(i[1])){let t=e[r].trim()===ln+i[1]?` `:`;`;e[r]+=t+un}}}function o(e,t,r=`video`){let a=n(e,t);if(!a.length)return;let o=a.slice(0),s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`),c;for(c=0;c<e.length;++c){let t=e[c].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}let l=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`);for(c=e.length;c--;){let t=e[c].match(l);t&&t.length===3&&o.includes(t[2])&&e.splice(c,1)}i(e,r,o,[])}function s(e,t,n,r){let i=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),a,o=[];for(a=t;a<n;++a){let t=e[a].match(i);t&&t.length===3&&t[2]===r&&o.push(t[1])}if(!o.length)return o;let s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`);for(a=t;a<n;++a){let t=e[a].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}return o}function c(e,t,n,i){let a=s(e,t,n,i);if(!a.length)return n+1;let o=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`),c=0,l=n;for(;l>=t;){let t=e[l].match(o);t&&t.length===3&&a.includes(t[2])&&(e.splice(l,1),c++),l--}return e[t]=r(e[t],a,[]),n-c+1}function l(e,t,n,r){let i=-1,a=-1,o=!1;for(let s=0;s<e.length;++s)if(i>=0&&e[s].startsWith(`m=`)&&(a=s-1,o&&(s=c(e,i,a,t)),i=-1,a=-1,o=!1),e[s].startsWith(`m=video`)&&(i=s),i>=0){let t=n===`remote`&&r===`encoder`||n===`local`&&r===`decoder`?`recvonly`:`sendonly`;(e[s].startsWith(`a=${t}`)||e[s].startsWith(`a=sendrecv`))&&(o=!0)}a=e.length-1,i>=0&&o&&c(e,i,a,t)}function u(e,t){let r=n(e,`H264`);t&&i(e,`video`,[],r),a(e,r)}function d(e){i(e,`video`,[],n(e,`VP9`))}function f(e){[`G722`,`PCMU`,`PCMA`,`CN`,`telephone-event`].forEach(t=>{o(e,t,`audio`)})}function p(e,r,a,o,s=!1){let c=e.split(t);if(f(c),!r&&!a&&!o&&!s)return c.join(`\r
|
|
8
8
|
`);function p(e){let t=[`a=rtcp-fb:111 nack`,`a=rtcp-fb:111 nack pli`],n=e.findIndex(e=>e.startsWith(`a=rtcp-fb:111`));return~n&&(e[n]=e[n]+`\r
|
|
9
9
|
`+t.join(`\r
|
|
10
10
|
`)),e}function m(e){let t=n(e,`red`);t.length>0&&i(e,`audio`,[],t)}return a?l(c,`H264`,`local`,`decoder`):u(c,r),o&&d(c),m(c),s&&p(c),c.join(`\r
|
|
11
11
|
`)}e.patchLocalSDP=p;function m(e,n,r,i,a,s,c){n&&(e=e.replace(`m=application 9 UDP/DTLS/SCTP webrtc-datachannel`,`m=application 9 DTLS/SCTP 5000`).replace(`a=sctp-port:5000`,`a=sctpmap:5000 webrtc-datachannel 256`));let p=e.split(t);return i?o(p,`H264`):r&&u(p,r),s&&c?o(p,`VP9`):s?l(p,`VP9`,`remote`,`encoder`):c?l(p,`VP9`,`remote`,`decoder`):a&&d(p),f(p),p.join(`\r
|
|
12
|
-
`)}e.patchRemoteSDP=m;function
|
|
13
|
-
`);for(let e of n)if(e.startsWith(`a=fingerprint`)){let n=e.split(` `);if(n.length===2){t=n[1];break}}if(!t)return BigInt(-1);let r=t.split(`:`),i=BigInt(0);for(let e=Math.min(7,r.length-1);e>=0;e--){let t=BigInt(parseInt(r[e],16));i<<=BigInt(8),i|=t}return BigInt.asIntN(64,i)}e.sdpFingerprint=
|
|
14
|
-
`)}return e}e.patchSimulcastAnswerSdp=Ce})(Cn||(Cn={}));var N=Cn,wn=`__CALLS_SDK_DEVTOOLS_`,Tn=class{set(e,t){try{this.getStorage().setItem(wn+e,JSON.stringify(t))}catch(t){B.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(wn+e);return t===null?null:JSON.parse(t)}catch(t){return B.warn(`DevTools: Failed to read option`,e,t),null}}remove(e){try{this.getStorage().removeItem(wn+e)}catch(t){B.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(wn)&&e.removeItem(n)}catch(e){B.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(wn)){let t=r.substring(21),i=e.getItem(r);if(i!==null)try{n[t]=JSON.parse(i)}catch{}}return n}catch(e){return B.warn(`DevTools: Failed to get all options`,e),{}}}getStorage(){return window.localStorage}},En=class{constructor(e){g(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}},Dn=class e{static getInstance(){return e.instance||(e.instance=new e),e.instance}constructor(){g(this,`params`,void 0),g(this,`storage`,void 0),this.storage=new Tn,this.params=new En(this.storage)}};g(Dn,`instance`,null);var On=Dn.getInstance(),P=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`)&&(C.accessToken=t.apiAuth.accessToken,C.sessionKey=t.apiAuth.sessionKey,C.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=On.params.applyOverrides(t);Object.assign(e._params,N.objectFilterOutValues(n,void 0))}static getScreenFrameRate(t){return t?e._params.fastScreenShareFrameRate:e._params.screenFrameRate}static get(t){return e._params[t]}static get appName(){return`ok.calls.sdk.js`}static get appVersion(){return 1.1}static get sdkVersion(){return`2.8.11-dev.af7eda54.0`}static get debug(){return e._params.debug}static get protocolVersion(){return e._params.joinFromMultipleDevices?6:5}static get platform(){return e._params.platform}static set platform(t){e._params.platform=t}static get clientStatsPlatform(){return e._params.clientStatsPlatform}static set clientStatsPlatform(t){e._params.clientStatsPlatform=t}static get clientType(){return e._params.clientType}static set clientType(t){e._params.clientType=t}static get externalUserType(){return e._params.externalUserType}static set externalUserType(t){e._params.externalUserType=t}static get device(){return e._params.device}static get apiKey(){return e._params.apiKey}static get apiEnv(){return e._params.apiEnv}static get apiBaseUrl(){return e._params.apiBaseUrl}static set apiBaseUrl(t){e._params.apiBaseUrl=t}static apiEndpoint(t){switch(t??e.apiEnv){case`AUTO`:case`PROD`:return`https://api.mycdn.me`;case`CALLS`:return`https://calls.okcdn.ru`;case`PROD_OK`:return`https://api.ok.ru`;case`TEST`:return`https://apitest.ok.ru/api`;case`VIDEOTEST`:return`https://videotestapi.ok.ru/api`;case`CALLSTEST`:return`https://calls-test.okcdn.ru/api`;case`CALLS_BETA`:return`https://api-beta.calls-test.oneme.ru/api`;case`CALLS_BENDER`:return`https://api-bender.calls-test.oneme.ru/api`;case`CALLS_MAMES`:return`https://api-mames.calls-test.oneme.ru/api`;case`CALLS_MARS`:return`https://api-mars.calls-test.oneme.ru/api`;default:return e._params.apiEnv}}static get apiTimeout(){return e._params.apiTimeout}static get apiMaxAttempt(){return e._params.apiMaxAttempt}static get authToken(){return e._params.authToken}static set authToken(t){e._params.authToken=t}static get anonymToken(){return e._params.anonymToken}static set anonymToken(t){e._params.anonymToken=t}static get domain(){return e._params.domain}static get externalDomain(){return e._params.externalDomain}static get iceServers(){return e._params.iceServers}static set iceServers(t){e._params.iceServers=t}static get wssBase(){return e._params.wssBase}static set wssBase(t){e._params.wssBase=t}static get wtsBase(){return e._params.wtsBase}static set wtsBase(t){e._params.wtsBase=t}static get wssToken(){return e._params.wssToken}static set wssToken(t){e._params.wssToken=t}static get signalingReconnectDelay(){return e._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return e._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return e._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return e._params.waitConnectionDelay}static get waitResponseDelay(){return e._params.waitResponseDelay}static get waitMessageDelay(){return e._params.waitMessageDelay}static get waitAnotherTabDelay(){return e._params.waitAnotherTabDelay}static get 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||(k.isMobile()?Wt.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)=>B.send(e,...t))}static get videoEffects(){return e._params.videoEffects}static set videoEffects(t){e._params.videoEffects=t,e._params.videoEffects?.setLogger((e,...t)=>B.send(e,...t))}static get videoEffectMaxWidth(){return e._params.videoEffectMaxWidth}static set videoEffectMaxWidth(t){e._params.videoEffectMaxWidth=t}static get videoEffectMaxHeight(){return e._params.videoEffectMaxHeight}static set videoEffectMaxHeight(t){e._params.videoEffectMaxHeight=t}static get vmoji(){return e._params.vmoji?.isBrowserSupported()?e._params.vmoji:null}static set vmoji(t){e._params.vmoji=t}static get vmojiOptions(){return e._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(t){e._params.vmojiOptions=t}static get voiceParams(){return e._params.voiceParams}static get specListenerParams(){return e._params.specListenerParams}static get iceRestartWaitTime(){return e._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return e._params.transportConnectionWaitTime}static get statisticsInterval(){return e._params.statisticsInterval}static set statisticsInterval(t){e._params.statisticsInterval=t}static get networkStatisticsInterval(){return e._params.networkStatisticsInterval}static get perfStatReportEnabled(){return e._params.perfStatReportEnabled}static get callStatReportEnabled(){return e._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return e._params.clientEventsLoggingEnabled}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 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 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 k.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 k.isSimulcastSupportedByBrowser()&&e._params.simulcast}static get webtransport(){return e._params.webtransport}static get webtransportFF(){return e._params.webtransportFF}static get transparentAudio(){return e._params.transparentAudio}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,asrDataChannel:e._params.asrDataChannel,videoMaxHeight:e._params.videoMaxHeight,videoMaxWidth:e._params.videoMaxWidth,videoEffectMaxHeight:e._params.videoEffectMaxHeight,videoEffectMaxWidth:e._params.videoEffectMaxWidth,videoSuspend:e._params.videoSuspend,debugLog:e._params.debugLog,callStatReportEnabled:e._params.callStatReportEnabled,joinFromMultipleDevices:e._params.joinFromMultipleDevices,movieShare:e._params.movieShare,clientType:e._params.clientType,clientStatsPlatform:e._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:e._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:e._params.switchVideoAtBadNetwork,simulcast:e._params.simulcast,webtransport:e._params.webtransport,webtransportFF:e._params.webtransportFF,transparentAudio:e._params.transparentAudio}}};g(P,`_params`,{platform:`WEB`,clientStatsPlatform:``,clientType:`PORTAL`,externalUserType:``,device:`browser`,apiKey:``,authToken:``,anonymToken:``,apiEnv:`AUTO`,apiBaseUrl:null,domain:``,externalDomain:``,iceServers:[],wssBase:``,wtsBase:``,wssToken:``,signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,apiTimeout:5e3,apiMaxAttempt:10,forceRelayPolicy:!1,videoMinWidth:428,videoMinHeight:240,videoMaxWidth:1280,videoMaxHeight:720,videoAspectRatio:16/9,videoFrameRate:25,screenFrameRate:15,videoFacingMode:null,displaySurface:`monitor`,audioEffects:null,videoEffects:null,videoEffectMaxWidth:640,videoEffectMaxHeight:360,vmoji:null,vmojiOptions:null,iceRestartWaitTime:2e4,transportConnectionWaitTime:5e3,statisticsInterval:5e3,networkStatisticsInterval:2e4,perfStatReportEnabled:!0,callStatReportEnabled:!1,clientEventsLoggingEnabled:!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,movieShare:!1,useCallsToContacts:!1,useParticipantListChunk:!1,useRooms:!1,useChatRooms:!1,addParticipant:!1,waitForAdminInGroupCalls:!1,hold:!1,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,webtransportFF:!1,transparentAudio:!1});var F=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}({});function I(e,...t){let n=P.get(e);typeof n==`function`&&setTimeout(n,0,...t)}function L(e,t,...n){if(P.filterObservers){if(Array.isArray(t)){if(t=t.filter(e=>!e.observer),!t.length)return}else if(t.observer)return}I(e,t,...n)}function R(e){return Object.assign({},e)}function kn(e){return e.slice()}var An;(function(e){function t(e,t){I(`onLocalStream`,e,R(t))}e.onLocalStream=t;function n(e,t){I(`onScreenStream`,e,R(t))}e.onScreenStream=n;function r(e,t){I(`onVmojiStream`,e,R(t))}e.onVmojiStream=r;function i(e){I(`onVmojiError`,e)}e.onVmojiError=i;function a(e,t){I(`onLocalStreamUpdate`,R(e),t)}e.onLocalStreamUpdate=a;function o(e){B.debug(`Local status:`,e),I(`onLocalStatus`,e)}e.onLocalStatus=o;function s(e,t){L(`onRemoteStream`,e,t)}e.onRemoteStream=s;function c(e,t){L(`onRemoteLive`,e,t)}e.onRemoteLive=c;function l(e,t){L(`onLocalLive`,e,t)}e.onLocalLive=l;function u(e,t){L(`onRemoteLiveUpdate`,e,t)}e.onRemoteLiveUpdate=u;function d(e,t){L(`onLocalLiveUpdate`,e,t)}e.onLocalLiveUpdate=d;function f(e,t){L(`onRemoteScreenStream`,e,t)}e.onRemoteScreenStream=f;function p(e,t){L(`onRemoteVmojiStream`,e,t)}e.onRemoteVmojiStream=p;function m(e,t,n){L(`onRemoteStreamSuspended`,e,t,n)}e.onRemoteStreamSuspended=m;function h(e,t,n,r,i){L(`onConversation`,e,R(t),R(n),r,i)}e.onConversation=h;function ee(e){e&&I(`onConversationParticipantListChunk`,e)}e.onConversationParticipantListChunk=ee;function te(e,t,n){L(`onRemoteMediaSettings`,e,R(t),n)}e.onRemoteMediaSettings=te;function g(e,t){L(`onLocalMediaSettings`,e,R(t))}e.onLocalMediaSettings=g;function _(e,t,n){L(`onRemoteSharedMovieInfo`,e,R(t),n)}e.onRemoteSharedMovieInfo=_;function ne(e,t,n){L(`onRemoteSharedMovieStoppedInfo`,e,R(t),n)}e.onRemoteSharedMovieStoppedInfo=ne;function v(e,t,n){L(`onLocalSharedMovieInfo`,e,R(t),n)}e.onLocalSharedMovieInfo=v;function y(e,t,n){L(`onLocalSharedMovieStoppedInfo`,e,R(t),n)}e.onLocalSharedMovieStoppedInfo=y;function b(e,t,n){L(`onRemoteSharedUrl`,e,t,n)}e.onRemoteSharedUrl=b;function x(e,t){L(`onParticipantAdded`,e,t)}e.onParticipantAdded=x;function re(e,t){L(`onParticipantJoined`,e,t)}e.onParticipantJoined=re;function ie(e,t=!1){I(`onLocalParticipantState`,R(e),t)}e.onLocalParticipantState=ie;function ae(e,t,n){L(`onRemoteParticipantState`,e,R(t),n)}e.onRemoteParticipantState=ae;function oe(e,t){I(`onRemoteParticipantsState`,e,t)}e.onRemoteParticipantsState=oe;function se(e,t,n=null){B.debug(`Remote status:`,t,e),L(`onRemoteStatus`,e,t,n)}e.onRemoteStatus=se;function ce(){I(`onPermissionsRequested`)}e.onPermissionsRequested=ce;function S(e,t){I(`onPermissionsError`,e,t)}e.onPermissionsError=S;function le(e,t){L(`onRemoteRemoved`,e,t)}e.onRemoteRemoved=le;function ue(e,t,n){I(`onCallState`,e,t,R(n))}e.onCallState=ue;function de(e,t){I(`onDeviceSwitched`,e,t)}e.onDeviceSwitched=de;function fe(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null){let u=c?kn(c):void 0;I(`onMuteStates`,R(e),kn(t),kn(n),r,i,a,o,s,u,l)}e.onMuteStates=fe;function pe(e,t,n=!1){L(`onRolesChanged`,e,kn(t),n)}e.onRolesChanged=pe;function me(e,t=!1){I(`onLocalRolesChanged`,kn(e),t)}e.onLocalRolesChanged=me;function he(e,t,n,r){L(`onPinnedParticipant`,e,t,n,r)}e.onPinnedParticipant=he;function ge(e,t){I(`onLocalPin`,e,t)}e.onLocalPin=ge;function _e(e){I(`onOptionsChanged`,kn(e))}e.onOptionsChanged=_e;function ve(){I(`onCallAccepted`)}e.onCallAccepted=ve;function ye(e,t){L(`onAcceptedCall`,e,t)}e.onAcceptedCall=ye;function be(){I(`onRateNeeded`)}e.onRateNeeded=be;function xe(e){L(`onSpeakerChanged`,e)}e.onSpeakerChanged=xe;function Se(e){I(`onVolumesDetected`,kn(e))}e.onVolumesDetected=Se;function Ce(e,t){I(`onLocalVolume`,e,t)}e.onLocalVolume=Ce;function we(e,t){I(`onJoinStatus`,e,t)}e.onJoinStatus=we;function Te(e,t){I(`onHangup`,e,t)}e.onHangup=Te;function Ee(e){I(`onMultipartyChatCreated`,R(e))}e.onMultipartyChatCreated=Ee;function De(){I(`onDeviceChange`)}e.onDeviceChange=De;function Oe(e){I(`onFingerprintChange`,e)}e.onFingerprintChange=Oe;function ke(){I(`onTokenExpired`)}e.onTokenExpired=ke;function Ae(e,t,n=!1){I(`onChatMessage`,e,t,n)}e.onChatMessage=Ae;function je(e,t,n=!1){I(`onCustomData`,e,t,n)}e.onCustomData=je;function Me(e,t,n,r,i,a,o=null){I(`onRecordStarted`,e,t,n,r,i,a,o)}e.onRecordStarted=Me;function Ne(e=null,t){I(`onRecordStopped`,e,t)}e.onRecordStopped=Ne;function Pe(e){I(`onLocalNetworkStatusChanged`,e)}e.onLocalNetworkStatusChanged=Pe;function Fe(e){I(`onNetworkStatusChanged`,e)}e.onNetworkStatusChanged=Fe;function Ie(e,...t){I(`onDebugMessage`,e,...t)}e.onDebugMessage=Ie;function Le(e,t){I(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=Le;function Re(){I(`onAutoplayError`)}e.onAutoplayError=Re;function ze(e,t,n,r,i){I(`onChatRoomUpdated`,e,t,n,r,i)}e.onChatRoomUpdated=ze;function Be(e){I(`onPromoted`,e)}e.onPromoted=Be;function Ve(e){I(`onRemoteMixedAudioStream`,e)}e.onRemoteMixedAudioStream=Ve;function He(e){I(`onJoinLinkChanged`,e)}e.onJoinLinkChanged=He;function Ue(e){I(`onRoomsUpdated`,e)}e.onRoomsUpdated=Ue;function We(e,t,n,r){I(`onRoomUpdated`,e,t,n,r)}e.onRoomUpdated=We;function Ge(e){I(`onRoomParticipantsUpdated`,e)}e.onRoomParticipantsUpdated=Ge;function Ke(e){I(`onRoomSwitched`,e)}e.onRoomSwitched=Ke;function qe(e){I(`onRoomStart`,e)}e.onRoomStart=qe;function Je(e,t=null){I(`onFeedback`,e,t)}e.onFeedback=Je;function Ye(e){I(`onFeaturesPerRoleChanged`,e)}e.onFeaturesPerRoleChanged=Ye;function Xe(e){I(`onParticipantVmojiUpdate`,e)}e.onParticipantVmojiUpdate=Xe;function Ze(e,t){I(`onAsrSet`,e,t)}e.onAsrSet=Ze;function Qe(e,t,n){I(`onAsrStarted`,e,t,n)}e.onAsrStarted=Qe;function $e(e){I(`onAsrStopped`,e)}e.onAsrStopped=$e;function et(e,t,n,r){I(`onAsrTranscription`,e,t,n,r)}e.onAsrTranscription=et;function tt(e,t){I(`onParticipantIdChanged`,e,t)}e.onParticipantIdChanged=tt;function nt(e){I(`onVideoSuspendSuggest`,e)}e.onVideoSuspendSuggest=nt;function rt(e){I(`onSignalingMessage`,typeof e==`string`?e:R(e))}e.onSignalingMessage=rt;function it(e){I(`onPromotionApproved`,e)}e.onPromotionApproved=it;function at(){I(`onPeerRegistered`)}e.onPeerRegistered=at})(An||(An={}));var z=An,jn=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),Mn;(function(e){let t=`📞`,n=(e,...t)=>{z.onDebugMessage(e,...t)},r=!1,i=(e,t)=>(...n)=>{e(...n),Ve(t,n)},a=console.debug.bind(console,t),o=console.log.bind(console,t),s=console.warn.bind(console,t),c=console.error.bind(console,t),l=n.bind(null,`DEBUG`),u=n.bind(null,`LOG`),d=n.bind(null,`WARN`),f=n.bind(null,`ERROR`),p=l,m=u,h=d,ee=f;function te(...e){p(...e)}e.debug=te;function g(...e){m(...e)}e.log=g;function _(...e){h(...e)}e.warn=_;function ne(...e){ee(...e)}e.error=ne;function v(){return r}e.enabled=v;function y(e){r=e,P.debugLog&&He(),e?(p=P.debugLog?i(a,`DEBUG`):a,m=P.debugLog?i(o,`LOG`):o,h=P.debugLog?i(s,`WARN`):s,ee=P.debugLog?i(c,`ERROR`):c):(p=P.debugLog?i(l,`DEBUG`):l,m=P.debugLog?i(u,`LOG`):u,h=P.debugLog?i(d,`WARN`):d,ee=P.debugLog?i(f,`ERROR`):f)}e.toggle=y;function b(e,...t){switch(e){case`DEBUG`:te(...t);break;case`LOG`:g(...t);break;case`WARN`:_(...t);break;case`ERROR`:ne(...t);break}}e.send=b;function x(e,...t){}e.test=x})(Mn||(Mn={}));var B=Mn;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 V=function(e){return e.CAMERA=`CAMERA`,e.SCREEN=`SCREEN`,e.STREAM=`STREAM`,e.MOVIE=`MOVIE`,e.ANIMOJI=`ANIMOJI`,e.SHARED_URL=`SHARED_URL`,e}({}),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:N.compose(n,a),mediaType:r,streamName:i}}function Bn(e){for(let t of Object.keys(V))if(t===e)return V[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(){g(this,`participantIdRegistry`,null)}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 yn(e)):Un(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==tr){B.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==nr){B.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:B.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:x.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:x.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:n}}},H=function(e){return 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.CALL_START=`call_start`,e.SIGNALING_PING_SUMMARY=`signaling_ping_summary`,e.SIGNALING_COMMAND_SUMMARY=`signaling_command_summary`,e.WEBSOCKET_CONNECTED=`websocket_connected`,e.WEBSOCKET_RECONNECTED=`websocket_reconnected`,e.WEBSOCKET_FAILED_PINGS=`websocket_failed_pings`,e.WEBSOCKET_FAILED_EXCEPTION=`websocket_failed_exception`,e.WEBSOCKET_TIMEOUT=`websocket_timeout`,e.WEBSOCKET_RESTART=`websocket_restart`,e.WEBTRANSPORT_CONNECTED=`webtransport_connected`,e.WEBTRANSPORT_RECONNECTED=`webtransport_reconnected`,e.WEBTRANSPORT_FAILED_PINGS=`webtransport_failed_pings`,e.WEBTRANSPORT_FAILED_EXCEPTION=`webtransport_failed_exception`,e.WEBTRANSPORT_TIMEOUT=`webtransport_timeout`,e.WEBTRANSPORT_RESTART=`webtransport_restart`,e}(H||{}),or=1e3;function U(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]]=N.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),i=n?e.filter(sr(cr(`type`,`remote-inbound-rtp`))):e.filter(sr(cr(`type`,`inbound-rtp`),cr(`type`,`outbound-rtp`)));return k.browserName()===`Firefox`&&(i=Object.values(i.reduce((e,t)=>{if(!e[t.ssrc])e[t.ssrc]=t;else{let n=Object.assign({},e[t.ssrc],t),r=e[t.ssrc].isRemote?t:e[t.ssrc];n.id=r.id,n.type=r.type,delete n.isRemote,delete n.remoteId,e[n.ssrc]=n}return e},{}))),i.map(e=>{let n=Number(e.ssrc),i=e.mediaType||e.kind,a=e.remoteId||e.trackId,o=e.type,s=e.codecId;if(!o||!n||!i)return null;let c={ssrc:n,type:o,kind:i,bytesReceived:U(e,`bytesReceived`),bytesSent:U(e,`bytesSent`),headerBytesReceived:U(e,`headerBytesReceived`),headerBytesSent:U(e,`headerBytesSent`),jitter:U(e,`jitter`),packetsLost:U(e,`packetsLost`),packetsReceived:U(e,`packetsReceived`),packetsSent:U(e,`packetsSent`),fractionLost:U(e,`fractionLost`),pliCount:U(e,`pliCount`),firCount:U(e,`firCount`),nackCount:U(e,`nackCount`),userId:t[n],freezeCount:U(e,`freezeCount`,0),totalFreezesDuration:U(e,`totalFreezesDuration`,0)},l=`mid`in e&&typeof e.mid==`string`?e.mid:void 0,u=`rid`in e&&typeof e.rid==`string`?e.rid:void 0;if(l&&(c.mid=l),u&&(c.rid=u),i===`video`){let t=U(e,`framesDecoded`),n=U(e,`totalInterFrameDelay`),r=U(e,`totalSquaredInterFrameDelay`),i=U(e,`encoderImplementation`),a=U(e,`decoderImplementation`);i&&(c.encoderImplementation=i),a&&(c.decoderImplementation=a),c.interframeDelayVariance=(r-n*n/t)/t}if(i===`video`&&c.type===`outbound-rtp`&&(c.totalEncodeTime=U(e,`totalEncodeTime`)??0),i===`audio`&&(c.totalSamplesReceived=U(e,`totalSamplesReceived`),c.concealedSamples=U(e,`concealedSamples`),c.insertedSamplesForDeceleration=U(e,`insertedSamplesForDeceleration`),c.removedSamplesForAcceleration=U(e,`removedSamplesForAcceleration`),c.silentConcealedSamples=U(e,`silentConcealedSamples`),c.concealmentEvents=U(e,`concealmentEvents`),c.totalAudioEnergy=U(e,`totalAudioEnergy`)),s&&r[s]){let e=r[s];c.clockRate=e.clockRate,c.mimeType=e.mimeType,i===`audio`&&e.sdpFmtpLine&&(c.sdpFmtpLine=e.sdpFmtpLine)}if(a&&r[a]){let e=r[a];c.frameHeight=e.frameHeight,c.frameWidth=e.frameWidth,c.framesDecoded=e.framesDecoded,c.framesReceived=e.framesReceived,c.framesDropped=e.framesDropped}return fr(c)}).filter(e=>!!e)}function _r(e,t,n=!1){if(!t||!t.rtps||!e.rtps)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===j.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 N.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`${H.SCREENSHARE_FIRST_FRAME}_${Cr(e)}`}function Cr(e){return typeof e==`string`?e:JSON.stringify(e)}var W={distinctById:dr,rtcStatsToArray:pr,extractTransport:hr,extractRtps:gr,delta:_r,collectStats:vr,setMark:yr,clearMark:br,measureMark:xr,getMarkNameScreenshareFirstFrame:Sr},wr=class e{constructor(){g(this,`_eventualLogs`,new Set)}static create(){e._instance=new e}static logCallStat(t){if(e._instance?._eventualLogs.size){for(let n of e._instance._eventualLogs)Object.assign(n,{call_topology:t.call_topology,local_address:t.local_address,local_connection_type:t.local_connection_type,network_type:t.network_type,remote_address:t.remote_address,remote_connection_type:t.remote_connection_type,transport:t.transport}),b.logClientStats(n);e._instance._eventualLogs.clear()}b.logClientStats(t)}static logEventualStat(t){t.value===void 0&&(t.value=W.measureMark(t.name)),t.value!==null&&e._instance?._eventualLogs.add(t)}static destroy(){e._instance?._destroy(),e._instance=null}_destroy(){this._eventualLogs.clear()}};g(wr,`_instance`,null);var Tr=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),Er=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}({}),Dr={connected:{wt:H.WEBTRANSPORT_CONNECTED,ws:H.WEBSOCKET_CONNECTED},reconnected:{wt:H.WEBTRANSPORT_RECONNECTED,ws:H.WEBSOCKET_RECONNECTED},failed_pings:{wt:H.WEBTRANSPORT_FAILED_PINGS,ws:H.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:H.WEBTRANSPORT_FAILED_EXCEPTION,ws:H.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:H.WEBTRANSPORT_TIMEOUT,ws:H.WEBSOCKET_TIMEOUT},restart:{wt:H.WEBTRANSPORT_RESTART,ws:H.WEBSOCKET_RESTART}},Or=class{constructor(e){if(g(this,`q`,void 0),g(this,`inits`,[]),g(this,`n`,[1,2,3,4,5]),g(this,`np`,[1,1,1,1,1]),g(this,`qv`,[]),!(e>0&&e<1))throw Error(`q must be in (0,1)`);this.q=e}add(e){if(this.inits.length<5){this.inits.push(e),this.inits.length===5&&this.bootstrap();return}let t=0;if(e<this.qv[0])this.qv[0]=e,t=0;else if(e>=this.qv[4])this.qv[4]=e,t=3;else for(;!(e<this.qv[t+1]);)t++;for(let e=0;e<5;e++)this.n[e]+=e<=t?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let e=1;e<=3;e++){let t=this.np[e]-this.n[e];if(t>=1&&this.n[e+1]-this.n[e]>1||t<=-1&&this.n[e]-this.n[e-1]>1){let n=Math.sign(t),r=this.qv[e]+n/(this.n[e+1]-this.n[e-1])*((this.n[e]-this.n[e-1]+n)*(this.qv[e+1]-this.qv[e])/(this.n[e+1]-this.n[e])+(this.n[e+1]-this.n[e]-n)*(this.qv[e]-this.qv[e-1])/(this.n[e]-this.n[e-1]));r>this.qv[e-1]&&r<this.qv[e+1]?this.qv[e]=r:this.qv[e]=this.qv[e]+n*(this.qv[e+n]-this.qv[e])/(this.n[e+n]-this.n[e]),this.n[e]+=n}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let e=[...this.inits].sort((e,t)=>e-t),t=this.q*(e.length-1),n=Math.floor(t),r=t-n;return n+1<e.length?e[n]*(1-r)+e[n+1]*r:e[n]}return this.qv[2]}bootstrap(){this.inits.sort((e,t)=>e-t),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}},kr=class{constructor(){g(this,`n`,0),g(this,`mean`,0)}add(e){this.n++;let t=e-this.mean;this.mean+=t/this.n}get avg(){return this.n?this.mean:NaN}},Ar=class{constructor(){g(this,`count`,0),g(this,`minVal`,1/0),g(this,`maxVal`,-1/0),g(this,`mean`,new kr),g(this,`p50`,new Or(.5)),g(this,`p95`,new Or(.95))}add(e){e<this.minVal&&(this.minVal=e),e>this.maxVal&&(this.maxVal=e),this.mean.add(e),this.p50.add(e),this.p95.add(e),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}},jr=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(jr||{}),G=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.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}(G||{}),Mr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(Mr||{}),{isObject:Nr,isObjectsEquals:Pr}=N;function Fr(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||Nr(e.bitrates)&&Nr(t.bitrates)&&!Pr(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Ir=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Lr(e,t){return!(!Fr(e.camera,t.camera)||!Fr(e.screenSharing,t.screenSharing)||!Fr(e.fastScreenSharing,t.fastScreenSharing))}function Rr(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 zr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Br=class e{constructor(){g(this,`_codecUsages`,new Map),g(this,`getCurrentTransportTopology`,()=>void 0)}static create(t){let n=new e;n.getCurrentTransportTopology=t,e._instance=n}static reportUsage(t){let n=e._instance,r=n?.getCurrentTransportTopology();if(!n||!r)return;let i=t.rtps.filter(e=>e.type===`outbound-rtp`&&!e.mid?.endsWith(`s`));P.simulcast&&(i=i.reduce((e,t)=>{if(t.kind!==`video`)return e.concat(t);let n=e.find(e=>e.kind===`video`);return n?n.totalEncodeTime=(n.totalEncodeTime??0)+(t.totalEncodeTime??0):e.push(t),e},[])),i.forEach(e=>{let t=e.kind,i=e.mimeType;if((t===`audio`||t===`video`)&&i){let a=[i,`encoder`,e.encoderImplementation].filter(Boolean).join(`/`);n.saveUsage({kind:t,codecName:a,totalEncodeTime:(e.totalEncodeTime??0)*1e3,audioCodecParams:e.sdpFmtpLine,topology:r})}})}saveUsage({kind:e,codecName:t,totalEncodeTime:n,audioCodecParams:r,topology:i}){let a=this._codecUsages.get(e);if(a&&a.codecName!==t&&this.report(a),a&&a.codecName===t){this._codecUsages.set(e,{...a,totalEncodeTime:n,topology:i});return}this._codecUsages.set(e,{kind:e,codecName:t,audioCodecParams:r,totalEncodeTime:n,topology:i})}report(e){if(e.kind===`video`&&e.totalEncodeTime===0)return;let t={name:H.CODEC_USAGE,codec_implementation:e.codecName,value:e.totalEncodeTime,call_topology:e.topology===J.DIRECT?`D`:`S`};e.audioCodecParams&&(t.string_value=e.audioCodecParams),b.logClientStats(t)}static destroy(){e._instance?._destroy(),e._instance=null}_destroy(){this._codecUsages.forEach(e=>{this.report(e)}),this._codecUsages.clear()}};g(Br,`_instance`,null);var Vr=class extends _{constructor(e,t){super(),g(this,`_signaling`,void 0),g(this,`_mediaSource`,void 0),g(this,`_state`,q.IDLE),g(this,`_pc`,null),this._signaling=e,this._mediaSource=t}getState(){return this._state||q.IDLE}},Hr=`videochat-epi`,Ur=5e3,Wr=500,Gr=class extends _{constructor(e,t,n=!1){super(),g(this,`_previousPerfStatReportTimestamp`,0),g(this,`_previousNetworkStatReportTimestamp`,Date.now()),g(this,`_previousCallStatReportTimestamp`,Date.now()),g(this,`_previousCallStatReport`,null),g(this,`_screenShareStats`,[]),g(this,`_signaling`,void 0),g(this,`_directTopology`,void 0),g(this,`_handleScreenSharingStat`,e=>{this._screenShareStats.push(e)}),g(this,`_handleTransportStateChanged`,e=>{(this._directTopology&&e===q.CONNECTED||!this._directTopology&&e===q.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())}),this._signaling=t,this._directTopology=n,this.subscribe(e,K.REMOTE_DATA_STATS,this._handleStats.bind(this)),this.subscribe(e,K.SCREEN_SHARING_STAT,this._handleScreenSharingStat.bind(this)),this.subscribe(e,K.STATE_CHANGED,this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(Hr)||``,10);return isNaN(e)?0:e}catch{return 0}}async _handleStats(e){if(!e.inbound||!e.inbound.rtps)return;let t=Date.now();!this._directTopology&&P.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+Ur<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+Wr<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),P.callStatReportEnabled&&this._previousCallStatReportTimestamp+P.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((e,t)=>(t.kind===`video`&&(e.framesDecoded+=t.framesDecoded||0,e.framesReceived+=t.framesReceived||0),e),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let e=await this._signaling.reportPerfStat(t);localStorage.setItem(Hr,e.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0)};if(t.timestamp)try{await this._signaling.reportNetworkStat(t)}catch{}}_reportCallStats(e){let t={call_topology:this._directTopology?`D`:`S`,stat_time_delta:0,nack_received:0,pli_received:0,fir_received:0,frames_dropped:0,jitter_video:0,jitter_audio:0,interframe_delay_variance:0,nack_sent:0,pli_sent:0,fir_sent:0,total_audio_samples_received:0,concealed_audio_samples:0,silent_concealed_audio_samples:0,inserted_audio_samples_for_deceleration:0,removed_audio_samples_for_acceleration:0,audio_concealment_events:0,total_audio_energy:0,inbound_video_count:0,inbound_audio_count:0,packets_lost_video:0,packets_sent_video:0,packets_lost_audio:0,packets_sent_audio:0,freeze_count:0,total_freezes_duration:0,rtt:Math.round(e.inbound.transport.currentRoundTripTime*1e3),ss_freeze_count:0,ss_total_freezes_duration:0,local_address:qr(e.inbound.transport.local),local_connection_type:e.inbound.transport.local?.type,network_type:e.inbound.transport.local?.networkType,transport:e.inbound.transport.local?.protocol,remote_address:qr(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let n=!1,r=!1;for(e.inbound.rtps.reduce((e,t)=>(t.kind===`video`?(n=!0,t.framesReceived&&(e.jitter_video=e.jitter_video*e.inbound_video_count/(e.inbound_video_count+1)+t.jitter*1e3/(e.inbound_video_count+1),e.interframe_delay_variance=e.interframe_delay_variance*e.inbound_video_count/(e.inbound_video_count+1)+(t.interframeDelayVariance||0)*1e6/(e.inbound_video_count+1),e.inbound_video_count++),e.frames_dropped+=t.framesDropped||0,e.nack_sent+=t.nackCount,e.pli_sent+=t.pliCount,e.fir_sent+=t.firCount,e.freeze_count+=t.freezeCountDelta||0,e.total_freezes_duration+=t.totalFreezesDurationDelta||0):(r=!0,t.totalSamplesReceived&&(e.jitter_audio=e.jitter_audio*e.inbound_audio_count/(e.inbound_audio_count+1)+t.jitter*1e3/(e.inbound_audio_count+1),e.total_audio_energy=e.total_audio_energy*e.inbound_audio_count/(e.inbound_audio_count+1)+(t.totalAudioEnergy||0)/(e.inbound_audio_count+1),e.inbound_audio_count++),e.total_audio_samples_received+=t.totalSamplesReceived||0,e.inserted_audio_samples_for_deceleration+=t.insertedSamplesForDeceleration||0,e.removed_audio_samples_for_acceleration+=t.removedSamplesForAcceleration||0,e.concealed_audio_samples+=t.concealedSamples||0,e.silent_concealed_audio_samples+=t.silentConcealedSamples||0,e.audio_concealment_events+=t.concealmentEvents||0),e),t),e.outbound.rtps.reduce((e,t)=>(t.kind===`video`?(e.nack_received+=t.nackCount,e.pli_received+=t.pliCount,e.fir_received+=t.firCount,e.packets_sent_video+=t.packetsSent):e.packets_sent_audio+=t.packetsSent,e),t),e.remoteInbound.rtps.reduce((e,t)=>(t.kind===`video`?e.packets_lost_video+=t.packetsLost:e.packets_lost_audio+=t.packetsLost,e),t);this._screenShareStats.length;){let e=this._screenShareStats.pop();e?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=e.freeze_duration)}let i={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(P.simulcast&&(i.is_simulcast=!0),navigator.hardwareConcurrency&&(i.cpu_hardware_concurrency=navigator.hardwareConcurrency),n&&!Jr(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!Jr(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!Jr(t.interframe_delay_variance)&&(i.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(i.freeze_count=t.freeze_count,i.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(i.ss_freeze_count=t.ss_freeze_count,i.ss_total_freezes_duration=t.ss_total_freezes_duration),r&&!Jr(t.total_audio_samples_received)){let e=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),n=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),r=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),a=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),o=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),s=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);i.inserted_audio_samples_for_deceleration=Yr(n/e*1e3),i.removed_audio_samples_for_acceleration=Yr(r/e*1e3),i.concealed_audio_samples=Yr(a/e*1e3),i.concealed_silent_audio_samples=Yr(o/e*1e3),i.concealment_audio_avg_size=Yr(a/s),i.total_audio_energy=t.total_audio_energy}Kr(t,`local_address`,`local_connection_type`,`network_type`,`transport`)&&(i.local_address=t.local_address,i.local_connection_type=t.local_connection_type,i.network_type=t.network_type,i.transport=t.transport),Kr(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),o=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);a>0&&(i.video_loss=Yr(Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video)/a*100)),o>0&&(i.audio_loss=Yr(Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio)/o*100)),wr.logCallStat(i),P.enableLogPerfStatReport&&B.log(`Sent call stats`,i),this._previousCallStatReport=t}};function Kr(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function qr(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function Jr(e){return e===void 0}function Yr(e){return Number.isNaN(e)?0:e}var Xr=class{constructor(e,t=null){g(this,`weightUp`,void 0),g(this,`weightDown`,void 0),g(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}},Zr=.25,Qr=.35,$r=85,ei=.1,ti=1.5,ni=.1,ri=1,ii=.6,ai=.3,oi=class extends _{constructor(e){super(),g(this,`_signaling`,void 0),g(this,`_localNetworkStat`,void 0),g(this,`_remoteNetworkStat`,void 0),g(this,`_lastNetworkStat`,void 0),g(this,`_networkLimits`,{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}}),g(this,`_lastStatSentTimestamp`,0),g(this,`_currentState`,`good`),this._signaling=e,this._localNetworkStat={rtt:new Xr(Zr,Zr),loss:new Xr(Qr,Qr),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)/$r);for(let e=0;e<r;e++)n*=1-ei;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)/ti);for(let e=0;e<r;e++)n*=1-ni;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*ri;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>=ii?`good`:e>=ai?`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>P.networkStatisticsInterval)&&(this._lastStatSentTimestamp=a,this._signaling.customData({sdk:Object.assign({type:`bad-net`},i)},null).catch(e=>{B.warn(`Unable to send [bad-net]`,e)})),this._currentState=c,this._triggerEvent(K.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}},si=30*1e3,ci=class e extends Vr{constructor(e,t,n,r,i){super(n,r),g(this,`_participantId`,void 0),g(this,`_isMaster`,void 0),g(this,`_remoteSDP`,{}),g(this,`_remoteCandidates`,{}),g(this,`_lastRemoteSDP`,null),g(this,`_animojiDataChannel`,null),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),g(this,`_remoteAnimojiVersion`,1),g(this,`_isOpen`,!1),g(this,`_remotePeerId`,null),g(this,`_statInterval`,null),g(this,`_settingsInterval`,null),g(this,`_failedOnCreate`,null),g(this,`_remoteStream`,null),g(this,`_iceRestartTimeout`,null),g(this,`_reconnectionTimeout`,null),g(this,`_reconnectionPrevented`,!1),g(this,`_lastStat`,void 0),g(this,`_fingerprint`,null),g(this,`_neverConnected`,!0),g(this,`_serverSettings`,void 0),g(this,`_prevConsumerSettings`,{}),g(this,`_networkLimitsForVideo`,{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}}),g(this,`_videoMaxDimensionsForNet`,{worst:320,bad:640,good:1280}),g(this,`_lastVideoMaxDimension`,this._videoMaxDimensionsForNet.good),g(this,`_lastBadConnection`,0),g(this,`_perfStatReporter`,void 0),g(this,`_directStatReporter`,void 0),this._participantId=e,this._isMaster=t,this._serverSettings=i,this._perfStatReporter=new Gr(this,n,!0),this._directStatReporter=new oi(n),this.subscribe(this._signaling,jr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,sn.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,sn.SOURCE_CHANGED,this._applySettings.bind(this)),this.subscribe(this._directStatReporter,K.NETWORK_STATUS,this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:P.iceServers,iceTransportPolicy:P.forceRelayPolicy?`relay`:`all`})}catch(e){B.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}if(this._pc.onicecandidate=this._handleIceCandidate.bind(this),this._pc.ontrack=this._onAddTrack.bind(this),this._pc.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),this._pc.onconnectionstatechange=this._onConnectionStateChange.bind(this),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},P.vmoji&&this._createDataChannel(this._pc,Mr.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){b.log(E.ERROR,`addTrack-direct`),B.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[q.IDLE,q.CLOSED,q.FAILED].includes(this.getState())}async open(e=null){if(this._isOpen){B.warn(`DirectTransport: Already opened`,{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(B.debug(`DirectTransport: Open transport`,{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){b.log(E.ERROR,`addTrack-direct`),B.error(`DirectTransport: Unable to add media source tracks`,e,{participantId:this._participantId}),this.close(e);return}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){Lr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(P.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._isOpen=!1,this._stopReconnection(),this._remoteStream&&(this._remoteStream.getTracks().forEach(e=>{e.stop(),this._triggerEvent(K.REMOTE_TRACK_REMOVED,this._remoteStream,e)}),this._remoteStream=null),this._stopStatInterval(),this._stopSettingsInterval(),this._pc&&(this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close()),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),this._onNetworkStatus(1),this.unsubscribe(),e?(B.error(`DirectTransport: Closed`,e,{participantId:this._participantId}),this._setState(q.FAILED)):(B.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(q.CLOSED)),this._triggerEvent(K.PEER_CONNECTION_CLOSED))}_setState(e){this._state!==e&&(B.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent(K.STATE_CHANGED,e))}_onSignalingNotification(e){switch(e.notification){case G.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case G.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case G.CUSTOM_DATA:Object.hasOwn(e.data,`sdk`)&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,n=N.getPeerIdString(e.peerId);N.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(n,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(n,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){B.debug(`Add remote ice candidate`,{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(e){throw b.log(E.ERROR,`addIceCandidate-direct`),B.error(`Unable to add remote ice candidate`,e,{participantId:this._participantId,candidate:t}),e}}else B.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]){B.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),B.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 b.log(E.ERROR,`setRemoteDescription-direct`),B.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,P.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){B.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(K.REMOTE_TRACK_REMOVED,this._remoteStream,e.track)}),this._triggerEvent(K.REMOTE_TRACK_ADDED,this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(B.debug(`Local ice candidate`,{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){B.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:P.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(B.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`:k.browserName()===`Safari`&&this._pc?.connectionState!==`connected`&&this._markConnected();break}}_markConnected(){this._neverConnected=!1,this._setState(q.CONNECTED),this._stopReconnection(),this._pc&&N.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(b.log(E.ICE_CONNECTION_TYPE,e.local.type),B.debug(`Selected ICE candidates`,e))}),this._startStatInterval()}_onConnectionStateChange(){switch(B.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),b.log(E.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case`connected`:this._markConnected();break;case`failed`:case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection ${this._pc.connectionState}`)):(this._setState(q.RECONNECTING),this._startReconnection());break;case`closed`:this.close(Error(`Ice connection closed`));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(B.log(`Waiting for reconnection...`,{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},P.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(B.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(J.SERVER))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(b.log(E.ICE_RESTART),B.log(`Ice restart`,{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):B.debug(`Waiting for ice restart...`,{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,B.error(`Ice restart failed`,{participantId:this._participantId}),b.log(E.ERROR,`iceRestart-direct`),this._requestTopologySwitch()},P.iceRestartWaitTime)}async _createOffer(t){let n={iceRestart:t,offerToReceiveAudio:!0,offerToReceiveVideo:!0};B.debug(`Create offer`,{participantId:this._participantId,options:n});let r;try{r=await this._pc?.createOffer(n),B.debug(`Created offer`,{participantId:this._participantId,offer:r}),r=e._patchLocalDescription(r)}catch(e){throw B.error(`Unable to create offer`,e,{participantId:this._participantId}),b.log(E.ERROR,`createOffer-direct`),e}try{return B.debug(`Set local description`,{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(e){throw B.error(`Unable to set local description`,e,{participantId:this._participantId}),b.log(E.ERROR,`setLocalDescription-direct`),e}}async _createAnswer(){B.debug(`Create answer`,{participantId:this._participantId});let t;try{t=await this._pc?.createAnswer(),B.debug(`Created answer`,{participantId:this._participantId,answer:t}),t=e._patchLocalDescription(t)}catch(e){throw B.error(`Unable to create answer`,e,{participantId:this._participantId}),b.log(E.ERROR,`createAnswer-direct`),e}try{return B.debug(`Set local description`,{participantId:this._participantId,answer:t}),this._calcFingerprint(t.sdp),await this._pc?.setLocalDescription(t),t}catch(e){throw B.error(`Unable to set local description`,e,{participantId:this._participantId}),b.log(E.ERROR,`setLocalDescription-direct`),e}}static _patchLocalDescription(e){let t=!!k.baseChromeVersion();return e.sdp=N.patchLocalSDP(e.sdp,P.preferH264&&k.canPreferH264(),k.isBrokenH264Decoder(),P.preferVP9,t&&P.audioNack),e}static _patchRemoteDescription(e){return e.sdp=N.patchRemoteSDP(e.sdp,!1,!1,!1,P.preferVP9,k.isBrokenVP9Encoder(),k.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=>{B.error(`DirectTransport: Unable to replace track`,e,{participantId:this._participantId}),b.log(E.ERROR,`replaceTrack-direct`)})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}W.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,Br.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(K.REMOTE_DATA_STATS,n),this._statInterval=window.setTimeout(e,P.statisticsInterval)})};this._statInterval=window.setTimeout(e,P.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:k.browserName()===`Firefox`?`transmission`:`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 B.warn(`Failed to get encodingInfo`,a,e),!1}}async _checkPPTNetwork(e){if(!P.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=Ir.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=Ir.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=Ir.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Ir.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>si)||this._lastVideoMaxDimension===a)return;let s=this._serverSettings.camera;if(!s||!await this._isSVCSupported(e,o))return;B.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a}),this._lastVideoMaxDimension=a;let c={...this._serverSettings,camera:{...s,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(c)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[``]=e,this._triggerEvent(K.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=N.sdpFingerprint(e);if(t===null){B.warn(`Fingerprint calculation is unsupported`);return}this._fingerprint===null?this._fingerprint=t:(z.onFingerprintChange((this._fingerprint^t).toString()),this._fingerprint=null)}_applySettings(){let e=this._mediaSource.getMediaSettings().isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState===`connected`&&(this._prevConsumerSettings=N.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,n){B.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{negotiated:!0,id:1});r.onopen=()=>{let e=r.readyState;e===`open`?(B.debug(`[${t}] data channel opened`),r.onerror=e=>{B.error(`[${t}] data channel error`,e)},n(r)):B.error(`[${t}] data channel open failed, state [${e}]`)}}},li=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),ui=16,di=class e{constructor(e,t,n){g(this,`_datachannel`,void 0),g(this,`_participantIdRegistry`,void 0),g(this,`_asrCallback`,void 0),g(this,`_textDecoder`,void 0),B.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(ui)}}_onDataChannelMessage(t){let n=e.parse(t),r=this._participantIdRegistry?.getStreamDescription(n.ssrc)?.participantId;if(!r){B.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}},fi,pi=class{constructor(){g(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};fi=pi,g(pi,`_instance`,null),g(pi,`getInstance`,()=>(fi._instance||(fi._instance=new fi),fi._instance));var mi=class{constructor(){g(this,`streamDescriptionByCompactId`,new Map),g(this,`compactIdByStreamDescription`,new Map)}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:G.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:G.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:G.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:G.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:G.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:G.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:G.VIDEO_SUSPEND_SUGGEST,bandwidth:u};default:return B.debug(`unsupported message type: `+n),null}}_decodeMediaType(e){if(e===null)return null;switch(e){case 0:return V.CAMERA;case 1:return V.SCREEN;default:throw Error(`Unsupported media type: ${e}`)}}_createParticipantSourcesUpdateNotification(e){let t=(0,l.decode)(e),n=[];for(let[e,r]of Object.entries(t)){let t=r[0],i=r[1],a=r[2],o=!!r[3],s=r[4]===null?void 0:!!r[4],c;if(t!==null){if(c=this.getStreamDescription(t),!c){B.error(`could not uncompress participant ID ${t}`);continue}}else c=null;if(a===null){B.error(`unexpected null sequenceNumber`,e,r);continue}let l=li.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:G.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},hi=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}({}),gi=class{constructor(){g(this,`_worker`,null)}async _createWorker(e,t,n=[],r={},i=[]){return new Promise((a,o)=>{let s=n.join(`,`),c=new Blob([e,`exports.default(${s});`],{type:`application/javascript; charset=utf-8`}),l=window.URL.createObjectURL(c);this._worker=new Worker(l),this._worker.onmessage=e=>{switch(e.data.type){case hi.READY:a();break;case hi.ERROR:o(e.data.error);break;case hi.FRAME:t(e.data);break;case hi.DEBUG:B.debug(e.data.message);break;case hi.LOG_ERROR:b.log(E.ERROR,e.data.message);break}},this._sendToWorker(hi.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}static isBrowserSupported(){throw Error(`Not implemented`)}},_i=class extends gi{async init(e,t,n){B.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?(B.warn(`LibVPxDecoder`,r.error),t(r.error)):r.requestKeyFrame?(B.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(hi.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r,debug:B.enabled()},[t.buffer])}destroy(){this._removeWorker(),B.debug(`LibVPxDecoder destroyed`)}static isBrowserSupported(){return`WebAssembly`in window&&`Worker`in window}},vi=class extends gi{async init(e,t,n){B.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(){self.postMessage({type:t.READY})}function d(e,n,r,i=!1){c={timestamp:e,data:n,isVP9:r,keyFrame:i};let a=p(r);if(o&&!i){self.postMessage({type:t.FRAME,error:`WebCodecsDecoder waiting for keyframe`}),f();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});try{a.decode(l)}catch(e){m(`because failed call decode: ${e.message}`);return}h(i)}self.onmessage=e=>{switch(e.data.type){case t.INIT:u();break;case t.FRAME:d(e.data.timestamp,e.data.data,e.data.isVP9,e.data.keyFrame);break}};function f(){s||(self.postMessage({type:t.FRAME,requestKeyFrame:!0}),s=!0)}function p(e){return a!==e&&(a=e,m(`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=>{g();let r=n?[e]:[];self.postMessage({type:t.FRAME,data:e},r),e.close()},error:e=>{g(),m(`because error during decoding: ${e.message}`),i===`prefer-software`?self.postMessage({type:t.FRAME,error:`WebCodecsDecoder failed, reinitialize: `+String(e)}):(i=`prefer-software`,c&&c.keyFrame&&d(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${e.message}`}))}}),r.configure(_(a,i))),r}function m(e){if(r){try{r&&r.state!==`closed`&&r.close()}catch{}r=null,self.postMessage({type:t.FRAME,error:`WebCodecsDecoder reset ${e}`})}}function h(e=!1){l=setTimeout(()=>{m(`because of decode timeout`)},3e3)}function g(){l&&clearTimeout(l),l=null}function _(t,n){return{codec:t?e.VP9:e.VP8,hardwareAcceleration:n}}}})(),exports={default:workerExports};",r=>{r.error?(B.warn(`WebCodecsDecoder`,r.error),t(r.error)):r.requestKeyFrame?(B.debug(`WebCodecsDecoder requests key frame`),n()):(e(r.data),r.data.close())},[k.baseChromeVersion()>=92||k.browserName()===`Safari`])}decodeFrame(e,t,n,r=!1){this._sendToWorker(hi.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r},[t.buffer])}destroy(){this._removeWorker(),B.debug(`WebCodecsDecoder destroyed`)}static isBrowserSupported(){return`VideoDecoder`in window&&`Worker`in window&&`VideoFrame`in window&&!k.isBrokenVP9Decoder()&&k.browserName()!==`Firefox`}},yi=class{constructor(e=null,t=0){g(this,`_counter`,0),g(this,`_interval`,0),g(this,`_lastCalculationTime`,Date.now()),g(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}},bi=class{constructor(e){g(this,`_participantId`,void 0),g(this,`_firstFrameReceived`,!1),this._participantId=e}measure(e,t){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let n=W.getMarkNameScreenshareFirstFrame(this._participantId),r=W.measureMark(n);r!==null&&wr.logEventualStat({name:H.SCREENSHARE_FIRST_FRAME,value:r,width:e,height:t})}},xi=65536,Si=`MARK_SCREENSHARE_FREEZE_DURATION`,Ci=class e{constructor(e,t,n,r){g(this,`_participantId`,void 0),g(this,`_onStream`,void 0),g(this,`_onStat`,void 0),g(this,`_onKeyFrameRequested`,void 0),g(this,`_statScreenShareFirstFrame`,void 0),g(this,`_chunks`,[]),this._participantId=e,this._onStream=t,this._onStat=n,this._onKeyFrameRequested=r,this._statScreenShareFirstFrame=new bi(e)}appendChunk(t){let n=this._chunks.length;if(t.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),n&&(B.warn(`[FrameBuilder] Cleanup buffer`,Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!n||(this._chunks[n-1].sequence+1)%xi!==t.sequence){B.warn(`[FrameBuilder] Got incorrect chunk`);return}if(this._chunks.push(t),t.end){let n=this._processFrameData(),{width:r,height:i}=e.getFrameSize(n);this._processFrame({timestamp:t.timestamp,frameData:n,isVP9:t.isVP9,keyframe:t.keyframe,width:r,height:i}),this._statScreenShareFirstFrame.measure(r,i)}}destroy(){W.clearMark(Si),W.clearMark(W.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let e=this._chunks;this._chunks=[];let t=e.reduce((e,t)=>e+t.data.byteLength,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(new Uint8Array(t.data),r),r+=t.data.byteLength;return n}static getFrameSize(e){let t={width:0,height:0},n=new d.BitStream(e.buffer);n.bigEndian=!0,n.index+=2;let r=n.readBits(1),i=n.readBits(1)<<1|r;return i===3&&n.index++,n.readBits(1)===1||n.readBits(1)!==0?t:(n.index++,n.index++,n.index+=24,i>=2&&n.index++,n.readBits(3)===7?(i===1||i===3)&&n.index++:(n.index++,(i===1||i===3)&&(n.index+=3)),t.width=n.readBits(16)+1,t.height=n.readBits(16)+1,t)}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(e){if(e){W.setMark(Si);return}let t=W.measureMark(Si);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},wi=class{constructor(e){g(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")}},Ti=class extends wi{constructor(e){super(e),g(this,`_useImageBitmap`,void 0),g(this,`_canvas`,null),g(this,`_canvasContext`,null),g(this,`_stream`,null),g(this,`_track`,null),B.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){B.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){B.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(),B.debug(`CanvasRenderer destroyed`)}static isBrowserSupported(){return(`CanvasCaptureMediaStream`in window||`CanvasCaptureMediaStreamTrack`in window)&&!(k.browserName()===`Safari`&&Number(k.browserVersion())===15)&&!(k.browserName()===`Firefox`&&Number(k.browserVersion())<60)}},Ei=class extends wi{constructor(e){super(e),g(this,`_generator`,void 0),g(this,`_writer`,void 0),g(this,`_stream`,void 0),B.debug(`TrackGeneratorRenderer started`),this._generator=new MediaStreamTrackGenerator({kind:j.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()),B.debug(`TrackGeneratorRenderer destroyed`)}static isBrowserSupported(){return`VideoFrame`in window&&`MediaStreamTrackGenerator`in window&&vi.isBrowserSupported()}},Di=class extends Ci{constructor(e,t,n,r){super(e,t,n,r),g(this,`_renderer`,void 0),g(this,`_decoder`,void 0),g(this,`_decoderReady`,!1),g(this,`_decoderBusy`,!1),g(this,`_decoderQueue`,[]),g(this,`_fpsMeter`,void 0),B.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 yi(e=>B.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Ei.isBrowserSupported()?this._renderer=new Ti(this._onStream):this._renderer=new Ei(this._onStream)}_initDecoder(e=!1){e||!vi.isBrowserSupported()?this._decoder=new _i:this._decoder=new vi,this._decoder.init(async e=>{this._decoderBusy=!1,`VideoFrame`in window&&e instanceof VideoFrame?await this._renderer.drawFrame(e):await this._renderer.drawImage(e),this._fpsMeter.increment(),this._decodeQueue()},e=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof vi&&typeof e==`string`&&e.includes(`EncodingError`)&&this._switchToLibVPXDecoder()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()})}_switchToLibVPXDecoder(){B.warn(`StreamBuilder switch to LibVPX decoder`),this._fpsMeter&&this._fpsMeter.destroy(),this._decoder&&(this._decoderReady=!1,this._decoderBusy=!1,this._decoder.destroy()),this._renderer&&this._renderer.destroy(),this._initFpsMeter(),this._initRenderer(!0),this._initDecoder(!0)}_decodeQueue(){if(!this._decoderReady||this._decoderBusy)return;let e=this._decoderQueue.shift();e&&(this._decoderBusy=!0,this._decoder.decodeFrame(e.timestamp,e.frameData,e.isVP9,e.keyframe))}destroy(){super.destroy(),this._fpsMeter.destroy(),this._decoder.destroy(),this._renderer.destroy(),B.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return Ti.isBrowserSupported()||Ei.isBrowserSupported()}},Oi=1,ki=1,Ai=2,ji=0,Mi=1,Ni=2,Pi=4,Fi=8;function Ii(e,t,n,r,i,a,o){let s=0;t&&(s|=Mi),n&&(s|=Ni),r&&(s|=Pi),o||(s|=Fi);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,Oi),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,ji),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 Li(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&Mi),l=!!(s&Ni),u=!!(s&Pi),d=!!(s&Fi);if(n!==Oi)throw Error(`Unexpected protocol version. Got ${n}, expected ${Oi}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function Ri(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==Oi||t.getUint8(1)!==ki||t.getUint16(2)!==ji)}function zi(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==Oi||t.getUint8(1)!==Ai||t.getUint16(2)!==ji?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function Bi(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,Oi),n.setUint8(1,ki),n.setUint16(2,e),t}var Vi=2**15-1,Hi=1,Ui=5,Wi=5,Gi=class e{constructor(e){g(this,`_mediaSource`,void 0),g(this,`_codec`,void 0),g(this,`_sourceBuffer`,null),g(this,`_queue`,[]),g(this,`_clearBufferTill`,0),this._mediaSource=new MediaSource,this._codec=e;let t=()=>{this._mediaSource.removeEventListener(`sourceopen`,t),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener(`sourceopen`,t,!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),B.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)-Ui);r-n>Wi&&(this._clearBufferTill=r)}destroy(){this._queue=[],this._mediaSource.readyState===`open`&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},Ki=class e extends Ci{constructor(e,t,n){super(e,t,n),g(this,`_mediaBuffer`,null),g(this,`_video`,null),g(this,`_stream`,null),g(this,`_earliestTimestamp`,0),g(this,`_clusterStartTime`,0),g(this,`_lastFrameTimestamp`,0),B.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(Hi)),f.element(f.ID.TrackUID,f.number(Hi)),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 Gi(e),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){B.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=()=>B.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,B.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(),B.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>Vi&&(this._clusterStartTime=r,i=0),i===0){B.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(Hi),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),B.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"`)}},qi=class{constructor(e,t,n,r,i){g(this,`_datachannel`,void 0),g(this,`_participantIdRegistry`,null),g(this,`_streamBuilders`,{}),g(this,`_onStream`,()=>{}),g(this,`_onEos`,()=>{}),g(this,`_onStat`,void 0),B.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=Li(e),n=this._participantIdRegistry?.getStreamDescription(t.ssrc)?.participantId;if(!n){B.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=P.screenShareWebmBuilder&&Ki.isBrowserSupported()?new Ki(n,e,this._onStat):new Di(n,e,this._onStat,()=>{this._requestKeyFrame(t.ssrc)}),this._streamBuilders[n]=r}r.appendChunk(t)}_requestKeyFrame(e){if(!(!this._datachannel||this._datachannel.readyState!==`open`))try{let t=Bi(e);this._datachannel.send(t),B.debug(`ScreenCaptureReceiver request for keyframe for ssrc ${e}`)}catch(e){B.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,B.debug(`ScreenCaptureReceiver destroyed`)}},Ji=class{constructor(e,t,n){g(this,`_prev`,void 0),g(this,`_next`,void 0),g(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}},Yi=class{constructor(){g(this,`_head`,null),g(this,`_tail`,null),g(this,`_length`,0)}get length(){return this._length}push(...e){for(let t of e)this._tail=new Ji(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):``}},Xi=1e3,Zi=class extends gi{constructor(e,t,n,r){super(),g(this,`_sourceTrack`,void 0),g(this,`_onFrame`,void 0),g(this,`_useCongestionControl`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_useImageCapture`,void 0),g(this,`_video`,null),g(this,`_imageCapture`,null),g(this,`_canvas`,null),g(this,`_canvasCtx`,null),g(this,`_frameReadTimeout`,0),g(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;B.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:B.enabled()})}_encode(e,t){let n=e.data.buffer;this._sendToWorker(hi.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)},Xi),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(hi.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),B.debug(`LibVPxEncoder destroyed`)}},Qi=class extends gi{constructor(e,t,n,r,i,a){super(),g(this,`_sourceTrack`,void 0),g(this,`_trackProcessor`,void 0),g(this,`_onFrame`,void 0),g(this,`_useCongestionControl`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_useCbr`,void 0),g(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;B.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;function g(e){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),y(),self.postMessage({type:t.READY})}function _(e){e&&!h&&(h=!0),self.clearTimeout(l),l=self.setTimeout(()=>{c&&v(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(!x){r.releaseLock(),n.cancel();return}c=t,v(t,h)}}))}function v(e,t){(e.codedWidth!==i||e.codedHeight!==a)&&(i=e.codedWidth,a=e.codedHeight,y(),h=!0),x.encode(e,{keyFrame:t}),t&&(h=!1)}function y(){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),x.configure(t)}function b(e,t,n){d=e,m=t,s=n,y()}let x=new VideoEncoder({output:e=>{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])},error:e=>{self.postMessage({type:t.FRAME,error:String(e)})}});self.onmessage=e=>{switch(e.data.type){case t.INIT:g(e.data);break;case t.FRAME:_(e.data.keyFrame);break;case t.SET_BITRATE:b(e.data.bitrate,e.data.useCbr,e.data.fps);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})},[],{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(hi.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(hi.SET_BITRATE,{bitrate:e,useCbr:t,fps:n})}isVP9(){return!0}destroy(){this._removeWorker(),B.debug(`WebCodecsEncoder destroyed`)}static isBrowserSupported(){return`VideoEncoder`in window&&`Worker`in window&&`EncodedVideoChunk`in window&&`MediaStreamTrackProcessor`in window}},$i=2100,ea=600,ta=1.2,na=.8,ra=2e3,ia=8e3,aa=8e3,oa=16e3,sa=4,ca=2e3,la=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(la||{}),ua=class{constructor(e,t,n,r,i,a,o){g(this,`_onCongestion`,void 0),g(this,`_ccEnabled`,void 0),g(this,`_fastSharing`,void 0),g(this,`_trendDelayThreshold`,void 0),g(this,`_highDelayThreshold`,void 0),g(this,`_targetFps`,void 0),g(this,`_minBitrate`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_targetBitrate`,void 0),g(this,`_lastDown`,void 0),g(this,`_lastUp`,void 0),g(this,`_lastProbing`,void 0),g(this,`_lastCheckDelay`,void 0),g(this,`_upPenalty`,0),g(this,`_probing`,void 0),g(this,`_delayAvgShort`,-1),g(this,`_delayAvgLong`,-1),g(this,`_minDelay`,Number.MAX_VALUE),g(this,`_maxDelay`,0),g(this,`_largeDelayDuration`,0),g(this,`_lastFpsCalcMs`,void 0),g(this,`_frames`,0),g(this,`_fps`,0),this._onCongestion=e,this._ccEnabled=r,this._minBitrate=t,this._maxBitrate=n,this._fastSharing=i,this._targetFps=o,a>0?this._highDelayThreshold=a:this._highDelayThreshold=$i,i&&(this._highDelayThreshold=ea),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let s=Date.now();this._lastDown=0,this._lastUp=s,this._lastProbing=s,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&&B.debug(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${la[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>ra){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,sa),this._probing=!1);let n=na*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*na),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*aa/1e3);B.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${la[i]}`),B.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=ia+this._upPenalty*aa;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*ta,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*aa/1e3);B.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${la[i]}`),B.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>oa&&(this._probing=!1);let h=r-this._lastDown;this._upPenalty>0&&h>3*p&&(B.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>ca){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&&B.log(`cc: fps=${this._fps}`)}}},da=class{constructor(e){g(this,`_maxSize`,void 0),g(this,`_size`,0),g(this,`_buffer`,void 0),g(this,`_head`,0),g(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}},fa=65536,pa=50,ma=400,ha=1e6,ga=3e5,_a=3e4,va=2e3,ya=5,ba=0,xa=class{constructor(e,t,n,r){g(this,`_encoder`,void 0),g(this,`_datachannel`,void 0),g(this,`_signaling`,void 0),g(this,`_fastSharing`,void 0),g(this,`_destroyed`,!1),g(this,`_needKeyframe`,!0),g(this,`DATA_SIZE`,void 0),g(this,`_congestionControl`,void 0),g(this,`_frameNum`,0),g(this,`_width`,void 0),g(this,`_height`,void 0),g(this,`_feedback`,new da(1024)),g(this,`_lastSentFrameSeq`,0),g(this,`_lastDeliveredFrameSeq`,0),g(this,`_lastFrameDelay`,0),g(this,`_lastFramerateReduced`,Date.now()),g(this,`_lastSharingStat`,Date.now()),g(this,`_congestionControlEnabled`,void 0),g(this,`_queue`,new Yi),g(this,`_fpsMeter`,void 0),g(this,`_maxFrameDelay`,void 0),B.debug(`ScreenCaptureSender started`),this.DATA_SIZE=P.consumerScreenDataChannelPacketSize-11,this._datachannel=t,this._signaling=n,this._fastSharing=r,this._congestionControlEnabled=P.screenShareCongestionControl||this._fastSharing,this._width=e.getSettings().width,this._height=e.getSettings().height,this._maxFrameDelay=this._fastSharing?P.screenShareCongestionControlThreshold:P.screenShareCongestionControlThreshold*2;let i=P.getScreenFrameRate(this._fastSharing),{minBitrate:a,maxBitrate:o}=this._calcMinMaxBitrate(this._width,this._height),s=this._onCongestionCallback.bind(this);B.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(a/1e3)}k maxBitrate=${Math.round(o/1e3)}k delayThreshold=${P.screenShareCongestionControlThreshold}`),this._congestionControl=new ua(s,a,o,this._congestionControlEnabled,this._fastSharing,P.screenShareCongestionControlThreshold,i);let c=(e,t)=>{if(this._destroyed)return;if(!e){B.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(Qi.isBrowserSupported()){let t=this._fastSharing;this._encoder=new Qi(e,c,this._congestionControlEnabled,o,t,i)}else this._encoder=new Zi(e,c,this._congestionControlEnabled,o);this._datachannel.onmessage=e=>{Ri(e.data)&&(B.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=zi(e.data);t!==null&&this._checkCcFeedback(t)},this._encoder.init().then(()=>this._handleQueue()).catch(e=>B.warn(`ScreenCaptureSender init failed`,e)),this._fpsMeter=new yi(e=>B.log(`[ScreenCaptureSender] fps: ${e}`),5e3)}_handleQueue(){if(this._destroyed)return;let e=this._queue.shift();if(!e){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+fa)%fa>ya&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>va&&(this._lastFramerateReduced=e,B.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(e)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),N.setImmediate(()=>this._handleQueue());return}if(e.isLast){this._frameNum++,this._fpsMeter.increment(),e.isKey&&B.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 N.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 Yi;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=Ii(e,t,n,r,ba,this._encoder.isVP9(),i),o={sequence:ba,data:a};return ba=(ba+1)%fa,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 B.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(),B.debug(`ScreenCaptureSender destroyed`)}static isBrowserSupported(){return Qi.isBrowserSupported()||Zi.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);B.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(ga,Math.min(ha,Math.round(n*pa))),maxBitrate:Math.round(n*ma)}}_checkCcFeedback(e){let t=this._feedback.update(e.seq,e.ts2);if(t===null)B.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>_a){let t=this._congestionControl.getStat();t!==null&&(B.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=e}}},Sa=90,Ca=4294967295,wa=class e extends Vr{constructor(e,t,n){super(e,t),g(this,`_producerNotification`,null),g(this,`_producerCommand`,null),g(this,`_producerScreen`,null),g(this,`_consumerScreen`,null),g(this,`_asr`,null),g(this,`_animojiDataChannel`,null),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),g(this,`_isOpen`,!1),g(this,`_observer`,!1),g(this,`_reconnectionPrevented`,!1),g(this,`_statInterval`,null),g(this,`_settingsInterval`,null),g(this,`_monitorRtpShareInterval`,null),g(this,`_statBytes`,{}),g(this,`_ssrcMap`,{}),g(this,`_ssrcMapUpdated`,!1),g(this,`_perfStatReporter`,void 0),g(this,`_producerOfferIsProcessing`,!1),g(this,`_producerNextOffer`,null),g(this,`_producerNextSessionId`,null),g(this,`_lastStat`,null),g(this,`_serverSettings`,void 0),g(this,`_prevConsumerSettings`,{}),g(this,`_prevConsumerFastSharingSettings`,{}),g(this,`_asrTrack`,null),g(this,`_captureSender`,null),g(this,`_captureReceiver`,null),g(this,`_participantIdRegistry`,null),g(this,`_disabledSenders`,new Set),g(this,`_rtpReceiversByStreamId`,{}),g(this,`_producerSessionId`,``),g(this,`_newAudioShareTrack`,null),g(this,`_simulcastInfo`,null),this.subscribe(this._signaling,jr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,sn.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,sn.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,sn.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=n,B.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){B.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?(B.error(`ServerTransport: Closed`,e),this._setState(q.FAILED)):(B.debug(`ServerTransport: Closed`),this._setState(q.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){Lr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(P.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(){P.simulcast&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new Gr(this,this._signaling)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcastInfo=null,this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,e._closeDataChannel(this._producerNotification),e._closeDataChannel(this._producerCommand),e._closeDataChannel(this._producerScreen),e._closeDataChannel(this._consumerScreen),e._closeDataChannel(this._asr),e._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent(K.PEER_CONNECTION_CLOSED)}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,n){B.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{ordered:!0});r.onopen=()=>{let e=r.readyState;e===`open`?(B.debug(`[${t}] data channel opened`),n(r)):B.error(`[${t}] data channel open failed, state [${e}]`)},r.onerror=e=>{let n=e.error;B.error(`[${t}] data channel error`,n?.errorDetail,n?.message)}}_openConnection(t=!1){B.debug(`ServerTransport: Open single connection`);try{this._pc=new RTCPeerConnection}catch(e){B.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=N.debounce(e=>{this._pc&&this._onConnectionStateChange(this._pc,e)},500),this._pc.onsignalingstatechange=e._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new mi,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,Mr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,Mr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,Mr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),P.asrDataChannel&&this._createDataChannel(this._pc,Mr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new di(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)})}),P.vmoji&&this._createDataChannel(this._pc,Mr.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(P.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){B.error(`ServerTransport: Unable to add media source tracks`,e),b.log(E.ERROR,`addTrack-single`),this.close(e);return}this._createDataChannel(this._pc,Mr.consumerScreenShare,e=>{this._consumerScreen=e,this._consumerScreen.binaryType=`arraybuffer`;let t=this._mediaSource.getScreenTrack();t&&(!P.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(t)}),t||this._allocateConsumer(),this._setState(q.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==q.OPENED&&(this._setState(q.RECONNECTING),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent(K.SIGNALLED_ACTIVE_PARTICIPANTS,e)}_signalStalledParticipants(e){this._triggerEvent(K.SIGNALLED_STALLED_PARTICIPANTS,e)}_signalSpeakerChanged(e){this._triggerEvent(K.SIGNALLED_SPEAKER_CHANGED,e)}_signalNetworkStatus(e){this._triggerEvent(K.NETWORK_STATUS,e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
15
|
-
`).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${li.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${li.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new xa(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new qi(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent(K.REMOTE_STREAM_SECOND,e,t)},e=>{this._triggerEvent(K.REMOTE_STREAM_SECOND,e,null)},e=>{this._triggerEvent(K.SCREEN_SHARING_STAT,e)}))}_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!==j.video||n.track.contentHint===`motion`)return;let r=!this._disabledSenders.has(n),i=e.maxDimension!==0;if(r&&!i){B.log(`Disabling video upload`),this._disabledSenders.add(n),n.replaceTrack(k.getBlackMediaTrack()).catch(e=>{B.error(`Could not disable video upload`,e)});return}let a=this._mediaSource.getSendVideoTrack();if(!r&&i&&a){B.log(`Enabling video upload`),this._disabledSenders.delete(n);let e=n.track;e.enabled=a.enabled,n.replaceTrack(a).then(()=>e.stop()).catch(e=>{B.error(`Could not enable video upload`,e)})}N.applyVideoTrackSettings(e,n,a??n.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&P.consumerFastScreenShare){let e=this._serverSettings.fastScreenSharing;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{!n.track||n.track.kind!==j.video||n.track.contentHint!==`motion`||N.applyVideoTrackSettings(e,n,n.track,this._prevConsumerFastSharingSettings,t)}),this._prevConsumerFastSharingSettings=t}}}_onScreenSharingStatus(e){e.track?(!P.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent(K.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),Br.reportUsage(e)}).catch(()=>{}),this._statInterval=window.setTimeout(e,P.statisticsInterval)};this._statInterval=window.setTimeout(e,P.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await W.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent(K.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=li.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(K.AUDIO_MIX_STALL,i)}this._statBytes[n]={bytesReceived:t.bytesReceived,stalled:i}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:Gr.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:+!!P.asrDataChannel,animojiDataChannelVersion:P.vmoji?P.vmojiOptions.protocolVersion:1,animojiBackendRender:!P.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:P.videoTracksCount,red:!0,audioShare:P.audioShare,fastScreenShare:P.fastScreenShare,videoSuspend:P.videoSuspend,simulcast:P.simulcast,consumerFastScreenShare:P.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:P.consumerFastScreenShareQualityOnDemand,transparentAudio:P.transparentAudio};!P.videoTracksCount&&!this._observer&&B.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e)}async _processOffer(e,t){if(!this._pc)throw Error(`Interrupt allocation`);let n=P.simulcast;try{await this._pc.setRemoteDescription(e)}catch(e){throw B.error(`[single] unable to set remote offer`,e),b.log(E.ERROR,`setRemoteDescription-single`),e}let r=this._findFirstSimTransceiver();if(P.simulcast)if(r){B.log(`_processOffer: caps.simulcast=${P.simulcast} mid=${r.mid} dir=${r.direction}`);let e=this._mediaSource.getStream(),t=await this._setupSimulcastTransceiver(e,r);B.log(`_processOffer: simulcastInfo`,t),t||(B.log(`_processOffer: simulcast transceiver not found in server offer mid=${r.mid}, disable simulcast`),n=!1)}else B.log(`_processOffer: simulcast transceiver not found in server offer, disable simulcast`),n=!1;let i;try{if(await this._handleTracks(),B.debug(`[single] create local answer`),!this._pc)throw Error(`Interrupt allocation`);i=await this._pc.createAnswer()}catch(e){throw B.error(`[single] unable to create answer`,e),b.log(E.ERROR,`createAnswer-single`),e}try{if(!this._pc)throw Error(`Interrupt allocation`);i.sdp=N.patchLocalSDP(i.sdp,!1,k.isBrokenH264Decoder(),!1),B.debug(`[single] set local answer`,{answer:i}),await this._pc.setLocalDescription(i)}catch(e){throw B.error(`[single] unable to set local answer`,e),b.log(E.ERROR,`setLocalDescription-single`),e}if(n&&r){i.sdp=N.patchSimulcastAnswerSdp(i.sdp,r,un.WIDTH,un.HEIGHT);for(let e of this._pc.getTransceivers())e.mid===null&&e.stop()}try{B.debug(`[single] transmit local answer`,{answer:i}),this._updateSSRCMap(e),await this._signaling.acceptProducer(i,Object.keys(this._ssrcMap),t),B.debug(`[single] remote offer has been processed`)}catch(e){B.warn(`[single] unable to send local answer`,e),b.log(E.ERROR,`acceptProducer`)}n&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!==j.video)continue;let n=e.sender.getParameters();if(!(!n.encodings||n.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction=`sendonly`;let n=e.getVideoTracks()[0];await t.sender.replaceTrack(n),t.sender.setStreams(e);let r=t.sender.getParameters();if(!r.encodings||r.encodings.length<=1)return B.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(r.encodings)}`),null;let i=gn(un.WIDTH,un.HEIGHT,this._serverSettings.camera?.bitrates?.generic),a=0,o=1;for(let e of r.encodings)e.scalabilityMode=dn,e.active=!0,a>=i.streams.length?e.maxBitrate=0:e.maxBitrate=i.streams[a].bitrate,e.scaleResolutionDownBy=o,o*=2,a++;await t.sender.setParameters(r);let s=n.getSettings();return B.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${s.width}x${s.height} encodings=${JSON.stringify(r.encodings)}`),!0}async _acceptProducer(e,t){if(this._producerOfferIsProcessing){this._producerNextOffer=e,this._producerNextSessionId=t,B.debug(`[single] wait until other remote offer is processed`);return}this._producerOfferIsProcessing=!0;let n={type:`offer`,sdp:N.patchRemoteSDP(e,k.isOldDataChannelDescription(),!1,!1,!1,k.isBrokenVP9Encoder(),k.isBrokenVP9Decoder())};if(B.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){B.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===j.video);if(!e||!e.sender){B.warn(`Cannot find screenshare transceiver`);return}try{e.direction=`sendonly`,await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(e){B.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===j.audio);if(!e||!e.sender){B.warn(`Cannot find audioshare transceiver`);return}e.sender.track!==null&&B.warn(`Unexpected track assigned to audioshare`);try{e.direction=`sendonly`,await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(e){B.error(`ServerTransport: Unable to replace track`,e),b.log(E.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case G.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case G.REALLOC_CON:this._reconnect();break;case G.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case G.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case G.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case G.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent(K.ASR_TRANSCRIPTION,e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),P.breakVideoPayloadTypes&&(B.log(`test mode enabled, video switched off`),this._signaling.requestTestMode(`breakVideoPayloadTypes`,null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description,e.sessionId)}_onAddTrack(e,t){B.debug(`[single] remote track (added)`,{track:t.track});let n=t.streams[0];n?(n.onremovetrack||(n.onremovetrack=e=>{this._triggerEvent(K.REMOTE_TRACK_REMOVED,n.id,n,e.track)}),n.getTracks().find(e=>e.id===t.track.id)||n.addTrack(t.track),this._rtpReceiversByStreamId[n.id]=t.receiver,this._triggerEvent(K.REMOTE_TRACK_ADDED,n.id,n,t.track)):B.error(`[single] unable to get media stream from track event`)}static _onSignalingStateChange(e,t){B.debug(`[single] signaling state changed`,{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(B.debug(`[single] connection state changed`,{state:e.connectionState},t),b.log(E.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect();break;case`connecting`:let t=this.getState();t===q.IDLE||t===q.OPENED?this._setState(q.CONNECTING):e.iceConnectionState===`checking`&&this._setState(q.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(q.RECONNECTING);break;case`connected`:this._setState(q.CONNECTED),N.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(b.log(E.ICE_CONNECTION_TYPE,e.local.type),B.debug(`Selected ICE candidates`,e))});break}}_onReplacedTrack(e,t){if(this._pc){B.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let n=(e,t)=>{e.replaceTrack(t).catch(e=>{B.error(`ServerTransport: Unable to replace track`,e),b.log(E.ERROR,`replaceTrack-single`)})};if(B.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),P.simulcast&&e.kind===j.video){let t=this._pc?.getTransceivers().find(t=>t.direction===`sendonly`&&t.sender?.track?.kind===j.video&&t.sender.track.contentHint===e.contentHint)?.sender;t?.track?(n(t,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):B.warn(`_onReplacedTrack: simulcast video transceiver not found`)}else{let t=this._pc?.getSenders().find(t=>t.track&&t.track.kind===e.kind&&!this._disabledSenders.has(t)&&t.track.contentHint===e.contentHint);t?.track?n(t,e):e.kind===j.audio&&e.contentHint===`music`&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e===j.screen&&P.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return b.log(E.PAT_WAITING_TIME_ERROR,`noConnection`),B.error(`Cannot get stream waiting time, peer connection is not initialized`),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return b.log(E.PAT_WAITING_TIME_ERROR,`oldBrowser`),B.error(`Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported`),0;let n=this._rtpReceiversByStreamId[e];if(!n)return b.log(E.PAT_WAITING_TIME_ERROR,`noReceiver`),B.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let r=n.getSynchronizationSources();if(!r||!r.length)return B.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let i=r[0].rtpTimestamp;if(!Number.isInteger(i))return b.log(E.PAT_WAITING_TIME_ERROR,`timestampNotInteger`),B.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${i}`),0;let a=t-i&Ca,o=Math.ceil(a/Sa);return Math.min(100,Math.max(0,o))}async _changeSimulcastInfo(e,t){let n=this._mediaSource.getMediaSettings().isVideoEnabled,r=this._findFirstSimTransceiver();if(!P.simulcast||!n||!r||!r.sender)return;let i=this._mediaSource.getStream();if(!i)return;let a=i.getVideoTracks()[0],o=a.getSettings().width,s=a.getSettings().height,c=gn(o,s,this._serverSettings.camera?.bitrates?.generic),l=t||!mn(this._simulcastInfo,c);if(!c.streams.length||!l)return;let u=r.sender.getParameters();if(u.encodings||(u.encodings=[{}]),!(u.encodings.length<=1)){if(B.log(`_changeSimulcastInfo: ${o}x${s} command: ${JSON.stringify(c)} `),e){let e=0;for(let t of u.encodings)t.scaleResolutionDownBy=_n(t.rid),t.scalabilityMode=dn,e>=c.streams.length?(t.maxBitrate=0,t.active=!1):(t.active=!0,t.maxBitrate=c.streams[e].bitrate),e++;await r.sender.setParameters?.(u).catch(e=>{B.error(`Failed to set sender parameters`,u,e)}),B.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(u.encodings)} `)}if(this._simulcastInfo=c,c.streams){let e={mediaSource:cn.CAMERA,simulcastInfo:c};await this._signaling.changeSimulcast(e)}}}async _monitorRtpShare(){let e=pi.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!P.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(e=>e.track?.kind===j.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),B.log(`
|
|
12
|
+
`)}e.patchRemoteSDP=m;function ee(e){return e?`${e.type||`WEB_SOCKET`}_${e.id}`:`_`}e.getPeerIdString=ee;function te(e,t){return e&&e.id===t.id&&(e.type||`WEB_SOCKET`)===(t.type||`WEB_SOCKET`)}e.comparePeerId=te;async function ne(e){let t={local:null,remote:null};if(!e||!e.getStats)return t;try{let n=await e.getStats(null),r=null;if(n.forEach(e=>{e.type===`transport`&&e.selectedCandidatePairId?r=n.get(e.selectedCandidatePairId):e.type===`candidate-pair`&&e.state===`succeeded`&&!r&&(!Object.hasOwn(e,`selected`)||e.selected)&&(r=e)}),r?.localCandidateId){let e=n.get(r.localCandidateId);e&&(t.local={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}if(r?.remoteCandidateId){let e=n.get(r.remoteCandidateId);e&&(t.remote={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}return t}catch{return t}}e.getPeerConnectionHostInfo=ne;let h=/^[0-9]+$/,g=/^([gu])([0-9]+)$/;function re(e,t=A.USER){let n=String(e);return g.test(n)?(R.warn(`Already composite id [${e}] type supplied [${t}]`),n):t===A.GROUP?`g`+n:t===A.USER?`u`+n:(R.warn(`Unknown type [${t}] for id [${e}]`),n.match(h)?`u`+n:n)}e.composeUserId=re;function ie(e,t,n=0){return ae(re(e,t),n)}e.composeParticipantId=ie;function ae(e,t){return t?e+`:d`+t:e}e.compose=ae;function oe(e){return ie(e.id,e.idType||A.USER,e.deviceIdx)}e.composeId=oe;function se(e){if(e.decorativeUserId)return ie(e.decorativeUserId,e.idType||A.USER,e.deviceIdx)}e.composeDecorativeId=se;function _(e){return e.participant?oe(e.participant):ie(e.participantId,e.participantType||A.USER,e.deviceIdx)}e.composeMessageId=_;function ce(e){return typeof e==`string`?le(ue(e).compositeUserId).id:e}e.extractOkId=ce;function le(e){let t=String(e),n=t.match(g);return n?{id:Number(n[2]),type:n[1]===`g`?A.GROUP:A.USER}:(R.warn(`Unsupported compositeId [${e}]`),{id:Number(t),type:A.USER})}e.decomposeId=le;function ue(e){let t=e.split(`:d`);return{compositeUserId:t[0],deviceIdx:t.length>1?parseInt(t[1],10):0}}e.decomposeParticipantId=ue;function de(){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=de;function fe(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=fe;function pe(e){if(!window.BigInt)return null;let t=``,n=e.split(`
|
|
13
|
+
`);for(let e of n)if(e.startsWith(`a=fingerprint`)){let n=e.split(` `);if(n.length===2){t=n[1];break}}if(!t)return BigInt(-1);let r=t.split(`:`),i=BigInt(0);for(let e=Math.min(7,r.length-1);e>=0;e--){let t=BigInt(parseInt(r[e],16));i<<=BigInt(8),i|=t}return BigInt.asIntN(64,i)}e.sdpFingerprint=pe;async function me(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=me;function he(e,t,n,r=R){let i=[];return e.getSenders().forEach(e=>ge(t,e,e.track,n,i,r)),i}e.applySettings=he;function ge(e,t,n,r,i,a=R){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!e||!n||n.kind!==k.video)return;let o=n.getSettings();if(!o)return;let s=e.maxBitrateK?e.maxBitrateK*1024:null,c=o.width,l=o.height,u=c&&l&&e.maxDimension?Math.max(1,Math.max(c,l)/e.maxDimension):null,d=e.maxFramerate||null;if(c&&l&&e.maxDimension&&e.maxDimension>Math.max(c,l)){let e=Math.round(c*l/256),t=(Math.round(e*cn/1e4)+1)*1e4;s=s===null?t:Math.min(t,s)}let f=e.degradationPreference||`balanced`,p=r[n.id];if(p&&p.bitrate===s&&p.scaleResolutionDownBy===u&&p.maxFramerate===d&&p.degradationPreference===f){i[n.id]=p;return}i[n.id]={bitrate:s,scaleResolutionDownBy:u,maxFramerate:d,degradationPreference:f};let m=t.getParameters();if(m.encodings||(m.encodings=[{}]),m.encodings.length>1&&c&&l&&e.maxDimension){let t=Math.round(e.maxDimension*1.35),n=Math.max(c,l),r=rn(c,l,e?.bitrates?.generic),i=r.streams.length;a.log(`applyVideoTrackSettings: maxDim=${e.maxDimension} targetDim=${t} track=${c}x${l} sim=${JSON.stringify(r)}`),m.encodings.forEach((e,a)=>{e.scaleResolutionDownBy=an(e.rid);let o=Math.round(n/e.scaleResolutionDownBy);a<i-1?e.active=o<t:a>=i?e.active=!1:e.active=!0,a<i?e.maxBitrate=r.streams[a].bitrate:e.maxBitrate=0,e.scalabilityMode=Qt})}else m.encodings.forEach(t=>{e?.scalabilityMode&&(t.scalabilityMode=e.scalabilityMode),s?t.maxBitrate=s:delete t.maxBitrate,u?t.scaleResolutionDownBy=u:delete t.scaleResolutionDownBy,d?t.maxFramerate=d:delete t.maxFramerate});if(m.degradationPreference=f,m.encodings.length>0){t.setParameters?.(m).catch(e=>{a.error(`Failed to set sender parameters`,m,e)});let e=t.getParameters();a.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(e.encodings)}`)}}e.applyVideoTrackSettings=ge;function _e(e,t){Array.isArray(t)||(t=[t]);for(let n of t)if(e.includes(n))return!0;return!1}e.includesOneOf=_e;function ve(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=ve;function v(e){let t=e.map(e=>({uid:e.externalId,mediaSettings:e.mediaSettings,status:e.status,muteStates:e.muteStates,unmuteOptions:e.unmuteOptions,participantState:e.participantState,markers:e.markers,movieShareInfos:e.movieShareInfos,roles:e.roles}));return M.filterObservers?t.filter(e=>!e.uid.observer):t}e.mapSharedParticipants=v;function ye(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=ye;function be(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&&Ee(r)&&Ee(a))return be(r,a,n);if(r!==a)return!1}return!0}e.isObjectsEquals=be;function xe(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=xe;function Se(e){return!Object.keys(e).length}e.isEmptyObject=Se;function Ce(e,t){if(!e&&!t)return 0;if(!e||!t)return e?-1:1;return r(t.rank,e.rank)||r(e.ts,t.ts)||n(e,t);function n(e,t){let n={[A.USER]:0,[A.GROUP]:1},{compositeUserId:i,deviceIdx:a}=ue(e.id),{compositeUserId:o,deviceIdx:s}=ue(t.id),{id:c,type:l}=le(i),{id:u,type:d}=le(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=Ce;function we(e,t){return on(Object.entries(e).filter(([,e])=>Array.isArray(t)?!t.includes(e):e!==t))}e.objectFilterOutValues=we;function Te(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=Te,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 Ee(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}e.isObject=Ee;function De(e,n,r,i){function a(e,t){let n=0,r=e.length,i=!1;for(let a=0;a<e.length;a++)if(!i&&e[a].startsWith(`m=video`)&&(n=a),e[a].startsWith(`a=mid:`+t)&&(i=!0),i&&e[a].startsWith(`m=`)){r=a;break}return{start:n,end:r}}function o(e,t,n,r,i,a,o){let s=`a=rid:`+r+` send`;for(let r=t;r<n;r++)e[r]===s&&(e[r]=s+` max-width=`+a+`;max-height=`+o+`;max-br=`+i)}let s=n?.sender;if(s&&s.track&&n.mid){let c=e.split(t),{start:l,end:u}=a(c,n.mid),d=s.getParameters();if(d.encodings)return d.encodings.forEach(e=>{let t=e.rid,n=e.maxBitrate,a=e.scaleResolutionDownBy;r&&i&&a&&o(c,l,u,t,n,``+Math.round(r/a),``+Math.round(i/a))}),c.join(`\r
|
|
14
|
+
`)}return e}e.patchSimulcastAnswerSdp=De})(dn||(dn={}));var j=dn,fn=`__CALLS_SDK_DEVTOOLS_`,pn=class{set(e,t){try{this.getStorage().setItem(fn+e,JSON.stringify(t))}catch(t){R.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(fn+e);return t===null?null:JSON.parse(t)}catch(t){return R.warn(`DevTools: Failed to read option`,e,t),null}}remove(e){try{this.getStorage().removeItem(fn+e)}catch(t){R.warn(`DevTools: Failed to remove option`,e,t)}}clear(){try{let e=this.getStorage(),t=Object.keys(e);for(let n of t)n.startsWith(fn)&&e.removeItem(n)}catch(e){R.warn(`DevTools: Failed to clear options`,e)}}getAll(){try{let e=this.getStorage(),t=Object.keys(e),n={};for(let r of t)if(r.startsWith(fn)){let t=r.substring(21),i=e.getItem(r);if(i!==null)try{n[t]=JSON.parse(i)}catch{}}return n}catch(e){return R.warn(`DevTools: Failed to get all options`,e),{}}}getStorage(){return window.localStorage}},mn=class{constructor(e){h(this,`storage`,void 0),this.storage=e}set(e,t){this.storage.set(e,t),console.debug(`DevTools: ${String(e)} override set to ${t}`)}get(e){return this.storage.get(e)}clear(e){this.storage.remove(e),console.debug(`DevTools: ${String(e)} override cleared`)}clearAll(){this.storage.clear(),console.debug(`DevTools: All overrides cleared`)}getAll(){return this.storage.getAll()}applyOverrides(e){let t=this.getAll(),n={...e},r=Object.keys(t);if(r.length>0){console.debug(`DevTools: Current overrides:`,t);for(let e of r)t[e]!==void 0&&(n[e]=t[e]);console.debug(`DevTools: Overrides applied`)}return n}},hn=class e{static getInstance(){return e.instance||(e.instance=new e),e.instance}constructor(){h(this,`params`,void 0),h(this,`storage`,void 0),this.storage=new pn,this.params=new mn(this.storage)}};h(hn,`instance`,null);var gn=hn.getInstance(),M=class e{static set(t){Object.hasOwn(t,`voiceParams`)&&(Object.assign(e._params.voiceParams,t.voiceParams),delete t.voiceParams),Object.hasOwn(t,`specListenerParams`)&&(Object.assign(e._params.specListenerParams,t.specListenerParams),delete t.specListenerParams),Object.hasOwn(t,`apiAuth`)&&(y.accessToken=t.apiAuth.accessToken,y.sessionKey=t.apiAuth.sessionKey,y.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=gn.params.applyOverrides(t);Object.assign(e._params,j.objectFilterOutValues(n,void 0))}static getScreenFrameRate(t){return t?e._params.fastScreenShareFrameRate:e._params.screenFrameRate}static get(t){return e._params[t]}static get appName(){return`ok.calls.sdk.js`}static get appVersion(){return 1.1}static get sdkVersion(){return`2.8.11-dev.c0a05ac7.0`}static get debug(){return e._params.debug}static get protocolVersion(){return e._params.joinFromMultipleDevices?6:5}static get platform(){return e._params.platform}static set platform(t){e._params.platform=t}static get clientStatsPlatform(){return e._params.clientStatsPlatform}static set clientStatsPlatform(t){e._params.clientStatsPlatform=t}static get clientType(){return e._params.clientType}static set clientType(t){e._params.clientType=t}static get externalUserType(){return e._params.externalUserType}static set externalUserType(t){e._params.externalUserType=t}static get device(){return e._params.device}static get apiKey(){return e._params.apiKey}static get apiEnv(){return e._params.apiEnv}static get apiBaseUrl(){return e._params.apiBaseUrl}static set apiBaseUrl(t){e._params.apiBaseUrl=t}static apiEndpoint(t){switch(t??e.apiEnv){case`AUTO`:case`PROD`:return`https://api.mycdn.me`;case`CALLS`:return`https://calls.okcdn.ru`;case`PROD_OK`:return`https://api.ok.ru`;case`TEST`:return`https://apitest.ok.ru/api`;case`VIDEOTEST`:return`https://videotestapi.ok.ru/api`;case`CALLSTEST`:return`https://calls-test.okcdn.ru/api`;case`CALLS_BETA`:return`https://api-beta.calls-test.oneme.ru/api`;case`CALLS_BENDER`:return`https://api-bender.calls-test.oneme.ru/api`;case`CALLS_MAMES`:return`https://api-mames.calls-test.oneme.ru/api`;case`CALLS_MARS`:return`https://api-mars.calls-test.oneme.ru/api`;default:return e._params.apiEnv}}static get apiTimeout(){return e._params.apiTimeout}static get apiMaxAttempt(){return e._params.apiMaxAttempt}static get authToken(){return e._params.authToken}static set authToken(t){e._params.authToken=t}static get anonymToken(){return e._params.anonymToken}static set anonymToken(t){e._params.anonymToken=t}static get domain(){return e._params.domain}static get externalDomain(){return e._params.externalDomain}static get iceServers(){return e._params.iceServers}static set iceServers(t){e._params.iceServers=t}static get wssBase(){return e._params.wssBase}static set wssBase(t){e._params.wssBase=t}static get wtsBase(){return e._params.wtsBase}static set wtsBase(t){e._params.wtsBase=t}static get wssToken(){return e._params.wssToken}static set wssToken(t){e._params.wssToken=t}static get signalingReconnectDelay(){return e._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return e._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return e._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return e._params.waitConnectionDelay}static get waitResponseDelay(){return e._params.waitResponseDelay}static get waitMessageDelay(){return e._params.waitMessageDelay}static get waitAnotherTabDelay(){return e._params.waitAnotherTabDelay}static get debugLog(){return e._params.debugLog}static get forceRelayPolicy(){return e._params.forceRelayPolicy}static set forceRelayPolicy(t){e._params.forceRelayPolicy=t}static get videoMinWidth(){return e._params.videoMinWidth}static get videoMaxWidth(){return e._params.videoMaxWidth}static set videoMaxWidth(t){e._params.videoMaxWidth=t}static get videoMinHeight(){return e._params.videoMinHeight}static get videoMaxHeight(){return e._params.videoMaxHeight}static set videoMaxHeight(t){e._params.videoMaxHeight=t}static get videoAspectRatio(){return e._params.videoAspectRatio}static get videoFrameRate(){return e._params.videoFrameRate}static get videoFacingMode(){return e._params.videoFacingMode||(T.isMobile()?Mt.USER:null)}static set videoFacingMode(t){e._params.videoFacingMode=t}static get displaySurface(){return e._params.displaySurface}static get audioEffects(){return e._params.audioEffects}static set audioEffects(t){e._params.audioEffects=t,e._params.audioEffects?.setLogger((e,...t)=>R.send(e,...t))}static get videoEffects(){return e._params.videoEffects}static set videoEffects(t){e._params.videoEffects=t,e._params.videoEffects?.setLogger((e,...t)=>R.send(e,...t))}static get videoEffectMaxWidth(){return e._params.videoEffectMaxWidth}static set videoEffectMaxWidth(t){e._params.videoEffectMaxWidth=t}static get videoEffectMaxHeight(){return e._params.videoEffectMaxHeight}static set videoEffectMaxHeight(t){e._params.videoEffectMaxHeight=t}static get vmoji(){return e._params.vmoji?.isBrowserSupported()?e._params.vmoji:null}static set vmoji(t){e._params.vmoji=t}static get vmojiOptions(){return e._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(t){e._params.vmojiOptions=t}static get voiceParams(){return e._params.voiceParams}static get specListenerParams(){return e._params.specListenerParams}static get iceRestartWaitTime(){return e._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return e._params.transportConnectionWaitTime}static get statisticsInterval(){return e._params.statisticsInterval}static set statisticsInterval(t){e._params.statisticsInterval=t}static get networkStatisticsInterval(){return e._params.networkStatisticsInterval}static get perfStatReportEnabled(){return e._params.perfStatReportEnabled}static get callStatReportEnabled(){return e._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return e._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return e._params.enableLogPerfStatReport}static get asrDataChannel(){return e._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return e._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return e._params.screenShareWebmBuilder}static get noiseSuppression(){return e._params.noiseSuppression}static get preferH264(){return e._params.preferH264}static get preferVP9(){return e._params.preferVP9}static get audioNack(){return e._params.audioNack}static get movieShare(){return e._params.movieShare&&e.videoTracksCount>0}static get videoTracksCount(){return Number(e._params.videoTracksCount)}static get requestDisplayLayoutThrottleMs(){return Number(e._params.requestDisplayLayoutThrottleMs)}static get breakVideoPayloadTypes(){return e._params.breakVideoPayloadTypes}static get useCallsToContacts(){return e._params.useCallsToContacts}static get useParticipantListChunk(){return e._params.useParticipantListChunk&&e.videoTracksCount>0}static get useRooms(){return e._params.useRooms}static get useChatRooms(){return e._params.useChatRooms}static get addParticipant(){return e._params.addParticipant}static get waitForAdminInGroupCalls(){return e._params.waitForAdminInGroupCalls}static get hold(){return e._params.hold}static get maxParallelCalls(){return e._params.maxParallelCalls}static get participantListChunkInitIndex(){return e._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return e._params.participantListChunkInitCount??null}static get filterObservers(){return e._params.filterObservers}static get muteMode(){return e._params.muteMode}static get preserveAudioTracks(){return e._params.preserveAudioTracks}static get audioShare(){return T.isAudioShareSupported()&&e._params.audioShare}static get audioShareWindowInclude(){return e._params.audioShareWindowInclude}static get audioShareSystemInclude(){return e._params.audioShareSystemInclude}static get fastScreenShare(){return e._params.fastScreenShare}static get screenShareCongestionControl(){return e._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return e._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return e._params.fastScreenShareWidth}static get fastScreenShareHeight(){return e._params.fastScreenShareHeight}static get consumerFastScreenShare(){return e._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return e._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return e._params.videoSuspend}static get enumerateDevicesDelay(){return e._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return e._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return e._params.enableVideoEffectsFpsDegradation}static get simulcast(){return T.isSimulcastSupportedByBrowser()&&e._params.simulcast}static get webtransport(){return e._params.webtransport}static get webtransportFF(){return e._params.webtransportFF}static get transparentAudio(){return e._params.transparentAudio}static toJSON(){return{apiKey:e._params.apiKey,apiEnv:e._params.apiEnv,audioShare:e._params.audioShare,audioShareWindowInclude:e._params.audioShareWindowInclude,audioShareSystemInclude:e._params.audioShareSystemInclude,useCallsToContacts:e._params.useCallsToContacts,useParticipantListChunk:e._params.useParticipantListChunk,useRooms:e._params.useRooms,useChatRooms:e._params.useChatRooms,addParticipant:e._params.addParticipant,fastScreenShare:e._params.fastScreenShare,participantListChunkInitCount:e._params.participantListChunkInitCount,screenShareCongestionControl:e._params.screenShareCongestionControl,screenShareCongestionControlThreshold:e._params.screenShareCongestionControlThreshold,videoTracksCount:e._params.videoTracksCount,requestDisplayLayoutThrottleMs:e._params.requestDisplayLayoutThrottleMs,asrDataChannel:e._params.asrDataChannel,videoMaxHeight:e._params.videoMaxHeight,videoMaxWidth:e._params.videoMaxWidth,videoEffectMaxHeight:e._params.videoEffectMaxHeight,videoEffectMaxWidth:e._params.videoEffectMaxWidth,videoSuspend:e._params.videoSuspend,debugLog:e._params.debugLog,callStatReportEnabled:e._params.callStatReportEnabled,joinFromMultipleDevices:e._params.joinFromMultipleDevices,movieShare:e._params.movieShare,clientType:e._params.clientType,clientStatsPlatform:e._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:e._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:e._params.switchVideoAtBadNetwork,simulcast:e._params.simulcast,webtransport:e._params.webtransport,webtransportFF:e._params.webtransportFF,transparentAudio:e._params.transparentAudio}}};h(M,`_params`,{platform:`WEB`,clientStatsPlatform:``,clientType:`PORTAL`,externalUserType:``,device:`browser`,apiKey:``,authToken:``,anonymToken:``,apiEnv:`AUTO`,apiBaseUrl:null,domain:``,externalDomain:``,iceServers:[],wssBase:``,wtsBase:``,wssToken:``,signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,apiTimeout:5e3,apiMaxAttempt:10,forceRelayPolicy:!1,videoMinWidth:428,videoMinHeight:240,videoMaxWidth:1280,videoMaxHeight:720,videoAspectRatio:16/9,videoFrameRate:25,screenFrameRate:15,videoFacingMode:null,displaySurface:`monitor`,audioEffects:null,videoEffects:null,videoEffectMaxWidth:640,videoEffectMaxHeight:360,vmoji:null,vmojiOptions:null,iceRestartWaitTime:2e4,transportConnectionWaitTime:5e3,statisticsInterval:5e3,networkStatisticsInterval:2e4,perfStatReportEnabled:!0,callStatReportEnabled:!1,clientEventsLoggingEnabled:!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,webtransportFF:!1,transparentAudio:!1});var N=function(e){return e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.WAITING=`WAITING`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`,e.RECONNECT=`RECONNECT`,e.ERROR=`ERROR`,e.HANGUP=`HANGUP`,e.PERMISSIONS=`PERMISSIONS`,e.ONHOLD=`ONHOLD`,e}({});function P(e,...t){let n=M.get(e);typeof n==`function`&&setTimeout(n,0,...t)}function F(e,t,...n){if(M.filterObservers){if(Array.isArray(t)){if(t=t.filter(e=>!e.observer),!t.length)return}else if(t.observer)return}P(e,t,...n)}function I(e){return Object.assign({},e)}function _n(e){return e.slice()}var vn;(function(e){function t(e,t,n){P(`onLocalStream`,e,I(t),n)}e.onLocalStream=t;function n(e,t,n){P(`onScreenStream`,e,I(t),n)}e.onScreenStream=n;function r(e,t,n){P(`onVmojiStream`,e,I(t),n)}e.onVmojiStream=r;function i(e,t){P(`onVmojiError`,e,t)}e.onVmojiError=i;function a(e,t,n){P(`onLocalStreamUpdate`,I(e),t,n)}e.onLocalStreamUpdate=a;function o(e,t){R.debug(`Local status:`,e),P(`onLocalStatus`,e,t)}e.onLocalStatus=o;function s(e,t,n){F(`onRemoteStream`,e,t,n)}e.onRemoteStream=s;function c(e,t,n){F(`onRemoteLive`,e,t,n)}e.onRemoteLive=c;function l(e,t,n){F(`onLocalLive`,e,t,n)}e.onLocalLive=l;function u(e,t,n){F(`onRemoteLiveUpdate`,e,t,n)}e.onRemoteLiveUpdate=u;function d(e,t,n){F(`onLocalLiveUpdate`,e,t,n)}e.onLocalLiveUpdate=d;function f(e,t,n){F(`onRemoteScreenStream`,e,t,n)}e.onRemoteScreenStream=f;function p(e,t,n){F(`onRemoteVmojiStream`,e,t,n)}e.onRemoteVmojiStream=p;function m(e,t,n,r){F(`onRemoteStreamSuspended`,e,t,n,r)}e.onRemoteStreamSuspended=m;function ee(e,t,n,r,i,a){F(`onConversation`,e,I(t),I(n),r,i,a)}e.onConversation=ee;function te(e,t){e&&P(`onConversationParticipantListChunk`,e,t)}e.onConversationParticipantListChunk=te;function ne(e,t,n,r){F(`onRemoteMediaSettings`,e,I(t),n,r)}e.onRemoteMediaSettings=ne;function h(e,t,n){F(`onLocalMediaSettings`,e,I(t),n)}e.onLocalMediaSettings=h;function g(e,t,n,r){F(`onRemoteSharedMovieInfo`,e,I(t),n,r)}e.onRemoteSharedMovieInfo=g;function re(e,t,n,r){F(`onRemoteSharedMovieStoppedInfo`,e,I(t),n,r)}e.onRemoteSharedMovieStoppedInfo=re;function ie(e,t,n,r){F(`onLocalSharedMovieInfo`,e,I(t),n,r)}e.onLocalSharedMovieInfo=ie;function ae(e,t,n,r){F(`onLocalSharedMovieStoppedInfo`,e,I(t),n,r)}e.onLocalSharedMovieStoppedInfo=ae;function oe(e,t,n,r){F(`onRemoteSharedUrl`,e,t,n,r)}e.onRemoteSharedUrl=oe;function se(e,t,n){F(`onParticipantAdded`,e,t,n)}e.onParticipantAdded=se;function _(e,t,n){F(`onParticipantJoined`,e,t,n)}e.onParticipantJoined=_;function ce(e,t=!1,n){P(`onLocalParticipantState`,I(e),t,n)}e.onLocalParticipantState=ce;function le(e,t,n,r){F(`onRemoteParticipantState`,e,I(t),n,r)}e.onRemoteParticipantState=le;function ue(e,t,n){P(`onRemoteParticipantsState`,e,t,n)}e.onRemoteParticipantsState=ue;function de(e,t,n=null,r){R.debug(`Remote status:`,t,e),F(`onRemoteStatus`,e,t,n,r)}e.onRemoteStatus=de;function fe(){P(`onPermissionsRequested`)}e.onPermissionsRequested=fe;function pe(e,t){P(`onPermissionsError`,e,t)}e.onPermissionsError=pe;function me(e,t,n){F(`onRemoteRemoved`,e,t,n)}e.onRemoteRemoved=me;function he(e,t,n,r){P(`onCallState`,e,t,I(n),r)}e.onCallState=he;function ge(e,t,n){P(`onDeviceSwitched`,e,t,n)}e.onDeviceSwitched=ge;function _e(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null,u){let d=c?_n(c):void 0;P(`onMuteStates`,I(e),_n(t),_n(n),r,i,a,o,s,d,l,u)}e.onMuteStates=_e;function ve(e,t,n=!1,r){F(`onRolesChanged`,e,_n(t),n,r)}e.onRolesChanged=ve;function v(e,t=!1,n){P(`onLocalRolesChanged`,_n(e),t,n)}e.onLocalRolesChanged=v;function ye(e,t,n,r,i){F(`onPinnedParticipant`,e,t,n,r,i)}e.onPinnedParticipant=ye;function be(e,t,n){P(`onLocalPin`,e,t,n)}e.onLocalPin=be;function xe(e,t){P(`onOptionsChanged`,_n(e),t)}e.onOptionsChanged=xe;function Se(e){P(`onCallAccepted`,e)}e.onCallAccepted=Se;function Ce(e){P(`onCallActive`,e)}e.onCallActive=Ce;function we(e,t,n){F(`onAcceptedCall`,e,t,n)}e.onAcceptedCall=we;function Te(e){P(`onRateNeeded`,e)}e.onRateNeeded=Te;function Ee(e,t){F(`onSpeakerChanged`,e,t)}e.onSpeakerChanged=Ee;function De(e,t){P(`onVolumesDetected`,_n(e),t)}e.onVolumesDetected=De;function Oe(e,t){P(`onLocalVolume`,e,t)}e.onLocalVolume=Oe;function ke(e,t,n){P(`onJoinStatus`,e,t,n)}e.onJoinStatus=ke;function Ae(e,t){P(`onHangup`,e,t)}e.onHangup=Ae;function je(e){P(`onMultipartyChatCreated`,I(e))}e.onMultipartyChatCreated=je;function Me(){P(`onDeviceChange`)}e.onDeviceChange=Me;function Ne(e){P(`onFingerprintChange`,e)}e.onFingerprintChange=Ne;function Pe(){P(`onTokenExpired`)}e.onTokenExpired=Pe;function Fe(e,t,n=!1,r){P(`onChatMessage`,e,t,n,r)}e.onChatMessage=Fe;function Ie(e,t,n=!1,r){P(`onCustomData`,e,t,n,r)}e.onCustomData=Ie;function Le(e,t,n,r,i,a,o=null,s){P(`onRecordStarted`,e,t,n,r,i,a,o,s)}e.onRecordStarted=Le;function Re(e=null,t,n){P(`onRecordStopped`,e,t,n)}e.onRecordStopped=Re;function ze(e,t){P(`onLocalNetworkStatusChanged`,e,t)}e.onLocalNetworkStatusChanged=ze;function Be(e,t){P(`onNetworkStatusChanged`,e,t)}e.onNetworkStatusChanged=Be;function Ve(e,...t){P(`onDebugMessage`,e,...t)}e.onDebugMessage=Ve;function He(e,t,...n){P(`onDebugMessageWithContext`,e,t,...n)}e.onDebugMessageWithContext=He;function Ue(e,t){P(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=Ue;function We(){P(`onAutoplayError`)}e.onAutoplayError=We;function Ge(e,t,n,r,i,a){P(`onChatRoomUpdated`,e,t,n,r,i,a)}e.onChatRoomUpdated=Ge;function Ke(e,t){P(`onPromoted`,e,t)}e.onPromoted=Ke;function qe(e,t){P(`onRemoteMixedAudioStream`,e,t)}e.onRemoteMixedAudioStream=qe;function Je(e,t){P(`onJoinLinkChanged`,e,t)}e.onJoinLinkChanged=Je;function Ye(e,t){P(`onRoomsUpdated`,e,t)}e.onRoomsUpdated=Ye;function y(e,t,n,r,i){P(`onRoomUpdated`,e,t,n,r,i)}e.onRoomUpdated=y;function b(e,t){P(`onRoomParticipantsUpdated`,e,t)}e.onRoomParticipantsUpdated=b;function x(e,t){P(`onRoomSwitched`,e,t)}e.onRoomSwitched=x;function S(e,t){P(`onRoomStart`,e,t)}e.onRoomStart=S;function C(e,t=null,n){P(`onFeedback`,e,t,n)}e.onFeedback=C;function Xe(e,t){P(`onFeaturesPerRoleChanged`,e,t)}e.onFeaturesPerRoleChanged=Xe;function Ze(e,t){P(`onParticipantVmojiUpdate`,e,t)}e.onParticipantVmojiUpdate=Ze;function Qe(e,t,n){P(`onAsrSet`,e,t,n)}e.onAsrSet=Qe;function $e(e,t,n,r){P(`onAsrStarted`,e,t,n,r)}e.onAsrStarted=$e;function et(e,t){P(`onAsrStopped`,e,t)}e.onAsrStopped=et;function tt(e,t,n,r,i){P(`onAsrTranscription`,e,t,n,r,i)}e.onAsrTranscription=tt;function nt(e,t,n){P(`onParticipantIdChanged`,e,t,n)}e.onParticipantIdChanged=nt;function rt(e,t){P(`onVideoSuspendSuggest`,e,t)}e.onVideoSuspendSuggest=rt;function it(e){P(`onSignalingMessage`,typeof e==`string`?e:I(e))}e.onSignalingMessage=it;function at(e,t){P(`onPromotionApproved`,e,t)}e.onPromotionApproved=at;function ot(e){P(`onPeerRegistered`,e)}e.onPeerRegistered=ot})(vn||(vn={}));var L=vn,yn=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),bn;(function(e){let t=`📞`,n=()=>({sessionId:null,conversationId:null}),r=(e,t,...n)=>{L.onDebugMessage(t,...n),L.onDebugMessageWithContext(t,{conversationId:e.conversationId},...n)},i=console.debug.bind(console,t),a=console.log.bind(console,t),o=console.warn.bind(console,t),s=console.error.bind(console,t),c=!1;function l(e){if(!e)return n();try{return e()}catch{return n()}}function u(e,t,n){let u=l(n);if(M.debugLog&&je(e,t,u.sessionId||void 0),c)switch(e){case`DEBUG`:i(...t);break;case`LOG`:a(...t);break;case`WARN`:o(...t);break;case`ERROR`:s(...t);break}else r(u,e,...t)}function d(...e){u(`DEBUG`,e)}e.debug=d;function f(...e){u(`LOG`,e)}e.log=f;function p(...e){u(`WARN`,e)}e.warn=p;function m(...e){u(`ERROR`,e)}e.error=m;function ee(){return c}e.enabled=ee;function te(e){c=e,M.debugLog&&Me()}e.toggle=te;function ne(e,...t){switch(e){case`DEBUG`:d(...t);break;case`LOG`:f(...t);break;case`WARN`:p(...t);break;case`ERROR`:m(...t);break}}e.send=ne;function h(e){return{debug:(...t)=>u(`DEBUG`,t,e),log:(...t)=>u(`LOG`,t,e),warn:(...t)=>u(`WARN`,t,e),error:(...t)=>u(`ERROR`,t,e)}}e.createLogger=h;function g(e=null){let t=null,n=e;function r(){!M.debugLog||t||(t=Ne(),n&&Pe(n,t))}let i=()=>(r(),{sessionId:t,conversationId:n});return{get sessionId(){return t},get conversationId(){return n},setConversationId(e){n=e,t&&Pe(n,t)},debug:(...e)=>u(`DEBUG`,e,i),log:(...e)=>u(`LOG`,e,i),warn:(...e)=>u(`WARN`,e,i),error:(...e)=>u(`ERROR`,e,i)}}e.createSessionLogger=g;function re(e,...t){}e.test=re})(bn||(bn={}));var R=bn,z=new class{constructor(){h(this,`_conversations`,new Map),h(this,`_activeId`,null),h(this,`_mutex`,!1)}add(e){if(this._conversations.has(e.id))throw Error(`CallRegistry: conversation ${e.id} already exists`);this._conversations.set(e.id,e)}remove(e){this._mutex||(e&&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}getActiveId(){return this._activeId}has(e){return this._conversations.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();if(t)try{await t.hold(!0)}catch(e){throw R.error(`Can't hold previous active, error: ${e}`),Error(`Cannot switch call: hold failed`)}this._conversations.has(e)&&(this._activeId=e,L.onCallActive(e));let n=this._conversations.get(e);if(n&&n?.isCallHeld)try{await n.hold(!1)}catch(e){throw R.error(`Can't hold next active, error: ${e}`),Error(`Cannot switch call: hold failed`)}}finally{this._mutex=!1}}}clear(){this._conversations.clear(),this._activeId=null}},xn=class extends b{constructor(...e){super(...e),h(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}setConversationId(e){}readyToSend(e=!0){}cleanup(){}requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}},B=function(e){return e.RECOVER=`recover`,e.ACCEPT_CALL=`accept-call`,e.ADD_PARTICIPANT=`add-participant`,e.REMOVE_PARTICIPANT=`remove-participant`,e.HANGUP=`hangup`,e.TRANSMIT_DATA=`transmit-data`,e.ACCEPT_PRODUCER=`accept-producer`,e.ALLOCATE_CONSUMER=`allocate-consumer`,e.CHANGE_MEDIA_SETTINGS=`change-media-settings`,e.CHANGE_PARTICIPANT_STATE=`change-participant-state`,e.CHANGE_STREAM_PRIORITIES=`change-streams-priorities`,e.UPDATE_DISPLAY_LAYOUT=`update-display-layout`,e.REPORT_PERF_STAT=`report-perf-stat`,e.REPORT_SHARING_STAT=`report-sharing-stat`,e.REPORT_NETWORK_STAT=`report-network-stat`,e.RECORD_START=`record-start`,e.RECORD_STOP=`record-stop`,e.RECORD_PUBLISH=`record-publish`,e.RECORD_SET_CONF=`record-set-conf`,e.RECORD_GET_STATUS=`record-get-status`,e.SWITCH_MICRO=`switch-micro`,e.SWITCH_TOPOLOGY=`switch-topology`,e.REQUEST_REALLOC=`request-realloc`,e.CHAT_MESSAGE=`chat-message`,e.CHAT_HISTORY=`chat-history`,e.CUSTOM_DATA=`custom-data`,e.GRANT_ROLES=`grant-roles`,e.MUTE_PARTICIPANT=`mute-participant`,e.ENABLE_FEATURE_FOR_ROLES=`enable-feature-for-roles`,e.PIN_PARTICIPANT=`pin-participant`,e.UPDATE_MEDIA_MODIFIERS=`update-media-modifiers`,e.CHANGE_OPTIONS=`change-options`,e.GET_WAITING_HALL=`get-waiting-hall`,e.GET_PARTICIPANT_LIST_CHUNK=`get-participant-list-chunk`,e.GET_PARTICIPANTS=`get-participants`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.REQUEST_TEST_MODE=`request-test-mode`,e.ADD_MOVIE=`add-movie`,e.UPDATE_MOVIE=`update-movie`,e.REMOVE_MOVIE=`remove-movie`,e.START_URL_SHARING=`start-url-sharing`,e.STOP_URL_SHARING=`stop-url-sharing`,e.GET_ROOMS=`get-rooms`,e.UPDATE_ROOMS=`update-rooms`,e.ACTIVATE_ROOMS=`activate-rooms`,e.REMOVE_ROOMS=`remove-rooms`,e.SWITCH_ROOM=`switch-room`,e.FEEDBACK=`feedback`,e.ASR_START=`asr-start`,e.ASR_STOP=`asr-stop`,e.REQUEST_ASR=`request-asr`,e.REQUEST_PROMOTION=`request-promotion`,e.ACCEPT_PROMOTION=`accept-promotion`,e.GET_HAND_QUEUE=`get-hand-queue`,e.ENABLE_VIDEO_SUSPEND=`enable-video-suspend`,e.ENABLE_VIDEO_SUSPEND_SUGGEST=`enable-video-suspend-suggest`,e.HOLD=`hold`,e.PUT_HANDS_DOWN=`put-hands-down`,e.CHANGE_SIMULCAST=`change-simulcast`,e}(B||{});function Sn(e){return e.stopStream}function Cn(e){return e.keyFrameRequested}function wn(e){if(Sn(e))return`ss`;if(Cn(e))return`kf`;let t=``;return e.priority!==void 0&&(t+=`p=`+e.priority),e.width!==void 0&&e.height!==void 0&&(t!==``&&(t+=`:`),t+=`sz=`+Math.round(e.width)+`x`+Math.round(e.height)),e.fit!==void 0&&(t!==``&&(t+=`:`),t+=`fit=`+e.fit),t}var V=function(e){return e.CAMERA=`CAMERA`,e.SCREEN=`SCREEN`,e.STREAM=`STREAM`,e.MOVIE=`MOVIE`,e.ANIMOJI=`ANIMOJI`,e.SHARED_URL=`SHARED_URL`,e}({}),Tn=`s`,En=`m`;function Dn(e){return e.participantId+(e.mediaType?`:`+Tn+e.mediaType:``)+(e.streamName?`:`+En+e.streamName:``)}function On(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 Tn:r=kn(n.slice(1));break;case En:i=n.slice(1);break;case`d`:a=Number.parseInt(n.slice(1),10);break;default:throw Error(`Unexpected parameter type `+n.charAt(0)+` in stream description `+e)}return{participantId:j.compose(n,a),mediaType:r,streamName:i}}function kn(e){for(let t of Object.keys(V))if(t===e)return V[t];return null}function An(){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),jn(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 jn(e){return e.buffer!==void 0}function Mn(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 Nn=0,Pn=1,Fn=2,In=3,Ln=4,Rn=5,zn=6,Bn=7,Vn=0,Hn=1,Un=2,Wn=0,Gn=0,Kn=0,qn=1,Jn=class{constructor(e=R){h(this,`participantIdRegistry`,null),h(this,`_debug`,void 0),this._debug=e}setParticipantIdRegistry(e){this.participantIdRegistry=e}serializeUpdateDisplayLayout(e,t){let n=An();l.Int.enc(n,Nn),l.Int.enc(n,Wn),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=An();if(this.writeStreamDesc(t,i),Sn(r))l.Int.enc(i,Hn);else if(Cn(r))l.Int.enc(i,Un);else if(l.Int.enc(i,Vn),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,Kn);break;case`cn`:l.Int.enc(i,qn);break;default:l.Nil.enc(i,null)}else l.Nil.enc(i,null);n.push(i.ui8array().buffer)}writeStreamDesc(e,t){if(this.participantIdRegistry){let n=this.participantIdRegistry.getCompactId(e);if(n!==void 0){l.Int.enc(t,n);return}}l.Str.enc(t,e)}serializePerfStatReport(e,t){let n=An();return l.Int.enc(n,Pn),l.Int.enc(n,Wn),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=An();return l.Int.enc(n,Fn),l.Int.enc(n,Wn),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=An();return l.Int.enc(n,In),l.Int.enc(n,Wn),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=An();return l.Int.enc(n,Ln),l.Int.enc(n,Wn),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=An();return l.Int.enc(n,Rn),l.Int.enc(n,Wn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=An();return l.Int.enc(n,zn),l.Int.enc(n,Wn),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=An();l.Int.enc(n,Bn),l.Int.enc(n,Wn),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?Mn(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await sn(e)):Mn(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==Wn){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==Gn){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Nn:return this.deserializeUpdateDisplayLayoutResponse(t);case Pn: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=Mn(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=Dn(this.participantIdRegistry?.getStreamDescription(e));r[i]=l.Int.dec(t)}}),{type:`response`,sequence:t,response:B.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:r}}deserializeReportPerfStatResponse(e){let t=l.Int.dec(e),n=l.Int.dec(e);return{type:`response`,sequence:t,response:B.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:n}}},H=function(e){return e.CALL_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.CALL_START=`call_start`,e.SIGNALING_PING_SUMMARY=`signaling_ping_summary`,e.SIGNALING_COMMAND_SUMMARY=`signaling_command_summary`,e.WEBSOCKET_CONNECTED=`websocket_connected`,e.WEBSOCKET_RECONNECTED=`websocket_reconnected`,e.WEBSOCKET_FAILED_PINGS=`websocket_failed_pings`,e.WEBSOCKET_FAILED_EXCEPTION=`websocket_failed_exception`,e.WEBSOCKET_TIMEOUT=`websocket_timeout`,e.WEBSOCKET_RESTART=`websocket_restart`,e.WEBTRANSPORT_CONNECTED=`webtransport_connected`,e.WEBTRANSPORT_RECONNECTED=`webtransport_reconnected`,e.WEBTRANSPORT_FAILED_PINGS=`webtransport_failed_pings`,e.WEBTRANSPORT_FAILED_EXCEPTION=`webtransport_failed_exception`,e.WEBTRANSPORT_TIMEOUT=`webtransport_timeout`,e.WEBTRANSPORT_RESTART=`webtransport_restart`,e}(H||{}),Yn=1e3;function U(e,t,n=0){return t in e&&e[t]?e[t]:n}function Xn(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function Zn(e,t){return n=>n[e]===t}function Qn(e){return(t,n)=>n[e]-t[e]}function $n(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function er(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function tr(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>[t,e[t]]).reduce((e,t)=>(e[t[0]]=j.isObject(t[1])?tr(t[1]):t[1],e),{})}function nr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function rr(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(nr).then(er)}function ir(e){let t=e.filter(Zn(`type`,`candidate-pair`)).sort(Qn(`priority`)).find(Xn(Zn(`nominated`,!0),Zn(`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(Zn(`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(Zn(`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}}),tr(n)}function ar(e,t,n=!1){let r=$n(`id`,e),i=n?e.filter(Xn(Zn(`type`,`remote-inbound-rtp`))):e.filter(Xn(Zn(`type`,`inbound-rtp`),Zn(`type`,`outbound-rtp`)));return T.browserName()===`Firefox`&&(i=Object.values(i.reduce((e,t)=>{if(!e[t.ssrc])e[t.ssrc]=t;else{let n=Object.assign({},e[t.ssrc],t),r=e[t.ssrc].isRemote?t:e[t.ssrc];n.id=r.id,n.type=r.type,delete n.isRemote,delete n.remoteId,e[n.ssrc]=n}return e},{}))),i.map(e=>{let n=Number(e.ssrc),i=e.mediaType||e.kind,a=e.remoteId||e.trackId,o=e.type,s=e.codecId;if(!o||!n||!i)return null;let c={ssrc:n,type:o,kind:i,bytesReceived:U(e,`bytesReceived`),bytesSent:U(e,`bytesSent`),headerBytesReceived:U(e,`headerBytesReceived`),headerBytesSent:U(e,`headerBytesSent`),jitter:U(e,`jitter`),packetsLost:U(e,`packetsLost`),packetsReceived:U(e,`packetsReceived`),packetsSent:U(e,`packetsSent`),fractionLost:U(e,`fractionLost`),pliCount:U(e,`pliCount`),firCount:U(e,`firCount`),nackCount:U(e,`nackCount`),userId:t[n],freezeCount:U(e,`freezeCount`,0),totalFreezesDuration:U(e,`totalFreezesDuration`,0)},l=`mid`in e&&typeof e.mid==`string`?e.mid:void 0,u=`rid`in e&&typeof e.rid==`string`?e.rid:void 0;if(l&&(c.mid=l),u&&(c.rid=u),i===`video`){let t=U(e,`framesDecoded`),n=U(e,`totalInterFrameDelay`),r=U(e,`totalSquaredInterFrameDelay`),i=U(e,`encoderImplementation`),a=U(e,`decoderImplementation`);i&&(c.encoderImplementation=i),a&&(c.decoderImplementation=a),c.interframeDelayVariance=(r-n*n/t)/t}if(i===`video`&&c.type===`outbound-rtp`&&(c.totalEncodeTime=U(e,`totalEncodeTime`)??0),i===`audio`&&(c.totalSamplesReceived=U(e,`totalSamplesReceived`),c.concealedSamples=U(e,`concealedSamples`),c.insertedSamplesForDeceleration=U(e,`insertedSamplesForDeceleration`),c.removedSamplesForAcceleration=U(e,`removedSamplesForAcceleration`),c.silentConcealedSamples=U(e,`silentConcealedSamples`),c.concealmentEvents=U(e,`concealmentEvents`),c.totalAudioEnergy=U(e,`totalAudioEnergy`)),s&&r[s]){let e=r[s];c.clockRate=e.clockRate,c.mimeType=e.mimeType,i===`audio`&&e.sdpFmtpLine&&(c.sdpFmtpLine=e.sdpFmtpLine)}if(a&&r[a]){let e=r[a];c.frameHeight=e.frameHeight,c.frameWidth=e.frameWidth,c.framesDecoded=e.framesDecoded,c.framesReceived=e.framesReceived,c.framesDropped=e.framesDropped}return tr(c)}).filter(e=>!!e)}function or(e,t,n=!1){if(!t||!t.rtps||!e.rtps)return e;let r,i;n&&(r=$n(`ssrc`,e?.remoteRtps||[]),i=$n(`ssrc`,t?.remoteRtps||[]));let a=$n(`ssrc`,e.rtps),o=$n(`ssrc`,t.rtps),s=(e.timestamp-t.timestamp)/1e3;return!a||!o||Object.keys(a).forEach(c=>{let l=a[c],u=o[c];if(!(!l||!u)){if(l.bytesReceived&&l.bytesReceived>u.bytesReceived&&(l.bandwidth=Math.round((l.bytesReceived-u.bytesReceived)/s),l.bandwidth+=Math.round((l.headerBytesReceived-u.headerBytesReceived)/s)),l.bytesSent&&l.bytesSent>u.bytesSent&&(l.bandwidth=Math.round((l.bytesSent-u.bytesSent)/s),l.bandwidth+=Math.round((l.headerBytesSent-u.headerBytesSent)/s)),l.packetsReceived)if(l.packetsReceived>u.packetsReceived||l.packetsLost>u.packetsLost){let e=l.packetsLost-u.packetsLost,t=l.packetsReceived-u.packetsReceived;l.packetLoss=parseFloat((100*e/(e+t)).toFixed(2))}else l.packetLoss=0;if(l.freezeCount>u.freezeCount&&(l.freezeCountDelta=l.freezeCount-u.freezeCount),l.totalFreezesDuration>u.totalFreezesDuration&&(l.totalFreezesDurationDelta=l.totalFreezesDuration-u.totalFreezesDuration),l.framesDropped&&u.framesDropped&&l.framesDropped>u.framesDropped&&(l.framesDroppedDelta=parseFloat(((l.framesDropped-u.framesDropped)/s).toFixed(0))),n&&l.type===`outbound-rtp`&&l.kind===k.video){let n=r?.[c],a=i?.[c],o=e=>e??0,s=Math.max(0,o(n?.packetsLost)-o(a?.packetsLost)),d=Math.max(1,l.packetsSent-u.packetsSent);e.transport.averageNetStat={currentRoundTripTime:(e.transport.currentRoundTripTime+t.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(s/d*100)}}}}),e}async function sr(e,t,n={},r=!1){let i=await rr(e),a={timestamp:Date.now(),transport:ir(i),rtps:ar(i,n)};return r&&(a.remoteRtps=ar(i,n,!0)),t?or(a,t,r):(await j.delay(Yn),sr(e,a,n,r))}function cr(e){performance.clearMarks(e),performance.mark(e)}function lr(e){performance.clearMarks(e)}function ur(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 dr(e){return`${H.SCREENSHARE_FIRST_FRAME}_${fr(e)}`}function fr(e){return typeof e==`string`?e:JSON.stringify(e)}var W={distinctById:er,rtcStatsToArray:nr,extractTransport:ir,extractRtps:ar,delta:or,collectStats:sr,setMark:cr,clearMark:lr,measureMark:ur,getMarkNameScreenshareFirstFrame:dr},pr=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(pr||{}),mr=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(mr||{}),G=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.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}(G||{}),hr=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),gr=function(e){return e.CONNECTED=`connected`,e.RECONNECTED=`reconnected`,e.FAILED_PINGS=`failed_pings`,e.FAILED_EXCEPTIONS=`failed_exception`,e.TIMEOUT=`timeout`,e.RESTART=`restart`,e}({}),_r={connected:{wt:H.WEBTRANSPORT_CONNECTED,ws:H.WEBSOCKET_CONNECTED},reconnected:{wt:H.WEBTRANSPORT_RECONNECTED,ws:H.WEBSOCKET_RECONNECTED},failed_pings:{wt:H.WEBTRANSPORT_FAILED_PINGS,ws:H.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:H.WEBTRANSPORT_FAILED_EXCEPTION,ws:H.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:H.WEBTRANSPORT_TIMEOUT,ws:H.WEBSOCKET_TIMEOUT},restart:{wt:H.WEBTRANSPORT_RESTART,ws:H.WEBSOCKET_RESTART}},K=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}(K||{}),q=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}(q||{}),vr=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(vr||{}),{isObject:yr,isObjectsEquals:br}=j;function xr(e,t){return e===null||t===null?e===null&&t===null:e.maxDimension!==t.maxDimension||e.maxBitrateK!==t.maxBitrateK||e.maxFramerate!==t.maxFramerate||e.degradationPreference!==t.degradationPreference||e.scalabilityMode!==t.scalabilityMode||yr(e.bitrates)&&yr(t.bitrates)&&!br(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Sr=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Cr(e,t){return!(!xr(e.camera,t.camera)||!xr(e.screenSharing,t.screenSharing)||!xr(e.fastScreenSharing,t.fastScreenSharing))}function wr(e,t){return{camera:Object.assign({},e.camera,t.camera),screenSharing:Object.assign({},e.screenSharing,t.screenSharing),fastScreenSharing:Object.assign({},e.fastScreenSharing,t.fastScreenSharing)}}function Tr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Er=class extends b{constructor(e,t){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_state`,K.IDLE),h(this,`_pc`,null),this._signaling=e,this._mediaSource=t}getState(){return this._state||K.IDLE}},Dr=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}},Or=.25,kr=.35,Ar=85,jr=.1,Mr=1.5,Nr=.1,Pr=1,Fr=.6,Ir=.3,Lr=class extends b{constructor(e,t=R){super(),h(this,`_signaling`,void 0),h(this,`_localNetworkStat`,void 0),h(this,`_remoteNetworkStat`,void 0),h(this,`_lastNetworkStat`,void 0),h(this,`_networkLimits`,{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}}),h(this,`_lastStatSentTimestamp`,0),h(this,`_currentState`,`good`),h(this,`_debug`,void 0),this._debug=t,this._signaling=e,this._localNetworkStat={rtt:new Dr(Or,Or),loss:new Dr(kr,kr),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)/Ar);for(let e=0;e<r;e++)n*=1-jr;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)/Mr);for(let e=0;e<r;e++)n*=1-Nr;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*Pr;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>=Fr?`good`:e>=Ir?`medium`:`bad`}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol===`tcp`,n=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),r=e.inbound.rtps.reduce((e,t)=>Math.max(e,t.packetLoss||0),0),i={rtt:this._localNetworkStat.rtt.update(n),loss:this._localNetworkStat.loss.update(r)};if(t){let t=e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0);i.bitrate=t,this._localNetworkStat.bitrate=t}let a=Date.now(),o=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),s=Math.max(Math.round(o*10)/10,.1),c=this._getNetworkState(s);(t||c!==this._currentState||a-this._lastStatSentTimestamp>M.networkStatisticsInterval)&&(this._lastStatSentTimestamp=a,this._signaling.customData({sdk:Object.assign({type:`bad-net`},i)},null).catch(e=>{this._debug.warn(`Unable to send [bad-net]`,e)})),this._currentState=c,this._triggerEvent(J.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}},Rr=30*1e3,zr=class e extends Er{constructor(e,t,n,r,i,a=R,o=null,s=null,c=null){super(n,r),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,`_lastStat`,void 0),h(this,`_fingerprint`,null),h(this,`_neverConnected`,!0),h(this,`_serverSettings`,void 0),h(this,`_prevConsumerSettings`,{}),h(this,`_networkLimitsForVideo`,{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}}),h(this,`_videoMaxDimensionsForNet`,{worst:320,bad:640,good:1280}),h(this,`_lastVideoMaxDimension`,this._videoMaxDimensionsForNet.good),h(this,`_lastBadConnection`,0),h(this,`_perfStatReporter`,void 0),h(this,`_directStatReporter`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),this._participantId=e,this._isMaster=t,this._serverSettings=i,this._debug=a,this._logger=o,this._statAggregator=s,this._codecStatsAggregator=c,this._perfStatReporter=new oa(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new Lr(n,this._debug),this.subscribe(this._signaling,mr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._applySettings.bind(this)),this.subscribe(this._directStatReporter,J.NETWORK_STATUS,this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:M.iceServers,iceTransportPolicy:M.forceRelayPolicy?`relay`:`all`})}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}if(this._pc.onicecandidate=this._handleIceCandidate.bind(this),this._pc.ontrack=this._onAddTrack.bind(this),this._pc.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),this._pc.onconnectionstatechange=this._onConnectionStateChange.bind(this),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},M.vmoji&&this._createDataChannel(this._pc,vr.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(C.ERROR,`addTrack-direct`),this._debug.error(`Unable to add media source tracks`,e,{participantId:this._participantId}),this._failedOnCreate=e;return}this._createOffer(!1).catch(e=>{this._state===K.IDLE?this._failedOnCreate=e:this.close(e)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return[K.IDLE,K.CLOSED,K.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.close(this._failedOnCreate);return}if(this._debug.debug(`DirectTransport: Open transport`,{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(C.ERROR,`addTrack-direct`),this._debug.error(`DirectTransport: Unable to add media source tracks`,e,{participantId:this._participantId}),this.close(e);return}this._setState(K.OPENED);let t=e;if(!e){let e=Object.keys(this._remoteSDP);t=e[e.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){Cr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(M.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&(this._isOpen=!1,this._stopReconnection(),this._remoteStream&&(this._remoteStream.getTracks().forEach(e=>{e.stop(),this._triggerEvent(J.REMOTE_TRACK_REMOVED,this._remoteStream,e)}),this._remoteStream=null),this._stopStatInterval(),this._stopSettingsInterval(),this._pc&&(this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close()),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),this._onNetworkStatus(1),this.unsubscribe(),e?(this._debug.error(`DirectTransport: Closed`,e,{participantId:this._participantId}),this._setState(K.FAILED)):(this._debug.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(K.CLOSED)),this._triggerEvent(J.PEER_CONNECTION_CLOSED))}_setState(e){this._state!==e&&(this._debug.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent(J.STATE_CHANGED,e))}_onSignalingNotification(e){switch(e.notification){case G.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case G.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case G.CUSTOM_DATA:Object.hasOwn(e.data,`sdk`)&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,n=j.getPeerIdString(e.peerId);j.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(n,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(n,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){this._debug.debug(`Add remote ice candidate`,{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(e){throw this._logger?.log(C.ERROR,`addIceCandidate-direct`),this._debug.error(`Unable to add remote ice candidate`,e,{participantId:this._participantId,candidate:t}),e}}else this._debug.debug(`Cache remote ice candidate`,{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){this._debug.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let n of t)try{await this._addIceCandidate(e,n)}catch{}}async _setRemoteDescription(t,n){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===t)&&this._pc){if(this._lastRemoteSDP?.sdp===n.sdp)return;this._lastRemoteSDP=n,n=e._patchRemoteDescription(n),this._debug.debug(`Add remote description`,{participantId:this._participantId,sdp:n}),this._calcFingerprint(n.sdp);try{await this._pc.setRemoteDescription(n),await this._setRemoteCandidates(t),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(e){throw this._logger?.log(C.ERROR,`setRemoteDescription-direct`),this._debug.error(`Unable to set remote description`,e,{participantId:this._participantId,sdp:n}),e}}else this._remoteSDP[t]=n}_processAnimojiProtocolVersion(e){let t=Math.min(e,M.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){this._debug.debug(`Added remote track`,{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=e=>{this._triggerEvent(J.REMOTE_TRACK_REMOVED,this._remoteStream,e.track)}),this._triggerEvent(J.REMOTE_TRACK_ADDED,this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(this._debug.debug(`Local ice candidate`,{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){this._debug.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:M.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case`have-local-offer`:let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(Error());break;case`have-remote-offer`:this._createAnswer().then(t=>this._signaling.sendSdp(this._participantId,t,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case`checking`:let e=this.getState();e===K.IDLE||e===K.OPENED?this._setState(K.CONNECTING):this._setState(K.RECONNECTING);break;case`connected`:case`completed`:T.browserName()===`Safari`&&this._pc?.connectionState!==`connected`&&this._markConnected();break}}_markConnected(){this._neverConnected=!1,this._setState(K.CONNECTED),this._stopReconnection(),this._pc&&j.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(C.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))}),this._startStatInterval()}_onConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),this._logger?.log(C.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case`connected`:this._markConnected();break;case`failed`:case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection ${this._pc.connectionState}`)):(this._setState(K.RECONNECTING),this._startReconnection());break;case`closed`:this.close(Error(`Ice connection closed`));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(this._debug.log(`Waiting for reconnection...`,{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},M.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(q.SERVER))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(this._logger?.log(C.ICE_RESTART),this._debug.log(`Ice restart`,{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):this._debug.debug(`Waiting for ice restart...`,{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,this._debug.error(`Ice restart failed`,{participantId:this._participantId}),this._logger?.log(C.ERROR,`iceRestart-direct`),this._requestTopologySwitch()},M.iceRestartWaitTime)}async _createOffer(t){let n={iceRestart:t,offerToReceiveAudio:!0,offerToReceiveVideo:!0};this._debug.debug(`Create offer`,{participantId:this._participantId,options:n});let r;try{r=await this._pc?.createOffer(n),this._debug.debug(`Created offer`,{participantId:this._participantId,offer:r}),r=e._patchLocalDescription(r)}catch(e){throw this._debug.error(`Unable to create offer`,e,{participantId:this._participantId}),this._logger?.log(C.ERROR,`createOffer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(C.ERROR,`setLocalDescription-direct`),e}}async _createAnswer(){this._debug.debug(`Create answer`,{participantId:this._participantId});let t;try{t=await this._pc?.createAnswer(),this._debug.debug(`Created answer`,{participantId:this._participantId,answer:t}),t=e._patchLocalDescription(t)}catch(e){throw this._debug.error(`Unable to create answer`,e,{participantId:this._participantId}),this._logger?.log(C.ERROR,`createAnswer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,answer:t}),this._calcFingerprint(t.sdp),await this._pc?.setLocalDescription(t),t}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(C.ERROR,`setLocalDescription-direct`),e}}static _patchLocalDescription(e){let t=!!T.baseChromeVersion();return e.sdp=j.patchLocalSDP(e.sdp,M.preferH264&&T.canPreferH264(),T.isBrokenH264Decoder(),M.preferVP9,t&&M.audioNack),e}static _patchRemoteDescription(e){return e.sdp=j.patchRemoteSDP(e.sdp,!1,!1,!1,M.preferVP9,T.isBrokenVP9Encoder(),T.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(e=>{this._debug.error(`DirectTransport: Unable to replace track`,e,{participantId:this._participantId}),this._logger?.log(C.ERROR,`replaceTrack-direct`)})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}W.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,this._codecStatsAggregator?.reportUsage(t);let n={inbound:{topology:q.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`inbound-rtp`?(e.userId=this._participantId,!0):!1)},outbound:{topology:q.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:q.DIRECT,transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(n),this._directStatReporter.reportLocal(n),this._triggerEvent(J.REMOTE_DATA_STATS,n),this._statInterval=window.setTimeout(e,M.statisticsInterval)})};this._statInterval=window.setTimeout(e,M.statisticsInterval)}async _isSVCSupported(e,t){let n=this._mediaSource.getSendVideoTrack(),r=e.outbound.rtps.find(e=>e.kind===`video`);if(!r?.mimeType||!r?.bandwidth||!n)return!1;let i=n.getSettings();if(!i.width||!i.height||!i.frameRate)return!1;let a={type:T.browserName()===`Firefox`?`transmission`:`webrtc`,video:{contentType:r.mimeType,width:i.width,height:i.height,bitrate:r.bandwidth,framerate:i.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(a)).supported||!1}catch(e){return this._debug.warn(`Failed to get encodingInfo`,a,e),!1}}async _checkPPTNetwork(e){if(!M.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,n=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,r=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,i=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,a=this._videoMaxDimensionsForNet.good,o=Sr.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=Sr.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=Sr.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Sr.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Rr)||this._lastVideoMaxDimension===a)return;let s=this._serverSettings.camera;if(!s||!await this._isSVCSupported(e,o))return;this._debug.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a}),this._lastVideoMaxDimension=a;let c={...this._serverSettings,camera:{...s,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(c)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[``]=e,this._triggerEvent(J.NETWORK_STATUS,t)}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=j.sdpFingerprint(e);if(t===null){this._debug.warn(`Fingerprint calculation is unsupported`);return}this._fingerprint===null?this._fingerprint=t:(L.onFingerprintChange((this._fingerprint^t).toString()),this._fingerprint=null)}_applySettings(){let e=this._mediaSource.mediaSettings.isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState===`connected`&&(this._prevConsumerSettings=j.applySettings(this._pc,e,this._prevConsumerSettings,this._debug))}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{negotiated:!0,id:1});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),r.onerror=e=>{this._debug.error(`[${t}] data channel error`,e)},n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)}}},Br=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),Vr=16,Hr=class e{constructor(e,t,n,r=R){h(this,`_datachannel`,void 0),h(this,`_participantIdRegistry`,void 0),h(this,`_asrCallback`,void 0),h(this,`_textDecoder`,void 0),h(this,`_debug`,void 0),this._debug=r,this._debug.debug(`AsrReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._asrCallback=n,this._textDecoder=new TextDecoder,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}static parse(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint8(1);if(r!==0)throw Error(`Unsupported message type. Message type: ${r}`);let i=t.getUint16(2),a=t.getUint32(4),o=t.getUint32(8),s=t.getUint32(12);if(n!==1)throw Error(`Unexpected protocol version. Got ${n}, expected 1`);return{sequence:i,ssrc:a,timestamp:o,duration:s,data:e.slice(Vr)}}_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}},Ur,Wr=class{constructor(){h(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};Ur=Wr,h(Wr,`_instance`,null),h(Wr,`getInstance`,()=>(Ur._instance||(Ur._instance=new Ur),Ur._instance));var Gr=class{constructor(e=R){h(this,`streamDescriptionByCompactId`,new Map),h(this,`compactIdByStreamDescription`,new Map),h(this,`_debug`,void 0),this._debug=e}getStreamDescription(e){return this.streamDescriptionByCompactId.get(e)}getCompactId(e){return this.compactIdByStreamDescription.get(e)}handleMessage(e){let t=new Uint8Array(e),n=t[0],r=t.subarray(1);switch(n){case 1:let e=(0,l.decode)(r);return Object.entries(e).forEach(([e,t])=>{let n=On(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:G.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:G.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:G.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:G.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:G.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:G.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:G.VIDEO_SUSPEND_SUGGEST,bandwidth:u};default:return this._debug.debug(`unsupported message type: `+n),null}}_decodeMediaType(e){if(e===null)return null;switch(e){case 0:return V.CAMERA;case 1:return V.SCREEN;default:throw Error(`Unsupported media type: ${e}`)}}_createParticipantSourcesUpdateNotification(e){let t=(0,l.decode)(e),n=[];for(let[e,r]of Object.entries(t)){let t=r[0],i=r[1],a=r[2],o=!!r[3],s=r[4]===null?void 0:!!r[4],c;if(t!==null){if(c=this.getStreamDescription(t),!c){this._debug.error(`could not uncompress participant ID ${t}`);continue}}else c=null;if(a===null){this._debug.error(`unexpected null sequenceNumber`,e,r);continue}let l=Br.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:G.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},Kr=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}({}),qr=class{constructor(e=R,t=null){h(this,`_worker`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._debug=e,this._logger=t}async _createWorker(e,t,n=[],r={},i=[]){return new Promise((a,o)=>{let s=n.join(`,`),c=new Blob([e,`exports.default(${s});`],{type:`application/javascript; charset=utf-8`}),l=window.URL.createObjectURL(c);this._worker=new Worker(l),this._worker.onmessage=e=>{switch(e.data.type){case Kr.READY:a();break;case Kr.ERROR:o(e.data.error);break;case Kr.FRAME:t(e.data);break;case Kr.DEBUG:this._debug.debug(e.data.message);break;case Kr.LOG_ERROR:this._logger?.log(C.ERROR,e.data.message);break}},this._sendToWorker(Kr.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}static isBrowserSupported(){throw Error(`Not implemented`)}},Jr=class extends qr{constructor(e=R,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`LibVPxDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n)=>{let r=null,i=null,a=!0,o=!1;function s(){return t({locateFile:n}).then(e=>i=e)}function c(t,n,s,c){if(!i){self.postMessage({type:e.LOG_ERROR,message:`decoder-init-fail-libvpx`}),self.postMessage({type:e.FRAME,error:`Fatal initialization error`});return}if(a!==s&&(a=s,r&&(r=null,self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec changed to ${s?`VP9`:`VP8`} - reinitialize`}))),!r&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec ${s?`VP9`:`VP8`}`}),r=new i.VpxDecoder,r.debug(c),!r.init(s?i.VpxType.VP9:i.VpxType.VP8))){r=null,self.postMessage({type:e.FRAME,error:`Decoder failed to create`});return}try{r.allocateBuffer(n.byteLength).set(new Uint8Array(n))}catch(t){self.postMessage({type:e.DEBUG,message:t}),r=null,self.postMessage({type:e.FRAME,error:String(t)});return}if(r.decode()&&r.nextImage())o=!1;else{self.postMessage({type:e.FRAME,error:`Decode failed`}),l();return}let u=r.getImageBuffer();if(!u){self.postMessage({type:e.FRAME,error:`No decoded data`});return}let d=r.getImageWidth(),f=r.getImageHeight();r.nextImage()&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxDecoder-drop`}));let p=new Uint8ClampedArray(u.byteLength);p.set(u),self.postMessage({type:e.FRAME,data:p.buffer,width:d,height:f},[p.buffer])}function l(){o||(self.postMessage({type:e.FRAME,requestKeyFrame:!0}),o=!0)}s().then(()=>{self.onmessage=t=>{switch(t.data.type){case e.FRAME:c(t.data.timestamp,t.data.data,t.data.isVP9,t.data.debug);break}},self.postMessage({type:e.READY})}).catch(t=>{self.postMessage({type:e.ERROR,error:String(t)})})}})(),exports={default:workerExports};",r=>{r.error?(this._debug.warn(`LibVPxDecoder`,r.error),t(r.error)):r.requestKeyFrame?(this._debug.debug(`LibVPxDecoder requests key frame`),n()):e(new ImageData(new Uint8ClampedArray(r.data),r.width,r.height))},[u.default,u.default.getUrl])}decodeFrame(e,t,n,r){this._sendToWorker(Kr.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r,debug:R.enabled()},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`LibVPxDecoder destroyed`)}static isBrowserSupported(){return`WebAssembly`in window&&`Worker`in window}},Yr=class extends qr{constructor(e=R,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`WebCodecsDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return n=>{let r=null,i=`no-preference`,a=!0,o=!1,s=!1,c=null,l=null;function u(){self.postMessage({type:t.READY})}function d(e,n,r,i=!1){c={timestamp:e,data:n,isVP9:r,keyFrame:i};let a=p(r);if(o&&!i){self.postMessage({type:t.FRAME,error:`WebCodecsDecoder waiting for keyframe`}),f();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});try{a.decode(l)}catch(e){m(`because failed call decode: ${e.message}`);return}h(i)}self.onmessage=e=>{switch(e.data.type){case t.INIT:u();break;case t.FRAME:d(e.data.timestamp,e.data.data,e.data.isVP9,e.data.keyFrame);break}};function f(){s||(self.postMessage({type:t.FRAME,requestKeyFrame:!0}),s=!0)}function p(e){return a!==e&&(a=e,m(`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=>{g();let r=n?[e]:[];self.postMessage({type:t.FRAME,data:e},r),e.close()},error:e=>{g(),m(`because error during decoding: ${e.message}`),i===`prefer-software`?self.postMessage({type:t.FRAME,error:`WebCodecsDecoder failed, reinitialize: `+String(e)}):(i=`prefer-software`,c&&c.keyFrame&&d(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${e.message}`}))}}),r.configure(_(a,i))),r}function m(e){if(r){try{r&&r.state!==`closed`&&r.close()}catch{}r=null,self.postMessage({type:t.FRAME,error:`WebCodecsDecoder reset ${e}`})}}function h(e=!1){l=setTimeout(()=>{m(`because of decode timeout`)},3e3)}function g(){l&&clearTimeout(l),l=null}function _(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())},[T.baseChromeVersion()>=92||T.browserName()===`Safari`])}decodeFrame(e,t,n,r=!1){this._sendToWorker(Kr.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`WebCodecsDecoder destroyed`)}static isBrowserSupported(){return`VideoDecoder`in window&&`Worker`in window&&`VideoFrame`in window&&!T.isBrokenVP9Decoder()&&T.browserName()!==`Firefox`}},Xr=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}},Zr=class{constructor(e,t){h(this,`_participantId`,void 0),h(this,`_statAggregator`,void 0),h(this,`_firstFrameReceived`,!1),this._participantId=e,this._statAggregator=t}measure(e,t){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let n=W.getMarkNameScreenshareFirstFrame(this._participantId),r=W.measureMark(n);r!==null&&this._statAggregator?.logEventualStat({name:H.SCREENSHARE_FIRST_FRAME,value:r,width:e,height:t})}},Qr=65536,$r=`MARK_SCREENSHARE_FREEZE_DURATION`,ei=class e{constructor(e,t,n,r,i,a=R){h(this,`_participantId`,void 0),h(this,`_onStream`,void 0),h(this,`_onStat`,void 0),h(this,`_onKeyFrameRequested`,void 0),h(this,`_statScreenShareFirstFrame`,void 0),h(this,`_debug`,void 0),h(this,`_chunks`,[]),this._participantId=e,this._onStream=t,this._onStat=n,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new Zr(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)%Qr!==t.sequence){this._debug.warn(`[FrameBuilder] Got incorrect chunk`);return}if(this._chunks.push(t),t.end){let n=this._processFrameData(),{width:r,height:i}=e.getFrameSize(n);this._processFrame({timestamp:t.timestamp,frameData:n,isVP9:t.isVP9,keyframe:t.keyframe,width:r,height:i}),this._statScreenShareFirstFrame.measure(r,i)}}destroy(){W.clearMark($r),W.clearMark(W.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let e=this._chunks;this._chunks=[];let t=e.reduce((e,t)=>e+t.data.byteLength,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(new Uint8Array(t.data),r),r+=t.data.byteLength;return n}static getFrameSize(e){let t={width:0,height:0},n=new d.BitStream(e.buffer);n.bigEndian=!0,n.index+=2;let r=n.readBits(1),i=n.readBits(1)<<1|r;return i===3&&n.index++,n.readBits(1)===1||n.readBits(1)!==0?t:(n.index++,n.index++,n.index+=24,i>=2&&n.index++,n.readBits(3)===7?(i===1||i===3)&&n.index++:(n.index++,(i===1||i===3)&&(n.index+=3)),t.width=n.readBits(16)+1,t.height=n.readBits(16)+1,t)}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(e){if(e){W.setMark($r);return}let t=W.measureMark($r);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},ti=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 ti{constructor(e,t=R){super(e),h(this,`_useImageBitmap`,void 0),h(this,`_canvas`,null),h(this,`_canvasContext`,null),h(this,`_stream`,null),h(this,`_track`,null),h(this,`_debug`,void 0),this._debug=t,this._debug.debug(`CanvasRenderer started`),this._useImageBitmap=`ImageBitmap`in window}_createStream(e,t){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.width=e,this._canvas.height=t,this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`0`,this._canvas.style.zIndex=`5000`,document.body.appendChild(this._canvas),this._useImageBitmap?this._canvasContext=this._canvas.getContext(`bitmaprenderer`):this._canvasContext=this._canvas.getContext(`2d`),this._stream=this._canvas.captureStream(0),this._track=this._stream.getVideoTracks()[0],this._track.contentHint=`text`)}_removeStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null,this._track=null),this._canvasContext=null;try{this._canvas&&document.body.removeChild(this._canvas)}catch{}this._canvas=null}_requestCanvasFrame(){this._track&&this._track.requestFrame?this._track.requestFrame():this._stream&&this._stream.requestFrame&&this._stream.requestFrame()}async _drawImage(e){this._track||(this._createStream(e.width,e.height),this._onStream(this._stream));let t=this._canvas;if(t.width=e.width,t.height=e.height,this._useImageBitmap){let t;if(e instanceof ImageBitmap)t=e;else{let{width:n,height:r,data:i}=e,a=n*r*4;if(i.byteLength!==a){this._debug.warn(`Bad frame buffer`,{w:n,h:r,got:i.byteLength,expected:a});return}t=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){this._debug.warn(`Canvas context is null`),t.close();return}this._canvasContext.transferFromImageBitmap(t),t.close()}else{let n=this._canvasContext;n.clearRect(0,0,t.width,t.height),n.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t=`createImageBitmap`in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),this._debug.debug(`CanvasRenderer destroyed`)}static isBrowserSupported(){return(`CanvasCaptureMediaStream`in window||`CanvasCaptureMediaStreamTrack`in window)&&!(T.browserName()===`Safari`&&Number(T.browserVersion())===15)&&!(T.browserName()===`Firefox`&&Number(T.browserVersion())<60)}},ri=class extends ti{constructor(e,t=R){super(e),h(this,`_generator`,void 0),h(this,`_writer`,void 0),h(this,`_stream`,void 0),h(this,`_debug`,void 0),this._debug=t,this._debug.debug(`TrackGeneratorRenderer started`),this._generator=new MediaStreamTrackGenerator({kind:k.video}),this._writer=this._generator.writable.getWriter(),this._stream=new MediaStream([this._generator]),this._onStream(this._stream)}async drawFrame(e){await this._writer.write(e)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),this._debug.debug(`TrackGeneratorRenderer destroyed`)}static isBrowserSupported(){return`VideoFrame`in window&&`MediaStreamTrackGenerator`in window&&Yr.isBrowserSupported()}},ii=class extends ei{constructor(e,t,n,r,i,a=R,o=null){super(e,t,n,r,i,a),h(this,`_renderer`,void 0),h(this,`_decoder`,void 0),h(this,`_decoderReady`,!1),h(this,`_decoderBusy`,!1),h(this,`_decoderQueue`,[]),h(this,`_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 Xr(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!ri.isBrowserSupported()?this._renderer=new ni(this._onStream,this._debug):this._renderer=new ri(this._onStream,this._debug)}_initDecoder(e=!1){e||!Yr.isBrowserSupported()?this._decoder=new Jr(this._debug,this._logger):this._decoder=new Yr(this._debug,this._logger),this._decoder.init(async e=>{this._decoderBusy=!1,`VideoFrame`in window&&e instanceof VideoFrame?await this._renderer.drawFrame(e):await this._renderer.drawImage(e),this._fpsMeter.increment(),this._decodeQueue()},e=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof Yr&&typeof e==`string`&&e.includes(`EncodingError`)&&this._switchToLibVPXDecoder()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()})}_switchToLibVPXDecoder(){this._debug.warn(`StreamBuilder switch to LibVPX decoder`),this._fpsMeter&&this._fpsMeter.destroy(),this._decoder&&(this._decoderReady=!1,this._decoderBusy=!1,this._decoder.destroy()),this._renderer&&this._renderer.destroy(),this._initFpsMeter(),this._initRenderer(!0),this._initDecoder(!0)}_decodeQueue(){if(!this._decoderReady||this._decoderBusy)return;let e=this._decoderQueue.shift();e&&(this._decoderBusy=!0,this._decoder.decodeFrame(e.timestamp,e.frameData,e.isVP9,e.keyframe))}destroy(){super.destroy(),this._fpsMeter.destroy(),this._decoder.destroy(),this._renderer.destroy(),this._debug.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return ni.isBrowserSupported()||ri.isBrowserSupported()}},ai=1,oi=1,si=2,ci=0,li=1,ui=2,di=4,fi=8;function pi(e,t,n,r,i,a,o){let s=0;t&&(s|=li),n&&(s|=ui),r&&(s|=di),o||(s|=fi);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,ai),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,ci),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 mi(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&li),l=!!(s&ui),u=!!(s&di),d=!!(s&fi);if(n!==ai)throw Error(`Unexpected protocol version. Got ${n}, expected ${ai}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function hi(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==ai||t.getUint8(1)!==oi||t.getUint16(2)!==ci)}function gi(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==ai||t.getUint8(1)!==si||t.getUint16(2)!==ci?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function _i(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,ai),n.setUint8(1,oi),n.setUint16(2,e),t}var vi=2**15-1,yi=1,bi=5,xi=5,Si=class e{constructor(e,t=R){h(this,`_mediaSource`,void 0),h(this,`_codec`,void 0),h(this,`_sourceBuffer`,null),h(this,`_queue`,[]),h(this,`_clearBufferTill`,0),h(this,`_debug`,void 0),this._mediaSource=new MediaSource,this._codec=e,this._debug=t;let n=()=>{this._mediaSource.removeEventListener(`sourceopen`,n),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener(`sourceopen`,n,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let e=this._sourceBuffer.buffered.start(0);e<this._clearBufferTill&&(this._sourceBuffer.remove(e,this._clearBufferTill),this._debug.debug(`[WebmBuilder] SourceBuffer cleanup from ${e} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let t=this._queue;this._queue=[];let n=e._buildQueue(t);this._sourceBuffer.appendBuffer(n)}static _buildQueue(e){if(!e.length)return new Uint8Array;if(e.length===1)return f.build(e[0]);let t=e.reduce((e,t)=>e+t.countSize(),0),n=new Uint8Array(t),r=0;for(let t of e){let e=f.build(t);n.set(e,r),r+=e.byteLength}return n}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode=`sequence`,this._sourceBuffer.addEventListener(`updateend`,()=>this._handleQueue())}changeType(e){return this._codec=e,this._sourceBuffer?.changeType(e)}append(e,t=!1){this._queue.push(e),t&&this._handleQueue()}cleanup(){this._mediaSource?.readyState===`open`&&this._sourceBuffer?.abort();let e=this._sourceBuffer?.buffered,t=e?.length;if(!t)return;let n=e.start(0),r=Math.max(0,e.end(t-1)-bi);r-n>xi&&(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}},Ci=class e extends ei{constructor(e,t,n,r,i=R){super(e,t,n,r,void 0,i),h(this,`_mediaBuffer`,null),h(this,`_video`,null),h(this,`_stream`,null),h(this,`_earliestTimestamp`,0),h(this,`_clusterStartTime`,0),h(this,`_lastFrameTimestamp`,0),this._debug.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return f.element(f.ID.EBML,[f.element(f.ID.EBMLVersion,f.number(1)),f.element(f.ID.EBMLReadVersion,f.number(1)),f.element(f.ID.EBMLMaxIDLength,f.number(4)),f.element(f.ID.EBMLMaxSizeLength,f.number(8)),f.element(f.ID.DocType,f.string(`webm`)),f.element(f.ID.DocTypeVersion,f.number(2)),f.element(f.ID.DocTypeReadVersion,f.number(2))])}static _genSegmentHeader(e,t,n){let r=f.element(f.ID.Info,[f.element(f.ID.TimecodeScale,f.number(1e6)),f.element(f.ID.MuxingApp,f.string(`vk-webm-builder`)),f.element(f.ID.WritingApp,f.string(`vk-webm-builder`))]),i=[f.element(f.ID.PixelWidth,f.number(e)),f.element(f.ID.PixelHeight,f.number(t))],a=f.element(f.ID.Tracks,f.element(f.ID.TrackEntry,[f.element(f.ID.TrackNumber,f.number(yi)),f.element(f.ID.TrackUID,f.number(yi)),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 Si(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>vi&&(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(yi),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"`)}},wi=class{constructor(e,t,n,r,i,a=null,o=R,s=null){h(this,`_datachannel`,void 0),h(this,`_participantIdRegistry`,null),h(this,`_streamBuilders`,{}),h(this,`_onStream`,()=>{}),h(this,`_onEos`,()=>{}),h(this,`_onStat`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),this._debug=o,this._logger=s,this._statAggregator=a,this._debug.debug(`ScreenCaptureReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._onStream=n,this._onEos=r,this._onStat=i,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}_onDataChannelMessage(e){let t=mi(e),n=this._participantIdRegistry?.getStreamDescription(t.ssrc)?.participantId;if(!n){this._debug.warn(`Participant id for ssrc ${t.ssrc} not found in registry`);return}if(t.eos){this.close(n),this._onEos(n);return}let r=this._streamBuilders[n];if(!r){let e=e=>this._onStream(n,e);r=M.screenShareWebmBuilder&&Ci.isBrowserSupported()?new Ci(n,e,this._onStat,this._statAggregator,this._debug):new ii(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=_i(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`)}},Ti=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}},Ei=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 Ti(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):``}},Di=1e3,Oi=class extends qr{constructor(e,t,n,r,i=R,a=null){super(i,a),h(this,`_sourceTrack`,void 0),h(this,`_onFrame`,void 0),h(this,`_useCongestionControl`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_useImageCapture`,void 0),h(this,`_video`,null),h(this,`_imageCapture`,null),h(this,`_canvas`,null),h(this,`_canvasCtx`,null),h(this,`_frameReadTimeout`,0),h(this,`_lastFrame`,null),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useImageCapture=`ImageCapture`in window&&ImageCapture.prototype.grabFrame!==void 0&&`ImageBitmap`in window,(e.readyState!==`live`||!e.enabled||e.muted)&&(this._useImageCapture=!1)}_createDom(){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`160px`,this._canvas.style.zIndex=`5000`,this._canvasCtx=this._canvas.getContext(`2d`),document.body.appendChild(this._canvas)),!this._video&&!this._useImageCapture&&(this._video=document.createElement(`video`),this._video.controls=!1,this._video.autoplay=!1,this._video.preload=`auto`,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,document.body.appendChild(this._video))}_removeDom(){try{this._canvas&&document.body.removeChild(this._canvas),this._video&&document.body.removeChild(this._video)}catch{}this._canvasCtx=null,this._canvas=null,this._video=null}async _createStream(e){if(!this._canvas)throw Error(`Canvas not found`);if(!this._video&&!this._useImageCapture)throw Error(`Video element not found`);return new Promise((t,n)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let r=this._video;r.srcObject=new MediaStream([e]),r.onloadeddata=e=>t(),r.onerror=()=>n(Error(`Video element error`));let i=r.play(),a=()=>n(Error(`Autoplay is disabled`));i?i.catch(a):a()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw Error(`Fatal error`);this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw Error(`Destroyed`);return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw Error(`Destroyed`);let t=e.width,n=e.height;return this._canvas.width=t,this._canvas.height=n,this._canvasCtx.clearRect(0,0,t,n),this._canvasCtx.drawImage(e,0,0,t,n),this._canvasCtx?.getImageData(0,0,t,n)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;this._debug.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createStream(this._sourceTrack),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n,r,i)=>{let a;function o(o,s){return t({locateFile:n}).then(t=>{if(a=new t.VpxEncoder,a.debug(s),!a.init(o?t.VpxType.VP9:t.VpxType.VP8))throw self.postMessage({type:e.LOG_ERROR,message:`encoder-init-fail-libvpx`}),Error(`LibVPxEncoder failed to create`);if(r){let e=Math.round(i/1e3);a.setTargetBitrate(e)}else a.setMaxQuantizer(10),a.setTargetBitrate(1024)})}function s(t,n,r,i){let o=a.allocateImage(t,n);if(!o){self.postMessage({type:e.FRAME,error:`No buffer data`});return}o.set(new Uint8Array(r));let s=Math.round(performance.now());if(!a.encode(s,150,i)){self.postMessage({type:e.FRAME,error:`Encode failed`});return}let c=a.readFrame();if(!c){self.postMessage({type:e.FRAME,error:`No encoded data`});return}a.readFrame()&&(self.postMessage({type:e.DEBUG,message:`LibVPxEncoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxEncoder-drop`}));let l=new Uint8Array(c.byteLength);l.set(c),self.postMessage({type:e.FRAME,frameType:i?`key`:`delta`,timestamp:s,duration:150,width:t,height:n,data:l.buffer},[l.buffer])}function c(e,t){let n=Math.round(e/1e3);a.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case e.INIT:o(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:e.READY})).catch(t=>self.postMessage({type:e.ERROR,error:String(t)}));break;case e.FRAME:s(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case e.SET_BITRATE:c(t.data.bitrate,t.data.useCbr);break}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[u.default,u.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:R.enabled()})}_encode(e,t){let n=e.data.buffer;this._sendToWorker(Kr.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)},Di),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(Kr.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},ki=class extends qr{constructor(e,t,n,r,i,a,o=R,s=null){super(o,s),h(this,`_sourceTrack`,void 0),h(this,`_trackProcessor`,void 0),h(this,`_onFrame`,void 0),h(this,`_useCongestionControl`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_useCbr`,void 0),h(this,`_frameRate`,void 0),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useCbr=i,this._frameRate=a,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,n=this._trackProcessor.readable;this._debug.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return()=>{let n,r,i,a,o,s,c=null,l=0,u=!1,d=0,f,p,m=!1,h=!1;function g(e){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),y(),self.postMessage({type:t.READY})}function _(e){e&&!h&&(h=!0),self.clearTimeout(l),l=self.setTimeout(()=>{c&&v(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(!x){r.releaseLock(),n.cancel();return}c=t,v(t,h)}}))}function v(e,t){(e.codedWidth!==i||e.codedHeight!==a)&&(i=e.codedWidth,a=e.codedHeight,y(),h=!0),x.encode(e,{keyFrame:t}),t&&(h=!1)}function y(){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),x.configure(t)}function b(e,t,n){d=e,m=t,s=n,y()}let x=new VideoEncoder({output:e=>{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])},error:e=>{self.postMessage({type:t.FRAME,error:String(e)})}});self.onmessage=e=>{switch(e.data.type){case t.INIT:g(e.data);break;case t.FRAME:_(e.data.keyFrame);break;case t.SET_BITRATE:b(e.data.bitrate,e.data.useCbr,e.data.fps);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})},[],{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(Kr.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(Kr.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}},Ai=2100,ji=600,Mi=1.2,Ni=.8,Pi=2e3,Fi=8e3,Ii=8e3,Li=16e3,Ri=4,zi=2e3,Bi=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(Bi||{}),Vi=class{constructor(e,t,n,r,i,a,o,s=R){h(this,`_onCongestion`,void 0),h(this,`_ccEnabled`,void 0),h(this,`_fastSharing`,void 0),h(this,`_trendDelayThreshold`,void 0),h(this,`_highDelayThreshold`,void 0),h(this,`_targetFps`,void 0),h(this,`_minBitrate`,void 0),h(this,`_maxBitrate`,void 0),h(this,`_targetBitrate`,void 0),h(this,`_lastDown`,void 0),h(this,`_lastUp`,void 0),h(this,`_lastProbing`,void 0),h(this,`_lastCheckDelay`,void 0),h(this,`_upPenalty`,0),h(this,`_probing`,void 0),h(this,`_delayAvgShort`,-1),h(this,`_delayAvgLong`,-1),h(this,`_minDelay`,Number.MAX_VALUE),h(this,`_maxDelay`,0),h(this,`_largeDelayDuration`,0),h(this,`_lastFpsCalcMs`,void 0),h(this,`_frames`,0),h(this,`_fps`,0),h(this,`_debug`,void 0),this._onCongestion=e,this._ccEnabled=r,this._debug=s,this._minBitrate=t,this._maxBitrate=n,this._fastSharing=i,this._targetFps=o,a>0?this._highDelayThreshold=a:this._highDelayThreshold=Ai,i&&(this._highDelayThreshold=ji),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} -> ${Bi[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>Pi){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Ri),this._probing=!1);let n=Ni*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*Ni),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*Ii/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Bi[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=Fi+this._upPenalty*Ii;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*Mi,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*Ii/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Bi[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>Li&&(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>zi){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}`)}}},Hi=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}},Ui=65536,Wi=50,Gi=400,Ki=1e6,qi=3e5,Ji=3e4,Yi=2e3,Xi=5,Zi=0,Qi=class{constructor(e,t,n,r,i=R,a=null){h(this,`_encoder`,void 0),h(this,`_datachannel`,void 0),h(this,`_signaling`,void 0),h(this,`_fastSharing`,void 0),h(this,`_destroyed`,!1),h(this,`_needKeyframe`,!0),h(this,`DATA_SIZE`,void 0),h(this,`_congestionControl`,void 0),h(this,`_frameNum`,0),h(this,`_width`,void 0),h(this,`_height`,void 0),h(this,`_feedback`,new Hi(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 Ei),h(this,`_fpsMeter`,void 0),h(this,`_maxFrameDelay`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._debug=i,this._logger=a,this._debug.debug(`ScreenCaptureSender started`),this.DATA_SIZE=M.consumerScreenDataChannelPacketSize-11,this._datachannel=t,this._signaling=n,this._fastSharing=r,this._congestionControlEnabled=M.screenShareCongestionControl||this._fastSharing,this._width=e.getSettings().width,this._height=e.getSettings().height,this._maxFrameDelay=this._fastSharing?M.screenShareCongestionControlThreshold:M.screenShareCongestionControlThreshold*2;let o=M.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),l=this._onCongestionCallback.bind(this);this._debug.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${M.screenShareCongestionControlThreshold}`),this._congestionControl=new Vi(l,s,c,this._congestionControlEnabled,this._fastSharing,M.screenShareCongestionControlThreshold,o,this._debug);let u=(e,t)=>{if(this._destroyed)return;if(!e){this._debug.warn(`requestFrame failed, keyFrame: `+this._needKeyframe,t),this._needKeyframe=!0,this._handleQueue();return}(e.width!==this._width||e.height!==this._height)&&(this._width=e.width,this._height=e.height,this._onResize(this._width,this._height));let n=this._sliceFrame(e);this._queue.merge(n),this._handleQueue(),this._sendSharingStat()};if(ki.isBrowserSupported()){let t=this._fastSharing;this._encoder=new ki(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new Oi(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{hi(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=gi(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 Xr(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+Ui)%Ui>Xi&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>Yi&&(this._lastFramerateReduced=e,this._debug.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(e)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),j.setImmediate(()=>this._handleQueue());return}if(e.isLast){this._frameNum++,this._fpsMeter.increment(),e.isKey&&this._debug.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(e.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),n=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,n)}else j.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let e=this._queue.head();for(;e;){if(e.isFirst&&e.isKey)return!0;this._queue.shift(),e=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(e){let t=e.type===`key`,n=e.data.byteLength,r=new Ei;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=pi(e,t,n,r,Zi,this._encoder.isVP9(),i),o={sequence:Zi,data:a};return Zi=(Zi+1)%Ui,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 ki.isBrowserSupported()||Oi.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(qi,Math.min(Ki,Math.round(n*Wi))),maxBitrate:Math.round(n*Gi)}}_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>Ji){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=e}}},$i=90,ea=4294967295,ta=class e extends Er{constructor(e,t,n,r=R,i=null,a=null,o=null){super(e,t),h(this,`_producerNotification`,null),h(this,`_producerCommand`,null),h(this,`_producerScreen`,null),h(this,`_consumerScreen`,null),h(this,`_asr`,null),h(this,`_animojiDataChannel`,null),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_isOpen`,!1),h(this,`_observer`,!1),h(this,`_reconnectionPrevented`,!1),h(this,`_statInterval`,null),h(this,`_settingsInterval`,null),h(this,`_monitorRtpShareInterval`,null),h(this,`_statBytes`,{}),h(this,`_ssrcMap`,{}),h(this,`_ssrcMapUpdated`,!1),h(this,`_perfStatReporter`,void 0),h(this,`_producerOfferIsProcessing`,!1),h(this,`_producerNextOffer`,null),h(this,`_producerNextSessionId`,null),h(this,`_lastStat`,null),h(this,`_serverSettings`,void 0),h(this,`_prevConsumerSettings`,{}),h(this,`_prevConsumerFastSharingSettings`,{}),h(this,`_asrTrack`,null),h(this,`_captureSender`,null),h(this,`_captureReceiver`,null),h(this,`_participantIdRegistry`,null),h(this,`_disabledSenders`,new Set),h(this,`_rtpReceiversByStreamId`,{}),h(this,`_producerSessionId`,``),h(this,`_newAudioShareTrack`,null),h(this,`_simulcastInfo`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),this._debug=r,this._logger=i,this._statAggregator=a,this._codecStatsAggregator=o,this.subscribe(this._signaling,mr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=n,this._debug.debug(`ServerTransport: Created`)}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!==K.IDLE&&e!==K.CLOSED&&e!==K.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(K.FAILED)):(this._debug.debug(`ServerTransport: Closed`),this._setState(K.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){Cr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(M.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,this._participantIdRegistry&&e.setParticipantIdRegistry(this._participantIdRegistry),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}async onCameraResolutionChanged(){M.simulcast&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new oa(this,this._signaling,this._statAggregator,!1,this._debug)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcastInfo=null,this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,e._closeDataChannel(this._producerNotification),e._closeDataChannel(this._producerCommand),e._closeDataChannel(this._producerScreen),e._closeDataChannel(this._consumerScreen),e._closeDataChannel(this._asr),e._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent(J.PEER_CONNECTION_CLOSED)}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{ordered:!0});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)},r.onerror=e=>{let n=e.error;this._debug.error(`[${t}] data channel error`,n?.errorDetail,n?.message)}}_openConnection(e=!1){this._debug.debug(`ServerTransport: Open single connection`);try{this._pc=new RTCPeerConnection}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=j.debounce(e=>{this._pc&&this._onConnectionStateChange(this._pc,e)},500),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Gr(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,vr.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,vr.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,vr.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),M.asrDataChannel&&this._createDataChannel(this._pc,vr.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new Hr(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),M.vmoji&&this._createDataChannel(this._pc,vr.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(e),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(e),this._animojiSender?.setProtocolVersion(M.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(e){this._debug.error(`ServerTransport: Unable to add media source tracks`,e),this._logger?.log(C.ERROR,`addTrack-single`),this.close(e);return}this._createDataChannel(this._pc,vr.consumerScreenShare,e=>{this._consumerScreen=e,this._consumerScreen.binaryType=`arraybuffer`;let t=this._mediaSource.getScreenTrack();t&&(!M.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(t)}),e||this._allocateConsumer(),this._setState(K.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==K.OPENED&&(this._setState(K.RECONNECTING),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent(J.SIGNALLED_ACTIVE_PARTICIPANTS,e)}_signalStalledParticipants(e){this._triggerEvent(J.SIGNALLED_STALLED_PARTICIPANTS,e)}_signalSpeakerChanged(e){this._triggerEvent(J.SIGNALLED_SPEAKER_CHANGED,e)}_signalNetworkStatus(e){this._triggerEvent(J.NETWORK_STATUS,e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
15
|
+
`).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Br.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Br.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.mediaSettings;!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Qi(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 wi(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent(J.REMOTE_STREAM_SECOND,e,t)},e=>{this._triggerEvent(J.REMOTE_STREAM_SECOND,e,null)},e=>{this._triggerEvent(J.SCREEN_SHARING_STAT,e)},this._statAggregator,this._debug,this._logger))}_removeCaptureReceiver(){this._captureReceiver?.destroy(),this._captureReceiver=null}_applyConsumerSettings(){let e=this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{if(!n.track||n.track.kind!==k.video||n.track.contentHint===`motion`)return;let r=!this._disabledSenders.has(n),i=e.maxDimension!==0;if(r&&!i){this._debug.log(`Disabling video upload`),this._disabledSenders.add(n),n.replaceTrack(T.getBlackMediaTrack()).catch(e=>{this._debug.error(`Could not disable video upload`,e)});return}let a=this._mediaSource.getSendVideoTrack();if(!r&&i&&a){this._debug.log(`Enabling video upload`),this._disabledSenders.delete(n);let e=n.track;e.enabled=a.enabled,n.replaceTrack(a).then(()=>e.stop()).catch(e=>{this._debug.error(`Could not enable video upload`,e)})}j.applyVideoTrackSettings(e,n,a??n.track,this._prevConsumerSettings,t,this._debug)}),this._prevConsumerSettings=t}if(this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&M.consumerFastScreenShare){let e=this._serverSettings.fastScreenSharing;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{!n.track||n.track.kind!==k.video||n.track.contentHint!==`motion`||j.applyVideoTrackSettings(e,n,n.track,this._prevConsumerFastSharingSettings,t,this._debug)}),this._prevConsumerFastSharingSettings=t}}}_onScreenSharingStatus(e){e.track?(!M.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent(J.STATE_CHANGED,e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(e=>{this._reportStats(e),this._detectStaleTracks(e),this._codecStatsAggregator?.reportUsage(e)}).catch(()=>{}),this._statInterval=window.setTimeout(e,M.statisticsInterval)};this._statInterval=window.setTimeout(e,M.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await W.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent(J.REMOTE_DATA_STATS,{inbound:{topology:q.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`inbound-rtp`)},outbound:{topology:q.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:q.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=Br.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(J.AUDIO_MIX_STALL,i)}this._statBytes[n]={bytesReceived:t.bytesReceived,stalled:i}}_allocateConsumer(){if(!this._signaling.ready)return;let e=fa.get();!M.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e)}async _processOffer(e,t){if(!this._pc)throw Error(`Interrupt allocation`);let n=M.simulcast;try{await this._pc.setRemoteDescription(e)}catch(e){throw this._debug.error(`[single] unable to set remote offer`,e),this._logger?.log(C.ERROR,`setRemoteDescription-single`),e}let r=this._findFirstSimTransceiver();if(M.simulcast)if(r){this._debug.log(`_processOffer: caps.simulcast=${M.simulcast} mid=${r.mid} dir=${r.direction}`);let e=this._mediaSource.getStream(),t=await this._setupSimulcastTransceiver(e,r);this._debug.log(`_processOffer: simulcastInfo`,t),t||(this._debug.log(`_processOffer: simulcast transceiver not found in server offer mid=${r.mid}, disable simulcast`),n=!1)}else this._debug.log(`_processOffer: simulcast transceiver not found in server offer, disable simulcast`),n=!1;let i;try{if(await this._handleTracks(),this._debug.debug(`[single] create local answer`),!this._pc)throw Error(`Interrupt allocation`);i=await this._pc.createAnswer()}catch(e){throw this._debug.error(`[single] unable to create answer`,e),this._logger?.log(C.ERROR,`createAnswer-single`),e}try{if(!this._pc)throw Error(`Interrupt allocation`);i.sdp=j.patchLocalSDP(i.sdp,!1,T.isBrokenH264Decoder(),!1),this._debug.debug(`[single] set local answer`,{answer:i}),await this._pc.setLocalDescription(i)}catch(e){throw this._debug.error(`[single] unable to set local answer`,e),this._logger?.log(C.ERROR,`setLocalDescription-single`),e}if(n&&r){i.sdp=j.patchSimulcastAnswerSdp(i.sdp,r,Zt.WIDTH,Zt.HEIGHT);for(let e of this._pc.getTransceivers())e.mid===null&&e.stop()}try{this._debug.debug(`[single] transmit local answer`,{answer:i}),this._updateSSRCMap(e),await this._signaling.acceptProducer(i,Object.keys(this._ssrcMap),t),this._debug.debug(`[single] remote offer has been processed`)}catch(e){this._debug.warn(`[single] unable to send local answer`,e),this._logger?.log(C.ERROR,`acceptProducer`)}n&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!==k.video)continue;let n=e.sender.getParameters();if(!(!n.encodings||n.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction=`sendonly`;let n=e.getVideoTracks()[0];await t.sender.replaceTrack(n),t.sender.setStreams(e);let r=t.sender.getParameters();if(!r.encodings||r.encodings.length<=1)return this._debug.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(r.encodings)}`),null;let i=rn(Zt.WIDTH,Zt.HEIGHT,this._serverSettings.camera?.bitrates?.generic),a=0,o=1;for(let e of r.encodings)e.scalabilityMode=Qt,e.active=!0,a>=i.streams.length?e.maxBitrate=0:e.maxBitrate=i.streams[a].bitrate,e.scaleResolutionDownBy=o,o*=2,a++;await t.sender.setParameters(r);let s=n.getSettings();return this._debug.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${s.width}x${s.height} encodings=${JSON.stringify(r.encodings)}`),!0}async _acceptProducer(e,t){if(this._producerOfferIsProcessing){this._producerNextOffer=e,this._producerNextSessionId=t,this._debug.debug(`[single] wait until other remote offer is processed`);return}this._producerOfferIsProcessing=!0;let n={type:`offer`,sdp:j.patchRemoteSDP(e,T.isOldDataChannelDescription(),!1,!1,!1,T.isBrokenVP9Encoder(),T.isBrokenVP9Decoder())};if(this._debug.debug(`[single] set remote offer`,{offer:n}),!this._pc)throw Error(`Interrupt allocation`);try{if(await this._processOffer(n,t),this._producerOfferIsProcessing=!1,this._producerNextOffer&&this._producerNextSessionId){this._debug.debug(`[single] there is other unprocessed remote offer, process it`);let e=this._producerNextOffer,t=this._producerNextSessionId;this._producerNextOffer=null,this._producerNextSessionId=null,await this._acceptProducer(e,t)}}catch(e){this.close(e)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===k.video);if(!e||!e.sender){this._debug.warn(`Cannot find screenshare transceiver`);return}try{e.direction=`sendonly`,await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===k.audio);if(!e||!e.sender){this._debug.warn(`Cannot find audioshare transceiver`);return}e.sender.track!==null&&this._debug.warn(`Unexpected track assigned to audioshare`);try{e.direction=`sendonly`,await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(C.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case G.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case G.REALLOC_CON:this._reconnect();break;case G.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case G.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case G.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case G.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent(J.ASR_TRANSCRIPTION,e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),M.breakVideoPayloadTypes&&(this._debug.log(`test mode enabled, video switched off`),this._signaling.requestTestMode(`breakVideoPayloadTypes`,null)),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(J.REMOTE_TRACK_REMOVED,n.id,n,e.track)}),n.getTracks().find(e=>e.id===t.track.id)||n.addTrack(t.track),this._rtpReceiversByStreamId[n.id]=t.receiver,this._triggerEvent(J.REMOTE_TRACK_ADDED,n.id,n,t.track)):this._debug.error(`[single] unable to get media stream from track event`)}_onSignalingStateChange(e,t){this._debug.debug(`[single] signaling state changed`,{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(this._debug.debug(`[single] connection state changed`,{state:e.connectionState},t),this._logger?.log(C.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect();break;case`connecting`:let t=this.getState();t===K.IDLE||t===K.OPENED?this._setState(K.CONNECTING):e.iceConnectionState===`checking`&&this._setState(K.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(K.RECONNECTING);break;case`connected`:this._setState(K.CONNECTED),j.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(this._logger?.log(C.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))});break}}_onReplacedTrack(e,t){if(this._pc){this._debug.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let n=(e,t)=>{e.replaceTrack(t).catch(e=>{this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(C.ERROR,`replaceTrack-single`)})};if(this._debug.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),M.simulcast&&e.kind===k.video){let t=this._pc?.getTransceivers().find(t=>t.direction===`sendonly`&&t.sender?.track?.kind===k.video&&t.sender.track.contentHint===e.contentHint)?.sender;t?.track?(n(t,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):this._debug.warn(`_onReplacedTrack: simulcast video transceiver not found`)}else{let t=this._pc?.getSenders().find(t=>t.track&&t.track.kind===e.kind&&!this._disabledSenders.has(t)&&t.track.contentHint===e.contentHint);t?.track?n(t,e):e.kind===k.audio&&e.contentHint===`music`&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e===k.screen&&M.consumerFastScreenShare&&this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return this._logger?.log(C.PAT_WAITING_TIME_ERROR,`noConnection`),this._debug.error(`Cannot get stream waiting time, peer connection is not initialized`),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return this._logger?.log(C.PAT_WAITING_TIME_ERROR,`oldBrowser`),this._debug.error(`Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported`),0;let n=this._rtpReceiversByStreamId[e];if(!n)return this._logger?.log(C.PAT_WAITING_TIME_ERROR,`noReceiver`),this._debug.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let r=n.getSynchronizationSources();if(!r||!r.length)return this._debug.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let i=r[0].rtpTimestamp;if(!Number.isInteger(i))return this._logger?.log(C.PAT_WAITING_TIME_ERROR,`timestampNotInteger`),this._debug.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${i}`),0;let a=t-i&ea,o=Math.ceil(a/$i);return Math.min(100,Math.max(0,o))}async _changeSimulcastInfo(e,t){let n=this._mediaSource.mediaSettings.isVideoEnabled,r=this._findFirstSimTransceiver();if(!M.simulcast||!n||!r||!r.sender)return;let i=this._mediaSource.getStream();if(!i)return;let a=i.getVideoTracks()[0],o=a.getSettings().width,s=a.getSettings().height,c=rn(o,s,this._serverSettings.camera?.bitrates?.generic),l=t||!tn(this._simulcastInfo,c);if(!c.streams.length||!l)return;let u=r.sender.getParameters();if(u.encodings||(u.encodings=[{}]),!(u.encodings.length<=1)){if(this._debug.log(`_changeSimulcastInfo: ${o}x${s} command: ${JSON.stringify(c)} `),e){let e=0;for(let t of u.encodings)t.scaleResolutionDownBy=an(t.rid),t.scalabilityMode=Qt,e>=c.streams.length?(t.maxBitrate=0,t.active=!1):(t.active=!0,t.maxBitrate=c.streams[e].bitrate),e++;await r.sender.setParameters?.(u).catch(e=>{this._debug.error(`Failed to set sender parameters`,u,e)}),this._debug.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(u.encodings)} `)}if(this._simulcastInfo=c,c.streams){let e={mediaSource:Yt.CAMERA,simulcastInfo:c};await this._signaling.changeSimulcast(e)}}}async _monitorRtpShare(){let e=Wr.getInstance().value;if(!this._mediaSource.mediaSettings.isFastScreenSharingEnabled||!M.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(e=>e.track?.kind===k.video&&e.track?.contentHint===`motion`);t&&(await t.getStats()).forEach(e=>{if(e.type===`outbound-rtp`&&this._serverSettings.fastScreenSharing&&e.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&e.frameWidth<window.screen.width){let n=t.getParameters();n.degradationPreference=`maintain-resolution`,t.setParameters(n),this._debug.log(`
|
|
16
16
|
degradationPreference updated for fast share RTP Sender
|
|
17
17
|
Actual senderStats: ${JSON.stringify(e)}
|
|
18
18
|
serverSettings: ${JSON.stringify(this._serverSettings.fastScreenSharing)}
|
|
19
|
-
`)}})}_startMonitorRtpShareInterval(){let e=5e3;if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,e)};this._monitorRtpShareInterval=window.setTimeout(t,e)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}},K=function(e){return e.REMOTE_TRACK_ADDED=`REMOTE_TRACK_ADDED`,e.REMOTE_TRACK_REMOVED=`REMOTE_TRACK_REMOVED`,e.REMOTE_STREAM_SECOND=`REMOTE_STREAM_SECOND`,e.AUDIO_MIX_STALL=`AUDIO_MIX_STALL`,e.REMOTE_DATA_STATS=`REMOTE_DATA_STATS`,e.STATE_CHANGED=`STATE_CHANGED`,e.LOCAL_STATE_CHANGED=`LOCAL_STATE_CHANGED`,e.SIGNALLED_ACTIVE_PARTICIPANTS=`SIGNALLED_ACTIVE_PARTICIPANTS`,e.SIGNALLED_SPEAKER_CHANGED=`SIGNALLED_SPEAKER_CHANGED`,e.SIGNALLED_STALLED_PARTICIPANTS=`SIGNALLED_STALLED_PARTICIPANTS`,e.TOPOLOGY_CHANGED=`TOPOLOGY_CHANGED`,e.NETWORK_STATUS=`NETWORK_STATUS`,e.PEER_CONNECTION_CLOSED=`PEER_CONNECTION_CLOSED`,e.ASR_TRANSCRIPTION=`ASR_TRANSCRIPTION`,e.ANIMOJI_STREAM=`ANIMOJI_STREAM`,e.ANIMOJI_ERROR=`ANIMOJI_ERROR`,e.SCREEN_SHARING_STAT=`SCREEN_SHARING_STAT`,e}({}),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}({}),J=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}({}),Ta=class extends _{constructor(e,t,n,r){super(),g(this,`_signaling`,void 0),g(this,`_mediaSource`,void 0),g(this,`_topology`,void 0),g(this,`_allocated`,[]),g(this,`_opened`,[]),g(this,`_directTransport`,null),g(this,`_serverTransport`,null),g(this,`_serverSettings`,void 0),g(this,`_dtListeners`,[]),g(this,`_stListeners`,[]),g(this,`_states`,{}),g(this,`_localState`,`IDLE`),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),this._signaling=t,this._mediaSource=n,this._topology=e,this._serverSettings=r,this.subscribe(this._signaling,jr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,sn.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,sn.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e===`SERVER`&&(this._serverTransport=this._createServerTransport())}updateSettings(e){B.log(`Update transport settings`,e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(B.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){B.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology===`DIRECT`&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===`SERVER`&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,n=!1,r=!1){B.log(`Trying open participant`,{participantIds:e});let i=r;for(let t of e){if(this._opened.indexOf(t)!==-1){B.warn(`The participant [${t}] has already had opened transport`);continue}if(this._allocated.indexOf(t)===-1){B.warn(`The participant [${t}] has no allocated transport`);continue}this._opened.push(t),i=!0}i&&(this._topology===`DIRECT`&&this._directTransport&&this._directTransport.open(t),this._topology===`SERVER`&&this._serverTransport&&(this._serverTransport.open(n),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),B.debug(`The transport has been opened`,e))}close(e){let t=this._allocated.indexOf(e),n=this._opened.indexOf(e);t<0&&B.warn(`The participant [${e}] transport has already deallocated`),this._topology===`DIRECT`&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===`SERVER`&&(this._serverTransport?.removeParticipant(e),this._setStates([e],`CLOSED`)),n>=0&&this._opened.splice(n,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),P.audioEffects?.destroy(),this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}getTopology(){return this._topology}isAllocated(e){return this._allocated.indexOf(e)>=0}allocated(){return this._allocated.slice()}opened(){return this._opened.slice()}getState(){return this._topology===`SERVER`?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){P.vmoji&&t.isMe&&P.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology===`SERVER`&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let n=e.filter(e=>this._states[e]===t?!1:(this._states[e]=t,!0));n.length&&this._triggerEvent(`STATE_CHANGED`,n,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent(`LOCAL_STATE_CHANGED`,e))}_onSignalingNotification(e){if(e.notification===G.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(B.log(`Topology changed ${this._topology} -> ${e.topology}`),b.log(E.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===`SERVER`&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===`DIRECT`){let t=e.offerTo||[],n=e.offerToTypes||[],r=e.offerToDeviceIdxs||[],i=t.length&&n.length?N.composeParticipantId(t[0],n[0],r[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){B.error(`Topology changed to DIRECT, but the list of allocated participants is empty`);return}this._allocated.length>1&&B.warn(`Topology changed to DIRECT, but the allocated participants count more then one`);let a=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let e=i===a;this._directTransport=this._createDirectTransport(a,e)}this._opened.indexOf(a)>=0&&this._directTransport.open()}this._triggerEvent(`TOPOLOGY_CHANGED`,this._topology)}}_createDirectTransport(e,t=!1){let n=new ci(e,t,this._signaling,this._mediaSource,this._serverSettings);return this._dtListeners.length>0&&B.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(n.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this,e)),n.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this,e)),n.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),n.addEventListener(`STATE_CHANGED`,this._onDirectTransportChanged.bind(this)),n.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),n.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,`DIRECT`))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new wa(this._signaling,this._mediaSource,this._serverSettings);return this._stListeners.length>0&&B.warn(`The list of server transport listeners is not empty`),this._stListeners=[],this._stListeners.push(e.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this)),e.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this)),e.addEventListener(`AUDIO_MIX_STALL`,this._onServerAudioMixStall.bind(this)),e.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),e.addEventListener(`STATE_CHANGED`,this._onServerTransportChanged.bind(this)),e.addEventListener(`SIGNALLED_ACTIVE_PARTICIPANTS`,this._onTransportActiveParticipants.bind(this)),e.addEventListener(`SIGNALLED_SPEAKER_CHANGED`,this._onTransportSpeakerChanged.bind(this)),e.addEventListener(`SIGNALLED_STALLED_PARTICIPANTS`,this._onTransportStalledParticipants.bind(this)),e.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),e.addEventListener(`REMOTE_STREAM_SECOND`,this._onRemoteStreamSecond.bind(this)),e.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,`SERVER`)),e.addEventListener(`ASR_TRANSCRIPTION`,this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e===`CONNECTED`&&this._topology===`DIRECT`&&this._releaseServerTransport(),(e===`CLOSED`||e===`FAILED`)&&(this._releaseDirectTransport(),this._topology===`DIRECT`)){let e=this._opened.indexOf(t);e>=0&&this._opened.splice(e,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology===`DIRECT`&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===`CONNECTED`&&this._topology===`SERVER`&&this._releaseDirectTransport(),(e===`CLOSED`||e===`FAILED`)&&(this._releaseServerTransport(),this._topology===`SERVER`&&(this._allocated=[],this._opened=[])),this._topology===`SERVER`&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===`SERVER`&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===`SERVER`&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===`SERVER`&&this._triggerEvent(`SIGNALLED_SPEAKER_CHANGED`,e)}_onTransportNetworkStatus(e){this._triggerEvent(`NETWORK_STATUS`,e)}_onRemoteStreamSecond(e,t){this._triggerEvent(`REMOTE_STREAM_SECOND`,e,t)}_onPeerConnectionClosed(e){this._triggerEvent(`PEER_CONNECTION_CLOSED`,e)}_onServerAudioMixStall(e){this._topology===`SERVER`&&this._triggerEvent(`AUDIO_MIX_STALL`,e)}_onRemoteDataStats(e){this._triggerEvent(`REMOTE_DATA_STATS`,e)}_onRemoteTrackAdded(e,t,n){this._triggerEvent(`REMOTE_TRACK_ADDED`,e,t,n)}_onRemoteTrackRemoved(e,t,n){this._triggerEvent(`REMOTE_TRACK_REMOVED`,e,t,n)}_onAsrTranscription(e){this._triggerEvent(`ASR_TRANSCRIPTION`,e)}_onSourceChanged(){let e=this._mediaSource.getStream();e&&this._animojiSender?.setStream(e)}_onAnimojiStream(e,t){this._triggerEvent(`ANIMOJI_STREAM`,e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createAnimojiTransport(){if(!P.vmoji)return;this._animojiReceiver=new P.vmoji.AnimojiReceiver((e,t)=>this._onAnimojiStream(e,t),e=>this._onAnimojiStream(e,null),e=>{this._triggerEvent(`ANIMOJI_ERROR`,e)},P.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new P.vmoji.AnimojiSender(e,this._signaling.getPeerId(),P.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:P.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=e=>this._animojiReceiver?.receive(e)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology===`SERVER`?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(b.log(E.PAT_WAITING_TIME_ERROR,`noTransport`),B.error(`Cannot get stream waiting time, server transport is not initialized`),0):(b.log(E.PAT_WAITING_TIME_ERROR,`wrongTopology`),B.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},Ea=class e{constructor(){g(this,`trackerByTransport`,{ws:new Ar,wt:new Ar}),g(this,`lastSeen`,{})}static create(){e._instance||(e._instance=new e)}static mark(t){if(!e._instance)return;let n=Date.now(),r=e._instance.lastSeen[t];if(typeof r==`number`){let i=n-r;i>=0&&e._instance.trackerByTransport[t].add(i)}e._instance.lastSeen[t]=n}static logMetrics(t){e._instance&&[Tr.WEBSOCKET,Tr.WEBTRANSPORT].forEach(n=>{if(!e._instance.trackerByTransport[n].hasData)return;let r=e._instance.trackerByTransport[n].snapshot();b.logClientStats({call_topology:t===J.DIRECT?`D`:`S`,name:H.SIGNALING_PING_SUMMARY,min_value:r.min,max_value:r.max,avg_value:r.avg,median_value:r.median,p95_value:r.p95,values_count:r.count,signaling_transport:n})})}static destroy(){e._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new Ar,wt:new Ar},this.lastSeen={}}};g(Ea,`_instance`,void 0);var Da=class e{constructor(){g(this,`trackerByCommand`,new Map)}static create(){e._instance||(e._instance=new e)}static mark(t,n,r){if(!e._instance)return;let i=`${t}|${r}`,a;e._instance.trackerByCommand.has(i)?a=e._instance.trackerByCommand.get(i):(a=new Ar,e._instance.trackerByCommand.set(i,a)),a.add(n)}static logMetrics(t){if(e._instance)for(let[n,r]of e._instance.trackerByCommand.entries()){if(!r.hasData)continue;let[e,i]=n.split(`|`),a=r.snapshot();b.logClientStats({call_topology:t===J.DIRECT?`D`:`S`,name:H.SIGNALING_COMMAND_SUMMARY,api_method:e,min_value:a.min,max_value:a.max,avg_value:a.avg,median_value:a.median,p95_value:a.p95,values_count:a.count,signaling_transport:i})}}static destroy(){e._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};g(Da,`_instance`,void 0);var Oa=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(Oa||{}),ka={producerScreenTrack:()=>!0,videoTracksCount:()=>P.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>P.movieShare,useParticipantListChunk:()=>P.useParticipantListChunk,useRooms:()=>P.useRooms,vmoji:()=>!!P.vmoji,useCallsToContacts:()=>P.useCallsToContacts,useChatRooms:()=>P.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!P.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>P.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>P.waitForAdminInGroupCalls,hold:()=>P.hold},Aa=class{static getFlags(){let e=Object.values(ka),t=0;for(let n=0;n<e.length;n++)e[n]()&&(t|=1<<n);return t.toString(16).toUpperCase()}static parseCapabilities(e){let t=parseInt(e||`0`,16);return Object.keys(ka).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},ja=63n,Ma=16383n,Na=1073741823,Pa=4611686018427387903n,Fa=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=ja)return new Uint8Array([Number(t)]);if(t<=Ma)return new Uint8Array([64|Number(t>>8n),Number(t&255n)]);if(t<=BigInt(Na))return new Uint8Array([128|Number(t>>24n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);if(t<=Pa)return new Uint8Array([192|Number(t>>56n),Number(t>>48n&255n),Number(t>>40n&255n),Number(t>>32n&255n),Number(t>>24n&255n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);throw RangeError(`Number is too large to encode using varint`)}},Ia=class{decode(e){let t=this.getNumBytesForLengthInteger(e);if(t<0)throw Error(`Invalid length prefix`);if(e.length<t)return null;let n=BigInt(0);switch(t){case 1:n=BigInt(e[0]&63);break;case 2:n=BigInt(e[0]&63)<<8n|BigInt(e[1]);break;case 4:n=BigInt(e[0]&63)<<24n|BigInt(e[1])<<16n|BigInt(e[2])<<8n|BigInt(e[3]);break;case 8:n=BigInt(e[0]&63)<<56n|BigInt(e[1])<<48n|BigInt(e[2])<<40n|BigInt(e[3])<<32n|BigInt(e[4])<<24n|BigInt(e[5])<<16n|BigInt(e[6])<<8n|BigInt(e[7]);break}return n}getNumBytesForLengthInteger(e){let t=e[0]&192;return t===0?1:t===64?2:t===128?4:t===192?8:-1}},La=class{constructor(e){g(this,`encoder`,void 0),g(this,`compression`,void 0),g(this,`lengthEncoder`,void 0),this.encoder=new TextEncoder,this.lengthEncoder=new Fa,this.compression=e??null}encode(e){let t=this.encoder.encode(e);t=this.compress(t);let n=this.lengthEncoder.encode(t.length),r=new Uint8Array(n.length+t.length);return r.set(n),r.set(t,n.length),r}compress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gzipSync(e);case`deflate`:return p.zlibSync(e);case`deflate-raw`:return p.deflateSync(e);default:return e}}},Ra=class{constructor(e){g(this,`decoder`,void 0),g(this,`compression`,void 0),g(this,`lengthDecoder`,void 0),g(this,`buffer`,void 0),g(this,`expectedLength`,void 0),g(this,`offset`,void 0),g(this,`lengthPrefixLength`,void 0),this.decoder=new TextDecoder,this.lengthDecoder=new Ia,this.compression=e??null,this.buffer=new Uint8Array,this.expectedLength=null,this.offset=0}decode(e){let t=[];for(this.buffer=new Uint8Array([...this.buffer,...e]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return t;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return t;let e=this.buffer.subarray(this.offset,this.offset+this.expectedLength);e=this.decompress(e),t.push(this.decoder.decode(e)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return t}readLength(e){if(e.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(e),this.lengthPrefixLength<0)throw Error(`Invalid length prefix`);let t=this.lengthDecoder.decode(e.subarray(0,this.lengthPrefixLength));return t===null?null:Number(t)}decompress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gunzipSync(e);case`deflate`:return p.unzlibSync(e);case`deflate-raw`:return p.inflateSync(e);default:return e}}},za=class{constructor(e,t={}){g(this,`webTransport`,void 0),g(this,`stream`,null),g(this,`writer`,null),g(this,`reader`,null),g(this,`url`,void 0),g(this,`options`,void 0),g(this,`compression`,void 0),g(this,`encoder`,void 0),g(this,`decoder`,void 0),g(this,`onopen`,null),g(this,`onmessage`,null),g(this,`onerror`,null),g(this,`onclose`,null),g(this,`readyState`,WebSocket.CONNECTING),this.url=e,this.options=t,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(e),this.encoder=new La(this.compression),this.decoder=new Ra(this.compression),this.connect()}getCompressionTypeFromUrl(e){try{let t=new URL(e).searchParams.get(`compression`);switch(t){case`gzip`:case`deflate`:case`deflate-raw`:return t;default:return null}}catch(e){return B.log(`Exception while parsing compression`,e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,B.debug(`[WebTransport] WebTransport connected to `+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event(`open`)),await this.readLoop()}catch(e){B.error(`[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`connect`)),this.onclose?.(new CloseEvent(`close`,{code:1006,reason:`Connection Failed`}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:e,value:t}=await this.reader.read();if(e)break;t&&(yield t)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let e of this.readChunks())this.decoder.decode(e).forEach(e=>{this.onmessage?.(new MessageEvent(`message`,{data:e}))});this.close(1e3,`Stream Closed`)}catch(e){B.error(`[WebTransport] Stream read failed`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`read`))}}async send(e){if(this.readyState!==WebSocket.OPEN){B.warn(`[WebTransport] Attempt to send data before webtransport is open`);return}if(!this.writer){B.warn(`[WebTransport] Attempt to send data before stream is ready`);return}try{await this.writer.ready;let t=this.encoder.encode(e);await this.writer.write(t)}catch(e){B.error(`[WebTransport] Failed to send data`,e),this.onerror?.(this.createErrorEvent(e,`send`)),this.close(1006,`Failed to send data`)}}createErrorEvent(e,t){let n=new Event(`error`),r=e instanceof Error?e:null;return n.error=e,n.errorInfo={phase:t,name:r?.name,message:r?.message||String(e),stack:r?.stack,readyState:this.readyState,compression:this.compression},n}close(e=1e3,t){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(e){B.warn(`[WebTransport] already closed. Did we get a STOP_SENDING? ignore`,e)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent(`close`,{code:e,reason:t})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return`WebTransport`in window&&typeof WebTransport==`function`?k.browserName()===`Firefox`?P.webtransportFF:k.browserName()!==`Safari`:!1}},Ba=`open`,Va=10,Ha=[`service-unavailable`,`conversation-ended`,`invalid-token`],Ua=class e extends ne{constructor(...e){super(...e),g(this,`socket`,null),g(this,`sequence`,1),g(this,`lastStamp`,0),g(this,`websocketCommandsQueue`,[]),g(this,`datachannelCommandsQueue`,[]),g(this,`incomingCache`,[]),g(this,`responseHandlers`,{}),g(this,`connectionType`,void 0),g(this,`reconnectCount`,0),g(this,`endpoint`,void 0),g(this,`wtEndpoint`,null),g(this,`conversationResolve`,null),g(this,`conversationReject`,null),g(this,`connected`,!1),g(this,`listenersReady`,!1),g(this,`peerId`,null),g(this,`conversationId`,null),g(this,`reconnectTimer`,0),g(this,`connectionMessageWaitTimer`,0),g(this,`doctorTimer`,0),g(this,`participantIdRegistry`,null),g(this,`producerNotificationDataChannel`,null),g(this,`producerCommandDataChannel`,null),g(this,`producerCommandDataChannelEnabled`,!1),g(this,`producerCommandSerializationService`,new ar)}static get RECONNECT_DELAY(){return P.signalingReconnectDelay}static get RECONNECT_MAX_DELAY(){return P.signalingReconnectMaxDelay}static get RECONNECT_MAX_COUNT(){return P.signalingReconnectMaxCount}static get WAIT_CONNECTION_DELAY(){return P.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return P.waitResponseDelay}static get WAIT_MESSAGE_DELAY(){return P.waitMessageDelay}get ready(){return this.socket!==null}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e}setConversationId(e){this.conversationId=e}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=e=>{let t=this.participantIdRegistry?.handleMessage(e.data);t&&this._handleMessage(t)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=e=>{this.producerCommandSerializationService.deserializeCommandResponse(e.data).then(e=>{e&&this._handleMessage(e)}).catch(e=>{B.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return new Promise((t,n)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){b.log(E.SOCKET_ACTION,`already_opened`),n(Error(`Socket already opened`));return}this.conversationResolve=e=>{t(e),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=e=>{n(e),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},n=!0,r=0){if(t.participantId){let e=N.decomposeParticipantId(t.participantId),n=N.decomposeId(e.compositeUserId);t=Object.assign({},t,{participantId:n.id,participantType:n.type}),e.deviceIdx&&(t.deviceIdx=e.deviceIdx)}return this._sendRaw(e,t,n,r)}async _sendRaw(e,t={},n=!0,r=0){let i=t=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===Ba&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){b.log(E.SOCKET_ACTION,`not_opened`),B.warn(`[signaling] socket is not opened`),t.reject(Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(b.log(E.SOCKET_ACTION,`invalid_state`),B.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(t),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((a,o)=>{let s=(t,n=!1)=>{!r||n?o(t):(B.debug(`[signaling] resending a signaling message`,e,u.sequence),r--,i(u))},c=this.sequence++,l=`${e}_${c}`;W.setMark(l);let u={sequence:c,name:e,statMarkName:l,params:t,responseTimer:0,needResponse:n,resolve:a,reject:s};i(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===x.UPDATE_DISPLAY_LAYOUT||e===x.REPORT_PERF_STAT||e===x.REPORT_SHARING_STAT||e===x.REQUEST_ASR||e===x.ENABLE_VIDEO_SUSPEND||e===x.ENABLE_VIDEO_SUSPEND_SUGGEST||e===x.REPORT_NETWORK_STAT||e===x.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(x.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(x.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(x.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,n){let r=Object.assign({sdp:t},n);return this._send(x.TRANSMIT_DATA,{participantId:e,data:r},!0,Va)}async acceptCall(e){return this._send(x.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(x.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Va)}async changeParticipantState(e,t){let n={participantState:{state:e}};return t&&(n.participantId=t),this._sendRaw(x.CHANGE_PARTICIPANT_STATE,n)}async hold(e){return this._send(x.HOLD,{hold:e})}async putHandsDown(){return this._send(x.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(x.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(x.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(x.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let n={capabilities:t};return e&&(n.description=e.sdp),this._send(x.ALLOCATE_CONSUMER,n)}async acceptProducer(e,t,n){let r={description:e.sdp,sessionId:n};return t&&(r.ssrcs=t),this._send(x.ACCEPT_PRODUCER,r)}async changePriorities(e){return this._send(x.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(x.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(x.ADD_MOVIE,e)}async updateMovie(e){return this._send(x.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(x.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(x.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(x.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(x.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(x.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(x.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(x.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(x.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(x.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(x.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(x.RECORD_PUBLISH,e)}async getRecordStatus(){return this._send(x.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(x.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(x.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(x.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(x.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(x.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(x.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(x.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(x.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,n){let r={participantId:e,roles:t};return n&&(r.revoke=!0),this._sendRaw(x.GRANT_ROLES,r)}async muteParticipant(e,t,n,r=null){return this._sendRaw(x.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:n,roomId:r})}async enableFeatureForRoles(e,t){return this._sendRaw(x.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,n){let r={participantId:e,roomId:n};return t&&(r.unpin=!0),this._sendRaw(x.PIN_PARTICIPANT,r)}async updateMediaModifiers(e){return this._send(x.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(x.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(x.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(x.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(x.CHANGE_OPTIONS,{options:e})}async getWaitingHall(e=null,t,n=!1){let r={};return e&&(r.fromId=e),t&&(r.count=t),n&&(r.backward=n),this._send(x.GET_WAITING_HALL,r)}async promoteParticipant(e,t=!1){let n={};return e&&(n.participantId=e),t&&(n.demote=t),this._sendRaw(x.PROMOTE_PARTICIPANT,n)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(x.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(x.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(x.FEEDBACK,{key:e})}async getHandQueue(){return this._send(x.GET_HAND_QUEUE)}close(){this.socket&&this.socket.readyState<WebSocket.CLOSING&&this._closeSocket(),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(x.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(x.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(x.ASR_START,e)}async stopAsr(e){return this._send(x.ASR_STOP,e)}async requestAsr(e){return this._send(x.REQUEST_ASR,{request:e},!1)}_buildUrl(e,t,n){let r=new URL(e),i=r.searchParams;return i.set(`platform`,P.platform),i.set(`appVersion`,String(P.appVersion)),i.set(`version`,String(P.protocolVersion)),i.set(`device`,P.device),i.set(`capabilities`,Aa.getFlags()),i.set(`clientType`,P.clientType),t&&i.set(`tgt`,t),t===Oa.RETRY&&this.lastStamp&&i.set(`recoverTs`,String(this.lastStamp)),P.useParticipantListChunk&&(i.set(`partIdx`,String(P.participantListChunkInitIndex)),P.participantListChunkInitCount!==null&&i.set(`partCount`,String(P.participantListChunkInitCount))),n&&(i.set(`compression`,`deflate-raw`),i.set(`ua`,navigator.userAgent)),this.peerId!==null&&i.set(`peerId`,String(this.peerId)),r.toString()}_connect(e,t){if(!(this.socket&&this.socket.readyState<WebSocket.CLOSING)){if(this.connectionType=e,t){if(!this.wtEndpoint){B.error(`[signaling] empty wt endpoint`),this.conversationReject?.(new y(w.SIGNALING_FAILED,{message:`Unable to connect to the signaling: wtEndpoint is not set`,remote:!0}));return}let t=this._buildUrl(this.wtEndpoint,e,!0);B.debug(`[signaling] connecting to wt `+t),this.socket=new za(t,{congestionControl:`low-latency`})}else{let t=this._buildUrl(this.endpoint,e,!1);B.debug(`[signaling] connecting to ws `+t),this.socket=new WebSocket(t)}this._markTransportStat(e===Oa.RETRY?Er.RECONNECTED:Er.CONNECTED),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor()}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){B.debug(`[signaling] socket opened`),b.log(E.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Oa.RETRY?Er.RECONNECTED:Er.CONNECTED)}_onMessage(e){if(this._startDoctor(),e.data===`ping`){Ea.mark(this._getSocketType()),this._markTransportStat(Er.FAILED_PINGS),z.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(`pong`);return}try{let t=JSON.parse(e.data);z.onSignalingMessage(t),this._handleMessage(t)}catch(t){b.log(E.SOCKET_ACTION,`parse_error`),B.error(`[signaling] unable to parse message`,t,e.data)}}_handleMessage(e){switch(e.type){case`notification`:e.notification===`connection`?(B.debug(`[signaling] signaling connected`,e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat(Er.RESTART),this._triggerEvent(jr.RECONNECT,e),e.conversation.topology&&this._triggerEvent(jr.NOTIFICATION,{type:`notification`,notification:G.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===G.ACCEPTED_CALL&&e.peerId.id===this.peerId&&e.peerId.type===`WEB_TRANSPORT`||this._handleMessage(e)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(jr.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:b.log(E.SOCKET_ACTION,`unknown_message`),B.warn(`[signaling] unhandled message`,e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){b.log(E.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Ha.includes(e.error):!1;switch(B.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case`service-unavailable`:let n=new y(v.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(n):this._triggerEvent(jr.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:v.SERVICE_UNAVAILABLE});break;case`conversation-ended`:this.conversationReject?this.conversationReject(new y(e.reason||w.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(jr.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:e.reason});break;case`participant-not-found`:this._throwError(Error(`Signaling error: ${e.error}`));break;default:if(!t)break;this.connected?this._throwError(Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new y(e.reason||w.SIGNALING_FAILED,{message:`Unable to connect to the signaling: ${e.error}`,remote:!0})),this._closeSocket())}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(jr.FAILED,e)}_onError(e){b.log(E.SOCKET_ACTION,`error`),B.error(`[signaling] signaling error`,e),this._logTransportStat(Er.FAILED_EXCEPTIONS,{string_value:this._serializeErrorEvent(e)})}_serializeErrorEvent(e){let t=e,n=t.error instanceof Error?t.error:null;return JSON.stringify({eventType:e.type,socketType:this._getSocketType(),readyState:this.socket?.readyState,errorName:n?.name||t.errorInfo?.name,errorMessage:n?.message||t.errorInfo?.message||t.message,errorStack:n?.stack||t.errorInfo?.stack,errorInfo:t.errorInfo})}_onClose(t){if(b.log(E.SOCKET_ACTION,`closed`),B.debug(`[signaling] connection closed`,{code:t.code,reason:t.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this._abortSignal?.aborted){B.debug(`[signaling] aborted reconnect`),this._closeSocket(new y(v.CANCELED));return}this.socket&&this.reconnectCount++<e.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new y(v.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let t=Math.min(e.RECONNECT_MAX_DELAY,e.RECONNECT_DELAY*2**(this.reconnectCount-1));B.log(`[signaling] reconnect websocket after ${t}ms (${this.reconnectCount})`),b.log(E.SOCKET_ACTION,`reconnect`),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Oa.RETRY,!1),t)}_handleCommandResponse(t,n){if(!Object.hasOwn(this.responseHandlers,n.sequence))return;let r=this.responseHandlers[n.sequence];window.clearTimeout(r.responseTimer);let i=W.measureMark(r.statMarkName);i!==null&&Da.mark(r.name,i,this._getSocketType()),B.debug(`[signaling] command response [${n.sequence}]`,n),t?(delete this.responseHandlers[n.sequence],r.resolve(n)):n.type===`error`?(delete this.responseHandlers[n.sequence],b.log(E.SOCKET_ACTION,`response-error`),r.reject(Error(n.error||`Response error [${r.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],b.log(E.SOCKET_ACTION,`response-timeout`),r.reject(Error(n.error||`Response timeout [${r.name}]`))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(t,n),e.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(B.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Ba){t.reject(Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let e=this._serializeBinary(t);e!==null&&this.producerCommandDataChannel.send(e)}else{if(!this.socket||this.socket.readyState!==WebSocket.OPEN){t.reject(Error(`Invalid state or socket already closed`));continue}this._startResponseTimer(t),this.socket.send(this._serializeJson(t))}}}_startResponseTimer(t){if(!t.needResponse){t.resolve({type:`response`,sequence:t.sequence,response:t.name});return}t.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:t.name,sequence:t.sequence,type:`timeout`}),e.WAIT_RESPONSE_DELAY),this.responseHandlers[t.sequence]=t}_serializeBinary(e){switch(e.name){case x.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case x.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case x.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case x.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case x.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case x.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case x.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case x.CHANGE_SIMULCAST:return this.producerCommandSerializationService.serializeChangeSimulcast(e.sequence,e.params)}return B.warn(`[signaling] cannot get binary data for data channel command: `+e.name),null}_serializeJson(e){let t;t=e.name===x.UPDATE_DISPLAY_LAYOUT?this._convertDisplayLayout(e.params):e.params;let n=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(n)}_convertDisplayLayout(e){let t=e,n={};for(let e in t)Object.hasOwn(t,e)&&(n[e]=Fn(t[e]));return{layouts:n}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new y(w.SIGNALING_FAILED,{message:`Unable to connect to the signaling: connection timeout`,remote:!0}))},e.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=e.RECONNECT_MAX_COUNT)&&(this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?B.warn(`[signaling] socket is dead. Fallback to WebSocket. Trying to connect ${this.reconnectCount}`):B.warn(`[signaling] socket is dead, trying to reconnect ${this.reconnectCount}`),this._logTransportStat(Er.FAILED_PINGS),this._disconnect(4e3),this._connect(Oa.RETRY,!1),this.reconnectCount++},e.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return za.isBrowserSupported()&&this.wtEndpoint!==null&&P.webtransport}_getSocketType(){return this.socket instanceof za?Tr.WEBTRANSPORT:Tr.WEBSOCKET}_markTransportStat(e){let t=this._getSocketType(),n=Dr[e][t];W.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=Dr[e][n];wr.logEventualStat({name:r,...t})}},Y=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(Y||{}),Wa=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(Wa||{}),Ga=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(Ga||{}),Ka=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(Ka||{}),qa=function(e){return e.REQUIRE_AUTH_TO_JOIN=`REQUIRE_AUTH_TO_JOIN`,e.AUDIENCE_MODE=`AUDIENCE_MODE`,e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.ADMIN_IS_HERE=`ADMIN_IS_HERE`,e.ASR=`ASR`,e.FEEDBACK=`FEEDBACK`,e.RECURRING=`RECURRING`,e}(qa||{});function Ja(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function Ya(e,t){let n=new Set(e);for(let[e,r]of Object.entries(t))r?n.add(e):n.delete(e);return Array.from(n)}var Xa=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(Xa||{}),X=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(X||{}),Za=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(Za||{}),Qa=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(Qa||{});function $a(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var eo=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}(eo||{});function to(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var no=function(e){return e.USER=`USER`,e.ANONYM=`ANONYM`,e.GROUP=`GROUP`,e}({}),Z;(function(e){function t(e){return e.length?typeof e[0]==`object`?e:e.map(e=>n(e)):[]}e.fromIds=t;function n(e,t=`USER`,n=0){return{id:e,type:t,deviceIdx:n}}e.fromId=n;function r(e,t=!0){let n=t?e.decorativeExternalUserId:e.externalId,r=e.deviceIdx??0;if(n)return i(n,r)}e.fromSignalingParticipant=r;function i(e,t=0){return{id:e.id,type:e.type===`ANONYM`?`ANONYM`:`USER`,deviceIdx:t}}e.fromSignaling=i;function a(e){return e.id}e.toSignaling=a;function o(e){let t=e.deviceIdx||0;return`{"id":"${e.id}","type":"${e.type}","deviceIdx":${t}}`}e.toString=o;function s(e,t=`USER`,r=0){return o(n(e,t,r))}e.fromIdToString=s;function c(e){try{return JSON.parse(e)}catch{throw Error(`Failed to parse ExternalId from string '${e}'`)}}e.fromString=c;function l(e,t){return e.id===t.id&&e.type===t.type&&e.deviceIdx===t.deviceIdx}e.compare=l;function u(e){return e?.deviceIdx||0}e.getDeviceIdx=u})(Z||(Z={}));function ro(e){try{return btoa(JSON.stringify(e))}catch(t){B.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function io(e){try{return JSON.parse(atob(e))}catch(t){B.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var ao=(e,t)=>N.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function oo(e){if(e.conversation?.muteStates)return e.conversation.muteStates;if(e.muteState&&e.muteOptions)return e.muteOptions.reduce((t,n)=>(t[n]=e.muteState,t),{})}function so(e,t){switch(e){case T.AUDIO:return!!t.isAudioEnabled;case T.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case T.VIDEO:return!!t.isVideoEnabled;case T.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function co(e,t){return N.objectReduce(e,(e,n,r)=>{switch(n){case Xa.MUTE:case Xa.MUTE_PERMANENT:so(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function lo(e){let{muteStates:t={},mediaSettings:n}=e;return co(t,n)}function uo(e,t){let n=e.conversation.participants.find(t=>N.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return co(t,r)}function fo(e,t){let n=new Uint8Array(t),r=0,i=0;for(;r<e.length&&i<t;){let a=e[r++],o=a>>4,s=a&15;if(o===15){let t;do t=e[r++],o+=t;while(t===255)}for(let a=0;a<o&&!(i>=t);a++)n[i++]=e[r++];if(r>=e.length||i>=t)break;let c=e[r]|e[r+1]<<8;if(r+=2,s===15){let t;do t=e[r++],s+=t;while(t===255)}s+=4;let l=i-c;for(let e=0;e<s&&!(i>=t);e++)n[i++]=n[l+e]}return n}var po=class{constructor(e){g(this,`_fixNoPacketsApplied`,!1),g(this,`_fixNoPacketsChecked`,!1),g(this,`_fixTooManyPacketsApplied`,!1),g(this,`_fixTooManyPacketsSucceeded`,!1),g(this,`_fixTooManyPacketsFailed`,!1),g(this,`_fixTooManyPacketsTime`,void 0),g(this,`_mediaSource`,void 0),g(this,`_lastPacketsSent`,void 0),g(this,`_lastPacketsSentTime`,void 0),g(this,`_toggleAudioPromise`,null),g(this,`_fixNoPacketsAppliedVideo`,!1),this._mediaSource=e}_fixAudioDeviceNoPackets(e){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,b.log(E.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&(this._fixNoPacketsApplied=!0,b.log(E.ERROR,`audio_device_recover`),B.log(`[AudioFix] Trying to fix RV (no packets)`),this._toggleAudioPromise=this._mediaSource.toggleAudio(k.getMicrophonePermissionState()!==`denied`),this._toggleAudioPromise.catch(()=>void 0))}}_fixAudioDeviceTooManyPackets(e){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let t=Date.now();if(!this._lastPacketsSentTime)e.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent);else if(t-this._lastPacketsSentTime>500){let n=(e.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent,this._fixTooManyPacketsApplied?n>75?(B.log(`[AudioFix] Failed to fix RV`),b.log(E.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(B.log(`[AudioFix] Fixed RV`),b.log(E.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,b.log(E.ERROR,`audio_device_recover`),B.log(`[AudioFix] Trying to fix RV (too many packets)`),this._mediaSource.toggleAudio(!0).catch(e=>{B.warn(`[AudioFix] Failed to fix RV (too many packets)`,e)}),this._fixTooManyPacketsTime=t)}}fix(e){if(!this._mediaSource)return;let t=e.find(e=>e.kind===j.audio);t&&(this._fixAudioDeviceNoPackets(t),this._fixAudioDeviceTooManyPackets(t))}fixVideo(e){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let t=e.find(e=>e.kind===j.video);t&&!t.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.getMediaSettings().isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(e=>{B.warn(`[AudioFix] Failed to fix RV (no packets): video restart`,e)}))}},mo=class{constructor(e,t=!1){g(this,`_audioElement`,null),g(this,`_audioTracks`,new Map),g(this,`_allowMultipleTracks`,void 0),g(this,`_volume`,1),g(this,`_features`,{setSinkId:!!Audio.prototype.setSinkId}),g(this,`_statFirstMediaReceived`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t}add(e,t){this._allowMultipleTracks||this._clearTracks();let n=this._audioTracks.get(e);n&&n!==t&&(this._removeTrackFromAudioElement(n),n.stop()),this._audioTracks.set(e,t),this._audioElement?this._addTrackToAudioElement(t):this._initAudioElement()}remove(e,t){let n=this._audioTracks.get(e);if(!n){t.stop();return}if(n!==t){t.stop();return}if(!this._allowMultipleTracks){this.destroy();return}this._removeTrackFromAudioElement(t),t.stop(),this._audioTracks.delete(e),this._audioTracks.size||this.destroy()}get volume(){return this._volume}set volume(e){this._volume=Math.max(0,Math.min(1,e)),this._audioElement&&(this._audioElement.volume=this._volume)}destroy(){!this._audioElement&&!this._audioTracks.size||(this._stopAudioElement(),this._audioElement=null,this._audioTracks.clear())}async changeOutput(){try{if(!this._features.setSinkId)throw Error(`Feature "setSinkId" is not supported`);if(!this._audioElement)return;let e=k.getSavedOutput();e&&await this._audioElement.setSinkId?.(e.deviceId)}catch(e){throw b.log(E.ERROR,`change_output`),B.error(`[audio] Output change failed`,e),e}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(P.muteMode)return;let e=this._getTracks();if(!e.length)return;let t=k.browserName()!==`Safari`||k.isMobile(),n=document.createElement(t?`audio`:`video`);n.muted=!1,n.volume=this._volume,n.preload=`auto`;let r=()=>{B.warn(`[audio] Error on play audio`),z.onAutoplayError()},i=e=>{B.debug(`[audio] Play audio`),n.srcObject=null,n.srcObject=new MediaStream(e),n.load();let t=n.play();t&&t.catch(r)},a=()=>{B.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?i(e):B.warn(`[audio] Broken audio tracks`)};n.onpause=a,n.onstalled=a,n.onerror=a,n.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(e),this._audioElement=n}_stopAudioElement(){this._audioElement&&(this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_addTrackToAudioElement(e){if(!this._audioElement)return;B.debug(`[audio] Adding track ${e}`);let t=this._audioElement.srcObject;t||(t=new MediaStream,this._audioElement.srcObject=t),t.addTrack(e)}_removeTrackFromAudioElement(e){this._audioElement?.srcObject&&(B.debug(`[audio] Removing track ${e}`),this._audioElement.srcObject.removeTrack(e))}_clearTracks(){for(let e of this._audioTracks.values())this._removeTrackFromAudioElement(e),e.stop();this._audioTracks.clear()}},ho=90,go=3,_o=class extends _{constructor(...e){super(...e),g(this,`_lastMemoryStat`,{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(e=>{e.userId=(typeof e.userId==`string`&&t[e.userId]||null)?.externalId}),z.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),n=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>ho?B.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=go)&&(B.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},vo=44100,yo=class{constructor(e,t){g(this,`_analyser`,null),g(this,`_gainNode`,null),g(this,`_fftBins`,null),g(this,`_mediaStreamSource`,null),g(this,`_lastSmoothedLevel`,0),g(this,`_trackId`,void 0),g(this,`_track`,void 0),g(this,`_stream`,void 0),this._trackId=e,this._track=t,this._stream=new MediaStream([t]);try{let e=k.getAudioContext();this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),this._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=e.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let e=vo/this._fftBins.length,t=Math.ceil(P.voiceParams.minFreq/e),n=Math.floor(P.voiceParams.maxFreq/e);return this._fftBins.subarray(t,n)}getLevel(){let e=this._getBins(),t=e.reduce((e,t)=>e+t,0)/e.length/255,n=this._lastSmoothedLevel*P.voiceParams.smoothing+t*(1-P.voiceParams.smoothing);return this._lastSmoothedLevel=n,{real:t,smoothed:n}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}},bo=class extends _{constructor(e){super(),g(this,`_detector`,null),g(this,`_interval`,null);let t=()=>{this._detector&&z.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,P.voiceParams.interval)};this._interval=window.setTimeout(t,P.voiceParams.interval);let n=()=>{let t=e.getSendAudioTrack();t&&this.init(t)};this.subscribe(e,sn.SOURCE_CHANGED,t=>{t.kind===j.audio&&e.getMediaSettings().isAudioEnabled&&n()}),this.subscribe(e,sn.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new yo(`local`,e.clone())}_stopDetector(){this._detector&&(this._detector.track.stop(),this._detector.destroy(),this._detector=null)}destroy(){this.unsubscribe(),this._interval&&(window.clearTimeout(this._interval),this._interval=null),this._stopDetector()}},xo=class{constructor(e){g(this,`processor`,void 0),g(this,`queue`,[]),g(this,`isProcessing`,!1),this.processor=e}add(e){this.queue.push(e),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let e=this.queue.shift();if(e)try{await this.processor(e)}catch{B.error(`Can't process message ${JSON.stringify(e)}`)}}this.isProcessing=!1}}},So=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),Co=class extends _{constructor(e){super(),g(this,`_detectors`,new Map),g(this,`_interval`,null),g(this,`_activeParticipants`,void 0),g(this,`_removedParticipants`,void 0),g(this,`_topology`,void 0),this._topology=e.getTopology(),this.subscribe(e,K.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(e,K.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,K.SIGNALLED_ACTIVE_PARTICIPANTS,this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,K.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._destroyDetectors()}_onRemoteTrackAdded(e,t,n){if(n.kind===j.audio&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new yo(e,n)),!this._interval)){let e=()=>{this._collectVolumes(),this._interval=window.setTimeout(e,P.voiceParams.interval)};this._interval=window.setTimeout(e,P.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,n){if(n.kind!==j.audio)return;let r=this._detectors.get(e);!r||r.track!==n||(r.destroy(),this._detectors.delete(e))}_collectVolumes(){if(!this._detectors.size)return;let e={};if(this._topology===J.SERVER){if(this._activeParticipants)for(let t of this._activeParticipants){let n=this._getAudioTrackLevelByParticipantId(t);n&&(e[t]=n)}if(this._removedParticipants){for(let t of this._removedParticipants)e[t]={real:0,smoothed:0};this._removedParticipants=null}}else for(let[t,n]of this._detectors.entries())e[t]=n.getLevel();this._triggerEvent(`VOLUMES_DETECTED`,e)}_getAudioTrackLevelByParticipantId(e){if(this._isTransparentAudioMode())return this._getTransparentAudioLevelByParticipantId(e);let t=this._detectors.get(li.AUDIO_MIX);return t?t.getLevel():null}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((e,n)=>{if(!n.startsWith(`${li.TRANSPARENT_AUDIO_TRACK_PREFIX}-`))return;let r=e.getLevel();(!t||r.real>t.real)&&(t=r)}),t}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){this._topology=e,this._destroyDetectors(),e===J.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology===J.SERVER&&P.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},wo=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),To=class extends _{constructor(e,t,n){super(),g(this,`_speakerId`,null),g(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===J.SERVER,this.subscribe(e,So.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this.subscribe(t,K.SIGNALLED_SPEAKER_CHANGED,this._onServerSpeakerChanged.bind(this)),this.subscribe(t,K.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,n=null;if(Object.keys(e).forEach(r=>{let i=e[r].smoothed;i>t&&i>P.voiceParams.threshold&&(t=i,n=r)}),n&&n!==this._speakerId){let r=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>r*P.voiceParams.speakerLevelMultiplier&&(this._speakerId=n,this._triggerEvent(`SPEAKER_CHANGED`,n))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent(`SPEAKER_CHANGED`,e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e===J.SERVER}},Eo=class extends _{constructor(e,t,n){super(),g(this,`_transport`,void 0),g(this,`_volumes`,{}),g(this,`_participants`,{}),g(this,`_connectionTimeout`,0),g(this,`_volumeTimeout`,0),this._transport=e,this._participants=n,this.subscribe(e,K.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(t,So.VOLUMES_DETECTED,this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_onTransportStateChanged(e,t){t===q.OPENED&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),P.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),P.specListenerParams.volumeTimeout))),t===q.FAILED&&this._connectionTimeout&&(B.warn(`Transport failed, send callSpecError`),b.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){Object.values(this._transport.getStates()).filter(e=>e!==q.CONNECTED).length>0&&(B.warn(`There is not connected transport, send callSpecError`),b.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let n=`UNKNOWN`,r=this._participants[t];r&&r.platform&&(n=r.platform),e.indexOf(n)<0&&(e.push(n),b.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&B.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},Do=class e{static correctHangupReason(e){switch(e){case v.HUNGUP:return`hangup`;case v.CANCELED:return`canceled`;case v.REJECTED:return`rejected`;case v.BUSY:return`busy`;case v.FAILED:return`failed`;case v.MISSED:return`missed`;case v.ANOTHER_DEVICE:return`another_device`;case v.REMOVED:return`removed`;case v.BANNED:return`banned`;case v.VCHAT_DETAILED_ERROR:return`error`;default:return`hangup`}}static sendHangupEvent(t,n){if(![v.HUNGUP,v.CANCELED,v.REJECTED,v.FAILED,v.BUSY,v.MISSED,v.ANOTHER_DEVICE,v.REMOVED,v.BANNED,v.VCHAT_DETAILED_ERROR].includes(t.hangup))return;let r=t.custom_error?.vchat_detailed_api_error?.code;b.logClientStats({name:H.CALL_FINISH,reason:e.correctHangupReason(t.hangup),call_topology:n===J.DIRECT?`D`:`S`,...r&&{string_value:r}})}},Oo=class{constructor(){g(this,`_isCallMarked`,!1),g(this,`_isFinished`,!1),g(this,`_callType`,null)}markAcceptCall(e){this.mark(e===J.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===J.DIRECT&&this.mark(`direct_outgoing`)}markParticipantJoined(e){e===J.DIRECT&&this.mark(`server_change_topology`)}markOnJoin(e){e===J.SERVER&&this.mark(`server_join_server`)}mark(e){this._isCallMarked||(this._isCallMarked=!0,this._callType=e,W.setMark(H.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&wr.logEventualStat({name:H.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},ko=1e3,Ao=1e4,jo=15,Q=class e extends _{constructor(e,t){super(),g(this,`_api`,void 0),g(this,`_signaling`,void 0),g(this,`_signalingActor`,void 0),g(this,`_mediaSource`,null),g(this,`_conversation`,null),g(this,`_myLastRequestedLayouts`,{}),g(this,`_state`,`IDLE`),g(this,`_participantState`,X.CALLED),g(this,`_participants`,{}),g(this,`_pendingParticipants`,new Map),g(this,`_transport`,null),g(this,`_debugInfo`,null),g(this,`_debugSessionId`,null),g(this,`_volumesDetector`,null),g(this,`_speakerDetector`,null),g(this,`_localVolumeDetector`,null),g(this,`_specListener`,null),g(this,`_activeSpeakerId`,null),g(this,`_lastSignalledActiveSpeakerId`,null),g(this,`_isRealTimeAsrRequested`,!1),g(this,`_serverSettings`,zr()),g(this,`_serverTimeOffset`,0),g(this,`_onUnload`,void 0),g(this,`_audioOutput`,void 0),g(this,`_lastStalled`,{}),g(this,`_audioMixStalled`,!1),g(this,`_audioFix`,null),g(this,`_streamByStreamId`,new Map),g(this,`_streamIdByStreamDescription`,new Map),g(this,`_streamWaitTimerByStreamDescription`,new Map),g(this,`_sequenceNumberByStreamDescription`,new Map),g(this,`_cooldownTimestampByStreamDescription`,new Map),g(this,`_cooldownQueueCleanupTimer`,null),g(this,`_statFirstMediaReceived`,void 0),g(this,`_changeMediaSettings`,N.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(e){if(B.warn(`changeMediaSettings failed with error`,e),e.message===`chatRoom.maxShareCountExceeded`)return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100)),b.create(e,t),b.setConversationIdProvider(()=>this._conversation?.id||null),wr.create(),Br.create(()=>this._transport?.getTopology()),Ea.create(),Da.create(),this._api=e,this._signaling=new Ua,this._signalingActor=new xo(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state===`IDLE`?v.CANCELED:v.HUNGUP),P.clientEventsLoggingEnabled&&b.logClientEvent({event_type:H.CALL_DECLINED_OR_HANGED_LOCALLY,reason:`none`},!0)),b.destroy(),wr.destroy(),Br.destroy(),Ea.destroy(),Da.destroy()},window.addEventListener(`pagehide`,this._onUnload),this._statFirstMediaReceived=new Oo,this._audioOutput=new mo(this._statFirstMediaReceived,P.transparentAudio),P.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),ko))}static current(){return e._current}static hangupAfterInit(){e._activationMutex&&!e._current&&(e._delayedHangup=!0,e._abortController?.abort(new y(v.CANCELED)))}static id(){return e._current?._conversation?.id||null}static getSyncedTime(){return Date.now()+(e._current?._serverTimeOffset??0)}get debugSessionId(){return this._debugSessionId}async onStart({opponentIds:t,opponentType:n,mediaOptions:r,payload:i=``,joiningAllowed:a=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:l,conversationId:u}){if(e._activationMutex)throw b.log(E.ERROR,`startCall`),B.warn(`Conversation: there is already running activation`),new y(v.FAILED);let d=Date.now();e._activationMutex=!0,this._debugSessionId=P.debugLog?Ue():null,e._abortController=new AbortController,this._api.setAbortSignal(e._abortController?.signal),this._signaling.setAbortSignal(e._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(r);let f=this._mediaSource.getMediaSettings();n===Wa.CHAT||t&&t.length>1?this._logWithMediaSettings(E.OUTGOING_MULTIPARTY_CALL,f):this._logWithMediaSettings(E.OUTGOING_CALL,f);let p=await this._startConversation({opponentIds:t,opponentType:n,direction:Y.OUTGOING,mediaOptions:r,payload:i,joiningAllowed:a,requireAuthToJoin:o,onlyAdminCanShareMovie:s,externalIds:c,startedTime:d,onFastStart:l,conversationId:u});if(!this._conversation)throw new y(v.UNKNOWN_ERROR);if(this._participantState=X.ACCEPTED,this._changeMediaSettings(f),await this._processConnection(p),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),e._delayedHangup)throw new y(v.CANCELED);return B.debug(`Outgoing call`,{opponentIds:t,opponentType:n,mediaOptions:r}),await this._processConnectionSharedMovieInfo(p),await this._processConversationUrlSharingInfo(p),z.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),z.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants()),await this._onConversationParticipantListChunk(p),await this._processPinnedParticipants(p),z.onLocalStatus(F.WAITING),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),e._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(e){throw this._close(e,`Unable to start conversation`),e}finally{e._activationMutex=!1}}async onJoin(t){if(e._activationMutex)throw b.log(E.ERROR,`joinCall`),B.warn(`Conversation: there is already running activation`),new y(v.FAILED);let n=Date.now();e._activationMutex=!0,this._state=`PROCESSING`,this._debugSessionId=P.debugLog?Ue():null,e._abortController=new AbortController,this._api.setAbortSignal(e._abortController?.signal),this._signaling.setAbortSignal(e._abortController?.signal);try{let r=!!t.observedIds?.length;if(r&&P.videoTracksCount>0)throw B.error(`Observer mode: please set videoTracksCount=0`),new y(v.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(t.mediaOptions,!r);let i=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.JOIN_CONVERSATION,i);let a=await this._joinConversation(t,n);if(!this._conversation)throw new y(v.UNKNOWN_ERROR);return this._conversation.observer=r,z.onLocalStream(this._mediaSource.getStream(),i),this._conversation.waitForAdmin||this._conversation.waitingHall?(B.log(this._conversation.waitForAdmin?`Wait for admin`:`In waiting hall`),e._current=this,e._activationMutex=!1,this._signaling.readyToSend(),z.onLocalStatus(this._conversation.waitForAdmin?F.WAIT_FOR_ADMIN:F.WAITING_HALL),this._conversation):this._onJoinPart2(a)}catch(t){throw e._activationMutex=!1,this._close(t,`Unable to join conversation`),t}}async _onJoinPart2(t){B.debug(`Join conversation part 2`),e._activationMutex=!0;try{if(this._participantState=X.ACCEPTED,!this._conversation||!this._mediaSource)throw new y(v.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(t),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state===`CLOSE`)return this._conversation;if(e._delayedHangup)throw new y(v.CANCELED);await this._processConnectionSharedMovieInfo(t),await this._processConversationUrlSharingInfo(t),await this._processConnectionAsrInfo(t);let n=await this._extractExternalRoomsData(t.rooms?.rooms,t.rooms?.roomId);z.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),n),await this._onConversationParticipantListChunk(t),await this._processPinnedParticipants(t),z.onLocalStatus(F.WAITING),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),e._current=this;let r=this._extractLocalParticipantFromConnection(t);if(r){let e=N.mapParticipantState(r);Object.keys(e).length>0&&z.onLocalParticipantState(e)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(e){throw this._close(e,`Unable to join conversation`),e}finally{e._activationMutex=!1}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(e=>!!e)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let n={rooms:await this._extractExternalRooms(e)};return t&&(n.roomId=t),n}async onPush(t,n=M.USER,r,i,a){if(e._activationMutex)throw B.warn(`Conversation: there is already running activation`),new y(v.REJECTED);e._activationMutex=!0,e._abortController=new AbortController,this._api.setAbortSignal(e._abortController?.signal),this._signaling.setAbortSignal(e._abortController?.signal);try{let o=Date.now(),s=await this._prepareConversation(t,n,r,i,a);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new y(v.UNKNOWN_ERROR);if(!s.conversation.participants.find(e=>e.state===X.CALLED&&e.id===this._conversation?.userId))throw B.log(`Push rejected (there is an active call)`),b.log(E.PUSH,`rejected`),new y(v.REJECTED);if(await this._processConnection(s),this._extractConnectionUrlSharingInfo(s),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(s),this._signaling.readyToSend(),this._logCallStartEvent(o,Y.INCOMING),b.log(E.PUSH,`accepted`),e._current=this,e._delayedHangup)throw new y(v.CANCELED);e._activationMutex=!1}catch(t){throw e._activationMutex=!1,this._close(t,`Unable to handle inbound call push`),t}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(qa.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(qa.WAIT_FOR_ADMIN),n=e.conversation.options.includes(qa.ADMIN_IS_HERE);return!t||t&&n?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(t=>N.comparePeerId(t.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(qa.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new y(v.UNKNOWN_ERROR);this._state=`PROCESSING`;let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.ACCEPT_CONCURRENT,e),B.debug(`Concurrent call`,{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.getMediaSettings()),z.onCallAccepted(),this._state=`ACTIVE`,this._participantState=X.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(e){this._close(e,`Unable to accept concurrent call`)}}async _getMainRoomParticipants(){let e=await this._getParticipants();return N.mapSharedParticipants(Object.values(e).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,n]=e.split(`:`),r=parseInt(t,10);if(isNaN(r))throw Error(`Invalid original length in prefix`);let i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);try{let e=fo(a,r).reduce((e,t)=>(e+=String.fromCharCode(t),e),``),{srcp:t,stne:n,tkn:i,trne:o,trnp:s,trnu:c,wse:l,wte:u}=JSON.parse(e);return{token:i,endpoint:l,wt_endpoint:u,turn_server:{urls:o.split(`,`),username:c,credential:s},stun_server:{urls:n.split(`,`)},client_type:t}}catch(e){throw this._close(e,`Can't decompress conversation params`),e}}_logCallStartEvent(e,t){let n={[Y.OUTGOING]:`outgoing`,[Y.INCOMING]:`incoming`,[Y.JOINING]:`join`};wr.logEventualStat({name:H.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[n[t],`warmup_start`]})})}async accept(e){if(this._state!==`IDLE`)throw b.log(E.ERROR,`acceptIncoming`),B.error(`Unable to accept a call - invalid state`),Error(`Unable to accept a call - invalid state`);if(!this._mediaSource||!this._conversation||!this._transport)throw new y(v.UNKNOWN_ERROR);this._state=`PROCESSING`,this._debugSessionId=P.debugLog?Ue():null,P.debugLog&&We(this._conversation.id,this._debugSessionId||void 0),B.debug(`Accept incoming call`,e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=X.ACCEPTED;let n=this._getMuteStatesForCurrentRoom(),r=Object.keys(n);r.length&&this._onMuteParticipant({muteStates:n,mediaOptions:r,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let i=await this._signaling.getRooms(this._isCallAdmin());if(i.rooms?.rooms){let e=await this._getParticipants();i.rooms.rooms.forEach(t=>{t.participantIds?.forEach(t=>{e[t]&&(e[t].isInRoom=!0)})})}this._conversation.roomId=i.rooms?.roomId||null;let a=await this._extractExternalRoomsData(i.rooms?.rooms,i.rooms?.roomId);if(z.onCallAccepted(),z.onLocalStream(this._mediaSource.getStream(),t),z.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),a),P.useParticipantListChunk){let e=await this._getInitialParticiapntListChunk(),t=await this._getParticipants();e?.participants?.forEach(e=>{let n=t[N.composeId(e)];n&&(n.movieShareInfos=e.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:e})}return z.onLocalStatus(F.WAITING),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0),await this._processConversationUrlSharingInfo(),await this._processConnectionAsrInfo(),this._conversation}catch(e){throw this._close(e,`Unable to accept call`),e}}async decline(){if(this._state!==`IDLE`)throw b.log(E.ERROR,`declineIncoming`),B.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);this._state=`PROCESSING`,B.debug(`Decline incoming call`),this._logWithMediaSettings(E.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=X.HUNGUP,this._signaling.ready&&await this._signaling.hangup(v.REJECTED),this._close(new y(v.REJECTED))}async hangup(){B.debug(`Hangup`);let e=this._state===`ACTIVE`?v.HUNGUP:v.CANCELED;b.log(E.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new y(e))):z.onHangup(new y(v.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new y(v.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipant(e.map(Z.toSignaling),t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:v.UNKNOWN_ERROR);let i=n.participants;if(!i&&n.rejectedParticipants)throw Error(n.rejectedParticipants[0].reason);for(let e of i)await this._onAddParticipant(N.composeId(e),e,r)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new y(v.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipantLegacy(e,t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:v.UNKNOWN_ERROR);let i=n.participants;for(let e of i)await this._onAddParticipant(N.composeId(e),e,r)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let n=[];for(let r of e)(r.state===X.CALLED||r.state===X.ACCEPTED)&&(this._transport.isAllocated(r.id)||this._transport.allocate(r.id,t)),r.state===X.ACCEPTED&&n.push(r.id);n.length?this._transport.open(n,null,!!this._conversation?.observer):this._transport.getTopology()===J.SERVER&&this._forceOpenTransportForAloneInCall()}async _close(t,n){n&&B.error(n,t),B.debug(`Close conversation`,t),Do.sendHangupEvent(t,this._transport?.getTopology()),Br.destroy(),Ea.logMetrics(this._transport?.getTopology()),Ea.destroy(),Da.logMetrics(this._transport?.getTopology()),Da.destroy(),this._signaling.readyToSend(!1),t.error?this._signaling.ready&&this._signaling.hangup(v.FAILED):b.log(E.ERROR,t.hangup),e._activationMutex=!1;let r=this._conversation&&this._conversation.id;if([v.CANCELED,v.NOT_FRIENDS,v.CALLEE_IS_OFFLINE,v.CALLER_IS_BLOCKED,v.CALLER_IS_REJECTED].indexOf(t.hangup)!==-1||t.hangup===v.REJECTED&&!t.remote){z.onHangup(t,r),this.destroy();return}if(t.hangup===v.HUNGUP&&(!t.remote||this._isCalledState())){z.onHangup(t,r),this.destroy();return}if(t.hangup===v.MISSED&&!t.remote){z.onHangup(t,r),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(t.hangup===v.SOCKET_CLOSED||t.hangup===v.NOT_FOUND)&&e._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(t.hangup===v.BUSY&&!t.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state=`CLOSE`,this._participantState=X.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),b.destroy(),wr.destroy(),this._conversation=null,this._myLastRequestedLayouts={},e._current=null,e._delayedHangup=!1,e._abortController=null,z.onHangup(t||new y(v.UNKNOWN_ERROR),r)}async destroy(){let t=this._conversation&&this._conversation.id;if(B.debug(`Destroy conversation`,{conversationId:t}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state=`CLOSE`,this._participantState=X.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),e._delayedHangup&&t)try{this._api.hangupConversation(t,v.CANCELED)}catch{}this._cleanupListeners(),b.destroy(),wr.destroy(),this._conversation=null,this._myLastRequestedLayouts={},e._current=null,e._delayedHangup=!1,e._abortController=null}async _getConversationParams(e){let t=await this._api.getConversationParams(e);B.debug(`Api.getConversationParams`,t);let n=[],{turn_server:r,stun_server:i}=t;if(i&&n.push(i),r&&r.urls){let e=r.urls.filter((e,t,n)=>n.indexOf(e)===t);e.push(`${e[e.length-1]}?transport=tcp`),n.push({urls:e,username:r.username,credential:r.credential})}return P.iceServers=n,P.wssBase=t.endpoint,t.wt_endpoint&&(P.wtsBase=t.wt_endpoint),P.wssToken=t.token,t.client_type&&(P.clientType=t.client_type),t.external_user_type&&(P.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:n,wt_endpoint:r,token:i,client_type:a}){let o=[];if(t&&o.push(t),e&&e.urls){let t=e.urls.filter((e,t,n)=>n.indexOf(e)===t);t.push(`${t[t.length-1]}?transport=tcp`),o.push({urls:t,username:e.username,credential:e.credential})}P.iceServers=o,P.wssBase=n,P.wssToken=i,r&&(P.wtsBase=r),a&&(P.clientType=a)}_addGeoParamsToEndpoint(e,t){return t.isp_as_no&&(e+=`&ispAsNo=${t.isp_as_no}`),t.isp_as_org&&(e+=`&ispAsOrg=${t.isp_as_org}`),t.loc_cc&&(e+=`&locCc=${t.loc_cc}`),t.loc_reg&&(e+=`&locReg=${t.loc_reg}`),e}async _startConversation({opponentIds:t,opponentType:n,direction:r,mediaOptions:i,payload:a=``,joiningAllowed:o=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:c,externalIds:l,startedTime:u,onFastStart:d,conversationId:f}){W.setMark(H.SIGNALING_CONNECTED);let p=f??N.uuid();B.debug(`Conversation: start`,{conversationId:p,opponentIds:t,opponentType:n,direction:r});let m=i.includes(T.VIDEO),h;if(d){let t={deviceId:this._api.deviceId(),sdkVersion:P.sdkVersion,clientAppKey:P.apiKey,platform:P.platform,protocolVersion:P.protocolVersion,domainId:P.domain,capabilities:Aa.getFlags()},r=JSON.stringify(t),a;try{if(a=await d({internalParams:r,conversationId:p,externalIds:l,opponentType:n,mediaOptions:i,isVideo:m,joiningAllowed:o,requireAuthToJoin:s},e._abortController?.signal),!a.internalCallerParams)throw new y(v.FAST_START_ERROR,{message:JSON.stringify(a)})}catch(t){throw e._delayedHangup&&e._abortController?.signal.aborted?new y(v.CANCELED):t instanceof y?t:t instanceof Error?new y(v.FAST_START_ERROR,{message:t.message}):new y(v.FAST_START_ERROR,{message:String(t)})}try{let e=JSON.parse(a.internalCallerParams);h={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:p,is_concurrent:e.isConcurrent,client_type:e.clientType,rejected_participants:a.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},B.debug(`FastStart`,h)}catch{throw new y(v.FAST_START_ERROR,{message:`Cannot parse internal params`})}}else h=await this._api.startConversation(p,t,n,m,a,o,s,{onlyAdminCanShareMovie:c},l),B.debug(`Api.startConversation`,h);this._setConversationParams(h);let ee=await this._connectSignaling(Oa.START,h);return await this._setConversation(h,ee,r),this._logCallStartEvent(u,Y.OUTGOING),ee}async _joinConversation(t,n){W.setMark(H.SIGNALING_CONNECTED);let{conversationId:r,mediaOptions:i,chatId:a,joinLink:o,observedIds:s,payload:c,onFastJoin:l}=t;B.debug(`Conversation: join`,{conversationId:r,joinLink:o,observedIds:s});let u=i.includes(T.VIDEO),d;if(l){if(!o)throw new y(v.FAST_JOIN_ERROR,{message:`joinLink is required for fast join`});let t={deviceId:this._api.deviceId(),sdkVersion:P.sdkVersion,clientAppKey:P.apiKey,platform:P.platform,protocolVersion:P.protocolVersion,domainId:P.domain,capabilities:Aa.getFlags()},n=JSON.stringify(t),r;try{if(r=await l({joinLink:o,isVideo:u,internalParams:n},e._abortController?.signal),!r.internalCallerParams||!r.conversationId)throw new y(v.FAST_JOIN_ERROR,{message:JSON.stringify(r)})}catch(t){throw e._delayedHangup&&e._abortController?.signal.aborted?new y(v.CANCELED):t instanceof y?t:t instanceof Error?new y(v.FAST_JOIN_ERROR,{message:t.message}):new y(v.FAST_JOIN_ERROR,{message:String(t)})}try{let e=JSON.parse(r.internalCallerParams);d={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:r.conversationId,is_concurrent:e.isConcurrent,client_type:e.clientType,stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},B.debug(`FastJoin`,d)}catch{throw new y(v.FAST_JOIN_ERROR,{message:`Cannot parse internal params`})}}else if(r)d=await this._api.joinConversation(r,u,a);else if(o)d=await this._api.joinConversationByLink(o,u,s,c);else throw new y(v.UNKNOWN_ERROR);B.debug(`Api.joinConversation`,d),this._setConversationParams(d);let f=await this._connectSignaling(Oa.JOIN,d);return await this._setConversation(d,f,Y.JOINING),this._logCallStartEvent(n,Y.JOINING),f}async _prepareConversation(t,n=M.USER,r,i,a){W.setMark(H.SIGNALING_CONNECTED),B.debug(`Conversation: push`,{conversationId:t,type:n,peerId:r});let o=this._api.getUserId();if(!o)throw new y(v.UNKNOWN_ERROR);let s=0,c=``,l=``,u={id:t,peerId:r,endpoint:c,wt_endpoint:l,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:``};if(i){let e=this._decodeExternalConversationParams(i);this._setConversationParams(e),c=a??`${P.wssBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,u.token=e.token,u.endpoint=c,P.wtsBase&&(l=`${P.wtsBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,u.wt_endpoint=l)}else{let e=await this._getConversationParams(t);s=e.device_idx||0,c=a??`${P.wssBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,c=this._addGeoParamsToEndpoint(c,e),u.token=e.token,u.endpoint=c,u.device_idx=s,P.wtsBase&&(l=`${P.wtsBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,l=this._addGeoParamsToEndpoint(l,e),u.wt_endpoint=l)}let d=await this._connectSignaling(Oa.ACCEPT,u);return e._current&&(e._current._participantState===X.ACCEPTED||e._current._participantState===X.CALLED)?(B.log(`Push rejected (busy)`),b.log(E.PUSH,`busy`),this._signaling.ready&&this._signaling.hangup(v.BUSY),Promise.reject(new y(v.BUSY))):(e._current&&(e._current.destroy(),e._current=null),await this._setConversation(u,d,Y.INCOMING,n),d)}async _createParticipant(e,t){let n=Object.assign({id:null,externalId:null,mediaSettings:A(),participantState:{},state:X.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return n.externalId||(n.externalId=await this._getParticipantId(t??n.id)),this._api.cacheExternalId(t??n.id,n.externalId),t&&this._api.mapDecorativeId(t,n.id),n.observedIds?.length&&(n.externalId.observer=!0),e.markers&&(n.markers=this._denormalizeMarkers(n.id,e.markers)),n}async _getParticipantId(e){try{return await this._api.userId(e)}catch(e){throw this._close(new y(v.NETWORK_ERROR),e),e}}async _setConversation(e,t,n,r=M.USER){let{participants:i}=t.conversation;t.conversationParams?.serverTime&&(this._serverTimeOffset=t.conversationParams.serverTime-Date.now()),i.forEach(e=>{let t=N.composeId(e),n=Z.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=N.composeDecorativeId(e),i=Z.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(e.decorativeUserId,e.id))}});let a=this._api.getUserId(),o=this._extractLocalParticipantFromConnection(t),s=e.device_idx||0;if(!a){if(!o)throw new y(v.UNKNOWN_ERROR);a=Number(o.id),o.idType&&(r=o.idType),o.deviceIdx&&(s=o.deviceIdx),this._api.setUserId(a)}let c=N.composeParticipantId(a,r,s);this._conversation={userId:a,compositeUserId:c,externalId:await this._getExternalIdByParticipantId(c),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||J.DIRECT,direction:n,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:o?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},P.debugLog&&We(t.conversation.id||e.id,this._debugSessionId||void 0),this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(P.forceRelayPolicy=e.p2p_forbidden),b.log(E.RELAY_POLICY,P.forceRelayPolicy?`1`:`0`),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new y(v.UNKNOWN_ERROR);this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||J.DIRECT,this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1}_createMediaSource(){let e=new ln;return this.subscribe(e,sn.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,sn.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new po(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,jr.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,jr.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,jr.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return wr.logEventualStat({name:H.SIGNALING_CONNECTED}),n}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(Ga.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&z.onConversationParticipantListChunk(await this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{participants:[],countBefore:0,countAfter:0,markerFound:!1,...e}}async _participantListChunkToExternalChunk(e){let t=await this._getParticipants(),n=N.mapSharedParticipants(e.participants.reduce((e,n)=>{let r=N.composeId(n);return t[r]&&e.push(t[r]),e},[]));return{...e,participants:n}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let e of t)await this._registerParticipants(e?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let n=e[0]?.externalId?.type;n&&(P.externalUserType=n);let r=await this._getParticipants();for(let n of e){let e=N.composeId(n);if(B.test(`Conversation:RegisterParticipant`,e),this._isMe(e)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(B.debug(`Local roles changed: ${n.roles}`),z.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(n);continue}if(n.state===X.HUNGUP||n.state===X.REJECTED){r[n.id]&&await this._removeParticipant(r[n.id],v.HUNGUP);continue}let i=N.composeDecorativeId(n);this._registerParticipant({id:e,externalId:Z.fromSignalingParticipant(n),mediaSettings:A(n.mediaSettings),participantState:N.mapParticipantState(n),state:n.state,roles:n.roles||[],status:F.WAITING,muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(e,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},i);let a=await this._getParticipant(e);a&&n.roles&&n.roles.length&&(B.debug(`Roles for participant [${e}] changed: ${n.roles}`),z.onRolesChanged(a.externalId,n.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let n=async()=>{let n=ao(e,Xa.MUTE),r=ao(e,Xa.MUTE_PERMANENT);for(let i of[n,r])i.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:i,stateUpdated:!0})};N.setImmediate(()=>n().catch(e=>B.error(e)))}_getStatusByTransportState(e){let t=null;return e===q.CONNECTED?t=F.CONNECTED:e===q.CONNECTING||e===q.OPENED?t=F.CONNECTING:e===q.RECONNECTING&&(t=F.RECONNECT),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let t=(await this._getParticipants())[e];if(t)return t;let n=this._api.getDecorativeIdByInitialId(N.decomposeId(e).id),r=n?N.composeUserId(n):void 0;return this._createParticipant({id:e},r)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(P.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let t=await this._getParticipantId(e);return this._api.cacheExternalId(e,t),t}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(P.useParticipantListChunk){let n=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return n.markers=this._denormalizeMarkers(n.id,t),n}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){B.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let n=Object.values(t).find(e=>`ts`in e&&`rank`in e);return Object.entries(t).reduce((t,[r,i])=>(t[r]={...n,...i,id:e},t),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let n=oo(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=uo(e,r));let i=Object.keys(r),a=this._conversation?.roomId;i.length&&this._onMuteParticipant({muteStates:r,mediaOptions:i,muteAll:!0,stateUpdated:!0,roomId:a},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}async _processPinnedParticipants(e){e.conversation.pinnedParticipantId?await this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?await this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}async _allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new Ta(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new _o,this.subscribe(this._transport,K.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,K.LOCAL_STATE_CHANGED,this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,K.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,K.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,K.AUDIO_MIX_STALL,this._onAudioMixStall.bind(this)),this.subscribe(this._transport,K.REMOTE_DATA_STATS,this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,K.SIGNALLED_STALLED_PARTICIPANTS,this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,K.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this)),this.subscribe(this._transport,K.NETWORK_STATUS,this._onNetworkStatus.bind(this)),this.subscribe(this._transport,K.REMOTE_STREAM_SECOND,this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,K.PEER_CONNECTION_CLOSED,this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,K.ASR_TRANSCRIPTION,this._onAsrTranscription.bind(this)),this.subscribe(this._transport,K.ANIMOJI_STREAM,this._onAnimojiStream.bind(this)),this.subscribe(this._transport,K.ANIMOJI_ERROR,this._onAnimojiError.bind(this));let e=this._conversation.direction===Y.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let n of Object.values(t))(n.state===X.ACCEPTED||n.state===X.CALLED)&&this._transport.allocate(n.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Co(this._transport),this.subscribe(this._volumesDetector,So.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new To(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,wo.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new bo(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Eo(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=k.getCameras().length,t=k.getMicrophones().length;B.debug(`Cameras: `+e+(k.hasCameraPermission()?`✔`:`✖`)+`, Microphones: `+t+(k.hasMicrophonePermission()?`✔`:`✖`)),b.log(E.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){b.log(e,[t?.isAudioEnabled&&`audio`,t?.isVideoEnabled&&`video`].filter(Boolean).join(`_`))}async _removeParticipant(e,t){if(e.state===X.CALLED||e.state===X.ACCEPTED||this._state===`CLOSE`)return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let n=await this._getParticipants();if(n[e.id]){t===v.HUNGUP?this._setParticipantsStatus([e],F.HANGUP):this._setParticipantsStatus([e],F.ERROR,t),e.mediaSource?.disconnect(),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[t,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(t),this._sequenceNumberByStreamDescription.delete(t),this._cooldownTimestampByStreamDescription.delete(t),this._streamWaitTimerByStreamDescription.has(t)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(t)),this._streamWaitTimerByStreamDescription.delete(t)),this._sendUpdateDisplayLayout({[t]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete n[e.id],z.onRemoteRemoved(e.externalId,e.markers)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener(`pagehide`,this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(e=>e.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(e=>e.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){B.debug(`cleaning up participant-agnostic streams`),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(e=>{e.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_cleanupSignaling(){this._signaling.close(),this._signaling.cleanup()}async _onAddParticipant(e,t,n){B.debug(`Add new participant [${e}]`);let r=await this._getParticipant(e);if(r&&(r.state===X.ACCEPTED||r.state===X.CALLED)){B.warn(`Participant [${r.id}:${r.state}] is already in conversation`);return}if(!r){let n=N.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Z.fromSignalingParticipant(t),mediaSettings:A(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},n),r=await this._getParticipant(e)}this._setParticipantsStatus([r],F.WAITING),n?(r.state=X.HUNGUP,await this._removeParticipant(r,n)):this._transport&&(r.state=X.CALLED,this._transport.allocate(r.id,!0),b.log(E.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}async _onRemoveParticipant(e){B.debug(`Remove participant [${e}]`);let t=[],n=await this._getParticipants();for(let r=0;r<=jo;r++){let i=n[N.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let e of t)this._transport.close(e.id);b.log(E.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(w.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(w.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(w.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,n=null){if(!this._transport||!this._conversation)return;let r=!t,i=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let t=n??this._conversation.externalId.id;this._transport.setAnimojiSvg(i,{svg:e,userId:t,isMe:r});return}this._transport.setAnimojiSvg(i,{svg:e,isMe:r})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return b.log(E.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return b.log(E.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},n={};for(let t of e){let e=typeof t.uid==`object`?t.uid:Z.fromId(t.uid),r=Z.toString(e);n[r]=t.priority}let r=await this._getParticipants();for(let e of Object.values(r)){let r=Z.toString(e.externalId);Object.hasOwn(n,r)&&(t[e.id]=n[r])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[t,n]of Object.entries(e))if(t.length>5||n.length>5)throw Error(`key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded`);t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async hold(e){await this._signaling.hold(e)}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[Rn(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready)return;B.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},n=await this._getParticipants();for(let r of e){let e=typeof r.uid==`object`?r.uid:Z.fromId(r.uid),i=this._api.getCachedOkIdByExternalId(e);if(!i){let t=Z.toString(e);B.log(`Unknown participant external ID ${t}`);continue}let a=Rn({participantId:i,mediaType:r.mediaType,streamName:r.streamName}),o=n[i];o?o.lastRequestedLayouts[a]=r:this._isMe(i)&&(this._myLastRequestedLayouts[a]=r),Nn(r)?(this._isMe(i)&&delete this._myLastRequestedLayouts[a],this._streamIdByStreamDescription.has(a)&&!this._cooldownTimestampByStreamDescription.has(a)&&this._cooldownTimestampByStreamDescription.set(a,Date.now())):(this._cooldownTimestampByStreamDescription.delete(a),!this._streamIdByStreamDescription.has(a)&&P.videoTracksCount>0&&this._streamIdByStreamDescription.set(a,null),t[a]=r),r.mediaType===V.SCREEN&&!Nn(r)&&W.setMark(W.getMarkNameScreenshareFirstFrame(i))}let r=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>P.videoTracksCount;){let e=r.next();if(e.done){B.error(`Cannot accommodate all streaming requests: tracks available `+P.videoTracksCount+`; requested streams: `+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(e.value),t[e.value]={stopStream:!0}}this._transport?.getTopology()===J.SERVER&&await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,n){if(this._conversation&&P.clientEventsLoggingEnabled){let r={event_type:H.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(r.reason=t),n!==void 0&&(r.group_call_users_count=n),b.logClientEvent(r,!0)}}sendClientEvent(e,t={},n=!1){let r={event_type:e,...t};b.logClientEvent(r,n)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(B.log(`Client asked to stop streaming before stream became available`,e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let t=await this._getParticipants(),n=zn(e),r=t[n.participantId],i=this._conversation?.externalId,a=this._isMe(n.participantId);if(r||a){switch(n.mediaType){case V.STREAM:case V.MOVIE:if(n.streamName){let e={stream:null,streamName:n.streamName,mediaType:n.mediaType};a?z.onLocalLive(i,e):z.onRemoteLive(r.externalId,e)}break;case V.CAMERA:z.onRemoteStream(r.externalId,null);break;case V.SCREEN:z.onRemoteScreenStream(r.externalId,null);break}b.log(E.PAT_DEALLOCATED)}else B.log(`Cannot find participant to stop streaming: ${n.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;B.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let n;try{if(n=await this._signaling.updateDisplayLayout(e),!n)return}catch(n){if(B.warn(`Failed to update display layout ${JSON.stringify(e)}. ${n}`),t)throw n;return}let r=[],i=await this._getParticipants();for(let[e,t]of Object.entries(n.errorCodeByParticipantId||{})){let n=zn(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=$a(t):(B.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=Qa.UNKNOWN_ERROR),r.push({externalId:a.externalId,errorReason:e})}}if(r&&r.length&&(B.warn(`Could not allocate one or more participants`,r),t))throw new Mo(`Could not allocate one or more participants`,r)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let n=t.next();if(n.done)break;let r=n.value;if(r[1]+Ao>Date.now())break;let i=r[0];await this._stopStreaming(i),e[i]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;B.log(`Received participant sources update notification`,t);for(let e of t)this._waitForStreamIfNeeded(e)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(B.log(`Promoted in audience mode`,!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(B.log(`Promoted in waiting hall`,!e.demote),e.demote?(B.log(`Kicked from waiting hall`),this._close(new y(v.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),z.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,n=[],r,i){B.log(`Chat room updated: ${e}`);let a=[],o=[],s=[],c=[],l=[];if(n.length&&n.forEach(e=>{if(e.externalId){let t=Z.fromSignaling(e.externalId);l.push(t),this._api.cacheExternalId(e.id.id,t)}else{let t=N.decomposeId(e.id.id).id;a.push(t),c.push(t)}}),r?.length&&r.forEach(e=>{let t=N.decomposeId(e).id;a.push(t),o.push(t)}),i?.length&&i.forEach(e=>{let t=N.decomposeId(e).id;a.push(t),s.push(t)}),!a.length){z.onChatRoomUpdated(e,t,l,[],[]);return}if(c.length){let e=await this._api.getExternalIdsByOkIds(c);l.push(...e)}let u=await this._api.getExternalIdsByOkIds(o),d=await this._api.getExternalIdsByOkIds(s);z.onChatRoomUpdated(e,t,l,u,d)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let n of e.data)if(this._isMe(n.participantId))z.onLocalLiveUpdate(t,n);else{let e=await this._getExternalIdByParticipantId(n.participantId);e&&z.onRemoteLiveUpdate(e,n)}}async _onSharedMovieInfoStarted(e){B.log(`Shared movie started data received: ${e.notification}`),await this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}async _processSharedMovieInfos(e,t=null){e&&await Promise.all(e.map(e=>this._processSharedMovieInfo(e,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let n=this._conversation?.externalId;if(this._isMe(e.initiatorId))z.onLocalSharedMovieInfo(n,e,t);else{let n=await this._getExternalIdByParticipantId(e.initiatorId);n&&z.onRemoteSharedMovieInfo(n,e,t)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(e=>this._isMe(N.composeId(e)));await this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}async _processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let t of e.rooms.rooms)t.asrInfo&&this._conversation?.asrInfoByRoom.set(t.id,t.asrInfo);let n=e?.rooms?.roomId??this._conversation?.roomId??null,r=this._conversation?.asrInfoByRoom.get(n);if(r){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&z.onAsrSet({externalId:e,movieId:r.movieId},n)}else n&&z.onAsrSet(null,n)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,n=this._conversation.roomId,r=t.get(n);if(r&&!this._isMe(r.initiatorId)){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&z.onRemoteSharedUrl(e,r.sharedUrl,n)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let n of e.rooms.rooms)n.urlSharingInfo?t.set(n.id,n.urlSharingInfo):t.delete(n.id)}async _onSharedMovieInfoStopped(e){B.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:n,movieId:r,source:i,roomId:a=null}=e,o={initiatorId:n,movieId:r,source:i};if(this._isMe(n))z.onLocalSharedMovieStoppedInfo(t,o,a);else{let e=await this._getExternalIdByParticipantId(n);if(e){let t=(await this._getParticipants())[n];t?.movieShareInfos&&(t.movieShareInfos=t.movieShareInfos.filter(e=>e&&e.movieId!==r)),z.onRemoteSharedMovieStoppedInfo(e,o,a)}}}async _onUrlSharingInfoUpdated(e){if(B.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:n}=this._conversation,{initiatorId:r,sharedUrl:i,roomId:a=null}=e;if(i?t.set(a,{sharedUrl:i,initiatorId:r}):t.delete(a),!(!i&&a!==n&&t.has(n))&&(!i||!this._isMe(r))){let e=await this._getExternalIdByParticipantId(r);e&&z.onRemoteSharedUrl(e,i,a)}}_onFeaturesPerRoleChanged(e){B.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),z.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let t=this._getStreamDescriptionById(e.streamId);if(t){let e=zn(t),n=await this._getParticipant(e.participantId);z.onRemoteScreenStream(n.externalId,null);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:n,participantId:r}=t;if(n===V.ANIMOJI)return;let i=await this._getParticipant(r);if(n===V.SCREEN&&!e.fastScreenShare){B.log(`skipping participant-sources-update notification since screenshare will be received over datachannel`);return}let a=Rn(t),o=this._sequenceNumberByStreamDescription.get(a);if(o&&o>e.sequenceNumber){B.warn(`Participant ${r} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${o}`),b.log(E.PAT_OUTDATED_RESPONSE);return}i&&e.suspend!==void 0&&n&&(B.debug(`participant-sources-update: mediaType=${n}, suspend=${e.suspend}`),z.onRemoteStreamSuspended(i.externalId,n,e.suspend));let s=e.streamId,c=e.rtpTimestamp?this._getWaitingTime(s,e.rtpTimestamp):0;if(c<=0){this._streamWaitTimerByStreamDescription.delete(a);let t=this._conversation?.externalId,n=this._isMe(r);if(!i&&!n){b.log(E.PAT_ERROR,`participantMissing`),B.error(`Could not find participant by ID: ${r}`);return}let o=n?t:i.externalId,c=this._streamByStreamId.get(s);if(!c){b.log(E.PAT_ERROR,`streamNotFound`),B.error(`Could not find stream by ID: ${s}`);return}b.log(E.PAT_ALLOCATED),this._streamIdByStreamDescription.set(a,s);let l=e.participantStreamDescription?.mediaType;if(l===V.STREAM||l===V.MOVIE){if(e.participantStreamDescription?.streamName){let t={streamName:e.participantStreamDescription.streamName,stream:c,mediaType:l};n?z.onLocalLive(o,t):z.onRemoteLive(o,t)}}else l===V.SCREEN?z.onRemoteScreenStream(i.externalId,c):n||z.onRemoteStream(i.externalId,c)}else{B.debug(`Waiting for ${c} until stream ${s} for ${a} is switched`);let t=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),c);this._streamWaitTimerByStreamDescription.set(a,t)}}_getStreamDescriptionById(e){for(let[t,n]of this._streamIdByStreamDescription.entries())if(n===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(Rn(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(Rn(e)))return e}else{let e={participantId:t,mediaType:V.CAMERA};if(this._streamIdByStreamDescription.has(Rn(e)))return e;let n={participantId:t,mediaType:V.SCREEN};if(this._streamIdByStreamDescription.has(Rn(n)))return n}return B.error(`Received unrequested allocation`,e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw Error(`transport is not initialized`)}_isCallAdmin(){return this._conversation?N.includesOneOf(this._conversation.roles,[eo.ADMIN,eo.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!N.includesOneOf(this._conversation.roles,[eo.ADMIN,eo.CREATOR]))throw Error(`You don't have the required permission`)}_isCalledState(){return this._participantState===X.CALLED}async grantRoles(e,t,n){this._checkAdminRole(),await this._signaling.grantRoles(e,t,n)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,n=[],r=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,n,r)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,n=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,n),this._conversation?.pinnedParticipantIdByRoom.set(n,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===J.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===J.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Ya(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=io(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=e?N.composeUserId(e):r.id}let i=await this._signaling.getWaitingHall(r,t,n);if(i.error)return Promise.reject(i.message);let a=i.participants||[],{externalIds:o}=await this._resolveWaitingHallExternalIds(a),s=null;return a.length&&i.hasMore&&(s=ro(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,n=[],r=[];if(e.length){let i=[];e.forEach(e=>{if(t.set(e.id.id,e.id.addedTs),e.externalId){let t=Z.fromSignaling(e.externalId);n.push(e.id.addedTs),r.push(t),this._api.cacheExternalId(e.id.id,t)}else i.push(N.decomposeId(e.id.id).id)}),i.length&&!r.length&&(r=await this._api.getExternalIdsByOkIds(i),n=r.map(e=>{let n=this._api.getCachedOkIdByExternalId(e);return(n?t.get(n):void 0)||Date.now()}))}return{externalIds:r,timestamps:n}}async getAudienceModeHands(){if(!this._signaling.ready)throw Error(`Signaling is not ready`);let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:n,timestamps:r}=await this._resolveWaitingHallExternalIds(t);return{timestamps:r,participants:n,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!N.includesOneOf(this._conversation.options,[qa.WAITING_HALL,qa.AUDIENCE_MODE]))throw Error(`Unable to promote a participant in the conversation with current options`);if(this._checkAdminRole(),!e&&t)throw Error(`participantId is required`);await this._signaling.promoteParticipant(e,t)}catch(t){throw B.warn(`Failed to promote participant ${e}. ${t}`),t}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let e=t.messages.length-1;e>=0;e--){let n=t.messages[e];await this._onChatMessage(n)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let e=(await this._api.createJoinLink(this._conversation.id)).join_link;if(e)return this._conversation.joinLink=e,e}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:n,lang:r}){let i={movieId:e,lang:r};(t||t===0)&&(i.gain=t),n&&(i.metadata=n);let a=await this._signaling.addMovie(i);if(a.error)throw Error(a.error);return{movieId:a.movieId,streamType:a.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw Error(t.error)}async removeMovie(e){let t={movieId:e},n=await this._signaling.removeMovie(t);if(n.error)throw Error(n.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw Error(e.error)}async updateRooms(e,t){let n=await this._signaling.updateRooms(e,t);if(n.error)throw Error(n.error)}async activateRooms(e,t){let n=await this._signaling.activateRooms(e,t);if(n.error)throw Error(n.error)}async switchRoom(e,t){let n=await this._signaling.switchRoom(e,t);if(n.error)throw Error(n.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw Error(t.error)}async startStream(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o={movieId:n,name:t,privacy:r,groupId:i,roomId:a,streamMovie:!e},s=await this._signaling.startStream(o);if(s.error)return Promise.reject(s.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<P.videoMinWidth||e.height<P.videoMinHeight)throw Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<P.videoMinWidth||t.height<P.videoMinHeight)throw Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");P.videoEffectMaxHeight=t.height,P.videoEffectMaxWidth=t.width}P.videoMaxWidth=e.width,P.videoMaxHeight=e.height,B.debug(`Set local video resolution:`,`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:``)),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(e=>({id:e.id,type:P.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),n=await this._signaling.getParticipants(t);if(n.error)throw Error(n.error);let r=n.participants,i=this._transport?.getState();return Promise.all(r.map(async e=>{let t=N.composeId(e);return this._createParticipant({id:t,externalId:Z.fromSignalingParticipant(e),mediaSettings:A(e.mediaSettings),participantState:N.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(i)??F.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(t,e.markers)},e.decorativeUserId)})).then(N.mapSharedParticipants)}async getParticipantListChunk(e){B.log(`Request participant list chunk`,e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw Error(t.error);let n=this._createParticipantListChunk(t.chunk),r=await this._getParticipants(),i=n.participants.filter(e=>!r[N.composeId(e)]);await this._registerParticipants(i);let a=this._transport?.getState();return n.participants.forEach(e=>{let t=r[N.composeId(e)];t.status=this._getStatusByTransportState(a)??F.WAITING,t.movieShareInfos=e.movieShareInfos,Object.assign(t.mediaSettings,A(e.mediaSettings)),Object.assign(t.muteStates,e.muteStates),t.unmuteOptions=e.unmuteOptions??t.unmuteOptions,this._openTransport([t],!0)}),this._participantListChunkToExternalChunk(n)}async _getInitialParticiapntListChunk(){let e=P.participantListChunkInitIndex,t=P.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:`GRID`,fromIdx:e,count:t});return B.debug(`Get initial participant list chunk`,n.chunk),n.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();B.debug(`Local media stream changed`,t),e.kind===j.audio&&this._mediaSource&&(this._audioFix=new po(this._mediaSource)),z.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this._mediaSource?.getMediaSettings();B.log(`Screen sharing changed`,e.track,t);let n=e.track?new MediaStream([e.track]):null;z.onScreenStream(n,t)}async _changeRemoteMediaSettings(e,t){B.debug(`Remote media settings changed [${e}]`,t);let n=this._conversation?.externalId;if(this._isMe(e)&&n){z.onLocalMediaSettings(n,t);return}let r=await this._getParticipant(e);if(!r){this._warnParticipantNotInConversation(e);return}r.mediaSettings=t,this._state===`ACTIVE`&&z.onRemoteMediaSettings(r.externalId,t,r.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(n=>n.id===t||N.comparePeerId(n.peerId,e.peerId))}_changeLocalParticipantState(e){B.debug(`Local participant state force changed by admin`,e),this._state===`ACTIVE`&&z.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){B.debug(`Remote participant state changed [${e}]`,t);let n=await this._getParticipant(e);if(!n){this._warnParticipantNotInConversation(e);return}n.participantState=t||{},this._state===`ACTIVE`&&z.onRemoteParticipantState(n.externalId,n.participantState,n.markers)}async _changeMultipleParticipantState(e,t){B.debug(`Multiple participants state changed`,e);let n=[],r,i=await this._getParticipants();e.forEach((e,t)=>{if(this._isMe(t))r=e;else{let r=i[t];if(!r){this._warnParticipantNotInConversation(t);return}r.participantState=e,n.push({externalId:r.externalId,participantState:{...e},markers:r.markers})}}),this._state===`ACTIVE`&&(r&&z.onLocalParticipantState(r,!0),n.length&&z.onRemoteParticipantsState(n,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state===`ACTIVE`&&e.roles&&e.roles.length&&(B.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),z.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case G.ACCEPTED_CALL:return this._onAcceptedCall(e);case G.HUNGUP:return this._onHungup(e);case G.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case G.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case G.CLOSED_CONVERSATION:return this._onClosedConversation(e);case G.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case G.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case G.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case G.RATE_CALL_DATA:return this._onNeedRate();case G.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case G.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case G.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case G.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case G.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case G.REGISTERED_PEER:return this._onPeerRegistered(e);case G.SWITCH_MICRO:return this._onMicSwitched(e);case G.CHAT_MESSAGE:return this._onChatMessage(e);case G.CUSTOM_DATA:return this._onCustomData(e);case G.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case G.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case G.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case G.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case G.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case G.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case G.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case G.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case G.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case G.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case G.FEEDBACK:return this._onFeedback(e);case G.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case G.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case G.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case G.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case G.ROOMS_UPDATED:return this._onRoomsUpdated(e);case G.ROOM_UPDATED:return this._onRoomUpdated(e);case G.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case G.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case G.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case G.ASR_STARTED:return this._onAsrStart(e);case G.ASR_STOPPED:return this._onAsrStop(e);case G.PROMOTION_APPROVED:return this._onPromotionApproved(e);case G.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case G.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}z.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversationParams?.serverTime&&(this._serverTimeOffset=e.conversationParams.serverTime-Date.now()),e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),await this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let n=Object.keys(await this._getParticipants()),r=[];for(let n of e.conversation.participants){let e=N.composeId(n),i=n.roles||[];if(this._isMe(e)){to(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:lo(n),unmuteOptions:n.unmuteOptions})};continue}r.push(e);let a=await this._getParticipant(e);if(!a)await this._onJoinedParticipant({participantId:n.id,participant:n,mediaSettings:n.mediaSettings});else{let t=A(n.mediaSettings);rn(t,a.mediaSettings)||await this._changeRemoteMediaSettings(e,t);let r=N.mapParticipantState(n),o=a.participantState;N.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),to(i,a.roles)||this._onRolesChanged(a.id,i)}}let i=await this._getParticipants();for(let e of n)r.indexOf(e)<0&&i[e]&&this._removeParticipant(i[e],v.HUNGUP)}let n=e.rooms?.roomId??null;if(!this._conversation){B.warn(`Conversation is empty, but should be filled`);return}this._conversation.roomId===n?this._processMuteStates(e,!0):await this._onRoomSwitched(n),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){B.error(`Signaling failed`,e),this._close(e)}async _onAcceptedCall(e){let t=N.composeMessageId(e),n=N.getPeerIdString(e.peerId);if(B.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new y(v.MISSED),`Call accepted on other device`);return}let r=await this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t),i=n?N.composeUserId(n,e.participantType):void 0;r=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:A(e.mediaSettings)},i))}r.state=X.ACCEPTED,r.mediaSettings=A(e.mediaSettings),this._logWithMediaSettings(E.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===Y.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),this._state===`ACTIVE`&&this._transport&&this._transport.open([r.id],n),await this._changeRemoteMediaSettings(t,r.mediaSettings),await this._changeRemoteParticipantState(t);let i=Object.keys(r.muteStates);i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),this._state===`ACTIVE`&&z.onAcceptedCall(r.externalId,Aa.parseCapabilities(e.capabilities))}async _onHungup(e){B.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=N.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new y(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=await this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),n.state=e.reason===v.REJECTED?X.REJECTED:X.HUNGUP,this._state!==`CLOSE`&&this._removeParticipant(n,v.HUNGUP)}async _onAddedParticipant(e){B.debug(`Participant added [${e.participantId}]`);let t=N.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state!==X.HUNGUP&&n.state!==X.REJECTED){B.debug(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Z.fromSignalingParticipant(r),mediaSettings:A(r.mediaSettings),state:r.state,participantState:N.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[]},i),n=await this._getParticipant(t)}n.state=X.CALLED,n.mediaSettings=A(e.participant?.mediaSettings),n.participantState=N.mapParticipantState(e.participant),n.roles=e.participant?.roles||[],this._setParticipantsStatus([n],F.WAITING),this._state!==`IDLE`&&this._transport&&this._transport.allocate(n.id,!0),z.onParticipantAdded(n.externalId,n.markers),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n)}async _onJoinedParticipant(e){B.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=N.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state===X.ACCEPTED){B.warn(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Z.fromSignalingParticipant(r),mediaSettings:A(r.mediaSettings),state:r.state,participantState:N.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},movieShareInfos:r.movieShareInfos,unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[],markers:this._denormalizeMarkers(t,r.markers)},i),n=await this._getParticipant(t)}this._conversation&&this._conversation.direction===Y.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=X.ACCEPTED,n.mediaSettings=A(e.mediaSettings),n.participantState=N.mapParticipantState(e.participant),n.roles=e.participant.roles||[],this._transport?.isAllocated(n.id)?this._setParticipantsStatus([n],F.CONNECTED):this._setParticipantsStatus([n],F.WAITING),this._state!==`IDLE`&&this._transport&&(this._transport.isAllocated(n.id)||this._transport.allocate(n.id,!0),this._transport.open([n.id],null,!!this._conversation?.observer)),z.onParticipantJoined(n.externalId,n.markers),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n);let r=Object.keys(n.muteStates);r.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:r,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(n.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new y(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=N.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,A(e.mediaSettings))}async _onParticipantStateChanged(e){let t=N.composeMessageId(e),n=N.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(n):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,n))}async _onParticipantsStateChanged(e){let{participants:t,roomId:n}=e,r=t.map(({id:e,markers:t})=>this._registerParticipantAndSetMarkersIfChunkEnabled(e,t));await Promise.all(r);let i=new Map,a=t.map(({id:e,participantState:t})=>this._getExternalIdByParticipantId(e).then(n=>[e,n&&N.mapParticipantState({participantState:t})]));try{(await Promise.all(a)).forEach(([e,t])=>{t&&i.set(e,t)}),await this._changeMultipleParticipantState(i,n)}catch(e){B.warn(`_onParticipantsStateChanged: Failed to get external ids. ${e}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),z.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),n=A(e.mediaSettings);t.isAudioEnabled!==n.isAudioEnabled&&await this._mediaSource.toggleAudio(n.isAudioEnabled),t.isVideoEnabled!==n.isVideoEnabled&&await this._mediaSource.toggleVideo(n.isVideoEnabled),t.isScreenSharingEnabled!==n.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:n.isScreenSharingEnabled,fastScreenSharing:n.isFastScreenSharingEnabled,captureAudio:n.isAudioSharingEnabled})}_onSettingsUpdate(e){B.debug(`Got settings update notification`,e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=Rr(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){B.debug(`Got video quality update notification`,e);let t={maxBitrateK:Math.round(e.quality.maxBitrate/1024),maxDimension:e.quality.maxDimension},n;n=e.mediaType&&e.mediaType===V.SCREEN?{camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,t)}:{camera:Object.assign({},this._serverSettings.camera,t),screenSharing:null,fastScreenSharing:null},this._serverSettings=Rr(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=N.composeMessageId(e),n=await this._getParticipant(t);n&&(n.clientType=e.clientType,n.platform=e.platform),z.onPeerRegistered()}async _onMicSwitched(e){z.onDeviceSwitched(T.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=N.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}z.onChatMessage(e.message,n,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,`sdk`))return;let t=N.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}z.onCustomData(e.data,n,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let n=this._conversation.recordsInfoByRoom.get(t);if(n?.recordMovieId!==e?.recordMovieId||n?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let n=await this._getExternalIdByParticipantId(e.initiator);n?z.onRecordStarted(n,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},n=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(n);if(!(!r||r.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(n,null),e){let t=await this._getExternalIdByParticipantId(e);z.onRecordStopped(n,t??null)}else z.onRecordStopped(n,null)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let n=await this._getExternalIdByParticipantId(t);n&&z.onPinnedParticipant(n,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiator);n?z.onRecordStarted(n,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else z.onRecordStopped(e,null)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiatorId);n&&z.onAsrSet({externalId:n,movieId:t.movieId},e)}else z.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,n=t.get(e);if(n){let t=await this._getExternalIdByParticipantId(n.initiatorId);t&&z.onRemoteSharedUrl(t,n.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}z.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,n=e.roomId||null;this._conversation.asrInfoByRoom.set(n,t);let r=await this._getExternalIdByParticipantId(t.initiatorId);if(!r){this._warnParticipantNotInConversation(t.initiatorId);return}z.onAsrStarted(r,t.movieId,n)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),z.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}z.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!to(this._conversation.roles,t)){B.debug(`Local roles changed: ${t}`),this._conversation.roles=t,z.onLocalRolesChanged(t),this._processMuteState({mediaOptions:ao(this._getMuteStatesForCurrentRoom(),Xa.MUTE_PERMANENT),stateUpdated:!0}),N.includesOneOf(t,[eo.ADMIN,eo.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=await this._getParticipant(e);n&&!to(n.roles,t)&&(B.debug(`Roles for participant [${e}] changed: ${t}`),n.roles=t,z.onRolesChanged(n.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:n,muteStates:r={},unmuteOptions:i=[],mediaOptions:a=[],roomId:o=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){B.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let t=await this._getParticipant(e.participantId);if(t){B.debug(`Mute states for participant [${e.participantId}] changed`,r);let o=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;z.onMuteStates(r,i,a,n,e.unmute,t.externalId,o,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(n&&!t?this._setMuteStatesForRoomId(r,o):n||(this._conversation.muteStatesPersonal=r)),e.adminId&&this._isMe(e.adminId)){n&&z.onMuteStates(r,i,a,n,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:a,muteAll:n,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:i,muteStates:r})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let n=this._getMuteStatesForRoomId(t),r=this._getMuteStatesForRoomId(e),i=Object.keys(n),a=Object.keys(r);this._processMuteState({mediaOptions:Array.from(new Set([...i,...a])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==X.ACCEPTED)return;let{mediaOptions:t=[],muteAll:n,unmute:r,stateUpdated:i,requestedMedia:a,roomId:o=null,unmuteOptions:s=[]}=e,c=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,l=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(o)),u=this._mediaSource.getMediaSettings(),d=Object.entries(l);for(let[e,i]of d){let a=this._isCallAdmin()&&n;if(!(i!==Xa.MUTE&&i!==Xa.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===Xa.MUTE_PERMANENT&&!n&&(l[e]=Xa.MUTE),!(!t.includes(e)||r)))switch(e){case T.VIDEO:u.isVideoEnabled&&(z.onDeviceSwitched(T.VIDEO,!1),await this.toggleLocalVideo(!1));break;case T.AUDIO:u.isAudioEnabled&&(z.onDeviceSwitched(T.AUDIO,!1),await this.toggleLocalAudio(!1));break;case T.SCREEN_SHARING:u.isScreenSharingEnabled&&(z.onDeviceSwitched(T.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case T.AUDIO_SHARING:u.isAudioSharingEnabled&&(z.onDeviceSwitched(T.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:u.isScreenSharingEnabled,fastScreenSharing:u.isFastScreenSharingEnabled,captureAudio:!1}));break}}z.onMuteStates(l,s,t,n,r,null,c,i,a,o)}async _onPinParticipant(e,t=!1,n,r=null){if(!this._conversation)return;let i=this._conversation.pinnedParticipantIdByRoom.get(r);if(i&&i!==e)if(this._isMe(i))z.onLocalPin(!0,r);else{let t=await this._getExternalIdByParticipantId(i);t&&z.onPinnedParticipant(t,!0,this._denormalizeMarkers(e,n),r)}if(this._isMe(e))z.onLocalPin(t,r);else{let i=await this._getExternalIdByParticipantId(e);i&&z.onPinnedParticipant(i,t,this._denormalizeMarkers(e,n),r)}this._conversation.pinnedParticipantIdByRoom.set(r,t?null:e)}_onOptionsChanged(e){this._conversation&&!Ja(this._conversation.options,e)&&(this._conversation.options=e,z.onOptionsChanged(e),e.includes(qa.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&z.onLocalStatus(F.WAITING_HALL):e.includes(qa.WAIT_FOR_ADMIN)&&this._conversation.restricted&&z.onLocalStatus(F.WAIT_FOR_ADMIN))}async _onNetworkStatus(e){if(this._conversation){let t=[],n=await this._getParticipants();for(let[r,i]of Object.entries(e)){let e;if(this._isMe(r)||r===``)e=this._conversation.networkRating;else if(n[r])e=n[r].networkRating;else continue;if(e!==i)if(this._isMe(r)||r===``)this._conversation.networkRating=i,pi.getInstance().value=i,z.onLocalNetworkStatusChanged(i);else{let e=n[r];e.networkRating=i,t.push({uid:e.externalId,rating:i})}}if(t.length===0)return;B.log(`Received network status update: `,e),z.onNetworkStatusChanged(t)}}async _onRemoteStreamSecond(e,t){let n=await this._getParticipant(e);n&&z.onRemoteScreenStream(n.externalId,t)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){z.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let n=await this._getParticipant(e);n&&z.onRemoteVmojiStream(n.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,z.onVmojiError({...e,externalId:t}))}catch(e){B.warn(`_onAnimojiError failed`,e)}}_onPeerConnectionClosed(e){e===J.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy()}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(Ka.ADD_PARTICIPANT);z.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&z.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&z.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[n,r]of Object.entries(e)){let e=await this._getParticipant(n);e&&e.externalId&&t.push({uid:e.externalId,volume:r.real})}z.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(z.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){B.debug(`Transport state has changed: ${t}`,e);let n=this._getStatusByTransportState(t);if(!n)return;let r=await this._getParticipants(),i=e.reduce((e,n)=>{if(n in r){let i=r[n];e.push(i),t===q.CONNECTED&&(i.remoteStream||(i.mediaSettings&&this._changeRemoteMediaSettings(n,i.mediaSettings),this._changeRemoteParticipantState(n,i.participantState)),this._updateDisplayLayoutFromCache(n))}else this._warnParticipantNotInConversation(n);return e},[]);i.length&&this._setParticipantsStatus(i,n)}async _onTransportLocalStateChanged(e){if(B.debug(`Local transport state has changed: ${e}`),e===q.CONNECTED&&(k.releaseFirefoxMicrophonePermissionWarmup(),z.onLocalStatus(F.CONNECTED),this._transport?.getTopology()===J.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e)}e===q.CONNECTING&&z.onLocalStatus(F.CONNECTING),e===q.RECONNECTING&&z.onLocalStatus(F.RECONNECT),e===q.FAILED&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(v.FAILED),this._close(new y(v.FAILED),`Transport failed`))}async _onRemoteTrackAdded(e,t,n){if(e.endsWith(li.AUDIO_MIX))B.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),z.onRemoteMixedAudioStream(t);else if(e.startsWith(li.TRANSPARENT_AUDIO_TRACK_PREFIX))B.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(li.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))B.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{B.debug(`Remote track added on the participant [${e}]`,{kind:n.kind});let r=await this._getParticipant(e);if(!r){let t=this._api.getDecorativeIdByInitialId(e),n=t?N.composeUserId(t):void 0;B.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${n}]`),this._registerParticipant({id:e},n),r=await this._getParticipant(e),this._setParticipantsStatus([r],F.WAITING),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(z.onSpeakerChanged(r.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(r.id)&&this._transport.allocate(r.id,!1),n.kind===j.audio&&(this._audioOutput.add(e,n),P.preserveAudioTracks||(r.remoteAudioTrack=n,t.removeTrack(n))),r.remoteStream!==t&&t.getTracks().length){if(r.remoteStream=t,r.secondStream)return;z.onRemoteStream(r.externalId,t)}r.mediaSettings&&this._changeRemoteMediaSettings(e,r.mediaSettings)}}_onRemoteTrackRemoved(e,t,n){switch(B.debug(`[${e}] remote track (removed)`,{track:n}),n.kind){case j.audio:this._removeAudioTrack(e,t,n);break;case j.video:case j.screen:this._removeVideoTrack(e,t,n);break}}async _removeAudioTrack(e,t,n){if(e!==li.AUDIO_MIX){let n=await this._getParticipant(e);if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(e,n)}_removeVideoTrack(e,t,n){}_onTopologyChanged(e){e===J.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall()),this._audioOutput.destroy()}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,B.debug(`Audio mix stalled:`,e),z.onLocalStatus(e?F.RECONNECT:F.CONNECTED))}async _onRemoteSignalledStall(e){let t={},n=[],r=[];B.debug(`Participants stalled:`,e);let i=await this._getParticipants();for(let r of e){if(t[r]=!0,!this._lastStalled[r]){let e=i[r];e&&n.push(e)}delete this._lastStalled[r]}for(let e of Object.keys(this._lastStalled)){let t=i[e];t&&r.push(t)}n.length&&this._setParticipantsStatus(n,F.RECONNECT),r.length&&this._setParticipantsStatus(r,F.CONNECTED),this._lastStalled=t}async _onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,await this._getParticipants()),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!k.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!k.hasCamera()||!this._audioFix||!this._mediaSource?.getMediaSettings().isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!==`CLOSE`||!1;e&&(B.debug(`Toggle join availability`,{available:t,chatId:e}),z.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!==J.SERVER)return;let t=await this._getParticipant(e);if(t&&t.lastRequestedLayouts&&Object.keys(t.lastRequestedLayouts).length)try{await this.updateDisplayLayout(Object.values(t.lastRequestedLayouts))}catch(e){B.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){if(!e.length)return;let r=e.reduce((e,n)=>(n.status!==t&&(n.status=t,e.push(n.externalId)),e),[]);r.length&&z.onRemoteStatus(r,t,n)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),z.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let n of Object.keys(Za)){let r=e.updates[n];r&&(t[n]={rooms:await Promise.all(r?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:r?.roomIds,deactivated:r?.deactivated})}z.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(e=>e===Za.UPDATE)&&(e.muteStates!==void 0&&this._setMuteStatesForRoomId(e.muteStates,e.roomId),e.recordInfo!==void 0&&this._conversation?.recordsInfoByRoom.set(e.roomId,e.recordInfo),e.asrInfo!==void 0&&this._conversation?.asrInfoByRoom.set(e.roomId,e.asrInfo)),this._isCalledState()||z.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),n=await Promise.all(e.addParticipantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),r=await Promise.all(e.removeParticipantIds?.map?.(e=>this._getExternalIdByParticipantId(e))||[]),i=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:n,removeParticipantIds:r,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:i,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=e.addedParticipantIds?.map(e=>N.decomposeId(e).id)||[],i=await this._api.getExternalIdsByOkIds(r),a=e.addedParticipants;if(i.length&&a?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);a=(await this._signaling.getParticipants(e)).participants}let o=await Promise.all(a?.map(async e=>{let r=N.composeId(e);return this._createParticipant({id:r,externalId:Z.fromSignalingParticipant(e),mediaSettings:A(e.mediaSettings),participantState:N.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(t)??F.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(r,e.markers),isInRoom:n!==null},e.decorativeUserId)})||[]),s=!1;for(let e of o)e.id===this._conversation?.compositeUserId&&(s=!0),this._registerParticipantInCache(e);this._transport?.getState()===q.IDLE&&!this._isCalledState()&&this._openTransport(o,!0);let c=[],l=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);l.push(e)}c=await Promise.all(l)}if(s&&await this._onRoomSwitched(n),c){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=await this._getExternalIdByParticipantId(e);if(t){for(let e of c)if(Z.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let u={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:N.mapSharedParticipants(o),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:c};this._isCalledState()||z.onRoomParticipantsUpdated(u)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let n=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){z.onRoomStart(e);return}this._isCalledState()||z.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,n),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let n=t?.rooms?.rooms??[],r=[];for(let t of n){let n=t.id??null;if(this._setMuteStatesForRoomId(t.muteStates,n),this._conversation?.recordsInfoByRoom.set(n,t.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(n,t.pinnedParticipantId??null),t.asrInfo&&this._conversation?.asrInfoByRoom.set(n,t.asrInfo),t.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(n,t.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(n),e){let e=await this._getParticipants();await this._registerParticipants(t?.participants?.participants?.filter(t=>!e[N.composeId(t)])||[],!0);let n=await this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&z.onRoomsUpdated({[Za.UPDATE]:{rooms:r}})}async _onFeedback(e){let t=[];for(let n of e.feedback){let e={...n,items:[]};for(let t of n.items){let n=await this._getExternalIdByParticipantId(t.participantId);n?e.items.push({...t,participantId:n}):this._warnParticipantNotInConversation(t.participantId)}t.push(e)}z.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:n,decorativeExternalParticipantId:r}=e,i=this._isMe(t);B.debug(`Decorative participant id changed [${t}]`,e);let a=await this._getExternalIdByParticipantId(t);if(!a){this._warnParticipantNotInConversation(t);return}let o=Z.fromSignaling(r,a.deviceIdx);if(z.onParticipantIdChanged(a,o),this._api.cacheExternalId(n,o),this._api.mapDecorativeId(n,t),i)this._conversation.externalId=o;else{let e=await this._getParticipants();e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==J.SERVER||(B.debug(`Video suspend suggested`,e),z.onVideoSuspendSuggest(e.bandwidth))}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()===J.SERVER&&this._transport?.getState()===q.IDLE&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){let n=this._createParticipant(e,t);n.catch(()=>void 0),this._pendingParticipants.set(e.id,n)}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.entries()),t=await Promise.allSettled(e.map(e=>e[1])),n=null;for(let r=0;r<t.length;r++){let[i]=e[r];this._pendingParticipants.delete(i);let a=t[r];if(a.status===`fulfilled`){let e=a.value;this._participants[e.id]=e;continue}n=n??a.reason,B.warn(`Failed to resolve pending participant [${i}]`,a.reason)}if(n)throw n}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};g(Q,`_current`,void 0),g(Q,`_activationMutex`,void 0),g(Q,`_delayedHangup`,!1),g(Q,`_abortController`,null);var Mo=class e extends Error{constructor(t,n){super(t),g(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},No=null,Po=null;function Fo(){No=null,Po=null}function Io(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function Lo(e=null,t){let n=Io(e??P.apiBaseUrl);if(n)return n;if((t??P.apiEnv)!==`AUTO`)return P.apiEndpoint(t);try{let e=atob(`aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ=`),t=(await(await fetch(e,{method:`GET`,mode:`cors`,cache:`no-cache`})).json())?.Answer[0]?.data;if(!t)throw Error(`Wrong DNS response`);return B.debug(`Resolved API endpoint`,t),t}catch(e){return B.warn(`Failed to resolve API endpoint using DNS, default is used`,e),P.apiEndpoint(t)}}async function Ro(){return No||Po||(Po=Lo(),No=await Po,Po=null,No)}async function zo(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Ro();let r=Uo(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${No}/fb.do`,i)}async function Bo(e,t={},n=!1,r){return await Ro(),Vo(Uo(e,t,n),r)}async function Vo(e,t){let n=`${t??No}/fb.do`,r=new AbortController,i=setTimeout(()=>r.abort(new y(v.NETWORK_ERROR)),P.apiTimeout),a=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:e,signal:r.signal});clearTimeout(i);let o=await a.text(),s;try{s=JSON.parse(o)}catch{s={result:o}}if(!a.ok||Object.hasOwn(s,`error_msg`))throw s;return s}async function Ho(e,t){try{let n=await fetch(e,{method:`POST`,body:t});if(!n.ok)throw Error(`HTTP error! status: ${n.status}`);let r=await n.text();B.debug(`Form data sent successfully`,r)}catch(e){throw B.warn(`Failed to send form data`,e),e}}function Uo(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=P.apiKey),n||(C.sessionKey?t.session_key=C.sessionKey:C.accessToken&&(t.access_token=C.accessToken));for(let[e,n]of Object.entries(t))typeof n==`object`&&(t[e]=JSON.stringify(n));let r=``;for(let[e,n]of Object.entries(t))r&&(r+=`&`),r+=`${e}=${encodeURIComponent(n)}`;return r}var Wo=class{constructor(){g(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}async createJoinLink(e){return{join_link:`nop`}}async removeJoinLink(e){return{success:!0}}async getAnonymTokenByLink(e,t){return``}log(e){}logClientStats(e){}logClientEvents(e){}getCachedOkIdByExternalId(e){return null}getCachedRawOkIdByExternalId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}replaceByInitialIdIdIfExists(e){return typeof e==`string`?parseInt(e,10):e}hangupConversation(e,t=v.HUNGUP){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}},Go=class{constructor(){g(this,`_okIdToExternalId`,new Map),g(this,`_externalIdToOkId`,new Map),g(this,`_decorativeIdToInitialId`,new Map),g(this,`_initialIdToDecorativeId`,new Map)}getOkId(e){let t=Z.toString(e),n=this._externalIdToOkId.get(t);return n==null?null:this.replaceByInitialIdIdIfExists(n)}getExternalId(e){let t=this.getDecorativeIdByInitialId(e)??e,n=this._okIdToExternalId.get(t);return n==null?null:Z.fromString(n)}hasByExternalId(e){return this._externalIdToOkId.has(Z.toString(e))}hasByOkId(e){return this._okIdToExternalId.has(e)}cache(e,t){let n=N.extractOkId(e),r=Z.toString(t);this._okIdToExternalId.set(n,r),this._externalIdToOkId.set(r,n)}mapDecorativeId(e,t){let n=N.extractOkId(e),r=N.extractOkId(t);this._decorativeIdToInitialId.set(n,r),this._initialIdToDecorativeId.set(r,n)}unmapDecorativeId(e){let t=N.extractOkId(e),n=this.getDecorativeIdByInitialId(t);n&&this._decorativeIdToInitialId.delete(n),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=N.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=N.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}getParticipantIdByExternalId(e){let t=this.getOkId(e);return t==null?null:N.composeParticipantId(t,M.USER,e.deviceIdx??0)}clear(){this._okIdToExternalId.clear(),this._externalIdToOkId.clear(),this._decorativeIdToInitialId.clear(),this._initialIdToDecorativeId.clear()}},Ko=700,qo=3e3,Jo=class extends Wo{constructor(...e){super(...e),g(this,`_userId`,null),g(this,`_uuid`,void 0),g(this,`_idCache`,new Go)}async _callUnsafe(e,t={},n=!1){let r=async i=>{try{return await Bo(e,t,n)}catch(t){if(!Object.hasOwn(t,`error_msg`)){i++;let n=Object.getOwnPropertyNames(t).map(e=>`${e}: ${JSON.stringify(t[e])}`);if(B.debug(`${e} network error, attempt ${i}: ${n.join(`
|
|
20
|
-
`)}`),this._abortSignal?.aborted&&(B.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),i<P.apiMaxAttempt)return await N.delay(Math.min(i*Ko,qo),{signal:this._abortSignal}),r(i)}throw B.warn(e,`error`,t),t}};return r(0)}async _call(e,t={},n=!1){try{return await this._callUnsafe(e,t,n)}catch(r){B.warn(`Api call error`,r);let i=w.API;switch(r.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,n)}let a={message:r.error_msg,code:r.error_code};if(r instanceof y)throw r;if(r.custom_error&&(a.custom_error=r.custom_error),Yo(r))switch(r.error_code){case 1101:i=v.SERVICE_DISABLED;break;case 4:r.error_msg.includes(`participants.limit.exceeded`)&&(i=v.PARTICIPANT_LIMIT_REACHED);break;case 300:i=v.NOT_FOUND;break;case 1102:i=v.CALLEE_IS_OFFLINE;break;case 1103:i=v.NOT_FRIENDS;break;case 1104:case 1106:i=v.EXTERNAL_API_ERROR;break;case 1113:i=v.CALLER_IS_REJECTED;break;case 1114:i=v.VCHAT_DETAILED_ERROR;break;case 2:i=v.SERVICE_UNAVAILABLE;break}throw new y(i,a)}}async userId(e){let t=N.extractOkId(e);return C.isEmpty()?Z.fromId(String(t)):(this._idCache.hasByOkId(t)||await this._getExternalIdsByOkIds([t]),this._idCache.getExternalId(t)||Z.fromId(String(t)))}async authorize(){if(this._ensureUuid(),!P.apiKey)throw new y(w.API,{message:`Required argument apiAppKey not passed`});let e={session_data:{version:2,device_id:this._uuid,client_version:P.appVersion,client_type:`SDK_JS`}};return P.authToken&&(e.session_data.auth_token=P.authToken,e.session_data.version=3),this._callUnsafe(`auth.anonymLogin`,e,!0).then(e=>{e.uid&&(this._userId=Number(e.uid)),C.sessionKey=e.session_key,C.sessionSecretKey=e.session_secret_key}).catch(e=>{throw e.error_code===401&&z.onTokenExpired(),new y(w.AUTH,{message:e.error_msg,code:e.error_code})})}logClientStats(e){let t={app_version:String(P.appVersion),sdk_type:`WEB`,sdk_version:P.sdkVersion,version:1,items:e};P.clientStatsPlatform&&(t.platform=P.clientStatsPlatform),zo(`vchat.clientStats`,{data:JSON.stringify(t)})}logClientEvents(e){let t={app_version:String(P.appVersion),sdk_type:`WEB`,sdk_version:P.sdkVersion,version:1,items:e};P.clientStatsPlatform&&(t.platform=P.clientStatsPlatform),zo(`vchat.clientEvents`,{data:JSON.stringify(t)})}async uploadDebugLogs(e,t,n,r){let i={conversationId:e,webrtcPlatform:P.platform,startTime:t,endTime:n},a=await this._callUnsafe(`vchat.getLogUploadUrl`,i),o=new FormData,s=new Blob([r],{type:`application/json`});o.append(`file`,s,`log.json`);let c=new URL(a.upload_url);return c.searchParams.append(`size`,s.size.toString()),Ho(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:P.protocolVersion,capabilities:Aa.getFlags()};return n&&(r.chatId=n),this._call(`vchat.joinConversation`,r)}async createConversation(e,t=``,n=!1,{onlyAdminCanShareMovie:r,audienceMode:i,audioOnly:a,waitForAdmin:o,closedConversation:s}={},c){let l=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:n,onlyAdminCanShareMovie:r,waitForAdmin:o,closedConversation:s,audienceMode:i,audioOnly:a,externalIds:c});return this._startConversation(l)}async startConversation(e,t,n,r=!1,i=``,a=!1,o=!1,{onlyAdminCanShareMovie:s,waitForAdmin:c}={},l){let u=this._preareStartConversationData({conversationId:e,isVideo:r,joiningAllowed:a,payload:i,requireAuthToJoin:o,onlyAdminCanShareMovie:s,waitForAdmin:c,externalIds:l});if(t&&t.length)switch(n){case Wa.USER:u.uids=t.join(`,`);break;case Wa.GROUP:u.gid=t[0];break;case Wa.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=bt.get(`uuid`);e||(e=N.uuid(),bt.set(`uuid`,e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:n=``,joiningAllowed:r=!1,requireAuthToJoin:i=!1,onlyAdminCanShareMovie:a,waitForAdmin:o,audienceMode:s=!1,audioOnly:c=!1,closedConversation:l=!1,externalIds:u}){let d={conversationId:e,isVideo:t,protocolVersion:P.protocolVersion};return r&&(d.createJoinLink=!0),n&&(d.payload=n),P.domain&&(d.domainId=P.domain),P.externalDomain&&(d.externalDomain=P.externalDomain),i&&(d.requireAuthToJoin=!0),a!==void 0&&(d.onlyAdminCanShareMovie=a),o!==void 0&&(d.waitForAdmin=o),s&&(d.audienceMode=s),c&&(d.audioOnly=c),l&&(d.closed=l),u&&(d.externalIds=u.map(Z.toSignaling).join(`,`)),d}async _startConversation(e){return this._call(`vchat.startConversation`,e)}async createJoinLink(e){return this._call(`vchat.createJoinLink`,{conversationId:e})}async removeJoinLink(e){return this._call(`vchat.removeJoinLink`,{conversationId:e})}async getAnonymTokenByLink(e,t){let n={joinLink:e};t&&(n.anonymName=t);let r=await this._call(`vchat.getAnonymTokenByLink`,n);return this._userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:P.protocolVersion,capabilities:Aa.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),P.anonymToken&&(i.anonymToken=P.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}async getExternalIdsByOkIds(e){let t=[],n=[];for(let r of e){let e=this._idCache.getExternalId(r);e?t.push(e):n.push(r)}if(!n.length)return t;let r=await this._getExternalIdsByOkIds(n);return Array.from(r.values())}getCachedOkIdByExternalId(e){return this._idCache.getParticipantIdByExternalId(e)}getCachedRawOkIdByExternalId(e){return this._idCache.getOkId(e)}cacheExternalId(e,t){this._idCache.cache(e,t)}mapDecorativeId(e,t){this._idCache.mapDecorativeId(e,t)}unmapDecorativeId(e){this._idCache.unmapDecorativeId(e)}getDecorativeIdByInitialId(e){return this._idCache.getDecorativeIdByInitialId(e)}replaceByInitialIdIdIfExists(e){return this._idCache.replaceByInitialIdIdIfExists(e)}async getConversationParams(e){let t={};return P.anonymToken&&(t.anonymToken=P.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e,t=v.HUNGUP){let n={conversationId:e,reason:t};P.anonymToken&&(n.anonymToken=P.anonymToken),zo(`vchat.hangupConversation`,n)}async removeHistoryRecords(e){await this._call(`vchat.removeHistoryRecords`,{recordIds:e.join(`,`)})}cleanup(){this._idCache.clear()}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(e=>this.getDecorativeIdByInitialId(e)??e);try{let n=await this._call(`vchat.getExternalIdsByOkIds`,{uids:e.join(`,`)}),r=(e,n)=>{for(let[r,i]of Object.entries(e)){let e=Number(r),a=Z.fromId(i,n);t.set(e,a),this.cacheExternalId(e,a)}};n.external_ids&&r(n.external_ids,no.USER),n.anonym_ids&&r(n.anonym_ids,no.ANONYM);for(let n of e){let e=Number(n);if(!t.has(e)){let n=Z.fromId(String(e));t.set(e,n),this.cacheExternalId(e,n)}}return t}catch{return t}}async getServerTime(){return(await this._call(`system.getInfo`)).serverTime}};function Yo(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}var Xo=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(Xo||{}),Zo=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),Qo=class{constructor(e){g(this,`_queue`,void 0),g(this,`_readCursor`,void 0),g(this,`_writeCursor`,void 0),g(this,`_moveReadCursor`,void 0),g(this,`_left`,void 0),this._queue=Array(e).fill(null),this._readCursor=this._writeCursor=this._left=0,this._moveReadCursor=!1}get length(){return this._queue.length}get left(){return this._left}toArray(){return Array.from(this._queue)}add(e){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=e,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(e){return(e+1)%this._queue.length}next(){let e=this._queue[this._readCursor];return e&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),--this._left),e}},$o=class{constructor(e,t,n,r=null){g(this,`_uuid`,void 0),g(this,`_apiKey`,void 0),g(this,`_callToken`,void 0),g(this,`_apiEnv`,void 0),g(this,`_baseApiUrl`,void 0),g(this,`_sessionKey`,void 0),this._uuid=N.uuid(),this._apiKey=t,this._callToken=n,this._apiEnv=e,this._baseApiUrl=r}async authorize(){let e=await Bo(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:P.appVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await Lo(this._baseApiUrl,this._apiEnv));return N.isObject(e)&&!(`error_msg`in e)?(this._sessionKey=e.session_key,!0):!1}async hangupConversation(e){await Bo(`vchat.hangupConversation`,{conversationId:e,reason:v.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},!0,await Lo(this._baseApiUrl,this._apiEnv))}},$,es=null,ts={getCameras:k.getCameras,getMicrophones:k.getMicrophones,getOutput:k.getOutput,getVideoFacingMode:k.getVideoFacingMode,hasCamera:k.hasCamera,hasMicrophone:k.hasMicrophone,getSavedCamera:k.getSavedCamera,getSavedMicrophone:k.getSavedMicrophone,getSavedOutput:k.getSavedOutput,hasCameraPermission:k.hasCameraPermission,hasMicrophonePermission:k.hasMicrophonePermission,hasPermissions:k.hasPermissions,getUserMedia:k.getUserMedia,getUserVideo:k.getUserVideo,getUserAudio:k.getUserAudio,setResolution:k.setResolution,isBrowserSupported:k.isBrowserSupported,isScreenCapturingSupported:k.isScreenCapturingSupported,os:k.os,isMobile:k.isMobile,browserName:k.browserName,browserVersion:k.browserVersion,baseChromeVersion:k.baseChromeVersion,getAudioContext:k.getAudioContext,isAudioShareSupported:k.isAudioShareSupported},ns={participantMarkerCompare:N.participantMarkerCompare};function rs(e){es=e}function is(e){P.videoEffects=e}function as(e){P.audioEffects=e}function os(e,t=null,n={},r=1){P.vmoji=e,P.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function ss(e){if(P.set(e),$||($=new Jo),c.default.disableLog(!P.debug),B.toggle(P.debug),B.log(`Calls SDK ${P.sdkVersion}`,e),await k.init(),!k.isBrowserSupported())throw new y(w.UNSUPPORTED);B.log(`UserAgent:`,navigator.userAgent),B.log(`Screen resolution:`,`${window.screen.width}x${window.screen.height}`),B.log(`Permissions:`,`Camera: ${k.hasCameraPermission()}, Mic: ${k.hasMicrophonePermission()}`),B.log(`Simulcast:`,`${e.simulcast} => ${P.simulcast}`)}async function cs(e,t=[T.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),ls([],Wa.USER,t,n,r,i,a,c,o,s)}async function ls(e,t=Wa.USER,n,r=``,i=!1,a=!1,o,s,c,l){if(Q.current())throw B.error(`There is already active call`),new y(v.FAILED);return new Q($,es).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function us(e,t){return ds(e,M.USER,void 0,t)}async function ds(e,t=M.USER,n,r,i,a){if(e===Q.id())throw Error(`Push has already been processed`);return a&&$.setUserId(a),new Q($,es).onPush(e,t,n,r,i)}async function fs(e,t){return e&&(P.authToken=e),t!==void 0&&P.apiBaseUrl!==t&&(P.apiBaseUrl=t,Fo()),$.authorize()}async function ps(e=[T.AUDIO]){return Ic().accept(e)}async function ms(){let e=Q.current();if(e)return e.decline()}async function hs(e,t=[T.AUDIO]){return gs(e,t)}async function gs(e,t,n){if(Q.current())throw B.error(`There is already active call`),new y(v.FAILED);return new Q($,es).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function _s(e,t=[T.AUDIO],n,r,i,a){if(Q.current())throw B.error(`There is already active call`),new y(v.FAILED);return n&&(P.anonymToken=n),new Q($,es).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a})}async function vs(){let e=Q.current();if(e)return e.hangup();Q.hangupAfterInit()}async function ys(e,t){let n=Array.isArray(e)?e:[e],r=Q.current();r&&await r.addParticipant(n,t)}async function bs(e,t){let n=Q.current();if(n){let r=e.map(e=>N.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function xs(e,t=!1){return Ss($.getCachedRawOkIdByExternalId(e),t)}async function Ss(e,t=!1){let n=Q.current();if(n)try{await n.removeParticipant(N.composeUserId(e),t)}catch(t){B.warn(`Failed to remove participant ${e}. Perhaps he is no longer on the call. ${t}`)}}async function Cs(e,t){let n=Q.current();if(e===`videoinput`&&Wt.contains(t))return P.videoFacingMode=t,n?(k.isMobile()&&n.stopVideoTrack(),n.changeDevice(e)):void 0;if(!await k._saveDeviceId(e,t))throw Error(`Device not found: ${t}`);if(n)return n.changeDevice(e)}async function ws(e){let t=typeof e==`object`?{...e,fastScreenSharing:e.captureScreen&&e.fastScreenSharing,captureAudio:e.captureScreen&&e.captureAudio&&P.audioShare}:{captureScreen:e,fastScreenSharing:!1,captureAudio:!1},n=Q.current();return n?n.toggleScreenCapturing(t):Promise.reject()}function Ts(e){let t=Q.current();t&&t.toggleAnimojiCapturing(e)}async function Es(e,t=!1){let n=Q.current();n&&await n.setVideoStream(e,t)}async function Ds(e){let t=Q.current();t&&await t.toggleLocalVideo(e)}async function Os(e){let t=Q.current();t&&await t.toggleLocalAudio(e)}async function ks(e){let t=Q.current();if(t)return t.setLocalResolution(e)}async function As(e){let t=Q.current();t&&await t.changePriorities(e)}async function js(e,t){let n=Q.current();if(n){let r;if(t){let e=$.getCachedRawOkIdByExternalId(t);r=N.composeParticipantId(e,M.USER,t.deviceIdx)}await n.changeParticipantState(e,r)}}async function Ms(e){let t=Q.current();t&&await t.hold(e)}async function Ns(){let e=Q.current();e&&await e.putHandsDown()}async function Ps(e){let t=Q.current();t&&await t.updateDisplayLayout(e)}async function Fs(e,t,n=!1){return Is($.getCachedRawOkIdByExternalId(e),Z.getDeviceIdx(e),t,n)}async function Is(e,t,n,r=!1){let i=Q.current();i&&await i.grantRoles(N.composeParticipantId(e,M.USER,t),n,r)}async function Ls({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){let i=null;return e&&(i=$.getCachedRawOkIdByExternalId(e)),Rs({uid:i,muteStates:t,requestedMedia:n,deviceIdx:Z.getDeviceIdx(e),roomId:r})}async function Rs({uid:e=null,muteStates:t,requestedMedia:n=[],deviceIdx:r=0,roomId:i=null}){let a=Q.current();if(a){let o=e?N.composeParticipantId(e,M.USER,r):null;await a.muteParticipant(o,t,n,i)}}async function zs(e,t=!1,n=null){return Bs($.getCachedRawOkIdByExternalId(e),t,Z.getDeviceIdx(e),n)}async function Bs(e,t=!1,n=0,r=null){let i=Q.current();i&&await i.pinParticipant(N.composeParticipantId(e,M.USER,n),t,r)}async function Vs(e){let t=Q.current();t&&await t.updateMediaModifiers(e)}async function Hs(e){let t=Q.current();t&&await t.enableVideoSuspend(e)}async function Us(e){let t=Q.current();t&&await t.enableVideoSuspendSuggest(e)}async function Ws(e){let t=Q.current();t&&await t.changeOptions(e)}async function Gs(e,t=null){let n=null;return t&&(n=$.getCachedRawOkIdByExternalId(t)),Ks(e,n)}async function Ks(e,t=null){let n=Q.current();if(n){let r=t?N.composeUserId(t):null;await n.chatMessage(e,r)}}async function qs(e=10){let t=Q.current();if(t)return t.chatHistory(e)}async function Js(e,t=null){let n=null;return t&&(n=$.getCachedRawOkIdByExternalId(t)),Ys(e,n,Z.getDeviceIdx(t))}async function Ys(e,t=null,n=0){let r=Q.current();if(r){let i=t?N.composeParticipantId(t,M.USER,n):null;await r.customData(e,i)}}async function Xs(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await $.createConversation(a??N.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function Zs(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=i.map(e=>Z.fromId(e));return(await $.createConversation(N.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},a)).join_link}async function Qs(){let e=Q.current();return e?e.createJoinLink():Promise.reject()}async function $s(){let e=Q.current();return e?e.removeJoinLink():Promise.reject()}async function ec(e,t){return $.getAnonymTokenByLink(e,t)}function tc(e){let t=Q.current();t&&t.setVolume(e)}function nc(e){P.forceRelayPolicy=e}async function rc(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o=Q.current();return o?o.startStream(e,t,n,r,i,a):Promise.reject()}async function ic(e=null,t){let n=Q.current();return n?n.stopStream(e,t):Promise.reject()}async function ac(e=null){let t=Q.current();return t?t.publishStream(e):Promise.reject()}async function oc(){let e=Q.current();return e?e.getStreamInfo():Promise.reject()}async function sc(e){let t=Q.current();return t?t.addMovie(e):Promise.reject()}async function cc(e){let t=Q.current();return t?t.updateMovie(e):Promise.reject()}async function lc(e){let t=Q.current();return t?t.removeMovie(e):Promise.reject()}async function uc(e,t){let n=Q.current();if(n){let r=[];for(let t of e){let e,n;t.addParticipantIds&&(e=t.addParticipantIds.map(e=>N.composeUserId($.getCachedRawOkIdByExternalId(e)))),t.removeParticipantIds&&(n=t.removeParticipantIds.map(e=>N.composeUserId($.getCachedRawOkIdByExternalId(e)))),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:n,countdownSec:t.countdownSec})}return n.updateRooms(r,t)}return Promise.reject()}async function dc(e,t){let n=Q.current();return n?n.activateRooms(e,t):Promise.reject()}async function fc(e=null,t=null){let n=Q.current();if(!n)return Promise.reject();let r;if(t){let e=$.getCachedRawOkIdByExternalId(t),n=Z.getDeviceIdx(t);r=N.composeParticipantId(e,M.USER,n)}return n.switchRoom(e,r)}async function pc(e){let t=Q.current();return t?t.removeRooms(e):Promise.reject()}function mc(e){P.statisticsInterval=e;let t=Q.current();if(t)return t.updateStatisticsInterval()}function hc(e){c.default.disableLog(!e),B.toggle(e)}function gc(e,...t){P.debugLog&&B.send(e,`[external]`,...t)}var _c={list:Ge,get:Ke,getJson:qe,download:Je,clear:Ye,stats:Xe};function vc(){let e=[[`Calls SDK ${P.sdkVersion}`,P.toJSON()],[`UserAgent:`,navigator.userAgent],[`Screen resolution:`,`${window.screen.width}x${window.screen.height}`],[`Permissions:`,`Camera: ${k.hasCameraPermission()}, Mic: ${k.hasMicrophonePermission()}`]],t=new Date,n=t.getTime(),r=t.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`});return e.map(e=>({h:r,t:n,l:jn.LOG,d:e}))}async function yc(){let e=Q.current()?.debugSessionId,t=e&&(await Ge()).find(t=>t.sessionId===e)||null;if(!t?.conversationId)throw B.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let n=await Ke({sessionId:t.sessionId});if(n.length===0)throw B.error(`[uploadDebugLogs]`,`No logs found`),Error(`No logs found`);let r=n[0]?.t||t.startTime,i=n[n.length-1]?.t||t.endTime;try{return $?.uploadDebugLogs(t.conversationId,r,i,JSON.stringify([...vc(),...n]))}catch(e){throw B.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function bc(e){let t=Q.current();if(t)return t.videoEffect(e)}async function xc(e,t){let n=Q.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function Sc(e){let t=Q.current();t&&await t.setAudioStream(e)}async function Cc(e,t=null,n=null){let r=Q.current();if(!r)return;let i=n??t?.id,a=null;if(t){let e=$.getCachedRawOkIdByExternalId(t);if(!e)throw Error(`Could not get user id to set animoji svg`);a=N.composeParticipantId(e,M.USER,Z.getDeviceIdx(t))}r.setAnimojiSvg(e,a,i)}function wc(e){let t=Q.current();t&&t.setAnimojiFill(e)}async function Tc(e=null,t,n=!1){return Ic().getWaitingHall(e,t,n)}async function Ec(){return Ic().getAudienceModeHands()}async function Dc(e,t=!1){let n=Ic(),r;if(e){let t=$.getCachedRawOkIdByExternalId(e);r=N.composeUserId(t)}return n.promoteParticipant(r,t)}async function Oc(e=!1){return Ic().requestPromotion(e)}async function kc(e=!1){return Ic().acceptPromotion(e)}async function Ac(e){return Ic().getParticipantListChunk(e)}async function jc(e){return Ic().getParticipants(e)}async function Mc(e){return Ic().feedback(e)}function Nc(e,t,n){return Ic().userFeedbackStats(e,t,n)}function Pc(e,t={},n=!1){let r=Q.current();r&&r.sendClientEvent(e,t,n)}async function Fc(e,t){return Ic().enableFeatureForRoles(e,t)}function Ic(){let e=Q.current();if(!e)throw Error(`Conversation not found`);return e}async function Lc(e){await $.removeHistoryRecords(e)}async function Rc(e){let t=Q.current();t&&await t.startAsr(e)}async function zc(e){let t=Q.current();t&&await t.stopAsr(e)}async function Bc(e){let t=Q.current();t&&await t.requestAsr(e)}async function Vc(e){let t=Q.current();return t?t.startUrlSharing(e):Promise.reject()}async function Hc(){let e=Q.current();return e?e.stopUrlSharing():Promise.reject()}function Uc(){return Q.getSyncedTime()}function Wc(){return P.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=On),exports.Api=Jo,exports.ApiExternal=$o,exports.ArrayDequeue=Qo,exports.AuthData=C,exports.BaseLogger=m,exports.CallDirection=Y,exports.CallType=Wa,exports.ChatRoomEventType=Ga,exports.ConversationFeature=Ka,exports.ConversationOption=qa,exports.DebugMessageType=jn,exports.ExternalIdType=no,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return Wt}}),exports.FatalError=w,exports.HangupReason=y,exports.HangupType=v,exports.MediaOption=T,exports.MediaTrackKind=j,exports.MediaType=V,exports.MuteState=Xa,exports.ParticipantState=X,exports.ParticipantStateDataValue=Zo,exports.ParticipantStatus=F,exports.RecordRole=Xo,exports.RoomsEventType=Za,exports.Signaling=Ua,exports.SignalingCommandType=x,exports.SignalingConnectionType=Oa,exports.SignalingNotification=G,exports.TransportTopology=J,exports.UserRole=eo,exports.UserType=M,exports.VolumeDetector=yo,exports.acceptCall=ps,exports.acceptPromotion=kc,exports.activateRooms=dc,exports.addMovie=sc,exports.addParticipant=ys,exports.addParticipantInternal=bs,exports.authorize=fs,exports.browser=ts,exports.callInternal=ls,exports.callTo=cs,exports.captureScreen=ws,exports.captureVmoji=Ts,exports.changeAudioEffect=xc,exports.changeConversationOptions=Ws,exports.changeDevice=Cs,exports.changeParticipantState=js,exports.changePriorities=As,exports.changeVideoEffect=bc,exports.chatHistory=qs,exports.chatMessage=Gs,exports.chatMessageInternal=Ks,exports.createJoinLink=Qs,exports.customData=Js,exports.customDataInternal=Ys,exports.debug=hc,exports.debugLogs=_c,exports.debugMessage=gc,exports.declineCall=ms,exports.enableFeatureForRoles=Fc,exports.enableVideoSuspend=Hs,exports.enableVideoSuspendSuggest=Us,exports.feedback=Mc,exports.forceRelayPolicy=nc,exports.getAnonymTokenByLink=ec,exports.getAudienceModeHands=Ec,exports.getParticipantListChunk=Ac,exports.getParticipants=jc,exports.getStreamInfo=oc,exports.getSyncedTime=Uc,exports.getWaitingHall=Tc,exports.grantRoles=Fs,exports.grantRolesInternal=Is,exports.hangup=vs,exports.hold=Ms,exports.init=ss,exports.joinCall=hs,exports.joinCallByLink=_s,exports.joinCallInternal=gs,exports.logClientEvent=Pc,exports.muteParticipant=Ls,exports.muteParticipantInternal=Rs,exports.pinParticipant=zs,exports.pinParticipantInternal=Bs,exports.processPush=us,exports.processPushInternal=ds,exports.promoteParticipant=Dc,exports.publishStream=ac,exports.putHandsDown=Ns,exports.removeHistoryRecords=Lc,exports.removeJoinLink=$s,exports.removeMovie=lc,exports.removeParticipant=xs,exports.removeParticipantInternal=Ss,exports.removeRooms=pc,exports.requestAsr=Bc,exports.requestPromotion=Oc,exports.setAudioEffects=as,exports.setAudioStream=Sc,exports.setLocalResolution=ks,exports.setLogger=rs,exports.setMediaModifiers=Vs,exports.setStatisticsInterval=mc,exports.setVideoEffects=is,exports.setVideoStream=Es,exports.setVmoji=os,exports.setVmojiFill=wc,exports.setVmojiSvg=Cc,exports.setVolume=tc,exports.startAsr=Rc,exports.startAudienceConversation=Zs,exports.startConversation=Xs,exports.startStream=rc,exports.startUrlSharing=Vc,exports.stopAsr=zc,exports.stopStream=ic,exports.stopUrlSharing=Hc,exports.switchRoom=fc,exports.toggleLocalAudio=Os,exports.toggleLocalVideo=Ds,exports.updateDisplayLayout=Ps,exports.updateMovie=cc,exports.updateRooms=uc,exports.uploadDebugLogs=yc,exports.userFeedbackStats=Nc,exports.utils=ns,exports.version=Wc;
|
|
19
|
+
`)}})}_startMonitorRtpShareInterval(){let e=5e3;if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,e)};this._monitorRtpShareInterval=window.setTimeout(t,e)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}},J=function(e){return e.REMOTE_TRACK_ADDED=`REMOTE_TRACK_ADDED`,e.REMOTE_TRACK_REMOVED=`REMOTE_TRACK_REMOVED`,e.REMOTE_STREAM_SECOND=`REMOTE_STREAM_SECOND`,e.AUDIO_MIX_STALL=`AUDIO_MIX_STALL`,e.REMOTE_DATA_STATS=`REMOTE_DATA_STATS`,e.STATE_CHANGED=`STATE_CHANGED`,e.LOCAL_STATE_CHANGED=`LOCAL_STATE_CHANGED`,e.SIGNALLED_ACTIVE_PARTICIPANTS=`SIGNALLED_ACTIVE_PARTICIPANTS`,e.SIGNALLED_SPEAKER_CHANGED=`SIGNALLED_SPEAKER_CHANGED`,e.SIGNALLED_STALLED_PARTICIPANTS=`SIGNALLED_STALLED_PARTICIPANTS`,e.TOPOLOGY_CHANGED=`TOPOLOGY_CHANGED`,e.NETWORK_STATUS=`NETWORK_STATUS`,e.PEER_CONNECTION_CLOSED=`PEER_CONNECTION_CLOSED`,e.ASR_TRANSCRIPTION=`ASR_TRANSCRIPTION`,e.ANIMOJI_STREAM=`ANIMOJI_STREAM`,e.ANIMOJI_ERROR=`ANIMOJI_ERROR`,e.SCREEN_SHARING_STAT=`SCREEN_SHARING_STAT`,e}({}),na=class extends b{constructor(e,t,n,r,i=R,a=null,o=null,s=null){super(),h(this,`_signaling`,void 0),h(this,`_mediaSource`,void 0),h(this,`_topology`,void 0),h(this,`_allocated`,[]),h(this,`_opened`,[]),h(this,`_directTransport`,null),h(this,`_serverTransport`,null),h(this,`_serverSettings`,void 0),h(this,`_dtListeners`,[]),h(this,`_stListeners`,[]),h(this,`_states`,{}),h(this,`_localState`,K.IDLE),h(this,`_animojiReceiver`,null),h(this,`_animojiSender`,null),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_codecStatsAggregator`,void 0),this._signaling=t,this._mediaSource=n,this._topology=e,this._serverSettings=r,this._debug=i,this._logger=a,this._statAggregator=o,this._codecStatsAggregator=s,this.subscribe(this._signaling,mr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e===q.SERVER&&(this._serverTransport=this._createServerTransport())}updateSettings(e){this._debug.log(`Update transport settings`,e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(this._debug.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){this._debug.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology===q.DIRECT&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===q.SERVER&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,n=!1,r=!1){this._debug.log(`Trying open participant`,{participantIds:e});let i=r;for(let t of e){if(this._opened.indexOf(t)!==-1){this._debug.warn(`The participant [${t}] has already had opened transport`);continue}if(this._allocated.indexOf(t)===-1){this._debug.warn(`The participant [${t}] has no allocated transport`);continue}this._opened.push(t),i=!0}i&&(this._topology===q.DIRECT&&this._directTransport&&this._directTransport.open(t),this._topology===q.SERVER&&this._serverTransport&&(this._serverTransport.open(n),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),this._debug.debug(`The transport has been opened`,e))}close(e){let t=this._allocated.indexOf(e),n=this._opened.indexOf(e);t<0&&this._debug.warn(`The participant [${e}] transport has already deallocated`),this._topology===q.DIRECT&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===q.SERVER&&(this._serverTransport?.removeParticipant(e),this._setStates([e],K.CLOSED)),n>=0&&this._opened.splice(n,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),M.audioEffects?.destroy(),this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}getTopology(){return this._topology}isAllocated(e){return this._allocated.indexOf(e)>=0}allocated(){return this._allocated.slice()}opened(){return this._opened.slice()}getState(){return this._topology===q.SERVER?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){M.vmoji&&t.isMe&&M.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology===q.SERVER&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let n=e.filter(e=>this._states[e]===t?!1:(this._states[e]=t,!0));n.length&&this._triggerEvent(`STATE_CHANGED`,n,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent(`LOCAL_STATE_CHANGED`,e))}_onSignalingNotification(e){if(e.notification===G.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(this._debug.log(`Topology changed ${this._topology} -> ${e.topology}`),this._logger?.log(C.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===q.SERVER&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===q.DIRECT){let t=e.offerTo||[],n=e.offerToTypes||[],r=e.offerToDeviceIdxs||[],i=t.length&&n.length?j.composeParticipantId(t[0],n[0],r[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){this._debug.error(`Topology changed to DIRECT, but the list of allocated participants is empty`);return}this._allocated.length>1&&this._debug.warn(`Topology changed to DIRECT, but the allocated participants count more then one`);let a=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let e=i===a;this._directTransport=this._createDirectTransport(a,e)}this._opened.indexOf(a)>=0&&this._directTransport.open()}this._triggerEvent(`TOPOLOGY_CHANGED`,this._topology)}}_createDirectTransport(e,t=!1){let n=new zr(e,t,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator);return this._dtListeners.length>0&&this._debug.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(n.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this,e)),n.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this,e)),n.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),n.addEventListener(`STATE_CHANGED`,this._onDirectTransportChanged.bind(this)),n.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),n.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,q.DIRECT))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new ta(this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator);return this._stListeners.length>0&&this._debug.warn(`The list of server transport listeners is not empty`),this._stListeners=[],this._stListeners.push(e.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this)),e.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this)),e.addEventListener(`AUDIO_MIX_STALL`,this._onServerAudioMixStall.bind(this)),e.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),e.addEventListener(`STATE_CHANGED`,this._onServerTransportChanged.bind(this)),e.addEventListener(`SIGNALLED_ACTIVE_PARTICIPANTS`,this._onTransportActiveParticipants.bind(this)),e.addEventListener(`SIGNALLED_SPEAKER_CHANGED`,this._onTransportSpeakerChanged.bind(this)),e.addEventListener(`SIGNALLED_STALLED_PARTICIPANTS`,this._onTransportStalledParticipants.bind(this)),e.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),e.addEventListener(`REMOTE_STREAM_SECOND`,this._onRemoteStreamSecond.bind(this)),e.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,q.SERVER)),e.addEventListener(`ASR_TRANSCRIPTION`,this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e===K.CONNECTED&&this._topology===q.DIRECT&&this._releaseServerTransport(),(e===K.CLOSED||e===K.FAILED)&&(this._releaseDirectTransport(),this._topology===q.DIRECT)){let e=this._opened.indexOf(t);e>=0&&this._opened.splice(e,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology===q.DIRECT&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===K.CONNECTED&&this._topology===q.SERVER&&this._releaseDirectTransport(),(e===K.CLOSED||e===K.FAILED)&&(this._releaseServerTransport(),this._topology===q.SERVER&&(this._allocated=[],this._opened=[])),this._topology===q.SERVER&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===q.SERVER&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===q.SERVER&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===q.SERVER&&this._triggerEvent(`SIGNALLED_SPEAKER_CHANGED`,e)}_onTransportNetworkStatus(e){this._triggerEvent(`NETWORK_STATUS`,e)}_onRemoteStreamSecond(e,t){this._triggerEvent(`REMOTE_STREAM_SECOND`,e,t)}_onPeerConnectionClosed(e){this._triggerEvent(`PEER_CONNECTION_CLOSED`,e)}_onServerAudioMixStall(e){this._topology===q.SERVER&&this._triggerEvent(`AUDIO_MIX_STALL`,e)}_onRemoteDataStats(e){this._triggerEvent(`REMOTE_DATA_STATS`,e)}_onRemoteTrackAdded(e,t,n){this._triggerEvent(`REMOTE_TRACK_ADDED`,e,t,n)}_onRemoteTrackRemoved(e,t,n){this._triggerEvent(`REMOTE_TRACK_REMOVED`,e,t,n)}_onAsrTranscription(e){this._triggerEvent(`ASR_TRANSCRIPTION`,e)}_onSourceChanged(){let e=this._mediaSource.getStream();e&&this._animojiSender?.setStream(e)}_onAnimojiStream(e,t){this._triggerEvent(`ANIMOJI_STREAM`,e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createAnimojiTransport(){if(!M.vmoji)return;this._animojiReceiver=new M.vmoji.AnimojiReceiver((e,t)=>this._onAnimojiStream(e,t),e=>this._onAnimojiStream(e,null),e=>{this._triggerEvent(`ANIMOJI_ERROR`,e)},M.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new M.vmoji.AnimojiSender(e,this._signaling.getPeerId(),M.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:M.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=e=>this._animojiReceiver?.receive(e)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology===q.SERVER?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(this._logger?.log(C.PAT_WAITING_TIME_ERROR,`noTransport`),this._debug.error(`Cannot get stream waiting time, server transport is not initialized`),0):(this._logger?.log(C.PAT_WAITING_TIME_ERROR,`wrongTopology`),this._debug.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},ra=`videochat-epi`,ia=5e3,aa=500,oa=class extends b{constructor(e,t,n=null,r=!1,i=R){super(),h(this,`_previousPerfStatReportTimestamp`,0),h(this,`_previousNetworkStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReportTimestamp`,Date.now()),h(this,`_previousCallStatReport`,null),h(this,`_screenShareStats`,[]),h(this,`_signaling`,void 0),h(this,`_directTopology`,void 0),h(this,`_debug`,void 0),h(this,`_statAggregator`,void 0),h(this,`_handleScreenSharingStat`,e=>{this._screenShareStats.push(e)}),h(this,`_handleTransportStateChanged`,e=>{(this._directTopology&&e===K.CONNECTED||!this._directTopology&&e===K.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())}),this._signaling=t,this._directTopology=r,this._debug=i,this._statAggregator=n,this.subscribe(e,J.REMOTE_DATA_STATS,this._handleStats.bind(this)),this.subscribe(e,J.SCREEN_SHARING_STAT,this._handleScreenSharingStat.bind(this)),this.subscribe(e,J.STATE_CHANGED,this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(ra)||``,10);return isNaN(e)?0:e}catch{return 0}}async _handleStats(e){if(!e.inbound||!e.inbound.rtps)return;let t=Date.now();!this._directTopology&&M.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+ia<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+aa<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),M.callStatReportEnabled&&this._previousCallStatReportTimestamp+M.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((e,t)=>(t.kind===`video`&&(e.framesDecoded+=t.framesDecoded||0,e.framesReceived+=t.framesReceived||0),e),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let e=await this._signaling.reportPerfStat(t);localStorage.setItem(ra,e.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0)};if(t.timestamp)try{await this._signaling.reportNetworkStat(t)}catch{}}_reportCallStats(e){let t={call_topology:this._directTopology?`D`:`S`,stat_time_delta:0,nack_received:0,pli_received:0,fir_received:0,frames_dropped:0,jitter_video:0,jitter_audio:0,interframe_delay_variance:0,nack_sent:0,pli_sent:0,fir_sent:0,total_audio_samples_received:0,concealed_audio_samples:0,silent_concealed_audio_samples:0,inserted_audio_samples_for_deceleration:0,removed_audio_samples_for_acceleration:0,audio_concealment_events:0,total_audio_energy:0,inbound_video_count:0,inbound_audio_count:0,packets_lost_video:0,packets_sent_video:0,packets_lost_audio:0,packets_sent_audio:0,freeze_count:0,total_freezes_duration:0,rtt:Math.round(e.inbound.transport.currentRoundTripTime*1e3),ss_freeze_count:0,ss_total_freezes_duration:0,local_address:ca(e.inbound.transport.local),local_connection_type:e.inbound.transport.local?.type,network_type:e.inbound.transport.local?.networkType,transport:e.inbound.transport.local?.protocol,remote_address:ca(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let n=!1,r=!1;for(e.inbound.rtps.reduce((e,t)=>(t.kind===`video`?(n=!0,t.framesReceived&&(e.jitter_video=e.jitter_video*e.inbound_video_count/(e.inbound_video_count+1)+t.jitter*1e3/(e.inbound_video_count+1),e.interframe_delay_variance=e.interframe_delay_variance*e.inbound_video_count/(e.inbound_video_count+1)+(t.interframeDelayVariance||0)*1e6/(e.inbound_video_count+1),e.inbound_video_count++),e.frames_dropped+=t.framesDropped||0,e.nack_sent+=t.nackCount,e.pli_sent+=t.pliCount,e.fir_sent+=t.firCount,e.freeze_count+=t.freezeCountDelta||0,e.total_freezes_duration+=t.totalFreezesDurationDelta||0):(r=!0,t.totalSamplesReceived&&(e.jitter_audio=e.jitter_audio*e.inbound_audio_count/(e.inbound_audio_count+1)+t.jitter*1e3/(e.inbound_audio_count+1),e.total_audio_energy=e.total_audio_energy*e.inbound_audio_count/(e.inbound_audio_count+1)+(t.totalAudioEnergy||0)/(e.inbound_audio_count+1),e.inbound_audio_count++),e.total_audio_samples_received+=t.totalSamplesReceived||0,e.inserted_audio_samples_for_deceleration+=t.insertedSamplesForDeceleration||0,e.removed_audio_samples_for_acceleration+=t.removedSamplesForAcceleration||0,e.concealed_audio_samples+=t.concealedSamples||0,e.silent_concealed_audio_samples+=t.silentConcealedSamples||0,e.audio_concealment_events+=t.concealmentEvents||0),e),t),e.outbound.rtps.reduce((e,t)=>(t.kind===`video`?(e.nack_received+=t.nackCount,e.pli_received+=t.pliCount,e.fir_received+=t.firCount,e.packets_sent_video+=t.packetsSent):e.packets_sent_audio+=t.packetsSent,e),t),e.remoteInbound.rtps.reduce((e,t)=>(t.kind===`video`?e.packets_lost_video+=t.packetsLost:e.packets_lost_audio+=t.packetsLost,e),t);this._screenShareStats.length;){let e=this._screenShareStats.pop();e?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=e.freeze_duration)}let i={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(M.simulcast&&(i.is_simulcast=!0),navigator.hardwareConcurrency&&(i.cpu_hardware_concurrency=navigator.hardwareConcurrency),n&&!la(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!la(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!la(t.interframe_delay_variance)&&(i.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(i.freeze_count=t.freeze_count,i.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(i.ss_freeze_count=t.ss_freeze_count,i.ss_total_freezes_duration=t.ss_total_freezes_duration),r&&!la(t.total_audio_samples_received)){let e=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),n=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),r=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),a=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),o=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),s=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);i.inserted_audio_samples_for_deceleration=ua(n/e*1e3),i.removed_audio_samples_for_acceleration=ua(r/e*1e3),i.concealed_audio_samples=ua(a/e*1e3),i.concealed_silent_audio_samples=ua(o/e*1e3),i.concealment_audio_avg_size=ua(a/s),i.total_audio_energy=t.total_audio_energy}sa(t,`local_address`,`local_connection_type`,`network_type`,`transport`)&&(i.local_address=t.local_address,i.local_connection_type=t.local_connection_type,i.network_type=t.network_type,i.transport=t.transport),sa(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),o=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);a>0&&(i.video_loss=ua(Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video)/a*100)),o>0&&(i.audio_loss=ua(Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio)/o*100)),this._statAggregator?.logCallStat(i),M.enableLogPerfStatReport&&this._debug.log(`Sent call stats`,i),this._previousCallStatReport=t}};function sa(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function ca(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function la(e){return e===void 0}function ua(e){return Number.isNaN(e)?0:e}var da;(function(e){function t(){return{estimatedPerformanceIndex:oa.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:+!!M.asrDataChannel,animojiDataChannelVersion:M.vmoji?M.vmojiOptions.protocolVersion:1,animojiBackendRender:!M.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:M.videoTracksCount,red:!0,audioShare:M.audioShare,fastScreenShare:M.fastScreenShare,videoSuspend:M.videoSuspend,simulcast:M.simulcast,consumerFastScreenShare:M.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:M.consumerFastScreenShareQualityOnDemand,transparentAudio:M.transparentAudio}}e.get=t})(da||(da={}));var fa=da,pa={producerScreenTrack:()=>!0,videoTracksCount:()=>M.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>M.movieShare,useParticipantListChunk:()=>M.useParticipantListChunk,useRooms:()=>M.useRooms,vmoji:()=>!!M.vmoji,useCallsToContacts:()=>M.useCallsToContacts,useChatRooms:()=>M.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!M.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>M.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>M.waitForAdminInGroupCalls,hold:()=>M.hold},ma=class{static getFlags(){let e=Object.values(pa),t=0;for(let n=0;n<e.length;n++)e[n]()&&(t|=1<<n);return t.toString(16).toUpperCase()}static parseCapabilities(e){let t=parseInt(e||`0`,16);return Object.keys(pa).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},ha=63n,ga=16383n,_a=1073741823,va=4611686018427387903n,ya=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=ha)return new Uint8Array([Number(t)]);if(t<=ga)return new Uint8Array([64|Number(t>>8n),Number(t&255n)]);if(t<=BigInt(_a))return new Uint8Array([128|Number(t>>24n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);if(t<=va)return new Uint8Array([192|Number(t>>56n),Number(t>>48n&255n),Number(t>>40n&255n),Number(t>>32n&255n),Number(t>>24n&255n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);throw RangeError(`Number is too large to encode using varint`)}},ba=class{decode(e){let t=this.getNumBytesForLengthInteger(e);if(t<0)throw Error(`Invalid length prefix`);if(e.length<t)return null;let n=BigInt(0);switch(t){case 1:n=BigInt(e[0]&63);break;case 2:n=BigInt(e[0]&63)<<8n|BigInt(e[1]);break;case 4:n=BigInt(e[0]&63)<<24n|BigInt(e[1])<<16n|BigInt(e[2])<<8n|BigInt(e[3]);break;case 8:n=BigInt(e[0]&63)<<56n|BigInt(e[1])<<48n|BigInt(e[2])<<40n|BigInt(e[3])<<32n|BigInt(e[4])<<24n|BigInt(e[5])<<16n|BigInt(e[6])<<8n|BigInt(e[7]);break}return n}getNumBytesForLengthInteger(e){let t=e[0]&192;return t===0?1:t===64?2:t===128?4:t===192?8:-1}},xa=class{constructor(e){h(this,`encoder`,void 0),h(this,`compression`,void 0),h(this,`lengthEncoder`,void 0),this.encoder=new TextEncoder,this.lengthEncoder=new ya,this.compression=e??null}encode(e){let t=this.encoder.encode(e);t=this.compress(t);let n=this.lengthEncoder.encode(t.length),r=new Uint8Array(n.length+t.length);return r.set(n),r.set(t,n.length),r}compress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gzipSync(e);case`deflate`:return p.zlibSync(e);case`deflate-raw`:return p.deflateSync(e);default:return e}}},Sa=class{constructor(e){h(this,`decoder`,void 0),h(this,`compression`,void 0),h(this,`lengthDecoder`,void 0),h(this,`buffer`,void 0),h(this,`expectedLength`,void 0),h(this,`offset`,void 0),h(this,`lengthPrefixLength`,void 0),this.decoder=new TextDecoder,this.lengthDecoder=new ba,this.compression=e??null,this.buffer=new Uint8Array,this.expectedLength=null,this.offset=0}decode(e){let t=[];for(this.buffer=new Uint8Array([...this.buffer,...e]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return t;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return t;let e=this.buffer.subarray(this.offset,this.offset+this.expectedLength);e=this.decompress(e),t.push(this.decoder.decode(e)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return t}readLength(e){if(e.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(e),this.lengthPrefixLength<0)throw Error(`Invalid length prefix`);let t=this.lengthDecoder.decode(e.subarray(0,this.lengthPrefixLength));return t===null?null:Number(t)}decompress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gunzipSync(e);case`deflate`:return p.unzlibSync(e);case`deflate-raw`:return p.inflateSync(e);default:return e}}},Ca=class{constructor(e,t={}){h(this,`webTransport`,void 0),h(this,`stream`,null),h(this,`writer`,null),h(this,`reader`,null),h(this,`url`,void 0),h(this,`options`,void 0),h(this,`compression`,void 0),h(this,`encoder`,void 0),h(this,`decoder`,void 0),h(this,`onopen`,null),h(this,`onmessage`,null),h(this,`onerror`,null),h(this,`onclose`,null),h(this,`readyState`,WebSocket.CONNECTING),this.url=e,this.options=t,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(e),this.encoder=new xa(this.compression),this.decoder=new Sa(this.compression),this.connect()}getCompressionTypeFromUrl(e){try{let t=new URL(e).searchParams.get(`compression`);switch(t){case`gzip`:case`deflate`:case`deflate-raw`:return t;default:return null}}catch(e){return R.log(`Exception while parsing compression`,e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,R.debug(`[WebTransport] WebTransport connected to `+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event(`open`)),await this.readLoop()}catch(e){R.error(`[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`connect`)),this.onclose?.(new CloseEvent(`close`,{code:1006,reason:`Connection Failed`}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:e,value:t}=await this.reader.read();if(e)break;t&&(yield t)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let e of this.readChunks())this.decoder.decode(e).forEach(e=>{this.onmessage?.(new MessageEvent(`message`,{data:e}))});this.close(1e3,`Stream Closed`)}catch(e){R.error(`[WebTransport] Stream read failed`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`read`))}}async send(e){if(this.readyState!==WebSocket.OPEN){R.warn(`[WebTransport] Attempt to send data before webtransport is open`);return}if(!this.writer){R.warn(`[WebTransport] Attempt to send data before stream is ready`);return}try{await this.writer.ready;let t=this.encoder.encode(e);await this.writer.write(t)}catch(e){R.error(`[WebTransport] Failed to send data`,e),this.onerror?.(this.createErrorEvent(e,`send`)),this.close(1006,`Failed to send data`)}}createErrorEvent(e,t){let n=new Event(`error`),r=e instanceof Error?e:null;return n.error=e,n.errorInfo={phase:t,name:r?.name,message:r?.message||String(e),stack:r?.stack,readyState:this.readyState,compression:this.compression},n}close(e=1e3,t){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(e){R.warn(`[WebTransport] already closed. Did we get a STOP_SENDING? ignore`,e)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent(`close`,{code:e,reason:t})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return`WebTransport`in window&&typeof WebTransport==`function`?T.browserName()===`Firefox`?M.webtransportFF:T.browserName()!==`Safari`:!1}},wa=`open`,Ta=10,Ea=[`service-unavailable`,`conversation-ended`,`invalid-token`],Da=class e extends xn{static get RECONNECT_DELAY(){return M.signalingReconnectDelay}static get RECONNECT_MAX_DELAY(){return M.signalingReconnectMaxDelay}static get RECONNECT_MAX_COUNT(){return M.signalingReconnectMaxCount}static get WAIT_CONNECTION_DELAY(){return M.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return M.waitResponseDelay}static get WAIT_MESSAGE_DELAY(){return M.waitMessageDelay}constructor(e=R,t=null,n=null,r=null,i=null){super(),h(this,`socket`,null),h(this,`sequence`,1),h(this,`lastStamp`,0),h(this,`websocketCommandsQueue`,[]),h(this,`datachannelCommandsQueue`,[]),h(this,`incomingCache`,[]),h(this,`responseHandlers`,{}),h(this,`connectionType`,void 0),h(this,`reconnectCount`,0),h(this,`endpoint`,void 0),h(this,`wtEndpoint`,null),h(this,`conversationResolve`,null),h(this,`conversationReject`,null),h(this,`connected`,!1),h(this,`listenersReady`,!1),h(this,`peerId`,null),h(this,`conversationId`,null),h(this,`reconnectTimer`,0),h(this,`connectionMessageWaitTimer`,0),h(this,`doctorTimer`,0),h(this,`participantIdRegistry`,null),h(this,`producerNotificationDataChannel`,null),h(this,`producerCommandDataChannel`,null),h(this,`producerCommandDataChannelEnabled`,!1),h(this,`producerCommandSerializationService`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_statAggregator`,void 0),h(this,`_pings`,void 0),h(this,`_signalingCommands`,void 0),this._debug=e,this._logger=t,this._statAggregator=n,this._pings=r,this._signalingCommands=i,this.producerCommandSerializationService=new Jn(e)}get ready(){return this.socket!==null}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e}setConversationId(e){this.conversationId=e}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=e=>{let t=this.participantIdRegistry?.handleMessage(e.data);t&&this._handleMessage(t)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=e=>{this.producerCommandSerializationService.deserializeCommandResponse(e.data).then(e=>{e&&this._handleMessage(e)}).catch(e=>{this._debug.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return new Promise((t,n)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){this._logger?.log(C.SOCKET_ACTION,`already_opened`),n(Error(`Socket already opened`));return}this.conversationResolve=e=>{t(e),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=e=>{n(e),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},n=!0,r=0){if(t.participantId){let e=j.decomposeParticipantId(t.participantId),n=j.decomposeId(e.compositeUserId);t=Object.assign({},t,{participantId:n.id,participantType:n.type}),e.deviceIdx&&(t.deviceIdx=e.deviceIdx)}return this._sendRaw(e,t,n,r)}async _sendRaw(e,t={},n=!0,r=0){let i=t=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===wa&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){this._logger?.log(C.SOCKET_ACTION,`not_opened`),this._debug.warn(`[signaling] socket is not opened`),t.reject(Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(this._logger?.log(C.SOCKET_ACTION,`invalid_state`),this._debug.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(t),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((a,o)=>{let s=(t,n=!1)=>{!r||n?o(t):(this._debug.debug(`[signaling] resending a signaling message`,e,u.sequence),r--,i(u))},c=this.sequence++,l=`${e}_${c}`;W.setMark(l);let u={sequence:c,name:e,statMarkName:l,params:t,responseTimer:0,needResponse:n,resolve:a,reject:s};i(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===B.UPDATE_DISPLAY_LAYOUT||e===B.REPORT_PERF_STAT||e===B.REPORT_SHARING_STAT||e===B.REQUEST_ASR||e===B.ENABLE_VIDEO_SUSPEND||e===B.ENABLE_VIDEO_SUSPEND_SUGGEST||e===B.REPORT_NETWORK_STAT||e===B.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(B.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(B.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(B.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,n){let r=Object.assign({sdp:t},n);return this._send(B.TRANSMIT_DATA,{participantId:e,data:r},!0,Ta)}async acceptCall(e){return this._send(B.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(B.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Ta)}async changeParticipantState(e,t){let n={participantState:{state:e}};return t&&(n.participantId=t),this._sendRaw(B.CHANGE_PARTICIPANT_STATE,n)}async hold(e){let t=fa.get();return this._send(B.HOLD,{hold:e,capabilities:e?void 0:t})}async putHandsDown(){return this._send(B.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(B.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(B.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(B.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let n={capabilities:t};return e&&(n.description=e.sdp),this._send(B.ALLOCATE_CONSUMER,n)}async acceptProducer(e,t,n){let r={description:e.sdp,sessionId:n};return t&&(r.ssrcs=t),this._send(B.ACCEPT_PRODUCER,r)}async changePriorities(e){return this._send(B.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(B.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(B.ADD_MOVIE,e)}async updateMovie(e){return this._send(B.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(B.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(B.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(B.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(B.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(B.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(B.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(B.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(B.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(B.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(B.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(B.RECORD_PUBLISH,e)}async getRecordStatus(){return this._send(B.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(B.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(B.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(B.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(B.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(B.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(B.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(B.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(B.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,n){let r={participantId:e,roles:t};return n&&(r.revoke=!0),this._sendRaw(B.GRANT_ROLES,r)}async muteParticipant(e,t,n,r=null){return this._sendRaw(B.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:n,roomId:r})}async enableFeatureForRoles(e,t){return this._sendRaw(B.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,n){let r={participantId:e,roomId:n};return t&&(r.unpin=!0),this._sendRaw(B.PIN_PARTICIPANT,r)}async updateMediaModifiers(e){return this._send(B.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(B.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(B.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(B.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(B.CHANGE_OPTIONS,{options:e})}async getWaitingHall(e=null,t,n=!1){let r={};return e&&(r.fromId=e),t&&(r.count=t),n&&(r.backward=n),this._send(B.GET_WAITING_HALL,r)}async promoteParticipant(e,t=!1){let n={};return e&&(n.participantId=e),t&&(n.demote=t),this._sendRaw(B.PROMOTE_PARTICIPANT,n)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(B.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(B.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(B.FEEDBACK,{key:e})}async getHandQueue(){return this._send(B.GET_HAND_QUEUE)}close(){this.socket&&this.socket.readyState<WebSocket.CLOSING&&this._closeSocket(),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(B.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(B.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(B.ASR_START,e)}async stopAsr(e){return this._send(B.ASR_STOP,e)}async requestAsr(e){return this._send(B.REQUEST_ASR,{request:e},!1)}_buildUrl(e,t,n){let r=new URL(e),i=r.searchParams;return i.set(`platform`,M.platform),i.set(`appVersion`,String(M.appVersion)),i.set(`version`,String(M.protocolVersion)),i.set(`device`,M.device),i.set(`capabilities`,ma.getFlags()),i.set(`clientType`,M.clientType),t&&i.set(`tgt`,t),t===pr.RETRY&&this.lastStamp&&i.set(`recoverTs`,String(this.lastStamp)),M.useParticipantListChunk&&(i.set(`partIdx`,String(M.participantListChunkInitIndex)),M.participantListChunkInitCount!==null&&i.set(`partCount`,String(M.participantListChunkInitCount))),n&&(i.set(`compression`,`deflate-raw`),i.set(`ua`,navigator.userAgent)),this.peerId!==null&&i.set(`peerId`,String(this.peerId)),r.toString()}_connect(e,t){if(!(this.socket&&this.socket.readyState<WebSocket.CLOSING)){if(this.connectionType=e,t){if(!this.wtEndpoint){this._debug.error(`[signaling] empty wt endpoint`),this.conversationReject?.(new O(x.SIGNALING_FAILED,{message:`Unable to connect to the signaling: wtEndpoint is not set`,remote:!0}));return}let t=this._buildUrl(this.wtEndpoint,e,!0);this._debug.debug(`[signaling] connecting to wt `+t),this.socket=new Ca(t,{congestionControl:`low-latency`})}else{let t=this._buildUrl(this.endpoint,e,!1);this._debug.debug(`[signaling] connecting to ws `+t),this.socket=new WebSocket(t)}this._markTransportStat(e===pr.RETRY?gr.RECONNECTED:gr.CONNECTED),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor()}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){this._debug.debug(`[signaling] socket opened`),this._logger?.log(C.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===pr.RETRY?gr.RECONNECTED:gr.CONNECTED)}_onMessage(e){if(this._startDoctor(),e.data===`ping`){this._pings?.mark(this._getSocketType()),this._markTransportStat(gr.FAILED_PINGS),L.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(`pong`);return}try{let t=JSON.parse(e.data);L.onSignalingMessage(t),this._handleMessage(t)}catch(t){this._logger?.log(C.SOCKET_ACTION,`parse_error`),this._debug.error(`[signaling] unable to parse message`,t,e.data)}}_handleMessage(e){switch(e.type){case`notification`:e.notification===`connection`?(this._debug.debug(`[signaling] signaling connected`,e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat(gr.RESTART),this._triggerEvent(mr.RECONNECT,e),e.conversation.topology&&this._triggerEvent(mr.NOTIFICATION,{type:`notification`,notification:G.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===G.ACCEPTED_CALL&&e.peerId.id===this.peerId&&e.peerId.type===`WEB_TRANSPORT`||this._handleMessage(e)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(mr.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:this._logger?.log(C.SOCKET_ACTION,`unknown_message`),this._debug.warn(`[signaling] unhandled message`,e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){this._logger?.log(C.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Ea.includes(e.error):!1;switch(this._debug.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case`service-unavailable`:let n=new O(D.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(n):this._triggerEvent(mr.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:D.SERVICE_UNAVAILABLE});break;case`conversation-ended`:this.conversationReject?this.conversationReject(new O(e.reason||x.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(mr.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:e.reason});break;case`participant-not-found`:this._throwError(Error(`Signaling error: ${e.error}`));break;default:if(!t)break;this.connected?this._throwError(Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new O(e.reason||x.SIGNALING_FAILED,{message:`Unable to connect to the signaling: ${e.error}`,remote:!0})),this._closeSocket())}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(mr.FAILED,e)}_onError(e){this._logger?.log(C.SOCKET_ACTION,`error`),this._debug.error(`[signaling] signaling error`,e),this._logTransportStat(gr.FAILED_EXCEPTIONS,{string_value:this._serializeErrorEvent(e)})}_serializeErrorEvent(e){let t=e,n=t.error instanceof Error?t.error:null;return JSON.stringify({eventType:e.type,socketType:this._getSocketType(),readyState:this.socket?.readyState,errorName:n?.name||t.errorInfo?.name,errorMessage:n?.message||t.errorInfo?.message||t.message,errorStack:n?.stack||t.errorInfo?.stack,errorInfo:t.errorInfo})}_onClose(t){if(this._logger?.log(C.SOCKET_ACTION,`closed`),this._debug.debug(`[signaling] connection closed`,{code:t.code,reason:t.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this._abortSignal?.aborted){this._debug.debug(`[signaling] aborted reconnect`),this._closeSocket(new O(D.CANCELED));return}this.socket&&this.reconnectCount++<e.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new O(D.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let t=Math.min(e.RECONNECT_MAX_DELAY,e.RECONNECT_DELAY*2**(this.reconnectCount-1));this._debug.log(`[signaling] reconnect websocket after ${t}ms (${this.reconnectCount})`),this._logger?.log(C.SOCKET_ACTION,`reconnect`),this.reconnectTimer=window.setTimeout(this._connect.bind(this,pr.RETRY,!1),t)}_handleCommandResponse(t,n){if(!Object.hasOwn(this.responseHandlers,n.sequence))return;let r=this.responseHandlers[n.sequence];window.clearTimeout(r.responseTimer);let i=W.measureMark(r.statMarkName);i!==null&&this._signalingCommands?.mark(r.name,i,this._getSocketType()),this._debug.debug(`[signaling] command response [${n.sequence}]`,n),t?(delete this.responseHandlers[n.sequence],r.resolve(n)):n.type===`error`?(delete this.responseHandlers[n.sequence],this._logger?.log(C.SOCKET_ACTION,`response-error`),r.reject(Error(n.error||`Response error [${r.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],this._logger?.log(C.SOCKET_ACTION,`response-timeout`),r.reject(Error(n.error||`Response timeout [${r.name}]`))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(t,n),e.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(this._debug.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==wa){t.reject(Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let e=this._serializeBinary(t);e!==null&&this.producerCommandDataChannel.send(e)}else{if(!this.socket||this.socket.readyState!==WebSocket.OPEN){t.reject(Error(`Invalid state or socket already closed`));continue}this._startResponseTimer(t),this.socket.send(this._serializeJson(t))}}}_startResponseTimer(t){if(!t.needResponse){t.resolve({type:`response`,sequence:t.sequence,response:t.name});return}t.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:t.name,sequence:t.sequence,type:`timeout`}),e.WAIT_RESPONSE_DELAY),this.responseHandlers[t.sequence]=t}_serializeBinary(e){switch(e.name){case B.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case B.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case B.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case B.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case B.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case B.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case B.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case B.CHANGE_SIMULCAST:return this.producerCommandSerializationService.serializeChangeSimulcast(e.sequence,e.params)}return this._debug.warn(`[signaling] cannot get binary data for data channel command: `+e.name),null}_serializeJson(e){let t;t=e.name===B.UPDATE_DISPLAY_LAYOUT?this._convertDisplayLayout(e.params):e.params;let n=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(n)}_convertDisplayLayout(e){let t=e,n={};for(let e in t)Object.hasOwn(t,e)&&(n[e]=wn(t[e]));return{layouts:n}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new O(x.SIGNALING_FAILED,{message:`Unable to connect to the signaling: connection timeout`,remote:!0}))},e.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=e.RECONNECT_MAX_COUNT)&&(this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?this._debug.warn(`[signaling] socket is dead. Fallback to WebSocket. Trying to connect ${this.reconnectCount}`):this._debug.warn(`[signaling] socket is dead, trying to reconnect ${this.reconnectCount}`),this._logTransportStat(gr.FAILED_PINGS),this._disconnect(4e3),this._connect(pr.RETRY,!1),this.reconnectCount++},e.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return Ca.isBrowserSupported()&&this.wtEndpoint!==null&&M.webtransport}_getSocketType(){return this.socket instanceof Ca?hr.WEBTRANSPORT:hr.WEBSOCKET}_markTransportStat(e){let t=this._getSocketType(),n=_r[e][t];W.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=_r[e][n];this._statAggregator?.logEventualStat({name:r,...t})}},Y=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(Y||{}),Oa=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(Oa||{}),ka=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(ka||{}),Aa=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(Aa||{}),ja=function(e){return e.REQUIRE_AUTH_TO_JOIN=`REQUIRE_AUTH_TO_JOIN`,e.AUDIENCE_MODE=`AUDIENCE_MODE`,e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.ADMIN_IS_HERE=`ADMIN_IS_HERE`,e.ASR=`ASR`,e.FEEDBACK=`FEEDBACK`,e.RECURRING=`RECURRING`,e}(ja||{});function Ma(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function Na(e,t){let n=new Set(e);for(let[e,r]of Object.entries(t))r?n.add(e):n.delete(e);return Array.from(n)}var Pa=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(Pa||{}),X=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(X||{}),Fa=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(Fa||{}),Ia=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(Ia||{});function La(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var Ra=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}(Ra||{});function za(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var Ba=function(e){return e.USER=`USER`,e.ANONYM=`ANONYM`,e.GROUP=`GROUP`,e}({}),Z;(function(e){function t(e){return e.length?typeof e[0]==`object`?e:e.map(e=>n(e)):[]}e.fromIds=t;function n(e,t=`USER`,n=0){return{id:e,type:t,deviceIdx:n}}e.fromId=n;function r(e,t=!0){let n=t?e.decorativeExternalUserId:e.externalId,r=e.deviceIdx??0;if(n)return i(n,r)}e.fromSignalingParticipant=r;function i(e,t=0){return{id:e.id,type:e.type===`ANONYM`?`ANONYM`:`USER`,deviceIdx:t}}e.fromSignaling=i;function a(e){return e.id}e.toSignaling=a;function o(e){let t=e.deviceIdx||0;return`{"id":"${e.id}","type":"${e.type}","deviceIdx":${t}}`}e.toString=o;function s(e,t=`USER`,r=0){return o(n(e,t,r))}e.fromIdToString=s;function c(e){try{return JSON.parse(e)}catch{throw Error(`Failed to parse ExternalId from string '${e}'`)}}e.fromString=c;function l(e,t){return e.id===t.id&&e.type===t.type&&e.deviceIdx===t.deviceIdx}e.compare=l;function u(e){return e?.deviceIdx||0}e.getDeviceIdx=u})(Z||(Z={}));function Va(e){try{return btoa(JSON.stringify(e))}catch(t){R.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function Ha(e){try{return JSON.parse(atob(e))}catch(t){R.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var Ua=(e,t)=>j.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function Wa(e){if(e.conversation?.muteStates)return e.conversation.muteStates;if(e.muteState&&e.muteOptions)return e.muteOptions.reduce((t,n)=>(t[n]=e.muteState,t),{})}function Ga(e,t){switch(e){case S.AUDIO:return!!t.isAudioEnabled;case S.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case S.VIDEO:return!!t.isVideoEnabled;case S.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function Ka(e,t){return j.objectReduce(e,(e,n,r)=>{switch(n){case Pa.MUTE:case Pa.MUTE_PERMANENT:Ga(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function qa(e){let{muteStates:t={},mediaSettings:n}=e;return Ka(t,n)}function Ja(e,t){let n=e.conversation.participants.find(t=>j.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return Ka(t,r)}function Ya(e,t){let n=new Uint8Array(t),r=0,i=0;for(;r<e.length&&i<t;){let a=e[r++],o=a>>4,s=a&15;if(o===15){let t;do t=e[r++],o+=t;while(t===255)}for(let a=0;a<o&&!(i>=t);a++)n[i++]=e[r++];if(r>=e.length||i>=t)break;let c=e[r]|e[r+1]<<8;if(r+=2,s===15){let t;do t=e[r++],s+=t;while(t===255)}s+=4;let l=i-c;for(let e=0;e<s&&!(i>=t);e++)n[i++]=n[l+e]}return n}var Xa=class{constructor(e,t=R,n=null){h(this,`_fixNoPacketsApplied`,!1),h(this,`_fixNoPacketsChecked`,!1),h(this,`_fixTooManyPacketsApplied`,!1),h(this,`_fixTooManyPacketsSucceeded`,!1),h(this,`_fixTooManyPacketsFailed`,!1),h(this,`_fixTooManyPacketsTime`,void 0),h(this,`_mediaSource`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_lastPacketsSent`,void 0),h(this,`_lastPacketsSentTime`,void 0),h(this,`_toggleAudioPromise`,null),h(this,`_fixNoPacketsAppliedVideo`,!1),this._mediaSource=e,this._debug=t,this._logger=n}_fixAudioDeviceNoPackets(e){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,this._logger?.log(C.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&(this._fixNoPacketsApplied=!0,this._logger?.log(C.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (no packets)`),this._toggleAudioPromise=this._mediaSource.toggleAudio(T.getMicrophonePermissionState()!==`denied`),this._toggleAudioPromise.catch(()=>void 0))}}_fixAudioDeviceTooManyPackets(e){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let t=Date.now();if(!this._lastPacketsSentTime)e.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent);else if(t-this._lastPacketsSentTime>500){let n=(e.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent,this._fixTooManyPacketsApplied?n>75?(this._debug.log(`[AudioFix] Failed to fix RV`),this._logger?.log(C.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(this._debug.log(`[AudioFix] Fixed RV`),this._logger?.log(C.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,this._logger?.log(C.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (too many packets)`),this._mediaSource.toggleAudio(!0).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (too many packets)`,e)}),this._fixTooManyPacketsTime=t)}}fix(e){if(!this._mediaSource)return;let t=e.find(e=>e.kind===k.audio);t&&(this._fixAudioDeviceNoPackets(t),this._fixAudioDeviceTooManyPackets(t))}fixVideo(e){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let t=e.find(e=>e.kind===k.video);t&&!t.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.mediaSettings.isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (no packets): video restart`,e)}))}},Za=class{constructor(e,t=!1,n=R,r=null){h(this,`_audioElement`,null),h(this,`_audioTracks`,new Map),h(this,`_allowMultipleTracks`,void 0),h(this,`_volume`,1),h(this,`_features`,{setSinkId:!!Audio.prototype.setSinkId}),h(this,`_statFirstMediaReceived`,void 0),h(this,`_debug`,void 0),h(this,`_logger`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t,this._debug=n,this._logger=r}add(e,t){this._allowMultipleTracks||this._clearTracks();let n=this._audioTracks.get(e);n&&n!==t&&(this._removeTrackFromAudioElement(n),n.stop()),this._audioTracks.set(e,t),this._audioElement?this._addTrackToAudioElement(t):this._initAudioElement()}remove(e,t){let n=this._audioTracks.get(e);if(!n){t.stop();return}if(n!==t){t.stop();return}if(!this._allowMultipleTracks){this.destroy();return}this._removeTrackFromAudioElement(t),t.stop(),this._audioTracks.delete(e),this._audioTracks.size||this.destroy()}get volume(){return this._volume}set volume(e){this._volume=Math.max(0,Math.min(1,e)),this._audioElement&&(this._audioElement.volume=this._volume)}destroy(){!this._audioElement&&!this._audioTracks.size||(this._stopAudioElement(),this._audioElement=null,this._audioTracks.clear())}async changeOutput(){try{if(!this._features.setSinkId)throw Error(`Feature "setSinkId" is not supported`);if(!this._audioElement)return;let e=T.getSavedOutput();e&&await this._audioElement.setSinkId?.(e.deviceId)}catch(e){throw this._logger?.log(C.ERROR,`change_output`),this._debug.error(`[audio] Output change failed`,e),e}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(M.muteMode)return;let e=this._getTracks();if(!e.length)return;let t=T.browserName()!==`Safari`||T.isMobile(),n=document.createElement(t?`audio`:`video`);n.muted=!1,n.volume=this._volume,n.preload=`auto`;let r=()=>{this._debug.warn(`[audio] Error on play audio`),L.onAutoplayError()},i=e=>{this._debug.debug(`[audio] Play audio`),n.srcObject=null,n.srcObject=new MediaStream(e),n.load();let t=n.play();t&&t.catch(r)},a=()=>{this._debug.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?i(e):this._debug.warn(`[audio] Broken audio tracks`)};n.onpause=a,n.onstalled=a,n.onerror=a,n.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(e),this._audioElement=n}_stopAudioElement(){this._audioElement&&(this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_addTrackToAudioElement(e){if(!this._audioElement)return;this._debug.debug(`[audio] Adding track ${e}`);let t=this._audioElement.srcObject;t||(t=new MediaStream,this._audioElement.srcObject=t),t.addTrack(e)}_removeTrackFromAudioElement(e){this._audioElement?.srcObject&&(this._debug.debug(`[audio] Removing track ${e}`),this._audioElement.srcObject.removeTrack(e))}_clearTracks(){for(let e of this._audioTracks.values())this._removeTrackFromAudioElement(e),e.stop();this._audioTracks.clear()}},Qa=90,$a=3,eo=class extends b{constructor(e=R){super(),h(this,`_lastMemoryStat`,{percent:0,bytes:0}),h(this,`_debug`,void 0),this._debug=e}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(e=>{e.userId=(typeof e.userId==`string`&&t[e.userId]||null)?.externalId}),L.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),n=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>Qa?this._debug.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=$a)&&(this._debug.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},to=class{constructor({api:e,debug:t,getParticipants:n,isMe:r,updateDisplayLayout:i}){h(this,`_api`,void 0),h(this,`_debug`,void 0),h(this,`_getParticipants`,void 0),h(this,`_isMe`,void 0),h(this,`_updateDisplayLayout`,void 0),h(this,`_requestedLayouts`,{}),h(this,`_uncertainLayouts`,{}),h(this,`_pendingRequests`,null),h(this,`_pendingPromises`,[]),h(this,`_lastRequests`,null),h(this,`_timer`,null),h(this,`_inFlight`,!1),h(this,`_lastFlushAt`,null),h(this,`_generation`,0),h(this,`_forceNextFlush`,!1),this._api=e,this._debug=t,this._getParticipants=n,this._isMe=r,this._updateDisplayLayout=i}request(e){this._pendingRequests=e.slice(),this._lastRequests=e.slice();let t=new Promise((e,t)=>{this._pendingPromises.push({resolve:e,reject:t})});return this._schedule(),t}resend(){this._lastRequests&&(this._pendingRequests=this._lastRequests.slice(),this._forceNextFlush=!0,this._schedule())}cleanupParticipant(e){for(let t of Object.keys(this._requestedLayouts))On(t).participantId===e&&delete this._requestedLayouts[t];for(let t of Object.keys(this._uncertainLayouts))On(t).participantId===e&&delete this._uncertainLayouts[t]}clear(){this._generation++,this._timer!==null&&(window.clearTimeout(this._timer),this._timer=null),this._pendingPromises.forEach(({resolve:e})=>e()),this._requestedLayouts={},this._uncertainLayouts={},this._pendingRequests=null,this._pendingPromises=[],this._lastRequests=null,this._inFlight=!1,this._lastFlushAt=null,this._forceNextFlush=!1}_schedule(){if(this._inFlight||this._timer!==null)return;let e=this._lastFlushAt===null?0:Math.max(0,M.requestDisplayLayoutThrottleMs-(Date.now()-this._lastFlushAt));this._timer=window.setTimeout(()=>{this._timer=null,this._flush()},e)}async _flush(){if(this._inFlight||!this._pendingRequests)return;this._inFlight=!0;let e=this._generation,t=this._pendingRequests,n=this._pendingPromises;this._pendingRequests=null,this._pendingPromises=[];let r={};try{r=await this._getRequestLayouts(t);let i=this._forceNextFlush||Object.keys(this._uncertainLayouts).length>0;this._forceNextFlush=!1;let a=this._getDiff(r,i);a.length&&await this._updateDisplayLayout(a),e===this._generation&&(this._requestedLayouts=r,this._uncertainLayouts={}),n.forEach(({resolve:e})=>e())}catch(t){e===this._generation?(this._uncertainLayouts={...this._uncertainLayouts,...r},n.forEach(({reject:e})=>e(t))):n.forEach(({resolve:e})=>e())}finally{e===this._generation&&(this._lastFlushAt=Date.now(),this._inFlight=!1,this._pendingRequests&&this._schedule())}}async _getRequestLayouts(e){let t={},n=await this._getParticipants();for(let r of e){let e=typeof r.uid==`object`?r.uid:Z.fromId(r.uid),i=this._api.getCachedOkIdByExternalId(e);if(!i){this._debug.log(`Unknown participant external ID ${typeof r.uid==`object`?Z.toString(r.uid):r.uid}`);continue}if(!n[i]&&!this._isMe(i))continue;let a=Dn({participantId:i,mediaType:r.mediaType,streamName:r.streamName});t[a]={uid:r.uid,mediaType:r.mediaType,width:r.width,height:r.height,fit:r.cover?`cv`:`cn`,...r.priority===void 0?{}:{priority:r.priority},...r.streamName===void 0?{}:{streamName:r.streamName}}}return t}_getDiff(e,t=!1){let n=[];if(t){let t={...this._requestedLayouts,...this._uncertainLayouts};n.push(...Object.values(e));for(let[r,i]of Object.entries(t))e[r]||n.push({uid:i.uid,mediaType:i.mediaType,stopStream:!0,...i.streamName===void 0?{}:{streamName:i.streamName}});return n}for(let[t,r]of Object.entries(e)){let e=this._requestedLayouts[t];(!e||this._isChanged(e,r))&&n.push(r)}for(let[t,r]of Object.entries(this._requestedLayouts))e[t]||n.push({uid:r.uid,mediaType:r.mediaType,stopStream:!0,...r.streamName===void 0?{}:{streamName:r.streamName}});return n}_isChanged(e,t){let n=e,r=t;return n.width!==r.width||n.height!==r.height||n.fit!==r.fit||n.priority!==r.priority}},no=44100,ro=class{constructor(e,t){h(this,`_analyser`,null),h(this,`_gainNode`,null),h(this,`_fftBins`,null),h(this,`_mediaStreamSource`,null),h(this,`_lastSmoothedLevel`,0),h(this,`_trackId`,void 0),h(this,`_track`,void 0),h(this,`_stream`,void 0),this._trackId=e,this._track=t,this._stream=new MediaStream([t]);try{let e=T.getAudioContext();this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),this._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=e.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let e=no/this._fftBins.length,t=Math.ceil(M.voiceParams.minFreq/e),n=Math.floor(M.voiceParams.maxFreq/e);return this._fftBins.subarray(t,n)}getLevel(){let e=this._getBins(),t=e.reduce((e,t)=>e+t,0)/e.length/255,n=this._lastSmoothedLevel*M.voiceParams.smoothing+t*(1-M.voiceParams.smoothing);return this._lastSmoothedLevel=n,{real:t,smoothed:n}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}},io=class extends b{constructor(e){super(),h(this,`_detector`,null),h(this,`_interval`,null);let t=()=>{this._detector&&L.onLocalVolume(this._detector.getLevel().real,e.mediaSettings.isAudioEnabled),this._interval=window.setTimeout(t,M.voiceParams.interval)};this._interval=window.setTimeout(t,M.voiceParams.interval);let n=()=>{let t=e.getSendAudioTrack();t&&this.init(t)};this.subscribe(e,Jt.SOURCE_CHANGED,t=>{t.kind===k.audio&&e.mediaSettings.isAudioEnabled&&n()}),this.subscribe(e,Jt.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new ro(`local`,e.clone())}_stopDetector(){this._detector&&(this._detector.track.stop(),this._detector.destroy(),this._detector=null)}destroy(){this.unsubscribe(),this._interval&&(window.clearTimeout(this._interval),this._interval=null),this._stopDetector()}},ao=class{constructor(e,t=R){h(this,`processor`,void 0),h(this,`queue`,[]),h(this,`isProcessing`,!1),h(this,`_debug`,void 0),this.processor=e,this._debug=t}add(e){this.queue.push(e),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let e=this.queue.shift();if(e)try{await this.processor(e)}catch{this._debug.error(`Can't process message ${JSON.stringify(e)}`)}}this.isProcessing=!1}}},oo=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),so=class extends b{constructor(e){super(),h(this,`_detectors`,new Map),h(this,`_interval`,null),h(this,`_activeParticipants`,void 0),h(this,`_removedParticipants`,void 0),h(this,`_topology`,void 0),this._topology=e.getTopology(),this.subscribe(e,J.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(e,J.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,J.SIGNALLED_ACTIVE_PARTICIPANTS,this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,J.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._destroyDetectors()}_onRemoteTrackAdded(e,t,n){if(n.kind===k.audio&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new ro(e,n)),!this._interval)){let e=()=>{this._collectVolumes(),this._interval=window.setTimeout(e,M.voiceParams.interval)};this._interval=window.setTimeout(e,M.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,n){if(n.kind!==k.audio)return;let r=this._detectors.get(e);!r||r.track!==n||(r.destroy(),this._detectors.delete(e))}_collectVolumes(){if(!this._detectors.size)return;let e={};if(this._topology===q.SERVER){if(this._activeParticipants)for(let t of this._activeParticipants){let n=this._getAudioTrackLevelByParticipantId(t);n&&(e[t]=n)}if(this._removedParticipants){for(let t of this._removedParticipants)e[t]={real:0,smoothed:0};this._removedParticipants=null}}else for(let[t,n]of this._detectors.entries())e[t]=n.getLevel();this._triggerEvent(`VOLUMES_DETECTED`,e)}_getAudioTrackLevelByParticipantId(e){if(this._isTransparentAudioMode())return this._getTransparentAudioLevelByParticipantId(e);let t=this._detectors.get(Br.AUDIO_MIX);return t?t.getLevel():null}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((e,n)=>{if(!n.startsWith(`${Br.TRANSPARENT_AUDIO_TRACK_PREFIX}-`))return;let r=e.getLevel();(!t||r.real>t.real)&&(t=r)}),t}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){this._topology=e,this._destroyDetectors(),e===q.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology===q.SERVER&&M.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},co=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),lo=class extends b{constructor(e,t,n){super(),h(this,`_speakerId`,null),h(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===q.SERVER,this.subscribe(e,oo.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this.subscribe(t,J.SIGNALLED_SPEAKER_CHANGED,this._onServerSpeakerChanged.bind(this)),this.subscribe(t,J.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,n=null;if(Object.keys(e).forEach(r=>{let i=e[r].smoothed;i>t&&i>M.voiceParams.threshold&&(t=i,n=r)}),n&&n!==this._speakerId){let r=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>r*M.voiceParams.speakerLevelMultiplier&&(this._speakerId=n,this._triggerEvent(`SPEAKER_CHANGED`,n))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent(`SPEAKER_CHANGED`,e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e===q.SERVER}},uo=15e3,fo=15e3,po=class extends b{constructor(e,t,n,r=R,i=null){super(),h(this,`_transport`,void 0),h(this,`_volumes`,{}),h(this,`_participants`,{}),h(this,`_debug`,void 0),h(this,`_logger`,void 0),h(this,`_connectionTimeout`,0),h(this,`_volumeTimeout`,0),this._transport=e,this._participants=n,this._debug=r,this._logger=i,this.subscribe(e,J.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(t,oo.VOLUMES_DETECTED,this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_getConnectionTimeout(){return this._transport.getTopology()===q.DIRECT?uo:M.specListenerParams.connectionTimeout}_getVolumeTimeout(){return this._transport.getTopology()===q.DIRECT?fo:M.specListenerParams.volumeTimeout}_onTransportStateChanged(e,t){t===K.OPENED&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),this._getConnectionTimeout()))),t===K.CONNECTED&&(this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),this._getVolumeTimeout())),this._volumeTimeout&&(window.clearTimeout(this._volumeTimeout),this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),this._getVolumeTimeout()))),t===K.FAILED&&this._connectionTimeout&&(this._debug.warn(`Transport failed, send callSpecError`),this._logger?.log(C.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){Object.values(this._transport.getStates()).filter(e=>e!==K.CONNECTED).length>0&&(this._debug.warn(`There is not connected transport, send callSpecError`),this._logger?.log(C.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let n=`UNKNOWN`,r=this._participants[t];r&&r.platform&&(n=r.platform),e.indexOf(n)<0&&(e.push(n),this._logger?.log(C.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&this._debug.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},mo=class extends m{constructor(e,t,n){super(),h(this,`_externalLogger`,void 0),h(this,`_api`,void 0),h(this,`_conversationIdProvider`,void 0),h(this,`_batchInterval`,3e3),h(this,`_batchedClientStats`,[]),h(this,`_batchedClientEvents`,[]),h(this,`_batchTimeout`,null),h(this,`_serverTimeDelta`,0),this._api=e,this._externalLogger=t,this._conversationIdProvider=n,this._calculateServerTimeDelta()}log(e,t,n=!1){this._externalLogger&&this._externalLogger.log(e,t,n)}logClientStats(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(n).forEach(e=>{n[e]===void 0&&delete n[e]}),this._batchedClientStats.push(n),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(n),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout()}_getConversationId(){try{return this._conversationIdProvider()}catch{return null}}_sendBatch(){this._stopTimeout();let e=!1;this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}},ho=class{constructor(e,t){h(this,`_logger`,void 0),h(this,`_codecUsages`,new Map),h(this,`getCurrentTransportTopology`,void 0),this._logger=e,this.getCurrentTransportTopology=t}reportUsage(e){let t=this.getCurrentTransportTopology();if(!t)return;let n=e.rtps.filter(e=>e.type===`outbound-rtp`&&!e.mid?.endsWith(`s`));M.simulcast&&(n=n.reduce((e,t)=>{if(t.kind!==`video`)return e.concat(t);let n=e.find(e=>e.kind===`video`);return n?n.totalEncodeTime=(n.totalEncodeTime??0)+(t.totalEncodeTime??0):e.push(t),e},[])),n.forEach(e=>{let n=e.kind,r=e.mimeType;if((n===`audio`||n===`video`)&&r){let i=[r,`encoder`,e.encoderImplementation].filter(Boolean).join(`/`);this.saveUsage({kind:n,codecName:i,totalEncodeTime:(e.totalEncodeTime??0)*1e3,audioCodecParams:e.sdpFmtpLine,topology:t})}})}saveUsage({kind:e,codecName:t,totalEncodeTime:n,audioCodecParams:r,topology:i}){let a=this._codecUsages.get(e);if(a&&a.codecName!==t&&this.report(a),a&&a.codecName===t){this._codecUsages.set(e,{...a,totalEncodeTime:n,topology:i});return}this._codecUsages.set(e,{kind:e,codecName:t,audioCodecParams:r,totalEncodeTime:n,topology:i})}report(e){if(e.kind===`video`&&e.totalEncodeTime===0)return;let t={name:H.CODEC_USAGE,codec_implementation:e.codecName,value:e.totalEncodeTime,call_topology:e.topology===q.DIRECT?`D`:`S`};e.audioCodecParams&&(t.string_value=e.audioCodecParams),this._logger.logClientStats(t)}destroy(){this._codecUsages.forEach(e=>{this.report(e)}),this._codecUsages.clear()}},go=class{constructor(e){h(this,`_logger`,void 0),h(this,`_eventualLogs`,new Set),this._logger=e}logCallStat(e){if(this._eventualLogs.size){for(let t of this._eventualLogs)Object.assign(t,{call_topology:e.call_topology,local_address:e.local_address,local_connection_type:e.local_connection_type,network_type:e.network_type,remote_address:e.remote_address,remote_connection_type:e.remote_connection_type,transport:e.transport}),this._logger.logClientStats(t);this._eventualLogs.clear()}this._logger.logClientStats(e)}logEventualStat(e){e.value===void 0&&(e.value=W.measureMark(e.name)),e.value!==null&&this._eventualLogs.add(e)}destroy(){this._eventualLogs.clear()}},_o=class{constructor(e){if(h(this,`q`,void 0),h(this,`inits`,[]),h(this,`n`,[1,2,3,4,5]),h(this,`np`,[1,1,1,1,1]),h(this,`qv`,[]),!(e>0&&e<1))throw Error(`q must be in (0,1)`);this.q=e}add(e){if(this.inits.length<5){this.inits.push(e),this.inits.length===5&&this.bootstrap();return}let t=0;if(e<this.qv[0])this.qv[0]=e,t=0;else if(e>=this.qv[4])this.qv[4]=e,t=3;else for(;!(e<this.qv[t+1]);)t++;for(let e=0;e<5;e++)this.n[e]+=e<=t?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let e=1;e<=3;e++){let t=this.np[e]-this.n[e];if(t>=1&&this.n[e+1]-this.n[e]>1||t<=-1&&this.n[e]-this.n[e-1]>1){let n=Math.sign(t),r=this.qv[e]+n/(this.n[e+1]-this.n[e-1])*((this.n[e]-this.n[e-1]+n)*(this.qv[e+1]-this.qv[e])/(this.n[e+1]-this.n[e])+(this.n[e+1]-this.n[e]-n)*(this.qv[e]-this.qv[e-1])/(this.n[e]-this.n[e-1]));r>this.qv[e-1]&&r<this.qv[e+1]?this.qv[e]=r:this.qv[e]=this.qv[e]+n*(this.qv[e+n]-this.qv[e])/(this.n[e+n]-this.n[e]),this.n[e]+=n}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let e=[...this.inits].sort((e,t)=>e-t),t=this.q*(e.length-1),n=Math.floor(t),r=t-n;return n+1<e.length?e[n]*(1-r)+e[n+1]*r:e[n]}return this.qv[2]}bootstrap(){this.inits.sort((e,t)=>e-t),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}},vo=class{constructor(){h(this,`n`,0),h(this,`mean`,0)}add(e){this.n++;let t=e-this.mean;this.mean+=t/this.n}get avg(){return this.n?this.mean:NaN}},yo=class{constructor(){h(this,`count`,0),h(this,`minVal`,1/0),h(this,`maxVal`,-1/0),h(this,`mean`,new vo),h(this,`p50`,new _o(.5)),h(this,`p95`,new _o(.95))}add(e){e<this.minVal&&(this.minVal=e),e>this.maxVal&&(this.maxVal=e),this.mean.add(e),this.p50.add(e),this.p95.add(e),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}},bo=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByTransport`,{ws:new yo,wt:new yo}),h(this,`lastSeen`,{}),this._logger=e}mark(e){let t=Date.now(),n=this.lastSeen[e];if(typeof n==`number`){let r=t-n;r>=0&&this.trackerByTransport[e].add(r)}this.lastSeen[e]=t}logMetrics(e){[hr.WEBSOCKET,hr.WEBTRANSPORT].forEach(t=>{if(!this.trackerByTransport[t].hasData)return;let n=this.trackerByTransport[t].snapshot();this._logger.logClientStats({call_topology:e===q.DIRECT?`D`:`S`,name:H.SIGNALING_PING_SUMMARY,min_value:n.min,max_value:n.max,avg_value:n.avg,median_value:n.median,p95_value:n.p95,values_count:n.count,signaling_transport:t})})}destroy(){this.trackerByTransport={ws:new yo,wt:new yo},this.lastSeen={}}},xo=class{constructor(e){h(this,`_logger`,void 0),h(this,`trackerByCommand`,new Map),this._logger=e}mark(e,t,n){let r=`${e}|${n}`,i;this.trackerByCommand.has(r)?i=this.trackerByCommand.get(r):(i=new yo,this.trackerByCommand.set(r,i)),i.add(t)}logMetrics(e){for(let[t,n]of this.trackerByCommand.entries()){if(!n.hasData)continue;let[r,i]=t.split(`|`),a=n.snapshot();this._logger.logClientStats({call_topology:e===q.DIRECT?`D`:`S`,name:H.SIGNALING_COMMAND_SUMMARY,api_method:r,min_value:a.min,max_value:a.max,avg_value:a.avg,median_value:a.median,p95_value:a.p95,values_count:a.count,signaling_transport:i})}}destroy(){this.trackerByCommand.clear()}},So=class e{constructor(e,t,n,r){h(this,`logger`,void 0),h(this,`statAggregator`,void 0),h(this,`codecStatsAggregator`,void 0),h(this,`pings`,void 0),h(this,`signalingCommands`,void 0),this.logger=new mo(e,t,n),this.statAggregator=new go(this.logger),this.codecStatsAggregator=new ho(this.logger,r),this.pings=new bo(this.logger),this.signalingCommands=new xo(this.logger)}logHangup(t,n){if(![D.HUNGUP,D.CANCELED,D.REJECTED,D.FAILED,D.BUSY,D.MISSED,D.ANOTHER_DEVICE,D.REMOVED,D.BANNED,D.VCHAT_DETAILED_ERROR].includes(t.hangup))return;let r=t.custom_error?.vchat_detailed_api_error?.code;this.logger.logClientStats({name:H.CALL_FINISH,reason:e.correctHangupReason(t.hangup),call_topology:n===q.DIRECT?`D`:`S`,...r&&{string_value:r}})}flushCallMetrics(e){this.codecStatsAggregator.destroy(),this.pings.logMetrics(e),this.pings.destroy(),this.signalingCommands.logMetrics(e),this.signalingCommands.destroy()}destroy(){this.statAggregator.destroy(),this.codecStatsAggregator.destroy(),this.pings.destroy(),this.signalingCommands.destroy(),this.logger.destroy()}static correctHangupReason(e){switch(e){case D.HUNGUP:return`hangup`;case D.CANCELED:return`canceled`;case D.REJECTED:return`rejected`;case D.BUSY:return`busy`;case D.FAILED:return`failed`;case D.MISSED:return`missed`;case D.ANOTHER_DEVICE:return`another_device`;case D.REMOVED:return`removed`;case D.BANNED:return`banned`;case D.VCHAT_DETAILED_ERROR:return`error`;default:return`hangup`}}},Co=class{constructor(e){h(this,`_statAggregator`,void 0),h(this,`_isCallMarked`,!1),h(this,`_isFinished`,!1),h(this,`_callType`,null),this._statAggregator=e}markAcceptCall(e){this.mark(e===q.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===q.DIRECT&&this.mark(`direct_outgoing`)}markParticipantJoined(e){e===q.DIRECT&&this.mark(`server_change_topology`)}markOnJoin(e){e===q.SERVER&&this.mark(`server_join_server`)}mark(e){this._isCallMarked||(this._isCallMarked=!0,this._callType=e,W.setMark(H.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&this._statAggregator.logEventualStat({name:H.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},wo=1e3,To=1e4,Eo=15,Q=class e extends b{constructor(e,t){super(),h(this,`_api`,void 0),h(this,`_signaling`,void 0),h(this,`_signalingActor`,void 0),h(this,`_displayLayoutRequester`,void 0),h(this,`_mediaSource`,null),h(this,`_conversation`,null),h(this,`_myLastRequestedLayouts`,{}),h(this,`_state`,`IDLE`),h(this,`_previousState`,null),h(this,`_participantState`,X.CALLED),h(this,`_participants`,{}),h(this,`_pendingParticipants`,new Map),h(this,`_transport`,null),h(this,`_debugInfo`,null),h(this,`_debug`,R.createSessionLogger()),h(this,`_volumesDetector`,null),h(this,`_speakerDetector`,null),h(this,`_localVolumeDetector`,null),h(this,`_specListener`,null),h(this,`_activeSpeakerId`,null),h(this,`_lastSignalledActiveSpeakerId`,null),h(this,`_isRealTimeAsrRequested`,!1),h(this,`_serverSettings`,Tr()),h(this,`_serverTimeOffset`,0),h(this,`_delayedHangup`,!1),h(this,`_abortController`,null),h(this,`_onUnload`,void 0),h(this,`_audioOutput`,void 0),h(this,`_stats`,void 0),h(this,`_lastStalled`,{}),h(this,`_audioMixStalled`,!1),h(this,`_audioFix`,null),h(this,`_streamByStreamId`,new Map),h(this,`_streamIdByStreamDescription`,new Map),h(this,`_streamWaitTimerByStreamDescription`,new Map),h(this,`_sequenceNumberByStreamDescription`,new Map),h(this,`_cooldownTimestampByStreamDescription`,new Map),h(this,`_cooldownQueueCleanupTimer`,null),h(this,`_statFirstMediaReceived`,void 0),h(this,`_changeMediaSettings`,j.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(e){if(this._debug.warn(`changeMediaSettings failed with error`,e),e.message===`chatRoom.maxShareCountExceeded`)return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100)),this._stats=new So(e,t,()=>this._conversation?.id||null,()=>this._transport?.getTopology()),this._api=e,this._signaling=new Da(this._debug,this._stats.logger,this._stats.statAggregator,this._stats.pings,this._stats.signalingCommands),this._signalingActor=new ao(this._onSignalingNotification.bind(this),this._debug),this._displayLayoutRequester=new to({api:this._api,debug:this._debug,getParticipants:()=>this._getParticipants(),isMe:e=>this._isMe(e),updateDisplayLayout:e=>this.updateDisplayLayout(e)}),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state===`IDLE`?D.CANCELED:D.HUNGUP),M.clientEventsLoggingEnabled&&this._stats.logger.logClientEvent({event_type:H.CALL_DECLINED_OR_HANGED_LOCALLY,reason:`none`},!0)),this._stats.destroy()},window.addEventListener(`pagehide`,this._onUnload),this._statFirstMediaReceived=new Co(this._stats.statAggregator),this._audioOutput=new Za(this._statFirstMediaReceived,M.transparentAudio,this._debug,this._stats.logger),M.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),wo))}static current(){return z.getActive()}static hangupAfterInit(){let e=Do;e&&e._delayedHangup===!1&&!e._conversation&&(e._delayedHangup=!0,e._abortController?.abort(new O(D.CANCELED)))}static id(){return z.getActiveId()}get id(){return this._conversation?.id??``}get externalId(){return this._conversation?.externalId}get mediaSettings(){return this._mediaSource?.mediaSettings}get isCallHeld(){return this._state===`HELD`}static debugSessionId(){return e.current()?.debugSessionId??null}static getSyncedTime(){return Date.now()+(e.current()?._serverTimeOffset??0)}get debugSessionId(){return this._debug.sessionId}async onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r=``,joiningAllowed:i=!1,requireAuthToJoin:a=!1,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l}){let u=Date.now();this._debug.setConversationId(l??null),Do=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(n);let d=this._mediaSource.mediaSettings;t===Oa.CHAT||e&&e.length>1?this._logWithMediaSettings(C.OUTGOING_MULTIPARTY_CALL,d):this._logWithMediaSettings(C.OUTGOING_CALL,d);let f=await this._startConversation({opponentIds:e,opponentType:t,direction:Y.OUTGOING,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,startedTime:u,onFastStart:c,conversationId:l});if(!this._conversation)throw new O(D.UNKNOWN_ERROR);if(this._participantState=X.ACCEPTED,this._changeMediaSettings(d),await this._processConnection(f),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._delayedHangup)throw new O(D.CANCELED);return this._debug.debug(`Outgoing call`,{opponentIds:e,opponentType:t,mediaOptions:n}),await this._processConnectionSharedMovieInfo(f),await this._processConversationUrlSharingInfo(f),L.onLocalStream(this._mediaSource.getStream(),this._mediaSource.mediaSettings,this.id),L.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),void 0,this.id),await this._onConversationParticipantListChunk(f),await this._processPinnedParticipants(f),L.onLocalStatus(N.WAITING,this.id),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),z.add(this),await z.setActive(this.id),Do=null,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(e){throw Do=null,this._close(e,`Unable to start conversation`),e}}async onJoin(e){let t=Date.now();Do=this,this._state=`PROCESSING`,this._debug.setConversationId(e.conversationId??null),this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let n=!!e.observedIds?.length;if(n&&M.videoTracksCount>0)throw this._debug.error(`Observer mode: please set videoTracksCount=0`),new O(D.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!n);let r=this._mediaSource.mediaSettings;this._logWithMediaSettings(C.JOIN_CONVERSATION,r);let i=await this._joinConversation(e,t);if(!this._conversation)throw new O(D.UNKNOWN_ERROR);return this._conversation.observer=n,L.onLocalStream(this._mediaSource.getStream(),r,this.id),this._conversation.waitForAdmin||this._conversation.waitingHall?(this._debug.log(this._conversation.waitForAdmin?`Wait for admin`:`In waiting hall`),z.add(this),Do=null,this._signaling.readyToSend(),L.onLocalStatus(this._conversation.waitForAdmin?N.WAIT_FOR_ADMIN:N.WAITING_HALL,this.id),this._conversation):this._onJoinPart2(i)}catch(e){throw Do=null,this._close(e,`Unable to join conversation`),e}}async _onJoinPart2(e){this._debug.debug(`Join conversation part 2`);try{if(this._participantState=X.ACCEPTED,!this._conversation||!this._mediaSource)throw new O(D.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.mediaSettings),await this._processConnection(e),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state===`CLOSE`)return this._conversation;if(this._delayedHangup)throw new O(D.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);L.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),t,this.id),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),L.onLocalStatus(N.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),z.has(this.id)||z.add(this),await z.setActive(this.id),Do=null;let n=this._extractLocalParticipantFromConnection(e);if(n){let e=j.mapParticipantState(n);Object.keys(e).length>0&&L.onLocalParticipantState(e,!1,this.id)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(e){throw Do=null,this._close(e,`Unable to join conversation`),e}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(e=>!!e)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let n={rooms:await this._extractExternalRooms(e)};return t&&(n.roomId=t),n}async onPush(e,t=A.USER,n,r,i){if(z.has(e))throw new O(D.HAS_ACTIVE_CALL);this._debug.setConversationId(e),Do=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let a=Date.now(),o=await this._prepareConversation(e,t,n,r,i);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new O(D.UNKNOWN_ERROR);if(!o.conversation.participants.find(e=>e.state===X.CALLED&&e.id===this._conversation?.userId))throw this._debug.log(`Push rejected (there is an active call)`),this._stats.logger.log(C.PUSH,`rejected`),new O(D.REJECTED);if(await this._processConnection(o),this._extractConnectionUrlSharingInfo(o),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(o),this._signaling.readyToSend(),this._logCallStartEvent(a,Y.INCOMING),this._stats.logger.log(C.PUSH,`accepted`),z.add(this),Do=null,this._delayedHangup)throw new O(D.CANCELED)}catch(e){throw Do=null,this._close(e,`Unable to handle inbound call push`),e}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(ja.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(ja.WAIT_FOR_ADMIN),n=e.conversation.options.includes(ja.ADMIN_IS_HERE);return!t||t&&n?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(t=>j.comparePeerId(t.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(ja.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new O(D.UNKNOWN_ERROR);this._state=`PROCESSING`;let e=this._mediaSource.mediaSettings;this._logWithMediaSettings(C.ACCEPT_CONCURRENT,e),this._debug.debug(`Concurrent call`,{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.mediaSettings),L.onCallAccepted(this.id),this._state=`ACTIVE`,this._participantState=X.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(e){this._close(e,`Unable to accept concurrent call`)}}async _getMainRoomParticipants(){let e=await this._getParticipants();return j.mapSharedParticipants(Object.values(e).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,n]=e.split(`:`),r=parseInt(t,10);if(isNaN(r))throw Error(`Invalid original length in prefix`);let i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);try{let e=Ya(a,r).reduce((e,t)=>(e+=String.fromCharCode(t),e),``),{srcp:t,stne:n,tkn:i,trne:o,trnp:s,trnu:c,wse:l,wte:u}=JSON.parse(e);return{token:i,endpoint:l,wt_endpoint:u,turn_server:{urls:o.split(`,`),username:c,credential:s},stun_server:{urls:n.split(`,`)},client_type:t}}catch(e){throw this._close(e,`Can't decompress conversation params`),e}}_logCallStartEvent(e,t){let n={[Y.OUTGOING]:`outgoing`,[Y.INCOMING]:`incoming`,[Y.JOINING]:`join`};this._stats.statAggregator.logEventualStat({name:H.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[n[t],`warmup_start`]})})}async accept(e){if(this._state!==`IDLE`)throw this._stats.logger.log(C.ERROR,`acceptIncoming`),this._debug.error(`Unable to accept a call - invalid state`),Error(`Unable to accept a call - invalid state`);if(!this._mediaSource||!this._conversation||!this._transport)throw new O(D.UNKNOWN_ERROR);this._state=`PROCESSING`,this._debug.setConversationId(this._conversation.id),this._debug.debug(`Accept incoming call`,e);try{await this._mediaSource.request(e);let t=this._mediaSource.mediaSettings;this._logWithMediaSettings(C.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=X.ACCEPTED;let n=this._getMuteStatesForCurrentRoom(),r=Object.keys(n);r.length&&this._onMuteParticipant({muteStates:n,mediaOptions:r,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let i=await this._signaling.getRooms(this._isCallAdmin());if(i.rooms?.rooms){let e=await this._getParticipants();i.rooms.rooms.forEach(t=>{t.participantIds?.forEach(t=>{e[t]&&(e[t].isInRoom=!0)})})}this._conversation.roomId=i.rooms?.roomId||null;let a=await this._extractExternalRoomsData(i.rooms?.rooms,i.rooms?.roomId);if(L.onCallAccepted(this.id),L.onLocalStream(this._mediaSource.getStream(),t,this.id),L.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),a,this.id),M.useParticipantListChunk){let e=await this._getInitialParticiapntListChunk(),t=await this._getParticipants();e?.participants?.forEach(e=>{let n=t[j.composeId(e)];n&&(n.movieShareInfos=e.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:e})}return L.onLocalStatus(N.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0),await this._processConversationUrlSharingInfo(),await this._processConnectionAsrInfo(),z.setActive(this.id),this._conversation}catch(e){throw this._close(e,`Unable to accept call`),e}}async decline(){if(this._state!==`IDLE`)throw this._stats.logger.log(C.ERROR,`declineIncoming`),this._debug.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);this._state=`PROCESSING`,this._debug.debug(`Decline incoming call`),this._logWithMediaSettings(C.DECLINE_INCOMING,this.mediaSettings),this._participantState=X.HUNGUP,this._signaling.ready&&await this._signaling.hangup(D.REJECTED),this._close(new O(D.REJECTED))}async hangup(){this._debug.debug(`Hangup`);let e=this._state===`ACTIVE`?D.HUNGUP:D.CANCELED;this._stats.logger.log(C.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new O(e))):L.onHangup(new O(D.HUNGUP),this._conversation&&this._conversation.id),this._conversation?.id&&z.has(this._conversation.id)&&z.remove(this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new O(D.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipant(e.map(Z.toSignaling),t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:D.UNKNOWN_ERROR);let i=n.participants;if(!i&&n.rejectedParticipants)throw Error(n.rejectedParticipants[0].reason);for(let e of i)await this._onAddParticipant(j.composeId(e),e,r)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new O(D.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipantLegacy(e,t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:D.UNKNOWN_ERROR);let i=n.participants;for(let e of i)await this._onAddParticipant(j.composeId(e),e,r)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let n=[];for(let r of e)(r.state===X.CALLED||r.state===X.ACCEPTED)&&(this._transport.isAllocated(r.id)||this._transport.allocate(r.id,t)),r.state===X.ACCEPTED&&n.push(r.id);n.length?this._transport.open(n,null,!!this._conversation?.observer):this._transport.getTopology()===q.SERVER&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&this._debug.error(t,e),this._debug.debug(`Close conversation`,e),this._stats.logHangup(e,this._transport?.getTopology()),this._stats.flushCallMetrics(this._transport?.getTopology()),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(D.FAILED):this._stats.logger.log(C.ERROR,e.hangup);let n=this._conversation&&this._conversation.id;if([D.CANCELED,D.NOT_FRIENDS,D.CALLEE_IS_OFFLINE,D.CALLER_IS_BLOCKED,D.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===D.REJECTED&&!e.remote){L.onHangup(e,n),this.destroy();return}if(e.hangup===D.HUNGUP&&(!e.remote||this._isCalledState())){L.onHangup(e,n),this.destroy();return}if(e.hangup===D.MISSED&&!e.remote){L.onHangup(e,n),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===D.SOCKET_CLOSED||e.hangup===D.NOT_FOUND)&&z.getActive()&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===D.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state=`CLOSE`,this._participantState=X.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),this._stats.destroy(),z.remove(this.id),this._conversation=null,this._myLastRequestedLayouts={},this._displayLayoutRequester.clear(),this._delayedHangup=!1,this._abortController=null,L.onHangup(e||new O(D.UNKNOWN_ERROR),n)}async destroy(){let e=this._conversation&&this._conversation.id;if(this._debug.debug(`Destroy conversation`,{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state=`CLOSE`,this._participantState=X.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),this._delayedHangup&&e)try{this._api.hangupConversation(e,D.CANCELED)}catch{}this._cleanupListeners(),this._stats.destroy(),z.remove(this.id),this._conversation=null,this._myLastRequestedLayouts={},this._displayLayoutRequester.clear(),this._delayedHangup=!1,this._abortController=null}async _getConversationParams(e){let t=await this._api.getConversationParams(e);this._debug.debug(`Api.getConversationParams`,t);let n=[],{turn_server:r,stun_server:i}=t;if(i&&n.push(i),r&&r.urls){let e=r.urls.filter((e,t,n)=>n.indexOf(e)===t);e.push(`${e[e.length-1]}?transport=tcp`),n.push({urls:e,username:r.username,credential:r.credential})}return M.iceServers=n,M.wssBase=t.endpoint,t.wt_endpoint&&(M.wtsBase=t.wt_endpoint),M.wssToken=t.token,t.client_type&&(M.clientType=t.client_type),t.external_user_type&&(M.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:n,wt_endpoint:r,token:i,client_type:a}){let o=[];if(t&&o.push(t),e&&e.urls){let t=e.urls.filter((e,t,n)=>n.indexOf(e)===t);t.push(`${t[t.length-1]}?transport=tcp`),o.push({urls:t,username:e.username,credential:e.credential})}M.iceServers=o,M.wssBase=n,M.wssToken=i,r&&(M.wtsBase=r),a&&(M.clientType=a)}_addGeoParamsToEndpoint(e,t){return t.isp_as_no&&(e+=`&ispAsNo=${t.isp_as_no}`),t.isp_as_org&&(e+=`&ispAsOrg=${t.isp_as_org}`),t.loc_cc&&(e+=`&locCc=${t.loc_cc}`),t.loc_reg&&(e+=`&locReg=${t.loc_reg}`),e}async _startConversation({opponentIds:e,opponentType:t,direction:n,mediaOptions:r,payload:i=``,joiningAllowed:a=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:s,externalIds:c,startedTime:l,onFastStart:u,conversationId:d}){let f=d??j.uuid();if(z.has(f))throw new O(D.HAS_ACTIVE_CALL);this._debug.debug(`Conversation: start`,{conversationId:f,opponentIds:e,opponentType:t,direction:n});let p=r.includes(S.VIDEO),m;if(u){let e={deviceId:this._api.deviceId(),sdkVersion:M.sdkVersion,clientAppKey:M.apiKey,platform:M.platform,protocolVersion:M.protocolVersion,domainId:M.domain,capabilities:ma.getFlags()},n=JSON.stringify(e),s;try{if(s=await u({internalParams:n,conversationId:f,externalIds:c,payload:i,opponentType:t,mediaOptions:r,isVideo:p,joiningAllowed:a,requireAuthToJoin:o},this._abortController?.signal),!s.internalCallerParams)throw new O(D.FAST_START_ERROR,{message:JSON.stringify(s)})}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new O(D.CANCELED):e instanceof O?e:e instanceof Error?new O(D.FAST_START_ERROR,{message:e.message}):new O(D.FAST_START_ERROR,{message:String(e)})}try{let e=JSON.parse(s.internalCallerParams);m={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:f,is_concurrent:e.isConcurrent,client_type:e.clientType,rejected_participants:s.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastStart`,m)}catch{throw new O(D.FAST_START_ERROR,{message:`Cannot parse internal params`})}}else m=await this._api.startConversation(f,e,t,p,i,a,o,{onlyAdminCanShareMovie:s},c),this._debug.debug(`Api.startConversation`,m);this._setConversationParams(m);let ee=await this._connectSignaling(pr.START,m);return await this._setConversation(m,ee,n),this._logCallStartEvent(l,Y.OUTGOING),ee}async _joinConversation(e,t){W.setMark(H.SIGNALING_CONNECTED);let{conversationId:n,mediaOptions:r,chatId:i,joinLink:a,observedIds:o,payload:s,onFastJoin:c}=e;if(this._debug.debug(`Conversation: join`,{conversationId:n,joinLink:a,observedIds:o}),n&&z.has(n))throw new O(D.HAS_ACTIVE_CALL);let l=r.includes(S.VIDEO),u;if(c){if(!a)throw new O(D.FAST_JOIN_ERROR,{message:`joinLink is required for fast join`});let e={deviceId:this._api.deviceId(),sdkVersion:M.sdkVersion,clientAppKey:M.apiKey,platform:M.platform,protocolVersion:M.protocolVersion,domainId:M.domain,capabilities:ma.getFlags()},t=JSON.stringify(e),n;try{if(n=await c({joinLink:a,isVideo:l,internalParams:t},this._abortController?.signal),!n.internalCallerParams||!n.conversationId)throw new O(D.FAST_JOIN_ERROR,{message:JSON.stringify(n)})}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new O(D.CANCELED):e instanceof O?e:e instanceof Error?new O(D.FAST_JOIN_ERROR,{message:e.message}):new O(D.FAST_JOIN_ERROR,{message:String(e)})}try{let e=JSON.parse(n.internalCallerParams);if(z.has(n.conversationId))throw new O(D.HAS_ACTIVE_CALL);u={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:n.conversationId,is_concurrent:e.isConcurrent,client_type:e.clientType,stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastJoin`,u)}catch{throw new O(D.FAST_JOIN_ERROR,{message:`Cannot parse internal params`})}}else if(n)u=await this._api.joinConversation(n,l,i);else if(a)u=await this._api.joinConversationByLink(a,l,o,s);else throw new O(D.UNKNOWN_ERROR);if(this._debug.debug(`Api.joinConversation`,u),u.id&&z.has(u.id))throw new O(D.HAS_ACTIVE_CALL);this._setConversationParams(u);let d=await this._connectSignaling(pr.JOIN,u);return await this._setConversation(u,d,Y.JOINING),this._logCallStartEvent(t,Y.JOINING),d}async _prepareConversation(e,t=A.USER,n,r,i){W.setMark(H.SIGNALING_CONNECTED),this._debug.debug(`Conversation: push`,{conversationId:e,type:t,peerId:n});let a=this._api.getUserId();if(!a)throw new O(D.UNKNOWN_ERROR);let o=0,s=``,c=``,l={id:e,peerId:n,endpoint:s,wt_endpoint:c,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:``};if(r){let n=this._decodeExternalConversationParams(r);this._setConversationParams(n),s=i??`${M.wssBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${M.wssToken}`,l.token=n.token,l.endpoint=s,M.wtsBase&&(c=`${M.wtsBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${M.wssToken}`,l.wt_endpoint=c)}else{let n=await this._getConversationParams(e);o=n.device_idx||0,s=i??`${M.wssBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${M.wssToken}`,s=this._addGeoParamsToEndpoint(s,n),l.token=n.token,l.endpoint=s,l.device_idx=o,M.wtsBase&&(c=`${M.wtsBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${M.wssToken}`,c=this._addGeoParamsToEndpoint(c,n),l.wt_endpoint=c)}let u=await this._connectSignaling(pr.ACCEPT,l);return z.callsLength>=M.maxParallelCalls||!M.hold&&z.callsLength>0?(this._debug.log(`Push rejected (busy)`),this._stats.logger.log(C.PUSH,`busy`),this._signaling.ready&&this._signaling.hangup(D.BUSY),Promise.reject(new O(D.BUSY))):(await this._setConversation(l,u,Y.INCOMING,t),u)}async _createParticipant(e,t){let n=Object.assign({id:null,externalId:null,mediaSettings:E(),participantState:{},state:X.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return n.externalId||(n.externalId=await this._getParticipantId(t??n.id)),this._api.cacheExternalId(t??n.id,n.externalId),t&&this._api.mapDecorativeId(t,n.id),n.observedIds?.length&&(n.externalId.observer=!0),e.markers&&(n.markers=this._denormalizeMarkers(n.id,e.markers)),n}async _getParticipantId(e){try{return await this._api.userId(e)}catch(e){throw this._close(new O(D.NETWORK_ERROR),e),e}}async _setConversation(e,t,n,r=A.USER){let{participants:i}=t.conversation;t.conversationParams?.serverTime&&(this._serverTimeOffset=t.conversationParams.serverTime-Date.now()),i.forEach(e=>{let t=j.composeId(e),n=Z.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=j.composeDecorativeId(e),i=Z.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(e.decorativeUserId,e.id))}});let a=this._api.getUserId(),o=this._extractLocalParticipantFromConnection(t),s=e.device_idx||0;if(!a){if(!o)throw new O(D.UNKNOWN_ERROR);a=Number(o.id),o.idType&&(r=o.idType),o.deviceIdx&&(s=o.deviceIdx),this._api.setUserId(a)}let c=j.composeParticipantId(a,r,s);this._conversation={userId:a,compositeUserId:c,externalId:await this._getExternalIdByParticipantId(c),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||q.DIRECT,direction:n,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:o?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},this._debug.setConversationId(t.conversation.id||e.id),this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(M.forceRelayPolicy=e.p2p_forbidden),this._stats.logger.log(C.RELAY_POLICY,M.forceRelayPolicy?`1`:`0`),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new O(D.UNKNOWN_ERROR);this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||q.DIRECT,this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1}_createMediaSource(){let e=new Xt(this._debug,this._stats.logger);return this.subscribe(e,Jt.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new Xa(e,this._debug,this._stats.logger),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,mr.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,mr.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,mr.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return this._stats.statAggregator.logEventualStat({name:H.SIGNALING_CONNECTED}),n}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(ka.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&L.onConversationParticipantListChunk(await this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)),this.id)}_createParticipantListChunk(e){return{participants:[],countBefore:0,countAfter:0,markerFound:!1,...e}}async _participantListChunkToExternalChunk(e){let t=await this._getParticipants(),n=j.mapSharedParticipants(e.participants.reduce((e,n)=>{let r=j.composeId(n);return t[r]&&e.push(t[r]),e},[]));return{...e,participants:n}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let e of t)await this._registerParticipants(e?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let n=e[0]?.externalId?.type;n&&(M.externalUserType=n);let r=await this._getParticipants();for(let n of e){let e=j.composeId(n);if(R.test(`Conversation:RegisterParticipant`,e),this._isMe(e)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(this._debug.debug(`Local roles changed: ${n.roles}`),L.onLocalRolesChanged(this._conversation.roles,!0,this.id)),this._registerParticipantLocalMuteState(n);continue}if(n.state===X.HUNGUP||n.state===X.REJECTED){r[n.id]&&await this._removeParticipant(r[n.id],D.HUNGUP);continue}let i=j.composeDecorativeId(n);this._registerParticipant({id:e,externalId:Z.fromSignalingParticipant(n),mediaSettings:E(n.mediaSettings),participantState:j.mapParticipantState(n),state:n.state,roles:n.roles||[],status:N.WAITING,muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(e,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},i);let a=await this._getParticipant(e);a&&n.roles&&n.roles.length&&(this._debug.debug(`Roles for participant [${e}] changed: ${n.roles}`),L.onRolesChanged(a.externalId,n.roles,!0,this.id))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let n=async()=>{let n=Ua(e,Pa.MUTE),r=Ua(e,Pa.MUTE_PERMANENT);for(let i of[n,r])i.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:i,stateUpdated:!0})};j.setImmediate(()=>n().catch(e=>this._debug.error(e)))}_getStatusByTransportState(e){let t=null;return e===K.CONNECTED?t=N.CONNECTED:e===K.CONNECTING||e===K.OPENED?t=N.CONNECTING:e===K.RECONNECTING&&(t=N.RECONNECT),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let t=(await this._getParticipants())[e];if(t)return t;let n=this._api.getDecorativeIdByInitialId(j.decomposeId(e).id),r=n?j.composeUserId(n):void 0;return this._createParticipant({id:e},r)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(M.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let t=await this._getParticipantId(e);return this._api.cacheExternalId(e,t),t}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(M.useParticipantListChunk){let n=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return n.markers=this._denormalizeMarkers(n.id,t),n}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){this._debug.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let n=Object.values(t).find(e=>`ts`in e&&`rank`in e);return Object.entries(t).reduce((t,[r,i])=>(t[r]={...n,...i,id:e},t),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let n=Wa(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=Ja(e,r));let i=Object.keys(r),a=this._conversation?.roomId;i.length&&this._onMuteParticipant({muteStates:r,mediaOptions:i,muteAll:!0,stateUpdated:!0,roomId:a},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}async _processPinnedParticipants(e){e.conversation.pinnedParticipantId?await this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?await this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}async _allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new na(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._stats.logger,this._stats.statAggregator,this._stats.codecStatsAggregator),this._debugInfo=new eo(this._debug),this.subscribe(this._transport,J.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,J.LOCAL_STATE_CHANGED,this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,J.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,J.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,J.AUDIO_MIX_STALL,this._onAudioMixStall.bind(this)),this.subscribe(this._transport,J.REMOTE_DATA_STATS,this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,J.SIGNALLED_STALLED_PARTICIPANTS,this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,J.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this)),this.subscribe(this._transport,J.NETWORK_STATUS,this._onNetworkStatus.bind(this)),this.subscribe(this._transport,J.REMOTE_STREAM_SECOND,this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,J.PEER_CONNECTION_CLOSED,this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,J.ASR_TRANSCRIPTION,this._onAsrTranscription.bind(this)),this.subscribe(this._transport,J.ANIMOJI_STREAM,this._onAnimojiStream.bind(this)),this.subscribe(this._transport,J.ANIMOJI_ERROR,this._onAnimojiError.bind(this));let e=this._conversation.direction===Y.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let n of Object.values(t))(n.state===X.ACCEPTED||n.state===X.CALLED)&&this._transport.allocate(n.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new so(this._transport),this.subscribe(this._volumesDetector,oo.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new lo(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,co.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new io(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new po(this._transport,this._volumesDetector,await this._getParticipants(),this._debug,this._stats.logger))}_logDevices(){let e=T.getCameras().length,t=T.getMicrophones().length;this._debug.debug(`Cameras: `+e+(T.hasCameraPermission()?`✔`:`✖`)+`, Microphones: `+t+(T.hasMicrophonePermission()?`✔`:`✖`)),this._stats.logger.log(C.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){this._stats.logger.log(e,[t?.isAudioEnabled&&`audio`,t?.isVideoEnabled&&`video`].filter(Boolean).join(`_`))}async _removeParticipant(e,t){if(e.state===X.CALLED||e.state===X.ACCEPTED||this._state===`CLOSE`)return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let n=await this._getParticipants();if(n[e.id]){t===D.HUNGUP?this._setParticipantsStatus([e],N.HANGUP):this._setParticipantsStatus([e],N.ERROR,t),e.mediaSource?.disconnect(),this._displayLayoutRequester.cleanupParticipant(e.id),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[t,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(t),this._sequenceNumberByStreamDescription.delete(t),this._cooldownTimestampByStreamDescription.delete(t),this._streamWaitTimerByStreamDescription.has(t)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(t)),this._streamWaitTimerByStreamDescription.delete(t)),this._sendUpdateDisplayLayout({[t]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete n[e.id],L.onRemoteRemoved(e.externalId,e.markers,this.id)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener(`pagehide`,this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(e=>e.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(e=>e.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){this._debug.debug(`cleaning up participant-agnostic streams`),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(e=>{e.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_cleanupSignaling(){this._signaling.close(),this._signaling.cleanup()}async _onAddParticipant(e,t,n){this._debug.debug(`Add new participant [${e}]`);let r=await this._getParticipant(e);if(r&&(r.state===X.ACCEPTED||r.state===X.CALLED)){this._debug.warn(`Participant [${r.id}:${r.state}] is already in conversation`);return}if(!r){let n=j.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Z.fromSignalingParticipant(t),mediaSettings:E(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},n),r=await this._getParticipant(e)}this._setParticipantsStatus([r],N.WAITING),n?(r.state=X.HUNGUP,await this._removeParticipant(r,n)):this._transport&&(r.state=X.CALLED,this._transport.allocate(r.id,!0),this._stats.logger.log(C.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}async _onRemoveParticipant(e){this._debug.debug(`Remove participant [${e}]`);let t=[],n=await this._getParticipants();for(let r=0;r<=Eo;r++){let i=n[j.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let e of t)this._transport.close(e.id);this._stats.logger.log(C.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(x.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(x.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(x.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,n=null){if(!this._transport||!this._conversation)return;let r=!t,i=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let t=n??this._conversation.externalId.id;this._transport.setAnimojiSvg(i,{svg:e,userId:t,isMe:r});return}this._transport.setAnimojiSvg(i,{svg:e,isMe:r})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return this._stats.logger.log(C.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return this._stats.logger.log(C.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},n={};for(let t of e){let e=typeof t.uid==`object`?t.uid:Z.fromId(t.uid),r=Z.toString(e);n[r]=t.priority}let r=await this._getParticipants();for(let e of Object.values(r)){let r=Z.toString(e.externalId);Object.hasOwn(n,r)&&(t[e.id]=n[r])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[t,n]of Object.entries(e))if(t.length>5||n.length>5)throw Error(`key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded`);t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async hold(e){let t=fa.get();await this._signaling.hold(e,e?void 0:t),e?((this._state===`ACTIVE`||this._state===`IDLE`)&&(this._previousState=this._state,this._state=`HELD`),await this._mediaSource?.stopLocalMedia(),L.onLocalStatus(N.ONHOLD,this.id)):(this._state===`HELD`&&(this._state=this._previousState||`ACTIVE`,this._previousState=null),await this._mediaSource?.resumeLocalMedia(),L.onLocalStatus(N.WAITING,this.id),this._mediaSource&&L.onLocalStream(this._mediaSource?.getStream()??null,this._mediaSource.mediaSettings,this.id))}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[Dn(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready)return;this._debug.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},n=[],r=await this._getParticipants();for(let i of e){let e=typeof i.uid==`object`?i.uid:Z.fromId(i.uid),a=this._api.getCachedOkIdByExternalId(e);if(!a){let t=Z.toString(e);this._debug.log(`Unknown participant external ID ${t}`);continue}let o=Dn({participantId:a,mediaType:i.mediaType,streamName:i.streamName}),s=r[a];s?n.push(()=>{s.lastRequestedLayouts[o]=i}):this._isMe(a)&&n.push(()=>{this._myLastRequestedLayouts[o]=i}),Sn(i)?(this._isMe(a)&&n.push(()=>{delete this._myLastRequestedLayouts[o]}),this._streamIdByStreamDescription.has(o)&&!this._cooldownTimestampByStreamDescription.has(o)&&this._cooldownTimestampByStreamDescription.set(o,Date.now())):(this._cooldownTimestampByStreamDescription.delete(o),!this._streamIdByStreamDescription.has(o)&&M.videoTracksCount>0&&this._streamIdByStreamDescription.set(o,null),t[o]=i),i.mediaType===V.SCREEN&&!Sn(i)&&W.setMark(W.getMarkNameScreenshareFirstFrame(a))}let i=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>M.videoTracksCount;){let e=i.next();if(e.done){this._debug.error(`Cannot accommodate all streaming requests: tracks available `+M.videoTracksCount+`; requested streams: `+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(e.value),t[e.value]={stopStream:!0}}if(this._transport?.getTopology()!==q.SERVER){n.forEach(e=>e());return}await this._sendUpdateDisplayLayout(t),n.forEach(e=>e())}async requestDisplayLayout(e){return this._displayLayoutRequester.request(e)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,n){if(this._conversation&&M.clientEventsLoggingEnabled){let r={event_type:H.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(r.reason=t),n!==void 0&&(r.group_call_users_count=n),this._stats.logger.logClientEvent(r,!0)}}sendClientEvent(e,t={},n=!1){let r={event_type:e,...t};this._stats.logger.logClientEvent(r,n)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(this._debug.log(`Client asked to stop streaming before stream became available`,e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let t=await this._getParticipants(),n=On(e),r=t[n.participantId],i=this._conversation?.externalId,a=this._isMe(n.participantId);if(r||a){switch(n.mediaType){case V.STREAM:case V.MOVIE:if(n.streamName){let e={stream:null,streamName:n.streamName,mediaType:n.mediaType};a?L.onLocalLive(i,e,this.id):L.onRemoteLive(r.externalId,e,this.id)}break;case V.CAMERA:L.onRemoteStream(r.externalId,null,this.id);break;case V.SCREEN:L.onRemoteScreenStream(r.externalId,null,this.id);break}this._stats.logger.log(C.PAT_DEALLOCATED)}else this._debug.log(`Cannot find participant to stop streaming: ${n.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;this._debug.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let n;try{if(n=await this._signaling.updateDisplayLayout(e),!n)return}catch(n){if(this._debug.warn(`Failed to update display layout ${JSON.stringify(e)}. ${n}`),t)throw n;return}let r=[],i=await this._getParticipants();for(let[e,t]of Object.entries(n.errorCodeByParticipantId||{})){let n=On(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=La(t):(this._debug.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=Ia.UNKNOWN_ERROR),r.push({externalId:a.externalId,errorReason:e})}}if(r&&r.length&&(this._debug.warn(`Could not allocate one or more participants`,r),t))throw new Oo(`Could not allocate one or more participants`,r)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let n=t.next();if(n.done)break;let r=n.value;if(r[1]+To>Date.now())break;let i=r[0];await this._stopStreaming(i),e[i]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;this._debug.log(`Received participant sources update notification`,t);for(let e of t)this._waitForStreamIfNeeded(e)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(this._debug.log(`Promoted in audience mode`,!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.mediaSettings)):(this._debug.log(`Promoted in waiting hall`,!e.demote),e.demote?(this._debug.log(`Kicked from waiting hall`),this._close(new O(D.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),L.onPromoted(e.demote,this.id)}async _onChatRoomUpdated(e,t=0,n=[],r,i){this._debug.log(`Chat room updated: ${e}`);let a=[],o=[],s=[],c=[],l=[];if(n.length&&n.forEach(e=>{if(e.externalId){let t=Z.fromSignaling(e.externalId);l.push(t),this._api.cacheExternalId(e.id.id,t)}else{let t=j.decomposeId(e.id.id).id;a.push(t),c.push(t)}}),r?.length&&r.forEach(e=>{let t=j.decomposeId(e).id;a.push(t),o.push(t)}),i?.length&&i.forEach(e=>{let t=j.decomposeId(e).id;a.push(t),s.push(t)}),!a.length){L.onChatRoomUpdated(e,t,l,[],[],this.id);return}if(c.length){let e=await this._api.getExternalIdsByOkIds(c);l.push(...e)}let u=await this._api.getExternalIdsByOkIds(o),d=await this._api.getExternalIdsByOkIds(s);L.onChatRoomUpdated(e,t,l,u,d,this.id)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let n of e.data)if(this._isMe(n.participantId))L.onLocalLiveUpdate(t,n,this.id);else{let e=await this._getExternalIdByParticipantId(n.participantId);e&&L.onRemoteLiveUpdate(e,n,this.id)}}async _onSharedMovieInfoStarted(e){this._debug.log(`Shared movie started data received: ${e.notification}`),await this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}async _processSharedMovieInfos(e,t=null){e&&await Promise.all(e.map(e=>this._processSharedMovieInfo(e,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let n=this._conversation?.externalId;if(this._isMe(e.initiatorId))L.onLocalSharedMovieInfo(n,e,t,this.id);else{let n=await this._getExternalIdByParticipantId(e.initiatorId);n&&L.onRemoteSharedMovieInfo(n,e,t,this.id)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(e=>this._isMe(j.composeId(e)));await this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}async _processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let t of e.rooms.rooms)t.asrInfo&&this._conversation?.asrInfoByRoom.set(t.id,t.asrInfo);let n=e?.rooms?.roomId??this._conversation?.roomId??null,r=this._conversation?.asrInfoByRoom.get(n);if(r){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&L.onAsrSet({externalId:e,movieId:r.movieId},n,this.id)}else n&&L.onAsrSet(null,n,this.id)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,n=this._conversation.roomId,r=t.get(n);if(r&&!this._isMe(r.initiatorId)){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&L.onRemoteSharedUrl(e,r.sharedUrl,n,this.id)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let n of e.rooms.rooms)n.urlSharingInfo?t.set(n.id,n.urlSharingInfo):t.delete(n.id)}async _onSharedMovieInfoStopped(e){this._debug.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:n,movieId:r,source:i,roomId:a=null}=e,o={initiatorId:n,movieId:r,source:i};if(this._isMe(n))L.onLocalSharedMovieStoppedInfo(t,o,a,this.id);else{let e=await this._getExternalIdByParticipantId(n);if(e){let t=(await this._getParticipants())[n];t?.movieShareInfos&&(t.movieShareInfos=t.movieShareInfos.filter(e=>e&&e.movieId!==r)),L.onRemoteSharedMovieStoppedInfo(e,o,a,this.id)}}}async _onUrlSharingInfoUpdated(e){if(this._debug.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:n}=this._conversation,{initiatorId:r,sharedUrl:i,roomId:a=null}=e;if(i?t.set(a,{sharedUrl:i,initiatorId:r}):t.delete(a),!(!i&&a!==n&&t.has(n))&&(!i||!this._isMe(r))){let e=await this._getExternalIdByParticipantId(r);e&&L.onRemoteSharedUrl(e,i,a,this.id)}}_onFeaturesPerRoleChanged(e){this._debug.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),L.onFeaturesPerRoleChanged(e.featuresPerRole,this.id)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let t=this._getStreamDescriptionById(e.streamId);if(t){let e=On(t),n=await this._getParticipant(e.participantId);L.onRemoteScreenStream(n.externalId,null,this.id);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:n,participantId:r}=t;if(n===V.ANIMOJI)return;let i=await this._getParticipant(r);if(n===V.SCREEN&&!e.fastScreenShare){this._debug.log(`skipping participant-sources-update notification since screenshare will be received over datachannel`);return}let a=Dn(t),o=this._sequenceNumberByStreamDescription.get(a);if(o&&o>e.sequenceNumber){this._debug.warn(`Participant ${r} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${o}`),this._stats.logger.log(C.PAT_OUTDATED_RESPONSE);return}i&&e.suspend!==void 0&&n&&(this._debug.debug(`participant-sources-update: mediaType=${n}, suspend=${e.suspend}`),L.onRemoteStreamSuspended(i.externalId,n,e.suspend,this.id));let s=e.streamId,c=e.rtpTimestamp?this._getWaitingTime(s,e.rtpTimestamp):0;if(c<=0){this._streamWaitTimerByStreamDescription.delete(a);let t=this._conversation?.externalId,n=this._isMe(r);if(!i&&!n){this._stats.logger.log(C.PAT_ERROR,`participantMissing`),this._debug.error(`Could not find participant by ID: ${r}`);return}let o=n?t:i.externalId,c=this._streamByStreamId.get(s);if(!c){this._stats.logger.log(C.PAT_ERROR,`streamNotFound`),this._debug.error(`Could not find stream by ID: ${s}`);return}this._stats.logger.log(C.PAT_ALLOCATED),this._streamIdByStreamDescription.set(a,s);let l=e.participantStreamDescription?.mediaType;if(l===V.STREAM||l===V.MOVIE){if(e.participantStreamDescription?.streamName){let t={streamName:e.participantStreamDescription.streamName,stream:c,mediaType:l};n?L.onLocalLive(o,t,this.id):L.onRemoteLive(o,t,this.id)}}else l===V.SCREEN?L.onRemoteScreenStream(i.externalId,c,this.id):n||L.onRemoteStream(i.externalId,c,this.id)}else{this._debug.debug(`Waiting for ${c} until stream ${s} for ${a} is switched`);let t=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),c);this._streamWaitTimerByStreamDescription.set(a,t)}}_getStreamDescriptionById(e){for(let[t,n]of this._streamIdByStreamDescription.entries())if(n===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(Dn(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(Dn(e)))return e}else{let e={participantId:t,mediaType:V.CAMERA};if(this._streamIdByStreamDescription.has(Dn(e)))return e;let n={participantId:t,mediaType:V.SCREEN};if(this._streamIdByStreamDescription.has(Dn(n)))return n}return this._debug.error(`Received unrequested allocation`,e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw Error(`transport is not initialized`)}_isCallAdmin(){return this._conversation?j.includesOneOf(this._conversation.roles,[Ra.ADMIN,Ra.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!j.includesOneOf(this._conversation.roles,[Ra.ADMIN,Ra.CREATOR]))throw Error(`You don't have the required permission`)}_isCalledState(){return this._participantState===X.CALLED}async grantRoles(e,t,n){this._checkAdminRole(),await this._signaling.grantRoles(e,t,n)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,n=[],r=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,n,r)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,n=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,n),this._conversation?.pinnedParticipantIdByRoom.set(n,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===q.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===q.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Na(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=Ha(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=e?j.composeUserId(e):r.id}let i=await this._signaling.getWaitingHall(r,t,n);if(i.error)return Promise.reject(i.message);let a=i.participants||[],{externalIds:o}=await this._resolveWaitingHallExternalIds(a),s=null;return a.length&&i.hasMore&&(s=Va(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,n=[],r=[];if(e.length){let i=[];e.forEach(e=>{if(t.set(e.id.id,e.id.addedTs),e.externalId){let t=Z.fromSignaling(e.externalId);n.push(e.id.addedTs),r.push(t),this._api.cacheExternalId(e.id.id,t)}else i.push(j.decomposeId(e.id.id).id)}),i.length&&!r.length&&(r=await this._api.getExternalIdsByOkIds(i),n=r.map(e=>{let n=this._api.getCachedOkIdByExternalId(e);return(n?t.get(n):void 0)||Date.now()}))}return{externalIds:r,timestamps:n}}async getAudienceModeHands(){if(!this._signaling.ready)throw Error(`Signaling is not ready`);let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:n,timestamps:r}=await this._resolveWaitingHallExternalIds(t);return{timestamps:r,participants:n,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!j.includesOneOf(this._conversation.options,[ja.WAITING_HALL,ja.AUDIENCE_MODE]))throw Error(`Unable to promote a participant in the conversation with current options`);if(this._checkAdminRole(),!e&&t)throw Error(`participantId is required`);await this._signaling.promoteParticipant(e,t)}catch(t){throw this._debug.warn(`Failed to promote participant ${e}. ${t}`),t}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let e=t.messages.length-1;e>=0;e--){let n=t.messages[e];await this._onChatMessage(n)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let e=(await this._api.createJoinLink(this._conversation.id)).join_link;if(e)return this._conversation.joinLink=e,e}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:n,lang:r}){let i={movieId:e,lang:r};(t||t===0)&&(i.gain=t),n&&(i.metadata=n);let a=await this._signaling.addMovie(i);if(a.error)throw Error(a.error);return{movieId:a.movieId,streamType:a.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw Error(t.error)}async removeMovie(e){let t={movieId:e},n=await this._signaling.removeMovie(t);if(n.error)throw Error(n.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw Error(e.error)}async updateRooms(e,t){let n=await this._signaling.updateRooms(e,t);if(n.error)throw Error(n.error)}async activateRooms(e,t){let n=await this._signaling.activateRooms(e,t);if(n.error)throw Error(n.error)}async switchRoom(e,t){let n=await this._signaling.switchRoom(e,t);if(n.error)throw Error(n.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw Error(t.error)}async startStream(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o={movieId:n,name:t,privacy:r,groupId:i,roomId:a,streamMovie:!e},s=await this._signaling.startStream(o);if(s.error)return Promise.reject(s.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<M.videoMinWidth||e.height<M.videoMinHeight)throw Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<M.videoMinWidth||t.height<M.videoMinHeight)throw Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");M.videoEffectMaxHeight=t.height,M.videoEffectMaxWidth=t.width}M.videoMaxWidth=e.width,M.videoMaxHeight=e.height,this._debug.debug(`Set local video resolution:`,`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:``)),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(e=>({id:e.id,type:M.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),n=await this._signaling.getParticipants(t);if(n.error)throw Error(n.error);let r=n.participants,i=this._transport?.getState();return Promise.all(r.map(async e=>{let t=j.composeId(e);return this._createParticipant({id:t,externalId:Z.fromSignalingParticipant(e),mediaSettings:E(e.mediaSettings),participantState:j.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(i)??N.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(t,e.markers)},e.decorativeUserId)})).then(j.mapSharedParticipants)}async getParticipantListChunk(e){this._debug.log(`Request participant list chunk`,e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw Error(t.error);let n=this._createParticipantListChunk(t.chunk),r=await this._getParticipants(),i=n.participants.filter(e=>!r[j.composeId(e)]);await this._registerParticipants(i);let a=this._transport?.getState();return n.participants.forEach(e=>{let t=r[j.composeId(e)];t.status=this._getStatusByTransportState(a)??N.WAITING,t.movieShareInfos=e.movieShareInfos,Object.assign(t.mediaSettings,E(e.mediaSettings)),Object.assign(t.muteStates,e.muteStates),t.unmuteOptions=e.unmuteOptions??t.unmuteOptions,this._openTransport([t],!0)}),this._participantListChunkToExternalChunk(n)}async _getInitialParticiapntListChunk(){let e=M.participantListChunkInitIndex,t=M.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:`GRID`,fromIdx:e,count:t});return this._debug.debug(`Get initial participant list chunk`,n.chunk),n.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.mediaSettings;this._debug.debug(`Local media stream changed`,t),e.kind===k.audio&&this._mediaSource&&(this._audioFix=new Xa(this._mediaSource,this._debug,this._stats.logger)),L.onLocalStreamUpdate(t,e.kind,this.id),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this.mediaSettings;this._debug.log(`Screen sharing changed`,e.track,t);let n=e.track?new MediaStream([e.track]):null;L.onScreenStream(n,t,this.id)}async _changeRemoteMediaSettings(e,t){this._debug.debug(`Remote media settings changed [${e}]`,t);let n=this._conversation?.externalId;if(this._isMe(e)&&n){L.onLocalMediaSettings(n,t,this.id);return}let r=await this._getParticipant(e);if(!r){this._warnParticipantNotInConversation(e);return}r.mediaSettings=t,[`ACTIVE`,`HELD`].includes(this._state)&&L.onRemoteMediaSettings(r.externalId,t,r.markers,this.id),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(n=>n.id===t||j.comparePeerId(n.peerId,e.peerId))}_changeLocalParticipantState(e){this._debug.debug(`Local participant state force changed by admin`,e),[`ACTIVE`,`HELD`].includes(this._state)&&L.onLocalParticipantState(e,!1,this.id)}async _changeRemoteParticipantState(e,t){this._debug.debug(`Remote participant state changed [${e}]`,t);let n=await this._getParticipant(e);if(!n){this._warnParticipantNotInConversation(e);return}n.participantState=t||{},[`ACTIVE`,`HELD`].includes(this._state)&&L.onRemoteParticipantState(n.externalId,n.participantState,n.markers,this.id)}async _changeMultipleParticipantState(e,t){this._debug.debug(`Multiple participants state changed`,e);let n=[],r,i=await this._getParticipants();e.forEach((e,t)=>{if(this._isMe(t))r=e;else{let r=i[t];if(!r){this._warnParticipantNotInConversation(t);return}r.participantState=e,n.push({externalId:r.externalId,participantState:{...e},markers:r.markers})}}),[`ACTIVE`,`HELD`].includes(this._state)&&(r&&L.onLocalParticipantState(r,!0,this.id),n.length&&L.onRemoteParticipantsState(n,t,this.id))}_invokeRolesChangedCallbackIfNeeded(e){this._state===`ACTIVE`&&e.roles&&e.roles.length&&(this._debug.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),L.onRolesChanged(e.externalId,e.roles,!0,this.id))}_onSignalingNotification(e){switch(e.notification){case G.ACCEPTED_CALL:return this._onAcceptedCall(e);case G.HUNGUP:return this._onHungup(e);case G.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case G.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case G.CLOSED_CONVERSATION:return this._onClosedConversation(e);case G.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case G.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case G.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case G.RATE_CALL_DATA:return this._onNeedRate();case G.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case G.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case G.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case G.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case G.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case G.REGISTERED_PEER:return this._onPeerRegistered(e);case G.SWITCH_MICRO:return this._onMicSwitched(e);case G.CHAT_MESSAGE:return this._onChatMessage(e);case G.CUSTOM_DATA:return this._onCustomData(e);case G.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case G.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case G.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case G.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case G.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case G.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case G.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case G.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case G.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case G.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case G.FEEDBACK:return this._onFeedback(e);case G.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case G.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case G.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case G.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case G.ROOMS_UPDATED:return this._onRoomsUpdated(e);case G.ROOM_UPDATED:return this._onRoomUpdated(e);case G.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case G.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case G.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case G.ASR_STARTED:return this._onAsrStart(e);case G.ASR_STOPPED:return this._onAsrStop(e);case G.PROMOTION_APPROVED:return this._onPromotionApproved(e);case G.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case G.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e);case G.HOLD:return this._onParticipantHold(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}L.onPromotionApproved(t,this.id)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversationParams?.serverTime&&(this._serverTimeOffset=e.conversationParams.serverTime-Date.now()),e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),await this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let n=Object.keys(await this._getParticipants()),r=[];for(let n of e.conversation.participants){let e=j.composeId(n),i=n.roles||[];if(this._isMe(e)){za(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:qa(n),unmuteOptions:n.unmuteOptions})};continue}r.push(e);let a=await this._getParticipant(e);if(!a)await this._onJoinedParticipant({participantId:n.id,participant:n,mediaSettings:n.mediaSettings});else{let t=E(n.mediaSettings);Gt(t,a.mediaSettings)||await this._changeRemoteMediaSettings(e,t);let r=j.mapParticipantState(n),o=a.participantState;j.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),za(i,a.roles)||this._onRolesChanged(a.id,i)}}let i=await this._getParticipants();for(let e of n)r.indexOf(e)<0&&i[e]&&this._removeParticipant(i[e],D.HUNGUP)}let n=e.rooms?.roomId??null;if(!this._conversation){this._debug.warn(`Conversation is empty, but should be filled`);return}this._conversation.roomId===n?this._processMuteStates(e,!0):await this._onRoomSwitched(n),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){this._debug.error(`Signaling failed`,e),this._close(e)}async _onAcceptedCall(e){let t=j.composeMessageId(e),n=j.getPeerIdString(e.peerId);if(this._debug.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new O(D.MISSED),`Call accepted on other device`);return}let r=await this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t),i=n?j.composeUserId(n,e.participantType):void 0;r=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:E(e.mediaSettings)},i))}r.state=X.ACCEPTED,r.mediaSettings=E(e.mediaSettings),this._logWithMediaSettings(C.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===Y.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),this._state===`ACTIVE`&&this._transport&&this._transport.open([r.id],n),await this._changeRemoteMediaSettings(t,r.mediaSettings),await this._changeRemoteParticipantState(t);let i=Object.keys(r.muteStates);i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),[`ACTIVE`,`HELD`].includes(this._state)&&L.onAcceptedCall(r.externalId,ma.parseCapabilities(e.capabilities),this.id)}async _onHungup(e){this._debug.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=j.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new O(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=await this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),n.state=e.reason===D.REJECTED?X.REJECTED:X.HUNGUP,this._state!==`CLOSE`&&this._removeParticipant(n,D.HUNGUP)}async _onAddedParticipant(e){this._debug.debug(`Participant added [${e.participantId}]`);let t=j.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state!==X.HUNGUP&&n.state!==X.REJECTED){this._debug.debug(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Z.fromSignalingParticipant(r),mediaSettings:E(r.mediaSettings),state:r.state,participantState:j.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[]},i),n=await this._getParticipant(t)}n.state=X.CALLED,n.mediaSettings=E(e.participant?.mediaSettings),n.participantState=j.mapParticipantState(e.participant),n.roles=e.participant?.roles||[],this._setParticipantsStatus([n],N.WAITING),this._state!==`IDLE`&&this._transport&&this._transport.allocate(n.id,!0),L.onParticipantAdded(n.externalId,n.markers,this.id),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n)}async _onJoinedParticipant(e){this._debug.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=j.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state===X.ACCEPTED){this._debug.warn(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Z.fromSignalingParticipant(r),mediaSettings:E(r.mediaSettings),state:r.state,participantState:j.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},movieShareInfos:r.movieShareInfos,unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[],markers:this._denormalizeMarkers(t,r.markers)},i),n=await this._getParticipant(t)}this._conversation&&this._conversation.direction===Y.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=X.ACCEPTED,n.mediaSettings=E(e.mediaSettings),n.participantState=j.mapParticipantState(e.participant),n.roles=e.participant.roles||[],this._transport?.isAllocated(n.id)?this._setParticipantsStatus([n],N.CONNECTED):this._setParticipantsStatus([n],N.WAITING),this._state!==`IDLE`&&this._transport&&(this._transport.isAllocated(n.id)||this._transport.allocate(n.id,!0),this._transport.open([n.id],null,!!this._conversation?.observer)),L.onParticipantJoined(n.externalId,n.markers,this.id),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n);let r=Object.keys(n.muteStates);r.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:r,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(n.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new O(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=j.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,E(e.mediaSettings))}async _onParticipantStateChanged(e){let t=j.composeMessageId(e),n=j.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(n):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,n))}async _onParticipantsStateChanged(e){let{participants:t,roomId:n}=e,r=t.map(({id:e,markers:t})=>this._registerParticipantAndSetMarkersIfChunkEnabled(e,t));await Promise.all(r);let i=new Map,a=t.map(({id:e,participantState:t})=>this._getExternalIdByParticipantId(e).then(n=>[e,n&&j.mapParticipantState({participantState:t})]));try{(await Promise.all(a)).forEach(([e,t])=>{t&&i.set(e,t)}),await this._changeMultipleParticipantState(i,n)}catch(e){this._debug.warn(`_onParticipantsStateChanged: Failed to get external ids. ${e}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),L.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.mediaSettings,n=E(e.mediaSettings);t.isAudioEnabled!==n.isAudioEnabled&&await this._mediaSource.toggleAudio(n.isAudioEnabled),t.isVideoEnabled!==n.isVideoEnabled&&await this._mediaSource.toggleVideo(n.isVideoEnabled),t.isScreenSharingEnabled!==n.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:n.isScreenSharingEnabled,fastScreenSharing:n.isFastScreenSharingEnabled,captureAudio:n.isAudioSharingEnabled})}_onSettingsUpdate(e){this._debug.debug(`Got settings update notification`,e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=wr(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){this._debug.debug(`Got video quality update notification`,e);let t={maxBitrateK:Math.round(e.quality.maxBitrate/1024),maxDimension:e.quality.maxDimension},n;n=e.mediaType&&e.mediaType===V.SCREEN?{camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,t)}:{camera:Object.assign({},this._serverSettings.camera,t),screenSharing:null,fastScreenSharing:null},this._serverSettings=wr(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=j.composeMessageId(e),n=await this._getParticipant(t);n&&(n.clientType=e.clientType,n.platform=e.platform),L.onPeerRegistered(this.id)}async _onMicSwitched(e){L.onDeviceSwitched(S.AUDIO,!e.mute,this.id),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=j.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}L.onChatMessage(e.message,n,e.direct,this.id)}async _onCustomData(e){if(Object.hasOwn(e.data,`sdk`))return;let t=j.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}L.onCustomData(e.data,n,e.direct,this.id)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let n=this._conversation.recordsInfoByRoom.get(t);if(n?.recordMovieId!==e?.recordMovieId||n?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let n=await this._getExternalIdByParticipantId(e.initiator);n?L.onRecordStarted(n,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t,this.id):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},n=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(n);if(!(!r||r.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(n,null),e){let t=await this._getExternalIdByParticipantId(e);L.onRecordStopped(n,t??null,this.id)}else L.onRecordStopped(n,null,this.id)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let n=await this._getExternalIdByParticipantId(t);n&&L.onPinnedParticipant(n,!1,null,e,this.id)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiator);n?L.onRecordStarted(n,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e,this.id):this._warnParticipantNotInConversation(t.initiator)}else L.onRecordStopped(e,null,this.id)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiatorId);n&&L.onAsrSet({externalId:n,movieId:t.movieId},e,this.id)}else L.onAsrSet(null,e,this.id)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,n=t.get(e);if(n){let t=await this._getExternalIdByParticipantId(n.initiatorId);t&&L.onRemoteSharedUrl(t,n.sharedUrl,e,this.id)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}L.onParticipantVmojiUpdate(t,this.id)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,n=e.roomId||null;this._conversation.asrInfoByRoom.set(n,t);let r=await this._getExternalIdByParticipantId(t.initiatorId);if(!r){this._warnParticipantNotInConversation(t.initiatorId);return}L.onAsrStarted(r,t.movieId,n,this.id)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),L.onAsrStopped(t,this.id)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}L.onAsrTranscription(t,e.text,e.timestamp,e.duration,this.id)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!za(this._conversation.roles,t)){this._debug.debug(`Local roles changed: ${t}`),this._conversation.roles=t,L.onLocalRolesChanged(t,!1,this.id),this._processMuteState({mediaOptions:Ua(this._getMuteStatesForCurrentRoom(),Pa.MUTE_PERMANENT),stateUpdated:!0}),j.includesOneOf(t,[Ra.ADMIN,Ra.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=await this._getParticipant(e);n&&!za(n.roles,t)&&(this._debug.debug(`Roles for participant [${e}] changed: ${t}`),n.roles=t,L.onRolesChanged(n.externalId,t,!1,this.id))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:n,muteStates:r={},unmuteOptions:i=[],mediaOptions:a=[],roomId:o=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){this._debug.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let t=await this._getParticipant(e.participantId);if(t){this._debug.debug(`Mute states for participant [${e.participantId}] changed`,r);let o=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;L.onMuteStates(r,i,a,n,e.unmute,t.externalId,o,e.stateUpdated,e.requestedMedia,e.roomId,this.id)}return}if(e.requestedMedia?.length||(n&&!t?this._setMuteStatesForRoomId(r,o):n||(this._conversation.muteStatesPersonal=r)),e.adminId&&this._isMe(e.adminId)){n&&L.onMuteStates(r,i,a,n,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId,this.id);return}await this._processMuteState({mediaOptions:a,muteAll:n,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:i,muteStates:r})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let n=this._getMuteStatesForRoomId(t),r=this._getMuteStatesForRoomId(e),i=Object.keys(n),a=Object.keys(r);this._processMuteState({mediaOptions:Array.from(new Set([...i,...a])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==X.ACCEPTED)return;let{mediaOptions:t=[],muteAll:n,unmute:r,stateUpdated:i,requestedMedia:a,roomId:o=null,unmuteOptions:s=[]}=e,c=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,l=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(o)),u=this._mediaSource.mediaSettings,d=Object.entries(l);for(let[e,i]of d){let a=this._isCallAdmin()&&n;if(!(i!==Pa.MUTE&&i!==Pa.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===Pa.MUTE_PERMANENT&&!n&&(l[e]=Pa.MUTE),!(!t.includes(e)||r)))switch(e){case S.VIDEO:u.isVideoEnabled&&(L.onDeviceSwitched(S.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case S.AUDIO:u.isAudioEnabled&&(L.onDeviceSwitched(S.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case S.SCREEN_SHARING:u.isScreenSharingEnabled&&(L.onDeviceSwitched(S.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case S.AUDIO_SHARING:u.isAudioSharingEnabled&&(L.onDeviceSwitched(S.AUDIO_SHARING,!1,this.id),await this.toggleScreenCapturing({captureScreen:u.isScreenSharingEnabled,fastScreenSharing:u.isFastScreenSharingEnabled,captureAudio:!1}));break}}L.onMuteStates(l,s,t,n,r,null,c,i,a,o,this.id)}async _onPinParticipant(e,t=!1,n,r=null){if(!this._conversation)return;let i=this._conversation.pinnedParticipantIdByRoom.get(r);if(i&&i!==e)if(this._isMe(i))L.onLocalPin(!0,r,this.id);else{let t=await this._getExternalIdByParticipantId(i);t&&L.onPinnedParticipant(t,!0,this._denormalizeMarkers(e,n),r,this.id)}if(this._isMe(e))L.onLocalPin(t,r,this.id);else{let i=await this._getExternalIdByParticipantId(e);i&&L.onPinnedParticipant(i,t,this._denormalizeMarkers(e,n),r,this.id)}this._conversation.pinnedParticipantIdByRoom.set(r,t?null:e)}_onOptionsChanged(e){this._conversation&&!Ma(this._conversation.options,e)&&(this._conversation.options=e,L.onOptionsChanged(e,this.id),e.includes(ja.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&L.onLocalStatus(N.WAITING_HALL,this.id):e.includes(ja.WAIT_FOR_ADMIN)&&this._conversation.restricted&&L.onLocalStatus(N.WAIT_FOR_ADMIN,this.id))}async _onNetworkStatus(e){if(this._conversation){let t=[],n=await this._getParticipants();for(let[r,i]of Object.entries(e)){let e;if(this._isMe(r)||r===``)e=this._conversation.networkRating;else if(n[r])e=n[r].networkRating;else continue;if(e!==i)if(this._isMe(r)||r===``)this._conversation.networkRating=i,Wr.getInstance().value=i,L.onLocalNetworkStatusChanged(i,this.id);else{let e=n[r];e.networkRating=i,t.push({uid:e.externalId,rating:i})}}if(t.length===0)return;this._debug.log(`Received network status update: `,e),L.onNetworkStatusChanged(t,this.id)}}async _onRemoteStreamSecond(e,t){let n=await this._getParticipant(e);n&&L.onRemoteScreenStream(n.externalId,t,this.id)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){L.onVmojiStream(t,this._mediaSource.mediaSettings,this.id);return}let n=await this._getParticipant(e);n&&L.onRemoteVmojiStream(n.externalId,t,this.id)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,L.onVmojiError({...e,externalId:t},this.id))}catch(e){this._debug.warn(`_onAnimojiError failed`,e)}}_onPeerConnectionClosed(e){e===q.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy()}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(Aa.ADD_PARTICIPANT);L.onCallState(e,t,this._conversation,this.id)}}_changeFeaturesPerRole(){this._conversation&&L.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{},this.id)}_changeNeedRate(){this._conversation&&this._conversation.needRate&&L.onRateNeeded(this.id)}async _onVolumesDetected(e){let t=[];for(let[n,r]of Object.entries(e)){let e=await this._getParticipant(n);e&&e.externalId&&t.push({uid:e.externalId,volume:r.real})}L.onVolumesDetected(t,this.id)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(L.onSpeakerChanged(t.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){this._debug.debug(`Transport state has changed: ${t}`,e);let n=this._getStatusByTransportState(t);if(!n)return;let r=await this._getParticipants(),i=[],a=e.reduce((e,n)=>{if(n in r){let a=r[n];e.push(a),t===K.CONNECTED&&(a.remoteStream||(a.mediaSettings&&this._changeRemoteMediaSettings(n,a.mediaSettings),this._changeRemoteParticipantState(n,a.participantState)),i.push(...Object.values(a.lastRequestedLayouts)))}else this._warnParticipantNotInConversation(n);return e},[]);a.length&&(this._updateDisplayLayoutFromCache(i),this._setParticipantsStatus(a,n))}async _onTransportLocalStateChanged(e){if(this._debug.debug(`Local transport state has changed: ${e}`),e===K.CONNECTED&&(T.releaseFirefoxMicrophonePermissionWarmup(),L.onLocalStatus(N.CONNECTED,this.id),this._transport?.getTopology()===q.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e),this._displayLayoutRequester.resend()}this._state!==`HELD`&&(e===K.CONNECTING&&L.onLocalStatus(N.CONNECTING,this.id),e===K.RECONNECTING&&L.onLocalStatus(N.RECONNECT,this.id),e===K.FAILED&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(D.FAILED),this._close(new O(D.FAILED),`Transport failed`)))}async _onRemoteTrackAdded(e,t,n){if(e.endsWith(Br.AUDIO_MIX))this._debug.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),L.onRemoteMixedAudioStream(t,this.id);else if(e.startsWith(Br.TRANSPARENT_AUDIO_TRACK_PREFIX))this._debug.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(Br.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))this._debug.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{this._debug.debug(`Remote track added on the participant [${e}]`,{kind:n.kind});let r=await this._getParticipant(e);if(!r){let t=this._api.getDecorativeIdByInitialId(e),n=t?j.composeUserId(t):void 0;this._debug.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${n}]`),this._registerParticipant({id:e},n),r=await this._getParticipant(e),this._setParticipantsStatus([r],N.WAITING),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(L.onSpeakerChanged(r.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(r.id)&&this._transport.allocate(r.id,!1),n.kind===k.audio&&(this._audioOutput.add(e,n),M.preserveAudioTracks||(r.remoteAudioTrack=n,t.removeTrack(n))),r.remoteStream!==t&&t.getTracks().length){if(r.remoteStream=t,r.secondStream)return;L.onRemoteStream(r.externalId,t,this.id)}r.mediaSettings&&this._changeRemoteMediaSettings(e,r.mediaSettings)}}_onRemoteTrackRemoved(e,t,n){switch(this._debug.debug(`[${e}] remote track (removed)`,{track:n}),n.kind){case k.audio:this._removeAudioTrack(e,t,n);break;case k.video:case k.screen:this._removeVideoTrack(e,t,n);break}}async _removeAudioTrack(e,t,n){if(e!==Br.AUDIO_MIX){let n=await this._getParticipant(e);if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(e,n)}_removeVideoTrack(e,t,n){}_onTopologyChanged(e){e===q.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall()),this._audioOutput.destroy()}_onAudioMixStall(e){this._audioMixStalled!==e&&!this.isCallHeld&&(this._audioMixStalled=e,this._debug.debug(`Audio mix stalled:`,e),L.onLocalStatus(e?N.RECONNECT:N.CONNECTED,this.id))}async _onRemoteSignalledStall(e){let t={},n=[],r=[];this._debug.debug(`Participants stalled:`,e);let i=await this._getParticipants();for(let r of e){if(t[r]=!0,!this._lastStalled[r]){let e=i[r];e&&n.push(e)}delete this._lastStalled[r]}for(let e of Object.keys(this._lastStalled)){let t=i[e];t&&r.push(t)}n.length&&this._setParticipantsStatus(n,N.RECONNECT),r.length&&this._setParticipantsStatus(r,N.CONNECTED),this._lastStalled=t}async _onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,await this._getParticipants()),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!T.hasMicrophone()||!this._audioFix||!this.mediaSettings?.isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!T.hasCamera()||!this._audioFix||!this.mediaSettings?.isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!==`CLOSE`||!1;e&&(this._debug.debug(`Toggle join availability`,{available:t,chatId:e}),L.onJoinStatus(t,e,this.id))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()===q.SERVER&&e.length)try{await this.updateDisplayLayout(e)}catch(e){this._debug.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){if(!e.length)return;let r=e.reduce((e,n)=>(n.status!==t&&(n.status=t,e.push(n.externalId)),e),[]);r.length&&L.onRemoteStatus(r,t,n,this.id)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),L.onJoinLinkChanged(e.joinLink,this.id)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let n of Object.keys(Fa)){let r=e.updates[n];r&&(t[n]={rooms:await Promise.all(r?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:r?.roomIds,deactivated:r?.deactivated})}L.onRoomsUpdated(t,this.id)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(e=>e===Fa.UPDATE)&&(e.muteStates!==void 0&&this._setMuteStatesForRoomId(e.muteStates,e.roomId),e.recordInfo!==void 0&&this._conversation?.recordsInfoByRoom.set(e.roomId,e.recordInfo),e.asrInfo!==void 0&&this._conversation?.asrInfoByRoom.set(e.roomId,e.asrInfo)),this._isCalledState()||L.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null,this.id)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),n=await Promise.all(e.addParticipantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),r=await Promise.all(e.removeParticipantIds?.map?.(e=>this._getExternalIdByParticipantId(e))||[]),i=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:n,removeParticipantIds:r,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:i,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=e.addedParticipantIds?.map(e=>j.decomposeId(e).id)||[],i=await this._api.getExternalIdsByOkIds(r),a=e.addedParticipants;if(i.length&&a?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);a=(await this._signaling.getParticipants(e)).participants}let o=await Promise.all(a?.map(async e=>{let r=j.composeId(e);return this._createParticipant({id:r,externalId:Z.fromSignalingParticipant(e),mediaSettings:E(e.mediaSettings),participantState:j.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(t)??N.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(r,e.markers),isInRoom:n!==null},e.decorativeUserId)})||[]),s=!1;for(let e of o)e.id===this._conversation?.compositeUserId&&(s=!0),this._registerParticipantInCache(e);this._transport?.getState()===K.IDLE&&!this._isCalledState()&&this._openTransport(o,!0);let c=[],l=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);l.push(e)}c=await Promise.all(l)}if(s&&await this._onRoomSwitched(n),c){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=await this._getExternalIdByParticipantId(e);if(t){for(let e of c)if(Z.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let u={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:j.mapSharedParticipants(o),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:c};this._isCalledState()||L.onRoomParticipantsUpdated(u,this.id)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let n=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){L.onRoomStart(e,this.id);return}this._isCalledState()||L.onRoomSwitched(e,this.id),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,n),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let n=t?.rooms?.rooms??[],r=[];for(let t of n){let n=t.id??null;if(this._setMuteStatesForRoomId(t.muteStates,n),this._conversation?.recordsInfoByRoom.set(n,t.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(n,t.pinnedParticipantId??null),t.asrInfo&&this._conversation?.asrInfoByRoom.set(n,t.asrInfo),t.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(n,t.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(n),e){let e=await this._getParticipants();await this._registerParticipants(t?.participants?.participants?.filter(t=>!e[j.composeId(t)])||[],!0);let n=await this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&L.onRoomsUpdated({[Fa.UPDATE]:{rooms:r}},this.id)}async _onFeedback(e){let t=[];for(let n of e.feedback){let e={...n,items:[]};for(let t of n.items){let n=await this._getExternalIdByParticipantId(t.participantId);n?e.items.push({...t,participantId:n}):this._warnParticipantNotInConversation(t.participantId)}t.push(e)}L.onFeedback(t,e.roomId,this.id)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:n,decorativeExternalParticipantId:r}=e,i=this._isMe(t);this._debug.debug(`Decorative participant id changed [${t}]`,e);let a=await this._getExternalIdByParticipantId(t);if(!a){this._warnParticipantNotInConversation(t);return}let o=Z.fromSignaling(r,a.deviceIdx);if(L.onParticipantIdChanged(a,o,this.id),this._api.cacheExternalId(n,o),this._api.mapDecorativeId(n,t),i)this._conversation.externalId=o;else{let e=await this._getParticipants();e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==q.SERVER||(this._debug.debug(`Video suspend suggested`,e),L.onVideoSuspendSuggest(e.bandwidth,this.id))}async _onParticipantHold(e){this._debug.debug(`Participant hold suggested`,e);let t=await this._getParticipant(e.participantId);e.hold?this._setParticipantsStatus([t],N.ONHOLD):this._setParticipantsStatus([t],N.CONNECTED)}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()===q.SERVER&&this._transport?.getState()===K.IDLE&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){let n=this._createParticipant(e,t);n.catch(()=>void 0),this._pendingParticipants.set(e.id,n)}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.entries()),t=await Promise.allSettled(e.map(e=>e[1])),n=null;for(let r=0;r<t.length;r++){let[i]=e[r];this._pendingParticipants.delete(i);let a=t[r];if(a.status===`fulfilled`){let e=a.value;this._participants[e.id]=e;continue}n=n??a.reason,this._debug.warn(`Failed to resolve pending participant [${i}]`,a.reason)}if(n)throw n}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}},Do=null,Oo=class e extends Error{constructor(t,n){super(t),h(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},ko=null,Ao=null;function jo(){ko=null,Ao=null}function Mo(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function No(e=null,t){let n=Mo(e??M.apiBaseUrl);if(n)return n;if((t??M.apiEnv)!==`AUTO`)return M.apiEndpoint(t);try{let e=atob(`aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ=`),t=(await(await fetch(e,{method:`GET`,mode:`cors`,cache:`no-cache`})).json())?.Answer[0]?.data;if(!t)throw Error(`Wrong DNS response`);return R.debug(`Resolved API endpoint`,t),t}catch(e){return R.warn(`Failed to resolve API endpoint using DNS, default is used`,e),M.apiEndpoint(t)}}async function Po(){return ko||Ao||(Ao=No(),ko=await Ao,Ao=null,ko)}async function Fo(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Po();let r=zo(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${ko}/fb.do`,i)}async function Io(e,t={},n=!1,r){return await Po(),Lo(zo(e,t,n),r)}async function Lo(e,t){let n=`${t??ko}/fb.do`,r=new AbortController,i=setTimeout(()=>r.abort(new O(D.NETWORK_ERROR)),M.apiTimeout),a=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:e,signal:r.signal});clearTimeout(i);let o=await a.text(),s;try{s=JSON.parse(o)}catch{s={result:o}}if(!a.ok||Object.hasOwn(s,`error_msg`))throw s;return s}async function Ro(e,t){try{let n=await fetch(e,{method:`POST`,body:t});if(!n.ok)throw Error(`HTTP error! status: ${n.status}`);let r=await n.text();R.debug(`Form data sent successfully`,r)}catch(e){throw R.warn(`Failed to send form data`,e),e}}function zo(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=M.apiKey),n||(y.sessionKey?t.session_key=y.sessionKey:y.accessToken&&(t.access_token=y.accessToken));for(let[e,n]of Object.entries(t))typeof n==`object`&&(t[e]=JSON.stringify(n));let r=``;for(let[e,n]of Object.entries(t))r&&(r+=`&`),r+=`${e}=${encodeURIComponent(n)}`;return r}var Bo=class{constructor(){h(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}async createJoinLink(e){return{join_link:`nop`}}async removeJoinLink(e){return{success:!0}}async getAnonymTokenByLink(e,t){return``}log(e){}logClientStats(e){}logClientEvents(e){}getCachedOkIdByExternalId(e){return null}getCachedRawOkIdByExternalId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}replaceByInitialIdIdIfExists(e){return typeof e==`string`?parseInt(e,10):e}hangupConversation(e,t=D.HUNGUP){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}},Vo=class{constructor(){h(this,`_okIdToExternalId`,new Map),h(this,`_externalIdToOkId`,new Map),h(this,`_decorativeIdToInitialId`,new Map),h(this,`_initialIdToDecorativeId`,new Map)}getOkId(e){let t=Z.toString(e),n=this._externalIdToOkId.get(t);return n==null?null:this.replaceByInitialIdIdIfExists(n)}getExternalId(e){let t=this.getDecorativeIdByInitialId(e)??e,n=this._okIdToExternalId.get(t);return n==null?null:Z.fromString(n)}hasByExternalId(e){return this._externalIdToOkId.has(Z.toString(e))}hasByOkId(e){return this._okIdToExternalId.has(e)}cache(e,t){let n=j.extractOkId(e),r=Z.toString(t);this._okIdToExternalId.set(n,r),this._externalIdToOkId.set(r,n)}mapDecorativeId(e,t){let n=j.extractOkId(e),r=j.extractOkId(t);this._decorativeIdToInitialId.set(n,r),this._initialIdToDecorativeId.set(r,n)}unmapDecorativeId(e){let t=j.extractOkId(e),n=this.getDecorativeIdByInitialId(t);n&&this._decorativeIdToInitialId.delete(n),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=j.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=j.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}getParticipantIdByExternalId(e){let t=this.getOkId(e);return t==null?null:j.composeParticipantId(t,A.USER,e.deviceIdx??0)}clear(){this._okIdToExternalId.clear(),this._externalIdToOkId.clear(),this._decorativeIdToInitialId.clear(),this._initialIdToDecorativeId.clear()}},Ho=700,Uo=3e3,Wo=class extends Bo{constructor(...e){super(...e),h(this,`_userId`,null),h(this,`_uuid`,void 0),h(this,`_idCache`,new Vo)}async _callUnsafe(e,t={},n=!1){let r=async i=>{try{return await Io(e,t,n)}catch(t){if(!Object.hasOwn(t,`error_msg`)){i++;let n=Object.getOwnPropertyNames(t).map(e=>`${e}: ${JSON.stringify(t[e])}`);if(R.debug(`${e} network error, attempt ${i}: ${n.join(`
|
|
20
|
+
`)}`),this._abortSignal?.aborted&&(R.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),i<M.apiMaxAttempt)return await j.delay(Math.min(i*Ho,Uo),{signal:this._abortSignal}),r(i)}throw R.warn(e,`error`,t),t}};return r(0)}async _call(e,t={},n=!1){try{return await this._callUnsafe(e,t,n)}catch(r){R.warn(`Api call error`,r);let i=x.API;switch(r.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,n)}let a={message:r.error_msg,code:r.error_code};if(r instanceof O)throw r;if(r.custom_error&&(a.custom_error=r.custom_error),Go(r))switch(r.error_code){case 1101:i=D.SERVICE_DISABLED;break;case 4:r.error_msg.includes(`participants.limit.exceeded`)&&(i=D.PARTICIPANT_LIMIT_REACHED);break;case 300:i=D.NOT_FOUND;break;case 1102:i=D.CALLEE_IS_OFFLINE;break;case 1103:i=D.NOT_FRIENDS;break;case 1104:case 1106:i=D.EXTERNAL_API_ERROR;break;case 1113:i=D.CALLER_IS_REJECTED;break;case 1114:i=D.VCHAT_DETAILED_ERROR;break;case 2:i=D.SERVICE_UNAVAILABLE;break}throw new O(i,a)}}async userId(e){let t=j.extractOkId(e);return y.isEmpty()?Z.fromId(String(t)):(this._idCache.hasByOkId(t)||await this._getExternalIdsByOkIds([t]),this._idCache.getExternalId(t)||Z.fromId(String(t)))}async authorize(){if(this._ensureUuid(),!M.apiKey)throw new O(x.API,{message:`Required argument apiAppKey not passed`});let e={session_data:{version:2,device_id:this._uuid,client_version:M.appVersion,client_type:`SDK_JS`}};return M.authToken&&(e.session_data.auth_token=M.authToken,e.session_data.version=3),this._callUnsafe(`auth.anonymLogin`,e,!0).then(e=>{e.uid&&(this._userId=Number(e.uid)),y.sessionKey=e.session_key,y.sessionSecretKey=e.session_secret_key}).catch(e=>{throw e.error_code===401&&L.onTokenExpired(),new O(x.AUTH,{message:e.error_msg,code:e.error_code})})}logClientStats(e){let t={app_version:String(M.appVersion),sdk_type:`WEB`,sdk_version:M.sdkVersion,version:1,items:e};M.clientStatsPlatform&&(t.platform=M.clientStatsPlatform),Fo(`vchat.clientStats`,{data:JSON.stringify(t)})}logClientEvents(e){let t={app_version:String(M.appVersion),sdk_type:`WEB`,sdk_version:M.sdkVersion,version:1,items:e};M.clientStatsPlatform&&(t.platform=M.clientStatsPlatform),Fo(`vchat.clientEvents`,{data:JSON.stringify(t)})}async uploadDebugLogs(e,t,n,r){let i={conversationId:e,webrtcPlatform:M.platform,startTime:t,endTime:n},a=await this._callUnsafe(`vchat.getLogUploadUrl`,i),o=new FormData,s=new Blob([r],{type:`application/json`});o.append(`file`,s,`log.json`);let c=new URL(a.upload_url);return c.searchParams.append(`size`,s.size.toString()),Ro(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:M.protocolVersion,capabilities:ma.getFlags()};return n&&(r.chatId=n),this._call(`vchat.joinConversation`,r)}async createConversation(e,t=``,n=!1,{onlyAdminCanShareMovie:r,audienceMode:i,audioOnly:a,waitForAdmin:o,closedConversation:s}={},c){let l=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:n,onlyAdminCanShareMovie:r,waitForAdmin:o,closedConversation:s,audienceMode:i,audioOnly:a,externalIds:c});return this._startConversation(l)}async startConversation(e,t,n,r=!1,i=``,a=!1,o=!1,{onlyAdminCanShareMovie:s,waitForAdmin:c}={},l){let u=this._preareStartConversationData({conversationId:e,isVideo:r,joiningAllowed:a,payload:i,requireAuthToJoin:o,onlyAdminCanShareMovie:s,waitForAdmin:c,externalIds:l});if(t&&t.length)switch(n){case Oa.USER:u.uids=t.join(`,`);break;case Oa.GROUP:u.gid=t[0];break;case Oa.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=st.get(`uuid`);e||(e=j.uuid(),st.set(`uuid`,e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:n=``,joiningAllowed:r=!1,requireAuthToJoin:i=!1,onlyAdminCanShareMovie:a,waitForAdmin:o,audienceMode:s=!1,audioOnly:c=!1,closedConversation:l=!1,externalIds:u}){let d={conversationId:e,isVideo:t,protocolVersion:M.protocolVersion};return r&&(d.createJoinLink=!0),n&&(d.payload=n),M.domain&&(d.domainId=M.domain),M.externalDomain&&(d.externalDomain=M.externalDomain),i&&(d.requireAuthToJoin=!0),a!==void 0&&(d.onlyAdminCanShareMovie=a),o!==void 0&&(d.waitForAdmin=o),s&&(d.audienceMode=s),c&&(d.audioOnly=c),l&&(d.closed=l),u&&(d.externalIds=u.map(Z.toSignaling).join(`,`)),d}async _startConversation(e){return this._call(`vchat.startConversation`,e)}async createJoinLink(e){return this._call(`vchat.createJoinLink`,{conversationId:e})}async removeJoinLink(e){return this._call(`vchat.removeJoinLink`,{conversationId:e})}async getAnonymTokenByLink(e,t){let n={joinLink:e};t&&(n.anonymName=t);let r=await this._call(`vchat.getAnonymTokenByLink`,n);return this._userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:M.protocolVersion,capabilities:ma.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),M.anonymToken&&(i.anonymToken=M.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}async getExternalIdsByOkIds(e){let t=[],n=[];for(let r of e){let e=this._idCache.getExternalId(r);e?t.push(e):n.push(r)}if(!n.length)return t;let r=await this._getExternalIdsByOkIds(n);return Array.from(r.values())}getCachedOkIdByExternalId(e){return this._idCache.getParticipantIdByExternalId(e)}getCachedRawOkIdByExternalId(e){return this._idCache.getOkId(e)}cacheExternalId(e,t){this._idCache.cache(e,t)}mapDecorativeId(e,t){this._idCache.mapDecorativeId(e,t)}unmapDecorativeId(e){this._idCache.unmapDecorativeId(e)}getDecorativeIdByInitialId(e){return this._idCache.getDecorativeIdByInitialId(e)}replaceByInitialIdIdIfExists(e){return this._idCache.replaceByInitialIdIdIfExists(e)}async getConversationParams(e){let t={};return M.anonymToken&&(t.anonymToken=M.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e,t=D.HUNGUP){let n={conversationId:e,reason:t};M.anonymToken&&(n.anonymToken=M.anonymToken),Fo(`vchat.hangupConversation`,n)}async removeHistoryRecords(e){await this._call(`vchat.removeHistoryRecords`,{recordIds:e.join(`,`)})}cleanup(){this._idCache.clear()}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(e=>this.getDecorativeIdByInitialId(e)??e);try{let n=await this._call(`vchat.getExternalIdsByOkIds`,{uids:e.join(`,`)}),r=(e,n)=>{for(let[r,i]of Object.entries(e)){let e=Number(r),a=Z.fromId(i,n);t.set(e,a),this.cacheExternalId(e,a)}};n.external_ids&&r(n.external_ids,Ba.USER),n.anonym_ids&&r(n.anonym_ids,Ba.ANONYM);for(let n of e){let e=Number(n);if(!t.has(e)){let n=Z.fromId(String(e));t.set(e,n),this.cacheExternalId(e,n)}}return t}catch{return t}}async getServerTime(){return(await this._call(`system.getInfo`)).serverTime}};function Go(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}var Ko=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(Ko||{}),qo=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),Jo=class{constructor(e){h(this,`_queue`,void 0),h(this,`_readCursor`,void 0),h(this,`_writeCursor`,void 0),h(this,`_moveReadCursor`,void 0),h(this,`_left`,void 0),this._queue=Array(e).fill(null),this._readCursor=this._writeCursor=this._left=0,this._moveReadCursor=!1}get length(){return this._queue.length}get left(){return this._left}toArray(){return Array.from(this._queue)}add(e){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=e,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(e){return(e+1)%this._queue.length}next(){let e=this._queue[this._readCursor];return e&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),--this._left),e}},Yo=class{constructor(e,t,n,r=null){h(this,`_uuid`,void 0),h(this,`_apiKey`,void 0),h(this,`_callToken`,void 0),h(this,`_apiEnv`,void 0),h(this,`_baseApiUrl`,void 0),h(this,`_sessionKey`,void 0),this._uuid=j.uuid(),this._apiKey=t,this._callToken=n,this._apiEnv=e,this._baseApiUrl=r}async authorize(){let e=await Io(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:M.appVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await No(this._baseApiUrl,this._apiEnv));return j.isObject(e)&&!(`error_msg`in e)?(this._sessionKey=e.session_key,!0):!1}async hangupConversation(e){await Io(`vchat.hangupConversation`,{conversationId:e,reason:D.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},!0,await No(this._baseApiUrl,this._apiEnv))}},$,Xo=null,Zo={getCameras:T.getCameras,getMicrophones:T.getMicrophones,getOutput:T.getOutput,getVideoFacingMode:T.getVideoFacingMode,hasCamera:T.hasCamera,hasMicrophone:T.hasMicrophone,getSavedCamera:T.getSavedCamera,getSavedMicrophone:T.getSavedMicrophone,getSavedOutput:T.getSavedOutput,hasCameraPermission:T.hasCameraPermission,hasMicrophonePermission:T.hasMicrophonePermission,hasPermissions:T.hasPermissions,getUserMedia:T.getUserMedia,getUserVideo:T.getUserVideo,getUserAudio:T.getUserAudio,setResolution:T.setResolution,isBrowserSupported:T.isBrowserSupported,isScreenCapturingSupported:T.isScreenCapturingSupported,os:T.os,isMobile:T.isMobile,browserName:T.browserName,browserVersion:T.browserVersion,baseChromeVersion:T.baseChromeVersion,getAudioContext:T.getAudioContext,isAudioShareSupported:T.isAudioShareSupported},Qo={participantMarkerCompare:j.participantMarkerCompare};function $o(e){Xo=e}function es(e){M.videoEffects=e}function ts(e){M.audioEffects=e}function ns(e,t=null,n={},r=1){M.vmoji=e,M.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function rs(e){if(M.set(e),$||($=new Wo),c.default.disableLog(!M.debug),R.toggle(M.debug),R.log(`Calls SDK ${M.sdkVersion}`,e),await T.init(),!T.isBrowserSupported())throw new O(x.UNSUPPORTED);R.log(`UserAgent:`,navigator.userAgent),R.log(`Screen resolution:`,`${window.screen.width}x${window.screen.height}`),R.log(`Permissions:`,`Camera: ${T.hasCameraPermission()}, Mic: ${T.hasMicrophonePermission()}`),R.log(`Simulcast:`,`${e.simulcast} => ${M.simulcast}`)}async function is(e,t=[S.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),as([],Oa.USER,t,n,r,i,a,c,o,s)}async function as(e,t=Oa.USER,n,r=``,i=!1,a=!1,o,s,c,l){if(!M.hold&&z.callsLength>0)throw R.error(`There is already active call`),new O(D.FAILED);return new Q($,Xo).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function os(e,t){return ss(e,A.USER,void 0,t)}async function ss(e,t=A.USER,n,r,i,a){if(e===Q.id())throw Error(`Push has already been processed`);return a&&$.setUserId(a),new Q($,Xo).onPush(e,t,n,r,i)}async function cs(e,t){return e&&(M.authToken=e),t!==void 0&&M.apiBaseUrl!==t&&(M.apiBaseUrl=t,jo()),$.authorize()}async function ls(e=[S.AUDIO],t){return Nc(t).accept(e)}async function us(e){let t=Mc(e);if(t)return t.decline()}async function ds(e,t=[S.AUDIO]){return fs(e,t)}async function fs(e,t,n){if(!M.hold&&z.callsLength>0)throw R.error(`There is already active call`),new O(D.FAILED);return new Q($,Xo).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function ps(e,t=[S.AUDIO],n,r,i,a){if(!M.hold&&z.callsLength>0)throw R.error(`There is already active call`),new O(D.FAILED);return n&&(M.anonymToken=n),new Q($,Xo).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a})}async function ms(e){let t=Mc(e);if(t)return t.hangup();Q.hangupAfterInit()}async function hs(e,t){let n=Array.isArray(e)?e:[e],r=Q.current();r&&await r.addParticipant(n,t)}async function gs(e,t){let n=Q.current();if(n){let r=e.map(e=>j.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function _s(e,t=!1){let n=$.getCachedRawOkIdByExternalId(e);if(!n){R.warn(`removeParticipant: externalId not found in cache`,e);return}return vs(n,t)}async function vs(e,t=!1){let n=Q.current();if(n)try{await n.removeParticipant(j.composeUserId(e),t)}catch(t){R.warn(`Failed to remove participant ${e}. Perhaps he is no longer on the call. ${t}`)}}async function ys(e,t){let n=Q.current();if(e===`videoinput`&&Mt.contains(t))return M.videoFacingMode=t,n?(T.isMobile()&&n.stopVideoTrack(),n.changeDevice(e)):void 0;if(!await T._saveDeviceId(e,t))throw Error(`Device not found: ${t}`);if(n)return n.changeDevice(e)}async function bs(e,t){let n=typeof e==`object`?{...e,fastScreenSharing:e.captureScreen&&e.fastScreenSharing,captureAudio:e.captureScreen&&e.captureAudio&&M.audioShare}:{captureScreen:e,fastScreenSharing:!1,captureAudio:!1},r=Mc(t);return r?r.toggleScreenCapturing(n):Promise.reject()}function xs(e){let t=Q.current();t&&t.toggleAnimojiCapturing(e)}async function Ss(e,t=!1){let n=Q.current();n&&await n.setVideoStream(e,t)}async function Cs(e,t){let n=Mc(t);n&&await n.toggleLocalVideo(e)}async function ws(e,t){let n=Mc(t);n&&await n.toggleLocalAudio(e)}async function Ts(e){let t=Q.current();if(t)return t.setLocalResolution(e)}async function Es(e){let t=Q.current();t&&await t.changePriorities(e)}async function Ds(e,t){let n=Q.current();if(n){let r;if(t){let e=$.getCachedRawOkIdByExternalId(t);if(!e){R.warn(`changeParticipantState: externalId not found in cache`,t);return}r=j.composeParticipantId(e,A.USER,t.deviceIdx)}await n.changeParticipantState(e,r)}}async function Os(){let e=Q.current();e&&await e.putHandsDown()}async function ks(e){let t=Q.current();t&&await t.updateDisplayLayout(e)}async function As(e){let t=Q.current();t&&await t.requestDisplayLayout(e)}async function js(e,t,n=!1){let r=$.getCachedRawOkIdByExternalId(e);if(!r){R.warn(`grantRoles: externalId not found in cache`,e);return}return Ms(r,Z.getDeviceIdx(e),t,n)}async function Ms(e,t,n,r=!1){let i=Q.current();i&&await i.grantRoles(j.composeParticipantId(e,A.USER,t),n,r)}async function Ns({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){let i=null;return e&&(i=$.getCachedRawOkIdByExternalId(e),i||R.warn(`muteParticipant: externalId not found in cache`,e)),Ps({uid:i,muteStates:t,requestedMedia:n,deviceIdx:Z.getDeviceIdx(e),roomId:r})}async function Ps({uid:e=null,muteStates:t,requestedMedia:n=[],deviceIdx:r=0,roomId:i=null}){let a=Q.current();if(a){let o=e?j.composeParticipantId(e,A.USER,r):null;await a.muteParticipant(o,t,n,i)}}async function Fs(e,t=!1,n=null){let r=$.getCachedRawOkIdByExternalId(e);if(!r){R.warn(`pinParticipant: externalId not found in cache`,e);return}return Is(r,t,Z.getDeviceIdx(e),n)}async function Is(e,t=!1,n=0,r=null){let i=Q.current();i&&await i.pinParticipant(j.composeParticipantId(e,A.USER,n),t,r)}async function Ls(e){let t=Q.current();t&&await t.updateMediaModifiers(e)}async function Rs(e){let t=Q.current();t&&await t.enableVideoSuspend(e)}async function zs(e){let t=Q.current();t&&await t.enableVideoSuspendSuggest(e)}async function Bs(e){let t=Q.current();t&&await t.changeOptions(e)}async function Vs(e,t=null){let n=null;return t&&(n=$.getCachedRawOkIdByExternalId(t),n||R.warn(`chatMessage: externalId not found in cache`,t)),Hs(e,n)}async function Hs(e,t=null){let n=Q.current();if(n){let r=t?j.composeUserId(t):null;await n.chatMessage(e,r)}}async function Us(e=10){let t=Q.current();if(t)return t.chatHistory(e)}async function Ws(e,t=null){let n=null;return t&&(n=$.getCachedRawOkIdByExternalId(t),n||R.warn(`customData: externalId not found in cache`,t)),Gs(e,n,Z.getDeviceIdx(t))}async function Gs(e,t=null,n=0){let r=Q.current();if(r){let i=t?j.composeParticipantId(t,A.USER,n):null;await r.customData(e,i)}}async function Ks(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await $.createConversation(a??j.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function qs(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=i.map(e=>Z.fromId(e));return(await $.createConversation(j.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},a)).join_link}async function Js(){let e=Q.current();return e?e.createJoinLink():Promise.reject()}async function Ys(){let e=Q.current();return e?e.removeJoinLink():Promise.reject()}async function Xs(e,t){return $.getAnonymTokenByLink(e,t)}function Zs(e){let t=Q.current();t&&t.setVolume(e)}function Qs(e){M.forceRelayPolicy=e}async function $s(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o=Q.current();return o?o.startStream(e,t,n,r,i,a):Promise.reject()}async function ec(e=null,t){let n=Q.current();return n?n.stopStream(e,t):Promise.reject()}async function tc(e=null){let t=Q.current();return t?t.publishStream(e):Promise.reject()}async function nc(){let e=Q.current();return e?e.getStreamInfo():Promise.reject()}async function rc(e){let t=Q.current();return t?t.addMovie(e):Promise.reject()}async function ic(e){let t=Q.current();return t?t.updateMovie(e):Promise.reject()}async function ac(e){let t=Q.current();return t?t.removeMovie(e):Promise.reject()}async function oc(e,t){let n=Q.current();if(n){let r=[];for(let t of e){let e,n;t.addParticipantIds&&(e=[],t.addParticipantIds.forEach(t=>{let n=$.getCachedRawOkIdByExternalId(t);n?e.push(j.composeUserId(n)):R.warn(`updateRooms addParticipant: externalId not found in cache`,t)})),t.removeParticipantIds&&(n=[],t.removeParticipantIds.forEach(e=>{let t=$.getCachedRawOkIdByExternalId(e);t?n.push(j.composeUserId(t)):R.warn(`updateRooms removeParticipant: externalId not found in cache`,e)})),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:n,countdownSec:t.countdownSec})}return n.updateRooms(r,t)}return Promise.reject()}async function sc(e,t){let n=Q.current();return n?n.activateRooms(e,t):Promise.reject()}async function cc(e=null,t=null){let n=Q.current();if(!n)return Promise.reject();let r;if(t){let e=$.getCachedRawOkIdByExternalId(t);if(!e){R.warn(`switchRoom: externalId not found in cache`,t);return}let n=Z.getDeviceIdx(t);r=j.composeParticipantId(e,A.USER,n)}return n.switchRoom(e,r)}async function lc(e){let t=Q.current();return t?t.removeRooms(e):Promise.reject()}function uc(e){M.statisticsInterval=e;let t=Q.current();if(t)return t.updateStatisticsInterval()}function dc(e){c.default.disableLog(!e),R.toggle(e)}function fc(e,...t){M.debugLog&&R.send(e,`[external]`,...t)}var pc={list:Fe,get:Ie,getJson:Le,download:Re,clear:ze,stats:Be};function mc(){let e=[[`Calls SDK ${M.sdkVersion}`,M.toJSON()],[`UserAgent:`,navigator.userAgent],[`Screen resolution:`,`${window.screen.width}x${window.screen.height}`],[`Permissions:`,`Camera: ${T.hasCameraPermission()}, Mic: ${T.hasMicrophonePermission()}`]],t=new Date,n=t.getTime(),r=t.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`});return e.map(e=>({h:r,t:n,l:yn.LOG,d:e}))}async function hc(){let e=Q.id(),t=Q.debugSessionId();if(!t||!e)throw R.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let n=await Ie({sessionId:t});if(n.length===0)throw R.error(`[uploadDebugLogs]`,`No logs found`),Error(`No logs found`);let r=n[0].t,i=n[n.length-1].t;try{return $?.uploadDebugLogs(e,r,i,JSON.stringify([...mc(),...n]))}catch(e){throw R.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function gc(e){let t=Q.current();if(t)return t.videoEffect(e)}async function _c(e,t){let n=Q.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function vc(e){let t=Q.current();t&&await t.setAudioStream(e)}async function yc(e,t=null,n=null){let r=Q.current();if(!r)return;let i=n??t?.id,a=null;if(t){let e=$.getCachedRawOkIdByExternalId(t);if(!e)throw Error(`Could not get user id to set animoji svg`);a=j.composeParticipantId(e,A.USER,Z.getDeviceIdx(t))}r.setAnimojiSvg(e,a,i)}function bc(e){let t=Q.current();t&&t.setAnimojiFill(e)}async function xc(e=null,t,n=!1){return Nc().getWaitingHall(e,t,n)}async function Sc(){return Nc().getAudienceModeHands()}async function Cc(e,t=!1){let n=Nc(),r;if(e){let t=$.getCachedRawOkIdByExternalId(e);if(!t){R.warn(`promoteParticipant: externalId not found in cache`,e);return}r=j.composeUserId(t)}return n.promoteParticipant(r,t)}async function wc(e=!1){return Nc().requestPromotion(e)}async function Tc(e=!1){return Nc().acceptPromotion(e)}async function Ec(e){return Nc().getParticipantListChunk(e)}async function Dc(e){return Nc().getParticipants(e)}async function Oc(e){return Nc().feedback(e)}function kc(e,t,n){return Nc().userFeedbackStats(e,t,n)}function Ac(e,t={},n=!1){let r=Q.current();r&&r.sendClientEvent(e,t,n)}async function jc(e,t){return Nc().enableFeatureForRoles(e,t)}function Mc(e){return e?z.get(e)??null:Q.current()}function Nc(e){let t=Mc(e);if(!t)throw Error(`Conversation not found`);return t}async function Pc(e){await $.removeHistoryRecords(e)}async function Fc(e){let t=Q.current();t&&await t.startAsr(e)}async function Ic(e){let t=Q.current();t&&await t.stopAsr(e)}async function Lc(e){let t=Q.current();t&&await t.requestAsr(e)}async function Rc(e){let t=Q.current();return t?t.startUrlSharing(e):Promise.reject()}async function zc(){let e=Q.current();return e?e.stopUrlSharing():Promise.reject()}async function Bc(e){await z.setActive(e)}function Vc(){return z.getActiveId()}function Hc(){return Q.getSyncedTime()}function Uc(){return M.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=gn),exports.Api=Wo,exports.ApiExternal=Yo,exports.ArrayDequeue=Jo,exports.AuthData=y,exports.BaseLogger=m,exports.CallDirection=Y,exports.CallType=Oa,exports.ChatRoomEventType=ka,exports.ConversationFeature=Aa,exports.ConversationOption=ja,exports.DebugMessageType=yn,exports.ExternalIdType=Ba,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return Mt}}),exports.FatalError=x,exports.HangupReason=O,exports.HangupType=D,exports.MediaOption=S,exports.MediaTrackKind=k,exports.MediaType=V,exports.MuteState=Pa,exports.ParticipantState=X,exports.ParticipantStateDataValue=qo,exports.ParticipantStatus=N,exports.RecordRole=Ko,exports.RoomsEventType=Fa,exports.Signaling=Da,exports.SignalingCommandType=B,exports.SignalingConnectionType=pr,exports.SignalingNotification=G,exports.TransportTopology=q,exports.UserRole=Ra,exports.UserType=A,exports.VolumeDetector=ro,exports.acceptCall=ls,exports.acceptPromotion=Tc,exports.activateRooms=sc,exports.addMovie=rc,exports.addParticipant=hs,exports.addParticipantInternal=gs,exports.authorize=cs,exports.browser=Zo,exports.callInternal=as,exports.callTo=is,exports.captureScreen=bs,exports.captureVmoji=xs,exports.changeAudioEffect=_c,exports.changeConversationOptions=Bs,exports.changeDevice=ys,exports.changeParticipantState=Ds,exports.changePriorities=Es,exports.changeVideoEffect=gc,exports.chatHistory=Us,exports.chatMessage=Vs,exports.chatMessageInternal=Hs,exports.createJoinLink=Js,exports.customData=Ws,exports.customDataInternal=Gs,exports.debug=dc,exports.debugLogs=pc,exports.debugMessage=fc,exports.declineCall=us,exports.enableFeatureForRoles=jc,exports.enableVideoSuspend=Rs,exports.enableVideoSuspendSuggest=zs,exports.feedback=Oc,exports.forceRelayPolicy=Qs,exports.getActiveCallId=Vc,exports.getAnonymTokenByLink=Xs,exports.getAudienceModeHands=Sc,exports.getParticipantListChunk=Ec,exports.getParticipants=Dc,exports.getStreamInfo=nc,exports.getSyncedTime=Hc,exports.getWaitingHall=xc,exports.grantRoles=js,exports.grantRolesInternal=Ms,exports.hangup=ms,exports.init=rs,exports.joinCall=ds,exports.joinCallByLink=ps,exports.joinCallInternal=fs,exports.logClientEvent=Ac,exports.muteParticipant=Ns,exports.muteParticipantInternal=Ps,exports.pinParticipant=Fs,exports.pinParticipantInternal=Is,exports.processPush=os,exports.processPushInternal=ss,exports.promoteParticipant=Cc,exports.publishStream=tc,exports.putHandsDown=Os,exports.removeHistoryRecords=Pc,exports.removeJoinLink=Ys,exports.removeMovie=ac,exports.removeParticipant=_s,exports.removeParticipantInternal=vs,exports.removeRooms=lc,exports.requestAsr=Lc,exports.requestDisplayLayout=As,exports.requestPromotion=wc,exports.setAudioEffects=ts,exports.setAudioStream=vc,exports.setLocalResolution=Ts,exports.setLogger=$o,exports.setMediaModifiers=Ls,exports.setStatisticsInterval=uc,exports.setVideoEffects=es,exports.setVideoStream=Ss,exports.setVmoji=ns,exports.setVmojiFill=bc,exports.setVmojiSvg=yc,exports.setVolume=Zs,exports.startAsr=Fc,exports.startAudienceConversation=qs,exports.startConversation=Ks,exports.startStream=$s,exports.startUrlSharing=Rc,exports.stopAsr=Ic,exports.stopStream=ec,exports.stopUrlSharing=zc,exports.switchCall=Bc,exports.switchRoom=cc,exports.toggleLocalAudio=ws,exports.toggleLocalVideo=Cs,exports.updateDisplayLayout=ks,exports.updateMovie=ic,exports.updateRooms=oc,exports.uploadDebugLogs=hc,exports.userFeedbackStats=kc,exports.utils=Qo,exports.version=Uc;
|