@vkontakte/calls-sdk 2.8.10-dev.dbd4139e.0 → 2.8.10-dev.de31b70a.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 +10 -6
- package/calls-sdk.cjs.js +10 -10
- package/calls-sdk.esm.js +10 -10
- package/classes/AudioOutput.d.ts +9 -1
- package/classes/Conversation.d.ts +3 -1
- package/classes/TransparentAudioOutput.d.ts +19 -0
- package/devtools/DevTools.d.ts +20 -0
- package/devtools/DevToolsStorage.d.ts +16 -0
- package/devtools/index.d.ts +1 -0
- package/devtools/modules/Params.d.ts +65 -0
- package/devtools/types.d.ts +15 -0
- package/enums/HangupType.d.ts +4 -0
- package/enums/TrackId.d.ts +2 -1
- package/package.json +2 -2
- package/static/Params.d.ts +8 -0
- package/static/WebRTCUtils.d.ts +1 -0
- package/types/Conversation.d.ts +2 -0
- package/types/FastJoin.d.ts +13 -0
- package/classes/Conversation.test.d.ts +0 -1
- package/classes/screenshare/PacketHistory.test.d.ts +0 -1
- package/classes/screenshare/ScreenCaptureSender.test.d.ts +0 -1
- package/classes/transport/ServerTransport.test.d.ts +0 -1
- package/default/Api.test.d.ts +0 -1
- package/default/Signaling.test.d.ts +0 -1
- package/static/Utils.test.d.ts +0 -1
- package/static/WebRTCUtils.test.d.ts +0 -1
- package/utils/ArrayDequeue.spec.d.ts +0 -1
- package/utils/IList.test.d.ts +0 -1
- package/utils/LengthPrefixed.test.d.ts +0 -1
- package/utils/P2Quantile.test.d.ts +0 -1
- package/utils/VariableLengthInteger.test.d.ts +0 -1
- package/utils/Welford.test.d.ts +0 -1
package/calls-sdk.esm.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @vkontakte/calls-sdk v2.8.10-dev.
|
|
3
|
-
* Wed,
|
|
2
|
+
* @vkontakte/calls-sdk v2.8.10-dev.de31b70a.0
|
|
3
|
+
* Wed, 08 Apr 2026 10:25:23 GMT
|
|
4
4
|
* https://st.mycdn.me/static/callssdk/2-8-10/doc/
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
var hs=Object.defineProperty;var _s=(n,r,e)=>r in n?hs(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var o=(n,r,e)=>_s(n,typeof r!="symbol"?r+"":r,e);import ls from"webrtc-adapter";var Ft=class{log(r,e,t=!1){}destroy(){}};var se=class{constructor(){o(this,"_handlers",{});o(this,"_listeners",[])}_triggerEvent(r,...e){if(Object.hasOwn(this._handlers,r))for(let t of this._handlers[r])t.apply(this,e)}addEventListener(r,e){if(typeof e!="function")throw new Error("Listener should be a function");return Object.hasOwn(this._handlers,r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!Object.hasOwn(this._handlers,r))return;e||delete this._handlers[r];let t=this._handlers[r].indexOf(e);t>=0&&this._handlers[r].splice(t,1)}subscribe(r,e,t){let i=r.addEventListener(e,t);this._listeners.push(i)}unsubscribe(){this._listeners.forEach(r=>{r.dispose()})}};var ci=class extends se{get ready(){return!0}setParticipantIdRegistry(r){}requestRealloc(){}setEndpoint(r){}setWebTransportEndpoint(r){}setConversationId(r){}readyToSend(r=!0){}cleanup(){}requestTestMode(r,e){}getNextCommandSequenceNumber(){return 0}};var wa=(te=>(te.CANCELED="CANCELED",te.REJECTED="REJECTED",te.REMOVED="REMOVED",te.HUNGUP="HUNGUP",te.MISSED="MISSED",te.BUSY="BUSY",te.FAILED="FAILED",te.NETWORK_ERROR="NETWORK_ERROR",te.KILLED="KILLED",te.BANNED="BANNED",te.HAS_ACTIVE_CALL="HAS_ACTIVE_CALL",te.CALLER_IS_BLOCKED="CALLER_IS_BLOCKED",te.NOT_FRIENDS="NOT_FRIENDS",te.CALLEE_IS_OFFLINE="CALLEE_IS_OFFLINE",te.CALLER_IS_REJECTED="CALLER_IS_REJECTED",te.UNKNOWN_ERROR="UNKNOWN_ERROR",te.UNSUPPORTED="UNSUPPORTED",te.OLD_VERSION="OLD_VERSION",te.SERVICE_DISABLED="SERVICE_DISABLED",te.SERVICE_UNAVAILABLE="SERVICE_UNAVAILABLE",te.EXTERNAL_API_ERROR="EXTERNAL_API_ERROR",te.SOCKET_CLOSED="SOCKET_CLOSED",te.ENDED="ENDED",te.KILLED_WITHOUT_DELETE="KILLED_WITHOUT_DELETE",te.ANOTHER_DEVICE="ANOTHER_DEVICE",te.NOT_FOUND="NOT_FOUND",te.VCHAT_DETAILED_ERROR="VCHAT_DETAILED_ERROR",te.TIMEOUT="TIMEOUT",te.PARTICIPANT_LIMIT_REACHED="PARTICIPANT_LIMIT_REACHED",te.FAST_START_ERROR="FAST_START_ERROR",te.CALL_TIMEOUT="CALL_TIMEOUT",te))(wa||{}),y=wa;var j=class n extends Error{constructor(e,t){super();o(this,"message");o(this,"hangup");o(this,"error");o(this,"code");o(this,"remote");o(this,"custom_error");this.name="HangupReason",this.code=t&&t.code||0,this.remote=t&&t.remote||!1,this.custom_error=t?.custom_error??null,Object.values(y).indexOf(e)>-1?this.hangup=e:this.error=e;let i=[];this.error&&i.push("error"),this.remote&&i.push("remote"),this.code&&i.push(`code: ${this.code}`),t&&t.message&&i.push(`message: '${t.message}'`),this.message=e+(i.length?` (${i.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,n)}};var Se=class Se extends Ft{constructor(e,t){super();o(this,"_externalLogger");o(this,"_api");o(this,"_batchInterval",3e3);o(this,"_batchedLogItems",[]);o(this,"_batchedClientStats",[]);o(this,"_batchedClientEvents",[]);o(this,"_batchTimeout",null);o(this,"_serverTimeDelta",0);this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}static setConversationIdProvider(e){Se._conversationIdProvider=e}static create(e,t){Se._instance||(Se._instance=new Se(e,t))}static log(e,t,i=!1){Se._instance&&Se._instance.log(e,t,i)}static logCustom(e,t,i=!1){Se._instance&&Se._instance.logCustom(e,t,i)}static logClientStats(e,t=!1){Se._instance&&Se._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){Se._instance&&Se._instance.logClientEvent(e,t)}static destroy(){Se._instance&&Se._instance.destroy(),Se._instance=null}log(e,t,i=!1){let a={};typeof t<"u"&&(a.param=t),this._logInternal(e,a,i),this._externalLogger&&this._externalLogger.log(e,t,i)}logCustom(e,t,i=!1){this._logInternal(e,t,i)}logClientStats(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(i).forEach(a=>{i[a]===void 0&&delete i[a]}),this._batchedClientStats.push(i),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(i),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}_logInternal(e,t,i){let a={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:this._getConversationId()}),uid:this._api.getUserId()};this._batchedLogItems.push(a),(i||!this._batchTimeout)&&this._sendBatch()}_getConversationId(){if(Se._conversationIdProvider)try{return Se._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedLogItems.length>0&&(this._sendLogItems(this._batchedLogItems),this._batchedLogItems=[],e=!0),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)}_sendLogItems(e){this._api.log(e)}_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}};o(Se,"_instance"),o(Se,"_conversationIdProvider",null);var R=Se;import{Any as Ns,Arr as an,Int as G,Nil as Mt,Str as nn,Bool as ta}from"messagepack";var ka=(N=>(N.RECOVER="recover",N.ACCEPT_CALL="accept-call",N.ADD_PARTICIPANT="add-participant",N.REMOVE_PARTICIPANT="remove-participant",N.HANGUP="hangup",N.TRANSMIT_DATA="transmit-data",N.ACCEPT_PRODUCER="accept-producer",N.ALLOCATE_CONSUMER="allocate-consumer",N.CHANGE_MEDIA_SETTINGS="change-media-settings",N.CHANGE_PARTICIPANT_STATE="change-participant-state",N.CHANGE_STREAM_PRIORITIES="change-streams-priorities",N.UPDATE_DISPLAY_LAYOUT="update-display-layout",N.REPORT_PERF_STAT="report-perf-stat",N.REPORT_SHARING_STAT="report-sharing-stat",N.REPORT_NETWORK_STAT="report-network-stat",N.RECORD_START="record-start",N.RECORD_STOP="record-stop",N.RECORD_PUBLISH="record-publish",N.RECORD_SET_CONF="record-set-conf",N.RECORD_GET_STATUS="record-get-status",N.SWITCH_MICRO="switch-micro",N.SWITCH_TOPOLOGY="switch-topology",N.REQUEST_REALLOC="request-realloc",N.CHAT_MESSAGE="chat-message",N.CHAT_HISTORY="chat-history",N.CUSTOM_DATA="custom-data",N.GRANT_ROLES="grant-roles",N.MUTE_PARTICIPANT="mute-participant",N.ENABLE_FEATURE_FOR_ROLES="enable-feature-for-roles",N.PIN_PARTICIPANT="pin-participant",N.UPDATE_MEDIA_MODIFIERS="update-media-modifiers",N.CHANGE_OPTIONS="change-options",N.GET_WAITING_HALL="get-waiting-hall",N.GET_PARTICIPANT_LIST_CHUNK="get-participant-list-chunk",N.GET_PARTICIPANTS="get-participants",N.PROMOTE_PARTICIPANT="promote-participant",N.REQUEST_TEST_MODE="request-test-mode",N.ADD_MOVIE="add-movie",N.UPDATE_MOVIE="update-movie",N.REMOVE_MOVIE="remove-movie",N.START_URL_SHARING="start-url-sharing",N.STOP_URL_SHARING="stop-url-sharing",N.GET_ROOMS="get-rooms",N.UPDATE_ROOMS="update-rooms",N.ACTIVATE_ROOMS="activate-rooms",N.REMOVE_ROOMS="remove-rooms",N.SWITCH_ROOM="switch-room",N.FEEDBACK="feedback",N.ASR_START="asr-start",N.ASR_STOP="asr-stop",N.REQUEST_ASR="request-asr",N.REQUEST_PROMOTION="request-promotion",N.ACCEPT_PROMOTION="accept-promotion",N.GET_HAND_QUEUE="get-hand-queue",N.ENABLE_VIDEO_SUSPEND="enable-video-suspend",N.ENABLE_VIDEO_SUSPEND_SUGGEST="enable-video-suspend-suggest",N.PUT_HANDS_DOWN="put-hands-down",N.CHANGE_SIMULCAST="change-simulcast",N))(ka||{}),x=ka;var Oa=(J=>(J.MIC_CAMERA_PERMISSION="mic_camera",J.CAMERA_PERMISSION="camera",J.MIC_PERMISSION="mic",J.CAMERA_ACCESS="cameralock",J.MIC_ACCESS="miclock",J.MIC_NOT_FOUND="nomic",J.SCREEN_PERMISSION="screenpermission",J.SCREEN_ACCESS="screenlock",J.CONNECTION="connection",J.NETWORK="network",J.UNKNOWN="unknown",J.UNSUPPORTED="unsupported",J.SIGNALING_FAILED="signalingfailed",J.API="api",J.AUTH="auth",J.OVERCONSTRAINED="overconstrained",J))(Oa||{}),oe=Oa;var xa=(s=>(s.AUDIO="AUDIO",s.VIDEO="VIDEO",s.SCREEN_SHARING="SCREEN_SHARING",s.MOVIE_SHARING="MOVIE_SHARING",s.AUDIO_SHARING="AUDIO_SHARING",s.ANIMOJI="ANIMOJI",s))(xa||{}),de=xa;var Na=(re=>(re.ACCEPT_CONCURRENT="callAcceptConcurrent",re.ACCEPT_INCOMING="callAcceptIncoming",re.ACCEPTED_OUTGOING="callAcceptedOutgoing",re.ADD_PARTICIPANT="callAddParticipant",re.CALL_SPEC_ERROR="callSpecError",re.DECLINE_INCOMING="callDeclineIncoming",re.DEVICE_CHANGED="callDeviceChanged",re.DEVICES="callDevices",re.ERROR="callError",re.HANGUP="callHangup",re.ICE_CONNECTION_STATE="callIceConnectionState",re.ICE_CONNECTION_TYPE="callIceConnectionType",re.ICE_RESTART="callIceRestart",re.JOIN_CONVERSATION="callJoinConversation",re.MEDIA_STATUS="callMediaStatus",re.OUTGOING_CALL="callStart",re.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",re.PAT_ALLOCATED="patAllocate",re.PAT_DEALLOCATED="patDeallocate",re.PAT_ERROR="patError",re.PAT_OUTDATED_RESPONSE="patOutdatedResponse",re.PAT_WAITING_TIME_ERROR="patWaitingTimeError",re.POOR_CONNECTION="callPoorConnection",re.PUSH="callPush",re.RECONNECT="callReconnect",re.RELAY_POLICY="callForceRelay",re.REMOVE_PARTICIPANT="callRemoveParticipant",re.SOCKET_ACTION="callSocketAction",re.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",re))(Na||{}),D=Na;var Fe=class Fe{static get sessionKey(){return Fe._sessionKey}static set sessionKey(r){Fe._sessionKey=r}static get sessionSecretKey(){return Fe._sessionSecretKey}static set sessionSecretKey(r){Fe._sessionSecretKey=r}static get accessToken(){return Fe._accessToken}static set accessToken(r){Fe._accessToken=r}static isEmpty(){return!Fe._sessionKey}};o(Fe,"_sessionKey"),o(Fe,"_sessionSecretKey"),o(Fe,"_accessToken");var be=Fe;var La=(e=>(e.USER="USER",e.GROUP="GROUP",e))(La||{}),ne=La;var mt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},di="L1T2",Ba=[{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}],gs={h:1,m:2,l:4};function Fa(n,r){return!n||!r?n===r:n.streams.length===r.streams.length?n.streams.every((e,t)=>I.isObjectsEquals(e,r.streams[t])):!1}function Ua(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:Ba[0].bitrate}function li(n=mt.WIDTH,r=mt.HEIGHT,e=Ba){let t=["h","m","l"],i=Math.max(n,r),a=1;i>=960?a=3:i>=480&&(a=2);let s={streams:[]},c=30,u=Ua(i,e)??mt.BITRATE;for(let l=0;l<a;l++){let m=t[l];s.streams.push({rid:m,width:n,height:r,fps:c,bitrate:u}),n=Math.round(n/2),r=Math.round(r/2),u=Ua(Math.max(n,r),e)??Math.round(u/2)}return s}function Bi(n){return n?gs[n]??1:1}var Va=typeof Object.fromEntries=="function"?Object.fromEntries:function(n){if(!n||!n[Symbol.iterator])throw new Error("Object.fromEntries() requires a single iterable argument");let r={};for(let[e,t]of n)r[e]=t;return r};async function ja(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var Vt=":",Vi="d",fs=533,Fi="a=fmtp:",Ss="sps-pps-idr-in-keyframe=1",Br;(Xe=>{let n=/[\r\n]+/,r=`\r
|
|
8
|
-
`;function e(
|
|
9
|
-
`);for(let k of C)if(k.startsWith("a=fingerprint")){let W=k.split(" ");if(W.length===2){T=W[1];break}}if(!T)return BigInt(-1);let w=T.split(":"),f=BigInt(0);for(let k=Math.min(7,w.length-1);k>=0;k--){let W=BigInt(parseInt(w[k],16));f<<=BigInt(8),f|=W}return BigInt.asIntN(64,f)}Xe.sdpFingerprint=Ta;async function te(_){return new Promise(T=>window.setTimeout(T,_))}Xe.delay=te;function Ra(_,T,C){let w=[];return _.getSenders().forEach(f=>kr(T,f,f.track,C,w)),w}Xe.applySettings=Ra;function kr(_,T,C,w,f){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!_||!C||C.kind!=="video")return;let k=C.getSettings();if(!k)return;let W=_.maxBitrateK?_.maxBitrateK*1024:null,U=k.width,$=k.height,Ee=U&&$&&_.maxDimension?Math.max(1,Math.max(U,$)/_.maxDimension):null,N=_.maxFramerate||null;if(U&&$&&_.maxDimension&&_.maxDimension>Math.max(U,$)){let _e=Math.round(U*$/256),ke=(Math.round(_e*fs/1e4)+1)*1e4;W=W===null?ke:Math.min(ke,W)}let ve=_.degradationPreference||"balanced",ge=w[C.id];if(ge&&ge.bitrate===W&&ge.scaleResolutionDownBy===Ee&&ge.maxFramerate===N&&ge.degradationPreference===ve){f[C.id]=ge;return}f[C.id]={bitrate:W,scaleResolutionDownBy:Ee,maxFramerate:N,degradationPreference:ve};let De=T.getParameters();if(De.encodings||(De.encodings=[{}]),De.encodings.length>1&&U&&$&&_.maxDimension){let _e=Math.round(_.maxDimension*1.35),ke=Math.max(U,$),Tt=li(U,$,_?.bitrates?.generic),Bt=Tt.streams.length;d.log(`applyVideoTrackSettings: maxDim=${_.maxDimension} targetDim=${_e} track=${U}x${$} sim=${JSON.stringify(Tt)}`),De.encodings.forEach((Ze,oi)=>{Ze.scaleResolutionDownBy=Bi(Ze.rid);let Aa=Math.round(ke/Ze.scaleResolutionDownBy);oi<Bt-1?Ze.active=Aa<_e:oi>=Bt?Ze.active=!1:Ze.active=!0,oi<Bt?Ze.maxBitrate=Tt.streams[oi].bitrate:Ze.maxBitrate=0,Ze.scalabilityMode=di})}else De.encodings.forEach(_e=>{_?.scalabilityMode&&(_e.scalabilityMode=_.scalabilityMode),W?_e.maxBitrate=W:delete _e.maxBitrate,Ee?_e.scaleResolutionDownBy=Ee:delete _e.scaleResolutionDownBy,N?_e.maxFramerate=N:delete _e.maxFramerate});if(De.degradationPreference=ve,De.encodings.length>0){T.setParameters?.(De).catch(ke=>{d.error("Failed to set sender parameters",De,ke)});let _e=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(_e.encodings)}`)}}Xe.applyVideoTrackSettings=kr;function Or(_,T){Array.isArray(T)||(T=[T]);for(let C of T)if(_.includes(C))return!0;return!1}Xe.includesOneOf=Or;function xr(_){return Object.entries(_.participantState?.state||{}).reduce((T,[C,w])=>(_.participantState&&(T[C]={ts:_.participantState.stateUpdateTs[C],state:w}),T),{})}Xe.mapParticipantState=xr;function Ca(_){let T=_.map(C=>({uid:C.externalId,mediaSettings:C.mediaSettings,status:C.status,muteStates:C.muteStates,unmuteOptions:C.unmuteOptions,participantState:C.participantState,markers:C.markers,movieShareInfos:C.movieShareInfos,roles:C.roles}));return p.filterObservers?T.filter(C=>!C.uid.observer):T}Xe.mapSharedParticipants=Ca;function Pa(_,T){let C=Object.keys(_),w=Object.keys(T);if(C.length!==w.length)return!1;for(let f of C)if(!Object.hasOwn(w,f)||_[f].state!==T[f].state||_[f].ts!==T[f].ts)return!1;return!0}Xe.isEqualParticipantState=Pa;function Nr(_,T,C=!1){let w=Object.keys(_),f=Object.keys(T);if(w.length!==f.length)return!1;for(let k of w){if(!Object.hasOwn(T,k))return!1;let W=_[k],U=T[k];if(C&&ae(W)&&ae(U))return Nr(W,U,C);if(W!==U)return!1}return!0}Xe.isObjectsEquals=Nr;function ya(_,T){if(_.length!==T.length)return!1;for(let C of _)if(T.indexOf(C)<0)return!1;return!0}Xe.isArraysEquals=ya;function ba(_){return!Object.keys(_).length}Xe.isEmptyObject=ba;function Ma(_,T){if(!_&&!T)return 0;if(!_||!T)return _?-1:1;return w(T.rank,_.rank)||w(_.ts,T.ts)||C(_,T);function C(f,k){let W={[ne.USER]:0,[ne.GROUP]:1},{compositeUserId:U,deviceIdx:$}=si(f.id),{compositeUserId:Ee,deviceIdx:N}=si(k.id),{id:ve,type:ge}=ni(U),{id:De,type:_e}=ni(Ee);return w(W[ge],W[_e])||w(ve,De)||w($,N)}function w(f,k){return f<k?-1:f===k?0:1}}Xe.participantMarkerCompare=Ma;function me(_,T){let C=Object.entries(_).filter(([,w])=>Array.isArray(T)?!T.includes(w):w!==T);return Va(C)}Xe.objectFilterOutValues=me;function F(_,T,C){let w=C;for(let f in _)Object.hasOwn(_,f)&&(w=T(w,_[f],f));return w}Xe.objectReduce=F,Xe.setImmediate=(()=>{let _=1,T={},C=null;return typeof MessageChannel<"u"&&(C=new MessageChannel,C.port1.onmessage=w=>{let f=w.data;T[f]&&(T[f](),delete T[f])}),function(w){if(C&&document.visibilityState==="hidden"){let k=_;return _=_>=Number.MAX_SAFE_INTEGER?1:_+1,T[k]=w,C.port2.postMessage(k),()=>{T[k]&&delete T[k]}}let f=setTimeout(w,0);return()=>clearTimeout(f)}})();function ae(_){return _!==null&&typeof _=="object"&&!Array.isArray(_)}Xe.isObject=ae;function fe(_,T,C,w){function f(U,$){let Ee=0,N=U.length,ve=!1;for(let ge=0;ge<U.length;ge++)if(!ve&&U[ge].startsWith("m=video")&&(Ee=ge),U[ge].startsWith("a=mid:"+$)&&(ve=!0),ve&&U[ge].startsWith("m=")){N=ge;break}return{start:Ee,end:N}}function k(U,$,Ee,N,ve,ge,De){let _e="a=rid:"+N+" send";for(let ke=$;ke<Ee;ke++)if(U[ke]===_e){let Bt=_e+" max-width="+ge+";max-height="+De+";max-br="+ve;U[ke]=Bt}}let W=T?.sender;if(W&&W.track&&T.mid){let U=_.split(n),{start:$,end:Ee}=f(U,T.mid),N=W.getParameters();if(N.encodings)return N.encodings.forEach(ve=>{let ge=ve.rid,De=ve.maxBitrate,_e=ve.scaleResolutionDownBy;if(C&&w&&_e){let ke=""+Math.round(C/_e),Tt=""+Math.round(w/_e);k(U,$,Ee,ge,De,ke,Tt)}}),U.join(r)}return _}Xe.patchSimulcastAnswerSdp=fe})(Br||(Br={}));var I=Br;var g=class g{static set(r){Object.hasOwn(r,"voiceParams")&&(Object.assign(g._params.voiceParams,r.voiceParams),delete r.voiceParams),Object.hasOwn(r,"specListenerParams")&&(Object.assign(g._params.specListenerParams,r.specListenerParams),delete r.specListenerParams),Object.hasOwn(r,"apiAuth")&&(be.accessToken=r.apiAuth.accessToken,be.sessionKey=r.apiAuth.sessionKey,be.sessionSecretKey=r.apiAuth.sessionSecretKey),Object.assign(g._params,I.objectFilterOutValues(r,void 0))}static getScreenFrameRate(r){return r?g._params.fastScreenShareFrameRate:g._params.screenFrameRate}static get(r){return g._params[r]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.10-dev.dbd4139e.0"}static get debug(){return g._params.debug}static get protocolVersion(){return g._params.joinFromMultipleDevices?6:5}static get platform(){return g._params.platform}static set platform(r){g._params.platform=r}static get clientStatsPlatform(){return g._params.clientStatsPlatform}static set clientStatsPlatform(r){g._params.clientStatsPlatform=r}static get clientType(){return g._params.clientType}static set clientType(r){g._params.clientType=r}static get externalUserType(){return g._params.externalUserType}static set externalUserType(r){g._params.externalUserType=r}static get device(){return g._params.device}static get apiKey(){return g._params.apiKey}static get apiEnv(){return g._params.apiEnv}static get apiBaseUrl(){return g._params.apiBaseUrl}static set apiBaseUrl(r){g._params.apiBaseUrl=r}static apiEndpoint(r){switch(r??g.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 g._params.apiEnv}}static get apiTimeout(){return g._params.apiTimeout}static get apiMaxAttempt(){return g._params.apiMaxAttempt}static get authToken(){return g._params.authToken}static set authToken(r){g._params.authToken=r}static get anonymToken(){return g._params.anonymToken}static set anonymToken(r){g._params.anonymToken=r}static get domain(){return g._params.domain}static get externalDomain(){return g._params.externalDomain}static get iceServers(){return g._params.iceServers}static set iceServers(r){g._params.iceServers=r}static get wssBase(){return g._params.wssBase}static set wssBase(r){g._params.wssBase=r}static get wtsBase(){return g._params.wtsBase}static set wtsBase(r){g._params.wtsBase=r}static get wssToken(){return g._params.wssToken}static set wssToken(r){g._params.wssToken=r}static get signalingReconnectDelay(){return g._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return g._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return g._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return g._params.waitConnectionDelay}static get waitResponseDelay(){return g._params.waitResponseDelay}static get waitMessageDelay(){return g._params.waitMessageDelay}static get waitAnotherTabDelay(){return g._params.waitAnotherTabDelay}static get debugLog(){return g._params.debugLog}static get forceRelayPolicy(){return g._params.forceRelayPolicy}static set forceRelayPolicy(r){g._params.forceRelayPolicy=r}static get videoMinWidth(){return g._params.videoMinWidth}static get videoMaxWidth(){return g._params.videoMaxWidth}static set videoMaxWidth(r){g._params.videoMaxWidth=r}static get videoMinHeight(){return g._params.videoMinHeight}static get videoMaxHeight(){return g._params.videoMaxHeight}static set videoMaxHeight(r){g._params.videoMaxHeight=r}static get videoAspectRatio(){return g._params.videoAspectRatio}static get videoFrameRate(){return g._params.videoFrameRate}static get videoFacingMode(){return g._params.videoFacingMode||(M.isMobile()?"user":null)}static set videoFacingMode(r){g._params.videoFacingMode=r}static get displaySurface(){return g._params.displaySurface}static get audioEffects(){return g._params.audioEffects}static set audioEffects(r){g._params.audioEffects=r,g._params.audioEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffects(){return g._params.videoEffects}static set videoEffects(r){g._params.videoEffects=r,g._params.videoEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffectMaxWidth(){return g._params.videoEffectMaxWidth}static set videoEffectMaxWidth(r){g._params.videoEffectMaxWidth=r}static get videoEffectMaxHeight(){return g._params.videoEffectMaxHeight}static set videoEffectMaxHeight(r){g._params.videoEffectMaxHeight=r}static get vmoji(){return g._params.vmoji?.isBrowserSupported()?g._params.vmoji:null}static set vmoji(r){g._params.vmoji=r}static get vmojiOptions(){return g._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(r){g._params.vmojiOptions=r}static get voiceParams(){return g._params.voiceParams}static get specListenerParams(){return g._params.specListenerParams}static get iceRestartWaitTime(){return g._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return g._params.transportConnectionWaitTime}static get statisticsInterval(){return g._params.statisticsInterval}static set statisticsInterval(r){g._params.statisticsInterval=r}static get networkStatisticsInterval(){return g._params.networkStatisticsInterval}static get perfStatReportEnabled(){return g._params.perfStatReportEnabled}static get callStatReportEnabled(){return g._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return g._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return g._params.enableLogPerfStatReport}static get asrDataChannel(){return g._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return g._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return g._params.screenShareWebmBuilder}static get noiseSuppression(){return g._params.noiseSuppression}static get preferH264(){return g._params.preferH264}static get preferVP9(){return g._params.preferVP9}static get audioNack(){return g._params.audioNack}static get movieShare(){return g._params.movieShare&&g.videoTracksCount>0}static get videoTracksCount(){return Number(g._params.videoTracksCount)}static get breakVideoPayloadTypes(){return g._params.breakVideoPayloadTypes}static get useCallsToContacts(){return g._params.useCallsToContacts}static get useParticipantListChunk(){return g._params.useParticipantListChunk&&g.videoTracksCount>0}static get useRooms(){return g._params.useRooms}static get useChatRooms(){return g._params.useChatRooms}static get addParticipant(){return g._params.addParticipant}static get waitForAdminInGroupCalls(){return g._params.waitForAdminInGroupCalls}static get participantListChunkInitIndex(){return g._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return g._params.participantListChunkInitCount??null}static get filterObservers(){return g._params.filterObservers}static get muteMode(){return g._params.muteMode}static get preserveAudioTracks(){return g._params.preserveAudioTracks}static get audioShare(){return M.isAudioShareSupported()&&g._params.audioShare}static get audioShareWindowInclude(){return g._params.audioShareWindowInclude}static get audioShareSystemInclude(){return g._params.audioShareSystemInclude}static get fastScreenShare(){return g._params.fastScreenShare}static get screenShareCongestionControl(){return g._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return g._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return g._params.fastScreenShareWidth}static get fastScreenShareHeight(){return g._params.fastScreenShareHeight}static get consumerFastScreenShare(){return g._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return g._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return g._params.videoSuspend}static get enumerateDevicesDelay(){return g._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return g._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return g._params.enableVideoEffectsFpsDegradation}static get simulcast(){return g._params.simulcast}static get webtransport(){return g._params.webtransport}static get webtransportFF(){return g._params.webtransportFF}static toJSON(){return{apiKey:g._params.apiKey,apiEnv:g._params.apiEnv,audioShare:g._params.audioShare,audioShareWindowInclude:g._params.audioShareWindowInclude,audioShareSystemInclude:g._params.audioShareSystemInclude,useCallsToContacts:g._params.useCallsToContacts,useParticipantListChunk:g._params.useParticipantListChunk,useRooms:g._params.useRooms,useChatRooms:g._params.useChatRooms,addParticipant:g._params.addParticipant,fastScreenShare:g._params.fastScreenShare,participantListChunkInitCount:g._params.participantListChunkInitCount,screenShareCongestionControl:g._params.screenShareCongestionControl,screenShareCongestionControlThreshold:g._params.screenShareCongestionControlThreshold,videoTracksCount:g._params.videoTracksCount,asrDataChannel:g._params.asrDataChannel,videoMaxHeight:g._params.videoMaxHeight,videoMaxWidth:g._params.videoMaxWidth,videoEffectMaxHeight:g._params.videoEffectMaxHeight,videoEffectMaxWidth:g._params.videoEffectMaxWidth,videoSuspend:g._params.videoSuspend,debugLog:g._params.debugLog,callStatReportEnabled:g._params.callStatReportEnabled,joinFromMultipleDevices:g._params.joinFromMultipleDevices,movieShare:g._params.movieShare,clientType:g._params.clientType,clientStatsPlatform:g._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:g._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:g._params.switchVideoAtBadNetwork,simulcast:g._params.simulcast,webtransport:g._params.webtransport,webtransportFF:g._params.webtransportFF}}};o(g,"_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,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});var p=g;function Ha(n,r){return!(n.isAudioEnabled!==r.isAudioEnabled||n.isVideoEnabled!==r.isVideoEnabled||n.isScreenSharingEnabled!==r.isScreenSharingEnabled||n.isFastScreenSharingEnabled!==r.isFastScreenSharingEnabled||n.isAudioSharingEnabled!==r.isAudioSharingEnabled||n.isAnimojiEnabled!==r.isAnimojiEnabled)}function Ce(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var Ga=n=>n.stop(),pi=n=>n.getTracks().forEach(Ga),Wa=n=>n.getVideoTracks().forEach(Ga);async function ji(n,r){try{let e=typeof r.width=="number"?r.width:void 0,t=typeof r.height=="number"?r.height:void 0;await n.applyConstraints({...r,...e&&{width:{max:e,ideal:e}},...t&&{height:{max:t,ideal:t}}})}catch(e){d.warn("setVideoConstraints failed",e)}}var Hi=class extends se{constructor(){super(...arguments);o(this,"FPS_LIMITS",[13,20,Math.max(p.videoFrameRate,25)]);o(this,"THRESHOLD",.8);o(this,"HISTORY_LENGTH",10);o(this,"_fpsMeterUnsubscribe",null);o(this,"_fpsHistory",{cursor:0,arr:[]});o(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(t){d.warn("VideoEffectsFpsLimiter error",t)}}_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 t=this._fpsHistory.arr.reduce((a,s)=>a+s,0)/this.HISTORY_LENGTH,i=this.FPS_LIMITS[this._fpsLimitCursor];t<i*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),i!==this.fpsLimit&&this._triggerEvent("fps-limit",this.fpsLimit)}}_assertsVideoEffect(e){if(!("addFpsMeterListener"in e))throw new Error("Outdated VideoEffect version")}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}};var We=(i=>(i.audio="audio",i.video="video",i.screen="screen",i.audioshare="audioshare",i))(We||{});var Gi=class extends se{constructor(){super();o(this,"_stream",null);o(this,"_screenTrack",null);o(this,"_audioShareTrack",null);o(this,"_screenShareTrack",null);o(this,"_sendVideoTrack",null);o(this,"_cameraVideoTrack",null);o(this,"_micAudioTrack",null);o(this,"_audioEffectsTrack",null);o(this,"_mediaSettings",Ce());o(this,"_videoStatusOnScreenCapturingEnabled",!1);o(this,"_effect",null);o(this,"_audioEffectParams",null);o(this,"_onDeviceChange");o(this,"_animojiEnabled",!1);o(this,"_videoEffectsFpsLimiter");o(this,"videoTrackMuteHandler",()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)});this._initDeviceChangeListener(),p.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),p.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Hi,this._videoEffectsFpsLimiter.addEventListener("fps-limit",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=[de.AUDIO],t=!0){if(this._stream)return;let i=e.includes(de.VIDEO),a=e.includes(de.AUDIO),s=e.includes(de.ANIMOJI);if(!M.isBrowserSupported())throw new j(oe.UNSUPPORTED);try{this._stream=await M.getUserMedia(i,a,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=i&&this._stream.getVideoTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(c){throw new j(c)}}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(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,i){let a=this.getStream(),s=this.getSendAudioTrack(),c=this.getSendVideoTrack(i);if(!a||!s&&!c&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,a),c&&!t&&e.addTrack(c,a)}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(oe.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Wa(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=M.getSavedMicrophone(),i=M.getSavedCamera(),a=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,s=this._mediaSettings.isVideoEnabled&&i?.groupId!==e.camera?.groupId;try{a&&await this._changeAudioInput(),s&&await this._changeVideoInput()}catch{}},M.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&M.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await M._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=i.getVideoTracks()[0],!this._stream)pi(i);else{let a=await this._setEffect(this._effect,this.cameraVideoTrack);R.log(D.DEVICE_CHANGED,t),d.log("Video stream changed"),await this._replaceLocalTrack(a),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw R.log(D.ERROR,"change_video"),d.warn("Camera change failed",t),t}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await M.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)pi(t);else{let i=await this._applyAudioEffect();R.log(D.DEVICE_CHANGED,"audio"),d.log("Audio stream changed",i),await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw R.log(D.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await M.getScreenMedia(e,t),!this._stream)pi(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),R.log(D.DEVICE_CHANGED,"screen"),d.log("Screen capturing started"),this._screenTrack=a,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,p.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(a.contentHint="motion",this._screenShareTrack=a),i.getAudioTracks().length>0){let s=i.getAudioTracks()[0];s.contentHint="music",this._audioShareTrack=s,await this._replaceLocalTrack(s),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&d.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:a}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(a){throw R.log(D.ERROR,"screen"),d.warn("Screen capturing failed",a),a}}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=M.getSilentMediaTrack();return e.contentHint="music",e.stop(),e}getBlackScreenShareTrack(){let e=M.getBlackMediaTrack();return e.contentHint="motion",e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let i=this._stream.getTracks().find(a=>a.kind===e.kind&&a.contentHint===e.contentHint);i?.id!==e.id&&(i?(i!==this._audioEffectsTrack&&i.stop(),this._stream?.removeTrack(i),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(i){return d.warn("Video effect failed",i),t}}_stopEffect(){if(p.videoEffects)try{p.videoEffects.stopEffect()}catch(e){d.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),p.videoEffects&&(this._effect=null,p.videoEffects.destroy()),p.audioEffects&&p.audioEffects.destroy(),this._stream&&(pi(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),M.getAudioContext()?.suspend().catch(t=>d.error(t)),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 i=await M._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=M.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(i,a)=>{await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=a,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})};if(e)try{let i=await M.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw p.audioEffects?.pause(),t(M.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else p.audioEffects?.pause(),t(M.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 new Error("Local stream not found");if(!this.cameraVideoTrack)throw new Error("Local video track not found");let i=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,i)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(t=>!t.contentHint);if(!e)throw new Error("Local audio track not found");if(e.enabled)return e.applyConstraints({noiseSuppression:p.noiseSuppression})}async videoEffect(e){if(!p.videoEffects)throw new Error("Video Effects library is not set");if(R.log(D.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 i=this.cameraVideoTrack.clone(),a=new MediaStream([i]);await this._applyVideoConstraints(i),await this._changeVideoInput(a)}catch(i){this._effect=t;let a=this.cameraVideoTrack.clone(),s=new MediaStream([a]);throw await this._changeVideoInput(s),i}}}async audioEffect(e){if(!p.audioEffects)throw new Error("Audio Effects library is not set");if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!I.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let i=this._micAudioTrack.clone(),a=new MediaStream([i]);await this._changeAudioInput(a)}catch(i){this._audioEffectParams=t;let a=this._micAudioTrack.clone(),s=new MediaStream([a]);throw await this._changeAudioInput(s),i}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<p.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(t=>{d.warn("MediaSource handleVideoEffectsLowFps error",t)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??p.videoFrameRate;return this._effect?Math.min(e,p.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await ji(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}};var ui=class{constructor(){o(this,"_cameraPermissionStatus");o(this,"_microphonePermissionStatus");o(this,"_listener")}static isSupported(){return M.browserName()!=="Firefox"&&"permissions"in navigator&&"PermissionStatus"in window}async init(r){try{let[e,t]=await Promise.all([navigator.permissions.query({name:"camera"}),navigator.permissions.query({name:"microphone"})]);this._cameraPermissionStatus=e,this._microphonePermissionStatus=t,this._listener=r,this._cameraPermissionStatus.onchange=i=>this.handlePermissionChange(i),this._microphonePermissionStatus.onchange=i=>this.handlePermissionChange(i)}catch(e){d.warn("NavigatorPermissions init error",e)}}handlePermissionChange(r){let e=r.target;if(e instanceof PermissionStatus){let{name:t,state:i}=e;switch(t){case"audio_capture":this._listener("microphone",i);break;case"video_capture":this._listener("camera",i);break}}}getPermissionState(r){let e=null;switch(r){case"camera":e=this._cameraPermissionStatus.state;break;case"microphone":e=this._microphonePermissionStatus.state;break}return e}};var Vr=(l=>(l.WAITING_HALL="WAITING_HALL",l.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",l.WAITING="WAITING",l.CONNECTING="CONNECTING",l.CONNECTED="CONNECTED",l.RECONNECT="RECONNECT",l.ERROR="ERROR",l.HANGUP="HANGUP",l.PERMISSIONS="PERMISSIONS",l))(Vr||{});function H(n,...r){let e=p.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function he(n,r,...e){if(p.filterObservers){if(Array.isArray(r)){if(r=r.filter(t=>!t.observer),!r.length)return}else if(r.observer)return}H(n,r,...e)}function Pe(n){return Object.assign({},n)}function Pt(n){return n.slice()}var Fr;(bc=>{function n(S,A){H("onLocalStream",S,Pe(A))}bc.onLocalStream=n;function r(S,A){H("onScreenStream",S,Pe(A))}bc.onScreenStream=r;function e(S,A){H("onVmojiStream",S,Pe(A))}bc.onVmojiStream=e;function t(S){H("onVmojiError",S)}bc.onVmojiError=t;function i(S,A){H("onLocalStreamUpdate",Pe(S),A)}bc.onLocalStreamUpdate=i;function a(S){d.debug("Local status:",S),H("onLocalStatus",S)}bc.onLocalStatus=a;function s(S,A){he("onRemoteStream",S,A)}bc.onRemoteStream=s;function c(S,A){he("onRemoteLive",S,A)}bc.onRemoteLive=c;function u(S,A){he("onLocalLive",S,A)}bc.onLocalLive=u;function l(S,A){he("onRemoteLiveUpdate",S,A)}bc.onRemoteLiveUpdate=l;function m(S,A){he("onLocalLiveUpdate",S,A)}bc.onLocalLiveUpdate=m;function h(S,A){he("onRemoteScreenStream",S,A)}bc.onRemoteScreenStream=h;function E(S,A){he("onRemoteVmojiStream",S,A)}bc.onRemoteVmojiStream=E;function P(S,A,K){he("onRemoteStreamSuspended",S,A,K)}bc.onRemoteStreamSuspended=P;function b(S,A,K,Le,Rt){he("onConversation",S,Pe(A),Pe(K),Le,Rt)}bc.onConversation=b;function V(S){S&&H("onConversationParticipantListChunk",S)}bc.onConversationParticipantListChunk=V;function J(S,A,K){he("onRemoteMediaSettings",S,Pe(A),K)}bc.onRemoteMediaSettings=J;function ce(S,A){he("onLocalMediaSettings",S,Pe(A))}bc.onLocalMediaSettings=ce;function Ie(S,A,K){he("onRemoteSharedMovieInfo",S,Pe(A),K)}bc.onRemoteSharedMovieInfo=Ie;function Te(S,A,K){he("onRemoteSharedMovieStoppedInfo",S,Pe(A),K)}bc.onRemoteSharedMovieStoppedInfo=Te;function Y(S,A,K){he("onLocalSharedMovieInfo",S,Pe(A),K)}bc.onLocalSharedMovieInfo=Y;function Re(S,A,K){he("onLocalSharedMovieStoppedInfo",S,Pe(A),K)}bc.onLocalSharedMovieStoppedInfo=Re;function Q(S,A,K){he("onRemoteSharedUrl",S,A,K)}bc.onRemoteSharedUrl=Q;function ai(S,A){he("onParticipantAdded",S,A)}bc.onParticipantAdded=ai;function va(S,A){he("onParticipantJoined",S,A)}bc.onParticipantJoined=va;function Ia(S,A=!1){H("onLocalParticipantState",Pe(S),A)}bc.onLocalParticipantState=Ia;function ni(S,A,K){he("onRemoteParticipantState",S,Pe(A),K)}bc.onRemoteParticipantState=ni;function si(S,A){H("onRemoteParticipantsState",S,A)}bc.onRemoteParticipantsState=si;function Ea(S,A,K=null){d.debug("Remote status:",A,S),he("onRemoteStatus",S,A,K)}bc.onRemoteStatus=Ea;function re(){H("onPermissionsRequested")}bc.onPermissionsRequested=re;function Ta(S,A){H("onPermissionsError",S,A)}bc.onPermissionsError=Ta;function te(S,A){he("onRemoteRemoved",S,A)}bc.onRemoteRemoved=te;function Ra(S,A,K){H("onCallState",S,A,Pe(K))}bc.onCallState=Ra;function kr(S,A){H("onDeviceSwitched",S,A)}bc.onDeviceSwitched=kr;function Or(S,A,K,Le=!1,Rt=!1,Lr=null,Ur=null,ps,Da,us=null){let ms=Da?Pt(Da):void 0;H("onMuteStates",Pe(S),Pt(A),Pt(K),Le,Rt,Lr,Ur,ps,ms,us)}bc.onMuteStates=Or;function xr(S,A,K=!1){he("onRolesChanged",S,Pt(A),K)}bc.onRolesChanged=xr;function Ca(S,A=!1){H("onLocalRolesChanged",Pt(S),A)}bc.onLocalRolesChanged=Ca;function Pa(S,A,K,Le){he("onPinnedParticipant",S,A,K,Le)}bc.onPinnedParticipant=Pa;function Nr(S,A){H("onLocalPin",S,A)}bc.onLocalPin=Nr;function ya(S){H("onOptionsChanged",Pt(S))}bc.onOptionsChanged=ya;function ba(){H("onCallAccepted")}bc.onCallAccepted=ba;function Ma(S,A){he("onAcceptedCall",S,A)}bc.onAcceptedCall=Ma;function me(){H("onRateNeeded")}bc.onRateNeeded=me;function F(S){he("onSpeakerChanged",S)}bc.onSpeakerChanged=F;function ie(S){H("onVolumesDetected",Pt(S))}bc.onVolumesDetected=ie;function ae(S,A){H("onLocalVolume",S,A)}bc.onLocalVolume=ae;function fe(S,A){H("onJoinStatus",S,A)}bc.onJoinStatus=fe;function Xe(S,A){H("onHangup",S,A)}bc.onHangup=Xe;function _(S){H("onMultipartyChatCreated",Pe(S))}bc.onMultipartyChatCreated=_;function T(){H("onDeviceChange")}bc.onDeviceChange=T;function C(S){H("onFingerprintChange",S)}bc.onFingerprintChange=C;function w(){H("onTokenExpired")}bc.onTokenExpired=w;function f(S,A,K=!1){H("onChatMessage",S,A,K)}bc.onChatMessage=f;function k(S,A,K=!1){H("onCustomData",S,A,K)}bc.onCustomData=k;function W(S,A,K,Le,Rt,Lr,Ur=null){H("onRecordStarted",S,A,K,Le,Rt,Lr,Ur)}bc.onRecordStarted=W;function U(S=null,A){H("onRecordStopped",S,A)}bc.onRecordStopped=U;function $(S){H("onLocalNetworkStatusChanged",S)}bc.onLocalNetworkStatusChanged=$;function Ee(S){H("onNetworkStatusChanged",S)}bc.onNetworkStatusChanged=Ee;function N(S,...A){H("onDebugMessage",S,...A)}bc.onDebugMessage=N;function ve(S,A){let K=Object.assign({},S,{memory:A});H("onStatistics",K)}bc.onStatistics=ve;function ge(){H("onAutoplayError")}bc.onAutoplayError=ge;function De(S,A,K,Le,Rt){H("onChatRoomUpdated",S,A,K,Le,Rt)}bc.onChatRoomUpdated=De;function _e(S){H("onPromoted",S)}bc.onPromoted=_e;function ke(S){H("onRemoteMixedAudioStream",S)}bc.onRemoteMixedAudioStream=ke;function Tt(S){H("onJoinLinkChanged",S)}bc.onJoinLinkChanged=Tt;function Bt(S){H("onRoomsUpdated",S)}bc.onRoomsUpdated=Bt;function Ze(S,A,K,Le){H("onRoomUpdated",S,A,K,Le)}bc.onRoomUpdated=Ze;function oi(S){H("onRoomParticipantsUpdated",S)}bc.onRoomParticipantsUpdated=oi;function Aa(S){H("onRoomSwitched",S)}bc.onRoomSwitched=Aa;function hc(S){H("onRoomStart",S)}bc.onRoomStart=hc;function _c(S,A=null){H("onFeedback",S,A)}bc.onFeedback=_c;function gc(S){H("onFeaturesPerRoleChanged",S)}bc.onFeaturesPerRoleChanged=gc;function fc(S){H("onParticipantVmojiUpdate",S)}bc.onParticipantVmojiUpdate=fc;function Sc(S,A){H("onAsrSet",S,A)}bc.onAsrSet=Sc;function vc(S,A,K){H("onAsrStarted",S,A,K)}bc.onAsrStarted=vc;function Ic(S){H("onAsrStopped",S)}bc.onAsrStopped=Ic;function Ec(S,A,K,Le){H("onAsrTranscription",S,A,K,Le)}bc.onAsrTranscription=Ec;function Tc(S,A){H("onParticipantIdChanged",S,A)}bc.onParticipantIdChanged=Tc;function Rc(S){H("onVideoSuspendSuggest",S)}bc.onVideoSuspendSuggest=Rc;function Cc(S){H("onSignalingMessage",typeof S=="string"?S:Pe(S))}bc.onSignalingMessage=Cc;function Pc(S){H("onPromotionApproved",S)}bc.onPromotionApproved=Pc;function yc(){H("onPeerRegistered")}bc.onPeerRegistered=yc})(Fr||(Fr={}));var v=Fr;var Hr="_okcls_",jt=(()=>{try{let n=Date.now().toString(),r=window.localStorage,e=!1;return r.setItem(n,n),e=r.getItem(n)===n,r.removeItem(n),e?r:null}catch{return null}})();function vs(n){let r=jt?jt.getItem(Hr+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function Is(n,r){try{jt&&jt.setItem(Hr+n,JSON.stringify(r))}catch{}}function Es(n){jt&&jt.removeItem(Hr+n)}var jr;(t=>{function n(i){return vs(i)||null}t.get=n;function r(i,a){Is(i,a)}t.set=r;function e(i){Es(i)}t.remove=e})(jr||(jr={}));var ht=jr;var Gt=null,Wi=null,Yi=null,Xi=[],Zi=[],Qi=[],Ke=null,$e=null,er=null,tr=!1,ir=!1,Ki,Ht,$i,Gr=null,Wr="",Ka=null,qi=[],zi=null,$a=navigator.appVersion,Ts=navigator.appName,Ue=navigator.userAgent,nt={},Ct=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(Ct||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(Ct||(Ct={}));var bt=class{constructor(r,e=!1,t=p.videoMaxWidth,i=p.videoMaxHeight,a=p.videoFrameRate){o(this,"audio");o(this,"video");o(this,"needVideo");o(this,"lastSimplifyWasReached");o(this,"supportedConstraints");o(this,"isVideoRequested",()=>this.needVideo);this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(r){s={noiseSuppression:p.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let u=ye.getMicrophones(),l,m;if($e&&(m=$e.groupId,l=$e.deviceId),typeof r=="string")m=u.find(E=>E.deviceId===r)?.groupId,l=r;else if(!$e&&ye.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,l=h.deviceId)}m&&this.supportedConstraints.groupId?s.groupId={exact:m}:l&&(s.deviceId={exact:l})}let c=!1;if(e){c={width:{min:p.videoMinWidth,max:t,ideal:t},height:{min:p.videoMinHeight,max:i,ideal:i},aspectRatio:{ideal:p.videoAspectRatio},frameRate:{ideal:a}};let u=ye.getCameras(),l,m;if(Ke&&(m=Ke.groupId,l=Ke.deviceId),typeof e=="string")m=u.find(E=>E.deviceId===e)?.groupId,l=e;else if(!Ke&&ye.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,l=h.deviceId)}m&&this.supportedConstraints.groupId?c.groupId={exact:m}:l&&(c.deviceId={exact:l}),p.videoFacingMode&&(c.facingMode={ideal:p.videoFacingMode},delete c.deviceId,delete c.groupId)}this.audio=s,this.video=c,this.needVideo=!!c,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 r=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||r)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Kr=class extends bt{constructor(e,t,i,a){super(!1,!0);o(this,"captureController");if(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=i,this.video.displaySurface=p.displaySurface,ye.browserName()==="Safari"){let s=Number(ye.browserVersion());s===16?(this.video.width={max:e},this.video.height={max:t}):s===17&&(delete this.video.width,delete this.video.height)}a&&(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})}},yt=class yt{constructor(){o(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(yt._lockId)throw R.log(D.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");yt._lockId=this._lockId}free(){yt._lockId===this._lockId&&(yt._lockId=0)}};o(yt,"_lockId",0);var rr=yt;async function qa(){ir=!1,tr=!1,Gt=null;let n={camera:ye.getSavedCamera(),microphone:ye.getSavedMicrophone(),output:ye.getSavedOutput()};await $r(),Rs("devicechange",n),v.onDeviceChange()}function Rs(n,...r){if(nt[n])for(let e of nt[n])e(...r)}async function $r(){return Gt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!Wi&&navigator.mediaDevices.addEventListener&&(Wi=I.debounce(qa,p.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",Wi)),!Yi&&ui.isSupported()&&(Yi=new ui,await Yi.init((n,r)=>{switch(r){case"denied":case"prompt":Wi?.();break}})),Gt=navigator.mediaDevices.enumerateDevices().then(n=>{Xi=n.filter(i=>i.kind==="videoinput"?(i.label&&(tr=!0),!0):!1),Zi=n.filter(i=>i.kind==="audioinput"?(i.label?ir=!0:ye.isMobile()&&ye.browserName()==="Firefox"&&(ir=tr),!0):!1),Qi=n.filter(i=>i.kind==="audiooutput");let r=Ke?.deviceId??ht.get("videoinput"),e=$e?.deviceId??ht.get("audioinput"),t=er?.deviceId??ht.get("audiooutput");return Ke=Xi.find(i=>i.deviceId===r)||null,$e=Zi.find(i=>i.deviceId===e)||null,er=Qi.find(i=>i.deviceId===t)||Qi[0]||null,Gt=Promise.resolve(n),n}).catch(()=>(Gt=null,[]))))}async function Cs(){if("userAgentData"in navigator)try{let{platformVersion:n}=await navigator.userAgentData.getHighEntropyValues(["platformVersion"]);if(!n){d.warn("Can't to get OS version");return}let r=parseInt(n.split(".")[0]);Ka=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function Ps(n){if(Ke&&$e)return;let r=(e,t)=>{let i=t.getSettings()?.deviceId;return e.find(a=>a.deviceId===i||a.label===t.label)||null};n?.getTracks().forEach(e=>{!$e&&e.kind==="audio"?$e=r(ye.getMicrophones(),e):!Ke&&e.kind==="video"&&(Ke=r(ye.getCameras(),e))})}async function mi(n,r){d.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative())));let e=(!n.isVideo()||ye.hasCameraPermission())&&(!n.isAudio()||ye.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new rr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await qa(),Ps(i),i}catch(i){switch(t.free(),d.error("getUserMedia error",i),i.name){case"PermissionDeniedError":case"PermissionDismissedError":case"NotAllowedError":case"SecurityError":case"DOMException":case"NotFoundError":r=n.isVideoRequested()?oe.CAMERA_PERMISSION:oe.MIC_PERMISSION;break;case"OverconstrainedError":r=oe.OVERCONSTRAINED;break;case"TypeError":r=oe.UNKNOWN;break;case"AbortError":case"NotReadableError":r=n.isVideoRequested()?oe.CAMERA_ACCESS:oe.MIC_ACCESS;break;case"Error":if(i.message==="MediaSource is busy"){r=n.isVideoRequested()?oe.CAMERA_ACCESS:oe.MIC_ACCESS;break}}if(n.canSimplify())return mi(n.simplify(),r);let a=r||oe.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function ys(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new rr;try{r.busy();let e=await navigator.mediaDevices.getDisplayMedia(n.getNative()),t=e?.getVideoTracks()[0];if(t){let i=t.getSettings()?.displaySurface;if(d.debug(`Got display media track: ${t.id} (${i})`),t.contentHint="text",n.captureController&&(i==="browser"||i==="window"))try{n.captureController.setFocusBehavior("no-focus-change")}catch(a){d.warn("Failed to set focus behavior",a)}}return e}catch(e){switch(e.name){case"PermissionDeniedError":case"NotAllowedError":case"SecurityError":throw oe.SCREEN_PERMISSION;default:throw oe.SCREEN_ACCESS}}finally{r.free()}}function Ji(){return qi.length||(qi=(()=>{let n,r=!1,e=0,t="0",i=Ue.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return n=/\brv[ :]+(\d+)/g.exec(Ue),["IE",n&&n[1]||"Unknown",r,e,t];if(i[1]==="Safari"){if(n=Ue.match(/\bEdge\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bCriOS\/(\d+)/),n)return["Chrome",n[1],!0,Number(n[1]),t];if(n=Ue.match(/\bFxiOS\/(\d+)/),n)return["Firefox",n[1],!1,e,t];if(n=Ue.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1],!1,e,t];if(n=Ue.match(/\bOPT\/(\d+)/),n)return["Opera",n[1],!1,e,t]}if(i[1]==="Chrome"){if(r=!0,e=Number(i[2]),n=Ue.match(/\bOPR\/(\d+)/),n)return["Opera",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bSferum\/((\d+)(?:\.\d+)*)/),n)return["Sferum",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bEdge?\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(typeof window.opr<"u"&&/^(.+\.)?ok.ru$/.test(window.location.host))return["Opera","Hidden",r,e,t]}return n=Ue.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),n&&n[2]!==void 0&&(t=n[2]),[i[2]?i[1]:Ts,n&&n[1]||i[2]||$a,r,e,t]})()),qi}var ye;(me=>{async function n(){await $r(),await Cs()}me.init=n;function r(){return Xi}me.getCameras=r;function e(){return Zi}me.getMicrophones=e;function t(){return Qi}me.getOutput=t;function i(){return Xi.length>0}me.hasCamera=i;function a(){return Zi.length>0}me.hasMicrophone=a;function s(){return Ke}me.getSavedCamera=s;function c(){return $e}me.getSavedMicrophone=c;function u(){return er}me.getSavedOutput=u;function l(){return p.videoFacingMode}me.getVideoFacingMode=l;function m(){return tr}me.hasCameraPermission=m;function h(){return ir}me.hasMicrophonePermission=h;function E(){return Yi?.getPermissionState("microphone")??null}me.getMicrophonePermissionState=E;function P(F=!1){return h()?i()&&F?m():!0:!1}me.hasPermissions=P;async function b(F=!1,ie=!0,ae=!0){let fe=a()&&ie,Xe=i()&&F,_;if(!fe&&!Xe)_=new MediaStream;else try{_=await mi(new bt(fe,Xe))}catch{_=new MediaStream}return!_.getVideoTracks().length&&ae&&_.addTrack(me.getBlackMediaTrack()),!_.getAudioTracks().length&&ae&&_.addTrack(me.getSilentMediaTrack()),_}me.getUserMedia=b;async function V(F,ie){let ae=F&&!p.consumerFastScreenShare?p.fastScreenShareWidth:window.screen.width,fe=F&&!p.consumerFastScreenShare?p.fastScreenShareHeight:window.screen.height,Xe=p.getScreenFrameRate(F);return ys(new Kr(ae,fe,Xe,ie))}me.getScreenMedia=V;async function J(F=!1,ie){let ae=F?p.videoEffectMaxWidth:p.videoMaxWidth,fe=F?p.videoEffectMaxHeight:p.videoMaxHeight;return mi(new bt(!1,!0,ae,fe,ie))}me._getUserVideo=J;async function ce(F,ie){let ae=ie?.width||p.videoMaxWidth,fe=ie?.height||p.videoMaxHeight;return mi(new bt(!1,F||!0,ae,fe))}me.getUserVideo=ce;async function Ie(F){return mi(new bt(F||!0,!1))}me.getUserAudio=Ie;async function Te(F,ie){let[ae]=F.getVideoTracks();if(!ae)throw new Error("Video track not found in stream");return ji(ae,ie)}me.setResolution=Te;async function Y(F,ie){let fe=(await $r()).find(Xe=>Xe.kind===F&&Xe.deviceId===ie);return fe?(F==="videoinput"?Ke=fe:F==="audioinput"?$e=fe:F==="audiooutput"&&(er=fe),ht.set(F,ie),fe):null}me._saveDeviceId=Y;function Re(){if(!$i||$i.readyState==="ended"){let F=me.getAudioContext(),ie=F.createMediaStreamDestination(),ae=F.createGain();ae.gain.value=1e-5,ae.connect(ie),ae.connect(F.destination);let fe=F.createOscillator();fe.type="sine",fe.frequency.value=0,fe.connect(ae),fe.start(),$i=ie.stream.getAudioTracks()[0]}return Object.assign($i.clone(),{enabled:!1})}me.getSilentMediaTrack=Re;function Q(F=p.videoMinWidth,ie=p.videoMinHeight){Ht||(Ht=document.createElement("canvas")),Ht.width=F,Ht.height=ie;let ae=Ht.getContext("2d");return ae.rect(0,0,F,ie),ae.fillStyle="black",ae.fill(),(!Ki||Ki.readyState==="ended")&&(Ki=Ht.captureStream(p.videoFrameRate).getVideoTracks()[0]),Object.assign(Ki.clone(),{enabled:!1})}me.getBlackMediaTrack=Q;function ai(){if(Or()==="Edge"&&Number(xr())<70)return!1;try{let F=window;return"mediaDevices"in F.navigator&&"getUserMedia"in F.navigator.mediaDevices&&F.RTCPeerConnection&&F.RTCIceCandidate&&F.RTCSessionDescription&&F.HTMLCanvasElement&&F.HTMLCanvasElement.prototype.captureStream&&F.RTCRtpSender&&F.RTCRtpSender.prototype.replaceTrack&&F.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}me.isBrowserSupported=ai;function va(){return!!navigator.mediaDevices.getDisplayMedia}me.isScreenCapturingSupported=va;function Ia(){let F=me.browserName()==="Safari"&&me.browserVersion()==="15"&&me.browserSubVersion()==="1",ie=me.browserName()==="Opera",ae=me.browserName()==="Yandex";return F||ie||ae}me.isBrokenH264Decoder=Ia;function ni(){return me.browserName()==="Yandex"&&me.os()==="Windows"||p.simulcast}me.isBrokenVP9Encoder=ni;function si(){let F=me.browserName()==="Safari"&&Number(me.browserVersion())===17&&[4,5,6].includes(Number(me.browserSubVersion())),ie=me.os()==="Windows"&&me.osVersion()===10;return F||ie}me.isBrokenVP9Decoder=si;function Ea(){return me.browserName()==="Firefox"&&Number(me.browserVersion())<60}me.isOldDataChannelDescription=Ea;function re(){return!(me.baseChromeVersion()&&me.isMobile())}me.canPreferH264=re;function Ta(){return!(me.browserName()==="Firefox"||me.browserName()==="Safari")}me.isSimulcastSupportedByBrowser=Ta;function te(){return Wr||(Wr=(()=>{let F={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 ie in F)if(Object.hasOwn(F,ie)&&F[ie].test(Ue))return ie;return"Unknown"})()),Wr}me.os=te;function Ra(){return Ka}me.osVersion=Ra;function kr(){return Gr===null&&(Gr=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test($a)),Gr}me.isMobile=kr;function Or(){return Ji()[0]}me.browserName=Or;function xr(){return Ji()[1]}me.browserVersion=xr;function Ca(){return Ji()[3]}me.baseChromeVersion=Ca;function Pa(){return zi||(zi=new(window.AudioContext||window.webkitAudioContext)),zi.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),zi}me.getAudioContext=Pa;function Nr(){return Ji()[4]}me.browserSubVersion=Nr;function ya(){return me.baseChromeVersion()>=105&&!me.isMobile()}me.isAudioShareSupported=ya;function ba(F,ie){nt[F]||(nt[F]=[]),nt[F].push(ie)}me.addEventListener=ba;function Ma(F,ie){if(nt[F])if(!ie)delete nt[F];else{let ae=nt[F].indexOf(ie);ae>-1&&nt[F].splice(ae,1)}}me.removeEventListener=Ma})(ye||(ye={}));var M=ye;var Ve=class Ve{static get startTime(){return Ve._list[0]?.t||0}static get endTime(){let r=Ve._list;return r[r.length-1]?.t||0}static startSession(){Ve._list=[]}static get conversationId(){return Ve._conversationId}static set conversationId(r){Ve._conversationId=r}static add(r){Ve._list.push(r)}static _createContextLogs(){let r=[[`Calls SDK ${p.sdkVersion}`,p.toJSON()],["UserAgent:",navigator.userAgent],["Screen resolution:",`${window.screen.width}x${window.screen.height}`],["Permissions:",`Camera: ${M.hasCameraPermission()}, Mic: ${M.hasMicrophonePermission()}`]],e=new Date,t=e.getTime(),i=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return r.map(a=>({h:i,t,l:"LOG",d:a}))}static collectLogs(){let r=Ve._list;return r.length===0?[]:[...Ve._createContextLogs(),...r]}};o(Ve,"_list",[]),o(Ve,"_conversationId",null);var Oe=Ve;var ar=class{constructor(){o(this,"_items",[])}get length(){return this._items.length}push(...r){this._items.push(...r)}merge(r){this._items.push(...r._items)}shift(){return this._items.shift()||null}bisect(){let r=this.length>1?Math.floor(this.length/2):1;this._items=this._items.slice(r)}head(){return this._items[0]||null}tail(){let r=this._items.length;return r?this._items[r-1]:null}clear(){this._items=[]}toString(){return this._items.length?JSON.stringify(this._items,(r,e)=>e instanceof Error?String(e):e):""}};var qr=2*1024*1024,za=512*1024,Wt=100*1024,bs=5,Jr="_okcls_logs_session_",Ms=3e4,Yr=class{constructor(){o(this,"_items",[]);o(this,"_itemsSize",0);o(this,"_storageSize",qr);try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(Jr)!==0)continue;let t=r.getItem(e);if(!t){Ja(e);continue}let i=Qa(t);this.add(e,i)}}catch(r){console.error("Storage is blocked",r),this._storageSize=0}this._items.sort((r,e)=>r.date-e.date),this.cleanup(Wt)}get size(){return this._itemsSize}get length(){return this._items.length}get available(){return Math.max(this._storageSize-this._itemsSize,0)}get items(){return this._items}set storageSize(r){this._storageSize=Math.min(r,this._storageSize,qr)}add(r,e){let t=parseInt(r.replace(Jr,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(Ja(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>qr||this.length>bs-1||this.size+r>this.available);)this.deleteOldestItem()}};function Ya(){return`${Jr}${Date.now()}`}function Qa(n){return new Blob([n]).size}function Ja(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function nr(){let n=_t.toString();if(!we.available||!n)return;let r=Qa(n);if(r>za){_t.bisect(),nr();return}we.cleanup(Wt+r);try{window.localStorage.setItem(sr,n)}catch(e){if(console.warn("Failed to write log to storage",e),we.storageSize=we.size+r,we.cleanup(Wt+r),we.available>=Wt+r){nr();return}if(r>Wt){_t.bisect(),nr();return}we.storageSize=0;return}r>za&&(we.add(sr,r),sr=Ya(),_t.clear(),we.cleanup(Wt))}function Qr(){!we.available||!_t.length||nr()}function As(n=!1){let r=[];try{let i=window.localStorage;for(let s of we.items){let c=i.getItem(s.key);r.push(c)}let a=_t.toString();a&&r.push(a)}catch(i){console.error("Storage is blocked",i)}let e=`[${r.join(",")}]`;if(n)return e;let t=`logs_${Date.now()}.json`;return Ds(e,t),t}function Ds(n,r){let e=document.createElement("a"),t=new Blob([n],{type:"text/json"});e.href=URL.createObjectURL(t),e.download=r,e.click()}function Xa(n,r){if(!we.available)return;let e=new Date,t={t:e.getTime(),l:n,d:r,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};_t.push(t),Oe.add(t),zr||(zr=window.setTimeout(()=>{zr=null,Qr()},Ms))}function Xr(){we||(we=new Yr,_t=new ar,sr=Ya(),window.addEventListener("beforeunload",Qr))}var we,_t,sr,zr=null;window.__VKCallsSDKLogs__=(n=!1)=>(we||Xr(),Qr(),As(n));var Za=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(Za||{}),Zr;(Y=>{let n="📞",r=(Re,...Q)=>{v.onDebugMessage(Re,...Q)},e=!1,t=(Re,Q)=>(...ai)=>{Re(...ai),Xa(Q,ai)},i=console.debug.bind(console,n),a=console.log.bind(console,n),s=console.warn.bind(console,n),c=console.error.bind(console,n),u=r.bind(null,"DEBUG"),l=r.bind(null,"LOG"),m=r.bind(null,"WARN"),h=r.bind(null,"ERROR");Y.debug=u,Y.log=l,Y.warn=m,Y.error=h;function J(){return e}Y.enabled=J;function ce(Re){e=Re,p.debugLog&&Xr(),Re?(Y.debug=p.debugLog?t(i,"DEBUG"):i,Y.log=p.debugLog?t(a,"LOG"):a,Y.warn=p.debugLog?t(s,"WARN"):s,Y.error=p.debugLog?t(c,"ERROR"):c):(Y.debug=p.debugLog?t(u,"DEBUG"):u,Y.log=p.debugLog?t(l,"LOG"):l,Y.warn=p.debugLog?t(m,"WARN"):m,Y.error=p.debugLog?t(h,"ERROR"):h)}Y.toggle=ce;function Ie(Re,...Q){switch(Re){case"DEBUG":(0,Y.debug)(...Q);break;case"LOG":(0,Y.log)(...Q);break;case"WARN":(0,Y.warn)(...Q);break;case"ERROR":(0,Y.error)(...Q);break}}Y.send=Ie;function Te(Re,...Q){}Y.test=Te})(Zr||(Zr={}));var d=Zr;var ks="kf";function Kt(n){return n.stopStream}function ea(n){return n.keyFrameRequested}function en(n){if(Kt(n))return"ss";if(ea(n))return ks;let r="";return n.priority!==void 0&&(r+="p="+n.priority),n.width!==void 0&&n.height!==void 0&&(r!==""&&(r+=":"),r+="sz="+Math.round(n.width)+"x"+Math.round(n.height)),n.fit!==void 0&&(r!==""&&(r+=":"),r+="fit="+n.fit),r}var $t=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))($t||{}),tn="s",rn="m";function et(n){return n.participantId+(n.mediaType?Vt+tn+n.mediaType:"")+(n.streamName?Vt+rn+n.streamName:"")}function qt(n){let r=n.split(Vt),e=r.shift();if(!e)throw new Error("Illegal stream description: "+n);let t=null,i,a=0;for(let c of r)switch(c.charAt(0)){case tn:t=Os(c.slice(1));break;case rn:i=c.slice(1);break;case Vi:a=Number.parseInt(c.slice(1),10);break;default:throw new Error("Unexpected parameter type "+c.charAt(0)+" in stream description "+n)}return{participantId:I.compose(e,a),mediaType:t,streamName:i}}function Os(n){for(let r of Object.keys($t))if(r===n)return $t[r];return null}function tt(){let n=new DataView(new ArrayBuffer(64)),r=0;function e(t){if(r+t>n.byteLength){let i=new Uint8Array(Math.max(r+t,n.byteLength+64));i.set(new Uint8Array(n.buffer.slice(0,r))),n=new DataView(i.buffer)}}return{put(t){if(e(t.byteLength),xs(t)){let i=t.buffer;new Uint8Array(n.buffer).set(new Uint8Array(i),r)}else new Uint8Array(n.buffer).set(new Uint8Array(t),r);r+=t.byteLength},putI8(t){e(1),n.setInt8(r,t),++r},putI16(t){e(2),n.setInt16(r,t),r+=2},putI32(t){e(4),n.setInt32(r,t),r+=4},putI64(t){e(8);let i=t<0;i&&(t=-t);let a=t/4294967296|0,s=t%4294967296|0;i&&(s=~s+1|0,a=s===0?~a+1|0:~a),n.setUint32(r,a),n.setUint32(r+4,s),r+=8},putUi8(t){e(1),n.setUint8(r,t),++r},putUi16(t){e(2),n.setUint16(r,t),r+=2},putUi32(t){e(4),n.setUint32(r,t),r+=4},putUi64(t){e(8),n.setUint32(r,t/4294967296|0),n.setUint32(r+4,t%4294967296),r+=8},putF(t){e(8),n.setFloat64(r,t),r+=8},ui8array(){return new Uint8Array(n.buffer.slice(0,r))}}}function xs(n){return n.buffer!==void 0}function or(n){let r=ArrayBuffer.isView(n)?new DataView(n.buffer,n.byteOffset,n.byteLength):new DataView(n),e=0;return{peek(){return r.getUint8(e)},get(t){e+=t;let i=r.byteOffset;return r.buffer.slice(i+e-t,i+e)},getI8(){return r.getInt8(e++)},getI16(){return e+=2,r.getInt16(e-2)},getI32(){return e+=4,r.getInt32(e-4)},getI64(){e+=8;let t=r.getInt32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getUi8(){return r.getUint8(e++)},getUi16(){return e+=2,r.getUint16(e-2)},getUi32(){return e+=4,r.getUint32(e-4)},getUi64(){e+=8;let t=r.getUint32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getF32(){return e+=4,r.getFloat32(e-4)},getF64(){return e+=8,r.getFloat64(e-8)}}}var sn=0,on=1,Ls=2,Us=3,Bs=4,Fs=5,Vs=6,js=7,Hs=0,Gs=1,Ws=2,st=0,Ks=0,$s=0,qs=1,cr=class{constructor(){o(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=tt();G.enc(t,sn),G.enc(t,st),G.enc(t,r),Mt.enc(t,null);let i=[];for(let a in e)Object.hasOwn(e,a)&&this.writeLayout(e,a,i);return an.enc(t,i),Mt.enc(t,null),t.ui8array().buffer}writeLayout(r,e,t){let i=r[e],a=tt();if(this.writeStreamDesc(e,a),Kt(i))G.enc(a,Gs);else if(ea(i))G.enc(a,Ws);else if(G.enc(a,Hs),i.priority!==void 0?G.enc(a,i.priority):Mt.enc(a,null),i.width!==void 0&&i.height!==void 0?(G.enc(a,Math.round(i.width)),G.enc(a,Math.round(i.height))):(Mt.enc(a,null),Mt.enc(a,null)),i.fit!==void 0)switch(i.fit){case"cv":G.enc(a,$s);break;case"cn":G.enc(a,qs);break;default:Mt.enc(a,null)}else Mt.enc(a,null);t.push(a.ui8array().buffer)}writeStreamDesc(r,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(r);if(t!==void 0){G.enc(e,t);return}}nn.enc(e,r)}serializePerfStatReport(r,e){let t=tt();return G.enc(t,on),G.enc(t,st),G.enc(t,r),G.enc(t,e.framesDecoded),G.enc(t,e.framesReceived),t.ui8array().buffer}serializeSharingStatReport(r,e){let t=tt();return G.enc(t,Ls),G.enc(t,st),G.enc(t,r),G.enc(t,e.minDelay),G.enc(t,e.maxDelay),G.enc(t,e.avgDelay),G.enc(t,e.largeDelayDuration),t.ui8array().buffer}serializeRequestAsr(r,e){let t=tt();return G.enc(t,Us),G.enc(t,st),G.enc(t,r),ta.enc(t,e.request),t.ui8array().buffer}serializeNetworkStatReport(r,e){let t=tt();return G.enc(t,Bs),G.enc(t,st),G.enc(t,r),G.enc(t,e.timestamp),G.enc(t,e.sendBitrate),t.ui8array().buffer}serializeEnableVideoSuspend(r,e){let t=tt();return G.enc(t,Fs),G.enc(t,st),G.enc(t,r),ta.enc(t,e.enabled),t.ui8array().buffer}serializeEnableVideoSuspendSuggest(r,e){let t=tt();return G.enc(t,Vs),G.enc(t,st),G.enc(t,r),ta.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=tt();G.enc(t,js),G.enc(t,st),G.enc(t,r);let i=e.simulcastInfo.streams.length;G.enc(t,e.mediaSource),G.enc(t,i);for(let a of e.simulcastInfo.streams)nn.enc(t,a.rid),G.enc(t,a.width),G.enc(t,a.height),G.enc(t,a.fps),G.enc(t,a.bitrate/1e3);return t.ui8array().buffer}async deserializeCommandResponse(r){let e;if(r instanceof Blob){let s="arrayBuffer"in Blob.prototype?await r.arrayBuffer():await ja(r);e=or(s)}else e=or(r);let t=G.dec(e),i=G.dec(e);if(i!==st){d.warn("Unsupported version for command type: "+t+", version "+i);return}if(G.dec(e)!==Ks){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case sn:return this.deserializeUpdateDisplayLayoutResponse(e);case on:return this.deserializeReportPerfStatResponse(e);default:d.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(r){let e=G.dec(r),t=an.dec(r),i={};return t.forEach(a=>{let s=or(a),c=Ns.dec(s);if(typeof c=="string")i[c]=G.dec(s);else{let u=c,l=et(this.participantIdRegistry?.getStreamDescription(u));i[l]=G.dec(s)}}),{type:"response",sequence:e,response:x.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:i}}deserializeReportPerfStatResponse(r){let e=G.dec(r),t=G.dec(r);return{type:"response",sequence:e,response:x.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var cn=(Q=>(Q.CALL_FINISH="call_finish",Q.CODEC_USAGE="codec_usage",Q.SIGNALING_CONNECTED="signaling_connected",Q.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",Q.FIRST_MEDIA_RECEIVED="first_media_received",Q.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",Q.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",Q.CALL_START="call_start",Q.SIGNALING_PING_SUMMARY="signaling_ping_summary",Q.SIGNALING_COMMAND_SUMMARY="signaling_command_summary",Q.WEBSOCKET_CONNECTED="websocket_connected",Q.WEBSOCKET_RECONNECTED="websocket_reconnected",Q.WEBSOCKET_FAILED_PINGS="websocket_failed_pings",Q.WEBSOCKET_FAILED_EXCEPTION="websocket_failed_exception",Q.WEBSOCKET_TIMEOUT="websocket_timeout",Q.WEBSOCKET_RESTART="websocket_restart",Q.WEBTRANSPORT_CONNECTED="webtransport_connected",Q.WEBTRANSPORT_RECONNECTED="webtransport_reconnected",Q.WEBTRANSPORT_FAILED_PINGS="webtransport_failed_pings",Q.WEBTRANSPORT_FAILED_EXCEPTION="webtransport_failed_exception",Q.WEBTRANSPORT_TIMEOUT="webtransport_timeout",Q.WEBTRANSPORT_RESTART="webtransport_restart",Q))(cn||{}),X=cn;var zs=1e3;function le(n,r,e=0){return r in n&&n[r]?n[r]:e}function ia(...n){return r=>{for(let e of n)if(e(r))return!0;return!1}}function gt(n,r){return e=>e[n]===r}function Js(n){return(r,e)=>e[n]-r[n]}function hi(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function dn(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function aa(n){return Object.keys(n).filter(r=>n[r]!==void 0).map(r=>[r,n[r]]).reduce((r,e)=>(r[e[0]]=I.isObject(e[1])?aa(e[1]):e[1],r),{})}function ln(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function Ys(n){let r=[];return RTCRtpReceiver.prototype.getStats?(r.push(...n.getReceivers().map(e=>e.getStats())),r.push(...n.getSenders().map(e=>e.getStats()))):r.push(n.getStats()),Promise.all(r).then(ln).then(dn)}function pn(n){let r=n.filter(gt("type","candidate-pair")).sort(Js("priority")).find(ia(gt("nominated",!0),gt("selected",!0)));if(!r)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let e={timestamp:r.timestamp,availableOutgoingBitrate:r.availableOutgoingBitrate||0,totalRoundTripTime:r.totalRoundTripTime||0,currentRoundTripTime:r.currentRoundTripTime||0,bytesSent:r.bytesSent||0,bytesReceived:r.bytesReceived||0},t=n.find(gt("id",r.remoteCandidateId));t&&Object.assign(e,{remote:{type:t.candidateType,address:t.ip||t.address,port:t.port,protocol:t.protocol}});let i=n.find(gt("id",r.localCandidateId));return i&&Object.assign(e,{local:{type:i.candidateType,address:i.ip||i.address,port:i.port,protocol:i.protocol,relayProtocol:i.relayProtocol,networkType:i.networkType}}),aa(e)}function ra(n,r,e=!1){let t=hi("id",n),i=e?n.filter(ia(gt("type","remote-inbound-rtp"))):n.filter(ia(gt("type","inbound-rtp"),gt("type","outbound-rtp")));return M.browserName()==="Firefox"&&(i=Object.values(i.reduce((a,s)=>{if(!a[s.ssrc])a[s.ssrc]=s;else{let c=Object.assign({},a[s.ssrc],s),u=a[s.ssrc].isRemote?s:a[s.ssrc];c.id=u.id,c.type=u.type,delete c.isRemote,delete c.remoteId,a[c.ssrc]=c}return a},{}))),i.map(a=>{let s=Number(a.ssrc),c=a.mediaType||a.kind,u=a.remoteId||a.trackId,l=a.type,m=a.codecId;if(!l||!s||!c)return null;let h={ssrc:s,type:l,kind:c,bytesReceived:le(a,"bytesReceived"),bytesSent:le(a,"bytesSent"),headerBytesReceived:le(a,"headerBytesReceived"),headerBytesSent:le(a,"headerBytesSent"),jitter:le(a,"jitter"),packetsLost:le(a,"packetsLost"),packetsReceived:le(a,"packetsReceived"),packetsSent:le(a,"packetsSent"),fractionLost:le(a,"fractionLost"),pliCount:le(a,"pliCount"),firCount:le(a,"firCount"),nackCount:le(a,"nackCount"),userId:r[s],freezeCount:le(a,"freezeCount",0),totalFreezesDuration:le(a,"totalFreezesDuration",0)},E="mid"in a&&typeof a.mid=="string"?a.mid:void 0,P="rid"in a&&typeof a.rid=="string"?a.rid:void 0;if(E&&(h.mid=E),P&&(h.rid=P),c==="video"){let b=le(a,"framesDecoded"),V=le(a,"totalInterFrameDelay"),J=le(a,"totalSquaredInterFrameDelay"),ce=le(a,"encoderImplementation"),Ie=le(a,"decoderImplementation");ce&&(h.encoderImplementation=ce),Ie&&(h.decoderImplementation=Ie),h.interframeDelayVariance=(J-V*V/b)/b}if(c==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=le(a,"totalEncodeTime")??0),c==="audio"&&(h.totalSamplesReceived=le(a,"totalSamplesReceived"),h.concealedSamples=le(a,"concealedSamples"),h.insertedSamplesForDeceleration=le(a,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=le(a,"removedSamplesForAcceleration"),h.silentConcealedSamples=le(a,"silentConcealedSamples"),h.concealmentEvents=le(a,"concealmentEvents"),h.totalAudioEnergy=le(a,"totalAudioEnergy")),m&&t[m]){let b=t[m];h.clockRate=b.clockRate,h.mimeType=b.mimeType,c==="audio"&&b.sdpFmtpLine&&(h.sdpFmtpLine=b.sdpFmtpLine)}if(u&&t[u]){let b=t[u];h.frameHeight=b.frameHeight,h.frameWidth=b.frameWidth,h.framesDecoded=b.framesDecoded,h.framesReceived=b.framesReceived,h.framesDropped=b.framesDropped}return aa(h)}).filter(a=>!!a)}function un(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=hi("ssrc",n?.remoteRtps||[]),i=hi("ssrc",r?.remoteRtps||[]));let a=hi("ssrc",n.rtps),s=hi("ssrc",r.rtps),c=(n.timestamp-r.timestamp)/1e3;return!a||!s||Object.keys(a).forEach(u=>{let l=a[u],m=s[u];if(!(!l||!m)){if(l.bytesReceived&&l.bytesReceived>m.bytesReceived&&(l.bandwidth=Math.round((l.bytesReceived-m.bytesReceived)/c),l.bandwidth+=Math.round((l.headerBytesReceived-m.headerBytesReceived)/c)),l.bytesSent&&l.bytesSent>m.bytesSent&&(l.bandwidth=Math.round((l.bytesSent-m.bytesSent)/c),l.bandwidth+=Math.round((l.headerBytesSent-m.headerBytesSent)/c)),l.packetsReceived)if(l.packetsReceived>m.packetsReceived||l.packetsLost>m.packetsLost){let h=l.packetsLost-m.packetsLost,E=l.packetsReceived-m.packetsReceived;l.packetLoss=parseFloat((100*h/(h+E)).toFixed(2))}else l.packetLoss=0;if(l.freezeCount>m.freezeCount&&(l.freezeCountDelta=l.freezeCount-m.freezeCount),l.totalFreezesDuration>m.totalFreezesDuration){let h=l.totalFreezesDuration-m.totalFreezesDuration;l.totalFreezesDurationDelta=h}if(l.framesDropped&&m.framesDropped&&l.framesDropped>m.framesDropped&&(l.framesDroppedDelta=parseFloat(((l.framesDropped-m.framesDropped)/c).toFixed(0))),e&&l.type==="outbound-rtp"&&l.kind==="video"){let h=t?.[u],E=i?.[u],P=J=>J??0,b=Math.max(0,P(h?.packetsLost)-P(E?.packetsLost)),V=Math.max(1,l.packetsSent-m.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(b/V*100)}}}}),n}async function mn(n,r,e={},t=!1){let i=await Ys(n),a={timestamp:Date.now(),transport:pn(i),rtps:ra(i,e)};return t&&(a.remoteRtps=ra(i,e,!0)),r?un(a,r,t):(await I.delay(zs),mn(n,a,e,t))}function Qs(n){performance.clearMarks(n),performance.mark(n)}function Xs(n){performance.clearMarks(n)}function Zs(n){let r=performance.getEntriesByName(n)[0];if(typeof r>"u")return null;let e=Math.round(performance.now()-r.startTime);return performance.clearMarks(n),e}function eo(n){return`${X.SCREENSHARE_FIRST_FRAME}_${to(n)}`}function to(n){return typeof n=="string"?n:JSON.stringify(n)}var pe={distinctById:dn,rtcStatsToArray:ln,extractTransport:pn,extractRtps:ra,delta:un,collectStats:mn,setMark:Qs,clearMark:Xs,measureMark:Zs,getMarkNameScreenshareFirstFrame:eo};var qe=class qe{constructor(){o(this,"_eventualLogs",new Set)}static create(){qe._instance=new qe}static logCallStat(r){if(qe._instance?._eventualLogs.size){for(let e of qe._instance._eventualLogs)Object.assign(e,{call_topology:r.call_topology,local_address:r.local_address,local_connection_type:r.local_connection_type,network_type:r.network_type,remote_address:r.remote_address,remote_connection_type:r.remote_connection_type,transport:r.transport}),R.logClientStats(e);qe._instance._eventualLogs.clear()}R.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=pe.measureMark(r.name)),r.value!==null&&qe._instance?._eventualLogs.add(r)}static destroy(){qe._instance?._destroy(),qe._instance=null}_destroy(){this._eventualLogs.clear()}};o(qe,"_instance",null);var Me=qe;var na={connected:{wt:X.WEBTRANSPORT_CONNECTED,ws:X.WEBSOCKET_CONNECTED},reconnected:{wt:X.WEBTRANSPORT_RECONNECTED,ws:X.WEBSOCKET_RECONNECTED},failed_pings:{wt:X.WEBTRANSPORT_FAILED_PINGS,ws:X.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:X.WEBTRANSPORT_FAILED_EXCEPTION,ws:X.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:X.WEBTRANSPORT_TIMEOUT,ws:X.WEBSOCKET_TIMEOUT},restart:{wt:X.WEBTRANSPORT_RESTART,ws:X.WEBSOCKET_RESTART}};var _i=class{constructor(r){o(this,"q");o(this,"inits",[]);o(this,"n",[1,2,3,4,5]);o(this,"np",[1,1,1,1,1]);o(this,"qv",[]);if(!(r>0&&r<1))throw new Error("q must be in (0,1)");this.q=r}add(r){if(this.inits.length<5){this.inits.push(r),this.inits.length===5&&this.bootstrap();return}let e=0;if(r<this.qv[0])this.qv[0]=r,e=0;else if(r>=this.qv[4])this.qv[4]=r,e=3;else for(;!(r<this.qv[e+1]);)e++;for(let t=0;t<5;t++)this.n[t]+=t<=e?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 t=1;t<=3;t++){let i=this.np[t]-this.n[t];if(i>=1&&this.n[t+1]-this.n[t]>1||i<=-1&&this.n[t]-this.n[t-1]>1){let a=Math.sign(i),s=this.qv[t]+a/(this.n[t+1]-this.n[t-1])*((this.n[t]-this.n[t-1]+a)*(this.qv[t+1]-this.qv[t])/(this.n[t+1]-this.n[t])+(this.n[t+1]-this.n[t]-a)*(this.qv[t]-this.qv[t-1])/(this.n[t]-this.n[t-1]));s>this.qv[t-1]&&s<this.qv[t+1]?this.qv[t]=s:this.qv[t]=this.qv[t]+a*(this.qv[t+a]-this.qv[t])/(this.n[t+a]-this.n[t]),this.n[t]+=a}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let r=[...this.inits].sort((a,s)=>a-s),e=this.q*(r.length-1),t=Math.floor(e),i=e-t;return t+1<r.length?r[t]*(1-i)+r[t+1]*i:r[t]}return this.qv[2]}bootstrap(){this.inits.sort((r,e)=>r-e),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]}};var dr=class{constructor(){o(this,"n",0);o(this,"mean",0)}add(r){this.n++;let e=r-this.mean;this.mean+=e/this.n}get avg(){return this.n?this.mean:NaN}};var ot=class{constructor(){o(this,"count",0);o(this,"minVal",1/0);o(this,"maxVal",-1/0);o(this,"mean",new dr);o(this,"p50",new _i(.5));o(this,"p95",new _i(.95))}add(r){r<this.minVal&&(this.minVal=r),r>this.maxVal&&(this.maxVal=r),this.mean.add(r),this.p50.add(r),this.p95.add(r),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}};var hn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(hn||{}),Ae=hn;var _n=(f=>(f.TRANSMITTED_DATA="transmitted-data",f.ACCEPTED_CALL="accepted-call",f.HUNGUP="hungup",f.PARTICIPANT_ADDED="participant-added",f.PARTICIPANT_JOINED="participant-joined",f.CLOSED_CONVERSATION="closed-conversation",f.MEDIA_SETTINGS_CHANGED="media-settings-changed",f.PARTICIPANT_STATE_CHANGED="participant-state-changed",f.PARTICIPANTS_STATE_CHANGED="participants-state-changed",f.RATE_CALL_DATA="rate-call-data",f.FEATURE_SET_CHANGED="feature-set-changed",f.TOPOLOGY_CHANGED="topology-changed",f.PRODUCER_UPDATED="producer-updated",f.CONSUMER_ANSWERED="consumer-answered",f.MULTIPARTY_CHAT_CREATED="multiparty-chat-created",f.FORCE_MEDIA_SETTINGS_CHANGE="force-media-settings-change",f.SETTINGS_UPDATE="settings-update",f.VIDEO_QUALITY_UPDATE="video-quality-update",f.REGISTERED_PEER="registered-peer",f.SWITCH_MICRO="switch-micro",f.RECORD_STARTED="record-started",f.RECORD_STOPPED="record-stopped",f.REALLOC_CON="realloc-con",f.AUDIO_ACTIVITY="audio-activity",f.SPEAKER_CHANGED="speaker-changed",f.STALLED_ACTIVITY="stalled-activity",f.CHAT_MESSAGE="chat-message",f.CUSTOM_DATA="custom-data",f.ROLES_CHANGED="roles-changed",f.MUTE_PARTICIPANT="mute-participant",f.PIN_PARTICIPANT="pin-participant",f.OPTIONS_CHANGED="options-changed",f.NETWORK_STATUS="network-status",f.PARTICIPANT_SOURCES_UPDATE="participant-sources-update",f.PROMOTE_PARTICIPANT="promote-participant",f.CHAT_ROOM_UPDATED="chat-room-updated",f.PROMOTION_APPROVED="promotion-approved",f.JOIN_LINK_CHANGED="join-link-changed",f.FEEDBACK="feedback",f.MOVIE_UPDATE_NOTIFICATION="movie-update-notification",f.MOVIE_SHARE_STARTED="movie-share-started",f.MOVIE_SHARE_STOPPED="movie-share-stopped",f.URL_SHARING_INFO_UPDATED="url-sharing-info-updated",f.ROOM_UPDATED="room-updated",f.ROOMS_UPDATED="rooms-updated",f.ROOM_PARTICIPANTS_UPDATED="room-participants-updated",f.FEATURES_PER_ROLE_CHANGED="features-per-role-changed",f.PARTICIPANT_ANIMOJI_CHANGED="participant-animoji-changed",f.ASR_STARTED="asr-started",f.ASR_STOPPED="asr-stopped",f.DECORATIVE_PARTICIPANT_ID_CHANGED="decorative-participant-id-changed",f.VIDEO_SUSPEND_SUGGEST="video-suspend-suggest",f))(_n||{}),L=_n;var gn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(gn||{}),ct=gn;var{isObject:fn,isObjectsEquals:io}=I;function lr(n,r){return n===null||r===null?n===null&&r===null:n.maxDimension!==r.maxDimension||n.maxBitrateK!==r.maxBitrateK||n.maxFramerate!==r.maxFramerate||n.degradationPreference!==r.degradationPreference||n.scalabilityMode!==r.scalabilityMode||fn(n.bitrates)&&fn(r.bitrates)&&!io(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function pr(n,r){return!(!lr(n.camera,r.camera)||!lr(n.screenSharing,r.screenSharing)||!lr(n.fastScreenSharing,r.fastScreenSharing))}function sa(n,r){return{camera:Object.assign({},n.camera,r.camera),screenSharing:Object.assign({},n.screenSharing,r.screenSharing),fastScreenSharing:Object.assign({},n.fastScreenSharing,r.fastScreenSharing)}}function Sn(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var ft=class ft{constructor(){o(this,"_codecUsages",new Map);o(this,"getCurrentTransportTopology",()=>{})}static create(r){let e=new ft;e.getCurrentTransportTopology=r,ft._instance=e}static reportUsage(r){let e=ft._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let i=r.rtps.filter(a=>a.type==="outbound-rtp"&&!a.mid?.endsWith("s"));p.simulcast&&(i=i.reduce((a,s)=>{if(s.kind!=="video")return a.concat(s);let c=a.find(u=>u.kind==="video");return c?c.totalEncodeTime=(c.totalEncodeTime??0)+(s.totalEncodeTime??0):a.push(s),a},[])),i.forEach(a=>{let s=a.kind,c=a.mimeType;if((s==="audio"||s==="video")&&c){let u=a.encoderImplementation,l=[c,"encoder",u].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:l,totalEncodeTime:(a.totalEncodeTime??0)*1e3,audioCodecParams:a.sdpFmtpLine,topology:t})}})}saveUsage({kind:r,codecName:e,totalEncodeTime:t,audioCodecParams:i,topology:a}){let s=this._codecUsages.get(r);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(r,{...s,totalEncodeTime:t,topology:a});return}this._codecUsages.set(r,{kind:r,codecName:e,audioCodecParams:i,totalEncodeTime:t,topology:a})}report(r){if(r.kind==="video"&&r.totalEncodeTime===0)return;let e={name:X.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),R.logClientStats(e)}static destroy(){ft._instance?._destroy(),ft._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};o(ft,"_instance",null);var it=ft;var At=class extends se{constructor(e,t){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_state","IDLE");o(this,"_pc",null);this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var vn="videochat-epi",ro=5e3,ao=500,St=class extends se{constructor(e,t,i=!1){super();o(this,"_previousPerfStatReportTimestamp",0);o(this,"_previousNetworkStatReportTimestamp",Date.now());o(this,"_previousCallStatReportTimestamp",Date.now());o(this,"_previousCallStatReport",null);o(this,"_screenShareStats",[]);o(this,"_signaling");o(this,"_directTopology");o(this,"_handleScreenSharingStat",e=>{this._screenShareStats.push(e)});o(this,"_handleTransportStateChanged",e=>{(this._directTopology&&e==="CONNECTED"||!this._directTopology&&e==="OPENED")&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())});this._signaling=t,this._directTopology=i,this.subscribe(e,"REMOTE_DATA_STATS",this._handleStats.bind(this)),this.subscribe(e,"SCREEN_SHARING_STAT",this._handleScreenSharingStat.bind(this)),this.subscribe(e,"STATE_CHANGED",this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(vn)||"",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+ro<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+ao<=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((i,a)=>(a.kind==="video"&&(i.framesDecoded+=a.framesDecoded||0,i.framesReceived+=a.framesReceived||0),i),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let i=await this._signaling.reportPerfStat(t);localStorage.setItem(vn,i.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((i,a)=>i+(a.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:En(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:En(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let i=!1,a=!1;for(e.inbound.rtps.reduce((l,m)=>(m.kind==="video"?(i=!0,m.framesReceived&&(l.jitter_video=l.jitter_video*l.inbound_video_count/(l.inbound_video_count+1)+m.jitter*1e3/(l.inbound_video_count+1),l.interframe_delay_variance=l.interframe_delay_variance*l.inbound_video_count/(l.inbound_video_count+1)+(m.interframeDelayVariance||0)*1e6/(l.inbound_video_count+1),l.inbound_video_count++),l.frames_dropped+=m.framesDropped||0,l.nack_sent+=m.nackCount,l.pli_sent+=m.pliCount,l.fir_sent+=m.firCount,l.freeze_count+=m.freezeCountDelta||0,l.total_freezes_duration+=m.totalFreezesDurationDelta||0):(a=!0,m.totalSamplesReceived&&(l.jitter_audio=l.jitter_audio*l.inbound_audio_count/(l.inbound_audio_count+1)+m.jitter*1e3/(l.inbound_audio_count+1),l.total_audio_energy=l.total_audio_energy*l.inbound_audio_count/(l.inbound_audio_count+1)+(m.totalAudioEnergy||0)/(l.inbound_audio_count+1),l.inbound_audio_count++),l.total_audio_samples_received+=m.totalSamplesReceived||0,l.inserted_audio_samples_for_deceleration+=m.insertedSamplesForDeceleration||0,l.removed_audio_samples_for_acceleration+=m.removedSamplesForAcceleration||0,l.concealed_audio_samples+=m.concealedSamples||0,l.silent_concealed_audio_samples+=m.silentConcealedSamples||0,l.audio_concealment_events+=m.concealmentEvents||0),l),t),e.outbound.rtps.reduce((l,m)=>(m.kind==="video"?(l.nack_received+=m.nackCount,l.pli_received+=m.pliCount,l.fir_received+=m.firCount,l.packets_sent_video+=m.packetsSent):l.packets_sent_audio+=m.packetsSent,l),t),e.remoteInbound.rtps.reduce((l,m)=>(m.kind==="video"?l.packets_lost_video+=m.packetsLost:l.packets_lost_audio+=m.packetsLost,l),t);this._screenShareStats.length;){let l=this._screenShareStats.pop();l?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=l.freeze_duration)}let s={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(navigator.hardwareConcurrency&&(s.cpu_hardware_concurrency=navigator.hardwareConcurrency),i&&!ur(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!ur(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!ur(t.interframe_delay_variance)&&(s.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(s.freeze_count=t.freeze_count,s.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(s.ss_freeze_count=t.ss_freeze_count,s.ss_total_freezes_duration=t.ss_total_freezes_duration),a&&!ur(t.total_audio_samples_received)){let l=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),m=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),h=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),E=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),P=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),b=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=Dt(m/l*1e3),s.removed_audio_samples_for_acceleration=Dt(h/l*1e3),s.concealed_audio_samples=Dt(E/l*1e3),s.concealed_silent_audio_samples=Dt(P/l*1e3),s.concealment_audio_avg_size=Dt(E/b),s.total_audio_energy=t.total_audio_energy}In(t,"local_address","local_connection_type","network_type","transport")&&(s.local_address=t.local_address,s.local_connection_type=t.local_connection_type,s.network_type=t.network_type,s.transport=t.transport),In(t,"remote_address","remote_connection_type")&&(s.remote_address=t.remote_address,s.remote_connection_type=t.remote_connection_type);let c=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),u=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(c>0){let l=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=Dt(l/c*100)}if(u>0){let l=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=Dt(l/u*100)}Me.logCallStat(s),p.enableLogPerfStatReport&&d.log("Sent call stats",s),this._previousCallStatReport=t}};function In(n,...r){for(let e of r)if(!Object.hasOwn(n,e)||n[e]===void 0)return!1;return!0}function En(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function ur(n){return n===void 0}function Dt(n){return Number.isNaN(n)?0:n}var fi=class{constructor(r,e=null){o(this,"weightUp");o(this,"weightDown");o(this,"value",NaN);this.weightUp=r,this.weightDown=e??r}set(r){this.value=r}update(r){return this.value=this.getNext(r),this.value}getNext(r){if(isNaN(this.value))return r;let e=r<this.value?this.weightDown:this.weightUp;return this.value*(1-e)+r*e}getValue(){return this.value}};var Tn=.25,Rn=.35,no=85,so=.1,oo=1.5,co=.1,lo=1,po=.6,uo=.3;var Si=class extends se{constructor(e){super();o(this,"_signaling");o(this,"_localNetworkStat");o(this,"_remoteNetworkStat");o(this,"_lastNetworkStat");o(this,"_networkLimits",{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}});o(this,"_lastStatSentTimestamp",0);o(this,"_currentState","good");this._signaling=e,this._localNetworkStat={rtt:new fi(Tn,Tn),loss:new fi(Rn,Rn),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(),i=1;if(isNaN(t))return i;let a=Math.round((t-this._networkLimits.goodNet.rtt)/no);for(let s=0;s<a;s++)i*=1-so;return i}_calcLossRating(e){let t=typeof e=="number"?e:e.getValue(),i=1;if(isNaN(t))return i;let a=Math.round((t-this._networkLimits.goodNet.loss)/oo);for(let s=0;s<a;s++)i*=1-co;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*lo;return Math.min(a,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,i){return i?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=po?"good":e>=uo?"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",i=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),a=e.inbound.rtps.reduce((h,E)=>Math.max(h,E.packetLoss||0),0),s={rtt:this._localNetworkStat.rtt.update(i),loss:this._localNetworkStat.loss.update(a)};if(t){let h=e.outbound.rtps.reduce((E,P)=>E+(P.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let c=Date.now(),u=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),l=Math.max(Math.round(u*10)/10,.1),m=this._getNetworkState(l);(t||m!==this._currentState||c-this._lastStatSentTimestamp>p.networkStatisticsInterval)&&(this._lastStatSentTimestamp=c,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{d.warn("Unable to send [bad-net]",h)})),this._currentState=m,this._triggerEvent("NETWORK_STATUS",l)}reportRemote(e){let{rtt:t,loss:i,bitrate:a}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=i||0,this._remoteNetworkStat.bitrate=a||0}};var mo=30*1e3,vi=class n extends At{constructor(e,t,i,a,s){super(i,a);o(this,"_participantId");o(this,"_isMaster");o(this,"_remoteSDP",{});o(this,"_remoteCandidates",{});o(this,"_lastRemoteSDP",null);o(this,"_animojiDataChannel",null);o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);o(this,"_remoteAnimojiVersion",1);o(this,"_isOpen",!1);o(this,"_remotePeerId",null);o(this,"_statInterval",null);o(this,"_settingsInterval",null);o(this,"_failedOnCreate",null);o(this,"_remoteStream",null);o(this,"_iceRestartTimeout",null);o(this,"_reconnectionTimeout",null);o(this,"_reconnectionPrevented",!1);o(this,"_lastStat");o(this,"_fingerprint",null);o(this,"_neverConnected",!0);o(this,"_serverSettings");o(this,"_prevConsumerSettings",{});o(this,"_networkLimitsForVideo",{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}});o(this,"_videoMaxDimensionsForNet",{worst:320,bad:640,good:1280});o(this,"_lastVideoMaxDimension",this._videoMaxDimensionsForNet.good);o(this,"_lastBadConnection",0);o(this,"_perfStatReporter");o(this,"_directStatReporter");this._participantId=e,this._isMaster=t,this._serverSettings=s,this._perfStatReporter=new St(this,i,!0),this._directStatReporter=new Si(i),this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applySettings.bind(this)),this.subscribe(this._directStatReporter,"NETWORK_STATUS",this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:p.iceServers,iceTransportPolicy:p.forceRelayPolicy?"relay":"all"})}catch(c){d.error("Failed to create RTCPeerConnection:",c),this.close(c);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,ct.animoji,c=>{this._animojiDataChannel=c,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(c){R.log(D.ERROR,"addTrack-direct"),d.error("Unable to add media source tracks",c,{participantId:this._participantId}),this._failedOnCreate=c;return}this._createOffer(!1).catch(c=>{this._state==="IDLE"?this._failedOnCreate=c:this.close(c)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return["IDLE","CLOSED","FAILED"].includes(this.getState())}async open(e=null){if(this._isOpen){d.warn("DirectTransport: Already opened",{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(d.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(i){R.log(D.ERROR,"addTrack-direct"),d.error("DirectTransport: Unable to add media source tracks",i,{participantId:this._participantId}),this.close(i);return}this._setState("OPENED");let t=e;if(!e){let i=Object.keys(this._remoteSDP);t=i[i.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){pr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}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(t=>{t.stop(),this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t)}),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?(d.error("DirectTransport: Closed",e,{participantId:this._participantId}),this._setState("FAILED")):(d.debug("DirectTransport: Closed",{participantId:this._participantId}),this._setState("CLOSED")),this._triggerEvent("PEER_CONNECTION_CLOSED"))}_setState(e){this._state!==e&&(d.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent("STATE_CHANGED",e))}_onSignalingNotification(e){switch(e.notification){case L.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case L.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case L.CUSTOM_DATA:Object.hasOwn(e.data,"sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,i=I.getPeerIdString(e.peerId);I.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(i,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(i,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){d.debug("Add remote ice candidate",{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(i){throw R.log(D.ERROR,"addIceCandidate-direct"),d.error("Unable to add remote ice candidate",i,{participantId:this._participantId,candidate:t}),i}}else d.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]){d.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let i of t)try{await this._addIceCandidate(e,i)}catch{}}async _setRemoteDescription(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc){if(this._lastRemoteSDP?.sdp===t.sdp)return;this._lastRemoteSDP=t,t=n._patchRemoteDescription(t),d.debug("Add remote description",{participantId:this._participantId,sdp:t}),this._calcFingerprint(t.sdp);try{await this._pc.setRemoteDescription(t),await this._setRemoteCandidates(e),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(i){throw R.log(D.ERROR,"setRemoteDescription-direct"),d.error("Unable to set remote description",i,{participantId:this._participantId,sdp:t}),i}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,p.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){d.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=t=>{this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t.track)}),this._triggerEvent("REMOTE_TRACK_ADDED",this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(d.debug("Local ice candidate",{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){d.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(new Error);break;case"have-remote-offer":this._createAnswer().then(i=>this._signaling.sendSdp(this._participantId,i,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(d.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case"checking":let e=this.getState();e==="IDLE"||e==="OPENED"?this._setState("CONNECTING"):this._setState("RECONNECTING");break}}_onConnectionStateChange(){switch(d.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),R.log(D.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),I.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(R.log(D.ICE_CONNECTION_TYPE,e.local.type),d.debug("Selected ICE candidates",e))}),this._startStatInterval();break;case"failed":case"disconnected":this._reconnectionPrevented?this.close(new Error(`Ice connection ${this._pc.connectionState}`)):(this._setState("RECONNECTING"),this._startReconnection());break;case"closed":this.close(new Error("Ice connection closed"));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(d.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&&(d.log("Switch topology DIRECT to SERVER",{participantId:this._participantId}),this._signaling.switchTopology("SERVER"))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(R.log(D.ICE_RESTART),d.log("Ice restart",{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):d.debug("Waiting for ice restart...",{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,d.error("Ice restart failed",{participantId:this._participantId}),R.log(D.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},p.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};d.debug("Create offer",{participantId:this._participantId,options:t});let i;try{i=await this._pc?.createOffer(t),d.debug("Created offer",{participantId:this._participantId,offer:i}),i=n._patchLocalDescription(i)}catch(a){throw d.error("Unable to create offer",a,{participantId:this._participantId}),R.log(D.ERROR,"createOffer-direct"),a}try{return d.debug("Set local description",{participantId:this._participantId,offer:i}),this._calcFingerprint(i.sdp),await this._pc?.setLocalDescription(i),i}catch(a){throw d.error("Unable to set local description",a,{participantId:this._participantId}),R.log(D.ERROR,"setLocalDescription-direct"),a}}async _createAnswer(){d.debug("Create answer",{participantId:this._participantId});let e;try{e=await this._pc?.createAnswer(),d.debug("Created answer",{participantId:this._participantId,answer:e}),e=n._patchLocalDescription(e)}catch(t){throw d.error("Unable to create answer",t,{participantId:this._participantId}),R.log(D.ERROR,"createAnswer-direct"),t}try{return d.debug("Set local description",{participantId:this._participantId,answer:e}),this._calcFingerprint(e.sdp),await this._pc?.setLocalDescription(e),e}catch(t){throw d.error("Unable to set local description",t,{participantId:this._participantId}),R.log(D.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!M.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,p.preferH264&&M.canPreferH264(),M.isBrokenH264Decoder(),p.preferVP9,t&&p.audioNack),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,p.preferVP9,M.isBrokenVP9Encoder(),M.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(i=>{d.error("DirectTransport: Unable to replace track",i,{participantId:this._participantId}),R.log(D.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}pe.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,it.reportUsage(t);let i={inbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="inbound-rtp"?(a.userId=this._participantId,!0):!1)},outbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="outbound-rtp")},remoteInbound:{topology:"DIRECT",transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(i),this._directStatReporter.reportLocal(i),this._triggerEvent("REMOTE_DATA_STATS",i),this._statInterval=window.setTimeout(e,p.statisticsInterval)})};this._statInterval=window.setTimeout(e,p.statisticsInterval)}async _isSVCSupported(e,t){let i=this._mediaSource.getSendVideoTrack(),a=e.outbound.rtps.find(u=>u.kind==="video");if(!a?.mimeType||!a?.bandwidth||!i)return!1;let s=i.getSettings();if(!s.width||!s.height||!s.frameRate)return!1;let c={type:M.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:s.width,height:s.height,bitrate:a.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(c)).supported||!1}catch(u){return d.warn("Failed to get encodingInfo",c,u),!1}}async _checkPPTNetwork(e){if(!p.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,i=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,a=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,s=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,c=this._videoMaxDimensionsForNet.good,u="L1T1";if(a?(this._lastBadConnection=Date.now(),s?(c=this._videoMaxDimensionsForNet.bad,u="L1T2"):(c=this._videoMaxDimensionsForNet.worst,u="L1T3")):i&&(c=this._videoMaxDimensionsForNet.good,u="L1T1"),!(c<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>mo)||this._lastVideoMaxDimension===c)return;let m=this._serverSettings.camera;if(!m||!await this._isSVCSupported(e,u))return;d.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:u,averageNetStat:t,nextVideoMaxDimension:c}),this._lastVideoMaxDimension=c;let E={...this._serverSettings,camera:{...m,scalabilityMode:u,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(E)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[""]=e,this._triggerEvent("NETWORK_STATUS",t)}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=I.sdpFingerprint(e);if(t===null){d.warn("Fingerprint calculation is unsupported");return}this._fingerprint===null?this._fingerprint=t:(v.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=I.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{negotiated:!0,id:1});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),a.onerror=c=>{d.error(`[${t}] data channel error`,c)},i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)}}};var Cn=(e=>(e.AUDIO_MIX="audio-mix",e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",e))(Cn||{}),ze=Cn;var ho=16,hr=class n{constructor(r,e,t){o(this,"_datachannel");o(this,"_participantIdRegistry");o(this,"_asrCallback");o(this,"_textDecoder");d.debug("AsrReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._asrCallback=t,this._textDecoder=new TextDecoder,this._datachannel.onmessage=i=>this._onDataChannelMessage(i.data)}static parse(r){let e=new DataView(r),t=e.getUint8(0),i=e.getUint8(1);if(i!==0)throw new Error(`Unsupported message type. Message type: ${i}`);let a=e.getUint16(2),s=e.getUint32(4),c=e.getUint32(8),u=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:a,ssrc:s,timestamp:c,duration:u,data:r.slice(ho)}}_onDataChannelMessage(r){let e=n.parse(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){d.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}let i={participantId:t,text:this._textDecoder.decode(e.data),timestamp:e.timestamp,duration:e.duration};this._asrCallback(i)}destroy(){this._datachannel.onmessage=null}};var vt=class vt{constructor(){o(this,"_value",1)}get value(){return this._value}set value(r){this._value=r}};o(vt,"_instance",null),o(vt,"getInstance",()=>(vt._instance||(vt._instance=new vt),vt._instance));var zt=vt;import{decode as It}from"messagepack";var _r=class{constructor(){o(this,"streamDescriptionByCompactId",new Map);o(this,"compactIdByStreamDescription",new Map)}getStreamDescription(r){return this.streamDescriptionByCompactId.get(r)}getCompactId(r){return this.compactIdByStreamDescription.get(r)}handleMessage(r){let e=new Uint8Array(r),t=e[0],i=e.subarray(1);switch(t){case 1:let a=It(i);return Object.entries(a).forEach(([P,b])=>{let V=qt(P);this.streamDescriptionByCompactId.set(b,V),this.compactIdByStreamDescription.set(P,b)}),null;case 2:case 4:let s=It(i),c=[];for(let P of s){let b=this.getStreamDescription(P);b&&c.push(b.participantId)}return t===2?{type:"notification",notification:L.AUDIO_ACTIVITY,activeParticipants:c}:{type:"notification",notification:L.STALLED_ACTIVITY,stalledParticipants:c};case 3:let u=It(i);return{type:"notification",notification:L.SPEAKER_CHANGED,speaker:this.getStreamDescription(u)?.participantId};case 5:let l=It(i);return{type:"notification",notification:L.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:l[0],maxDimension:l[1]},mediaType:this._decodeMediaType(l[2])};case 6:let m=It(i),h={};for(let[P,b]of Object.entries(m)){let V=this.getStreamDescription(Number(P))?.participantId;V&&(h[V]=b/100)}return{type:"notification",notification:L.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let b=It(i).map(V=>{let[J,ce,Ie,Te,Y,Re,Q]=V;return{participantId:this.getStreamDescription(J)?.participantId,gain:ce,pause:Ie,offset:Te,mute:Y,liveStatus:Re,startTimeMs:Q}});return{type:"notification",notification:L.MOVIE_UPDATE_NOTIFICATION,data:b}}case 9:let E=It(i);return{type:"notification",notification:L.VIDEO_SUSPEND_SUGGEST,bandwidth:E};default:return d.debug("unsupported message type: "+t),null}}_decodeMediaType(r){if(r===null)return null;switch(r){case 0:return"CAMERA";case 1:return"SCREEN";default:throw new Error(`Unsupported media type: ${r}`)}}_createParticipantSourcesUpdateNotification(r){let e=It(r),t=[];for(let[i,a]of Object.entries(e)){let s=a[0],c=a[1],u=a[2],l=!!a[3],m=a[4]!==null?!!a[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){d.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(u===null){d.error("unexpected null sequenceNumber",i,a);continue}let E=ze.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,P=c?c>>>0:null;t.push({participantStreamDescription:h,streamId:E,rtpTimestamp:P,sequenceNumber:u,fastScreenShare:l,suspend:m})}return{type:"notification",notification:L.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};import Pn from"@vkontakte/libvpx";var Je=class{constructor(){o(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,c)=>{let u=t.join(","),l=new Blob([r,`exports.default(${u});`],{type:"application/javascript; charset=utf-8"}),m=window.URL.createObjectURL(l);this._worker=new Worker(m),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":c(h.data.error);break;case"frame":e(h.data);break;case"debug":d.debug(h.data.message);break;case"log_error":R.log(D.ERROR,h.data.message);break}},this._sendToWorker("init",i,a)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(r,e={},t=[]){this._worker?.postMessage(Object.assign({type:r},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var Ii=class extends Je{async init(r,e,t){d.debug("LibVPxDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var h=(s,t)=>{for(var e in t)u(s,e,{get:t[e],enumerable:!0})},F=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of x(t))!M.call(s,a)&&a!==e&&u(s,a,{get:()=>t[a],enumerable:!(o=R(t,a))||o.enumerable});return s};var V=s=>F(u({},"__esModule",{value:!0}),s);var D={};h(D,{default:()=>A});var A=(s,t)=>{let e=null,o=null,a=!0,l=!1;function c(){return s({locateFile:t}).then(r=>o=r)}function m(r,f,n,g){if(!o){self.postMessage({type:"log_error",message:"decoder-init-fail-libvpx"}),self.postMessage({type:"frame",error:"Fatal initialization error"});return}if(a!==n&&(a=n,e&&(e=null,self.postMessage({type:"debug",message:`LibVPxDecoder codec changed to ${n?"VP9":"VP8"} - reinitialize`}))),!e&&(self.postMessage({type:"debug",message:`LibVPxDecoder codec ${n?"VP9":"VP8"}`}),e=new o.VpxDecoder,e.debug(g),!e.init(n?o.VpxType.VP9:o.VpxType.VP8))){e=null,self.postMessage({type:"frame",error:"Decoder failed to create"});return}try{e.allocateBuffer(f.byteLength).set(new Uint8Array(f))}catch(i){self.postMessage({type:"debug",message:i}),e=null,self.postMessage({type:"frame",error:String(i)});return}if(e.decode()&&e.nextImage())l=!1;else{self.postMessage({type:"frame",error:"Decode failed"}),b();return}let p=e.getImageBuffer();if(!p){self.postMessage({type:"frame",error:"No decoded data"});return}let y=e.getImageWidth(),E=e.getImageHeight();e.nextImage()&&(self.postMessage({type:"debug",message:"LibVPxDecoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxDecoder-drop"}));let d=new Uint8ClampedArray(p.byteLength);d.set(p),self.postMessage({type:"frame",data:d.buffer,width:y,height:E},[d.buffer])}function b(){l||(self.postMessage({type:"frame",requestKeyFrame:!0}),l=!0)}c().then(()=>{self.onmessage=r=>{switch(r.data.type){case"frame":m(r.data.timestamp,r.data.data,r.data.isVP9,r.data.debug);break}},self.postMessage({type:"ready"})}).catch(r=>{self.postMessage({type:"error",error:String(r)})})};return V(D);})();\n',i=>{if(i.error)d.warn("LibVPxDecoder",i.error),e(i.error);else if(i.requestKeyFrame)d.debug("LibVPxDecoder requests key frame"),t();else{let a=new ImageData(new Uint8ClampedArray(i.data),i.width,i.height);r(a)}},[Pn,Pn.getUrl])}decodeFrame(r,e,t,i){this._sendToWorker("frame",{timestamp:r,data:e.buffer,isVP9:t,keyFrame:i,debug:d.enabled()},[e.buffer])}destroy(){this._removeWorker(),d.debug("LibVPxDecoder destroyed")}static isBrowserSupported(){return"WebAssembly"in window&&"Worker"in window}};var dt=class extends Je{async init(r,e,t){d.debug("WebCodecsDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var m=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var M=(a,e)=>{for(var s in e)m(a,s,{get:e[s],enumerable:!0})},P=(a,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of C(e))!w.call(a,o)&&o!==s&&m(a,o,{get:()=>e[o],enumerable:!(n=k(e,o))||n.enumerable});return a};var B=a=>P(m({},"__esModule",{value:!0}),a);var I={};M(I,{default:()=>x});var x=a=>{let e=null,s="no-preference",n=!0,o=!1,f=!1,c=null,i=null,g=3e3;function y(){self.postMessage({type:"ready"})}function p(t,r,u,d=!1){c={timestamp:t,data:r,isVP9:u,keyFrame:d};let V=D(u);if(o&&!d){self.postMessage({type:"frame",error:"WebCodecsDecoder waiting for keyframe"}),E();return}else o&&d&&(o=!1,f=!1,self.postMessage({type:"debug",message:"WebCodecsDecoder got keyframe. Start decoding"}));let A=new EncodedVideoChunk({type:d?"key":"delta",timestamp:t,data:r});try{V.decode(A)}catch(h){l(`because failed call decode: ${h.message}`);return}F(d)}self.onmessage=t=>{switch(t.data.type){case"init":y();break;case"frame":p(t.data.timestamp,t.data.data,t.data.isVP9,t.data.keyFrame);break}};function E(){f||(self.postMessage({type:"frame",requestKeyFrame:!0}),f=!0)}function D(t){return n!==t&&(n=t,l(`because codec is changed to ${n?"VP9":"VP8"}`)),e||(o=!0,self.postMessage({type:"debug",message:`WebCodecsDecoder codec ${n?"VP9":"VP8"}`}),e=new VideoDecoder({output:r=>{b();let u=a?[r]:[];self.postMessage({type:"frame",data:r},u),r.close()},error:r=>{b(),l(`because error during decoding: ${r.message}`),s!=="prefer-software"?(s="prefer-software",c&&c.keyFrame&&p(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:"debug",message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${r.message}`})):self.postMessage({type:"frame",error:"WebCodecsDecoder failed, reinitialize: "+String(r)})}}),e.configure(R(n,s))),e}function l(t){if(e){try{e&&e.state!=="closed"&&e.close()}catch{}e=null,self.postMessage({type:"frame",error:`WebCodecsDecoder reset ${t}`})}}function F(t=!1){i=setTimeout(()=>{l("because of decode timeout")},g)}function b(){i&&clearTimeout(i),i=null}function R(t,r){return{codec:t?"vp09.00.50.08":"vp8",hardwareAcceleration:r}}};return B(I);})();\n',i=>{i.error?(d.warn("WebCodecsDecoder",i.error),e(i.error)):i.requestKeyFrame?(d.debug("WebCodecsDecoder requests key frame"),t()):(r(i.data),i.data.close())},[M.baseChromeVersion()>=92||M.browserName()==="Safari"])}decodeFrame(r,e,t,i=!1){this._sendToWorker("frame",{timestamp:r,data:e.buffer,isVP9:t,keyFrame:i},[e.buffer])}destroy(){this._removeWorker(),d.debug("WebCodecsDecoder destroyed")}static isBrowserSupported(){return"VideoDecoder"in window&&"Worker"in window&&"VideoFrame"in window&&!M.isBrokenVP9Decoder()&&M.browserName()!=="Firefox"}};var kt=class{constructor(r=null,e=0){o(this,"_counter",0);o(this,"_interval",0);o(this,"_lastCalculationTime",Date.now());o(this,"_onCalculated",null);this._onCalculated=r,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(r=1){this._counter+=r}calculate(){let r=Date.now(),e=r-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=r,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};import{BitStream as _o}from"bit-buffer";var fr=class{constructor(r){o(this,"_participantId");o(this,"_firstFrameReceived",!1);this._participantId=r}measure(r,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=pe.getMarkNameScreenshareFirstFrame(this._participantId),i=pe.measureMark(t);i!==null&&Me.logEventualStat({name:X.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var go=65536,oa="MARK_SCREENSHARE_FREEZE_DURATION",Jt=class n{constructor(r,e,t,i){o(this,"_participantId");o(this,"_onStream");o(this,"_onStat");o(this,"_onKeyFrameRequested");o(this,"_statScreenShareFirstFrame");o(this,"_chunks",[]);this._participantId=r,this._onStream=e,this._onStat=t,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new fr(r)}appendChunk(r){let e=this._chunks.length;if(r.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),e&&(d.warn("[FrameBuilder] Cleanup buffer",Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!e||(this._chunks[e-1].sequence+1)%go!==r.sequence){d.warn("[FrameBuilder] Got incorrect chunk");return}if(this._chunks.push(r),r.end){let t=this._processFrameData(),{width:i,height:a}=n.getFrameSize(t);this._processFrame({timestamp:r.timestamp,frameData:t,isVP9:r.isVP9,keyframe:r.keyframe,width:i,height:a}),this._statScreenShareFirstFrame.measure(i,a)}}destroy(){pe.clearMark(oa),pe.clearMark(pe.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let r=this._chunks;this._chunks=[];let e=r.reduce((a,s)=>a+s.data.byteLength,0),t=new Uint8Array(e),i=0;for(let a of r)t.set(new Uint8Array(a.data),i),i+=a.data.byteLength;return t}static getFrameSize(r){let e={width:0,height:0},t=new _o(r.buffer);t.bigEndian=!0,t.index+=2;let i=t.readBits(1),s=t.readBits(1)<<1|i;return s===3&&t.index++,t.readBits(1)===1||t.readBits(1)!==0||(t.index++,t.index++,t.index+=24,s>=2&&t.index++,t.readBits(3)!==7?(t.index++,(s===1||s===3)&&(t.index+=3)):(s===1||s===3)&&t.index++,e.width=t.readBits(16)+1,e.height=t.readBits(16)+1),e}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(r){if(r){pe.setMark(oa);return}let e=pe.measureMark(oa);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Ot=class{constructor(r){o(this,"_onStream");this._onStream=r}async drawFrame(r){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(r){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var Yt=class extends Ot{constructor(e){super(e);o(this,"_useImageBitmap");o(this,"_canvas",null);o(this,"_canvasContext",null);o(this,"_stream",null);o(this,"_track",null);d.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 i;if(e instanceof ImageBitmap)i=e;else{let{width:s,height:c,data:u}=e,l=s*c*4;if(u.byteLength!==l){d.warn("Bad frame buffer",{w:s,h:c,got:u.byteLength,expected:l});return}i=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){d.warn("Canvas context is null"),i.close();return}this._canvasContext.transferFromImageBitmap(i),i.close()}else{let i=this._canvasContext;i.clearRect(0,0,t.width,t.height),i.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(),d.debug("CanvasRenderer destroyed")}static isBrowserSupported(){return("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)&&!(M.browserName()==="Safari"&&Number(M.browserVersion())===15)&&!(M.browserName()==="Firefox"&&Number(M.browserVersion())<60)}};var xt=class extends Ot{constructor(e){super(e);o(this,"_generator");o(this,"_writer");o(this,"_stream");d.debug("TrackGeneratorRenderer started"),this._generator=new MediaStreamTrackGenerator({kind:"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()),d.debug("TrackGeneratorRenderer destroyed")}static isBrowserSupported(){return"VideoFrame"in window&&"MediaStreamTrackGenerator"in window&&dt.isBrowserSupported()}};var Ei=class extends Jt{constructor(e,t,i,a){super(e,t,i,a);o(this,"_renderer");o(this,"_decoder");o(this,"_decoderReady",!1);o(this,"_decoderBusy",!1);o(this,"_decoderQueue",[]);o(this,"_fpsMeter");d.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 kt(e=>d.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!xt.isBrowserSupported()?this._renderer=new Yt(this._onStream):this._renderer=new xt(this._onStream)}_initDecoder(e=!1){e||!dt.isBrowserSupported()?this._decoder=new Ii:this._decoder=new dt;let t=async a=>{this._decoderBusy=!1,"VideoFrame"in window&&a instanceof VideoFrame?await this._renderer.drawFrame(a):await this._renderer.drawImage(a),this._fpsMeter.increment(),this._decodeQueue()},i=a=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof dt&&typeof a=="string"&&a.includes("EncodingError")&&this._switchToLibVPXDecoder()};this._decoder.init(t,i,this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()})}_switchToLibVPXDecoder(){d.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(),d.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return Yt.isBrowserSupported()||xt.isBrowserSupported()}};function yn(n,r,e,t,i,a,s){let c=0;r&&(c|=1),e&&(c|=2),t&&(c|=4),s||(c|=8);let u=new ArrayBuffer(11),l=new DataView(u);if(l.setUint8(0,1),l.setUint16(1,i),l.setUint32(3,n),l.setUint8(7,a?1:0),l.setUint16(8,0),l.setUint8(10,c),!s)return u;let m=new Uint8Array(u.byteLength+s.byteLength);return m.set(new Uint8Array(u),0),m.set(new Uint8Array(s),u.byteLength),m.buffer}function bn(n){let r=new DataView(n),e=r.getUint8(0),t=r.getUint16(1),i=r.getUint32(3),a=r.getUint8(7)===1,s=r.getUint16(8),c=r.getUint8(10),u=!!(c&1),l=!!(c&2),m=!!(c&4),h=!!(c&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:i,start:u,end:l,keyframe:m,sequence:t,isVP9:a,ssrc:s,eos:h,data:n.slice(11)}}function Mn(n){if(!n||!n.byteLength||n.byteLength!==4)return!1;let r=new DataView(n);return!(r.getUint8(0)!==1||r.getUint8(1)!==1||r.getUint16(2)!==0)}function An(n){if(!n||!n.byteLength||n.byteLength!==10)return null;let r=new DataView(n);if(r.getUint8(0)!==1||r.getUint8(1)!==2||r.getUint16(2)!==0)return null;let a=r.getUint16(4),s=r.getUint32(6);return{seq:a,ts2:s}}function Dn(n){let r=new ArrayBuffer(4),e=new DataView(r);return e.setUint8(0,1),e.setUint8(1,1),e.setUint16(2,n),r}import*as O from"simple-ebml-builder";var fo=2**15-1,ca=1,So=5,vo=5;var da=class n{constructor(r){o(this,"_mediaSource");o(this,"_codec");o(this,"_sourceBuffer",null);o(this,"_queue",[]);o(this,"_clearBufferTill",0);this._mediaSource=new MediaSource,this._codec=r;let e=()=>{this._mediaSource.removeEventListener("sourceopen",e),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener("sourceopen",e,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let t=this._sourceBuffer.buffered.start(0);t<this._clearBufferTill&&(this._sourceBuffer.remove(t,this._clearBufferTill),d.debug(`[WebmBuilder] SourceBuffer cleanup from ${t} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let r=this._queue;this._queue=[];let e=n._buildQueue(r);this._sourceBuffer.appendBuffer(e)}static _buildQueue(r){if(r.length){if(r.length===1)return O.build(r[0])}else return new Uint8Array;let e=r.reduce((a,s)=>a+s.countSize(),0),t=new Uint8Array(e),i=0;for(let a of r){let s=O.build(a);t.set(s,i),i+=s.byteLength}return t}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode="sequence",this._sourceBuffer.addEventListener("updateend",()=>this._handleQueue())}changeType(r){return this._codec=r,this._sourceBuffer?.changeType(r)}append(r,e=!1){this._queue.push(r),e&&this._handleQueue()}cleanup(){this._mediaSource?.readyState==="open"&&this._sourceBuffer?.abort();let r=this._sourceBuffer?.buffered,e=r?.length;if(!e)return;let t=r.start(0),i=Math.max(0,r.end(e-1)-So);i-t>vo&&(this._clearBufferTill=i)}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}},Qt=class n extends Jt{constructor(e,t,i){super(e,t,i);o(this,"_mediaBuffer",null);o(this,"_video",null);o(this,"_stream",null);o(this,"_earliestTimestamp",0);o(this,"_clusterStartTime",0);o(this,"_lastFrameTimestamp",0);d.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return O.element(O.ID.EBML,[O.element(O.ID.EBMLVersion,O.number(1)),O.element(O.ID.EBMLReadVersion,O.number(1)),O.element(O.ID.EBMLMaxIDLength,O.number(4)),O.element(O.ID.EBMLMaxSizeLength,O.number(8)),O.element(O.ID.DocType,O.string("webm")),O.element(O.ID.DocTypeVersion,O.number(2)),O.element(O.ID.DocTypeReadVersion,O.number(2))])}static _genSegmentHeader(e,t,i){let a=O.element(O.ID.Info,[O.element(O.ID.TimecodeScale,O.number(1e6)),O.element(O.ID.MuxingApp,O.string("vk-webm-builder")),O.element(O.ID.WritingApp,O.string("vk-webm-builder"))]),s=[O.element(O.ID.PixelWidth,O.number(e)),O.element(O.ID.PixelHeight,O.number(t))],c=O.element(O.ID.Tracks,O.element(O.ID.TrackEntry,[O.element(O.ID.TrackNumber,O.number(ca)),O.element(O.ID.TrackUID,O.number(ca)),O.element(O.ID.TrackType,O.number(1)),O.element(O.ID.FlagLacing,O.number(0)),O.element(O.ID.DefaultDuration,O.number(1e9)),O.element(O.ID.CodecID,O.string(`V_${i.toUpperCase()}`)),O.element(O.ID.Video,s)]));return O.unknownSizeElement(O.ID.Segment,[a,c])}static _genClusterHeader(e){return O.unknownSizeElement(O.ID.Cluster,[O.element(O.ID.Timecode,O.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new da(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){d.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let i=this._video.seekable;i.length&&(this._video.currentTime=i.end(i.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>d.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(e){let t=e.isVP9?"vp9":"vp8";this._mediaBuffer?this._mediaBuffer.codec!==t&&this._mediaBuffer.changeType(t):this._createVideo(t);let i=e.timestamp;if(i<=this._lastFrameTimestamp&&(i=this._lastFrameTimestamp+10,d.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=i,this._earliestTimestamp)i-=this._earliestTimestamp;else{if(!e.keyframe)return;this._earliestTimestamp=i,i=0}if(e.keyframe){this._clusterStartTime=i,this._mediaBuffer?.cleanup(),d.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let c=n._genWebmHeader();this._mediaBuffer?.append(c);let u=n._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(u)}let a=Math.round(i-this._clusterStartTime);if(a>fo&&(this._clusterStartTime=i,a=0),a===0){d.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let c=n._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(c)}let s=O.element(O.ID.SimpleBlock,[O.vintEncodedNumber(ca),O.bytes(n._intToU16BE(a)),O.number((e.keyframe?1:0)<<7),O.bytes(e.frameData)]);this._mediaBuffer?.append(s,!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),d.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"')}};var Ti=class{constructor(r,e,t,i,a){o(this,"_datachannel");o(this,"_participantIdRegistry",null);o(this,"_streamBuilders",{});o(this,"_onStream",()=>{});o(this,"_onEos",()=>{});o(this,"_onStat");d.debug("ScreenCaptureReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._onStream=t,this._onEos=i,this._onStat=a,this._datachannel.onmessage=s=>this._onDataChannelMessage(s.data)}_onDataChannelMessage(r){let e=bn(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){d.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}if(e.eos){this.close(t),this._onEos(t);return}let i=this._streamBuilders[t];if(!i){let a=c=>this._onStream(t,c),s=()=>{this._requestKeyFrame(e.ssrc)};p.screenShareWebmBuilder&&Qt.isBrowserSupported()?i=new Qt(t,a,this._onStat):i=new Ei(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=Dn(r);this._datachannel.send(e),d.debug(`ScreenCaptureReceiver request for keyframe for ssrc ${r}`)}catch(e){d.warn("Failed to send keyframe request",e)}}close(r){let e=this._streamBuilders[r];e&&(e.destroy(),delete this._streamBuilders[r])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(r=>r.destroy()),this._streamBuilders={},this._participantIdRegistry=null,d.debug("ScreenCaptureReceiver destroyed")}};var la=class{constructor(r,e,t){o(this,"_prev");o(this,"_next");o(this,"_data");this._next=t,t&&(t.prev=this),this._prev=e,e&&(e.next=this),this._data=r}get prev(){return this._prev}set prev(r){this._prev=r}get next(){return this._next}set next(r){this._next=r}get data(){return this._data}},Ri=class{constructor(){o(this,"_head",null);o(this,"_tail",null);o(this,"_length",0)}get length(){return this._length}push(...r){for(let e of r)this._tail=new la(e,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(r){this._tail&&(this._tail.next=r._head),this._head||(this._head=r._head),this._tail=r._tail,this._length+=r._length,r.clear()}shift(){if(!this._length||!this._head)return null;let r=this._head;return this._head=r.next,this._head&&(r.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),r.data}bisect(){if(this.length){let r=this.length>1?Math.floor(this.length/2):1;for(let e=0;e<r;e++)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 r=[],e=this._head;for(;e!==null;)r.push(e.data),e=e.next;return r.length?JSON.stringify(r,(t,i)=>i instanceof Error?String(i):i):""}};import wn from"@vkontakte/libvpx";var Io=1e3,Xt=class extends Je{constructor(e,t,i,a){super();o(this,"_sourceTrack");o(this,"_onFrame");o(this,"_useCongestionControl");o(this,"_maxBitrate");o(this,"_useImageCapture");o(this,"_video",null);o(this,"_imageCapture",null);o(this,"_canvas",null);o(this,"_canvasCtx",null);o(this,"_frameReadTimeout",0);o(this,"_lastFrame",null);this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=i,this._maxBitrate=a,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 new Error("Canvas not found");if(!this._video&&!this._useImageCapture)throw new Error("Video element not found");return new Promise((t,i)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let a=this._video;a.srcObject=new MediaStream([e]),a.onloadeddata=u=>t(),a.onerror=()=>i(new Error("Video element error"));let s=a.play(),c=()=>i(new Error("Autoplay is disabled"));s?s.catch(c):c()}})}_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 new 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 new Error("Destroyed");return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw new Error("Destroyed");let t=e.width,i=e.height;return this._canvas.width=t,this._canvas.height=i,this._canvasCtx.clearRect(0,0,t,i),this._canvasCtx.drawImage(e,0,0,t,i),this._canvasCtx?.getImageData(0,0,t,i)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;d.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?"VP9":"VP8"}`),await this._createStream(this._sourceTrack),await this._createWorker(`"use strict";var exports=(()=>{var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var V=(a,r)=>{for(var s in r)u(a,s,{get:r[s],enumerable:!0})},h=(a,r,s,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of y(r))!x.call(a,e)&&e!==s&&u(a,e,{get:()=>r[e],enumerable:!(i=R(r,e))||i.enumerable});return a};var A=a=>h(u({},"__esModule",{value:!0}),a);var M={};V(M,{default:()=>F});var F=(a,r,s,i)=>{let e;function m(t,o){return a({locateFile:r}).then(n=>{if(e=new n.VpxEncoder,e.debug(o),!e.init(t?n.VpxType.VP9:n.VpxType.VP8))throw self.postMessage({type:"log_error",message:"encoder-init-fail-libvpx"}),new Error("LibVPxEncoder failed to create");if(s){let d=Math.round(i/1e3);e.setTargetBitrate(d)}else e.setMaxQuantizer(10),e.setTargetBitrate(1024)})}function E(t,o,n,p){let d=e.allocateImage(t,o);if(!d){self.postMessage({type:"frame",error:"No buffer data"});return}d.set(new Uint8Array(n));let l=Math.round(performance.now()),f=150;if(!e.encode(l,f,p)){self.postMessage({type:"frame",error:"Encode failed"});return}let b=e.readFrame();if(!b){self.postMessage({type:"frame",error:"No encoded data"});return}e.readFrame()&&(self.postMessage({type:"debug",message:"LibVPxEncoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxEncoder-drop"}));let c=new Uint8Array(b.byteLength);c.set(b),self.postMessage({type:"frame",frameType:p?"key":"delta",timestamp:l,duration:f,width:t,height:o,data:c.buffer},[c.buffer])}function g(t,o){let n=Math.round(t/1e3);e.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case"init":m(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:"ready"})).catch(o=>self.postMessage({type:"error",error:String(o)}));break;case"frame":E(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case"set_bitrate":g(t.data.bitrate,t.data.useCbr);break}}};return A(M);})();
|
|
10
|
-
`,i=>{i.error?this._onFrame(null,i.error):this._onFrame({type:i.frameType,timestamp:i.timestamp,duration:i.duration,data:i.data,byteLength:i.data?.byteLength,width:i.width,height:i.height})},[
|
|
11
|
-
`,a=>{a.error?this._onFrame(null,a.error):this._onFrame({type:a.frameType,timestamp:a.timestamp,duration:a.duration,data:a.data,byteLength:a.data?.byteLength,width:a.width,height:a.height})},[],{readable:i,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[i])}requestFrame(e=!1){this._sendToWorker("frame",{keyFrame:e})}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t,fps:i})}isVP9(){return!0}destroy(){this._removeWorker(),d.debug("WebCodecsEncoder destroyed")}static isBrowserSupported(){return"VideoEncoder"in window&&"Worker"in window&&"EncodedVideoChunk"in window&&"MediaStreamTrackProcessor"in window}};var Eo=2100,To=600,Ro=1.2,kn=.8,Co=2e3,Po=8e3,pa=8e3,yo=16e3,bo=4,Mo=2e3,Sr=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Sr||{}),Ci=class{constructor(r,e,t,i,a,s,c){o(this,"_onCongestion");o(this,"_ccEnabled");o(this,"_fastSharing");o(this,"_trendDelayThreshold");o(this,"_highDelayThreshold");o(this,"_targetFps");o(this,"_minBitrate");o(this,"_maxBitrate");o(this,"_targetBitrate");o(this,"_lastDown");o(this,"_lastUp");o(this,"_lastProbing");o(this,"_lastCheckDelay");o(this,"_upPenalty",0);o(this,"_probing");o(this,"_delayAvgShort",-1);o(this,"_delayAvgLong",-1);o(this,"_minDelay",Number.MAX_VALUE);o(this,"_maxDelay",0);o(this,"_largeDelayDuration",0);o(this,"_lastFpsCalcMs");o(this,"_frames",0);o(this,"_fps",0);this._onCongestion=r,this._ccEnabled=i,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=a,this._targetFps=c,s>0?this._highDelayThreshold=s:this._highDelayThreshold=Eo,a&&(this._highDelayThreshold=To),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let u=Date.now();this._lastDown=0,this._lastUp=u,this._lastProbing=u,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(r,e,t){let i=Date.now();if(this._calcFps(i),this._calcDelay(e,i),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let a=0,s=this._delayAvgShort-this._delayAvgLong,c=Math.round(Math.abs(s)*100/this._delayAvgLong),u=s>40&&c>30&&this._delayAvgShort>this._trendDelayThreshold,l=this._delayAvgShort>this._highDelayThreshold;u||l?a=2:Math.abs(s)<40&&c<10&&!l&&(a=1);let m=Math.round(this._targetBitrate/1e3),h=t;r%20===0&&d.debug(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Sr[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>Co){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,bo),this._probing=!1);let ce=kn*h*1e3;if(ce>=this._targetBitrate&&(ce=this._targetBitrate*kn),ce=Math.max(ce,this._minBitrate),ce<this._targetBitrate){let Ie=Math.round(ce/1e3),Te=Math.round(this._upPenalty*pa/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Sr[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Ie} penalty=${Te}s`),this._setBitrate(ce,!0),this._targetBitrate=ce}this._lastDown=i}let P=i-this._lastUp,b=Po+this._upPenalty*pa;if(a===1&&P>b&&E>b){let ce=Math.min(this._targetBitrate*Ro,this._maxBitrate);if(ce>this._targetBitrate){let Ie=Math.round(ce/1e3),Te=Math.round(this._targetBitrate/1e3),Y=Math.round(this._upPenalty*pa/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Sr[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${Te} -> newBitrate=${Ie} penalty=${Y}s`),this._setBitrate(ce,!1),this._targetBitrate=ce,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let V=i-this._lastProbing;this._probing&&V>yo&&(this._probing=!1);let J=i-this._lastDown;this._upPenalty>0&&J>3*b&&(d.log(`#${r}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(r,e){this._fastSharing&&(e=!0);let t=this._targetFps;this._fps>0&&(t=this._fps),this._onCongestion(r,e,t)}_calcDelay(r,e){if(!(r<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=r,this._delayAvgLong=r),this._delayAvgShort=Math.round((this._delayAvgShort*3+r)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+r)/24),r>0&&r<this._minDelay?this._minDelay=r:r>this._maxDelay&&(this._maxDelay=r),this._lastCheckDelay===0&&(this._lastCheckDelay=e),r>Mo){let t=e-this._lastCheckDelay;this._largeDelayDuration+=t}this._lastCheckDelay=e}}reconfigure(r,e){this._minBitrate=r,this._maxBitrate=e}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let r={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,r}_calcFps(r){this._frames++;let e=r-this._lastFpsCalcMs;if(e>5e3){this._lastFpsCalcMs=r;let t=this._fps,i=this._frames*1e3/e;this._fps===0?this._fps=Math.round(i):this._fps=Math.round((this._fps*3+i)/4),this._frames=0,this._fps!==t&&d.log(`cc: fps=${this._fps}`)}}};var Pi=class{constructor(r){o(this,"_maxSize");o(this,"_size",0);o(this,"_buffer");o(this,"_head",0);o(this,"_tail",0);this._maxSize=r,this._buffer=new Array(r)}add(r,e,t,i,a){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let s=this._tail;return this._buffer[this._tail]={seq:r,ts:e,size:t,sent:Date.now(),start:i,end:a,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,s}update(r,e){let t=this.get(r);return t===null?null:(t.ts2=e,t.recv=Date.now(),t)}get(r){let e=this._head;for(let t=0;t<this._maxSize;t++){let i=this._buffer[e];if(r===i?.seq)return i;if(e=++e%this._maxSize,e===this._tail)break}return null}getServerBitrateK(r){let e=0,t=0,i=-1,a=-1,s=this._tail;for(let c=0;c<this._maxSize;c++){s>0?--s:s=this._maxSize-1;let u=this._buffer[s];if(!u||(a===-1&&(a=u.ts2,t=0),a>=0&&(t+=u.size),i=u.ts2,a-i>=r)||s===this._head)break}if(i>=0&&a>=0){let c=a-i;e=Math.round(c>0?t*8/c:0)}return e}getCurrentDelay(){let r=this._tail;for(let e=0;e<this._maxSize;e++){r>0?--r:r=this._maxSize-1;let t=this._buffer[r];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(r===this._head)break}return 0}getMaxBandwidth(){let r=0,e=0,t=-1,i=-1,a=this._tail;for(let s=0;s<this._maxSize;s++){a>0?--a:a=this._maxSize-1;let c=this._buffer[a];if(c){if(i===-1&&c.end&&!c.start&&(i=c.ts2,e=0),t===-1&&i>=0&&c.start&&!c.end&&(t=c.ts2),t>=0&&i>=0){let u=i-t;r=u>0?e*8/u:0;break}if(i>=0&&(e+=c.size),a===this._head)break}}return Math.round(r)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}};var ua=65536,Do=50,wo=400,ko=1e6,Oo=3e5,xo=3e4,No=2e3,Lo=5,vr=0,yi=class{constructor(r,e,t,i){o(this,"_encoder");o(this,"_datachannel");o(this,"_signaling");o(this,"_fastSharing");o(this,"_destroyed",!1);o(this,"_needKeyframe",!0);o(this,"DATA_SIZE");o(this,"_congestionControl");o(this,"_frameNum",0);o(this,"_width");o(this,"_height");o(this,"_feedback",new Pi(1024));o(this,"_lastSentFrameSeq",0);o(this,"_lastDeliveredFrameSeq",0);o(this,"_lastFrameDelay",0);o(this,"_lastFramerateReduced",Date.now());o(this,"_lastSharingStat",Date.now());o(this,"_congestionControlEnabled");o(this,"_queue",new Ri);o(this,"_fpsMeter");o(this,"_maxFrameDelay");d.debug("ScreenCaptureSender started"),this.DATA_SIZE=p.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=i,this._congestionControlEnabled=p.screenShareCongestionControl||this._fastSharing,this._width=r.getSettings().width,this._height=r.getSettings().height,this._maxFrameDelay=this._fastSharing?p.screenShareCongestionControlThreshold:p.screenShareCongestionControlThreshold*2;let a=p.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),u=this._onCongestionCallback.bind(this);d.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${p.screenShareCongestionControlThreshold}`),this._congestionControl=new Ci(u,s,c,this._congestionControlEnabled,this._fastSharing,p.screenShareCongestionControlThreshold,a);let l=(m,h)=>{if(this._destroyed)return;if(!m){d.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),this._needKeyframe=!0,this._handleQueue();return}(m.width!==this._width||m.height!==this._height)&&(this._width=m.width,this._height=m.height,this._onResize(this._width,this._height));let E=this._sliceFrame(m);this._queue.merge(E),this._handleQueue(),this._sendSharingStat()};if(Nt.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Nt(r,l,this._congestionControlEnabled,c,m,a)}else this._encoder=new Xt(r,l,this._congestionControlEnabled,c);this._datachannel.onmessage=m=>{Mn(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=An(m.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(m=>d.warn("ScreenCaptureSender init failed",m)),this._fpsMeter=new kt(m=>d.log(`[ScreenCaptureSender] fps: ${m}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+ua)%ua>Lo&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>No&&(this._lastFramerateReduced=i,d.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(r)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),I.setImmediate(()=>this._handleQueue());return}if(r.isLast){this._frameNum++,this._fpsMeter.increment(),r.isKey&&d.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(r.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),i=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,i)}else I.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let r=this._queue.head();for(;r;){if(r.isFirst&&r.isKey)return!0;this._queue.shift(),r=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(r){let e=r.type==="key",t=r.data.byteLength,i=new Ri;for(let a=0;a<t;a+=this.DATA_SIZE){let s=r.data.slice(a,a+this.DATA_SIZE),c=a===0,u=t<=a+s.byteLength,l=this._wrapHeader(r.timestamp,c,u,e,s);i.push({data:l.data,sequence:l.sequence,frameSize:t,isFirst:c,isLast:u,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=yn(r,e,t,i,vr,this._encoder.isVP9(),a),c={sequence:vr,data:s};return vr=(vr+1)%ua,c}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(r){if(!this._datachannel||this._datachannel.readyState!=="open")return!1;try{return this._datachannel.send(r.data),this._feedback.add(r.sequence,r.timestamp,r.data.byteLength,r.isFirst,r.isLast),r.isLast&&(this._lastSentFrameSeq=r.sequence),!0}catch(e){return d.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(),d.debug("ScreenCaptureSender destroyed")}static isBrowserSupported(){return Nt.isBrowserSupported()||Xt.isBrowserSupported()}_onCongestionCallback(r,e,t){this._encoder.setBitrate(r,e,t)}_onResize(r,e){let{minBitrate:t,maxBitrate:i}=this._calcMinMaxBitrate(r,e),a=Math.round(t/1e3),s=Math.round(i/1e3);d.log(`cc: resize to ${r}x${e}, minBitrate=${a} maxBitrate=${s}`),this._congestionControl.reconfigure(t,i)}_calcMinMaxBitrate(r,e){(r===void 0||r<640)&&(r=640),(e===void 0||e<360)&&(e=360);let t=r*e/256,i=Math.max(Oo,Math.min(ko,Math.round(t*Do))),a=Math.round(t*wo);return{minBitrate:i,maxBitrate:a}}_checkCcFeedback(r){let e=this._feedback.update(r.seq,r.ts2);if(e===null)d.debug(`cc: update failed, seq=${r.seq}`);else if(e.end){this._lastDeliveredFrameSeq=e.seq;let t=e.recv-e.sent;t>0&&(this._lastFrameDelay=t),this._handleQueue()}}_sendSharingStat(){let r=Date.now();if(r-this._lastSharingStat>xo){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var Uo=90,Bo=4294967295,bi=class n extends At{constructor(e,t,i){super(e,t);o(this,"_producerNotification",null);o(this,"_producerCommand",null);o(this,"_producerScreen",null);o(this,"_consumerScreen",null);o(this,"_asr",null);o(this,"_animojiDataChannel",null);o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);o(this,"_isOpen",!1);o(this,"_observer",!1);o(this,"_reconnectionPrevented",!1);o(this,"_statInterval",null);o(this,"_settingsInterval",null);o(this,"_monitorRtpShareInterval",null);o(this,"_statBytes",{});o(this,"_ssrcMap",{});o(this,"_ssrcMapUpdated",!1);o(this,"_perfStatReporter");o(this,"_producerOfferIsProcessing",!1);o(this,"_producerNextOffer",null);o(this,"_lastStat",null);o(this,"_serverSettings");o(this,"_prevConsumerSettings",{});o(this,"_prevConsumerFastSharingSettings",{});o(this,"_asrTrack",null);o(this,"_captureSender",null);o(this,"_captureReceiver",null);o(this,"_participantIdRegistry",null);o(this,"_disabledSenders",new Set);o(this,"_rtpReceiversByStreamId",{});o(this,"_producerSessionId","");o(this,"_newAudioShareTrack",null);o(this,"_simulcastInfo",null);this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=i,d.debug("ServerTransport: Created")}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!=="IDLE"&&e!=="CLOSED"&&e!=="FAILED"&&this._startStatInterval()}open(e=!1){if(this._isOpen){d.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?(d.error("ServerTransport: Closed",e),this._setState("FAILED")):(d.debug("ServerTransport: Closed"),this._setState("CLOSED")))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){pr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(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&&M.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new St(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,n._closeDataChannel(this._producerNotification),n._closeDataChannel(this._producerCommand),n._closeDataChannel(this._producerScreen),n._closeDataChannel(this._consumerScreen),n._closeDataChannel(this._asr),n._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent("PEER_CONNECTION_CLOSED")}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{ordered:!0});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)},a.onerror=s=>{let c=s.error;d.error(`[${t}] data channel error`,c?.errorDetail,c?.message)}}_openConnection(e=!1){d.debug("ServerTransport: Open single connection");try{this._pc=new RTCPeerConnection}catch(t){d.error("Failed to create RTCPeerConnection:",t),this.close(t);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=I.debounce(t=>{this._pc&&this._onConnectionStateChange(this._pc,t)},500),this._pc.onsignalingstatechange=n._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new _r,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,ct.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,ct.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)}),this._createDataChannel(this._pc,ct.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),p.asrDataChannel&&this._createDataChannel(this._pc,ct.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new hr(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),p.vmoji&&this._createDataChannel(this._pc,ct.animoji,t=>{this._animojiDataChannel=t,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(t),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(t),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(t){d.error("ServerTransport: Unable to add media source tracks",t),R.log(D.ERROR,"addTrack-single"),this.close(t);return}this._createDataChannel(this._pc,ct.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&(!p.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!=="OPENED"&&(this._setState("RECONNECTING"),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_signalStalledParticipants(e){this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_signalSpeakerChanged(e){this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_signalNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
12
|
-
`).forEach(t=>{let i=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${ze.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+))`,a=new RegExp(i).exec(t);a&&(this._ssrcMap[a[1]]=a[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new yi(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Ti(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,t)},e=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,null)},e=>{this._triggerEvent("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(i=>{if(!i.track||i.track.kind!=="video"||i.track.contentHint==="motion")return;let a=!this._disabledSenders.has(i),s=e.maxDimension!==0;if(a&&!s){d.log("Disabling video upload"),this._disabledSenders.add(i),i.replaceTrack(M.getBlackMediaTrack()).catch(u=>{d.error("Could not disable video upload",u)});return}let c=this._mediaSource.getSendVideoTrack();if(!a&&s&&c){d.log("Enabling video upload"),this._disabledSenders.delete(i);let u=i.track;u.enabled=c.enabled,i.replaceTrack(c).then(()=>u.stop()).catch(l=>{d.error("Could not enable video upload",l)})}I.applyVideoTrackSettings(e,i,c??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&p.consumerFastScreenShare){let t=this._serverSettings.fastScreenSharing;if(t&&this._pc){let i=[];this._pc.getSenders().forEach(a=>{!a.track||a.track.kind!=="video"||a.track.contentHint!=="motion"||I.applyVideoTrackSettings(t,a,a.track,this._prevConsumerFastSharingSettings,i)}),this._prevConsumerFastSharingSettings=i}}}_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("STATE_CHANGED",e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(t=>{this._reportStats(t),this._detectStaleTracks(t),it.reportUsage(t)}).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(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_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 pe.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent("REMOTE_DATA_STATS",{inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(c=>c.type==="inbound-rtp"&&c.kind==="audio"&&this._ssrcMap[c.ssrc]==="mix");if(!t)return;let i=ze.AUDIO_MIX,a=this._statBytes[i],s=!1;if(a){let c=t.bytesReceived-a.bytesReceived;c>=0&&c<=5&&(s=!0),a.stalled!==s&&this._triggerEvent("AUDIO_MIX_STALL",s)}this._statBytes[i]={bytesReceived:t.bytesReceived,stalled:s}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:St.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:p.asrDataChannel?1:0,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&&M.isSimulcastSupportedByBrowser(),consumerFastScreenShare:p.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:p.consumerFastScreenShareQualityOnDemand};!p.videoTracksCount&&!this._observer&&d.warn("Setting videoTracksCount to 0 is deprecated"),this._signaling.allocateConsumer(null,e)}async _processOffer(e){if(!this._pc)throw new Error("Interrupt allocation");let t=p.simulcast&&M.isSimulcastSupportedByBrowser(),i=t;try{await this._pc.setRemoteDescription(e)}catch(c){throw d.error("[single] unable to set remote offer",c),R.log(D.ERROR,"setRemoteDescription-single"),c}let a=this._findFirstSimTransceiver();if(t)if(a){d.log(`_processOffer: caps.simulcast=${p.simulcast} mid=${a.mid} dir=${a.direction}`);let c=this._mediaSource.getStream(),u=await this._setupSimulcastTransceiver(c,a);d.log("_processOffer: simulcastInfo",u),u||(d.log(`_processOffer: simulcast transceiver not found in server offer mid=${a.mid}, disable simulcast`),i=!1)}else d.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),i=!1;let s;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");s=await this._pc.createAnswer()}catch(c){throw d.error("[single] unable to create answer",c),R.log(D.ERROR,"createAnswer-single"),c}try{if(!this._pc)throw new Error("Interrupt allocation");s.sdp=I.patchLocalSDP(s.sdp,!1,M.isBrokenH264Decoder(),!1),d.debug("[single] set local answer",{answer:s}),await this._pc.setLocalDescription(s)}catch(c){throw d.error("[single] unable to set local answer",c),R.log(D.ERROR,"setLocalDescription-single"),c}if(i&&a){s.sdp=I.patchSimulcastAnswerSdp(s.sdp,a,mt.WIDTH,mt.HEIGHT);for(let c of this._pc.getTransceivers())c.mid===null&&c.stop()}try{d.debug("[single] transmit local answer",{answer:s}),this._updateSSRCMap(e),await this._signaling.acceptProducer(s,Object.keys(this._ssrcMap)),d.debug("[single] remote offer has been processed")}catch(c){d.warn("[single] unable to send local answer",c),R.log(D.ERROR,"acceptProducer")}i&&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!=="video")continue;let i=e.sender.getParameters();if(!(!i.encodings||i.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let i=e.getVideoTracks()[0];await t.sender.replaceTrack(i),t.sender.setStreams(e);let a=t.sender.getParameters();if(!a.encodings||a.encodings.length<=1)return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(a.encodings)}`),null;let s=li(mt.WIDTH,mt.HEIGHT,this._serverSettings.camera?.bitrates?.generic),c=0,u=1;for(let m of a.encodings)m.scalabilityMode=di,m.active=!0,c>=s.streams.length?m.maxBitrate=0:m.maxBitrate=s.streams[c].bitrate,m.scaleResolutionDownBy=u,u=u*2,c++;await t.sender.setParameters(a);let l=i.getSettings();return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${l.width}x${l.height} encodings=${JSON.stringify(a.encodings)}`),!0}async _acceptProducer(e){if(this._producerOfferIsProcessing){this._producerNextOffer=e,d.debug("[single] wait until other remote offer is processed");return}this._producerOfferIsProcessing=!0;let t={type:"offer",sdp:I.patchRemoteSDP(e,M.isOldDataChannelDescription(),!1,!1,!1,M.isBrokenVP9Encoder(),M.isBrokenVP9Decoder())};if(d.debug("[single] set remote offer",{offer:t}),!this._pc)throw new Error("Interrupt allocation");try{if(await this._processOffer(t),this._producerOfferIsProcessing=!1,this._producerNextOffer){d.debug("[single] there is other unprocessed remote offer, process it");let i=this._producerNextOffer;this._producerNextOffer=null,await this._acceptProducer(i)}}catch(i){this.close(i)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="video");if(!e||!e.sender){d.warn("Cannot find screenshare transceiver");return}try{e.direction="sendonly",await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(t){d.error("ServerTransport: Unable to replace track",t)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="audio");if(!e||!e.sender){d.warn("Cannot find audioshare transceiver");return}e.sender.track!==null&&d.warn("Unexpected track assigned to audioshare");try{e.direction="sendonly",await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(t){d.error("ServerTransport: Unable to replace track",t),R.log(D.ERROR,"replaceTrack-single")}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case L.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case L.REALLOC_CON:this._reconnect();break;case L.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case L.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case L.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case L.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent("ASR_TRANSCRIPTION",e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),p.breakVideoPayloadTypes&&(d.log("test mode enabled, video switched off"),this._signaling.requestTestMode("breakVideoPayloadTypes",null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description)}_onAddTrack(e,t){d.debug("[single] remote track (added)",{track:t.track});let i=t.streams[0];i?(i.onremovetrack||(i.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",i.id,i,s.track)}),i.getTracks().find(s=>s.id===t.track.id)||i.addTrack(t.track),this._rtpReceiversByStreamId[i.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",i.id,i,t.track)):d.error("[single] unable to get media stream from track event")}static _onSignalingStateChange(e,t){d.debug("[single] signaling state changed",{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(d.debug("[single] connection state changed",{state:e.connectionState},t),R.log(D.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(R.logCustom(D.RECONNECT,{param:1}),this._reconnect());break;case"connecting":let i=this.getState();i==="IDLE"||i==="OPENED"?this._setState("CONNECTING"):e.iceConnectionState==="checking"&&this._setState("RECONNECTING");break;case"disconnected":this._reconnectionPrevented?this.close(new Error("Ice connection disconnected")):this._setState("RECONNECTING");break;case"connected":this._setState("CONNECTED"),I.getPeerConnectionHostInfo(e).then(a=>{a?.local&&(R.log(D.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))}),R.logCustom(D.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){d.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let i=(a,s)=>{a.replaceTrack(s).catch(c=>{d.error("ServerTransport: Unable to replace track",c),R.log(D.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),p.simulcast&&M.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(c=>c.direction==="sendonly"&&c.sender?.track?.kind==="video"&&c.sender.track.contentHint===e.contentHint)?.sender;s?.track?(i(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):d.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let a=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);a?.track?i(a,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e==="screen"&&p.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return R.log(D.PAT_WAITING_TIME_ERROR,"noConnection"),d.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return R.log(D.PAT_WAITING_TIME_ERROR,"oldBrowser"),d.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let i=this._rtpReceiversByStreamId[e];if(!i)return R.log(D.PAT_WAITING_TIME_ERROR,"noReceiver"),d.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let a=i.getSynchronizationSources();if(!a||!a.length)return d.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let c=a[0].rtpTimestamp;if(!Number.isInteger(c))return R.log(D.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),d.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${c}`),0;let u=t-c&Bo,l=Math.ceil(u/Uo);return Math.min(100,Math.max(0,l))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!p.simulcast||!M.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let c=s.getVideoTracks()[0],u=c.getSettings().width,l=c.getSettings().height,m=li(u,l,this._serverSettings.camera?.bitrates?.generic),h=t||!Fa(this._simulcastInfo,m);if(!m.streams.length||!h)return;let E=a.sender.getParameters();if(E.encodings||(E.encodings=[{}]),!(E.encodings.length<=1)){if(d.log(`_changeSimulcastInfo: ${u}x${l} command: ${JSON.stringify(m)} `),e){let P=0;for(let b of E.encodings)b.scaleResolutionDownBy=Bi(b.rid),b.scalabilityMode=di,P>=m.streams.length?(b.maxBitrate=0,b.active=!1):(b.active=!0,b.maxBitrate=m.streams[P].bitrate),P++;await a.sender.setParameters?.(E).catch(b=>{d.error("Failed to set sender parameters",E,b)}),d.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(E.encodings)} `)}if(this._simulcastInfo=m,m.streams){let P={mediaSource:1,simulcastInfo:m};await this._signaling.changeSimulcast(P)}}}async _monitorRtpShare(){let e=zt.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!p.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(a=>a.track?.kind==="video"&&a.track?.contentHint==="motion");if(!t)return;(await t.getStats()).forEach(a=>{if(a.type==="outbound-rtp"&&this._serverSettings.fastScreenSharing&&a.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&a.frameWidth<window.screen.width){let s=t.getParameters();s.degradationPreference="maintain-resolution",t.setParameters(s),d.log(`
|
|
7
|
+
var Rs=Object.defineProperty;var Cs=(n,r,e)=>r in n?Rs(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var o=(n,r,e)=>Cs(n,typeof r!="symbol"?r+"":r,e);import vs from"webrtc-adapter";var Ht=class{log(r,e,t=!1){}destroy(){}};var ce=class{constructor(){o(this,"_handlers",{});o(this,"_listeners",[])}_triggerEvent(r,...e){if(Object.hasOwn(this._handlers,r))for(let t of this._handlers[r])t.apply(this,e)}addEventListener(r,e){if(typeof e!="function")throw new Error("Listener should be a function");return Object.hasOwn(this._handlers,r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!Object.hasOwn(this._handlers,r))return;e||delete this._handlers[r];let t=this._handlers[r].indexOf(e);t>=0&&this._handlers[r].splice(t,1)}subscribe(r,e,t){let i=r.addEventListener(e,t);this._listeners.push(i)}unsubscribe(){this._listeners.forEach(r=>{r.dispose()})}};var pi=class extends ce{get ready(){return!0}setParticipantIdRegistry(r){}requestRealloc(){}setEndpoint(r){}setWebTransportEndpoint(r){}setConversationId(r){}readyToSend(r=!0){}cleanup(){}requestTestMode(r,e){}getNextCommandSequenceNumber(){return 0}};var Va=(ee=>(ee.CANCELED="CANCELED",ee.REJECTED="REJECTED",ee.REMOVED="REMOVED",ee.HUNGUP="HUNGUP",ee.MISSED="MISSED",ee.BUSY="BUSY",ee.FAILED="FAILED",ee.NETWORK_ERROR="NETWORK_ERROR",ee.KILLED="KILLED",ee.BANNED="BANNED",ee.HAS_ACTIVE_CALL="HAS_ACTIVE_CALL",ee.CALLER_IS_BLOCKED="CALLER_IS_BLOCKED",ee.NOT_FRIENDS="NOT_FRIENDS",ee.CALLEE_IS_OFFLINE="CALLEE_IS_OFFLINE",ee.CALLER_IS_REJECTED="CALLER_IS_REJECTED",ee.UNKNOWN_ERROR="UNKNOWN_ERROR",ee.UNSUPPORTED="UNSUPPORTED",ee.OLD_VERSION="OLD_VERSION",ee.SERVICE_DISABLED="SERVICE_DISABLED",ee.SERVICE_UNAVAILABLE="SERVICE_UNAVAILABLE",ee.EXTERNAL_API_ERROR="EXTERNAL_API_ERROR",ee.SOCKET_CLOSED="SOCKET_CLOSED",ee.ENDED="ENDED",ee.KILLED_WITHOUT_DELETE="KILLED_WITHOUT_DELETE",ee.ANOTHER_DEVICE="ANOTHER_DEVICE",ee.NOT_FOUND="NOT_FOUND",ee.VCHAT_DETAILED_ERROR="VCHAT_DETAILED_ERROR",ee.TIMEOUT="TIMEOUT",ee.PARTICIPANT_LIMIT_REACHED="PARTICIPANT_LIMIT_REACHED",ee.FAST_START_ERROR="FAST_START_ERROR",ee.FAST_JOIN_ERROR="FAST_JOIN_ERROR",ee.CALL_TIMEOUT="CALL_TIMEOUT",ee))(Va||{}),y=Va;var B=class n extends Error{constructor(e,t){super();o(this,"message");o(this,"hangup");o(this,"error");o(this,"code");o(this,"remote");o(this,"custom_error");this.name="HangupReason",this.code=t&&t.code||0,this.remote=t&&t.remote||!1,this.custom_error=t?.custom_error??null,Object.values(y).indexOf(e)>-1?this.hangup=e:this.error=e;let i=[];this.error&&i.push("error"),this.remote&&i.push("remote"),this.code&&i.push(`code: ${this.code}`),t&&t.message&&i.push(`message: '${t.message}'`),this.message=e+(i.length?` (${i.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,n)}};var ve=class ve extends Ht{constructor(e,t){super();o(this,"_externalLogger");o(this,"_api");o(this,"_batchInterval",3e3);o(this,"_batchedLogItems",[]);o(this,"_batchedClientStats",[]);o(this,"_batchedClientEvents",[]);o(this,"_batchTimeout",null);o(this,"_serverTimeDelta",0);this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}static setConversationIdProvider(e){ve._conversationIdProvider=e}static create(e,t){ve._instance||(ve._instance=new ve(e,t))}static log(e,t,i=!1){ve._instance&&ve._instance.log(e,t,i)}static logCustom(e,t,i=!1){ve._instance&&ve._instance.logCustom(e,t,i)}static logClientStats(e,t=!1){ve._instance&&ve._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){ve._instance&&ve._instance.logClientEvent(e,t)}static destroy(){ve._instance&&ve._instance.destroy(),ve._instance=null}log(e,t,i=!1){let a={};typeof t<"u"&&(a.param=t),this._logInternal(e,a,i),this._externalLogger&&this._externalLogger.log(e,t,i)}logCustom(e,t,i=!1){this._logInternal(e,t,i)}logClientStats(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(i).forEach(a=>{i[a]===void 0&&delete i[a]}),this._batchedClientStats.push(i),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(i),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}_logInternal(e,t,i){let a={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:this._getConversationId()}),uid:this._api.getUserId()};this._batchedLogItems.push(a),(i||!this._batchTimeout)&&this._sendBatch()}_getConversationId(){if(ve._conversationIdProvider)try{return ve._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedLogItems.length>0&&(this._sendLogItems(this._batchedLogItems),this._batchedLogItems=[],e=!0),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)}_sendLogItems(e){this._api.log(e)}_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}};o(ve,"_instance"),o(ve,"_conversationIdProvider",null);var R=ve;import{Any as Ks,Arr as mn,Int as G,Nil as Dt,Str as hn,Bool as da}from"messagepack";var ja=(N=>(N.RECOVER="recover",N.ACCEPT_CALL="accept-call",N.ADD_PARTICIPANT="add-participant",N.REMOVE_PARTICIPANT="remove-participant",N.HANGUP="hangup",N.TRANSMIT_DATA="transmit-data",N.ACCEPT_PRODUCER="accept-producer",N.ALLOCATE_CONSUMER="allocate-consumer",N.CHANGE_MEDIA_SETTINGS="change-media-settings",N.CHANGE_PARTICIPANT_STATE="change-participant-state",N.CHANGE_STREAM_PRIORITIES="change-streams-priorities",N.UPDATE_DISPLAY_LAYOUT="update-display-layout",N.REPORT_PERF_STAT="report-perf-stat",N.REPORT_SHARING_STAT="report-sharing-stat",N.REPORT_NETWORK_STAT="report-network-stat",N.RECORD_START="record-start",N.RECORD_STOP="record-stop",N.RECORD_PUBLISH="record-publish",N.RECORD_SET_CONF="record-set-conf",N.RECORD_GET_STATUS="record-get-status",N.SWITCH_MICRO="switch-micro",N.SWITCH_TOPOLOGY="switch-topology",N.REQUEST_REALLOC="request-realloc",N.CHAT_MESSAGE="chat-message",N.CHAT_HISTORY="chat-history",N.CUSTOM_DATA="custom-data",N.GRANT_ROLES="grant-roles",N.MUTE_PARTICIPANT="mute-participant",N.ENABLE_FEATURE_FOR_ROLES="enable-feature-for-roles",N.PIN_PARTICIPANT="pin-participant",N.UPDATE_MEDIA_MODIFIERS="update-media-modifiers",N.CHANGE_OPTIONS="change-options",N.GET_WAITING_HALL="get-waiting-hall",N.GET_PARTICIPANT_LIST_CHUNK="get-participant-list-chunk",N.GET_PARTICIPANTS="get-participants",N.PROMOTE_PARTICIPANT="promote-participant",N.REQUEST_TEST_MODE="request-test-mode",N.ADD_MOVIE="add-movie",N.UPDATE_MOVIE="update-movie",N.REMOVE_MOVIE="remove-movie",N.START_URL_SHARING="start-url-sharing",N.STOP_URL_SHARING="stop-url-sharing",N.GET_ROOMS="get-rooms",N.UPDATE_ROOMS="update-rooms",N.ACTIVATE_ROOMS="activate-rooms",N.REMOVE_ROOMS="remove-rooms",N.SWITCH_ROOM="switch-room",N.FEEDBACK="feedback",N.ASR_START="asr-start",N.ASR_STOP="asr-stop",N.REQUEST_ASR="request-asr",N.REQUEST_PROMOTION="request-promotion",N.ACCEPT_PROMOTION="accept-promotion",N.GET_HAND_QUEUE="get-hand-queue",N.ENABLE_VIDEO_SUSPEND="enable-video-suspend",N.ENABLE_VIDEO_SUSPEND_SUGGEST="enable-video-suspend-suggest",N.PUT_HANDS_DOWN="put-hands-down",N.CHANGE_SIMULCAST="change-simulcast",N))(ja||{}),x=ja;var Ha=(K=>(K.MIC_CAMERA_PERMISSION="mic_camera",K.CAMERA_PERMISSION="camera",K.MIC_PERMISSION="mic",K.CAMERA_ACCESS="cameralock",K.MIC_ACCESS="miclock",K.MIC_NOT_FOUND="nomic",K.SCREEN_PERMISSION="screenpermission",K.SCREEN_ACCESS="screenlock",K.CONNECTION="connection",K.NETWORK="network",K.UNKNOWN="unknown",K.UNSUPPORTED="unsupported",K.SIGNALING_FAILED="signalingfailed",K.API="api",K.AUTH="auth",K.OVERCONSTRAINED="overconstrained",K))(Ha||{}),de=Ha;var Ga=(s=>(s.AUDIO="AUDIO",s.VIDEO="VIDEO",s.SCREEN_SHARING="SCREEN_SHARING",s.MOVIE_SHARING="MOVIE_SHARING",s.AUDIO_SHARING="AUDIO_SHARING",s.ANIMOJI="ANIMOJI",s))(Ga||{}),le=Ga;var Wa=(re=>(re.ACCEPT_CONCURRENT="callAcceptConcurrent",re.ACCEPT_INCOMING="callAcceptIncoming",re.ACCEPTED_OUTGOING="callAcceptedOutgoing",re.ADD_PARTICIPANT="callAddParticipant",re.CALL_SPEC_ERROR="callSpecError",re.DECLINE_INCOMING="callDeclineIncoming",re.DEVICE_CHANGED="callDeviceChanged",re.DEVICES="callDevices",re.ERROR="callError",re.HANGUP="callHangup",re.ICE_CONNECTION_STATE="callIceConnectionState",re.ICE_CONNECTION_TYPE="callIceConnectionType",re.ICE_RESTART="callIceRestart",re.JOIN_CONVERSATION="callJoinConversation",re.MEDIA_STATUS="callMediaStatus",re.OUTGOING_CALL="callStart",re.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",re.PAT_ALLOCATED="patAllocate",re.PAT_DEALLOCATED="patDeallocate",re.PAT_ERROR="patError",re.PAT_OUTDATED_RESPONSE="patOutdatedResponse",re.PAT_WAITING_TIME_ERROR="patWaitingTimeError",re.POOR_CONNECTION="callPoorConnection",re.PUSH="callPush",re.RECONNECT="callReconnect",re.RELAY_POLICY="callForceRelay",re.REMOVE_PARTICIPANT="callRemoveParticipant",re.SOCKET_ACTION="callSocketAction",re.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",re))(Wa||{}),w=Wa;var Ve=class Ve{static get sessionKey(){return Ve._sessionKey}static set sessionKey(r){Ve._sessionKey=r}static get sessionSecretKey(){return Ve._sessionSecretKey}static set sessionSecretKey(r){Ve._sessionSecretKey=r}static get accessToken(){return Ve._accessToken}static set accessToken(r){Ve._accessToken=r}static isEmpty(){return!Ve._sessionKey}};o(Ve,"_sessionKey"),o(Ve,"_sessionSecretKey"),o(Ve,"_accessToken");var Pe=Ve;var Ka=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Ka||{}),oe=Ka;var mt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},ui="L1T2",qa=[{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}],ys={h:1,m:2,l:4};function za(n,r){return!n||!r?n===r:n.streams.length===r.streams.length?n.streams.every((e,t)=>I.isObjectsEquals(e,r.streams[t])):!1}function $a(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:qa[0].bitrate}function mi(n=mt.WIDTH,r=mt.HEIGHT,e=qa){let t=["h","m","l"],i=Math.max(n,r),a=1;i>=960?a=3:i>=480&&(a=2);let s={streams:[]},c=30,u=$a(i,e)??mt.BITRATE;for(let p=0;p<a;p++){let m=t[p];s.streams.push({rid:m,width:n,height:r,fps:c,bitrate:u}),n=Math.round(n/2),r=Math.round(r/2),u=$a(Math.max(n,r),e)??Math.round(u/2)}return s}function Wi(n){return n?ys[n]??1:1}var Ja=typeof Object.fromEntries=="function"?Object.fromEntries:function(n){if(!n||!n[Symbol.iterator])throw new Error("Object.fromEntries() requires a single iterable argument");let r={};for(let[e,t]of n)r[e]=t;return r};async function Ya(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var Gt=":",$i="d",Ps=533,Ki="a=fmtp:",bs="sps-pps-idr-in-keyframe=1",Wr;(Ze=>{let n=/[\r\n]+/,r=`\r
|
|
8
|
+
`;function e(g,T){let A=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),S,M=[];for(S=0;S<g.length;++S){let k=g[S].match(A);k&&k.length===3&&k[2]===T&&M.push(k[1])}return M}function t(g,T,A){let S=g.split(" "),M=S.slice(0,3),k;for(k=3;k<S.length;k++)A.includes(S[k])&&M.push(S[k]);for(k=3;k<S.length;k++)!A.includes(S[k])&&!T.includes(S[k])&&M.push(S[k]);return M.join(" ")}function i(g,T,A,S){let M,k="m="+T;for(M=0;M<g.length;++M)g[M].startsWith(k)&&(g[M]=t(g[M],A,S))}function a(g,T){let A=new RegExp(Ki+"(\\d+)");for(let S=0;S<g.length;++S){let M=g[S].match(A);if(M&&M.length===2&&T.includes(M[1])){let k=g[S].trim()===Ki+M[1]?" ":";";g[S]+=k+bs}}}function s(g,T,A="video"){let S=e(g,T);if(!S.length)return;let M=S.slice(0),k=new RegExp(Ki+"(\\d+) apt=(\\d+)"),W;for(W=0;W<g.length;++W){let $=g[W].match(k);$&&$.length===3&&M.includes($[2])&&M.push($[1])}let V=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for(W=g.length;W--;){let $=g[W].match(V);$&&$.length===3&&M.includes($[2])&&g.splice(W,1)}i(g,A,M,[])}function c(g,T,A,S){let M=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),k,W=[];for(k=T;k<A;++k){let $=g[k].match(M);$&&$.length===3&&$[2]===S&&W.push($[1])}if(!W.length)return W;let V=new RegExp(Ki+"(\\d+) apt=(\\d+)");for(k=T;k<A;++k){let $=g[k].match(V);$&&$.length===3&&W.includes($[2])&&W.push($[1])}return W}function u(g,T,A,S){let M=c(g,T,A,S);if(!M.length)return A+1;let k=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),W=0,V=A;for(;V>=T;){let $=g[V].match(k);$&&$.length===3&&M.includes($[2])&&(g.splice(V,1),W++),V--}return g[T]=t(g[T],M,[]),A-W+1}function p(g,T,A,S){let M=-1,k=-1,W=!1;for(let V=0;V<g.length;++V)if(M>=0&&g[V].startsWith("m=")&&(k=V-1,W&&(V=u(g,M,k,T)),M=-1,k=-1,W=!1),g[V].startsWith("m=video")&&(M=V),M>=0){let $=A==="remote"&&S==="encoder"||A==="local"&&S==="decoder"?"recvonly":"sendonly";(g[V].startsWith(`a=${$}`)||g[V].startsWith("a=sendrecv"))&&(W=!0)}k=g.length-1,M>=0&&W&&u(g,M,k,T)}function m(g,T){let A=e(g,"H264");T&&i(g,"video",[],A),a(g,A)}function h(g){let T=e(g,"VP9");i(g,"video",[],T)}function E(g){["G722","PCMU","PCMA","CN","telephone-event"].forEach(T=>{s(g,T,"audio")})}function P(g,T,A,S,M=!1){let k=g.split(n);if(E(k),!T&&!A&&!S&&!M)return k.join(r);function W($){let N=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],ye="a=rtcp-fb:111",Ee=$.findIndex(fe=>fe.startsWith(ye));return~Ee&&($[Ee]=$[Ee]+r+N.join(r)),$}function V($){let N=e($,"red");N.length>0&&i($,"audio",[],N)}return A?p(k,"H264","local","decoder"):m(k,T),S&&h(k),V(k),M&&W(k),k.join(r)}Ze.patchLocalSDP=P;function C(g,T,A,S,M,k,W){T&&(g=g.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 V=g.split(n);return S?s(V,"H264"):A&&m(V,A),k&&W?s(V,"VP9"):k?p(V,"VP9","remote","encoder"):W?p(V,"VP9","remote","decoder"):M&&h(V),E(V),V.join(r)}Ze.patchRemoteSDP=C;function H(g){return g?`${g.type||"WEB_SOCKET"}_${g.id}`:"_"}Ze.getPeerIdString=H;function K(g,T){return g&&g.id===T.id&&(g.type||"WEB_SOCKET")===(T.type||"WEB_SOCKET")}Ze.comparePeerId=K;async function z(g){let T={local:null,remote:null};if(!g||!g.getStats)return T;try{let A=await g.getStats(null),S=null;if(A.forEach(M=>{M.type==="transport"&&M.selectedCandidatePairId?S=A.get(M.selectedCandidatePairId):M.type==="candidate-pair"&&M.state==="succeeded"&&!S&&(!Object.hasOwn(M,"selected")||M.selected)&&(S=M)}),S?.localCandidateId){let M=A.get(S.localCandidateId);M&&(T.local={type:M.candidateType,ip:M.ip||M.ipAddress,port:M.port||M.portNumber})}if(S?.remoteCandidateId){let M=A.get(S.remoteCandidateId);M&&(T.remote={type:M.candidateType,ip:M.ip||M.ipAddress,port:M.port||M.portNumber})}return T}catch{return T}}Ze.getPeerConnectionHostInfo=z;let Te=/^[0-9]+$/,De=/^([gu])([0-9]+)$/;function ae(g,T=oe.USER){let A=String(g);return De.test(A)?(d.warn(`Already composite id [${g}] type supplied [${T}]`),A):T===oe.GROUP?"g"+A:T===oe.USER?"u"+A:(d.warn(`Unknown type [${T}] for id [${g}]`),A.match(Te)?"u"+A:A)}Ze.composeUserId=ae;function ne(g,T,A=0){let S=ae(g,T);return Y(S,A)}Ze.composeParticipantId=ne;function Y(g,T){return T?g+Gt+$i+T:g}Ze.compose=Y;function Vt(g){return ne(g.id,g.idType||oe.USER,g.deviceIdx)}Ze.composeId=Vt;function ba(g){if(g.decorativeUserId)return ne(g.decorativeUserId,g.idType||oe.USER,g.deviceIdx)}Ze.composeDecorativeId=ba;function Aa(g){return g.participant?Vt(g.participant):ne(g.participantId,g.participantType||oe.USER,g.deviceIdx)}Ze.composeMessageId=Aa;function Ma(g){return typeof g=="string"?ci(di(g).compositeUserId).id:g}Ze.extractOkId=Ma;function ci(g){let T=String(g),A=T.match(De);return A?{id:Number(A[2]),type:A[1]==="g"?oe.GROUP:oe.USER}:(d.warn(`Unsupported compositeId [${g}]`),{id:Number(T),type:oe.USER})}Ze.decomposeId=ci;function di(g){let T=g.split(Gt+$i);return{compositeUserId:T[0],deviceIdx:T.length>1?parseInt(T[1],10):0}}Ze.decomposeParticipantId=di;function re(){let g=window.crypto?.randomUUID?.();if(g)return g;let T="0123456789abcdefghijklmnopqrstuvwxyz".split(""),A=new Array(36),S=0,M,k;for(k=0;k<36;k++)k===8||k===13||k===18||k===23?A[k]="-":k===14?A[k]="4":(S<=2&&(S=33554432+Math.random()*16777216|0),M=S&15,S=S>>4,A[k]=T[k===19?M&3|8:M]);return A.join("")}Ze.uuid=re;function Da(g,T){let A;function S(...M){let k=this;A&&window.clearTimeout(A),A=window.setTimeout(()=>{g.apply(k,M)},T)}return S}Ze.debounce=Da;function wa(g){if(!window.BigInt)return null;let T="",A=g.split(`
|
|
9
|
+
`);for(let k of A)if(k.startsWith("a=fingerprint")){let W=k.split(" ");if(W.length===2){T=W[1];break}}if(!T)return BigInt(-1);let S=T.split(":"),M=BigInt(0);for(let k=Math.min(7,S.length-1);k>=0;k--){let W=BigInt(parseInt(S[k],16));M<<=BigInt(8),M|=W}return BigInt.asIntN(64,M)}Ze.sdpFingerprint=wa;async function ee(g){return new Promise(T=>window.setTimeout(T,g))}Ze.delay=ee;function ka(g,T,A){let S=[];return g.getSenders().forEach(M=>Br(T,M,M.track,A,S)),S}Ze.applySettings=ka;function Br(g,T,A,S,M){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!g||!A||A.kind!=="video")return;let k=A.getSettings();if(!k)return;let W=g.maxBitrateK?g.maxBitrateK*1024:null,V=k.width,$=k.height,N=V&&$&&g.maxDimension?Math.max(1,Math.max(V,$)/g.maxDimension):null,ye=g.maxFramerate||null;if(V&&$&&g.maxDimension&&g.maxDimension>Math.max(V,$)){let _e=Math.round(V*$/256),ke=(Math.round(_e*Ps/1e4)+1)*1e4;W=W===null?ke:Math.min(ke,W)}let Ee=g.degradationPreference||"balanced",fe=S[A.id];if(fe&&fe.bitrate===W&&fe.scaleResolutionDownBy===N&&fe.maxFramerate===ye&&fe.degradationPreference===Ee){M[A.id]=fe;return}M[A.id]={bitrate:W,scaleResolutionDownBy:N,maxFramerate:ye,degradationPreference:Ee};let Me=T.getParameters();if(Me.encodings||(Me.encodings=[{}]),Me.encodings.length>1&&V&&$&&g.maxDimension){let _e=Math.round(g.maxDimension*1.35),ke=Math.max(V,$),Tt=mi(V,$,g?.bitrates?.generic),jt=Tt.streams.length;d.log(`applyVideoTrackSettings: maxDim=${g.maxDimension} targetDim=${_e} track=${V}x${$} sim=${JSON.stringify(Tt)}`),Me.encodings.forEach((et,li)=>{et.scaleResolutionDownBy=Wi(et.rid);let Ba=Math.round(ke/et.scaleResolutionDownBy);li<jt-1?et.active=Ba<_e:li>=jt?et.active=!1:et.active=!0,li<jt?et.maxBitrate=Tt.streams[li].bitrate:et.maxBitrate=0,et.scalabilityMode=ui})}else Me.encodings.forEach(_e=>{g?.scalabilityMode&&(_e.scalabilityMode=g.scalabilityMode),W?_e.maxBitrate=W:delete _e.maxBitrate,N?_e.scaleResolutionDownBy=N:delete _e.scaleResolutionDownBy,ye?_e.maxFramerate=ye:delete _e.maxFramerate});if(Me.degradationPreference=Ee,Me.encodings.length>0){T.setParameters?.(Me).catch(ke=>{d.error("Failed to set sender parameters",Me,ke)});let _e=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(_e.encodings)}`)}}Ze.applyVideoTrackSettings=Br;function Fr(g,T){Array.isArray(T)||(T=[T]);for(let A of T)if(g.includes(A))return!0;return!1}Ze.includesOneOf=Fr;function Vr(g){return Object.entries(g.participantState?.state||{}).reduce((T,[A,S])=>(g.participantState&&(T[A]={ts:g.participantState.stateUpdateTs[A],state:S}),T),{})}Ze.mapParticipantState=Vr;function Oa(g){let T=g.map(A=>({uid:A.externalId,mediaSettings:A.mediaSettings,status:A.status,muteStates:A.muteStates,unmuteOptions:A.unmuteOptions,participantState:A.participantState,markers:A.markers,movieShareInfos:A.movieShareInfos,roles:A.roles}));return l.filterObservers?T.filter(A=>!A.uid.observer):T}Ze.mapSharedParticipants=Oa;function xa(g,T){let A=Object.keys(g),S=Object.keys(T);if(A.length!==S.length)return!1;for(let M of A)if(!Object.hasOwn(S,M)||g[M].state!==T[M].state||g[M].ts!==T[M].ts)return!1;return!0}Ze.isEqualParticipantState=xa;function jr(g,T,A=!1){let S=Object.keys(g),M=Object.keys(T);if(S.length!==M.length)return!1;for(let k of S){if(!Object.hasOwn(T,k))return!1;let W=g[k],V=T[k];if(A&&se(W)&&se(V))return jr(W,V,A);if(W!==V)return!1}return!0}Ze.isObjectsEquals=jr;function Na(g,T){if(g.length!==T.length)return!1;for(let A of g)if(T.indexOf(A)<0)return!1;return!0}Ze.isArraysEquals=Na;function La(g){return!Object.keys(g).length}Ze.isEmptyObject=La;function Ua(g,T){if(!g&&!T)return 0;if(!g||!T)return g?-1:1;return S(T.rank,g.rank)||S(g.ts,T.ts)||A(g,T);function A(M,k){let W={[oe.USER]:0,[oe.GROUP]:1},{compositeUserId:V,deviceIdx:$}=di(M.id),{compositeUserId:N,deviceIdx:ye}=di(k.id),{id:Ee,type:fe}=ci(V),{id:Me,type:_e}=ci(N);return S(W[fe],W[_e])||S(Ee,Me)||S($,ye)}function S(M,k){return M<k?-1:M===k?0:1}}Ze.participantMarkerCompare=Ua;function he(g,T){let A=Object.entries(g).filter(([,S])=>Array.isArray(T)?!T.includes(S):S!==T);return Ja(A)}Ze.objectFilterOutValues=he;function F(g,T,A){let S=A;for(let M in g)Object.hasOwn(g,M)&&(S=T(S,g[M],M));return S}Ze.objectReduce=F,Ze.setImmediate=(()=>{let g=1,T={},A=null;return typeof MessageChannel<"u"&&(A=new MessageChannel,A.port1.onmessage=S=>{let M=S.data;T[M]&&(T[M](),delete T[M])}),function(S){if(A&&document.visibilityState==="hidden"){let k=g;return g=g>=Number.MAX_SAFE_INTEGER?1:g+1,T[k]=S,A.port2.postMessage(k),()=>{T[k]&&delete T[k]}}let M=setTimeout(S,0);return()=>clearTimeout(M)}})();function se(g){return g!==null&&typeof g=="object"&&!Array.isArray(g)}Ze.isObject=se;function Se(g,T,A,S){function M(V,$){let N=0,ye=V.length,Ee=!1;for(let fe=0;fe<V.length;fe++)if(!Ee&&V[fe].startsWith("m=video")&&(N=fe),V[fe].startsWith("a=mid:"+$)&&(Ee=!0),Ee&&V[fe].startsWith("m=")){ye=fe;break}return{start:N,end:ye}}function k(V,$,N,ye,Ee,fe,Me){let _e="a=rid:"+ye+" send";for(let ke=$;ke<N;ke++)if(V[ke]===_e){let jt=_e+" max-width="+fe+";max-height="+Me+";max-br="+Ee;V[ke]=jt}}let W=T?.sender;if(W&&W.track&&T.mid){let V=g.split(n),{start:$,end:N}=M(V,T.mid),ye=W.getParameters();if(ye.encodings)return ye.encodings.forEach(Ee=>{let fe=Ee.rid,Me=Ee.maxBitrate,_e=Ee.scaleResolutionDownBy;if(A&&S&&_e){let ke=""+Math.round(A/_e),Tt=""+Math.round(S/_e);k(V,$,N,fe,Me,ke,Tt)}}),V.join(r)}return g}Ze.patchSimulcastAnswerSdp=Se})(Wr||(Wr={}));var I=Wr;var Wt="__CALLS_SDK_DEVTOOLS_",hi=class{set(r,e){try{this.getStorage().setItem(Wt+r,JSON.stringify(e))}catch(t){d.warn("DevTools: Failed to save option",r,t)}}get(r){try{let t=this.getStorage().getItem(Wt+r);return t===null?null:JSON.parse(t)}catch(e){return d.warn("DevTools: Failed to read option",r,e),null}}remove(r){try{this.getStorage().removeItem(Wt+r)}catch(e){d.warn("DevTools: Failed to remove option",r,e)}}clear(){try{let r=this.getStorage(),e=Object.keys(r);for(let t of e)t.startsWith(Wt)&&r.removeItem(t)}catch(r){d.warn("DevTools: Failed to clear options",r)}}getAll(){try{let r=this.getStorage(),e=Object.keys(r),t={};for(let i of e)if(i.startsWith(Wt)){let a=i.substring(Wt.length),s=r.getItem(i);if(s!==null)try{t[a]=JSON.parse(s)}catch{}}return t}catch(r){return d.warn("DevTools: Failed to get all options",r),{}}}getStorage(){return window.localStorage}};var gi=class{constructor(r){o(this,"storage");this.storage=r}set(r,e){this.storage.set(r,e),console.debug(`DevTools: ${String(r)} override set to ${e}`)}get(r){return this.storage.get(r)}clear(r){this.storage.remove(r),console.debug(`DevTools: ${String(r)} override cleared`)}clearAll(){this.storage.clear(),console.debug("DevTools: All overrides cleared")}getAll(){return this.storage.getAll()}applyOverrides(r){let e=this.getAll(),t={...r},i=Object.keys(e);if(i.length>0){console.debug("DevTools: Current overrides:",e);for(let a of i)e[a]!==void 0&&(t[a]=e[a]);console.debug("DevTools: Overrides applied")}return t}};var Ct=class Ct{constructor(){o(this,"params");o(this,"storage");this.storage=new hi,this.params=new gi(this.storage)}static getInstance(){return Ct.instance||(Ct.instance=new Ct),Ct.instance}};o(Ct,"instance",null);var Kr=Ct,$r=Kr.getInstance();var _=class _{static set(r){Object.hasOwn(r,"voiceParams")&&(Object.assign(_._params.voiceParams,r.voiceParams),delete r.voiceParams),Object.hasOwn(r,"specListenerParams")&&(Object.assign(_._params.specListenerParams,r.specListenerParams),delete r.specListenerParams),Object.hasOwn(r,"apiAuth")&&(Pe.accessToken=r.apiAuth.accessToken,Pe.sessionKey=r.apiAuth.sessionKey,Pe.sessionSecretKey=r.apiAuth.sessionSecretKey);let e=$r.params.applyOverrides(r);Object.assign(_._params,I.objectFilterOutValues(e,void 0))}static getScreenFrameRate(r){return r?_._params.fastScreenShareFrameRate:_._params.screenFrameRate}static get(r){return _._params[r]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.10-dev.de31b70a.0"}static get debug(){return _._params.debug}static get protocolVersion(){return _._params.joinFromMultipleDevices?6:5}static get platform(){return _._params.platform}static set platform(r){_._params.platform=r}static get clientStatsPlatform(){return _._params.clientStatsPlatform}static set clientStatsPlatform(r){_._params.clientStatsPlatform=r}static get clientType(){return _._params.clientType}static set clientType(r){_._params.clientType=r}static get externalUserType(){return _._params.externalUserType}static set externalUserType(r){_._params.externalUserType=r}static get device(){return _._params.device}static get apiKey(){return _._params.apiKey}static get apiEnv(){return _._params.apiEnv}static get apiBaseUrl(){return _._params.apiBaseUrl}static set apiBaseUrl(r){_._params.apiBaseUrl=r}static apiEndpoint(r){switch(r??_.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 _._params.apiEnv}}static get apiTimeout(){return _._params.apiTimeout}static get apiMaxAttempt(){return _._params.apiMaxAttempt}static get authToken(){return _._params.authToken}static set authToken(r){_._params.authToken=r}static get anonymToken(){return _._params.anonymToken}static set anonymToken(r){_._params.anonymToken=r}static get domain(){return _._params.domain}static get externalDomain(){return _._params.externalDomain}static get iceServers(){return _._params.iceServers}static set iceServers(r){_._params.iceServers=r}static get wssBase(){return _._params.wssBase}static set wssBase(r){_._params.wssBase=r}static get wtsBase(){return _._params.wtsBase}static set wtsBase(r){_._params.wtsBase=r}static get wssToken(){return _._params.wssToken}static set wssToken(r){_._params.wssToken=r}static get signalingReconnectDelay(){return _._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return _._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return _._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return _._params.waitConnectionDelay}static get waitResponseDelay(){return _._params.waitResponseDelay}static get waitMessageDelay(){return _._params.waitMessageDelay}static get waitAnotherTabDelay(){return _._params.waitAnotherTabDelay}static get debugLog(){return _._params.debugLog}static get forceRelayPolicy(){return _._params.forceRelayPolicy}static set forceRelayPolicy(r){_._params.forceRelayPolicy=r}static get videoMinWidth(){return _._params.videoMinWidth}static get videoMaxWidth(){return _._params.videoMaxWidth}static set videoMaxWidth(r){_._params.videoMaxWidth=r}static get videoMinHeight(){return _._params.videoMinHeight}static get videoMaxHeight(){return _._params.videoMaxHeight}static set videoMaxHeight(r){_._params.videoMaxHeight=r}static get videoAspectRatio(){return _._params.videoAspectRatio}static get videoFrameRate(){return _._params.videoFrameRate}static get videoFacingMode(){return _._params.videoFacingMode||(b.isMobile()?"user":null)}static set videoFacingMode(r){_._params.videoFacingMode=r}static get displaySurface(){return _._params.displaySurface}static get audioEffects(){return _._params.audioEffects}static set audioEffects(r){_._params.audioEffects=r,_._params.audioEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffects(){return _._params.videoEffects}static set videoEffects(r){_._params.videoEffects=r,_._params.videoEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffectMaxWidth(){return _._params.videoEffectMaxWidth}static set videoEffectMaxWidth(r){_._params.videoEffectMaxWidth=r}static get videoEffectMaxHeight(){return _._params.videoEffectMaxHeight}static set videoEffectMaxHeight(r){_._params.videoEffectMaxHeight=r}static get vmoji(){return _._params.vmoji?.isBrowserSupported()?_._params.vmoji:null}static set vmoji(r){_._params.vmoji=r}static get vmojiOptions(){return _._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(r){_._params.vmojiOptions=r}static get voiceParams(){return _._params.voiceParams}static get specListenerParams(){return _._params.specListenerParams}static get iceRestartWaitTime(){return _._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return _._params.transportConnectionWaitTime}static get statisticsInterval(){return _._params.statisticsInterval}static set statisticsInterval(r){_._params.statisticsInterval=r}static get networkStatisticsInterval(){return _._params.networkStatisticsInterval}static get perfStatReportEnabled(){return _._params.perfStatReportEnabled}static get callStatReportEnabled(){return _._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return _._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return _._params.enableLogPerfStatReport}static get asrDataChannel(){return _._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return _._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return _._params.screenShareWebmBuilder}static get noiseSuppression(){return _._params.noiseSuppression}static get preferH264(){return _._params.preferH264}static get preferVP9(){return _._params.preferVP9}static get audioNack(){return _._params.audioNack}static get movieShare(){return _._params.movieShare&&_.videoTracksCount>0}static get videoTracksCount(){return Number(_._params.videoTracksCount)}static get breakVideoPayloadTypes(){return _._params.breakVideoPayloadTypes}static get useCallsToContacts(){return _._params.useCallsToContacts}static get useParticipantListChunk(){return _._params.useParticipantListChunk&&_.videoTracksCount>0}static get useRooms(){return _._params.useRooms}static get useChatRooms(){return _._params.useChatRooms}static get addParticipant(){return _._params.addParticipant}static get waitForAdminInGroupCalls(){return _._params.waitForAdminInGroupCalls}static get participantListChunkInitIndex(){return _._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return _._params.participantListChunkInitCount??null}static get filterObservers(){return _._params.filterObservers}static get muteMode(){return _._params.muteMode}static get preserveAudioTracks(){return _._params.preserveAudioTracks}static get audioShare(){return b.isAudioShareSupported()&&_._params.audioShare}static get audioShareWindowInclude(){return _._params.audioShareWindowInclude}static get audioShareSystemInclude(){return _._params.audioShareSystemInclude}static get fastScreenShare(){return _._params.fastScreenShare}static get screenShareCongestionControl(){return _._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return _._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return _._params.fastScreenShareWidth}static get fastScreenShareHeight(){return _._params.fastScreenShareHeight}static get consumerFastScreenShare(){return _._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return _._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return _._params.videoSuspend}static get enumerateDevicesDelay(){return _._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return _._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return _._params.enableVideoEffectsFpsDegradation}static get simulcast(){return _._params.simulcast}static get webtransport(){return _._params.webtransport}static get webtransportFF(){return _._params.webtransportFF}static get transparentAudio(){return _._params.transparentAudio}static toJSON(){return{apiKey:_._params.apiKey,apiEnv:_._params.apiEnv,audioShare:_._params.audioShare,audioShareWindowInclude:_._params.audioShareWindowInclude,audioShareSystemInclude:_._params.audioShareSystemInclude,useCallsToContacts:_._params.useCallsToContacts,useParticipantListChunk:_._params.useParticipantListChunk,useRooms:_._params.useRooms,useChatRooms:_._params.useChatRooms,addParticipant:_._params.addParticipant,fastScreenShare:_._params.fastScreenShare,participantListChunkInitCount:_._params.participantListChunkInitCount,screenShareCongestionControl:_._params.screenShareCongestionControl,screenShareCongestionControlThreshold:_._params.screenShareCongestionControlThreshold,videoTracksCount:_._params.videoTracksCount,asrDataChannel:_._params.asrDataChannel,videoMaxHeight:_._params.videoMaxHeight,videoMaxWidth:_._params.videoMaxWidth,videoEffectMaxHeight:_._params.videoEffectMaxHeight,videoEffectMaxWidth:_._params.videoEffectMaxWidth,videoSuspend:_._params.videoSuspend,debugLog:_._params.debugLog,callStatReportEnabled:_._params.callStatReportEnabled,joinFromMultipleDevices:_._params.joinFromMultipleDevices,movieShare:_._params.movieShare,clientType:_._params.clientType,clientStatsPlatform:_._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:_._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:_._params.switchVideoAtBadNetwork,simulcast:_._params.simulcast,webtransport:_._params.webtransport,webtransportFF:_._params.webtransportFF,transparentAudio:_._params.transparentAudio}}};o(_,"_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,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 l=_;function Qa(n,r){return!(n.isAudioEnabled!==r.isAudioEnabled||n.isVideoEnabled!==r.isVideoEnabled||n.isScreenSharingEnabled!==r.isScreenSharingEnabled||n.isFastScreenSharingEnabled!==r.isFastScreenSharingEnabled||n.isAudioSharingEnabled!==r.isAudioSharingEnabled||n.isAnimojiEnabled!==r.isAnimojiEnabled)}function Re(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var Xa=n=>n.stop(),Pt=n=>n.getTracks().forEach(Xa),Za=n=>n.getVideoTracks().forEach(Xa);async function qi(n,r){try{let e=typeof r.width=="number"?r.width:void 0,t=typeof r.height=="number"?r.height:void 0;await n.applyConstraints({...r,...e&&{width:{max:e,ideal:e}},...t&&{height:{max:t,ideal:t}}})}catch(e){d.warn("setVideoConstraints failed",e)}}var zi=class extends ce{constructor(){super(...arguments);o(this,"FPS_LIMITS",[13,20,Math.max(l.videoFrameRate,25)]);o(this,"THRESHOLD",.8);o(this,"HISTORY_LENGTH",10);o(this,"_fpsMeterUnsubscribe",null);o(this,"_fpsHistory",{cursor:0,arr:[]});o(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(t){d.warn("VideoEffectsFpsLimiter error",t)}}_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 t=this._fpsHistory.arr.reduce((a,s)=>a+s,0)/this.HISTORY_LENGTH,i=this.FPS_LIMITS[this._fpsLimitCursor];t<i*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),i!==this.fpsLimit&&this._triggerEvent("fps-limit",this.fpsLimit)}}_assertsVideoEffect(e){if(!("addFpsMeterListener"in e))throw new Error("Outdated VideoEffect version")}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}};var Ke=(i=>(i.audio="audio",i.video="video",i.screen="screen",i.audioshare="audioshare",i))(Ke||{});var Ji=class extends ce{constructor(){super();o(this,"_stream",null);o(this,"_screenTrack",null);o(this,"_audioShareTrack",null);o(this,"_screenShareTrack",null);o(this,"_sendVideoTrack",null);o(this,"_cameraVideoTrack",null);o(this,"_micAudioTrack",null);o(this,"_audioEffectsTrack",null);o(this,"_mediaSettings",Re());o(this,"_videoStatusOnScreenCapturingEnabled",!1);o(this,"_effect",null);o(this,"_audioEffectParams",null);o(this,"_onDeviceChange");o(this,"_animojiEnabled",!1);o(this,"_videoEffectsFpsLimiter");o(this,"videoTrackMuteHandler",()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)});this._initDeviceChangeListener(),l.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),l.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new zi,this._videoEffectsFpsLimiter.addEventListener("fps-limit",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),l.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[le.AUDIO],t=!0){if(this._stream)return;let i=e.includes(le.VIDEO),a=e.includes(le.AUDIO),s=e.includes(le.ANIMOJI);if(!b.isBrowserSupported())throw new B(de.UNSUPPORTED);try{this._stream=await b.getUserMedia(i,a,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=i&&this._stream.getVideoTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(c){throw new B(c)}}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(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,i){let a=this.getStream(),s=this.getSendAudioTrack(),c=this.getSendVideoTrack(i);if(!a||!s&&!c&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,a),c&&!t&&e.addTrack(c,a)}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(de.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Za(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=b.getSavedMicrophone(),i=b.getSavedCamera(),a=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,s=this._mediaSettings.isVideoEnabled&&i?.groupId!==e.camera?.groupId;try{a&&await this._changeAudioInput(),s&&await this._changeVideoInput()}catch{}},b.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&b.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await b._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=i.getVideoTracks()[0],!this._stream)Pt(i);else{let a=await this._setEffect(this._effect,this.cameraVideoTrack);R.log(w.DEVICE_CHANGED,t),d.log("Video stream changed"),await this._replaceLocalTrack(a),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw R.log(w.ERROR,"change_video"),d.warn("Camera change failed",t),t}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await b.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Pt(t);else{let i=await this._applyAudioEffect();R.log(w.DEVICE_CHANGED,"audio"),d.log("Audio stream changed",i),await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw R.log(w.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await b.getScreenMedia(e,t),!this._stream)Pt(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),R.log(w.DEVICE_CHANGED,"screen"),d.log("Screen capturing started"),this._screenTrack=a,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,l.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(a.contentHint="motion",this._screenShareTrack=a),i.getAudioTracks().length>0){let s=i.getAudioTracks()[0];s.contentHint="music",this._audioShareTrack=s,await this._replaceLocalTrack(s),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&d.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:a}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(a){throw R.log(w.ERROR,"screen"),d.warn("Screen capturing failed",a),a}}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(!l.audioEffects||!this._audioEffectParams)return l.audioEffects?.pause(),this._micAudioTrack;l.audioEffects.isInitialized||await l.audioEffects.init(),l.audioEffects.resume(),l.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),l.audioEffects.setSource(this._micAudioTrack);let e=l.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=b.getSilentMediaTrack();return e.contentHint="music",e.stop(),e}getBlackScreenShareTrack(){let e=b.getBlackMediaTrack();return e.contentHint="motion",e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let i=this._stream.getTracks().find(a=>a.kind===e.kind&&a.contentHint===e.contentHint);i?.id!==e.id&&(i?(i!==this._audioEffectsTrack&&i.stop(),this._stream?.removeTrack(i),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(l.videoEffects),!l.videoEffects)return t;try{return l.videoEffects.setEffect(e,t)}catch(i){return d.warn("Video effect failed",i),t}}_stopEffect(){if(l.videoEffects)try{l.videoEffects.stopEffect()}catch(e){d.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),l.videoEffects&&(this._effect=null,l.videoEffects.destroy()),l.audioEffects&&l.audioEffects.destroy(),this._stream&&(Pt(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),b.getAudioContext()?.suspend().catch(t=>d.error(t)),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 i=await b._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=b.getBlackMediaTrack(l.videoMinWidth,l.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(i,a)=>{await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=a,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})};if(e)try{let i=await b.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw l.audioEffects?.pause(),t(b.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else l.audioEffects?.pause(),t(b.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 new Error("Local stream not found");if(!this.cameraVideoTrack)throw new Error("Local video track not found");let i=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,i)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(t=>!t.contentHint);if(!e)throw new Error("Local audio track not found");if(e.enabled)return e.applyConstraints({noiseSuppression:l.noiseSuppression})}async videoEffect(e){if(!l.videoEffects)throw new Error("Video Effects library is not set");if(R.log(w.DEVICE_CHANGED,`effect_${e?.effect||"none"}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let i=this.cameraVideoTrack.clone(),a=new MediaStream([i]);await this._applyVideoConstraints(i),await this._changeVideoInput(a)}catch(i){this._effect=t;let a=this.cameraVideoTrack.clone(),s=new MediaStream([a]);throw await this._changeVideoInput(s),i}}}async audioEffect(e){if(!l.audioEffects)throw new Error("Audio Effects library is not set");if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!I.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let i=this._micAudioTrack.clone(),a=new MediaStream([i]);await this._changeAudioInput(a)}catch(i){this._audioEffectParams=t;let a=this._micAudioTrack.clone(),s=new MediaStream([a]);throw await this._changeAudioInput(s),i}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<l.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(t=>{d.warn("MediaSource handleVideoEffectsLowFps error",t)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??l.videoFrameRate;return this._effect?Math.min(e,l.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await qi(e,{width:this._effect?l.videoEffectMaxWidth:l.videoMaxWidth,height:this._effect?l.videoEffectMaxHeight:l.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}};var _i=class{constructor(){o(this,"_cameraPermissionStatus");o(this,"_microphonePermissionStatus");o(this,"_listener")}static isSupported(){return b.browserName()!=="Firefox"&&"permissions"in navigator&&"PermissionStatus"in window}async init(r){try{let[e,t]=await Promise.all([navigator.permissions.query({name:"camera"}),navigator.permissions.query({name:"microphone"})]);this._cameraPermissionStatus=e,this._microphonePermissionStatus=t,this._listener=r,this._cameraPermissionStatus.onchange=i=>this.handlePermissionChange(i),this._microphonePermissionStatus.onchange=i=>this.handlePermissionChange(i)}catch(e){d.warn("NavigatorPermissions init error",e)}}handlePermissionChange(r){let e=r.target;if(e instanceof PermissionStatus){let{name:t,state:i}=e;switch(t){case"audio_capture":this._listener("microphone",i);break;case"video_capture":this._listener("camera",i);break}}}getPermissionState(r){let e=null;switch(r){case"camera":e=this._cameraPermissionStatus.state;break;case"microphone":e=this._microphonePermissionStatus.state;break}return e}};var zr=(p=>(p.WAITING_HALL="WAITING_HALL",p.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",p.WAITING="WAITING",p.CONNECTING="CONNECTING",p.CONNECTED="CONNECTED",p.RECONNECT="RECONNECT",p.ERROR="ERROR",p.HANGUP="HANGUP",p.PERMISSIONS="PERMISSIONS",p))(zr||{});function j(n,...r){let e=l.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function ge(n,r,...e){if(l.filterObservers){if(Array.isArray(r)){if(r=r.filter(t=>!t.observer),!r.length)return}else if(r.observer)return}j(n,r,...e)}function Ce(n){return Object.assign({},n)}function bt(n){return n.slice()}var qr;(Lc=>{function n(f,D){j("onLocalStream",f,Ce(D))}Lc.onLocalStream=n;function r(f,D){j("onScreenStream",f,Ce(D))}Lc.onScreenStream=r;function e(f,D){j("onVmojiStream",f,Ce(D))}Lc.onVmojiStream=e;function t(f){j("onVmojiError",f)}Lc.onVmojiError=t;function i(f,D){j("onLocalStreamUpdate",Ce(f),D)}Lc.onLocalStreamUpdate=i;function a(f){d.debug("Local status:",f),j("onLocalStatus",f)}Lc.onLocalStatus=a;function s(f,D){ge("onRemoteStream",f,D)}Lc.onRemoteStream=s;function c(f,D){ge("onRemoteLive",f,D)}Lc.onRemoteLive=c;function u(f,D){ge("onLocalLive",f,D)}Lc.onLocalLive=u;function p(f,D){ge("onRemoteLiveUpdate",f,D)}Lc.onRemoteLiveUpdate=p;function m(f,D){ge("onLocalLiveUpdate",f,D)}Lc.onLocalLiveUpdate=m;function h(f,D){ge("onRemoteScreenStream",f,D)}Lc.onRemoteScreenStream=h;function E(f,D){ge("onRemoteVmojiStream",f,D)}Lc.onRemoteVmojiStream=E;function P(f,D,q){ge("onRemoteStreamSuspended",f,D,q)}Lc.onRemoteStreamSuspended=P;function C(f,D,q,Le,Rt){ge("onConversation",f,Ce(D),Ce(q),Le,Rt)}Lc.onConversation=C;function H(f){f&&j("onConversationParticipantListChunk",f)}Lc.onConversationParticipantListChunk=H;function K(f,D,q){ge("onRemoteMediaSettings",f,Ce(D),q)}Lc.onRemoteMediaSettings=K;function z(f,D){ge("onLocalMediaSettings",f,Ce(D))}Lc.onLocalMediaSettings=z;function Te(f,D,q){ge("onRemoteSharedMovieInfo",f,Ce(D),q)}Lc.onRemoteSharedMovieInfo=Te;function De(f,D,q){ge("onRemoteSharedMovieStoppedInfo",f,Ce(D),q)}Lc.onRemoteSharedMovieStoppedInfo=De;function ae(f,D,q){ge("onLocalSharedMovieInfo",f,Ce(D),q)}Lc.onLocalSharedMovieInfo=ae;function ne(f,D,q){ge("onLocalSharedMovieStoppedInfo",f,Ce(D),q)}Lc.onLocalSharedMovieStoppedInfo=ne;function Y(f,D,q){ge("onRemoteSharedUrl",f,D,q)}Lc.onRemoteSharedUrl=Y;function Vt(f,D){ge("onParticipantAdded",f,D)}Lc.onParticipantAdded=Vt;function ba(f,D){ge("onParticipantJoined",f,D)}Lc.onParticipantJoined=ba;function Aa(f,D=!1){j("onLocalParticipantState",Ce(f),D)}Lc.onLocalParticipantState=Aa;function Ma(f,D,q){ge("onRemoteParticipantState",f,Ce(D),q)}Lc.onRemoteParticipantState=Ma;function ci(f,D){j("onRemoteParticipantsState",f,D)}Lc.onRemoteParticipantsState=ci;function di(f,D,q=null){d.debug("Remote status:",D,f),ge("onRemoteStatus",f,D,q)}Lc.onRemoteStatus=di;function re(){j("onPermissionsRequested")}Lc.onPermissionsRequested=re;function Da(f,D){j("onPermissionsError",f,D)}Lc.onPermissionsError=Da;function wa(f,D){ge("onRemoteRemoved",f,D)}Lc.onRemoteRemoved=wa;function ee(f,D,q){j("onCallState",f,D,Ce(q))}Lc.onCallState=ee;function ka(f,D){j("onDeviceSwitched",f,D)}Lc.onDeviceSwitched=ka;function Br(f,D,q,Le=!1,Rt=!1,Hr=null,Gr=null,Is,Fa,Es=null){let Ts=Fa?bt(Fa):void 0;j("onMuteStates",Ce(f),bt(D),bt(q),Le,Rt,Hr,Gr,Is,Ts,Es)}Lc.onMuteStates=Br;function Fr(f,D,q=!1){ge("onRolesChanged",f,bt(D),q)}Lc.onRolesChanged=Fr;function Vr(f,D=!1){j("onLocalRolesChanged",bt(f),D)}Lc.onLocalRolesChanged=Vr;function Oa(f,D,q,Le){ge("onPinnedParticipant",f,D,q,Le)}Lc.onPinnedParticipant=Oa;function xa(f,D){j("onLocalPin",f,D)}Lc.onLocalPin=xa;function jr(f){j("onOptionsChanged",bt(f))}Lc.onOptionsChanged=jr;function Na(){j("onCallAccepted")}Lc.onCallAccepted=Na;function La(f,D){ge("onAcceptedCall",f,D)}Lc.onAcceptedCall=La;function Ua(){j("onRateNeeded")}Lc.onRateNeeded=Ua;function he(f){ge("onSpeakerChanged",f)}Lc.onSpeakerChanged=he;function F(f){j("onVolumesDetected",bt(f))}Lc.onVolumesDetected=F;function te(f,D){j("onLocalVolume",f,D)}Lc.onLocalVolume=te;function se(f,D){j("onJoinStatus",f,D)}Lc.onJoinStatus=se;function Se(f,D){j("onHangup",f,D)}Lc.onHangup=Se;function Ze(f){j("onMultipartyChatCreated",Ce(f))}Lc.onMultipartyChatCreated=Ze;function g(){j("onDeviceChange")}Lc.onDeviceChange=g;function T(f){j("onFingerprintChange",f)}Lc.onFingerprintChange=T;function A(){j("onTokenExpired")}Lc.onTokenExpired=A;function S(f,D,q=!1){j("onChatMessage",f,D,q)}Lc.onChatMessage=S;function M(f,D,q=!1){j("onCustomData",f,D,q)}Lc.onCustomData=M;function k(f,D,q,Le,Rt,Hr,Gr=null){j("onRecordStarted",f,D,q,Le,Rt,Hr,Gr)}Lc.onRecordStarted=k;function W(f=null,D){j("onRecordStopped",f,D)}Lc.onRecordStopped=W;function V(f){j("onLocalNetworkStatusChanged",f)}Lc.onLocalNetworkStatusChanged=V;function $(f){j("onNetworkStatusChanged",f)}Lc.onNetworkStatusChanged=$;function N(f,...D){j("onDebugMessage",f,...D)}Lc.onDebugMessage=N;function ye(f,D){let q=Object.assign({},f,{memory:D});j("onStatistics",q)}Lc.onStatistics=ye;function Ee(){j("onAutoplayError")}Lc.onAutoplayError=Ee;function fe(f,D,q,Le,Rt){j("onChatRoomUpdated",f,D,q,Le,Rt)}Lc.onChatRoomUpdated=fe;function Me(f){j("onPromoted",f)}Lc.onPromoted=Me;function _e(f){j("onRemoteMixedAudioStream",f)}Lc.onRemoteMixedAudioStream=_e;function ke(f){j("onJoinLinkChanged",f)}Lc.onJoinLinkChanged=ke;function Tt(f){j("onRoomsUpdated",f)}Lc.onRoomsUpdated=Tt;function jt(f,D,q,Le){j("onRoomUpdated",f,D,q,Le)}Lc.onRoomUpdated=jt;function et(f){j("onRoomParticipantsUpdated",f)}Lc.onRoomParticipantsUpdated=et;function li(f){j("onRoomSwitched",f)}Lc.onRoomSwitched=li;function Ba(f){j("onRoomStart",f)}Lc.onRoomStart=Ba;function Cc(f,D=null){j("onFeedback",f,D)}Lc.onFeedback=Cc;function yc(f){j("onFeaturesPerRoleChanged",f)}Lc.onFeaturesPerRoleChanged=yc;function Pc(f){j("onParticipantVmojiUpdate",f)}Lc.onParticipantVmojiUpdate=Pc;function bc(f,D){j("onAsrSet",f,D)}Lc.onAsrSet=bc;function Ac(f,D,q){j("onAsrStarted",f,D,q)}Lc.onAsrStarted=Ac;function Mc(f){j("onAsrStopped",f)}Lc.onAsrStopped=Mc;function Dc(f,D,q,Le){j("onAsrTranscription",f,D,q,Le)}Lc.onAsrTranscription=Dc;function wc(f,D){j("onParticipantIdChanged",f,D)}Lc.onParticipantIdChanged=wc;function kc(f){j("onVideoSuspendSuggest",f)}Lc.onVideoSuspendSuggest=kc;function Oc(f){j("onSignalingMessage",typeof f=="string"?f:Ce(f))}Lc.onSignalingMessage=Oc;function xc(f){j("onPromotionApproved",f)}Lc.onPromotionApproved=xc;function Nc(){j("onPeerRegistered")}Lc.onPeerRegistered=Nc})(qr||(qr={}));var v=qr;var Yr="_okcls_",Kt=(()=>{try{let n=Date.now().toString(),r=window.localStorage,e=!1;return r.setItem(n,n),e=r.getItem(n)===n,r.removeItem(n),e?r:null}catch{return null}})();function As(n){let r=Kt?Kt.getItem(Yr+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function Ms(n,r){try{Kt&&Kt.setItem(Yr+n,JSON.stringify(r))}catch{}}function Ds(n){Kt&&Kt.removeItem(Yr+n)}var Jr;(t=>{function n(i){return As(i)||null}t.get=n;function r(i,a){Ms(i,a)}t.set=r;function e(i){Ds(i)}t.remove=e})(Jr||(Jr={}));var ht=Jr;var qt=null,Yi=null,ir=null,ar=[],nr=[],rr=[],$e=null,qe=null,sr=null,or=!1,cr=!1,Qi,$t,Xi,Si=null,Qr=null,Xr="",en=null,Zi=[],er=null,tn=navigator.appVersion,ws=navigator.appName,Ue=navigator.userAgent,nt={},yt=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(yt||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(yt||(yt={}));var Mt=class{constructor(r,e=!1,t=l.videoMaxWidth,i=l.videoMaxHeight,a=l.videoFrameRate){o(this,"audio");o(this,"video");o(this,"needVideo");o(this,"lastSimplifyWasReached");o(this,"supportedConstraints");o(this,"isVideoRequested",()=>this.needVideo);this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(r){s={noiseSuppression:l.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let u=Ie.getMicrophones(),p,m;if(qe&&(m=qe.groupId,p=qe.deviceId),typeof r=="string")m=u.find(E=>E.deviceId===r)?.groupId,p=r;else if(!qe&&Ie.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,p=h.deviceId)}m&&this.supportedConstraints.groupId?s.groupId={exact:m}:p&&(s.deviceId={exact:p})}let c=!1;if(e){c={width:{min:l.videoMinWidth,max:t,ideal:t},height:{min:l.videoMinHeight,max:i,ideal:i},aspectRatio:{ideal:l.videoAspectRatio},frameRate:{ideal:a}};let u=Ie.getCameras(),p,m;if($e&&(m=$e.groupId,p=$e.deviceId),typeof e=="string")m=u.find(E=>E.deviceId===e)?.groupId,p=e;else if(!$e&&Ie.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,p=h.deviceId)}m&&this.supportedConstraints.groupId?c.groupId={exact:m}:p&&(c.deviceId={exact:p}),l.videoFacingMode&&(c.facingMode={ideal:l.videoFacingMode},delete c.deviceId,delete c.groupId)}this.audio=s,this.video=c,this.needVideo=!!c,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 r=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||r)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Zr=class extends Mt{constructor(e,t,i,a){super(!1,!0);o(this,"captureController");if(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=i,this.video.displaySurface=l.displaySurface,Ie.browserName()==="Safari"){let s=Number(Ie.browserVersion());s===16?(this.video.width={max:e},this.video.height={max:t}):s===17&&(delete this.video.width,delete this.video.height)}a&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:l.audioShareSystemInclude?"include":"exclude",windowAudio:l.audioShareWindowInclude?"include":"exclude",controller:this.captureController})}},At=class At{constructor(){o(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(At._lockId)throw R.log(w.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");At._lockId=this._lockId}free(){At._lockId===this._lockId&&(At._lockId=0)}};o(At,"_lockId",0);var dr=At;async function rn(){cr=!1,or=!1,qt=null;let n={camera:Ie.getSavedCamera(),microphone:Ie.getSavedMicrophone(),output:Ie.getSavedOutput()};await ea(),ks("devicechange",n),v.onDeviceChange()}function ks(n,...r){if(nt[n])for(let e of nt[n])e(...r)}async function ea(){return qt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!Yi&&navigator.mediaDevices.addEventListener&&(Yi=I.debounce(rn,l.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",Yi)),!ir&&_i.isSupported()&&(ir=new _i,await ir.init((n,r)=>{switch(r){case"denied":case"prompt":Yi?.();break}})),qt=navigator.mediaDevices.enumerateDevices().then(n=>{ar=n.filter(i=>i.kind==="videoinput"?(i.label&&(or=!0),!0):!1),nr=n.filter(i=>i.kind==="audioinput"?(i.label?cr=!0:Ie.isMobile()&&Ie.browserName()==="Firefox"&&(cr=or),!0):!1),rr=n.filter(i=>i.kind==="audiooutput");let r=$e?.deviceId??ht.get("videoinput"),e=qe?.deviceId??ht.get("audioinput"),t=sr?.deviceId??ht.get("audiooutput");return $e=ar.find(i=>i.deviceId===r)||null,qe=nr.find(i=>i.deviceId===e)||null,sr=rr.find(i=>i.deviceId===t)||rr[0]||null,qt=Promise.resolve(n),n}).catch(()=>(qt=null,[]))))}async function Os(){if("userAgentData"in navigator)try{let{platformVersion:n}=await navigator.userAgentData.getHighEntropyValues(["platformVersion"]);if(!n){d.warn("Can't to get OS version");return}let r=parseInt(n.split(".")[0]);en=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function xs(n){if($e&&qe)return;let r=(e,t)=>{let i=t.getSettings()?.deviceId;return e.find(a=>a.deviceId===i||a.label===t.label)||null};n?.getTracks().forEach(e=>{!qe&&e.kind==="audio"?qe=r(Ie.getMicrophones(),e):!$e&&e.kind==="video"&&($e=r(Ie.getCameras(),e))})}async function fi(n,r){d.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative()))),Ie.releaseFirefoxMicrophonePermissionWarmup();let e=(!n.isVideo()||Ie.hasCameraPermission())&&(!n.isAudio()||Ie.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new dr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await rn(),xs(i),i}catch(i){switch(t.free(),d.error("getUserMedia error",i),i.name){case"PermissionDeniedError":case"PermissionDismissedError":case"NotAllowedError":case"SecurityError":case"DOMException":case"NotFoundError":r=n.isVideoRequested()?de.CAMERA_PERMISSION:de.MIC_PERMISSION;break;case"OverconstrainedError":r=de.OVERCONSTRAINED;break;case"TypeError":r=de.UNKNOWN;break;case"AbortError":case"NotReadableError":r=n.isVideoRequested()?de.CAMERA_ACCESS:de.MIC_ACCESS;break;case"Error":if(i.message==="MediaSource is busy"){r=n.isVideoRequested()?de.CAMERA_ACCESS:de.MIC_ACCESS;break}}if(n.canSimplify())return fi(n.simplify(),r);let a=r||de.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function Ns(){if(!(Si||Ie.browserName()!=="Firefox"||Ie.hasMicrophonePermission()||!navigator.mediaDevices?.getUserMedia))try{v.onPermissionsRequested(),Si=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(n){d.warn("Firefox microphone permission warmup failed",n)}}async function Ls(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new dr;try{r.busy();let e=await navigator.mediaDevices.getDisplayMedia(n.getNative()),t=e?.getVideoTracks()[0];if(t){let i=t.getSettings()?.displaySurface;if(d.debug(`Got display media track: ${t.id} (${i})`),t.contentHint="text",n.captureController&&(i==="browser"||i==="window"))try{n.captureController.setFocusBehavior("no-focus-change")}catch(a){d.warn("Failed to set focus behavior",a)}}return e}catch(e){switch(e.name){case"PermissionDeniedError":case"NotAllowedError":case"SecurityError":throw de.SCREEN_PERMISSION;default:throw de.SCREEN_ACCESS}}finally{r.free()}}function tr(){return Zi.length||(Zi=(()=>{let n,r=!1,e=0,t="0",i=Ue.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return n=/\brv[ :]+(\d+)/g.exec(Ue),["IE",n&&n[1]||"Unknown",r,e,t];if(i[1]==="Safari"){if(n=Ue.match(/\bEdge\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bCriOS\/(\d+)/),n)return["Chrome",n[1],!0,Number(n[1]),t];if(n=Ue.match(/\bFxiOS\/(\d+)/),n)return["Firefox",n[1],!1,e,t];if(n=Ue.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1],!1,e,t];if(n=Ue.match(/\bOPT\/(\d+)/),n)return["Opera",n[1],!1,e,t]}if(i[1]==="Chrome"){if(r=!0,e=Number(i[2]),n=Ue.match(/\bOPR\/(\d+)/),n)return["Opera",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bSferum\/((\d+)(?:\.\d+)*)/),n)return["Sferum",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bEdge?\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(typeof window.opr<"u"&&/^(.+\.)?ok.ru$/.test(window.location.host))return["Opera","Hidden",r,e,t]}return n=Ue.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),n&&n[2]!==void 0&&(t=n[2]),[i[2]?i[1]:ws,n&&n[1]||i[2]||tn,r,e,t]})()),Zi}var Ie;(he=>{async function n(){await ea(),await Os()}he.init=n;function r(){return ar}he.getCameras=r;function e(){return nr}he.getMicrophones=e;function t(){return rr}he.getOutput=t;function i(){return ar.length>0}he.hasCamera=i;function a(){return nr.length>0}he.hasMicrophone=a;function s(){return $e}he.getSavedCamera=s;function c(){return qe}he.getSavedMicrophone=c;function u(){return sr}he.getSavedOutput=u;function p(){return l.videoFacingMode}he.getVideoFacingMode=p;function m(){return or}he.hasCameraPermission=m;function h(){return cr}he.hasMicrophonePermission=h;function E(){return ir?.getPermissionState("microphone")??null}he.getMicrophonePermissionState=E;function P(F=!1){return h()?i()&&F?m():!0:!1}he.hasPermissions=P;function C(){Si&&(Pt(Si),Si=null)}he.releaseFirefoxMicrophonePermissionWarmup=C;async function H(F=!1,te=!0,se=!0){!F&&!te?await Ns():he.releaseFirefoxMicrophonePermissionWarmup();let Se=a()&&te,Ze=i()&&F,g;if(!Se&&!Ze)g=new MediaStream;else try{g=await fi(new Mt(Se,Ze))}catch{g=new MediaStream}return!g.getVideoTracks().length&&se&&g.addTrack(he.getBlackMediaTrack()),!g.getAudioTracks().length&&se&&g.addTrack(he.getSilentMediaTrack()),g}he.getUserMedia=H;async function K(F,te){let se=F&&!l.consumerFastScreenShare?l.fastScreenShareWidth:window.screen.width,Se=F&&!l.consumerFastScreenShare?l.fastScreenShareHeight:window.screen.height,Ze=l.getScreenFrameRate(F);return Ls(new Zr(se,Se,Ze,te))}he.getScreenMedia=K;async function z(F=!1,te){let se=F?l.videoEffectMaxWidth:l.videoMaxWidth,Se=F?l.videoEffectMaxHeight:l.videoMaxHeight;return fi(new Mt(!1,!0,se,Se,te))}he._getUserVideo=z;async function Te(F,te){let se=te?.width||l.videoMaxWidth,Se=te?.height||l.videoMaxHeight;return fi(new Mt(!1,F||!0,se,Se))}he.getUserVideo=Te;async function De(F){return fi(new Mt(F||!0,!1))}he.getUserAudio=De;async function ae(F,te){let[se]=F.getVideoTracks();if(!se)throw new Error("Video track not found in stream");return qi(se,te)}he.setResolution=ae;async function ne(F,te){let Se=(await ea()).find(Ze=>Ze.kind===F&&Ze.deviceId===te);return Se?(F==="videoinput"?$e=Se:F==="audioinput"?qe=Se:F==="audiooutput"&&(sr=Se),ht.set(F,te),Se):null}he._saveDeviceId=ne;function Y(){if(!Xi||Xi.readyState==="ended"){let F=he.getAudioContext(),te=F.createMediaStreamDestination(),se=F.createGain();se.gain.value=1e-5,se.connect(te),se.connect(F.destination);let Se=F.createOscillator();Se.type="sine",Se.frequency.value=0,Se.connect(se),Se.start(),Xi=te.stream.getAudioTracks()[0]}return Object.assign(Xi.clone(),{enabled:!1})}he.getSilentMediaTrack=Y;function Vt(F=l.videoMinWidth,te=l.videoMinHeight){$t||($t=document.createElement("canvas")),$t.width=F,$t.height=te;let se=$t.getContext("2d");return se.rect(0,0,F,te),se.fillStyle="black",se.fill(),(!Qi||Qi.readyState==="ended")&&(Qi=$t.captureStream(l.videoFrameRate).getVideoTracks()[0]),Object.assign(Qi.clone(),{enabled:!1})}he.getBlackMediaTrack=Vt;function ba(){if(Fr()==="Edge"&&Number(Vr())<70)return!1;try{let F=window;return"mediaDevices"in F.navigator&&"getUserMedia"in F.navigator.mediaDevices&&F.RTCPeerConnection&&F.RTCIceCandidate&&F.RTCSessionDescription&&F.HTMLCanvasElement&&F.HTMLCanvasElement.prototype.captureStream&&F.RTCRtpSender&&F.RTCRtpSender.prototype.replaceTrack&&F.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}he.isBrowserSupported=ba;function Aa(){return!!navigator.mediaDevices.getDisplayMedia}he.isScreenCapturingSupported=Aa;function Ma(){let F=he.browserName()==="Safari"&&he.browserVersion()==="15"&&he.browserSubVersion()==="1",te=he.browserName()==="Opera",se=he.browserName()==="Yandex";return F||te||se}he.isBrokenH264Decoder=Ma;function ci(){return he.browserName()==="Yandex"&&he.os()==="Windows"||l.simulcast}he.isBrokenVP9Encoder=ci;function di(){let F=he.browserName()==="Safari"&&Number(he.browserVersion())===17&&[4,5,6].includes(Number(he.browserSubVersion())),te=he.os()==="Windows"&&he.osVersion()===10;return F||te}he.isBrokenVP9Decoder=di;function re(){return he.browserName()==="Firefox"&&Number(he.browserVersion())<60}he.isOldDataChannelDescription=re;function Da(){return!(he.baseChromeVersion()&&he.isMobile())}he.canPreferH264=Da;function wa(){return!(he.browserName()==="Firefox"||he.browserName()==="Safari")}he.isSimulcastSupportedByBrowser=wa;function ee(){return Xr||(Xr=(()=>{let F={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 te in F)if(Object.hasOwn(F,te)&&F[te].test(Ue))return te;return"Unknown"})()),Xr}he.os=ee;function ka(){return en}he.osVersion=ka;function Br(){return Qr===null&&(Qr=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(tn)),Qr}he.isMobile=Br;function Fr(){return tr()[0]}he.browserName=Fr;function Vr(){return tr()[1]}he.browserVersion=Vr;function Oa(){return tr()[3]}he.baseChromeVersion=Oa;function xa(){return er||(er=new(window.AudioContext||window.webkitAudioContext)),er.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),er}he.getAudioContext=xa;function jr(){return tr()[4]}he.browserSubVersion=jr;function Na(){return he.baseChromeVersion()>=105&&!he.isMobile()}he.isAudioShareSupported=Na;function La(F,te){nt[F]||(nt[F]=[]),nt[F].push(te)}he.addEventListener=La;function Ua(F,te){if(nt[F])if(!te)delete nt[F];else{let se=nt[F].indexOf(te);se>-1&&nt[F].splice(se,1)}}he.removeEventListener=Ua})(Ie||(Ie={}));var b=Ie;var je=class je{static get startTime(){return je._list[0]?.t||0}static get endTime(){let r=je._list;return r[r.length-1]?.t||0}static startSession(){je._list=[]}static get conversationId(){return je._conversationId}static set conversationId(r){je._conversationId=r}static add(r){je._list.push(r)}static _createContextLogs(){let r=[[`Calls SDK ${l.sdkVersion}`,l.toJSON()],["UserAgent:",navigator.userAgent],["Screen resolution:",`${window.screen.width}x${window.screen.height}`],["Permissions:",`Camera: ${b.hasCameraPermission()}, Mic: ${b.hasMicrophonePermission()}`]],e=new Date,t=e.getTime(),i=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return r.map(a=>({h:i,t,l:"LOG",d:a}))}static collectLogs(){let r=je._list;return r.length===0?[]:[...je._createContextLogs(),...r]}};o(je,"_list",[]),o(je,"_conversationId",null);var Oe=je;var lr=class{constructor(){o(this,"_items",[])}get length(){return this._items.length}push(...r){this._items.push(...r)}merge(r){this._items.push(...r._items)}shift(){return this._items.shift()||null}bisect(){let r=this.length>1?Math.floor(this.length/2):1;this._items=this._items.slice(r)}head(){return this._items[0]||null}tail(){let r=this._items.length;return r?this._items[r-1]:null}clear(){this._items=[]}toString(){return this._items.length?JSON.stringify(this._items,(r,e)=>e instanceof Error?String(e):e):""}};var ta=2*1024*1024,an=512*1024,zt=100*1024,Us=5,ra="_okcls_logs_session_",Bs=3e4,aa=class{constructor(){o(this,"_items",[]);o(this,"_itemsSize",0);o(this,"_storageSize",ta);try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(ra)!==0)continue;let t=r.getItem(e);if(!t){nn(e);continue}let i=on(t);this.add(e,i)}}catch(r){console.error("Storage is blocked",r),this._storageSize=0}this._items.sort((r,e)=>r.date-e.date),this.cleanup(zt)}get size(){return this._itemsSize}get length(){return this._items.length}get available(){return Math.max(this._storageSize-this._itemsSize,0)}get items(){return this._items}set storageSize(r){this._storageSize=Math.min(r,this._storageSize,ta)}add(r,e){let t=parseInt(r.replace(ra,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(nn(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>ta||this.length>Us-1||this.size+r>this.available);)this.deleteOldestItem()}};function sn(){return`${ra}${Date.now()}`}function on(n){return new Blob([n]).size}function nn(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function pr(){let n=gt.toString();if(!we.available||!n)return;let r=on(n);if(r>an){gt.bisect(),pr();return}we.cleanup(zt+r);try{window.localStorage.setItem(ur,n)}catch(e){if(console.warn("Failed to write log to storage",e),we.storageSize=we.size+r,we.cleanup(zt+r),we.available>=zt+r){pr();return}if(r>zt){gt.bisect(),pr();return}we.storageSize=0;return}r>an&&(we.add(ur,r),ur=sn(),gt.clear(),we.cleanup(zt))}function na(){!we.available||!gt.length||pr()}function Fs(n=!1){let r=[];try{let i=window.localStorage;for(let s of we.items){let c=i.getItem(s.key);r.push(c)}let a=gt.toString();a&&r.push(a)}catch(i){console.error("Storage is blocked",i)}let e=`[${r.join(",")}]`;if(n)return e;let t=`logs_${Date.now()}.json`;return Vs(e,t),t}function Vs(n,r){let e=document.createElement("a"),t=new Blob([n],{type:"text/json"});e.href=URL.createObjectURL(t),e.download=r,e.click()}function cn(n,r){if(!we.available)return;let e=new Date,t={t:e.getTime(),l:n,d:r,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};gt.push(t),Oe.add(t),ia||(ia=window.setTimeout(()=>{ia=null,na()},Bs))}function sa(){we||(we=new aa,gt=new lr,ur=sn(),window.addEventListener("beforeunload",na))}var we,gt,ur,ia=null;window.__VKCallsSDKLogs__=(n=!1)=>(we||sa(),na(),Fs(n));var dn=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(dn||{}),oa;(ae=>{let n="📞",r=(ne,...Y)=>{v.onDebugMessage(ne,...Y)},e=!1,t=(ne,Y)=>(...Vt)=>{ne(...Vt),cn(Y,Vt)},i=console.debug.bind(console,n),a=console.log.bind(console,n),s=console.warn.bind(console,n),c=console.error.bind(console,n),u=r.bind(null,"DEBUG"),p=r.bind(null,"LOG"),m=r.bind(null,"WARN"),h=r.bind(null,"ERROR");ae.debug=u,ae.log=p,ae.warn=m,ae.error=h;function K(){return e}ae.enabled=K;function z(ne){e=ne,l.debugLog&&sa(),ne?(ae.debug=l.debugLog?t(i,"DEBUG"):i,ae.log=l.debugLog?t(a,"LOG"):a,ae.warn=l.debugLog?t(s,"WARN"):s,ae.error=l.debugLog?t(c,"ERROR"):c):(ae.debug=l.debugLog?t(u,"DEBUG"):u,ae.log=l.debugLog?t(p,"LOG"):p,ae.warn=l.debugLog?t(m,"WARN"):m,ae.error=l.debugLog?t(h,"ERROR"):h)}ae.toggle=z;function Te(ne,...Y){switch(ne){case"DEBUG":(0,ae.debug)(...Y);break;case"LOG":(0,ae.log)(...Y);break;case"WARN":(0,ae.warn)(...Y);break;case"ERROR":(0,ae.error)(...Y);break}}ae.send=Te;function De(ne,...Y){}ae.test=De})(oa||(oa={}));var d=oa;var Hs="kf";function Jt(n){return n.stopStream}function ca(n){return n.keyFrameRequested}function ln(n){if(Jt(n))return"ss";if(ca(n))return Hs;let r="";return n.priority!==void 0&&(r+="p="+n.priority),n.width!==void 0&&n.height!==void 0&&(r!==""&&(r+=":"),r+="sz="+Math.round(n.width)+"x"+Math.round(n.height)),n.fit!==void 0&&(r!==""&&(r+=":"),r+="fit="+n.fit),r}var Yt=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(Yt||{}),pn="s",un="m";function tt(n){return n.participantId+(n.mediaType?Gt+pn+n.mediaType:"")+(n.streamName?Gt+un+n.streamName:"")}function Qt(n){let r=n.split(Gt),e=r.shift();if(!e)throw new Error("Illegal stream description: "+n);let t=null,i,a=0;for(let c of r)switch(c.charAt(0)){case pn:t=Gs(c.slice(1));break;case un:i=c.slice(1);break;case $i:a=Number.parseInt(c.slice(1),10);break;default:throw new Error("Unexpected parameter type "+c.charAt(0)+" in stream description "+n)}return{participantId:I.compose(e,a),mediaType:t,streamName:i}}function Gs(n){for(let r of Object.keys(Yt))if(r===n)return Yt[r];return null}function it(){let n=new DataView(new ArrayBuffer(64)),r=0;function e(t){if(r+t>n.byteLength){let i=new Uint8Array(Math.max(r+t,n.byteLength+64));i.set(new Uint8Array(n.buffer.slice(0,r))),n=new DataView(i.buffer)}}return{put(t){if(e(t.byteLength),Ws(t)){let i=t.buffer;new Uint8Array(n.buffer).set(new Uint8Array(i),r)}else new Uint8Array(n.buffer).set(new Uint8Array(t),r);r+=t.byteLength},putI8(t){e(1),n.setInt8(r,t),++r},putI16(t){e(2),n.setInt16(r,t),r+=2},putI32(t){e(4),n.setInt32(r,t),r+=4},putI64(t){e(8);let i=t<0;i&&(t=-t);let a=t/4294967296|0,s=t%4294967296|0;i&&(s=~s+1|0,a=s===0?~a+1|0:~a),n.setUint32(r,a),n.setUint32(r+4,s),r+=8},putUi8(t){e(1),n.setUint8(r,t),++r},putUi16(t){e(2),n.setUint16(r,t),r+=2},putUi32(t){e(4),n.setUint32(r,t),r+=4},putUi64(t){e(8),n.setUint32(r,t/4294967296|0),n.setUint32(r+4,t%4294967296),r+=8},putF(t){e(8),n.setFloat64(r,t),r+=8},ui8array(){return new Uint8Array(n.buffer.slice(0,r))}}}function Ws(n){return n.buffer!==void 0}function mr(n){let r=ArrayBuffer.isView(n)?new DataView(n.buffer,n.byteOffset,n.byteLength):new DataView(n),e=0;return{peek(){return r.getUint8(e)},get(t){e+=t;let i=r.byteOffset;return r.buffer.slice(i+e-t,i+e)},getI8(){return r.getInt8(e++)},getI16(){return e+=2,r.getInt16(e-2)},getI32(){return e+=4,r.getInt32(e-4)},getI64(){e+=8;let t=r.getInt32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getUi8(){return r.getUint8(e++)},getUi16(){return e+=2,r.getUint16(e-2)},getUi32(){return e+=4,r.getUint32(e-4)},getUi64(){e+=8;let t=r.getUint32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getF32(){return e+=4,r.getFloat32(e-4)},getF64(){return e+=8,r.getFloat64(e-8)}}}var gn=0,_n=1,$s=2,qs=3,zs=4,Js=5,Ys=6,Qs=7,Xs=0,Zs=1,eo=2,st=0,to=0,io=0,ro=1,hr=class{constructor(){o(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=it();G.enc(t,gn),G.enc(t,st),G.enc(t,r),Dt.enc(t,null);let i=[];for(let a in e)Object.hasOwn(e,a)&&this.writeLayout(e,a,i);return mn.enc(t,i),Dt.enc(t,null),t.ui8array().buffer}writeLayout(r,e,t){let i=r[e],a=it();if(this.writeStreamDesc(e,a),Jt(i))G.enc(a,Zs);else if(ca(i))G.enc(a,eo);else if(G.enc(a,Xs),i.priority!==void 0?G.enc(a,i.priority):Dt.enc(a,null),i.width!==void 0&&i.height!==void 0?(G.enc(a,Math.round(i.width)),G.enc(a,Math.round(i.height))):(Dt.enc(a,null),Dt.enc(a,null)),i.fit!==void 0)switch(i.fit){case"cv":G.enc(a,io);break;case"cn":G.enc(a,ro);break;default:Dt.enc(a,null)}else Dt.enc(a,null);t.push(a.ui8array().buffer)}writeStreamDesc(r,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(r);if(t!==void 0){G.enc(e,t);return}}hn.enc(e,r)}serializePerfStatReport(r,e){let t=it();return G.enc(t,_n),G.enc(t,st),G.enc(t,r),G.enc(t,e.framesDecoded),G.enc(t,e.framesReceived),t.ui8array().buffer}serializeSharingStatReport(r,e){let t=it();return G.enc(t,$s),G.enc(t,st),G.enc(t,r),G.enc(t,e.minDelay),G.enc(t,e.maxDelay),G.enc(t,e.avgDelay),G.enc(t,e.largeDelayDuration),t.ui8array().buffer}serializeRequestAsr(r,e){let t=it();return G.enc(t,qs),G.enc(t,st),G.enc(t,r),da.enc(t,e.request),t.ui8array().buffer}serializeNetworkStatReport(r,e){let t=it();return G.enc(t,zs),G.enc(t,st),G.enc(t,r),G.enc(t,e.timestamp),G.enc(t,e.sendBitrate),t.ui8array().buffer}serializeEnableVideoSuspend(r,e){let t=it();return G.enc(t,Js),G.enc(t,st),G.enc(t,r),da.enc(t,e.enabled),t.ui8array().buffer}serializeEnableVideoSuspendSuggest(r,e){let t=it();return G.enc(t,Ys),G.enc(t,st),G.enc(t,r),da.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=it();G.enc(t,Qs),G.enc(t,st),G.enc(t,r);let i=e.simulcastInfo.streams.length;G.enc(t,e.mediaSource),G.enc(t,i);for(let a of e.simulcastInfo.streams)hn.enc(t,a.rid),G.enc(t,a.width),G.enc(t,a.height),G.enc(t,a.fps),G.enc(t,a.bitrate/1e3);return t.ui8array().buffer}async deserializeCommandResponse(r){let e;if(r instanceof Blob){let s="arrayBuffer"in Blob.prototype?await r.arrayBuffer():await Ya(r);e=mr(s)}else e=mr(r);let t=G.dec(e),i=G.dec(e);if(i!==st){d.warn("Unsupported version for command type: "+t+", version "+i);return}if(G.dec(e)!==to){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case gn:return this.deserializeUpdateDisplayLayoutResponse(e);case _n:return this.deserializeReportPerfStatResponse(e);default:d.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(r){let e=G.dec(r),t=mn.dec(r),i={};return t.forEach(a=>{let s=mr(a),c=Ks.dec(s);if(typeof c=="string")i[c]=G.dec(s);else{let u=c,p=tt(this.participantIdRegistry?.getStreamDescription(u));i[p]=G.dec(s)}}),{type:"response",sequence:e,response:x.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:i}}deserializeReportPerfStatResponse(r){let e=G.dec(r),t=G.dec(r);return{type:"response",sequence:e,response:x.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var fn=(Y=>(Y.CALL_FINISH="call_finish",Y.CODEC_USAGE="codec_usage",Y.SIGNALING_CONNECTED="signaling_connected",Y.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",Y.FIRST_MEDIA_RECEIVED="first_media_received",Y.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",Y.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",Y.CALL_START="call_start",Y.SIGNALING_PING_SUMMARY="signaling_ping_summary",Y.SIGNALING_COMMAND_SUMMARY="signaling_command_summary",Y.WEBSOCKET_CONNECTED="websocket_connected",Y.WEBSOCKET_RECONNECTED="websocket_reconnected",Y.WEBSOCKET_FAILED_PINGS="websocket_failed_pings",Y.WEBSOCKET_FAILED_EXCEPTION="websocket_failed_exception",Y.WEBSOCKET_TIMEOUT="websocket_timeout",Y.WEBSOCKET_RESTART="websocket_restart",Y.WEBTRANSPORT_CONNECTED="webtransport_connected",Y.WEBTRANSPORT_RECONNECTED="webtransport_reconnected",Y.WEBTRANSPORT_FAILED_PINGS="webtransport_failed_pings",Y.WEBTRANSPORT_FAILED_EXCEPTION="webtransport_failed_exception",Y.WEBTRANSPORT_TIMEOUT="webtransport_timeout",Y.WEBTRANSPORT_RESTART="webtransport_restart",Y))(fn||{}),X=fn;var ao=1e3;function pe(n,r,e=0){return r in n&&n[r]?n[r]:e}function la(...n){return r=>{for(let e of n)if(e(r))return!0;return!1}}function _t(n,r){return e=>e[n]===r}function no(n){return(r,e)=>e[n]-r[n]}function vi(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function Sn(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function ua(n){return Object.keys(n).filter(r=>n[r]!==void 0).map(r=>[r,n[r]]).reduce((r,e)=>(r[e[0]]=I.isObject(e[1])?ua(e[1]):e[1],r),{})}function vn(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function so(n){let r=[];return RTCRtpReceiver.prototype.getStats?(r.push(...n.getReceivers().map(e=>e.getStats())),r.push(...n.getSenders().map(e=>e.getStats()))):r.push(n.getStats()),Promise.all(r).then(vn).then(Sn)}function In(n){let r=n.filter(_t("type","candidate-pair")).sort(no("priority")).find(la(_t("nominated",!0),_t("selected",!0)));if(!r)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let e={timestamp:r.timestamp,availableOutgoingBitrate:r.availableOutgoingBitrate||0,totalRoundTripTime:r.totalRoundTripTime||0,currentRoundTripTime:r.currentRoundTripTime||0,bytesSent:r.bytesSent||0,bytesReceived:r.bytesReceived||0},t=n.find(_t("id",r.remoteCandidateId));t&&Object.assign(e,{remote:{type:t.candidateType,address:t.ip||t.address,port:t.port,protocol:t.protocol}});let i=n.find(_t("id",r.localCandidateId));return i&&Object.assign(e,{local:{type:i.candidateType,address:i.ip||i.address,port:i.port,protocol:i.protocol,relayProtocol:i.relayProtocol,networkType:i.networkType}}),ua(e)}function pa(n,r,e=!1){let t=vi("id",n),i=e?n.filter(la(_t("type","remote-inbound-rtp"))):n.filter(la(_t("type","inbound-rtp"),_t("type","outbound-rtp")));return b.browserName()==="Firefox"&&(i=Object.values(i.reduce((a,s)=>{if(!a[s.ssrc])a[s.ssrc]=s;else{let c=Object.assign({},a[s.ssrc],s),u=a[s.ssrc].isRemote?s:a[s.ssrc];c.id=u.id,c.type=u.type,delete c.isRemote,delete c.remoteId,a[c.ssrc]=c}return a},{}))),i.map(a=>{let s=Number(a.ssrc),c=a.mediaType||a.kind,u=a.remoteId||a.trackId,p=a.type,m=a.codecId;if(!p||!s||!c)return null;let h={ssrc:s,type:p,kind:c,bytesReceived:pe(a,"bytesReceived"),bytesSent:pe(a,"bytesSent"),headerBytesReceived:pe(a,"headerBytesReceived"),headerBytesSent:pe(a,"headerBytesSent"),jitter:pe(a,"jitter"),packetsLost:pe(a,"packetsLost"),packetsReceived:pe(a,"packetsReceived"),packetsSent:pe(a,"packetsSent"),fractionLost:pe(a,"fractionLost"),pliCount:pe(a,"pliCount"),firCount:pe(a,"firCount"),nackCount:pe(a,"nackCount"),userId:r[s],freezeCount:pe(a,"freezeCount",0),totalFreezesDuration:pe(a,"totalFreezesDuration",0)},E="mid"in a&&typeof a.mid=="string"?a.mid:void 0,P="rid"in a&&typeof a.rid=="string"?a.rid:void 0;if(E&&(h.mid=E),P&&(h.rid=P),c==="video"){let C=pe(a,"framesDecoded"),H=pe(a,"totalInterFrameDelay"),K=pe(a,"totalSquaredInterFrameDelay"),z=pe(a,"encoderImplementation"),Te=pe(a,"decoderImplementation");z&&(h.encoderImplementation=z),Te&&(h.decoderImplementation=Te),h.interframeDelayVariance=(K-H*H/C)/C}if(c==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=pe(a,"totalEncodeTime")??0),c==="audio"&&(h.totalSamplesReceived=pe(a,"totalSamplesReceived"),h.concealedSamples=pe(a,"concealedSamples"),h.insertedSamplesForDeceleration=pe(a,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=pe(a,"removedSamplesForAcceleration"),h.silentConcealedSamples=pe(a,"silentConcealedSamples"),h.concealmentEvents=pe(a,"concealmentEvents"),h.totalAudioEnergy=pe(a,"totalAudioEnergy")),m&&t[m]){let C=t[m];h.clockRate=C.clockRate,h.mimeType=C.mimeType,c==="audio"&&C.sdpFmtpLine&&(h.sdpFmtpLine=C.sdpFmtpLine)}if(u&&t[u]){let C=t[u];h.frameHeight=C.frameHeight,h.frameWidth=C.frameWidth,h.framesDecoded=C.framesDecoded,h.framesReceived=C.framesReceived,h.framesDropped=C.framesDropped}return ua(h)}).filter(a=>!!a)}function En(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=vi("ssrc",n?.remoteRtps||[]),i=vi("ssrc",r?.remoteRtps||[]));let a=vi("ssrc",n.rtps),s=vi("ssrc",r.rtps),c=(n.timestamp-r.timestamp)/1e3;return!a||!s||Object.keys(a).forEach(u=>{let p=a[u],m=s[u];if(!(!p||!m)){if(p.bytesReceived&&p.bytesReceived>m.bytesReceived&&(p.bandwidth=Math.round((p.bytesReceived-m.bytesReceived)/c),p.bandwidth+=Math.round((p.headerBytesReceived-m.headerBytesReceived)/c)),p.bytesSent&&p.bytesSent>m.bytesSent&&(p.bandwidth=Math.round((p.bytesSent-m.bytesSent)/c),p.bandwidth+=Math.round((p.headerBytesSent-m.headerBytesSent)/c)),p.packetsReceived)if(p.packetsReceived>m.packetsReceived||p.packetsLost>m.packetsLost){let h=p.packetsLost-m.packetsLost,E=p.packetsReceived-m.packetsReceived;p.packetLoss=parseFloat((100*h/(h+E)).toFixed(2))}else p.packetLoss=0;if(p.freezeCount>m.freezeCount&&(p.freezeCountDelta=p.freezeCount-m.freezeCount),p.totalFreezesDuration>m.totalFreezesDuration){let h=p.totalFreezesDuration-m.totalFreezesDuration;p.totalFreezesDurationDelta=h}if(p.framesDropped&&m.framesDropped&&p.framesDropped>m.framesDropped&&(p.framesDroppedDelta=parseFloat(((p.framesDropped-m.framesDropped)/c).toFixed(0))),e&&p.type==="outbound-rtp"&&p.kind==="video"){let h=t?.[u],E=i?.[u],P=K=>K??0,C=Math.max(0,P(h?.packetsLost)-P(E?.packetsLost)),H=Math.max(1,p.packetsSent-m.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(C/H*100)}}}}),n}async function Tn(n,r,e={},t=!1){let i=await so(n),a={timestamp:Date.now(),transport:In(i),rtps:pa(i,e)};return t&&(a.remoteRtps=pa(i,e,!0)),r?En(a,r,t):(await I.delay(ao),Tn(n,a,e,t))}function oo(n){performance.clearMarks(n),performance.mark(n)}function co(n){performance.clearMarks(n)}function lo(n){let r=performance.getEntriesByName(n)[0];if(typeof r>"u")return null;let e=Math.round(performance.now()-r.startTime);return performance.clearMarks(n),e}function po(n){return`${X.SCREENSHARE_FIRST_FRAME}_${uo(n)}`}function uo(n){return typeof n=="string"?n:JSON.stringify(n)}var ue={distinctById:Sn,rtcStatsToArray:vn,extractTransport:In,extractRtps:pa,delta:En,collectStats:Tn,setMark:oo,clearMark:co,measureMark:lo,getMarkNameScreenshareFirstFrame:po};var ze=class ze{constructor(){o(this,"_eventualLogs",new Set)}static create(){ze._instance=new ze}static logCallStat(r){if(ze._instance?._eventualLogs.size){for(let e of ze._instance._eventualLogs)Object.assign(e,{call_topology:r.call_topology,local_address:r.local_address,local_connection_type:r.local_connection_type,network_type:r.network_type,remote_address:r.remote_address,remote_connection_type:r.remote_connection_type,transport:r.transport}),R.logClientStats(e);ze._instance._eventualLogs.clear()}R.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=ue.measureMark(r.name)),r.value!==null&&ze._instance?._eventualLogs.add(r)}static destroy(){ze._instance?._destroy(),ze._instance=null}_destroy(){this._eventualLogs.clear()}};o(ze,"_instance",null);var be=ze;var ma={connected:{wt:X.WEBTRANSPORT_CONNECTED,ws:X.WEBSOCKET_CONNECTED},reconnected:{wt:X.WEBTRANSPORT_RECONNECTED,ws:X.WEBSOCKET_RECONNECTED},failed_pings:{wt:X.WEBTRANSPORT_FAILED_PINGS,ws:X.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:X.WEBTRANSPORT_FAILED_EXCEPTION,ws:X.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:X.WEBTRANSPORT_TIMEOUT,ws:X.WEBSOCKET_TIMEOUT},restart:{wt:X.WEBTRANSPORT_RESTART,ws:X.WEBSOCKET_RESTART}};var Ii=class{constructor(r){o(this,"q");o(this,"inits",[]);o(this,"n",[1,2,3,4,5]);o(this,"np",[1,1,1,1,1]);o(this,"qv",[]);if(!(r>0&&r<1))throw new Error("q must be in (0,1)");this.q=r}add(r){if(this.inits.length<5){this.inits.push(r),this.inits.length===5&&this.bootstrap();return}let e=0;if(r<this.qv[0])this.qv[0]=r,e=0;else if(r>=this.qv[4])this.qv[4]=r,e=3;else for(;!(r<this.qv[e+1]);)e++;for(let t=0;t<5;t++)this.n[t]+=t<=e?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 t=1;t<=3;t++){let i=this.np[t]-this.n[t];if(i>=1&&this.n[t+1]-this.n[t]>1||i<=-1&&this.n[t]-this.n[t-1]>1){let a=Math.sign(i),s=this.qv[t]+a/(this.n[t+1]-this.n[t-1])*((this.n[t]-this.n[t-1]+a)*(this.qv[t+1]-this.qv[t])/(this.n[t+1]-this.n[t])+(this.n[t+1]-this.n[t]-a)*(this.qv[t]-this.qv[t-1])/(this.n[t]-this.n[t-1]));s>this.qv[t-1]&&s<this.qv[t+1]?this.qv[t]=s:this.qv[t]=this.qv[t]+a*(this.qv[t+a]-this.qv[t])/(this.n[t+a]-this.n[t]),this.n[t]+=a}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let r=[...this.inits].sort((a,s)=>a-s),e=this.q*(r.length-1),t=Math.floor(e),i=e-t;return t+1<r.length?r[t]*(1-i)+r[t+1]*i:r[t]}return this.qv[2]}bootstrap(){this.inits.sort((r,e)=>r-e),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]}};var gr=class{constructor(){o(this,"n",0);o(this,"mean",0)}add(r){this.n++;let e=r-this.mean;this.mean+=e/this.n}get avg(){return this.n?this.mean:NaN}};var ot=class{constructor(){o(this,"count",0);o(this,"minVal",1/0);o(this,"maxVal",-1/0);o(this,"mean",new gr);o(this,"p50",new Ii(.5));o(this,"p95",new Ii(.95))}add(r){r<this.minVal&&(this.minVal=r),r>this.maxVal&&(this.maxVal=r),this.mean.add(r),this.p50.add(r),this.p95.add(r),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}};var Rn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(Rn||{}),Ae=Rn;var Cn=(S=>(S.TRANSMITTED_DATA="transmitted-data",S.ACCEPTED_CALL="accepted-call",S.HUNGUP="hungup",S.PARTICIPANT_ADDED="participant-added",S.PARTICIPANT_JOINED="participant-joined",S.CLOSED_CONVERSATION="closed-conversation",S.MEDIA_SETTINGS_CHANGED="media-settings-changed",S.PARTICIPANT_STATE_CHANGED="participant-state-changed",S.PARTICIPANTS_STATE_CHANGED="participants-state-changed",S.RATE_CALL_DATA="rate-call-data",S.FEATURE_SET_CHANGED="feature-set-changed",S.TOPOLOGY_CHANGED="topology-changed",S.PRODUCER_UPDATED="producer-updated",S.CONSUMER_ANSWERED="consumer-answered",S.MULTIPARTY_CHAT_CREATED="multiparty-chat-created",S.FORCE_MEDIA_SETTINGS_CHANGE="force-media-settings-change",S.SETTINGS_UPDATE="settings-update",S.VIDEO_QUALITY_UPDATE="video-quality-update",S.REGISTERED_PEER="registered-peer",S.SWITCH_MICRO="switch-micro",S.RECORD_STARTED="record-started",S.RECORD_STOPPED="record-stopped",S.REALLOC_CON="realloc-con",S.AUDIO_ACTIVITY="audio-activity",S.SPEAKER_CHANGED="speaker-changed",S.STALLED_ACTIVITY="stalled-activity",S.CHAT_MESSAGE="chat-message",S.CUSTOM_DATA="custom-data",S.ROLES_CHANGED="roles-changed",S.MUTE_PARTICIPANT="mute-participant",S.PIN_PARTICIPANT="pin-participant",S.OPTIONS_CHANGED="options-changed",S.NETWORK_STATUS="network-status",S.PARTICIPANT_SOURCES_UPDATE="participant-sources-update",S.PROMOTE_PARTICIPANT="promote-participant",S.CHAT_ROOM_UPDATED="chat-room-updated",S.PROMOTION_APPROVED="promotion-approved",S.JOIN_LINK_CHANGED="join-link-changed",S.FEEDBACK="feedback",S.MOVIE_UPDATE_NOTIFICATION="movie-update-notification",S.MOVIE_SHARE_STARTED="movie-share-started",S.MOVIE_SHARE_STOPPED="movie-share-stopped",S.URL_SHARING_INFO_UPDATED="url-sharing-info-updated",S.ROOM_UPDATED="room-updated",S.ROOMS_UPDATED="rooms-updated",S.ROOM_PARTICIPANTS_UPDATED="room-participants-updated",S.FEATURES_PER_ROLE_CHANGED="features-per-role-changed",S.PARTICIPANT_ANIMOJI_CHANGED="participant-animoji-changed",S.ASR_STARTED="asr-started",S.ASR_STOPPED="asr-stopped",S.DECORATIVE_PARTICIPANT_ID_CHANGED="decorative-participant-id-changed",S.VIDEO_SUSPEND_SUGGEST="video-suspend-suggest",S))(Cn||{}),L=Cn;var yn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(yn||{}),ct=yn;var{isObject:Pn,isObjectsEquals:mo}=I;function _r(n,r){return n===null||r===null?n===null&&r===null:n.maxDimension!==r.maxDimension||n.maxBitrateK!==r.maxBitrateK||n.maxFramerate!==r.maxFramerate||n.degradationPreference!==r.degradationPreference||n.scalabilityMode!==r.scalabilityMode||Pn(n.bitrates)&&Pn(r.bitrates)&&!mo(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function fr(n,r){return!(!_r(n.camera,r.camera)||!_r(n.screenSharing,r.screenSharing)||!_r(n.fastScreenSharing,r.fastScreenSharing))}function ha(n,r){return{camera:Object.assign({},n.camera,r.camera),screenSharing:Object.assign({},n.screenSharing,r.screenSharing),fastScreenSharing:Object.assign({},n.fastScreenSharing,r.fastScreenSharing)}}function bn(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var ft=class ft{constructor(){o(this,"_codecUsages",new Map);o(this,"getCurrentTransportTopology",()=>{})}static create(r){let e=new ft;e.getCurrentTransportTopology=r,ft._instance=e}static reportUsage(r){let e=ft._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let i=r.rtps.filter(a=>a.type==="outbound-rtp"&&!a.mid?.endsWith("s"));l.simulcast&&(i=i.reduce((a,s)=>{if(s.kind!=="video")return a.concat(s);let c=a.find(u=>u.kind==="video");return c?c.totalEncodeTime=(c.totalEncodeTime??0)+(s.totalEncodeTime??0):a.push(s),a},[])),i.forEach(a=>{let s=a.kind,c=a.mimeType;if((s==="audio"||s==="video")&&c){let u=a.encoderImplementation,p=[c,"encoder",u].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:p,totalEncodeTime:(a.totalEncodeTime??0)*1e3,audioCodecParams:a.sdpFmtpLine,topology:t})}})}saveUsage({kind:r,codecName:e,totalEncodeTime:t,audioCodecParams:i,topology:a}){let s=this._codecUsages.get(r);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(r,{...s,totalEncodeTime:t,topology:a});return}this._codecUsages.set(r,{kind:r,codecName:e,audioCodecParams:i,totalEncodeTime:t,topology:a})}report(r){if(r.kind==="video"&&r.totalEncodeTime===0)return;let e={name:X.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),R.logClientStats(e)}static destroy(){ft._instance?._destroy(),ft._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};o(ft,"_instance",null);var rt=ft;var wt=class extends ce{constructor(e,t){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_state","IDLE");o(this,"_pc",null);this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var An="videochat-epi",ho=5e3,go=500,St=class extends ce{constructor(e,t,i=!1){super();o(this,"_previousPerfStatReportTimestamp",0);o(this,"_previousNetworkStatReportTimestamp",Date.now());o(this,"_previousCallStatReportTimestamp",Date.now());o(this,"_previousCallStatReport",null);o(this,"_screenShareStats",[]);o(this,"_signaling");o(this,"_directTopology");o(this,"_handleScreenSharingStat",e=>{this._screenShareStats.push(e)});o(this,"_handleTransportStateChanged",e=>{(this._directTopology&&e==="CONNECTED"||!this._directTopology&&e==="OPENED")&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())});this._signaling=t,this._directTopology=i,this.subscribe(e,"REMOTE_DATA_STATS",this._handleStats.bind(this)),this.subscribe(e,"SCREEN_SHARING_STAT",this._handleScreenSharingStat.bind(this)),this.subscribe(e,"STATE_CHANGED",this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(An)||"",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&&l.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+ho<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+go<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),l.callStatReportEnabled&&this._previousCallStatReportTimestamp+l.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((i,a)=>(a.kind==="video"&&(i.framesDecoded+=a.framesDecoded||0,i.framesReceived+=a.framesReceived||0),i),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let i=await this._signaling.reportPerfStat(t);localStorage.setItem(An,i.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((i,a)=>i+(a.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:Dn(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:Dn(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let i=!1,a=!1;for(e.inbound.rtps.reduce((p,m)=>(m.kind==="video"?(i=!0,m.framesReceived&&(p.jitter_video=p.jitter_video*p.inbound_video_count/(p.inbound_video_count+1)+m.jitter*1e3/(p.inbound_video_count+1),p.interframe_delay_variance=p.interframe_delay_variance*p.inbound_video_count/(p.inbound_video_count+1)+(m.interframeDelayVariance||0)*1e6/(p.inbound_video_count+1),p.inbound_video_count++),p.frames_dropped+=m.framesDropped||0,p.nack_sent+=m.nackCount,p.pli_sent+=m.pliCount,p.fir_sent+=m.firCount,p.freeze_count+=m.freezeCountDelta||0,p.total_freezes_duration+=m.totalFreezesDurationDelta||0):(a=!0,m.totalSamplesReceived&&(p.jitter_audio=p.jitter_audio*p.inbound_audio_count/(p.inbound_audio_count+1)+m.jitter*1e3/(p.inbound_audio_count+1),p.total_audio_energy=p.total_audio_energy*p.inbound_audio_count/(p.inbound_audio_count+1)+(m.totalAudioEnergy||0)/(p.inbound_audio_count+1),p.inbound_audio_count++),p.total_audio_samples_received+=m.totalSamplesReceived||0,p.inserted_audio_samples_for_deceleration+=m.insertedSamplesForDeceleration||0,p.removed_audio_samples_for_acceleration+=m.removedSamplesForAcceleration||0,p.concealed_audio_samples+=m.concealedSamples||0,p.silent_concealed_audio_samples+=m.silentConcealedSamples||0,p.audio_concealment_events+=m.concealmentEvents||0),p),t),e.outbound.rtps.reduce((p,m)=>(m.kind==="video"?(p.nack_received+=m.nackCount,p.pli_received+=m.pliCount,p.fir_received+=m.firCount,p.packets_sent_video+=m.packetsSent):p.packets_sent_audio+=m.packetsSent,p),t),e.remoteInbound.rtps.reduce((p,m)=>(m.kind==="video"?p.packets_lost_video+=m.packetsLost:p.packets_lost_audio+=m.packetsLost,p),t);this._screenShareStats.length;){let p=this._screenShareStats.pop();p?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=p.freeze_duration)}let s={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(navigator.hardwareConcurrency&&(s.cpu_hardware_concurrency=navigator.hardwareConcurrency),i&&!Sr(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!Sr(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!Sr(t.interframe_delay_variance)&&(s.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(s.freeze_count=t.freeze_count,s.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(s.ss_freeze_count=t.ss_freeze_count,s.ss_total_freezes_duration=t.ss_total_freezes_duration),a&&!Sr(t.total_audio_samples_received)){let p=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),m=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),h=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),E=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),P=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),C=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=kt(m/p*1e3),s.removed_audio_samples_for_acceleration=kt(h/p*1e3),s.concealed_audio_samples=kt(E/p*1e3),s.concealed_silent_audio_samples=kt(P/p*1e3),s.concealment_audio_avg_size=kt(E/C),s.total_audio_energy=t.total_audio_energy}Mn(t,"local_address","local_connection_type","network_type","transport")&&(s.local_address=t.local_address,s.local_connection_type=t.local_connection_type,s.network_type=t.network_type,s.transport=t.transport),Mn(t,"remote_address","remote_connection_type")&&(s.remote_address=t.remote_address,s.remote_connection_type=t.remote_connection_type);let c=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),u=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(c>0){let p=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=kt(p/c*100)}if(u>0){let p=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=kt(p/u*100)}be.logCallStat(s),l.enableLogPerfStatReport&&d.log("Sent call stats",s),this._previousCallStatReport=t}};function Mn(n,...r){for(let e of r)if(!Object.hasOwn(n,e)||n[e]===void 0)return!1;return!0}function Dn(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function Sr(n){return n===void 0}function kt(n){return Number.isNaN(n)?0:n}var Ti=class{constructor(r,e=null){o(this,"weightUp");o(this,"weightDown");o(this,"value",NaN);this.weightUp=r,this.weightDown=e??r}set(r){this.value=r}update(r){return this.value=Number.parseFloat(this.getNext(r).toFixed(3)),this.value}getNext(r){if(isNaN(this.value))return r;let e=r<this.value?this.weightDown:this.weightUp;return this.value*(1-e)+r*e}getValue(){return this.value}};var wn=.25,kn=.35,_o=85,fo=.1,So=1.5,vo=.1,Io=1,Eo=.6,To=.3;var Ri=class extends ce{constructor(e){super();o(this,"_signaling");o(this,"_localNetworkStat");o(this,"_remoteNetworkStat");o(this,"_lastNetworkStat");o(this,"_networkLimits",{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}});o(this,"_lastStatSentTimestamp",0);o(this,"_currentState","good");this._signaling=e,this._localNetworkStat={rtt:new Ti(wn,wn),loss:new Ti(kn,kn),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(),i=1;if(isNaN(t))return i;let a=Math.round((t-this._networkLimits.goodNet.rtt)/_o);for(let s=0;s<a;s++)i*=1-fo;return i}_calcLossRating(e){let t=typeof e=="number"?e:e.getValue(),i=1;if(isNaN(t))return i;let a=Math.round((t-this._networkLimits.goodNet.loss)/So);for(let s=0;s<a;s++)i*=1-vo;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*Io;return Math.min(a,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,i){return i?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=Eo?"good":e>=To?"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",i=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),a=e.inbound.rtps.reduce((h,E)=>Math.max(h,E.packetLoss||0),0),s={rtt:this._localNetworkStat.rtt.update(i),loss:this._localNetworkStat.loss.update(a)};if(t){let h=e.outbound.rtps.reduce((E,P)=>E+(P.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let c=Date.now(),u=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),p=Math.max(Math.round(u*10)/10,.1),m=this._getNetworkState(p);(t||m!==this._currentState||c-this._lastStatSentTimestamp>l.networkStatisticsInterval)&&(this._lastStatSentTimestamp=c,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{d.warn("Unable to send [bad-net]",h)})),this._currentState=m,this._triggerEvent("NETWORK_STATUS",p)}reportRemote(e){let{rtt:t,loss:i,bitrate:a}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=i||0,this._remoteNetworkStat.bitrate=a||0}};var Ro=30*1e3,Ci=class n extends wt{constructor(e,t,i,a,s){super(i,a);o(this,"_participantId");o(this,"_isMaster");o(this,"_remoteSDP",{});o(this,"_remoteCandidates",{});o(this,"_lastRemoteSDP",null);o(this,"_animojiDataChannel",null);o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);o(this,"_remoteAnimojiVersion",1);o(this,"_isOpen",!1);o(this,"_remotePeerId",null);o(this,"_statInterval",null);o(this,"_settingsInterval",null);o(this,"_failedOnCreate",null);o(this,"_remoteStream",null);o(this,"_iceRestartTimeout",null);o(this,"_reconnectionTimeout",null);o(this,"_reconnectionPrevented",!1);o(this,"_lastStat");o(this,"_fingerprint",null);o(this,"_neverConnected",!0);o(this,"_serverSettings");o(this,"_prevConsumerSettings",{});o(this,"_networkLimitsForVideo",{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}});o(this,"_videoMaxDimensionsForNet",{worst:320,bad:640,good:1280});o(this,"_lastVideoMaxDimension",this._videoMaxDimensionsForNet.good);o(this,"_lastBadConnection",0);o(this,"_perfStatReporter");o(this,"_directStatReporter");this._participantId=e,this._isMaster=t,this._serverSettings=s,this._perfStatReporter=new St(this,i,!0),this._directStatReporter=new Ri(i),this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applySettings.bind(this)),this.subscribe(this._directStatReporter,"NETWORK_STATUS",this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:l.iceServers,iceTransportPolicy:l.forceRelayPolicy?"relay":"all"})}catch(c){d.error("Failed to create RTCPeerConnection:",c),this.close(c);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={},l.vmoji&&this._createDataChannel(this._pc,ct.animoji,c=>{this._animojiDataChannel=c,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(c){R.log(w.ERROR,"addTrack-direct"),d.error("Unable to add media source tracks",c,{participantId:this._participantId}),this._failedOnCreate=c;return}this._createOffer(!1).catch(c=>{this._state==="IDLE"?this._failedOnCreate=c:this.close(c)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return["IDLE","CLOSED","FAILED"].includes(this.getState())}async open(e=null){if(this._isOpen){d.warn("DirectTransport: Already opened",{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(d.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(i){R.log(w.ERROR,"addTrack-direct"),d.error("DirectTransport: Unable to add media source tracks",i,{participantId:this._participantId}),this.close(i);return}this._setState("OPENED");let t=e;if(!e){let i=Object.keys(this._remoteSDP);t=i[i.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){fr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(l.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(t=>{t.stop(),this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t)}),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?(d.error("DirectTransport: Closed",e,{participantId:this._participantId}),this._setState("FAILED")):(d.debug("DirectTransport: Closed",{participantId:this._participantId}),this._setState("CLOSED")),this._triggerEvent("PEER_CONNECTION_CLOSED"))}_setState(e){this._state!==e&&(d.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent("STATE_CHANGED",e))}_onSignalingNotification(e){switch(e.notification){case L.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case L.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case L.CUSTOM_DATA:Object.hasOwn(e.data,"sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,i=I.getPeerIdString(e.peerId);I.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(i,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(i,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){d.debug("Add remote ice candidate",{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(i){throw R.log(w.ERROR,"addIceCandidate-direct"),d.error("Unable to add remote ice candidate",i,{participantId:this._participantId,candidate:t}),i}}else d.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]){d.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let i of t)try{await this._addIceCandidate(e,i)}catch{}}async _setRemoteDescription(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc){if(this._lastRemoteSDP?.sdp===t.sdp)return;this._lastRemoteSDP=t,t=n._patchRemoteDescription(t),d.debug("Add remote description",{participantId:this._participantId,sdp:t}),this._calcFingerprint(t.sdp);try{await this._pc.setRemoteDescription(t),await this._setRemoteCandidates(e),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(i){throw R.log(w.ERROR,"setRemoteDescription-direct"),d.error("Unable to set remote description",i,{participantId:this._participantId,sdp:t}),i}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,l.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){d.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=t=>{this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t.track)}),this._triggerEvent("REMOTE_TRACK_ADDED",this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(d.debug("Local ice candidate",{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){d.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:l.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(new Error);break;case"have-remote-offer":this._createAnswer().then(i=>this._signaling.sendSdp(this._participantId,i,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(d.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case"checking":let e=this.getState();e==="IDLE"||e==="OPENED"?this._setState("CONNECTING"):this._setState("RECONNECTING");break}}_onConnectionStateChange(){switch(d.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),R.log(w.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),I.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(R.log(w.ICE_CONNECTION_TYPE,e.local.type),d.debug("Selected ICE candidates",e))}),this._startStatInterval();break;case"failed":case"disconnected":this._reconnectionPrevented?this.close(new Error(`Ice connection ${this._pc.connectionState}`)):(this._setState("RECONNECTING"),this._startReconnection());break;case"closed":this.close(new Error("Ice connection closed"));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(d.log("Waiting for reconnection...",{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},l.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(d.log("Switch topology DIRECT to SERVER",{participantId:this._participantId}),this._signaling.switchTopology("SERVER"))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(R.log(w.ICE_RESTART),d.log("Ice restart",{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):d.debug("Waiting for ice restart...",{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,d.error("Ice restart failed",{participantId:this._participantId}),R.log(w.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},l.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};d.debug("Create offer",{participantId:this._participantId,options:t});let i;try{i=await this._pc?.createOffer(t),d.debug("Created offer",{participantId:this._participantId,offer:i}),i=n._patchLocalDescription(i)}catch(a){throw d.error("Unable to create offer",a,{participantId:this._participantId}),R.log(w.ERROR,"createOffer-direct"),a}try{return d.debug("Set local description",{participantId:this._participantId,offer:i}),this._calcFingerprint(i.sdp),await this._pc?.setLocalDescription(i),i}catch(a){throw d.error("Unable to set local description",a,{participantId:this._participantId}),R.log(w.ERROR,"setLocalDescription-direct"),a}}async _createAnswer(){d.debug("Create answer",{participantId:this._participantId});let e;try{e=await this._pc?.createAnswer(),d.debug("Created answer",{participantId:this._participantId,answer:e}),e=n._patchLocalDescription(e)}catch(t){throw d.error("Unable to create answer",t,{participantId:this._participantId}),R.log(w.ERROR,"createAnswer-direct"),t}try{return d.debug("Set local description",{participantId:this._participantId,answer:e}),this._calcFingerprint(e.sdp),await this._pc?.setLocalDescription(e),e}catch(t){throw d.error("Unable to set local description",t,{participantId:this._participantId}),R.log(w.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!b.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,l.preferH264&&b.canPreferH264(),b.isBrokenH264Decoder(),l.preferVP9,t&&l.audioNack),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,l.preferVP9,b.isBrokenVP9Encoder(),b.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(i=>{d.error("DirectTransport: Unable to replace track",i,{participantId:this._participantId}),R.log(w.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}ue.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,rt.reportUsage(t);let i={inbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="inbound-rtp"?(a.userId=this._participantId,!0):!1)},outbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="outbound-rtp")},remoteInbound:{topology:"DIRECT",transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(i),this._directStatReporter.reportLocal(i),this._triggerEvent("REMOTE_DATA_STATS",i),this._statInterval=window.setTimeout(e,l.statisticsInterval)})};this._statInterval=window.setTimeout(e,l.statisticsInterval)}async _isSVCSupported(e,t){let i=this._mediaSource.getSendVideoTrack(),a=e.outbound.rtps.find(u=>u.kind==="video");if(!a?.mimeType||!a?.bandwidth||!i)return!1;let s=i.getSettings();if(!s.width||!s.height||!s.frameRate)return!1;let c={type:b.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:s.width,height:s.height,bitrate:a.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(c)).supported||!1}catch(u){return d.warn("Failed to get encodingInfo",c,u),!1}}async _checkPPTNetwork(e){if(!l.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,i=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,a=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,s=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,c=this._videoMaxDimensionsForNet.good,u="L1T1";if(a?(this._lastBadConnection=Date.now(),s?(c=this._videoMaxDimensionsForNet.bad,u="L1T2"):(c=this._videoMaxDimensionsForNet.worst,u="L1T3")):i&&(c=this._videoMaxDimensionsForNet.good,u="L1T1"),!(c<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Ro)||this._lastVideoMaxDimension===c)return;let m=this._serverSettings.camera;if(!m||!await this._isSVCSupported(e,u))return;d.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:u,averageNetStat:t,nextVideoMaxDimension:c}),this._lastVideoMaxDimension=c;let E={...this._serverSettings,camera:{...m,scalabilityMode:u,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(E)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[""]=e,this._triggerEvent("NETWORK_STATUS",t)}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=I.sdpFingerprint(e);if(t===null){d.warn("Fingerprint calculation is unsupported");return}this._fingerprint===null?this._fingerprint=t:(v.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=I.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{negotiated:!0,id:1});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),a.onerror=c=>{d.error(`[${t}] data channel error`,c)},i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)}}};var On=(t=>(t.AUDIO_MIX="audio-mix",t.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",t.TRANSPARENT_AUDIO_TRACK_PREFIX="ta",t))(On||{}),Be=On;var Co=16,Ir=class n{constructor(r,e,t){o(this,"_datachannel");o(this,"_participantIdRegistry");o(this,"_asrCallback");o(this,"_textDecoder");d.debug("AsrReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._asrCallback=t,this._textDecoder=new TextDecoder,this._datachannel.onmessage=i=>this._onDataChannelMessage(i.data)}static parse(r){let e=new DataView(r),t=e.getUint8(0),i=e.getUint8(1);if(i!==0)throw new Error(`Unsupported message type. Message type: ${i}`);let a=e.getUint16(2),s=e.getUint32(4),c=e.getUint32(8),u=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:a,ssrc:s,timestamp:c,duration:u,data:r.slice(Co)}}_onDataChannelMessage(r){let e=n.parse(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){d.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}let i={participantId:t,text:this._textDecoder.decode(e.data),timestamp:e.timestamp,duration:e.duration};this._asrCallback(i)}destroy(){this._datachannel.onmessage=null}};var vt=class vt{constructor(){o(this,"_value",1)}get value(){return this._value}set value(r){this._value=r}};o(vt,"_instance",null),o(vt,"getInstance",()=>(vt._instance||(vt._instance=new vt),vt._instance));var Xt=vt;import{decode as It}from"messagepack";var Er=class{constructor(){o(this,"streamDescriptionByCompactId",new Map);o(this,"compactIdByStreamDescription",new Map)}getStreamDescription(r){return this.streamDescriptionByCompactId.get(r)}getCompactId(r){return this.compactIdByStreamDescription.get(r)}handleMessage(r){let e=new Uint8Array(r),t=e[0],i=e.subarray(1);switch(t){case 1:let a=It(i);return Object.entries(a).forEach(([P,C])=>{let H=Qt(P);this.streamDescriptionByCompactId.set(C,H),this.compactIdByStreamDescription.set(P,C)}),null;case 2:case 4:let s=It(i),c=[];for(let P of s){let C=this.getStreamDescription(P);C&&c.push(C.participantId)}return t===2?{type:"notification",notification:L.AUDIO_ACTIVITY,activeParticipants:c}:{type:"notification",notification:L.STALLED_ACTIVITY,stalledParticipants:c};case 3:let u=It(i);return{type:"notification",notification:L.SPEAKER_CHANGED,speaker:this.getStreamDescription(u)?.participantId};case 5:let p=It(i);return{type:"notification",notification:L.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:p[0],maxDimension:p[1]},mediaType:this._decodeMediaType(p[2])};case 6:let m=It(i),h={};for(let[P,C]of Object.entries(m)){let H=this.getStreamDescription(Number(P))?.participantId;H&&(h[H]=C/100)}return{type:"notification",notification:L.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let C=It(i).map(H=>{let[K,z,Te,De,ae,ne,Y]=H;return{participantId:this.getStreamDescription(K)?.participantId,gain:z,pause:Te,offset:De,mute:ae,liveStatus:ne,startTimeMs:Y}});return{type:"notification",notification:L.MOVIE_UPDATE_NOTIFICATION,data:C}}case 9:let E=It(i);return{type:"notification",notification:L.VIDEO_SUSPEND_SUGGEST,bandwidth:E};default:return d.debug("unsupported message type: "+t),null}}_decodeMediaType(r){if(r===null)return null;switch(r){case 0:return"CAMERA";case 1:return"SCREEN";default:throw new Error(`Unsupported media type: ${r}`)}}_createParticipantSourcesUpdateNotification(r){let e=It(r),t=[];for(let[i,a]of Object.entries(e)){let s=a[0],c=a[1],u=a[2],p=!!a[3],m=a[4]!==null?!!a[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){d.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(u===null){d.error("unexpected null sequenceNumber",i,a);continue}let E=Be.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,P=c?c>>>0:null;t.push({participantStreamDescription:h,streamId:E,rtpTimestamp:P,sequenceNumber:u,fastScreenShare:p,suspend:m})}return{type:"notification",notification:L.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};import xn from"@vkontakte/libvpx";var Je=class{constructor(){o(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,c)=>{let u=t.join(","),p=new Blob([r,`exports.default(${u});`],{type:"application/javascript; charset=utf-8"}),m=window.URL.createObjectURL(p);this._worker=new Worker(m),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":c(h.data.error);break;case"frame":e(h.data);break;case"debug":d.debug(h.data.message);break;case"log_error":R.log(w.ERROR,h.data.message);break}},this._sendToWorker("init",i,a)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(r,e={},t=[]){this._worker?.postMessage(Object.assign({type:r},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var yi=class extends Je{async init(r,e,t){d.debug("LibVPxDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var h=(s,t)=>{for(var e in t)u(s,e,{get:t[e],enumerable:!0})},F=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of x(t))!M.call(s,a)&&a!==e&&u(s,a,{get:()=>t[a],enumerable:!(o=R(t,a))||o.enumerable});return s};var V=s=>F(u({},"__esModule",{value:!0}),s);var D={};h(D,{default:()=>A});var A=(s,t)=>{let e=null,o=null,a=!0,l=!1;function c(){return s({locateFile:t}).then(r=>o=r)}function m(r,f,n,g){if(!o){self.postMessage({type:"log_error",message:"decoder-init-fail-libvpx"}),self.postMessage({type:"frame",error:"Fatal initialization error"});return}if(a!==n&&(a=n,e&&(e=null,self.postMessage({type:"debug",message:`LibVPxDecoder codec changed to ${n?"VP9":"VP8"} - reinitialize`}))),!e&&(self.postMessage({type:"debug",message:`LibVPxDecoder codec ${n?"VP9":"VP8"}`}),e=new o.VpxDecoder,e.debug(g),!e.init(n?o.VpxType.VP9:o.VpxType.VP8))){e=null,self.postMessage({type:"frame",error:"Decoder failed to create"});return}try{e.allocateBuffer(f.byteLength).set(new Uint8Array(f))}catch(i){self.postMessage({type:"debug",message:i}),e=null,self.postMessage({type:"frame",error:String(i)});return}if(e.decode()&&e.nextImage())l=!1;else{self.postMessage({type:"frame",error:"Decode failed"}),b();return}let p=e.getImageBuffer();if(!p){self.postMessage({type:"frame",error:"No decoded data"});return}let y=e.getImageWidth(),E=e.getImageHeight();e.nextImage()&&(self.postMessage({type:"debug",message:"LibVPxDecoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxDecoder-drop"}));let d=new Uint8ClampedArray(p.byteLength);d.set(p),self.postMessage({type:"frame",data:d.buffer,width:y,height:E},[d.buffer])}function b(){l||(self.postMessage({type:"frame",requestKeyFrame:!0}),l=!0)}c().then(()=>{self.onmessage=r=>{switch(r.data.type){case"frame":m(r.data.timestamp,r.data.data,r.data.isVP9,r.data.debug);break}},self.postMessage({type:"ready"})}).catch(r=>{self.postMessage({type:"error",error:String(r)})})};return V(D);})();\n',i=>{if(i.error)d.warn("LibVPxDecoder",i.error),e(i.error);else if(i.requestKeyFrame)d.debug("LibVPxDecoder requests key frame"),t();else{let a=new ImageData(new Uint8ClampedArray(i.data),i.width,i.height);r(a)}},[xn,xn.getUrl])}decodeFrame(r,e,t,i){this._sendToWorker("frame",{timestamp:r,data:e.buffer,isVP9:t,keyFrame:i,debug:d.enabled()},[e.buffer])}destroy(){this._removeWorker(),d.debug("LibVPxDecoder destroyed")}static isBrowserSupported(){return"WebAssembly"in window&&"Worker"in window}};var dt=class extends Je{async init(r,e,t){d.debug("WebCodecsDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var m=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var M=(a,e)=>{for(var s in e)m(a,s,{get:e[s],enumerable:!0})},P=(a,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of C(e))!w.call(a,o)&&o!==s&&m(a,o,{get:()=>e[o],enumerable:!(n=k(e,o))||n.enumerable});return a};var B=a=>P(m({},"__esModule",{value:!0}),a);var I={};M(I,{default:()=>x});var x=a=>{let e=null,s="no-preference",n=!0,o=!1,f=!1,c=null,i=null,g=3e3;function y(){self.postMessage({type:"ready"})}function p(t,r,u,d=!1){c={timestamp:t,data:r,isVP9:u,keyFrame:d};let V=D(u);if(o&&!d){self.postMessage({type:"frame",error:"WebCodecsDecoder waiting for keyframe"}),E();return}else o&&d&&(o=!1,f=!1,self.postMessage({type:"debug",message:"WebCodecsDecoder got keyframe. Start decoding"}));let A=new EncodedVideoChunk({type:d?"key":"delta",timestamp:t,data:r});try{V.decode(A)}catch(h){l(`because failed call decode: ${h.message}`);return}F(d)}self.onmessage=t=>{switch(t.data.type){case"init":y();break;case"frame":p(t.data.timestamp,t.data.data,t.data.isVP9,t.data.keyFrame);break}};function E(){f||(self.postMessage({type:"frame",requestKeyFrame:!0}),f=!0)}function D(t){return n!==t&&(n=t,l(`because codec is changed to ${n?"VP9":"VP8"}`)),e||(o=!0,self.postMessage({type:"debug",message:`WebCodecsDecoder codec ${n?"VP9":"VP8"}`}),e=new VideoDecoder({output:r=>{b();let u=a?[r]:[];self.postMessage({type:"frame",data:r},u),r.close()},error:r=>{b(),l(`because error during decoding: ${r.message}`),s!=="prefer-software"?(s="prefer-software",c&&c.keyFrame&&p(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:"debug",message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${r.message}`})):self.postMessage({type:"frame",error:"WebCodecsDecoder failed, reinitialize: "+String(r)})}}),e.configure(R(n,s))),e}function l(t){if(e){try{e&&e.state!=="closed"&&e.close()}catch{}e=null,self.postMessage({type:"frame",error:`WebCodecsDecoder reset ${t}`})}}function F(t=!1){i=setTimeout(()=>{l("because of decode timeout")},g)}function b(){i&&clearTimeout(i),i=null}function R(t,r){return{codec:t?"vp09.00.50.08":"vp8",hardwareAcceleration:r}}};return B(I);})();\n',i=>{i.error?(d.warn("WebCodecsDecoder",i.error),e(i.error)):i.requestKeyFrame?(d.debug("WebCodecsDecoder requests key frame"),t()):(r(i.data),i.data.close())},[b.baseChromeVersion()>=92||b.browserName()==="Safari"])}decodeFrame(r,e,t,i=!1){this._sendToWorker("frame",{timestamp:r,data:e.buffer,isVP9:t,keyFrame:i},[e.buffer])}destroy(){this._removeWorker(),d.debug("WebCodecsDecoder destroyed")}static isBrowserSupported(){return"VideoDecoder"in window&&"Worker"in window&&"VideoFrame"in window&&!b.isBrokenVP9Decoder()&&b.browserName()!=="Firefox"}};var xt=class{constructor(r=null,e=0){o(this,"_counter",0);o(this,"_interval",0);o(this,"_lastCalculationTime",Date.now());o(this,"_onCalculated",null);this._onCalculated=r,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(r=1){this._counter+=r}calculate(){let r=Date.now(),e=r-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=r,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};import{BitStream as yo}from"bit-buffer";var Rr=class{constructor(r){o(this,"_participantId");o(this,"_firstFrameReceived",!1);this._participantId=r}measure(r,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=ue.getMarkNameScreenshareFirstFrame(this._participantId),i=ue.measureMark(t);i!==null&&be.logEventualStat({name:X.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Po=65536,ga="MARK_SCREENSHARE_FREEZE_DURATION",Zt=class n{constructor(r,e,t,i){o(this,"_participantId");o(this,"_onStream");o(this,"_onStat");o(this,"_onKeyFrameRequested");o(this,"_statScreenShareFirstFrame");o(this,"_chunks",[]);this._participantId=r,this._onStream=e,this._onStat=t,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new Rr(r)}appendChunk(r){let e=this._chunks.length;if(r.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),e&&(d.warn("[FrameBuilder] Cleanup buffer",Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!e||(this._chunks[e-1].sequence+1)%Po!==r.sequence){d.warn("[FrameBuilder] Got incorrect chunk");return}if(this._chunks.push(r),r.end){let t=this._processFrameData(),{width:i,height:a}=n.getFrameSize(t);this._processFrame({timestamp:r.timestamp,frameData:t,isVP9:r.isVP9,keyframe:r.keyframe,width:i,height:a}),this._statScreenShareFirstFrame.measure(i,a)}}destroy(){ue.clearMark(ga),ue.clearMark(ue.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let r=this._chunks;this._chunks=[];let e=r.reduce((a,s)=>a+s.data.byteLength,0),t=new Uint8Array(e),i=0;for(let a of r)t.set(new Uint8Array(a.data),i),i+=a.data.byteLength;return t}static getFrameSize(r){let e={width:0,height:0},t=new yo(r.buffer);t.bigEndian=!0,t.index+=2;let i=t.readBits(1),s=t.readBits(1)<<1|i;return s===3&&t.index++,t.readBits(1)===1||t.readBits(1)!==0||(t.index++,t.index++,t.index+=24,s>=2&&t.index++,t.readBits(3)!==7?(t.index++,(s===1||s===3)&&(t.index+=3)):(s===1||s===3)&&t.index++,e.width=t.readBits(16)+1,e.height=t.readBits(16)+1),e}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(r){if(r){ue.setMark(ga);return}let e=ue.measureMark(ga);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Nt=class{constructor(r){o(this,"_onStream");this._onStream=r}async drawFrame(r){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(r){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var ei=class extends Nt{constructor(e){super(e);o(this,"_useImageBitmap");o(this,"_canvas",null);o(this,"_canvasContext",null);o(this,"_stream",null);o(this,"_track",null);d.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 i;if(e instanceof ImageBitmap)i=e;else{let{width:s,height:c,data:u}=e,p=s*c*4;if(u.byteLength!==p){d.warn("Bad frame buffer",{w:s,h:c,got:u.byteLength,expected:p});return}i=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){d.warn("Canvas context is null"),i.close();return}this._canvasContext.transferFromImageBitmap(i),i.close()}else{let i=this._canvasContext;i.clearRect(0,0,t.width,t.height),i.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(),d.debug("CanvasRenderer destroyed")}static isBrowserSupported(){return("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)&&!(b.browserName()==="Safari"&&Number(b.browserVersion())===15)&&!(b.browserName()==="Firefox"&&Number(b.browserVersion())<60)}};var Lt=class extends Nt{constructor(e){super(e);o(this,"_generator");o(this,"_writer");o(this,"_stream");d.debug("TrackGeneratorRenderer started"),this._generator=new MediaStreamTrackGenerator({kind:"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()),d.debug("TrackGeneratorRenderer destroyed")}static isBrowserSupported(){return"VideoFrame"in window&&"MediaStreamTrackGenerator"in window&&dt.isBrowserSupported()}};var Pi=class extends Zt{constructor(e,t,i,a){super(e,t,i,a);o(this,"_renderer");o(this,"_decoder");o(this,"_decoderReady",!1);o(this,"_decoderBusy",!1);o(this,"_decoderQueue",[]);o(this,"_fpsMeter");d.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 xt(e=>d.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Lt.isBrowserSupported()?this._renderer=new ei(this._onStream):this._renderer=new Lt(this._onStream)}_initDecoder(e=!1){e||!dt.isBrowserSupported()?this._decoder=new yi:this._decoder=new dt;let t=async a=>{this._decoderBusy=!1,"VideoFrame"in window&&a instanceof VideoFrame?await this._renderer.drawFrame(a):await this._renderer.drawImage(a),this._fpsMeter.increment(),this._decodeQueue()},i=a=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof dt&&typeof a=="string"&&a.includes("EncodingError")&&this._switchToLibVPXDecoder()};this._decoder.init(t,i,this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()})}_switchToLibVPXDecoder(){d.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(),d.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return ei.isBrowserSupported()||Lt.isBrowserSupported()}};function Nn(n,r,e,t,i,a,s){let c=0;r&&(c|=1),e&&(c|=2),t&&(c|=4),s||(c|=8);let u=new ArrayBuffer(11),p=new DataView(u);if(p.setUint8(0,1),p.setUint16(1,i),p.setUint32(3,n),p.setUint8(7,a?1:0),p.setUint16(8,0),p.setUint8(10,c),!s)return u;let m=new Uint8Array(u.byteLength+s.byteLength);return m.set(new Uint8Array(u),0),m.set(new Uint8Array(s),u.byteLength),m.buffer}function Ln(n){let r=new DataView(n),e=r.getUint8(0),t=r.getUint16(1),i=r.getUint32(3),a=r.getUint8(7)===1,s=r.getUint16(8),c=r.getUint8(10),u=!!(c&1),p=!!(c&2),m=!!(c&4),h=!!(c&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:i,start:u,end:p,keyframe:m,sequence:t,isVP9:a,ssrc:s,eos:h,data:n.slice(11)}}function Un(n){if(!n||!n.byteLength||n.byteLength!==4)return!1;let r=new DataView(n);return!(r.getUint8(0)!==1||r.getUint8(1)!==1||r.getUint16(2)!==0)}function Bn(n){if(!n||!n.byteLength||n.byteLength!==10)return null;let r=new DataView(n);if(r.getUint8(0)!==1||r.getUint8(1)!==2||r.getUint16(2)!==0)return null;let a=r.getUint16(4),s=r.getUint32(6);return{seq:a,ts2:s}}function Fn(n){let r=new ArrayBuffer(4),e=new DataView(r);return e.setUint8(0,1),e.setUint8(1,1),e.setUint16(2,n),r}import*as O from"simple-ebml-builder";var bo=2**15-1,_a=1,Ao=5,Mo=5;var fa=class n{constructor(r){o(this,"_mediaSource");o(this,"_codec");o(this,"_sourceBuffer",null);o(this,"_queue",[]);o(this,"_clearBufferTill",0);this._mediaSource=new MediaSource,this._codec=r;let e=()=>{this._mediaSource.removeEventListener("sourceopen",e),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener("sourceopen",e,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let t=this._sourceBuffer.buffered.start(0);t<this._clearBufferTill&&(this._sourceBuffer.remove(t,this._clearBufferTill),d.debug(`[WebmBuilder] SourceBuffer cleanup from ${t} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let r=this._queue;this._queue=[];let e=n._buildQueue(r);this._sourceBuffer.appendBuffer(e)}static _buildQueue(r){if(r.length){if(r.length===1)return O.build(r[0])}else return new Uint8Array;let e=r.reduce((a,s)=>a+s.countSize(),0),t=new Uint8Array(e),i=0;for(let a of r){let s=O.build(a);t.set(s,i),i+=s.byteLength}return t}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode="sequence",this._sourceBuffer.addEventListener("updateend",()=>this._handleQueue())}changeType(r){return this._codec=r,this._sourceBuffer?.changeType(r)}append(r,e=!1){this._queue.push(r),e&&this._handleQueue()}cleanup(){this._mediaSource?.readyState==="open"&&this._sourceBuffer?.abort();let r=this._sourceBuffer?.buffered,e=r?.length;if(!e)return;let t=r.start(0),i=Math.max(0,r.end(e-1)-Ao);i-t>Mo&&(this._clearBufferTill=i)}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}},ti=class n extends Zt{constructor(e,t,i){super(e,t,i);o(this,"_mediaBuffer",null);o(this,"_video",null);o(this,"_stream",null);o(this,"_earliestTimestamp",0);o(this,"_clusterStartTime",0);o(this,"_lastFrameTimestamp",0);d.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return O.element(O.ID.EBML,[O.element(O.ID.EBMLVersion,O.number(1)),O.element(O.ID.EBMLReadVersion,O.number(1)),O.element(O.ID.EBMLMaxIDLength,O.number(4)),O.element(O.ID.EBMLMaxSizeLength,O.number(8)),O.element(O.ID.DocType,O.string("webm")),O.element(O.ID.DocTypeVersion,O.number(2)),O.element(O.ID.DocTypeReadVersion,O.number(2))])}static _genSegmentHeader(e,t,i){let a=O.element(O.ID.Info,[O.element(O.ID.TimecodeScale,O.number(1e6)),O.element(O.ID.MuxingApp,O.string("vk-webm-builder")),O.element(O.ID.WritingApp,O.string("vk-webm-builder"))]),s=[O.element(O.ID.PixelWidth,O.number(e)),O.element(O.ID.PixelHeight,O.number(t))],c=O.element(O.ID.Tracks,O.element(O.ID.TrackEntry,[O.element(O.ID.TrackNumber,O.number(_a)),O.element(O.ID.TrackUID,O.number(_a)),O.element(O.ID.TrackType,O.number(1)),O.element(O.ID.FlagLacing,O.number(0)),O.element(O.ID.DefaultDuration,O.number(1e9)),O.element(O.ID.CodecID,O.string(`V_${i.toUpperCase()}`)),O.element(O.ID.Video,s)]));return O.unknownSizeElement(O.ID.Segment,[a,c])}static _genClusterHeader(e){return O.unknownSizeElement(O.ID.Cluster,[O.element(O.ID.Timecode,O.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new fa(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){d.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let i=this._video.seekable;i.length&&(this._video.currentTime=i.end(i.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>d.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(e){let t=e.isVP9?"vp9":"vp8";this._mediaBuffer?this._mediaBuffer.codec!==t&&this._mediaBuffer.changeType(t):this._createVideo(t);let i=e.timestamp;if(i<=this._lastFrameTimestamp&&(i=this._lastFrameTimestamp+10,d.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=i,this._earliestTimestamp)i-=this._earliestTimestamp;else{if(!e.keyframe)return;this._earliestTimestamp=i,i=0}if(e.keyframe){this._clusterStartTime=i,this._mediaBuffer?.cleanup(),d.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let c=n._genWebmHeader();this._mediaBuffer?.append(c);let u=n._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(u)}let a=Math.round(i-this._clusterStartTime);if(a>bo&&(this._clusterStartTime=i,a=0),a===0){d.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let c=n._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(c)}let s=O.element(O.ID.SimpleBlock,[O.vintEncodedNumber(_a),O.bytes(n._intToU16BE(a)),O.number((e.keyframe?1:0)<<7),O.bytes(e.frameData)]);this._mediaBuffer?.append(s,!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),d.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"')}};var bi=class{constructor(r,e,t,i,a){o(this,"_datachannel");o(this,"_participantIdRegistry",null);o(this,"_streamBuilders",{});o(this,"_onStream",()=>{});o(this,"_onEos",()=>{});o(this,"_onStat");d.debug("ScreenCaptureReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._onStream=t,this._onEos=i,this._onStat=a,this._datachannel.onmessage=s=>this._onDataChannelMessage(s.data)}_onDataChannelMessage(r){let e=Ln(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){d.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}if(e.eos){this.close(t),this._onEos(t);return}let i=this._streamBuilders[t];if(!i){let a=c=>this._onStream(t,c),s=()=>{this._requestKeyFrame(e.ssrc)};l.screenShareWebmBuilder&&ti.isBrowserSupported()?i=new ti(t,a,this._onStat):i=new Pi(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=Fn(r);this._datachannel.send(e),d.debug(`ScreenCaptureReceiver request for keyframe for ssrc ${r}`)}catch(e){d.warn("Failed to send keyframe request",e)}}close(r){let e=this._streamBuilders[r];e&&(e.destroy(),delete this._streamBuilders[r])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(r=>r.destroy()),this._streamBuilders={},this._participantIdRegistry=null,d.debug("ScreenCaptureReceiver destroyed")}};var Sa=class{constructor(r,e,t){o(this,"_prev");o(this,"_next");o(this,"_data");this._next=t,t&&(t.prev=this),this._prev=e,e&&(e.next=this),this._data=r}get prev(){return this._prev}set prev(r){this._prev=r}get next(){return this._next}set next(r){this._next=r}get data(){return this._data}},Ai=class{constructor(){o(this,"_head",null);o(this,"_tail",null);o(this,"_length",0)}get length(){return this._length}push(...r){for(let e of r)this._tail=new Sa(e,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(r){this._tail&&(this._tail.next=r._head),this._head||(this._head=r._head),this._tail=r._tail,this._length+=r._length,r.clear()}shift(){if(!this._length||!this._head)return null;let r=this._head;return this._head=r.next,this._head&&(r.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),r.data}bisect(){if(this.length){let r=this.length>1?Math.floor(this.length/2):1;for(let e=0;e<r;e++)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 r=[],e=this._head;for(;e!==null;)r.push(e.data),e=e.next;return r.length?JSON.stringify(r,(t,i)=>i instanceof Error?String(i):i):""}};import Vn from"@vkontakte/libvpx";var Do=1e3,ii=class extends Je{constructor(e,t,i,a){super();o(this,"_sourceTrack");o(this,"_onFrame");o(this,"_useCongestionControl");o(this,"_maxBitrate");o(this,"_useImageCapture");o(this,"_video",null);o(this,"_imageCapture",null);o(this,"_canvas",null);o(this,"_canvasCtx",null);o(this,"_frameReadTimeout",0);o(this,"_lastFrame",null);this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=i,this._maxBitrate=a,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 new Error("Canvas not found");if(!this._video&&!this._useImageCapture)throw new Error("Video element not found");return new Promise((t,i)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let a=this._video;a.srcObject=new MediaStream([e]),a.onloadeddata=u=>t(),a.onerror=()=>i(new Error("Video element error"));let s=a.play(),c=()=>i(new Error("Autoplay is disabled"));s?s.catch(c):c()}})}_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 new 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 new Error("Destroyed");return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw new Error("Destroyed");let t=e.width,i=e.height;return this._canvas.width=t,this._canvas.height=i,this._canvasCtx.clearRect(0,0,t,i),this._canvasCtx.drawImage(e,0,0,t,i),this._canvasCtx?.getImageData(0,0,t,i)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;d.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?"VP9":"VP8"}`),await this._createStream(this._sourceTrack),await this._createWorker(`"use strict";var exports=(()=>{var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var V=(a,r)=>{for(var s in r)u(a,s,{get:r[s],enumerable:!0})},h=(a,r,s,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of y(r))!x.call(a,e)&&e!==s&&u(a,e,{get:()=>r[e],enumerable:!(i=R(r,e))||i.enumerable});return a};var A=a=>h(u({},"__esModule",{value:!0}),a);var M={};V(M,{default:()=>F});var F=(a,r,s,i)=>{let e;function m(t,o){return a({locateFile:r}).then(n=>{if(e=new n.VpxEncoder,e.debug(o),!e.init(t?n.VpxType.VP9:n.VpxType.VP8))throw self.postMessage({type:"log_error",message:"encoder-init-fail-libvpx"}),new Error("LibVPxEncoder failed to create");if(s){let d=Math.round(i/1e3);e.setTargetBitrate(d)}else e.setMaxQuantizer(10),e.setTargetBitrate(1024)})}function E(t,o,n,p){let d=e.allocateImage(t,o);if(!d){self.postMessage({type:"frame",error:"No buffer data"});return}d.set(new Uint8Array(n));let l=Math.round(performance.now()),f=150;if(!e.encode(l,f,p)){self.postMessage({type:"frame",error:"Encode failed"});return}let b=e.readFrame();if(!b){self.postMessage({type:"frame",error:"No encoded data"});return}e.readFrame()&&(self.postMessage({type:"debug",message:"LibVPxEncoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxEncoder-drop"}));let c=new Uint8Array(b.byteLength);c.set(b),self.postMessage({type:"frame",frameType:p?"key":"delta",timestamp:l,duration:f,width:t,height:o,data:c.buffer},[c.buffer])}function g(t,o){let n=Math.round(t/1e3);e.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case"init":m(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:"ready"})).catch(o=>self.postMessage({type:"error",error:String(o)}));break;case"frame":E(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case"set_bitrate":g(t.data.bitrate,t.data.useCbr);break}}};return A(M);})();
|
|
10
|
+
`,i=>{i.error?this._onFrame(null,i.error):this._onFrame({type:i.frameType,timestamp:i.timestamp,duration:i.duration,data:i.data,byteLength:i.data?.byteLength,width:i.width,height:i.height})},[Vn,Vn.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:d.enabled()})}_encode(e,t){let i=e.data.buffer;this._sendToWorker("frame",{width:e.width,height:e.height,imageData:i,keyFrame:t},[i])}_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)},Do),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let i=this._drawFrameData(t);this._encode(i,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),d.debug("LibVPxEncoder destroyed")}};var Ut=class extends Je{constructor(e,t,i,a,s,c){super();o(this,"_sourceTrack");o(this,"_trackProcessor");o(this,"_onFrame");o(this,"_useCongestionControl");o(this,"_maxBitrate");o(this,"_useCbr");o(this,"_frameRate");this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=i,this._maxBitrate=a,this._useCbr=s,this._frameRate=c,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,i=this._trackProcessor.readable;d.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?"VP9":"VP8"}`),await this._createWorker(`"use strict";var exports=(()=>{var p=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var _=(a,t)=>{for(var n in t)p(a,n,{get:t[n],enumerable:!0})},I=(a,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of B(t))!x.call(a,o)&&o!==n&&p(a,o,{get:()=>t[o],enumerable:!(i=T(t,o))||i.enumerable});return a};var M=a=>I(p({},"__esModule",{value:!0}),a);var O={};_(O,{default:()=>S});var S=()=>{let t,n,i,o,g,m,d=null,f=0,b=!1,u=0,F,V,c=!1,l=!1;function h(e){t=e.readable,n=t.getReader(),i=e.width,o=e.height,g=e.isVP9,m=e.framerate,F=e.useCongestionControl,V=e.maxBitrate,F&&(u=V,c=e.useCbr),E(),self.postMessage({type:"ready"})}function A(e){e&&!l&&(l=!0),self.clearTimeout(f),f=self.setTimeout(()=>{d&&y(d,l)},1e3),!b&&(b=!0,n.read().finally(()=>{b=!1,self.clearTimeout(f)}).then(({done:r,value:s})=>{if(d?.close(),d=null,!(r||!s)){if(!R){n.releaseLock(),t.cancel();return}d=s,y(s,l)}}))}function y(e,r){(e.codedWidth!==i||e.codedHeight!==o)&&(i=e.codedWidth,o=e.codedHeight,E(),l=!0),R.encode(e,{keyFrame:r}),r&&(l=!1)}function E(){let e={framerate:m,codec:g?"vp09.00.50.08":"vp8",width:i,height:o,latencyMode:"realtime",bitrateMode:c?"constant":"variable"};u>0&&(e.bitrate=u),R.configure(e)}function C(e,r,s){u=e,c=r,m=s,E()}let R=new VideoEncoder({output:e=>{let r;e.data?r=e.data:(r=new ArrayBuffer(e.byteLength),e.copyTo(r)),self.postMessage({type:"frame",frameType:e.type,timestamp:e.timestamp,duration:e.duration,width:i,height:o,data:r},[r])},error:e=>{self.postMessage({type:"frame",error:String(e)})}});self.onmessage=e=>{switch(e.data.type){case"init":h(e.data);break;case"frame":A(e.data.keyFrame);break;case"set_bitrate":C(e.data.bitrate,e.data.useCbr,e.data.fps);break}}};return M(O);})();
|
|
11
|
+
`,a=>{a.error?this._onFrame(null,a.error):this._onFrame({type:a.frameType,timestamp:a.timestamp,duration:a.duration,data:a.data,byteLength:a.data?.byteLength,width:a.width,height:a.height})},[],{readable:i,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[i])}requestFrame(e=!1){this._sendToWorker("frame",{keyFrame:e})}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t,fps:i})}isVP9(){return!0}destroy(){this._removeWorker(),d.debug("WebCodecsEncoder destroyed")}static isBrowserSupported(){return"VideoEncoder"in window&&"Worker"in window&&"EncodedVideoChunk"in window&&"MediaStreamTrackProcessor"in window}};var wo=2100,ko=600,Oo=1.2,jn=.8,xo=2e3,No=8e3,va=8e3,Lo=16e3,Uo=4,Bo=2e3,Cr=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Cr||{}),Mi=class{constructor(r,e,t,i,a,s,c){o(this,"_onCongestion");o(this,"_ccEnabled");o(this,"_fastSharing");o(this,"_trendDelayThreshold");o(this,"_highDelayThreshold");o(this,"_targetFps");o(this,"_minBitrate");o(this,"_maxBitrate");o(this,"_targetBitrate");o(this,"_lastDown");o(this,"_lastUp");o(this,"_lastProbing");o(this,"_lastCheckDelay");o(this,"_upPenalty",0);o(this,"_probing");o(this,"_delayAvgShort",-1);o(this,"_delayAvgLong",-1);o(this,"_minDelay",Number.MAX_VALUE);o(this,"_maxDelay",0);o(this,"_largeDelayDuration",0);o(this,"_lastFpsCalcMs");o(this,"_frames",0);o(this,"_fps",0);this._onCongestion=r,this._ccEnabled=i,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=a,this._targetFps=c,s>0?this._highDelayThreshold=s:this._highDelayThreshold=wo,a&&(this._highDelayThreshold=ko),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let u=Date.now();this._lastDown=0,this._lastUp=u,this._lastProbing=u,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(r,e,t){let i=Date.now();if(this._calcFps(i),this._calcDelay(e,i),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let a=0,s=this._delayAvgShort-this._delayAvgLong,c=Math.round(Math.abs(s)*100/this._delayAvgLong),u=s>40&&c>30&&this._delayAvgShort>this._trendDelayThreshold,p=this._delayAvgShort>this._highDelayThreshold;u||p?a=2:Math.abs(s)<40&&c<10&&!p&&(a=1);let m=Math.round(this._targetBitrate/1e3),h=t;r%20===0&&d.debug(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Cr[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>xo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Uo),this._probing=!1);let z=jn*h*1e3;if(z>=this._targetBitrate&&(z=this._targetBitrate*jn),z=Math.max(z,this._minBitrate),z<this._targetBitrate){let Te=Math.round(z/1e3),De=Math.round(this._upPenalty*va/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Cr[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Te} penalty=${De}s`),this._setBitrate(z,!0),this._targetBitrate=z}this._lastDown=i}let P=i-this._lastUp,C=No+this._upPenalty*va;if(a===1&&P>C&&E>C){let z=Math.min(this._targetBitrate*Oo,this._maxBitrate);if(z>this._targetBitrate){let Te=Math.round(z/1e3),De=Math.round(this._targetBitrate/1e3),ae=Math.round(this._upPenalty*va/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Cr[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${De} -> newBitrate=${Te} penalty=${ae}s`),this._setBitrate(z,!1),this._targetBitrate=z,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let H=i-this._lastProbing;this._probing&&H>Lo&&(this._probing=!1);let K=i-this._lastDown;this._upPenalty>0&&K>3*C&&(d.log(`#${r}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(r,e){this._fastSharing&&(e=!0);let t=this._targetFps;this._fps>0&&(t=this._fps),this._onCongestion(r,e,t)}_calcDelay(r,e){if(!(r<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=r,this._delayAvgLong=r),this._delayAvgShort=Math.round((this._delayAvgShort*3+r)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+r)/24),r>0&&r<this._minDelay?this._minDelay=r:r>this._maxDelay&&(this._maxDelay=r),this._lastCheckDelay===0&&(this._lastCheckDelay=e),r>Bo){let t=e-this._lastCheckDelay;this._largeDelayDuration+=t}this._lastCheckDelay=e}}reconfigure(r,e){this._minBitrate=r,this._maxBitrate=e}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let r={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,r}_calcFps(r){this._frames++;let e=r-this._lastFpsCalcMs;if(e>5e3){this._lastFpsCalcMs=r;let t=this._fps,i=this._frames*1e3/e;this._fps===0?this._fps=Math.round(i):this._fps=Math.round((this._fps*3+i)/4),this._frames=0,this._fps!==t&&d.log(`cc: fps=${this._fps}`)}}};var Di=class{constructor(r){o(this,"_maxSize");o(this,"_size",0);o(this,"_buffer");o(this,"_head",0);o(this,"_tail",0);this._maxSize=r,this._buffer=new Array(r)}add(r,e,t,i,a){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let s=this._tail;return this._buffer[this._tail]={seq:r,ts:e,size:t,sent:Date.now(),start:i,end:a,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,s}update(r,e){let t=this.get(r);return t===null?null:(t.ts2=e,t.recv=Date.now(),t)}get(r){let e=this._head;for(let t=0;t<this._maxSize;t++){let i=this._buffer[e];if(r===i?.seq)return i;if(e=++e%this._maxSize,e===this._tail)break}return null}getServerBitrateK(r){let e=0,t=0,i=-1,a=-1,s=this._tail;for(let c=0;c<this._maxSize;c++){s>0?--s:s=this._maxSize-1;let u=this._buffer[s];if(!u||(a===-1&&(a=u.ts2,t=0),a>=0&&(t+=u.size),i=u.ts2,a-i>=r)||s===this._head)break}if(i>=0&&a>=0){let c=a-i;e=Math.round(c>0?t*8/c:0)}return e}getCurrentDelay(){let r=this._tail;for(let e=0;e<this._maxSize;e++){r>0?--r:r=this._maxSize-1;let t=this._buffer[r];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(r===this._head)break}return 0}getMaxBandwidth(){let r=0,e=0,t=-1,i=-1,a=this._tail;for(let s=0;s<this._maxSize;s++){a>0?--a:a=this._maxSize-1;let c=this._buffer[a];if(c){if(i===-1&&c.end&&!c.start&&(i=c.ts2,e=0),t===-1&&i>=0&&c.start&&!c.end&&(t=c.ts2),t>=0&&i>=0){let u=i-t;r=u>0?e*8/u:0;break}if(i>=0&&(e+=c.size),a===this._head)break}}return Math.round(r)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}};var Ia=65536,Vo=50,jo=400,Ho=1e6,Go=3e5,Wo=3e4,Ko=2e3,$o=5,yr=0,wi=class{constructor(r,e,t,i){o(this,"_encoder");o(this,"_datachannel");o(this,"_signaling");o(this,"_fastSharing");o(this,"_destroyed",!1);o(this,"_needKeyframe",!0);o(this,"DATA_SIZE");o(this,"_congestionControl");o(this,"_frameNum",0);o(this,"_width");o(this,"_height");o(this,"_feedback",new Di(1024));o(this,"_lastSentFrameSeq",0);o(this,"_lastDeliveredFrameSeq",0);o(this,"_lastFrameDelay",0);o(this,"_lastFramerateReduced",Date.now());o(this,"_lastSharingStat",Date.now());o(this,"_congestionControlEnabled");o(this,"_queue",new Ai);o(this,"_fpsMeter");o(this,"_maxFrameDelay");d.debug("ScreenCaptureSender started"),this.DATA_SIZE=l.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=i,this._congestionControlEnabled=l.screenShareCongestionControl||this._fastSharing,this._width=r.getSettings().width,this._height=r.getSettings().height,this._maxFrameDelay=this._fastSharing?l.screenShareCongestionControlThreshold:l.screenShareCongestionControlThreshold*2;let a=l.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),u=this._onCongestionCallback.bind(this);d.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${l.screenShareCongestionControlThreshold}`),this._congestionControl=new Mi(u,s,c,this._congestionControlEnabled,this._fastSharing,l.screenShareCongestionControlThreshold,a);let p=(m,h)=>{if(this._destroyed)return;if(!m){d.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),this._needKeyframe=!0,this._handleQueue();return}(m.width!==this._width||m.height!==this._height)&&(this._width=m.width,this._height=m.height,this._onResize(this._width,this._height));let E=this._sliceFrame(m);this._queue.merge(E),this._handleQueue(),this._sendSharingStat()};if(Ut.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Ut(r,p,this._congestionControlEnabled,c,m,a)}else this._encoder=new ii(r,p,this._congestionControlEnabled,c);this._datachannel.onmessage=m=>{Un(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Bn(m.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(m=>d.warn("ScreenCaptureSender init failed",m)),this._fpsMeter=new xt(m=>d.log(`[ScreenCaptureSender] fps: ${m}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Ia)%Ia>$o&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>Ko&&(this._lastFramerateReduced=i,d.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(r)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),I.setImmediate(()=>this._handleQueue());return}if(r.isLast){this._frameNum++,this._fpsMeter.increment(),r.isKey&&d.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(r.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),i=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,i)}else I.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let r=this._queue.head();for(;r;){if(r.isFirst&&r.isKey)return!0;this._queue.shift(),r=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(r){let e=r.type==="key",t=r.data.byteLength,i=new Ai;for(let a=0;a<t;a+=this.DATA_SIZE){let s=r.data.slice(a,a+this.DATA_SIZE),c=a===0,u=t<=a+s.byteLength,p=this._wrapHeader(r.timestamp,c,u,e,s);i.push({data:p.data,sequence:p.sequence,frameSize:t,isFirst:c,isLast:u,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=Nn(r,e,t,i,yr,this._encoder.isVP9(),a),c={sequence:yr,data:s};return yr=(yr+1)%Ia,c}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(r){if(!this._datachannel||this._datachannel.readyState!=="open")return!1;try{return this._datachannel.send(r.data),this._feedback.add(r.sequence,r.timestamp,r.data.byteLength,r.isFirst,r.isLast),r.isLast&&(this._lastSentFrameSeq=r.sequence),!0}catch(e){return d.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(),d.debug("ScreenCaptureSender destroyed")}static isBrowserSupported(){return Ut.isBrowserSupported()||ii.isBrowserSupported()}_onCongestionCallback(r,e,t){this._encoder.setBitrate(r,e,t)}_onResize(r,e){let{minBitrate:t,maxBitrate:i}=this._calcMinMaxBitrate(r,e),a=Math.round(t/1e3),s=Math.round(i/1e3);d.log(`cc: resize to ${r}x${e}, minBitrate=${a} maxBitrate=${s}`),this._congestionControl.reconfigure(t,i)}_calcMinMaxBitrate(r,e){(r===void 0||r<640)&&(r=640),(e===void 0||e<360)&&(e=360);let t=r*e/256,i=Math.max(Go,Math.min(Ho,Math.round(t*Vo))),a=Math.round(t*jo);return{minBitrate:i,maxBitrate:a}}_checkCcFeedback(r){let e=this._feedback.update(r.seq,r.ts2);if(e===null)d.debug(`cc: update failed, seq=${r.seq}`);else if(e.end){this._lastDeliveredFrameSeq=e.seq;let t=e.recv-e.sent;t>0&&(this._lastFrameDelay=t),this._handleQueue()}}_sendSharingStat(){let r=Date.now();if(r-this._lastSharingStat>Wo){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var qo=90,zo=4294967295,ki=class n extends wt{constructor(e,t,i){super(e,t);o(this,"_producerNotification",null);o(this,"_producerCommand",null);o(this,"_producerScreen",null);o(this,"_consumerScreen",null);o(this,"_asr",null);o(this,"_animojiDataChannel",null);o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);o(this,"_isOpen",!1);o(this,"_observer",!1);o(this,"_reconnectionPrevented",!1);o(this,"_statInterval",null);o(this,"_settingsInterval",null);o(this,"_monitorRtpShareInterval",null);o(this,"_statBytes",{});o(this,"_ssrcMap",{});o(this,"_ssrcMapUpdated",!1);o(this,"_perfStatReporter");o(this,"_producerOfferIsProcessing",!1);o(this,"_producerNextOffer",null);o(this,"_lastStat",null);o(this,"_serverSettings");o(this,"_prevConsumerSettings",{});o(this,"_prevConsumerFastSharingSettings",{});o(this,"_asrTrack",null);o(this,"_captureSender",null);o(this,"_captureReceiver",null);o(this,"_participantIdRegistry",null);o(this,"_disabledSenders",new Set);o(this,"_rtpReceiversByStreamId",{});o(this,"_producerSessionId","");o(this,"_newAudioShareTrack",null);o(this,"_simulcastInfo",null);this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=i,d.debug("ServerTransport: Created")}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!=="IDLE"&&e!=="CLOSED"&&e!=="FAILED"&&this._startStatInterval()}open(e=!1){if(this._isOpen){d.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?(d.error("ServerTransport: Closed",e),this._setState("FAILED")):(d.debug("ServerTransport: Closed"),this._setState("CLOSED")))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){fr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(l.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(){l.simulcast&&b.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new St(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,n._closeDataChannel(this._producerNotification),n._closeDataChannel(this._producerCommand),n._closeDataChannel(this._producerScreen),n._closeDataChannel(this._consumerScreen),n._closeDataChannel(this._asr),n._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent("PEER_CONNECTION_CLOSED")}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{ordered:!0});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)},a.onerror=s=>{let c=s.error;d.error(`[${t}] data channel error`,c?.errorDetail,c?.message)}}_openConnection(e=!1){d.debug("ServerTransport: Open single connection");try{this._pc=new RTCPeerConnection}catch(t){d.error("Failed to create RTCPeerConnection:",t),this.close(t);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=I.debounce(t=>{this._pc&&this._onConnectionStateChange(this._pc,t)},500),this._pc.onsignalingstatechange=n._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Er,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,ct.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,ct.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)}),this._createDataChannel(this._pc,ct.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),l.asrDataChannel&&this._createDataChannel(this._pc,ct.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new Ir(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),l.vmoji&&this._createDataChannel(this._pc,ct.animoji,t=>{this._animojiDataChannel=t,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(t),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(t),this._animojiSender?.setProtocolVersion(l.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(t){d.error("ServerTransport: Unable to add media source tracks",t),R.log(w.ERROR,"addTrack-single"),this.close(t);return}this._createDataChannel(this._pc,ct.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&(!l.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!=="OPENED"&&(this._setState("RECONNECTING"),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_signalStalledParticipants(e){this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_signalSpeakerChanged(e){this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_signalNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
12
|
+
`).forEach(t=>{let i=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Be.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Be.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,a=new RegExp(i).exec(t);a&&(this._ssrcMap[a[1]]=a[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new wi(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new bi(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,t)},e=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,null)},e=>{this._triggerEvent("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(i=>{if(!i.track||i.track.kind!=="video"||i.track.contentHint==="motion")return;let a=!this._disabledSenders.has(i),s=e.maxDimension!==0;if(a&&!s){d.log("Disabling video upload"),this._disabledSenders.add(i),i.replaceTrack(b.getBlackMediaTrack()).catch(u=>{d.error("Could not disable video upload",u)});return}let c=this._mediaSource.getSendVideoTrack();if(!a&&s&&c){d.log("Enabling video upload"),this._disabledSenders.delete(i);let u=i.track;u.enabled=c.enabled,i.replaceTrack(c).then(()=>u.stop()).catch(p=>{d.error("Could not enable video upload",p)})}I.applyVideoTrackSettings(e,i,c??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&l.consumerFastScreenShare){let t=this._serverSettings.fastScreenSharing;if(t&&this._pc){let i=[];this._pc.getSenders().forEach(a=>{!a.track||a.track.kind!=="video"||a.track.contentHint!=="motion"||I.applyVideoTrackSettings(t,a,a.track,this._prevConsumerFastSharingSettings,i)}),this._prevConsumerFastSharingSettings=i}}}_onScreenSharingStatus(e){e.track?(!l.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent("STATE_CHANGED",e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(t=>{this._reportStats(t),this._detectStaleTracks(t),rt.reportUsage(t)}).catch(()=>{}),this._statInterval=window.setTimeout(e,l.statisticsInterval)};this._statInterval=window.setTimeout(e,l.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_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 ue.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent("REMOTE_DATA_STATS",{inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(c=>c.type==="inbound-rtp"&&c.kind==="audio"&&this._ssrcMap[c.ssrc]==="mix");if(!t)return;let i=Be.AUDIO_MIX,a=this._statBytes[i],s=!1;if(a){let c=t.bytesReceived-a.bytesReceived;c>=0&&c<=5&&(s=!0),a.stalled!==s&&this._triggerEvent("AUDIO_MIX_STALL",s)}this._statBytes[i]={bytesReceived:t.bytesReceived,stalled:s}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:St.getEstimatedPerformanceIndex(),audioMix:!l.transparentAudio,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:l.asrDataChannel?1:0,animojiDataChannelVersion:l.vmoji?l.vmojiOptions.protocolVersion:1,animojiBackendRender:!l.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:l.videoTracksCount,red:!0,audioShare:l.audioShare,fastScreenShare:l.fastScreenShare,videoSuspend:l.videoSuspend,simulcast:l.simulcast&&b.isSimulcastSupportedByBrowser(),consumerFastScreenShare:l.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:l.consumerFastScreenShareQualityOnDemand,transparentAudio:l.transparentAudio};!l.videoTracksCount&&!this._observer&&d.warn("Setting videoTracksCount to 0 is deprecated"),this._signaling.allocateConsumer(null,e)}async _processOffer(e){if(!this._pc)throw new Error("Interrupt allocation");let t=l.simulcast&&b.isSimulcastSupportedByBrowser(),i=t;try{await this._pc.setRemoteDescription(e)}catch(c){throw d.error("[single] unable to set remote offer",c),R.log(w.ERROR,"setRemoteDescription-single"),c}let a=this._findFirstSimTransceiver();if(t)if(a){d.log(`_processOffer: caps.simulcast=${l.simulcast} mid=${a.mid} dir=${a.direction}`);let c=this._mediaSource.getStream(),u=await this._setupSimulcastTransceiver(c,a);d.log("_processOffer: simulcastInfo",u),u||(d.log(`_processOffer: simulcast transceiver not found in server offer mid=${a.mid}, disable simulcast`),i=!1)}else d.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),i=!1;let s;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");s=await this._pc.createAnswer()}catch(c){throw d.error("[single] unable to create answer",c),R.log(w.ERROR,"createAnswer-single"),c}try{if(!this._pc)throw new Error("Interrupt allocation");s.sdp=I.patchLocalSDP(s.sdp,!1,b.isBrokenH264Decoder(),!1),d.debug("[single] set local answer",{answer:s}),await this._pc.setLocalDescription(s)}catch(c){throw d.error("[single] unable to set local answer",c),R.log(w.ERROR,"setLocalDescription-single"),c}if(i&&a){s.sdp=I.patchSimulcastAnswerSdp(s.sdp,a,mt.WIDTH,mt.HEIGHT);for(let c of this._pc.getTransceivers())c.mid===null&&c.stop()}try{d.debug("[single] transmit local answer",{answer:s}),this._updateSSRCMap(e),await this._signaling.acceptProducer(s,Object.keys(this._ssrcMap)),d.debug("[single] remote offer has been processed")}catch(c){d.warn("[single] unable to send local answer",c),R.log(w.ERROR,"acceptProducer")}i&&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!=="video")continue;let i=e.sender.getParameters();if(!(!i.encodings||i.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let i=e.getVideoTracks()[0];await t.sender.replaceTrack(i),t.sender.setStreams(e);let a=t.sender.getParameters();if(!a.encodings||a.encodings.length<=1)return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(a.encodings)}`),null;let s=mi(mt.WIDTH,mt.HEIGHT,this._serverSettings.camera?.bitrates?.generic),c=0,u=1;for(let m of a.encodings)m.scalabilityMode=ui,m.active=!0,c>=s.streams.length?m.maxBitrate=0:m.maxBitrate=s.streams[c].bitrate,m.scaleResolutionDownBy=u,u=u*2,c++;await t.sender.setParameters(a);let p=i.getSettings();return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${p.width}x${p.height} encodings=${JSON.stringify(a.encodings)}`),!0}async _acceptProducer(e){if(this._producerOfferIsProcessing){this._producerNextOffer=e,d.debug("[single] wait until other remote offer is processed");return}this._producerOfferIsProcessing=!0;let t={type:"offer",sdp:I.patchRemoteSDP(e,b.isOldDataChannelDescription(),!1,!1,!1,b.isBrokenVP9Encoder(),b.isBrokenVP9Decoder())};if(d.debug("[single] set remote offer",{offer:t}),!this._pc)throw new Error("Interrupt allocation");try{if(await this._processOffer(t),this._producerOfferIsProcessing=!1,this._producerNextOffer){d.debug("[single] there is other unprocessed remote offer, process it");let i=this._producerNextOffer;this._producerNextOffer=null,await this._acceptProducer(i)}}catch(i){this.close(i)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="video");if(!e||!e.sender){d.warn("Cannot find screenshare transceiver");return}try{e.direction="sendonly",await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(t){d.error("ServerTransport: Unable to replace track",t)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="audio");if(!e||!e.sender){d.warn("Cannot find audioshare transceiver");return}e.sender.track!==null&&d.warn("Unexpected track assigned to audioshare");try{e.direction="sendonly",await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(t){d.error("ServerTransport: Unable to replace track",t),R.log(w.ERROR,"replaceTrack-single")}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case L.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case L.REALLOC_CON:this._reconnect();break;case L.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case L.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case L.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case L.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent("ASR_TRANSCRIPTION",e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),l.breakVideoPayloadTypes&&(d.log("test mode enabled, video switched off"),this._signaling.requestTestMode("breakVideoPayloadTypes",null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description)}_onAddTrack(e,t){d.debug("[single] remote track (added)",{track:t.track});let i=t.streams[0];i?(i.onremovetrack||(i.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",i.id,i,s.track)}),i.getTracks().find(s=>s.id===t.track.id)||i.addTrack(t.track),this._rtpReceiversByStreamId[i.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",i.id,i,t.track)):d.error("[single] unable to get media stream from track event")}static _onSignalingStateChange(e,t){d.debug("[single] signaling state changed",{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(d.debug("[single] connection state changed",{state:e.connectionState},t),R.log(w.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(R.logCustom(w.RECONNECT,{param:1}),this._reconnect());break;case"connecting":let i=this.getState();i==="IDLE"||i==="OPENED"?this._setState("CONNECTING"):e.iceConnectionState==="checking"&&this._setState("RECONNECTING");break;case"disconnected":this._reconnectionPrevented?this.close(new Error("Ice connection disconnected")):this._setState("RECONNECTING");break;case"connected":this._setState("CONNECTED"),I.getPeerConnectionHostInfo(e).then(a=>{a?.local&&(R.log(w.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))}),R.logCustom(w.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){d.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let i=(a,s)=>{a.replaceTrack(s).catch(c=>{d.error("ServerTransport: Unable to replace track",c),R.log(w.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),l.simulcast&&b.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(c=>c.direction==="sendonly"&&c.sender?.track?.kind==="video"&&c.sender.track.contentHint===e.contentHint)?.sender;s?.track?(i(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):d.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let a=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);a?.track?i(a,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e==="screen"&&l.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return R.log(w.PAT_WAITING_TIME_ERROR,"noConnection"),d.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return R.log(w.PAT_WAITING_TIME_ERROR,"oldBrowser"),d.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let i=this._rtpReceiversByStreamId[e];if(!i)return R.log(w.PAT_WAITING_TIME_ERROR,"noReceiver"),d.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let a=i.getSynchronizationSources();if(!a||!a.length)return d.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let c=a[0].rtpTimestamp;if(!Number.isInteger(c))return R.log(w.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),d.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${c}`),0;let u=t-c&zo,p=Math.ceil(u/qo);return Math.min(100,Math.max(0,p))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!l.simulcast||!b.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let c=s.getVideoTracks()[0],u=c.getSettings().width,p=c.getSettings().height,m=mi(u,p,this._serverSettings.camera?.bitrates?.generic),h=t||!za(this._simulcastInfo,m);if(!m.streams.length||!h)return;let E=a.sender.getParameters();if(E.encodings||(E.encodings=[{}]),!(E.encodings.length<=1)){if(d.log(`_changeSimulcastInfo: ${u}x${p} command: ${JSON.stringify(m)} `),e){let P=0;for(let C of E.encodings)C.scaleResolutionDownBy=Wi(C.rid),C.scalabilityMode=ui,P>=m.streams.length?(C.maxBitrate=0,C.active=!1):(C.active=!0,C.maxBitrate=m.streams[P].bitrate),P++;await a.sender.setParameters?.(E).catch(C=>{d.error("Failed to set sender parameters",E,C)}),d.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(E.encodings)} `)}if(this._simulcastInfo=m,m.streams){let P={mediaSource:1,simulcastInfo:m};await this._signaling.changeSimulcast(P)}}}async _monitorRtpShare(){let e=Xt.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!l.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(a=>a.track?.kind==="video"&&a.track?.contentHint==="motion");if(!t)return;(await t.getStats()).forEach(a=>{if(a.type==="outbound-rtp"&&this._serverSettings.fastScreenSharing&&a.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&a.frameWidth<window.screen.width){let s=t.getParameters();s.degradationPreference="maintain-resolution",t.setParameters(s),d.log(`
|
|
13
13
|
degradationPreference updated for fast share RTP Sender
|
|
14
14
|
Actual senderStats: ${JSON.stringify(a)}
|
|
15
15
|
serverSettings: ${JSON.stringify(this._serverSettings.fastScreenSharing)}
|
|
16
|
-
`)}})}_startMonitorRtpShareInterval(){if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,5e3)};this._monitorRtpShareInterval=window.setTimeout(t,5e3)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}};var je=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(je||{}),Ir=class extends se{constructor(e,t,i,a){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_topology");o(this,"_allocated",[]);o(this,"_opened",[]);o(this,"_directTransport",null);o(this,"_serverTransport",null);o(this,"_serverSettings");o(this,"_dtListeners",[]);o(this,"_stListeners",[]);o(this,"_states",{});o(this,"_localState","IDLE");o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"ANIMOJI_STATUS",this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e==="SERVER"&&(this._serverTransport=this._createServerTransport())}updateSettings(e){d.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(d.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){d.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,i=!1,a=!1){d.log("Trying open participant",{participantIds:e});let s=a;for(let c of e){if(this._opened.indexOf(c)!==-1){d.warn(`The participant [${c}] has already had opened transport`);continue}if(this._allocated.indexOf(c)===-1){d.warn(`The participant [${c}] has no allocated transport`);continue}this._opened.push(c),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(i),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),d.debug("The transport has been opened",e))}close(e){let t=this._allocated.indexOf(e),i=this._opened.indexOf(e);t<0&&d.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&i>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),i>=0&&this._opened.splice(i,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 i=e.filter(a=>this._states[a]!==t?(this._states[a]=t,!0):!1);i.length&&this._triggerEvent("STATE_CHANGED",i,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent("LOCAL_STATE_CHANGED",e))}_onSignalingNotification(e){if(e.notification===L.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(d.log(`Topology changed ${this._topology} -> ${e.topology}`),R.log(D.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||[],i=e.offerToTypes||[],a=e.offerToDeviceIdxs||[],s=t.length&&i.length?I.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){d.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&d.warn("Topology changed to DIRECT, but the allocated participants count more then one");let c=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let u=s===c;this._directTransport=this._createDirectTransport(c,u)}this._opened.indexOf(c)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new vi(e,t,this._signaling,this._mediaSource,this._serverSettings);return this._dtListeners.length>0&&d.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(i.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this,e)),i.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this,e)),i.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),i.addEventListener("STATE_CHANGED",this._onDirectTransportChanged.bind(this)),i.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),i.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"DIRECT"))),this._animojiReceiver&&this._animojiSender&&i.setAnimojiTransport(this._animojiReceiver,this._animojiSender),i}_createServerTransport(){let e=new bi(this._signaling,this._mediaSource,this._serverSettings);return this._stListeners.length>0&&d.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 i=this._opened.indexOf(t);i>=0&&this._opened.splice(i,1);let a=this._allocated.indexOf(t);a>=0&&this._allocated.splice(a,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,i){this._triggerEvent("REMOTE_TRACK_ADDED",e,t,i)}_onRemoteTrackRemoved(e,t,i){this._triggerEvent("REMOTE_TRACK_REMOVED",e,t,i)}_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((t,i)=>this._onAnimojiStream(t,i),t=>this._onAnimojiStream(t,null),t=>{this._triggerEvent("ANIMOJI_ERROR",t)},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=t=>this._animojiReceiver?.receive(t)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology!=="SERVER"?(R.log(D.PAT_WAITING_TIME_ERROR,"wrongTopology"),d.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(R.log(D.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var xe=class xe{constructor(){o(this,"trackerByTransport",{ws:new ot,wt:new ot});o(this,"lastSeen",{})}static create(){xe._instance||(xe._instance=new xe)}static mark(r){if(!xe._instance)return;let e=Date.now(),t=xe._instance.lastSeen[r];if(typeof t=="number"){let i=e-t;i>=0&&xe._instance.trackerByTransport[r].add(i)}xe._instance.lastSeen[r]=e}static logMetrics(r){xe._instance&&["ws","wt"].forEach(e=>{if(!xe._instance.trackerByTransport[e].hasData)return;let t=xe._instance.trackerByTransport[e].snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_PING_SUMMARY,min_value:t.min,max_value:t.max,avg_value:t.avg,median_value:t.median,p95_value:t.p95,values_count:t.count,signaling_transport:e})})}static destroy(){xe._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new ot,wt:new ot},this.lastSeen={}}};o(xe,"_instance");var lt=xe;var Be=class Be{constructor(){o(this,"trackerByCommand",new Map)}static create(){Be._instance||(Be._instance=new Be)}static mark(r,e,t){if(!Be._instance)return;let i=`${r}|${t}`,a;Be._instance.trackerByCommand.has(i)?a=Be._instance.trackerByCommand.get(i):(a=new ot,Be._instance.trackerByCommand.set(i,a)),a.add(e)}static logMetrics(r){if(Be._instance)for(let[e,t]of Be._instance.trackerByCommand.entries()){if(!t.hasData)continue;let[i,a]=e.split("|"),s=t.snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_COMMAND_SUMMARY,api_method:i,min_value:s.min,max_value:s.max,avg_value:s.avg,median_value:s.median,p95_value:s.p95,values_count:s.count,signaling_transport:a})}}static destroy(){Be._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};o(Be,"_instance");var pt=Be;var On=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(On||{}),Ye=On;var xn={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},rt=class{static getFlags(){let r=Object.values(xn),e=0;for(let t=0;t<r.length;t++)r[t]()&&(e|=1<<t);return e.toString(16).toUpperCase()}static parseCapabilities(r){let e=parseInt(r||"0",16);return Object.keys(xn).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};import*as He from"fflate";var Vo=63n,jo=16383n;var Ho=4611686018427387903n,Er=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=Vo)return new Uint8Array([Number(e)]);if(e<=jo)return new Uint8Array([64|Number(e>>8n),Number(e&0xffn)]);if(e<=BigInt(1073741823))return new Uint8Array([128|Number(e>>24n),Number(e>>16n&0xffn),Number(e>>8n&0xffn),Number(e&0xffn)]);if(e<=Ho)return new Uint8Array([192|Number(e>>56n),Number(e>>48n&0xffn),Number(e>>40n&0xffn),Number(e>>32n&0xffn),Number(e>>24n&0xffn),Number(e>>16n&0xffn),Number(e>>8n&0xffn),Number(e&0xffn)]);throw new RangeError("Number is too large to encode using varint")}},Tr=class{decode(r){let e=this.getNumBytesForLengthInteger(r);if(e<0)throw new Error("Invalid length prefix");if(r.length<e)return null;let t=BigInt(0);switch(e){case 1:t=BigInt(r[0]&63);break;case 2:t=BigInt(r[0]&63)<<8n|BigInt(r[1]);break;case 4:t=BigInt(r[0]&63)<<24n|BigInt(r[1])<<16n|BigInt(r[2])<<8n|BigInt(r[3]);break;case 8:t=BigInt(r[0]&63)<<56n|BigInt(r[1])<<48n|BigInt(r[2])<<40n|BigInt(r[3])<<32n|BigInt(r[4])<<24n|BigInt(r[5])<<16n|BigInt(r[6])<<8n|BigInt(r[7]);break}return t}getNumBytesForLengthInteger(r){let e=r[0]&192;return e===0?1:e===64?2:e===128?4:e===192?8:-1}};var Rr=class{constructor(r){o(this,"encoder");o(this,"compression");o(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new Er,this.compression=r??null}encode(r){let e=this.encoder.encode(r);e=this.compress(e);let t=this.lengthEncoder.encode(e.length),i=new Uint8Array(t.length+e.length);return i.set(t),i.set(e,t.length),i}compress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return He.gzipSync(r);case"deflate":return He.zlibSync(r);case"deflate-raw":return He.deflateSync(r);default:return r}}},Cr=class{constructor(r){o(this,"decoder");o(this,"compression");o(this,"lengthDecoder");o(this,"buffer");o(this,"expectedLength");o(this,"offset");o(this,"lengthPrefixLength");this.decoder=new TextDecoder,this.lengthDecoder=new Tr,this.compression=r??null,this.buffer=new Uint8Array(0),this.expectedLength=null,this.offset=0}decode(r){let e=[];for(this.buffer=new Uint8Array([...this.buffer,...r]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return e;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return e;let t=this.buffer.subarray(this.offset,this.offset+this.expectedLength);t=this.decompress(t),e.push(this.decoder.decode(t)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return e}readLength(r){if(r.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(r),this.lengthPrefixLength<0)throw new Error("Invalid length prefix");let e=this.lengthDecoder.decode(r.subarray(0,this.lengthPrefixLength));return e===null?null:Number(e)}decompress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return He.gunzipSync(r);case"deflate":return He.unzlibSync(r);case"deflate-raw":return He.inflateSync(r);default:return r}}};var Zt=class{constructor(r,e={}){o(this,"webTransport");o(this,"stream",null);o(this,"writer",null);o(this,"reader",null);o(this,"url");o(this,"options");o(this,"compression");o(this,"encoder");o(this,"decoder");o(this,"onopen",null);o(this,"onmessage",null);o(this,"onerror",null);o(this,"onclose",null);o(this,"readyState",WebSocket.CONNECTING);this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new Rr(this.compression),this.decoder=new Cr(this.compression),this.connect()}getCompressionTypeFromUrl(r){try{let t=new URL(r).searchParams.get("compression");switch(t){case"gzip":case"deflate":case"deflate-raw":return t;default:return null}}catch(e){return d.log("Exception while parsing compression",e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,d.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(r){d.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error")),this.onclose?.(new CloseEvent("close",{code:1006,reason:"Connection Failed"}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:r,value:e}=await this.reader.read();if(r)break;e&&(yield e)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let r of this.readChunks())this.decoder.decode(r).forEach(t=>{this.onmessage?.(new MessageEvent("message",{data:t}))});this.close(1e3,"Stream Closed")}catch(r){d.error("[WebTransport] Stream read failed",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(r){if(this.readyState!==WebSocket.OPEN){d.warn("[WebTransport] Attempt to send data before webtransport is open");return}if(!this.writer){d.warn("[WebTransport] Attempt to send data before stream is ready");return}try{await this.writer.ready;let e=this.encoder.encode(r);await this.writer.write(e)}catch(e){d.error("[WebTransport] Failed to send data",e),this.onerror?.(new Event("error")),this.close(1006,"Failed to send data")}}close(r=1e3,e){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(t){d.warn("[WebTransport] already closed. Did we get a STOP_SENDING? ignore",t)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent("close",{code:r,reason:e})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return"WebTransport"in window&&typeof WebTransport=="function"?M.browserName()==="Firefox"?p.webtransportFF:M.browserName()!=="Safari":!1}};var Nn="open",Go=10,Wo=["service-unavailable","conversation-ended","invalid-token"],ei=class n extends ci{constructor(){super(...arguments);o(this,"socket",null);o(this,"sequence",1);o(this,"lastStamp",0);o(this,"websocketCommandsQueue",[]);o(this,"datachannelCommandsQueue",[]);o(this,"incomingCache",[]);o(this,"responseHandlers",{});o(this,"connectionType");o(this,"reconnectCount",0);o(this,"endpoint");o(this,"wtEndpoint",null);o(this,"conversationResolve",null);o(this,"conversationReject",null);o(this,"connected",!1);o(this,"listenersReady",!1);o(this,"postfix","&platform="+p.platform+"&appVersion="+p.appVersion+"&version="+p.protocolVersion+"&device="+p.device+"&capabilities="+rt.getFlags());o(this,"peerId",null);o(this,"conversationId",null);o(this,"reconnectTimer",0);o(this,"connectionMessageWaitTimer",0);o(this,"doctorTimer",0);o(this,"participantIdRegistry",null);o(this,"producerNotificationDataChannel",null);o(this,"producerCommandDataChannel",null);o(this,"producerCommandDataChannelEnabled",!1);o(this,"producerCommandSerializationService",new cr)}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=t=>{let i=this.participantIdRegistry?.handleMessage(t.data);i&&this._handleMessage(i)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(i=>{i&&this._handleMessage(i)}).catch(i=>{d.warn("[signaling] cannot parse message at producerCommandDataChannel",i)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return this.postfix+=`&clientType=${p.clientType}`,new Promise((t,i)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){R.log(D.SOCKET_ACTION,"already_opened"),i(Error("Socket already opened"));return}this.conversationResolve=a=>{t(a),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=a=>{i(a),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},i=!0,a=0){if(t.participantId){let s=I.decomposeParticipantId(t.participantId),c=I.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:c.id,participantType:c.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,i,a)}async _sendRaw(e,t={},i=!0,a=0){let s=c=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(c),this.producerCommandDataChannel?.readyState===Nn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){R.log(D.SOCKET_ACTION,"not_opened"),d.warn("[signaling] socket is not opened"),c.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(R.log(D.SOCKET_ACTION,"invalid_state"),d.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(c),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((c,u)=>{let l=(P,b=!1)=>{!a||b?u(P):(d.debug("[signaling] resending a signaling message",e,E.sequence),a--,s(E))},m=this.sequence++,h=`${e}_${m}`;pe.setMark(h);let E={sequence:m,name:e,statMarkName:h,params:t,responseTimer:0,needResponse:i,resolve:c,reject:l};s(E)})}_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,i){let a=Object.assign({sdp:t},i);return this._send(x.TRANSMIT_DATA,{participantId:e,data:a})}async acceptCall(e){return this._send(x.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(x.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Go)}async changeParticipantState(e,t){let i={participantState:{state:e}};return t&&(i.participantId=t),this._sendRaw(x.CHANGE_PARTICIPANT_STATE,i)}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 i={capabilities:t};return e&&(i.description=e.sdp),this._send(x.ALLOCATE_CONSUMER,i)}async acceptProducer(e,t){let i={description:e.sdp};return t&&(i.ssrcs=t),this._send(x.ACCEPT_PRODUCER,i)}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 recordSetConf(e={hideParticipantCount:!1,roomId:null}){let t={options:{hideParticipantCount:e.hideParticipantCount},roomId:e.roomId};return e.king&&(t.king=e.king),e.pawns?.length&&(t.pawns=e.pawns.join(",")),this._send(x.RECORD_SET_CONF,t)}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,i){let a={participantId:e,roles:t};return i&&(a.revoke=!0),this._sendRaw(x.GRANT_ROLES,a)}async muteParticipant(e,t,i,a=null){return this._sendRaw(x.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:i,roomId:a})}async enableFeatureForRoles(e,t){return this._sendRaw(x.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,i){let a={participantId:e,roomId:i};return t&&(a.unpin=!0),this._sendRaw(x.PIN_PARTICIPANT,a)}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,i=!1){let a={};return e&&(a.fromId=e),t&&(a.count=t),i&&(a.backward=i),this._send(x.GET_WAITING_HALL,a)}async promoteParticipant(e,t=!1){let i={};return e&&(i.participantId=e),t&&(i.demote=t),this._sendRaw(x.PROMOTE_PARTICIPANT,i)}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)}_connect(e,t){if(this.socket&&this.socket.readyState<WebSocket.CLOSING)return;this.connectionType=e;let i="";e&&(i+=`&tgt=${e}`),e===Ye.RETRY&&this.lastStamp&&(i+=`&recoverTs=${this.lastStamp}`),i=a(i),t?(i+="&compression=deflate-raw",i+=`&ua=${navigator.userAgent}`,d.debug("[signaling] connecting to wt "+this.wtEndpoint+this.postfix+i),this.socket=new Zt(this.wtEndpoint+this.postfix+i)):(d.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+i),this.socket=new WebSocket(this.endpoint+this.postfix+i)),this._markTransportStat(e===Ye.RETRY?"reconnected":"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();function a(s){if(!p.useParticipantListChunk)return s;let c=p.participantListChunkInitIndex;s+=`&partIdx=${c}`;let u=p.participantListChunkInitCount;return u!==null&&(s+=`&partCount=${u}`),s}}_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(){d.debug("[signaling] socket opened"),R.log(D.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Ye.RETRY?"reconnected":"connected")}_onMessage(e){if(this._startDoctor(),e.data==="ping"){lt.mark(this._getSocketType()),this._markTransportStat("failed_pings"),v.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send("pong");return}try{let t=JSON.parse(e.data);v.onSignalingMessage(t),this._handleMessage(t)}catch(t){R.log(D.SOCKET_ACTION,"parse_error"),d.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(d.debug("[signaling] signaling connected",e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.postfix+=`&peerId=${e.peerId.id}`,this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat("restart"),this._triggerEvent(Ae.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Ae.NOTIFICATION,{type:"notification",notification:L.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===L.ACCEPTED_CALL&&t.peerId.id===this.peerId&&t.peerId.type==="WEB_TRANSPORT"||this._handleMessage(t)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(Ae.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:R.log(D.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){R.log(D.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Wo.includes(e.error):!1;switch(d.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case"service-unavailable":let i=new j(y.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Ae.NOTIFICATION,{notification:L.CLOSED_CONVERSATION,reason:y.SERVICE_UNAVAILABLE});break;case"conversation-ended":this.conversationReject?this.conversationReject(new j(e.reason||oe.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(Ae.NOTIFICATION,{notification:L.CLOSED_CONVERSATION,reason:e.reason});break;case"participant-not-found":this._throwError(new Error(`Signaling error: ${e.error}`));break;case"invalid-token":default:if(!t)break;this.connected?this._throwError(new Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new j(e.reason||oe.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(Ae.FAILED,e)}_onError(e){R.log(D.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){R.log(D.SOCKET_ACTION,"closed"),d.debug("[signaling] connection closed",{code:e.code,reason:e.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new j(y.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(new Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let e=Math.min(n.RECONNECT_MAX_DELAY,n.RECONNECT_DELAY*Math.pow(2,this.reconnectCount-1));d.log(`[signaling] reconnect websocket after ${e}ms (${this.reconnectCount})`),R.log(D.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Ye.RETRY,!1),e)}_handleCommandResponse(e,t){if(!Object.hasOwn(this.responseHandlers,t.sequence))return;let i=this.responseHandlers[t.sequence];window.clearTimeout(i.responseTimer);let a=pe.measureMark(i.statMarkName);a!==null&&pt.mark(i.name,a,this._getSocketType()),d.debug(`[signaling] command response [${t.sequence}]`,t),e?(delete this.responseHandlers[t.sequence],i.resolve(t)):t.type==="error"?(delete this.responseHandlers[t.sequence],R.log(D.SOCKET_ACTION,"response-error"),i.reject(new Error(t.error||`Response error [${i.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],R.log(D.SOCKET_ACTION,"response-timeout"),i.reject(new Error(t.error||`Response timeout [${i.name}]`))):i.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),n.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(d.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Nn){t.reject(new Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let i=this._serializeBinary(t);i!==null&&this.producerCommandDataChannel.send(i)}else{if(!this.socket||this.socket.readyState!==WebSocket.OPEN){t.reject(new Error("Invalid state or socket already closed"));continue}this._startResponseTimer(t),this.socket.send(this._serializeJson(t))}}}_startResponseTimer(e){if(!e.needResponse){e.resolve({type:"response",sequence:e.sequence,response:e.name});return}e.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:e.name,sequence:e.sequence,type:"timeout"}),n.WAIT_RESPONSE_DELAY),this.responseHandlers[e.sequence]=e}_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 d.warn("[signaling] cannot get binary data for data channel command: "+e.name),null}_serializeJson(e){let t;e.name===x.UPDATE_DISPLAY_LAYOUT?t=this._convertDisplayLayout(e.params):t=e.params;let i=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(i)}_convertDisplayLayout(e){let t=e,i={};for(let a in t)Object.hasOwn(t,a)&&(i[a]=en(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new j(oe.SIGNALING_FAILED,{message:"Unable to connect to the signaling: connection timeout",remote:!0}))},n.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=n.RECONNECT_MAX_COUNT)&&(this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?d.warn(`[signaling] socket is dead. Fallback to WebSocket. Trying to connect ${this.reconnectCount}`):d.warn(`[signaling] socket is dead, trying to reconnect ${this.reconnectCount}`),this._logTransportStat("failed_pings"),this._disconnect(4e3),this._connect(Ye.RETRY,!1),this.reconnectCount++},n.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return Zt.isBrowserSupported()&&this.wtEndpoint!==null&&p.webtransport}_getSocketType(){return this.socket instanceof Zt?"wt":"ws"}_markTransportStat(e){let t=this._getSocketType(),i=na[e][t];pe.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=na[e][i];Me.logEventualStat({name:a,...t})}};var Ln=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(Ln||{}),Ne=Ln;var Un=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(Un||{}),ut=Un;var Bn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(Bn||{}),ma=Bn;var Fn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(Fn||{}),ha=Fn;var Vn=(u=>(u.REQUIRE_AUTH_TO_JOIN="REQUIRE_AUTH_TO_JOIN",u.AUDIENCE_MODE="AUDIENCE_MODE",u.WAITING_HALL="WAITING_HALL",u.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",u.ADMIN_IS_HERE="ADMIN_IS_HERE",u.ASR="ASR",u.FEEDBACK="FEEDBACK",u.RECURRING="RECURRING",u))(Vn||{}),at=Vn;function jn(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function Hn(n,r){let e=new Set(n);for(let[t,i]of Object.entries(r))i?e.add(t):e.delete(t);return Array.from(e)}var Gn=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(Gn||{}),Ge=Gn;var Wn=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(Wn||{}),Z=Wn;var Kn=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(Kn||{}),Mi=Kn;var $n=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))($n||{}),qn=$n;function zn(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var Jn=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(Jn||{}),Et=Jn;function Ai(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var _a=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(_a||{}),z;(m=>{function n(h){return h.length?typeof h[0]=="object"?h:h.map(E=>r(E)):[]}m.fromIds=n;function r(h,E="USER",P=0){return{id:h,type:E,deviceIdx:P}}m.fromId=r;function e(h,E=!0){let P=E?h.decorativeExternalUserId:h.externalId,b=h.deviceIdx??0;if(P)return t(P,b)}m.fromSignalingParticipant=e;function t(h,E=0){return{id:h.id,type:h.type==="ANONYM"?"ANONYM":"USER",deviceIdx:E}}m.fromSignaling=t;function i(h){return h.id}m.toSignaling=i;function a(h){let E=h.deviceIdx||0;return`{"id":"${h.id}","type":"${h.type}","deviceIdx":${E}}`}m.toString=a;function s(h,E="USER",P=0){return a(r(h,E,P))}m.fromIdToString=s;function c(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}m.fromString=c;function u(h,E){return h.id===E.id&&h.type===E.type&&h.deviceIdx===E.deviceIdx}m.compare=u;function l(h){return h?.deviceIdx||0}m.getDeviceIdx=l})(z||(z={}));function Yn(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function Qn(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var Pr=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function Xn(n){if(n.conversation?.muteStates)return n.conversation.muteStates;if(n.muteState&&n.muteOptions)return n.muteOptions.reduce((r,e)=>(r[e]=n.muteState,r),{})}function Ko(n,r){switch(n){case de.AUDIO:return!!r.isAudioEnabled;case de.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case de.VIDEO:return!!r.isVideoEnabled;case de.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function Zn(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case Ge.MUTE:case Ge.MUTE_PERMANENT:{Ko(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function es(n){let{muteStates:r={},mediaSettings:e}=n;return Zn(r,e)}function ts(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return Zn(r,t)}function is(n,r){let e=new Uint8Array(r),t=0,i=0;for(;t<n.length&&i<r;){let a=n[t++],s=a>>4,c=a&15;if(s===15){let m;do m=n[t++],s+=m;while(m===255)}for(let m=0;m<s&&!(i>=r);m++)e[i++]=n[t++];if(t>=n.length||i>=r)break;let u=n[t]|n[t+1]<<8;if(t+=2,c===15){let m;do m=n[t++],c+=m;while(m===255)}c+=4;let l=i-u;for(let m=0;m<c&&!(i>=r);m++)e[i++]=e[l+m]}return e}var ti=class{constructor(r){o(this,"_fixNoPacketsApplied",!1);o(this,"_fixNoPacketsChecked",!1);o(this,"_fixTooManyPacketsApplied",!1);o(this,"_fixTooManyPacketsSucceeded",!1);o(this,"_fixTooManyPacketsFailed",!1);o(this,"_fixTooManyPacketsTime");o(this,"_mediaSource");o(this,"_lastPacketsSent");o(this,"_lastPacketsSentTime");o(this,"_toggleAudioPromise",null);o(this,"_fixNoPacketsAppliedVideo",!1);this._mediaSource=r}_fixAudioDeviceNoPackets(r){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,R.log(D.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,R.log(D.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(M.getMicrophonePermissionState()!=="denied"))}}_fixAudioDeviceTooManyPackets(r){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let e=75,t=Date.now();if(!this._lastPacketsSentTime)r.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent);else if(t-this._lastPacketsSentTime>500){let i=(r.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent,this._fixTooManyPacketsApplied?i>e?(d.log("[AudioFix] Failed to fix RV"),R.log(D.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),R.log(D.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,R.log(D.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0),this._fixTooManyPacketsTime=t)}}fix(r){if(!this._mediaSource)return;let e=r.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(r){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=r.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{this._mediaSource.getMediaSettings().isVideoEnabled&&this._mediaSource.toggleVideo(!0)}))}};var Di=class{constructor(r){o(this,"_output",null);o(this,"_volume",1);o(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});o(this,"_statFirstMediaReceived");this._statFirstMediaReceived=r}add(r){this.destroy(),this._output={},this._output.audioTrack=r,this._initAudioElement()}remove(r){!this._output||this._output.audioTrack!==r||this.destroy()}get volume(){return this._volume}set volume(r){this._volume=Math.max(0,Math.min(1,r)),this._output&&this._output.audioElement&&(this._output.audioElement.volume=this._volume)}_initAudioElement(){if(p.muteMode||!this._output?.audioTrack)return;let r=M.browserName()!=="Safari"||M.isMobile(),e=document.createElement(r?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{d.warn("[audio] Error on play audio"),v.onAutoplayError()},i=s=>{e.srcObject=new MediaStream([s]),e.load();let c=e.play();c&&c.catch(t)},a=()=>{d.debug("[audio] Recover audio playback");let s=this._output?.audioTrack;s?i(s):d.warn("[audio] Broken audio track")};e.onpause=a,e.onstalled=a,e.onerror=a,e.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(this._output.audioTrack),this._output.audioElement=e}_stopAudioElement(){this._output?.audioElement&&(this._output.audioElement.pause(),this._output.audioElement.srcObject=null),this._output?.audioTrack?.stop()}destroy(){this._output&&(this._stopAudioElement(),this._output=null)}async changeOutput(){try{if(!this._features.setSinkId)throw new Error('Feature "setSinkId" is not supported');if(!this._output?.audioElement)return;let r=M.getSavedOutput();r&&await this._output.audioElement.setSinkId?.(r.deviceId)}catch(r){throw R.log(D.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}};var $o=90,qo=3,wi=class extends se{constructor(){super(...arguments);o(this,"_lastMemoryStat",{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(i=>{let a=typeof i.userId=="string"&&t[i.userId]||null;i.userId=a?.externalId}),v.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)),i=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>$o?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=qo)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var zo=44100,Lt=class{constructor(r,e){o(this,"_analyser",null);o(this,"_gainNode",null);o(this,"_fftBins",null);o(this,"_mediaStreamSource",null);o(this,"_lastSmoothedLevel",0);o(this,"_trackId");o(this,"_track");o(this,"_stream");this._trackId=r,this._track=e,this._stream=new MediaStream([e]);try{let t=M.getAudioContext();this._gainNode=t.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(t.destination),this._analyser=t.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=t.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 r=zo/this._fftBins.length,e=Math.ceil(p.voiceParams.minFreq/r),t=Math.floor(p.voiceParams.maxFreq/r);return this._fftBins.subarray(e,t)}getLevel(){let r=this._getBins(),t=r.reduce((a,s)=>a+s,0)/r.length/255,i=this._lastSmoothedLevel*p.voiceParams.smoothing+t*(1-p.voiceParams.smoothing);return this._lastSmoothedLevel=i,{real:t,smoothed:i}}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)}};var ki=class extends se{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);let t=()=>{this._detector&&v.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 i=()=>{let a=e.getSendAudioTrack();a&&this.init(a)};this.subscribe(e,"SOURCE_CHANGED",a=>{a.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&i()}),this.subscribe(e,"SOURCE_READY",i),i()}init(e){this._stopDetector(),this._detector=new Lt("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()}};var yr=class{constructor(r){this.processor=r;o(this,"queue",[]);o(this,"isProcessing",!1)}add(r){this.queue.push(r),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let r=this.queue.shift();if(r)try{await this.processor(r)}catch{d.error(`Can't process message ${JSON.stringify(r)}`)}}this.isProcessing=!1}}};var br=class extends se{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);o(this,"_activeParticipants");o(this,"_removedParticipants");this.subscribe(e,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(e,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,"SIGNALLED_ACTIVE_PARTICIPANTS",this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._detector?.destroy(),this._detector=null}_onRemoteTrackAdded(e,t,i){if(i.kind==="audio"&&(this._detector?.destroy(),this._detector=new Lt(e,i),!this._interval)){let a=()=>{this._collectVolumes(),this._interval=window.setTimeout(a,p.voiceParams.interval)};this._interval=window.setTimeout(a,p.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,i){i.kind==="audio"&&(!this._detector||this._detector.track!==i||(this._detector.destroy(),this._detector=null))}_collectVolumes(){if(!this._detector)return;let e={},t=this._detector.trackId,i=this._detector.getLevel();if(t===ze.AUDIO_MIX){if(this._activeParticipants)for(let a of this._activeParticipants)e[a]=i;if(this._removedParticipants){for(let a of this._removedParticipants)e[a]={real:0,smoothed:0};this._removedParticipants=null}}else e[t]=i;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null,this._removedParticipants=null)}};var Mr=class extends se{constructor(e,t,i){super();o(this,"_speakerId",null);o(this,"_serverSideSpeakerDetection",!1);this._serverSideSpeakerDetection=i==="SERVER",this.subscribe(e,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this.subscribe(t,"SIGNALLED_SPEAKER_CHANGED",this._onServerSpeakerChanged.bind(this)),this.subscribe(t,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,i=null;if(Object.keys(e).forEach(a=>{let s=e[a].smoothed;s>t&&s>p.voiceParams.threshold&&(t=s,i=a)}),i&&i!==this._speakerId){let a=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>a*p.voiceParams.speakerLevelMultiplier&&(this._speakerId=i,this._triggerEvent("SPEAKER_CHANGED",i))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent("SPEAKER_CHANGED",e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e==="SERVER"}};var Oi=class extends se{constructor(e,t,i){super();o(this,"_transport");o(this,"_volumes",{});o(this,"_participants",{});o(this,"_connectionTimeout",0);o(this,"_volumeTimeout",0);this._transport=e,this._participants=i,this.subscribe(e,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(t,"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==="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==="FAILED"&&this._connectionTimeout&&(d.warn("Transport failed, send callSpecError"),R.log(D.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(){let e=i=>i!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(d.warn("There is not connected transport, send callSpecError"),R.log(D.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 i="UNKNOWN",a=this._participants[t];a&&a.platform&&(i=a.platform),e.indexOf(i)<0&&(e.push(i),R.log(D.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var Ar=class n{static correctHangupReason(r){switch(r){case y.HUNGUP:return"hangup";case y.CANCELED:return"canceled";case y.REJECTED:return"rejected";case y.BUSY:return"busy";case y.FAILED:return"failed";case y.MISSED:return"missed";case y.ANOTHER_DEVICE:return"another_device";case y.REMOVED:return"removed";case y.BANNED:return"banned";case y.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![y.HUNGUP,y.CANCELED,y.REJECTED,y.FAILED,y.BUSY,y.MISSED,y.ANOTHER_DEVICE,y.REMOVED,y.BANNED,y.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;R.logClientStats({name:X.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Dr=class{constructor(){o(this,"_isCallMarked",!1);o(this,"_isFinished",!1);o(this,"_callType",null)}markAcceptCall(r){this.mark(r==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(r){r==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(r){r==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(r){r==="SERVER"&&this.mark("server_join_server")}mark(r){this._isCallMarked||(this._isCallMarked=!0,this._callType=r,pe.setMark(X.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Me.logEventualStat({name:X.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var Jo=1e3,Yo=1e4;var Qo=15,q=class q extends se{constructor(e,t){super();o(this,"_api");o(this,"_signaling");o(this,"_signalingActor");o(this,"_mediaSource",null);o(this,"_conversation",null);o(this,"_myLastRequestedLayouts",{});o(this,"_state","IDLE");o(this,"_participantState",Z.CALLED);o(this,"_participants",{});o(this,"_pendingParticipants",new Map);o(this,"_transport",null);o(this,"_debugInfo",null);o(this,"_volumesDetector",null);o(this,"_speakerDetector",null);o(this,"_localVolumeDetector",null);o(this,"_specListener",null);o(this,"_activeSpeakerId",null);o(this,"_lastSignalledActiveSpeakerId",null);o(this,"_isRealTimeAsrRequested",!1);o(this,"_serverSettings",Sn());o(this,"_onUnload");o(this,"_audioOutput");o(this,"_lastStalled",{});o(this,"_audioMixStalled",!1);o(this,"_audioFix",null);o(this,"_streamByStreamId",new Map);o(this,"_streamIdByStreamDescription",new Map);o(this,"_streamWaitTimerByStreamDescription",new Map);o(this,"_sequenceNumberByStreamDescription",new Map);o(this,"_cooldownTimestampByStreamDescription",new Map);o(this,"_cooldownQueueCleanupTimer",null);o(this,"_statFirstMediaReceived");o(this,"_changeMediaSettings",I.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(t){if(d.warn("changeMediaSettings failed with error",t),t.message==="chatRoom.maxShareCountExceeded")return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100));R.create(e,t),R.setConversationIdProvider(()=>this._conversation?.id||null),Me.create(),it.create(()=>this._transport?.getTopology()),lt.create(),pt.create(),this._api=e,this._signaling=new ei,this._signalingActor=new yr(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?y.CANCELED:y.HUNGUP),p.clientEventsLoggingEnabled&&R.logClientEvent({event_type:X.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),R.destroy(),Me.destroy(),it.destroy(),lt.destroy(),pt.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new Dr,this._audioOutput=new Di(this._statFirstMediaReceived),p.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),Jo))}static current(){return q._current}static hangupAfterInit(){q._activationMutex&&!q._current&&(q._delayedHangup=!0)}static id(){return q._current?._conversation?.id||null}async onStart({opponentIds:e,opponentType:t,mediaOptions:i,payload:a="",joiningAllowed:s=!1,requireAuthToJoin:c=!1,onlyAdminCanShareMovie:u,externalIds:l,onFastStart:m}){if(q._activationMutex)throw R.log(D.ERROR,"startCall"),d.warn("Conversation: there is already running activation"),new j(y.FAILED);let h=Date.now();q._activationMutex=!0,Oe.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let E=this._mediaSource.getMediaSettings();t===ut.CHAT||e&&e.length>1?this._logWithMediaSettings(D.OUTGOING_MULTIPARTY_CALL,E):this._logWithMediaSettings(D.OUTGOING_CALL,E);let P=await this._startConversation({opponentIds:e,opponentType:t,direction:Ne.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:c,onlyAdminCanShareMovie:u,externalIds:l,startedTime:h,onFastStart:m});if(!this._conversation)throw new j(y.UNKNOWN_ERROR);if(this._participantState=Z.ACCEPTED,this._changeMediaSettings(E),await this._processConnection(P),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),q._delayedHangup)throw new j(y.CANCELED);return d.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:i}),await this._processConnectionSharedMovieInfo(P),await this._processConversationUrlSharingInfo(P),v.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants()),await this._onConversationParticipantListChunk(P),await this._processPinnedParticipants(P),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),q._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(E){throw this._close(E,"Unable to start conversation"),E}finally{q._activationMutex=!1}}async onJoin(e){if(q._activationMutex)throw R.log(D.ERROR,"joinCall"),d.warn("Conversation: there is already running activation"),new j(y.FAILED);let t=Date.now();q._activationMutex=!0,this._state="PROCESSING",Oe.startSession();try{let i=!!e.observedIds?.length;if(i&&p.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new j(y.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new j(y.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a),this._conversation.waitForAdmin||this._conversation.waitingHall?(d.log(this._conversation.waitForAdmin?"Wait for admin":"In waiting hall"),q._current=this,q._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus(this._conversation.waitForAdmin?"WAIT_FOR_ADMIN":"WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(i){throw q._activationMutex=!1,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){d.debug("Join conversation part 2"),q._activationMutex=!0;try{if(this._participantState=Z.ACCEPTED,!this._conversation||!this._mediaSource)throw new j(y.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(e),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state==="CLOSE")return this._conversation;if(q._delayedHangup)throw new j(y.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),t),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),q._current=this;let i=this._extractLocalParticipantFromConnection(e);if(i){let a=I.mapParticipantState(i);Object.keys(a).length>0&&v.onLocalParticipantState(a)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(t){throw this._close(t,"Unable to join conversation"),t}finally{q._activationMutex=!1}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(a=>!!a)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let i={rooms:await this._extractExternalRooms(e)};return t&&(i.roomId=t),i}async onPush(e,t=ne.USER,i,a,s){if(q._activationMutex)throw d.warn("Conversation: there is already running activation"),new j(y.REJECTED);q._activationMutex=!0;try{let c=Date.now(),u=await this._prepareConversation(e,t,i,a,s);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new j(y.UNKNOWN_ERROR);if(!u.conversation.participants.find(m=>m.state===Z.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),R.log(D.PUSH,"rejected"),new j(y.REJECTED);if(Oe.startSession(),await this._processConnection(u),this._extractConnectionUrlSharingInfo(u),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(u),this._signaling.readyToSend(),this._logCallStartEvent(c,Ne.INCOMING),R.log(D.PUSH,"accepted"),q._current=this,q._delayedHangup)throw new j(y.CANCELED);q._activationMutex=!1}catch(c){throw q._activationMutex=!1,this._close(c,"Unable to handle inbound call push"),c}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(at.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(at.WAIT_FOR_ADMIN),i=e.conversation.options.includes(at.ADMIN_IS_HERE);return!t||t&&i?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(i=>I.comparePeerId(i.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(at.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new j(y.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.ACCEPT_CONCURRENT,e),d.debug("Concurrent call",{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.getMediaSettings()),v.onCallAccepted(),this._state="ACTIVE",this._participantState=Z.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}async _getMainRoomParticipants(){let e=await this._getParticipants();return I.mapSharedParticipants(Object.values(e).filter(t=>!t.isInRoom))}_decodeExternalConversationParams(e){let[t,i]=e.split(":"),a=parseInt(t,10);if(isNaN(a))throw new Error("Invalid original length in prefix");let s=atob(i),c=new Uint8Array(s.length);for(let u=0;u<s.length;u++)c[u]=s.charCodeAt(u);try{let l=is(c,a).reduce((Ie,Te)=>(Ie+=String.fromCharCode(Te),Ie),""),{srcp:m,stne:h,tkn:E,trne:P,trnp:b,trnu:V,wse:J,wte:ce}=JSON.parse(l);return{token:E,endpoint:J,wt_endpoint:ce,turn_server:{urls:P.split(","),username:V,credential:b},stun_server:{urls:h.split(",")},client_type:m}}catch(u){throw this._close(u,"Can't decompress conversation params"),u}}_logCallStartEvent(e,t){let i={[Ne.OUTGOING]:"outgoing",[Ne.INCOMING]:"incoming",[Ne.JOINING]:"join"};Me.logEventualStat({name:X.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw R.log(D.ERROR,"acceptIncoming"),d.error("Unable to accept a call - invalid state"),new Error("Unable to accept a call - invalid state");if(!this._mediaSource||!this._conversation||!this._transport)throw new j(y.UNKNOWN_ERROR);this._state="PROCESSING",d.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=Z.ACCEPTED;let i=this._getMuteStatesForCurrentRoom(),a=Object.keys(i);a.length&&this._onMuteParticipant({muteStates:i,mediaOptions:a,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());if(s.rooms?.rooms){let u=await this._getParticipants();s.rooms.rooms.forEach(l=>{l.participantIds?.forEach(m=>{u[m]&&(u[m].isInRoom=!0)})})}this._conversation.roomId=s.rooms?.roomId||null;let c=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(v.onCallAccepted(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),c),p.useParticipantListChunk){let u=await this._getInitialParticiapntListChunk(),l=await this._getParticipants();u?.participants?.forEach(m=>{let h=I.composeId(m),E=l[h];E&&(E.movieShareInfos=m.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:u})}return v.onLocalStatus("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(t){throw this._close(t,"Unable to accept call"),t}}async decline(){if(this._state!=="IDLE")throw R.log(D.ERROR,"declineIncoming"),d.error("Unable to decline a call - invalid state"),new Error("Unable to decline a call - invalid state");this._state="PROCESSING",d.debug("Decline incoming call"),this._logWithMediaSettings(D.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=Z.HUNGUP,this._signaling.ready&&await this._signaling.hangup(y.REJECTED),this._close(new j(y.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?y.HUNGUP:y.CANCELED;R.log(D.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new j(e))):v.onHangup(new j(y.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new j(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map(z.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;if(!s&&i.rejectedParticipants)throw new Error(i.rejectedParticipants[0].reason);for(let c of s)await this._onAddParticipant(I.composeId(c),c,a)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new j(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipantLegacy(e,t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;for(let c of s)await this._onAddParticipant(I.composeId(c),c,a)}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 i=[];for(let a of e)(a.state===Z.CALLED||a.state===Z.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===Z.ACCEPTED&&i.push(a.id);i.length?this._transport.open(i,null,!!this._conversation?.observer):this._transport.getTopology()==="SERVER"&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&d.error(t,e),d.debug("Close conversation",e),Ar.sendHangupEvent(e,this._transport?.getTopology()),it.destroy(),lt.logMetrics(this._transport?.getTopology()),lt.destroy(),pt.logMetrics(this._transport?.getTopology()),pt.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(y.FAILED):R.log(D.ERROR,e.hangup),q._activationMutex=!1;let i=this._conversation&&this._conversation.id;if([y.CANCELED,y.NOT_FRIENDS,y.CALLEE_IS_OFFLINE,y.CALLER_IS_BLOCKED,y.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===y.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===y.SOCKET_CLOSED||e.hangup===y.NOT_FOUND)&&q._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===y.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state="CLOSE",this._participantState=Z.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),R.destroy(),Me.destroy(),this._conversation=null,this._myLastRequestedLayouts={},q._current=null,q._delayedHangup=!1,v.onHangup(e||new j(y.UNKNOWN_ERROR),i)}async destroy(){let e=this._conversation&&this._conversation.id;d.debug("Destroy conversation",{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state="CLOSE",this._participantState=Z.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._cleanupListeners(),R.destroy(),Me.destroy(),this._conversation=null,this._myLastRequestedLayouts={},q._current=null,q._delayedHangup=!1}async _getConversationParams(e){let t=await this._api.getConversationParams(e);d.debug("Api.getConversationParams",t);let i=[],{turn_server:a,stun_server:s}=t;if(s&&i.push(s),a&&a.urls){let c=a.urls.filter((u,l,m)=>m.indexOf(u)===l);c.push(`${c[c.length-1]}?transport=tcp`),i.push({urls:c,username:a.username,credential:a.credential})}return p.iceServers=i,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:i,wt_endpoint:a,token:s,client_type:c}){let u=[];if(t&&u.push(t),e&&e.urls){let l=e.urls.filter((m,h,E)=>E.indexOf(m)===h);l.push(`${l[l.length-1]}?transport=tcp`),u.push({urls:l,username:e.username,credential:e.credential})}p.iceServers=u,p.wssBase=i,p.wssToken=s,a&&(p.wtsBase=a),c&&(p.clientType=c)}_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:i,mediaOptions:a,payload:s="",joiningAllowed:c=!1,requireAuthToJoin:u=!1,onlyAdminCanShareMovie:l,externalIds:m,startedTime:h,onFastStart:E}){pe.setMark(X.SIGNALING_CONNECTED);let P=I.uuid();d.debug("Conversation: start",{conversationId:P,opponentIds:e,opponentType:t,direction:i});let b=a.includes(de.VIDEO),V;if(E){let ce={deviceId:this._api.deviceId(),sdkVersion:p.sdkVersion,clientAppKey:p.apiKey,platform:p.platform,protocolVersion:p.protocolVersion,domainId:p.domain,capabilities:rt.getFlags()},Ie=JSON.stringify(ce),Te;try{if(Te=await E({internalParams:Ie,conversationId:P,externalIds:m,opponentType:t,mediaOptions:a,isVideo:b,joiningAllowed:c,requireAuthToJoin:u}),!Te.internalCallerParams)throw new j(y.FAST_START_ERROR,{message:JSON.stringify(Te)})}catch(Y){throw Y instanceof Error?new j(y.FAST_START_ERROR,{message:Y.message}):new j(y.FAST_START_ERROR,{message:String(Y)})}try{let Y=JSON.parse(Te.internalCallerParams);V={endpoint:Y.endpoint,wt_endpoint:Y.wtEndpoint,id:P,is_concurrent:Y.isConcurrent,client_type:Y.clientType,rejected_participants:Te.rejectedParticipants?.map(Re=>({...Re,status:Re.status})),stun_server:Y.stun,turn_server:Y.turn,token:new URL(Y.endpoint).searchParams.get("token")??""},d.debug("FastStart",V)}catch{throw new j(y.UNKNOWN_ERROR,{message:"Cannot parse internal params"})}}else V=await this._api.startConversation(P,e,t,b,s,c,u,{onlyAdminCanShareMovie:l},m),d.debug("Api.startConversation",V);this._setConversationParams(V);let J=await this._connectSignaling(Ye.START,V);return await this._setConversation(V,J,i),this._logCallStartEvent(h,Ne.OUTGOING),J}async _joinConversation(e,t){pe.setMark(X.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:c,observedIds:u,payload:l}=e;d.debug("Conversation: join",{conversationId:i,joinLink:c,observedIds:u});let m=a.includes(de.VIDEO),h;if(i)h=await this._api.joinConversation(i,m,s);else if(c)h=await this._api.joinConversationByLink(c,m,u,l);else throw new j(y.UNKNOWN_ERROR);d.debug("Api.joinConversation",h),this._setConversationParams(h);let E=await this._connectSignaling(Ye.JOIN,h);return await this._setConversation(h,E,Ne.JOINING),this._logCallStartEvent(t,Ne.JOINING),E}async _prepareConversation(e,t=ne.USER,i,a,s){pe.setMark(X.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let c=this._api.getUserId();if(!c)throw new j(y.UNKNOWN_ERROR);let u=0,l="",m="",h={id:e,peerId:i,endpoint:l,wt_endpoint:m,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let P=this._decodeExternalConversationParams(a);this._setConversationParams(P),l=s??`${p.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,h.token=P.token,h.endpoint=l,p.wtsBase&&(m=`${p.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,h.wt_endpoint=m)}else{let P=await this._getConversationParams(e);u=P.device_idx||0,l=s??`${p.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,l=this._addGeoParamsToEndpoint(l,P),h.token=P.token,h.endpoint=l,h.device_idx=u,p.wtsBase&&(m=`${p.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,m=this._addGeoParamsToEndpoint(m,P),h.wt_endpoint=m)}let E=await this._connectSignaling(Ye.ACCEPT,h);return q._current&&(q._current._participantState===Z.ACCEPTED||q._current._participantState===Z.CALLED)?(d.log("Push rejected (busy)"),R.log(D.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(y.BUSY),Promise.reject(new j(y.BUSY))):(q._current&&(q._current.destroy(),q._current=null),await this._setConversation(h,E,Ne.INCOMING,t),E)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:Ce(),participantState:{},state:Z.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return i.externalId||(i.externalId=await this._getParticipantId(t??i.id)),this._api.cacheExternalId(t??i.id,i.externalId),t&&this._api.mapDecorativeId(t,i.id),i.observedIds?.length&&(i.externalId.observer=!0),e.markers&&(i.markers=this._denormalizeMarkers(i.id,e.markers)),i}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new j(y.NETWORK_ERROR),t),t}}async _setConversation(e,t,i,a=ne.USER){let{participants:s}=t.conversation;s.forEach(h=>{let E=I.composeId(h),P=z.fromSignalingParticipant(h,!1);if(P){this._api.cacheExternalId(E,P);let b=I.composeDecorativeId(h),V=z.fromSignalingParticipant(h);b&&V&&(this._api.cacheExternalId(b,V),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let c=this._api.getUserId(),u=this._extractLocalParticipantFromConnection(t),l=e.device_idx||0;if(!c){if(!u)throw new j(y.UNKNOWN_ERROR);c=Number(u.id),u.idType&&(a=u.idType),u.deviceIdx&&(l=u.deviceIdx),this._api.setUserId(c)}let m=I.composeParticipantId(c,a,l);this._conversation={userId:c,compositeUserId:m,externalId:await this._getExternalIdByParticipantId(m),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||"DIRECT",direction:i,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:u?.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},Oe.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(p.forceRelayPolicy=e.p2p_forbidden),R.log(D.RELAY_POLICY,p.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new j(y.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||"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 Gi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new ti(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,Ae.NOTIFICATION,a=>this._signalingActor.add(a)),this.subscribe(this._signaling,Ae.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Ae.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return Me.logEventualStat({name:X.SIGNALING_CONNECTED}),i}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(ma.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&v.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(),i=I.mapSharedParticipants(e.participants.reduce((a,s)=>{let c=I.composeId(s);return t[c]&&a.push(t[c]),a},[]));return{...e,participants:i}}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 i of t)await this._registerParticipants(i?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let i=e[0]?.externalId?.type;i&&(p.externalUserType=i);let a=await this._getParticipants();for(let s of e){let c=I.composeId(s);if(d.test("Conversation:RegisterParticipant",c),this._isMe(c)){this._conversation.roles=s.roles||[],this._conversation.roles.length&&(d.debug(`Local roles changed: ${s.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(s);continue}if(s.state===Z.HUNGUP||s.state===Z.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],y.HUNGUP);continue}let u=I.composeDecorativeId(s);this._registerParticipant({id:c,externalId:z.fromSignalingParticipant(s),mediaSettings:Ce(s.mediaSettings),participantState:I.mapParticipantState(s),state:s.state,roles:s.roles||[],status:"WAITING",muteStates:s.muteStates||{},unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(c,s.markers),movieShareInfos:s.movieShareInfos,isInRoom:t},u);let l=await this._getParticipant(c);l&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${c}] changed: ${s.roles}`),v.onRolesChanged(l.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=Pr(e,Ge.MUTE),s=Pr(e,Ge.MUTE_PERMANENT);for(let c of[a,s])c.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:c,stateUpdated:!0})};I.setImmediate(()=>i().catch(a=>d.error(a)))}_getStatusByTransportState(e){let t=null;return e==="CONNECTED"?t="CONNECTED":e==="CONNECTING"||e==="OPENED"?t="CONNECTING":e==="RECONNECTING"&&(t="RECONNECT"),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let i=(await this._getParticipants())[e];if(i)return i;let a=this._api.getDecorativeIdByInitialId(I.decomposeId(e).id),s=a?I.composeUserId(a):void 0;return this._createParticipant({id:e},s)}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 i=await this._getParticipantId(e);return this._api.cacheExternalId(e,i),i}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(p.useParticipantListChunk){let a=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return a.markers=this._denormalizeMarkers(a.id,t),a}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){d.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let i=Object.values(t).find(a=>"ts"in a&&"rank"in a);return Object.entries(t).reduce((a,[s,c])=>(a[s]={...i,...c,id:e},a),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let i=Xn(e);this._setMuteStatesForRoomId(i,null);for(let u of e.rooms?.rooms??[])this._setMuteStatesForRoomId(u.muteStates,u.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=ts(e,a));let s=Object.keys(a),c=this._conversation?.roomId;s.length&&this._onMuteParticipant({muteStates:a,mediaOptions:s,muteAll:!0,stateUpdated:!0,roomId:c},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 Ir(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new wi,this.subscribe(this._transport,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,"LOCAL_STATE_CHANGED",this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,"AUDIO_MIX_STALL",this._onAudioMixStall.bind(this)),this.subscribe(this._transport,"REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,"SIGNALLED_STALLED_PARTICIPANTS",this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this)),this.subscribe(this._transport,"NETWORK_STATUS",this._onNetworkStatus.bind(this)),this.subscribe(this._transport,"REMOTE_STREAM_SECOND",this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,"PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,"ASR_TRANSCRIPTION",this._onAsrTranscription.bind(this)),this.subscribe(this._transport,"ANIMOJI_STREAM",this._onAnimojiStream.bind(this)),this.subscribe(this._transport,"ANIMOJI_ERROR",this._onAnimojiError.bind(this));let e=this._conversation.direction===Ne.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let i of Object.values(t))(i.state===Z.ACCEPTED||i.state===Z.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new br(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new Mr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new ki(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Oi(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=M.getCameras().length,t=M.getMicrophones().length;d.debug("Cameras: "+e+(M.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(M.hasMicrophonePermission()?"✔":"✖")),R.log(D.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){R.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}async _removeParticipant(e,t){if(e.state===Z.CALLED||e.state===Z.ACCEPTED||this._state==="CLOSE")return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let i=await this._getParticipants();if(i[e.id]){t===y.HUNGUP?this._setParticipantsStatus([e],"HANGUP"):this._setParticipantsStatus([e],"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[a,s]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(a),this._sequenceNumberByStreamDescription.delete(a),this._cooldownTimestampByStreamDescription.delete(a),this._streamWaitTimerByStreamDescription.has(a)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(a)),this._streamWaitTimerByStreamDescription.delete(a)),this._sendUpdateDisplayLayout({[a]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete i[e.id],v.onRemoteRemoved(e.externalId,e.markers)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener("unload",this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(t=>t.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(t=>t.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){d.debug("cleaning up participant-agnostic streams"),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(t=>{t.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,i){d.debug(`Add new participant [${e}]`);let a=await this._getParticipant(e);if(a&&(a.state===Z.ACCEPTED||a.state===Z.CALLED)){d.warn(`Participant [${a.id}:${a.state}] is already in conversation`);return}if(!a){let s=I.composeDecorativeId(t);this._registerParticipant({id:e,externalId:z.fromSignalingParticipant(t),mediaSettings:Ce(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s),a=await this._getParticipant(e)}this._setParticipantsStatus([a],"WAITING"),i?(a.state=Z.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=Z.CALLED,this._transport.allocate(a.id,!0),R.log(D.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=Qo;a++){let s=I.compose(e,a),c=i[s];c&&t.push(c)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let a of t)this._transport.close(a.id);R.log(D.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(oe.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(oe.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(oe.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,i=null){if(!this._transport||!this._conversation)return;let a=!t,s=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let c=i??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:c,isMe:a});return}this._transport.setAnimojiSvg(s,{svg:e,isMe:a})}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 R.log(D.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return R.log(D.MEDIA_STATUS,e?"audio_1":"audio_0"),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},i={};for(let s of e){let c=typeof s.uid=="object"?s.uid:z.fromId(s.uid),u=z.toString(c);i[u]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let c=z.toString(s.externalId);Object.hasOwn(i,c)&&(t[s.id]=i[c])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[i,a]of Object.entries(e))if(i.length>5||a.length>5)throw new 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 putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[et(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;d.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},i=await this._getParticipants();for(let s of e){let c=typeof s.uid=="object"?s.uid:z.fromId(s.uid),u=this._api.getCachedOkIdByExternalId(c);if(!u){let h=z.toString(c);d.log(`Unknown participant external ID ${h}`);continue}let l=et({participantId:u,mediaType:s.mediaType,streamName:s.streamName}),m=i[u];m?m.lastRequestedLayouts[l]=s:this._isMe(u)&&(this._myLastRequestedLayouts[l]=s),Kt(s)?(this._isMe(u)&&delete this._myLastRequestedLayouts[l],this._streamIdByStreamDescription.has(l)&&!this._cooldownTimestampByStreamDescription.has(l)&&this._cooldownTimestampByStreamDescription.set(l,Date.now())):(this._cooldownTimestampByStreamDescription.delete(l),!this._streamIdByStreamDescription.has(l)&&p.videoTracksCount>0&&this._streamIdByStreamDescription.set(l,null),t[l]=s),s.mediaType==="SCREEN"&&!Kt(s)&&pe.setMark(pe.getMarkNameScreenshareFirstFrame(u))}let a=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>p.videoTracksCount;){let s=a.next();if(s.done){d.error("Cannot accommodate all streaming requests: tracks available "+p.videoTracksCount+"; requested streams: "+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(s.value),t[s.value]={stopStream:!0}}this._transport?.getTopology()==="SERVER"&&await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,i){if(this._conversation)if(!p.clientEventsLoggingEnabled)this._api.sendUserFeedbackStats(this._conversation.id,e,t,i);else{let a={event_type:X.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),R.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};R.logClientEvent(a,i)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(d.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 i=await this._getParticipants(),a=qt(e),s=i[a.participantId],c=this._conversation?.externalId,u=this._isMe(a.participantId);if(s||u){switch(a.mediaType){case"STREAM":case"MOVIE":{if(a.streamName){let l={stream:null,streamName:a.streamName,mediaType:a.mediaType};u?v.onLocalLive(c,l):v.onRemoteLive(s.externalId,l)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null);break}}R.log(D.PAT_DEALLOCATED)}else d.log(`Cannot find participant to stop streaming: ${a.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;d.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let i;try{if(i=await this._signaling.updateDisplayLayout(e),!i)return}catch(c){if(d.warn(`Failed to update display layout ${JSON.stringify(e)}. ${c}`),t)throw c;return}let a=[],s=await this._getParticipants();for(let[c,u]of Object.entries(i.errorCodeByParticipantId||{})){let l=qt(c),m=s[l.participantId];if(m){let h;typeof u!="number"?(d.warn(`Unexpected error code ${u} received for participant ${l.participantId}`),h=qn.UNKNOWN_ERROR):h=zn(u),a.push({externalId:m.externalId,errorReason:h})}}if(a&&a.length&&(d.warn("Could not allocate one or more participants",a),t))throw new ga("Could not allocate one or more participants",a)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let i=t.next();if(i.done)break;let a=i.value;if(a[1]+Yo>Date.now())break;let c=a[0];await this._stopStreaming(c),e[c]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;d.log("Received participant sources update notification",t);for(let i of t)this._waitForStreamIfNeeded(i)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(d.log("Promoted in audience mode",!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(d.log("Promoted in waiting hall",!e.demote),e.demote?(d.log("Kicked from waiting hall"),this._close(new j(y.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),v.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,i=[],a,s){d.log(`Chat room updated: ${e}`);let c=[],u=[],l=[],m=[],h=[];if(i.length&&i.forEach(b=>{if(b.externalId){let V=z.fromSignaling(b.externalId);h.push(V),this._api.cacheExternalId(b.id.id,V)}else{let V=I.decomposeId(b.id.id).id;c.push(V),m.push(V)}}),a?.length&&a.forEach(b=>{let V=I.decomposeId(b).id;c.push(V),u.push(V)}),s?.length&&s.forEach(b=>{let V=I.decomposeId(b).id;c.push(V),l.push(V)}),!c.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let b=await this._api.getExternalIdsByOkIds(m);h.push(...b)}let E=await this._api.getExternalIdsByOkIds(u),P=await this._api.getExternalIdsByOkIds(l);v.onChatRoomUpdated(e,t,h,E,P)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let i of e.data)if(this._isMe(i.participantId))v.onLocalLiveUpdate(t,i);else{let s=await this._getExternalIdByParticipantId(i.participantId);s&&v.onRemoteLiveUpdate(s,i)}}async _onSharedMovieInfoStarted(e){d.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(i=>this._processSharedMovieInfo(i,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let i=this._conversation?.externalId;if(this._isMe(e.initiatorId))v.onLocalSharedMovieInfo(i,e,t);else{let s=await this._getExternalIdByParticipantId(e.initiatorId);s&&v.onRemoteSharedMovieInfo(s,e,t)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(i=>this._isMe(I.composeId(i)));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 s of e.rooms.rooms)s.asrInfo&&this._conversation?.asrInfoByRoom.set(s.id,s.asrInfo);let i=e?.rooms?.roomId??this._conversation?.roomId??null,a=this._conversation?.asrInfoByRoom.get(i);if(a){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onAsrSet({externalId:s,movieId:a.movieId},i)}else i&&v.onAsrSet(null,i)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,i=this._conversation.roomId,a=t.get(i);if(a&&!this._isMe(a.initiatorId)){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onRemoteSharedUrl(s,a.sharedUrl,i)}}_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 i of e.rooms.rooms)i.urlSharingInfo?t.set(i.id,i.urlSharingInfo):t.delete(i.id)}async _onSharedMovieInfoStopped(e){d.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:i,movieId:a,source:s,roomId:c=null}=e,u={initiatorId:i,movieId:a,source:s};if(this._isMe(i))v.onLocalSharedMovieStoppedInfo(t,u,c);else{let m=await this._getExternalIdByParticipantId(i);if(m){let E=(await this._getParticipants())[i];E?.movieShareInfos&&(E.movieShareInfos=E.movieShareInfos.filter(P=>P&&P.movieId!==a)),v.onRemoteSharedMovieStoppedInfo(m,u,c)}}}async _onUrlSharingInfoUpdated(e){if(d.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:i}=this._conversation,{initiatorId:a,sharedUrl:s,roomId:c=null}=e;if(s?t.set(c,{sharedUrl:s,initiatorId:a}):t.delete(c),!(!s&&c!==i&&t.has(i))&&(!s||!this._isMe(a))){let u=await this._getExternalIdByParticipantId(a);u&&v.onRemoteSharedUrl(u,s,c)}}_onFeaturesPerRoleChanged(e){d.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),v.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let h=this._getStreamDescriptionById(e.streamId);if(h){let E=qt(h),P=await this._getParticipant(E.participantId);v.onRemoteScreenStream(P.externalId,null);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:i,participantId:a}=t;if(i==="ANIMOJI")return;let s=await this._getParticipant(a);if(i==="SCREEN"&&!e.fastScreenShare){d.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let c=et(t),u=this._sequenceNumberByStreamDescription.get(c);if(u&&u>e.sequenceNumber){d.warn(`Participant ${a} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${u}`),R.log(D.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&i&&(d.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(s.externalId,i,e.suspend));let l=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(l,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(c);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){R.log(D.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let P=E?h:s.externalId,b=this._streamByStreamId.get(l);if(!b){R.log(D.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${l}`);return}R.log(D.PAT_ALLOCATED),this._streamIdByStreamDescription.set(c,l);let V=e.participantStreamDescription?.mediaType;if(V==="STREAM"||V==="MOVIE"){if(e.participantStreamDescription?.streamName){let J={streamName:e.participantStreamDescription.streamName,stream:b,mediaType:V};E?v.onLocalLive(P,J):v.onRemoteLive(P,J)}}else V==="SCREEN"?v.onRemoteScreenStream(s.externalId,b):E||v.onRemoteStream(s.externalId,b)}else{d.debug(`Waiting for ${m} until stream ${l} for ${c} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),m);this._streamWaitTimerByStreamDescription.set(c,h)}}_getStreamDescriptionById(e){for(let[t,i]of this._streamIdByStreamDescription.entries())if(i===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(et(e)))return e;let t=e.participantId;if(e.mediaType){let i={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(et(i)))return i}else{let i={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(et(i)))return i;let a={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(et(a)))return a}return d.error("Received unrequested allocation",e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw new Error("transport is not initialized")}_isCallAdmin(){return this._conversation?I.includesOneOf(this._conversation.roles,[Et.ADMIN,Et.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!I.includesOneOf(this._conversation.roles,[Et.ADMIN,Et.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===Z.CALLED}async grantRoles(e,t,i){this._checkAdminRole(),await this._signaling.grantRoles(e,t,i)}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,i=[],a=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,i,a)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,i=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,i),this._conversation?.pinnedParticipantIdByRoom.set(i,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()==="SERVER"&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Hn(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=Qn(e),a)){let m=this._api.getDecorativeIdByInitialId(a.id);a.id=m?I.composeUserId(m):a.id}let s=await this._signaling.getWaitingHall(a,t,i);if(s.error)return Promise.reject(s.message);let c=s.participants||[],{externalIds:u}=await this._resolveWaitingHallExternalIds(c),l=null;return c.length&&s.hasMore&&(l=Yn(c[c.length-1].id)),{participants:u,pageMarker:l,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,i=[],a=[];if(e.length){let s=[];e.forEach(c=>{if(t.set(c.id.id,c.id.addedTs),c.externalId){let u=z.fromSignaling(c.externalId);i.push(c.id.addedTs),a.push(u),this._api.cacheExternalId(c.id.id,u)}else s.push(I.decomposeId(c.id.id).id)}),s.length&&!a.length&&(a=await this._api.getExternalIdsByOkIds(s),i=a.map(c=>{let u=this._api.getCachedOkIdByExternalId(c);return(u?t.get(u):void 0)||Date.now()}))}return{externalIds:a,timestamps:i}}async getAudienceModeHands(){if(!this._signaling.ready)throw new Error("Signaling is not ready");let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:i,timestamps:a}=await this._resolveWaitingHallExternalIds(t);return{timestamps:a,participants:i,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!I.includesOneOf(this._conversation.options,[at.WAITING_HALL,at.AUDIENCE_MODE]))throw new Error("Unable to promote a participant in the conversation with current options");if(this._checkAdminRole(),!e&&t)throw new Error("participantId is required");await this._signaling.promoteParticipant(e,t)}catch(i){throw d.warn(`Failed to promote participant ${e}. ${i}`),i}}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 i=t.messages.length-1;i>=0;i--){let a=t.messages[i];await this._onChatMessage(a)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let t=(await this._api.createJoinLink(this._conversation.id)).join_link;if(t)return this._conversation.joinLink=t,t}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:i,lang:a}){let s={movieId:e,lang:a};(t||t===0)&&(s.gain=t),i&&(s.metadata=i);let c=await this._signaling.addMovie(s);if(c.error)throw new Error(c.error);return{movieId:c.movieId,streamType:c.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw new Error(t.error)}async removeMovie(e){let t={movieId:e},i=await this._signaling.removeMovie(t);if(i.error)throw new Error(i.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw new Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw new Error(e.error)}async updateRooms(e,t){let i=await this._signaling.updateRooms(e,t);if(i.error)throw new Error(i.error)}async activateRooms(e,t){let i=await this._signaling.activateRooms(e,t);if(i.error)throw new Error(i.error)}async switchRoom(e,t){let i=await this._signaling.switchRoom(e,t);if(i.error)throw new Error(i.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw new Error(t.error)}async startStream(e=!1,t=null,i=null,a="DIRECT_LINK",s=null,c=null){let u={movieId:i,name:t,privacy:a,groupId:s,roomId:c,streamMovie:!e},l=await this._signaling.startStream(u);if(l.error)return Promise.reject(l.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 recordSetConf(e,t,i=!1,a=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:i,roomId:a});if(s.error)throw new Error(s.error)}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 new Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<p.videoMinWidth||t.height<p.videoMinHeight)throw new 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,d.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(t=>({id:t.id,type:p.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),i=await this._signaling.getParticipants(t);if(i.error)throw new Error(i.error);let a=i.participants,s=this._transport?.getState();return Promise.all(a.map(async c=>{let u=I.composeId(c);return this._createParticipant({id:u,externalId:z.fromSignalingParticipant(c),mediaSettings:Ce(c.mediaSettings),participantState:I.mapParticipantState(c),state:c.state,roles:c.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:c.muteStates||{},unmuteOptions:c.unmuteOptions||[],observedIds:c.observedIds||[],markers:this._denormalizeMarkers(u,c.markers)},c.decorativeUserId)})).then(I.mapSharedParticipants)}async getParticipantListChunk(e){d.log("Request participant list chunk",e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw new Error(t.error);let i=this._createParticipantListChunk(t.chunk),a=await this._getParticipants(),s=i.participants.filter(u=>{let l=I.composeId(u);return!a[l]});await this._registerParticipants(s);let c=this._transport?.getState();return i.participants.forEach(u=>{let l=I.composeId(u),m=a[l];m.status=this._getStatusByTransportState(c)??"WAITING",m.movieShareInfos=u.movieShareInfos,Object.assign(m.mediaSettings,Ce(u.mediaSettings)),Object.assign(m.muteStates,u.muteStates),m.unmuteOptions=u.unmuteOptions??m.unmuteOptions,this._openTransport([m],!0)}),this._participantListChunkToExternalChunk(i)}async _getInitialParticiapntListChunk(){let e=p.participantListChunkInitIndex,t=p.participantListChunkInitCount,a=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return d.debug("Get initial participant list chunk",a.chunk),a.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new ti(this._mediaSource)),v.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this._mediaSource?.getMediaSettings();d.log("Screen sharing changed",e.track,t);let i=e.track?new MediaStream([e.track]):null;v.onScreenStream(i,t)}async _changeRemoteMediaSettings(e,t){d.debug(`Remote media settings changed [${e}]`,t);let i=this._conversation?.externalId;if(this._isMe(e)&&i){v.onLocalMediaSettings(i,t);return}let s=await this._getParticipant(e);if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&v.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(a=>a.id===t||I.comparePeerId(a.peerId,e.peerId))}_changeLocalParticipantState(e){d.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){d.debug(`Remote participant state changed [${e}]`,t);let i=await this._getParticipant(e);if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}async _changeMultipleParticipantState(e,t){d.debug("Multiple participants state changed",e);let i=[],a,s=await this._getParticipants();e.forEach((c,u)=>{if(this._isMe(u))a=c;else{let l=s[u];if(!l){this._warnParticipantNotInConversation(u);return}l.participantState=c,i.push({externalId:l.externalId,participantState:{...c},markers:l.markers})}}),this._state==="ACTIVE"&&(a&&v.onLocalParticipantState(a,!0),i.length&&v.onRemoteParticipantsState(i,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(d.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),v.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case L.ACCEPTED_CALL:return this._onAcceptedCall(e);case L.HUNGUP:return this._onHungup(e);case L.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case L.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case L.CLOSED_CONVERSATION:return this._onClosedConversation(e);case L.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case L.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case L.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case L.RATE_CALL_DATA:return this._onNeedRate();case L.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case L.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case L.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case L.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case L.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case L.REGISTERED_PEER:return this._onPeerRegistered(e);case L.SWITCH_MICRO:return this._onMicSwitched(e);case L.CHAT_MESSAGE:return this._onChatMessage(e);case L.CUSTOM_DATA:return this._onCustomData(e);case L.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case L.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case L.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case L.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case L.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case L.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case L.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case L.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case L.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case L.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case L.FEEDBACK:return this._onFeedback(e);case L.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case L.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case L.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case L.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case L.ROOMS_UPDATED:return this._onRoomsUpdated(e);case L.ROOM_UPDATED:return this._onRoomUpdated(e);case L.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case L.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case L.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case L.ASR_STARTED:return this._onAsrStart(e);case L.ASR_STOPPED:return this._onAsrStop(e);case L.PROMOTION_APPROVED:return this._onPromotionApproved(e);case L.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case L.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}v.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;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 s=Object.keys(await this._getParticipants()),c=[];for(let l of e.conversation.participants){let m=I.composeId(l),h=l.roles||[];if(this._isMe(m)){Ai(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:es(l),unmuteOptions:l.unmuteOptions})};continue}c.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:l.id,participant:l,mediaSettings:l.mediaSettings});else{let P=Ce(l.mediaSettings);Ha(P,E.mediaSettings)||await this._changeRemoteMediaSettings(m,P);let b=I.mapParticipantState(l),V=E.participantState;I.isEqualParticipantState(b,V)||await this._changeRemoteParticipantState(m,b),Ai(h,E.roles)||this._onRolesChanged(E.id,h)}}let u=await this._getParticipants();for(let l of s)c.indexOf(l)<0&&u[l]&&this._removeParticipant(u[l],y.HUNGUP)}let i=e.rooms?.roomId??null;if(!this._conversation){d.warn("Conversation is empty, but should be filled");return}this._conversation.roomId!==i?await this._onRoomSwitched(i):this._processMuteStates(e,!0),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){d.error("Signaling failed",e),this._close(e)}async _onAcceptedCall(e){let t=I.composeMessageId(e),i=I.getPeerIdString(e.peerId);if(d.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new j(y.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let c=this._api.getDecorativeIdByInitialId(t),u=c?I.composeUserId(c,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Ce(e.mediaSettings)},u))}a.state=Z.ACCEPTED,a.mediaSettings=Ce(e.mediaSettings),this._logWithMediaSettings(D.ACCEPTED_OUTGOING,a.mediaSettings),this._conversation&&this._conversation.direction===Ne.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),this._state==="ACTIVE"&&this._transport&&this._transport.open([a.id],i),await this._changeRemoteMediaSettings(t,a.mediaSettings),await this._changeRemoteParticipantState(t);let s=Object.keys(a.muteStates);s.length&&this._onMuteParticipant({muteStates:a.muteStates,mediaOptions:s,stateUpdated:!0,participantId:t}),this._state==="ACTIVE"&&v.onAcceptedCall(a.externalId,rt.parseCapabilities(e.capabilities))}async _onHungup(e){d.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=I.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new j(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let i=await this._getParticipant(t);if(!i){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),i.state=e.reason===y.REJECTED?Z.REJECTED:Z.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,y.HUNGUP)}async _onAddedParticipant(e){d.debug(`Participant added [${e.participantId}]`);let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state!==Z.HUNGUP&&i.state!==Z.REJECTED){d.debug(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:a}=e,s=a.decorativeUserId;this._registerParticipant({id:t,externalId:z.fromSignalingParticipant(a),mediaSettings:Ce(a.mediaSettings),state:a.state,participantState:I.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},s),i=await this._getParticipant(t)}i.state=Z.CALLED,i.mediaSettings=Ce(e.participant?.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant?.roles||[],this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(i.id,!0),v.onParticipantAdded(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i)}async _onJoinedParticipant(e){d.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state===Z.ACCEPTED){d.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:s}=e,c=s.decorativeUserId;this._registerParticipant({id:t,externalId:z.fromSignalingParticipant(s),mediaSettings:Ce(s.mediaSettings),state:s.state,participantState:I.mapParticipantState(s),roles:s.roles||[],muteStates:s.muteStates||{},movieShareInfos:s.movieShareInfos,unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(t,s.markers)},c),i=await this._getParticipant(t)}this._conversation&&this._conversation.direction===Ne.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),i.state=Z.ACCEPTED,i.mediaSettings=Ce(e.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i);let a=Object.keys(i.muteStates);a.length&&this._onMuteParticipant({muteStates:i.muteStates,mediaOptions:a,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(i.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new j(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=I.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,Ce(e.mediaSettings))}async _onParticipantStateChanged(e){let t=I.composeMessageId(e),i=I.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(i):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,i))}async _onParticipantsStateChanged(e){let{participants:t,roomId:i}=e,a=t.map(({id:u,markers:l})=>this._registerParticipantAndSetMarkersIfChunkEnabled(u,l));await Promise.all(a);let s=new Map,c=t.map(({id:u,participantState:l})=>this._getExternalIdByParticipantId(u).then(m=>[u,m&&I.mapParticipantState({participantState:l})]));try{(await Promise.all(c)).forEach(([l,m])=>{m&&s.set(l,m)}),await this._changeMultipleParticipantState(s,i)}catch(u){d.warn(`_onParticipantsStateChanged: Failed to get external ids. ${u}`)}}_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(),v.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),i=Ce(e.mediaSettings);t.isAudioEnabled!==i.isAudioEnabled&&await this._mediaSource.toggleAudio(i.isAudioEnabled),t.isVideoEnabled!==i.isVideoEnabled&&await this._mediaSource.toggleVideo(i.isVideoEnabled),t.isScreenSharingEnabled!==i.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:i.isScreenSharingEnabled,fastScreenSharing:i.isFastScreenSharingEnabled,captureAudio:i.isAudioSharingEnabled})}_onSettingsUpdate(e){d.debug("Got settings update notification",e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=sa(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){d.debug("Got video quality update notification",e);let t=Math.round(e.quality.maxBitrate/1024),i=e.quality.maxDimension,a={maxBitrateK:t,maxDimension:i},s;e.mediaType&&e.mediaType==="SCREEN"?s={camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,a)}:s={camera:Object.assign({},this._serverSettings.camera,a),screenSharing:null,fastScreenSharing:null},this._serverSettings=sa(this._serverSettings,s),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=I.composeMessageId(e),i=await this._getParticipant(t);i&&(i.clientType=e.clientType,i.platform=e.platform),v.onPeerRegistered()}async _onMicSwitched(e){v.onDeviceSwitched(de.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onChatMessage(e.message,i,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,"sdk"))return;let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onCustomData(e.data,i,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let i=this._conversation.recordsInfoByRoom.get(t);if(i?.recordMovieId!==e?.recordMovieId||i?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let s=await this._getExternalIdByParticipantId(e.initiator);s?v.onRecordStarted(s,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},i=null){if(!this._conversation)return;let a=this._conversation.recordsInfoByRoom.get(i);if(!(!a||a.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(i,null),e){let s=await this._getExternalIdByParticipantId(e);v.onRecordStopped(i,s??null)}else v.onRecordStopped(i,null)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let i=await this._getExternalIdByParticipantId(t);i&&v.onPinnedParticipant(i,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiator);i?v.onRecordStarted(i,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else v.onRecordStopped(e,null)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiatorId);i&&v.onAsrSet({externalId:i,movieId:t.movieId},e)}else v.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,i=t.get(e);if(i){let a=await this._getExternalIdByParticipantId(i.initiatorId);a&&v.onRemoteSharedUrl(a,i.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,i=e.roomId||null;this._conversation.asrInfoByRoom.set(i,t);let a=await this._getExternalIdByParticipantId(t.initiatorId);if(!a){this._warnParticipantNotInConversation(t.initiatorId);return}v.onAsrStarted(a,t.movieId,i)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),v.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!Ai(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:Pr(this._getMuteStatesForCurrentRoom(),Ge.MUTE_PERMANENT),stateUpdated:!0}),I.includesOneOf(t,[Et.ADMIN,Et.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=await this._getParticipant(e);i&&!Ai(i.roles,t)&&(d.debug(`Roles for participant [${e}] changed: ${t}`),i.roles=t,v.onRolesChanged(i.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:i,muteStates:a={},unmuteOptions:s=[],mediaOptions:c=[],roomId:u=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){d.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let l=await this._getParticipant(e.participantId);if(l){d.debug(`Mute states for participant [${e.participantId}] changed`,a);let m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;v.onMuteStates(a,s,c,i,e.unmute,l.externalId,m,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,u):i||(this._conversation.muteStatesPersonal=a)),e.adminId&&this._isMe(e.adminId)){i&&v.onMuteStates(a,s,c,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:c,muteAll:i,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:a})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let i=this._getMuteStatesForRoomId(t),a=this._getMuteStatesForRoomId(e),s=Object.keys(i),c=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...s,...c])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Z.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:c,roomId:u=null,unmuteOptions:l=[]}=e,m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(u)),E=this._mediaSource.getMediaSettings(),P=Object.entries(h);for(let[b,V]of P){let J=this._isCallAdmin()&&i;if(!(V!==Ge.MUTE&&V!==Ge.MUTE_PERMANENT||J)&&(this._isCallAdmin()&&V===Ge.MUTE_PERMANENT&&!i&&(h[b]=Ge.MUTE),!(!t.includes(b)||a)))switch(b){case de.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(de.VIDEO,!1),await this.toggleLocalVideo(!1));break;case de.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(de.AUDIO,!1),await this.toggleLocalAudio(!1));break;case de.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(de.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case de.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(de.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:E.isScreenSharingEnabled,fastScreenSharing:E.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(h,l,t,i,a,null,m,s,c,u)}async _onPinParticipant(e,t=!1,i,a=null){if(!this._conversation)return;let s=this._conversation.pinnedParticipantIdByRoom.get(a);if(s&&s!==e)if(this._isMe(s))v.onLocalPin(!0,a);else{let c=await this._getExternalIdByParticipantId(s);c&&v.onPinnedParticipant(c,!0,this._denormalizeMarkers(e,i),a)}if(this._isMe(e))v.onLocalPin(t,a);else{let c=await this._getExternalIdByParticipantId(e);c&&v.onPinnedParticipant(c,t,this._denormalizeMarkers(e,i),a)}this._conversation.pinnedParticipantIdByRoom.set(a,t?null:e)}_onOptionsChanged(e){this._conversation&&!jn(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e),e.includes(at.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&v.onLocalStatus("WAITING_HALL"):e.includes(at.WAIT_FOR_ADMIN)&&this._conversation.restricted&&v.onLocalStatus("WAIT_FOR_ADMIN"))}async _onNetworkStatus(e){if(this._conversation){let t=[],i=await this._getParticipants();for(let[a,s]of Object.entries(e)){let c;if(this._isMe(a)||a==="")c=this._conversation.networkRating;else if(i[a])c=i[a].networkRating;else continue;if(c!==s)if(this._isMe(a)||a==="")this._conversation.networkRating=s,zt.getInstance().value=s,v.onLocalNetworkStatusChanged(s);else{let u=i[a];u.networkRating=s,t.push({uid:u.externalId,rating:s})}}if(t.length===0)return;d.log("Received network status update: ",e),v.onNetworkStatusChanged(t)}}async _onRemoteStreamSecond(e,t){let i=await this._getParticipant(e);i&&v.onRemoteScreenStream(i.externalId,t)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){v.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let i=await this._getParticipant(e);i&&v.onRemoteVmojiStream(i.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,v.onVmojiError({...e,externalId:t}))}catch(t){d.warn("_onAnimojiError failed",t)}}_onPeerConnectionClosed(e){e==="SERVER"&&this._cleanupParticipantAgnosticStreams()}_changeFeatureSet(){if(this._conversation){let e=this._state==="ACTIVE",t=this._conversation.features.includes(ha.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&v.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let s=await this._getParticipant(i);s&&s.externalId&&t.push({uid:s.externalId,volume:a.real})}v.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){d.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=await this._getParticipants(),s=e.reduce((c,u)=>{if(u in a){let l=a[u];c.push(l),t==="CONNECTED"&&(l.remoteStream||(l.mediaSettings&&this._changeRemoteMediaSettings(u,l.mediaSettings),this._changeRemoteParticipantState(u,l.participantState)),this._updateDisplayLayoutFromCache(u))}else this._warnParticipantNotInConversation(u);return c},[]);s.length&&this._setParticipantsStatus(s,i)}async _onTransportLocalStateChanged(e){if(d.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(v.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&v.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&v.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(y.FAILED),this._close(new j(y.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(ze.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(ze.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))d.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{d.debug(`Remote track added on the participant [${e}]`,{kind:i.kind});let a=await this._getParticipant(e);if(!a){let s=this._api.getDecorativeIdByInitialId(e),c=s?I.composeUserId(s):void 0;d.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${c}]`),this._registerParticipant({id:e},c),a=await this._getParticipant(e),this._setParticipantsStatus([a],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(a.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(i),p.preserveAudioTracks||(a.remoteAudioTrack=i,t.removeTrack(i))),a.remoteStream!==t&&t.getTracks().length){if(a.remoteStream=t,a.secondStream)return;v.onRemoteStream(a.externalId,t)}a.mediaSettings&&this._changeRemoteMediaSettings(e,a.mediaSettings)}}_onRemoteTrackRemoved(e,t,i){switch(d.debug(`[${e}] remote track (removed)`,{track:i}),i.kind){case"audio":this._removeAudioTrack(e,t,i);break;case"video":case"screen":this._removeVideoTrack(e,t,i);break}}async _removeAudioTrack(e,t,i){if(e!==ze.AUDIO_MIX){let a=await this._getParticipant(e);if(!a||a.remoteStream&&a.remoteStream!==t)return}this._audioOutput.remove(i)}_removeVideoTrack(e,t,i){}_onTopologyChanged(e){e==="DIRECT"&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall())}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,d.debug("Audio mix stalled:",e),v.onLocalStatus(e?"RECONNECT":"CONNECTED"))}async _onRemoteSignalledStall(e){let t={},i=[],a=[];d.debug("Participants stalled:",e);let s=await this._getParticipants();for(let c of e){if(t[c]=!0,!this._lastStalled[c]){let u=s[c];u&&i.push(u)}delete this._lastStalled[c]}for(let c of Object.keys(this._lastStalled)){let u=s[c];u&&a.push(u)}i.length&&this._setParticipantsStatus(i,"RECONNECT"),a.length&&this._setParticipantsStatus(a,"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){!M.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!M.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&&(d.debug("Toggle join availability",{available:t,chatId:e}),v.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!=="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(i){d.warn(`_updateDisplayLayoutFromCache failed: ${i}`)}}_setParticipantsStatus(e,t,i=null){if(!e.length)return;let a=e.reduce((s,c)=>(c.status!==t&&(c.status=t,s.push(c.externalId)),s),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(Mi)){let a=e.updates[i];a&&(t[i]={rooms:await Promise.all(a?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:a?.roomIds,deactivated:a?.deactivated})}v.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(i=>i===Mi.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()||v.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(c=>this._getExternalIdByParticipantId(c))||[]),i=await Promise.all(e.addParticipantIds?.map(c=>this._getExternalIdByParticipantId(c))||[]),a=await Promise.all(e.removeParticipantIds?.map?.(c=>this._getExternalIdByParticipantId(c))||[]),s=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:i,removeParticipantIds:a,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:s,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),i=e.roomId??null,a=e.addedParticipantIds?.map(P=>I.decomposeId(P).id)||[],s=await this._api.getExternalIdsByOkIds(a),c=e.addedParticipants;if(s.length&&c?.length!==s.length&&!this._isCalledState()){let P=this._convertExternalIdsToServerExternalIds(s);c=(await this._signaling.getParticipants(P)).participants}let u=await Promise.all(c?.map(async P=>{let b=I.composeId(P);return this._createParticipant({id:b,externalId:z.fromSignalingParticipant(P),mediaSettings:Ce(P.mediaSettings),participantState:I.mapParticipantState(P),state:P.state,roles:P.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:P.muteStates||{},unmuteOptions:P.unmuteOptions||[],observedIds:P.observedIds||[],markers:this._denormalizeMarkers(b,P.markers),isInRoom:i!==null},P.decorativeUserId)})||[]),l=!1;for(let P of u)P.id===this._conversation?.compositeUserId&&(l=!0),this._registerParticipantInCache(P);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(u,!0);let m=[],h=[];if(e?.removedParticipantMarkers){for(let P of e.removedParticipantMarkers)if(P.GRID?.id){let b=this._getExternalIdByParticipantId(P.GRID.id);h.push(b)}m=await Promise.all(h)}if(l&&await this._onRoomSwitched(i),m){let P=this._conversation?.pinnedParticipantIdByRoom.get(i);if(P){let b=await this._getExternalIdByParticipantId(P);if(b){for(let V of m)if(z.compare(b,V)){this._conversation?.pinnedParticipantIdByRoom.delete(i);break}}}}let E={roomId:i,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:I.mapSharedParticipants(u),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:m};this._isCalledState()||v.onRoomParticipantsUpdated(E)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let i=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){v.onRoomStart(e);return}this._isCalledState()||v.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,i),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let i=t?.rooms?.rooms??[],a=[];for(let s of i){let c=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,c),this._conversation?.recordsInfoByRoom.set(c,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(c,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(c,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(c,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(c),e){let u=await this._getParticipants();await this._registerParticipants(s?.participants?.participants?.filter(m=>!u[I.composeId(m)])||[],!0);let l=await this._convertRoomToExternal(s);l&&a.push(l)}}a.length&&!this._isCalledState()&&v.onRoomsUpdated({[Mi.UPDATE]:{rooms:a}})}async _onFeedback(e){let t=[];for(let i of e.feedback){let a={...i,items:[]};for(let s of i.items){let c=await this._getExternalIdByParticipantId(s.participantId);c?a.items.push({...s,participantId:c}):this._warnParticipantNotInConversation(s.participantId)}t.push(a)}v.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:i,decorativeExternalParticipantId:a}=e,s=this._isMe(t);d.debug(`Decorative participant id changed [${t}]`,e);let c=await this._getExternalIdByParticipantId(t);if(!c){this._warnParticipantNotInConversation(t);return}let u=z.fromSignaling(a,c.deviceIdx);if(v.onParticipantIdChanged(c,u),this._api.cacheExternalId(i,u),this._api.mapDecorativeId(i,t),s)this._conversation.externalId=u;else{let l=await this._getParticipants();l[t].externalId=u}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(d.debug("Video suspend suggested",e),v.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()==="SERVER"&&this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){this._pendingParticipants.set(e.id,this._createParticipant(e,t))}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.values()),t=await Promise.all(e);for(let i of t)this._pendingParticipants.delete(i.id),this._participants[i.id]=i}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};o(q,"_current"),o(q,"_activationMutex"),o(q,"_delayedHangup",!1);var B=q,ga=class n extends Error{constructor(e,t){super(e);o(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var Ut=null,ii=null;function as(){Ut=null,ii=null}function Xo(n){return n?.endsWith("/")?n.slice(0,-1):n}async function wr(n=null,r){let e=Xo(n??p.apiBaseUrl);if(e)return e;if((r??p.apiEnv)!=="AUTO")return p.apiEndpoint(r);try{let t=atob("aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ="),s=(await(await fetch(t,{method:"GET",mode:"cors",cache:"no-cache"})).json())?.Answer[0]?.data;if(!s)throw new Error("Wrong DNS response");return d.debug("Resolved API endpoint",s),s}catch(t){return d.warn("Failed to resolve API endpoint using DNS, default is used",t),p.apiEndpoint(r)}}async function ns(){return Ut||ii||(ii=wr(),Ut=await ii,ii=null,Ut)}async function ri(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await ns();let t=os(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${Ut}/fb.do`,i)}async function xi(n,r={},e=!1,t){await ns();let i=os(n,r,e);return Zo(i,t)}async function Zo(n,r){let e=`${r??Ut}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new j(y.NETWORK_ERROR)),p.apiTimeout),a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n,signal:t.signal});clearTimeout(i);let s=await a.text(),c;try{c=JSON.parse(s)}catch{c={result:s}}if(!a.ok||Object.hasOwn(c,"error_msg"))throw c;return c}async function ss(n,r){try{let e=await fetch(n,{method:"POST",body:r});if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);let t=await e.text();d.debug("Form data sent successfully",t)}catch(e){throw d.warn("Failed to send form data",e),e}}function os(n,r={},e=!1){r.method=n,r.format="JSON",r.application_key||(r.application_key=p.apiKey),e||(be.sessionKey?r.session_key=be.sessionKey:be.accessToken&&(r.access_token=be.accessToken));for(let[i,a]of Object.entries(r))typeof a=="object"&&(r[i]=JSON.stringify(a));let t="";for(let[i,a]of Object.entries(r))t&&(t+="&"),t+=`${i}=${encodeURIComponent(a)}`;return t}var Ni=class{async createJoinLink(r){return{join_link:"nop"}}async removeJoinLink(r){return{success:!0}}async getAnonymTokenByLink(r,e){return""}log(r){}logClientStats(r){}logClientEvents(r){}getCachedOkIdByExternalId(r){return null}cacheExternalId(r,e){}mapDecorativeId(r,e){}unmapDecorativeId(r){}getDecorativeIdByInitialId(r){}replaceByInitialIdIdIfExists(r){return typeof r=="string"?parseInt(r,10):r}hangupConversation(r,e=y.HUNGUP){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var tc=700,ic=3e3,Li=class extends Ni{constructor(){super(...arguments);o(this,"_userId",null);o(this,"_uuid");o(this,"_externalUidsCache",new Map);o(this,"_decorativeIdToInitialId",new Map);o(this,"_initialIdToDecorativeId",new Map)}async _callUnsafe(e,t={},i=!1){let a=async s=>{try{return await xi(e,t,i)}catch(c){if(!Object.hasOwn(c,"error_msg")){s++;let u=Object.getOwnPropertyNames(c).map(l=>`${l}: ${JSON.stringify(c[l])}`);if(d.debug(`${e} network error, attempt ${s}: ${u.join(`
|
|
17
|
-
`)}`),s<p.apiMaxAttempt)return await I.delay(Math.min(s*tc,ic)),a(s)}throw d.warn(e,"error",c),c}};return a(0)}async _call(e,t={},i=!1){try{return await this._callUnsafe(e,t,i)}catch(a){d.warn("Api call error",a);let s=oe.API;switch(a.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,i)}let c={message:a.error_msg,code:a.error_code};if(a instanceof j)throw a;if(a.custom_error&&(c.custom_error=a.custom_error),rc(a))switch(a.error_code){case 1101:s=y.SERVICE_DISABLED;break;case 4:a.error_msg.includes("participants.limit.exceeded")&&(s=y.PARTICIPANT_LIMIT_REACHED);break;case 300:s=y.NOT_FOUND;break;case 1102:s=y.CALLEE_IS_OFFLINE;break;case 1103:s=y.NOT_FRIENDS;break;case 1104:case 1106:s=y.EXTERNAL_API_ERROR;break;case 1113:s=y.CALLER_IS_REJECTED;break;case 1114:s=y.VCHAT_DETAILED_ERROR;break;case 2:s=y.SERVICE_UNAVAILABLE;break}throw new j(s,c)}}async userId(e){let t=I.extractOkId(e);if(be.isEmpty())return z.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),z.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!p.apiKey)throw new j(oe.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(t=>{t.uid&&(this._userId=Number(t.uid)),be.sessionKey=t.session_key,be.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&v.onTokenExpired(),new j(oe.AUTH,{message:t.error_msg,code:t.error_code})})}log(e){let t={collector:"ok.mobile.apps.video",data:JSON.stringify({application:`${p.appName}:${p.sdkVersion}`,platform:p.platform,items:e})};ri("log.externalLog",t)}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);let i={data:JSON.stringify(t)};ri("vchat.clientStats",i)}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);let i={data:JSON.stringify(t)};ri("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let s={conversationId:e,webrtcPlatform:p.platform,startTime:t,endTime:i},c=await this._callUnsafe("vchat.getLogUploadUrl",s),u=new FormData,l=new Blob([a],{type:"application/json"});u.append("file",l,"log.json");let m=new URL(c.upload_url);return m.searchParams.append("size",l.size.toString()),ss(m.toString(),u)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:p.protocolVersion,capabilities:rt.getFlags()};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:c,waitForAdmin:u,closedConversation:l}={},m){let h=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,waitForAdmin:u,closedConversation:l,audienceMode:s,audioOnly:c,speakerIds:m});return this._startConversation(h)}async startConversation(e,t,i,a=!1,s="",c=!1,u=!1,{onlyAdminCanShareMovie:l,waitForAdmin:m}={},h){let E=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:c,payload:s,requireAuthToJoin:u,onlyAdminCanShareMovie:l,waitForAdmin:m,externalIds:h});if(t&&t.length)switch(i){case ut.USER:E.uids=t.join(",");break;case ut.GROUP:E.gid=t[0];break;case ut.CHAT:E.chatId=t[0];break}return this._startConversation(E)}_ensureUuid(){if(!this._uuid){let e=ht.get("uuid");e||(e=I.uuid(),ht.set("uuid",e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:i="",joiningAllowed:a=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:c,waitForAdmin:u,audienceMode:l=!1,audioOnly:m=!1,speakerIds:h=[],closedConversation:E=!1,externalIds:P}){let b={conversationId:e,isVideo:t,protocolVersion:p.protocolVersion};if(a&&(b.createJoinLink=!0),i&&(b.payload=i),p.domain&&(b.domainId=p.domain),p.externalDomain&&(b.externalDomain=p.externalDomain),s&&(b.requireAuthToJoin=!0),c!==void 0&&(b.onlyAdminCanShareMovie=c),u!==void 0&&(b.waitForAdmin=u),l&&(b.audienceMode=l),m&&(b.audioOnly=m),h.length){let V=h.map(J=>I.composeUserId(J));b.speakerIds=V.join(",")}return E&&(b.closed=E),P&&(b.externalIds=P.map(z.toSignaling).join(",")),b}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 i={joinLink:e};t&&(i.anonymName=t);let a=await this._call("vchat.getAnonymTokenByLink",i);return this._userId=Number(a.uid),a.token}async joinConversationByLink(e,t=!1,i,a){let s={joinLink:e,isVideo:t,protocolVersion:p.protocolVersion,capabilities:rt.getFlags()};return i?.length&&(s.observedIds=i.join(",")),p.anonymToken&&(s.anonymToken=p.anonymToken),a&&(s.payload=a),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],i=[],a=new Map,s=Array.from(this._externalUidsCache.keys()),c=Array.from(this._externalUidsCache.values());for(let l of e){let m=z.toString(l),h=c.indexOf(m);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(a.set(String(l.id),m),i.push({id:l.id,ok_anonym:l.type==="ANONYM"}))}return i.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:i})).ids.forEach((l,m)=>{let h=Number(l.ok_user_id),E=String(l.external_user_id.id);a.has(E)&&(this.cacheExternalId(h,z.fromString(a.get(E))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let s of e){let c=z.toString(s),u=a.indexOf(c);if(u>-1){let l=I.composeParticipantId(this.replaceByInitialIdIdIfExists(i[u]),ne.USER,s.deviceIdx);t.set(s,l)}}return t}async getExternalIdsByOkIds(e){let t=[],i=[];for(let s of e)if(this._externalUidsCache.has(s)){let c=this.getDecorativeIdByInitialId(s),u=this._externalUidsCache.get(c??s);t.push(z.fromString(u))}else i.push(s);if(!i.length)return t;let a=await this._getExternalIdsByOkIds(i);return Array.from(a.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),i=Array.from(this._externalUidsCache.values()),a=z.toString(e),s=i.indexOf(a);return s>-1?I.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),ne.USER,e.deviceIdx):s>-1?I.composeParticipantId(t[s],ne.USER,e.deviceIdx):null}cacheExternalId(e,t){let i=I.extractOkId(e);this._externalUidsCache.set(i,z.toString(t))}mapDecorativeId(e,t){let i=I.extractOkId(e),a=I.extractOkId(t);this._decorativeIdToInitialId.set(i,a),this._initialIdToDecorativeId.set(a,i)}unmapDecorativeId(e){let t=I.extractOkId(e),i=this.getDecorativeIdByInitialId(t);i&&this._decorativeIdToInitialId.delete(i),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=I.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=I.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}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=y.HUNGUP){let i={conversationId:e,reason:t};p.anonymToken&&(i.anonymToken=p.anonymToken),ri("vchat.hangupConversation",i)}sendUserFeedbackStats(e,t,i,a){let s={collector:"app.vchat.events.product",data:JSON.stringify({application:`${p.appName}:${p.sdkVersion}`,platform:p.platform,items:[{type:1,operation:X.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};ri("log.externalLog",s)}async removeHistoryRecords(e){await this._call("vchat.removeHistoryRecords",{recordIds:e.join(",")})}cleanup(){this._decorativeIdToInitialId=new Map,this._initialIdToDecorativeId=new Map}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(i=>this.getDecorativeIdByInitialId(i)??i);try{let i=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),a=(s,c)=>{for(let[u,l]of Object.entries(s)){let m=Number(u),h=z.fromId(l,c);t.set(m,h),this.cacheExternalId(m,h)}};i.external_ids&&a(i.external_ids,"USER"),i.anonym_ids&&a(i.anonym_ids,"ANONYM");for(let s of e){let c=Number(s);if(!t.has(c)){let u=z.fromId(String(c));t.set(c,u),this.cacheExternalId(c,u)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};function rc(n){return typeof n=="object"&&n!==null&&"error_code"in n&&"error_msg"in n}var cs=(e=>(e.KING="KING",e.PAWN="PAWN",e))(cs||{}),ac=cs;var ds=(e=>(e.OFF="0",e.ON="1",e))(ds||{});var fa=class{constructor(r){o(this,"_queue");o(this,"_readCursor");o(this,"_writeCursor");o(this,"_moveReadCursor");o(this,"_left");this._queue=new Array(r).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(r){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=r,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(r){return(r+1)%this._queue.length}next(){let r=this._queue[this._readCursor];return r&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),this._left-=1),r}};var Sa=class{constructor(r,e,t,i=null){o(this,"_uuid");o(this,"_apiKey");o(this,"_callToken");o(this,"_apiEnv");o(this,"_baseApiUrl");o(this,"_sessionKey");this._uuid=I.uuid(),this._apiKey=e,this._callToken=t,this._apiEnv=r,this._baseApiUrl=i}async authorize(){let r={session_data:{device_id:this._uuid,client_version:p.appVersion,client_type:"SDK_JS",auth_token:this._callToken,version:3},application_key:this._apiKey},e=await wr(this._baseApiUrl,this._apiEnv),t=await xi("auth.anonymLogin",r,!0,e);return I.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(r){let e={conversationId:r,reason:y.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await wr(this._baseApiUrl,this._apiEnv);await xi("vchat.hangupConversation",e,!0,t)}};var ue,Ui=null,uE={getCameras:M.getCameras,getMicrophones:M.getMicrophones,getOutput:M.getOutput,getVideoFacingMode:M.getVideoFacingMode,hasCamera:M.hasCamera,hasMicrophone:M.hasMicrophone,getSavedCamera:M.getSavedCamera,getSavedMicrophone:M.getSavedMicrophone,getSavedOutput:M.getSavedOutput,hasCameraPermission:M.hasCameraPermission,hasMicrophonePermission:M.hasMicrophonePermission,hasPermissions:M.hasPermissions,getUserMedia:M.getUserMedia,getUserVideo:M.getUserVideo,getUserAudio:M.getUserAudio,setResolution:M.setResolution,isBrowserSupported:M.isBrowserSupported,isScreenCapturingSupported:M.isScreenCapturingSupported,os:M.os,isMobile:M.isMobile,browserName:M.browserName,browserVersion:M.browserVersion,baseChromeVersion:M.baseChromeVersion,getAudioContext:M.getAudioContext,isAudioShareSupported:M.isAudioShareSupported},mE={participantMarkerCompare:I.participantMarkerCompare};function hE(n){Ui=n}function _E(n){p.videoEffects=n}function gE(n){p.audioEffects=n}function fE(n,r=null,e={},t=1){p.vmoji=n,p.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function SE(n){if(p.set(n),ue||(ue=new Li),ls.disableLog(!p.debug),d.toggle(p.debug),d.log(`Calls SDK ${p.sdkVersion}`,n),await M.init(),!M.isBrowserSupported())throw new j(oe.UNSUPPORTED);d.log("UserAgent:",navigator.userAgent),d.log("Screen resolution:",`${window.screen.width}x${window.screen.height}`),d.log("Permissions:",`Camera: ${M.hasCameraPermission()}, Mic: ${M.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${p.simulcast}`)}async function vE(n,r=[de.AUDIO],e="",t=!1,i=!1,a,s){let c=[];return Array.isArray(n)?c=n.length?n:[]:n&&(c=[n]),nc([],ut.USER,r,e,t,i,a,c,s)}async function nc(n,r=ut.USER,e,t="",i=!1,a=!1,s,c,u){if(B.current())throw d.error("There is already active call"),new j(y.FAILED);return new B(ue,Ui).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:u})}async function IE(n,r){return sc(n,ne.USER,void 0,r)}async function sc(n,r=ne.USER,e,t,i,a){if(n===B.id())throw new Error("Push has already been processed");return a&&ue.setUserId(a),new B(ue,Ui).onPush(n,r,e,t,i)}async function EE(n,r){return n&&(p.authToken=n),r!==void 0&&p.apiBaseUrl!==r&&(p.apiBaseUrl=r,as()),ue.authorize()}async function TE(n=[de.AUDIO]){return Qe().accept(n)}async function RE(){let n=B.current();if(n)return n.decline()}async function CE(n,r=[de.AUDIO]){return oc(n,r)}async function oc(n,r,e){if(B.current())throw d.error("There is already active call"),new j(y.FAILED);return new B(ue,Ui).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function PE(n,r=[de.AUDIO],e,t,i){if(B.current())throw d.error("There is already active call"),new j(y.FAILED);return e&&(p.anonymToken=e),new B(ue,Ui).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i})}async function yE(){let n=B.current();if(n)return n.hangup();B.hangupAfterInit()}async function bE(n,r){let e=Array.isArray(n)?n:[n],t=B.current();t&&await t.addParticipant(e,r)}async function ME(n,r){let e=B.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function AE(n,r=!1){let e=await ue.getOkIdsByExternalIds([n]);return cc(e[0],r)}async function cc(n,r=!1){let e=B.current();if(e)try{await e.removeParticipant(I.composeUserId(n),r)}catch(t){d.warn(`Failed to remove participant ${n}. Perhaps he is no longer on the call. ${t}`)}}async function DE(n,r){let e=B.current();if(n==="videoinput"&&Ct.contains(r))return p.videoFacingMode=r,e?(M.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await M._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function wE(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&p.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=B.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function kE(n){let r=B.current();r&&r.toggleAnimojiCapturing(n)}async function OE(n,r=!1){let e=B.current();e&&await e.setVideoStream(n,r)}async function xE(n){let r=B.current();r&&await r.toggleLocalVideo(n)}async function NE(n){let r=B.current();r&&await r.toggleLocalAudio(n)}async function LE(n){let r=B.current();if(r)return r.setLocalResolution(n)}async function UE(n){let r=B.current();r&&await r.changePriorities(n)}async function BE(n,r){let e=B.current();if(e){let t;if(r){let[i]=await ue.getOkIdsByExternalIds([r]);t=I.composeParticipantId(i,ne.USER,r.deviceIdx)}await e.changeParticipantState(n,t)}}async function FE(){let n=B.current();n&&await n.putHandsDown()}async function VE(n){let r=B.current();r&&await r.updateDisplayLayout(n)}async function jE(n,r,e=!1){let t=await ue.getOkIdsByExternalIds([n]);return dc(t[0],z.getDeviceIdx(n),r,e)}async function dc(n,r,e,t=!1){let i=B.current();i&&await i.grantRoles(I.composeParticipantId(n,ne.USER,r),e,t)}async function HE({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await ue.getOkIdsByExternalIds([n]))[0]),lc({uid:i,muteStates:r,requestedMedia:e,deviceIdx:z.getDeviceIdx(n),roomId:t})}async function lc({uid:n=null,muteStates:r,requestedMedia:e=[],deviceIdx:t=0,roomId:i=null}){let a=B.current();if(a){let s=n?I.composeParticipantId(n,ne.USER,t):null;await a.muteParticipant(s,r,e,i)}}async function GE(n,r=!1,e=null){let t=await ue.getOkIdsByExternalIds([n]);return pc(t[0],r,z.getDeviceIdx(n),e)}async function pc(n,r=!1,e=0,t=null){let i=B.current();i&&await i.pinParticipant(I.composeParticipantId(n,ne.USER,e),r,t)}async function WE(n){let r=B.current();r&&await r.updateMediaModifiers(n)}async function KE(n){let r=B.current();r&&await r.enableVideoSuspend(n)}async function $E(n){let r=B.current();r&&await r.enableVideoSuspendSuggest(n)}async function qE(n){let r=B.current();r&&await r.changeOptions(n)}async function zE(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),uc(n,e)}async function uc(n,r=null){let e=B.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function JE(n=10){let r=B.current();if(r)return r.chatHistory(n)}async function YE(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),mc(n,e,z.getDeviceIdx(r))}async function mc(n,r=null,e=0){let t=B.current();if(t){let i=r?I.composeParticipantId(r,ne.USER,e):null;await t.customData(n,i)}}async function QE(n="",r=!1,{onlyAdminCanShareMovie:e=!1,waitForAdmin:t=!1,closedConversation:i=!1}={}){return(await ue.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,waitForAdmin:t,closedConversation:i})).join_link}async function XE(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=z.fromIds(i),s=await ue.getOkIdsByExternalIds(a);return(await ue.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},s)).join_link}async function ZE(){let n=B.current();return n?n.createJoinLink():Promise.reject()}async function eT(){let n=B.current();return n?n.removeJoinLink():Promise.reject()}async function tT(n,r){return ue.getAnonymTokenByLink(n,r)}function iT(n){let r=B.current();r&&r.setVolume(n)}function rT(n){p.forceRelayPolicy=n}async function aT(n=!1,r=null,e=null,t="DIRECT_LINK",i=null,a=null){let s=B.current();return s?s.startStream(n,r,e,t,i,a):Promise.reject()}async function nT(n=null,r){let e=B.current();return e?e.stopStream(n,r):Promise.reject()}async function sT(n=null){let r=B.current();return r?r.publishStream(n):Promise.reject()}async function oT(n,r,e=!1,t=null){let i=B.current();if(!i)return Promise.reject();let a,s,c=[];if(r?.length&&c.push(...r),n&&c.push(n),c.length){let u=await ue.getParticipantIdsByExternalIds(c);n&&(a=u.get(n),u.delete(n)),s=Array.from(u.values())}return i.recordSetConf(a,s,e,t)}async function cT(){let n=B.current();return n?n.getStreamInfo():Promise.reject()}async function dT(n){let r=B.current();return r?r.addMovie(n):Promise.reject()}async function lT(n){let r=B.current();return r?r.updateMovie(n):Promise.reject()}async function pT(n){let r=B.current();return r?r.removeMovie(n):Promise.reject()}async function uT(n,r){let e=B.current();if(e){let t=[];for(let i of n){let a,s;i.addParticipantIds&&(a=(await ue.getOkIdsByExternalIds(i.addParticipantIds)).map(c=>I.composeUserId(c))),i.removeParticipantIds&&(s=(await ue.getOkIdsByExternalIds(i.removeParticipantIds)).map(c=>I.composeUserId(c))),t.push({id:i.id,name:i.name,participantCount:i.participantCount,addParticipantIds:a,removeParticipantIds:s,countdownSec:i.countdownSec})}return e.updateRooms(t,r)}return Promise.reject()}async function mT(n,r){let e=B.current();return e?e.activateRooms(n,r):Promise.reject()}async function hT(n=null,r=null){let e=B.current();if(!e)return Promise.reject();let t;if(r){let i=await ue.getOkIdsByExternalIds([r]),a=z.getDeviceIdx(r);t=I.composeParticipantId(i[0],ne.USER,a)}return e.switchRoom(n,t)}async function _T(n){let r=B.current();return r?r.removeRooms(n):Promise.reject()}function gT(n){p.statisticsInterval=n;let r=B.current();if(r)return r.updateStatisticsInterval()}function fT(n){ls.disableLog(!n),d.toggle(n)}function ST(n,...r){p.debugLog&&d.send(n,"[external]",...r)}async function vT(){let n=Oe.conversationId;if(!n)throw d.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let r=Oe.collectLogs();if(r.length===0)throw d.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Oe.startTime,t=Oe.endTime;try{return ue?.uploadDebugLogs(n,e,t,JSON.stringify(r))}catch(i){throw d.error("[uploadDebugLogs]","Error while uploading logs",i),new Error("Error while uploading logs",{cause:i})}}async function IT(n){let r=B.current();if(r)return r.videoEffect(n)}async function ET(n,r){let e=B.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function TT(n){let r=B.current();r&&await r.setAudioStream(n)}async function RT(n,r=null,e=null){let t=B.current();if(!t)return;let i=e??r?.id,a=null;if(r){let c=(await ue.getOkIdsByExternalIds([r]))[0];if(!c)throw new Error("Could not get user id to set animoji svg");a=I.composeParticipantId(c,ne.USER,z.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function CT(n){let r=B.current();r&&r.setAnimojiFill(n)}async function PT(n=null,r,e=!1){return Qe().getWaitingHall(n,r,e)}async function yT(){return Qe().getAudienceModeHands()}async function bT(n,r=!1){let e=Qe(),t;if(n){let[i]=await ue.getOkIdsByExternalIds([n]);t=I.composeUserId(i)}return e.promoteParticipant(t,r)}async function MT(n=!1){return Qe().requestPromotion(n)}async function AT(n=!1){return Qe().acceptPromotion(n)}async function DT(n){return Qe().getParticipantListChunk(n)}async function wT(n){return Qe().getParticipants(n)}async function kT(n){return Qe().feedback(n)}function OT(n,r,e){return Qe().userFeedbackStats(n,r,e)}function xT(n,r={},e=!1){let t=B.current();t&&t.sendClientEvent(n,r,e)}async function NT(n,r){return Qe().enableFeatureForRoles(n,r)}function Qe(){let n=B.current();if(!n)throw new Error("Conversation not found");return n}async function LT(n){await ue.removeHistoryRecords(n)}async function UT(n){let r=B.current();r&&await r.startAsr(n)}async function BT(n){let r=B.current();r&&await r.stopAsr(n)}async function FT(n){let r=B.current();r&&await r.requestAsr(n)}async function VT(n){let r=B.current();return r?r.startUrlSharing(n):Promise.reject()}async function jT(){let n=B.current();return n?n.stopUrlSharing():Promise.reject()}function HT(){return p.sdkVersion}export{Li as Api,Sa as ApiExternal,fa as ArrayDequeue,be as AuthData,Ft as BaseLogger,Ne as CallDirection,ut as CallType,ma as ChatRoomEventType,ha as ConversationFeature,at as ConversationOption,Za as DebugMessageType,_a as ExternalIdType,Ct as FacingMode,oe as FatalError,j as HangupReason,y as HangupType,de as MediaOption,We as MediaTrackKind,$t as MediaType,Ge as MuteState,Z as ParticipantState,ds as ParticipantStateDataValue,Vr as ParticipantStatus,ac as RecordRole,Mi as RoomsEventType,ei as Signaling,x as SignalingCommandType,Ye as SignalingConnectionType,L as SignalingNotification,je as TransportTopology,Et as UserRole,ne as UserType,Lt as VolumeDetector,TE as acceptCall,AT as acceptPromotion,mT as activateRooms,dT as addMovie,bE as addParticipant,ME as addParticipantInternal,EE as authorize,uE as browser,nc as callInternal,vE as callTo,wE as captureScreen,kE as captureVmoji,ET as changeAudioEffect,qE as changeConversationOptions,DE as changeDevice,BE as changeParticipantState,UE as changePriorities,IT as changeVideoEffect,JE as chatHistory,zE as chatMessage,uc as chatMessageInternal,ZE as createJoinLink,YE as customData,mc as customDataInternal,fT as debug,ST as debugMessage,RE as declineCall,NT as enableFeatureForRoles,KE as enableVideoSuspend,$E as enableVideoSuspendSuggest,kT as feedback,rT as forceRelayPolicy,tT as getAnonymTokenByLink,yT as getAudienceModeHands,DT as getParticipantListChunk,wT as getParticipants,cT as getStreamInfo,PT as getWaitingHall,jE as grantRoles,dc as grantRolesInternal,yE as hangup,SE as init,CE as joinCall,PE as joinCallByLink,oc as joinCallInternal,xT as logClientEvent,HE as muteParticipant,lc as muteParticipantInternal,GE as pinParticipant,pc as pinParticipantInternal,IE as processPush,sc as processPushInternal,bT as promoteParticipant,sT as publishStream,FE as putHandsDown,oT as recordSetConf,LT as removeHistoryRecords,eT as removeJoinLink,pT as removeMovie,AE as removeParticipant,cc as removeParticipantInternal,_T as removeRooms,FT as requestAsr,MT as requestPromotion,gE as setAudioEffects,TT as setAudioStream,LE as setLocalResolution,hE as setLogger,WE as setMediaModifiers,gT as setStatisticsInterval,_E as setVideoEffects,OE as setVideoStream,fE as setVmoji,CT as setVmojiFill,RT as setVmojiSvg,iT as setVolume,UT as startAsr,XE as startAudienceConversation,QE as startConversation,aT as startStream,VT as startUrlSharing,BT as stopAsr,nT as stopStream,jT as stopUrlSharing,hT as switchRoom,NE as toggleLocalAudio,xE as toggleLocalVideo,VE as updateDisplayLayout,lT as updateMovie,uT as updateRooms,vT as uploadDebugLogs,OT as userFeedbackStats,mE as utils,HT as version};
|
|
16
|
+
`)}})}_startMonitorRtpShareInterval(){if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,5e3)};this._monitorRtpShareInterval=window.setTimeout(t,5e3)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}};var He=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(He||{}),Pr=class extends ce{constructor(e,t,i,a){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_topology");o(this,"_allocated",[]);o(this,"_opened",[]);o(this,"_directTransport",null);o(this,"_serverTransport",null);o(this,"_serverSettings");o(this,"_dtListeners",[]);o(this,"_stListeners",[]);o(this,"_states",{});o(this,"_localState","IDLE");o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"ANIMOJI_STATUS",this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e==="SERVER"&&(this._serverTransport=this._createServerTransport())}updateSettings(e){d.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(d.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){d.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,i=!1,a=!1){d.log("Trying open participant",{participantIds:e});let s=a;for(let c of e){if(this._opened.indexOf(c)!==-1){d.warn(`The participant [${c}] has already had opened transport`);continue}if(this._allocated.indexOf(c)===-1){d.warn(`The participant [${c}] has no allocated transport`);continue}this._opened.push(c),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(i),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),d.debug("The transport has been opened",e))}close(e){let t=this._allocated.indexOf(e),i=this._opened.indexOf(e);t<0&&d.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&i>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),i>=0&&this._opened.splice(i,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(),l.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){l.vmoji&&t.isMe&&l.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 i=e.filter(a=>this._states[a]!==t?(this._states[a]=t,!0):!1);i.length&&this._triggerEvent("STATE_CHANGED",i,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent("LOCAL_STATE_CHANGED",e))}_onSignalingNotification(e){if(e.notification===L.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(d.log(`Topology changed ${this._topology} -> ${e.topology}`),R.log(w.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||[],i=e.offerToTypes||[],a=e.offerToDeviceIdxs||[],s=t.length&&i.length?I.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){d.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&d.warn("Topology changed to DIRECT, but the allocated participants count more then one");let c=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let u=s===c;this._directTransport=this._createDirectTransport(c,u)}this._opened.indexOf(c)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new Ci(e,t,this._signaling,this._mediaSource,this._serverSettings);return this._dtListeners.length>0&&d.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(i.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this,e)),i.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this,e)),i.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),i.addEventListener("STATE_CHANGED",this._onDirectTransportChanged.bind(this)),i.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),i.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"DIRECT"))),this._animojiReceiver&&this._animojiSender&&i.setAnimojiTransport(this._animojiReceiver,this._animojiSender),i}_createServerTransport(){let e=new ki(this._signaling,this._mediaSource,this._serverSettings);return this._stListeners.length>0&&d.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 i=this._opened.indexOf(t);i>=0&&this._opened.splice(i,1);let a=this._allocated.indexOf(t);a>=0&&this._allocated.splice(a,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,i){this._triggerEvent("REMOTE_TRACK_ADDED",e,t,i)}_onRemoteTrackRemoved(e,t,i){this._triggerEvent("REMOTE_TRACK_REMOVED",e,t,i)}_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(!l.vmoji)return;this._animojiReceiver=new l.vmoji.AnimojiReceiver((t,i)=>this._onAnimojiStream(t,i),t=>this._onAnimojiStream(t,null),t=>{this._triggerEvent("ANIMOJI_ERROR",t)},l.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new l.vmoji.AnimojiSender(e,this._signaling.getPeerId(),l.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:l.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=t=>this._animojiReceiver?.receive(t)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology!=="SERVER"?(R.log(w.PAT_WAITING_TIME_ERROR,"wrongTopology"),d.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(R.log(w.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var xe=class xe{constructor(){o(this,"trackerByTransport",{ws:new ot,wt:new ot});o(this,"lastSeen",{})}static create(){xe._instance||(xe._instance=new xe)}static mark(r){if(!xe._instance)return;let e=Date.now(),t=xe._instance.lastSeen[r];if(typeof t=="number"){let i=e-t;i>=0&&xe._instance.trackerByTransport[r].add(i)}xe._instance.lastSeen[r]=e}static logMetrics(r){xe._instance&&["ws","wt"].forEach(e=>{if(!xe._instance.trackerByTransport[e].hasData)return;let t=xe._instance.trackerByTransport[e].snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_PING_SUMMARY,min_value:t.min,max_value:t.max,avg_value:t.avg,median_value:t.median,p95_value:t.p95,values_count:t.count,signaling_transport:e})})}static destroy(){xe._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new ot,wt:new ot},this.lastSeen={}}};o(xe,"_instance");var lt=xe;var Fe=class Fe{constructor(){o(this,"trackerByCommand",new Map)}static create(){Fe._instance||(Fe._instance=new Fe)}static mark(r,e,t){if(!Fe._instance)return;let i=`${r}|${t}`,a;Fe._instance.trackerByCommand.has(i)?a=Fe._instance.trackerByCommand.get(i):(a=new ot,Fe._instance.trackerByCommand.set(i,a)),a.add(e)}static logMetrics(r){if(Fe._instance)for(let[e,t]of Fe._instance.trackerByCommand.entries()){if(!t.hasData)continue;let[i,a]=e.split("|"),s=t.snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_COMMAND_SUMMARY,api_method:i,min_value:s.min,max_value:s.max,avg_value:s.avg,median_value:s.median,p95_value:s.p95,values_count:s.count,signaling_transport:a})}}static destroy(){Fe._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};o(Fe,"_instance");var pt=Fe;var Hn=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(Hn||{}),Ye=Hn;var Gn={producerScreenTrack:()=>!0,videoTracksCount:()=>l.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>l.movieShare,useParticipantListChunk:()=>l.useParticipantListChunk,useRooms:()=>l.useRooms,vmoji:()=>!!l.vmoji,useCallsToContacts:()=>l.useCallsToContacts,useChatRooms:()=>l.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!l.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>l.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>l.waitForAdminInGroupCalls},Qe=class{static getFlags(){let r=Object.values(Gn),e=0;for(let t=0;t<r.length;t++)r[t]()&&(e|=1<<t);return e.toString(16).toUpperCase()}static parseCapabilities(r){let e=parseInt(r||"0",16);return Object.keys(Gn).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};import*as Ge from"fflate";var Yo=63n,Qo=16383n;var Xo=4611686018427387903n,br=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=Yo)return new Uint8Array([Number(e)]);if(e<=Qo)return new Uint8Array([64|Number(e>>8n),Number(e&0xffn)]);if(e<=BigInt(1073741823))return new Uint8Array([128|Number(e>>24n),Number(e>>16n&0xffn),Number(e>>8n&0xffn),Number(e&0xffn)]);if(e<=Xo)return new Uint8Array([192|Number(e>>56n),Number(e>>48n&0xffn),Number(e>>40n&0xffn),Number(e>>32n&0xffn),Number(e>>24n&0xffn),Number(e>>16n&0xffn),Number(e>>8n&0xffn),Number(e&0xffn)]);throw new RangeError("Number is too large to encode using varint")}},Ar=class{decode(r){let e=this.getNumBytesForLengthInteger(r);if(e<0)throw new Error("Invalid length prefix");if(r.length<e)return null;let t=BigInt(0);switch(e){case 1:t=BigInt(r[0]&63);break;case 2:t=BigInt(r[0]&63)<<8n|BigInt(r[1]);break;case 4:t=BigInt(r[0]&63)<<24n|BigInt(r[1])<<16n|BigInt(r[2])<<8n|BigInt(r[3]);break;case 8:t=BigInt(r[0]&63)<<56n|BigInt(r[1])<<48n|BigInt(r[2])<<40n|BigInt(r[3])<<32n|BigInt(r[4])<<24n|BigInt(r[5])<<16n|BigInt(r[6])<<8n|BigInt(r[7]);break}return t}getNumBytesForLengthInteger(r){let e=r[0]&192;return e===0?1:e===64?2:e===128?4:e===192?8:-1}};var Mr=class{constructor(r){o(this,"encoder");o(this,"compression");o(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new br,this.compression=r??null}encode(r){let e=this.encoder.encode(r);e=this.compress(e);let t=this.lengthEncoder.encode(e.length),i=new Uint8Array(t.length+e.length);return i.set(t),i.set(e,t.length),i}compress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return Ge.gzipSync(r);case"deflate":return Ge.zlibSync(r);case"deflate-raw":return Ge.deflateSync(r);default:return r}}},Dr=class{constructor(r){o(this,"decoder");o(this,"compression");o(this,"lengthDecoder");o(this,"buffer");o(this,"expectedLength");o(this,"offset");o(this,"lengthPrefixLength");this.decoder=new TextDecoder,this.lengthDecoder=new Ar,this.compression=r??null,this.buffer=new Uint8Array(0),this.expectedLength=null,this.offset=0}decode(r){let e=[];for(this.buffer=new Uint8Array([...this.buffer,...r]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return e;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return e;let t=this.buffer.subarray(this.offset,this.offset+this.expectedLength);t=this.decompress(t),e.push(this.decoder.decode(t)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return e}readLength(r){if(r.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(r),this.lengthPrefixLength<0)throw new Error("Invalid length prefix");let e=this.lengthDecoder.decode(r.subarray(0,this.lengthPrefixLength));return e===null?null:Number(e)}decompress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return Ge.gunzipSync(r);case"deflate":return Ge.unzlibSync(r);case"deflate-raw":return Ge.inflateSync(r);default:return r}}};var ri=class{constructor(r,e={}){o(this,"webTransport");o(this,"stream",null);o(this,"writer",null);o(this,"reader",null);o(this,"url");o(this,"options");o(this,"compression");o(this,"encoder");o(this,"decoder");o(this,"onopen",null);o(this,"onmessage",null);o(this,"onerror",null);o(this,"onclose",null);o(this,"readyState",WebSocket.CONNECTING);this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new Mr(this.compression),this.decoder=new Dr(this.compression),this.connect()}getCompressionTypeFromUrl(r){try{let t=new URL(r).searchParams.get("compression");switch(t){case"gzip":case"deflate":case"deflate-raw":return t;default:return null}}catch(e){return d.log("Exception while parsing compression",e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,d.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(r){d.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error")),this.onclose?.(new CloseEvent("close",{code:1006,reason:"Connection Failed"}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:r,value:e}=await this.reader.read();if(r)break;e&&(yield e)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let r of this.readChunks())this.decoder.decode(r).forEach(t=>{this.onmessage?.(new MessageEvent("message",{data:t}))});this.close(1e3,"Stream Closed")}catch(r){d.error("[WebTransport] Stream read failed",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(r){if(this.readyState!==WebSocket.OPEN){d.warn("[WebTransport] Attempt to send data before webtransport is open");return}if(!this.writer){d.warn("[WebTransport] Attempt to send data before stream is ready");return}try{await this.writer.ready;let e=this.encoder.encode(r);await this.writer.write(e)}catch(e){d.error("[WebTransport] Failed to send data",e),this.onerror?.(new Event("error")),this.close(1006,"Failed to send data")}}close(r=1e3,e){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(t){d.warn("[WebTransport] already closed. Did we get a STOP_SENDING? ignore",t)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent("close",{code:r,reason:e})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return"WebTransport"in window&&typeof WebTransport=="function"?b.browserName()==="Firefox"?l.webtransportFF:b.browserName()!=="Safari":!1}};var Wn="open",Zo=10,ec=["service-unavailable","conversation-ended","invalid-token"],ai=class n extends pi{constructor(){super(...arguments);o(this,"socket",null);o(this,"sequence",1);o(this,"lastStamp",0);o(this,"websocketCommandsQueue",[]);o(this,"datachannelCommandsQueue",[]);o(this,"incomingCache",[]);o(this,"responseHandlers",{});o(this,"connectionType");o(this,"reconnectCount",0);o(this,"endpoint");o(this,"wtEndpoint",null);o(this,"conversationResolve",null);o(this,"conversationReject",null);o(this,"connected",!1);o(this,"listenersReady",!1);o(this,"postfix","&platform="+l.platform+"&appVersion="+l.appVersion+"&version="+l.protocolVersion+"&device="+l.device+"&capabilities="+Qe.getFlags());o(this,"peerId",null);o(this,"conversationId",null);o(this,"reconnectTimer",0);o(this,"connectionMessageWaitTimer",0);o(this,"doctorTimer",0);o(this,"participantIdRegistry",null);o(this,"producerNotificationDataChannel",null);o(this,"producerCommandDataChannel",null);o(this,"producerCommandDataChannelEnabled",!1);o(this,"producerCommandSerializationService",new hr)}static get RECONNECT_DELAY(){return l.signalingReconnectDelay}static get RECONNECT_MAX_DELAY(){return l.signalingReconnectMaxDelay}static get RECONNECT_MAX_COUNT(){return l.signalingReconnectMaxCount}static get WAIT_CONNECTION_DELAY(){return l.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return l.waitResponseDelay}static get WAIT_MESSAGE_DELAY(){return l.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=t=>{let i=this.participantIdRegistry?.handleMessage(t.data);i&&this._handleMessage(i)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(i=>{i&&this._handleMessage(i)}).catch(i=>{d.warn("[signaling] cannot parse message at producerCommandDataChannel",i)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return this.postfix+=`&clientType=${l.clientType}`,new Promise((t,i)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){R.log(w.SOCKET_ACTION,"already_opened"),i(Error("Socket already opened"));return}this.conversationResolve=a=>{t(a),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=a=>{i(a),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},i=!0,a=0){if(t.participantId){let s=I.decomposeParticipantId(t.participantId),c=I.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:c.id,participantType:c.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,i,a)}async _sendRaw(e,t={},i=!0,a=0){let s=c=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(c),this.producerCommandDataChannel?.readyState===Wn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){R.log(w.SOCKET_ACTION,"not_opened"),d.warn("[signaling] socket is not opened"),c.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(R.log(w.SOCKET_ACTION,"invalid_state"),d.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(c),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((c,u)=>{let p=(P,C=!1)=>{!a||C?u(P):(d.debug("[signaling] resending a signaling message",e,E.sequence),a--,s(E))},m=this.sequence++,h=`${e}_${m}`;ue.setMark(h);let E={sequence:m,name:e,statMarkName:h,params:t,responseTimer:0,needResponse:i,resolve:c,reject:p};s(E)})}_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,i){let a=Object.assign({sdp:t},i);return this._send(x.TRANSMIT_DATA,{participantId:e,data:a})}async acceptCall(e){return this._send(x.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(x.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Zo)}async changeParticipantState(e,t){let i={participantState:{state:e}};return t&&(i.participantId=t),this._sendRaw(x.CHANGE_PARTICIPANT_STATE,i)}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 i={capabilities:t};return e&&(i.description=e.sdp),this._send(x.ALLOCATE_CONSUMER,i)}async acceptProducer(e,t){let i={description:e.sdp};return t&&(i.ssrcs=t),this._send(x.ACCEPT_PRODUCER,i)}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 recordSetConf(e={hideParticipantCount:!1,roomId:null}){let t={options:{hideParticipantCount:e.hideParticipantCount},roomId:e.roomId};return e.king&&(t.king=e.king),e.pawns?.length&&(t.pawns=e.pawns.join(",")),this._send(x.RECORD_SET_CONF,t)}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,i){let a={participantId:e,roles:t};return i&&(a.revoke=!0),this._sendRaw(x.GRANT_ROLES,a)}async muteParticipant(e,t,i,a=null){return this._sendRaw(x.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:i,roomId:a})}async enableFeatureForRoles(e,t){return this._sendRaw(x.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,i){let a={participantId:e,roomId:i};return t&&(a.unpin=!0),this._sendRaw(x.PIN_PARTICIPANT,a)}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,i=!1){let a={};return e&&(a.fromId=e),t&&(a.count=t),i&&(a.backward=i),this._send(x.GET_WAITING_HALL,a)}async promoteParticipant(e,t=!1){let i={};return e&&(i.participantId=e),t&&(i.demote=t),this._sendRaw(x.PROMOTE_PARTICIPANT,i)}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)}_connect(e,t){if(this.socket&&this.socket.readyState<WebSocket.CLOSING)return;this.connectionType=e;let i="";e&&(i+=`&tgt=${e}`),e===Ye.RETRY&&this.lastStamp&&(i+=`&recoverTs=${this.lastStamp}`),i=a(i),t?(i+="&compression=deflate-raw",i+=`&ua=${navigator.userAgent}`,d.debug("[signaling] connecting to wt "+this.wtEndpoint+this.postfix+i),this.socket=new ri(this.wtEndpoint+this.postfix+i)):(d.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+i),this.socket=new WebSocket(this.endpoint+this.postfix+i)),this._markTransportStat(e===Ye.RETRY?"reconnected":"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();function a(s){if(!l.useParticipantListChunk)return s;let c=l.participantListChunkInitIndex;s+=`&partIdx=${c}`;let u=l.participantListChunkInitCount;return u!==null&&(s+=`&partCount=${u}`),s}}_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(){d.debug("[signaling] socket opened"),R.log(w.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Ye.RETRY?"reconnected":"connected")}_onMessage(e){if(this._startDoctor(),e.data==="ping"){lt.mark(this._getSocketType()),this._markTransportStat("failed_pings"),v.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send("pong");return}try{let t=JSON.parse(e.data);v.onSignalingMessage(t),this._handleMessage(t)}catch(t){R.log(w.SOCKET_ACTION,"parse_error"),d.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(d.debug("[signaling] signaling connected",e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.postfix+=`&peerId=${e.peerId.id}`,this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat("restart"),this._triggerEvent(Ae.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Ae.NOTIFICATION,{type:"notification",notification:L.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===L.ACCEPTED_CALL&&t.peerId.id===this.peerId&&t.peerId.type==="WEB_TRANSPORT"||this._handleMessage(t)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(Ae.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:R.log(w.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){R.log(w.SOCKET_ACTION,`error-${e.error}`);let t=e.error?ec.includes(e.error):!1;switch(d.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case"service-unavailable":let i=new B(y.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Ae.NOTIFICATION,{notification:L.CLOSED_CONVERSATION,reason:y.SERVICE_UNAVAILABLE});break;case"conversation-ended":this.conversationReject?this.conversationReject(new B(e.reason||de.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(Ae.NOTIFICATION,{notification:L.CLOSED_CONVERSATION,reason:e.reason});break;case"participant-not-found":this._throwError(new Error(`Signaling error: ${e.error}`));break;case"invalid-token":default:if(!t)break;this.connected?this._throwError(new Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new B(e.reason||de.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(Ae.FAILED,e)}_onError(e){R.log(w.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){R.log(w.SOCKET_ACTION,"closed"),d.debug("[signaling] connection closed",{code:e.code,reason:e.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new B(y.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(new Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let e=Math.min(n.RECONNECT_MAX_DELAY,n.RECONNECT_DELAY*Math.pow(2,this.reconnectCount-1));d.log(`[signaling] reconnect websocket after ${e}ms (${this.reconnectCount})`),R.log(w.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Ye.RETRY,!1),e)}_handleCommandResponse(e,t){if(!Object.hasOwn(this.responseHandlers,t.sequence))return;let i=this.responseHandlers[t.sequence];window.clearTimeout(i.responseTimer);let a=ue.measureMark(i.statMarkName);a!==null&&pt.mark(i.name,a,this._getSocketType()),d.debug(`[signaling] command response [${t.sequence}]`,t),e?(delete this.responseHandlers[t.sequence],i.resolve(t)):t.type==="error"?(delete this.responseHandlers[t.sequence],R.log(w.SOCKET_ACTION,"response-error"),i.reject(new Error(t.error||`Response error [${i.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],R.log(w.SOCKET_ACTION,"response-timeout"),i.reject(new Error(t.error||`Response timeout [${i.name}]`))):i.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),n.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(d.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Wn){t.reject(new Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let i=this._serializeBinary(t);i!==null&&this.producerCommandDataChannel.send(i)}else{if(!this.socket||this.socket.readyState!==WebSocket.OPEN){t.reject(new Error("Invalid state or socket already closed"));continue}this._startResponseTimer(t),this.socket.send(this._serializeJson(t))}}}_startResponseTimer(e){if(!e.needResponse){e.resolve({type:"response",sequence:e.sequence,response:e.name});return}e.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:e.name,sequence:e.sequence,type:"timeout"}),n.WAIT_RESPONSE_DELAY),this.responseHandlers[e.sequence]=e}_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 d.warn("[signaling] cannot get binary data for data channel command: "+e.name),null}_serializeJson(e){let t;e.name===x.UPDATE_DISPLAY_LAYOUT?t=this._convertDisplayLayout(e.params):t=e.params;let i=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(i)}_convertDisplayLayout(e){let t=e,i={};for(let a in t)Object.hasOwn(t,a)&&(i[a]=ln(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new B(de.SIGNALING_FAILED,{message:"Unable to connect to the signaling: connection timeout",remote:!0}))},n.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=n.RECONNECT_MAX_COUNT)&&(this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?d.warn(`[signaling] socket is dead. Fallback to WebSocket. Trying to connect ${this.reconnectCount}`):d.warn(`[signaling] socket is dead, trying to reconnect ${this.reconnectCount}`),this._logTransportStat("failed_pings"),this._disconnect(4e3),this._connect(Ye.RETRY,!1),this.reconnectCount++},n.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return ri.isBrowserSupported()&&this.wtEndpoint!==null&&l.webtransport}_getSocketType(){return this.socket instanceof ri?"wt":"ws"}_markTransportStat(e){let t=this._getSocketType(),i=ma[e][t];ue.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=ma[e][i];be.logEventualStat({name:a,...t})}};var Kn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(Kn||{}),Ne=Kn;var $n=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))($n||{}),ut=$n;var qn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(qn||{}),Ea=qn;var zn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(zn||{}),Ta=zn;var Jn=(u=>(u.REQUIRE_AUTH_TO_JOIN="REQUIRE_AUTH_TO_JOIN",u.AUDIENCE_MODE="AUDIENCE_MODE",u.WAITING_HALL="WAITING_HALL",u.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",u.ADMIN_IS_HERE="ADMIN_IS_HERE",u.ASR="ASR",u.FEEDBACK="FEEDBACK",u.RECURRING="RECURRING",u))(Jn||{}),at=Jn;function Yn(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function Qn(n,r){let e=new Set(n);for(let[t,i]of Object.entries(r))i?e.add(t):e.delete(t);return Array.from(e)}var Xn=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(Xn||{}),We=Xn;var Zn=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(Zn||{}),Z=Zn;var es=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(es||{}),Oi=es;var ts=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(ts||{}),is=ts;function rs(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var as=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(as||{}),Et=as;function xi(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var Ra=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Ra||{}),Q;(m=>{function n(h){return h.length?typeof h[0]=="object"?h:h.map(E=>r(E)):[]}m.fromIds=n;function r(h,E="USER",P=0){return{id:h,type:E,deviceIdx:P}}m.fromId=r;function e(h,E=!0){let P=E?h.decorativeExternalUserId:h.externalId,C=h.deviceIdx??0;if(P)return t(P,C)}m.fromSignalingParticipant=e;function t(h,E=0){return{id:h.id,type:h.type==="ANONYM"?"ANONYM":"USER",deviceIdx:E}}m.fromSignaling=t;function i(h){return h.id}m.toSignaling=i;function a(h){let E=h.deviceIdx||0;return`{"id":"${h.id}","type":"${h.type}","deviceIdx":${E}}`}m.toString=a;function s(h,E="USER",P=0){return a(r(h,E,P))}m.fromIdToString=s;function c(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}m.fromString=c;function u(h,E){return h.id===E.id&&h.type===E.type&&h.deviceIdx===E.deviceIdx}m.compare=u;function p(h){return h?.deviceIdx||0}m.getDeviceIdx=p})(Q||(Q={}));function ns(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function ss(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var wr=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function os(n){if(n.conversation?.muteStates)return n.conversation.muteStates;if(n.muteState&&n.muteOptions)return n.muteOptions.reduce((r,e)=>(r[e]=n.muteState,r),{})}function tc(n,r){switch(n){case le.AUDIO:return!!r.isAudioEnabled;case le.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case le.VIDEO:return!!r.isVideoEnabled;case le.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function cs(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case We.MUTE:case We.MUTE_PERMANENT:{tc(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function ds(n){let{muteStates:r={},mediaSettings:e}=n;return cs(r,e)}function ls(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return cs(r,t)}function ps(n,r){let e=new Uint8Array(r),t=0,i=0;for(;t<n.length&&i<r;){let a=n[t++],s=a>>4,c=a&15;if(s===15){let m;do m=n[t++],s+=m;while(m===255)}for(let m=0;m<s&&!(i>=r);m++)e[i++]=n[t++];if(t>=n.length||i>=r)break;let u=n[t]|n[t+1]<<8;if(t+=2,c===15){let m;do m=n[t++],c+=m;while(m===255)}c+=4;let p=i-u;for(let m=0;m<c&&!(i>=r);m++)e[i++]=e[p+m]}return e}var ni=class{constructor(r){o(this,"_fixNoPacketsApplied",!1);o(this,"_fixNoPacketsChecked",!1);o(this,"_fixTooManyPacketsApplied",!1);o(this,"_fixTooManyPacketsSucceeded",!1);o(this,"_fixTooManyPacketsFailed",!1);o(this,"_fixTooManyPacketsTime");o(this,"_mediaSource");o(this,"_lastPacketsSent");o(this,"_lastPacketsSentTime");o(this,"_toggleAudioPromise",null);o(this,"_fixNoPacketsAppliedVideo",!1);this._mediaSource=r}_fixAudioDeviceNoPackets(r){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,R.log(w.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,R.log(w.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(b.getMicrophonePermissionState()!=="denied"),this._toggleAudioPromise.catch(()=>{}))}}_fixAudioDeviceTooManyPackets(r){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let e=75,t=Date.now();if(!this._lastPacketsSentTime)r.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent);else if(t-this._lastPacketsSentTime>500){let i=(r.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent,this._fixTooManyPacketsApplied?i>e?(d.log("[AudioFix] Failed to fix RV"),R.log(w.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),R.log(w.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,R.log(w.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0).catch(a=>{d.warn("[AudioFix] Failed to fix RV (too many packets)",a)}),this._fixTooManyPacketsTime=t)}}fix(r){if(!this._mediaSource)return;let e=r.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(r){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=r.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.getMediaSettings().isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(t=>{d.warn("[AudioFix] Failed to fix RV (no packets): video restart",t)}))}};var Ni=class{constructor(r){o(this,"_output",null);o(this,"_volume",1);o(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});o(this,"_statFirstMediaReceived");this._statFirstMediaReceived=r}add(r){this.destroy(),this._output={},this._output.audioTrack=r,this._initAudioElement()}remove(r){!this._output||this._output.audioTrack!==r||this.destroy()}get volume(){return this._volume}set volume(r){this._volume=Math.max(0,Math.min(1,r)),this._output&&this._output.audioElement&&(this._output.audioElement.volume=this._volume)}_initAudioElement(){if(l.muteMode||!this._output?.audioTrack)return;let r=b.browserName()!=="Safari"||b.isMobile(),e=document.createElement(r?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{d.warn("[audio] Error on play audio"),v.onAutoplayError()},i=s=>{e.srcObject=new MediaStream([s]),e.load();let c=e.play();c&&c.catch(t)},a=()=>{d.debug("[audio] Recover audio playback");let s=this._output?.audioTrack;s?i(s):d.warn("[audio] Broken audio track")};e.onpause=a,e.onstalled=a,e.onerror=a,e.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(this._output.audioTrack),this._output.audioElement=e}_stopAudioElement(){this._output?.audioElement&&(this._output.audioElement.pause(),this._output.audioElement.srcObject=null),this._output?.audioTrack?.stop()}destroy(){this._output&&(this._stopAudioElement(),this._output=null)}async changeOutput(){try{if(!this._features.setSinkId)throw new Error('Feature "setSinkId" is not supported');if(!this._output?.audioElement)return;let r=b.getSavedOutput();r&&await this._output.audioElement.setSinkId?.(r.deviceId)}catch(r){throw R.log(w.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}};var ic=90,rc=3,Li=class extends ce{constructor(){super(...arguments);o(this,"_lastMemoryStat",{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(i=>{let a=typeof i.userId=="string"&&t[i.userId]||null;i.userId=a?.externalId}),v.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)),i=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>ic?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=rc)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var ac=44100,Bt=class{constructor(r,e){o(this,"_analyser",null);o(this,"_gainNode",null);o(this,"_fftBins",null);o(this,"_mediaStreamSource",null);o(this,"_lastSmoothedLevel",0);o(this,"_trackId");o(this,"_track");o(this,"_stream");this._trackId=r,this._track=e,this._stream=new MediaStream([e]);try{let t=b.getAudioContext();this._gainNode=t.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(t.destination),this._analyser=t.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=t.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 r=ac/this._fftBins.length,e=Math.ceil(l.voiceParams.minFreq/r),t=Math.floor(l.voiceParams.maxFreq/r);return this._fftBins.subarray(e,t)}getLevel(){let r=this._getBins(),t=r.reduce((a,s)=>a+s,0)/r.length/255,i=this._lastSmoothedLevel*l.voiceParams.smoothing+t*(1-l.voiceParams.smoothing);return this._lastSmoothedLevel=i,{real:t,smoothed:i}}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)}};var Ui=class extends ce{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,l.voiceParams.interval)};this._interval=window.setTimeout(t,l.voiceParams.interval);let i=()=>{let a=e.getSendAudioTrack();a&&this.init(a)};this.subscribe(e,"SOURCE_CHANGED",a=>{a.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&i()}),this.subscribe(e,"SOURCE_READY",i),i()}init(e){this._stopDetector(),this._detector=new Bt("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()}};var kr=class{constructor(r){this.processor=r;o(this,"queue",[]);o(this,"isProcessing",!1)}add(r){this.queue.push(r),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let r=this.queue.shift();if(r)try{await this.processor(r)}catch{d.error(`Can't process message ${JSON.stringify(r)}`)}}this.isProcessing=!1}}};var Or=class extends ce{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);o(this,"_activeParticipants");o(this,"_removedParticipants");this.subscribe(e,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(e,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,"SIGNALLED_ACTIVE_PARTICIPANTS",this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._detector?.destroy(),this._detector=null}_onRemoteTrackAdded(e,t,i){if(i.kind==="audio"&&(this._detector?.destroy(),this._detector=new Bt(e,i),!this._interval)){let a=()=>{this._collectVolumes(),this._interval=window.setTimeout(a,l.voiceParams.interval)};this._interval=window.setTimeout(a,l.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,i){i.kind==="audio"&&(!this._detector||this._detector.track!==i||(this._detector.destroy(),this._detector=null))}_collectVolumes(){if(!this._detector)return;let e={},t=this._detector.trackId,i=this._detector.getLevel();if(t===Be.AUDIO_MIX){if(this._activeParticipants)for(let a of this._activeParticipants)e[a]=i;if(this._removedParticipants){for(let a of this._removedParticipants)e[a]={real:0,smoothed:0};this._removedParticipants=null}}else e[t]=i;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null,this._removedParticipants=null)}};var xr=class extends ce{constructor(e,t,i){super();o(this,"_speakerId",null);o(this,"_serverSideSpeakerDetection",!1);this._serverSideSpeakerDetection=i==="SERVER",this.subscribe(e,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this.subscribe(t,"SIGNALLED_SPEAKER_CHANGED",this._onServerSpeakerChanged.bind(this)),this.subscribe(t,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,i=null;if(Object.keys(e).forEach(a=>{let s=e[a].smoothed;s>t&&s>l.voiceParams.threshold&&(t=s,i=a)}),i&&i!==this._speakerId){let a=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>a*l.voiceParams.speakerLevelMultiplier&&(this._speakerId=i,this._triggerEvent("SPEAKER_CHANGED",i))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent("SPEAKER_CHANGED",e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e==="SERVER"}};var Bi=class extends ce{constructor(e,t,i){super();o(this,"_transport");o(this,"_volumes",{});o(this,"_participants",{});o(this,"_connectionTimeout",0);o(this,"_volumeTimeout",0);this._transport=e,this._participants=i,this.subscribe(e,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(t,"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==="OPENED"&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),l.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),l.specListenerParams.volumeTimeout))),t==="FAILED"&&this._connectionTimeout&&(d.warn("Transport failed, send callSpecError"),R.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){let e=i=>i!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(d.warn("There is not connected transport, send callSpecError"),R.log(w.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 i="UNKNOWN",a=this._participants[t];a&&a.platform&&(i=a.platform),e.indexOf(i)<0&&(e.push(i),R.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var Nr=class n{static correctHangupReason(r){switch(r){case y.HUNGUP:return"hangup";case y.CANCELED:return"canceled";case y.REJECTED:return"rejected";case y.BUSY:return"busy";case y.FAILED:return"failed";case y.MISSED:return"missed";case y.ANOTHER_DEVICE:return"another_device";case y.REMOVED:return"removed";case y.BANNED:return"banned";case y.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![y.HUNGUP,y.CANCELED,y.REJECTED,y.FAILED,y.BUSY,y.MISSED,y.ANOTHER_DEVICE,y.REMOVED,y.BANNED,y.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;R.logClientStats({name:X.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Lr=class{constructor(){o(this,"_isCallMarked",!1);o(this,"_isFinished",!1);o(this,"_callType",null)}markAcceptCall(r){this.mark(r==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(r){r==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(r){r==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(r){r==="SERVER"&&this.mark("server_join_server")}mark(r){this._isCallMarked||(this._isCallMarked=!0,this._callType=r,ue.setMark(X.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&be.logEventualStat({name:X.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var Fi=class{constructor(r){o(this,"audioTracks",[]);o(this,"audioElement");o(this,"_volume",1);o(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});o(this,"_statFirstMediaReceived");this._statFirstMediaReceived=r}add(r){l.muteMode||(d.debug(`[audio] Adding track ${r}`),this.audioTracks.push(r),this.audioElement?this.audioElement.srcObject.addTrack(r):this._initAudioElement())}remove(r){this.audioElement&&(d.debug(`[audio] Removing track ${r}`),r.stop(),this.audioElement.srcObject.removeTrack(r),this.audioTracks=this.audioTracks.filter(e=>e!==r))}get volume(){return this._volume}set volume(r){this._volume=Math.max(0,Math.min(1,r)),this.audioElement&&(this.audioElement.volume=this._volume)}_initAudioElement(){d.debug("[audio] Initializing audio element");let r=b.browserName()!=="Safari"||b.isMobile(),e=document.createElement(r?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{d.warn("[audio] Error on play audio"),v.onAutoplayError()},i=s=>{e.srcObject=null,e.srcObject=new MediaStream(s),e.load();let c=e.play();c&&c.catch(t)},a=()=>{d.debug("[audio] Recover audio playback"),this.audioTracks.length?i(this.audioTracks):d.warn("[audio] Broken audio tracks")};e.onpause=a,e.onstalled=a,e.onerror=a,e.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(this.audioTracks),this.audioElement=e,d.debug("[audio] Audio element initialized")}_stopAudioElement(){this.audioElement&&(this.audioElement.pause(),this.audioElement.srcObject=null),this.audioTracks.forEach(r=>{r.stop()})}destroy(){this.audioElement&&(d.debug("[audio] Destroying audio element"),this._stopAudioElement(),this.audioElement=null,this.audioTracks=[],d.debug("[audio] Audio element destroyed"))}async changeOutput(){try{if(!this._features.setSinkId)throw new Error('Feature "setSinkId" is not supported');if(!this.audioElement)return;let r=b.getSavedOutput();r&&await this.audioElement.setSinkId?.(r.deviceId)}catch(r){throw R.log(w.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}};var nc=1e3,sc=1e4;var oc=15,J=class J extends ce{constructor(e,t){super();o(this,"_api");o(this,"_signaling");o(this,"_signalingActor");o(this,"_mediaSource",null);o(this,"_conversation",null);o(this,"_myLastRequestedLayouts",{});o(this,"_state","IDLE");o(this,"_participantState",Z.CALLED);o(this,"_participants",{});o(this,"_pendingParticipants",new Map);o(this,"_transport",null);o(this,"_debugInfo",null);o(this,"_volumesDetector",null);o(this,"_speakerDetector",null);o(this,"_localVolumeDetector",null);o(this,"_specListener",null);o(this,"_activeSpeakerId",null);o(this,"_lastSignalledActiveSpeakerId",null);o(this,"_isRealTimeAsrRequested",!1);o(this,"_serverSettings",bn());o(this,"_onUnload");o(this,"_audioOutput");o(this,"_lastStalled",{});o(this,"_audioMixStalled",!1);o(this,"_audioFix",null);o(this,"_streamByStreamId",new Map);o(this,"_streamIdByStreamDescription",new Map);o(this,"_streamWaitTimerByStreamDescription",new Map);o(this,"_sequenceNumberByStreamDescription",new Map);o(this,"_cooldownTimestampByStreamDescription",new Map);o(this,"_cooldownQueueCleanupTimer",null);o(this,"_statFirstMediaReceived");o(this,"_changeMediaSettings",I.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(t){if(d.warn("changeMediaSettings failed with error",t),t.message==="chatRoom.maxShareCountExceeded")return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100));R.create(e,t),R.setConversationIdProvider(()=>this._conversation?.id||null),be.create(),rt.create(()=>this._transport?.getTopology()),lt.create(),pt.create(),this._api=e,this._signaling=new ai,this._signalingActor=new kr(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?y.CANCELED:y.HUNGUP),l.clientEventsLoggingEnabled&&R.logClientEvent({event_type:X.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),R.destroy(),be.destroy(),rt.destroy(),lt.destroy(),pt.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new Lr,l.transparentAudio?this._audioOutput=new Fi(this._statFirstMediaReceived):this._audioOutput=new Ni(this._statFirstMediaReceived),l.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),nc))}static current(){return J._current}static hangupAfterInit(){J._activationMutex&&!J._current&&(J._delayedHangup=!0)}static id(){return J._current?._conversation?.id||null}async onStart({opponentIds:e,opponentType:t,mediaOptions:i,payload:a="",joiningAllowed:s=!1,requireAuthToJoin:c=!1,onlyAdminCanShareMovie:u,externalIds:p,onFastStart:m,conversationId:h}){if(J._activationMutex)throw R.log(w.ERROR,"startCall"),d.warn("Conversation: there is already running activation"),new B(y.FAILED);let E=Date.now();J._activationMutex=!0,Oe.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let P=this._mediaSource.getMediaSettings();t===ut.CHAT||e&&e.length>1?this._logWithMediaSettings(w.OUTGOING_MULTIPARTY_CALL,P):this._logWithMediaSettings(w.OUTGOING_CALL,P);let C=await this._startConversation({opponentIds:e,opponentType:t,direction:Ne.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:c,onlyAdminCanShareMovie:u,externalIds:p,startedTime:E,onFastStart:m,conversationId:h});if(!this._conversation)throw new B(y.UNKNOWN_ERROR);if(this._participantState=Z.ACCEPTED,this._changeMediaSettings(P),await this._processConnection(C),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),J._delayedHangup)throw new B(y.CANCELED);return d.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:i}),await this._processConnectionSharedMovieInfo(C),await this._processConversationUrlSharingInfo(C),v.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants()),await this._onConversationParticipantListChunk(C),await this._processPinnedParticipants(C),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),J._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(P){throw this._close(P,"Unable to start conversation"),P}finally{J._activationMutex=!1}}async onJoin(e){if(J._activationMutex)throw R.log(w.ERROR,"joinCall"),d.warn("Conversation: there is already running activation"),new B(y.FAILED);let t=Date.now();J._activationMutex=!0,this._state="PROCESSING",Oe.startSession();try{let i=!!e.observedIds?.length;if(i&&l.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new B(y.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(w.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new B(y.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a),this._conversation.waitForAdmin||this._conversation.waitingHall?(d.log(this._conversation.waitForAdmin?"Wait for admin":"In waiting hall"),J._current=this,J._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus(this._conversation.waitForAdmin?"WAIT_FOR_ADMIN":"WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(i){throw J._activationMutex=!1,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){d.debug("Join conversation part 2"),J._activationMutex=!0;try{if(this._participantState=Z.ACCEPTED,!this._conversation||!this._mediaSource)throw new B(y.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(e),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state==="CLOSE")return this._conversation;if(J._delayedHangup)throw new B(y.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),t),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),J._current=this;let i=this._extractLocalParticipantFromConnection(e);if(i){let a=I.mapParticipantState(i);Object.keys(a).length>0&&v.onLocalParticipantState(a)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(t){throw this._close(t,"Unable to join conversation"),t}finally{J._activationMutex=!1}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(a=>!!a)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let i={rooms:await this._extractExternalRooms(e)};return t&&(i.roomId=t),i}async onPush(e,t=oe.USER,i,a,s){if(J._activationMutex)throw d.warn("Conversation: there is already running activation"),new B(y.REJECTED);J._activationMutex=!0;try{let c=Date.now(),u=await this._prepareConversation(e,t,i,a,s);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new B(y.UNKNOWN_ERROR);if(!u.conversation.participants.find(m=>m.state===Z.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),R.log(w.PUSH,"rejected"),new B(y.REJECTED);if(Oe.startSession(),await this._processConnection(u),this._extractConnectionUrlSharingInfo(u),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(u),this._signaling.readyToSend(),this._logCallStartEvent(c,Ne.INCOMING),R.log(w.PUSH,"accepted"),J._current=this,J._delayedHangup)throw new B(y.CANCELED);J._activationMutex=!1}catch(c){throw J._activationMutex=!1,this._close(c,"Unable to handle inbound call push"),c}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(at.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(at.WAIT_FOR_ADMIN),i=e.conversation.options.includes(at.ADMIN_IS_HERE);return!t||t&&i?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(i=>I.comparePeerId(i.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(at.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new B(y.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(w.ACCEPT_CONCURRENT,e),d.debug("Concurrent call",{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.getMediaSettings()),v.onCallAccepted(),this._state="ACTIVE",this._participantState=Z.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}async _getMainRoomParticipants(){let e=await this._getParticipants();return I.mapSharedParticipants(Object.values(e).filter(t=>!t.isInRoom))}_decodeExternalConversationParams(e){let[t,i]=e.split(":"),a=parseInt(t,10);if(isNaN(a))throw new Error("Invalid original length in prefix");let s=atob(i),c=new Uint8Array(s.length);for(let u=0;u<s.length;u++)c[u]=s.charCodeAt(u);try{let p=ps(c,a).reduce((Te,De)=>(Te+=String.fromCharCode(De),Te),""),{srcp:m,stne:h,tkn:E,trne:P,trnp:C,trnu:H,wse:K,wte:z}=JSON.parse(p);return{token:E,endpoint:K,wt_endpoint:z,turn_server:{urls:P.split(","),username:H,credential:C},stun_server:{urls:h.split(",")},client_type:m}}catch(u){throw this._close(u,"Can't decompress conversation params"),u}}_logCallStartEvent(e,t){let i={[Ne.OUTGOING]:"outgoing",[Ne.INCOMING]:"incoming",[Ne.JOINING]:"join"};be.logEventualStat({name:X.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw R.log(w.ERROR,"acceptIncoming"),d.error("Unable to accept a call - invalid state"),new Error("Unable to accept a call - invalid state");if(!this._mediaSource||!this._conversation||!this._transport)throw new B(y.UNKNOWN_ERROR);this._state="PROCESSING",d.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(w.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=Z.ACCEPTED;let i=this._getMuteStatesForCurrentRoom(),a=Object.keys(i);a.length&&this._onMuteParticipant({muteStates:i,mediaOptions:a,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());if(s.rooms?.rooms){let u=await this._getParticipants();s.rooms.rooms.forEach(p=>{p.participantIds?.forEach(m=>{u[m]&&(u[m].isInRoom=!0)})})}this._conversation.roomId=s.rooms?.roomId||null;let c=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(v.onCallAccepted(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),c),l.useParticipantListChunk){let u=await this._getInitialParticiapntListChunk(),p=await this._getParticipants();u?.participants?.forEach(m=>{let h=I.composeId(m),E=p[h];E&&(E.movieShareInfos=m.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:u})}return v.onLocalStatus("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(t){throw this._close(t,"Unable to accept call"),t}}async decline(){if(this._state!=="IDLE")throw R.log(w.ERROR,"declineIncoming"),d.error("Unable to decline a call - invalid state"),new Error("Unable to decline a call - invalid state");this._state="PROCESSING",d.debug("Decline incoming call"),this._logWithMediaSettings(w.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=Z.HUNGUP,this._signaling.ready&&await this._signaling.hangup(y.REJECTED),this._close(new B(y.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?y.HUNGUP:y.CANCELED;R.log(w.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new B(e))):v.onHangup(new B(y.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new B(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map(Q.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;if(!s&&i.rejectedParticipants)throw new Error(i.rejectedParticipants[0].reason);for(let c of s)await this._onAddParticipant(I.composeId(c),c,a)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new B(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipantLegacy(e,t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;for(let c of s)await this._onAddParticipant(I.composeId(c),c,a)}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 i=[];for(let a of e)(a.state===Z.CALLED||a.state===Z.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===Z.ACCEPTED&&i.push(a.id);i.length?this._transport.open(i,null,!!this._conversation?.observer):this._transport.getTopology()==="SERVER"&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&d.error(t,e),d.debug("Close conversation",e),Nr.sendHangupEvent(e,this._transport?.getTopology()),rt.destroy(),lt.logMetrics(this._transport?.getTopology()),lt.destroy(),pt.logMetrics(this._transport?.getTopology()),pt.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(y.FAILED):R.log(w.ERROR,e.hangup),J._activationMutex=!1;let i=this._conversation&&this._conversation.id;if([y.CANCELED,y.NOT_FRIENDS,y.CALLEE_IS_OFFLINE,y.CALLER_IS_BLOCKED,y.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===y.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===y.SOCKET_CLOSED||e.hangup===y.NOT_FOUND)&&J._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===y.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state="CLOSE",this._participantState=Z.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),R.destroy(),be.destroy(),this._conversation=null,this._myLastRequestedLayouts={},J._current=null,J._delayedHangup=!1,v.onHangup(e||new B(y.UNKNOWN_ERROR),i)}async destroy(){let e=this._conversation&&this._conversation.id;d.debug("Destroy conversation",{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state="CLOSE",this._participantState=Z.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._cleanupListeners(),R.destroy(),be.destroy(),this._conversation=null,this._myLastRequestedLayouts={},J._current=null,J._delayedHangup=!1}async _getConversationParams(e){let t=await this._api.getConversationParams(e);d.debug("Api.getConversationParams",t);let i=[],{turn_server:a,stun_server:s}=t;if(s&&i.push(s),a&&a.urls){let c=a.urls.filter((u,p,m)=>m.indexOf(u)===p);c.push(`${c[c.length-1]}?transport=tcp`),i.push({urls:c,username:a.username,credential:a.credential})}return l.iceServers=i,l.wssBase=t.endpoint,t.wt_endpoint&&(l.wtsBase=t.wt_endpoint),l.wssToken=t.token,t.client_type&&(l.clientType=t.client_type),t.external_user_type&&(l.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:i,wt_endpoint:a,token:s,client_type:c}){let u=[];if(t&&u.push(t),e&&e.urls){let p=e.urls.filter((m,h,E)=>E.indexOf(m)===h);p.push(`${p[p.length-1]}?transport=tcp`),u.push({urls:p,username:e.username,credential:e.credential})}l.iceServers=u,l.wssBase=i,l.wssToken=s,a&&(l.wtsBase=a),c&&(l.clientType=c)}_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:i,mediaOptions:a,payload:s="",joiningAllowed:c=!1,requireAuthToJoin:u=!1,onlyAdminCanShareMovie:p,externalIds:m,startedTime:h,onFastStart:E,conversationId:P}){ue.setMark(X.SIGNALING_CONNECTED);let C=P??I.uuid();d.debug("Conversation: start",{conversationId:C,opponentIds:e,opponentType:t,direction:i});let H=a.includes(le.VIDEO),K;if(E){let Te={deviceId:this._api.deviceId(),sdkVersion:l.sdkVersion,clientAppKey:l.apiKey,platform:l.platform,protocolVersion:l.protocolVersion,domainId:l.domain,capabilities:Qe.getFlags()},De=JSON.stringify(Te),ae;try{if(ae=await E({internalParams:De,conversationId:C,externalIds:m,opponentType:t,mediaOptions:a,isVideo:H,joiningAllowed:c,requireAuthToJoin:u}),!ae.internalCallerParams)throw new B(y.FAST_START_ERROR,{message:JSON.stringify(ae)})}catch(ne){throw ne instanceof Error?new B(y.FAST_START_ERROR,{message:ne.message}):new B(y.FAST_START_ERROR,{message:String(ne)})}try{let ne=JSON.parse(ae.internalCallerParams);K={endpoint:ne.endpoint,wt_endpoint:ne.wtEndpoint,id:C,is_concurrent:ne.isConcurrent,client_type:ne.clientType,rejected_participants:ae.rejectedParticipants?.map(Y=>({...Y,status:Y.status})),stun_server:ne.stun,turn_server:ne.turn,token:new URL(ne.endpoint).searchParams.get("token")??""},d.debug("FastStart",K)}catch{throw new B(y.FAST_START_ERROR,{message:"Cannot parse internal params"})}}else K=await this._api.startConversation(C,e,t,H,s,c,u,{onlyAdminCanShareMovie:p},m),d.debug("Api.startConversation",K);this._setConversationParams(K);let z=await this._connectSignaling(Ye.START,K);return await this._setConversation(K,z,i),this._logCallStartEvent(h,Ne.OUTGOING),z}async _joinConversation(e,t){ue.setMark(X.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:c,observedIds:u,payload:p,onFastJoin:m}=e;d.debug("Conversation: join",{conversationId:i,joinLink:c,observedIds:u});let h=a.includes(le.VIDEO),E;if(m){if(!c)throw new B(y.FAST_JOIN_ERROR,{message:"joinLink is required for fast join"});let C={deviceId:this._api.deviceId(),sdkVersion:l.sdkVersion,clientAppKey:l.apiKey,platform:l.platform,protocolVersion:l.protocolVersion,domainId:l.domain,capabilities:Qe.getFlags()},H=JSON.stringify(C),K;try{if(K=await m({joinLink:c,isVideo:h,internalParams:H}),!K.internalCallerParams||!K.conversationId)throw new B(y.FAST_JOIN_ERROR,{message:JSON.stringify(K)})}catch(z){throw z instanceof B?z:z instanceof Error?new B(y.FAST_JOIN_ERROR,{message:z.message}):new B(y.FAST_JOIN_ERROR,{message:String(z)})}try{let z=JSON.parse(K.internalCallerParams);E={endpoint:z.endpoint,wt_endpoint:z.wtEndpoint,id:K.conversationId,is_concurrent:z.isConcurrent,client_type:z.clientType,stun_server:z.stun,turn_server:z.turn,token:new URL(z.endpoint).searchParams.get("token")??""},d.debug("FastJoin",E)}catch{throw new B(y.FAST_JOIN_ERROR,{message:"Cannot parse internal params"})}}else if(i)E=await this._api.joinConversation(i,h,s);else if(c)E=await this._api.joinConversationByLink(c,h,u,p);else throw new B(y.UNKNOWN_ERROR);d.debug("Api.joinConversation",E),this._setConversationParams(E);let P=await this._connectSignaling(Ye.JOIN,E);return await this._setConversation(E,P,Ne.JOINING),this._logCallStartEvent(t,Ne.JOINING),P}async _prepareConversation(e,t=oe.USER,i,a,s){ue.setMark(X.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let c=this._api.getUserId();if(!c)throw new B(y.UNKNOWN_ERROR);let u=0,p="",m="",h={id:e,peerId:i,endpoint:p,wt_endpoint:m,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let P=this._decodeExternalConversationParams(a);this._setConversationParams(P),p=s??`${l.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,h.token=P.token,h.endpoint=p,l.wtsBase&&(m=`${l.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,h.wt_endpoint=m)}else{let P=await this._getConversationParams(e);u=P.device_idx||0,p=s??`${l.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,p=this._addGeoParamsToEndpoint(p,P),h.token=P.token,h.endpoint=p,h.device_idx=u,l.wtsBase&&(m=`${l.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,m=this._addGeoParamsToEndpoint(m,P),h.wt_endpoint=m)}let E=await this._connectSignaling(Ye.ACCEPT,h);return J._current&&(J._current._participantState===Z.ACCEPTED||J._current._participantState===Z.CALLED)?(d.log("Push rejected (busy)"),R.log(w.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(y.BUSY),Promise.reject(new B(y.BUSY))):(J._current&&(J._current.destroy(),J._current=null),await this._setConversation(h,E,Ne.INCOMING,t),E)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:Re(),participantState:{},state:Z.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return i.externalId||(i.externalId=await this._getParticipantId(t??i.id)),this._api.cacheExternalId(t??i.id,i.externalId),t&&this._api.mapDecorativeId(t,i.id),i.observedIds?.length&&(i.externalId.observer=!0),e.markers&&(i.markers=this._denormalizeMarkers(i.id,e.markers)),i}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new B(y.NETWORK_ERROR),t),t}}async _setConversation(e,t,i,a=oe.USER){let{participants:s}=t.conversation;s.forEach(h=>{let E=I.composeId(h),P=Q.fromSignalingParticipant(h,!1);if(P){this._api.cacheExternalId(E,P);let C=I.composeDecorativeId(h),H=Q.fromSignalingParticipant(h);C&&H&&(this._api.cacheExternalId(C,H),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let c=this._api.getUserId(),u=this._extractLocalParticipantFromConnection(t),p=e.device_idx||0;if(!c){if(!u)throw new B(y.UNKNOWN_ERROR);c=Number(u.id),u.idType&&(a=u.idType),u.deviceIdx&&(p=u.deviceIdx),this._api.setUserId(c)}let m=I.composeParticipantId(c,a,p);this._conversation={userId:c,compositeUserId:m,externalId:await this._getExternalIdByParticipantId(m),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||"DIRECT",direction:i,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:u?.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},Oe.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(l.forceRelayPolicy=e.p2p_forbidden),R.log(w.RELAY_POLICY,l.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new B(y.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||"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 Ji;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new ni(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,Ae.NOTIFICATION,a=>this._signalingActor.add(a)),this.subscribe(this._signaling,Ae.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Ae.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return be.logEventualStat({name:X.SIGNALING_CONNECTED}),i}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(Ea.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&v.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(),i=I.mapSharedParticipants(e.participants.reduce((a,s)=>{let c=I.composeId(s);return t[c]&&a.push(t[c]),a},[]));return{...e,participants:i}}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 i of t)await this._registerParticipants(i?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let i=e[0]?.externalId?.type;i&&(l.externalUserType=i);let a=await this._getParticipants();for(let s of e){let c=I.composeId(s);if(d.test("Conversation:RegisterParticipant",c),this._isMe(c)){this._conversation.roles=s.roles||[],this._conversation.roles.length&&(d.debug(`Local roles changed: ${s.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(s);continue}if(s.state===Z.HUNGUP||s.state===Z.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],y.HUNGUP);continue}let u=I.composeDecorativeId(s);this._registerParticipant({id:c,externalId:Q.fromSignalingParticipant(s),mediaSettings:Re(s.mediaSettings),participantState:I.mapParticipantState(s),state:s.state,roles:s.roles||[],status:"WAITING",muteStates:s.muteStates||{},unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(c,s.markers),movieShareInfos:s.movieShareInfos,isInRoom:t},u);let p=await this._getParticipant(c);p&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${c}] changed: ${s.roles}`),v.onRolesChanged(p.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=wr(e,We.MUTE),s=wr(e,We.MUTE_PERMANENT);for(let c of[a,s])c.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:c,stateUpdated:!0})};I.setImmediate(()=>i().catch(a=>d.error(a)))}_getStatusByTransportState(e){let t=null;return e==="CONNECTED"?t="CONNECTED":e==="CONNECTING"||e==="OPENED"?t="CONNECTING":e==="RECONNECTING"&&(t="RECONNECT"),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let i=(await this._getParticipants())[e];if(i)return i;let a=this._api.getDecorativeIdByInitialId(I.decomposeId(e).id),s=a?I.composeUserId(a):void 0;return this._createParticipant({id:e},s)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(l.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let i=await this._getParticipantId(e);return this._api.cacheExternalId(e,i),i}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(l.useParticipantListChunk){let a=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return a.markers=this._denormalizeMarkers(a.id,t),a}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){d.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let i=Object.values(t).find(a=>"ts"in a&&"rank"in a);return Object.entries(t).reduce((a,[s,c])=>(a[s]={...i,...c,id:e},a),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let i=os(e);this._setMuteStatesForRoomId(i,null);for(let u of e.rooms?.rooms??[])this._setMuteStatesForRoomId(u.muteStates,u.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=ls(e,a));let s=Object.keys(a),c=this._conversation?.roomId;s.length&&this._onMuteParticipant({muteStates:a,mediaOptions:s,muteAll:!0,stateUpdated:!0,roomId:c},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 Pr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Li,this.subscribe(this._transport,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,"LOCAL_STATE_CHANGED",this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,"AUDIO_MIX_STALL",this._onAudioMixStall.bind(this)),this.subscribe(this._transport,"REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,"SIGNALLED_STALLED_PARTICIPANTS",this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this)),this.subscribe(this._transport,"NETWORK_STATUS",this._onNetworkStatus.bind(this)),this.subscribe(this._transport,"REMOTE_STREAM_SECOND",this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,"PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,"ASR_TRANSCRIPTION",this._onAsrTranscription.bind(this)),this.subscribe(this._transport,"ANIMOJI_STREAM",this._onAnimojiStream.bind(this)),this.subscribe(this._transport,"ANIMOJI_ERROR",this._onAnimojiError.bind(this));let e=this._conversation.direction===Ne.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let i of Object.values(t))(i.state===Z.ACCEPTED||i.state===Z.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Or(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new xr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Ui(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Bi(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=b.getCameras().length,t=b.getMicrophones().length;d.debug("Cameras: "+e+(b.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(b.hasMicrophonePermission()?"✔":"✖")),R.log(w.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){R.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}async _removeParticipant(e,t){if(e.state===Z.CALLED||e.state===Z.ACCEPTED||this._state==="CLOSE")return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let i=await this._getParticipants();if(i[e.id]){t===y.HUNGUP?this._setParticipantsStatus([e],"HANGUP"):this._setParticipantsStatus([e],"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[a,s]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(a),this._sequenceNumberByStreamDescription.delete(a),this._cooldownTimestampByStreamDescription.delete(a),this._streamWaitTimerByStreamDescription.has(a)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(a)),this._streamWaitTimerByStreamDescription.delete(a)),this._sendUpdateDisplayLayout({[a]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete i[e.id],v.onRemoteRemoved(e.externalId,e.markers)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener("unload",this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(t=>t.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(t=>t.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){d.debug("cleaning up participant-agnostic streams"),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(t=>{t.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,i){d.debug(`Add new participant [${e}]`);let a=await this._getParticipant(e);if(a&&(a.state===Z.ACCEPTED||a.state===Z.CALLED)){d.warn(`Participant [${a.id}:${a.state}] is already in conversation`);return}if(!a){let s=I.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(t),mediaSettings:Re(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s),a=await this._getParticipant(e)}this._setParticipantsStatus([a],"WAITING"),i?(a.state=Z.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=Z.CALLED,this._transport.allocate(a.id,!0),R.log(w.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=oc;a++){let s=I.compose(e,a),c=i[s];c&&t.push(c)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let a of t)this._transport.close(a.id);R.log(w.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(de.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(de.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(de.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,i=null){if(!this._transport||!this._conversation)return;let a=!t,s=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let c=i??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:c,isMe:a});return}this._transport.setAnimojiSvg(s,{svg:e,isMe:a})}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 R.log(w.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return R.log(w.MEDIA_STATUS,e?"audio_1":"audio_0"),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},i={};for(let s of e){let c=typeof s.uid=="object"?s.uid:Q.fromId(s.uid),u=Q.toString(c);i[u]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let c=Q.toString(s.externalId);Object.hasOwn(i,c)&&(t[s.id]=i[c])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[i,a]of Object.entries(e))if(i.length>5||a.length>5)throw new 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 putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[tt(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;d.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},i=await this._getParticipants();for(let s of e){let c=typeof s.uid=="object"?s.uid:Q.fromId(s.uid),u=this._api.getCachedOkIdByExternalId(c);if(!u){let h=Q.toString(c);d.log(`Unknown participant external ID ${h}`);continue}let p=tt({participantId:u,mediaType:s.mediaType,streamName:s.streamName}),m=i[u];m?m.lastRequestedLayouts[p]=s:this._isMe(u)&&(this._myLastRequestedLayouts[p]=s),Jt(s)?(this._isMe(u)&&delete this._myLastRequestedLayouts[p],this._streamIdByStreamDescription.has(p)&&!this._cooldownTimestampByStreamDescription.has(p)&&this._cooldownTimestampByStreamDescription.set(p,Date.now())):(this._cooldownTimestampByStreamDescription.delete(p),!this._streamIdByStreamDescription.has(p)&&l.videoTracksCount>0&&this._streamIdByStreamDescription.set(p,null),t[p]=s),s.mediaType==="SCREEN"&&!Jt(s)&&ue.setMark(ue.getMarkNameScreenshareFirstFrame(u))}let a=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>l.videoTracksCount;){let s=a.next();if(s.done){d.error("Cannot accommodate all streaming requests: tracks available "+l.videoTracksCount+"; requested streams: "+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(s.value),t[s.value]={stopStream:!0}}this._transport?.getTopology()==="SERVER"&&await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,i){if(this._conversation)if(!l.clientEventsLoggingEnabled)this._api.sendUserFeedbackStats(this._conversation.id,e,t,i);else{let a={event_type:X.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),R.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};R.logClientEvent(a,i)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(d.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 i=await this._getParticipants(),a=Qt(e),s=i[a.participantId],c=this._conversation?.externalId,u=this._isMe(a.participantId);if(s||u){switch(a.mediaType){case"STREAM":case"MOVIE":{if(a.streamName){let p={stream:null,streamName:a.streamName,mediaType:a.mediaType};u?v.onLocalLive(c,p):v.onRemoteLive(s.externalId,p)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null);break}}R.log(w.PAT_DEALLOCATED)}else d.log(`Cannot find participant to stop streaming: ${a.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;d.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let i;try{if(i=await this._signaling.updateDisplayLayout(e),!i)return}catch(c){if(d.warn(`Failed to update display layout ${JSON.stringify(e)}. ${c}`),t)throw c;return}let a=[],s=await this._getParticipants();for(let[c,u]of Object.entries(i.errorCodeByParticipantId||{})){let p=Qt(c),m=s[p.participantId];if(m){let h;typeof u!="number"?(d.warn(`Unexpected error code ${u} received for participant ${p.participantId}`),h=is.UNKNOWN_ERROR):h=rs(u),a.push({externalId:m.externalId,errorReason:h})}}if(a&&a.length&&(d.warn("Could not allocate one or more participants",a),t))throw new Ca("Could not allocate one or more participants",a)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let i=t.next();if(i.done)break;let a=i.value;if(a[1]+sc>Date.now())break;let c=a[0];await this._stopStreaming(c),e[c]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;d.log("Received participant sources update notification",t);for(let i of t)this._waitForStreamIfNeeded(i)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(d.log("Promoted in audience mode",!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(d.log("Promoted in waiting hall",!e.demote),e.demote?(d.log("Kicked from waiting hall"),this._close(new B(y.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),v.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,i=[],a,s){d.log(`Chat room updated: ${e}`);let c=[],u=[],p=[],m=[],h=[];if(i.length&&i.forEach(C=>{if(C.externalId){let H=Q.fromSignaling(C.externalId);h.push(H),this._api.cacheExternalId(C.id.id,H)}else{let H=I.decomposeId(C.id.id).id;c.push(H),m.push(H)}}),a?.length&&a.forEach(C=>{let H=I.decomposeId(C).id;c.push(H),u.push(H)}),s?.length&&s.forEach(C=>{let H=I.decomposeId(C).id;c.push(H),p.push(H)}),!c.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let C=await this._api.getExternalIdsByOkIds(m);h.push(...C)}let E=await this._api.getExternalIdsByOkIds(u),P=await this._api.getExternalIdsByOkIds(p);v.onChatRoomUpdated(e,t,h,E,P)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let i of e.data)if(this._isMe(i.participantId))v.onLocalLiveUpdate(t,i);else{let s=await this._getExternalIdByParticipantId(i.participantId);s&&v.onRemoteLiveUpdate(s,i)}}async _onSharedMovieInfoStarted(e){d.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(i=>this._processSharedMovieInfo(i,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let i=this._conversation?.externalId;if(this._isMe(e.initiatorId))v.onLocalSharedMovieInfo(i,e,t);else{let s=await this._getExternalIdByParticipantId(e.initiatorId);s&&v.onRemoteSharedMovieInfo(s,e,t)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(i=>this._isMe(I.composeId(i)));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 s of e.rooms.rooms)s.asrInfo&&this._conversation?.asrInfoByRoom.set(s.id,s.asrInfo);let i=e?.rooms?.roomId??this._conversation?.roomId??null,a=this._conversation?.asrInfoByRoom.get(i);if(a){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onAsrSet({externalId:s,movieId:a.movieId},i)}else i&&v.onAsrSet(null,i)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,i=this._conversation.roomId,a=t.get(i);if(a&&!this._isMe(a.initiatorId)){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onRemoteSharedUrl(s,a.sharedUrl,i)}}_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 i of e.rooms.rooms)i.urlSharingInfo?t.set(i.id,i.urlSharingInfo):t.delete(i.id)}async _onSharedMovieInfoStopped(e){d.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:i,movieId:a,source:s,roomId:c=null}=e,u={initiatorId:i,movieId:a,source:s};if(this._isMe(i))v.onLocalSharedMovieStoppedInfo(t,u,c);else{let m=await this._getExternalIdByParticipantId(i);if(m){let E=(await this._getParticipants())[i];E?.movieShareInfos&&(E.movieShareInfos=E.movieShareInfos.filter(P=>P&&P.movieId!==a)),v.onRemoteSharedMovieStoppedInfo(m,u,c)}}}async _onUrlSharingInfoUpdated(e){if(d.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:i}=this._conversation,{initiatorId:a,sharedUrl:s,roomId:c=null}=e;if(s?t.set(c,{sharedUrl:s,initiatorId:a}):t.delete(c),!(!s&&c!==i&&t.has(i))&&(!s||!this._isMe(a))){let u=await this._getExternalIdByParticipantId(a);u&&v.onRemoteSharedUrl(u,s,c)}}_onFeaturesPerRoleChanged(e){d.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),v.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let h=this._getStreamDescriptionById(e.streamId);if(h){let E=Qt(h),P=await this._getParticipant(E.participantId);v.onRemoteScreenStream(P.externalId,null);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:i,participantId:a}=t;if(i==="ANIMOJI")return;let s=await this._getParticipant(a);if(i==="SCREEN"&&!e.fastScreenShare){d.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let c=tt(t),u=this._sequenceNumberByStreamDescription.get(c);if(u&&u>e.sequenceNumber){d.warn(`Participant ${a} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${u}`),R.log(w.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&i&&(d.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(s.externalId,i,e.suspend));let p=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(p,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(c);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){R.log(w.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let P=E?h:s.externalId,C=this._streamByStreamId.get(p);if(!C){R.log(w.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${p}`);return}R.log(w.PAT_ALLOCATED),this._streamIdByStreamDescription.set(c,p);let H=e.participantStreamDescription?.mediaType;if(H==="STREAM"||H==="MOVIE"){if(e.participantStreamDescription?.streamName){let K={streamName:e.participantStreamDescription.streamName,stream:C,mediaType:H};E?v.onLocalLive(P,K):v.onRemoteLive(P,K)}}else H==="SCREEN"?v.onRemoteScreenStream(s.externalId,C):E||v.onRemoteStream(s.externalId,C)}else{d.debug(`Waiting for ${m} until stream ${p} for ${c} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),m);this._streamWaitTimerByStreamDescription.set(c,h)}}_getStreamDescriptionById(e){for(let[t,i]of this._streamIdByStreamDescription.entries())if(i===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(tt(e)))return e;let t=e.participantId;if(e.mediaType){let i={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(tt(i)))return i}else{let i={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(tt(i)))return i;let a={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(tt(a)))return a}return d.error("Received unrequested allocation",e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw new Error("transport is not initialized")}_isCallAdmin(){return this._conversation?I.includesOneOf(this._conversation.roles,[Et.ADMIN,Et.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!I.includesOneOf(this._conversation.roles,[Et.ADMIN,Et.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===Z.CALLED}async grantRoles(e,t,i){this._checkAdminRole(),await this._signaling.grantRoles(e,t,i)}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,i=[],a=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,i,a)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,i=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,i),this._conversation?.pinnedParticipantIdByRoom.set(i,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()==="SERVER"&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Qn(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=ss(e),a)){let m=this._api.getDecorativeIdByInitialId(a.id);a.id=m?I.composeUserId(m):a.id}let s=await this._signaling.getWaitingHall(a,t,i);if(s.error)return Promise.reject(s.message);let c=s.participants||[],{externalIds:u}=await this._resolveWaitingHallExternalIds(c),p=null;return c.length&&s.hasMore&&(p=ns(c[c.length-1].id)),{participants:u,pageMarker:p,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,i=[],a=[];if(e.length){let s=[];e.forEach(c=>{if(t.set(c.id.id,c.id.addedTs),c.externalId){let u=Q.fromSignaling(c.externalId);i.push(c.id.addedTs),a.push(u),this._api.cacheExternalId(c.id.id,u)}else s.push(I.decomposeId(c.id.id).id)}),s.length&&!a.length&&(a=await this._api.getExternalIdsByOkIds(s),i=a.map(c=>{let u=this._api.getCachedOkIdByExternalId(c);return(u?t.get(u):void 0)||Date.now()}))}return{externalIds:a,timestamps:i}}async getAudienceModeHands(){if(!this._signaling.ready)throw new Error("Signaling is not ready");let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:i,timestamps:a}=await this._resolveWaitingHallExternalIds(t);return{timestamps:a,participants:i,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!I.includesOneOf(this._conversation.options,[at.WAITING_HALL,at.AUDIENCE_MODE]))throw new Error("Unable to promote a participant in the conversation with current options");if(this._checkAdminRole(),!e&&t)throw new Error("participantId is required");await this._signaling.promoteParticipant(e,t)}catch(i){throw d.warn(`Failed to promote participant ${e}. ${i}`),i}}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 i=t.messages.length-1;i>=0;i--){let a=t.messages[i];await this._onChatMessage(a)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let t=(await this._api.createJoinLink(this._conversation.id)).join_link;if(t)return this._conversation.joinLink=t,t}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:i,lang:a}){let s={movieId:e,lang:a};(t||t===0)&&(s.gain=t),i&&(s.metadata=i);let c=await this._signaling.addMovie(s);if(c.error)throw new Error(c.error);return{movieId:c.movieId,streamType:c.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw new Error(t.error)}async removeMovie(e){let t={movieId:e},i=await this._signaling.removeMovie(t);if(i.error)throw new Error(i.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw new Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw new Error(e.error)}async updateRooms(e,t){let i=await this._signaling.updateRooms(e,t);if(i.error)throw new Error(i.error)}async activateRooms(e,t){let i=await this._signaling.activateRooms(e,t);if(i.error)throw new Error(i.error)}async switchRoom(e,t){let i=await this._signaling.switchRoom(e,t);if(i.error)throw new Error(i.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw new Error(t.error)}async startStream(e=!1,t=null,i=null,a="DIRECT_LINK",s=null,c=null){let u={movieId:i,name:t,privacy:a,groupId:s,roomId:c,streamMovie:!e},p=await this._signaling.startStream(u);if(p.error)return Promise.reject(p.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 recordSetConf(e,t,i=!1,a=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:i,roomId:a});if(s.error)throw new Error(s.error)}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<l.videoMinWidth||e.height<l.videoMinHeight)throw new Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<l.videoMinWidth||t.height<l.videoMinHeight)throw new Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");l.videoEffectMaxHeight=t.height,l.videoEffectMaxWidth=t.width}l.videoMaxWidth=e.width,l.videoMaxHeight=e.height,d.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(t=>({id:t.id,type:l.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),i=await this._signaling.getParticipants(t);if(i.error)throw new Error(i.error);let a=i.participants,s=this._transport?.getState();return Promise.all(a.map(async c=>{let u=I.composeId(c);return this._createParticipant({id:u,externalId:Q.fromSignalingParticipant(c),mediaSettings:Re(c.mediaSettings),participantState:I.mapParticipantState(c),state:c.state,roles:c.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:c.muteStates||{},unmuteOptions:c.unmuteOptions||[],observedIds:c.observedIds||[],markers:this._denormalizeMarkers(u,c.markers)},c.decorativeUserId)})).then(I.mapSharedParticipants)}async getParticipantListChunk(e){d.log("Request participant list chunk",e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw new Error(t.error);let i=this._createParticipantListChunk(t.chunk),a=await this._getParticipants(),s=i.participants.filter(u=>{let p=I.composeId(u);return!a[p]});await this._registerParticipants(s);let c=this._transport?.getState();return i.participants.forEach(u=>{let p=I.composeId(u),m=a[p];m.status=this._getStatusByTransportState(c)??"WAITING",m.movieShareInfos=u.movieShareInfos,Object.assign(m.mediaSettings,Re(u.mediaSettings)),Object.assign(m.muteStates,u.muteStates),m.unmuteOptions=u.unmuteOptions??m.unmuteOptions,this._openTransport([m],!0)}),this._participantListChunkToExternalChunk(i)}async _getInitialParticiapntListChunk(){let e=l.participantListChunkInitIndex,t=l.participantListChunkInitCount,a=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return d.debug("Get initial participant list chunk",a.chunk),a.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new ni(this._mediaSource)),v.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this._mediaSource?.getMediaSettings();d.log("Screen sharing changed",e.track,t);let i=e.track?new MediaStream([e.track]):null;v.onScreenStream(i,t)}async _changeRemoteMediaSettings(e,t){d.debug(`Remote media settings changed [${e}]`,t);let i=this._conversation?.externalId;if(this._isMe(e)&&i){v.onLocalMediaSettings(i,t);return}let s=await this._getParticipant(e);if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&v.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(a=>a.id===t||I.comparePeerId(a.peerId,e.peerId))}_changeLocalParticipantState(e){d.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){d.debug(`Remote participant state changed [${e}]`,t);let i=await this._getParticipant(e);if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}async _changeMultipleParticipantState(e,t){d.debug("Multiple participants state changed",e);let i=[],a,s=await this._getParticipants();e.forEach((c,u)=>{if(this._isMe(u))a=c;else{let p=s[u];if(!p){this._warnParticipantNotInConversation(u);return}p.participantState=c,i.push({externalId:p.externalId,participantState:{...c},markers:p.markers})}}),this._state==="ACTIVE"&&(a&&v.onLocalParticipantState(a,!0),i.length&&v.onRemoteParticipantsState(i,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(d.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),v.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case L.ACCEPTED_CALL:return this._onAcceptedCall(e);case L.HUNGUP:return this._onHungup(e);case L.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case L.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case L.CLOSED_CONVERSATION:return this._onClosedConversation(e);case L.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case L.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case L.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case L.RATE_CALL_DATA:return this._onNeedRate();case L.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case L.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case L.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case L.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case L.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case L.REGISTERED_PEER:return this._onPeerRegistered(e);case L.SWITCH_MICRO:return this._onMicSwitched(e);case L.CHAT_MESSAGE:return this._onChatMessage(e);case L.CUSTOM_DATA:return this._onCustomData(e);case L.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case L.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case L.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case L.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case L.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case L.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case L.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case L.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case L.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case L.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case L.FEEDBACK:return this._onFeedback(e);case L.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case L.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case L.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case L.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case L.ROOMS_UPDATED:return this._onRoomsUpdated(e);case L.ROOM_UPDATED:return this._onRoomUpdated(e);case L.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case L.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case L.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case L.ASR_STARTED:return this._onAsrStart(e);case L.ASR_STOPPED:return this._onAsrStop(e);case L.PROMOTION_APPROVED:return this._onPromotionApproved(e);case L.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case L.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}v.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;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 s=Object.keys(await this._getParticipants()),c=[];for(let p of e.conversation.participants){let m=I.composeId(p),h=p.roles||[];if(this._isMe(m)){xi(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:ds(p),unmuteOptions:p.unmuteOptions})};continue}c.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:p.id,participant:p,mediaSettings:p.mediaSettings});else{let P=Re(p.mediaSettings);Qa(P,E.mediaSettings)||await this._changeRemoteMediaSettings(m,P);let C=I.mapParticipantState(p),H=E.participantState;I.isEqualParticipantState(C,H)||await this._changeRemoteParticipantState(m,C),xi(h,E.roles)||this._onRolesChanged(E.id,h)}}let u=await this._getParticipants();for(let p of s)c.indexOf(p)<0&&u[p]&&this._removeParticipant(u[p],y.HUNGUP)}let i=e.rooms?.roomId??null;if(!this._conversation){d.warn("Conversation is empty, but should be filled");return}this._conversation.roomId!==i?await this._onRoomSwitched(i):this._processMuteStates(e,!0),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){d.error("Signaling failed",e),this._close(e)}async _onAcceptedCall(e){let t=I.composeMessageId(e),i=I.getPeerIdString(e.peerId);if(d.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new B(y.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let c=this._api.getDecorativeIdByInitialId(t),u=c?I.composeUserId(c,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Re(e.mediaSettings)},u))}a.state=Z.ACCEPTED,a.mediaSettings=Re(e.mediaSettings),this._logWithMediaSettings(w.ACCEPTED_OUTGOING,a.mediaSettings),this._conversation&&this._conversation.direction===Ne.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),this._state==="ACTIVE"&&this._transport&&this._transport.open([a.id],i),await this._changeRemoteMediaSettings(t,a.mediaSettings),await this._changeRemoteParticipantState(t);let s=Object.keys(a.muteStates);s.length&&this._onMuteParticipant({muteStates:a.muteStates,mediaOptions:s,stateUpdated:!0,participantId:t}),this._state==="ACTIVE"&&v.onAcceptedCall(a.externalId,Qe.parseCapabilities(e.capabilities))}async _onHungup(e){d.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=I.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new B(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let i=await this._getParticipant(t);if(!i){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),i.state=e.reason===y.REJECTED?Z.REJECTED:Z.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,y.HUNGUP)}async _onAddedParticipant(e){d.debug(`Participant added [${e.participantId}]`);let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state!==Z.HUNGUP&&i.state!==Z.REJECTED){d.debug(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:a}=e,s=a.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(a),mediaSettings:Re(a.mediaSettings),state:a.state,participantState:I.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},s),i=await this._getParticipant(t)}i.state=Z.CALLED,i.mediaSettings=Re(e.participant?.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant?.roles||[],this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(i.id,!0),v.onParticipantAdded(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i)}async _onJoinedParticipant(e){d.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state===Z.ACCEPTED){d.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:s}=e,c=s.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(s),mediaSettings:Re(s.mediaSettings),state:s.state,participantState:I.mapParticipantState(s),roles:s.roles||[],muteStates:s.muteStates||{},movieShareInfos:s.movieShareInfos,unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(t,s.markers)},c),i=await this._getParticipant(t)}this._conversation&&this._conversation.direction===Ne.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),i.state=Z.ACCEPTED,i.mediaSettings=Re(e.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i);let a=Object.keys(i.muteStates);a.length&&this._onMuteParticipant({muteStates:i.muteStates,mediaOptions:a,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(i.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new B(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=I.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,Re(e.mediaSettings))}async _onParticipantStateChanged(e){let t=I.composeMessageId(e),i=I.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(i):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,i))}async _onParticipantsStateChanged(e){let{participants:t,roomId:i}=e,a=t.map(({id:u,markers:p})=>this._registerParticipantAndSetMarkersIfChunkEnabled(u,p));await Promise.all(a);let s=new Map,c=t.map(({id:u,participantState:p})=>this._getExternalIdByParticipantId(u).then(m=>[u,m&&I.mapParticipantState({participantState:p})]));try{(await Promise.all(c)).forEach(([p,m])=>{m&&s.set(p,m)}),await this._changeMultipleParticipantState(s,i)}catch(u){d.warn(`_onParticipantsStateChanged: Failed to get external ids. ${u}`)}}_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(),v.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),i=Re(e.mediaSettings);t.isAudioEnabled!==i.isAudioEnabled&&await this._mediaSource.toggleAudio(i.isAudioEnabled),t.isVideoEnabled!==i.isVideoEnabled&&await this._mediaSource.toggleVideo(i.isVideoEnabled),t.isScreenSharingEnabled!==i.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:i.isScreenSharingEnabled,fastScreenSharing:i.isFastScreenSharingEnabled,captureAudio:i.isAudioSharingEnabled})}_onSettingsUpdate(e){d.debug("Got settings update notification",e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=ha(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){d.debug("Got video quality update notification",e);let t=Math.round(e.quality.maxBitrate/1024),i=e.quality.maxDimension,a={maxBitrateK:t,maxDimension:i},s;e.mediaType&&e.mediaType==="SCREEN"?s={camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,a)}:s={camera:Object.assign({},this._serverSettings.camera,a),screenSharing:null,fastScreenSharing:null},this._serverSettings=ha(this._serverSettings,s),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=I.composeMessageId(e),i=await this._getParticipant(t);i&&(i.clientType=e.clientType,i.platform=e.platform),v.onPeerRegistered()}async _onMicSwitched(e){v.onDeviceSwitched(le.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onChatMessage(e.message,i,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,"sdk"))return;let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onCustomData(e.data,i,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let i=this._conversation.recordsInfoByRoom.get(t);if(i?.recordMovieId!==e?.recordMovieId||i?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let s=await this._getExternalIdByParticipantId(e.initiator);s?v.onRecordStarted(s,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},i=null){if(!this._conversation)return;let a=this._conversation.recordsInfoByRoom.get(i);if(!(!a||a.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(i,null),e){let s=await this._getExternalIdByParticipantId(e);v.onRecordStopped(i,s??null)}else v.onRecordStopped(i,null)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let i=await this._getExternalIdByParticipantId(t);i&&v.onPinnedParticipant(i,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiator);i?v.onRecordStarted(i,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else v.onRecordStopped(e,null)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiatorId);i&&v.onAsrSet({externalId:i,movieId:t.movieId},e)}else v.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,i=t.get(e);if(i){let a=await this._getExternalIdByParticipantId(i.initiatorId);a&&v.onRemoteSharedUrl(a,i.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,i=e.roomId||null;this._conversation.asrInfoByRoom.set(i,t);let a=await this._getExternalIdByParticipantId(t.initiatorId);if(!a){this._warnParticipantNotInConversation(t.initiatorId);return}v.onAsrStarted(a,t.movieId,i)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),v.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!xi(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:wr(this._getMuteStatesForCurrentRoom(),We.MUTE_PERMANENT),stateUpdated:!0}),I.includesOneOf(t,[Et.ADMIN,Et.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=await this._getParticipant(e);i&&!xi(i.roles,t)&&(d.debug(`Roles for participant [${e}] changed: ${t}`),i.roles=t,v.onRolesChanged(i.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:i,muteStates:a={},unmuteOptions:s=[],mediaOptions:c=[],roomId:u=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){d.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let p=await this._getParticipant(e.participantId);if(p){d.debug(`Mute states for participant [${e.participantId}] changed`,a);let m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;v.onMuteStates(a,s,c,i,e.unmute,p.externalId,m,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,u):i||(this._conversation.muteStatesPersonal=a)),e.adminId&&this._isMe(e.adminId)){i&&v.onMuteStates(a,s,c,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:c,muteAll:i,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:a})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let i=this._getMuteStatesForRoomId(t),a=this._getMuteStatesForRoomId(e),s=Object.keys(i),c=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...s,...c])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Z.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:c,roomId:u=null,unmuteOptions:p=[]}=e,m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(u)),E=this._mediaSource.getMediaSettings(),P=Object.entries(h);for(let[C,H]of P){let K=this._isCallAdmin()&&i;if(!(H!==We.MUTE&&H!==We.MUTE_PERMANENT||K)&&(this._isCallAdmin()&&H===We.MUTE_PERMANENT&&!i&&(h[C]=We.MUTE),!(!t.includes(C)||a)))switch(C){case le.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(le.VIDEO,!1),await this.toggleLocalVideo(!1));break;case le.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(le.AUDIO,!1),await this.toggleLocalAudio(!1));break;case le.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(le.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case le.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(le.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:E.isScreenSharingEnabled,fastScreenSharing:E.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(h,p,t,i,a,null,m,s,c,u)}async _onPinParticipant(e,t=!1,i,a=null){if(!this._conversation)return;let s=this._conversation.pinnedParticipantIdByRoom.get(a);if(s&&s!==e)if(this._isMe(s))v.onLocalPin(!0,a);else{let c=await this._getExternalIdByParticipantId(s);c&&v.onPinnedParticipant(c,!0,this._denormalizeMarkers(e,i),a)}if(this._isMe(e))v.onLocalPin(t,a);else{let c=await this._getExternalIdByParticipantId(e);c&&v.onPinnedParticipant(c,t,this._denormalizeMarkers(e,i),a)}this._conversation.pinnedParticipantIdByRoom.set(a,t?null:e)}_onOptionsChanged(e){this._conversation&&!Yn(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e),e.includes(at.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&v.onLocalStatus("WAITING_HALL"):e.includes(at.WAIT_FOR_ADMIN)&&this._conversation.restricted&&v.onLocalStatus("WAIT_FOR_ADMIN"))}async _onNetworkStatus(e){if(this._conversation){let t=[],i=await this._getParticipants();for(let[a,s]of Object.entries(e)){let c;if(this._isMe(a)||a==="")c=this._conversation.networkRating;else if(i[a])c=i[a].networkRating;else continue;if(c!==s)if(this._isMe(a)||a==="")this._conversation.networkRating=s,Xt.getInstance().value=s,v.onLocalNetworkStatusChanged(s);else{let u=i[a];u.networkRating=s,t.push({uid:u.externalId,rating:s})}}if(t.length===0)return;d.log("Received network status update: ",e),v.onNetworkStatusChanged(t)}}async _onRemoteStreamSecond(e,t){let i=await this._getParticipant(e);i&&v.onRemoteScreenStream(i.externalId,t)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){v.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let i=await this._getParticipant(e);i&&v.onRemoteVmojiStream(i.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,v.onVmojiError({...e,externalId:t}))}catch(t){d.warn("_onAnimojiError failed",t)}}_onPeerConnectionClosed(e){e==="SERVER"&&this._cleanupParticipantAgnosticStreams()}_changeFeatureSet(){if(this._conversation){let e=this._state==="ACTIVE",t=this._conversation.features.includes(Ta.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&v.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let s=await this._getParticipant(i);s&&s.externalId&&t.push({uid:s.externalId,volume:a.real})}v.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){d.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=await this._getParticipants(),s=e.reduce((c,u)=>{if(u in a){let p=a[u];c.push(p),t==="CONNECTED"&&(p.remoteStream||(p.mediaSettings&&this._changeRemoteMediaSettings(u,p.mediaSettings),this._changeRemoteParticipantState(u,p.participantState)),this._updateDisplayLayoutFromCache(u))}else this._warnParticipantNotInConversation(u);return c},[]);s.length&&this._setParticipantsStatus(s,i)}async _onTransportLocalStateChanged(e){if(d.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(b.releaseFirefoxMicrophonePermissionWarmup(),v.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&v.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&v.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(y.FAILED),this._close(new B(y.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(Be.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(Be.TRANSPARENT_AUDIO_TRACK_PREFIX))d.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(i);else if(e.startsWith(Be.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))d.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{d.debug(`Remote track added on the participant [${e}]`,{kind:i.kind});let a=await this._getParticipant(e);if(!a){let s=this._api.getDecorativeIdByInitialId(e),c=s?I.composeUserId(s):void 0;d.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${c}]`),this._registerParticipant({id:e},c),a=await this._getParticipant(e),this._setParticipantsStatus([a],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(a.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(i),l.preserveAudioTracks||(a.remoteAudioTrack=i,t.removeTrack(i))),a.remoteStream!==t&&t.getTracks().length){if(a.remoteStream=t,a.secondStream)return;v.onRemoteStream(a.externalId,t)}a.mediaSettings&&this._changeRemoteMediaSettings(e,a.mediaSettings)}}_onRemoteTrackRemoved(e,t,i){switch(d.debug(`[${e}] remote track (removed)`,{track:i}),i.kind){case"audio":this._removeAudioTrack(e,t,i);break;case"video":case"screen":this._removeVideoTrack(e,t,i);break}}async _removeAudioTrack(e,t,i){if(e!==Be.AUDIO_MIX){let a=await this._getParticipant(e);if(!a||a.remoteStream&&a.remoteStream!==t)return}this._audioOutput.remove(i)}_removeVideoTrack(e,t,i){}_onTopologyChanged(e){e==="DIRECT"&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall())}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,d.debug("Audio mix stalled:",e),v.onLocalStatus(e?"RECONNECT":"CONNECTED"))}async _onRemoteSignalledStall(e){let t={},i=[],a=[];d.debug("Participants stalled:",e);let s=await this._getParticipants();for(let c of e){if(t[c]=!0,!this._lastStalled[c]){let u=s[c];u&&i.push(u)}delete this._lastStalled[c]}for(let c of Object.keys(this._lastStalled)){let u=s[c];u&&a.push(u)}i.length&&this._setParticipantsStatus(i,"RECONNECT"),a.length&&this._setParticipantsStatus(a,"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){!b.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!b.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&&(d.debug("Toggle join availability",{available:t,chatId:e}),v.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!=="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(i){d.warn(`_updateDisplayLayoutFromCache failed: ${i}`)}}_setParticipantsStatus(e,t,i=null){if(!e.length)return;let a=e.reduce((s,c)=>(c.status!==t&&(c.status=t,s.push(c.externalId)),s),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(Oi)){let a=e.updates[i];a&&(t[i]={rooms:await Promise.all(a?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:a?.roomIds,deactivated:a?.deactivated})}v.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(i=>i===Oi.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()||v.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(c=>this._getExternalIdByParticipantId(c))||[]),i=await Promise.all(e.addParticipantIds?.map(c=>this._getExternalIdByParticipantId(c))||[]),a=await Promise.all(e.removeParticipantIds?.map?.(c=>this._getExternalIdByParticipantId(c))||[]),s=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:i,removeParticipantIds:a,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:s,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),i=e.roomId??null,a=e.addedParticipantIds?.map(P=>I.decomposeId(P).id)||[],s=await this._api.getExternalIdsByOkIds(a),c=e.addedParticipants;if(s.length&&c?.length!==s.length&&!this._isCalledState()){let P=this._convertExternalIdsToServerExternalIds(s);c=(await this._signaling.getParticipants(P)).participants}let u=await Promise.all(c?.map(async P=>{let C=I.composeId(P);return this._createParticipant({id:C,externalId:Q.fromSignalingParticipant(P),mediaSettings:Re(P.mediaSettings),participantState:I.mapParticipantState(P),state:P.state,roles:P.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:P.muteStates||{},unmuteOptions:P.unmuteOptions||[],observedIds:P.observedIds||[],markers:this._denormalizeMarkers(C,P.markers),isInRoom:i!==null},P.decorativeUserId)})||[]),p=!1;for(let P of u)P.id===this._conversation?.compositeUserId&&(p=!0),this._registerParticipantInCache(P);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(u,!0);let m=[],h=[];if(e?.removedParticipantMarkers){for(let P of e.removedParticipantMarkers)if(P.GRID?.id){let C=this._getExternalIdByParticipantId(P.GRID.id);h.push(C)}m=await Promise.all(h)}if(p&&await this._onRoomSwitched(i),m){let P=this._conversation?.pinnedParticipantIdByRoom.get(i);if(P){let C=await this._getExternalIdByParticipantId(P);if(C){for(let H of m)if(Q.compare(C,H)){this._conversation?.pinnedParticipantIdByRoom.delete(i);break}}}}let E={roomId:i,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:I.mapSharedParticipants(u),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:m};this._isCalledState()||v.onRoomParticipantsUpdated(E)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let i=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){v.onRoomStart(e);return}this._isCalledState()||v.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,i),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let i=t?.rooms?.rooms??[],a=[];for(let s of i){let c=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,c),this._conversation?.recordsInfoByRoom.set(c,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(c,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(c,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(c,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(c),e){let u=await this._getParticipants();await this._registerParticipants(s?.participants?.participants?.filter(m=>!u[I.composeId(m)])||[],!0);let p=await this._convertRoomToExternal(s);p&&a.push(p)}}a.length&&!this._isCalledState()&&v.onRoomsUpdated({[Oi.UPDATE]:{rooms:a}})}async _onFeedback(e){let t=[];for(let i of e.feedback){let a={...i,items:[]};for(let s of i.items){let c=await this._getExternalIdByParticipantId(s.participantId);c?a.items.push({...s,participantId:c}):this._warnParticipantNotInConversation(s.participantId)}t.push(a)}v.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:i,decorativeExternalParticipantId:a}=e,s=this._isMe(t);d.debug(`Decorative participant id changed [${t}]`,e);let c=await this._getExternalIdByParticipantId(t);if(!c){this._warnParticipantNotInConversation(t);return}let u=Q.fromSignaling(a,c.deviceIdx);if(v.onParticipantIdChanged(c,u),this._api.cacheExternalId(i,u),this._api.mapDecorativeId(i,t),s)this._conversation.externalId=u;else{let p=await this._getParticipants();p[t].externalId=u}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(d.debug("Video suspend suggested",e),v.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()==="SERVER"&&this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){let i=this._createParticipant(e,t);i.catch(()=>{}),this._pendingParticipants.set(e.id,i)}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.entries()),t=await Promise.allSettled(e.map(a=>a[1])),i=null;for(let a=0;a<t.length;a++){let[s]=e[a];this._pendingParticipants.delete(s);let c=t[a];if(c.status==="fulfilled"){let u=c.value;this._participants[u.id]=u;continue}i=i??c.reason,d.warn(`Failed to resolve pending participant [${s}]`,c.reason)}if(i)throw i}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};o(J,"_current"),o(J,"_activationMutex"),o(J,"_delayedHangup",!1);var U=J,Ca=class n extends Error{constructor(e,t){super(e);o(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var Ft=null,si=null;function ms(){Ft=null,si=null}function cc(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Ur(n=null,r){let e=cc(n??l.apiBaseUrl);if(e)return e;if((r??l.apiEnv)!=="AUTO")return l.apiEndpoint(r);try{let t=atob("aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ="),s=(await(await fetch(t,{method:"GET",mode:"cors",cache:"no-cache"})).json())?.Answer[0]?.data;if(!s)throw new Error("Wrong DNS response");return d.debug("Resolved API endpoint",s),s}catch(t){return d.warn("Failed to resolve API endpoint using DNS, default is used",t),l.apiEndpoint(r)}}async function hs(){return Ft||si||(si=Ur(),Ft=await si,si=null,Ft)}async function oi(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await hs();let t=_s(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${Ft}/fb.do`,i)}async function Vi(n,r={},e=!1,t){await hs();let i=_s(n,r,e);return dc(i,t)}async function dc(n,r){let e=`${r??Ft}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new B(y.NETWORK_ERROR)),l.apiTimeout),a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n,signal:t.signal});clearTimeout(i);let s=await a.text(),c;try{c=JSON.parse(s)}catch{c={result:s}}if(!a.ok||Object.hasOwn(c,"error_msg"))throw c;return c}async function gs(n,r){try{let e=await fetch(n,{method:"POST",body:r});if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);let t=await e.text();d.debug("Form data sent successfully",t)}catch(e){throw d.warn("Failed to send form data",e),e}}function _s(n,r={},e=!1){r.method=n,r.format="JSON",r.application_key||(r.application_key=l.apiKey),e||(Pe.sessionKey?r.session_key=Pe.sessionKey:Pe.accessToken&&(r.access_token=Pe.accessToken));for(let[i,a]of Object.entries(r))typeof a=="object"&&(r[i]=JSON.stringify(a));let t="";for(let[i,a]of Object.entries(r))t&&(t+="&"),t+=`${i}=${encodeURIComponent(a)}`;return t}var ji=class{async createJoinLink(r){return{join_link:"nop"}}async removeJoinLink(r){return{success:!0}}async getAnonymTokenByLink(r,e){return""}log(r){}logClientStats(r){}logClientEvents(r){}getCachedOkIdByExternalId(r){return null}cacheExternalId(r,e){}mapDecorativeId(r,e){}unmapDecorativeId(r){}getDecorativeIdByInitialId(r){}replaceByInitialIdIdIfExists(r){return typeof r=="string"?parseInt(r,10):r}hangupConversation(r,e=y.HUNGUP){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var pc=700,uc=3e3,Hi=class extends ji{constructor(){super(...arguments);o(this,"_userId",null);o(this,"_uuid");o(this,"_externalUidsCache",new Map);o(this,"_decorativeIdToInitialId",new Map);o(this,"_initialIdToDecorativeId",new Map)}async _callUnsafe(e,t={},i=!1){let a=async s=>{try{return await Vi(e,t,i)}catch(c){if(!Object.hasOwn(c,"error_msg")){s++;let u=Object.getOwnPropertyNames(c).map(p=>`${p}: ${JSON.stringify(c[p])}`);if(d.debug(`${e} network error, attempt ${s}: ${u.join(`
|
|
17
|
+
`)}`),s<l.apiMaxAttempt)return await I.delay(Math.min(s*pc,uc)),a(s)}throw d.warn(e,"error",c),c}};return a(0)}async _call(e,t={},i=!1){try{return await this._callUnsafe(e,t,i)}catch(a){d.warn("Api call error",a);let s=de.API;switch(a.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,i)}let c={message:a.error_msg,code:a.error_code};if(a instanceof B)throw a;if(a.custom_error&&(c.custom_error=a.custom_error),mc(a))switch(a.error_code){case 1101:s=y.SERVICE_DISABLED;break;case 4:a.error_msg.includes("participants.limit.exceeded")&&(s=y.PARTICIPANT_LIMIT_REACHED);break;case 300:s=y.NOT_FOUND;break;case 1102:s=y.CALLEE_IS_OFFLINE;break;case 1103:s=y.NOT_FRIENDS;break;case 1104:case 1106:s=y.EXTERNAL_API_ERROR;break;case 1113:s=y.CALLER_IS_REJECTED;break;case 1114:s=y.VCHAT_DETAILED_ERROR;break;case 2:s=y.SERVICE_UNAVAILABLE;break}throw new B(s,c)}}async userId(e){let t=I.extractOkId(e);if(Pe.isEmpty())return Q.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),Q.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!l.apiKey)throw new B(de.API,{message:"Required argument apiAppKey not passed"});let e={session_data:{version:2,device_id:this._uuid,client_version:l.appVersion,client_type:"SDK_JS"}};return l.authToken&&(e.session_data.auth_token=l.authToken,e.session_data.version=3),this._callUnsafe("auth.anonymLogin",e,!0).then(t=>{t.uid&&(this._userId=Number(t.uid)),Pe.sessionKey=t.session_key,Pe.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&v.onTokenExpired(),new B(de.AUTH,{message:t.error_msg,code:t.error_code})})}log(e){let t={collector:"ok.mobile.apps.video",data:JSON.stringify({application:`${l.appName}:${l.sdkVersion}`,platform:l.platform,items:e})};oi("log.externalLog",t)}logClientStats(e){let t={app_version:String(l.appVersion),sdk_type:"WEB",sdk_version:l.sdkVersion,version:1,items:e};l.clientStatsPlatform&&(t.platform=l.clientStatsPlatform);let i={data:JSON.stringify(t)};oi("vchat.clientStats",i)}logClientEvents(e){let t={app_version:String(l.appVersion),sdk_type:"WEB",sdk_version:l.sdkVersion,version:1,items:e};l.clientStatsPlatform&&(t.platform=l.clientStatsPlatform);let i={data:JSON.stringify(t)};oi("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let s={conversationId:e,webrtcPlatform:l.platform,startTime:t,endTime:i},c=await this._callUnsafe("vchat.getLogUploadUrl",s),u=new FormData,p=new Blob([a],{type:"application/json"});u.append("file",p,"log.json");let m=new URL(c.upload_url);return m.searchParams.append("size",p.size.toString()),gs(m.toString(),u)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion,capabilities:Qe.getFlags()};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:c,waitForAdmin:u,closedConversation:p}={},m){let h=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,waitForAdmin:u,closedConversation:p,audienceMode:s,audioOnly:c,speakerIds:m});return this._startConversation(h)}async startConversation(e,t,i,a=!1,s="",c=!1,u=!1,{onlyAdminCanShareMovie:p,waitForAdmin:m}={},h){let E=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:c,payload:s,requireAuthToJoin:u,onlyAdminCanShareMovie:p,waitForAdmin:m,externalIds:h});if(t&&t.length)switch(i){case ut.USER:E.uids=t.join(",");break;case ut.GROUP:E.gid=t[0];break;case ut.CHAT:E.chatId=t[0];break}return this._startConversation(E)}_ensureUuid(){if(!this._uuid){let e=ht.get("uuid");e||(e=I.uuid(),ht.set("uuid",e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:i="",joiningAllowed:a=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:c,waitForAdmin:u,audienceMode:p=!1,audioOnly:m=!1,speakerIds:h=[],closedConversation:E=!1,externalIds:P}){let C={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};if(a&&(C.createJoinLink=!0),i&&(C.payload=i),l.domain&&(C.domainId=l.domain),l.externalDomain&&(C.externalDomain=l.externalDomain),s&&(C.requireAuthToJoin=!0),c!==void 0&&(C.onlyAdminCanShareMovie=c),u!==void 0&&(C.waitForAdmin=u),p&&(C.audienceMode=p),m&&(C.audioOnly=m),h.length){let H=h.map(K=>I.composeUserId(K));C.speakerIds=H.join(",")}return E&&(C.closed=E),P&&(C.externalIds=P.map(Q.toSignaling).join(",")),C}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 i={joinLink:e};t&&(i.anonymName=t);let a=await this._call("vchat.getAnonymTokenByLink",i);return this._userId=Number(a.uid),a.token}async joinConversationByLink(e,t=!1,i,a){let s={joinLink:e,isVideo:t,protocolVersion:l.protocolVersion,capabilities:Qe.getFlags()};return i?.length&&(s.observedIds=i.join(",")),l.anonymToken&&(s.anonymToken=l.anonymToken),a&&(s.payload=a),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],i=[],a=new Map,s=Array.from(this._externalUidsCache.keys()),c=Array.from(this._externalUidsCache.values());for(let p of e){let m=Q.toString(p),h=c.indexOf(m);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(a.set(String(p.id),m),i.push({id:p.id,ok_anonym:p.type==="ANONYM"}))}return i.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:i})).ids.forEach((p,m)=>{let h=Number(p.ok_user_id),E=String(p.external_user_id.id);a.has(E)&&(this.cacheExternalId(h,Q.fromString(a.get(E))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let s of e){let c=Q.toString(s),u=a.indexOf(c);if(u>-1){let p=I.composeParticipantId(this.replaceByInitialIdIdIfExists(i[u]),oe.USER,s.deviceIdx);t.set(s,p)}}return t}async getExternalIdsByOkIds(e){let t=[],i=[];for(let s of e)if(this._externalUidsCache.has(s)){let c=this.getDecorativeIdByInitialId(s),u=this._externalUidsCache.get(c??s);t.push(Q.fromString(u))}else i.push(s);if(!i.length)return t;let a=await this._getExternalIdsByOkIds(i);return Array.from(a.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),i=Array.from(this._externalUidsCache.values()),a=Q.toString(e),s=i.indexOf(a);return s>-1?I.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),oe.USER,e.deviceIdx):s>-1?I.composeParticipantId(t[s],oe.USER,e.deviceIdx):null}cacheExternalId(e,t){let i=I.extractOkId(e);this._externalUidsCache.set(i,Q.toString(t))}mapDecorativeId(e,t){let i=I.extractOkId(e),a=I.extractOkId(t);this._decorativeIdToInitialId.set(i,a),this._initialIdToDecorativeId.set(a,i)}unmapDecorativeId(e){let t=I.extractOkId(e),i=this.getDecorativeIdByInitialId(t);i&&this._decorativeIdToInitialId.delete(i),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=I.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=I.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}async getConversationParams(e){let t={};return l.anonymToken&&(t.anonymToken=l.anonymToken),e&&(t.conversationId=e),this._call("vchat.getConversationParams",t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e,t=y.HUNGUP){let i={conversationId:e,reason:t};l.anonymToken&&(i.anonymToken=l.anonymToken),oi("vchat.hangupConversation",i)}sendUserFeedbackStats(e,t,i,a){let s={collector:"app.vchat.events.product",data:JSON.stringify({application:`${l.appName}:${l.sdkVersion}`,platform:l.platform,items:[{type:1,operation:X.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};oi("log.externalLog",s)}async removeHistoryRecords(e){await this._call("vchat.removeHistoryRecords",{recordIds:e.join(",")})}cleanup(){this._decorativeIdToInitialId=new Map,this._initialIdToDecorativeId=new Map}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(i=>this.getDecorativeIdByInitialId(i)??i);try{let i=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),a=(s,c)=>{for(let[u,p]of Object.entries(s)){let m=Number(u),h=Q.fromId(p,c);t.set(m,h),this.cacheExternalId(m,h)}};i.external_ids&&a(i.external_ids,"USER"),i.anonym_ids&&a(i.anonym_ids,"ANONYM");for(let s of e){let c=Number(s);if(!t.has(c)){let u=Q.fromId(String(c));t.set(c,u),this.cacheExternalId(c,u)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};function mc(n){return typeof n=="object"&&n!==null&&"error_code"in n&&"error_msg"in n}var fs=(e=>(e.KING="KING",e.PAWN="PAWN",e))(fs||{}),hc=fs;var Ss=(e=>(e.OFF="0",e.ON="1",e))(Ss||{});var ya=class{constructor(r){o(this,"_queue");o(this,"_readCursor");o(this,"_writeCursor");o(this,"_moveReadCursor");o(this,"_left");this._queue=new Array(r).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(r){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=r,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(r){return(r+1)%this._queue.length}next(){let r=this._queue[this._readCursor];return r&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),this._left-=1),r}};var Pa=class{constructor(r,e,t,i=null){o(this,"_uuid");o(this,"_apiKey");o(this,"_callToken");o(this,"_apiEnv");o(this,"_baseApiUrl");o(this,"_sessionKey");this._uuid=I.uuid(),this._apiKey=e,this._callToken=t,this._apiEnv=r,this._baseApiUrl=i}async authorize(){let r={session_data:{device_id:this._uuid,client_version:l.appVersion,client_type:"SDK_JS",auth_token:this._callToken,version:3},application_key:this._apiKey},e=await Ur(this._baseApiUrl,this._apiEnv),t=await Vi("auth.anonymLogin",r,!0,e);return I.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(r){let e={conversationId:r,reason:y.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Ur(this._baseApiUrl,this._apiEnv);await Vi("vchat.hangupConversation",e,!0,t)}};var me,Gi=null,HE={getCameras:b.getCameras,getMicrophones:b.getMicrophones,getOutput:b.getOutput,getVideoFacingMode:b.getVideoFacingMode,hasCamera:b.hasCamera,hasMicrophone:b.hasMicrophone,getSavedCamera:b.getSavedCamera,getSavedMicrophone:b.getSavedMicrophone,getSavedOutput:b.getSavedOutput,hasCameraPermission:b.hasCameraPermission,hasMicrophonePermission:b.hasMicrophonePermission,hasPermissions:b.hasPermissions,getUserMedia:b.getUserMedia,getUserVideo:b.getUserVideo,getUserAudio:b.getUserAudio,setResolution:b.setResolution,isBrowserSupported:b.isBrowserSupported,isScreenCapturingSupported:b.isScreenCapturingSupported,os:b.os,isMobile:b.isMobile,browserName:b.browserName,browserVersion:b.browserVersion,baseChromeVersion:b.baseChromeVersion,getAudioContext:b.getAudioContext,isAudioShareSupported:b.isAudioShareSupported},GE={participantMarkerCompare:I.participantMarkerCompare};function WE(n){Gi=n}function KE(n){l.videoEffects=n}function $E(n){l.audioEffects=n}function qE(n,r=null,e={},t=1){l.vmoji=n,l.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function zE(n){if(l.set(n),me||(me=new Hi),vs.disableLog(!l.debug),d.toggle(l.debug),d.log(`Calls SDK ${l.sdkVersion}`,n),await b.init(),!b.isBrowserSupported())throw new B(de.UNSUPPORTED);d.log("UserAgent:",navigator.userAgent),d.log("Screen resolution:",`${window.screen.width}x${window.screen.height}`),d.log("Permissions:",`Camera: ${b.hasCameraPermission()}, Mic: ${b.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${l.simulcast}`)}async function JE(n,r=[le.AUDIO],e="",t=!1,i=!1,a,s,c){let u=[];return Array.isArray(n)?u=n.length?n:[]:n&&(u=[n]),gc([],ut.USER,r,e,t,i,a,u,s,c)}async function gc(n,r=ut.USER,e,t="",i=!1,a=!1,s,c,u,p){if(U.current())throw d.error("There is already active call"),new B(y.FAILED);return new U(me,Gi).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:u,conversationId:p})}async function YE(n,r){return _c(n,oe.USER,void 0,r)}async function _c(n,r=oe.USER,e,t,i,a){if(n===U.id())throw new Error("Push has already been processed");return a&&me.setUserId(a),new U(me,Gi).onPush(n,r,e,t,i)}async function QE(n,r){return n&&(l.authToken=n),r!==void 0&&l.apiBaseUrl!==r&&(l.apiBaseUrl=r,ms()),me.authorize()}async function XE(n=[le.AUDIO]){return Xe().accept(n)}async function ZE(){let n=U.current();if(n)return n.decline()}async function eT(n,r=[le.AUDIO]){return fc(n,r)}async function fc(n,r,e){if(U.current())throw d.error("There is already active call"),new B(y.FAILED);return new U(me,Gi).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function tT(n,r=[le.AUDIO],e,t,i,a){if(U.current())throw d.error("There is already active call"),new B(y.FAILED);return e&&(l.anonymToken=e),new U(me,Gi).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i,onFastJoin:a})}async function iT(){let n=U.current();if(n)return n.hangup();U.hangupAfterInit()}async function rT(n,r){let e=Array.isArray(n)?n:[n],t=U.current();t&&await t.addParticipant(e,r)}async function aT(n,r){let e=U.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function nT(n,r=!1){let e=await me.getOkIdsByExternalIds([n]);return Sc(e[0],r)}async function Sc(n,r=!1){let e=U.current();if(e)try{await e.removeParticipant(I.composeUserId(n),r)}catch(t){d.warn(`Failed to remove participant ${n}. Perhaps he is no longer on the call. ${t}`)}}async function sT(n,r){let e=U.current();if(n==="videoinput"&&yt.contains(r))return l.videoFacingMode=r,e?(b.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await b._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function oT(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&l.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=U.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function cT(n){let r=U.current();r&&r.toggleAnimojiCapturing(n)}async function dT(n,r=!1){let e=U.current();e&&await e.setVideoStream(n,r)}async function lT(n){let r=U.current();r&&await r.toggleLocalVideo(n)}async function pT(n){let r=U.current();r&&await r.toggleLocalAudio(n)}async function uT(n){let r=U.current();if(r)return r.setLocalResolution(n)}async function mT(n){let r=U.current();r&&await r.changePriorities(n)}async function hT(n,r){let e=U.current();if(e){let t;if(r){let[i]=await me.getOkIdsByExternalIds([r]);t=I.composeParticipantId(i,oe.USER,r.deviceIdx)}await e.changeParticipantState(n,t)}}async function gT(){let n=U.current();n&&await n.putHandsDown()}async function _T(n){let r=U.current();r&&await r.updateDisplayLayout(n)}async function fT(n,r,e=!1){let t=await me.getOkIdsByExternalIds([n]);return vc(t[0],Q.getDeviceIdx(n),r,e)}async function vc(n,r,e,t=!1){let i=U.current();i&&await i.grantRoles(I.composeParticipantId(n,oe.USER,r),e,t)}async function ST({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await me.getOkIdsByExternalIds([n]))[0]),Ic({uid:i,muteStates:r,requestedMedia:e,deviceIdx:Q.getDeviceIdx(n),roomId:t})}async function Ic({uid:n=null,muteStates:r,requestedMedia:e=[],deviceIdx:t=0,roomId:i=null}){let a=U.current();if(a){let s=n?I.composeParticipantId(n,oe.USER,t):null;await a.muteParticipant(s,r,e,i)}}async function vT(n,r=!1,e=null){let t=await me.getOkIdsByExternalIds([n]);return Ec(t[0],r,Q.getDeviceIdx(n),e)}async function Ec(n,r=!1,e=0,t=null){let i=U.current();i&&await i.pinParticipant(I.composeParticipantId(n,oe.USER,e),r,t)}async function IT(n){let r=U.current();r&&await r.updateMediaModifiers(n)}async function ET(n){let r=U.current();r&&await r.enableVideoSuspend(n)}async function TT(n){let r=U.current();r&&await r.enableVideoSuspendSuggest(n)}async function RT(n){let r=U.current();r&&await r.changeOptions(n)}async function CT(n,r=null){let e=null;return r&&(e=(await me.getOkIdsByExternalIds([r]))[0]),Tc(n,e)}async function Tc(n,r=null){let e=U.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function yT(n=10){let r=U.current();if(r)return r.chatHistory(n)}async function PT(n,r=null){let e=null;return r&&(e=(await me.getOkIdsByExternalIds([r]))[0]),Rc(n,e,Q.getDeviceIdx(r))}async function Rc(n,r=null,e=0){let t=U.current();if(t){let i=r?I.composeParticipantId(r,oe.USER,e):null;await t.customData(n,i)}}async function bT(n="",r=!1,{onlyAdminCanShareMovie:e=!1,waitForAdmin:t=!1,closedConversation:i=!1}={},a){return(await me.createConversation(a??I.uuid(),n,r,{onlyAdminCanShareMovie:e,waitForAdmin:t,closedConversation:i})).join_link}async function AT(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=Q.fromIds(i),s=await me.getOkIdsByExternalIds(a);return(await me.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},s)).join_link}async function MT(){let n=U.current();return n?n.createJoinLink():Promise.reject()}async function DT(){let n=U.current();return n?n.removeJoinLink():Promise.reject()}async function wT(n,r){return me.getAnonymTokenByLink(n,r)}function kT(n){let r=U.current();r&&r.setVolume(n)}function OT(n){l.forceRelayPolicy=n}async function xT(n=!1,r=null,e=null,t="DIRECT_LINK",i=null,a=null){let s=U.current();return s?s.startStream(n,r,e,t,i,a):Promise.reject()}async function NT(n=null,r){let e=U.current();return e?e.stopStream(n,r):Promise.reject()}async function LT(n=null){let r=U.current();return r?r.publishStream(n):Promise.reject()}async function UT(n,r,e=!1,t=null){let i=U.current();if(!i)return Promise.reject();let a,s,c=[];if(r?.length&&c.push(...r),n&&c.push(n),c.length){let u=await me.getParticipantIdsByExternalIds(c);n&&(a=u.get(n),u.delete(n)),s=Array.from(u.values())}return i.recordSetConf(a,s,e,t)}async function BT(){let n=U.current();return n?n.getStreamInfo():Promise.reject()}async function FT(n){let r=U.current();return r?r.addMovie(n):Promise.reject()}async function VT(n){let r=U.current();return r?r.updateMovie(n):Promise.reject()}async function jT(n){let r=U.current();return r?r.removeMovie(n):Promise.reject()}async function HT(n,r){let e=U.current();if(e){let t=[];for(let i of n){let a,s;i.addParticipantIds&&(a=(await me.getOkIdsByExternalIds(i.addParticipantIds)).map(c=>I.composeUserId(c))),i.removeParticipantIds&&(s=(await me.getOkIdsByExternalIds(i.removeParticipantIds)).map(c=>I.composeUserId(c))),t.push({id:i.id,name:i.name,participantCount:i.participantCount,addParticipantIds:a,removeParticipantIds:s,countdownSec:i.countdownSec})}return e.updateRooms(t,r)}return Promise.reject()}async function GT(n,r){let e=U.current();return e?e.activateRooms(n,r):Promise.reject()}async function WT(n=null,r=null){let e=U.current();if(!e)return Promise.reject();let t;if(r){let i=await me.getOkIdsByExternalIds([r]),a=Q.getDeviceIdx(r);t=I.composeParticipantId(i[0],oe.USER,a)}return e.switchRoom(n,t)}async function KT(n){let r=U.current();return r?r.removeRooms(n):Promise.reject()}function $T(n){l.statisticsInterval=n;let r=U.current();if(r)return r.updateStatisticsInterval()}function qT(n){vs.disableLog(!n),d.toggle(n)}function zT(n,...r){l.debugLog&&d.send(n,"[external]",...r)}async function JT(){let n=Oe.conversationId;if(!n)throw d.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let r=Oe.collectLogs();if(r.length===0)throw d.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Oe.startTime,t=Oe.endTime;try{return me?.uploadDebugLogs(n,e,t,JSON.stringify(r))}catch(i){throw d.error("[uploadDebugLogs]","Error while uploading logs",i),new Error("Error while uploading logs",{cause:i})}}async function YT(n){let r=U.current();if(r)return r.videoEffect(n)}async function QT(n,r){let e=U.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function XT(n){let r=U.current();r&&await r.setAudioStream(n)}async function ZT(n,r=null,e=null){let t=U.current();if(!t)return;let i=e??r?.id,a=null;if(r){let c=(await me.getOkIdsByExternalIds([r]))[0];if(!c)throw new Error("Could not get user id to set animoji svg");a=I.composeParticipantId(c,oe.USER,Q.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function eR(n){let r=U.current();r&&r.setAnimojiFill(n)}async function tR(n=null,r,e=!1){return Xe().getWaitingHall(n,r,e)}async function iR(){return Xe().getAudienceModeHands()}async function rR(n,r=!1){let e=Xe(),t;if(n){let[i]=await me.getOkIdsByExternalIds([n]);t=I.composeUserId(i)}return e.promoteParticipant(t,r)}async function aR(n=!1){return Xe().requestPromotion(n)}async function nR(n=!1){return Xe().acceptPromotion(n)}async function sR(n){return Xe().getParticipantListChunk(n)}async function oR(n){return Xe().getParticipants(n)}async function cR(n){return Xe().feedback(n)}function dR(n,r,e){return Xe().userFeedbackStats(n,r,e)}function lR(n,r={},e=!1){let t=U.current();t&&t.sendClientEvent(n,r,e)}async function pR(n,r){return Xe().enableFeatureForRoles(n,r)}function Xe(){let n=U.current();if(!n)throw new Error("Conversation not found");return n}async function uR(n){await me.removeHistoryRecords(n)}async function mR(n){let r=U.current();r&&await r.startAsr(n)}async function hR(n){let r=U.current();r&&await r.stopAsr(n)}async function gR(n){let r=U.current();r&&await r.requestAsr(n)}async function _R(n){let r=U.current();return r?r.startUrlSharing(n):Promise.reject()}async function fR(){let n=U.current();return n?n.stopUrlSharing():Promise.reject()}function SR(){return l.sdkVersion}export{Hi as Api,Pa as ApiExternal,ya as ArrayDequeue,Pe as AuthData,Ht as BaseLogger,Ne as CallDirection,ut as CallType,Ea as ChatRoomEventType,Ta as ConversationFeature,at as ConversationOption,dn as DebugMessageType,Ra as ExternalIdType,yt as FacingMode,de as FatalError,B as HangupReason,y as HangupType,le as MediaOption,Ke as MediaTrackKind,Yt as MediaType,We as MuteState,Z as ParticipantState,Ss as ParticipantStateDataValue,zr as ParticipantStatus,hc as RecordRole,Oi as RoomsEventType,ai as Signaling,x as SignalingCommandType,Ye as SignalingConnectionType,L as SignalingNotification,He as TransportTopology,Et as UserRole,oe as UserType,Bt as VolumeDetector,XE as acceptCall,nR as acceptPromotion,GT as activateRooms,FT as addMovie,rT as addParticipant,aT as addParticipantInternal,QE as authorize,HE as browser,gc as callInternal,JE as callTo,oT as captureScreen,cT as captureVmoji,QT as changeAudioEffect,RT as changeConversationOptions,sT as changeDevice,hT as changeParticipantState,mT as changePriorities,YT as changeVideoEffect,yT as chatHistory,CT as chatMessage,Tc as chatMessageInternal,MT as createJoinLink,PT as customData,Rc as customDataInternal,qT as debug,zT as debugMessage,ZE as declineCall,pR as enableFeatureForRoles,ET as enableVideoSuspend,TT as enableVideoSuspendSuggest,cR as feedback,OT as forceRelayPolicy,wT as getAnonymTokenByLink,iR as getAudienceModeHands,sR as getParticipantListChunk,oR as getParticipants,BT as getStreamInfo,tR as getWaitingHall,fT as grantRoles,vc as grantRolesInternal,iT as hangup,zE as init,eT as joinCall,tT as joinCallByLink,fc as joinCallInternal,lR as logClientEvent,ST as muteParticipant,Ic as muteParticipantInternal,vT as pinParticipant,Ec as pinParticipantInternal,YE as processPush,_c as processPushInternal,rR as promoteParticipant,LT as publishStream,gT as putHandsDown,UT as recordSetConf,uR as removeHistoryRecords,DT as removeJoinLink,jT as removeMovie,nT as removeParticipant,Sc as removeParticipantInternal,KT as removeRooms,gR as requestAsr,aR as requestPromotion,$E as setAudioEffects,XT as setAudioStream,uT as setLocalResolution,WE as setLogger,IT as setMediaModifiers,$T as setStatisticsInterval,KE as setVideoEffects,dT as setVideoStream,qE as setVmoji,eR as setVmojiFill,ZT as setVmojiSvg,kT as setVolume,mR as startAsr,AT as startAudienceConversation,bT as startConversation,xT as startStream,_R as startUrlSharing,hR as stopAsr,NT as stopStream,fR as stopUrlSharing,WT as switchRoom,pT as toggleLocalAudio,lT as toggleLocalVideo,_T as updateDisplayLayout,VT as updateMovie,HT as updateRooms,JT as uploadDebugLogs,dR as userFeedbackStats,GE as utils,SR as version};
|