@vkontakte/calls-sdk 2.8.11-dev.3d9bb708.0 → 2.8.11-dev.3de63af6.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 +49 -13
- package/abstract/BaseApi.d.ts +1 -2
- package/abstract/BaseSignaling.d.ts +1 -1
- package/calls-sdk.cjs.js +16 -13
- package/calls-sdk.esm.js +11414 -13
- package/classes/AudioFix.d.ts +5 -1
- package/classes/AudioOutput.d.ts +5 -1
- package/classes/Conversation.d.ts +11 -12
- package/classes/DebugInfo.d.ts +3 -0
- package/classes/MediaSource.d.ts +6 -5
- package/classes/ParticipantIdRegistry.d.ts +3 -0
- package/classes/ProducerCommandSerializationService.d.ts +3 -0
- package/classes/SignalingActor.d.ts +3 -1
- package/classes/SpeakerDetector.d.ts +2 -1
- package/classes/SpecListener.d.ts +5 -1
- package/classes/StatsLogger.d.ts +29 -0
- package/classes/VideoEffectsFpsLimiter.d.ts +3 -0
- package/classes/asr/AsrReceiver.d.ts +3 -1
- package/classes/codec/LibVPxDecoder.d.ts +3 -0
- package/classes/codec/LibVPxEncoder.d.ts +3 -1
- package/classes/codec/WebCodecsDecoder.d.ts +3 -0
- package/classes/codec/WebCodecsEncoder.d.ts +3 -1
- package/classes/codec/WorkerBase.d.ts +5 -0
- package/classes/screenshare/BaseStreamBuilder.d.ts +4 -1
- package/classes/screenshare/CanvasRenderer.d.ts +3 -1
- package/classes/screenshare/ScreenCaptureReceiver.d.ts +7 -1
- package/classes/screenshare/ScreenCaptureSender.d.ts +5 -1
- package/classes/screenshare/ScreenCongestionControl.d.ts +3 -1
- package/classes/screenshare/StreamBuilder.d.ts +5 -1
- package/classes/screenshare/TrackGeneratorRenderer.d.ts +3 -1
- package/classes/screenshare/WebmBuilder.d.ts +3 -1
- package/classes/stat/CodecStatsAggregator.d.ts +7 -7
- package/classes/stat/ConversationStats.d.ts +21 -0
- package/classes/stat/StatAggregator.d.ts +6 -6
- package/classes/stat/StatFirstMediaReceived.d.ts +4 -1
- package/classes/stat/StatPings.d.ts +9 -9
- package/classes/stat/StatScreenShareFirstFrame.d.ts +3 -1
- package/classes/stat/StatSignalingCommands.d.ts +8 -8
- package/classes/transport/BaseTransport.d.ts +1 -1
- package/classes/transport/DirectStatReporter.d.ts +3 -1
- package/classes/transport/DirectTransport.d.ts +9 -1
- package/classes/transport/PerfStatReporter.d.ts +5 -1
- package/classes/transport/ServerTransport.d.ts +10 -2
- package/classes/transport/Transport.d.ts +11 -14
- package/default/Api.d.ts +1 -3
- package/default/Signaling.d.ts +14 -2
- package/enums/TransportState.d.ts +10 -0
- package/enums/TransportTopology.d.ts +5 -0
- package/package.json +1 -1
- package/static/Debug.d.ts +27 -8
- package/static/External.d.ts +17 -38
- package/static/Params.d.ts +20 -22
- package/static/Utils.d.ts +3 -2
- package/static/WebRTCUtils.d.ts +6 -4
- package/types/Conversation.d.ts +1 -1
- package/types/PerfStatReporter.d.ts +2 -1
- package/types/SignalingMessage.d.ts +4 -1
- package/types/Statistics.d.ts +1 -1
- package/types/WebTransport.d.ts +1 -0
- package/utils/DebugStorage.d.ts +100 -1
- package/classes/CallRegistry.d.ts +0 -18
- package/classes/Logger.d.ts +0 -41
- package/classes/stat/EventMetricsService.d.ts +0 -9
- package/static/ConversationDebugLogger.d.ts +0 -13
package/calls-sdk.cjs.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
* @vkontakte/calls-sdk v2.8.11-dev.
|
|
3
|
-
*
|
|
4
|
-
* https://
|
|
1
|
+
/*!
|
|
2
|
+
* @vkontakte/calls-sdk v2.8.11-dev.3de63af6.0
|
|
3
|
+
* Fri, 05 Jun 2026 13:16:55 GMT
|
|
4
|
+
* https://calls-sdk.cdn-vk.ru/doc/latest/index.html
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
"use strict";var Ls=Object.create;var gi=Object.defineProperty;var Us=Object.getOwnPropertyDescriptor;var Bs=Object.getOwnPropertyNames;var Fs=Object.getPrototypeOf,Vs=Object.prototype.hasOwnProperty;var js=(n,r,e)=>r in n?gi(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var Hs=(n,r)=>{for(var e in r)gi(n,e,{get:r[e],enumerable:!0})},qa=(n,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Bs(r))!Vs.call(n,i)&&i!==e&&gi(n,i,{get:()=>r[i],enumerable:!(t=Us(r,i))||t.enumerable});return n};var _i=(n,r,e)=>(e=n!=null?Ls(Fs(n)):{},qa(r||!n||!n.__esModule?gi(e,"default",{value:n,enumerable:!0}):e,n)),Gs=n=>qa(gi({},"__esModule",{value:!0}),n);var o=(n,r,e)=>js(n,typeof r!="symbol"?r+"":r,e);var pl={};Hs(pl,{Api:()=>li,ApiExternal:()=>qr,ArrayDequeue:()=>$r,AuthData:()=>Ce,BaseLogger:()=>bt,CallDirection:()=>Oe,CallType:()=>st,ChatRoomEventType:()=>Nr,ConversationFeature:()=>Lr,ConversationOption:()=>Ze,DebugMessageType:()=>_a,ExternalIdType:()=>Ur,FacingMode:()=>ft,FatalError:()=>oe,HangupReason:()=>B,HangupType:()=>A,MediaOption:()=>ce,MediaTrackKind:()=>Ge,MediaType:()=>Ot,MuteState:()=>je,ParticipantState:()=>X,ParticipantStateDataValue:()=>ka,ParticipantStatus:()=>Zi,RecordRole:()=>Rs,RoomsEventType:()=>si,Signaling:()=>jt,SignalingCommandType:()=>x,SignalingConnectionType:()=>Ke,SignalingNotification:()=>U,TransportTopology:()=>Fe,UserRole:()=>gt,UserType:()=>ae,VolumeDetector:()=>Ct,acceptCall:()=>Vc,acceptPromotion:()=>zd,activateRooms:()=>kd,addMovie:()=>Ad,addParticipant:()=>Kc,addParticipantInternal:()=>$c,authorize:()=>Fc,browser:()=>Dc,callInternal:()=>Cs,callTo:()=>Uc,captureScreen:()=>Jc,captureVmoji:()=>Yc,changeAudioEffect:()=>Vd,changeConversationOptions:()=>ud,changeDevice:()=>zc,changeParticipantState:()=>id,changePriorities:()=>td,changeVideoEffect:()=>Fd,chatHistory:()=>hd,chatMessage:()=>md,chatMessageInternal:()=>ws,createJoinLink:()=>Sd,customData:()=>gd,customDataInternal:()=>ks,debug:()=>Ld,debugMessage:()=>Ud,declineCall:()=>jc,enableFeatureForRoles:()=>el,enableVideoSuspend:()=>ld,enableVideoSuspendSuggest:()=>pd,feedback:()=>Qd,forceRelayPolicy:()=>Td,getActiveCallId:()=>dl,getAnonymTokenByLink:()=>Id,getAudienceModeHands:()=>Kd,getCalls:()=>cl,getParticipantListChunk:()=>Jd,getParticipants:()=>Yd,getStreamInfo:()=>bd,getWaitingHall:()=>Wd,grantRoles:()=>sd,grantRolesInternal:()=>As,hangup:()=>Wc,hold:()=>rd,init:()=>Lc,joinCall:()=>Hc,joinCallByLink:()=>Gc,joinCallInternal:()=>Ps,logClientEvent:()=>Zd,muteParticipant:()=>od,muteParticipantInternal:()=>Ms,pinParticipant:()=>cd,pinParticipantInternal:()=>Ds,processPush:()=>Bc,processPushInternal:()=>ys,promoteParticipant:()=>$d,publishStream:()=>yd,putHandsDown:()=>ad,recordSetConf:()=>Pd,removeHistoryRecords:()=>tl,removeJoinLink:()=>vd,removeMovie:()=>Dd,removeParticipant:()=>qc,removeParticipantInternal:()=>bs,removeRooms:()=>xd,requestAsr:()=>al,requestPromotion:()=>qd,setAudioEffects:()=>xc,setAudioStream:()=>jd,setLocalResolution:()=>ed,setLogger:()=>kc,setMediaModifiers:()=>dd,setStatisticsInterval:()=>Nd,setVideoEffects:()=>Oc,setVideoStream:()=>Qc,setVmoji:()=>Nc,setVmojiFill:()=>Gd,setVmojiSvg:()=>Hd,setVolume:()=>Ed,startAsr:()=>il,startAudienceConversation:()=>fd,startConversation:()=>_d,startStream:()=>Rd,startUrlSharing:()=>nl,stopAsr:()=>rl,stopStream:()=>Cd,stopUrlSharing:()=>sl,switchCall:()=>ol,switchRoom:()=>Od,toggleLocalAudio:()=>Zc,toggleLocalVideo:()=>Xc,updateDisplayLayout:()=>nd,updateMovie:()=>Md,updateRooms:()=>wd,uploadDebugLogs:()=>Bd,userFeedbackStats:()=>Xd,utils:()=>wc,version:()=>ll});module.exports=Gs(pl);var Oa=_i(require("webrtc-adapter"));var bt=class{log(r,e,t=!1){}destroy(){}};var de=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 fi=class extends de{constructor(){super(...arguments);o(this,"_abortSignal")}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}setConversationId(e){}readyToSend(e=!0){}cleanup(){}requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}};var za=(Z=>(Z.CANCELED="CANCELED",Z.REJECTED="REJECTED",Z.REMOVED="REMOVED",Z.HUNGUP="HUNGUP",Z.MISSED="MISSED",Z.BUSY="BUSY",Z.FAILED="FAILED",Z.NETWORK_ERROR="NETWORK_ERROR",Z.KILLED="KILLED",Z.BANNED="BANNED",Z.HAS_ACTIVE_CALL="HAS_ACTIVE_CALL",Z.CALLER_IS_BLOCKED="CALLER_IS_BLOCKED",Z.NOT_FRIENDS="NOT_FRIENDS",Z.CALLEE_IS_OFFLINE="CALLEE_IS_OFFLINE",Z.CALLER_IS_REJECTED="CALLER_IS_REJECTED",Z.UNKNOWN_ERROR="UNKNOWN_ERROR",Z.UNSUPPORTED="UNSUPPORTED",Z.OLD_VERSION="OLD_VERSION",Z.SERVICE_DISABLED="SERVICE_DISABLED",Z.SERVICE_UNAVAILABLE="SERVICE_UNAVAILABLE",Z.EXTERNAL_API_ERROR="EXTERNAL_API_ERROR",Z.SOCKET_CLOSED="SOCKET_CLOSED",Z.ENDED="ENDED",Z.KILLED_WITHOUT_DELETE="KILLED_WITHOUT_DELETE",Z.ANOTHER_DEVICE="ANOTHER_DEVICE",Z.NOT_FOUND="NOT_FOUND",Z.VCHAT_DETAILED_ERROR="VCHAT_DETAILED_ERROR",Z.TIMEOUT="TIMEOUT",Z.PARTICIPANT_LIMIT_REACHED="PARTICIPANT_LIMIT_REACHED",Z.FAST_START_ERROR="FAST_START_ERROR",Z.FAST_JOIN_ERROR="FAST_JOIN_ERROR",Z.CALL_TIMEOUT="CALL_TIMEOUT",Z))(za||{}),A=za;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(A).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 bt{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 y=Se;var L=require("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.HOLD="hold",N.PUT_HANDS_DOWN="put-hands-down",N.CHANGE_SIMULCAST="change-simulcast",N))(Ja||{}),x=Ja;var Ya=($=>($.MIC_CAMERA_PERMISSION="mic_camera",$.CAMERA_PERMISSION="camera",$.MIC_PERMISSION="mic",$.CAMERA_ACCESS="cameralock",$.MIC_ACCESS="miclock",$.MIC_NOT_FOUND="nomic",$.SCREEN_PERMISSION="screenpermission",$.SCREEN_ACCESS="screenlock",$.CONNECTION="connection",$.NETWORK="network",$.UNKNOWN="unknown",$.UNSUPPORTED="unsupported",$.SIGNALING_FAILED="signalingfailed",$.API="api",$.AUTH="auth",$.OVERCONSTRAINED="overconstrained",$))(Ya||{}),oe=Ya;var Qa=(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))(Qa||{}),ce=Qa;var Xa=(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))(Xa||{}),k=Xa;var He=class He{static get sessionKey(){return He._sessionKey}static set sessionKey(r){He._sessionKey=r}static get sessionSecretKey(){return He._sessionSecretKey}static set sessionSecretKey(r){He._sessionSecretKey=r}static get accessToken(){return He._accessToken}static set accessToken(r){He._accessToken=r}static isEmpty(){return!He._sessionKey}};o(He,"_sessionKey"),o(He,"_sessionSecretKey"),o(He,"_accessToken");var Ce=He;var Za=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Za||{}),ae=Za;var _t={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Si="L1T2",tn=[{dimension:320,bitrate:18e4},{dimension:520,bitrate:4e5},{dimension:640,bitrate:5e5},{dimension:960,bitrate:9e5},{dimension:1280,bitrate:12e5},{dimension:1920,bitrate:25e5},{dimension:2560,bitrate:35e5},{dimension:3840,bitrate:5e6}],Ws={h:1,m:2,l:4};function rn(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 en(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:tn[0].bitrate}function vi(n=_t.WIDTH,r=_t.HEIGHT,e=tn){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,l=en(i,e)??_t.BITRATE;for(let u=0;u<a;u++){let m=t[u];s.streams.push({rid:m,width:n,height:r,fps:c,bitrate:l}),n=Math.round(n/2),r=Math.round(r/2),l=en(Math.max(n,r),e)??Math.round(l/2)}return s}function qi(n){return n?Ws[n]??1:1}var an=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 nn(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var $t=":",Ji="d",Ks=533,zi="a=fmtp:",$s="sps-pps-idr-in-keyframe=1",Zr;(tt=>{let n=/[\r\n]+/,r=`\r
|
|
8
|
-
|
|
9
|
-
`);for(let w of C)if(w.startsWith("a=fingerprint")){let K=w.split(" ");if(K.length===2){T=K[1];break}}if(!T)return BigInt(-1);let S=T.split(":"),M=BigInt(0);for(let w=Math.min(7,S.length-1);w>=0;w--){let K=BigInt(parseInt(S[w],16));M<<=BigInt(8),M|=K}return BigInt.asIntN(64,M)}tt.sdpFingerprint=Ba;async function Z(g,{signal:T}={}){return new Promise((C,S)=>{if(T?.aborted)return S(T.reason);let M=setTimeout(()=>{T?.removeEventListener("abort",w),C()},g),w=()=>{clearTimeout(M),S(T?.reason)};T?.addEventListener("abort",w,{once:!0})})}tt.delay=Z;function Fa(g,T,C){let S=[];return g.getSenders().forEach(M=>zr(T,M,M.track,C,S)),S}tt.applySettings=Fa;function zr(g,T,C,S,M){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!g||!C||C.kind!=="video")return;let w=C.getSettings();if(!w)return;let K=g.maxBitrateK?g.maxBitrateK*1024:null,j=w.width,q=w.height,Te=j&&q&&g.maxDimension?Math.max(1,Math.max(j,q)/g.maxDimension):null,N=g.maxFramerate||null;if(j&&q&&g.maxDimension&&g.maxDimension>Math.max(j,q)){let ge=Math.round(j*q/256),xe=(Math.round(ge*Ks/1e4)+1)*1e4;K=K===null?xe:Math.min(xe,K)}let Ee=g.degradationPreference||"balanced",_e=S[C.id];if(_e&&_e.bitrate===K&&_e.scaleResolutionDownBy===Te&&_e.maxFramerate===N&&_e.degradationPreference===Ee){M[C.id]=_e;return}M[C.id]={bitrate:K,scaleResolutionDownBy:Te,maxFramerate:N,degradationPreference:Ee};let De=T.getParameters();if(De.encodings||(De.encodings=[{}]),De.encodings.length>1&&j&&q&&g.maxDimension){let ge=Math.round(g.maxDimension*1.35),xe=Math.max(j,q),yt=vi(j,q,g?.bitrates?.generic),Kt=yt.streams.length;d.log(`applyVideoTrackSettings: maxDim=${g.maxDimension} targetDim=${ge} track=${j}x${q} sim=${JSON.stringify(yt)}`),De.encodings.forEach((it,mi)=>{it.scaleResolutionDownBy=qi(it.rid);let Ka=Math.round(xe/it.scaleResolutionDownBy);mi<Kt-1?it.active=Ka<ge:mi>=Kt?it.active=!1:it.active=!0,mi<Kt?it.maxBitrate=yt.streams[mi].bitrate:it.maxBitrate=0,it.scalabilityMode=Si})}else De.encodings.forEach(ge=>{g?.scalabilityMode&&(ge.scalabilityMode=g.scalabilityMode),K?ge.maxBitrate=K:delete ge.maxBitrate,Te?ge.scaleResolutionDownBy=Te:delete ge.scaleResolutionDownBy,N?ge.maxFramerate=N:delete ge.maxFramerate});if(De.degradationPreference=Ee,De.encodings.length>0){T.setParameters?.(De).catch(xe=>{d.error("Failed to set sender parameters",De,xe)});let ge=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(ge.encodings)}`)}}tt.applyVideoTrackSettings=zr;function Jr(g,T){Array.isArray(T)||(T=[T]);for(let C of T)if(g.includes(C))return!0;return!1}tt.includesOneOf=Jr;function Yr(g){return Object.entries(g.participantState?.state||{}).reduce((T,[C,S])=>(g.participantState&&(T[C]={ts:g.participantState.stateUpdateTs[C],state:S}),T),{})}tt.mapParticipantState=Yr;function Va(g){let T=g.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}tt.mapSharedParticipants=Va;function ja(g,T){let C=Object.keys(g),S=Object.keys(T);if(C.length!==S.length)return!1;for(let M of C)if(!Object.hasOwn(S,M)||g[M].state!==T[M].state||g[M].ts!==T[M].ts)return!1;return!0}tt.isEqualParticipantState=ja;function Qr(g,T,C=!1){let S=Object.keys(g),M=Object.keys(T);if(S.length!==M.length)return!1;for(let w of S){if(!Object.hasOwn(T,w))return!1;let K=g[w],j=T[w];if(C&&se(K)&&se(j))return Qr(K,j,C);if(K!==j)return!1}return!0}tt.isObjectsEquals=Qr;function Ha(g,T){if(g.length!==T.length)return!1;for(let C of g)if(T.indexOf(C)<0)return!1;return!0}tt.isArraysEquals=Ha;function Ga(g){return!Object.keys(g).length}tt.isEmptyObject=Ga;function Wa(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)||C(g,T);function C(M,w){let K={[ae.USER]:0,[ae.GROUP]:1},{compositeUserId:j,deviceIdx:q}=ui(M.id),{compositeUserId:Te,deviceIdx:N}=ui(w.id),{id:Ee,type:_e}=pi(j),{id:De,type:ge}=pi(Te);return S(K[_e],K[ge])||S(Ee,De)||S(q,N)}function S(M,w){return M<w?-1:M===w?0:1}}tt.participantMarkerCompare=Wa;function me(g,T){let C=Object.entries(g).filter(([,S])=>Array.isArray(T)?!T.includes(S):S!==T);return an(C)}tt.objectFilterOutValues=me;function F(g,T,C){let S=C;for(let M in g)Object.hasOwn(g,M)&&(S=T(S,g[M],M));return S}tt.objectReduce=F,tt.setImmediate=(()=>{let g=1,T={},C=null;return typeof MessageChannel<"u"&&(C=new MessageChannel,C.port1.onmessage=S=>{let M=S.data;T[M]&&(T[M](),delete T[M])}),function(S){if(C&&document.visibilityState==="hidden"){let w=g;return g=g>=Number.MAX_SAFE_INTEGER?1:g+1,T[w]=S,C.port2.postMessage(w),()=>{T[w]&&delete T[w]}}let M=setTimeout(S,0);return()=>clearTimeout(M)}})();function se(g){return g!==null&&typeof g=="object"&&!Array.isArray(g)}tt.isObject=se;function fe(g,T,C,S){function M(j,q){let Te=0,N=j.length,Ee=!1;for(let _e=0;_e<j.length;_e++)if(!Ee&&j[_e].startsWith("m=video")&&(Te=_e),j[_e].startsWith("a=mid:"+q)&&(Ee=!0),Ee&&j[_e].startsWith("m=")){N=_e;break}return{start:Te,end:N}}function w(j,q,Te,N,Ee,_e,De){let ge="a=rid:"+N+" send";for(let xe=q;xe<Te;xe++)if(j[xe]===ge){let Kt=ge+" max-width="+_e+";max-height="+De+";max-br="+Ee;j[xe]=Kt}}let K=T?.sender;if(K&&K.track&&T.mid){let j=g.split(n),{start:q,end:Te}=M(j,T.mid),N=K.getParameters();if(N.encodings)return N.encodings.forEach(Ee=>{let _e=Ee.rid,De=Ee.maxBitrate,ge=Ee.scaleResolutionDownBy;if(C&&S&&ge){let xe=""+Math.round(C/ge),yt=""+Math.round(S/ge);w(j,q,Te,_e,De,xe,yt)}}),j.join(r)}return g}tt.patchSimulcastAnswerSdp=fe})(Zr||(Zr={}));var I=Zr;var qt="__CALLS_SDK_DEVTOOLS_",Ii=class{set(r,e){try{this.getStorage().setItem(qt+r,JSON.stringify(e))}catch(t){d.warn("DevTools: Failed to save option",r,t)}}get(r){try{let t=this.getStorage().getItem(qt+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(qt+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(qt)&&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(qt)){let a=i.substring(qt.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 Ei=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 At=class At{constructor(){o(this,"params");o(this,"storage");this.storage=new Ii,this.params=new Ei(this.storage)}static getInstance(){return At.instance||(At.instance=new At),At.instance}};o(At,"instance",null);var ea=At,ta=ea.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")&&(Ce.accessToken=r.apiAuth.accessToken,Ce.sessionKey=r.apiAuth.sessionKey,Ce.sessionSecretKey=r.apiAuth.sessionSecretKey);let e=ta.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.11-dev.3d9bb708.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||(D.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 hold(){return _._params.hold}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 D.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,hold:!1,participantListChunkInitIndex:0,participantListChunkInitCount:null,breakVideoPayloadTypes:!1,joinFromMultipleDevices:!1,filterObservers:!1,muteMode:!1,preserveAudioTracks:!1,audioShare:!1,audioShareWindowInclude:!1,audioShareSystemInclude:!1,fastScreenShare:!1,screenShareCongestionControl:!1,screenShareCongestionControlThreshold:2100,consumerFastScreenShare:!1,consumerFastScreenShareQualityOnDemand:!1,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,webtransportFF:!1,transparentAudio:!1});var p=_;function sn(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 ye(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var on=n=>n.stop(),Mt=n=>n.getTracks().forEach(on),cn=n=>n.getVideoTracks().forEach(on);async function Yi(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 Qi=class extends de{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 Ge=(i=>(i.audio="audio",i.video="video",i.screen="screen",i.audioshare="audioshare",i))(Ge||{});var Xi=class extends de{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",ye());o(this,"_lastMediaSettings",null);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 Qi,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=[ce.AUDIO],t=!0){if(this._stream)return;let i=e.includes(ce.VIDEO),a=e.includes(ce.AUDIO),s=e.includes(ce.ANIMOJI);if(!D.isBrowserSupported())throw new B(oe.UNSUPPORTED);try{this._stream=await D.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)}get mediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case"videoinput":if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case"audioinput":if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(oe.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&cn(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=D.getSavedMicrophone(),i=D.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{}},D.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&D.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await D._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=i.getVideoTracks()[0],!this._stream)Mt(i);else{let a=await this._setEffect(this._effect,this.cameraVideoTrack);y.log(k.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 y.log(k.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 D.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Mt(t);else{let i=await this._applyAudioEffect();y.log(k.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 y.log(k.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await D.getScreenMedia(e,t),!this._stream)Mt(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),y.log(k.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 y.log(k.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=D.getSilentMediaTrack();return e.contentHint="music",e.stop(),e}getBlackScreenShareTrack(){let e=D.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(),D.releaseFirefoxMicrophonePermissionWarmup(),p.videoEffects&&(this._effect=null,p.videoEffects.destroy()),p.audioEffects&&p.audioEffects.destroy(),this._stream&&(Mt(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),D.getAudioContext()?.suspend().catch(t=>d.error(t)),this._videoEffectsFpsLimiter?.destroy()}stopLocalMedia(){if(this._stream){this._lastMediaSettings={...this._mediaSettings};for(let e of this._stream.getTracks())e.stop();this._stream=null,this.cameraVideoTrack=null,this._micAudioTrack=null}}async resumeLocalMedia(){if(!this._lastMediaSettings)return;let e=[];if(this._lastMediaSettings.isAudioEnabled&&e.push(ce.AUDIO),this._lastMediaSettings.isVideoEnabled&&e.push(ce.VIDEO),await this.request(e),this._lastMediaSettings=null,this._stream)for(let t of this._stream.getTracks())this._triggerEvent("TRACK_REPLACED",t)}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 D._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=D.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 D.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw p.audioEffects?.pause(),t(D.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else p.audioEffects?.pause(),t(D.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(y.log(k.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 Yi(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 Ti=class{constructor(){o(this,"_cameraPermissionStatus");o(this,"_microphonePermissionStatus");o(this,"_listener")}static isSupported(){return D.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 Zi=(u=>(u.WAITING_HALL="WAITING_HALL",u.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",u.WAITING="WAITING",u.CONNECTING="CONNECTING",u.CONNECTED="CONNECTED",u.RECONNECT="RECONNECT",u.ERROR="ERROR",u.HANGUP="HANGUP",u.PERMISSIONS="PERMISSIONS",u))(Zi||{});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 Dt(n){return n.slice()}var ia;(yl=>{function n(f,b,V){H("onLocalStream",f,Pe(b),V)}yl.onLocalStream=n;function r(f,b){H("onScreenStream",f,Pe(b))}yl.onScreenStream=r;function e(f,b){H("onVmojiStream",f,Pe(b))}yl.onVmojiStream=e;function t(f){H("onVmojiError",f)}yl.onVmojiError=t;function i(f,b){H("onLocalStreamUpdate",Pe(f),b)}yl.onLocalStreamUpdate=i;function a(f,b){d.debug("Local status:",f),H("onLocalStatus",f,b)}yl.onLocalStatus=a;function s(f,b,V){he("onRemoteStream",f,b,V)}yl.onRemoteStream=s;function c(f,b){he("onRemoteLive",f,b)}yl.onRemoteLive=c;function l(f,b){he("onLocalLive",f,b)}yl.onLocalLive=l;function u(f,b){he("onRemoteLiveUpdate",f,b)}yl.onRemoteLiveUpdate=u;function m(f,b){he("onLocalLiveUpdate",f,b)}yl.onLocalLiveUpdate=m;function h(f,b,V){he("onRemoteScreenStream",f,b,V)}yl.onRemoteScreenStream=h;function E(f,b){he("onRemoteVmojiStream",f,b)}yl.onRemoteVmojiStream=E;function P(f,b,V){he("onRemoteStreamSuspended",f,b,V)}yl.onRemoteStreamSuspended=P;function R(f,b,V,be,Pt,hi){he("onConversation",f,Pe(b),Pe(V),be,Pt,hi)}yl.onConversation=R;function W(f){f&&H("onConversationParticipantListChunk",f)}yl.onConversationParticipantListChunk=W;function $(f,b,V){he("onRemoteMediaSettings",f,Pe(b),V)}yl.onRemoteMediaSettings=$;function z(f,b){he("onLocalMediaSettings",f,Pe(b))}yl.onLocalMediaSettings=z;function Re(f,b,V){he("onRemoteSharedMovieInfo",f,Pe(b),V)}yl.onRemoteSharedMovieInfo=Re;function we(f,b,V){he("onRemoteSharedMovieStoppedInfo",f,Pe(b),V)}yl.onRemoteSharedMovieStoppedInfo=we;function ne(f,b,V){he("onLocalSharedMovieInfo",f,Pe(b),V)}yl.onLocalSharedMovieInfo=ne;function ie(f,b,V){he("onLocalSharedMovieStoppedInfo",f,Pe(b),V)}yl.onLocalSharedMovieStoppedInfo=ie;function J(f,b,V){he("onRemoteSharedUrl",f,b,V)}yl.onRemoteSharedUrl=J;function Wt(f,b,V){he("onParticipantAdded",f,b,V)}yl.onParticipantAdded=Wt;function xa(f,b,V){he("onParticipantJoined",f,b,V)}yl.onParticipantJoined=xa;function Na(f,b=!1){H("onLocalParticipantState",Pe(f),b)}yl.onLocalParticipantState=Na;function La(f,b,V){he("onRemoteParticipantState",f,Pe(b),V)}yl.onRemoteParticipantState=La;function pi(f,b){H("onRemoteParticipantsState",f,b)}yl.onRemoteParticipantsState=pi;function ui(f,b,V=null,be){d.debug("Remote status:",b,f),he("onRemoteStatus",f,b,V,be)}yl.onRemoteStatus=ui;function re(){H("onPermissionsRequested")}yl.onPermissionsRequested=re;function Ua(f,b){H("onPermissionsError",f,b)}yl.onPermissionsError=Ua;function Ba(f,b,V){he("onRemoteRemoved",f,b,V)}yl.onRemoteRemoved=Ba;function Z(f,b,V,be){H("onCallState",f,b,Pe(V),be)}yl.onCallState=Z;function Fa(f,b,V){H("onDeviceSwitched",f,b,V)}yl.onDeviceSwitched=Fa;function zr(f,b,V,be=!1,Pt=!1,hi=null,Xr=null,Os,$a,xs=null){let Ns=$a?Dt($a):void 0;H("onMuteStates",Pe(f),Dt(b),Dt(V),be,Pt,hi,Xr,Os,Ns,xs)}yl.onMuteStates=zr;function Jr(f,b,V=!1){he("onRolesChanged",f,Dt(b),V)}yl.onRolesChanged=Jr;function Yr(f,b=!1){H("onLocalRolesChanged",Dt(f),b)}yl.onLocalRolesChanged=Yr;function Va(f,b,V,be){he("onPinnedParticipant",f,b,V,be)}yl.onPinnedParticipant=Va;function ja(f,b){H("onLocalPin",f,b)}yl.onLocalPin=ja;function Qr(f){H("onOptionsChanged",Dt(f))}yl.onOptionsChanged=Qr;function Ha(f){H("onCallAccepted",f)}yl.onCallAccepted=Ha;function Ga(f,b,V){H("onIncomingCall",f,b,V)}yl.onIncomingCall=Ga;function Wa(f,b,V){he("onAcceptedCall",f,b,V)}yl.onAcceptedCall=Wa;function me(){H("onRateNeeded")}yl.onRateNeeded=me;function F(f,b){he("onSpeakerChanged",f,b)}yl.onSpeakerChanged=F;function ee(f){H("onVolumesDetected",Dt(f))}yl.onVolumesDetected=ee;function se(f,b){H("onLocalVolume",f,b)}yl.onLocalVolume=se;function fe(f,b){H("onJoinStatus",f,b)}yl.onJoinStatus=fe;function tt(f,b){H("onHangup",f,b)}yl.onHangup=tt;function g(f){H("onMultipartyChatCreated",Pe(f))}yl.onMultipartyChatCreated=g;function T(){H("onDeviceChange")}yl.onDeviceChange=T;function C(f){H("onFingerprintChange",f)}yl.onFingerprintChange=C;function S(){H("onTokenExpired")}yl.onTokenExpired=S;function M(f,b,V=!1){H("onChatMessage",f,b,V)}yl.onChatMessage=M;function w(f,b,V=!1){H("onCustomData",f,b,V)}yl.onCustomData=w;function K(f,b,V,be,Pt,hi,Xr=null){H("onRecordStarted",f,b,V,be,Pt,hi,Xr)}yl.onRecordStarted=K;function j(f=null,b){H("onRecordStopped",f,b)}yl.onRecordStopped=j;function q(f){H("onLocalNetworkStatusChanged",f)}yl.onLocalNetworkStatusChanged=q;function Te(f){H("onNetworkStatusChanged",f)}yl.onNetworkStatusChanged=Te;function N(f,...b){H("onDebugMessage",f,...b)}yl.onDebugMessage=N;function Ee(f,b){let V=Object.assign({},f,{memory:b});H("onStatistics",V)}yl.onStatistics=Ee;function _e(){H("onAutoplayError")}yl.onAutoplayError=_e;function De(f,b,V,be,Pt){H("onChatRoomUpdated",f,b,V,be,Pt)}yl.onChatRoomUpdated=De;function ge(f){H("onPromoted",f)}yl.onPromoted=ge;function xe(f){H("onRemoteMixedAudioStream",f)}yl.onRemoteMixedAudioStream=xe;function yt(f){H("onJoinLinkChanged",f)}yl.onJoinLinkChanged=yt;function Kt(f){H("onRoomsUpdated",f)}yl.onRoomsUpdated=Kt;function it(f,b,V,be){H("onRoomUpdated",f,b,V,be)}yl.onRoomUpdated=it;function mi(f){H("onRoomParticipantsUpdated",f)}yl.onRoomParticipantsUpdated=mi;function Ka(f){H("onRoomSwitched",f)}yl.onRoomSwitched=Ka;function ul(f){H("onRoomStart",f)}yl.onRoomStart=ul;function ml(f,b=null){H("onFeedback",f,b)}yl.onFeedback=ml;function hl(f){H("onFeaturesPerRoleChanged",f)}yl.onFeaturesPerRoleChanged=hl;function gl(f){H("onParticipantVmojiUpdate",f)}yl.onParticipantVmojiUpdate=gl;function _l(f,b){H("onAsrSet",f,b)}yl.onAsrSet=_l;function fl(f,b,V){H("onAsrStarted",f,b,V)}yl.onAsrStarted=fl;function Sl(f){H("onAsrStopped",f)}yl.onAsrStopped=Sl;function vl(f,b,V,be){H("onAsrTranscription",f,b,V,be)}yl.onAsrTranscription=vl;function Il(f,b){H("onParticipantIdChanged",f,b)}yl.onParticipantIdChanged=Il;function El(f){H("onVideoSuspendSuggest",f)}yl.onVideoSuspendSuggest=El;function Tl(f){H("onSignalingMessage",typeof f=="string"?f:Pe(f))}yl.onSignalingMessage=Tl;function Rl(f){H("onPromotionApproved",f)}yl.onPromotionApproved=Rl;function Cl(){H("onPeerRegistered")}yl.onPeerRegistered=Cl})(ia||(ia={}));var v=ia;var aa="_okcls_",zt=(()=>{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 qs(n){let r=zt?zt.getItem(aa+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function zs(n,r){try{zt&&zt.setItem(aa+n,JSON.stringify(r))}catch{}}function Js(n){zt&&zt.removeItem(aa+n)}var ra;(t=>{function n(i){return qs(i)||null}t.get=n;function r(i,a){zs(i,a)}t.set=r;function e(i){Js(i)}t.remove=e})(ra||(ra={}));var St=ra;var Yt=null,er=null,sr=null,cr=[],dr=[],or=[],ze=null,Je=null,lr=null,pr=!1,ur=!1,tr,Jt,ir,Ci=null,na=null,sa="",dn=null,rr=[],ar=null,ln=navigator.appVersion,Ys=navigator.appName,Be=navigator.userAgent,ot={},ft=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(ft||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(ft||(ft={}));var kt=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 l=ve.getMicrophones(),u,m;if(Je&&(m=Je.groupId,u=Je.deviceId),typeof r=="string")m=l.find(E=>E.deviceId===r)?.groupId,u=r;else if(!Je&&ve.os()==="MacOS"&&l.find(h=>h.label.includes("iPhone"))){let h=l.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,u=h.deviceId)}m&&this.supportedConstraints.groupId?s.groupId={exact:m}:u&&(s.deviceId={exact:u})}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 l=ve.getCameras(),u,m;if(ze&&(m=ze.groupId,u=ze.deviceId),typeof e=="string")m=l.find(E=>E.deviceId===e)?.groupId,u=e;else if(!ze&&ve.os()==="MacOS"&&l.find(h=>h.label.includes("iPhone"))){let h=l.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,u=h.deviceId)}m&&this.supportedConstraints.groupId?c.groupId={exact:m}:u&&(c.deviceId={exact:u}),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}},oa=class extends kt{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,ve.browserName()==="Safari"){let s=Number(ve.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})}},wt=class wt{constructor(){o(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(wt._lockId)throw y.log(k.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");wt._lockId=this._lockId}free(){wt._lockId===this._lockId&&(wt._lockId=0)}};o(wt,"_lockId",0);var mr=wt;async function pn(){ur=!1,pr=!1,Yt=null;let n={camera:ve.getSavedCamera(),microphone:ve.getSavedMicrophone(),output:ve.getSavedOutput()};await ca(),Qs("devicechange",n),v.onDeviceChange()}function Qs(n,...r){if(ot[n])for(let e of ot[n])e(...r)}async function ca(){return Yt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!er&&navigator.mediaDevices.addEventListener&&(er=I.debounce(pn,p.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",er)),!sr&&Ti.isSupported()&&(sr=new Ti,await sr.init((n,r)=>{switch(r){case"denied":case"prompt":er?.();break}})),Yt=navigator.mediaDevices.enumerateDevices().then(n=>{cr=n.filter(i=>i.kind==="videoinput"?(i.label&&(pr=!0),!0):!1),dr=n.filter(i=>i.kind==="audioinput"?(i.label?ur=!0:ve.isMobile()&&ve.browserName()==="Firefox"&&(ur=pr),!0):!1),or=n.filter(i=>i.kind==="audiooutput");let r=ze?.deviceId??St.get("videoinput"),e=Je?.deviceId??St.get("audioinput"),t=lr?.deviceId??St.get("audiooutput");return ze=cr.find(i=>i.deviceId===r)||null,Je=dr.find(i=>i.deviceId===e)||null,lr=or.find(i=>i.deviceId===t)||or[0]||null,Yt=Promise.resolve(n),n}).catch(()=>(Yt=null,[]))))}async function Xs(){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]);dn=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function Zs(n){if(ze&&Je)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=>{!Je&&e.kind==="audio"?Je=r(ve.getMicrophones(),e):!ze&&e.kind==="video"&&(ze=r(ve.getCameras(),e))})}async function Ri(n,r){d.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative()))),ve.releaseFirefoxMicrophonePermissionWarmup();let e=(!n.isVideo()||ve.hasCameraPermission())&&(!n.isAudio()||ve.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new mr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await pn(),Zs(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 Ri(n.simplify(),r);let a=r||oe.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function eo(){if(!(Ci||ve.browserName()!=="Firefox"||!navigator.mediaDevices?.getUserMedia))try{ve.hasMicrophonePermission()||v.onPermissionsRequested(),Ci=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(n){d.warn("Firefox microphone permission warmup failed",n)}}async function to(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new mr;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 nr(){return rr.length||(rr=(()=>{let n,r=!1,e=0,t="0",i=Be.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return n=/\brv[ :]+(\d+)/g.exec(Be),["IE",n&&n[1]||"Unknown",r,e,t];if(i[1]==="Safari"){if(n=Be.match(/\bEdge\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(n=Be.match(/\bCriOS\/(\d+)/),n)return["Chrome",n[1],!0,Number(n[1]),t];if(n=Be.match(/\bFxiOS\/(\d+)/),n)return["Firefox",n[1],!1,e,t];if(n=Be.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1],!1,e,t];if(n=Be.match(/\bOPT\/(\d+)/),n)return["Opera",n[1],!1,e,t]}if(i[1]==="Chrome"){if(r=!0,e=Number(i[2]),n=Be.match(/\bOPR\/(\d+)/),n)return["Opera",n[1]||"Unknown",r,e,t];if(n=Be.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1]||"Unknown",r,e,t];if(n=Be.match(/\bSferum\/((\d+)(?:\.\d+)*)/),n)return["Sferum",n[1]||"Unknown",r,e,t];if(n=Be.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=Be.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),n&&n[2]!==void 0&&(t=n[2]),[i[2]?i[1]:Ys,n&&n[1]||i[2]||ln,r,e,t]})()),rr}var ve;(me=>{async function n(){await ca(),await Xs()}me.init=n;function r(){return cr}me.getCameras=r;function e(){return dr}me.getMicrophones=e;function t(){return or}me.getOutput=t;function i(){return cr.length>0}me.hasCamera=i;function a(){return dr.length>0}me.hasMicrophone=a;function s(){return ze}me.getSavedCamera=s;function c(){return Je}me.getSavedMicrophone=c;function l(){return lr}me.getSavedOutput=l;function u(){return p.videoFacingMode}me.getVideoFacingMode=u;function m(){return pr}me.hasCameraPermission=m;function h(){return ur}me.hasMicrophonePermission=h;function E(){return sr?.getPermissionState("microphone")??null}me.getMicrophonePermissionState=E;function P(F=!1){return h()?i()&&F?m():!0:!1}me.hasPermissions=P;function R(){Ci&&(Mt(Ci),Ci=null)}me.releaseFirefoxMicrophonePermissionWarmup=R;async function W(F=!1,ee=!0,se=!0){!F&&!ee?await eo():me.releaseFirefoxMicrophonePermissionWarmup();let fe=a()&&ee,tt=i()&&F,g;if(!fe&&!tt)g=new MediaStream;else try{g=await Ri(new kt(fe,tt))}catch{g=new MediaStream}return!g.getVideoTracks().length&&se&&g.addTrack(me.getBlackMediaTrack()),!g.getAudioTracks().length&&se&&g.addTrack(me.getSilentMediaTrack()),g}me.getUserMedia=W;async function $(F,ee){let se=F&&!p.consumerFastScreenShare?p.fastScreenShareWidth:window.screen.width,fe=F&&!p.consumerFastScreenShare?p.fastScreenShareHeight:window.screen.height,tt=p.getScreenFrameRate(F);return to(new oa(se,fe,tt,ee))}me.getScreenMedia=$;async function z(F=!1,ee){let se=F?p.videoEffectMaxWidth:p.videoMaxWidth,fe=F?p.videoEffectMaxHeight:p.videoMaxHeight;return Ri(new kt(!1,!0,se,fe,ee))}me._getUserVideo=z;async function Re(F,ee){let se=ee?.width||p.videoMaxWidth,fe=ee?.height||p.videoMaxHeight;return Ri(new kt(!1,F||!0,se,fe))}me.getUserVideo=Re;async function we(F){return Ri(new kt(F||!0,!1))}me.getUserAudio=we;async function ne(F,ee){let[se]=F.getVideoTracks();if(!se)throw new Error("Video track not found in stream");return Yi(se,ee)}me.setResolution=ne;async function ie(F,ee){let fe=(await ca()).find(tt=>tt.kind===F&&tt.deviceId===ee);return fe?(F==="videoinput"?ze=fe:F==="audioinput"?Je=fe:F==="audiooutput"&&(lr=fe),St.set(F,ee),fe):null}me._saveDeviceId=ie;function J(){if(!ir||ir.readyState==="ended"){let F=me.getAudioContext(),ee=F.createMediaStreamDestination(),se=F.createGain();se.gain.value=1e-5,se.connect(ee),se.connect(F.destination);let fe=F.createOscillator();fe.type="sine",fe.frequency.value=0,fe.connect(se),fe.start(),ir=ee.stream.getAudioTracks()[0]}return Object.assign(ir.clone(),{enabled:!1})}me.getSilentMediaTrack=J;function Wt(F=p.videoMinWidth,ee=p.videoMinHeight){Jt||(Jt=document.createElement("canvas")),Jt.width=F,Jt.height=ee;let se=Jt.getContext("2d");return se.rect(0,0,F,ee),se.fillStyle="black",se.fill(),(!tr||tr.readyState==="ended")&&(tr=Jt.captureStream(p.videoFrameRate).getVideoTracks()[0]),Object.assign(tr.clone(),{enabled:!1})}me.getBlackMediaTrack=Wt;function xa(){if(Jr()==="Edge"&&Number(Yr())<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=xa;function Na(){return!!navigator.mediaDevices.getDisplayMedia}me.isScreenCapturingSupported=Na;function La(){let F=me.browserName()==="Safari"&&me.browserVersion()==="15"&&me.browserSubVersion()==="1",ee=me.browserName()==="Opera",se=me.browserName()==="Yandex";return F||ee||se}me.isBrokenH264Decoder=La;function pi(){return me.browserName()==="Yandex"&&me.os()==="Windows"||p.simulcast}me.isBrokenVP9Encoder=pi;function ui(){let F=me.browserName()==="Safari"&&Number(me.browserVersion())===17&&[4,5,6].includes(Number(me.browserSubVersion())),ee=me.os()==="Windows"&&me.osVersion()===10;return F||ee}me.isBrokenVP9Decoder=ui;function re(){return me.browserName()==="Firefox"&&Number(me.browserVersion())<60}me.isOldDataChannelDescription=re;function Ua(){return!(me.baseChromeVersion()&&me.isMobile())}me.canPreferH264=Ua;function Ba(){return!(me.browserName()==="Firefox"||me.browserName()==="Safari")}me.isSimulcastSupportedByBrowser=Ba;function Z(){return sa||(sa=(()=>{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 ee in F)if(Object.hasOwn(F,ee)&&F[ee].test(Be))return ee;return"Unknown"})()),sa}me.os=Z;function Fa(){return dn}me.osVersion=Fa;function zr(){return na===null&&(na=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(ln)),na}me.isMobile=zr;function Jr(){return nr()[0]}me.browserName=Jr;function Yr(){return nr()[1]}me.browserVersion=Yr;function Va(){return nr()[3]}me.baseChromeVersion=Va;function ja(){return ar||(ar=new(window.AudioContext||window.webkitAudioContext)),ar.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),ar}me.getAudioContext=ja;function Qr(){return nr()[4]}me.browserSubVersion=Qr;function Ha(){return me.baseChromeVersion()>=105&&!me.isMobile()}me.isAudioShareSupported=Ha;function Ga(F,ee){ot[F]||(ot[F]=[]),ot[F].push(ee)}me.addEventListener=Ga;function Wa(F,ee){if(ot[F])if(!ee)delete ot[F];else{let se=ot[F].indexOf(ee);se>-1&&ot[F].splice(se,1)}}me.removeEventListener=Wa})(ve||(ve={}));var D=ve;var We=class We{static get startTime(){return We._list[0]?.t||0}static get endTime(){let r=We._list;return r[r.length-1]?.t||0}static startSession(){We._list=[]}static get conversationId(){return We._conversationId}static set conversationId(r){We._conversationId=r}static add(r){We._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: ${D.hasCameraPermission()}, Mic: ${D.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=We._list;return r.length===0?[]:[...We._createContextLogs(),...r]}};o(We,"_list",[]),o(We,"_conversationId",null);var Ne=We;var hr=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 da=2*1024*1024,un=512*1024,Qt=100*1024,io=5,pa="_okcls_logs_session_",ro=3e4,ua=class{constructor(){o(this,"_items",[]);o(this,"_itemsSize",0);o(this,"_storageSize",da);try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(pa)!==0)continue;let t=r.getItem(e);if(!t){mn(e);continue}let i=gn(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(Qt)}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,da)}add(r,e){let t=parseInt(r.replace(pa,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(mn(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>da||this.length>io-1||this.size+r>this.available);)this.deleteOldestItem()}};function hn(){return`${pa}${Date.now()}`}function gn(n){return new Blob([n]).size}function mn(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function gr(){let n=vt.toString();if(!ke.available||!n)return;let r=gn(n);if(r>un){vt.bisect(),gr();return}ke.cleanup(Qt+r);try{window.localStorage.setItem(_r,n)}catch(e){if(console.warn("Failed to write log to storage",e),ke.storageSize=ke.size+r,ke.cleanup(Qt+r),ke.available>=Qt+r){gr();return}if(r>Qt){vt.bisect(),gr();return}ke.storageSize=0;return}r>un&&(ke.add(_r,r),_r=hn(),vt.clear(),ke.cleanup(Qt))}function ma(){!ke.available||!vt.length||gr()}function ao(n=!1){let r=[];try{let i=window.localStorage;for(let s of ke.items){let c=i.getItem(s.key);r.push(c)}let a=vt.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 no(e,t),t}function no(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 _n(n,r){if(!ke.available)return;let e=new Date,t={t:e.getTime(),l:n,d:r,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};vt.push(t),Ne.add(t),la||(la=window.setTimeout(()=>{la=null,ma()},ro))}function ha(){ke||(ke=new ua,vt=new hr,_r=hn(),window.addEventListener("beforeunload",ma))}var ke,vt,_r,la=null;window.__VKCallsSDKLogs__=(n=!1)=>(ke||ha(),ma(),ao(n));var _a=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(_a||{}),ga;(ne=>{let n="📞",r=(ie,...J)=>{v.onDebugMessage(ie,...J)},e=!1,t=(ie,J)=>(...Wt)=>{ie(...Wt),_n(J,Wt)},i=console.debug.bind(console,n),a=console.log.bind(console,n),s=console.warn.bind(console,n),c=console.error.bind(console,n),l=r.bind(null,"DEBUG"),u=r.bind(null,"LOG"),m=r.bind(null,"WARN"),h=r.bind(null,"ERROR");ne.debug=l,ne.log=u,ne.warn=m,ne.error=h;function $(){return e}ne.enabled=$;function z(ie){e=ie,p.debugLog&&ha(),ie?(ne.debug=p.debugLog?t(i,"DEBUG"):i,ne.log=p.debugLog?t(a,"LOG"):a,ne.warn=p.debugLog?t(s,"WARN"):s,ne.error=p.debugLog?t(c,"ERROR"):c):(ne.debug=p.debugLog?t(l,"DEBUG"):l,ne.log=p.debugLog?t(u,"LOG"):u,ne.warn=p.debugLog?t(m,"WARN"):m,ne.error=p.debugLog?t(h,"ERROR"):h)}ne.toggle=z;function Re(ie,...J){switch(ie){case"DEBUG":(0,ne.debug)(...J);break;case"LOG":(0,ne.log)(...J);break;case"WARN":(0,ne.warn)(...J);break;case"ERROR":(0,ne.error)(...J);break}}ne.send=Re;function we(ie,...J){}ne.test=we})(ga||(ga={}));var d=ga;var oo="kf";function Xt(n){return n.stopStream}function fa(n){return n.keyFrameRequested}function fn(n){if(Xt(n))return"ss";if(fa(n))return oo;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 Ot=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(Ot||{}),Sn="s",vn="m";function rt(n){return n.participantId+(n.mediaType?$t+Sn+n.mediaType:"")+(n.streamName?$t+vn+n.streamName:"")}function Zt(n){let r=n.split($t),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 Sn:t=co(c.slice(1));break;case vn:i=c.slice(1);break;case Ji: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 co(n){for(let r of Object.keys(Ot))if(r===n)return Ot[r];return null}function at(){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),lo(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 lo(n){return n.buffer!==void 0}function fr(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 In=0,En=1,po=2,uo=3,mo=4,ho=5,go=6,_o=7,fo=0,So=1,vo=2,ct=0,Io=0,Eo=0,To=1,Sr=class{constructor(){o(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=at();L.Int.enc(t,In),L.Int.enc(t,ct),L.Int.enc(t,r),L.Nil.enc(t,null);let i=[];for(let a in e)Object.hasOwn(e,a)&&this.writeLayout(e,a,i);return L.Arr.enc(t,i),L.Nil.enc(t,null),t.ui8array().buffer}writeLayout(r,e,t){let i=r[e],a=at();if(this.writeStreamDesc(e,a),Xt(i))L.Int.enc(a,So);else if(fa(i))L.Int.enc(a,vo);else if(L.Int.enc(a,fo),i.priority!==void 0?L.Int.enc(a,i.priority):L.Nil.enc(a,null),i.width!==void 0&&i.height!==void 0?(L.Int.enc(a,Math.round(i.width)),L.Int.enc(a,Math.round(i.height))):(L.Nil.enc(a,null),L.Nil.enc(a,null)),i.fit!==void 0)switch(i.fit){case"cv":L.Int.enc(a,Eo);break;case"cn":L.Int.enc(a,To);break;default:L.Nil.enc(a,null)}else L.Nil.enc(a,null);t.push(a.ui8array().buffer)}writeStreamDesc(r,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(r);if(t!==void 0){L.Int.enc(e,t);return}}L.Str.enc(e,r)}serializePerfStatReport(r,e){let t=at();return L.Int.enc(t,En),L.Int.enc(t,ct),L.Int.enc(t,r),L.Int.enc(t,e.framesDecoded),L.Int.enc(t,e.framesReceived),t.ui8array().buffer}serializeSharingStatReport(r,e){let t=at();return L.Int.enc(t,po),L.Int.enc(t,ct),L.Int.enc(t,r),L.Int.enc(t,e.minDelay),L.Int.enc(t,e.maxDelay),L.Int.enc(t,e.avgDelay),L.Int.enc(t,e.largeDelayDuration),t.ui8array().buffer}serializeRequestAsr(r,e){let t=at();return L.Int.enc(t,uo),L.Int.enc(t,ct),L.Int.enc(t,r),L.Bool.enc(t,e.request),t.ui8array().buffer}serializeNetworkStatReport(r,e){let t=at();return L.Int.enc(t,mo),L.Int.enc(t,ct),L.Int.enc(t,r),L.Int.enc(t,e.timestamp),L.Int.enc(t,e.sendBitrate),t.ui8array().buffer}serializeEnableVideoSuspend(r,e){let t=at();return L.Int.enc(t,ho),L.Int.enc(t,ct),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeEnableVideoSuspendSuggest(r,e){let t=at();return L.Int.enc(t,go),L.Int.enc(t,ct),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=at();L.Int.enc(t,_o),L.Int.enc(t,ct),L.Int.enc(t,r);let i=e.simulcastInfo.streams.length;L.Int.enc(t,e.mediaSource),L.Int.enc(t,i);for(let a of e.simulcastInfo.streams)L.Str.enc(t,a.rid),L.Int.enc(t,a.width),L.Int.enc(t,a.height),L.Int.enc(t,a.fps),L.Int.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 nn(r);e=fr(s)}else e=fr(r);let t=L.Int.dec(e),i=L.Int.dec(e);if(i!==ct){d.warn("Unsupported version for command type: "+t+", version "+i);return}if(L.Int.dec(e)!==Io){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case In:return this.deserializeUpdateDisplayLayoutResponse(e);case En:return this.deserializeReportPerfStatResponse(e);default:d.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(r){let e=L.Int.dec(r),t=L.Arr.dec(r),i={};return t.forEach(a=>{let s=fr(a),c=L.Any.dec(s);if(typeof c=="string")i[c]=L.Int.dec(s);else{let l=c,u=rt(this.participantIdRegistry?.getStreamDescription(l));i[u]=L.Int.dec(s)}}),{type:"response",sequence:e,response:x.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:i}}deserializeReportPerfStatResponse(r){let e=L.Int.dec(r),t=L.Int.dec(r);return{type:"response",sequence:e,response:x.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var Tn=(J=>(J.CALL_FINISH="call_finish",J.CODEC_USAGE="codec_usage",J.SIGNALING_CONNECTED="signaling_connected",J.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",J.FIRST_MEDIA_RECEIVED="first_media_received",J.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",J.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",J.CALL_START="call_start",J.SIGNALING_PING_SUMMARY="signaling_ping_summary",J.SIGNALING_COMMAND_SUMMARY="signaling_command_summary",J.WEBSOCKET_CONNECTED="websocket_connected",J.WEBSOCKET_RECONNECTED="websocket_reconnected",J.WEBSOCKET_FAILED_PINGS="websocket_failed_pings",J.WEBSOCKET_FAILED_EXCEPTION="websocket_failed_exception",J.WEBSOCKET_TIMEOUT="websocket_timeout",J.WEBSOCKET_RESTART="websocket_restart",J.WEBTRANSPORT_CONNECTED="webtransport_connected",J.WEBTRANSPORT_RECONNECTED="webtransport_reconnected",J.WEBTRANSPORT_FAILED_PINGS="webtransport_failed_pings",J.WEBTRANSPORT_FAILED_EXCEPTION="webtransport_failed_exception",J.WEBTRANSPORT_TIMEOUT="webtransport_timeout",J.WEBTRANSPORT_RESTART="webtransport_restart",J))(Tn||{}),Q=Tn;var Ro=1e3;function le(n,r,e=0){return r in n&&n[r]?n[r]:e}function Sa(...n){return r=>{for(let e of n)if(e(r))return!0;return!1}}function It(n,r){return e=>e[n]===r}function Co(n){return(r,e)=>e[n]-r[n]}function yi(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function Rn(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function Ia(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])?Ia(e[1]):e[1],r),{})}function Cn(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function yo(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(Cn).then(Rn)}function yn(n){let r=n.filter(It("type","candidate-pair")).sort(Co("priority")).find(Sa(It("nominated",!0),It("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(It("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(It("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}}),Ia(e)}function va(n,r,e=!1){let t=yi("id",n),i=e?n.filter(Sa(It("type","remote-inbound-rtp"))):n.filter(Sa(It("type","inbound-rtp"),It("type","outbound-rtp")));return D.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),l=a[s.ssrc].isRemote?s:a[s.ssrc];c.id=l.id,c.type=l.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,l=a.remoteId||a.trackId,u=a.type,m=a.codecId;if(!u||!s||!c)return null;let h={ssrc:s,type:u,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 R=le(a,"framesDecoded"),W=le(a,"totalInterFrameDelay"),$=le(a,"totalSquaredInterFrameDelay"),z=le(a,"encoderImplementation"),Re=le(a,"decoderImplementation");z&&(h.encoderImplementation=z),Re&&(h.decoderImplementation=Re),h.interframeDelayVariance=($-W*W/R)/R}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 R=t[m];h.clockRate=R.clockRate,h.mimeType=R.mimeType,c==="audio"&&R.sdpFmtpLine&&(h.sdpFmtpLine=R.sdpFmtpLine)}if(l&&t[l]){let R=t[l];h.frameHeight=R.frameHeight,h.frameWidth=R.frameWidth,h.framesDecoded=R.framesDecoded,h.framesReceived=R.framesReceived,h.framesDropped=R.framesDropped}return Ia(h)}).filter(a=>!!a)}function Pn(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=yi("ssrc",n?.remoteRtps||[]),i=yi("ssrc",r?.remoteRtps||[]));let a=yi("ssrc",n.rtps),s=yi("ssrc",r.rtps),c=(n.timestamp-r.timestamp)/1e3;return!a||!s||Object.keys(a).forEach(l=>{let u=a[l],m=s[l];if(!(!u||!m)){if(u.bytesReceived&&u.bytesReceived>m.bytesReceived&&(u.bandwidth=Math.round((u.bytesReceived-m.bytesReceived)/c),u.bandwidth+=Math.round((u.headerBytesReceived-m.headerBytesReceived)/c)),u.bytesSent&&u.bytesSent>m.bytesSent&&(u.bandwidth=Math.round((u.bytesSent-m.bytesSent)/c),u.bandwidth+=Math.round((u.headerBytesSent-m.headerBytesSent)/c)),u.packetsReceived)if(u.packetsReceived>m.packetsReceived||u.packetsLost>m.packetsLost){let h=u.packetsLost-m.packetsLost,E=u.packetsReceived-m.packetsReceived;u.packetLoss=parseFloat((100*h/(h+E)).toFixed(2))}else u.packetLoss=0;if(u.freezeCount>m.freezeCount&&(u.freezeCountDelta=u.freezeCount-m.freezeCount),u.totalFreezesDuration>m.totalFreezesDuration){let h=u.totalFreezesDuration-m.totalFreezesDuration;u.totalFreezesDurationDelta=h}if(u.framesDropped&&m.framesDropped&&u.framesDropped>m.framesDropped&&(u.framesDroppedDelta=parseFloat(((u.framesDropped-m.framesDropped)/c).toFixed(0))),e&&u.type==="outbound-rtp"&&u.kind==="video"){let h=t?.[l],E=i?.[l],P=$=>$??0,R=Math.max(0,P(h?.packetsLost)-P(E?.packetsLost)),W=Math.max(1,u.packetsSent-m.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(R/W*100)}}}}),n}async function bn(n,r,e={},t=!1){let i=await yo(n),a={timestamp:Date.now(),transport:yn(i),rtps:va(i,e)};return t&&(a.remoteRtps=va(i,e,!0)),r?Pn(a,r,t):(await I.delay(Ro),bn(n,a,e,t))}function Po(n){performance.clearMarks(n),performance.mark(n)}function bo(n){performance.clearMarks(n)}function Ao(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 Mo(n){return`${Q.SCREENSHARE_FIRST_FRAME}_${Do(n)}`}function Do(n){return typeof n=="string"?n:JSON.stringify(n)}var pe={distinctById:Rn,rtcStatsToArray:Cn,extractTransport:yn,extractRtps:va,delta:Pn,collectStats:bn,setMark:Po,clearMark:bo,measureMark:Ao,getMarkNameScreenshareFirstFrame:Mo};var Ye=class Ye{constructor(){o(this,"_eventualLogs",new Set)}static create(){Ye._instance=new Ye}static logCallStat(r){if(Ye._instance?._eventualLogs.size){for(let e of Ye._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}),y.logClientStats(e);Ye._instance._eventualLogs.clear()}y.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=pe.measureMark(r.name)),r.value!==null&&Ye._instance?._eventualLogs.add(r)}static destroy(){Ye._instance?._destroy(),Ye._instance=null}_destroy(){this._eventualLogs.clear()}};o(Ye,"_instance",null);var Ae=Ye;var Ea={connected:{wt:Q.WEBTRANSPORT_CONNECTED,ws:Q.WEBSOCKET_CONNECTED},reconnected:{wt:Q.WEBTRANSPORT_RECONNECTED,ws:Q.WEBSOCKET_RECONNECTED},failed_pings:{wt:Q.WEBTRANSPORT_FAILED_PINGS,ws:Q.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:Q.WEBTRANSPORT_FAILED_EXCEPTION,ws:Q.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:Q.WEBTRANSPORT_TIMEOUT,ws:Q.WEBSOCKET_TIMEOUT},restart:{wt:Q.WEBTRANSPORT_RESTART,ws:Q.WEBSOCKET_RESTART}};var Pi=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 vr=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 dt=class{constructor(){o(this,"count",0);o(this,"minVal",1/0);o(this,"maxVal",-1/0);o(this,"mean",new vr);o(this,"p50",new Pi(.5));o(this,"p95",new Pi(.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 An=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(An||{}),Me=An;var Mn=(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))(Mn||{}),U=Mn;var Dn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(Dn||{}),lt=Dn;var{isObject:wn,isObjectsEquals:wo}=I;function Ir(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||wn(n.bitrates)&&wn(r.bitrates)&&!wo(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function Er(n,r){return!(!Ir(n.camera,r.camera)||!Ir(n.screenSharing,r.screenSharing)||!Ir(n.fastScreenSharing,r.fastScreenSharing))}function Ta(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 kn(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Et=class Et{constructor(){o(this,"_codecUsages",new Map);o(this,"getCurrentTransportTopology",()=>{})}static create(r){let e=new Et;e.getCurrentTransportTopology=r,Et._instance=e}static reportUsage(r){let e=Et._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(l=>l.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 l=a.encoderImplementation,u=[c,"encoder",l].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:u,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:Q.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),y.logClientStats(e)}static destroy(){Et._instance?._destroy(),Et._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};o(Et,"_instance",null);var nt=Et;var xt=class extends de{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 On="videochat-epi",ko=5e3,Oo=500,Tt=class extends de{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(On)||"",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+ko<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+Oo<=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(On,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:Nn(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:Nn(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((u,m)=>(m.kind==="video"?(i=!0,m.framesReceived&&(u.jitter_video=u.jitter_video*u.inbound_video_count/(u.inbound_video_count+1)+m.jitter*1e3/(u.inbound_video_count+1),u.interframe_delay_variance=u.interframe_delay_variance*u.inbound_video_count/(u.inbound_video_count+1)+(m.interframeDelayVariance||0)*1e6/(u.inbound_video_count+1),u.inbound_video_count++),u.frames_dropped+=m.framesDropped||0,u.nack_sent+=m.nackCount,u.pli_sent+=m.pliCount,u.fir_sent+=m.firCount,u.freeze_count+=m.freezeCountDelta||0,u.total_freezes_duration+=m.totalFreezesDurationDelta||0):(a=!0,m.totalSamplesReceived&&(u.jitter_audio=u.jitter_audio*u.inbound_audio_count/(u.inbound_audio_count+1)+m.jitter*1e3/(u.inbound_audio_count+1),u.total_audio_energy=u.total_audio_energy*u.inbound_audio_count/(u.inbound_audio_count+1)+(m.totalAudioEnergy||0)/(u.inbound_audio_count+1),u.inbound_audio_count++),u.total_audio_samples_received+=m.totalSamplesReceived||0,u.inserted_audio_samples_for_deceleration+=m.insertedSamplesForDeceleration||0,u.removed_audio_samples_for_acceleration+=m.removedSamplesForAcceleration||0,u.concealed_audio_samples+=m.concealedSamples||0,u.silent_concealed_audio_samples+=m.silentConcealedSamples||0,u.audio_concealment_events+=m.concealmentEvents||0),u),t),e.outbound.rtps.reduce((u,m)=>(m.kind==="video"?(u.nack_received+=m.nackCount,u.pli_received+=m.pliCount,u.fir_received+=m.firCount,u.packets_sent_video+=m.packetsSent):u.packets_sent_audio+=m.packetsSent,u),t),e.remoteInbound.rtps.reduce((u,m)=>(m.kind==="video"?u.packets_lost_video+=m.packetsLost:u.packets_lost_audio+=m.packetsLost,u),t);this._screenShareStats.length;){let u=this._screenShareStats.pop();u?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=u.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&&!Tr(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!Tr(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!Tr(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&&!Tr(t.total_audio_samples_received)){let u=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),R=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=Nt(m/u*1e3),s.removed_audio_samples_for_acceleration=Nt(h/u*1e3),s.concealed_audio_samples=Nt(E/u*1e3),s.concealed_silent_audio_samples=Nt(P/u*1e3),s.concealment_audio_avg_size=Nt(E/R),s.total_audio_energy=t.total_audio_energy}xn(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),xn(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),l=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(c>0){let u=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=Nt(u/c*100)}if(l>0){let u=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=Nt(u/l*100)}Ae.logCallStat(s),p.enableLogPerfStatReport&&d.log("Sent call stats",s),this._previousCallStatReport=t}};function xn(n,...r){for(let e of r)if(!Object.hasOwn(n,e)||n[e]===void 0)return!1;return!0}function Nn(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function Tr(n){return n===void 0}function Nt(n){return Number.isNaN(n)?0:n}var Ai=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 Ln=.25,Un=.35,xo=85,No=.1,Lo=1.5,Uo=.1,Bo=1,Fo=.6,Vo=.3;var Mi=class extends de{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 Ai(Ln,Ln),loss:new Ai(Un,Un),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)/xo);for(let s=0;s<a;s++)i*=1-No;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)/Lo);for(let s=0;s<a;s++)i*=1-Uo;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*Bo;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>=Fo?"good":e>=Vo?"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(),l=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),u=Math.max(Math.round(l*10)/10,.1),m=this._getNetworkState(u);(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",u)}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 jo=30*1e3,Di=class n extends xt{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 Tt(this,i,!0),this._directStatReporter=new Mi(i),this.subscribe(this._signaling,Me.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,lt.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){y.log(k.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){y.log(k.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){Er(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 U.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case U.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case U.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 y.log(k.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 y.log(k.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;case"connected":case"completed":D.browserName()==="Safari"&&this._pc?.connectionState!=="connected"&&this._markConnected();break}}_markConnected(){this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),this._pc&&I.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(y.log(k.ICE_CONNECTION_TYPE,e.local.type),d.debug("Selected ICE candidates",e))}),this._startStatInterval()}_onConnectionStateChange(){switch(d.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),y.log(k.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._markConnected();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?(y.log(k.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}),y.log(k.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}),y.log(k.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}),y.log(k.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}),y.log(k.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}),y.log(k.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!D.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,p.preferH264&&D.canPreferH264(),D.isBrokenH264Decoder(),p.preferVP9,t&&p.audioNack),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,p.preferVP9,D.isBrokenVP9Encoder(),D.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}),y.log(k.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,nt.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(l=>l.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:D.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(l){return d.warn("Failed to get encodingInfo",c,l),!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,l="L1T1";if(a?(this._lastBadConnection=Date.now(),s?(c=this._videoMaxDimensionsForNet.bad,l="L1T2"):(c=this._videoMaxDimensionsForNet.worst,l="L1T3")):i&&(c=this._videoMaxDimensionsForNet.good,l="L1T1"),!(c<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>jo)||this._lastVideoMaxDimension===c)return;let m=this._serverSettings.camera;if(!m||!await this._isSVCSupported(e,l))return;d.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:l,averageNetStat:t,nextVideoMaxDimension:c}),this._lastVideoMaxDimension=c;let E={...this._serverSettings,camera:{...m,scalabilityMode:l,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.mediaSettings.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 Bn=(t=>(t.AUDIO_MIX="audio-mix",t.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",t.TRANSPARENT_AUDIO_TRACK_PREFIX="ta",t))(Bn||{}),Le=Bn;var Ho=16,Cr=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),l=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:a,ssrc:s,timestamp:c,duration:l,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 Rt=class Rt{constructor(){o(this,"_value",1)}get value(){return this._value}set value(r){this._value=r}};o(Rt,"_instance",null),o(Rt,"getInstance",()=>(Rt._instance||(Rt._instance=new Rt),Rt._instance));var ei=Rt;var pt=require("messagepack");var yr=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=(0,pt.decode)(i);return Object.entries(a).forEach(([P,R])=>{let W=Zt(P);this.streamDescriptionByCompactId.set(R,W),this.compactIdByStreamDescription.set(P,R)}),null;case 2:case 4:let s=(0,pt.decode)(i),c=[];for(let P of s){let R=this.getStreamDescription(P);R&&c.push(R.participantId)}return t===2?{type:"notification",notification:U.AUDIO_ACTIVITY,activeParticipants:c}:{type:"notification",notification:U.STALLED_ACTIVITY,stalledParticipants:c};case 3:let l=(0,pt.decode)(i);return{type:"notification",notification:U.SPEAKER_CHANGED,speaker:this.getStreamDescription(l)?.participantId};case 5:let u=(0,pt.decode)(i);return{type:"notification",notification:U.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:u[0],maxDimension:u[1]},mediaType:this._decodeMediaType(u[2])};case 6:let m=(0,pt.decode)(i),h={};for(let[P,R]of Object.entries(m)){let W=this.getStreamDescription(Number(P))?.participantId;W&&(h[W]=R/100)}return{type:"notification",notification:U.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let R=(0,pt.decode)(i).map(W=>{let[$,z,Re,we,ne,ie,J]=W;return{participantId:this.getStreamDescription($)?.participantId,gain:z,pause:Re,offset:we,mute:ne,liveStatus:ie,startTimeMs:J}});return{type:"notification",notification:U.MOVIE_UPDATE_NOTIFICATION,data:R}}case 9:let E=(0,pt.decode)(i);return{type:"notification",notification:U.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=(0,pt.decode)(r),t=[];for(let[i,a]of Object.entries(e)){let s=a[0],c=a[1],l=a[2],u=!!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(l===null){d.error("unexpected null sequenceNumber",i,a);continue}let E=Le.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,P=c?c>>>0:null;t.push({participantStreamDescription:h,streamId:E,rtpTimestamp:P,sequenceNumber:l,fastScreenShare:u,suspend:m})}return{type:"notification",notification:U.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var Ra=_i(require("@vkontakte/libvpx"));var Qe=class{constructor(){o(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,c)=>{let l=t.join(","),u=new Blob([r,`exports.default(${l});`],{type:"application/javascript; charset=utf-8"}),m=window.URL.createObjectURL(u);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":y.log(k.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 wi=class extends Qe{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)}},[Ra.default,Ra.default.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 ut=class extends Qe{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())},[D.baseChromeVersion()>=92||D.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&&!D.isBrokenVP9Decoder()&&D.browserName()!=="Firefox"}};var Ut=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}};var Fn=require("bit-buffer");var br=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&&Ae.logEventualStat({name:Q.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Go=65536,Ca="MARK_SCREENSHARE_FREEZE_DURATION",ti=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 br(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(Ca),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 Fn.BitStream(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(Ca);return}let e=pe.measureMark(Ca);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Bt=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 ii=class extends Bt{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:l}=e,u=s*c*4;if(l.byteLength!==u){d.warn("Bad frame buffer",{w:s,h:c,got:l.byteLength,expected:u});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)&&!(D.browserName()==="Safari"&&Number(D.browserVersion())===15)&&!(D.browserName()==="Firefox"&&Number(D.browserVersion())<60)}};var Ft=class extends Bt{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&&ut.isBrowserSupported()}};var ki=class extends ti{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 Ut(e=>d.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Ft.isBrowserSupported()?this._renderer=new ii(this._onStream):this._renderer=new Ft(this._onStream)}_initDecoder(e=!1){e||!ut.isBrowserSupported()?this._decoder=new wi:this._decoder=new ut;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 ut&&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 ii.isBrowserSupported()||Ft.isBrowserSupported()}};function Vn(n,r,e,t,i,a,s){let c=0;r&&(c|=1),e&&(c|=2),t&&(c|=4),s||(c|=8);let l=new ArrayBuffer(11),u=new DataView(l);if(u.setUint8(0,1),u.setUint16(1,i),u.setUint32(3,n),u.setUint8(7,a?1:0),u.setUint16(8,0),u.setUint8(10,c),!s)return l;let m=new Uint8Array(l.byteLength+s.byteLength);return m.set(new Uint8Array(l),0),m.set(new Uint8Array(s),l.byteLength),m.buffer}function jn(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),l=!!(c&1),u=!!(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:l,end:u,keyframe:m,sequence:t,isVP9:a,ssrc:s,eos:h,data:n.slice(11)}}function Hn(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 Gn(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 Wn(n){let r=new ArrayBuffer(4),e=new DataView(r);return e.setUint8(0,1),e.setUint8(1,1),e.setUint16(2,n),r}var O=_i(require("simple-ebml-builder"));var Wo=2**15-1,ya=1,Ko=5,$o=5;var Pa=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)-Ko);i-t>$o&&(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}},ri=class n extends ti{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(ya)),O.element(O.ID.TrackUID,O.number(ya)),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 Pa(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 l=n._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(l)}let a=Math.round(i-this._clusterStartTime);if(a>Wo&&(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(ya),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 Oi=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=jn(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&&ri.isBrowserSupported()?i=new ri(t,a,this._onStat):i=new ki(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=Wn(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 ba=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}},xi=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 ba(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):""}};var Aa=_i(require("@vkontakte/libvpx"));var qo=1e3,ai=class extends Qe{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=l=>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
|
-
|
|
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 zo=2100,Jo=600,Yo=1.2,Kn=.8,Qo=2e3,Xo=8e3,Ma=8e3,Zo=16e3,ec=4,tc=2e3,Ar=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Ar||{}),Ni=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=zo,a&&(this._highDelayThreshold=Jo),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let l=Date.now();this._lastDown=0,this._lastUp=l,this._lastProbing=l,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),l=s>40&&c>30&&this._delayAvgShort>this._trendDelayThreshold,u=this._delayAvgShort>this._highDelayThreshold;l||u?a=2:Math.abs(s)<40&&c<10&&!u&&(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} -> ${Ar[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>Qo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,ec),this._probing=!1);let z=Kn*h*1e3;if(z>=this._targetBitrate&&(z=this._targetBitrate*Kn),z=Math.max(z,this._minBitrate),z<this._targetBitrate){let Re=Math.round(z/1e3),we=Math.round(this._upPenalty*Ma/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Ar[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Re} penalty=${we}s`),this._setBitrate(z,!0),this._targetBitrate=z}this._lastDown=i}let P=i-this._lastUp,R=Xo+this._upPenalty*Ma;if(a===1&&P>R&&E>R){let z=Math.min(this._targetBitrate*Yo,this._maxBitrate);if(z>this._targetBitrate){let Re=Math.round(z/1e3),we=Math.round(this._targetBitrate/1e3),ne=Math.round(this._upPenalty*Ma/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Ar[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${we} -> newBitrate=${Re} penalty=${ne}s`),this._setBitrate(z,!1),this._targetBitrate=z,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let W=i-this._lastProbing;this._probing&&W>Zo&&(this._probing=!1);let $=i-this._lastDown;this._upPenalty>0&&$>3*R&&(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>tc){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 Li=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 l=this._buffer[s];if(!l||(a===-1&&(a=l.ts2,t=0),a>=0&&(t+=l.size),i=l.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 l=i-t;r=l>0?e*8/l: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 Da=65536,rc=50,ac=400,nc=1e6,sc=3e5,oc=3e4,cc=2e3,dc=5,Mr=0,Ui=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 Li(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 xi);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),l=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 Ni(l,s,c,this._congestionControlEnabled,this._fastSharing,p.screenShareCongestionControlThreshold,a);let u=(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(Vt.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Vt(r,u,this._congestionControlEnabled,c,m,a)}else this._encoder=new ai(r,u,this._congestionControlEnabled,c);this._datachannel.onmessage=m=>{Hn(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Gn(m.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(m=>d.warn("ScreenCaptureSender init failed",m)),this._fpsMeter=new Ut(m=>d.log(`[ScreenCaptureSender] fps: ${m}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Da)%Da>dc&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>cc&&(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 xi;for(let a=0;a<t;a+=this.DATA_SIZE){let s=r.data.slice(a,a+this.DATA_SIZE),c=a===0,l=t<=a+s.byteLength,u=this._wrapHeader(r.timestamp,c,l,e,s);i.push({data:u.data,sequence:u.sequence,frameSize:t,isFirst:c,isLast:l,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=Vn(r,e,t,i,Mr,this._encoder.isVP9(),a),c={sequence:Mr,data:s};return Mr=(Mr+1)%Da,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 Vt.isBrowserSupported()||ai.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(sc,Math.min(nc,Math.round(t*rc))),a=Math.round(t*ac);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>oc){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var lc=90,pc=4294967295,Bi=class n extends xt{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,"_producerNextSessionId",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,Me.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){Er(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&&D.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new Tt(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 yr,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,lt.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,lt.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)}),this._createDataChannel(this._pc,lt.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),p.asrDataChannel&&this._createDataChannel(this._pc,lt.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new Cr(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),p.vmoji&&this._createDataChannel(this._pc,lt.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),y.log(k.ERROR,"addTrack-single"),this.close(t);return}this._createDataChannel(this._pc,lt.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&(!p.consumerFastScreenShare||!this._mediaSource.mediaSettings.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)|(?:${Le.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Le.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.mediaSettings;!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Ui(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Oi(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(D.getBlackMediaTrack()).catch(l=>{d.error("Could not disable video upload",l)});return}let c=this._mediaSource.getSendVideoTrack();if(!a&&s&&c){d.log("Enabling video upload"),this._disabledSenders.delete(i);let l=i.track;l.enabled=c.enabled,i.replaceTrack(c).then(()=>l.stop()).catch(u=>{d.error("Could not enable video upload",u)})}I.applyVideoTrackSettings(e,i,c??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.mediaSettings.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.mediaSettings.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),nt.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=Le.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:Tt.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&&D.isSimulcastSupportedByBrowser(),consumerFastScreenShare:p.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:p.consumerFastScreenShareQualityOnDemand,transparentAudio:p.transparentAudio};!p.videoTracksCount&&!this._observer&&d.warn("Setting videoTracksCount to 0 is deprecated"),this._signaling.allocateConsumer(null,e)}async _processOffer(e,t){if(!this._pc)throw new Error("Interrupt allocation");let i=p.simulcast&&D.isSimulcastSupportedByBrowser(),a=i;try{await this._pc.setRemoteDescription(e)}catch(l){throw d.error("[single] unable to set remote offer",l),y.log(k.ERROR,"setRemoteDescription-single"),l}let s=this._findFirstSimTransceiver();if(i)if(s){d.log(`_processOffer: caps.simulcast=${p.simulcast} mid=${s.mid} dir=${s.direction}`);let l=this._mediaSource.getStream(),u=await this._setupSimulcastTransceiver(l,s);d.log("_processOffer: simulcastInfo",u),u||(d.log(`_processOffer: simulcast transceiver not found in server offer mid=${s.mid}, disable simulcast`),a=!1)}else d.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),a=!1;let c;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");c=await this._pc.createAnswer()}catch(l){throw d.error("[single] unable to create answer",l),y.log(k.ERROR,"createAnswer-single"),l}try{if(!this._pc)throw new Error("Interrupt allocation");c.sdp=I.patchLocalSDP(c.sdp,!1,D.isBrokenH264Decoder(),!1),d.debug("[single] set local answer",{answer:c}),await this._pc.setLocalDescription(c)}catch(l){throw d.error("[single] unable to set local answer",l),y.log(k.ERROR,"setLocalDescription-single"),l}if(a&&s){c.sdp=I.patchSimulcastAnswerSdp(c.sdp,s,_t.WIDTH,_t.HEIGHT);for(let l of this._pc.getTransceivers())l.mid===null&&l.stop()}try{d.debug("[single] transmit local answer",{answer:c}),this._updateSSRCMap(e),await this._signaling.acceptProducer(c,Object.keys(this._ssrcMap),t),d.debug("[single] remote offer has been processed")}catch(l){d.warn("[single] unable to send local answer",l),y.log(k.ERROR,"acceptProducer")}a&&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=vi(_t.WIDTH,_t.HEIGHT,this._serverSettings.camera?.bitrates?.generic),c=0,l=1;for(let m of a.encodings)m.scalabilityMode=Si,m.active=!0,c>=s.streams.length?m.maxBitrate=0:m.maxBitrate=s.streams[c].bitrate,m.scaleResolutionDownBy=l,l=l*2,c++;await t.sender.setParameters(a);let u=i.getSettings();return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${u.width}x${u.height} encodings=${JSON.stringify(a.encodings)}`),!0}async _acceptProducer(e,t){if(this._producerOfferIsProcessing){this._producerNextOffer=e,this._producerNextSessionId=t,d.debug("[single] wait until other remote offer is processed");return}this._producerOfferIsProcessing=!0;let i={type:"offer",sdp:I.patchRemoteSDP(e,D.isOldDataChannelDescription(),!1,!1,!1,D.isBrokenVP9Encoder(),D.isBrokenVP9Decoder())};if(d.debug("[single] set remote offer",{offer:i}),!this._pc)throw new Error("Interrupt allocation");try{if(await this._processOffer(i,t),this._producerOfferIsProcessing=!1,this._producerNextOffer&&this._producerNextSessionId){d.debug("[single] there is other unprocessed remote offer, process it");let a=this._producerNextOffer,s=this._producerNextSessionId;this._producerNextOffer=null,this._producerNextSessionId=null,await this._acceptProducer(a,s)}}catch(a){this.close(a)}}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),y.log(k.ERROR,"replaceTrack-single")}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case U.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case U.REALLOC_CON:this._reconnect();break;case U.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case U.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case U.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case U.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,e.sessionId)}_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),y.log(k.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(y.logCustom(k.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&&(y.log(k.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))}),y.logCustom(k.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),y.log(k.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),p.simulcast&&D.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.mediaSettings.isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return y.log(k.PAT_WAITING_TIME_ERROR,"noConnection"),d.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return y.log(k.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 y.log(k.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 y.log(k.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),d.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${c}`),0;let l=t-c&pc,u=Math.ceil(l/lc);return Math.min(100,Math.max(0,u))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.mediaSettings.isVideoEnabled,a=this._findFirstSimTransceiver();if(!p.simulcast||!D.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let c=s.getVideoTracks()[0],l=c.getSettings().width,u=c.getSettings().height,m=vi(l,u,this._serverSettings.camera?.bitrates?.generic),h=t||!rn(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: ${l}x${u} command: ${JSON.stringify(m)} `),e){let P=0;for(let R of E.encodings)R.scaleResolutionDownBy=qi(R.rid),R.scalabilityMode=Si,P>=m.streams.length?(R.maxBitrate=0,R.active=!1):(R.active=!0,R.maxBitrate=m.streams[P].bitrate),P++;await a.sender.setParameters?.(E).catch(R=>{d.error("Failed to set sender parameters",E,R)}),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=ei.getInstance().value;if(!this._mediaSource.mediaSettings.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
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("webrtc-adapter");c=s(c);let l=require("messagepack"),u=require("fflate");u=s(u);let d=require("@vkontakte/libvpx");d=s(d);let f=require("bit-buffer"),p=require("simple-ebml-builder");p=s(p);var m=class{log(e,t,n=!1){}destroy(){}};function h(e){"@babel/helpers - typeof";return h=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},h(e)}function ee(e,t){if(h(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(h(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function te(e){var t=ee(e,`string`);return h(t)==`symbol`?t:t+``}function g(e,t,n){return(t=te(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var _=class{constructor(){g(this,`_handlers`,{}),g(this,`_listeners`,[])}_triggerEvent(e,...t){if(Object.hasOwn(this._handlers,e))for(let n of this._handlers[e])n.apply(this,t)}addEventListener(e,t){if(typeof t!=`function`)throw Error(`Listener should be a function`);return Object.hasOwn(this._handlers,e)||(this._handlers[e]=[]),this._handlers[e].push(t),{dispose:this.removeEventListener.bind(this,e,t)}}removeEventListener(e,t){if(!Object.hasOwn(this._handlers,e))return;t||delete this._handlers[e];let n=this._handlers[e].indexOf(t);n>=0&&this._handlers[e].splice(n,1)}subscribe(e,t,n){let r=e.addEventListener(t,n);this._listeners.push(r)}unsubscribe(){this._listeners.forEach(e=>{e.dispose()})}},ne=class extends _{constructor(...e){super(...e),g(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}setConversationId(e){}readyToSend(e=!0){}cleanup(){}requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}},v=function(e){return e.CANCELED=`CANCELED`,e.REJECTED=`REJECTED`,e.REMOVED=`REMOVED`,e.HUNGUP=`HUNGUP`,e.MISSED=`MISSED`,e.BUSY=`BUSY`,e.FAILED=`FAILED`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.KILLED=`KILLED`,e.BANNED=`BANNED`,e.HAS_ACTIVE_CALL=`HAS_ACTIVE_CALL`,e.CALLER_IS_BLOCKED=`CALLER_IS_BLOCKED`,e.NOT_FRIENDS=`NOT_FRIENDS`,e.CALLEE_IS_OFFLINE=`CALLEE_IS_OFFLINE`,e.CALLER_IS_REJECTED=`CALLER_IS_REJECTED`,e.UNKNOWN_ERROR=`UNKNOWN_ERROR`,e.UNSUPPORTED=`UNSUPPORTED`,e.OLD_VERSION=`OLD_VERSION`,e.SERVICE_DISABLED=`SERVICE_DISABLED`,e.SERVICE_UNAVAILABLE=`SERVICE_UNAVAILABLE`,e.EXTERNAL_API_ERROR=`EXTERNAL_API_ERROR`,e.SOCKET_CLOSED=`SOCKET_CLOSED`,e.ENDED=`ENDED`,e.KILLED_WITHOUT_DELETE=`KILLED_WITHOUT_DELETE`,e.ANOTHER_DEVICE=`ANOTHER_DEVICE`,e.NOT_FOUND=`NOT_FOUND`,e.VCHAT_DETAILED_ERROR=`VCHAT_DETAILED_ERROR`,e.TIMEOUT=`TIMEOUT`,e.PARTICIPANT_LIMIT_REACHED=`PARTICIPANT_LIMIT_REACHED`,e.FAST_START_ERROR=`FAST_START_ERROR`,e.FAST_JOIN_ERROR=`FAST_JOIN_ERROR`,e.CALL_TIMEOUT=`CALL_TIMEOUT`,e}(v||{}),y=class e extends Error{constructor(t,n){super(),g(this,`message`,void 0),g(this,`hangup`,void 0),g(this,`error`,void 0),g(this,`code`,void 0),g(this,`remote`,void 0),g(this,`custom_error`,void 0),this.name=`HangupReason`,this.code=n&&n.code||0,this.remote=n&&n.remote||!1,this.custom_error=n?.custom_error??null,Object.values(v).indexOf(t)>-1?this.hangup=t:this.error=t;let r=[];this.error&&r.push(`error`),this.remote&&r.push(`remote`),this.code&&r.push(`code: ${this.code}`),n&&n.message&&r.push(`message: '${n.message}'`),this.message=t+(r.length?` (${r.join(`, `)})`:``),Error.captureStackTrace&&Error.captureStackTrace(this,e)}},b=function(e){return e.RECOVER=`recover`,e.ACCEPT_CALL=`accept-call`,e.ADD_PARTICIPANT=`add-participant`,e.REMOVE_PARTICIPANT=`remove-participant`,e.HANGUP=`hangup`,e.TRANSMIT_DATA=`transmit-data`,e.ACCEPT_PRODUCER=`accept-producer`,e.ALLOCATE_CONSUMER=`allocate-consumer`,e.CHANGE_MEDIA_SETTINGS=`change-media-settings`,e.CHANGE_PARTICIPANT_STATE=`change-participant-state`,e.CHANGE_STREAM_PRIORITIES=`change-streams-priorities`,e.UPDATE_DISPLAY_LAYOUT=`update-display-layout`,e.REPORT_PERF_STAT=`report-perf-stat`,e.REPORT_SHARING_STAT=`report-sharing-stat`,e.REPORT_NETWORK_STAT=`report-network-stat`,e.RECORD_START=`record-start`,e.RECORD_STOP=`record-stop`,e.RECORD_PUBLISH=`record-publish`,e.RECORD_SET_CONF=`record-set-conf`,e.RECORD_GET_STATUS=`record-get-status`,e.SWITCH_MICRO=`switch-micro`,e.SWITCH_TOPOLOGY=`switch-topology`,e.REQUEST_REALLOC=`request-realloc`,e.CHAT_MESSAGE=`chat-message`,e.CHAT_HISTORY=`chat-history`,e.CUSTOM_DATA=`custom-data`,e.GRANT_ROLES=`grant-roles`,e.MUTE_PARTICIPANT=`mute-participant`,e.ENABLE_FEATURE_FOR_ROLES=`enable-feature-for-roles`,e.PIN_PARTICIPANT=`pin-participant`,e.UPDATE_MEDIA_MODIFIERS=`update-media-modifiers`,e.CHANGE_OPTIONS=`change-options`,e.GET_WAITING_HALL=`get-waiting-hall`,e.GET_PARTICIPANT_LIST_CHUNK=`get-participant-list-chunk`,e.GET_PARTICIPANTS=`get-participants`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.REQUEST_TEST_MODE=`request-test-mode`,e.ADD_MOVIE=`add-movie`,e.UPDATE_MOVIE=`update-movie`,e.REMOVE_MOVIE=`remove-movie`,e.START_URL_SHARING=`start-url-sharing`,e.STOP_URL_SHARING=`stop-url-sharing`,e.GET_ROOMS=`get-rooms`,e.UPDATE_ROOMS=`update-rooms`,e.ACTIVATE_ROOMS=`activate-rooms`,e.REMOVE_ROOMS=`remove-rooms`,e.SWITCH_ROOM=`switch-room`,e.FEEDBACK=`feedback`,e.ASR_START=`asr-start`,e.ASR_STOP=`asr-stop`,e.REQUEST_ASR=`request-asr`,e.REQUEST_PROMOTION=`request-promotion`,e.ACCEPT_PROMOTION=`accept-promotion`,e.GET_HAND_QUEUE=`get-hand-queue`,e.ENABLE_VIDEO_SUSPEND=`enable-video-suspend`,e.ENABLE_VIDEO_SUSPEND_SUGGEST=`enable-video-suspend-suggest`,e.HOLD=`hold`,e.PUT_HANDS_DOWN=`put-hands-down`,e.CHANGE_SIMULCAST=`change-simulcast`,e}(b||{}),re=25*1024*1024,ie=10,ae=`_okcls_logs_session_`,oe=3e4,se=`ok-calls-sdk-debug-logs`,ce=1,x=`sessions`,le=`chunks`,ue=120*1e3,de=new Set([`WARN`,`ERROR`]);function fe(){return`${Date.now()}_${Math.random().toString(36).slice(2)}`}function pe(){let e=fe();return me(e),e}function me(e){Ge.has(e)||Ge.set(e,[]),Ke.has(e)||Ke.set(e,0),qe.has(e)||qe.set(e,null)}function he(e){return qe.get(e)??null}function ge(e){let t=Ke.get(e)??0;return Ke.set(e,t+1),t}function _e(e,t){return`${e}:${String(t).padStart(12,`0`)}`}function ve(e){return new Blob([e]).size}function ye(){try{let e=window.localStorage;for(let t of Object.keys(e))t.indexOf(ae)===0&&e.removeItem(t)}catch(e){console.error(`Storage is blocked`,e)}}var S=new class{constructor(){g(this,`_db`,null),g(this,`_dbPromise`,null),g(this,`_supported`,this.isSupported())}get supported(){return this._supported}open(){return this.isSupported()?(this._dbPromise||(this._dbPromise=new Promise(e=>{let t=window.indexedDB.open(se,ce);t.onupgradeneeded=()=>{this.createSchema(t.result)},t.onsuccess=()=>{this._db=t.result,this._supported=!0,this._db.onversionchange=()=>{this.close()},e(this._db)},t.onerror=()=>{console.warn(`Failed to open debug log storage`,t.error),this._supported=!1,this._dbPromise=null,e(null)},t.onblocked=()=>{console.warn(`Debug log storage opening is blocked`)}})),this._dbPromise):(this._supported=!1,Promise.resolve(null))}close(){this._db&&(this._db.close(),this._db=null),this._dbPromise=null}async deleteDatabaseForTests(){this.close(),this._supported=this.isSupported(),this._supported&&await new Promise(e=>{let t=window.indexedDB.deleteDatabase(se);t.onsuccess=()=>e(),t.onerror=()=>e(),t.onblocked=()=>e()})}async getAllSessions(){let e=await this.open();if(!e)return[];let t=e.transaction(x,`readonly`),n=await this.requestToPromise(t.objectStore(x).getAll());return await this.txDone(t),n}async getSessionsByConversationId(e){let t=await this.open();if(!t)return[];let n=t.transaction(x,`readonly`),r=await this.requestToPromise(n.objectStore(x).index(`conversationId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.startTime-t.startTime)}async getSessionBySessionId(e){let t=await this.open();if(!t)return[];let n=t.transaction(x,`readonly`),r=await this.requestToPromise(n.objectStore(x).get(e));return await this.txDone(n),r?[r]:[]}async getChunksBySession(e){let t=await this.open();if(!t)return[];let n=t.transaction(le,`readonly`),r=await this.requestToPromise(n.objectStore(le).index(`sessionId`).getAll(e));return await this.txDone(n),r.sort((e,t)=>e.sequence-t.sequence)}async putSession(e){let t=await this.open();if(!t)return!1;let n=t.transaction(x,`readwrite`);return n.objectStore(x).put(e),await this.txDone(n),!0}async putSessionAndChunk(e,t){let n=await this.open();if(!n)return!1;let r=n.transaction([x,le],`readwrite`);return r.objectStore(x).put(e),r.objectStore(le).put(t),await this.txDone(r),!0}async updateSessionConversationId(e,t){let[n]=await this.getSessionBySessionId(e);n&&await this.putSession({...n,conversationId:t,updatedAt:Math.max(n.updatedAt,Date.now())})}async deleteSession(e){let t=await this.open();if(!t)return 0;let n=await this.getChunksBySession(e),r=t.transaction([x,le],`readwrite`),i=r.objectStore(le),a=0;for(let e of n)a+=e.bytes,i.delete(e.id);return r.objectStore(x).delete(e),await this.txDone(r),a}async deleteChunks(e){let t=await this.open();if(!t||!e.length)return;let n=t.transaction(le,`readwrite`),r=n.objectStore(le);for(let t of e)r.delete(t.id);await this.txDone(n)}async estimateStorage(){return navigator.storage?.estimate?navigator.storage.estimate().catch(()=>null):null}async getStorageSummary(){let e=await this.getAllSessions();return{sessions:e,callsCount:this.groupSessions(e).length,usedBytes:e.reduce((e,t)=>e+t.bytes,0)}}async enforceRetentionPolicy(){let e=await this.getAllSessions(),t=this.groupSessions(e),n=t.reduce((e,t)=>e+t.bytes,0);for(;t.length>ie||t.length>1&&n>re;){let e=t.shift();if(!e)return;for(let t of e.sessions)n-=await this.deleteSession(t.sessionId)}t.length===1&&n>re&&await this.trimOldestChunks(t[0],n-re),e=await this.getAllSessions(),t=this.groupSessions(e),(t.length>ie||t.reduce((e,t)=>e+t.bytes,0)>re)&&await this.enforceRetentionPolicy()}createSchema(e){if(!e.objectStoreNames.contains(x)){let t=e.createObjectStore(x,{keyPath:`sessionId`});t.createIndex(`conversationId`,`conversationId`,{unique:!1}),t.createIndex(`updatedAt`,`updatedAt`,{unique:!1})}e.objectStoreNames.contains(le)||e.createObjectStore(le,{keyPath:`id`}).createIndex(`sessionId`,`sessionId`,{unique:!1})}isSupported(){return typeof window<`u`&&!!window.indexedDB}requestToPromise(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}txDone(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}getCallKey(e){return e.conversationId||e.sessionId}groupSessions(e){let t=new Map;for(let n of e){let e=this.getCallKey(n),r=t.get(e);r||(r={key:e,sessions:[],bytes:0,startTime:n.startTime,updatedAt:0},t.set(e,r)),r.sessions.push(n),r.bytes+=n.bytes,r.startTime=Math.min(r.startTime,n.startTime),r.updatedAt=Math.max(r.updatedAt,n.updatedAt)}return Array.from(t.values()).sort((e,t)=>e.updatedAt===t.updatedAt?e.startTime===t.startTime?e.key.localeCompare(t.key):e.startTime-t.startTime:e.updatedAt-t.updatedAt)}async updateSessionFromChunks(e){let t=await this.getChunksBySession(e.sessionId);if(!t.length){await this.deleteSession(e.sessionId);return}let n=t.reduce((e,t)=>e+t.bytes,0),r=t.reduce((e,t)=>e+t.items.length,0),i=t[0].startTime,a=t[t.length-1].endTime;await this.putSession({...e,startTime:i,endTime:a,updatedAt:a,bytes:n,entriesCount:r})}async trimOldestChunks(e,t){let n=[];for(let t of e.sessions){let e=await this.getChunksBySession(t.sessionId);n.push(...e.map(e=>({...e,session:t})))}n.sort((e,t)=>e.startTime===t.startTime?e.sequence-t.sequence:e.startTime-t.startTime);let r=n.slice(0,Math.max(n.length-1,0)),i=0,a=new Map,o=[];for(let e of r)if(o.push(e),i+=e.bytes,a.set(e.sessionId,e.session),i>=t)break;await this.deleteChunks(o);for(let e of a.values())await this.updateSessionFromChunks(e);return i}};async function be(e){return e.sessionId?S.getSessionBySessionId(e.sessionId):e.conversationId?S.getSessionsByConversationId(e.conversationId):[]}async function xe(e,t,n,r){if(!r.length)return;let i=he(e)||t,a=r,o=JSON.stringify(a),s=ve(o);for(;s>re&&a.length>1;)a=a.slice(Math.floor(a.length/2)),o=JSON.stringify(a),s=ve(o);if(s>re)return;let c=a[0].t,l=a[a.length-1].t,[u]=await S.getSessionBySessionId(e),d=u||{sessionId:e,conversationId:i,startTime:c,endTime:l,updatedAt:l,bytes:0,entriesCount:0},f={...d,conversationId:i||d.conversationId,startTime:Math.min(d.startTime,c),endTime:Math.max(d.endTime,l),updatedAt:Math.max(d.updatedAt,l),bytes:d.bytes+s,entriesCount:d.entriesCount+a.length},p={id:_e(e,n),sessionId:e,sequence:n,startTime:c,endTime:l,bytes:s,items:a};await S.putSessionAndChunk(f,p)&&await S.enforceRetentionPolicy()}function Se(e){let t=new WeakSet;try{return JSON.parse(JSON.stringify(e,(e,n)=>{if(n instanceof Error||typeof n==`bigint`||typeof n==`function`||typeof n==`symbol`)return String(n);if(n&&typeof n==`object`){if(t.has(n))return`[Circular]`;t.add(n)}return n}))}catch{return e.map(e=>String(e))}}function Ce(e){let t=Ge.get(e);if(!t?.length)return Xe;let n=t.splice(0),r=he(e),i=ge(e);return Xe=Xe.then(()=>xe(e,r,i,n)).catch(e=>{console.warn(`Failed to write debug log to storage`,e)}),Xe}function we(e){if(e)return Ce(e);for(let e of Ge.keys())Ce(e);return Xe}async function Te(e){let t=[];for(let n of e.sort((e,t)=>e.startTime-t.startTime)){let e=await S.getChunksBySession(n.sessionId);for(let n of e)t.push(...n.items)}return t}async function Ee(e){let t=await Te(e);if(!t.length)return t;let n=t.sort(Oe),r=n[0].t,i=n[n.length-1].t;return[...await De(r,i,new Set(e.map(e=>e.sessionId))),...n].sort(Oe)}async function De(e,t,n){let r=(await S.getAllSessions()).filter(r=>!n.has(r.sessionId)&&r.conversationId===null&&r.endTime>=e-ue&&r.startTime<=t),i=[];for(let n of r){let r=await S.getChunksBySession(n.sessionId);for(let n of r)n.endTime<e-ue||n.startTime>t||i.push(...n.items.filter(n=>n.t>=e-ue&&n.t<=e?!0:n.t>=e&&n.t<=t&&de.has(n.l)))}return i}function Oe(e,t){return e.t-t.t}function ke(e,t){let n=document.createElement(`a`),r=new Blob([e],{type:`text/json`}),i=URL.createObjectURL(r);n.href=i,n.download=t,n.click(),URL.revokeObjectURL(i)}function Ae(){we()}function je(){document.visibilityState===`hidden`&&we()}function Me(e,t,n=Je){We||Ne(),me(n);let r=new Date,i={t:r.getTime(),l:e,d:Se(t),h:r.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`})};return Ge.get(n)?.push(i),Ye||(Ye=window.setTimeout(()=>{Ye=null,we()},oe)),i}function Ne(){We||(We=!0,ye(),S.open(),window.addEventListener(`pagehide`,Ae),document.addEventListener(`visibilitychange`,je))}function Pe(){return We||Ne(),we(),pe()}function Fe(e,t=Je){t&&(me(t),qe.set(t,e),e&&S.updateSessionConversationId(t,e))}async function Ie(){return await we(),(await S.getAllSessions()).sort((e,t)=>t.updatedAt-e.updatedAt)}async function Le(e){return await we(),Ee(await be(e))}async function Re(e){return JSON.stringify(await Le(e))}async function ze(e){let t=await Re(e),n=`logs_${e.sessionId||e.conversationId}_${Date.now()}.json`;return ke(t,n),n}async function Be(e){await we();let t=e?await be(e):await S.getAllSessions();for(let e of t)await S.deleteSession(e.sessionId)}async function Ve(){await we();let e=await S.getStorageSummary(),t=await S.estimateStorage();return{supported:S.supported,callsCount:e.callsCount,sessionsCount:e.sessions.length,usedBytes:e.usedBytes,maxBytes:re,maxCalls:ie,quotaBytes:t?.quota,usageBytes:t?.usage}}async function He(){return await we(),JSON.stringify(await Te(await S.getAllSessions()))}async function Ue(){let e=await He(),t=`logs_${Date.now()}.json`;return ke(e,t),t}var We=!1,Ge=new Map,Ke=new Map,qe=new Map,Je=pe(),Ye=null,Xe=Promise.resolve();window.__VKCallsSDKLogs__=(e=!1)=>(We||Ne(),e?He():Ue());var C=class e{static get sessionKey(){return e._sessionKey}static set sessionKey(t){e._sessionKey=t}static get sessionSecretKey(){return e._sessionSecretKey}static set sessionSecretKey(t){e._sessionSecretKey=t}static get accessToken(){return e._accessToken}static set accessToken(t){e._accessToken=t}static isEmpty(){return!e._sessionKey}};g(C,`_sessionKey`,void 0),g(C,`_sessionSecretKey`,void 0),g(C,`_accessToken`,void 0);var w=function(e){return e.MIC_CAMERA_PERMISSION=`mic_camera`,e.CAMERA_PERMISSION=`camera`,e.MIC_PERMISSION=`mic`,e.CAMERA_ACCESS=`cameralock`,e.MIC_ACCESS=`miclock`,e.MIC_NOT_FOUND=`nomic`,e.SCREEN_PERMISSION=`screenpermission`,e.SCREEN_ACCESS=`screenlock`,e.CONNECTION=`connection`,e.NETWORK=`network`,e.UNKNOWN=`unknown`,e.UNSUPPORTED=`unsupported`,e.SIGNALING_FAILED=`signalingfailed`,e.API=`api`,e.AUTH=`auth`,e.OVERCONSTRAINED=`overconstrained`,e}(w||{}),T=function(e){return e.AUDIO=`AUDIO`,e.VIDEO=`VIDEO`,e.SCREEN_SHARING=`SCREEN_SHARING`,e.MOVIE_SHARING=`MOVIE_SHARING`,e.AUDIO_SHARING=`AUDIO_SHARING`,e.ANIMOJI=`ANIMOJI`,e}(T||{}),E=function(e){return e.ACCEPT_CONCURRENT=`callAcceptConcurrent`,e.ACCEPT_INCOMING=`callAcceptIncoming`,e.ACCEPTED_OUTGOING=`callAcceptedOutgoing`,e.ADD_PARTICIPANT=`callAddParticipant`,e.CALL_SPEC_ERROR=`callSpecError`,e.DECLINE_INCOMING=`callDeclineIncoming`,e.DEVICE_CHANGED=`callDeviceChanged`,e.DEVICES=`callDevices`,e.ERROR=`callError`,e.HANGUP=`callHangup`,e.ICE_CONNECTION_STATE=`callIceConnectionState`,e.ICE_CONNECTION_TYPE=`callIceConnectionType`,e.ICE_RESTART=`callIceRestart`,e.JOIN_CONVERSATION=`callJoinConversation`,e.MEDIA_STATUS=`callMediaStatus`,e.OUTGOING_CALL=`callStart`,e.OUTGOING_MULTIPARTY_CALL=`callStartMultiparty`,e.PAT_ALLOCATED=`patAllocate`,e.PAT_DEALLOCATED=`patDeallocate`,e.PAT_ERROR=`patError`,e.PAT_OUTDATED_RESPONSE=`patOutdatedResponse`,e.PAT_WAITING_TIME_ERROR=`patWaitingTimeError`,e.POOR_CONNECTION=`callPoorConnection`,e.PUSH=`callPush`,e.RECONNECT=`callReconnect`,e.RELAY_POLICY=`callForceRelay`,e.REMOVE_PARTICIPANT=`callRemoveParticipant`,e.SOCKET_ACTION=`callSocketAction`,e.TOPOLOGY_CHANGE_REQUESTED=`callTopologyChangeRequested`,e}(E||{}),Ze=e=>e.stop(),Qe=e=>e.getTracks().forEach(Ze),$e=e=>e.getVideoTracks().forEach(Ze);async function et(e,t){try{let n=typeof t.width==`number`?t.width:void 0,r=typeof t.height==`number`?t.height:void 0;await e.applyConstraints({...t,...n&&{width:{max:n,ideal:n}},...r&&{height:{max:r,ideal:r}}})}catch(e){B.warn(`setVideoConstraints failed`,e)}}var tt=class{constructor(){g(this,`_cameraPermissionStatus`,void 0),g(this,`_microphonePermissionStatus`,void 0),g(this,`_listener`,void 0)}static isSupported(){return k.browserName()!==`Firefox`&&`permissions`in navigator&&`PermissionStatus`in window}async init(e){try{let[t,n]=await Promise.all([navigator.permissions.query({name:`camera`}),navigator.permissions.query({name:`microphone`})]);this._cameraPermissionStatus=t,this._microphonePermissionStatus=n,this._listener=e,this._cameraPermissionStatus.onchange=e=>this.handlePermissionChange(e),this._microphonePermissionStatus.onchange=e=>this.handlePermissionChange(e)}catch(e){B.warn(`NavigatorPermissions init error`,e)}}handlePermissionChange(e){let t=e.target;if(t instanceof PermissionStatus){let{name:e,state:n}=t;switch(e){case`audio_capture`:this._listener(`microphone`,n);break;case`video_capture`:this._listener(`camera`,n);break}}}getPermissionState(e){let t=null;switch(e){case`camera`:t=this._cameraPermissionStatus.state;break;case`microphone`:t=this._microphonePermissionStatus.state;break}return t}},nt=`_okcls_`,rt=(()=>{try{let e=Date.now().toString(),t=window.localStorage,n=!1;return t.setItem(e,e),n=t.getItem(e)===e,t.removeItem(e),n?t:null}catch{return null}})();function it(e){let t=rt?rt.getItem(nt+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function at(e,t){try{rt&&rt.setItem(nt+e,JSON.stringify(t))}catch{}}function ot(e){rt&&rt.removeItem(nt+e)}var st;(function(e){function t(e){return it(e)||null}e.get=t;function n(e,t){at(e,t)}e.set=n;function r(e){ot(e)}e.remove=r})(st||(st={}));var ct=st,lt=null,ut=null,dt=null,ft=[],pt=[],mt=[],ht=null,gt=null,_t=null,vt=!1,yt=!1,bt,xt,St,Ct=null,wt=null,Tt=``,Et=null,Dt=[],Ot=null,kt=navigator.appVersion,At=navigator.appName,D=navigator.userAgent,jt={},Mt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(Mt).includes(e)}e.contains=t})(Mt||(Mt={}));var Nt=class{constructor(e,t=!1,n=P.videoMaxWidth,r=P.videoMaxHeight,i=P.videoFrameRate){g(this,`audio`,void 0),g(this,`video`,void 0),g(this,`needVideo`,void 0),g(this,`lastSimplifyWasReached`,void 0),g(this,`supportedConstraints`,void 0),g(this,`isVideoRequested`,()=>this.needVideo),this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let a=!1;if(e){a={noiseSuppression:P.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let t=O.getMicrophones(),n,r;if(gt&&(r=gt.groupId,n=gt.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!gt&&O.os()===`MacOS`&&t.find(e=>e.label.includes(`iPhone`))){let e=t.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));e&&(r=e.groupId,n=e.deviceId)}r&&this.supportedConstraints.groupId?a.groupId={exact:r}:n&&(a.deviceId={exact:n})}let o=!1;if(t){o={width:{min:P.videoMinWidth,max:n,ideal:n},height:{min:P.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:P.videoAspectRatio},frameRate:{ideal:i}};let e=O.getCameras(),a,s;if(ht&&(s=ht.groupId,a=ht.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!ht&&O.os()===`MacOS`&&e.find(e=>e.label.includes(`iPhone`))){let t=e.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));t&&(s=t.groupId,a=t.deviceId)}s&&this.supportedConstraints.groupId?o.groupId={exact:s}:a&&(o.deviceId={exact:a}),P.videoFacingMode&&(o.facingMode={ideal:P.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=a,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video==`object`&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio==`object`&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let e=typeof this.video==`object`&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio==`object`&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||e)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Pt=class extends Nt{constructor(e,t,n,r){if(super(!1,!0),g(this,`captureController`,void 0),this.captureController=`CaptureController`in window?new CaptureController:null,typeof this.video==`object`?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode):this.video={},this.video.cursor=`motion`,this.video.width=e,this.video.height=t,this.video.frameRate=n,this.video.displaySurface=P.displaySurface,O.browserName()===`Safari`){let n=Number(O.browserVersion());n===16?(this.video.width={max:e},this.video.height={max:t}):n===17&&(delete this.video.width,delete this.video.height)}r&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:P.audioShareSystemInclude?`include`:`exclude`,windowAudio:P.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},Ft=class e{constructor(){g(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(t=null){if(e._lockId)throw t?.log(E.ERROR,`change_device`),B.warn(`Device change failed: MediaSource is busy`),Error(`MediaSource is busy`);e._lockId=this._lockId}free(){e._lockId===this._lockId&&(e._lockId=0)}};g(Ft,`_lockId`,0);async function It(){yt=!1,vt=!1,lt=null;let e={camera:O.getSavedCamera(),microphone:O.getSavedMicrophone(),output:O.getSavedOutput()};await Rt(),Lt(`devicechange`,e),z.onDeviceChange()}function Lt(e,...t){if(jt[e])for(let n of jt[e])n(...t)}async function Rt(){return lt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!ut&&navigator.mediaDevices.addEventListener&&(ut=N.debounce(It,P.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,ut)),!dt&&tt.isSupported()&&(dt=new tt,await dt.init((e,t)=>{switch(t){case`denied`:case`prompt`:ut?.();break}})),lt=navigator.mediaDevices.enumerateDevices().then(e=>{ft=e.filter(e=>e.kind===`videoinput`?(e.label&&(vt=!0),!0):!1),pt=e.filter(e=>e.kind===`audioinput`?(e.label?yt=!0:O.isMobile()&&O.browserName()===`Firefox`&&(yt=vt),!0):!1),mt=e.filter(e=>e.kind===`audiooutput`);let t=ht?.deviceId??ct.get(`videoinput`),n=gt?.deviceId??ct.get(`audioinput`),r=_t?.deviceId??ct.get(`audiooutput`);return ht=ft.find(e=>e.deviceId===t)||null,gt=pt.find(e=>e.deviceId===n)||null,_t=mt.find(e=>e.deviceId===r)||mt[0]||null,lt=Promise.resolve(e),e}).catch(()=>(lt=null,[]))))}async function zt(){if(`userAgentData`in navigator)try{let{platformVersion:e}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!e){B.warn(`Can't to get OS version`);return}let t=parseInt(e.split(`.`)[0]);Et=isNaN(t)?null:t}catch(e){B.warn(`Failed to get OS version`,e)}}function Bt(e){if(ht&>)return;let t=(e,t)=>{let n=t.getSettings()?.deviceId;return e.find(e=>e.deviceId===n||e.label===t.label)||null};e?.getTracks().forEach(e=>{!gt&&e.kind===j.audio?gt=t(O.getMicrophones(),e):!ht&&e.kind===j.video&&(ht=t(O.getCameras(),e))})}async function Vt(e,t,n=B,r=null){n.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative()))),O.releaseFirefoxMicrophonePermissionWarmup();let i=(!e.isVideo()||O.hasCameraPermission())&&(!e.isAudio()||O.hasMicrophonePermission());!i&&!t&&z.onPermissionsRequested();let a=new Ft;try{a.busy(r);let t=await navigator.mediaDevices.getUserMedia(e.getNative());return a.free(),i||await It(),Bt(t),t}catch(i){switch(a.free(),n.error(`getUserMedia error`,i),i.name){case`PermissionDeniedError`:case`PermissionDismissedError`:case`NotAllowedError`:case`SecurityError`:case`DOMException`:case`NotFoundError`:t=e.isVideoRequested()?w.CAMERA_PERMISSION:w.MIC_PERMISSION;break;case`OverconstrainedError`:t=w.OVERCONSTRAINED;break;case`TypeError`:t=w.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?w.CAMERA_ACCESS:w.MIC_ACCESS;break;case`Error`:if(i.message===`MediaSource is busy`){t=e.isVideoRequested()?w.CAMERA_ACCESS:w.MIC_ACCESS;break}}if(e.canSimplify())return Vt(e.simplify(),t,n,r);let o=t||w.UNKNOWN;throw z.onPermissionsError(o,i),o}}async function Ht(e=B){if(!(Ct||O.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{O.hasMicrophonePermission()||z.onPermissionsRequested(),Ct=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(t){e.warn(`Firefox microphone permission warmup failed`,t)}}async function Ut(e,t=B,n=null){t.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let r=new Ft;try{r.busy(n);let i=await navigator.mediaDevices.getDisplayMedia(e.getNative()),a=i?.getVideoTracks()[0];if(a){let n=a.getSettings()?.displaySurface;if(t.debug(`Got display media track: ${a.id} (${n})`),a.contentHint=`text`,e.captureController&&(n===`browser`||n===`window`))try{e.captureController.setFocusBehavior(`no-focus-change`)}catch(e){t.warn(`Failed to set focus behavior`,e)}}return i}catch(e){switch(e.name){case`PermissionDeniedError`:case`NotAllowedError`:case`SecurityError`:throw w.SCREEN_PERMISSION;default:throw w.SCREEN_ACCESS}}finally{r.free()}}function Wt(){return Dt.length||(Dt=(()=>{let e,t=!1,n=0,r=`0`,i=D.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return e=/\brv[ :]+(\d+)/g.exec(D),[`IE`,e&&e[1]||`Unknown`,t,n,r];if(i[1]===`Safari`){if(e=D.match(/\bEdge\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(e=D.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=D.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=D.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=D.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=D.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=D.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=D.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=D.match(/\bEdge?\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(window.opr!==void 0&&/^(.+\.)?ok.ru$/.test(window.location.host))return[`Opera`,`Hidden`,t,n,r]}return e=D.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:At,e&&e[1]||i[2]||kt,t,n,r]})()),Dt}var O;(function(e){async function t(){await Rt(),await zt()}e.init=t;function n(){return ft}e.getCameras=n;function r(){return pt}e.getMicrophones=r;function i(){return mt}e.getOutput=i;function a(){return ft.length>0}e.hasCamera=a;function o(){return pt.length>0}e.hasMicrophone=o;function s(){return ht}e.getSavedCamera=s;function c(){return gt}e.getSavedMicrophone=c;function l(){return _t}e.getSavedOutput=l;function u(){return P.videoFacingMode}e.getVideoFacingMode=u;function d(){return vt}e.hasCameraPermission=d;function f(){return yt}e.hasMicrophonePermission=f;function p(){return dt?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=p;function m(e=!1){return f()?a()&&e?d():!0:!1}e.hasPermissions=m;function h(){Ct&&(Qe(Ct),Ct=null)}e.releaseFirefoxMicrophonePermissionWarmup=h;async function ee(e=!1,t=!0,n=!0,r=B,i=null){!e&&!t?await Ht(r):O.releaseFirefoxMicrophonePermissionWarmup();let s=o()&&t,c=a()&&e,l;if(!s&&!c)l=new MediaStream;else try{l=await Vt(new Nt(s,c),void 0,r,i)}catch{l=new MediaStream}return!l.getVideoTracks().length&&n&&l.addTrack(O.getBlackMediaTrack()),!l.getAudioTracks().length&&n&&l.addTrack(O.getSilentMediaTrack()),l}e.getUserMedia=ee;async function te(e,t,n=B,r=null){return Ut(new Pt(e&&!P.consumerFastScreenShare?P.fastScreenShareWidth:window.screen.width,e&&!P.consumerFastScreenShare?P.fastScreenShareHeight:window.screen.height,P.getScreenFrameRate(e),t),n,r)}e.getScreenMedia=te;async function g(e=!1,t,n=B,r=null){return Vt(new Nt(!1,!0,e?P.videoEffectMaxWidth:P.videoMaxWidth,e?P.videoEffectMaxHeight:P.videoMaxHeight,t),void 0,n,r)}e._getUserVideo=g;async function _(e,t,n=B,r=null){let i=t?.width||P.videoMaxWidth,a=t?.height||P.videoMaxHeight;return Vt(new Nt(!1,e||!0,i,a),void 0,n,r)}e.getUserVideo=_;async function ne(e,t=B,n=null){return Vt(new Nt(e||!0,!1),void 0,t,n)}e.getUserAudio=ne;async function v(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return et(n,t)}e.setResolution=v;async function y(e,t){let n=(await Rt()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?ht=n:e===`audioinput`?gt=n:e===`audiooutput`&&(_t=n),ct.set(e,t),n):null}e._saveDeviceId=y;function b(){if(!St||St.readyState===`ended`){let e=O.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),St=t.stream.getAudioTracks()[0]}return Object.assign(St.clone(),{enabled:!1})}e.getSilentMediaTrack=b;function re(e=P.videoMinWidth,t=P.videoMinHeight){xt||(xt=document.createElement(`canvas`)),xt.width=e,xt.height=t;let n=xt.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!bt||bt.readyState===`ended`)&&(bt=xt.captureStream(P.videoFrameRate).getVideoTracks()[0]),Object.assign(bt.clone(),{enabled:!1})}e.getBlackMediaTrack=re;function ie(){if(me()===`Edge`&&Number(he())<70)return!1;try{let e=window;return`mediaDevices`in e.navigator&&`getUserMedia`in e.navigator.mediaDevices&&e.RTCPeerConnection&&e.RTCIceCandidate&&e.RTCSessionDescription&&e.HTMLCanvasElement&&e.HTMLCanvasElement.prototype.captureStream&&e.RTCRtpSender&&e.RTCRtpSender.prototype.replaceTrack&&e.RTCRtpSender.prototype.getParameters&&`sendBeacon`in navigator&&!0||!1}catch{return!1}}e.isBrowserSupported=ie;function ae(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=ae;function oe(){let e=O.browserName()===`Safari`&&O.browserVersion()===`15`&&O.browserSubVersion()===`1`,t=O.browserName()===`Opera`,n=O.browserName()===`Yandex`;return e||t||n}e.isBrokenH264Decoder=oe;function se(){return O.browserName()===`Yandex`&&O.os()===`Windows`||P.simulcast}e.isBrokenVP9Encoder=se;function ce(){let e=O.browserName()===`Safari`&&Number(O.browserVersion())===17&&[4,5,6].includes(Number(O.browserSubVersion())),t=O.os()===`Windows`&&O.osVersion()===10;return e||t}e.isBrokenVP9Decoder=ce;function x(){return O.browserName()===`Firefox`&&Number(O.browserVersion())<60}e.isOldDataChannelDescription=x;function le(){return!(O.baseChromeVersion()&&O.isMobile())}e.canPreferH264=le;function ue(){return!(O.browserName()===`Firefox`||O.browserName()===`Safari`)}e.isSimulcastSupportedByBrowser=ue;function de(){return Tt||(Tt=(()=>{let e={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let t in e)if(Object.hasOwn(e,t)&&e[t].test(D))return t;return`Unknown`})()),Tt}e.os=de;function fe(){return Et}e.osVersion=fe;function pe(){return wt===null&&(wt=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(kt)),wt}e.isMobile=pe;function me(){return Wt()[0]}e.browserName=me;function he(){return Wt()[1]}e.browserVersion=he;function ge(){return Wt()[3]}e.baseChromeVersion=ge;function _e(){return Ot||(Ot=new(window.AudioContext||window.webkitAudioContext)),Ot.resume().catch(()=>{B.warn(`Failed to resume AudioContext`)}),Ot}e.getAudioContext=_e;function ve(){return Wt()[4]}e.browserSubVersion=ve;function ye(){return O.baseChromeVersion()>=105&&!O.isMobile()}e.isAudioShareSupported=ye;function S(e,t){jt[e]||(jt[e]=[]),jt[e].push(t)}e.addEventListener=S;function be(e,t){if(jt[e])if(!t)delete jt[e];else{let n=jt[e].indexOf(t);n>-1&&jt[e].splice(n,1)}}e.removeEventListener=be})(O||(O={}));var k=O;function Gt(e,t){return!(e.isAudioEnabled!==t.isAudioEnabled||e.isVideoEnabled!==t.isVideoEnabled||e.isScreenSharingEnabled!==t.isScreenSharingEnabled||e.isFastScreenSharingEnabled!==t.isFastScreenSharingEnabled||e.isAudioSharingEnabled!==t.isAudioSharingEnabled||e.isAnimojiEnabled!==t.isAnimojiEnabled)}function A(e){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},e||{})}var Kt=function(e){return e.FpsLimit=`fps-limit`,e}({}),qt=class extends _{constructor(e=B){super(),g(this,`FPS_LIMITS`,[13,20,Math.max(P.videoFrameRate,25)]),g(this,`THRESHOLD`,.8),g(this,`HISTORY_LENGTH`,10),g(this,`_fpsMeterUnsubscribe`,null),g(this,`_fpsHistory`,{cursor:0,arr:[]}),g(this,`_fpsLimitCursor`,this.FPS_LIMITS.length-1),g(this,`_debug`,void 0),this._debug=e}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(e){this._debug.warn(`VideoEffectsFpsLimiter error`,e)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let e=this._fpsHistory.arr.reduce((e,t)=>e+t,0)/this.HISTORY_LENGTH,t=this.FPS_LIMITS[this._fpsLimitCursor];e<t*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),t!==this.fpsLimit&&this._triggerEvent(`fps-limit`,this.fpsLimit)}}_assertsVideoEffect(e){if(!(`addFpsMeterListener`in e))throw Error(`Outdated VideoEffect version`)}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}},Jt=function(e){return e.SOURCE_CHANGED=`SOURCE_CHANGED`,e.SOURCE_READY=`SOURCE_READY`,e.TRACK_REPLACED=`TRACK_REPLACED`,e.SCREEN_STATUS=`SCREEN_STATUS`,e.ANIMOJI_STATUS=`ANIMOJI_STATUS`,e}({}),j=function(e){return e.audio=`audio`,e.video=`video`,e.screen=`screen`,e.audioshare=`audioshare`,e}({}),Yt=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),Xt=class extends _{constructor(e=B,t=null){super(),g(this,`_stream`,null),g(this,`_screenTrack`,null),g(this,`_audioShareTrack`,null),g(this,`_screenShareTrack`,null),g(this,`_sendVideoTrack`,null),g(this,`_cameraVideoTrack`,null),g(this,`_micAudioTrack`,null),g(this,`_audioEffectsTrack`,null),g(this,`_mediaSettings`,A()),g(this,`_videoStatusOnScreenCapturingEnabled`,!1),g(this,`_effect`,null),g(this,`_audioEffectParams`,null),g(this,`_onDeviceChange`,void 0),g(this,`_animojiEnabled`,!1),g(this,`_videoEffectsFpsLimiter`,void 0),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`videoTrackMuteHandler`,()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)}),this._debug=e,this._logger=t,this._initDeviceChangeListener(),P.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),P.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new qt(this._debug),this._videoEffectsFpsLimiter.addEventListener(Kt.FpsLimit,this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener(`mute`,this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&this._cameraVideoTrack.addEventListener(`mute`,this.videoTrackMuteHandler),P.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[T.AUDIO],t=!0){if(this._stream)return;let n=e.includes(T.VIDEO),r=e.includes(T.AUDIO),i=e.includes(T.ANIMOJI);if(!k.isBrowserSupported())throw new y(w.UNSUPPORTED);try{this._stream=await k.getUserMedia(n,r,t,this._debug,this._logger),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=n&&this._stream.getVideoTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=r&&this._stream.getAudioTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=i&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=i,this._triggerEvent(`SOURCE_READY`)}catch(e){throw new y(e)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(e=>!e.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,n){let r=this.getStream(),i=this.getSendAudioTrack(),a=this.getSendVideoTrack(n);if(!r||!i&&!a&&!t)throw Error(`No local stream found`);i&&!t&&e.addTrack(i,r),a&&!t&&e.addTrack(a,r)}getMediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case`videoinput`:if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case`audioinput`:if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(w.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&$e(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_initDeviceChangeListener(){!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices||!navigator.mediaDevices.addEventListener||(this._onDeviceChange=async e=>{if(!this._stream)return;let t=k.getSavedMicrophone(),n=k.getSavedCamera(),r=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,i=this._mediaSettings.isVideoEnabled&&n?.groupId!==e.camera?.groupId;try{r&&await this._changeAudioInput(),i&&await this._changeVideoInput()}catch{}},k.addEventListener(`devicechange`,this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&k.removeEventListener(`devicechange`,this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?`stream`:`video`,n=e||await k._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=n.getVideoTracks()[0],!this._stream)Qe(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);this._logger?.log(E.DEVICE_CHANGED,t),this._debug.log(`Video stream changed`),await this._replaceLocalTrack(e),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}}catch(e){throw this._logger?.log(E.ERROR,`change_video`),this._debug.warn(`Camera change failed`,e),e}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await k.getUserAudio(void 0,this._debug,this._logger);if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Qe(t);else{let e=await this._applyAudioEffect();this._logger?.log(E.DEVICE_CHANGED,`audio`),this._debug.log(`Audio stream changed`,e),await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})}}catch(e){throw this._logger?.log(E.ERROR,`change_audio`),this._debug.error(`Microphone change failed`,e),e}}async _changeScreen(e,t,n){try{if(n=n||await k.getScreenMedia(e,t,this._debug,this._logger),!this._stream)Qe(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),this._logger?.log(E.DEVICE_CHANGED,`screen`),this._debug.log(`Screen capturing started`),this._screenTrack=r,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,P.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(r.contentHint=`motion`,this._screenShareTrack=r),n.getAudioTracks().length>0){let e=n.getAudioTracks()[0];e.contentHint=`music`,this._audioShareTrack=e,await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&this._debug.debug(`Audio share requested but not captured`),this._triggerEvent(`SCREEN_STATUS`,{track:r}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`})}}catch(e){throw this._logger?.log(E.ERROR,`screen`),this._debug.warn(`Screen capturing failed`,e),e}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent(`SCREEN_STATUS`,{track:null}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`}))}async stopAudioShareTrack(){if(this._audioShareTrack){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!P.audioEffects||!this._audioEffectParams)return P.audioEffects?.pause(),this._micAudioTrack;P.audioEffects.isInitialized||await P.audioEffects.init(),P.audioEffects.resume(),P.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),P.audioEffects.setSource(this._micAudioTrack);let e=P.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=k.getSilentMediaTrack();return e.contentHint=`music`,e.stop(),e}getBlackScreenShareTrack(){let e=k.getBlackMediaTrack();return e.contentHint=`motion`,e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let n=this._stream.getTracks().find(t=>t.kind===e.kind&&t.contentHint===e.contentHint);n?.id!==e.id&&(n?(n!==this._audioEffectsTrack&&n.stop(),this._stream?.removeTrack(n),this._stream?.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)):(this._stream.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(P.videoEffects),!P.videoEffects)return t;try{return P.videoEffects.setEffect(e,t)}catch(e){return this._debug.warn(`Video effect failed`,e),t}}_stopEffect(){if(P.videoEffects)try{P.videoEffects.stopEffect()}catch(e){this._debug.warn(`Video effect failed`,e)}}destroy(){this._destroyDeviceChangeListener(),k.releaseFirefoxMicrophonePermissionWarmup(),P.videoEffects&&(this._effect=null,P.videoEffects.destroy()),P.audioEffects&&P.audioEffects.destroy(),this._stream&&(Qe(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),k.getAudioContext()?.suspend().catch(e=>this._debug.error(e)),this._videoEffectsFpsLimiter?.destroy()}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return this._disableScreenCapture()}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;this.cameraVideoTrack?.stop();let t;if(e){let e=await k._getUserVideo(!!this._effect,this._frameRate,this._debug,this._logger);this.cameraVideoTrack=e.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=k.getBlackMediaTrack(P.videoMinWidth,P.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent(`ANIMOJI_STATUS`,!e);return}this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(e,t)=>{await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=t,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})};if(e)try{let e=await k.getUserAudio(void 0,this._debug,this._logger);this._micAudioTrack=e.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(e){throw P.audioEffects?.pause(),t(k.getSilentMediaTrack(),!1),typeof e==`string`?Error(e):e}else P.audioEffects?.pause(),t(k.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent(`ANIMOJI_STATUS`,e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async setResolution({video:e,effect:t}){if(!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw Error(`Local stream not found`);if(!this.cameraVideoTrack)throw Error(`Local video track not found`);let n=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,n)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(e=>!e.contentHint);if(!e)throw Error(`Local audio track not found`);if(e.enabled)return e.applyConstraints({noiseSuppression:P.noiseSuppression})}async videoEffect(e){if(!P.videoEffects)throw Error(`Video Effects library is not set`);if(this._logger?.log(E.DEVICE_CHANGED,`effect_${e?.effect||`none`}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let e=this.cameraVideoTrack.clone(),t=new MediaStream([e]);await this._applyVideoConstraints(e),await this._changeVideoInput(t)}catch(e){this._effect=t;let n=this.cameraVideoTrack.clone(),r=new MediaStream([n]);throw await this._changeVideoInput(r),e}}}async audioEffect(e){if(!P.audioEffects)throw Error(`Audio Effects library is not set`);if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!N.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let e=this._micAudioTrack.clone(),t=new MediaStream([e]);await this._changeAudioInput(t)}catch(e){this._audioEffectParams=t;let n=this._micAudioTrack.clone(),r=new MediaStream([n]);throw await this._changeAudioInput(r),e}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<P.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(e=>{this._debug.warn(`MediaSource handleVideoEffectsLowFps error`,e)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??P.videoFrameRate;return this._effect?Math.min(e,P.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await et(e,{width:this._effect?P.videoEffectMaxWidth:P.videoMaxWidth,height:this._effect?P.videoEffectMaxHeight:P.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}},M=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e}(M||{}),Zt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Qt=`L1T2`,$t=[{dimension:320,bitrate:18e4},{dimension:520,bitrate:4e5},{dimension:640,bitrate:5e5},{dimension:960,bitrate:9e5},{dimension:1280,bitrate:12e5},{dimension:1920,bitrate:25e5},{dimension:2560,bitrate:35e5},{dimension:3840,bitrate:5e6}],en={h:1,m:2,l:4};function tn(e,t){return!e||!t?e===t:e.streams.length===t.streams.length?e.streams.every((e,n)=>N.isObjectsEquals(e,t.streams[n])):!1}function nn(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return length>0?t[length-1].bitrate:$t[0].bitrate}function rn(e=Zt.WIDTH,t=Zt.HEIGHT,n=$t){let r=[`h`,`m`,`l`],i=Math.max(e,t),a=1;i>=960?a=3:i>=480&&(a=2);let o={streams:[]},s=nn(i,n)??Zt.BITRATE;for(let i=0;i<a;i++){let a=r[i];o.streams.push({rid:a,width:e,height:t,fps:30,bitrate:s}),e=Math.round(e/2),t=Math.round(t/2),s=nn(Math.max(e,t),n)??Math.round(s/2)}return o}function an(e){return e?en[e]??1:1}var on=typeof Object.fromEntries==`function`?Object.fromEntries:function(e){if(!e||!e[Symbol.iterator])throw Error(`Object.fromEntries() requires a single iterable argument`);let t={};for(let[n,r]of e)t[n]=r;return t};async function sn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var cn=533,ln=`a=fmtp:`,un=`sps-pps-idr-in-keyframe=1`,dn;(function(e){let t=/[\r\n]+/;function n(e,t){let n=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),r,i=[];for(r=0;r<e.length;++r){let a=e[r].match(n);a&&a.length===3&&a[2]===t&&i.push(a[1])}return i}function r(e,t,n){let r=e.split(` `),i=r.slice(0,3),a;for(a=3;a<r.length;a++)n.includes(r[a])&&i.push(r[a]);for(a=3;a<r.length;a++)!n.includes(r[a])&&!t.includes(r[a])&&i.push(r[a]);return i.join(` `)}function i(e,t,n,i){let a,o=`m=`+t;for(a=0;a<e.length;++a)e[a].startsWith(o)&&(e[a]=r(e[a],n,i))}function a(e,t){let n=RegExp(`a=fmtp:(\\d+)`);for(let r=0;r<e.length;++r){let i=e[r].match(n);if(i&&i.length===2&&t.includes(i[1])){let t=e[r].trim()===ln+i[1]?` `:`;`;e[r]+=t+un}}}function o(e,t,r=`video`){let a=n(e,t);if(!a.length)return;let o=a.slice(0),s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`),c;for(c=0;c<e.length;++c){let t=e[c].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}let l=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`);for(c=e.length;c--;){let t=e[c].match(l);t&&t.length===3&&o.includes(t[2])&&e.splice(c,1)}i(e,r,o,[])}function s(e,t,n,r){let i=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),a,o=[];for(a=t;a<n;++a){let t=e[a].match(i);t&&t.length===3&&t[2]===r&&o.push(t[1])}if(!o.length)return o;let s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`);for(a=t;a<n;++a){let t=e[a].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}return o}function c(e,t,n,i){let a=s(e,t,n,i);if(!a.length)return n+1;let o=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`),c=0,l=n;for(;l>=t;){let t=e[l].match(o);t&&t.length===3&&a.includes(t[2])&&(e.splice(l,1),c++),l--}return e[t]=r(e[t],a,[]),n-c+1}function l(e,t,n,r){let i=-1,a=-1,o=!1;for(let s=0;s<e.length;++s)if(i>=0&&e[s].startsWith(`m=`)&&(a=s-1,o&&(s=c(e,i,a,t)),i=-1,a=-1,o=!1),e[s].startsWith(`m=video`)&&(i=s),i>=0){let t=n===`remote`&&r===`encoder`||n===`local`&&r===`decoder`?`recvonly`:`sendonly`;(e[s].startsWith(`a=${t}`)||e[s].startsWith(`a=sendrecv`))&&(o=!0)}a=e.length-1,i>=0&&o&&c(e,i,a,t)}function u(e,t){let r=n(e,`H264`);t&&i(e,`video`,[],r),a(e,r)}function d(e){i(e,`video`,[],n(e,`VP9`))}function f(e){[`G722`,`PCMU`,`PCMA`,`CN`,`telephone-event`].forEach(t=>{o(e,t,`audio`)})}function p(e,r,a,o,s=!1){let c=e.split(t);if(f(c),!r&&!a&&!o&&!s)return c.join(`\r
|
|
8
|
+
`);function p(e){let t=[`a=rtcp-fb:111 nack`,`a=rtcp-fb:111 nack pli`],n=e.findIndex(e=>e.startsWith(`a=rtcp-fb:111`));return~n&&(e[n]=e[n]+`\r
|
|
9
|
+
`+t.join(`\r
|
|
10
|
+
`)),e}function m(e){let t=n(e,`red`);t.length>0&&i(e,`audio`,[],t)}return a?l(c,`H264`,`local`,`decoder`):u(c,r),o&&d(c),m(c),s&&p(c),c.join(`\r
|
|
11
|
+
`)}e.patchLocalSDP=p;function m(e,n,r,i,a,s,c){n&&(e=e.replace(`m=application 9 UDP/DTLS/SCTP webrtc-datachannel`,`m=application 9 DTLS/SCTP 5000`).replace(`a=sctp-port:5000`,`a=sctpmap:5000 webrtc-datachannel 256`));let p=e.split(t);return i?o(p,`H264`):r&&u(p,r),s&&c?o(p,`VP9`):s?l(p,`VP9`,`remote`,`encoder`):c?l(p,`VP9`,`remote`,`decoder`):a&&d(p),f(p),p.join(`\r
|
|
12
|
+
`)}e.patchRemoteSDP=m;function h(e){return e?`${e.type||`WEB_SOCKET`}_${e.id}`:`_`}e.getPeerIdString=h;function ee(e,t){return e&&e.id===t.id&&(e.type||`WEB_SOCKET`)===(t.type||`WEB_SOCKET`)}e.comparePeerId=ee;async function te(e){let t={local:null,remote:null};if(!e||!e.getStats)return t;try{let n=await e.getStats(null),r=null;if(n.forEach(e=>{e.type===`transport`&&e.selectedCandidatePairId?r=n.get(e.selectedCandidatePairId):e.type===`candidate-pair`&&e.state===`succeeded`&&!r&&(!Object.hasOwn(e,`selected`)||e.selected)&&(r=e)}),r?.localCandidateId){let e=n.get(r.localCandidateId);e&&(t.local={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}if(r?.remoteCandidateId){let e=n.get(r.remoteCandidateId);e&&(t.remote={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}return t}catch{return t}}e.getPeerConnectionHostInfo=te;let g=/^[0-9]+$/,_=/^([gu])([0-9]+)$/;function ne(e,t=M.USER){let n=String(e);return _.test(n)?(B.warn(`Already composite id [${e}] type supplied [${t}]`),n):t===M.GROUP?`g`+n:t===M.USER?`u`+n:(B.warn(`Unknown type [${t}] for id [${e}]`),n.match(g)?`u`+n:n)}e.composeUserId=ne;function v(e,t,n=0){return y(ne(e,t),n)}e.composeParticipantId=v;function y(e,t){return t?e+`:d`+t:e}e.compose=y;function b(e){return v(e.id,e.idType||M.USER,e.deviceIdx)}e.composeId=b;function re(e){if(e.decorativeUserId)return v(e.decorativeUserId,e.idType||M.USER,e.deviceIdx)}e.composeDecorativeId=re;function ie(e){return e.participant?b(e.participant):v(e.participantId,e.participantType||M.USER,e.deviceIdx)}e.composeMessageId=ie;function ae(e){return typeof e==`string`?oe(se(e).compositeUserId).id:e}e.extractOkId=ae;function oe(e){let t=String(e),n=t.match(_);return n?{id:Number(n[2]),type:n[1]===`g`?M.GROUP:M.USER}:(B.warn(`Unsupported compositeId [${e}]`),{id:Number(t),type:M.USER})}e.decomposeId=oe;function se(e){let t=e.split(`:d`);return{compositeUserId:t[0],deviceIdx:t.length>1?parseInt(t[1],10):0}}e.decomposeParticipantId=se;function ce(){let e=window.crypto?.randomUUID?.();if(e)return e;let t=`0123456789abcdefghijklmnopqrstuvwxyz`.split(``),n=Array(36),r=0,i,a;for(a=0;a<36;a++)a===8||a===13||a===18||a===23?n[a]=`-`:a===14?n[a]=`4`:(r<=2&&(r=33554432+Math.random()*16777216|0),i=r&15,r>>=4,n[a]=t[a===19?i&3|8:i]);return n.join(``)}e.uuid=ce;function x(e,t){let n;function r(...r){let i=this;n&&window.clearTimeout(n),n=window.setTimeout(()=>{e.apply(i,r)},t)}return r}e.debounce=x;function le(e){if(!window.BigInt)return null;let t=``,n=e.split(`
|
|
13
|
+
`);for(let e of n)if(e.startsWith(`a=fingerprint`)){let n=e.split(` `);if(n.length===2){t=n[1];break}}if(!t)return BigInt(-1);let r=t.split(`:`),i=BigInt(0);for(let e=Math.min(7,r.length-1);e>=0;e--){let t=BigInt(parseInt(r[e],16));i<<=BigInt(8),i|=t}return BigInt.asIntN(64,i)}e.sdpFingerprint=le;async function ue(e,{signal:t}={}){return new Promise((n,r)=>{if(t?.aborted)return r(t.reason);let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason)};t?.addEventListener(`abort`,a,{once:!0})})}e.delay=ue;function de(e,t,n,r=B){let i=[];return e.getSenders().forEach(e=>fe(t,e,e.track,n,i,r)),i}e.applySettings=de;function fe(e,t,n,r,i,a=B){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!e||!n||n.kind!==j.video)return;let o=n.getSettings();if(!o)return;let s=e.maxBitrateK?e.maxBitrateK*1024:null,c=o.width,l=o.height,u=c&&l&&e.maxDimension?Math.max(1,Math.max(c,l)/e.maxDimension):null,d=e.maxFramerate||null;if(c&&l&&e.maxDimension&&e.maxDimension>Math.max(c,l)){let e=Math.round(c*l/256),t=(Math.round(e*cn/1e4)+1)*1e4;s=s===null?t:Math.min(t,s)}let f=e.degradationPreference||`balanced`,p=r[n.id];if(p&&p.bitrate===s&&p.scaleResolutionDownBy===u&&p.maxFramerate===d&&p.degradationPreference===f){i[n.id]=p;return}i[n.id]={bitrate:s,scaleResolutionDownBy:u,maxFramerate:d,degradationPreference:f};let m=t.getParameters();if(m.encodings||(m.encodings=[{}]),m.encodings.length>1&&c&&l&&e.maxDimension){let t=Math.round(e.maxDimension*1.35),n=Math.max(c,l),r=rn(c,l,e?.bitrates?.generic),i=r.streams.length;a.log(`applyVideoTrackSettings: maxDim=${e.maxDimension} targetDim=${t} track=${c}x${l} sim=${JSON.stringify(r)}`),m.encodings.forEach((e,a)=>{e.scaleResolutionDownBy=an(e.rid);let o=Math.round(n/e.scaleResolutionDownBy);a<i-1?e.active=o<t:a>=i?e.active=!1:e.active=!0,a<i?e.maxBitrate=r.streams[a].bitrate:e.maxBitrate=0,e.scalabilityMode=Qt})}else m.encodings.forEach(t=>{e?.scalabilityMode&&(t.scalabilityMode=e.scalabilityMode),s?t.maxBitrate=s:delete t.maxBitrate,u?t.scaleResolutionDownBy=u:delete t.scaleResolutionDownBy,d?t.maxFramerate=d:delete t.maxFramerate});if(m.degradationPreference=f,m.encodings.length>0){t.setParameters?.(m).catch(e=>{a.error(`Failed to set sender parameters`,m,e)});let e=t.getParameters();a.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(e.encodings)}`)}}e.applyVideoTrackSettings=fe;function pe(e,t){Array.isArray(t)||(t=[t]);for(let n of t)if(e.includes(n))return!0;return!1}e.includesOneOf=pe;function me(e){return Object.entries(e.participantState?.state||{}).reduce((t,[n,r])=>(e.participantState&&(t[n]={ts:e.participantState.stateUpdateTs[n],state:r}),t),{})}e.mapParticipantState=me;function he(e){let t=e.map(e=>({uid:e.externalId,mediaSettings:e.mediaSettings,status:e.status,muteStates:e.muteStates,unmuteOptions:e.unmuteOptions,participantState:e.participantState,markers:e.markers,movieShareInfos:e.movieShareInfos,roles:e.roles}));return P.filterObservers?t.filter(e=>!e.uid.observer):t}e.mapSharedParticipants=he;function ge(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let i of n)if(!Object.hasOwn(r,i)||e[i].state!==t[i].state||e[i].ts!==t[i].ts)return!1;return!0}e.isEqualParticipantState=ge;function _e(e,t,n=!1){let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let i of r){if(!Object.hasOwn(t,i))return!1;let r=e[i],a=t[i];if(n&&Se(r)&&Se(a))return _e(r,a,n);if(r!==a)return!1}return!0}e.isObjectsEquals=_e;function ve(e,t){if(e.length!==t.length)return!1;for(let n of e)if(t.indexOf(n)<0)return!1;return!0}e.isArraysEquals=ve;function ye(e){return!Object.keys(e).length}e.isEmptyObject=ye;function S(e,t){if(!e&&!t)return 0;if(!e||!t)return e?-1:1;return r(t.rank,e.rank)||r(e.ts,t.ts)||n(e,t);function n(e,t){let n={[M.USER]:0,[M.GROUP]:1},{compositeUserId:i,deviceIdx:a}=se(e.id),{compositeUserId:o,deviceIdx:s}=se(t.id),{id:c,type:l}=oe(i),{id:u,type:d}=oe(o);return r(n[l],n[d])||r(c,u)||r(a,s)}function r(e,t){return e<t?-1:e===t?0:1}}e.participantMarkerCompare=S;function be(e,t){return on(Object.entries(e).filter(([,e])=>Array.isArray(t)?!t.includes(e):e!==t))}e.objectFilterOutValues=be;function xe(e,t,n){let r=n;for(let n in e)Object.hasOwn(e,n)&&(r=t(r,e[n],n));return r}e.objectReduce=xe,e.setImmediate=(()=>{let e=1,t={},n=null;return typeof MessageChannel<`u`&&(n=new MessageChannel,n.port1.onmessage=e=>{let n=e.data;t[n]&&(t[n](),delete t[n])}),function(r){if(n&&document.visibilityState===`hidden`){let i=e;return e=e>=2**53-1?1:e+1,t[i]=r,n.port2.postMessage(i),()=>{t[i]&&delete t[i]}}let i=setTimeout(r,0);return()=>clearTimeout(i)}})();function Se(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}e.isObject=Se;function Ce(e,n,r,i){function a(e,t){let n=0,r=e.length,i=!1;for(let a=0;a<e.length;a++)if(!i&&e[a].startsWith(`m=video`)&&(n=a),e[a].startsWith(`a=mid:`+t)&&(i=!0),i&&e[a].startsWith(`m=`)){r=a;break}return{start:n,end:r}}function o(e,t,n,r,i,a,o){let s=`a=rid:`+r+` send`;for(let r=t;r<n;r++)e[r]===s&&(e[r]=s+` max-width=`+a+`;max-height=`+o+`;max-br=`+i)}let s=n?.sender;if(s&&s.track&&n.mid){let c=e.split(t),{start:l,end:u}=a(c,n.mid),d=s.getParameters();if(d.encodings)return d.encodings.forEach(e=>{let t=e.rid,n=e.maxBitrate,a=e.scaleResolutionDownBy;r&&i&&a&&o(c,l,u,t,n,``+Math.round(r/a),``+Math.round(i/a))}),c.join(`\r
|
|
14
|
+
`)}return e}e.patchSimulcastAnswerSdp=Ce})(dn||(dn={}));var N=dn,fn=`__CALLS_SDK_DEVTOOLS_`,pn=class{set(e,t){try{this.getStorage().setItem(fn+e,JSON.stringify(t))}catch(t){B.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(fn+e);return t===null?null:JSON.parse(t)}catch(t){return B.warn(`DevTools: Failed to read option`,e,t),null}}remove(e){try{this.getStorage().removeItem(fn+e)}catch(t){B.warn(`DevTools: Failed to remove option`,e,t)}}clear(){try{let e=this.getStorage(),t=Object.keys(e);for(let n of t)n.startsWith(fn)&&e.removeItem(n)}catch(e){B.warn(`DevTools: Failed to clear options`,e)}}getAll(){try{let e=this.getStorage(),t=Object.keys(e),n={};for(let r of t)if(r.startsWith(fn)){let t=r.substring(21),i=e.getItem(r);if(i!==null)try{n[t]=JSON.parse(i)}catch{}}return n}catch(e){return B.warn(`DevTools: Failed to get all options`,e),{}}}getStorage(){return window.localStorage}},mn=class{constructor(e){g(this,`storage`,void 0),this.storage=e}set(e,t){this.storage.set(e,t),console.debug(`DevTools: ${String(e)} override set to ${t}`)}get(e){return this.storage.get(e)}clear(e){this.storage.remove(e),console.debug(`DevTools: ${String(e)} override cleared`)}clearAll(){this.storage.clear(),console.debug(`DevTools: All overrides cleared`)}getAll(){return this.storage.getAll()}applyOverrides(e){let t=this.getAll(),n={...e},r=Object.keys(t);if(r.length>0){console.debug(`DevTools: Current overrides:`,t);for(let e of r)t[e]!==void 0&&(n[e]=t[e]);console.debug(`DevTools: Overrides applied`)}return n}},hn=class e{static getInstance(){return e.instance||(e.instance=new e),e.instance}constructor(){g(this,`params`,void 0),g(this,`storage`,void 0),this.storage=new pn,this.params=new mn(this.storage)}};g(hn,`instance`,null);var gn=hn.getInstance(),P=class e{static set(t){Object.hasOwn(t,`voiceParams`)&&(Object.assign(e._params.voiceParams,t.voiceParams),delete t.voiceParams),Object.hasOwn(t,`specListenerParams`)&&(Object.assign(e._params.specListenerParams,t.specListenerParams),delete t.specListenerParams),Object.hasOwn(t,`apiAuth`)&&(C.accessToken=t.apiAuth.accessToken,C.sessionKey=t.apiAuth.sessionKey,C.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=gn.params.applyOverrides(t);Object.assign(e._params,N.objectFilterOutValues(n,void 0))}static getScreenFrameRate(t){return t?e._params.fastScreenShareFrameRate:e._params.screenFrameRate}static get(t){return e._params[t]}static get appName(){return`ok.calls.sdk.js`}static get appVersion(){return 1.1}static get sdkVersion(){return`2.8.11-dev.3de63af6.0`}static get debug(){return e._params.debug}static get protocolVersion(){return e._params.joinFromMultipleDevices?6:5}static get platform(){return e._params.platform}static set platform(t){e._params.platform=t}static get clientStatsPlatform(){return e._params.clientStatsPlatform}static set clientStatsPlatform(t){e._params.clientStatsPlatform=t}static get clientType(){return e._params.clientType}static set clientType(t){e._params.clientType=t}static get externalUserType(){return e._params.externalUserType}static set externalUserType(t){e._params.externalUserType=t}static get device(){return e._params.device}static get apiKey(){return e._params.apiKey}static get apiEnv(){return e._params.apiEnv}static get apiBaseUrl(){return e._params.apiBaseUrl}static set apiBaseUrl(t){e._params.apiBaseUrl=t}static apiEndpoint(t){switch(t??e.apiEnv){case`AUTO`:case`PROD`:return`https://api.mycdn.me`;case`CALLS`:return`https://calls.okcdn.ru`;case`PROD_OK`:return`https://api.ok.ru`;case`TEST`:return`https://apitest.ok.ru/api`;case`VIDEOTEST`:return`https://videotestapi.ok.ru/api`;case`CALLSTEST`:return`https://calls-test.okcdn.ru/api`;case`CALLS_BETA`:return`https://api-beta.calls-test.oneme.ru/api`;case`CALLS_BENDER`:return`https://api-bender.calls-test.oneme.ru/api`;case`CALLS_MAMES`:return`https://api-mames.calls-test.oneme.ru/api`;case`CALLS_MARS`:return`https://api-mars.calls-test.oneme.ru/api`;default:return e._params.apiEnv}}static get apiTimeout(){return e._params.apiTimeout}static get apiMaxAttempt(){return e._params.apiMaxAttempt}static get authToken(){return e._params.authToken}static set authToken(t){e._params.authToken=t}static get anonymToken(){return e._params.anonymToken}static set anonymToken(t){e._params.anonymToken=t}static get domain(){return e._params.domain}static get externalDomain(){return e._params.externalDomain}static get iceServers(){return e._params.iceServers}static set iceServers(t){e._params.iceServers=t}static get wssBase(){return e._params.wssBase}static set wssBase(t){e._params.wssBase=t}static get wtsBase(){return e._params.wtsBase}static set wtsBase(t){e._params.wtsBase=t}static get wssToken(){return e._params.wssToken}static set wssToken(t){e._params.wssToken=t}static get signalingReconnectDelay(){return e._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return e._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return e._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return e._params.waitConnectionDelay}static get waitResponseDelay(){return e._params.waitResponseDelay}static get waitMessageDelay(){return e._params.waitMessageDelay}static get waitAnotherTabDelay(){return e._params.waitAnotherTabDelay}static get debugLog(){return e._params.debugLog}static get forceRelayPolicy(){return e._params.forceRelayPolicy}static set forceRelayPolicy(t){e._params.forceRelayPolicy=t}static get videoMinWidth(){return e._params.videoMinWidth}static get videoMaxWidth(){return e._params.videoMaxWidth}static set videoMaxWidth(t){e._params.videoMaxWidth=t}static get videoMinHeight(){return e._params.videoMinHeight}static get videoMaxHeight(){return e._params.videoMaxHeight}static set videoMaxHeight(t){e._params.videoMaxHeight=t}static get videoAspectRatio(){return e._params.videoAspectRatio}static get videoFrameRate(){return e._params.videoFrameRate}static get videoFacingMode(){return e._params.videoFacingMode||(k.isMobile()?Mt.USER:null)}static set videoFacingMode(t){e._params.videoFacingMode=t}static get displaySurface(){return e._params.displaySurface}static get audioEffects(){return e._params.audioEffects}static set audioEffects(t){e._params.audioEffects=t,e._params.audioEffects?.setLogger((e,...t)=>B.send(e,...t))}static get videoEffects(){return e._params.videoEffects}static set videoEffects(t){e._params.videoEffects=t,e._params.videoEffects?.setLogger((e,...t)=>B.send(e,...t))}static get videoEffectMaxWidth(){return e._params.videoEffectMaxWidth}static set videoEffectMaxWidth(t){e._params.videoEffectMaxWidth=t}static get videoEffectMaxHeight(){return e._params.videoEffectMaxHeight}static set videoEffectMaxHeight(t){e._params.videoEffectMaxHeight=t}static get vmoji(){return e._params.vmoji?.isBrowserSupported()?e._params.vmoji:null}static set vmoji(t){e._params.vmoji=t}static get vmojiOptions(){return e._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(t){e._params.vmojiOptions=t}static get voiceParams(){return e._params.voiceParams}static get specListenerParams(){return e._params.specListenerParams}static get iceRestartWaitTime(){return e._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return e._params.transportConnectionWaitTime}static get statisticsInterval(){return e._params.statisticsInterval}static set statisticsInterval(t){e._params.statisticsInterval=t}static get networkStatisticsInterval(){return e._params.networkStatisticsInterval}static get perfStatReportEnabled(){return e._params.perfStatReportEnabled}static get callStatReportEnabled(){return e._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return e._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return e._params.enableLogPerfStatReport}static get asrDataChannel(){return e._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return e._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return e._params.screenShareWebmBuilder}static get noiseSuppression(){return e._params.noiseSuppression}static get preferH264(){return e._params.preferH264}static get preferVP9(){return e._params.preferVP9}static get audioNack(){return e._params.audioNack}static get movieShare(){return e._params.movieShare&&e.videoTracksCount>0}static get videoTracksCount(){return Number(e._params.videoTracksCount)}static get breakVideoPayloadTypes(){return e._params.breakVideoPayloadTypes}static get useCallsToContacts(){return e._params.useCallsToContacts}static get useParticipantListChunk(){return e._params.useParticipantListChunk&&e.videoTracksCount>0}static get useRooms(){return e._params.useRooms}static get useChatRooms(){return e._params.useChatRooms}static get addParticipant(){return e._params.addParticipant}static get waitForAdminInGroupCalls(){return e._params.waitForAdminInGroupCalls}static get hold(){return e._params.hold}static get participantListChunkInitIndex(){return e._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return e._params.participantListChunkInitCount??null}static get filterObservers(){return e._params.filterObservers}static get muteMode(){return e._params.muteMode}static get preserveAudioTracks(){return e._params.preserveAudioTracks}static get audioShare(){return k.isAudioShareSupported()&&e._params.audioShare}static get audioShareWindowInclude(){return e._params.audioShareWindowInclude}static get audioShareSystemInclude(){return e._params.audioShareSystemInclude}static get fastScreenShare(){return e._params.fastScreenShare}static get screenShareCongestionControl(){return e._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return e._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return e._params.fastScreenShareWidth}static get fastScreenShareHeight(){return e._params.fastScreenShareHeight}static get consumerFastScreenShare(){return e._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return e._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return e._params.videoSuspend}static get enumerateDevicesDelay(){return e._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return e._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return e._params.enableVideoEffectsFpsDegradation}static get simulcast(){return k.isSimulcastSupportedByBrowser()&&e._params.simulcast}static get webtransport(){return e._params.webtransport}static get webtransportFF(){return e._params.webtransportFF}static get transparentAudio(){return e._params.transparentAudio}static toJSON(){return{apiKey:e._params.apiKey,apiEnv:e._params.apiEnv,audioShare:e._params.audioShare,audioShareWindowInclude:e._params.audioShareWindowInclude,audioShareSystemInclude:e._params.audioShareSystemInclude,useCallsToContacts:e._params.useCallsToContacts,useParticipantListChunk:e._params.useParticipantListChunk,useRooms:e._params.useRooms,useChatRooms:e._params.useChatRooms,addParticipant:e._params.addParticipant,fastScreenShare:e._params.fastScreenShare,participantListChunkInitCount:e._params.participantListChunkInitCount,screenShareCongestionControl:e._params.screenShareCongestionControl,screenShareCongestionControlThreshold:e._params.screenShareCongestionControlThreshold,videoTracksCount:e._params.videoTracksCount,asrDataChannel:e._params.asrDataChannel,videoMaxHeight:e._params.videoMaxHeight,videoMaxWidth:e._params.videoMaxWidth,videoEffectMaxHeight:e._params.videoEffectMaxHeight,videoEffectMaxWidth:e._params.videoEffectMaxWidth,videoSuspend:e._params.videoSuspend,debugLog:e._params.debugLog,callStatReportEnabled:e._params.callStatReportEnabled,joinFromMultipleDevices:e._params.joinFromMultipleDevices,movieShare:e._params.movieShare,clientType:e._params.clientType,clientStatsPlatform:e._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:e._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:e._params.switchVideoAtBadNetwork,simulcast:e._params.simulcast,webtransport:e._params.webtransport,webtransportFF:e._params.webtransportFF,transparentAudio:e._params.transparentAudio}}};g(P,`_params`,{platform:`WEB`,clientStatsPlatform:``,clientType:`PORTAL`,externalUserType:``,device:`browser`,apiKey:``,authToken:``,anonymToken:``,apiEnv:`AUTO`,apiBaseUrl:null,domain:``,externalDomain:``,iceServers:[],wssBase:``,wtsBase:``,wssToken:``,signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,apiTimeout:5e3,apiMaxAttempt:10,forceRelayPolicy:!1,videoMinWidth:428,videoMinHeight:240,videoMaxWidth:1280,videoMaxHeight:720,videoAspectRatio:16/9,videoFrameRate:25,screenFrameRate:15,videoFacingMode:null,displaySurface:`monitor`,audioEffects:null,videoEffects:null,videoEffectMaxWidth:640,videoEffectMaxHeight:360,vmoji:null,vmojiOptions:null,iceRestartWaitTime:2e4,transportConnectionWaitTime:5e3,statisticsInterval:5e3,networkStatisticsInterval:2e4,perfStatReportEnabled:!0,callStatReportEnabled:!1,clientEventsLoggingEnabled:!1,enableLogPerfStatReport:!1,voiceParams:{smoothing:.8,minFreq:200,maxFreq:5e3,interval:500,threshold:.35,speakerLevelMultiplier:1.8},specListenerParams:{connectionTimeout:1e4,volumeTimeout:1e4},asrDataChannel:!1,consumerScreenDataChannelPacketSize:64*1024,screenShareWebmBuilder:!1,noiseSuppression:!0,preferH264:!1,preferVP9:!1,audioNack:!0,videoTracksCount:30,movieShare:!1,useCallsToContacts:!1,useParticipantListChunk:!1,useRooms:!1,useChatRooms:!1,addParticipant:!1,waitForAdminInGroupCalls:!1,hold:!1,participantListChunkInitIndex:0,participantListChunkInitCount:null,breakVideoPayloadTypes:!1,joinFromMultipleDevices:!1,filterObservers:!1,muteMode:!1,preserveAudioTracks:!1,audioShare:!1,audioShareWindowInclude:!1,audioShareSystemInclude:!1,fastScreenShare:!1,screenShareCongestionControl:!1,screenShareCongestionControlThreshold:2100,consumerFastScreenShare:!1,consumerFastScreenShareQualityOnDemand:!1,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,webtransportFF:!1,transparentAudio:!1});var F=function(e){return e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.WAITING=`WAITING`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`,e.RECONNECT=`RECONNECT`,e.ERROR=`ERROR`,e.HANGUP=`HANGUP`,e.PERMISSIONS=`PERMISSIONS`,e}({});function I(e,...t){let n=P.get(e);typeof n==`function`&&setTimeout(n,0,...t)}function L(e,t,...n){if(P.filterObservers){if(Array.isArray(t)){if(t=t.filter(e=>!e.observer),!t.length)return}else if(t.observer)return}I(e,t,...n)}function R(e){return Object.assign({},e)}function _n(e){return e.slice()}var vn;(function(e){function t(e,t){I(`onLocalStream`,e,R(t))}e.onLocalStream=t;function n(e,t){I(`onScreenStream`,e,R(t))}e.onScreenStream=n;function r(e,t){I(`onVmojiStream`,e,R(t))}e.onVmojiStream=r;function i(e){I(`onVmojiError`,e)}e.onVmojiError=i;function a(e,t){I(`onLocalStreamUpdate`,R(e),t)}e.onLocalStreamUpdate=a;function o(e){B.debug(`Local status:`,e),I(`onLocalStatus`,e)}e.onLocalStatus=o;function s(e,t){L(`onRemoteStream`,e,t)}e.onRemoteStream=s;function c(e,t){L(`onRemoteLive`,e,t)}e.onRemoteLive=c;function l(e,t){L(`onLocalLive`,e,t)}e.onLocalLive=l;function u(e,t){L(`onRemoteLiveUpdate`,e,t)}e.onRemoteLiveUpdate=u;function d(e,t){L(`onLocalLiveUpdate`,e,t)}e.onLocalLiveUpdate=d;function f(e,t){L(`onRemoteScreenStream`,e,t)}e.onRemoteScreenStream=f;function p(e,t){L(`onRemoteVmojiStream`,e,t)}e.onRemoteVmojiStream=p;function m(e,t,n){L(`onRemoteStreamSuspended`,e,t,n)}e.onRemoteStreamSuspended=m;function h(e,t,n,r,i){L(`onConversation`,e,R(t),R(n),r,i)}e.onConversation=h;function ee(e){e&&I(`onConversationParticipantListChunk`,e)}e.onConversationParticipantListChunk=ee;function te(e,t,n){L(`onRemoteMediaSettings`,e,R(t),n)}e.onRemoteMediaSettings=te;function g(e,t){L(`onLocalMediaSettings`,e,R(t))}e.onLocalMediaSettings=g;function _(e,t,n){L(`onRemoteSharedMovieInfo`,e,R(t),n)}e.onRemoteSharedMovieInfo=_;function ne(e,t,n){L(`onRemoteSharedMovieStoppedInfo`,e,R(t),n)}e.onRemoteSharedMovieStoppedInfo=ne;function v(e,t,n){L(`onLocalSharedMovieInfo`,e,R(t),n)}e.onLocalSharedMovieInfo=v;function y(e,t,n){L(`onLocalSharedMovieStoppedInfo`,e,R(t),n)}e.onLocalSharedMovieStoppedInfo=y;function b(e,t,n){L(`onRemoteSharedUrl`,e,t,n)}e.onRemoteSharedUrl=b;function re(e,t){L(`onParticipantAdded`,e,t)}e.onParticipantAdded=re;function ie(e,t){L(`onParticipantJoined`,e,t)}e.onParticipantJoined=ie;function ae(e,t=!1){I(`onLocalParticipantState`,R(e),t)}e.onLocalParticipantState=ae;function oe(e,t,n){L(`onRemoteParticipantState`,e,R(t),n)}e.onRemoteParticipantState=oe;function se(e,t){I(`onRemoteParticipantsState`,e,t)}e.onRemoteParticipantsState=se;function ce(e,t,n=null){B.debug(`Remote status:`,t,e),L(`onRemoteStatus`,e,t,n)}e.onRemoteStatus=ce;function x(){I(`onPermissionsRequested`)}e.onPermissionsRequested=x;function le(e,t){I(`onPermissionsError`,e,t)}e.onPermissionsError=le;function ue(e,t){L(`onRemoteRemoved`,e,t)}e.onRemoteRemoved=ue;function de(e,t,n){I(`onCallState`,e,t,R(n))}e.onCallState=de;function fe(e,t){I(`onDeviceSwitched`,e,t)}e.onDeviceSwitched=fe;function pe(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null){let u=c?_n(c):void 0;I(`onMuteStates`,R(e),_n(t),_n(n),r,i,a,o,s,u,l)}e.onMuteStates=pe;function me(e,t,n=!1){L(`onRolesChanged`,e,_n(t),n)}e.onRolesChanged=me;function he(e,t=!1){I(`onLocalRolesChanged`,_n(e),t)}e.onLocalRolesChanged=he;function ge(e,t,n,r){L(`onPinnedParticipant`,e,t,n,r)}e.onPinnedParticipant=ge;function _e(e,t){I(`onLocalPin`,e,t)}e.onLocalPin=_e;function ve(e){I(`onOptionsChanged`,_n(e))}e.onOptionsChanged=ve;function ye(){I(`onCallAccepted`)}e.onCallAccepted=ye;function S(e,t){L(`onAcceptedCall`,e,t)}e.onAcceptedCall=S;function be(){I(`onRateNeeded`)}e.onRateNeeded=be;function xe(e){L(`onSpeakerChanged`,e)}e.onSpeakerChanged=xe;function Se(e){I(`onVolumesDetected`,_n(e))}e.onVolumesDetected=Se;function Ce(e,t){I(`onLocalVolume`,e,t)}e.onLocalVolume=Ce;function we(e,t){I(`onJoinStatus`,e,t)}e.onJoinStatus=we;function Te(e,t){I(`onHangup`,e,t)}e.onHangup=Te;function Ee(e){I(`onMultipartyChatCreated`,R(e))}e.onMultipartyChatCreated=Ee;function De(){I(`onDeviceChange`)}e.onDeviceChange=De;function Oe(e){I(`onFingerprintChange`,e)}e.onFingerprintChange=Oe;function ke(){I(`onTokenExpired`)}e.onTokenExpired=ke;function Ae(e,t,n=!1){I(`onChatMessage`,e,t,n)}e.onChatMessage=Ae;function je(e,t,n=!1){I(`onCustomData`,e,t,n)}e.onCustomData=je;function Me(e,t,n,r,i,a,o=null){I(`onRecordStarted`,e,t,n,r,i,a,o)}e.onRecordStarted=Me;function Ne(e=null,t){I(`onRecordStopped`,e,t)}e.onRecordStopped=Ne;function Pe(e){I(`onLocalNetworkStatusChanged`,e)}e.onLocalNetworkStatusChanged=Pe;function Fe(e){I(`onNetworkStatusChanged`,e)}e.onNetworkStatusChanged=Fe;function Ie(e,...t){I(`onDebugMessage`,e,...t)}e.onDebugMessage=Ie;function Le(e,t,...n){I(`onDebugMessageWithContext`,e,t,...n)}e.onDebugMessageWithContext=Le;function Re(e,t){I(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=Re;function ze(){I(`onAutoplayError`)}e.onAutoplayError=ze;function Be(e,t,n,r,i){I(`onChatRoomUpdated`,e,t,n,r,i)}e.onChatRoomUpdated=Be;function Ve(e){I(`onPromoted`,e)}e.onPromoted=Ve;function He(e){I(`onRemoteMixedAudioStream`,e)}e.onRemoteMixedAudioStream=He;function Ue(e){I(`onJoinLinkChanged`,e)}e.onJoinLinkChanged=Ue;function We(e){I(`onRoomsUpdated`,e)}e.onRoomsUpdated=We;function Ge(e,t,n,r){I(`onRoomUpdated`,e,t,n,r)}e.onRoomUpdated=Ge;function Ke(e){I(`onRoomParticipantsUpdated`,e)}e.onRoomParticipantsUpdated=Ke;function qe(e){I(`onRoomSwitched`,e)}e.onRoomSwitched=qe;function Je(e){I(`onRoomStart`,e)}e.onRoomStart=Je;function Ye(e,t=null){I(`onFeedback`,e,t)}e.onFeedback=Ye;function Xe(e){I(`onFeaturesPerRoleChanged`,e)}e.onFeaturesPerRoleChanged=Xe;function C(e){I(`onParticipantVmojiUpdate`,e)}e.onParticipantVmojiUpdate=C;function w(e,t){I(`onAsrSet`,e,t)}e.onAsrSet=w;function T(e,t,n){I(`onAsrStarted`,e,t,n)}e.onAsrStarted=T;function E(e){I(`onAsrStopped`,e)}e.onAsrStopped=E;function Ze(e,t,n,r){I(`onAsrTranscription`,e,t,n,r)}e.onAsrTranscription=Ze;function Qe(e,t){I(`onParticipantIdChanged`,e,t)}e.onParticipantIdChanged=Qe;function $e(e){I(`onVideoSuspendSuggest`,e)}e.onVideoSuspendSuggest=$e;function et(e){I(`onSignalingMessage`,typeof e==`string`?e:R(e))}e.onSignalingMessage=et;function tt(e){I(`onPromotionApproved`,e)}e.onPromotionApproved=tt;function nt(){I(`onPeerRegistered`)}e.onPeerRegistered=nt})(vn||(vn={}));var z=vn,yn=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),bn;(function(e){let t=`📞`,n=()=>({sessionId:null,conversationId:null}),r=(e,t,...n)=>{z.onDebugMessage(t,...n),z.onDebugMessageWithContext(t,{conversationId:e.conversationId},...n)},i=console.debug.bind(console,t),a=console.log.bind(console,t),o=console.warn.bind(console,t),s=console.error.bind(console,t),c=!1;function l(e){if(!e)return n();try{return e()}catch{return n()}}function u(e,t,n){let u=l(n);if(P.debugLog&&Me(e,t,u.sessionId||void 0),c)switch(e){case`DEBUG`:i(...t);break;case`LOG`:a(...t);break;case`WARN`:o(...t);break;case`ERROR`:s(...t);break}else r(u,e,...t)}function d(...e){u(`DEBUG`,e)}e.debug=d;function f(...e){u(`LOG`,e)}e.log=f;function p(...e){u(`WARN`,e)}e.warn=p;function m(...e){u(`ERROR`,e)}e.error=m;function h(){return c}e.enabled=h;function ee(e){c=e,P.debugLog&&Ne()}e.toggle=ee;function te(e,...t){switch(e){case`DEBUG`:d(...t);break;case`LOG`:f(...t);break;case`WARN`:p(...t);break;case`ERROR`:m(...t);break}}e.send=te;function g(e){return{debug:(...t)=>u(`DEBUG`,t,e),log:(...t)=>u(`LOG`,t,e),warn:(...t)=>u(`WARN`,t,e),error:(...t)=>u(`ERROR`,t,e)}}e.createLogger=g;function _(e=null){let t=null,n=e;function r(){!P.debugLog||t||(t=Pe(),n&&Fe(n,t))}let i=()=>(r(),{sessionId:t,conversationId:n});return{get sessionId(){return t},get conversationId(){return n},setConversationId(e){n=e,t&&Fe(n,t)},debug:(...e)=>u(`DEBUG`,e,i),log:(...e)=>u(`LOG`,e,i),warn:(...e)=>u(`WARN`,e,i),error:(...e)=>u(`ERROR`,e,i)}}e.createSessionLogger=_;function ne(e,...t){}e.test=ne})(bn||(bn={}));var B=bn;function xn(e){return e.stopStream}function Sn(e){return e.keyFrameRequested}function Cn(e){if(xn(e))return`ss`;if(Sn(e))return`kf`;let t=``;return e.priority!==void 0&&(t+=`p=`+e.priority),e.width!==void 0&&e.height!==void 0&&(t!==``&&(t+=`:`),t+=`sz=`+Math.round(e.width)+`x`+Math.round(e.height)),e.fit!==void 0&&(t!==``&&(t+=`:`),t+=`fit=`+e.fit),t}var V=function(e){return e.CAMERA=`CAMERA`,e.SCREEN=`SCREEN`,e.STREAM=`STREAM`,e.MOVIE=`MOVIE`,e.ANIMOJI=`ANIMOJI`,e.SHARED_URL=`SHARED_URL`,e}({}),wn=`s`,Tn=`m`;function En(e){return e.participantId+(e.mediaType?`:`+wn+e.mediaType:``)+(e.streamName?`:`+Tn+e.streamName:``)}function Dn(e){let t=e.split(`:`),n=t.shift();if(!n)throw Error(`Illegal stream description: `+e);let r=null,i,a=0;for(let n of t)switch(n.charAt(0)){case wn:r=On(n.slice(1));break;case Tn:i=n.slice(1);break;case`d`:a=Number.parseInt(n.slice(1),10);break;default:throw Error(`Unexpected parameter type `+n.charAt(0)+` in stream description `+e)}return{participantId:N.compose(n,a),mediaType:r,streamName:i}}function On(e){for(let t of Object.keys(V))if(t===e)return V[t];return null}function kn(){let e=new DataView(new ArrayBuffer(64)),t=0;function n(n){if(t+n>e.byteLength){let r=new Uint8Array(Math.max(t+n,e.byteLength+64));r.set(new Uint8Array(e.buffer.slice(0,t))),e=new DataView(r.buffer)}}return{put(r){if(n(r.byteLength),An(r)){let n=r.buffer;new Uint8Array(e.buffer).set(new Uint8Array(n),t)}else new Uint8Array(e.buffer).set(new Uint8Array(r),t);t+=r.byteLength},putI8(r){n(1),e.setInt8(t,r),++t},putI16(r){n(2),e.setInt16(t,r),t+=2},putI32(r){n(4),e.setInt32(t,r),t+=4},putI64(r){n(8);let i=r<0;i&&(r=-r);let a=r/4294967296|0,o=r%4294967296|0;i&&(o=~o+1|0,a=o===0?~a+1|0:~a),e.setUint32(t,a),e.setUint32(t+4,o),t+=8},putUi8(r){n(1),e.setUint8(t,r),++t},putUi16(r){n(2),e.setUint16(t,r),t+=2},putUi32(r){n(4),e.setUint32(t,r),t+=4},putUi64(r){n(8),e.setUint32(t,r/4294967296|0),e.setUint32(t+4,r%4294967296),t+=8},putF(r){n(8),e.setFloat64(t,r),t+=8},ui8array(){return new Uint8Array(e.buffer.slice(0,t))}}}function An(e){return e.buffer!==void 0}function jn(e){let t=ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),n=0;return{peek(){return t.getUint8(n)},get(e){n+=e;let r=t.byteOffset;return t.buffer.slice(r+n-e,r+n)},getI8(){return t.getInt8(n++)},getI16(){return n+=2,t.getInt16(n-2)},getI32(){return n+=4,t.getInt32(n-4)},getI64(){n+=8;let e=t.getInt32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getUi8(){return t.getUint8(n++)},getUi16(){return n+=2,t.getUint16(n-2)},getUi32(){return n+=4,t.getUint32(n-4)},getUi64(){n+=8;let e=t.getUint32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getF32(){return n+=4,t.getFloat32(n-4)},getF64(){return n+=8,t.getFloat64(n-8)}}}var Mn=0,Nn=1,Pn=2,Fn=3,In=4,Ln=5,Rn=6,zn=7,Bn=0,Vn=1,Hn=2,Un=0,Wn=0,Gn=0,Kn=1,qn=class{constructor(e=B){g(this,`participantIdRegistry`,null),g(this,`_debug`,void 0),this._debug=e}setParticipantIdRegistry(e){this.participantIdRegistry=e}serializeUpdateDisplayLayout(e,t){let n=kn();l.Int.enc(n,Mn),l.Int.enc(n,Un),l.Int.enc(n,e),l.Nil.enc(n,null);let r=[];for(let e in t)Object.hasOwn(t,e)&&this.writeLayout(t,e,r);return l.Arr.enc(n,r),l.Nil.enc(n,null),n.ui8array().buffer}writeLayout(e,t,n){let r=e[t],i=kn();if(this.writeStreamDesc(t,i),xn(r))l.Int.enc(i,Vn);else if(Sn(r))l.Int.enc(i,Hn);else if(l.Int.enc(i,Bn),r.priority===void 0?l.Nil.enc(i,null):l.Int.enc(i,r.priority),r.width!==void 0&&r.height!==void 0?(l.Int.enc(i,Math.round(r.width)),l.Int.enc(i,Math.round(r.height))):(l.Nil.enc(i,null),l.Nil.enc(i,null)),r.fit!==void 0)switch(r.fit){case`cv`:l.Int.enc(i,Gn);break;case`cn`:l.Int.enc(i,Kn);break;default:l.Nil.enc(i,null)}else l.Nil.enc(i,null);n.push(i.ui8array().buffer)}writeStreamDesc(e,t){if(this.participantIdRegistry){let n=this.participantIdRegistry.getCompactId(e);if(n!==void 0){l.Int.enc(t,n);return}}l.Str.enc(t,e)}serializePerfStatReport(e,t){let n=kn();return l.Int.enc(n,Nn),l.Int.enc(n,Un),l.Int.enc(n,e),l.Int.enc(n,t.framesDecoded),l.Int.enc(n,t.framesReceived),n.ui8array().buffer}serializeSharingStatReport(e,t){let n=kn();return l.Int.enc(n,Pn),l.Int.enc(n,Un),l.Int.enc(n,e),l.Int.enc(n,t.minDelay),l.Int.enc(n,t.maxDelay),l.Int.enc(n,t.avgDelay),l.Int.enc(n,t.largeDelayDuration),n.ui8array().buffer}serializeRequestAsr(e,t){let n=kn();return l.Int.enc(n,Fn),l.Int.enc(n,Un),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=kn();return l.Int.enc(n,In),l.Int.enc(n,Un),l.Int.enc(n,e),l.Int.enc(n,t.timestamp),l.Int.enc(n,t.sendBitrate),n.ui8array().buffer}serializeEnableVideoSuspend(e,t){let n=kn();return l.Int.enc(n,Ln),l.Int.enc(n,Un),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=kn();return l.Int.enc(n,Rn),l.Int.enc(n,Un),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=kn();l.Int.enc(n,zn),l.Int.enc(n,Un),l.Int.enc(n,e);let r=t.simulcastInfo.streams.length;l.Int.enc(n,t.mediaSource),l.Int.enc(n,r);for(let e of t.simulcastInfo.streams)l.Str.enc(n,e.rid),l.Int.enc(n,e.width),l.Int.enc(n,e.height),l.Int.enc(n,e.fps),l.Int.enc(n,e.bitrate/1e3);return n.ui8array().buffer}async deserializeCommandResponse(e){let t;t=e instanceof Blob?jn(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await sn(e)):jn(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==Un){this._debug.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==Wn){this._debug.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case Mn:return this.deserializeUpdateDisplayLayoutResponse(t);case Nn:return this.deserializeReportPerfStatResponse(t);default:this._debug.warn(`unsupported command response commandType: `+n);return}}deserializeUpdateDisplayLayoutResponse(e){let t=l.Int.dec(e),n=l.Arr.dec(e),r={};return n.forEach(e=>{let t=jn(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=En(this.participantIdRegistry?.getStreamDescription(e));r[i]=l.Int.dec(t)}}),{type:`response`,sequence:t,response:b.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:r}}deserializeReportPerfStatResponse(e){let t=l.Int.dec(e),n=l.Int.dec(e);return{type:`response`,sequence:t,response:b.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:n}}},H=function(e){return e.CALL_FINISH=`call_finish`,e.CODEC_USAGE=`codec_usage`,e.SIGNALING_CONNECTED=`signaling_connected`,e.SCREENSHARE_FIRST_FRAME=`screen_share_first_frame`,e.FIRST_MEDIA_RECEIVED=`first_media_received`,e.CALL_DECLINED_OR_HANGED_LOCALLY=`CallDeclinedOrHangedLocally`,e.USER_FEEDBACK_RECEIVED=`UserFeedbackReceived`,e.CALL_START=`call_start`,e.SIGNALING_PING_SUMMARY=`signaling_ping_summary`,e.SIGNALING_COMMAND_SUMMARY=`signaling_command_summary`,e.WEBSOCKET_CONNECTED=`websocket_connected`,e.WEBSOCKET_RECONNECTED=`websocket_reconnected`,e.WEBSOCKET_FAILED_PINGS=`websocket_failed_pings`,e.WEBSOCKET_FAILED_EXCEPTION=`websocket_failed_exception`,e.WEBSOCKET_TIMEOUT=`websocket_timeout`,e.WEBSOCKET_RESTART=`websocket_restart`,e.WEBTRANSPORT_CONNECTED=`webtransport_connected`,e.WEBTRANSPORT_RECONNECTED=`webtransport_reconnected`,e.WEBTRANSPORT_FAILED_PINGS=`webtransport_failed_pings`,e.WEBTRANSPORT_FAILED_EXCEPTION=`webtransport_failed_exception`,e.WEBTRANSPORT_TIMEOUT=`webtransport_timeout`,e.WEBTRANSPORT_RESTART=`webtransport_restart`,e}(H||{}),Jn=1e3;function U(e,t,n=0){return t in e&&e[t]?e[t]:n}function Yn(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function Xn(e,t){return n=>n[e]===t}function Zn(e){return(t,n)=>n[e]-t[e]}function Qn(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function $n(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function er(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>[t,e[t]]).reduce((e,t)=>(e[t[0]]=N.isObject(t[1])?er(t[1]):t[1],e),{})}function tr(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function nr(e){let t=[];return RTCRtpReceiver.prototype.getStats?(t.push(...e.getReceivers().map(e=>e.getStats())),t.push(...e.getSenders().map(e=>e.getStats()))):t.push(e.getStats()),Promise.all(t).then(tr).then($n)}function rr(e){let t=e.filter(Xn(`type`,`candidate-pair`)).sort(Zn(`priority`)).find(Yn(Xn(`nominated`,!0),Xn(`selected`,!0)));if(!t)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let n={timestamp:t.timestamp,availableOutgoingBitrate:t.availableOutgoingBitrate||0,totalRoundTripTime:t.totalRoundTripTime||0,currentRoundTripTime:t.currentRoundTripTime||0,bytesSent:t.bytesSent||0,bytesReceived:t.bytesReceived||0},r=e.find(Xn(`id`,t.remoteCandidateId));r&&Object.assign(n,{remote:{type:r.candidateType,address:r.ip||r.address,port:r.port,protocol:r.protocol}});let i=e.find(Xn(`id`,t.localCandidateId));return i&&Object.assign(n,{local:{type:i.candidateType,address:i.ip||i.address,port:i.port,protocol:i.protocol,relayProtocol:i.relayProtocol,networkType:i.networkType}}),er(n)}function ir(e,t,n=!1){let r=Qn(`id`,e),i=n?e.filter(Yn(Xn(`type`,`remote-inbound-rtp`))):e.filter(Yn(Xn(`type`,`inbound-rtp`),Xn(`type`,`outbound-rtp`)));return k.browserName()===`Firefox`&&(i=Object.values(i.reduce((e,t)=>{if(!e[t.ssrc])e[t.ssrc]=t;else{let n=Object.assign({},e[t.ssrc],t),r=e[t.ssrc].isRemote?t:e[t.ssrc];n.id=r.id,n.type=r.type,delete n.isRemote,delete n.remoteId,e[n.ssrc]=n}return e},{}))),i.map(e=>{let n=Number(e.ssrc),i=e.mediaType||e.kind,a=e.remoteId||e.trackId,o=e.type,s=e.codecId;if(!o||!n||!i)return null;let c={ssrc:n,type:o,kind:i,bytesReceived:U(e,`bytesReceived`),bytesSent:U(e,`bytesSent`),headerBytesReceived:U(e,`headerBytesReceived`),headerBytesSent:U(e,`headerBytesSent`),jitter:U(e,`jitter`),packetsLost:U(e,`packetsLost`),packetsReceived:U(e,`packetsReceived`),packetsSent:U(e,`packetsSent`),fractionLost:U(e,`fractionLost`),pliCount:U(e,`pliCount`),firCount:U(e,`firCount`),nackCount:U(e,`nackCount`),userId:t[n],freezeCount:U(e,`freezeCount`,0),totalFreezesDuration:U(e,`totalFreezesDuration`,0)},l=`mid`in e&&typeof e.mid==`string`?e.mid:void 0,u=`rid`in e&&typeof e.rid==`string`?e.rid:void 0;if(l&&(c.mid=l),u&&(c.rid=u),i===`video`){let t=U(e,`framesDecoded`),n=U(e,`totalInterFrameDelay`),r=U(e,`totalSquaredInterFrameDelay`),i=U(e,`encoderImplementation`),a=U(e,`decoderImplementation`);i&&(c.encoderImplementation=i),a&&(c.decoderImplementation=a),c.interframeDelayVariance=(r-n*n/t)/t}if(i===`video`&&c.type===`outbound-rtp`&&(c.totalEncodeTime=U(e,`totalEncodeTime`)??0),i===`audio`&&(c.totalSamplesReceived=U(e,`totalSamplesReceived`),c.concealedSamples=U(e,`concealedSamples`),c.insertedSamplesForDeceleration=U(e,`insertedSamplesForDeceleration`),c.removedSamplesForAcceleration=U(e,`removedSamplesForAcceleration`),c.silentConcealedSamples=U(e,`silentConcealedSamples`),c.concealmentEvents=U(e,`concealmentEvents`),c.totalAudioEnergy=U(e,`totalAudioEnergy`)),s&&r[s]){let e=r[s];c.clockRate=e.clockRate,c.mimeType=e.mimeType,i===`audio`&&e.sdpFmtpLine&&(c.sdpFmtpLine=e.sdpFmtpLine)}if(a&&r[a]){let e=r[a];c.frameHeight=e.frameHeight,c.frameWidth=e.frameWidth,c.framesDecoded=e.framesDecoded,c.framesReceived=e.framesReceived,c.framesDropped=e.framesDropped}return er(c)}).filter(e=>!!e)}function ar(e,t,n=!1){if(!t||!t.rtps||!e.rtps)return e;let r,i;n&&(r=Qn(`ssrc`,e?.remoteRtps||[]),i=Qn(`ssrc`,t?.remoteRtps||[]));let a=Qn(`ssrc`,e.rtps),o=Qn(`ssrc`,t.rtps),s=(e.timestamp-t.timestamp)/1e3;return!a||!o||Object.keys(a).forEach(c=>{let l=a[c],u=o[c];if(!(!l||!u)){if(l.bytesReceived&&l.bytesReceived>u.bytesReceived&&(l.bandwidth=Math.round((l.bytesReceived-u.bytesReceived)/s),l.bandwidth+=Math.round((l.headerBytesReceived-u.headerBytesReceived)/s)),l.bytesSent&&l.bytesSent>u.bytesSent&&(l.bandwidth=Math.round((l.bytesSent-u.bytesSent)/s),l.bandwidth+=Math.round((l.headerBytesSent-u.headerBytesSent)/s)),l.packetsReceived)if(l.packetsReceived>u.packetsReceived||l.packetsLost>u.packetsLost){let e=l.packetsLost-u.packetsLost,t=l.packetsReceived-u.packetsReceived;l.packetLoss=parseFloat((100*e/(e+t)).toFixed(2))}else l.packetLoss=0;if(l.freezeCount>u.freezeCount&&(l.freezeCountDelta=l.freezeCount-u.freezeCount),l.totalFreezesDuration>u.totalFreezesDuration&&(l.totalFreezesDurationDelta=l.totalFreezesDuration-u.totalFreezesDuration),l.framesDropped&&u.framesDropped&&l.framesDropped>u.framesDropped&&(l.framesDroppedDelta=parseFloat(((l.framesDropped-u.framesDropped)/s).toFixed(0))),n&&l.type===`outbound-rtp`&&l.kind===j.video){let n=r?.[c],a=i?.[c],o=e=>e??0,s=Math.max(0,o(n?.packetsLost)-o(a?.packetsLost)),d=Math.max(1,l.packetsSent-u.packetsSent);e.transport.averageNetStat={currentRoundTripTime:(e.transport.currentRoundTripTime+t.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(s/d*100)}}}}),e}async function or(e,t,n={},r=!1){let i=await nr(e),a={timestamp:Date.now(),transport:rr(i),rtps:ir(i,n)};return r&&(a.remoteRtps=ir(i,n,!0)),t?ar(a,t,r):(await N.delay(Jn),or(e,a,n,r))}function sr(e){performance.clearMarks(e),performance.mark(e)}function cr(e){performance.clearMarks(e)}function lr(e){let t=performance.getEntriesByName(e)[0];if(t===void 0)return null;let n=Math.round(performance.now()-t.startTime);return performance.clearMarks(e),n}function ur(e){return`${H.SCREENSHARE_FIRST_FRAME}_${dr(e)}`}function dr(e){return typeof e==`string`?e:JSON.stringify(e)}var W={distinctById:$n,rtcStatsToArray:tr,extractTransport:rr,extractRtps:ir,delta:ar,collectStats:or,setMark:sr,clearMark:cr,measureMark:lr,getMarkNameScreenshareFirstFrame:ur},fr=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(fr||{}),pr=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(pr||{}),G=function(e){return e.TRANSMITTED_DATA=`transmitted-data`,e.ACCEPTED_CALL=`accepted-call`,e.HUNGUP=`hungup`,e.PARTICIPANT_ADDED=`participant-added`,e.PARTICIPANT_JOINED=`participant-joined`,e.CLOSED_CONVERSATION=`closed-conversation`,e.MEDIA_SETTINGS_CHANGED=`media-settings-changed`,e.PARTICIPANT_STATE_CHANGED=`participant-state-changed`,e.PARTICIPANTS_STATE_CHANGED=`participants-state-changed`,e.RATE_CALL_DATA=`rate-call-data`,e.FEATURE_SET_CHANGED=`feature-set-changed`,e.TOPOLOGY_CHANGED=`topology-changed`,e.PRODUCER_UPDATED=`producer-updated`,e.CONSUMER_ANSWERED=`consumer-answered`,e.MULTIPARTY_CHAT_CREATED=`multiparty-chat-created`,e.FORCE_MEDIA_SETTINGS_CHANGE=`force-media-settings-change`,e.SETTINGS_UPDATE=`settings-update`,e.VIDEO_QUALITY_UPDATE=`video-quality-update`,e.REGISTERED_PEER=`registered-peer`,e.SWITCH_MICRO=`switch-micro`,e.RECORD_STARTED=`record-started`,e.RECORD_STOPPED=`record-stopped`,e.REALLOC_CON=`realloc-con`,e.AUDIO_ACTIVITY=`audio-activity`,e.SPEAKER_CHANGED=`speaker-changed`,e.STALLED_ACTIVITY=`stalled-activity`,e.CHAT_MESSAGE=`chat-message`,e.CUSTOM_DATA=`custom-data`,e.ROLES_CHANGED=`roles-changed`,e.MUTE_PARTICIPANT=`mute-participant`,e.PIN_PARTICIPANT=`pin-participant`,e.OPTIONS_CHANGED=`options-changed`,e.NETWORK_STATUS=`network-status`,e.PARTICIPANT_SOURCES_UPDATE=`participant-sources-update`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.CHAT_ROOM_UPDATED=`chat-room-updated`,e.PROMOTION_APPROVED=`promotion-approved`,e.JOIN_LINK_CHANGED=`join-link-changed`,e.FEEDBACK=`feedback`,e.MOVIE_UPDATE_NOTIFICATION=`movie-update-notification`,e.MOVIE_SHARE_STARTED=`movie-share-started`,e.MOVIE_SHARE_STOPPED=`movie-share-stopped`,e.URL_SHARING_INFO_UPDATED=`url-sharing-info-updated`,e.ROOM_UPDATED=`room-updated`,e.ROOMS_UPDATED=`rooms-updated`,e.ROOM_PARTICIPANTS_UPDATED=`room-participants-updated`,e.FEATURES_PER_ROLE_CHANGED=`features-per-role-changed`,e.PARTICIPANT_ANIMOJI_CHANGED=`participant-animoji-changed`,e.ASR_STARTED=`asr-started`,e.ASR_STOPPED=`asr-stopped`,e.DECORATIVE_PARTICIPANT_ID_CHANGED=`decorative-participant-id-changed`,e.VIDEO_SUSPEND_SUGGEST=`video-suspend-suggest`,e}(G||{}),mr=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),hr=function(e){return e.CONNECTED=`connected`,e.RECONNECTED=`reconnected`,e.FAILED_PINGS=`failed_pings`,e.FAILED_EXCEPTIONS=`failed_exception`,e.TIMEOUT=`timeout`,e.RESTART=`restart`,e}({}),gr={connected:{wt:H.WEBTRANSPORT_CONNECTED,ws:H.WEBSOCKET_CONNECTED},reconnected:{wt:H.WEBTRANSPORT_RECONNECTED,ws:H.WEBSOCKET_RECONNECTED},failed_pings:{wt:H.WEBTRANSPORT_FAILED_PINGS,ws:H.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:H.WEBTRANSPORT_FAILED_EXCEPTION,ws:H.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:H.WEBTRANSPORT_TIMEOUT,ws:H.WEBSOCKET_TIMEOUT},restart:{wt:H.WEBTRANSPORT_RESTART,ws:H.WEBSOCKET_RESTART}},_r={producerScreenTrack:()=>!0,videoTracksCount:()=>P.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>P.movieShare,useParticipantListChunk:()=>P.useParticipantListChunk,useRooms:()=>P.useRooms,vmoji:()=>!!P.vmoji,useCallsToContacts:()=>P.useCallsToContacts,useChatRooms:()=>P.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!P.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>P.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>P.waitForAdminInGroupCalls,hold:()=>P.hold},vr=class{static getFlags(){let e=Object.values(_r),t=0;for(let n=0;n<e.length;n++)e[n]()&&(t|=1<<n);return t.toString(16).toUpperCase()}static parseCapabilities(e){let t=parseInt(e||`0`,16);return Object.keys(_r).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},yr=63n,br=16383n,xr=1073741823,Sr=4611686018427387903n,Cr=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=yr)return new Uint8Array([Number(t)]);if(t<=br)return new Uint8Array([64|Number(t>>8n),Number(t&255n)]);if(t<=BigInt(xr))return new Uint8Array([128|Number(t>>24n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);if(t<=Sr)return new Uint8Array([192|Number(t>>56n),Number(t>>48n&255n),Number(t>>40n&255n),Number(t>>32n&255n),Number(t>>24n&255n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);throw RangeError(`Number is too large to encode using varint`)}},wr=class{decode(e){let t=this.getNumBytesForLengthInteger(e);if(t<0)throw Error(`Invalid length prefix`);if(e.length<t)return null;let n=BigInt(0);switch(t){case 1:n=BigInt(e[0]&63);break;case 2:n=BigInt(e[0]&63)<<8n|BigInt(e[1]);break;case 4:n=BigInt(e[0]&63)<<24n|BigInt(e[1])<<16n|BigInt(e[2])<<8n|BigInt(e[3]);break;case 8:n=BigInt(e[0]&63)<<56n|BigInt(e[1])<<48n|BigInt(e[2])<<40n|BigInt(e[3])<<32n|BigInt(e[4])<<24n|BigInt(e[5])<<16n|BigInt(e[6])<<8n|BigInt(e[7]);break}return n}getNumBytesForLengthInteger(e){let t=e[0]&192;return t===0?1:t===64?2:t===128?4:t===192?8:-1}},Tr=class{constructor(e){g(this,`encoder`,void 0),g(this,`compression`,void 0),g(this,`lengthEncoder`,void 0),this.encoder=new TextEncoder,this.lengthEncoder=new Cr,this.compression=e??null}encode(e){let t=this.encoder.encode(e);t=this.compress(t);let n=this.lengthEncoder.encode(t.length),r=new Uint8Array(n.length+t.length);return r.set(n),r.set(t,n.length),r}compress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return u.gzipSync(e);case`deflate`:return u.zlibSync(e);case`deflate-raw`:return u.deflateSync(e);default:return e}}},Er=class{constructor(e){g(this,`decoder`,void 0),g(this,`compression`,void 0),g(this,`lengthDecoder`,void 0),g(this,`buffer`,void 0),g(this,`expectedLength`,void 0),g(this,`offset`,void 0),g(this,`lengthPrefixLength`,void 0),this.decoder=new TextDecoder,this.lengthDecoder=new wr,this.compression=e??null,this.buffer=new Uint8Array,this.expectedLength=null,this.offset=0}decode(e){let t=[];for(this.buffer=new Uint8Array([...this.buffer,...e]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return t;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return t;let e=this.buffer.subarray(this.offset,this.offset+this.expectedLength);e=this.decompress(e),t.push(this.decoder.decode(e)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return t}readLength(e){if(e.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(e),this.lengthPrefixLength<0)throw Error(`Invalid length prefix`);let t=this.lengthDecoder.decode(e.subarray(0,this.lengthPrefixLength));return t===null?null:Number(t)}decompress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return u.gunzipSync(e);case`deflate`:return u.unzlibSync(e);case`deflate-raw`:return u.inflateSync(e);default:return e}}},Dr=class{constructor(e,t={}){g(this,`webTransport`,void 0),g(this,`stream`,null),g(this,`writer`,null),g(this,`reader`,null),g(this,`url`,void 0),g(this,`options`,void 0),g(this,`compression`,void 0),g(this,`encoder`,void 0),g(this,`decoder`,void 0),g(this,`onopen`,null),g(this,`onmessage`,null),g(this,`onerror`,null),g(this,`onclose`,null),g(this,`readyState`,WebSocket.CONNECTING),this.url=e,this.options=t,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(e),this.encoder=new Tr(this.compression),this.decoder=new Er(this.compression),this.connect()}getCompressionTypeFromUrl(e){try{let t=new URL(e).searchParams.get(`compression`);switch(t){case`gzip`:case`deflate`:case`deflate-raw`:return t;default:return null}}catch(e){return B.log(`Exception while parsing compression`,e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,B.debug(`[WebTransport] WebTransport connected to `+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event(`open`)),await this.readLoop()}catch(e){B.error(`[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`connect`)),this.onclose?.(new CloseEvent(`close`,{code:1006,reason:`Connection Failed`}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:e,value:t}=await this.reader.read();if(e)break;t&&(yield t)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let e of this.readChunks())this.decoder.decode(e).forEach(e=>{this.onmessage?.(new MessageEvent(`message`,{data:e}))});this.close(1e3,`Stream Closed`)}catch(e){B.error(`[WebTransport] Stream read failed`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`read`))}}async send(e){if(this.readyState!==WebSocket.OPEN){B.warn(`[WebTransport] Attempt to send data before webtransport is open`);return}if(!this.writer){B.warn(`[WebTransport] Attempt to send data before stream is ready`);return}try{await this.writer.ready;let t=this.encoder.encode(e);await this.writer.write(t)}catch(e){B.error(`[WebTransport] Failed to send data`,e),this.onerror?.(this.createErrorEvent(e,`send`)),this.close(1006,`Failed to send data`)}}createErrorEvent(e,t){let n=new Event(`error`),r=e instanceof Error?e:null;return n.error=e,n.errorInfo={phase:t,name:r?.name,message:r?.message||String(e),stack:r?.stack,readyState:this.readyState,compression:this.compression},n}close(e=1e3,t){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(e){B.warn(`[WebTransport] already closed. Did we get a STOP_SENDING? ignore`,e)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent(`close`,{code:e,reason:t})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return`WebTransport`in window&&typeof WebTransport==`function`?k.browserName()===`Firefox`?P.webtransportFF:k.browserName()!==`Safari`:!1}},Or=`open`,kr=10,Ar=[`service-unavailable`,`conversation-ended`,`invalid-token`],jr=class e extends ne{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}constructor(e=B,t=null,n=null,r=null,i=null){super(),g(this,`socket`,null),g(this,`sequence`,1),g(this,`lastStamp`,0),g(this,`websocketCommandsQueue`,[]),g(this,`datachannelCommandsQueue`,[]),g(this,`incomingCache`,[]),g(this,`responseHandlers`,{}),g(this,`connectionType`,void 0),g(this,`reconnectCount`,0),g(this,`endpoint`,void 0),g(this,`wtEndpoint`,null),g(this,`conversationResolve`,null),g(this,`conversationReject`,null),g(this,`connected`,!1),g(this,`listenersReady`,!1),g(this,`peerId`,null),g(this,`conversationId`,null),g(this,`reconnectTimer`,0),g(this,`connectionMessageWaitTimer`,0),g(this,`doctorTimer`,0),g(this,`participantIdRegistry`,null),g(this,`producerNotificationDataChannel`,null),g(this,`producerCommandDataChannel`,null),g(this,`producerCommandDataChannelEnabled`,!1),g(this,`producerCommandSerializationService`,void 0),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`_statAggregator`,void 0),g(this,`_pings`,void 0),g(this,`_signalingCommands`,void 0),this._debug=e,this._logger=t,this._statAggregator=n,this._pings=r,this._signalingCommands=i,this.producerCommandSerializationService=new qn(e)}get ready(){return this.socket!==null}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e}setConversationId(e){this.conversationId=e}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=e=>{let t=this.participantIdRegistry?.handleMessage(e.data);t&&this._handleMessage(t)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=e=>{this.producerCommandSerializationService.deserializeCommandResponse(e.data).then(e=>{e&&this._handleMessage(e)}).catch(e=>{this._debug.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return new Promise((t,n)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){this._logger?.log(E.SOCKET_ACTION,`already_opened`),n(Error(`Socket already opened`));return}this.conversationResolve=e=>{t(e),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=e=>{n(e),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},n=!0,r=0){if(t.participantId){let e=N.decomposeParticipantId(t.participantId),n=N.decomposeId(e.compositeUserId);t=Object.assign({},t,{participantId:n.id,participantType:n.type}),e.deviceIdx&&(t.deviceIdx=e.deviceIdx)}return this._sendRaw(e,t,n,r)}async _sendRaw(e,t={},n=!0,r=0){let i=t=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===Or&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){this._logger?.log(E.SOCKET_ACTION,`not_opened`),this._debug.warn(`[signaling] socket is not opened`),t.reject(Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(this._logger?.log(E.SOCKET_ACTION,`invalid_state`),this._debug.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(t),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((a,o)=>{let s=(t,n=!1)=>{!r||n?o(t):(this._debug.debug(`[signaling] resending a signaling message`,e,u.sequence),r--,i(u))},c=this.sequence++,l=`${e}_${c}`;W.setMark(l);let u={sequence:c,name:e,statMarkName:l,params:t,responseTimer:0,needResponse:n,resolve:a,reject:s};i(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===b.UPDATE_DISPLAY_LAYOUT||e===b.REPORT_PERF_STAT||e===b.REPORT_SHARING_STAT||e===b.REQUEST_ASR||e===b.ENABLE_VIDEO_SUSPEND||e===b.ENABLE_VIDEO_SUSPEND_SUGGEST||e===b.REPORT_NETWORK_STAT||e===b.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(b.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(b.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(b.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,n){let r=Object.assign({sdp:t},n);return this._send(b.TRANSMIT_DATA,{participantId:e,data:r},!0,kr)}async acceptCall(e){return this._send(b.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(b.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,kr)}async changeParticipantState(e,t){let n={participantState:{state:e}};return t&&(n.participantId=t),this._sendRaw(b.CHANGE_PARTICIPANT_STATE,n)}async hold(e){return this._send(b.HOLD,{hold:e})}async putHandsDown(){return this._send(b.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(b.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(b.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(b.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let n={capabilities:t};return e&&(n.description=e.sdp),this._send(b.ALLOCATE_CONSUMER,n)}async acceptProducer(e,t,n){let r={description:e.sdp,sessionId:n};return t&&(r.ssrcs=t),this._send(b.ACCEPT_PRODUCER,r)}async changePriorities(e){return this._send(b.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(b.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(b.ADD_MOVIE,e)}async updateMovie(e){return this._send(b.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(b.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(b.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(b.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(b.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(b.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(b.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(b.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(b.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(b.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(b.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(b.RECORD_PUBLISH,e)}async 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(b.RECORD_SET_CONF,t)}async getRecordStatus(){return this._send(b.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(b.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(b.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(b.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(b.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(b.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(b.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(b.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(b.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,n){let r={participantId:e,roles:t};return n&&(r.revoke=!0),this._sendRaw(b.GRANT_ROLES,r)}async muteParticipant(e,t,n,r=null){return this._sendRaw(b.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:n,roomId:r})}async enableFeatureForRoles(e,t){return this._sendRaw(b.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,n){let r={participantId:e,roomId:n};return t&&(r.unpin=!0),this._sendRaw(b.PIN_PARTICIPANT,r)}async updateMediaModifiers(e){return this._send(b.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(b.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(b.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(b.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(b.CHANGE_OPTIONS,{options:e})}async getWaitingHall(e=null,t,n=!1){let r={};return e&&(r.fromId=e),t&&(r.count=t),n&&(r.backward=n),this._send(b.GET_WAITING_HALL,r)}async promoteParticipant(e,t=!1){let n={};return e&&(n.participantId=e),t&&(n.demote=t),this._sendRaw(b.PROMOTE_PARTICIPANT,n)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(b.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(b.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(b.FEEDBACK,{key:e})}async getHandQueue(){return this._send(b.GET_HAND_QUEUE)}close(){this.socket&&this.socket.readyState<WebSocket.CLOSING&&this._closeSocket(),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(b.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(b.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(b.ASR_START,e)}async stopAsr(e){return this._send(b.ASR_STOP,e)}async requestAsr(e){return this._send(b.REQUEST_ASR,{request:e},!1)}_buildUrl(e,t,n){let r=new URL(e),i=r.searchParams;return i.set(`platform`,P.platform),i.set(`appVersion`,String(P.appVersion)),i.set(`version`,String(P.protocolVersion)),i.set(`device`,P.device),i.set(`capabilities`,vr.getFlags()),i.set(`clientType`,P.clientType),t&&i.set(`tgt`,t),t===fr.RETRY&&this.lastStamp&&i.set(`recoverTs`,String(this.lastStamp)),P.useParticipantListChunk&&(i.set(`partIdx`,String(P.participantListChunkInitIndex)),P.participantListChunkInitCount!==null&&i.set(`partCount`,String(P.participantListChunkInitCount))),n&&(i.set(`compression`,`deflate-raw`),i.set(`ua`,navigator.userAgent)),this.peerId!==null&&i.set(`peerId`,String(this.peerId)),r.toString()}_connect(e,t){if(!(this.socket&&this.socket.readyState<WebSocket.CLOSING)){if(this.connectionType=e,t){if(!this.wtEndpoint){this._debug.error(`[signaling] empty wt endpoint`),this.conversationReject?.(new y(w.SIGNALING_FAILED,{message:`Unable to connect to the signaling: wtEndpoint is not set`,remote:!0}));return}let t=this._buildUrl(this.wtEndpoint,e,!0);this._debug.debug(`[signaling] connecting to wt `+t),this.socket=new Dr(t,{congestionControl:`low-latency`})}else{let t=this._buildUrl(this.endpoint,e,!1);this._debug.debug(`[signaling] connecting to ws `+t),this.socket=new WebSocket(t)}this._markTransportStat(e===fr.RETRY?hr.RECONNECTED:hr.CONNECTED),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor()}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){this._debug.debug(`[signaling] socket opened`),this._logger?.log(E.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===fr.RETRY?hr.RECONNECTED:hr.CONNECTED)}_onMessage(e){if(this._startDoctor(),e.data===`ping`){this._pings?.mark(this._getSocketType()),this._markTransportStat(hr.FAILED_PINGS),z.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(`pong`);return}try{let t=JSON.parse(e.data);z.onSignalingMessage(t),this._handleMessage(t)}catch(t){this._logger?.log(E.SOCKET_ACTION,`parse_error`),this._debug.error(`[signaling] unable to parse message`,t,e.data)}}_handleMessage(e){switch(e.type){case`notification`:e.notification===`connection`?(this._debug.debug(`[signaling] signaling connected`,e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat(hr.RESTART),this._triggerEvent(pr.RECONNECT,e),e.conversation.topology&&this._triggerEvent(pr.NOTIFICATION,{type:`notification`,notification:G.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===G.ACCEPTED_CALL&&e.peerId.id===this.peerId&&e.peerId.type===`WEB_TRANSPORT`||this._handleMessage(e)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(pr.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:this._logger?.log(E.SOCKET_ACTION,`unknown_message`),this._debug.warn(`[signaling] unhandled message`,e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){this._logger?.log(E.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Ar.includes(e.error):!1;switch(this._debug.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case`service-unavailable`:let n=new y(v.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(n):this._triggerEvent(pr.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:v.SERVICE_UNAVAILABLE});break;case`conversation-ended`:this.conversationReject?this.conversationReject(new y(e.reason||w.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(pr.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:e.reason});break;case`participant-not-found`:this._throwError(Error(`Signaling error: ${e.error}`));break;default:if(!t)break;this.connected?this._throwError(Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new y(e.reason||w.SIGNALING_FAILED,{message:`Unable to connect to the signaling: ${e.error}`,remote:!0})),this._closeSocket())}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(pr.FAILED,e)}_onError(e){this._logger?.log(E.SOCKET_ACTION,`error`),this._debug.error(`[signaling] signaling error`,e),this._logTransportStat(hr.FAILED_EXCEPTIONS,{string_value:this._serializeErrorEvent(e)})}_serializeErrorEvent(e){let t=e,n=t.error instanceof Error?t.error:null;return JSON.stringify({eventType:e.type,socketType:this._getSocketType(),readyState:this.socket?.readyState,errorName:n?.name||t.errorInfo?.name,errorMessage:n?.message||t.errorInfo?.message||t.message,errorStack:n?.stack||t.errorInfo?.stack,errorInfo:t.errorInfo})}_onClose(t){if(this._logger?.log(E.SOCKET_ACTION,`closed`),this._debug.debug(`[signaling] connection closed`,{code:t.code,reason:t.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this._abortSignal?.aborted){this._debug.debug(`[signaling] aborted reconnect`),this._closeSocket(new y(v.CANCELED));return}this.socket&&this.reconnectCount++<e.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new y(v.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let t=Math.min(e.RECONNECT_MAX_DELAY,e.RECONNECT_DELAY*2**(this.reconnectCount-1));this._debug.log(`[signaling] reconnect websocket after ${t}ms (${this.reconnectCount})`),this._logger?.log(E.SOCKET_ACTION,`reconnect`),this.reconnectTimer=window.setTimeout(this._connect.bind(this,fr.RETRY,!1),t)}_handleCommandResponse(t,n){if(!Object.hasOwn(this.responseHandlers,n.sequence))return;let r=this.responseHandlers[n.sequence];window.clearTimeout(r.responseTimer);let i=W.measureMark(r.statMarkName);i!==null&&this._signalingCommands?.mark(r.name,i,this._getSocketType()),this._debug.debug(`[signaling] command response [${n.sequence}]`,n),t?(delete this.responseHandlers[n.sequence],r.resolve(n)):n.type===`error`?(delete this.responseHandlers[n.sequence],this._logger?.log(E.SOCKET_ACTION,`response-error`),r.reject(Error(n.error||`Response error [${r.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],this._logger?.log(E.SOCKET_ACTION,`response-timeout`),r.reject(Error(n.error||`Response timeout [${r.name}]`))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(t,n),e.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(this._debug.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Or){t.reject(Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let e=this._serializeBinary(t);e!==null&&this.producerCommandDataChannel.send(e)}else{if(!this.socket||this.socket.readyState!==WebSocket.OPEN){t.reject(Error(`Invalid state or socket already closed`));continue}this._startResponseTimer(t),this.socket.send(this._serializeJson(t))}}}_startResponseTimer(t){if(!t.needResponse){t.resolve({type:`response`,sequence:t.sequence,response:t.name});return}t.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:t.name,sequence:t.sequence,type:`timeout`}),e.WAIT_RESPONSE_DELAY),this.responseHandlers[t.sequence]=t}_serializeBinary(e){switch(e.name){case b.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case b.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case b.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case b.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case b.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case b.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case b.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case b.CHANGE_SIMULCAST:return this.producerCommandSerializationService.serializeChangeSimulcast(e.sequence,e.params)}return this._debug.warn(`[signaling] cannot get binary data for data channel command: `+e.name),null}_serializeJson(e){let t;t=e.name===b.UPDATE_DISPLAY_LAYOUT?this._convertDisplayLayout(e.params):e.params;let n=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(n)}_convertDisplayLayout(e){let t=e,n={};for(let e in t)Object.hasOwn(t,e)&&(n[e]=Cn(t[e]));return{layouts:n}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new y(w.SIGNALING_FAILED,{message:`Unable to connect to the signaling: connection timeout`,remote:!0}))},e.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=e.RECONNECT_MAX_COUNT)&&(this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?this._debug.warn(`[signaling] socket is dead. Fallback to WebSocket. Trying to connect ${this.reconnectCount}`):this._debug.warn(`[signaling] socket is dead, trying to reconnect ${this.reconnectCount}`),this._logTransportStat(hr.FAILED_PINGS),this._disconnect(4e3),this._connect(fr.RETRY,!1),this.reconnectCount++},e.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return Dr.isBrowserSupported()&&this.wtEndpoint!==null&&P.webtransport}_getSocketType(){return this.socket instanceof Dr?mr.WEBTRANSPORT:mr.WEBSOCKET}_markTransportStat(e){let t=this._getSocketType(),n=gr[e][t];W.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=gr[e][n];this._statAggregator?.logEventualStat({name:r,...t})}},K=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(K||{}),Mr=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(Mr||{}),Nr=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(Nr||{}),Pr=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(Pr||{}),Fr=function(e){return e.REQUIRE_AUTH_TO_JOIN=`REQUIRE_AUTH_TO_JOIN`,e.AUDIENCE_MODE=`AUDIENCE_MODE`,e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.ADMIN_IS_HERE=`ADMIN_IS_HERE`,e.ASR=`ASR`,e.FEEDBACK=`FEEDBACK`,e.RECURRING=`RECURRING`,e}(Fr||{});function Ir(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function Lr(e,t){let n=new Set(e);for(let[e,r]of Object.entries(t))r?n.add(e):n.delete(e);return Array.from(n)}var Rr=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(Rr||{}),q=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(q||{}),zr=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(zr||{}),Br=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),J=function(e){return e.IDLE=`IDLE`,e.OPENED=`OPENED`,e.CONNECTING=`CONNECTING`,e.RECONNECTING=`RECONNECTING`,e.CONNECTED=`CONNECTED`,e.CLOSED=`CLOSED`,e.FAILED=`FAILED`,e}(J||{}),Y=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}(Y||{}),Vr=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(Vr||{});function Hr(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var Ur=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}(Ur||{});function Wr(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var Gr=function(e){return e.USER=`USER`,e.ANONYM=`ANONYM`,e.GROUP=`GROUP`,e}({}),X;(function(e){function t(e){return e.length?typeof e[0]==`object`?e:e.map(e=>n(e)):[]}e.fromIds=t;function n(e,t=`USER`,n=0){return{id:e,type:t,deviceIdx:n}}e.fromId=n;function r(e,t=!0){let n=t?e.decorativeExternalUserId:e.externalId,r=e.deviceIdx??0;if(n)return i(n,r)}e.fromSignalingParticipant=r;function i(e,t=0){return{id:e.id,type:e.type===`ANONYM`?`ANONYM`:`USER`,deviceIdx:t}}e.fromSignaling=i;function a(e){return e.id}e.toSignaling=a;function o(e){let t=e.deviceIdx||0;return`{"id":"${e.id}","type":"${e.type}","deviceIdx":${t}}`}e.toString=o;function s(e,t=`USER`,r=0){return o(n(e,t,r))}e.fromIdToString=s;function c(e){try{return JSON.parse(e)}catch{throw Error(`Failed to parse ExternalId from string '${e}'`)}}e.fromString=c;function l(e,t){return e.id===t.id&&e.type===t.type&&e.deviceIdx===t.deviceIdx}e.compare=l;function u(e){return e?.deviceIdx||0}e.getDeviceIdx=u})(X||(X={}));var{isObject:Kr,isObjectsEquals:qr}=N;function Jr(e,t){return e===null||t===null?e===null&&t===null:e.maxDimension!==t.maxDimension||e.maxBitrateK!==t.maxBitrateK||e.maxFramerate!==t.maxFramerate||e.degradationPreference!==t.degradationPreference||e.scalabilityMode!==t.scalabilityMode||Kr(e.bitrates)&&Kr(t.bitrates)&&!qr(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Yr=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function Xr(e,t){return!(!Jr(e.camera,t.camera)||!Jr(e.screenSharing,t.screenSharing)||!Jr(e.fastScreenSharing,t.fastScreenSharing))}function Zr(e,t){return{camera:Object.assign({},e.camera,t.camera),screenSharing:Object.assign({},e.screenSharing,t.screenSharing),fastScreenSharing:Object.assign({},e.fastScreenSharing,t.fastScreenSharing)}}function Qr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}function $r(e){try{return btoa(JSON.stringify(e))}catch(t){B.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function ei(e){try{return JSON.parse(atob(e))}catch(t){B.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var ti=(e,t)=>N.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function ni(e){if(e.conversation?.muteStates)return e.conversation.muteStates;if(e.muteState&&e.muteOptions)return e.muteOptions.reduce((t,n)=>(t[n]=e.muteState,t),{})}function ri(e,t){switch(e){case T.AUDIO:return!!t.isAudioEnabled;case T.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case T.VIDEO:return!!t.isVideoEnabled;case T.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function ii(e,t){return N.objectReduce(e,(e,n,r)=>{switch(n){case Rr.MUTE:case Rr.MUTE_PERMANENT:ri(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function ai(e){let{muteStates:t={},mediaSettings:n}=e;return ii(t,n)}function oi(e,t){let n=e.conversation.participants.find(t=>N.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return ii(t,r)}function si(e,t){let n=new Uint8Array(t),r=0,i=0;for(;r<e.length&&i<t;){let a=e[r++],o=a>>4,s=a&15;if(o===15){let t;do t=e[r++],o+=t;while(t===255)}for(let a=0;a<o&&!(i>=t);a++)n[i++]=e[r++];if(r>=e.length||i>=t)break;let c=e[r]|e[r+1]<<8;if(r+=2,s===15){let t;do t=e[r++],s+=t;while(t===255)}s+=4;let l=i-c;for(let e=0;e<s&&!(i>=t);e++)n[i++]=n[l+e]}return n}var ci=class{constructor(e,t=B,n=null){g(this,`_fixNoPacketsApplied`,!1),g(this,`_fixNoPacketsChecked`,!1),g(this,`_fixTooManyPacketsApplied`,!1),g(this,`_fixTooManyPacketsSucceeded`,!1),g(this,`_fixTooManyPacketsFailed`,!1),g(this,`_fixTooManyPacketsTime`,void 0),g(this,`_mediaSource`,void 0),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`_lastPacketsSent`,void 0),g(this,`_lastPacketsSentTime`,void 0),g(this,`_toggleAudioPromise`,null),g(this,`_fixNoPacketsAppliedVideo`,!1),this._mediaSource=e,this._debug=t,this._logger=n}_fixAudioDeviceNoPackets(e){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,this._logger?.log(E.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&(this._fixNoPacketsApplied=!0,this._logger?.log(E.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (no packets)`),this._toggleAudioPromise=this._mediaSource.toggleAudio(k.getMicrophonePermissionState()!==`denied`),this._toggleAudioPromise.catch(()=>void 0))}}_fixAudioDeviceTooManyPackets(e){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let t=Date.now();if(!this._lastPacketsSentTime)e.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent);else if(t-this._lastPacketsSentTime>500){let n=(e.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent,this._fixTooManyPacketsApplied?n>75?(this._debug.log(`[AudioFix] Failed to fix RV`),this._logger?.log(E.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(this._debug.log(`[AudioFix] Fixed RV`),this._logger?.log(E.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,this._logger?.log(E.ERROR,`audio_device_recover`),this._debug.log(`[AudioFix] Trying to fix RV (too many packets)`),this._mediaSource.toggleAudio(!0).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (too many packets)`,e)}),this._fixTooManyPacketsTime=t)}}fix(e){if(!this._mediaSource)return;let t=e.find(e=>e.kind===j.audio);t&&(this._fixAudioDeviceNoPackets(t),this._fixAudioDeviceTooManyPackets(t))}fixVideo(e){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let t=e.find(e=>e.kind===j.video);t&&!t.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.getMediaSettings().isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(e=>{this._debug.warn(`[AudioFix] Failed to fix RV (no packets): video restart`,e)}))}},li=class{constructor(e,t=!1,n=B,r=null){g(this,`_audioElement`,null),g(this,`_audioTracks`,new Map),g(this,`_allowMultipleTracks`,void 0),g(this,`_volume`,1),g(this,`_features`,{setSinkId:!!Audio.prototype.setSinkId}),g(this,`_statFirstMediaReceived`,void 0),g(this,`_debug`,void 0),g(this,`_logger`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t,this._debug=n,this._logger=r}add(e,t){this._allowMultipleTracks||this._clearTracks();let n=this._audioTracks.get(e);n&&n!==t&&(this._removeTrackFromAudioElement(n),n.stop()),this._audioTracks.set(e,t),this._audioElement?this._addTrackToAudioElement(t):this._initAudioElement()}remove(e,t){let n=this._audioTracks.get(e);if(!n){t.stop();return}if(n!==t){t.stop();return}if(!this._allowMultipleTracks){this.destroy();return}this._removeTrackFromAudioElement(t),t.stop(),this._audioTracks.delete(e),this._audioTracks.size||this.destroy()}get volume(){return this._volume}set volume(e){this._volume=Math.max(0,Math.min(1,e)),this._audioElement&&(this._audioElement.volume=this._volume)}destroy(){!this._audioElement&&!this._audioTracks.size||(this._stopAudioElement(),this._audioElement=null,this._audioTracks.clear())}async changeOutput(){try{if(!this._features.setSinkId)throw Error(`Feature "setSinkId" is not supported`);if(!this._audioElement)return;let e=k.getSavedOutput();e&&await this._audioElement.setSinkId?.(e.deviceId)}catch(e){throw this._logger?.log(E.ERROR,`change_output`),this._debug.error(`[audio] Output change failed`,e),e}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(P.muteMode)return;let e=this._getTracks();if(!e.length)return;let t=k.browserName()!==`Safari`||k.isMobile(),n=document.createElement(t?`audio`:`video`);n.muted=!1,n.volume=this._volume,n.preload=`auto`;let r=()=>{this._debug.warn(`[audio] Error on play audio`),z.onAutoplayError()},i=e=>{this._debug.debug(`[audio] Play audio`),n.srcObject=null,n.srcObject=new MediaStream(e),n.load();let t=n.play();t&&t.catch(r)},a=()=>{this._debug.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?i(e):this._debug.warn(`[audio] Broken audio tracks`)};n.onpause=a,n.onstalled=a,n.onerror=a,n.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(e),this._audioElement=n}_stopAudioElement(){this._audioElement&&(this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_addTrackToAudioElement(e){if(!this._audioElement)return;this._debug.debug(`[audio] Adding track ${e}`);let t=this._audioElement.srcObject;t||(t=new MediaStream,this._audioElement.srcObject=t),t.addTrack(e)}_removeTrackFromAudioElement(e){this._audioElement?.srcObject&&(this._debug.debug(`[audio] Removing track ${e}`),this._audioElement.srcObject.removeTrack(e))}_clearTracks(){for(let e of this._audioTracks.values())this._removeTrackFromAudioElement(e),e.stop();this._audioTracks.clear()}},ui=90,di=3,fi=class extends _{constructor(e=B){super(),g(this,`_lastMemoryStat`,{percent:0,bytes:0}),g(this,`_debug`,void 0),this._debug=e}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(e=>{e.userId=(typeof e.userId==`string`&&t[e.userId]||null)?.externalId}),z.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),n=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>ui?this._debug.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=di)&&(this._debug.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},pi,mi=class{constructor(){g(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};pi=mi,g(mi,`_instance`,null),g(mi,`getInstance`,()=>(pi._instance||(pi._instance=new pi),pi._instance));var hi=44100,gi=class{constructor(e,t){g(this,`_analyser`,null),g(this,`_gainNode`,null),g(this,`_fftBins`,null),g(this,`_mediaStreamSource`,null),g(this,`_lastSmoothedLevel`,0),g(this,`_trackId`,void 0),g(this,`_track`,void 0),g(this,`_stream`,void 0),this._trackId=e,this._track=t,this._stream=new MediaStream([t]);try{let e=k.getAudioContext();this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),this._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=e.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let e=hi/this._fftBins.length,t=Math.ceil(P.voiceParams.minFreq/e),n=Math.floor(P.voiceParams.maxFreq/e);return this._fftBins.subarray(t,n)}getLevel(){let e=this._getBins(),t=e.reduce((e,t)=>e+t,0)/e.length/255,n=this._lastSmoothedLevel*P.voiceParams.smoothing+t*(1-P.voiceParams.smoothing);return this._lastSmoothedLevel=n,{real:t,smoothed:n}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}},_i=class extends _{constructor(e){super(),g(this,`_detector`,null),g(this,`_interval`,null);let t=()=>{this._detector&&z.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,P.voiceParams.interval)};this._interval=window.setTimeout(t,P.voiceParams.interval);let n=()=>{let t=e.getSendAudioTrack();t&&this.init(t)};this.subscribe(e,Jt.SOURCE_CHANGED,t=>{t.kind===j.audio&&e.getMediaSettings().isAudioEnabled&&n()}),this.subscribe(e,Jt.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new gi(`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()}},vi=class{constructor(e,t=B){g(this,`processor`,void 0),g(this,`queue`,[]),g(this,`isProcessing`,!1),g(this,`_debug`,void 0),this.processor=e,this._debug=t}add(e){this.queue.push(e),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let e=this.queue.shift();if(e)try{await this.processor(e)}catch{this._debug.error(`Can't process message ${JSON.stringify(e)}`)}}this.isProcessing=!1}}},yi=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(yi||{}),bi=class extends _{constructor(e,t){super(),g(this,`_signaling`,void 0),g(this,`_mediaSource`,void 0),g(this,`_state`,J.IDLE),g(this,`_pc`,null),this._signaling=e,this._mediaSource=t}getState(){return this._state||J.IDLE}},xi=`videochat-epi`,Si=5e3,Ci=500,wi=class extends _{constructor(e,t,n=null,r=!1,i=B){super(),g(this,`_previousPerfStatReportTimestamp`,0),g(this,`_previousNetworkStatReportTimestamp`,Date.now()),g(this,`_previousCallStatReportTimestamp`,Date.now()),g(this,`_previousCallStatReport`,null),g(this,`_screenShareStats`,[]),g(this,`_signaling`,void 0),g(this,`_directTopology`,void 0),g(this,`_debug`,void 0),g(this,`_statAggregator`,void 0),g(this,`_handleScreenSharingStat`,e=>{this._screenShareStats.push(e)}),g(this,`_handleTransportStateChanged`,e=>{(this._directTopology&&e===J.CONNECTED||!this._directTopology&&e===J.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())}),this._signaling=t,this._directTopology=r,this._debug=i,this._statAggregator=n,this.subscribe(e,Z.REMOTE_DATA_STATS,this._handleStats.bind(this)),this.subscribe(e,Z.SCREEN_SHARING_STAT,this._handleScreenSharingStat.bind(this)),this.subscribe(e,Z.STATE_CHANGED,this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(xi)||``,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+Si<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+Ci<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),P.callStatReportEnabled&&this._previousCallStatReportTimestamp+P.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((e,t)=>(t.kind===`video`&&(e.framesDecoded+=t.framesDecoded||0,e.framesReceived+=t.framesReceived||0),e),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let e=await this._signaling.reportPerfStat(t);localStorage.setItem(xi,e.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0)};if(t.timestamp)try{await this._signaling.reportNetworkStat(t)}catch{}}_reportCallStats(e){let t={call_topology:this._directTopology?`D`:`S`,stat_time_delta:0,nack_received:0,pli_received:0,fir_received:0,frames_dropped:0,jitter_video:0,jitter_audio:0,interframe_delay_variance:0,nack_sent:0,pli_sent:0,fir_sent:0,total_audio_samples_received:0,concealed_audio_samples:0,silent_concealed_audio_samples:0,inserted_audio_samples_for_deceleration:0,removed_audio_samples_for_acceleration:0,audio_concealment_events:0,total_audio_energy:0,inbound_video_count:0,inbound_audio_count:0,packets_lost_video:0,packets_sent_video:0,packets_lost_audio:0,packets_sent_audio:0,freeze_count:0,total_freezes_duration:0,rtt:Math.round(e.inbound.transport.currentRoundTripTime*1e3),ss_freeze_count:0,ss_total_freezes_duration:0,local_address:Ei(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:Ei(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let n=!1,r=!1;for(e.inbound.rtps.reduce((e,t)=>(t.kind===`video`?(n=!0,t.framesReceived&&(e.jitter_video=e.jitter_video*e.inbound_video_count/(e.inbound_video_count+1)+t.jitter*1e3/(e.inbound_video_count+1),e.interframe_delay_variance=e.interframe_delay_variance*e.inbound_video_count/(e.inbound_video_count+1)+(t.interframeDelayVariance||0)*1e6/(e.inbound_video_count+1),e.inbound_video_count++),e.frames_dropped+=t.framesDropped||0,e.nack_sent+=t.nackCount,e.pli_sent+=t.pliCount,e.fir_sent+=t.firCount,e.freeze_count+=t.freezeCountDelta||0,e.total_freezes_duration+=t.totalFreezesDurationDelta||0):(r=!0,t.totalSamplesReceived&&(e.jitter_audio=e.jitter_audio*e.inbound_audio_count/(e.inbound_audio_count+1)+t.jitter*1e3/(e.inbound_audio_count+1),e.total_audio_energy=e.total_audio_energy*e.inbound_audio_count/(e.inbound_audio_count+1)+(t.totalAudioEnergy||0)/(e.inbound_audio_count+1),e.inbound_audio_count++),e.total_audio_samples_received+=t.totalSamplesReceived||0,e.inserted_audio_samples_for_deceleration+=t.insertedSamplesForDeceleration||0,e.removed_audio_samples_for_acceleration+=t.removedSamplesForAcceleration||0,e.concealed_audio_samples+=t.concealedSamples||0,e.silent_concealed_audio_samples+=t.silentConcealedSamples||0,e.audio_concealment_events+=t.concealmentEvents||0),e),t),e.outbound.rtps.reduce((e,t)=>(t.kind===`video`?(e.nack_received+=t.nackCount,e.pli_received+=t.pliCount,e.fir_received+=t.firCount,e.packets_sent_video+=t.packetsSent):e.packets_sent_audio+=t.packetsSent,e),t),e.remoteInbound.rtps.reduce((e,t)=>(t.kind===`video`?e.packets_lost_video+=t.packetsLost:e.packets_lost_audio+=t.packetsLost,e),t);this._screenShareStats.length;){let e=this._screenShareStats.pop();e?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=e.freeze_duration)}let i={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(P.simulcast&&(i.is_simulcast=!0),navigator.hardwareConcurrency&&(i.cpu_hardware_concurrency=navigator.hardwareConcurrency),n&&!Di(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!Di(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!Di(t.interframe_delay_variance)&&(i.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(i.freeze_count=t.freeze_count,i.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(i.ss_freeze_count=t.ss_freeze_count,i.ss_total_freezes_duration=t.ss_total_freezes_duration),r&&!Di(t.total_audio_samples_received)){let e=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),n=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),r=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),a=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),o=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),s=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);i.inserted_audio_samples_for_deceleration=Oi(n/e*1e3),i.removed_audio_samples_for_acceleration=Oi(r/e*1e3),i.concealed_audio_samples=Oi(a/e*1e3),i.concealed_silent_audio_samples=Oi(o/e*1e3),i.concealment_audio_avg_size=Oi(a/s),i.total_audio_energy=t.total_audio_energy}Ti(t,`local_address`,`local_connection_type`,`network_type`,`transport`)&&(i.local_address=t.local_address,i.local_connection_type=t.local_connection_type,i.network_type=t.network_type,i.transport=t.transport),Ti(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),o=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);a>0&&(i.video_loss=Oi(Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video)/a*100)),o>0&&(i.audio_loss=Oi(Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio)/o*100)),this._statAggregator?.logCallStat(i),P.enableLogPerfStatReport&&this._debug.log(`Sent call stats`,i),this._previousCallStatReport=t}};function Ti(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function Ei(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function Di(e){return e===void 0}function Oi(e){return Number.isNaN(e)?0:e}var ki=class{constructor(e,t=null){g(this,`weightUp`,void 0),g(this,`weightDown`,void 0),g(this,`value`,NaN),this.weightUp=e,this.weightDown=t??e}set(e){this.value=e}update(e){return this.value=Number.parseFloat(this.getNext(e).toFixed(3)),this.value}getNext(e){if(isNaN(this.value))return e;let t=e<this.value?this.weightDown:this.weightUp;return this.value*(1-t)+e*t}getValue(){return this.value}},Ai=.25,ji=.35,Mi=85,Ni=.1,Pi=1.5,Fi=.1,Ii=1,Li=.6,Ri=.3,zi=class extends _{constructor(e,t=B){super(),g(this,`_signaling`,void 0),g(this,`_localNetworkStat`,void 0),g(this,`_remoteNetworkStat`,void 0),g(this,`_lastNetworkStat`,void 0),g(this,`_networkLimits`,{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}}),g(this,`_lastStatSentTimestamp`,0),g(this,`_currentState`,`good`),g(this,`_debug`,void 0),this._debug=t,this._signaling=e,this._localNetworkStat={rtt:new ki(Ai,Ai),loss:new ki(ji,ji),bitrate:0},this._remoteNetworkStat={rtt:0,loss:0,bitrate:0},this._lastNetworkStat={rtt:0,loss:0,date:0}}_calcRttRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.rtt)/Mi);for(let e=0;e<r;e++)n*=1-Ni;return n}_calcLossRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.loss)/Pi);for(let e=0;e<r;e++)n*=1-Fi;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*Ii;return Math.min(n,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,n){return n?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=Li?`good`:e>=Ri?`medium`:`bad`}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol===`tcp`,n=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),r=e.inbound.rtps.reduce((e,t)=>Math.max(e,t.packetLoss||0),0),i={rtt:this._localNetworkStat.rtt.update(n),loss:this._localNetworkStat.loss.update(r)};if(t){let t=e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0);i.bitrate=t,this._localNetworkStat.bitrate=t}let a=Date.now(),o=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),s=Math.max(Math.round(o*10)/10,.1),c=this._getNetworkState(s);(t||c!==this._currentState||a-this._lastStatSentTimestamp>P.networkStatisticsInterval)&&(this._lastStatSentTimestamp=a,this._signaling.customData({sdk:Object.assign({type:`bad-net`},i)},null).catch(e=>{this._debug.warn(`Unable to send [bad-net]`,e)})),this._currentState=c,this._triggerEvent(Z.NETWORK_STATUS,s)}reportRemote(e){let{rtt:t,loss:n,bitrate:r}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=n||0,this._remoteNetworkStat.bitrate=r||0}},Bi=30*1e3,Vi=class e extends bi{constructor(e,t,n,r,i,a=B,o=null,s=null,c=null){super(n,r),g(this,`_participantId`,void 0),g(this,`_isMaster`,void 0),g(this,`_remoteSDP`,{}),g(this,`_remoteCandidates`,{}),g(this,`_lastRemoteSDP`,null),g(this,`_animojiDataChannel`,null),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),g(this,`_remoteAnimojiVersion`,1),g(this,`_isOpen`,!1),g(this,`_remotePeerId`,null),g(this,`_statInterval`,null),g(this,`_settingsInterval`,null),g(this,`_failedOnCreate`,null),g(this,`_remoteStream`,null),g(this,`_iceRestartTimeout`,null),g(this,`_reconnectionTimeout`,null),g(this,`_reconnectionPrevented`,!1),g(this,`_lastStat`,void 0),g(this,`_fingerprint`,null),g(this,`_neverConnected`,!0),g(this,`_serverSettings`,void 0),g(this,`_prevConsumerSettings`,{}),g(this,`_networkLimitsForVideo`,{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}}),g(this,`_videoMaxDimensionsForNet`,{worst:320,bad:640,good:1280}),g(this,`_lastVideoMaxDimension`,this._videoMaxDimensionsForNet.good),g(this,`_lastBadConnection`,0),g(this,`_perfStatReporter`,void 0),g(this,`_directStatReporter`,void 0),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`_statAggregator`,void 0),g(this,`_codecStatsAggregator`,void 0),this._participantId=e,this._isMaster=t,this._serverSettings=i,this._debug=a,this._logger=o,this._statAggregator=s,this._codecStatsAggregator=c,this._perfStatReporter=new wi(this,n,this._statAggregator,!0,this._debug),this._directStatReporter=new zi(n,this._debug),this.subscribe(this._signaling,pr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._applySettings.bind(this)),this.subscribe(this._directStatReporter,Z.NETWORK_STATUS,this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:P.iceServers,iceTransportPolicy:P.forceRelayPolicy?`relay`:`all`})}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}if(this._pc.onicecandidate=this._handleIceCandidate.bind(this),this._pc.ontrack=this._onAddTrack.bind(this),this._pc.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),this._pc.onconnectionstatechange=this._onConnectionStateChange.bind(this),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},P.vmoji&&this._createDataChannel(this._pc,yi.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(E.ERROR,`addTrack-direct`),this._debug.error(`Unable to add media source tracks`,e,{participantId:this._participantId}),this._failedOnCreate=e;return}this._createOffer(!1).catch(e=>{this._state===J.IDLE?this._failedOnCreate=e:this.close(e)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return[J.IDLE,J.CLOSED,J.FAILED].includes(this.getState())}async open(e=null){if(this._isOpen){this._debug.warn(`DirectTransport: Already opened`,{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(this._debug.debug(`DirectTransport: Open transport`,{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){this._logger?.log(E.ERROR,`addTrack-direct`),this._debug.error(`DirectTransport: Unable to add media source tracks`,e,{participantId:this._participantId}),this.close(e);return}this._setState(J.OPENED);let t=e;if(!e){let e=Object.keys(this._remoteSDP);t=e[e.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){Xr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(P.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&(this._isOpen=!1,this._stopReconnection(),this._remoteStream&&(this._remoteStream.getTracks().forEach(e=>{e.stop(),this._triggerEvent(Z.REMOTE_TRACK_REMOVED,this._remoteStream,e)}),this._remoteStream=null),this._stopStatInterval(),this._stopSettingsInterval(),this._pc&&(this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close()),this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.oniceconnectionstatechange=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._pc.close(),this._pc=null),this._onNetworkStatus(1),this.unsubscribe(),e?(this._debug.error(`DirectTransport: Closed`,e,{participantId:this._participantId}),this._setState(J.FAILED)):(this._debug.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(J.CLOSED)),this._triggerEvent(Z.PEER_CONNECTION_CLOSED))}_setState(e){this._state!==e&&(this._debug.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent(Z.STATE_CHANGED,e))}_onSignalingNotification(e){switch(e.notification){case G.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case G.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case G.CUSTOM_DATA:Object.hasOwn(e.data,`sdk`)&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,n=N.getPeerIdString(e.peerId);N.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(n,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(n,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){this._debug.debug(`Add remote ice candidate`,{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(e){throw this._logger?.log(E.ERROR,`addIceCandidate-direct`),this._debug.error(`Unable to add remote ice candidate`,e,{participantId:this._participantId,candidate:t}),e}}else this._debug.debug(`Cache remote ice candidate`,{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){this._debug.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let n of t)try{await this._addIceCandidate(e,n)}catch{}}async _setRemoteDescription(t,n){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===t)&&this._pc){if(this._lastRemoteSDP?.sdp===n.sdp)return;this._lastRemoteSDP=n,n=e._patchRemoteDescription(n),this._debug.debug(`Add remote description`,{participantId:this._participantId,sdp:n}),this._calcFingerprint(n.sdp);try{await this._pc.setRemoteDescription(n),await this._setRemoteCandidates(t),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(e){throw this._logger?.log(E.ERROR,`setRemoteDescription-direct`),this._debug.error(`Unable to set remote description`,e,{participantId:this._participantId,sdp:n}),e}}else this._remoteSDP[t]=n}_processAnimojiProtocolVersion(e){let t=Math.min(e,P.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){this._debug.debug(`Added remote track`,{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=e=>{this._triggerEvent(Z.REMOTE_TRACK_REMOVED,this._remoteStream,e.track)}),this._triggerEvent(Z.REMOTE_TRACK_ADDED,this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(this._debug.debug(`Local ice candidate`,{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){this._debug.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:P.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case`have-local-offer`:let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(Error());break;case`have-remote-offer`:this._createAnswer().then(t=>this._signaling.sendSdp(this._participantId,t,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case`checking`:let e=this.getState();e===J.IDLE||e===J.OPENED?this._setState(J.CONNECTING):this._setState(J.RECONNECTING);break;case`connected`:case`completed`:k.browserName()===`Safari`&&this._pc?.connectionState!==`connected`&&this._markConnected();break}}_markConnected(){this._neverConnected=!1,this._setState(J.CONNECTED),this._stopReconnection(),this._pc&&N.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(this._logger?.log(E.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))}),this._startStatInterval()}_onConnectionStateChange(){switch(this._debug.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),this._logger?.log(E.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case`connected`:this._markConnected();break;case`failed`:case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection ${this._pc.connectionState}`)):(this._setState(J.RECONNECTING),this._startReconnection());break;case`closed`:this.close(Error(`Ice connection closed`));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(this._debug.log(`Waiting for reconnection...`,{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},P.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(this._debug.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(Y.SERVER))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(this._logger?.log(E.ICE_RESTART),this._debug.log(`Ice restart`,{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):this._debug.debug(`Waiting for ice restart...`,{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,this._debug.error(`Ice restart failed`,{participantId:this._participantId}),this._logger?.log(E.ERROR,`iceRestart-direct`),this._requestTopologySwitch()},P.iceRestartWaitTime)}async _createOffer(t){let n={iceRestart:t,offerToReceiveAudio:!0,offerToReceiveVideo:!0};this._debug.debug(`Create offer`,{participantId:this._participantId,options:n});let r;try{r=await this._pc?.createOffer(n),this._debug.debug(`Created offer`,{participantId:this._participantId,offer:r}),r=e._patchLocalDescription(r)}catch(e){throw this._debug.error(`Unable to create offer`,e,{participantId:this._participantId}),this._logger?.log(E.ERROR,`createOffer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(E.ERROR,`setLocalDescription-direct`),e}}async _createAnswer(){this._debug.debug(`Create answer`,{participantId:this._participantId});let t;try{t=await this._pc?.createAnswer(),this._debug.debug(`Created answer`,{participantId:this._participantId,answer:t}),t=e._patchLocalDescription(t)}catch(e){throw this._debug.error(`Unable to create answer`,e,{participantId:this._participantId}),this._logger?.log(E.ERROR,`createAnswer-direct`),e}try{return this._debug.debug(`Set local description`,{participantId:this._participantId,answer:t}),this._calcFingerprint(t.sdp),await this._pc?.setLocalDescription(t),t}catch(e){throw this._debug.error(`Unable to set local description`,e,{participantId:this._participantId}),this._logger?.log(E.ERROR,`setLocalDescription-direct`),e}}static _patchLocalDescription(e){let t=!!k.baseChromeVersion();return e.sdp=N.patchLocalSDP(e.sdp,P.preferH264&&k.canPreferH264(),k.isBrokenH264Decoder(),P.preferVP9,t&&P.audioNack),e}static _patchRemoteDescription(e){return e.sdp=N.patchRemoteSDP(e.sdp,!1,!1,!1,P.preferVP9,k.isBrokenVP9Encoder(),k.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(e=>{this._debug.error(`DirectTransport: Unable to replace track`,e,{participantId:this._participantId}),this._logger?.log(E.ERROR,`replaceTrack-direct`)})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}W.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,this._codecStatsAggregator?.reportUsage(t);let n={inbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`inbound-rtp`?(e.userId=this._participantId,!0):!1)},outbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:Y.DIRECT,transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(n),this._directStatReporter.reportLocal(n),this._triggerEvent(Z.REMOTE_DATA_STATS,n),this._statInterval=window.setTimeout(e,P.statisticsInterval)})};this._statInterval=window.setTimeout(e,P.statisticsInterval)}async _isSVCSupported(e,t){let n=this._mediaSource.getSendVideoTrack(),r=e.outbound.rtps.find(e=>e.kind===`video`);if(!r?.mimeType||!r?.bandwidth||!n)return!1;let i=n.getSettings();if(!i.width||!i.height||!i.frameRate)return!1;let a={type:k.browserName()===`Firefox`?`transmission`:`webrtc`,video:{contentType:r.mimeType,width:i.width,height:i.height,bitrate:r.bandwidth,framerate:i.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(a)).supported||!1}catch(e){return this._debug.warn(`Failed to get encodingInfo`,a,e),!1}}async _checkPPTNetwork(e){if(!P.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,n=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,r=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,i=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,a=this._videoMaxDimensionsForNet.good,o=Yr.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=Yr.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=Yr.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Yr.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Bi)||this._lastVideoMaxDimension===a)return;let s=this._serverSettings.camera;if(!s||!await this._isSVCSupported(e,o))return;this._debug.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a}),this._lastVideoMaxDimension=a;let c={...this._serverSettings,camera:{...s,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(c)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[``]=e,this._triggerEvent(Z.NETWORK_STATUS,t)}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=N.sdpFingerprint(e);if(t===null){this._debug.warn(`Fingerprint calculation is unsupported`);return}this._fingerprint===null?this._fingerprint=t:(z.onFingerprintChange((this._fingerprint^t).toString()),this._fingerprint=null)}_applySettings(){let e=this._mediaSource.getMediaSettings().isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState===`connected`&&(this._prevConsumerSettings=N.applySettings(this._pc,e,this._prevConsumerSettings,this._debug))}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{negotiated:!0,id:1});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),r.onerror=e=>{this._debug.error(`[${t}] data channel error`,e)},n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)}}},Hi=16,Ui=class e{constructor(e,t,n,r=B){g(this,`_datachannel`,void 0),g(this,`_participantIdRegistry`,void 0),g(this,`_asrCallback`,void 0),g(this,`_textDecoder`,void 0),g(this,`_debug`,void 0),this._debug=r,this._debug.debug(`AsrReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._asrCallback=n,this._textDecoder=new TextDecoder,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}static parse(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint8(1);if(r!==0)throw Error(`Unsupported message type. Message type: ${r}`);let i=t.getUint16(2),a=t.getUint32(4),o=t.getUint32(8),s=t.getUint32(12);if(n!==1)throw Error(`Unexpected protocol version. Got ${n}, expected 1`);return{sequence:i,ssrc:a,timestamp:o,duration:s,data:e.slice(Hi)}}_onDataChannelMessage(t){let n=e.parse(t),r=this._participantIdRegistry?.getStreamDescription(n.ssrc)?.participantId;if(!r){this._debug.warn(`Participant id for ssrc ${n.ssrc} not found in registry`);return}let i={participantId:r,text:this._textDecoder.decode(n.data),timestamp:n.timestamp,duration:n.duration};this._asrCallback(i)}destroy(){this._datachannel.onmessage=null}},Wi=class{constructor(e=B){g(this,`streamDescriptionByCompactId`,new Map),g(this,`compactIdByStreamDescription`,new Map),g(this,`_debug`,void 0),this._debug=e}getStreamDescription(e){return this.streamDescriptionByCompactId.get(e)}getCompactId(e){return this.compactIdByStreamDescription.get(e)}handleMessage(e){let t=new Uint8Array(e),n=t[0],r=t.subarray(1);switch(n){case 1:let e=(0,l.decode)(r);return Object.entries(e).forEach(([e,t])=>{let n=Dn(e);this.streamDescriptionByCompactId.set(t,n),this.compactIdByStreamDescription.set(e,t)}),null;case 2:case 4:let t=(0,l.decode)(r),i=[];for(let e of t){let t=this.getStreamDescription(e);t&&i.push(t.participantId)}return n===2?{type:`notification`,notification:G.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:G.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:G.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:G.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:o[0],maxDimension:o[1]},mediaType:this._decodeMediaType(o[2])};case 6:let s=(0,l.decode)(r),c={};for(let[e,t]of Object.entries(s)){let n=this.getStreamDescription(Number(e))?.participantId;n&&(c[n]=t/100)}return{type:`notification`,notification:G.NETWORK_STATUS,statuses:c};case 7:return this._createParticipantSourcesUpdateNotification(r);case 8:{let e=(0,l.decode)(r).map(e=>{let[t,n,r,i,a,o,s]=e;return{participantId:this.getStreamDescription(t)?.participantId,gain:n,pause:r,offset:i,mute:a,liveStatus:o,startTimeMs:s}});return{type:`notification`,notification:G.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:G.VIDEO_SUSPEND_SUGGEST,bandwidth:u};default:return this._debug.debug(`unsupported message type: `+n),null}}_decodeMediaType(e){if(e===null)return null;switch(e){case 0:return V.CAMERA;case 1:return V.SCREEN;default:throw Error(`Unsupported media type: ${e}`)}}_createParticipantSourcesUpdateNotification(e){let t=(0,l.decode)(e),n=[];for(let[e,r]of Object.entries(t)){let t=r[0],i=r[1],a=r[2],o=!!r[3],s=r[4]===null?void 0:!!r[4],c;if(t!==null){if(c=this.getStreamDescription(t),!c){this._debug.error(`could not uncompress participant ID ${t}`);continue}}else c=null;if(a===null){this._debug.error(`unexpected null sequenceNumber`,e,r);continue}let l=Br.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+`-`+e,u=i?i>>>0:null;n.push({participantStreamDescription:c,streamId:l,rtpTimestamp:u,sequenceNumber:a,fastScreenShare:o,suspend:s})}return{type:`notification`,notification:G.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},Gi=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({}),Ki=class{constructor(e=B,t=null){g(this,`_worker`,null),g(this,`_debug`,void 0),g(this,`_logger`,void 0),this._debug=e,this._logger=t}async _createWorker(e,t,n=[],r={},i=[]){return new Promise((a,o)=>{let s=n.join(`,`),c=new Blob([e,`exports.default(${s});`],{type:`application/javascript; charset=utf-8`}),l=window.URL.createObjectURL(c);this._worker=new Worker(l),this._worker.onmessage=e=>{switch(e.data.type){case Gi.READY:a();break;case Gi.ERROR:o(e.data.error);break;case Gi.FRAME:t(e.data);break;case Gi.DEBUG:this._debug.debug(e.data.message);break;case Gi.LOG_ERROR:this._logger?.log(E.ERROR,e.data.message);break}},this._sendToWorker(Gi.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}static isBrowserSupported(){throw Error(`Not implemented`)}},qi=class extends Ki{constructor(e=B,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`LibVPxDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n)=>{let r=null,i=null,a=!0,o=!1;function s(){return t({locateFile:n}).then(e=>i=e)}function c(t,n,s,c){if(!i){self.postMessage({type:e.LOG_ERROR,message:`decoder-init-fail-libvpx`}),self.postMessage({type:e.FRAME,error:`Fatal initialization error`});return}if(a!==s&&(a=s,r&&(r=null,self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec changed to ${s?`VP9`:`VP8`} - reinitialize`}))),!r&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec ${s?`VP9`:`VP8`}`}),r=new i.VpxDecoder,r.debug(c),!r.init(s?i.VpxType.VP9:i.VpxType.VP8))){r=null,self.postMessage({type:e.FRAME,error:`Decoder failed to create`});return}try{r.allocateBuffer(n.byteLength).set(new Uint8Array(n))}catch(t){self.postMessage({type:e.DEBUG,message:t}),r=null,self.postMessage({type:e.FRAME,error:String(t)});return}if(r.decode()&&r.nextImage())o=!1;else{self.postMessage({type:e.FRAME,error:`Decode failed`}),l();return}let u=r.getImageBuffer();if(!u){self.postMessage({type:e.FRAME,error:`No decoded data`});return}let d=r.getImageWidth(),f=r.getImageHeight();r.nextImage()&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxDecoder-drop`}));let p=new Uint8ClampedArray(u.byteLength);p.set(u),self.postMessage({type:e.FRAME,data:p.buffer,width:d,height:f},[p.buffer])}function l(){o||(self.postMessage({type:e.FRAME,requestKeyFrame:!0}),o=!0)}s().then(()=>{self.onmessage=t=>{switch(t.data.type){case e.FRAME:c(t.data.timestamp,t.data.data,t.data.isVP9,t.data.debug);break}},self.postMessage({type:e.READY})}).catch(t=>{self.postMessage({type:e.ERROR,error:String(t)})})}})(),exports={default:workerExports};",r=>{r.error?(this._debug.warn(`LibVPxDecoder`,r.error),t(r.error)):r.requestKeyFrame?(this._debug.debug(`LibVPxDecoder requests key frame`),n()):e(new ImageData(new Uint8ClampedArray(r.data),r.width,r.height))},[d.default,d.default.getUrl])}decodeFrame(e,t,n,r){this._sendToWorker(Gi.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r,debug:B.enabled()},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`LibVPxDecoder destroyed`)}static isBrowserSupported(){return`WebAssembly`in window&&`Worker`in window}},Ji=class extends Ki{constructor(e=B,t=null){super(e,t)}async init(e,t,n){this._debug.debug(`WebCodecsDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return n=>{let r=null,i=`no-preference`,a=!0,o=!1,s=!1,c=null,l=null;function u(){self.postMessage({type:t.READY})}function d(e,n,r,i=!1){c={timestamp:e,data:n,isVP9:r,keyFrame:i};let a=p(r);if(o&&!i){self.postMessage({type:t.FRAME,error:`WebCodecsDecoder waiting for keyframe`}),f();return}else o&&i&&(o=!1,s=!1,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder got keyframe. Start decoding`}));let l=new EncodedVideoChunk({type:i?`key`:`delta`,timestamp:e,data:n});try{a.decode(l)}catch(e){m(`because failed call decode: ${e.message}`);return}h(i)}self.onmessage=e=>{switch(e.data.type){case t.INIT:u();break;case t.FRAME:d(e.data.timestamp,e.data.data,e.data.isVP9,e.data.keyFrame);break}};function f(){s||(self.postMessage({type:t.FRAME,requestKeyFrame:!0}),s=!0)}function p(e){return a!==e&&(a=e,m(`because codec is changed to ${a?`VP9`:`VP8`}`)),r||(o=!0,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec ${a?`VP9`:`VP8`}`}),r=new VideoDecoder({output:e=>{g();let r=n?[e]:[];self.postMessage({type:t.FRAME,data:e},r),e.close()},error:e=>{g(),m(`because error during decoding: ${e.message}`),i===`prefer-software`?self.postMessage({type:t.FRAME,error:`WebCodecsDecoder failed, reinitialize: `+String(e)}):(i=`prefer-software`,c&&c.keyFrame&&d(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${e.message}`}))}}),r.configure(_(a,i))),r}function m(e){if(r){try{r&&r.state!==`closed`&&r.close()}catch{}r=null,self.postMessage({type:t.FRAME,error:`WebCodecsDecoder reset ${e}`})}}function h(e=!1){l=setTimeout(()=>{m(`because of decode timeout`)},3e3)}function g(){l&&clearTimeout(l),l=null}function _(t,n){return{codec:t?e.VP9:e.VP8,hardwareAcceleration:n}}}})(),exports={default:workerExports};",r=>{r.error?(this._debug.warn(`WebCodecsDecoder`,r.error),t(r.error)):r.requestKeyFrame?(this._debug.debug(`WebCodecsDecoder requests key frame`),n()):(e(r.data),r.data.close())},[k.baseChromeVersion()>=92||k.browserName()===`Safari`])}decodeFrame(e,t,n,r=!1){this._sendToWorker(Gi.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r},[t.buffer])}destroy(){this._removeWorker(),this._debug.debug(`WebCodecsDecoder destroyed`)}static isBrowserSupported(){return`VideoDecoder`in window&&`Worker`in window&&`VideoFrame`in window&&!k.isBrokenVP9Decoder()&&k.browserName()!==`Firefox`}},Yi=class{constructor(e=null,t=0){g(this,`_counter`,0),g(this,`_interval`,0),g(this,`_lastCalculationTime`,Date.now()),g(this,`_onCalculated`,null),this._onCalculated=e,t&&(this._interval=window.setInterval(()=>this.calculate(),t))}increment(e=1){this._counter+=e}calculate(){let e=Date.now(),t=e-this._lastCalculationTime,n=Math.round(this._counter*1e3/t);return this._counter=0,this._lastCalculationTime=e,this._onCalculated?.(n),n}destroy(){window.clearInterval(this._interval),this._interval=0}},Xi=class{constructor(e,t){g(this,`_participantId`,void 0),g(this,`_statAggregator`,void 0),g(this,`_firstFrameReceived`,!1),this._participantId=e,this._statAggregator=t}measure(e,t){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let n=W.getMarkNameScreenshareFirstFrame(this._participantId),r=W.measureMark(n);r!==null&&this._statAggregator?.logEventualStat({name:H.SCREENSHARE_FIRST_FRAME,value:r,width:e,height:t})}},Zi=65536,Qi=`MARK_SCREENSHARE_FREEZE_DURATION`,$i=class e{constructor(e,t,n,r,i,a=B){g(this,`_participantId`,void 0),g(this,`_onStream`,void 0),g(this,`_onStat`,void 0),g(this,`_onKeyFrameRequested`,void 0),g(this,`_statScreenShareFirstFrame`,void 0),g(this,`_debug`,void 0),g(this,`_chunks`,[]),this._participantId=e,this._onStream=t,this._onStat=n,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new Xi(e,r),this._debug=a}appendChunk(t){let n=this._chunks.length;if(t.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),n&&(this._debug.warn(`[FrameBuilder] Cleanup buffer`,Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!n||(this._chunks[n-1].sequence+1)%Zi!==t.sequence){this._debug.warn(`[FrameBuilder] Got incorrect chunk`);return}if(this._chunks.push(t),t.end){let n=this._processFrameData(),{width:r,height:i}=e.getFrameSize(n);this._processFrame({timestamp:t.timestamp,frameData:n,isVP9:t.isVP9,keyframe:t.keyframe,width:r,height:i}),this._statScreenShareFirstFrame.measure(r,i)}}destroy(){W.clearMark(Qi),W.clearMark(W.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let e=this._chunks;this._chunks=[];let t=e.reduce((e,t)=>e+t.data.byteLength,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(new Uint8Array(t.data),r),r+=t.data.byteLength;return n}static getFrameSize(e){let t={width:0,height:0},n=new f.BitStream(e.buffer);n.bigEndian=!0,n.index+=2;let r=n.readBits(1),i=n.readBits(1)<<1|r;return i===3&&n.index++,n.readBits(1)===1||n.readBits(1)!==0?t:(n.index++,n.index++,n.index+=24,i>=2&&n.index++,n.readBits(3)===7?(i===1||i===3)&&n.index++:(n.index++,(i===1||i===3)&&(n.index+=3)),t.width=n.readBits(16)+1,t.height=n.readBits(16)+1,t)}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(e){if(e){W.setMark(Qi);return}let t=W.measureMark(Qi);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},ea=class{constructor(e){g(this,`_onStream`,void 0),this._onStream=e}async drawFrame(e){throw Error("Method `drawFrame` is not supported by this implementation")}async drawImage(e){throw Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}},ta=class extends ea{constructor(e,t=B){super(e),g(this,`_useImageBitmap`,void 0),g(this,`_canvas`,null),g(this,`_canvasContext`,null),g(this,`_stream`,null),g(this,`_track`,null),g(this,`_debug`,void 0),this._debug=t,this._debug.debug(`CanvasRenderer started`),this._useImageBitmap=`ImageBitmap`in window}_createStream(e,t){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.width=e,this._canvas.height=t,this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`0`,this._canvas.style.zIndex=`5000`,document.body.appendChild(this._canvas),this._useImageBitmap?this._canvasContext=this._canvas.getContext(`bitmaprenderer`):this._canvasContext=this._canvas.getContext(`2d`),this._stream=this._canvas.captureStream(0),this._track=this._stream.getVideoTracks()[0],this._track.contentHint=`text`)}_removeStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null,this._track=null),this._canvasContext=null;try{this._canvas&&document.body.removeChild(this._canvas)}catch{}this._canvas=null}_requestCanvasFrame(){this._track&&this._track.requestFrame?this._track.requestFrame():this._stream&&this._stream.requestFrame&&this._stream.requestFrame()}async _drawImage(e){this._track||(this._createStream(e.width,e.height),this._onStream(this._stream));let t=this._canvas;if(t.width=e.width,t.height=e.height,this._useImageBitmap){let t;if(e instanceof ImageBitmap)t=e;else{let{width:n,height:r,data:i}=e,a=n*r*4;if(i.byteLength!==a){this._debug.warn(`Bad frame buffer`,{w:n,h:r,got:i.byteLength,expected:a});return}t=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){this._debug.warn(`Canvas context is null`),t.close();return}this._canvasContext.transferFromImageBitmap(t),t.close()}else{let n=this._canvasContext;n.clearRect(0,0,t.width,t.height),n.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t=`createImageBitmap`in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),this._debug.debug(`CanvasRenderer destroyed`)}static isBrowserSupported(){return(`CanvasCaptureMediaStream`in window||`CanvasCaptureMediaStreamTrack`in window)&&!(k.browserName()===`Safari`&&Number(k.browserVersion())===15)&&!(k.browserName()===`Firefox`&&Number(k.browserVersion())<60)}},na=class extends ea{constructor(e,t=B){super(e),g(this,`_generator`,void 0),g(this,`_writer`,void 0),g(this,`_stream`,void 0),g(this,`_debug`,void 0),this._debug=t,this._debug.debug(`TrackGeneratorRenderer started`),this._generator=new MediaStreamTrackGenerator({kind:j.video}),this._writer=this._generator.writable.getWriter(),this._stream=new MediaStream([this._generator]),this._onStream(this._stream)}async drawFrame(e){await this._writer.write(e)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),this._debug.debug(`TrackGeneratorRenderer destroyed`)}static isBrowserSupported(){return`VideoFrame`in window&&`MediaStreamTrackGenerator`in window&&Ji.isBrowserSupported()}},ra=class extends $i{constructor(e,t,n,r,i,a=B,o=null){super(e,t,n,r,i,a),g(this,`_renderer`,void 0),g(this,`_decoder`,void 0),g(this,`_decoderReady`,!1),g(this,`_decoderBusy`,!1),g(this,`_decoderQueue`,[]),g(this,`_fpsMeter`,void 0),g(this,`_logger`,void 0),this._logger=o,this._debug.debug(`StreamBuilder started for participant [${e}]`),this._initFpsMeter(),this._initRenderer(),this._initDecoder()}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_initFpsMeter(){this._fpsMeter=new Yi(e=>this._debug.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!na.isBrowserSupported()?this._renderer=new ta(this._onStream,this._debug):this._renderer=new na(this._onStream,this._debug)}_initDecoder(e=!1){e||!Ji.isBrowserSupported()?this._decoder=new qi(this._debug,this._logger):this._decoder=new Ji(this._debug,this._logger),this._decoder.init(async e=>{this._decoderBusy=!1,`VideoFrame`in window&&e instanceof VideoFrame?await this._renderer.drawFrame(e):await this._renderer.drawImage(e),this._fpsMeter.increment(),this._decodeQueue()},e=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof Ji&&typeof e==`string`&&e.includes(`EncodingError`)&&this._switchToLibVPXDecoder()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()})}_switchToLibVPXDecoder(){this._debug.warn(`StreamBuilder switch to LibVPX decoder`),this._fpsMeter&&this._fpsMeter.destroy(),this._decoder&&(this._decoderReady=!1,this._decoderBusy=!1,this._decoder.destroy()),this._renderer&&this._renderer.destroy(),this._initFpsMeter(),this._initRenderer(!0),this._initDecoder(!0)}_decodeQueue(){if(!this._decoderReady||this._decoderBusy)return;let e=this._decoderQueue.shift();e&&(this._decoderBusy=!0,this._decoder.decodeFrame(e.timestamp,e.frameData,e.isVP9,e.keyframe))}destroy(){super.destroy(),this._fpsMeter.destroy(),this._decoder.destroy(),this._renderer.destroy(),this._debug.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return ta.isBrowserSupported()||na.isBrowserSupported()}},ia=1,aa=1,oa=2,sa=0,ca=1,la=2,ua=4,da=8;function fa(e,t,n,r,i,a,o){let s=0;t&&(s|=ca),n&&(s|=la),r&&(s|=ua),o||(s|=da);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,ia),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,sa),l.setUint8(10,s),!o)return c;let u=new Uint8Array(c.byteLength+o.byteLength);return u.set(new Uint8Array(c),0),u.set(new Uint8Array(o),c.byteLength),u.buffer}function pa(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint16(1),i=t.getUint32(3),a=t.getUint8(7)===1,o=t.getUint16(8),s=t.getUint8(10),c=!!(s&ca),l=!!(s&la),u=!!(s&ua),d=!!(s&da);if(n!==ia)throw Error(`Unexpected protocol version. Got ${n}, expected ${ia}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function ma(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==ia||t.getUint8(1)!==aa||t.getUint16(2)!==sa)}function ha(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==ia||t.getUint8(1)!==oa||t.getUint16(2)!==sa?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function ga(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,ia),n.setUint8(1,aa),n.setUint16(2,e),t}var _a=2**15-1,va=1,ya=5,ba=5,xa=class e{constructor(e,t=B){g(this,`_mediaSource`,void 0),g(this,`_codec`,void 0),g(this,`_sourceBuffer`,null),g(this,`_queue`,[]),g(this,`_clearBufferTill`,0),g(this,`_debug`,void 0),this._mediaSource=new MediaSource,this._codec=e,this._debug=t;let n=()=>{this._mediaSource.removeEventListener(`sourceopen`,n),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener(`sourceopen`,n,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let e=this._sourceBuffer.buffered.start(0);e<this._clearBufferTill&&(this._sourceBuffer.remove(e,this._clearBufferTill),this._debug.debug(`[WebmBuilder] SourceBuffer cleanup from ${e} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let t=this._queue;this._queue=[];let n=e._buildQueue(t);this._sourceBuffer.appendBuffer(n)}static _buildQueue(e){if(!e.length)return new Uint8Array;if(e.length===1)return p.build(e[0]);let t=e.reduce((e,t)=>e+t.countSize(),0),n=new Uint8Array(t),r=0;for(let t of e){let e=p.build(t);n.set(e,r),r+=e.byteLength}return n}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode=`sequence`,this._sourceBuffer.addEventListener(`updateend`,()=>this._handleQueue())}changeType(e){return this._codec=e,this._sourceBuffer?.changeType(e)}append(e,t=!1){this._queue.push(e),t&&this._handleQueue()}cleanup(){this._mediaSource?.readyState===`open`&&this._sourceBuffer?.abort();let e=this._sourceBuffer?.buffered,t=e?.length;if(!t)return;let n=e.start(0),r=Math.max(0,e.end(t-1)-ya);r-n>ba&&(this._clearBufferTill=r)}destroy(){this._queue=[],this._mediaSource.readyState===`open`&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},Sa=class e extends $i{constructor(e,t,n,r,i=B){super(e,t,n,r,void 0,i),g(this,`_mediaBuffer`,null),g(this,`_video`,null),g(this,`_stream`,null),g(this,`_earliestTimestamp`,0),g(this,`_clusterStartTime`,0),g(this,`_lastFrameTimestamp`,0),this._debug.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return p.element(p.ID.EBML,[p.element(p.ID.EBMLVersion,p.number(1)),p.element(p.ID.EBMLReadVersion,p.number(1)),p.element(p.ID.EBMLMaxIDLength,p.number(4)),p.element(p.ID.EBMLMaxSizeLength,p.number(8)),p.element(p.ID.DocType,p.string(`webm`)),p.element(p.ID.DocTypeVersion,p.number(2)),p.element(p.ID.DocTypeReadVersion,p.number(2))])}static _genSegmentHeader(e,t,n){let r=p.element(p.ID.Info,[p.element(p.ID.TimecodeScale,p.number(1e6)),p.element(p.ID.MuxingApp,p.string(`vk-webm-builder`)),p.element(p.ID.WritingApp,p.string(`vk-webm-builder`))]),i=[p.element(p.ID.PixelWidth,p.number(e)),p.element(p.ID.PixelHeight,p.number(t))],a=p.element(p.ID.Tracks,p.element(p.ID.TrackEntry,[p.element(p.ID.TrackNumber,p.number(va)),p.element(p.ID.TrackUID,p.number(va)),p.element(p.ID.TrackType,p.number(1)),p.element(p.ID.FlagLacing,p.number(0)),p.element(p.ID.DefaultDuration,p.number(1e9)),p.element(p.ID.CodecID,p.string(`V_${n.toUpperCase()}`)),p.element(p.ID.Video,i)]));return p.unknownSizeElement(p.ID.Segment,[r,a])}static _genClusterHeader(e){return p.unknownSizeElement(p.ID.Cluster,[p.element(p.ID.Timecode,p.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new xa(e,this._debug),this._video=document.createElement(`video`),this._video.autoplay=!0,this._video.controls=!1,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,this._video.src=URL.createObjectURL(this._mediaBuffer.mediaSource),document.body.appendChild(this._video);let t=()=>{if(this._video?.src){this._debug.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let e=this._video.seekable;e.length&&(this._video.currentTime=e.end(e.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>this._debug.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(t){let n=t.isVP9?`vp9`:`vp8`;this._mediaBuffer?this._mediaBuffer.codec!==n&&this._mediaBuffer.changeType(n):this._createVideo(n);let r=t.timestamp;if(r<=this._lastFrameTimestamp&&(r=this._lastFrameTimestamp+10,this._debug.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=r,this._earliestTimestamp)r-=this._earliestTimestamp;else{if(!t.keyframe)return;this._earliestTimestamp=r,r=0}if(t.keyframe){this._clusterStartTime=r,this._mediaBuffer?.cleanup(),this._debug.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let i=e._genWebmHeader();this._mediaBuffer?.append(i);let a=e._genSegmentHeader(t.width,t.height,n);this._mediaBuffer?.append(a)}let i=Math.round(r-this._clusterStartTime);if(i>_a&&(this._clusterStartTime=r,i=0),i===0){this._debug.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let t=e._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(t)}let a=p.element(p.ID.SimpleBlock,[p.vintEncodedNumber(va),p.bytes(e._intToU16BE(i)),p.number(!!t.keyframe<<7),p.bytes(t.frameData)]);this._mediaBuffer?.append(a,!0)}destroy(){super.destroy(),this._video&&(this._video.onpause=null,this._video.onwaiting=null,this._video.onstalled=null,this._video.onerror=null,this._video.pause(),this._video.src=``,document.body.removeChild(this._video)),this._mediaBuffer&&(this._mediaBuffer.destroy(),this._mediaBuffer=null),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),this._debug.debug(`[WebmBuilder] destroyed for participant [${this._participantId}]`)}static isBrowserSupported(){return`captureStream`in window.HTMLVideoElement?.prototype&&window.MediaSource?.isTypeSupported(`video/webm; codecs="vp8"`)&&window.MediaSource?.isTypeSupported(`video/webm; codecs="vp9"`)}},Ca=class{constructor(e,t,n,r,i,a=null,o=B,s=null){g(this,`_datachannel`,void 0),g(this,`_participantIdRegistry`,null),g(this,`_streamBuilders`,{}),g(this,`_onStream`,()=>{}),g(this,`_onEos`,()=>{}),g(this,`_onStat`,void 0),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`_statAggregator`,void 0),this._debug=o,this._logger=s,this._statAggregator=a,this._debug.debug(`ScreenCaptureReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._onStream=n,this._onEos=r,this._onStat=i,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}_onDataChannelMessage(e){let t=pa(e),n=this._participantIdRegistry?.getStreamDescription(t.ssrc)?.participantId;if(!n){this._debug.warn(`Participant id for ssrc ${t.ssrc} not found in registry`);return}if(t.eos){this.close(n),this._onEos(n);return}let r=this._streamBuilders[n];if(!r){let e=e=>this._onStream(n,e);r=P.screenShareWebmBuilder&&Sa.isBrowserSupported()?new Sa(n,e,this._onStat,this._statAggregator,this._debug):new ra(n,e,this._onStat,this._statAggregator,()=>{this._requestKeyFrame(t.ssrc)},this._debug,this._logger),this._streamBuilders[n]=r}r.appendChunk(t)}_requestKeyFrame(e){if(!(!this._datachannel||this._datachannel.readyState!==`open`))try{let t=ga(e);this._datachannel.send(t),this._debug.debug(`ScreenCaptureReceiver request for keyframe for ssrc ${e}`)}catch(e){this._debug.warn(`Failed to send keyframe request`,e)}}close(e){let t=this._streamBuilders[e];t&&(t.destroy(),delete this._streamBuilders[e])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(e=>e.destroy()),this._streamBuilders={},this._participantIdRegistry=null,this._debug.debug(`ScreenCaptureReceiver destroyed`)}},wa=class{constructor(e,t,n){g(this,`_prev`,void 0),g(this,`_next`,void 0),g(this,`_data`,void 0),this._next=n,n&&(n.prev=this),this._prev=t,t&&(t.next=this),this._data=e}get prev(){return this._prev}set prev(e){this._prev=e}get next(){return this._next}set next(e){this._next=e}get data(){return this._data}},Ta=class{constructor(){g(this,`_head`,null),g(this,`_tail`,null),g(this,`_length`,0)}get length(){return this._length}push(...e){for(let t of e)this._tail=new wa(t,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(e){this._tail&&(this._tail.next=e._head),this._head||(this._head=e._head),this._tail=e._tail,this._length+=e._length,e.clear()}shift(){if(!this._length||!this._head)return null;let e=this._head;return this._head=e.next,this._head&&(e.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),e.data}bisect(){if(this.length){let e=this.length>1?Math.floor(this.length/2):1;for(let t=0;t<e;t++)this.shift()}}head(){return this._head?.data||null}tail(){return this._tail?.data||null}clear(){this._head=null,this._tail=null,this._length=0}toString(){let e=[],t=this._head;for(;t!==null;)e.push(t.data),t=t.next;return e.length?JSON.stringify(e,(e,t)=>t instanceof Error?String(t):t):``}},Ea=1e3,Da=class extends Ki{constructor(e,t,n,r,i=B,a=null){super(i,a),g(this,`_sourceTrack`,void 0),g(this,`_onFrame`,void 0),g(this,`_useCongestionControl`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_useImageCapture`,void 0),g(this,`_video`,null),g(this,`_imageCapture`,null),g(this,`_canvas`,null),g(this,`_canvasCtx`,null),g(this,`_frameReadTimeout`,0),g(this,`_lastFrame`,null),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useImageCapture=`ImageCapture`in window&&ImageCapture.prototype.grabFrame!==void 0&&`ImageBitmap`in window,(e.readyState!==`live`||!e.enabled||e.muted)&&(this._useImageCapture=!1)}_createDom(){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`160px`,this._canvas.style.zIndex=`5000`,this._canvasCtx=this._canvas.getContext(`2d`),document.body.appendChild(this._canvas)),!this._video&&!this._useImageCapture&&(this._video=document.createElement(`video`),this._video.controls=!1,this._video.autoplay=!1,this._video.preload=`auto`,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,document.body.appendChild(this._video))}_removeDom(){try{this._canvas&&document.body.removeChild(this._canvas),this._video&&document.body.removeChild(this._video)}catch{}this._canvasCtx=null,this._canvas=null,this._video=null}async _createStream(e){if(!this._canvas)throw Error(`Canvas not found`);if(!this._video&&!this._useImageCapture)throw Error(`Video element not found`);return new Promise((t,n)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let r=this._video;r.srcObject=new MediaStream([e]),r.onloadeddata=e=>t(),r.onerror=()=>n(Error(`Video element error`));let i=r.play(),a=()=>n(Error(`Autoplay is disabled`));i?i.catch(a):a()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw Error(`Fatal error`);this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw Error(`Destroyed`);return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw Error(`Destroyed`);let t=e.width,n=e.height;return this._canvas.width=t,this._canvas.height=n,this._canvasCtx.clearRect(0,0,t,n),this._canvasCtx.drawImage(e,0,0,t,n),this._canvasCtx?.getImageData(0,0,t,n)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;this._debug.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createStream(this._sourceTrack),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n,r,i)=>{let a;function o(o,s){return t({locateFile:n}).then(t=>{if(a=new t.VpxEncoder,a.debug(s),!a.init(o?t.VpxType.VP9:t.VpxType.VP8))throw self.postMessage({type:e.LOG_ERROR,message:`encoder-init-fail-libvpx`}),Error(`LibVPxEncoder failed to create`);if(r){let e=Math.round(i/1e3);a.setTargetBitrate(e)}else a.setMaxQuantizer(10),a.setTargetBitrate(1024)})}function s(t,n,r,i){let o=a.allocateImage(t,n);if(!o){self.postMessage({type:e.FRAME,error:`No buffer data`});return}o.set(new Uint8Array(r));let s=Math.round(performance.now());if(!a.encode(s,150,i)){self.postMessage({type:e.FRAME,error:`Encode failed`});return}let c=a.readFrame();if(!c){self.postMessage({type:e.FRAME,error:`No encoded data`});return}a.readFrame()&&(self.postMessage({type:e.DEBUG,message:`LibVPxEncoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxEncoder-drop`}));let l=new Uint8Array(c.byteLength);l.set(c),self.postMessage({type:e.FRAME,frameType:i?`key`:`delta`,timestamp:s,duration:150,width:t,height:n,data:l.buffer},[l.buffer])}function c(e,t){let n=Math.round(e/1e3);a.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case e.INIT:o(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:e.READY})).catch(t=>self.postMessage({type:e.ERROR,error:String(t)}));break;case e.FRAME:s(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case e.SET_BITRATE:c(t.data.bitrate,t.data.useCbr);break}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[d.default,d.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:B.enabled()})}_encode(e,t){let n=e.data.buffer;this._sendToWorker(Gi.FRAME,{width:e.width,height:e.height,imageData:n,keyFrame:t},[n])}_requestFrameVideo(e){let t=this._drawFrameVideo();this._encode(t,e)}_requestFrameBitmap(e){window.clearTimeout(this._frameReadTimeout),this._frameReadTimeout=window.setTimeout(()=>{if(this._lastFrame){let t=this._drawFrameData(this._lastFrame);this._encode(t,e)}else this._onFrame(null)},Ea),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let n=this._drawFrameData(t);this._encode(n,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,n){this._sendToWorker(Gi.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),this._debug.debug(`LibVPxEncoder destroyed`)}},Oa=class extends Ki{constructor(e,t,n,r,i,a,o=B,s=null){super(o,s),g(this,`_sourceTrack`,void 0),g(this,`_trackProcessor`,void 0),g(this,`_onFrame`,void 0),g(this,`_useCongestionControl`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_useCbr`,void 0),g(this,`_frameRate`,void 0),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useCbr=i,this._frameRate=a,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,n=this._trackProcessor.readable;this._debug.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return()=>{let n,r,i,a,o,s,c=null,l=0,u=!1,d=0,f,p,m=!1,h=!1;function g(e){n=e.readable,r=n.getReader(),i=e.width,a=e.height,o=e.isVP9,s=e.framerate,f=e.useCongestionControl,p=e.maxBitrate,f&&(d=p,m=e.useCbr),y(),self.postMessage({type:t.READY})}function _(e){e&&!h&&(h=!0),self.clearTimeout(l),l=self.setTimeout(()=>{c&&v(c,h)},1e3),!u&&(u=!0,r.read().finally(()=>{u=!1,self.clearTimeout(l)}).then(({done:e,value:t})=>{if(c?.close(),c=null,!(e||!t)){if(!x){r.releaseLock(),n.cancel();return}c=t,v(t,h)}}))}function v(e,t){(e.codedWidth!==i||e.codedHeight!==a)&&(i=e.codedWidth,a=e.codedHeight,y(),h=!0),x.encode(e,{keyFrame:t}),t&&(h=!1)}function y(){let t={framerate:s,codec:o?e.VP9:e.VP8,width:i,height:a,latencyMode:`realtime`,bitrateMode:m?`constant`:`variable`};d>0&&(t.bitrate=d),x.configure(t)}function b(e,t,n){d=e,m=t,s=n,y()}let x=new VideoEncoder({output:e=>{let n;e.data?n=e.data:(n=new ArrayBuffer(e.byteLength),e.copyTo(n)),self.postMessage({type:t.FRAME,frameType:e.type,timestamp:e.timestamp,duration:e.duration,width:i,height:a,data:n},[n])},error:e=>{self.postMessage({type:t.FRAME,error:String(e)})}});self.onmessage=e=>{switch(e.data.type){case t.INIT:g(e.data);break;case t.FRAME:_(e.data.keyFrame);break;case t.SET_BITRATE:b(e.data.bitrate,e.data.useCbr,e.data.fps);break}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[],{readable:n,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[n])}requestFrame(e=!1){this._sendToWorker(Gi.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(Gi.SET_BITRATE,{bitrate:e,useCbr:t,fps:n})}isVP9(){return!0}destroy(){this._removeWorker(),this._debug.debug(`WebCodecsEncoder destroyed`)}static isBrowserSupported(){return`VideoEncoder`in window&&`Worker`in window&&`EncodedVideoChunk`in window&&`MediaStreamTrackProcessor`in window}},ka=2100,Aa=600,ja=1.2,Ma=.8,Na=2e3,Pa=8e3,Fa=8e3,Ia=16e3,La=4,Ra=2e3,za=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(za||{}),Ba=class{constructor(e,t,n,r,i,a,o,s=B){g(this,`_onCongestion`,void 0),g(this,`_ccEnabled`,void 0),g(this,`_fastSharing`,void 0),g(this,`_trendDelayThreshold`,void 0),g(this,`_highDelayThreshold`,void 0),g(this,`_targetFps`,void 0),g(this,`_minBitrate`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_targetBitrate`,void 0),g(this,`_lastDown`,void 0),g(this,`_lastUp`,void 0),g(this,`_lastProbing`,void 0),g(this,`_lastCheckDelay`,void 0),g(this,`_upPenalty`,0),g(this,`_probing`,void 0),g(this,`_delayAvgShort`,-1),g(this,`_delayAvgLong`,-1),g(this,`_minDelay`,Number.MAX_VALUE),g(this,`_maxDelay`,0),g(this,`_largeDelayDuration`,0),g(this,`_lastFpsCalcMs`,void 0),g(this,`_frames`,0),g(this,`_fps`,0),g(this,`_debug`,void 0),this._onCongestion=e,this._ccEnabled=r,this._debug=s,this._minBitrate=t,this._maxBitrate=n,this._fastSharing=i,this._targetFps=o,a>0?this._highDelayThreshold=a:this._highDelayThreshold=ka,i&&(this._highDelayThreshold=Aa),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let c=Date.now();this._lastDown=0,this._lastUp=c,this._lastProbing=c,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(e,t,n){let r=Date.now();if(this._calcFps(r),this._calcDelay(t,r),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let i=0,a=this._delayAvgShort-this._delayAvgLong,o=Math.round(Math.abs(a)*100/this._delayAvgLong),s=a>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,c=this._delayAvgShort>this._highDelayThreshold;s||c?i=2:Math.abs(a)<40&&o<10&&!c&&(i=1);let l=Math.round(this._targetBitrate/1e3),u=n;e%20==0&&this._debug.debug(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${za[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>Na){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,La),this._probing=!1);let n=Ma*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*Ma),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*Fa/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${za[i]}`),this._debug.log(`#${e}: cc: DOWN delay=${t} bitrate=${u} target=${l} -> newBitrate=${r} penalty=${s}s`),this._setBitrate(n,!0),this._targetBitrate=n}this._lastDown=r}let f=r-this._lastUp,p=Pa+this._upPenalty*Fa;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*ja,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*Fa/1e3);this._debug.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${za[i]}`),this._debug.log(`#${e}: cc: UP bitrate=${u} target=${c} -> newBitrate=${s} penalty=${l}s`),this._setBitrate(n,!1),this._targetBitrate=n,this._probing=!0,this._lastProbing=r,this._lastUp=r}}let m=r-this._lastProbing;this._probing&&m>Ia&&(this._probing=!1);let h=r-this._lastDown;this._upPenalty>0&&h>3*p&&(this._debug.log(`#${e}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(e,t){this._fastSharing&&(t=!0);let n=this._targetFps;this._fps>0&&(n=this._fps),this._onCongestion(e,t,n)}_calcDelay(e,t){if(!(e<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=e,this._delayAvgLong=e),this._delayAvgShort=Math.round((this._delayAvgShort*3+e)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+e)/24),e>0&&e<this._minDelay?this._minDelay=e:e>this._maxDelay&&(this._maxDelay=e),this._lastCheckDelay===0&&(this._lastCheckDelay=t),e>Ra){let e=t-this._lastCheckDelay;this._largeDelayDuration+=e}this._lastCheckDelay=t}}reconfigure(e,t){this._minBitrate=e,this._maxBitrate=t}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let e={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,e}_calcFps(e){this._frames++;let t=e-this._lastFpsCalcMs;if(t>5e3){this._lastFpsCalcMs=e;let n=this._fps,r=this._frames*1e3/t;this._fps===0?this._fps=Math.round(r):this._fps=Math.round((this._fps*3+r)/4),this._frames=0,this._fps!==n&&this._debug.log(`cc: fps=${this._fps}`)}}},Va=class{constructor(e){g(this,`_maxSize`,void 0),g(this,`_size`,0),g(this,`_buffer`,void 0),g(this,`_head`,0),g(this,`_tail`,0),this._maxSize=e,this._buffer=Array(e)}add(e,t,n,r,i){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let a=this._tail;return this._buffer[this._tail]={seq:e,ts:t,size:n,sent:Date.now(),start:r,end:i,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,a}update(e,t){let n=this.get(e);return n===null?null:(n.ts2=t,n.recv=Date.now(),n)}get(e){let t=this._head;for(let n=0;n<this._maxSize;n++){let n=this._buffer[t];if(e===n?.seq)return n;if(t=++t%this._maxSize,t===this._tail)break}return null}getServerBitrateK(e){let t=0,n=0,r=-1,i=-1,a=this._tail;for(let t=0;t<this._maxSize;t++){a>0?--a:a=this._maxSize-1;let t=this._buffer[a];if(!t||(i===-1&&(i=t.ts2,n=0),i>=0&&(n+=t.size),r=t.ts2,i-r>=e)||a===this._head)break}if(r>=0&&i>=0){let e=i-r;t=Math.round(e>0?n*8/e:0)}return t}getCurrentDelay(){let e=this._tail;for(let t=0;t<this._maxSize;t++){e>0?--e:e=this._maxSize-1;let t=this._buffer[e];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(e===this._head)break}return 0}getMaxBandwidth(){let e=0,t=0,n=-1,r=-1,i=this._tail;for(let a=0;a<this._maxSize;a++){i>0?--i:i=this._maxSize-1;let a=this._buffer[i];if(a){if(r===-1&&a.end&&!a.start&&(r=a.ts2,t=0),n===-1&&r>=0&&a.start&&!a.end&&(n=a.ts2),n>=0&&r>=0){let i=r-n;e=i>0?t*8/i:0;break}if(r>=0&&(t+=a.size),i===this._head)break}}return Math.round(e)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}},Ha=65536,Ua=50,Wa=400,Ga=1e6,Ka=3e5,qa=3e4,Ja=2e3,Ya=5,Xa=0,Za=class{constructor(e,t,n,r,i=B,a=null){g(this,`_encoder`,void 0),g(this,`_datachannel`,void 0),g(this,`_signaling`,void 0),g(this,`_fastSharing`,void 0),g(this,`_destroyed`,!1),g(this,`_needKeyframe`,!0),g(this,`DATA_SIZE`,void 0),g(this,`_congestionControl`,void 0),g(this,`_frameNum`,0),g(this,`_width`,void 0),g(this,`_height`,void 0),g(this,`_feedback`,new Va(1024)),g(this,`_lastSentFrameSeq`,0),g(this,`_lastDeliveredFrameSeq`,0),g(this,`_lastFrameDelay`,0),g(this,`_lastFramerateReduced`,Date.now()),g(this,`_lastSharingStat`,Date.now()),g(this,`_congestionControlEnabled`,void 0),g(this,`_queue`,new Ta),g(this,`_fpsMeter`,void 0),g(this,`_maxFrameDelay`,void 0),g(this,`_debug`,void 0),g(this,`_logger`,void 0),this._debug=i,this._logger=a,this._debug.debug(`ScreenCaptureSender started`),this.DATA_SIZE=P.consumerScreenDataChannelPacketSize-11,this._datachannel=t,this._signaling=n,this._fastSharing=r,this._congestionControlEnabled=P.screenShareCongestionControl||this._fastSharing,this._width=e.getSettings().width,this._height=e.getSettings().height,this._maxFrameDelay=this._fastSharing?P.screenShareCongestionControlThreshold:P.screenShareCongestionControlThreshold*2;let o=P.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),l=this._onCongestionCallback.bind(this);this._debug.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${P.screenShareCongestionControlThreshold}`),this._congestionControl=new Ba(l,s,c,this._congestionControlEnabled,this._fastSharing,P.screenShareCongestionControlThreshold,o,this._debug);let u=(e,t)=>{if(this._destroyed)return;if(!e){this._debug.warn(`requestFrame failed, keyFrame: `+this._needKeyframe,t),this._needKeyframe=!0,this._handleQueue();return}(e.width!==this._width||e.height!==this._height)&&(this._width=e.width,this._height=e.height,this._onResize(this._width,this._height));let n=this._sliceFrame(e);this._queue.merge(n),this._handleQueue(),this._sendSharingStat()};if(Oa.isBrowserSupported()){let t=this._fastSharing;this._encoder=new Oa(e,u,this._congestionControlEnabled,c,t,o,this._debug,this._logger)}else this._encoder=new Da(e,u,this._congestionControlEnabled,c,this._debug,this._logger);this._datachannel.onmessage=e=>{ma(e.data)&&(this._debug.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=ha(e.data);t!==null&&this._checkCcFeedback(t)},this._encoder.init().then(()=>this._handleQueue()).catch(e=>this._debug.warn(`ScreenCaptureSender init failed`,e)),this._fpsMeter=new Yi(e=>this._debug.log(`[ScreenCaptureSender] fps: ${e}`),5e3)}_handleQueue(){if(this._destroyed)return;let e=this._queue.shift();if(!e){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Ha)%Ha>Ya&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>Ja&&(this._lastFramerateReduced=e,this._debug.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(e)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),N.setImmediate(()=>this._handleQueue());return}if(e.isLast){this._frameNum++,this._fpsMeter.increment(),e.isKey&&this._debug.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(e.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),n=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,n)}else N.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let e=this._queue.head();for(;e;){if(e.isFirst&&e.isKey)return!0;this._queue.shift(),e=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(e){let t=e.type===`key`,n=e.data.byteLength,r=new Ta;for(let i=0;i<n;i+=this.DATA_SIZE){let a=e.data.slice(i,i+this.DATA_SIZE),o=i===0,s=n<=i+a.byteLength,c=this._wrapHeader(e.timestamp,o,s,t,a);r.push({data:c.data,sequence:c.sequence,frameSize:n,isFirst:o,isLast:s,isKey:t,timestamp:e.timestamp})}return r}_wrapHeader(e,t,n,r,i){let a=fa(e,t,n,r,Xa,this._encoder.isVP9(),i),o={sequence:Xa,data:a};return Xa=(Xa+1)%Ha,o}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(e){if(!this._datachannel||this._datachannel.readyState!==`open`)return!1;try{return this._datachannel.send(e.data),this._feedback.add(e.sequence,e.timestamp,e.data.byteLength,e.isFirst,e.isLast),e.isLast&&(this._lastSentFrameSeq=e.sequence),!0}catch(e){return this._debug.warn(`Error sending chunk to DataChannel`,e),!1}}destroy(){this._queue.clear(),this._fpsMeter.destroy(),this._datachannel.onmessage=null,this._feedback.clear(),this._datachannel.readyState===`open`&&this._datachannel.send(this._stopPacket()),this._destroyed=!0,this._encoder.destroy(),this._debug.debug(`ScreenCaptureSender destroyed`)}static isBrowserSupported(){return Oa.isBrowserSupported()||Da.isBrowserSupported()}_onCongestionCallback(e,t,n){this._encoder.setBitrate(e,t,n)}_onResize(e,t){let{minBitrate:n,maxBitrate:r}=this._calcMinMaxBitrate(e,t),i=Math.round(n/1e3),a=Math.round(r/1e3);this._debug.log(`cc: resize to ${e}x${t}, minBitrate=${i} maxBitrate=${a}`),this._congestionControl.reconfigure(n,r)}_calcMinMaxBitrate(e,t){(e===void 0||e<640)&&(e=640),(t===void 0||t<360)&&(t=360);let n=e*t/256;return{minBitrate:Math.max(Ka,Math.min(Ga,Math.round(n*Ua))),maxBitrate:Math.round(n*Wa)}}_checkCcFeedback(e){let t=this._feedback.update(e.seq,e.ts2);if(t===null)this._debug.debug(`cc: update failed, seq=${e.seq}`);else if(t.end){this._lastDeliveredFrameSeq=t.seq;let e=t.recv-t.sent;e>0&&(this._lastFrameDelay=e),this._handleQueue()}}_sendSharingStat(){let e=Date.now();if(e-this._lastSharingStat>qa){let t=this._congestionControl.getStat();t!==null&&(this._debug.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=e}}},Qa=90,$a=4294967295,eo=class e extends bi{constructor(e,t,n,r=B,i=null,a=null,o=null){super(e,t),g(this,`_producerNotification`,null),g(this,`_producerCommand`,null),g(this,`_producerScreen`,null),g(this,`_consumerScreen`,null),g(this,`_asr`,null),g(this,`_animojiDataChannel`,null),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),g(this,`_isOpen`,!1),g(this,`_observer`,!1),g(this,`_reconnectionPrevented`,!1),g(this,`_statInterval`,null),g(this,`_settingsInterval`,null),g(this,`_monitorRtpShareInterval`,null),g(this,`_statBytes`,{}),g(this,`_ssrcMap`,{}),g(this,`_ssrcMapUpdated`,!1),g(this,`_perfStatReporter`,void 0),g(this,`_producerOfferIsProcessing`,!1),g(this,`_producerNextOffer`,null),g(this,`_producerNextSessionId`,null),g(this,`_lastStat`,null),g(this,`_serverSettings`,void 0),g(this,`_prevConsumerSettings`,{}),g(this,`_prevConsumerFastSharingSettings`,{}),g(this,`_asrTrack`,null),g(this,`_captureSender`,null),g(this,`_captureReceiver`,null),g(this,`_participantIdRegistry`,null),g(this,`_disabledSenders`,new Set),g(this,`_rtpReceiversByStreamId`,{}),g(this,`_producerSessionId`,``),g(this,`_newAudioShareTrack`,null),g(this,`_simulcastInfo`,null),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`_statAggregator`,void 0),g(this,`_codecStatsAggregator`,void 0),this._debug=r,this._logger=i,this._statAggregator=a,this._codecStatsAggregator=o,this.subscribe(this._signaling,pr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=n,this._debug.debug(`ServerTransport: Created`)}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!==J.IDLE&&e!==J.CLOSED&&e!==J.FAILED&&this._startStatInterval()}open(e=!1){if(this._isOpen){this._debug.log(`ServerTransport: Already opened connections`);return}this._isOpen=!0,this._observer=e,this._openConnection()}close(e){this._isOpen&&(this._isOpen=!1,this._closeConnection(),this.unsubscribe(),e?(this._debug.error(`ServerTransport: Closed`,e),this._setState(J.FAILED)):(this._debug.debug(`ServerTransport: Closed`),this._setState(J.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){Xr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(P.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,this._participantIdRegistry&&e.setParticipantIdRegistry(this._participantIdRegistry),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}async onCameraResolutionChanged(){P.simulcast&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new wi(this,this._signaling,this._statAggregator,!1,this._debug)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcastInfo=null,this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,e._closeDataChannel(this._producerNotification),e._closeDataChannel(this._producerCommand),e._closeDataChannel(this._producerScreen),e._closeDataChannel(this._consumerScreen),e._closeDataChannel(this._asr),e._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent(Z.PEER_CONNECTION_CLOSED)}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,n){this._debug.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{ordered:!0});r.onopen=()=>{let e=r.readyState;e===`open`?(this._debug.debug(`[${t}] data channel opened`),n(r)):this._debug.error(`[${t}] data channel open failed, state [${e}]`)},r.onerror=e=>{let n=e.error;this._debug.error(`[${t}] data channel error`,n?.errorDetail,n?.message)}}_openConnection(e=!1){this._debug.debug(`ServerTransport: Open single connection`);try{this._pc=new RTCPeerConnection}catch(e){this._debug.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=N.debounce(e=>{this._pc&&this._onConnectionStateChange(this._pc,e)},500),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Wi(this._debug),this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,yi.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,yi.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,yi.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),P.asrDataChannel&&this._createDataChannel(this._pc,yi.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new Ui(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)},this._debug)}),P.vmoji&&this._createDataChannel(this._pc,yi.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(e),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(e),this._animojiSender?.setProtocolVersion(P.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(e){this._debug.error(`ServerTransport: Unable to add media source tracks`,e),this._logger?.log(E.ERROR,`addTrack-single`),this.close(e);return}this._createDataChannel(this._pc,yi.consumerScreenShare,e=>{this._consumerScreen=e,this._consumerScreen.binaryType=`arraybuffer`;let t=this._mediaSource.getScreenTrack();t&&(!P.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(t)}),e||this._allocateConsumer(),this._setState(J.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==J.OPENED&&(this._setState(J.RECONNECTING),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent(Z.SIGNALLED_ACTIVE_PARTICIPANTS,e)}_signalStalledParticipants(e){this._triggerEvent(Z.SIGNALLED_STALLED_PARTICIPANTS,e)}_signalSpeakerChanged(e){this._triggerEvent(Z.SIGNALLED_SPEAKER_CHANGED,e)}_signalNetworkStatus(e){this._triggerEvent(Z.NETWORK_STATUS,e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
15
|
+
`).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Br.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Br.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Za(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled,this._debug,this._logger))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Ca(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent(Z.REMOTE_STREAM_SECOND,e,t)},e=>{this._triggerEvent(Z.REMOTE_STREAM_SECOND,e,null)},e=>{this._triggerEvent(Z.SCREEN_SHARING_STAT,e)},this._statAggregator,this._debug,this._logger))}_removeCaptureReceiver(){this._captureReceiver?.destroy(),this._captureReceiver=null}_applyConsumerSettings(){let e=this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{if(!n.track||n.track.kind!==j.video||n.track.contentHint===`motion`)return;let r=!this._disabledSenders.has(n),i=e.maxDimension!==0;if(r&&!i){this._debug.log(`Disabling video upload`),this._disabledSenders.add(n),n.replaceTrack(k.getBlackMediaTrack()).catch(e=>{this._debug.error(`Could not disable video upload`,e)});return}let a=this._mediaSource.getSendVideoTrack();if(!r&&i&&a){this._debug.log(`Enabling video upload`),this._disabledSenders.delete(n);let e=n.track;e.enabled=a.enabled,n.replaceTrack(a).then(()=>e.stop()).catch(e=>{this._debug.error(`Could not enable video upload`,e)})}N.applyVideoTrackSettings(e,n,a??n.track,this._prevConsumerSettings,t,this._debug)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&P.consumerFastScreenShare){let e=this._serverSettings.fastScreenSharing;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{!n.track||n.track.kind!==j.video||n.track.contentHint!==`motion`||N.applyVideoTrackSettings(e,n,n.track,this._prevConsumerFastSharingSettings,t,this._debug)}),this._prevConsumerFastSharingSettings=t}}}_onScreenSharingStatus(e){e.track?(!P.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent(Z.STATE_CHANGED,e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(e=>{this._reportStats(e),this._detectStaleTracks(e),this._codecStatsAggregator?.reportUsage(e)}).catch(()=>{}),this._statInterval=window.setTimeout(e,P.statisticsInterval)};this._statInterval=window.setTimeout(e,P.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await W.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent(Z.REMOTE_DATA_STATS,{inbound:{topology:Y.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`inbound-rtp`)},outbound:{topology:Y.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:Y.SERVER,transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(e=>e.type===`inbound-rtp`&&e.kind===`audio`&&this._ssrcMap[e.ssrc]===`mix`);if(!t)return;let n=Br.AUDIO_MIX,r=this._statBytes[n],i=!1;if(r){let e=t.bytesReceived-r.bytesReceived;e>=0&&e<=5&&(i=!0),r.stalled!==i&&this._triggerEvent(Z.AUDIO_MIX_STALL,i)}this._statBytes[n]={bytesReceived:t.bytesReceived,stalled:i}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:wi.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:+!!P.asrDataChannel,animojiDataChannelVersion:P.vmoji?P.vmojiOptions.protocolVersion:1,animojiBackendRender:!P.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:P.videoTracksCount,red:!0,audioShare:P.audioShare,fastScreenShare:P.fastScreenShare,videoSuspend:P.videoSuspend,simulcast:P.simulcast,consumerFastScreenShare:P.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:P.consumerFastScreenShareQualityOnDemand,transparentAudio:P.transparentAudio};!P.videoTracksCount&&!this._observer&&this._debug.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e)}async _processOffer(e,t){if(!this._pc)throw Error(`Interrupt allocation`);let n=P.simulcast;try{await this._pc.setRemoteDescription(e)}catch(e){throw this._debug.error(`[single] unable to set remote offer`,e),this._logger?.log(E.ERROR,`setRemoteDescription-single`),e}let r=this._findFirstSimTransceiver();if(P.simulcast)if(r){this._debug.log(`_processOffer: caps.simulcast=${P.simulcast} mid=${r.mid} dir=${r.direction}`);let e=this._mediaSource.getStream(),t=await this._setupSimulcastTransceiver(e,r);this._debug.log(`_processOffer: simulcastInfo`,t),t||(this._debug.log(`_processOffer: simulcast transceiver not found in server offer mid=${r.mid}, disable simulcast`),n=!1)}else this._debug.log(`_processOffer: simulcast transceiver not found in server offer, disable simulcast`),n=!1;let i;try{if(await this._handleTracks(),this._debug.debug(`[single] create local answer`),!this._pc)throw Error(`Interrupt allocation`);i=await this._pc.createAnswer()}catch(e){throw this._debug.error(`[single] unable to create answer`,e),this._logger?.log(E.ERROR,`createAnswer-single`),e}try{if(!this._pc)throw Error(`Interrupt allocation`);i.sdp=N.patchLocalSDP(i.sdp,!1,k.isBrokenH264Decoder(),!1),this._debug.debug(`[single] set local answer`,{answer:i}),await this._pc.setLocalDescription(i)}catch(e){throw this._debug.error(`[single] unable to set local answer`,e),this._logger?.log(E.ERROR,`setLocalDescription-single`),e}if(n&&r){i.sdp=N.patchSimulcastAnswerSdp(i.sdp,r,Zt.WIDTH,Zt.HEIGHT);for(let e of this._pc.getTransceivers())e.mid===null&&e.stop()}try{this._debug.debug(`[single] transmit local answer`,{answer:i}),this._updateSSRCMap(e),await this._signaling.acceptProducer(i,Object.keys(this._ssrcMap),t),this._debug.debug(`[single] remote offer has been processed`)}catch(e){this._debug.warn(`[single] unable to send local answer`,e),this._logger?.log(E.ERROR,`acceptProducer`)}n&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!==j.video)continue;let n=e.sender.getParameters();if(!(!n.encodings||n.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction=`sendonly`;let n=e.getVideoTracks()[0];await t.sender.replaceTrack(n),t.sender.setStreams(e);let r=t.sender.getParameters();if(!r.encodings||r.encodings.length<=1)return this._debug.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(r.encodings)}`),null;let i=rn(Zt.WIDTH,Zt.HEIGHT,this._serverSettings.camera?.bitrates?.generic),a=0,o=1;for(let e of r.encodings)e.scalabilityMode=Qt,e.active=!0,a>=i.streams.length?e.maxBitrate=0:e.maxBitrate=i.streams[a].bitrate,e.scaleResolutionDownBy=o,o*=2,a++;await t.sender.setParameters(r);let s=n.getSettings();return this._debug.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${s.width}x${s.height} encodings=${JSON.stringify(r.encodings)}`),!0}async _acceptProducer(e,t){if(this._producerOfferIsProcessing){this._producerNextOffer=e,this._producerNextSessionId=t,this._debug.debug(`[single] wait until other remote offer is processed`);return}this._producerOfferIsProcessing=!0;let n={type:`offer`,sdp:N.patchRemoteSDP(e,k.isOldDataChannelDescription(),!1,!1,!1,k.isBrokenVP9Encoder(),k.isBrokenVP9Decoder())};if(this._debug.debug(`[single] set remote offer`,{offer:n}),!this._pc)throw Error(`Interrupt allocation`);try{if(await this._processOffer(n,t),this._producerOfferIsProcessing=!1,this._producerNextOffer&&this._producerNextSessionId){this._debug.debug(`[single] there is other unprocessed remote offer, process it`);let e=this._producerNextOffer,t=this._producerNextSessionId;this._producerNextOffer=null,this._producerNextSessionId=null,await this._acceptProducer(e,t)}}catch(e){this.close(e)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===j.video);if(!e||!e.sender){this._debug.warn(`Cannot find screenshare transceiver`);return}try{e.direction=`sendonly`,await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===j.audio);if(!e||!e.sender){this._debug.warn(`Cannot find audioshare transceiver`);return}e.sender.track!==null&&this._debug.warn(`Unexpected track assigned to audioshare`);try{e.direction=`sendonly`,await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(e){this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(E.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case G.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case G.REALLOC_CON:this._reconnect();break;case G.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case G.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case G.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case G.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent(Z.ASR_TRANSCRIPTION,e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),P.breakVideoPayloadTypes&&(this._debug.log(`test mode enabled, video switched off`),this._signaling.requestTestMode(`breakVideoPayloadTypes`,null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description,e.sessionId)}_onAddTrack(e,t){this._debug.debug(`[single] remote track (added)`,{track:t.track});let n=t.streams[0];n?(n.onremovetrack||(n.onremovetrack=e=>{this._triggerEvent(Z.REMOTE_TRACK_REMOVED,n.id,n,e.track)}),n.getTracks().find(e=>e.id===t.track.id)||n.addTrack(t.track),this._rtpReceiversByStreamId[n.id]=t.receiver,this._triggerEvent(Z.REMOTE_TRACK_ADDED,n.id,n,t.track)):this._debug.error(`[single] unable to get media stream from track event`)}_onSignalingStateChange(e,t){this._debug.debug(`[single] signaling state changed`,{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(this._debug.debug(`[single] connection state changed`,{state:e.connectionState},t),this._logger?.log(E.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect();break;case`connecting`:let t=this.getState();t===J.IDLE||t===J.OPENED?this._setState(J.CONNECTING):e.iceConnectionState===`checking`&&this._setState(J.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(J.RECONNECTING);break;case`connected`:this._setState(J.CONNECTED),N.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(this._logger?.log(E.ICE_CONNECTION_TYPE,e.local.type),this._debug.debug(`Selected ICE candidates`,e))});break}}_onReplacedTrack(e,t){if(this._pc){this._debug.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let n=(e,t)=>{e.replaceTrack(t).catch(e=>{this._debug.error(`ServerTransport: Unable to replace track`,e),this._logger?.log(E.ERROR,`replaceTrack-single`)})};if(this._debug.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),P.simulcast&&e.kind===j.video){let t=this._pc?.getTransceivers().find(t=>t.direction===`sendonly`&&t.sender?.track?.kind===j.video&&t.sender.track.contentHint===e.contentHint)?.sender;t?.track?(n(t,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):this._debug.warn(`_onReplacedTrack: simulcast video transceiver not found`)}else{let t=this._pc?.getSenders().find(t=>t.track&&t.track.kind===e.kind&&!this._disabledSenders.has(t)&&t.track.contentHint===e.contentHint);t?.track?n(t,e):e.kind===j.audio&&e.contentHint===`music`&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e===j.screen&&P.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return this._logger?.log(E.PAT_WAITING_TIME_ERROR,`noConnection`),this._debug.error(`Cannot get stream waiting time, peer connection is not initialized`),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return this._logger?.log(E.PAT_WAITING_TIME_ERROR,`oldBrowser`),this._debug.error(`Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported`),0;let n=this._rtpReceiversByStreamId[e];if(!n)return this._logger?.log(E.PAT_WAITING_TIME_ERROR,`noReceiver`),this._debug.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let r=n.getSynchronizationSources();if(!r||!r.length)return this._debug.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let i=r[0].rtpTimestamp;if(!Number.isInteger(i))return this._logger?.log(E.PAT_WAITING_TIME_ERROR,`timestampNotInteger`),this._debug.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${i}`),0;let a=t-i&$a,o=Math.ceil(a/Qa);return Math.min(100,Math.max(0,o))}async _changeSimulcastInfo(e,t){let n=this._mediaSource.getMediaSettings().isVideoEnabled,r=this._findFirstSimTransceiver();if(!P.simulcast||!n||!r||!r.sender)return;let i=this._mediaSource.getStream();if(!i)return;let a=i.getVideoTracks()[0],o=a.getSettings().width,s=a.getSettings().height,c=rn(o,s,this._serverSettings.camera?.bitrates?.generic),l=t||!tn(this._simulcastInfo,c);if(!c.streams.length||!l)return;let u=r.sender.getParameters();if(u.encodings||(u.encodings=[{}]),!(u.encodings.length<=1)){if(this._debug.log(`_changeSimulcastInfo: ${o}x${s} command: ${JSON.stringify(c)} `),e){let e=0;for(let t of u.encodings)t.scaleResolutionDownBy=an(t.rid),t.scalabilityMode=Qt,e>=c.streams.length?(t.maxBitrate=0,t.active=!1):(t.active=!0,t.maxBitrate=c.streams[e].bitrate),e++;await r.sender.setParameters?.(u).catch(e=>{this._debug.error(`Failed to set sender parameters`,u,e)}),this._debug.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(u.encodings)} `)}if(this._simulcastInfo=c,c.streams){let e={mediaSource:Yt.CAMERA,simulcastInfo:c};await this._signaling.changeSimulcast(e)}}}async _monitorRtpShare(){let e=mi.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!P.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(e=>e.track?.kind===j.video&&e.track?.contentHint===`motion`);t&&(await t.getStats()).forEach(e=>{if(e.type===`outbound-rtp`&&this._serverSettings.fastScreenSharing&&e.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&e.frameWidth<window.screen.width){let n=t.getParameters();n.degradationPreference=`maintain-resolution`,t.setParameters(n),this._debug.log(`
|
|
13
16
|
degradationPreference updated for fast share RTP Sender
|
|
14
|
-
Actual senderStats: ${JSON.stringify(
|
|
17
|
+
Actual senderStats: ${JSON.stringify(e)}
|
|
15
18
|
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 Fe=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(Fe||{}),Dr=class extends de{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,Me.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===U.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(d.log(`Topology changed ${this._topology} -> ${e.topology}`),y.log(k.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 l=s===c;this._directTransport=this._createDirectTransport(c,l)}this._opened.indexOf(c)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new Di(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"?(y.log(k.PAT_WAITING_TIME_ERROR,"wrongTopology"),d.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(y.log(k.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var Ue=class Ue{constructor(){o(this,"trackerByTransport",{ws:new dt,wt:new dt});o(this,"lastSeen",{})}static create(){Ue._instance||(Ue._instance=new Ue)}static mark(r){if(!Ue._instance)return;let e=Date.now(),t=Ue._instance.lastSeen[r];if(typeof t=="number"){let i=e-t;i>=0&&Ue._instance.trackerByTransport[r].add(i)}Ue._instance.lastSeen[r]=e}static logMetrics(r){Ue._instance&&["ws","wt"].forEach(e=>{if(!Ue._instance.trackerByTransport[e].hasData)return;let t=Ue._instance.trackerByTransport[e].snapshot();y.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:Q.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(){Ue._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new dt,wt:new dt},this.lastSeen={}}};o(Ue,"_instance");var mt=Ue;var Ve=class Ve{constructor(){o(this,"trackerByCommand",new Map)}static create(){Ve._instance||(Ve._instance=new Ve)}static mark(r,e,t){if(!Ve._instance)return;let i=`${r}|${t}`,a;Ve._instance.trackerByCommand.has(i)?a=Ve._instance.trackerByCommand.get(i):(a=new dt,Ve._instance.trackerByCommand.set(i,a)),a.add(e)}static logMetrics(r){if(Ve._instance)for(let[e,t]of Ve._instance.trackerByCommand.entries()){if(!t.hasData)continue;let[i,a]=e.split("|"),s=t.snapshot();y.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:Q.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(){Ve._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};o(Ve,"_instance");var ht=Ve;var $n=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))($n||{}),Ke=$n;var qn={producerScreenTrack:()=>!0,videoTracksCount:()=>p.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>p.movieShare,useParticipantListChunk:()=>p.useParticipantListChunk,useRooms:()=>p.useRooms,vmoji:()=>!!p.vmoji,useCallsToContacts:()=>p.useCallsToContacts,useChatRooms:()=>p.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!p.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>p.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>p.waitForAdminInGroupCalls,hold:()=>p.hold},Xe=class{static getFlags(){let r=Object.values(qn),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(qn).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};var $e=_i(require("fflate"));var mc=63n,hc=16383n;var gc=4611686018427387903n,wr=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=mc)return new Uint8Array([Number(e)]);if(e<=hc)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<=gc)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")}},kr=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 Or=class{constructor(r){o(this,"encoder");o(this,"compression");o(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new wr,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 $e.gzipSync(r);case"deflate":return $e.zlibSync(r);case"deflate-raw":return $e.deflateSync(r);default:return r}}},xr=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 kr,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 $e.gunzipSync(r);case"deflate":return $e.unzlibSync(r);case"deflate-raw":return $e.inflateSync(r);default:return r}}};var ni=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 Or(this.compression),this.decoder=new xr(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"?D.browserName()==="Firefox"?p.webtransportFF:D.browserName()!=="Safari":!1}};var zn="open",Jn=10,_c=["service-unavailable","conversation-ended","invalid-token"],jt=class n extends fi{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="+Xe.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 Sr)}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){y.log(k.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===zn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){y.log(k.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&&(y.log(k.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,l)=>{let u=(P,R=!1)=>{!a||R?l(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:u};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},!0,Jn)}async acceptCall(e){return this._send(x.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(x.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Jn)}async changeParticipantState(e,t){let i={participantState:{state:e}};return t&&(i.participantId=t),this._sendRaw(x.CHANGE_PARTICIPANT_STATE,i)}async hold(e){return this._send(x.HOLD,{hold:e})}async putHandsDown(){return this._send(x.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(x.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(x.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(x.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let i={capabilities:t};return e&&(i.description=e.sdp),this._send(x.ALLOCATE_CONSUMER,i)}async acceptProducer(e,t,i){let a={description:e.sdp,sessionId:i};return t&&(a.ssrcs=t),this._send(x.ACCEPT_PRODUCER,a)}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===Ke.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 ni(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===Ke.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 l=p.participantListChunkInitCount;return l!==null&&(s+=`&partCount=${l}`),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"),y.log(k.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Ke.RETRY?"reconnected":"connected")}_onMessage(e){if(this._startDoctor(),e.data==="ping"){mt.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){y.log(k.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(Me.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Me.NOTIFICATION,{type:"notification",notification:U.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===U.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(Me.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:y.log(k.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){y.log(k.SOCKET_ACTION,`error-${e.error}`);let t=e.error?_c.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(A.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Me.NOTIFICATION,{notification:U.CLOSED_CONVERSATION,reason:A.SERVICE_UNAVAILABLE});break;case"conversation-ended":this.conversationReject?this.conversationReject(new B(e.reason||oe.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(Me.NOTIFICATION,{notification:U.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||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(Me.FAILED,e)}_onError(e){y.log(k.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){if(y.log(k.SOCKET_ACTION,"closed"),d.debug("[signaling] connection closed",{code:e.code,reason:e.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this._abortSignal?.aborted){d.debug("[signaling] aborted reconnect"),this._closeSocket(new B(A.CANCELED));return}this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new B(A.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})`),y.log(k.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Ke.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&&ht.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],y.log(k.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],y.log(k.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!==zn){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]=fn(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new B(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(Ke.RETRY,!1),this.reconnectCount++},n.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return ni.isBrowserSupported()&&this.wtEndpoint!==null&&p.webtransport}_getSocketType(){return this.socket instanceof ni?"wt":"ws"}_markTransportStat(e){let t=this._getSocketType(),i=Ea[e][t];pe.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=Ea[e][i];Ae.logEventualStat({name:a,...t})}};var Yn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(Yn||{}),Oe=Yn;var Qn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(Qn||{}),st=Qn;var Xn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(Xn||{}),Nr=Xn;var Zn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(Zn||{}),Lr=Zn;var es=(l=>(l.REQUIRE_AUTH_TO_JOIN="REQUIRE_AUTH_TO_JOIN",l.AUDIENCE_MODE="AUDIENCE_MODE",l.WAITING_HALL="WAITING_HALL",l.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",l.ADMIN_IS_HERE="ADMIN_IS_HERE",l.ASR="ASR",l.FEEDBACK="FEEDBACK",l.RECURRING="RECURRING",l))(es||{}),Ze=es;function ts(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function is(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 rs=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(rs||{}),je=rs;var as=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(as||{}),X=as;var ns=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(ns||{}),si=ns;var ss=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(ss||{}),os=ss;function cs(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var ds=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(ds||{}),gt=ds;function Fi(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var Ur=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Ur||{}),Y;(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,R=h.deviceIdx??0;if(P)return t(P,R)}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 l(h,E){return h.id===E.id&&h.type===E.type&&h.deviceIdx===E.deviceIdx}m.compare=l;function u(h){return h?.deviceIdx||0}m.getDeviceIdx=u})(Y||(Y={}));function ls(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function ps(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var Br=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function us(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 fc(n,r){switch(n){case ce.AUDIO:return!!r.isAudioEnabled;case ce.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case ce.VIDEO:return!!r.isVideoEnabled;case ce.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function ms(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case je.MUTE:case je.MUTE_PERMANENT:{fc(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function hs(n){let{muteStates:r={},mediaSettings:e}=n;return ms(r,e)}function gs(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return ms(r,t)}function _s(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 l=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 u=i-l;for(let m=0;m<c&&!(i>=r);m++)e[i++]=e[u+m]}return e}var oi=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,y.log(k.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,y.log(k.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(D.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"),y.log(k.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),y.log(k.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,y.log(k.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.mediaSettings.isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(t=>{d.warn("[AudioFix] Failed to fix RV (no packets): video restart",t)}))}};var Fr=class{constructor(){o(this,"_conversations",new Map);o(this,"_activeId",null)}add(r){this._conversations.set(r.id,r)}remove(r){r&&this._conversations.delete(r),this._activeId===r&&(this._activeId=null)}get(r){return this._conversations.get(r)}getActive(){return this._activeId?this._conversations.get(this._activeId)??null:null}getActiveId(){return this._activeId}has(r){return this._conversations.has(r)}getAll(){return Array.from(this._conversations.values())}async setActive(r){if(this._activeId===r||!this._conversations.has(r))return;let e=this.getActive();e&&await e.hold(!0),this._activeId=r;let t=this._conversations.get(r);t&&t?.isCallHeld&&await t.hold(!1)}clear(){this._conversations.clear(),this._activeId=null}};var Vi=class{constructor(r,e=!1){o(this,"_audioElement",null);o(this,"_audioTracks",new Map);o(this,"_allowMultipleTracks");o(this,"_volume",1);o(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});o(this,"_statFirstMediaReceived");this._statFirstMediaReceived=r,this._allowMultipleTracks=e}add(r,e){this._allowMultipleTracks||this._clearTracks();let t=this._audioTracks.get(r);t&&t!==e&&(this._removeTrackFromAudioElement(t),t.stop()),this._audioTracks.set(r,e),this._audioElement?this._addTrackToAudioElement(e):this._initAudioElement()}remove(r,e){let t=this._audioTracks.get(r);if(!t){e.stop();return}if(t!==e){e.stop();return}if(!this._allowMultipleTracks){this.destroy();return}this._removeTrackFromAudioElement(e),e.stop(),this._audioTracks.delete(r),this._audioTracks.size||this.destroy()}get volume(){return this._volume}set volume(r){this._volume=Math.max(0,Math.min(1,r)),this._audioElement&&(this._audioElement.volume=this._volume)}destroy(){!this._audioElement&&!this._audioTracks.size||(this._stopAudioElement(),this._audioElement=null,this._audioTracks.clear())}async changeOutput(){try{if(!this._features.setSinkId)throw new Error('Feature "setSinkId" is not supported');if(!this._audioElement)return;let r=D.getSavedOutput();r&&await this._audioElement.setSinkId?.(r.deviceId)}catch(r){throw y.log(k.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(p.muteMode)return;let r=this._getTracks();if(!r.length)return;let e=D.browserName()!=="Safari"||D.isMobile(),t=document.createElement(e?"audio":"video");t.muted=!1,t.volume=this._volume,t.preload="auto";let i=()=>{d.warn("[audio] Error on play audio"),v.onAutoplayError()},a=c=>{d.debug("[audio] Play audio"),t.srcObject=null,t.srcObject=new MediaStream(c),t.load();let l=t.play();l&&l.catch(i)},s=()=>{d.debug("[audio] Recover audio playback");let c=this._getTracks();c.length?a(c):d.warn("[audio] Broken audio tracks")};t.onpause=s,t.onstalled=s,t.onerror=s,t.onloadeddata=()=>{this._statFirstMediaReceived.measure()},a(r),this._audioElement=t}_stopAudioElement(){this._audioElement&&(this._audioElement.pause(),this._audioElement.srcObject=null);for(let r of this._audioTracks.values())r.stop()}_addTrackToAudioElement(r){if(!this._audioElement)return;d.debug(`[audio] Adding track ${r}`);let e=this._audioElement.srcObject;e||(e=new MediaStream,this._audioElement.srcObject=e),e.addTrack(r)}_removeTrackFromAudioElement(r){this._audioElement?.srcObject&&(d.debug(`[audio] Removing track ${r}`),this._audioElement.srcObject.removeTrack(r))}_clearTracks(){for(let r of this._audioTracks.values())this._removeTrackFromAudioElement(r),r.stop();this._audioTracks.clear()}};var Sc=90,vc=3,ji=class extends de{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>Sc?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=vc)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var Ic=44100,Ct=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=D.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=Ic/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 Hi=class extends de{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.mediaSettings.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.mediaSettings.isAudioEnabled&&i()}),this.subscribe(e,"SOURCE_READY",i),i()}init(e){this._stopDetector(),this._detector=new Ct("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 Vr=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 jr=class extends de{constructor(e){super();o(this,"_detectors",new Map);o(this,"_interval",null);o(this,"_activeParticipants");o(this,"_removedParticipants");o(this,"_topology");this._topology=e.getTopology(),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._destroyDetectors()}_onRemoteTrackAdded(e,t,i){if(i.kind==="audio"&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new Ct(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){if(i.kind!=="audio")return;let a=this._detectors.get(e);!a||a.track!==i||(a.destroy(),this._detectors.delete(e))}_collectVolumes(){if(!this._detectors.size)return;let e={};if(this._topology==="SERVER"){if(this._activeParticipants)for(let t of this._activeParticipants){let i=this._getAudioTrackLevelByParticipantId(t);i&&(e[t]=i)}if(this._removedParticipants){for(let t of this._removedParticipants)e[t]={real:0,smoothed:0};this._removedParticipants=null}}else for(let[t,i]of this._detectors.entries())e[t]=i.getLevel();this._triggerEvent("VOLUMES_DETECTED",e)}_getAudioTrackLevelByParticipantId(e){if(this._isTransparentAudioMode())return this._getTransparentAudioLevelByParticipantId(e);let t=this._detectors.get(Le.AUDIO_MIX);return t?t.getLevel():null}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((i,a)=>{if(!a.startsWith(`${Le.TRANSPARENT_AUDIO_TRACK_PREFIX}-`))return;let s=i.getLevel();(!t||s.real>t.real)&&(t=s)}),t}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){this._topology=e,this._destroyDetectors(),e==="DIRECT"&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology==="SERVER"&&p.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}};var Hr=class extends de{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 Gi=class extends de{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"),y.log(k.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"),y.log(k.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),y.log(k.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var Gr=class n{static correctHangupReason(r){switch(r){case A.HUNGUP:return"hangup";case A.CANCELED:return"canceled";case A.REJECTED:return"rejected";case A.BUSY:return"busy";case A.FAILED:return"failed";case A.MISSED:return"missed";case A.ANOTHER_DEVICE:return"another_device";case A.REMOVED:return"removed";case A.BANNED:return"banned";case A.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![A.HUNGUP,A.CANCELED,A.REJECTED,A.FAILED,A.BUSY,A.MISSED,A.ANOTHER_DEVICE,A.REMOVED,A.BANNED,A.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;y.logClientStats({name:Q.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Wr=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(Q.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Ae.logEventualStat({name:Q.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var Ec=1e3,Tc=1e4;var Rc=15,G=class extends de{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",X.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",kn());o(this,"_delayedHangup",!1);o(this,"_abortController",null);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));y.create(e,t),y.setConversationIdProvider(()=>this._conversation?.id||null),Ae.create(),nt.create(()=>this._transport?.getTopology()),mt.create(),ht.create(),this._api=e,this._signaling=new jt,this._signalingActor=new Vr(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?A.CANCELED:A.HUNGUP),p.clientEventsLoggingEnabled&&y.logClientEvent({event_type:Q.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),y.destroy(),Ae.destroy(),nt.destroy(),mt.destroy(),ht.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new Wr,this._audioOutput=new Vi(this._statFirstMediaReceived,p.transparentAudio),p.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),Ec))}static current(){return Ie.getActive()}static hangupAfterInit(){let e=qe;e&&e._delayedHangup===!1&&!e._conversation&&(e._delayedHangup=!0,e._abortController?.abort(new B(A.CANCELED)))}static id(){return Ie.getActiveId()}get id(){return this._conversation?.id??""}get externalId(){return this._conversation?.externalId}get mediaSettings(){return this._mediaSource?.mediaSettings}get isCallHeld(){return this._state==="HELD"}async onStart({opponentIds:e,opponentType:t,mediaOptions:i,payload:a="",joiningAllowed:s=!1,requireAuthToJoin:c=!1,onlyAdminCanShareMovie:l,externalIds:u,onFastStart:m,conversationId:h}){let E=Date.now();qe=this,Ne.startSession(),this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let P=this._mediaSource.mediaSettings;t===st.CHAT||e&&e.length>1?this._logWithMediaSettings(k.OUTGOING_MULTIPARTY_CALL,P):this._logWithMediaSettings(k.OUTGOING_CALL,P);let R=await this._startConversation({opponentIds:e,opponentType:t,direction:Oe.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:c,onlyAdminCanShareMovie:l,externalIds:u,startedTime:E,onFastStart:m,conversationId:h});if(!this._conversation)throw new B(A.UNKNOWN_ERROR);if(this._participantState=X.ACCEPTED,this._changeMediaSettings(P),await this._processConnection(R),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._delayedHangup)throw new B(A.CANCELED);return d.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:i}),await this._processConnectionSharedMovieInfo(R),await this._processConversationUrlSharingInfo(R),v.onLocalStream(this._mediaSource.getStream(),this._mediaSource.mediaSettings,this.id),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),void 0,this.id),await this._onConversationParticipantListChunk(R),await this._processPinnedParticipants(R),v.onLocalStatus("WAITING",this.id),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),Ie.add(this),await Ie.setActive(this.id),qe=null,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(P){throw qe=null,this._close(P,"Unable to start conversation"),P}}async onJoin(e){let t=Date.now();qe=this,this._state="PROCESSING",Ne.startSession(),this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let i=!!e.observedIds?.length;if(i&&p.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new B(A.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.mediaSettings;this._logWithMediaSettings(k.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new B(A.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a,this.id),this._conversation.waitForAdmin||this._conversation.waitingHall?(d.log(this._conversation.waitForAdmin?"Wait for admin":"In waiting hall"),Ie.add(this),qe=null,this._signaling.readyToSend(),v.onLocalStatus(this._conversation.waitForAdmin?"WAIT_FOR_ADMIN":"WAITING_HALL",this.id),this._conversation):this._onJoinPart2(s)}catch(i){throw qe=null,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){d.debug("Join conversation part 2");try{if(this._participantState=X.ACCEPTED,!this._conversation||!this._mediaSource)throw new B(A.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.mediaSettings),await this._processConnection(e),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state==="CLOSE")return this._conversation;if(this._delayedHangup)throw new B(A.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,this.id),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),v.onLocalStatus("WAITING",this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),Ie.has(this.id)||Ie.add(this),Ie.setActive(this.id),qe=null;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 qe=null,this._close(t,"Unable to join conversation"),t}}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=ae.USER,i,a,s){qe=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let c=Date.now(),l=await this._prepareConversation(e,t,i,a,s);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new B(A.UNKNOWN_ERROR);if(!l.conversation.participants.find(m=>m.state===X.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),y.log(k.PUSH,"rejected"),new B(A.REJECTED);if(Ne.startSession(),await this._processConnection(l),this._extractConnectionUrlSharingInfo(l),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(l),this._signaling.readyToSend(),this._logCallStartEvent(c,Oe.INCOMING),y.log(k.PUSH,"accepted"),Ie.add(this),await Ie.setActive(this.id),qe=null,this._delayedHangup)throw new B(A.CANCELED)}catch(c){throw qe=null,this._close(c,"Unable to handle inbound call push"),c}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(Ze.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(Ze.WAIT_FOR_ADMIN),i=e.conversation.options.includes(Ze.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(Ze.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new B(A.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.mediaSettings;this._logWithMediaSettings(k.ACCEPT_CONCURRENT,e),d.debug("Concurrent call",{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.mediaSettings),v.onCallAccepted(this.id),this._state="ACTIVE",this._participantState=X.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 l=0;l<s.length;l++)c[l]=s.charCodeAt(l);try{let u=_s(c,a).reduce((Re,we)=>(Re+=String.fromCharCode(we),Re),""),{srcp:m,stne:h,tkn:E,trne:P,trnp:R,trnu:W,wse:$,wte:z}=JSON.parse(u);return{token:E,endpoint:$,wt_endpoint:z,turn_server:{urls:P.split(","),username:W,credential:R},stun_server:{urls:h.split(",")},client_type:m}}catch(l){throw this._close(l,"Can't decompress conversation params"),l}}_logCallStartEvent(e,t){let i={[Oe.OUTGOING]:"outgoing",[Oe.INCOMING]:"incoming",[Oe.JOINING]:"join"};Ae.logEventualStat({name:Q.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw y.log(k.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(A.UNKNOWN_ERROR);this._state="PROCESSING",d.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.mediaSettings;this._logWithMediaSettings(k.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=X.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 l=await this._getParticipants();s.rooms.rooms.forEach(u=>{u.participantIds?.forEach(m=>{l[m]&&(l[m].isInRoom=!0)})})}this._conversation.roomId=s.rooms?.roomId||null;let c=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(v.onCallAccepted(this.id),v.onLocalStream(this._mediaSource.getStream(),t,this.id),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),c,this.id),p.useParticipantListChunk){let l=await this._getInitialParticiapntListChunk(),u=await this._getParticipants();l?.participants?.forEach(m=>{let h=I.composeId(m),E=u[h];E&&(E.movieShareInfos=m.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:l})}return v.onLocalStatus("WAITING",this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0),await this._processConversationUrlSharingInfo(),await this._processConnectionAsrInfo(),this._conversation}catch(t){throw this._close(t,"Unable to accept call"),t}}async decline(){if(this._state!=="IDLE")throw y.log(k.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(k.DECLINE_INCOMING,this.mediaSettings),this._participantState=X.HUNGUP,this._signaling.ready&&await this._signaling.hangup(A.REJECTED),this._close(new B(A.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?A.HUNGUP:A.CANCELED;y.log(k.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new B(e))):v.onHangup(new B(A.HUNGUP),this._conversation&&this._conversation.id),this._conversation?.id&&Ie.has(this._conversation.id)&&Ie.remove(this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new B(A.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map(Y.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=A.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(A.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=A.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===X.CALLED||a.state===X.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===X.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),Gr.sendHangupEvent(e,this._transport?.getTopology()),nt.destroy(),mt.logMetrics(this._transport?.getTopology()),mt.destroy(),ht.logMetrics(this._transport?.getTopology()),ht.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(A.FAILED):y.log(k.ERROR,e.hangup);let i=this._conversation&&this._conversation.id;if([A.CANCELED,A.NOT_FRIENDS,A.CALLEE_IS_OFFLINE,A.CALLER_IS_BLOCKED,A.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===A.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===A.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===A.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===A.SOCKET_CLOSED||e.hangup===A.NOT_FOUND)&&Ie.getActive()&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===A.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state="CLOSE",this._participantState=X.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),y.destroy(),Ae.destroy(),Ie.remove(this.id),this._conversation=null,this._myLastRequestedLayouts={},this._delayedHangup=!1,this._abortController=null,v.onHangup(e||new B(A.UNKNOWN_ERROR),i)}async destroy(){let e=this._conversation&&this._conversation.id;if(d.debug("Destroy conversation",{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state="CLOSE",this._participantState=X.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),this._delayedHangup&&e)try{this._api.hangupConversation(e,A.CANCELED)}catch{}this._cleanupListeners(),y.destroy(),Ae.destroy(),Ie.remove(this.id),this._conversation=null,this._myLastRequestedLayouts={},this._delayedHangup=!1,this._abortController=null}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((l,u,m)=>m.indexOf(l)===u);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 l=[];if(t&&l.push(t),e&&e.urls){let u=e.urls.filter((m,h,E)=>E.indexOf(m)===h);u.push(`${u[u.length-1]}?transport=tcp`),l.push({urls:u,username:e.username,credential:e.credential})}p.iceServers=l,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:l=!1,onlyAdminCanShareMovie:u,externalIds:m,startedTime:h,onFastStart:E,conversationId:P}){pe.setMark(Q.SIGNALING_CONNECTED);let R=P??I.uuid();d.debug("Conversation: start",{conversationId:R,opponentIds:e,opponentType:t,direction:i});let W=a.includes(ce.VIDEO),$;if(E){let Re={deviceId:this._api.deviceId(),sdkVersion:p.sdkVersion,clientAppKey:p.apiKey,platform:p.platform,protocolVersion:p.protocolVersion,domainId:p.domain,capabilities:Xe.getFlags()},we=JSON.stringify(Re),ne;try{if(ne=await E({internalParams:we,conversationId:R,externalIds:m,opponentType:t,mediaOptions:a,isVideo:W,joiningAllowed:c,requireAuthToJoin:l},this._abortController?.signal),!ne.internalCallerParams)throw new B(A.FAST_START_ERROR,{message:JSON.stringify(ne)})}catch(ie){throw this._delayedHangup&&this._abortController?.signal.aborted?new B(A.CANCELED):ie instanceof B?ie:ie instanceof Error?new B(A.FAST_START_ERROR,{message:ie.message}):new B(A.FAST_START_ERROR,{message:String(ie)})}try{let ie=JSON.parse(ne.internalCallerParams);$={endpoint:ie.endpoint,wt_endpoint:ie.wtEndpoint,id:R,is_concurrent:ie.isConcurrent,client_type:ie.clientType,rejected_participants:ne.rejectedParticipants?.map(J=>({...J,status:J.status})),stun_server:ie.stun,turn_server:ie.turn,token:new URL(ie.endpoint).searchParams.get("token")??""},d.debug("FastStart",$)}catch{throw new B(A.FAST_START_ERROR,{message:"Cannot parse internal params"})}}else $=await this._api.startConversation(R,e,t,W,s,c,l,{onlyAdminCanShareMovie:u},m),d.debug("Api.startConversation",$);this._setConversationParams($);let z=await this._connectSignaling(Ke.START,$);return await this._setConversation($,z,i),this._logCallStartEvent(h,Oe.OUTGOING),z}async _joinConversation(e,t){pe.setMark(Q.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:c,observedIds:l,payload:u,onFastJoin:m}=e;d.debug("Conversation: join",{conversationId:i,joinLink:c,observedIds:l});let h=a.includes(ce.VIDEO),E;if(m){if(!c)throw new B(A.FAST_JOIN_ERROR,{message:"joinLink is required for fast join"});let R={deviceId:this._api.deviceId(),sdkVersion:p.sdkVersion,clientAppKey:p.apiKey,platform:p.platform,protocolVersion:p.protocolVersion,domainId:p.domain,capabilities:Xe.getFlags()},W=JSON.stringify(R),$;try{if($=await m({joinLink:c,isVideo:h,internalParams:W},this._abortController?.signal),!$.internalCallerParams||!$.conversationId)throw new B(A.FAST_JOIN_ERROR,{message:JSON.stringify($)})}catch(z){throw this._delayedHangup&&this._abortController?.signal.aborted?new B(A.CANCELED):z instanceof B?z:z instanceof Error?new B(A.FAST_JOIN_ERROR,{message:z.message}):new B(A.FAST_JOIN_ERROR,{message:String(z)})}try{let z=JSON.parse($.internalCallerParams);E={endpoint:z.endpoint,wt_endpoint:z.wtEndpoint,id:$.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(A.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,l,u);else throw new B(A.UNKNOWN_ERROR);d.debug("Api.joinConversation",E),this._setConversationParams(E);let P=await this._connectSignaling(Ke.JOIN,E);return await this._setConversation(E,P,Oe.JOINING),this._logCallStartEvent(t,Oe.JOINING),P}async _prepareConversation(e,t=ae.USER,i,a,s){pe.setMark(Q.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let c=this._api.getUserId();if(!c)throw new B(A.UNKNOWN_ERROR);let l=0,u="",m="",h={id:e,peerId:i,endpoint:u,wt_endpoint:m,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let P=this._decodeExternalConversationParams(a);this._setConversationParams(P),u=s??`${p.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${p.wssToken}`,h.token=P.token,h.endpoint=u,p.wtsBase&&(m=`${p.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${p.wssToken}`,h.wt_endpoint=m)}else{let P=await this._getConversationParams(e);l=P.device_idx||0,u=s??`${p.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${p.wssToken}`,u=this._addGeoParamsToEndpoint(u,P),h.token=P.token,h.endpoint=u,h.device_idx=l,p.wtsBase&&(m=`${p.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${p.wssToken}`,m=this._addGeoParamsToEndpoint(m,P),h.wt_endpoint=m)}let E=await this._connectSignaling(Ke.ACCEPT,h);return await this._setConversation(h,E,Oe.INCOMING,t),E}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:ye(),participantState:{},state:X.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return 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(A.NETWORK_ERROR),t),t}}async _setConversation(e,t,i,a=ae.USER){let{participants:s}=t.conversation;s.forEach(h=>{let E=I.composeId(h),P=Y.fromSignalingParticipant(h,!1);if(P){this._api.cacheExternalId(E,P);let R=I.composeDecorativeId(h),W=Y.fromSignalingParticipant(h);R&&W&&(this._api.cacheExternalId(R,W),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let c=this._api.getUserId(),l=this._extractLocalParticipantFromConnection(t),u=e.device_idx||0;if(!c){if(!l)throw new B(A.UNKNOWN_ERROR);c=Number(l.id),l.idType&&(a=l.idType),l.deviceIdx&&(u=l.deviceIdx),this._api.setUserId(c)}let m=I.composeParticipantId(c,a,u);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:l?.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},Ne.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(p.forceRelayPolicy=e.p2p_forbidden),y.log(k.RELAY_POLICY,p.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new B(A.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 Xi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new oi(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,Me.NOTIFICATION,a=>this._signalingActor.add(a)),this.subscribe(this._signaling,Me.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Me.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return Ae.logEventualStat({name:Q.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(Nr.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===X.HUNGUP||s.state===X.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],A.HUNGUP);continue}let l=I.composeDecorativeId(s);this._registerParticipant({id:c,externalId:Y.fromSignalingParticipant(s),mediaSettings:ye(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},l);let u=await this._getParticipant(c);u&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${c}] changed: ${s.roles}`),v.onRolesChanged(u.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=Br(e,je.MUTE),s=Br(e,je.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=us(e);this._setMuteStatesForRoomId(i,null);for(let l of e.rooms?.rooms??[])this._setMuteStatesForRoomId(l.muteStates,l.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=gs(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 Dr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new ji,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===Oe.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let i of Object.values(t))(i.state===X.ACCEPTED||i.state===X.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new jr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new Hr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Hi(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Gi(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=D.getCameras().length,t=D.getMicrophones().length;d.debug("Cameras: "+e+(D.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(D.hasMicrophonePermission()?"✔":"✖")),y.log(k.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){y.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}async _removeParticipant(e,t){if(e.state===X.CALLED||e.state===X.ACCEPTED||this._state==="CLOSE")return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let i=await this._getParticipants();if(i[e.id]){t===A.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,this.id)}}_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===X.ACCEPTED||a.state===X.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:Y.fromSignalingParticipant(t),mediaSettings:ye(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=X.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=X.CALLED,this._transport.allocate(a.id,!0),y.log(k.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=Rc;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);y.log(k.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 y.log(k.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return y.log(k.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:Y.fromId(s.uid),l=Y.toString(c);i[l]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let c=Y.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 hold(e){await this._signaling.hold(e),e?(this._state==="ACTIVE"&&(this._state="HELD"),this._mediaSource?.stopLocalMedia()):(this._state==="HELD"&&(this._state="ACTIVE"),await this._mediaSource?.resumeLocalMedia(),this._mediaSource&&v.onLocalStream(this._mediaSource?.getStream()??null,this._mediaSource.mediaSettings,this.id))}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[rt(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:Y.fromId(s.uid),l=this._api.getCachedOkIdByExternalId(c);if(!l){let h=Y.toString(c);d.log(`Unknown participant external ID ${h}`);continue}let u=rt({participantId:l,mediaType:s.mediaType,streamName:s.streamName}),m=i[l];m?m.lastRequestedLayouts[u]=s:this._isMe(l)&&(this._myLastRequestedLayouts[u]=s),Xt(s)?(this._isMe(l)&&delete this._myLastRequestedLayouts[u],this._streamIdByStreamDescription.has(u)&&!this._cooldownTimestampByStreamDescription.has(u)&&this._cooldownTimestampByStreamDescription.set(u,Date.now())):(this._cooldownTimestampByStreamDescription.delete(u),!this._streamIdByStreamDescription.has(u)&&p.videoTracksCount>0&&this._streamIdByStreamDescription.set(u,null),t[u]=s),s.mediaType==="SCREEN"&&!Xt(s)&&pe.setMark(pe.getMarkNameScreenshareFirstFrame(l))}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:Q.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),y.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};y.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=Zt(e),s=i[a.participantId],c=this._conversation?.externalId,l=this._isMe(a.participantId);if(s||l){switch(a.mediaType){case"STREAM":case"MOVIE":{if(a.streamName){let u={stream:null,streamName:a.streamName,mediaType:a.mediaType};l?v.onLocalLive(c,u):v.onRemoteLive(s.externalId,u)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null,this.id);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null,this.id);break}}y.log(k.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,l]of Object.entries(i.errorCodeByParticipantId||{})){let u=Zt(c),m=s[u.participantId];if(m){let h;typeof l!="number"?(d.warn(`Unexpected error code ${l} received for participant ${u.participantId}`),h=os.UNKNOWN_ERROR):h=cs(l),a.push({externalId:m.externalId,errorReason:h})}}if(a&&a.length&&(d.warn("Could not allocate one or more participants",a),t))throw new wa("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]+Tc>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.mediaSettings)):(d.log("Promoted in waiting hall",!e.demote),e.demote?(d.log("Kicked from waiting hall"),this._close(new B(A.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=[],l=[],u=[],m=[],h=[];if(i.length&&i.forEach(R=>{if(R.externalId){let W=Y.fromSignaling(R.externalId);h.push(W),this._api.cacheExternalId(R.id.id,W)}else{let W=I.decomposeId(R.id.id).id;c.push(W),m.push(W)}}),a?.length&&a.forEach(R=>{let W=I.decomposeId(R).id;c.push(W),l.push(W)}),s?.length&&s.forEach(R=>{let W=I.decomposeId(R).id;c.push(W),u.push(W)}),!c.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let R=await this._api.getExternalIdsByOkIds(m);h.push(...R)}let E=await this._api.getExternalIdsByOkIds(l),P=await this._api.getExternalIdsByOkIds(u);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,l={initiatorId:i,movieId:a,source:s};if(this._isMe(i))v.onLocalSharedMovieStoppedInfo(t,l,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,l,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 l=await this._getExternalIdByParticipantId(a);l&&v.onRemoteSharedUrl(l,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=Zt(h),P=await this._getParticipant(E.participantId);v.onRemoteScreenStream(P.externalId,null,this.id);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=rt(t),l=this._sequenceNumberByStreamDescription.get(c);if(l&&l>e.sequenceNumber){d.warn(`Participant ${a} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${l}`),y.log(k.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 u=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(u,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(c);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){y.log(k.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let P=E?h:s.externalId,R=this._streamByStreamId.get(u);if(!R){y.log(k.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${u}`);return}y.log(k.PAT_ALLOCATED),this._streamIdByStreamDescription.set(c,u);let W=e.participantStreamDescription?.mediaType;if(W==="STREAM"||W==="MOVIE"){if(e.participantStreamDescription?.streamName){let $={streamName:e.participantStreamDescription.streamName,stream:R,mediaType:W};E?v.onLocalLive(P,$):v.onRemoteLive(P,$)}}else W==="SCREEN"?v.onRemoteScreenStream(s.externalId,R,this.id):E||v.onRemoteStream(s.externalId,R,this.id)}else{d.debug(`Waiting for ${m} until stream ${u} 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(rt(e)))return e;let t=e.participantId;if(e.mediaType){let i={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(rt(i)))return i}else{let i={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(rt(i)))return i;let a={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(rt(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,[gt.ADMIN,gt.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!I.includesOneOf(this._conversation.roles,[gt.ADMIN,gt.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===X.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=is(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=ps(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:l}=await this._resolveWaitingHallExternalIds(c),u=null;return c.length&&s.hasMore&&(u=ls(c[c.length-1].id)),{participants:l,pageMarker:u,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 l=Y.fromSignaling(c.externalId);i.push(c.id.addedTs),a.push(l),this._api.cacheExternalId(c.id.id,l)}else s.push(I.decomposeId(c.id.id).id)}),s.length&&!a.length&&(a=await this._api.getExternalIdsByOkIds(s),i=a.map(c=>{let l=this._api.getCachedOkIdByExternalId(c);return(l?t.get(l):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,[Ze.WAITING_HALL,Ze.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 l={movieId:i,name:t,privacy:a,groupId:s,roomId:c,streamMovie:!e},u=await this._signaling.startStream(l);if(u.error)return Promise.reject(u.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 l=I.composeId(c);return this._createParticipant({id:l,externalId:Y.fromSignalingParticipant(c),mediaSettings:ye(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(l,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(l=>{let u=I.composeId(l);return!a[u]});await this._registerParticipants(s);let c=this._transport?.getState();return i.participants.forEach(l=>{let u=I.composeId(l),m=a[u];m.status=this._getStatusByTransportState(c)??"WAITING",m.movieShareInfos=l.movieShareInfos,Object.assign(m.mediaSettings,ye(l.mediaSettings)),Object.assign(m.muteStates,l.muteStates),m.unmuteOptions=l.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.mediaSettings;d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new oi(this._mediaSource)),v.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this.mediaSettings;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,l)=>{if(this._isMe(l))a=c;else{let u=s[l];if(!u){this._warnParticipantNotInConversation(l);return}u.participantState=c,i.push({externalId:u.externalId,participantState:{...c},markers:u.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 U.ACCEPTED_CALL:return this._onAcceptedCall(e);case U.HUNGUP:return this._onHungup(e);case U.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case U.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case U.CLOSED_CONVERSATION:return this._onClosedConversation(e);case U.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case U.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case U.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case U.RATE_CALL_DATA:return this._onNeedRate();case U.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case U.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case U.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case U.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case U.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case U.REGISTERED_PEER:return this._onPeerRegistered(e);case U.SWITCH_MICRO:return this._onMicSwitched(e);case U.CHAT_MESSAGE:return this._onChatMessage(e);case U.CUSTOM_DATA:return this._onCustomData(e);case U.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case U.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case U.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case U.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case U.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case U.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case U.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case U.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case U.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case U.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case U.FEEDBACK:return this._onFeedback(e);case U.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case U.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case U.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case U.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case U.ROOMS_UPDATED:return this._onRoomsUpdated(e);case U.ROOM_UPDATED:return this._onRoomUpdated(e);case U.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case U.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case U.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case U.ASR_STARTED:return this._onAsrStart(e);case U.ASR_STOPPED:return this._onAsrStop(e);case U.PROMOTION_APPROVED:return this._onPromotionApproved(e);case U.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case U.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 u of e.conversation.participants){let m=I.composeId(u),h=u.roles||[];if(this._isMe(m)){Fi(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:hs(u),unmuteOptions:u.unmuteOptions})};continue}c.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:u.id,participant:u,mediaSettings:u.mediaSettings});else{let P=ye(u.mediaSettings);sn(P,E.mediaSettings)||await this._changeRemoteMediaSettings(m,P);let R=I.mapParticipantState(u),W=E.participantState;I.isEqualParticipantState(R,W)||await this._changeRemoteParticipantState(m,R),Fi(h,E.roles)||this._onRolesChanged(E.id,h)}}let l=await this._getParticipants();for(let u of s)c.indexOf(u)<0&&l[u]&&this._removeParticipant(l[u],A.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(A.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let c=this._api.getDecorativeIdByInitialId(t),l=c?I.composeUserId(c,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:ye(e.mediaSettings)},l))}a.state=X.ACCEPTED,a.mediaSettings=ye(e.mediaSettings),this._logWithMediaSettings(k.ACCEPTED_OUTGOING,a.mediaSettings),this._conversation&&this._conversation.direction===Oe.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,Xe.parseCapabilities(e.capabilities),this.id)}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===A.REJECTED?X.REJECTED:X.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,A.HUNGUP)}async _onAddedParticipant(e){d.debug(`Participant added [${e.participantId}]`);let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state!==X.HUNGUP&&i.state!==X.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:Y.fromSignalingParticipant(a),mediaSettings:ye(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=X.CALLED,i.mediaSettings=ye(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,this.id),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===X.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:Y.fromSignalingParticipant(s),mediaSettings:ye(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===Oe.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),i.state=X.ACCEPTED,i.mediaSettings=ye(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,this.id),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,ye(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:l,markers:u})=>this._registerParticipantAndSetMarkersIfChunkEnabled(l,u));await Promise.all(a);let s=new Map,c=t.map(({id:l,participantState:u})=>this._getExternalIdByParticipantId(l).then(m=>[l,m&&I.mapParticipantState({participantState:u})]));try{(await Promise.all(c)).forEach(([u,m])=>{m&&s.set(u,m)}),await this._changeMultipleParticipantState(s,i)}catch(l){d.warn(`_onParticipantsStateChanged: Failed to get external ids. ${l}`)}}_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.mediaSettings,i=ye(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=Ta(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=Ta(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(ce.AUDIO,!e.mute,this.id),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)&&!Fi(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:Br(this._getMuteStatesForCurrentRoom(),je.MUTE_PERMANENT),stateUpdated:!0}),I.includesOneOf(t,[gt.ADMIN,gt.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=await this._getParticipant(e);i&&!Fi(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:l=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 u=await this._getParticipant(e.participantId);if(u){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,u.externalId,m,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,l):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!==X.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:c,roomId:l=null,unmuteOptions:u=[]}=e,m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(l)),E=this._mediaSource.mediaSettings,P=Object.entries(h);for(let[R,W]of P){let $=this._isCallAdmin()&&i;if(!(W!==je.MUTE&&W!==je.MUTE_PERMANENT||$)&&(this._isCallAdmin()&&W===je.MUTE_PERMANENT&&!i&&(h[R]=je.MUTE),!(!t.includes(R)||a)))switch(R){case ce.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(ce.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case ce.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(ce.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case ce.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(ce.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case ce.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(ce.AUDIO_SHARING,!1,this.id),await this.toggleScreenCapturing({captureScreen:E.isScreenSharingEnabled,fastScreenSharing:E.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(h,u,t,i,a,null,m,s,c,l)}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&&!ts(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e),e.includes(Ze.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&v.onLocalStatus("WAITING_HALL",this.id):e.includes(Ze.WAIT_FOR_ADMIN)&&this._conversation.restricted&&v.onLocalStatus("WAIT_FOR_ADMIN",this.id))}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,ei.getInstance().value=s,v.onLocalNetworkStatusChanged(s);else{let l=i[a];l.networkRating=s,t.push({uid:l.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,this.id)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){v.onVmojiStream(t,this._mediaSource.mediaSettings);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(),this._audioOutput.destroy()}_changeFeatureSet(){if(this._conversation){let e=this._state==="ACTIVE",t=this._conversation.features.includes(Lr.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation,this.id)}}_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.id),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,l)=>{if(l in a){let u=a[l];c.push(u),t==="CONNECTED"&&(u.remoteStream||(u.mediaSettings&&this._changeRemoteMediaSettings(l,u.mediaSettings),this._changeRemoteParticipantState(l,u.participantState)),this._updateDisplayLayoutFromCache(l))}else this._warnParticipantNotInConversation(l);return c},[]);s.length&&this._setParticipantsStatus(s,i)}async _onTransportLocalStateChanged(e){if(d.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(D.releaseFirefoxMicrophonePermissionWarmup(),v.onLocalStatus("CONNECTED",this.id),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&v.onLocalStatus("CONNECTING",this.id),e==="RECONNECTING"&&v.onLocalStatus("RECONNECT",this.id),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(A.FAILED),this._close(new B(A.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(Le.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(e,i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(Le.TRANSPARENT_AUDIO_TRACK_PREFIX))d.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,i);else if(e.startsWith(Le.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.id),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(e,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,this.id)}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!==Le.AUDIO_MIX){let a=await this._getParticipant(e);if(!a||a.remoteStream&&a.remoteStream!==t)return}this._audioOutput.remove(e,i)}_removeVideoTrack(e,t,i){}_onTopologyChanged(e){e==="DIRECT"&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall()),this._audioOutput.destroy()}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,d.debug("Audio mix stalled:",e),v.onLocalStatus(e?"RECONNECT":"CONNECTED",this.id))}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 l=s[c];l&&i.push(l)}delete this._lastStalled[c]}for(let c of Object.keys(this._lastStalled)){let l=s[c];l&&a.push(l)}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){!D.hasMicrophone()||!this._audioFix||!this.mediaSettings?.isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!D.hasCamera()||!this._audioFix||!this.mediaSettings?.isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!=="CLOSE"||!1;e&&(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,this.id)}_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(si)){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===si.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 l=await Promise.all(c?.map(async P=>{let R=I.composeId(P);return this._createParticipant({id:R,externalId:Y.fromSignalingParticipant(P),mediaSettings:ye(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(R,P.markers),isInRoom:i!==null},P.decorativeUserId)})||[]),u=!1;for(let P of l)P.id===this._conversation?.compositeUserId&&(u=!0),this._registerParticipantInCache(P);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(l,!0);let m=[],h=[];if(e?.removedParticipantMarkers){for(let P of e.removedParticipantMarkers)if(P.GRID?.id){let R=this._getExternalIdByParticipantId(P.GRID.id);h.push(R)}m=await Promise.all(h)}if(u&&await this._onRoomSwitched(i),m){let P=this._conversation?.pinnedParticipantIdByRoom.get(i);if(P){let R=await this._getExternalIdByParticipantId(P);if(R){for(let W of m)if(Y.compare(R,W)){this._conversation?.pinnedParticipantIdByRoom.delete(i);break}}}}let E={roomId:i,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:I.mapSharedParticipants(l),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 l=await this._getParticipants();await this._registerParticipants(s?.participants?.participants?.filter(m=>!l[I.composeId(m)])||[],!0);let u=await this._convertRoomToExternal(s);u&&a.push(u)}}a.length&&!this._isCalledState()&&v.onRoomsUpdated({[si.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 l=Y.fromSignaling(a,c.deviceIdx);if(v.onParticipantIdChanged(c,l),this._api.cacheExternalId(i,l),this._api.mapDecorativeId(i,t),s)this._conversation.externalId=l;else{let u=await this._getParticipants();u[t].externalId=l}}_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 l=c.value;this._participants[l.id]=l;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]}},Ie=new Fr,qe=null;var wa=class n extends Error{constructor(e,t){super(e);o(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var Ht=null,ci=null;function Ss(){Ht=null,ci=null}function Cc(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Kr(n=null,r){let e=Cc(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 vs(){return Ht||ci||(ci=Kr(),Ht=await ci,ci=null,Ht)}async function di(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await vs();let t=Es(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${Ht}/fb.do`,i)}async function Wi(n,r={},e=!1,t){await vs();let i=Es(n,r,e);return yc(i,t)}async function yc(n,r){let e=`${r??Ht}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new B(A.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 Is(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 Es(n,r={},e=!1){r.method=n,r.format="JSON",r.application_key||(r.application_key=p.apiKey),e||(Ce.sessionKey?r.session_key=Ce.sessionKey:Ce.accessToken&&(r.access_token=Ce.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 Ki=class{constructor(){o(this,"_abortSignal")}setAbortSignal(r){this._abortSignal=r}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=A.HUNGUP){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var bc=700,Ac=3e3,li=class extends Ki{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 Wi(e,t,i)}catch(c){if(!Object.hasOwn(c,"error_msg")){s++;let l=Object.getOwnPropertyNames(c).map(u=>`${u}: ${JSON.stringify(c[u])}`);if(d.debug(`${e} network error, attempt ${s}: ${l.join(`
|
|
17
|
-
`)}`),this._abortSignal?.aborted&&(d.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),s<p.apiMaxAttempt)return await I.delay(Math.min(s*bc,Ac),{signal:this._abortSignal}),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 B)throw a;if(a.custom_error&&(c.custom_error=a.custom_error),Mc(a))switch(a.error_code){case 1101:s=A.SERVICE_DISABLED;break;case 4:a.error_msg.includes("participants.limit.exceeded")&&(s=A.PARTICIPANT_LIMIT_REACHED);break;case 300:s=A.NOT_FOUND;break;case 1102:s=A.CALLEE_IS_OFFLINE;break;case 1103:s=A.NOT_FRIENDS;break;case 1104:case 1106:s=A.EXTERNAL_API_ERROR;break;case 1113:s=A.CALLER_IS_REJECTED;break;case 1114:s=A.VCHAT_DETAILED_ERROR;break;case 2:s=A.SERVICE_UNAVAILABLE;break}throw new B(s,c)}}async userId(e){let t=I.extractOkId(e);if(Ce.isEmpty())return Y.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),Y.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!p.apiKey)throw new B(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)),Ce.sessionKey=t.session_key,Ce.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&v.onTokenExpired(),new B(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})};di("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)};di("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)};di("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),l=new FormData,u=new Blob([a],{type:"application/json"});l.append("file",u,"log.json");let m=new URL(c.upload_url);return m.searchParams.append("size",u.size.toString()),Is(m.toString(),l)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:p.protocolVersion,capabilities:Xe.getFlags()};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:c,waitForAdmin:l,closedConversation:u}={},m){let h=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,waitForAdmin:l,closedConversation:u,audienceMode:s,audioOnly:c,speakerIds:m});return this._startConversation(h)}async startConversation(e,t,i,a=!1,s="",c=!1,l=!1,{onlyAdminCanShareMovie:u,waitForAdmin:m}={},h){let E=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:c,payload:s,requireAuthToJoin:l,onlyAdminCanShareMovie:u,waitForAdmin:m,externalIds:h});if(t&&t.length)switch(i){case st.USER:E.uids=t.join(",");break;case st.GROUP:E.gid=t[0];break;case st.CHAT:E.chatId=t[0];break}return this._startConversation(E)}_ensureUuid(){if(!this._uuid){let e=St.get("uuid");e||(e=I.uuid(),St.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:l,audienceMode:u=!1,audioOnly:m=!1,speakerIds:h=[],closedConversation:E=!1,externalIds:P}){let R={conversationId:e,isVideo:t,protocolVersion:p.protocolVersion};if(a&&(R.createJoinLink=!0),i&&(R.payload=i),p.domain&&(R.domainId=p.domain),p.externalDomain&&(R.externalDomain=p.externalDomain),s&&(R.requireAuthToJoin=!0),c!==void 0&&(R.onlyAdminCanShareMovie=c),l!==void 0&&(R.waitForAdmin=l),u&&(R.audienceMode=u),m&&(R.audioOnly=m),h.length){let W=h.map($=>I.composeUserId($));R.speakerIds=W.join(",")}return E&&(R.closed=E),P&&(R.externalIds=P.map(Y.toSignaling).join(",")),R}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:Xe.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 u of e){let m=Y.toString(u),h=c.indexOf(m);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(a.set(String(u.id),m),i.push({id:u.id,ok_anonym:u.type==="ANONYM"}))}return i.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:i})).ids.forEach((u,m)=>{let h=Number(u.ok_user_id),E=String(u.external_user_id.id);a.has(E)&&(this.cacheExternalId(h,Y.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=Y.toString(s),l=a.indexOf(c);if(l>-1){let u=I.composeParticipantId(this.replaceByInitialIdIdIfExists(i[l]),ae.USER,s.deviceIdx);t.set(s,u)}}return t}async getExternalIdsByOkIds(e){let t=[],i=[];for(let s of e)if(this._externalUidsCache.has(s)){let c=this.getDecorativeIdByInitialId(s),l=this._externalUidsCache.get(c??s);t.push(Y.fromString(l))}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=Y.toString(e),s=i.indexOf(a);return s>-1?I.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),ae.USER,e.deviceIdx):s>-1?I.composeParticipantId(t[s],ae.USER,e.deviceIdx):null}cacheExternalId(e,t){let i=I.extractOkId(e);this._externalUidsCache.set(i,Y.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=A.HUNGUP){let i={conversationId:e,reason:t};p.anonymToken&&(i.anonymToken=p.anonymToken),di("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:Q.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};di("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[l,u]of Object.entries(s)){let m=Number(l),h=Y.fromId(u,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 l=Y.fromId(String(c));t.set(c,l),this.cacheExternalId(c,l)}}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 Ts=(e=>(e.KING="KING",e.PAWN="PAWN",e))(Ts||{}),Rs=Ts;var ka=(e=>(e.OFF="0",e.ON="1",e))(ka||{});var $r=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 qr=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 Kr(this._baseApiUrl,this._apiEnv),t=await Wi("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:A.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Kr(this._baseApiUrl,this._apiEnv);await Wi("vchat.hangupConversation",e,!0,t)}};var ue,$i=null,Dc={getCameras:D.getCameras,getMicrophones:D.getMicrophones,getOutput:D.getOutput,getVideoFacingMode:D.getVideoFacingMode,hasCamera:D.hasCamera,hasMicrophone:D.hasMicrophone,getSavedCamera:D.getSavedCamera,getSavedMicrophone:D.getSavedMicrophone,getSavedOutput:D.getSavedOutput,hasCameraPermission:D.hasCameraPermission,hasMicrophonePermission:D.hasMicrophonePermission,hasPermissions:D.hasPermissions,getUserMedia:D.getUserMedia,getUserVideo:D.getUserVideo,getUserAudio:D.getUserAudio,setResolution:D.setResolution,isBrowserSupported:D.isBrowserSupported,isScreenCapturingSupported:D.isScreenCapturingSupported,os:D.os,isMobile:D.isMobile,browserName:D.browserName,browserVersion:D.browserVersion,baseChromeVersion:D.baseChromeVersion,getAudioContext:D.getAudioContext,isAudioShareSupported:D.isAudioShareSupported},wc={participantMarkerCompare:I.participantMarkerCompare};function kc(n){$i=n}function Oc(n){p.videoEffects=n}function xc(n){p.audioEffects=n}function Nc(n,r=null,e={},t=1){p.vmoji=n,p.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function Lc(n){if(p.set(n),ue||(ue=new li),Oa.default.disableLog(!p.debug),d.toggle(p.debug),d.log(`Calls SDK ${p.sdkVersion}`,n),await D.init(),!D.isBrowserSupported())throw new B(oe.UNSUPPORTED);d.log("UserAgent:",navigator.userAgent),d.log("Screen resolution:",`${window.screen.width}x${window.screen.height}`),d.log("Permissions:",`Camera: ${D.hasCameraPermission()}, Mic: ${D.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${p.simulcast}`)}async function Uc(n,r=[ce.AUDIO],e="",t=!1,i=!1,a,s,c){let l=[];return Array.isArray(n)?l=n.length?n:[]:n&&(l=[n]),Cs([],st.USER,r,e,t,i,a,l,s,c)}async function Cs(n,r=st.USER,e,t="",i=!1,a=!1,s,c,l,u){return new G(ue,$i).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:l,conversationId:u})}async function Bc(n,r){return ys(n,ae.USER,void 0,r)}async function ys(n,r=ae.USER,e,t,i,a){if(n===G.id())throw new Error("Push has already been processed");a&&ue.setUserId(a);let s=new G(ue,$i);if(await s.onPush(n,r,e,t,i),Ie.getAll().length>1)if(p.get("onIncomingCall"))v.onIncomingCall(s.id,s.externalId,s.mediaSettings);else{d.log("Push rejected (busy) — no onIncomingCall handler"),await s.decline();return}}async function Fc(n,r){return n&&(p.authToken=n),r!==void 0&&p.apiBaseUrl!==r&&(p.apiBaseUrl=r,Ss()),ue.authorize()}async function Vc(n=[ce.AUDIO],r){return et(r).accept(n)}async function jc(n){let r=Gt(n);if(r)return r.decline()}async function Hc(n,r=[ce.AUDIO]){return Ps(n,r)}async function Ps(n,r,e){return new G(ue,$i).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function Gc(n,r=[ce.AUDIO],e,t,i,a){return e&&(p.anonymToken=e),new G(ue,$i).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i,onFastJoin:a})}async function Wc(n){let r=Gt(n);if(r)return r.hangup();G.hangupAfterInit()}async function Kc(n,r){let e=Array.isArray(n)?n:[n],t=G.current();t&&await t.addParticipant(e,r)}async function $c(n,r){let e=G.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function qc(n,r=!1){let e=await ue.getOkIdsByExternalIds([n]);return bs(e[0],r)}async function bs(n,r=!1){let e=G.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 zc(n,r){let e=G.current();if(n==="videoinput"&&ft.contains(r))return p.videoFacingMode=r,e?(D.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await D._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function Jc(n,r){let e=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&p.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},t=Gt(r);return t?t.toggleScreenCapturing(e):Promise.reject()}function Yc(n){let r=G.current();r&&r.toggleAnimojiCapturing(n)}async function Qc(n,r=!1){let e=G.current();e&&await e.setVideoStream(n,r)}async function Xc(n,r){let e=Gt(r);e&&await e.toggleLocalVideo(n)}async function Zc(n,r){let e=Gt(r);e&&await e.toggleLocalAudio(n)}async function ed(n){let r=G.current();if(r)return r.setLocalResolution(n)}async function td(n){let r=G.current();r&&await r.changePriorities(n)}async function id(n,r){let e=G.current();if(e){let t;if(r){let[i]=await ue.getOkIdsByExternalIds([r]);t=I.composeParticipantId(i,ae.USER,r.deviceIdx)}await e.changeParticipantState(n,t)}}async function rd(n,r){let e=Gt(r);e&&await e.hold(n)}async function ad(){let n=G.current();n&&await n.putHandsDown()}async function nd(n){let r=G.current();r&&await r.updateDisplayLayout(n)}async function sd(n,r,e=!1){let t=await ue.getOkIdsByExternalIds([n]);return As(t[0],Y.getDeviceIdx(n),r,e)}async function As(n,r,e,t=!1){let i=G.current();i&&await i.grantRoles(I.composeParticipantId(n,ae.USER,r),e,t)}async function od({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await ue.getOkIdsByExternalIds([n]))[0]),Ms({uid:i,muteStates:r,requestedMedia:e,deviceIdx:Y.getDeviceIdx(n),roomId:t})}async function Ms({uid:n=null,muteStates:r,requestedMedia:e=[],deviceIdx:t=0,roomId:i=null}){let a=G.current();if(a){let s=n?I.composeParticipantId(n,ae.USER,t):null;await a.muteParticipant(s,r,e,i)}}async function cd(n,r=!1,e=null){let t=await ue.getOkIdsByExternalIds([n]);return Ds(t[0],r,Y.getDeviceIdx(n),e)}async function Ds(n,r=!1,e=0,t=null){let i=G.current();i&&await i.pinParticipant(I.composeParticipantId(n,ae.USER,e),r,t)}async function dd(n){let r=G.current();r&&await r.updateMediaModifiers(n)}async function ld(n){let r=G.current();r&&await r.enableVideoSuspend(n)}async function pd(n){let r=G.current();r&&await r.enableVideoSuspendSuggest(n)}async function ud(n){let r=G.current();r&&await r.changeOptions(n)}async function md(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),ws(n,e)}async function ws(n,r=null){let e=G.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function hd(n=10){let r=G.current();if(r)return r.chatHistory(n)}async function gd(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),ks(n,e,Y.getDeviceIdx(r))}async function ks(n,r=null,e=0){let t=G.current();if(t){let i=r?I.composeParticipantId(r,ae.USER,e):null;await t.customData(n,i)}}async function _d(n="",r=!1,{onlyAdminCanShareMovie:e=!1,waitForAdmin:t=!1,closedConversation:i=!1}={},a){return(await ue.createConversation(a??I.uuid(),n,r,{onlyAdminCanShareMovie:e,waitForAdmin:t,closedConversation:i})).join_link}async function fd(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=Y.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 Sd(){let n=G.current();return n?n.createJoinLink():Promise.reject()}async function vd(){let n=G.current();return n?n.removeJoinLink():Promise.reject()}async function Id(n,r){return ue.getAnonymTokenByLink(n,r)}function Ed(n){let r=G.current();r&&r.setVolume(n)}function Td(n){p.forceRelayPolicy=n}async function Rd(n=!1,r=null,e=null,t="DIRECT_LINK",i=null,a=null){let s=G.current();return s?s.startStream(n,r,e,t,i,a):Promise.reject()}async function Cd(n=null,r){let e=G.current();return e?e.stopStream(n,r):Promise.reject()}async function yd(n=null){let r=G.current();return r?r.publishStream(n):Promise.reject()}async function Pd(n,r,e=!1,t=null){let i=G.current();if(!i)return Promise.reject();let a,s,c=[];if(r?.length&&c.push(...r),n&&c.push(n),c.length){let l=await ue.getParticipantIdsByExternalIds(c);n&&(a=l.get(n),l.delete(n)),s=Array.from(l.values())}return i.recordSetConf(a,s,e,t)}async function bd(){let n=G.current();return n?n.getStreamInfo():Promise.reject()}async function Ad(n){let r=G.current();return r?r.addMovie(n):Promise.reject()}async function Md(n){let r=G.current();return r?r.updateMovie(n):Promise.reject()}async function Dd(n){let r=G.current();return r?r.removeMovie(n):Promise.reject()}async function wd(n,r){let e=G.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 kd(n,r){let e=G.current();return e?e.activateRooms(n,r):Promise.reject()}async function Od(n=null,r=null){let e=G.current();if(!e)return Promise.reject();let t;if(r){let i=await ue.getOkIdsByExternalIds([r]),a=Y.getDeviceIdx(r);t=I.composeParticipantId(i[0],ae.USER,a)}return e.switchRoom(n,t)}async function xd(n){let r=G.current();return r?r.removeRooms(n):Promise.reject()}function Nd(n){p.statisticsInterval=n;let r=G.current();if(r)return r.updateStatisticsInterval()}function Ld(n){Oa.default.disableLog(!n),d.toggle(n)}function Ud(n,...r){p.debugLog&&d.send(n,"[external]",...r)}async function Bd(){let n=Ne.conversationId;if(!n)throw d.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let r=Ne.collectLogs();if(r.length===0)throw d.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Ne.startTime,t=Ne.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 Fd(n){let r=G.current();if(r)return r.videoEffect(n)}async function Vd(n,r){let e=G.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function jd(n){let r=G.current();r&&await r.setAudioStream(n)}async function Hd(n,r=null,e=null){let t=G.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,ae.USER,Y.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function Gd(n){let r=G.current();r&&r.setAnimojiFill(n)}async function Wd(n=null,r,e=!1){return et().getWaitingHall(n,r,e)}async function Kd(){return et().getAudienceModeHands()}async function $d(n,r=!1){let e=et(),t;if(n){let[i]=await ue.getOkIdsByExternalIds([n]);t=I.composeUserId(i)}return e.promoteParticipant(t,r)}async function qd(n=!1){return et().requestPromotion(n)}async function zd(n=!1){return et().acceptPromotion(n)}async function Jd(n){return et().getParticipantListChunk(n)}async function Yd(n){return et().getParticipants(n)}async function Qd(n){return et().feedback(n)}function Xd(n,r,e){return et().userFeedbackStats(n,r,e)}function Zd(n,r={},e=!1){let t=G.current();t&&t.sendClientEvent(n,r,e)}async function el(n,r){return et().enableFeatureForRoles(n,r)}function Gt(n){return n?Ie.get(n)??null:G.current()}function et(n){let r=Gt(n);if(!r)throw new Error("Conversation not found");return r}async function tl(n){await ue.removeHistoryRecords(n)}async function il(n){let r=G.current();r&&await r.startAsr(n)}async function rl(n){let r=G.current();r&&await r.stopAsr(n)}async function al(n){let r=G.current();r&&await r.requestAsr(n)}async function nl(n){let r=G.current();return r?r.startUrlSharing(n):Promise.reject()}async function sl(){let n=G.current();return n?n.stopUrlSharing():Promise.reject()}async function ol(n){await Ie.setActive(n)}function cl(){let n=new Map;for(let r of Ie.getAll())n.set(r.id,r);return n}function dl(){return Ie.getActiveId()}function ll(){return p.sdkVersion}
|
|
19
|
+
`)}})}_startMonitorRtpShareInterval(){let e=5e3;if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,e)};this._monitorRtpShareInterval=window.setTimeout(t,e)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}},Z=function(e){return e.REMOTE_TRACK_ADDED=`REMOTE_TRACK_ADDED`,e.REMOTE_TRACK_REMOVED=`REMOTE_TRACK_REMOVED`,e.REMOTE_STREAM_SECOND=`REMOTE_STREAM_SECOND`,e.AUDIO_MIX_STALL=`AUDIO_MIX_STALL`,e.REMOTE_DATA_STATS=`REMOTE_DATA_STATS`,e.STATE_CHANGED=`STATE_CHANGED`,e.LOCAL_STATE_CHANGED=`LOCAL_STATE_CHANGED`,e.SIGNALLED_ACTIVE_PARTICIPANTS=`SIGNALLED_ACTIVE_PARTICIPANTS`,e.SIGNALLED_SPEAKER_CHANGED=`SIGNALLED_SPEAKER_CHANGED`,e.SIGNALLED_STALLED_PARTICIPANTS=`SIGNALLED_STALLED_PARTICIPANTS`,e.TOPOLOGY_CHANGED=`TOPOLOGY_CHANGED`,e.NETWORK_STATUS=`NETWORK_STATUS`,e.PEER_CONNECTION_CLOSED=`PEER_CONNECTION_CLOSED`,e.ASR_TRANSCRIPTION=`ASR_TRANSCRIPTION`,e.ANIMOJI_STREAM=`ANIMOJI_STREAM`,e.ANIMOJI_ERROR=`ANIMOJI_ERROR`,e.SCREEN_SHARING_STAT=`SCREEN_SHARING_STAT`,e}({}),to=class extends _{constructor(e,t,n,r,i=B,a=null,o=null,s=null){super(),g(this,`_signaling`,void 0),g(this,`_mediaSource`,void 0),g(this,`_topology`,void 0),g(this,`_allocated`,[]),g(this,`_opened`,[]),g(this,`_directTransport`,null),g(this,`_serverTransport`,null),g(this,`_serverSettings`,void 0),g(this,`_dtListeners`,[]),g(this,`_stListeners`,[]),g(this,`_states`,{}),g(this,`_localState`,J.IDLE),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`_statAggregator`,void 0),g(this,`_codecStatsAggregator`,void 0),this._signaling=t,this._mediaSource=n,this._topology=e,this._serverSettings=r,this._debug=i,this._logger=a,this._statAggregator=o,this._codecStatsAggregator=s,this.subscribe(this._signaling,pr.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Jt.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,Jt.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e===Y.SERVER&&(this._serverTransport=this._createServerTransport())}updateSettings(e){this._debug.log(`Update transport settings`,e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(this._debug.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){this._debug.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology===Y.DIRECT&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===Y.SERVER&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,n=!1,r=!1){this._debug.log(`Trying open participant`,{participantIds:e});let i=r;for(let t of e){if(this._opened.indexOf(t)!==-1){this._debug.warn(`The participant [${t}] has already had opened transport`);continue}if(this._allocated.indexOf(t)===-1){this._debug.warn(`The participant [${t}] has no allocated transport`);continue}this._opened.push(t),i=!0}i&&(this._topology===Y.DIRECT&&this._directTransport&&this._directTransport.open(t),this._topology===Y.SERVER&&this._serverTransport&&(this._serverTransport.open(n),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),this._debug.debug(`The transport has been opened`,e))}close(e){let t=this._allocated.indexOf(e),n=this._opened.indexOf(e);t<0&&this._debug.warn(`The participant [${e}] transport has already deallocated`),this._topology===Y.DIRECT&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===Y.SERVER&&(this._serverTransport?.removeParticipant(e),this._setStates([e],J.CLOSED)),n>=0&&this._opened.splice(n,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.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===Y.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===Y.SERVER&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let n=e.filter(e=>this._states[e]===t?!1:(this._states[e]=t,!0));n.length&&this._triggerEvent(`STATE_CHANGED`,n,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent(`LOCAL_STATE_CHANGED`,e))}_onSignalingNotification(e){if(e.notification===G.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(this._debug.log(`Topology changed ${this._topology} -> ${e.topology}`),this._logger?.log(E.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===Y.SERVER&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===Y.DIRECT){let t=e.offerTo||[],n=e.offerToTypes||[],r=e.offerToDeviceIdxs||[],i=t.length&&n.length?N.composeParticipantId(t[0],n[0],r[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){this._debug.error(`Topology changed to DIRECT, but the list of allocated participants is empty`);return}this._allocated.length>1&&this._debug.warn(`Topology changed to DIRECT, but the allocated participants count more then one`);let a=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let e=i===a;this._directTransport=this._createDirectTransport(a,e)}this._opened.indexOf(a)>=0&&this._directTransport.open()}this._triggerEvent(`TOPOLOGY_CHANGED`,this._topology)}}_createDirectTransport(e,t=!1){let n=new Vi(e,t,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator);return this._dtListeners.length>0&&this._debug.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(n.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this,e)),n.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this,e)),n.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),n.addEventListener(`STATE_CHANGED`,this._onDirectTransportChanged.bind(this)),n.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),n.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,Y.DIRECT))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new eo(this._signaling,this._mediaSource,this._serverSettings,this._debug,this._logger,this._statAggregator,this._codecStatsAggregator);return this._stListeners.length>0&&this._debug.warn(`The list of server transport listeners is not empty`),this._stListeners=[],this._stListeners.push(e.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this)),e.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this)),e.addEventListener(`AUDIO_MIX_STALL`,this._onServerAudioMixStall.bind(this)),e.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),e.addEventListener(`STATE_CHANGED`,this._onServerTransportChanged.bind(this)),e.addEventListener(`SIGNALLED_ACTIVE_PARTICIPANTS`,this._onTransportActiveParticipants.bind(this)),e.addEventListener(`SIGNALLED_SPEAKER_CHANGED`,this._onTransportSpeakerChanged.bind(this)),e.addEventListener(`SIGNALLED_STALLED_PARTICIPANTS`,this._onTransportStalledParticipants.bind(this)),e.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),e.addEventListener(`REMOTE_STREAM_SECOND`,this._onRemoteStreamSecond.bind(this)),e.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,Y.SERVER)),e.addEventListener(`ASR_TRANSCRIPTION`,this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e===J.CONNECTED&&this._topology===Y.DIRECT&&this._releaseServerTransport(),(e===J.CLOSED||e===J.FAILED)&&(this._releaseDirectTransport(),this._topology===Y.DIRECT)){let e=this._opened.indexOf(t);e>=0&&this._opened.splice(e,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology===Y.DIRECT&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===J.CONNECTED&&this._topology===Y.SERVER&&this._releaseDirectTransport(),(e===J.CLOSED||e===J.FAILED)&&(this._releaseServerTransport(),this._topology===Y.SERVER&&(this._allocated=[],this._opened=[])),this._topology===Y.SERVER&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===Y.SERVER&&this._triggerEvent(`SIGNALLED_SPEAKER_CHANGED`,e)}_onTransportNetworkStatus(e){this._triggerEvent(`NETWORK_STATUS`,e)}_onRemoteStreamSecond(e,t){this._triggerEvent(`REMOTE_STREAM_SECOND`,e,t)}_onPeerConnectionClosed(e){this._triggerEvent(`PEER_CONNECTION_CLOSED`,e)}_onServerAudioMixStall(e){this._topology===Y.SERVER&&this._triggerEvent(`AUDIO_MIX_STALL`,e)}_onRemoteDataStats(e){this._triggerEvent(`REMOTE_DATA_STATS`,e)}_onRemoteTrackAdded(e,t,n){this._triggerEvent(`REMOTE_TRACK_ADDED`,e,t,n)}_onRemoteTrackRemoved(e,t,n){this._triggerEvent(`REMOTE_TRACK_REMOVED`,e,t,n)}_onAsrTranscription(e){this._triggerEvent(`ASR_TRANSCRIPTION`,e)}_onSourceChanged(){let e=this._mediaSource.getStream();e&&this._animojiSender?.setStream(e)}_onAnimojiStream(e,t){this._triggerEvent(`ANIMOJI_STREAM`,e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createAnimojiTransport(){if(!P.vmoji)return;this._animojiReceiver=new P.vmoji.AnimojiReceiver((e,t)=>this._onAnimojiStream(e,t),e=>this._onAnimojiStream(e,null),e=>{this._triggerEvent(`ANIMOJI_ERROR`,e)},P.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new P.vmoji.AnimojiSender(e,this._signaling.getPeerId(),P.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:P.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=e=>this._animojiReceiver?.receive(e)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology===Y.SERVER?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(this._logger?.log(E.PAT_WAITING_TIME_ERROR,`noTransport`),this._debug.error(`Cannot get stream waiting time, server transport is not initialized`),0):(this._logger?.log(E.PAT_WAITING_TIME_ERROR,`wrongTopology`),this._debug.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},no=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),ro=class extends _{constructor(e){super(),g(this,`_detectors`,new Map),g(this,`_interval`,null),g(this,`_activeParticipants`,void 0),g(this,`_removedParticipants`,void 0),g(this,`_topology`,void 0),this._topology=e.getTopology(),this.subscribe(e,Z.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(e,Z.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,Z.SIGNALLED_ACTIVE_PARTICIPANTS,this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,Z.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._destroyDetectors()}_onRemoteTrackAdded(e,t,n){if(n.kind===j.audio&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new gi(e,n)),!this._interval)){let e=()=>{this._collectVolumes(),this._interval=window.setTimeout(e,P.voiceParams.interval)};this._interval=window.setTimeout(e,P.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,n){if(n.kind!==j.audio)return;let r=this._detectors.get(e);!r||r.track!==n||(r.destroy(),this._detectors.delete(e))}_collectVolumes(){if(!this._detectors.size)return;let e={};if(this._topology===Y.SERVER){if(this._activeParticipants)for(let t of this._activeParticipants){let n=this._getAudioTrackLevelByParticipantId(t);n&&(e[t]=n)}if(this._removedParticipants){for(let t of this._removedParticipants)e[t]={real:0,smoothed:0};this._removedParticipants=null}}else for(let[t,n]of this._detectors.entries())e[t]=n.getLevel();this._triggerEvent(`VOLUMES_DETECTED`,e)}_getAudioTrackLevelByParticipantId(e){if(this._isTransparentAudioMode())return this._getTransparentAudioLevelByParticipantId(e);let t=this._detectors.get(Br.AUDIO_MIX);return t?t.getLevel():null}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((e,n)=>{if(!n.startsWith(`${Br.TRANSPARENT_AUDIO_TRACK_PREFIX}-`))return;let r=e.getLevel();(!t||r.real>t.real)&&(t=r)}),t}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){this._topology=e,this._destroyDetectors(),e===Y.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology===Y.SERVER&&P.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},io=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),ao=class extends _{constructor(e,t,n){super(),g(this,`_speakerId`,null),g(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===Y.SERVER,this.subscribe(e,no.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this.subscribe(t,Z.SIGNALLED_SPEAKER_CHANGED,this._onServerSpeakerChanged.bind(this)),this.subscribe(t,Z.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,n=null;if(Object.keys(e).forEach(r=>{let i=e[r].smoothed;i>t&&i>P.voiceParams.threshold&&(t=i,n=r)}),n&&n!==this._speakerId){let r=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>r*P.voiceParams.speakerLevelMultiplier&&(this._speakerId=n,this._triggerEvent(`SPEAKER_CHANGED`,n))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent(`SPEAKER_CHANGED`,e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e===Y.SERVER}},oo=class extends _{constructor(e,t,n,r=B,i=null){super(),g(this,`_transport`,void 0),g(this,`_volumes`,{}),g(this,`_participants`,{}),g(this,`_debug`,void 0),g(this,`_logger`,void 0),g(this,`_connectionTimeout`,0),g(this,`_volumeTimeout`,0),this._transport=e,this._participants=n,this._debug=r,this._logger=i,this.subscribe(e,Z.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(t,no.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===J.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===J.FAILED&&this._connectionTimeout&&(this._debug.warn(`Transport failed, send callSpecError`),this._logger?.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){Object.values(this._transport.getStates()).filter(e=>e!==J.CONNECTED).length>0&&(this._debug.warn(`There is not connected transport, send callSpecError`),this._logger?.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let n=`UNKNOWN`,r=this._participants[t];r&&r.platform&&(n=r.platform),e.indexOf(n)<0&&(e.push(n),this._logger?.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&this._debug.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},so=class extends m{constructor(e,t,n){super(),g(this,`_externalLogger`,void 0),g(this,`_api`,void 0),g(this,`_conversationIdProvider`,void 0),g(this,`_batchInterval`,3e3),g(this,`_batchedClientStats`,[]),g(this,`_batchedClientEvents`,[]),g(this,`_batchTimeout`,null),g(this,`_serverTimeDelta`,0),this._api=e,this._externalLogger=t,this._conversationIdProvider=n,this._calculateServerTimeDelta()}log(e,t,n=!1){this._externalLogger&&this._externalLogger.log(e,t,n)}logClientStats(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(n).forEach(e=>{n[e]===void 0&&delete n[e]}),this._batchedClientStats.push(n),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(n),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout()}_getConversationId(){try{return this._conversationIdProvider()}catch{return null}}_sendBatch(){this._stopTimeout();let e=!1;this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}},co=class{constructor(e,t){g(this,`_logger`,void 0),g(this,`_codecUsages`,new Map),g(this,`getCurrentTransportTopology`,void 0),this._logger=e,this.getCurrentTransportTopology=t}reportUsage(e){let t=this.getCurrentTransportTopology();if(!t)return;let n=e.rtps.filter(e=>e.type===`outbound-rtp`&&!e.mid?.endsWith(`s`));P.simulcast&&(n=n.reduce((e,t)=>{if(t.kind!==`video`)return e.concat(t);let n=e.find(e=>e.kind===`video`);return n?n.totalEncodeTime=(n.totalEncodeTime??0)+(t.totalEncodeTime??0):e.push(t),e},[])),n.forEach(e=>{let n=e.kind,r=e.mimeType;if((n===`audio`||n===`video`)&&r){let i=[r,`encoder`,e.encoderImplementation].filter(Boolean).join(`/`);this.saveUsage({kind:n,codecName:i,totalEncodeTime:(e.totalEncodeTime??0)*1e3,audioCodecParams:e.sdpFmtpLine,topology:t})}})}saveUsage({kind:e,codecName:t,totalEncodeTime:n,audioCodecParams:r,topology:i}){let a=this._codecUsages.get(e);if(a&&a.codecName!==t&&this.report(a),a&&a.codecName===t){this._codecUsages.set(e,{...a,totalEncodeTime:n,topology:i});return}this._codecUsages.set(e,{kind:e,codecName:t,audioCodecParams:r,totalEncodeTime:n,topology:i})}report(e){if(e.kind===`video`&&e.totalEncodeTime===0)return;let t={name:H.CODEC_USAGE,codec_implementation:e.codecName,value:e.totalEncodeTime,call_topology:e.topology===Y.DIRECT?`D`:`S`};e.audioCodecParams&&(t.string_value=e.audioCodecParams),this._logger.logClientStats(t)}destroy(){this._codecUsages.forEach(e=>{this.report(e)}),this._codecUsages.clear()}},lo=class{constructor(e){g(this,`_logger`,void 0),g(this,`_eventualLogs`,new Set),this._logger=e}logCallStat(e){if(this._eventualLogs.size){for(let t of this._eventualLogs)Object.assign(t,{call_topology:e.call_topology,local_address:e.local_address,local_connection_type:e.local_connection_type,network_type:e.network_type,remote_address:e.remote_address,remote_connection_type:e.remote_connection_type,transport:e.transport}),this._logger.logClientStats(t);this._eventualLogs.clear()}this._logger.logClientStats(e)}logEventualStat(e){e.value===void 0&&(e.value=W.measureMark(e.name)),e.value!==null&&this._eventualLogs.add(e)}destroy(){this._eventualLogs.clear()}},uo=class{constructor(e){if(g(this,`q`,void 0),g(this,`inits`,[]),g(this,`n`,[1,2,3,4,5]),g(this,`np`,[1,1,1,1,1]),g(this,`qv`,[]),!(e>0&&e<1))throw Error(`q must be in (0,1)`);this.q=e}add(e){if(this.inits.length<5){this.inits.push(e),this.inits.length===5&&this.bootstrap();return}let t=0;if(e<this.qv[0])this.qv[0]=e,t=0;else if(e>=this.qv[4])this.qv[4]=e,t=3;else for(;!(e<this.qv[t+1]);)t++;for(let e=0;e<5;e++)this.n[e]+=e<=t?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let e=1;e<=3;e++){let t=this.np[e]-this.n[e];if(t>=1&&this.n[e+1]-this.n[e]>1||t<=-1&&this.n[e]-this.n[e-1]>1){let n=Math.sign(t),r=this.qv[e]+n/(this.n[e+1]-this.n[e-1])*((this.n[e]-this.n[e-1]+n)*(this.qv[e+1]-this.qv[e])/(this.n[e+1]-this.n[e])+(this.n[e+1]-this.n[e]-n)*(this.qv[e]-this.qv[e-1])/(this.n[e]-this.n[e-1]));r>this.qv[e-1]&&r<this.qv[e+1]?this.qv[e]=r:this.qv[e]=this.qv[e]+n*(this.qv[e+n]-this.qv[e])/(this.n[e+n]-this.n[e]),this.n[e]+=n}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let e=[...this.inits].sort((e,t)=>e-t),t=this.q*(e.length-1),n=Math.floor(t),r=t-n;return n+1<e.length?e[n]*(1-r)+e[n+1]*r:e[n]}return this.qv[2]}bootstrap(){this.inits.sort((e,t)=>e-t),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}},fo=class{constructor(){g(this,`n`,0),g(this,`mean`,0)}add(e){this.n++;let t=e-this.mean;this.mean+=t/this.n}get avg(){return this.n?this.mean:NaN}},po=class{constructor(){g(this,`count`,0),g(this,`minVal`,1/0),g(this,`maxVal`,-1/0),g(this,`mean`,new fo),g(this,`p50`,new uo(.5)),g(this,`p95`,new uo(.95))}add(e){e<this.minVal&&(this.minVal=e),e>this.maxVal&&(this.maxVal=e),this.mean.add(e),this.p50.add(e),this.p95.add(e),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}},mo=class{constructor(e){g(this,`_logger`,void 0),g(this,`trackerByTransport`,{ws:new po,wt:new po}),g(this,`lastSeen`,{}),this._logger=e}mark(e){let t=Date.now(),n=this.lastSeen[e];if(typeof n==`number`){let r=t-n;r>=0&&this.trackerByTransport[e].add(r)}this.lastSeen[e]=t}logMetrics(e){[mr.WEBSOCKET,mr.WEBTRANSPORT].forEach(t=>{if(!this.trackerByTransport[t].hasData)return;let n=this.trackerByTransport[t].snapshot();this._logger.logClientStats({call_topology:e===Y.DIRECT?`D`:`S`,name:H.SIGNALING_PING_SUMMARY,min_value:n.min,max_value:n.max,avg_value:n.avg,median_value:n.median,p95_value:n.p95,values_count:n.count,signaling_transport:t})})}destroy(){this.trackerByTransport={ws:new po,wt:new po},this.lastSeen={}}},ho=class{constructor(e){g(this,`_logger`,void 0),g(this,`trackerByCommand`,new Map),this._logger=e}mark(e,t,n){let r=`${e}|${n}`,i;this.trackerByCommand.has(r)?i=this.trackerByCommand.get(r):(i=new po,this.trackerByCommand.set(r,i)),i.add(t)}logMetrics(e){for(let[t,n]of this.trackerByCommand.entries()){if(!n.hasData)continue;let[r,i]=t.split(`|`),a=n.snapshot();this._logger.logClientStats({call_topology:e===Y.DIRECT?`D`:`S`,name:H.SIGNALING_COMMAND_SUMMARY,api_method:r,min_value:a.min,max_value:a.max,avg_value:a.avg,median_value:a.median,p95_value:a.p95,values_count:a.count,signaling_transport:i})}}destroy(){this.trackerByCommand.clear()}},go=class e{constructor(e,t,n,r){g(this,`logger`,void 0),g(this,`statAggregator`,void 0),g(this,`codecStatsAggregator`,void 0),g(this,`pings`,void 0),g(this,`signalingCommands`,void 0),this.logger=new so(e,t,n),this.statAggregator=new lo(this.logger),this.codecStatsAggregator=new co(this.logger,r),this.pings=new mo(this.logger),this.signalingCommands=new ho(this.logger)}logHangup(t,n){if(![v.HUNGUP,v.CANCELED,v.REJECTED,v.FAILED,v.BUSY,v.MISSED,v.ANOTHER_DEVICE,v.REMOVED,v.BANNED,v.VCHAT_DETAILED_ERROR].includes(t.hangup))return;let r=t.custom_error?.vchat_detailed_api_error?.code;this.logger.logClientStats({name:H.CALL_FINISH,reason:e.correctHangupReason(t.hangup),call_topology:n===Y.DIRECT?`D`:`S`,...r&&{string_value:r}})}flushCallMetrics(e){this.codecStatsAggregator.destroy(),this.pings.logMetrics(e),this.pings.destroy(),this.signalingCommands.logMetrics(e),this.signalingCommands.destroy()}destroy(){this.statAggregator.destroy(),this.codecStatsAggregator.destroy(),this.pings.destroy(),this.signalingCommands.destroy(),this.logger.destroy()}static correctHangupReason(e){switch(e){case v.HUNGUP:return`hangup`;case v.CANCELED:return`canceled`;case v.REJECTED:return`rejected`;case v.BUSY:return`busy`;case v.FAILED:return`failed`;case v.MISSED:return`missed`;case v.ANOTHER_DEVICE:return`another_device`;case v.REMOVED:return`removed`;case v.BANNED:return`banned`;case v.VCHAT_DETAILED_ERROR:return`error`;default:return`hangup`}}},_o=class{constructor(e){g(this,`_statAggregator`,void 0),g(this,`_isCallMarked`,!1),g(this,`_isFinished`,!1),g(this,`_callType`,null),this._statAggregator=e}markAcceptCall(e){this.mark(e===Y.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===Y.DIRECT&&this.mark(`direct_outgoing`)}markParticipantJoined(e){e===Y.DIRECT&&this.mark(`server_change_topology`)}markOnJoin(e){e===Y.SERVER&&this.mark(`server_join_server`)}mark(e){this._isCallMarked||(this._isCallMarked=!0,this._callType=e,W.setMark(H.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&this._statAggregator.logEventualStat({name:H.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},vo=1e3,yo=1e4,bo=15,Q=class e extends _{constructor(e,t){super(),g(this,`_api`,void 0),g(this,`_signaling`,void 0),g(this,`_signalingActor`,void 0),g(this,`_mediaSource`,null),g(this,`_conversation`,null),g(this,`_myLastRequestedLayouts`,{}),g(this,`_state`,`IDLE`),g(this,`_participantState`,q.CALLED),g(this,`_participants`,{}),g(this,`_pendingParticipants`,new Map),g(this,`_transport`,null),g(this,`_debugInfo`,null),g(this,`_debug`,B.createSessionLogger()),g(this,`_volumesDetector`,null),g(this,`_speakerDetector`,null),g(this,`_localVolumeDetector`,null),g(this,`_specListener`,null),g(this,`_activeSpeakerId`,null),g(this,`_lastSignalledActiveSpeakerId`,null),g(this,`_isRealTimeAsrRequested`,!1),g(this,`_serverSettings`,Qr()),g(this,`_serverTimeOffset`,0),g(this,`_onUnload`,void 0),g(this,`_audioOutput`,void 0),g(this,`_stats`,void 0),g(this,`_lastStalled`,{}),g(this,`_audioMixStalled`,!1),g(this,`_audioFix`,null),g(this,`_streamByStreamId`,new Map),g(this,`_streamIdByStreamDescription`,new Map),g(this,`_streamWaitTimerByStreamDescription`,new Map),g(this,`_sequenceNumberByStreamDescription`,new Map),g(this,`_cooldownTimestampByStreamDescription`,new Map),g(this,`_cooldownQueueCleanupTimer`,null),g(this,`_statFirstMediaReceived`,void 0),g(this,`_changeMediaSettings`,N.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(e){if(this._debug.warn(`changeMediaSettings failed with error`,e),e.message===`chatRoom.maxShareCountExceeded`)return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100)),this._stats=new go(e,t,()=>this._conversation?.id||null,()=>this._transport?.getTopology()),this._api=e,this._signaling=new jr(this._debug,this._stats.logger,this._stats.statAggregator,this._stats.pings,this._stats.signalingCommands),this._signalingActor=new vi(this._onSignalingNotification.bind(this),this._debug),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state===`IDLE`?v.CANCELED:v.HUNGUP),P.clientEventsLoggingEnabled&&this._stats.logger.logClientEvent({event_type:H.CALL_DECLINED_OR_HANGED_LOCALLY,reason:`none`},!0)),this._stats.destroy()},window.addEventListener(`pagehide`,this._onUnload),this._statFirstMediaReceived=new _o(this._stats.statAggregator),this._audioOutput=new li(this._statFirstMediaReceived,P.transparentAudio,this._debug,this._stats.logger),P.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),vo))}static current(){return e._current}static hangupAfterInit(){e._activationMutex&&!e._current&&(e._delayedHangup=!0,e._abortController?.abort(new y(v.CANCELED)))}static id(){return e._current?._conversation?.id||null}static debugSessionId(){return e._current?.debugSessionId??null}static getSyncedTime(){return Date.now()+(e._current?._serverTimeOffset??0)}get debugSessionId(){return this._debug.sessionId}async onStart({opponentIds:t,opponentType:n,mediaOptions:r,payload:i=``,joiningAllowed:a=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:l,conversationId:u}){if(e._activationMutex)throw this._stats.logger.log(E.ERROR,`startCall`),this._debug.warn(`Conversation: there is already running activation`),new y(v.FAILED);let d=Date.now();e._activationMutex=!0,this._debug.setConversationId(u??null),e._abortController=new AbortController,this._api.setAbortSignal(e._abortController?.signal),this._signaling.setAbortSignal(e._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(r);let f=this._mediaSource.getMediaSettings();n===Mr.CHAT||t&&t.length>1?this._logWithMediaSettings(E.OUTGOING_MULTIPARTY_CALL,f):this._logWithMediaSettings(E.OUTGOING_CALL,f);let p=await this._startConversation({opponentIds:t,opponentType:n,direction:K.OUTGOING,mediaOptions:r,payload:i,joiningAllowed:a,requireAuthToJoin:o,onlyAdminCanShareMovie:s,externalIds:c,startedTime:d,onFastStart:l,conversationId:u});if(!this._conversation)throw new y(v.UNKNOWN_ERROR);if(this._participantState=q.ACCEPTED,this._changeMediaSettings(f),await this._processConnection(p),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),e._delayedHangup)throw new y(v.CANCELED);return this._debug.debug(`Outgoing call`,{opponentIds:t,opponentType:n,mediaOptions:r}),await this._processConnectionSharedMovieInfo(p),await this._processConversationUrlSharingInfo(p),z.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),z.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants()),await this._onConversationParticipantListChunk(p),await this._processPinnedParticipants(p),z.onLocalStatus(F.WAITING),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),e._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(e){throw this._close(e,`Unable to start conversation`),e}finally{e._activationMutex=!1}}async onJoin(t){if(e._activationMutex)throw this._stats.logger.log(E.ERROR,`joinCall`),this._debug.warn(`Conversation: there is already running activation`),new y(v.FAILED);let n=Date.now();e._activationMutex=!0,this._state=`PROCESSING`,this._debug.setConversationId(t.conversationId??null),e._abortController=new AbortController,this._api.setAbortSignal(e._abortController?.signal),this._signaling.setAbortSignal(e._abortController?.signal);try{let r=!!t.observedIds?.length;if(r&&P.videoTracksCount>0)throw this._debug.error(`Observer mode: please set videoTracksCount=0`),new y(v.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(t.mediaOptions,!r);let i=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.JOIN_CONVERSATION,i);let a=await this._joinConversation(t,n);if(!this._conversation)throw new y(v.UNKNOWN_ERROR);return this._conversation.observer=r,z.onLocalStream(this._mediaSource.getStream(),i),this._conversation.waitForAdmin||this._conversation.waitingHall?(this._debug.log(this._conversation.waitForAdmin?`Wait for admin`:`In waiting hall`),e._current=this,e._activationMutex=!1,this._signaling.readyToSend(),z.onLocalStatus(this._conversation.waitForAdmin?F.WAIT_FOR_ADMIN:F.WAITING_HALL),this._conversation):this._onJoinPart2(a)}catch(t){throw e._activationMutex=!1,this._close(t,`Unable to join conversation`),t}}async _onJoinPart2(t){this._debug.debug(`Join conversation part 2`),e._activationMutex=!0;try{if(this._participantState=q.ACCEPTED,!this._conversation||!this._mediaSource)throw new y(v.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(t),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state===`CLOSE`)return this._conversation;if(e._delayedHangup)throw new y(v.CANCELED);await this._processConnectionSharedMovieInfo(t),await this._processConversationUrlSharingInfo(t),await this._processConnectionAsrInfo(t);let n=await this._extractExternalRoomsData(t.rooms?.rooms,t.rooms?.roomId);z.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),n),await this._onConversationParticipantListChunk(t),await this._processPinnedParticipants(t),z.onLocalStatus(F.WAITING),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),e._current=this;let r=this._extractLocalParticipantFromConnection(t);if(r){let e=N.mapParticipantState(r);Object.keys(e).length>0&&z.onLocalParticipantState(e)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(e){throw this._close(e,`Unable to join conversation`),e}finally{e._activationMutex=!1}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(e=>!!e)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let n={rooms:await this._extractExternalRooms(e)};return t&&(n.roomId=t),n}async onPush(t,n=M.USER,r,i,a){if(e._activationMutex)throw this._debug.warn(`Conversation: there is already running activation`),new y(v.REJECTED);this._debug.setConversationId(t),e._activationMutex=!0,e._abortController=new AbortController,this._api.setAbortSignal(e._abortController?.signal),this._signaling.setAbortSignal(e._abortController?.signal);try{let o=Date.now(),s=await this._prepareConversation(t,n,r,i,a);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new y(v.UNKNOWN_ERROR);if(!s.conversation.participants.find(e=>e.state===q.CALLED&&e.id===this._conversation?.userId))throw this._debug.log(`Push rejected (there is an active call)`),this._stats.logger.log(E.PUSH,`rejected`),new y(v.REJECTED);if(await this._processConnection(s),this._extractConnectionUrlSharingInfo(s),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(s),this._signaling.readyToSend(),this._logCallStartEvent(o,K.INCOMING),this._stats.logger.log(E.PUSH,`accepted`),e._current=this,e._delayedHangup)throw new y(v.CANCELED);e._activationMutex=!1}catch(t){throw e._activationMutex=!1,this._close(t,`Unable to handle inbound call push`),t}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(Fr.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(Fr.WAIT_FOR_ADMIN),n=e.conversation.options.includes(Fr.ADMIN_IS_HERE);return!t||t&&n?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(t=>N.comparePeerId(t.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(Fr.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new y(v.UNKNOWN_ERROR);this._state=`PROCESSING`;let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.ACCEPT_CONCURRENT,e),this._debug.debug(`Concurrent call`,{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.getMediaSettings()),z.onCallAccepted(),this._state=`ACTIVE`,this._participantState=q.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(e){this._close(e,`Unable to accept concurrent call`)}}async _getMainRoomParticipants(){let e=await this._getParticipants();return N.mapSharedParticipants(Object.values(e).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,n]=e.split(`:`),r=parseInt(t,10);if(isNaN(r))throw Error(`Invalid original length in prefix`);let i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);try{let e=si(a,r).reduce((e,t)=>(e+=String.fromCharCode(t),e),``),{srcp:t,stne:n,tkn:i,trne:o,trnp:s,trnu:c,wse:l,wte:u}=JSON.parse(e);return{token:i,endpoint:l,wt_endpoint:u,turn_server:{urls:o.split(`,`),username:c,credential:s},stun_server:{urls:n.split(`,`)},client_type:t}}catch(e){throw this._close(e,`Can't decompress conversation params`),e}}_logCallStartEvent(e,t){let n={[K.OUTGOING]:`outgoing`,[K.INCOMING]:`incoming`,[K.JOINING]:`join`};this._stats.statAggregator.logEventualStat({name:H.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[n[t],`warmup_start`]})})}async accept(e){if(this._state!==`IDLE`)throw this._stats.logger.log(E.ERROR,`acceptIncoming`),this._debug.error(`Unable to accept a call - invalid state`),Error(`Unable to accept a call - invalid state`);if(!this._mediaSource||!this._conversation||!this._transport)throw new y(v.UNKNOWN_ERROR);this._state=`PROCESSING`,this._debug.setConversationId(this._conversation.id),this._debug.debug(`Accept incoming call`,e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=q.ACCEPTED;let n=this._getMuteStatesForCurrentRoom(),r=Object.keys(n);r.length&&this._onMuteParticipant({muteStates:n,mediaOptions:r,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let i=await this._signaling.getRooms(this._isCallAdmin());if(i.rooms?.rooms){let e=await this._getParticipants();i.rooms.rooms.forEach(t=>{t.participantIds?.forEach(t=>{e[t]&&(e[t].isInRoom=!0)})})}this._conversation.roomId=i.rooms?.roomId||null;let a=await this._extractExternalRoomsData(i.rooms?.rooms,i.rooms?.roomId);if(z.onCallAccepted(),z.onLocalStream(this._mediaSource.getStream(),t),z.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),a),P.useParticipantListChunk){let e=await this._getInitialParticiapntListChunk(),t=await this._getParticipants();e?.participants?.forEach(e=>{let n=t[N.composeId(e)];n&&(n.movieShareInfos=e.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:e})}return z.onLocalStatus(F.WAITING),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0),await this._processConversationUrlSharingInfo(),await this._processConnectionAsrInfo(),this._conversation}catch(e){throw this._close(e,`Unable to accept call`),e}}async decline(){if(this._state!==`IDLE`)throw this._stats.logger.log(E.ERROR,`declineIncoming`),this._debug.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);this._state=`PROCESSING`,this._debug.debug(`Decline incoming call`),this._logWithMediaSettings(E.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=q.HUNGUP,this._signaling.ready&&await this._signaling.hangup(v.REJECTED),this._close(new y(v.REJECTED))}async hangup(){this._debug.debug(`Hangup`);let e=this._state===`ACTIVE`?v.HUNGUP:v.CANCELED;this._stats.logger.log(E.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new y(e))):z.onHangup(new y(v.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new y(v.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipant(e.map(X.toSignaling),t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:v.UNKNOWN_ERROR);let i=n.participants;if(!i&&n.rejectedParticipants)throw Error(n.rejectedParticipants[0].reason);for(let e of i)await this._onAddParticipant(N.composeId(e),e,r)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new y(v.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipantLegacy(e,t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:v.UNKNOWN_ERROR);let i=n.participants;for(let e of i)await this._onAddParticipant(N.composeId(e),e,r)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let n=[];for(let r of e)(r.state===q.CALLED||r.state===q.ACCEPTED)&&(this._transport.isAllocated(r.id)||this._transport.allocate(r.id,t)),r.state===q.ACCEPTED&&n.push(r.id);n.length?this._transport.open(n,null,!!this._conversation?.observer):this._transport.getTopology()===Y.SERVER&&this._forceOpenTransportForAloneInCall()}async _close(t,n){n&&this._debug.error(n,t),this._debug.debug(`Close conversation`,t),this._stats.logHangup(t,this._transport?.getTopology()),this._stats.flushCallMetrics(this._transport?.getTopology()),this._signaling.readyToSend(!1),t.error?this._signaling.ready&&this._signaling.hangup(v.FAILED):this._stats.logger.log(E.ERROR,t.hangup),e._activationMutex=!1;let r=this._conversation&&this._conversation.id;if([v.CANCELED,v.NOT_FRIENDS,v.CALLEE_IS_OFFLINE,v.CALLER_IS_BLOCKED,v.CALLER_IS_REJECTED].indexOf(t.hangup)!==-1||t.hangup===v.REJECTED&&!t.remote){z.onHangup(t,r),this.destroy();return}if(t.hangup===v.HUNGUP&&(!t.remote||this._isCalledState())){z.onHangup(t,r),this.destroy();return}if(t.hangup===v.MISSED&&!t.remote){z.onHangup(t,r),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(t.hangup===v.SOCKET_CLOSED||t.hangup===v.NOT_FOUND)&&e._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(t.hangup===v.BUSY&&!t.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state=`CLOSE`,this._participantState=q.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),this._stats.destroy(),this._conversation=null,this._myLastRequestedLayouts={},e._current=null,e._delayedHangup=!1,e._abortController=null,z.onHangup(t||new y(v.UNKNOWN_ERROR),r)}async destroy(){let t=this._conversation&&this._conversation.id;if(this._debug.debug(`Destroy conversation`,{conversationId:t}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state=`CLOSE`,this._participantState=q.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),e._delayedHangup&&t)try{this._api.hangupConversation(t,v.CANCELED)}catch{}this._cleanupListeners(),this._stats.destroy(),this._conversation=null,this._myLastRequestedLayouts={},e._current=null,e._delayedHangup=!1,e._abortController=null}async _getConversationParams(e){let t=await this._api.getConversationParams(e);this._debug.debug(`Api.getConversationParams`,t);let n=[],{turn_server:r,stun_server:i}=t;if(i&&n.push(i),r&&r.urls){let e=r.urls.filter((e,t,n)=>n.indexOf(e)===t);e.push(`${e[e.length-1]}?transport=tcp`),n.push({urls:e,username:r.username,credential:r.credential})}return P.iceServers=n,P.wssBase=t.endpoint,t.wt_endpoint&&(P.wtsBase=t.wt_endpoint),P.wssToken=t.token,t.client_type&&(P.clientType=t.client_type),t.external_user_type&&(P.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:n,wt_endpoint:r,token:i,client_type:a}){let o=[];if(t&&o.push(t),e&&e.urls){let t=e.urls.filter((e,t,n)=>n.indexOf(e)===t);t.push(`${t[t.length-1]}?transport=tcp`),o.push({urls:t,username:e.username,credential:e.credential})}P.iceServers=o,P.wssBase=n,P.wssToken=i,r&&(P.wtsBase=r),a&&(P.clientType=a)}_addGeoParamsToEndpoint(e,t){return t.isp_as_no&&(e+=`&ispAsNo=${t.isp_as_no}`),t.isp_as_org&&(e+=`&ispAsOrg=${t.isp_as_org}`),t.loc_cc&&(e+=`&locCc=${t.loc_cc}`),t.loc_reg&&(e+=`&locReg=${t.loc_reg}`),e}async _startConversation({opponentIds:t,opponentType:n,direction:r,mediaOptions:i,payload:a=``,joiningAllowed:o=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:c,externalIds:l,startedTime:u,onFastStart:d,conversationId:f}){W.setMark(H.SIGNALING_CONNECTED);let p=f??N.uuid();this._debug.debug(`Conversation: start`,{conversationId:p,opponentIds:t,opponentType:n,direction:r});let m=i.includes(T.VIDEO),h;if(d){let t={deviceId:this._api.deviceId(),sdkVersion:P.sdkVersion,clientAppKey:P.apiKey,platform:P.platform,protocolVersion:P.protocolVersion,domainId:P.domain,capabilities:vr.getFlags()},r=JSON.stringify(t),a;try{if(a=await d({internalParams:r,conversationId:p,externalIds:l,opponentType:n,mediaOptions:i,isVideo:m,joiningAllowed:o,requireAuthToJoin:s},e._abortController?.signal),!a.internalCallerParams)throw new y(v.FAST_START_ERROR,{message:JSON.stringify(a)})}catch(t){throw e._delayedHangup&&e._abortController?.signal.aborted?new y(v.CANCELED):t instanceof y?t:t instanceof Error?new y(v.FAST_START_ERROR,{message:t.message}):new y(v.FAST_START_ERROR,{message:String(t)})}try{let e=JSON.parse(a.internalCallerParams);h={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:p,is_concurrent:e.isConcurrent,client_type:e.clientType,rejected_participants:a.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastStart`,h)}catch{throw new y(v.FAST_START_ERROR,{message:`Cannot parse internal params`})}}else h=await this._api.startConversation(p,t,n,m,a,o,s,{onlyAdminCanShareMovie:c},l),this._debug.debug(`Api.startConversation`,h);this._setConversationParams(h);let ee=await this._connectSignaling(fr.START,h);return await this._setConversation(h,ee,r),this._logCallStartEvent(u,K.OUTGOING),ee}async _joinConversation(t,n){W.setMark(H.SIGNALING_CONNECTED);let{conversationId:r,mediaOptions:i,chatId:a,joinLink:o,observedIds:s,payload:c,onFastJoin:l}=t;this._debug.debug(`Conversation: join`,{conversationId:r,joinLink:o,observedIds:s});let u=i.includes(T.VIDEO),d;if(l){if(!o)throw new y(v.FAST_JOIN_ERROR,{message:`joinLink is required for fast join`});let t={deviceId:this._api.deviceId(),sdkVersion:P.sdkVersion,clientAppKey:P.apiKey,platform:P.platform,protocolVersion:P.protocolVersion,domainId:P.domain,capabilities:vr.getFlags()},n=JSON.stringify(t),r;try{if(r=await l({joinLink:o,isVideo:u,internalParams:n},e._abortController?.signal),!r.internalCallerParams||!r.conversationId)throw new y(v.FAST_JOIN_ERROR,{message:JSON.stringify(r)})}catch(t){throw e._delayedHangup&&e._abortController?.signal.aborted?new y(v.CANCELED):t instanceof y?t:t instanceof Error?new y(v.FAST_JOIN_ERROR,{message:t.message}):new y(v.FAST_JOIN_ERROR,{message:String(t)})}try{let e=JSON.parse(r.internalCallerParams);d={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:r.conversationId,is_concurrent:e.isConcurrent,client_type:e.clientType,stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},this._debug.debug(`FastJoin`,d)}catch{throw new y(v.FAST_JOIN_ERROR,{message:`Cannot parse internal params`})}}else if(r)d=await this._api.joinConversation(r,u,a);else if(o)d=await this._api.joinConversationByLink(o,u,s,c);else throw new y(v.UNKNOWN_ERROR);this._debug.debug(`Api.joinConversation`,d),this._setConversationParams(d);let f=await this._connectSignaling(fr.JOIN,d);return await this._setConversation(d,f,K.JOINING),this._logCallStartEvent(n,K.JOINING),f}async _prepareConversation(t,n=M.USER,r,i,a){W.setMark(H.SIGNALING_CONNECTED),this._debug.debug(`Conversation: push`,{conversationId:t,type:n,peerId:r});let o=this._api.getUserId();if(!o)throw new y(v.UNKNOWN_ERROR);let s=0,c=``,l=``,u={id:t,peerId:r,endpoint:c,wt_endpoint:l,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:``};if(i){let e=this._decodeExternalConversationParams(i);this._setConversationParams(e),c=a??`${P.wssBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,u.token=e.token,u.endpoint=c,P.wtsBase&&(l=`${P.wtsBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,u.wt_endpoint=l)}else{let e=await this._getConversationParams(t);s=e.device_idx||0,c=a??`${P.wssBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,c=this._addGeoParamsToEndpoint(c,e),u.token=e.token,u.endpoint=c,u.device_idx=s,P.wtsBase&&(l=`${P.wtsBase}?userId=${o}&entityType=${n}&deviceIdx=${s}&conversationId=${t}&token=${P.wssToken}`,l=this._addGeoParamsToEndpoint(l,e),u.wt_endpoint=l)}let d=await this._connectSignaling(fr.ACCEPT,u);return e._current&&(e._current._participantState===q.ACCEPTED||e._current._participantState===q.CALLED)?(this._debug.log(`Push rejected (busy)`),this._stats.logger.log(E.PUSH,`busy`),this._signaling.ready&&this._signaling.hangup(v.BUSY),Promise.reject(new y(v.BUSY))):(e._current&&(e._current.destroy(),e._current=null),await this._setConversation(u,d,K.INCOMING,n),d)}async _createParticipant(e,t){let n=Object.assign({id:null,externalId:null,mediaSettings:A(),participantState:{},state:q.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return n.externalId||(n.externalId=await this._getParticipantId(t??n.id)),this._api.cacheExternalId(t??n.id,n.externalId),t&&this._api.mapDecorativeId(t,n.id),n.observedIds?.length&&(n.externalId.observer=!0),e.markers&&(n.markers=this._denormalizeMarkers(n.id,e.markers)),n}async _getParticipantId(e){try{return await this._api.userId(e)}catch(e){throw this._close(new y(v.NETWORK_ERROR),e),e}}async _setConversation(e,t,n,r=M.USER){let{participants:i}=t.conversation;t.conversationParams?.serverTime&&(this._serverTimeOffset=t.conversationParams.serverTime-Date.now()),i.forEach(e=>{let t=N.composeId(e),n=X.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=N.composeDecorativeId(e),i=X.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(e.decorativeUserId,e.id))}});let a=this._api.getUserId(),o=this._extractLocalParticipantFromConnection(t),s=e.device_idx||0;if(!a){if(!o)throw new y(v.UNKNOWN_ERROR);a=Number(o.id),o.idType&&(r=o.idType),o.deviceIdx&&(s=o.deviceIdx),this._api.setUserId(a)}let c=N.composeParticipantId(a,r,s);this._conversation={userId:a,compositeUserId:c,externalId:await this._getExternalIdByParticipantId(c),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||Y.DIRECT,direction:n,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:o?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},this._debug.setConversationId(t.conversation.id||e.id),this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(P.forceRelayPolicy=e.p2p_forbidden),this._stats.logger.log(E.RELAY_POLICY,P.forceRelayPolicy?`1`:`0`),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new y(v.UNKNOWN_ERROR);this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||Y.DIRECT,this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1}_createMediaSource(){let e=new Xt(this._debug,this._stats.logger);return this.subscribe(e,Jt.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,Jt.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new ci(e,this._debug,this._stats.logger),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,pr.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,pr.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,pr.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return this._stats.statAggregator.logEventualStat({name:H.SIGNALING_CONNECTED}),n}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(Nr.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&z.onConversationParticipantListChunk(await this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{participants:[],countBefore:0,countAfter:0,markerFound:!1,...e}}async _participantListChunkToExternalChunk(e){let t=await this._getParticipants(),n=N.mapSharedParticipants(e.participants.reduce((e,n)=>{let r=N.composeId(n);return t[r]&&e.push(t[r]),e},[]));return{...e,participants:n}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let e of t)await this._registerParticipants(e?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let n=e[0]?.externalId?.type;n&&(P.externalUserType=n);let r=await this._getParticipants();for(let n of e){let e=N.composeId(n);if(B.test(`Conversation:RegisterParticipant`,e),this._isMe(e)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(this._debug.debug(`Local roles changed: ${n.roles}`),z.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(n);continue}if(n.state===q.HUNGUP||n.state===q.REJECTED){r[n.id]&&await this._removeParticipant(r[n.id],v.HUNGUP);continue}let i=N.composeDecorativeId(n);this._registerParticipant({id:e,externalId:X.fromSignalingParticipant(n),mediaSettings:A(n.mediaSettings),participantState:N.mapParticipantState(n),state:n.state,roles:n.roles||[],status:F.WAITING,muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(e,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},i);let a=await this._getParticipant(e);a&&n.roles&&n.roles.length&&(this._debug.debug(`Roles for participant [${e}] changed: ${n.roles}`),z.onRolesChanged(a.externalId,n.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let n=async()=>{let n=ti(e,Rr.MUTE),r=ti(e,Rr.MUTE_PERMANENT);for(let i of[n,r])i.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:i,stateUpdated:!0})};N.setImmediate(()=>n().catch(e=>this._debug.error(e)))}_getStatusByTransportState(e){let t=null;return e===J.CONNECTED?t=F.CONNECTED:e===J.CONNECTING||e===J.OPENED?t=F.CONNECTING:e===J.RECONNECTING&&(t=F.RECONNECT),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let t=(await this._getParticipants())[e];if(t)return t;let n=this._api.getDecorativeIdByInitialId(N.decomposeId(e).id),r=n?N.composeUserId(n):void 0;return this._createParticipant({id:e},r)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(P.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let t=await this._getParticipantId(e);return this._api.cacheExternalId(e,t),t}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(P.useParticipantListChunk){let n=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return n.markers=this._denormalizeMarkers(n.id,t),n}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){this._debug.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let n=Object.values(t).find(e=>`ts`in e&&`rank`in e);return Object.entries(t).reduce((t,[r,i])=>(t[r]={...n,...i,id:e},t),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let n=ni(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=oi(e,r));let i=Object.keys(r),a=this._conversation?.roomId;i.length&&this._onMuteParticipant({muteStates:r,mediaOptions:i,muteAll:!0,stateUpdated:!0,roomId:a},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}async _processPinnedParticipants(e){e.conversation.pinnedParticipantId?await this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?await this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}async _allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new to(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings,this._debug,this._stats.logger,this._stats.statAggregator,this._stats.codecStatsAggregator),this._debugInfo=new fi(this._debug),this.subscribe(this._transport,Z.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,Z.LOCAL_STATE_CHANGED,this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,Z.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,Z.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,Z.AUDIO_MIX_STALL,this._onAudioMixStall.bind(this)),this.subscribe(this._transport,Z.REMOTE_DATA_STATS,this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,Z.SIGNALLED_STALLED_PARTICIPANTS,this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,Z.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this)),this.subscribe(this._transport,Z.NETWORK_STATUS,this._onNetworkStatus.bind(this)),this.subscribe(this._transport,Z.REMOTE_STREAM_SECOND,this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,Z.PEER_CONNECTION_CLOSED,this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,Z.ASR_TRANSCRIPTION,this._onAsrTranscription.bind(this)),this.subscribe(this._transport,Z.ANIMOJI_STREAM,this._onAnimojiStream.bind(this)),this.subscribe(this._transport,Z.ANIMOJI_ERROR,this._onAnimojiError.bind(this));let e=this._conversation.direction===K.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let n of Object.values(t))(n.state===q.ACCEPTED||n.state===q.CALLED)&&this._transport.allocate(n.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new ro(this._transport),this.subscribe(this._volumesDetector,no.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new ao(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,io.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new _i(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new oo(this._transport,this._volumesDetector,await this._getParticipants(),this._debug,this._stats.logger))}_logDevices(){let e=k.getCameras().length,t=k.getMicrophones().length;this._debug.debug(`Cameras: `+e+(k.hasCameraPermission()?`✔`:`✖`)+`, Microphones: `+t+(k.hasMicrophonePermission()?`✔`:`✖`)),this._stats.logger.log(E.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){this._stats.logger.log(e,[t?.isAudioEnabled&&`audio`,t?.isVideoEnabled&&`video`].filter(Boolean).join(`_`))}async _removeParticipant(e,t){if(e.state===q.CALLED||e.state===q.ACCEPTED||this._state===`CLOSE`)return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let n=await this._getParticipants();if(n[e.id]){t===v.HUNGUP?this._setParticipantsStatus([e],F.HANGUP):this._setParticipantsStatus([e],F.ERROR,t),e.mediaSource?.disconnect(),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[t,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(t),this._sequenceNumberByStreamDescription.delete(t),this._cooldownTimestampByStreamDescription.delete(t),this._streamWaitTimerByStreamDescription.has(t)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(t)),this._streamWaitTimerByStreamDescription.delete(t)),this._sendUpdateDisplayLayout({[t]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete n[e.id],z.onRemoteRemoved(e.externalId,e.markers)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener(`pagehide`,this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(e=>e.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(e=>e.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){this._debug.debug(`cleaning up participant-agnostic streams`),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(e=>{e.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_cleanupSignaling(){this._signaling.close(),this._signaling.cleanup()}async _onAddParticipant(e,t,n){this._debug.debug(`Add new participant [${e}]`);let r=await this._getParticipant(e);if(r&&(r.state===q.ACCEPTED||r.state===q.CALLED)){this._debug.warn(`Participant [${r.id}:${r.state}] is already in conversation`);return}if(!r){let n=N.composeDecorativeId(t);this._registerParticipant({id:e,externalId:X.fromSignalingParticipant(t),mediaSettings:A(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},n),r=await this._getParticipant(e)}this._setParticipantsStatus([r],F.WAITING),n?(r.state=q.HUNGUP,await this._removeParticipant(r,n)):this._transport&&(r.state=q.CALLED,this._transport.allocate(r.id,!0),this._stats.logger.log(E.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}async _onRemoveParticipant(e){this._debug.debug(`Remove participant [${e}]`);let t=[],n=await this._getParticipants();for(let r=0;r<=bo;r++){let i=n[N.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let e of t)this._transport.close(e.id);this._stats.logger.log(E.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(w.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(w.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(w.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,n=null){if(!this._transport||!this._conversation)return;let r=!t,i=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let t=n??this._conversation.externalId.id;this._transport.setAnimojiSvg(i,{svg:e,userId:t,isMe:r});return}this._transport.setAnimojiSvg(i,{svg:e,isMe:r})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return this._stats.logger.log(E.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return this._stats.logger.log(E.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},n={};for(let t of e){let e=typeof t.uid==`object`?t.uid:X.fromId(t.uid),r=X.toString(e);n[r]=t.priority}let r=await this._getParticipants();for(let e of Object.values(r)){let r=X.toString(e.externalId);Object.hasOwn(n,r)&&(t[e.id]=n[r])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[t,n]of Object.entries(e))if(t.length>5||n.length>5)throw Error(`key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded`);t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async hold(e){await this._signaling.hold(e)}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[En(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready)return;this._debug.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},n=await this._getParticipants();for(let r of e){let e=typeof r.uid==`object`?r.uid:X.fromId(r.uid),i=this._api.getCachedOkIdByExternalId(e);if(!i){let t=X.toString(e);this._debug.log(`Unknown participant external ID ${t}`);continue}let a=En({participantId:i,mediaType:r.mediaType,streamName:r.streamName}),o=n[i];o?o.lastRequestedLayouts[a]=r:this._isMe(i)&&(this._myLastRequestedLayouts[a]=r),xn(r)?(this._isMe(i)&&delete this._myLastRequestedLayouts[a],this._streamIdByStreamDescription.has(a)&&!this._cooldownTimestampByStreamDescription.has(a)&&this._cooldownTimestampByStreamDescription.set(a,Date.now())):(this._cooldownTimestampByStreamDescription.delete(a),!this._streamIdByStreamDescription.has(a)&&P.videoTracksCount>0&&this._streamIdByStreamDescription.set(a,null),t[a]=r),r.mediaType===V.SCREEN&&!xn(r)&&W.setMark(W.getMarkNameScreenshareFirstFrame(i))}let r=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>P.videoTracksCount;){let e=r.next();if(e.done){this._debug.error(`Cannot accommodate all streaming requests: tracks available `+P.videoTracksCount+`; requested streams: `+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(e.value),t[e.value]={stopStream:!0}}this._transport?.getTopology()===Y.SERVER&&await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,n){if(this._conversation&&P.clientEventsLoggingEnabled){let r={event_type:H.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(r.reason=t),n!==void 0&&(r.group_call_users_count=n),this._stats.logger.logClientEvent(r,!0)}}sendClientEvent(e,t={},n=!1){let r={event_type:e,...t};this._stats.logger.logClientEvent(r,n)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(this._debug.log(`Client asked to stop streaming before stream became available`,e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let t=await this._getParticipants(),n=Dn(e),r=t[n.participantId],i=this._conversation?.externalId,a=this._isMe(n.participantId);if(r||a){switch(n.mediaType){case V.STREAM:case V.MOVIE:if(n.streamName){let e={stream:null,streamName:n.streamName,mediaType:n.mediaType};a?z.onLocalLive(i,e):z.onRemoteLive(r.externalId,e)}break;case V.CAMERA:z.onRemoteStream(r.externalId,null);break;case V.SCREEN:z.onRemoteScreenStream(r.externalId,null);break}this._stats.logger.log(E.PAT_DEALLOCATED)}else this._debug.log(`Cannot find participant to stop streaming: ${n.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;this._debug.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let n;try{if(n=await this._signaling.updateDisplayLayout(e),!n)return}catch(n){if(this._debug.warn(`Failed to update display layout ${JSON.stringify(e)}. ${n}`),t)throw n;return}let r=[],i=await this._getParticipants();for(let[e,t]of Object.entries(n.errorCodeByParticipantId||{})){let n=Dn(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=Hr(t):(this._debug.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=Vr.UNKNOWN_ERROR),r.push({externalId:a.externalId,errorReason:e})}}if(r&&r.length&&(this._debug.warn(`Could not allocate one or more participants`,r),t))throw new xo(`Could not allocate one or more participants`,r)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let n=t.next();if(n.done)break;let r=n.value;if(r[1]+yo>Date.now())break;let i=r[0];await this._stopStreaming(i),e[i]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;this._debug.log(`Received participant sources update notification`,t);for(let e of t)this._waitForStreamIfNeeded(e)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(this._debug.log(`Promoted in audience mode`,!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(this._debug.log(`Promoted in waiting hall`,!e.demote),e.demote?(this._debug.log(`Kicked from waiting hall`),this._close(new y(v.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),z.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,n=[],r,i){this._debug.log(`Chat room updated: ${e}`);let a=[],o=[],s=[],c=[],l=[];if(n.length&&n.forEach(e=>{if(e.externalId){let t=X.fromSignaling(e.externalId);l.push(t),this._api.cacheExternalId(e.id.id,t)}else{let t=N.decomposeId(e.id.id).id;a.push(t),c.push(t)}}),r?.length&&r.forEach(e=>{let t=N.decomposeId(e).id;a.push(t),o.push(t)}),i?.length&&i.forEach(e=>{let t=N.decomposeId(e).id;a.push(t),s.push(t)}),!a.length){z.onChatRoomUpdated(e,t,l,[],[]);return}if(c.length){let e=await this._api.getExternalIdsByOkIds(c);l.push(...e)}let u=await this._api.getExternalIdsByOkIds(o),d=await this._api.getExternalIdsByOkIds(s);z.onChatRoomUpdated(e,t,l,u,d)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let n of e.data)if(this._isMe(n.participantId))z.onLocalLiveUpdate(t,n);else{let e=await this._getExternalIdByParticipantId(n.participantId);e&&z.onRemoteLiveUpdate(e,n)}}async _onSharedMovieInfoStarted(e){this._debug.log(`Shared movie started data received: ${e.notification}`),await this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}async _processSharedMovieInfos(e,t=null){e&&await Promise.all(e.map(e=>this._processSharedMovieInfo(e,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let n=this._conversation?.externalId;if(this._isMe(e.initiatorId))z.onLocalSharedMovieInfo(n,e,t);else{let n=await this._getExternalIdByParticipantId(e.initiatorId);n&&z.onRemoteSharedMovieInfo(n,e,t)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(e=>this._isMe(N.composeId(e)));await this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}async _processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let t of e.rooms.rooms)t.asrInfo&&this._conversation?.asrInfoByRoom.set(t.id,t.asrInfo);let n=e?.rooms?.roomId??this._conversation?.roomId??null,r=this._conversation?.asrInfoByRoom.get(n);if(r){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&z.onAsrSet({externalId:e,movieId:r.movieId},n)}else n&&z.onAsrSet(null,n)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,n=this._conversation.roomId,r=t.get(n);if(r&&!this._isMe(r.initiatorId)){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&z.onRemoteSharedUrl(e,r.sharedUrl,n)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let n of e.rooms.rooms)n.urlSharingInfo?t.set(n.id,n.urlSharingInfo):t.delete(n.id)}async _onSharedMovieInfoStopped(e){this._debug.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:n,movieId:r,source:i,roomId:a=null}=e,o={initiatorId:n,movieId:r,source:i};if(this._isMe(n))z.onLocalSharedMovieStoppedInfo(t,o,a);else{let e=await this._getExternalIdByParticipantId(n);if(e){let t=(await this._getParticipants())[n];t?.movieShareInfos&&(t.movieShareInfos=t.movieShareInfos.filter(e=>e&&e.movieId!==r)),z.onRemoteSharedMovieStoppedInfo(e,o,a)}}}async _onUrlSharingInfoUpdated(e){if(this._debug.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:n}=this._conversation,{initiatorId:r,sharedUrl:i,roomId:a=null}=e;if(i?t.set(a,{sharedUrl:i,initiatorId:r}):t.delete(a),!(!i&&a!==n&&t.has(n))&&(!i||!this._isMe(r))){let e=await this._getExternalIdByParticipantId(r);e&&z.onRemoteSharedUrl(e,i,a)}}_onFeaturesPerRoleChanged(e){this._debug.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),z.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let t=this._getStreamDescriptionById(e.streamId);if(t){let e=Dn(t),n=await this._getParticipant(e.participantId);z.onRemoteScreenStream(n.externalId,null);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:n,participantId:r}=t;if(n===V.ANIMOJI)return;let i=await this._getParticipant(r);if(n===V.SCREEN&&!e.fastScreenShare){this._debug.log(`skipping participant-sources-update notification since screenshare will be received over datachannel`);return}let a=En(t),o=this._sequenceNumberByStreamDescription.get(a);if(o&&o>e.sequenceNumber){this._debug.warn(`Participant ${r} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${o}`),this._stats.logger.log(E.PAT_OUTDATED_RESPONSE);return}i&&e.suspend!==void 0&&n&&(this._debug.debug(`participant-sources-update: mediaType=${n}, suspend=${e.suspend}`),z.onRemoteStreamSuspended(i.externalId,n,e.suspend));let s=e.streamId,c=e.rtpTimestamp?this._getWaitingTime(s,e.rtpTimestamp):0;if(c<=0){this._streamWaitTimerByStreamDescription.delete(a);let t=this._conversation?.externalId,n=this._isMe(r);if(!i&&!n){this._stats.logger.log(E.PAT_ERROR,`participantMissing`),this._debug.error(`Could not find participant by ID: ${r}`);return}let o=n?t:i.externalId,c=this._streamByStreamId.get(s);if(!c){this._stats.logger.log(E.PAT_ERROR,`streamNotFound`),this._debug.error(`Could not find stream by ID: ${s}`);return}this._stats.logger.log(E.PAT_ALLOCATED),this._streamIdByStreamDescription.set(a,s);let l=e.participantStreamDescription?.mediaType;if(l===V.STREAM||l===V.MOVIE){if(e.participantStreamDescription?.streamName){let t={streamName:e.participantStreamDescription.streamName,stream:c,mediaType:l};n?z.onLocalLive(o,t):z.onRemoteLive(o,t)}}else l===V.SCREEN?z.onRemoteScreenStream(i.externalId,c):n||z.onRemoteStream(i.externalId,c)}else{this._debug.debug(`Waiting for ${c} until stream ${s} for ${a} is switched`);let t=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),c);this._streamWaitTimerByStreamDescription.set(a,t)}}_getStreamDescriptionById(e){for(let[t,n]of this._streamIdByStreamDescription.entries())if(n===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(En(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(En(e)))return e}else{let e={participantId:t,mediaType:V.CAMERA};if(this._streamIdByStreamDescription.has(En(e)))return e;let n={participantId:t,mediaType:V.SCREEN};if(this._streamIdByStreamDescription.has(En(n)))return n}return this._debug.error(`Received unrequested allocation`,e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw Error(`transport is not initialized`)}_isCallAdmin(){return this._conversation?N.includesOneOf(this._conversation.roles,[Ur.ADMIN,Ur.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!N.includesOneOf(this._conversation.roles,[Ur.ADMIN,Ur.CREATOR]))throw Error(`You don't have the required permission`)}_isCalledState(){return this._participantState===q.CALLED}async grantRoles(e,t,n){this._checkAdminRole(),await this._signaling.grantRoles(e,t,n)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,n=[],r=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,n,r)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,n=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,n),this._conversation?.pinnedParticipantIdByRoom.set(n,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===Y.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===Y.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Lr(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=ei(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=e?N.composeUserId(e):r.id}let i=await this._signaling.getWaitingHall(r,t,n);if(i.error)return Promise.reject(i.message);let a=i.participants||[],{externalIds:o}=await this._resolveWaitingHallExternalIds(a),s=null;return a.length&&i.hasMore&&(s=$r(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,n=[],r=[];if(e.length){let i=[];e.forEach(e=>{if(t.set(e.id.id,e.id.addedTs),e.externalId){let t=X.fromSignaling(e.externalId);n.push(e.id.addedTs),r.push(t),this._api.cacheExternalId(e.id.id,t)}else i.push(N.decomposeId(e.id.id).id)}),i.length&&!r.length&&(r=await this._api.getExternalIdsByOkIds(i),n=r.map(e=>{let n=this._api.getCachedOkIdByExternalId(e);return(n?t.get(n):void 0)||Date.now()}))}return{externalIds:r,timestamps:n}}async getAudienceModeHands(){if(!this._signaling.ready)throw Error(`Signaling is not ready`);let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:n,timestamps:r}=await this._resolveWaitingHallExternalIds(t);return{timestamps:r,participants:n,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!N.includesOneOf(this._conversation.options,[Fr.WAITING_HALL,Fr.AUDIENCE_MODE]))throw Error(`Unable to promote a participant in the conversation with current options`);if(this._checkAdminRole(),!e&&t)throw Error(`participantId is required`);await this._signaling.promoteParticipant(e,t)}catch(t){throw this._debug.warn(`Failed to promote participant ${e}. ${t}`),t}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let e=t.messages.length-1;e>=0;e--){let n=t.messages[e];await this._onChatMessage(n)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let e=(await this._api.createJoinLink(this._conversation.id)).join_link;if(e)return this._conversation.joinLink=e,e}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:n,lang:r}){let i={movieId:e,lang:r};(t||t===0)&&(i.gain=t),n&&(i.metadata=n);let a=await this._signaling.addMovie(i);if(a.error)throw Error(a.error);return{movieId:a.movieId,streamType:a.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw Error(t.error)}async removeMovie(e){let t={movieId:e},n=await this._signaling.removeMovie(t);if(n.error)throw Error(n.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw Error(e.error)}async updateRooms(e,t){let n=await this._signaling.updateRooms(e,t);if(n.error)throw Error(n.error)}async activateRooms(e,t){let n=await this._signaling.activateRooms(e,t);if(n.error)throw Error(n.error)}async switchRoom(e,t){let n=await this._signaling.switchRoom(e,t);if(n.error)throw Error(n.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw Error(t.error)}async startStream(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o={movieId:n,name:t,privacy:r,groupId:i,roomId:a,streamMovie:!e},s=await this._signaling.startStream(o);if(s.error)return Promise.reject(s.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async recordSetConf(e,t,n=!1,r=null){let i=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:n,roomId:r});if(i.error)throw Error(i.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 Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<P.videoMinWidth||t.height<P.videoMinHeight)throw Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");P.videoEffectMaxHeight=t.height,P.videoEffectMaxWidth=t.width}P.videoMaxWidth=e.width,P.videoMaxHeight=e.height,this._debug.debug(`Set local video resolution:`,`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:``)),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(e=>({id:e.id,type:P.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),n=await this._signaling.getParticipants(t);if(n.error)throw Error(n.error);let r=n.participants,i=this._transport?.getState();return Promise.all(r.map(async e=>{let t=N.composeId(e);return this._createParticipant({id:t,externalId:X.fromSignalingParticipant(e),mediaSettings:A(e.mediaSettings),participantState:N.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(i)??F.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(t,e.markers)},e.decorativeUserId)})).then(N.mapSharedParticipants)}async getParticipantListChunk(e){this._debug.log(`Request participant list chunk`,e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw Error(t.error);let n=this._createParticipantListChunk(t.chunk),r=await this._getParticipants(),i=n.participants.filter(e=>!r[N.composeId(e)]);await this._registerParticipants(i);let a=this._transport?.getState();return n.participants.forEach(e=>{let t=r[N.composeId(e)];t.status=this._getStatusByTransportState(a)??F.WAITING,t.movieShareInfos=e.movieShareInfos,Object.assign(t.mediaSettings,A(e.mediaSettings)),Object.assign(t.muteStates,e.muteStates),t.unmuteOptions=e.unmuteOptions??t.unmuteOptions,this._openTransport([t],!0)}),this._participantListChunkToExternalChunk(n)}async _getInitialParticiapntListChunk(){let e=P.participantListChunkInitIndex,t=P.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:`GRID`,fromIdx:e,count:t});return this._debug.debug(`Get initial participant list chunk`,n.chunk),n.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();this._debug.debug(`Local media stream changed`,t),e.kind===j.audio&&this._mediaSource&&(this._audioFix=new ci(this._mediaSource,this._debug,this._stats.logger)),z.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this._mediaSource?.getMediaSettings();this._debug.log(`Screen sharing changed`,e.track,t);let n=e.track?new MediaStream([e.track]):null;z.onScreenStream(n,t)}async _changeRemoteMediaSettings(e,t){this._debug.debug(`Remote media settings changed [${e}]`,t);let n=this._conversation?.externalId;if(this._isMe(e)&&n){z.onLocalMediaSettings(n,t);return}let r=await this._getParticipant(e);if(!r){this._warnParticipantNotInConversation(e);return}r.mediaSettings=t,this._state===`ACTIVE`&&z.onRemoteMediaSettings(r.externalId,t,r.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(n=>n.id===t||N.comparePeerId(n.peerId,e.peerId))}_changeLocalParticipantState(e){this._debug.debug(`Local participant state force changed by admin`,e),this._state===`ACTIVE`&&z.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){this._debug.debug(`Remote participant state changed [${e}]`,t);let n=await this._getParticipant(e);if(!n){this._warnParticipantNotInConversation(e);return}n.participantState=t||{},this._state===`ACTIVE`&&z.onRemoteParticipantState(n.externalId,n.participantState,n.markers)}async _changeMultipleParticipantState(e,t){this._debug.debug(`Multiple participants state changed`,e);let n=[],r,i=await this._getParticipants();e.forEach((e,t)=>{if(this._isMe(t))r=e;else{let r=i[t];if(!r){this._warnParticipantNotInConversation(t);return}r.participantState=e,n.push({externalId:r.externalId,participantState:{...e},markers:r.markers})}}),this._state===`ACTIVE`&&(r&&z.onLocalParticipantState(r,!0),n.length&&z.onRemoteParticipantsState(n,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state===`ACTIVE`&&e.roles&&e.roles.length&&(this._debug.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),z.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case G.ACCEPTED_CALL:return this._onAcceptedCall(e);case G.HUNGUP:return this._onHungup(e);case G.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case G.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case G.CLOSED_CONVERSATION:return this._onClosedConversation(e);case G.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case G.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case G.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case G.RATE_CALL_DATA:return this._onNeedRate();case G.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case G.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case G.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case G.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case G.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case G.REGISTERED_PEER:return this._onPeerRegistered(e);case G.SWITCH_MICRO:return this._onMicSwitched(e);case G.CHAT_MESSAGE:return this._onChatMessage(e);case G.CUSTOM_DATA:return this._onCustomData(e);case G.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case G.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case G.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case G.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case G.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case G.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case G.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case G.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case G.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case G.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case G.FEEDBACK:return this._onFeedback(e);case G.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case G.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case G.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case G.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case G.ROOMS_UPDATED:return this._onRoomsUpdated(e);case G.ROOM_UPDATED:return this._onRoomUpdated(e);case G.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case G.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case G.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case G.ASR_STARTED:return this._onAsrStart(e);case G.ASR_STOPPED:return this._onAsrStop(e);case G.PROMOTION_APPROVED:return this._onPromotionApproved(e);case G.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case G.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}z.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversationParams?.serverTime&&(this._serverTimeOffset=e.conversationParams.serverTime-Date.now()),e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),await this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let n=Object.keys(await this._getParticipants()),r=[];for(let n of e.conversation.participants){let e=N.composeId(n),i=n.roles||[];if(this._isMe(e)){Wr(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:ai(n),unmuteOptions:n.unmuteOptions})};continue}r.push(e);let a=await this._getParticipant(e);if(!a)await this._onJoinedParticipant({participantId:n.id,participant:n,mediaSettings:n.mediaSettings});else{let t=A(n.mediaSettings);Gt(t,a.mediaSettings)||await this._changeRemoteMediaSettings(e,t);let r=N.mapParticipantState(n),o=a.participantState;N.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),Wr(i,a.roles)||this._onRolesChanged(a.id,i)}}let i=await this._getParticipants();for(let e of n)r.indexOf(e)<0&&i[e]&&this._removeParticipant(i[e],v.HUNGUP)}let n=e.rooms?.roomId??null;if(!this._conversation){this._debug.warn(`Conversation is empty, but should be filled`);return}this._conversation.roomId===n?this._processMuteStates(e,!0):await this._onRoomSwitched(n),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){this._debug.error(`Signaling failed`,e),this._close(e)}async _onAcceptedCall(e){let t=N.composeMessageId(e),n=N.getPeerIdString(e.peerId);if(this._debug.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new y(v.MISSED),`Call accepted on other device`);return}let r=await this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t),i=n?N.composeUserId(n,e.participantType):void 0;r=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:A(e.mediaSettings)},i))}r.state=q.ACCEPTED,r.mediaSettings=A(e.mediaSettings),this._logWithMediaSettings(E.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===K.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),this._state===`ACTIVE`&&this._transport&&this._transport.open([r.id],n),await this._changeRemoteMediaSettings(t,r.mediaSettings),await this._changeRemoteParticipantState(t);let i=Object.keys(r.muteStates);i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),this._state===`ACTIVE`&&z.onAcceptedCall(r.externalId,vr.parseCapabilities(e.capabilities))}async _onHungup(e){this._debug.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=N.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new y(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=await this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),n.state=e.reason===v.REJECTED?q.REJECTED:q.HUNGUP,this._state!==`CLOSE`&&this._removeParticipant(n,v.HUNGUP)}async _onAddedParticipant(e){this._debug.debug(`Participant added [${e.participantId}]`);let t=N.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state!==q.HUNGUP&&n.state!==q.REJECTED){this._debug.debug(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:X.fromSignalingParticipant(r),mediaSettings:A(r.mediaSettings),state:r.state,participantState:N.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[]},i),n=await this._getParticipant(t)}n.state=q.CALLED,n.mediaSettings=A(e.participant?.mediaSettings),n.participantState=N.mapParticipantState(e.participant),n.roles=e.participant?.roles||[],this._setParticipantsStatus([n],F.WAITING),this._state!==`IDLE`&&this._transport&&this._transport.allocate(n.id,!0),z.onParticipantAdded(n.externalId,n.markers),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n)}async _onJoinedParticipant(e){this._debug.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=N.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state===q.ACCEPTED){this._debug.warn(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:X.fromSignalingParticipant(r),mediaSettings:A(r.mediaSettings),state:r.state,participantState:N.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},movieShareInfos:r.movieShareInfos,unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[],markers:this._denormalizeMarkers(t,r.markers)},i),n=await this._getParticipant(t)}this._conversation&&this._conversation.direction===K.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=q.ACCEPTED,n.mediaSettings=A(e.mediaSettings),n.participantState=N.mapParticipantState(e.participant),n.roles=e.participant.roles||[],this._transport?.isAllocated(n.id)?this._setParticipantsStatus([n],F.CONNECTED):this._setParticipantsStatus([n],F.WAITING),this._state!==`IDLE`&&this._transport&&(this._transport.isAllocated(n.id)||this._transport.allocate(n.id,!0),this._transport.open([n.id],null,!!this._conversation?.observer)),z.onParticipantJoined(n.externalId,n.markers),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n);let r=Object.keys(n.muteStates);r.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:r,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(n.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new y(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=N.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,A(e.mediaSettings))}async _onParticipantStateChanged(e){let t=N.composeMessageId(e),n=N.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(n):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,n))}async _onParticipantsStateChanged(e){let{participants:t,roomId:n}=e,r=t.map(({id:e,markers:t})=>this._registerParticipantAndSetMarkersIfChunkEnabled(e,t));await Promise.all(r);let i=new Map,a=t.map(({id:e,participantState:t})=>this._getExternalIdByParticipantId(e).then(n=>[e,n&&N.mapParticipantState({participantState:t})]));try{(await Promise.all(a)).forEach(([e,t])=>{t&&i.set(e,t)}),await this._changeMultipleParticipantState(i,n)}catch(e){this._debug.warn(`_onParticipantsStateChanged: Failed to get external ids. ${e}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),z.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),n=A(e.mediaSettings);t.isAudioEnabled!==n.isAudioEnabled&&await this._mediaSource.toggleAudio(n.isAudioEnabled),t.isVideoEnabled!==n.isVideoEnabled&&await this._mediaSource.toggleVideo(n.isVideoEnabled),t.isScreenSharingEnabled!==n.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:n.isScreenSharingEnabled,fastScreenSharing:n.isFastScreenSharingEnabled,captureAudio:n.isAudioSharingEnabled})}_onSettingsUpdate(e){this._debug.debug(`Got settings update notification`,e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=Zr(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){this._debug.debug(`Got video quality update notification`,e);let t={maxBitrateK:Math.round(e.quality.maxBitrate/1024),maxDimension:e.quality.maxDimension},n;n=e.mediaType&&e.mediaType===V.SCREEN?{camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,t)}:{camera:Object.assign({},this._serverSettings.camera,t),screenSharing:null,fastScreenSharing:null},this._serverSettings=Zr(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=N.composeMessageId(e),n=await this._getParticipant(t);n&&(n.clientType=e.clientType,n.platform=e.platform),z.onPeerRegistered()}async _onMicSwitched(e){z.onDeviceSwitched(T.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=N.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}z.onChatMessage(e.message,n,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,`sdk`))return;let t=N.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}z.onCustomData(e.data,n,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let n=this._conversation.recordsInfoByRoom.get(t);if(n?.recordMovieId!==e?.recordMovieId||n?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let n=await this._getExternalIdByParticipantId(e.initiator);n?z.onRecordStarted(n,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},n=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(n);if(!(!r||r.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(n,null),e){let t=await this._getExternalIdByParticipantId(e);z.onRecordStopped(n,t??null)}else z.onRecordStopped(n,null)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let n=await this._getExternalIdByParticipantId(t);n&&z.onPinnedParticipant(n,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiator);n?z.onRecordStarted(n,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else z.onRecordStopped(e,null)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiatorId);n&&z.onAsrSet({externalId:n,movieId:t.movieId},e)}else z.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,n=t.get(e);if(n){let t=await this._getExternalIdByParticipantId(n.initiatorId);t&&z.onRemoteSharedUrl(t,n.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}z.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,n=e.roomId||null;this._conversation.asrInfoByRoom.set(n,t);let r=await this._getExternalIdByParticipantId(t.initiatorId);if(!r){this._warnParticipantNotInConversation(t.initiatorId);return}z.onAsrStarted(r,t.movieId,n)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),z.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}z.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!Wr(this._conversation.roles,t)){this._debug.debug(`Local roles changed: ${t}`),this._conversation.roles=t,z.onLocalRolesChanged(t),this._processMuteState({mediaOptions:ti(this._getMuteStatesForCurrentRoom(),Rr.MUTE_PERMANENT),stateUpdated:!0}),N.includesOneOf(t,[Ur.ADMIN,Ur.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=await this._getParticipant(e);n&&!Wr(n.roles,t)&&(this._debug.debug(`Roles for participant [${e}] changed: ${t}`),n.roles=t,z.onRolesChanged(n.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:n,muteStates:r={},unmuteOptions:i=[],mediaOptions:a=[],roomId:o=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){this._debug.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let t=await this._getParticipant(e.participantId);if(t){this._debug.debug(`Mute states for participant [${e.participantId}] changed`,r);let o=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;z.onMuteStates(r,i,a,n,e.unmute,t.externalId,o,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(n&&!t?this._setMuteStatesForRoomId(r,o):n||(this._conversation.muteStatesPersonal=r)),e.adminId&&this._isMe(e.adminId)){n&&z.onMuteStates(r,i,a,n,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:a,muteAll:n,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:i,muteStates:r})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let n=this._getMuteStatesForRoomId(t),r=this._getMuteStatesForRoomId(e),i=Object.keys(n),a=Object.keys(r);this._processMuteState({mediaOptions:Array.from(new Set([...i,...a])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==q.ACCEPTED)return;let{mediaOptions:t=[],muteAll:n,unmute:r,stateUpdated:i,requestedMedia:a,roomId:o=null,unmuteOptions:s=[]}=e,c=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,l=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(o)),u=this._mediaSource.getMediaSettings(),d=Object.entries(l);for(let[e,i]of d){let a=this._isCallAdmin()&&n;if(!(i!==Rr.MUTE&&i!==Rr.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===Rr.MUTE_PERMANENT&&!n&&(l[e]=Rr.MUTE),!(!t.includes(e)||r)))switch(e){case T.VIDEO:u.isVideoEnabled&&(z.onDeviceSwitched(T.VIDEO,!1),await this.toggleLocalVideo(!1));break;case T.AUDIO:u.isAudioEnabled&&(z.onDeviceSwitched(T.AUDIO,!1),await this.toggleLocalAudio(!1));break;case T.SCREEN_SHARING:u.isScreenSharingEnabled&&(z.onDeviceSwitched(T.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case T.AUDIO_SHARING:u.isAudioSharingEnabled&&(z.onDeviceSwitched(T.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:u.isScreenSharingEnabled,fastScreenSharing:u.isFastScreenSharingEnabled,captureAudio:!1}));break}}z.onMuteStates(l,s,t,n,r,null,c,i,a,o)}async _onPinParticipant(e,t=!1,n,r=null){if(!this._conversation)return;let i=this._conversation.pinnedParticipantIdByRoom.get(r);if(i&&i!==e)if(this._isMe(i))z.onLocalPin(!0,r);else{let t=await this._getExternalIdByParticipantId(i);t&&z.onPinnedParticipant(t,!0,this._denormalizeMarkers(e,n),r)}if(this._isMe(e))z.onLocalPin(t,r);else{let i=await this._getExternalIdByParticipantId(e);i&&z.onPinnedParticipant(i,t,this._denormalizeMarkers(e,n),r)}this._conversation.pinnedParticipantIdByRoom.set(r,t?null:e)}_onOptionsChanged(e){this._conversation&&!Ir(this._conversation.options,e)&&(this._conversation.options=e,z.onOptionsChanged(e),e.includes(Fr.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&z.onLocalStatus(F.WAITING_HALL):e.includes(Fr.WAIT_FOR_ADMIN)&&this._conversation.restricted&&z.onLocalStatus(F.WAIT_FOR_ADMIN))}async _onNetworkStatus(e){if(this._conversation){let t=[],n=await this._getParticipants();for(let[r,i]of Object.entries(e)){let e;if(this._isMe(r)||r===``)e=this._conversation.networkRating;else if(n[r])e=n[r].networkRating;else continue;if(e!==i)if(this._isMe(r)||r===``)this._conversation.networkRating=i,mi.getInstance().value=i,z.onLocalNetworkStatusChanged(i);else{let e=n[r];e.networkRating=i,t.push({uid:e.externalId,rating:i})}}if(t.length===0)return;this._debug.log(`Received network status update: `,e),z.onNetworkStatusChanged(t)}}async _onRemoteStreamSecond(e,t){let n=await this._getParticipant(e);n&&z.onRemoteScreenStream(n.externalId,t)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){z.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let n=await this._getParticipant(e);n&&z.onRemoteVmojiStream(n.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,z.onVmojiError({...e,externalId:t}))}catch(e){this._debug.warn(`_onAnimojiError failed`,e)}}_onPeerConnectionClosed(e){e===Y.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy()}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(Pr.ADD_PARTICIPANT);z.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&z.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&z.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[n,r]of Object.entries(e)){let e=await this._getParticipant(n);e&&e.externalId&&t.push({uid:e.externalId,volume:r.real})}z.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(z.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){this._debug.debug(`Transport state has changed: ${t}`,e);let n=this._getStatusByTransportState(t);if(!n)return;let r=await this._getParticipants(),i=e.reduce((e,n)=>{if(n in r){let i=r[n];e.push(i),t===J.CONNECTED&&(i.remoteStream||(i.mediaSettings&&this._changeRemoteMediaSettings(n,i.mediaSettings),this._changeRemoteParticipantState(n,i.participantState)),this._updateDisplayLayoutFromCache(n))}else this._warnParticipantNotInConversation(n);return e},[]);i.length&&this._setParticipantsStatus(i,n)}async _onTransportLocalStateChanged(e){if(this._debug.debug(`Local transport state has changed: ${e}`),e===J.CONNECTED&&(k.releaseFirefoxMicrophonePermissionWarmup(),z.onLocalStatus(F.CONNECTED),this._transport?.getTopology()===Y.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e)}e===J.CONNECTING&&z.onLocalStatus(F.CONNECTING),e===J.RECONNECTING&&z.onLocalStatus(F.RECONNECT),e===J.FAILED&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(v.FAILED),this._close(new y(v.FAILED),`Transport failed`))}async _onRemoteTrackAdded(e,t,n){if(e.endsWith(Br.AUDIO_MIX))this._debug.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),z.onRemoteMixedAudioStream(t);else if(e.startsWith(Br.TRANSPARENT_AUDIO_TRACK_PREFIX))this._debug.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(Br.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))this._debug.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{this._debug.debug(`Remote track added on the participant [${e}]`,{kind:n.kind});let r=await this._getParticipant(e);if(!r){let t=this._api.getDecorativeIdByInitialId(e),n=t?N.composeUserId(t):void 0;this._debug.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${n}]`),this._registerParticipant({id:e},n),r=await this._getParticipant(e),this._setParticipantsStatus([r],F.WAITING),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(z.onSpeakerChanged(r.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(r.id)&&this._transport.allocate(r.id,!1),n.kind===j.audio&&(this._audioOutput.add(e,n),P.preserveAudioTracks||(r.remoteAudioTrack=n,t.removeTrack(n))),r.remoteStream!==t&&t.getTracks().length){if(r.remoteStream=t,r.secondStream)return;z.onRemoteStream(r.externalId,t)}r.mediaSettings&&this._changeRemoteMediaSettings(e,r.mediaSettings)}}_onRemoteTrackRemoved(e,t,n){switch(this._debug.debug(`[${e}] remote track (removed)`,{track:n}),n.kind){case j.audio:this._removeAudioTrack(e,t,n);break;case j.video:case j.screen:this._removeVideoTrack(e,t,n);break}}async _removeAudioTrack(e,t,n){if(e!==Br.AUDIO_MIX){let n=await this._getParticipant(e);if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(e,n)}_removeVideoTrack(e,t,n){}_onTopologyChanged(e){e===Y.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall()),this._audioOutput.destroy()}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,this._debug.debug(`Audio mix stalled:`,e),z.onLocalStatus(e?F.RECONNECT:F.CONNECTED))}async _onRemoteSignalledStall(e){let t={},n=[],r=[];this._debug.debug(`Participants stalled:`,e);let i=await this._getParticipants();for(let r of e){if(t[r]=!0,!this._lastStalled[r]){let e=i[r];e&&n.push(e)}delete this._lastStalled[r]}for(let e of Object.keys(this._lastStalled)){let t=i[e];t&&r.push(t)}n.length&&this._setParticipantsStatus(n,F.RECONNECT),r.length&&this._setParticipantsStatus(r,F.CONNECTED),this._lastStalled=t}async _onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,await this._getParticipants()),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!k.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!k.hasCamera()||!this._audioFix||!this._mediaSource?.getMediaSettings().isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!==`CLOSE`||!1;e&&(this._debug.debug(`Toggle join availability`,{available:t,chatId:e}),z.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!==Y.SERVER)return;let t=await this._getParticipant(e);if(t&&t.lastRequestedLayouts&&Object.keys(t.lastRequestedLayouts).length)try{await this.updateDisplayLayout(Object.values(t.lastRequestedLayouts))}catch(e){this._debug.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){if(!e.length)return;let r=e.reduce((e,n)=>(n.status!==t&&(n.status=t,e.push(n.externalId)),e),[]);r.length&&z.onRemoteStatus(r,t,n)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),z.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let n of Object.keys(zr)){let r=e.updates[n];r&&(t[n]={rooms:await Promise.all(r?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:r?.roomIds,deactivated:r?.deactivated})}z.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(e=>e===zr.UPDATE)&&(e.muteStates!==void 0&&this._setMuteStatesForRoomId(e.muteStates,e.roomId),e.recordInfo!==void 0&&this._conversation?.recordsInfoByRoom.set(e.roomId,e.recordInfo),e.asrInfo!==void 0&&this._conversation?.asrInfoByRoom.set(e.roomId,e.asrInfo)),this._isCalledState()||z.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),n=await Promise.all(e.addParticipantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),r=await Promise.all(e.removeParticipantIds?.map?.(e=>this._getExternalIdByParticipantId(e))||[]),i=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:n,removeParticipantIds:r,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:i,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=e.addedParticipantIds?.map(e=>N.decomposeId(e).id)||[],i=await this._api.getExternalIdsByOkIds(r),a=e.addedParticipants;if(i.length&&a?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);a=(await this._signaling.getParticipants(e)).participants}let o=await Promise.all(a?.map(async e=>{let r=N.composeId(e);return this._createParticipant({id:r,externalId:X.fromSignalingParticipant(e),mediaSettings:A(e.mediaSettings),participantState:N.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(t)??F.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(r,e.markers),isInRoom:n!==null},e.decorativeUserId)})||[]),s=!1;for(let e of o)e.id===this._conversation?.compositeUserId&&(s=!0),this._registerParticipantInCache(e);this._transport?.getState()===J.IDLE&&!this._isCalledState()&&this._openTransport(o,!0);let c=[],l=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);l.push(e)}c=await Promise.all(l)}if(s&&await this._onRoomSwitched(n),c){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=await this._getExternalIdByParticipantId(e);if(t){for(let e of c)if(X.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let u={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:N.mapSharedParticipants(o),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:c};this._isCalledState()||z.onRoomParticipantsUpdated(u)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let n=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){z.onRoomStart(e);return}this._isCalledState()||z.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,n),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let n=t?.rooms?.rooms??[],r=[];for(let t of n){let n=t.id??null;if(this._setMuteStatesForRoomId(t.muteStates,n),this._conversation?.recordsInfoByRoom.set(n,t.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(n,t.pinnedParticipantId??null),t.asrInfo&&this._conversation?.asrInfoByRoom.set(n,t.asrInfo),t.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(n,t.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(n),e){let e=await this._getParticipants();await this._registerParticipants(t?.participants?.participants?.filter(t=>!e[N.composeId(t)])||[],!0);let n=await this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&z.onRoomsUpdated({[zr.UPDATE]:{rooms:r}})}async _onFeedback(e){let t=[];for(let n of e.feedback){let e={...n,items:[]};for(let t of n.items){let n=await this._getExternalIdByParticipantId(t.participantId);n?e.items.push({...t,participantId:n}):this._warnParticipantNotInConversation(t.participantId)}t.push(e)}z.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:n,decorativeExternalParticipantId:r}=e,i=this._isMe(t);this._debug.debug(`Decorative participant id changed [${t}]`,e);let a=await this._getExternalIdByParticipantId(t);if(!a){this._warnParticipantNotInConversation(t);return}let o=X.fromSignaling(r,a.deviceIdx);if(z.onParticipantIdChanged(a,o),this._api.cacheExternalId(n,o),this._api.mapDecorativeId(n,t),i)this._conversation.externalId=o;else{let e=await this._getParticipants();e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==Y.SERVER||(this._debug.debug(`Video suspend suggested`,e),z.onVideoSuspendSuggest(e.bandwidth))}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()===Y.SERVER&&this._transport?.getState()===J.IDLE&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){let n=this._createParticipant(e,t);n.catch(()=>void 0),this._pendingParticipants.set(e.id,n)}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.entries()),t=await Promise.allSettled(e.map(e=>e[1])),n=null;for(let r=0;r<t.length;r++){let[i]=e[r];this._pendingParticipants.delete(i);let a=t[r];if(a.status===`fulfilled`){let e=a.value;this._participants[e.id]=e;continue}n=n??a.reason,this._debug.warn(`Failed to resolve pending participant [${i}]`,a.reason)}if(n)throw n}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};g(Q,`_current`,void 0),g(Q,`_activationMutex`,void 0),g(Q,`_delayedHangup`,!1),g(Q,`_abortController`,null);var xo=class e extends Error{constructor(t,n){super(t),g(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},So=null,Co=null;function wo(){So=null,Co=null}function To(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function Eo(e=null,t){let n=To(e??P.apiBaseUrl);if(n)return n;if((t??P.apiEnv)!==`AUTO`)return P.apiEndpoint(t);try{let e=atob(`aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ=`),t=(await(await fetch(e,{method:`GET`,mode:`cors`,cache:`no-cache`})).json())?.Answer[0]?.data;if(!t)throw Error(`Wrong DNS response`);return B.debug(`Resolved API endpoint`,t),t}catch(e){return B.warn(`Failed to resolve API endpoint using DNS, default is used`,e),P.apiEndpoint(t)}}async function Do(){return So||Co||(Co=Eo(),So=await Co,Co=null,So)}async function Oo(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Do();let r=Mo(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${So}/fb.do`,i)}async function ko(e,t={},n=!1,r){return await Do(),Ao(Mo(e,t,n),r)}async function Ao(e,t){let n=`${t??So}/fb.do`,r=new AbortController,i=setTimeout(()=>r.abort(new y(v.NETWORK_ERROR)),P.apiTimeout),a=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:e,signal:r.signal});clearTimeout(i);let o=await a.text(),s;try{s=JSON.parse(o)}catch{s={result:o}}if(!a.ok||Object.hasOwn(s,`error_msg`))throw s;return s}async function jo(e,t){try{let n=await fetch(e,{method:`POST`,body:t});if(!n.ok)throw Error(`HTTP error! status: ${n.status}`);let r=await n.text();B.debug(`Form data sent successfully`,r)}catch(e){throw B.warn(`Failed to send form data`,e),e}}function Mo(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=P.apiKey),n||(C.sessionKey?t.session_key=C.sessionKey:C.accessToken&&(t.access_token=C.accessToken));for(let[e,n]of Object.entries(t))typeof n==`object`&&(t[e]=JSON.stringify(n));let r=``;for(let[e,n]of Object.entries(t))r&&(r+=`&`),r+=`${e}=${encodeURIComponent(n)}`;return r}var No=class{constructor(){g(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}async createJoinLink(e){return{join_link:`nop`}}async removeJoinLink(e){return{success:!0}}async getAnonymTokenByLink(e,t){return``}log(e){}logClientStats(e){}logClientEvents(e){}getCachedOkIdByExternalId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}replaceByInitialIdIdIfExists(e){return typeof e==`string`?parseInt(e,10):e}hangupConversation(e,t=v.HUNGUP){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}},Po=700,Fo=3e3,Io=class extends No{constructor(...e){super(...e),g(this,`_userId`,null),g(this,`_uuid`,void 0),g(this,`_externalUidsCache`,new Map),g(this,`_decorativeIdToInitialId`,new Map),g(this,`_initialIdToDecorativeId`,new Map)}async _callUnsafe(e,t={},n=!1){let r=async i=>{try{return await ko(e,t,n)}catch(t){if(!Object.hasOwn(t,`error_msg`)){i++;let n=Object.getOwnPropertyNames(t).map(e=>`${e}: ${JSON.stringify(t[e])}`);if(B.debug(`${e} network error, attempt ${i}: ${n.join(`
|
|
20
|
+
`)}`),this._abortSignal?.aborted&&(B.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),i<P.apiMaxAttempt)return await N.delay(Math.min(i*Po,Fo),{signal:this._abortSignal}),r(i)}throw B.warn(e,`error`,t),t}};return r(0)}async _call(e,t={},n=!1){try{return await this._callUnsafe(e,t,n)}catch(r){B.warn(`Api call error`,r);let i=w.API;switch(r.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,n)}let a={message:r.error_msg,code:r.error_code};if(r instanceof y)throw r;if(r.custom_error&&(a.custom_error=r.custom_error),Lo(r))switch(r.error_code){case 1101:i=v.SERVICE_DISABLED;break;case 4:r.error_msg.includes(`participants.limit.exceeded`)&&(i=v.PARTICIPANT_LIMIT_REACHED);break;case 300:i=v.NOT_FOUND;break;case 1102:i=v.CALLEE_IS_OFFLINE;break;case 1103:i=v.NOT_FRIENDS;break;case 1104:case 1106:i=v.EXTERNAL_API_ERROR;break;case 1113:i=v.CALLER_IS_REJECTED;break;case 1114:i=v.VCHAT_DETAILED_ERROR;break;case 2:i=v.SERVICE_UNAVAILABLE;break}throw new y(i,a)}}async userId(e){let t=N.extractOkId(e);if(C.isEmpty())return X.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let n=this.getDecorativeIdByInitialId(t);return n&&(t=n),X.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!P.apiKey)throw new y(w.API,{message:`Required argument apiAppKey not passed`});let e={session_data:{version:2,device_id:this._uuid,client_version:P.appVersion,client_type:`SDK_JS`}};return P.authToken&&(e.session_data.auth_token=P.authToken,e.session_data.version=3),this._callUnsafe(`auth.anonymLogin`,e,!0).then(e=>{e.uid&&(this._userId=Number(e.uid)),C.sessionKey=e.session_key,C.sessionSecretKey=e.session_secret_key}).catch(e=>{throw e.error_code===401&&z.onTokenExpired(),new y(w.AUTH,{message:e.error_msg,code:e.error_code})})}logClientStats(e){let t={app_version:String(P.appVersion),sdk_type:`WEB`,sdk_version:P.sdkVersion,version:1,items:e};P.clientStatsPlatform&&(t.platform=P.clientStatsPlatform),Oo(`vchat.clientStats`,{data:JSON.stringify(t)})}logClientEvents(e){let t={app_version:String(P.appVersion),sdk_type:`WEB`,sdk_version:P.sdkVersion,version:1,items:e};P.clientStatsPlatform&&(t.platform=P.clientStatsPlatform),Oo(`vchat.clientEvents`,{data:JSON.stringify(t)})}async uploadDebugLogs(e,t,n,r){let i={conversationId:e,webrtcPlatform:P.platform,startTime:t,endTime:n},a=await this._callUnsafe(`vchat.getLogUploadUrl`,i),o=new FormData,s=new Blob([r],{type:`application/json`});o.append(`file`,s,`log.json`);let c=new URL(a.upload_url);return c.searchParams.append(`size`,s.size.toString()),jo(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:P.protocolVersion,capabilities:vr.getFlags()};return n&&(r.chatId=n),this._call(`vchat.joinConversation`,r)}async createConversation(e,t=``,n=!1,{onlyAdminCanShareMovie:r,audienceMode:i,audioOnly:a,waitForAdmin:o,closedConversation:s}={},c){let l=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:n,onlyAdminCanShareMovie:r,waitForAdmin:o,closedConversation:s,audienceMode:i,audioOnly:a,speakerIds:c});return this._startConversation(l)}async startConversation(e,t,n,r=!1,i=``,a=!1,o=!1,{onlyAdminCanShareMovie:s,waitForAdmin:c}={},l){let u=this._preareStartConversationData({conversationId:e,isVideo:r,joiningAllowed:a,payload:i,requireAuthToJoin:o,onlyAdminCanShareMovie:s,waitForAdmin:c,externalIds:l});if(t&&t.length)switch(n){case Mr.USER:u.uids=t.join(`,`);break;case Mr.GROUP:u.gid=t[0];break;case Mr.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=ct.get(`uuid`);e||(e=N.uuid(),ct.set(`uuid`,e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:n=``,joiningAllowed:r=!1,requireAuthToJoin:i=!1,onlyAdminCanShareMovie:a,waitForAdmin:o,audienceMode:s=!1,audioOnly:c=!1,speakerIds:l=[],closedConversation:u=!1,externalIds:d}){let f={conversationId:e,isVideo:t,protocolVersion:P.protocolVersion};return r&&(f.createJoinLink=!0),n&&(f.payload=n),P.domain&&(f.domainId=P.domain),P.externalDomain&&(f.externalDomain=P.externalDomain),i&&(f.requireAuthToJoin=!0),a!==void 0&&(f.onlyAdminCanShareMovie=a),o!==void 0&&(f.waitForAdmin=o),s&&(f.audienceMode=s),c&&(f.audioOnly=c),l.length&&(f.speakerIds=l.map(e=>N.composeUserId(e)).join(`,`)),u&&(f.closed=u),d&&(f.externalIds=d.map(X.toSignaling).join(`,`)),f}async _startConversation(e){return this._call(`vchat.startConversation`,e)}async createJoinLink(e){return this._call(`vchat.createJoinLink`,{conversationId:e})}async removeJoinLink(e){return this._call(`vchat.removeJoinLink`,{conversationId:e})}async getAnonymTokenByLink(e,t){let n={joinLink:e};t&&(n.anonymName=t);let r=await this._call(`vchat.getAnonymTokenByLink`,n);return this._userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:P.protocolVersion,capabilities:vr.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),P.anonymToken&&(i.anonymToken=P.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}async getOkIdsByExternalIds(e){let t=[],n=[],r=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let o of e){let e=X.toString(o),s=a.indexOf(e);s>-1?t.push(this.replaceByInitialIdIdIfExists(i[s])):(r.set(String(o.id),e),n.push({id:o.id,ok_anonym:o.type===Gr.ANONYM}))}return n.length&&(await this._call(`vchat.getOkIdsByExternalIds`,{externalIds:n})).ids.forEach((e,n)=>{let i=Number(e.ok_user_id),a=String(e.external_user_id.id);r.has(a)&&(this.cacheExternalId(i,X.fromString(r.get(a))),t.push(i))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,n=Array.from(this._externalUidsCache.keys()),r=Array.from(this._externalUidsCache.values());for(let i of e){let e=X.toString(i),a=r.indexOf(e);if(a>-1){let e=N.composeParticipantId(this.replaceByInitialIdIdIfExists(n[a]),M.USER,i.deviceIdx);t.set(i,e)}}return t}async getExternalIdsByOkIds(e){let t=[],n=[];for(let r of e)if(this._externalUidsCache.has(r)){let e=this.getDecorativeIdByInitialId(r),n=this._externalUidsCache.get(e??r);t.push(X.fromString(n))}else n.push(r);if(!n.length)return t;let r=await this._getExternalIdsByOkIds(n);return Array.from(r.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),n=Array.from(this._externalUidsCache.values()),r=X.toString(e),i=n.indexOf(r);return i>-1?N.composeParticipantId(this.replaceByInitialIdIdIfExists(t[i]),M.USER,e.deviceIdx):i>-1?N.composeParticipantId(t[i],M.USER,e.deviceIdx):null}cacheExternalId(e,t){let n=N.extractOkId(e);this._externalUidsCache.set(n,X.toString(t))}mapDecorativeId(e,t){let n=N.extractOkId(e),r=N.extractOkId(t);this._decorativeIdToInitialId.set(n,r),this._initialIdToDecorativeId.set(r,n)}unmapDecorativeId(e){let t=N.extractOkId(e),n=this.getDecorativeIdByInitialId(t);n&&this._decorativeIdToInitialId.delete(n),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=N.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=N.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}async getConversationParams(e){let t={};return P.anonymToken&&(t.anonymToken=P.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e,t=v.HUNGUP){let n={conversationId:e,reason:t};P.anonymToken&&(n.anonymToken=P.anonymToken),Oo(`vchat.hangupConversation`,n)}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(e=>this.getDecorativeIdByInitialId(e)??e);try{let n=await this._call(`vchat.getExternalIdsByOkIds`,{uids:e.join(`,`)}),r=(e,n)=>{for(let[r,i]of Object.entries(e)){let e=Number(r),a=X.fromId(i,n);t.set(e,a),this.cacheExternalId(e,a)}};n.external_ids&&r(n.external_ids,Gr.USER),n.anonym_ids&&r(n.anonym_ids,Gr.ANONYM);for(let n of e){let e=Number(n);if(!t.has(e)){let n=X.fromId(String(e));t.set(e,n),this.cacheExternalId(e,n)}}return t}catch{return t}}async getServerTime(){return(await this._call(`system.getInfo`)).serverTime}};function Lo(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}var Ro=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(Ro||{}),zo=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),Bo=class{constructor(e){g(this,`_queue`,void 0),g(this,`_readCursor`,void 0),g(this,`_writeCursor`,void 0),g(this,`_moveReadCursor`,void 0),g(this,`_left`,void 0),this._queue=Array(e).fill(null),this._readCursor=this._writeCursor=this._left=0,this._moveReadCursor=!1}get length(){return this._queue.length}get left(){return this._left}toArray(){return Array.from(this._queue)}add(e){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=e,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(e){return(e+1)%this._queue.length}next(){let e=this._queue[this._readCursor];return e&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),--this._left),e}},Vo=class{constructor(e,t,n,r=null){g(this,`_uuid`,void 0),g(this,`_apiKey`,void 0),g(this,`_callToken`,void 0),g(this,`_apiEnv`,void 0),g(this,`_baseApiUrl`,void 0),g(this,`_sessionKey`,void 0),this._uuid=N.uuid(),this._apiKey=t,this._callToken=n,this._apiEnv=e,this._baseApiUrl=r}async authorize(){let e=await ko(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:P.appVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await Eo(this._baseApiUrl,this._apiEnv));return N.isObject(e)&&!(`error_msg`in e)?(this._sessionKey=e.session_key,!0):!1}async hangupConversation(e){await ko(`vchat.hangupConversation`,{conversationId:e,reason:v.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},!0,await Eo(this._baseApiUrl,this._apiEnv))}},$,Ho=null,Uo={getCameras:k.getCameras,getMicrophones:k.getMicrophones,getOutput:k.getOutput,getVideoFacingMode:k.getVideoFacingMode,hasCamera:k.hasCamera,hasMicrophone:k.hasMicrophone,getSavedCamera:k.getSavedCamera,getSavedMicrophone:k.getSavedMicrophone,getSavedOutput:k.getSavedOutput,hasCameraPermission:k.hasCameraPermission,hasMicrophonePermission:k.hasMicrophonePermission,hasPermissions:k.hasPermissions,getUserMedia:k.getUserMedia,getUserVideo:k.getUserVideo,getUserAudio:k.getUserAudio,setResolution:k.setResolution,isBrowserSupported:k.isBrowserSupported,isScreenCapturingSupported:k.isScreenCapturingSupported,os:k.os,isMobile:k.isMobile,browserName:k.browserName,browserVersion:k.browserVersion,baseChromeVersion:k.baseChromeVersion,getAudioContext:k.getAudioContext,isAudioShareSupported:k.isAudioShareSupported},Wo={participantMarkerCompare:N.participantMarkerCompare};function Go(e){Ho=e}function Ko(e){P.videoEffects=e}function qo(e){P.audioEffects=e}function Jo(e,t=null,n={},r=1){P.vmoji=e,P.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function Yo(e){if(P.set(e),$||($=new Io),c.default.disableLog(!P.debug),B.toggle(P.debug),B.log(`Calls SDK ${P.sdkVersion}`,e),await k.init(),!k.isBrowserSupported())throw new y(w.UNSUPPORTED);B.log(`UserAgent:`,navigator.userAgent),B.log(`Screen resolution:`,`${window.screen.width}x${window.screen.height}`),B.log(`Permissions:`,`Camera: ${k.hasCameraPermission()}, Mic: ${k.hasMicrophonePermission()}`),B.log(`Simulcast:`,`${e.simulcast} => ${P.simulcast}`)}async function Xo(e,t=[T.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),Zo([],Mr.USER,t,n,r,i,a,c,o,s)}async function Zo(e,t=Mr.USER,n,r=``,i=!1,a=!1,o,s,c,l){if(Q.current())throw B.error(`There is already active call`),new y(v.FAILED);return new Q($,Ho).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function Qo(e,t){return $o(e,M.USER,void 0,t)}async function $o(e,t=M.USER,n,r,i,a){if(e===Q.id())throw Error(`Push has already been processed`);return a&&$.setUserId(a),new Q($,Ho).onPush(e,t,n,r,i)}async function es(e,t){return e&&(P.authToken=e),t!==void 0&&P.apiBaseUrl!==t&&(P.apiBaseUrl=t,wo()),$.authorize()}async function ts(e=[T.AUDIO]){return Tc().accept(e)}async function ns(){let e=Q.current();if(e)return e.decline()}async function rs(e,t=[T.AUDIO]){return is(e,t)}async function is(e,t,n){if(Q.current())throw B.error(`There is already active call`),new y(v.FAILED);return new Q($,Ho).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function as(e,t=[T.AUDIO],n,r,i,a){if(Q.current())throw B.error(`There is already active call`),new y(v.FAILED);return n&&(P.anonymToken=n),new Q($,Ho).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a})}async function os(){let e=Q.current();if(e)return e.hangup();Q.hangupAfterInit()}async function ss(e,t){let n=Array.isArray(e)?e:[e],r=Q.current();r&&await r.addParticipant(n,t)}async function cs(e,t){let n=Q.current();if(n){let r=e.map(e=>N.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function ls(e,t=!1){return us((await $.getOkIdsByExternalIds([e]))[0],t)}async function us(e,t=!1){let n=Q.current();if(n)try{await n.removeParticipant(N.composeUserId(e),t)}catch(t){B.warn(`Failed to remove participant ${e}. Perhaps he is no longer on the call. ${t}`)}}async function ds(e,t){let n=Q.current();if(e===`videoinput`&&Mt.contains(t))return P.videoFacingMode=t,n?(k.isMobile()&&n.stopVideoTrack(),n.changeDevice(e)):void 0;if(!await k._saveDeviceId(e,t))throw Error(`Device not found: ${t}`);if(n)return n.changeDevice(e)}async function fs(e){let t=typeof e==`object`?{...e,fastScreenSharing:e.captureScreen&&e.fastScreenSharing,captureAudio:e.captureScreen&&e.captureAudio&&P.audioShare}:{captureScreen:e,fastScreenSharing:!1,captureAudio:!1},n=Q.current();return n?n.toggleScreenCapturing(t):Promise.reject()}function ps(e){let t=Q.current();t&&t.toggleAnimojiCapturing(e)}async function ms(e,t=!1){let n=Q.current();n&&await n.setVideoStream(e,t)}async function hs(e){let t=Q.current();t&&await t.toggleLocalVideo(e)}async function gs(e){let t=Q.current();t&&await t.toggleLocalAudio(e)}async function _s(e){let t=Q.current();if(t)return t.setLocalResolution(e)}async function vs(e){let t=Q.current();t&&await t.changePriorities(e)}async function ys(e,t){let n=Q.current();if(n){let r;if(t){let[e]=await $.getOkIdsByExternalIds([t]);r=N.composeParticipantId(e,M.USER,t.deviceIdx)}await n.changeParticipantState(e,r)}}async function bs(e){let t=Q.current();t&&await t.hold(e)}async function xs(){let e=Q.current();e&&await e.putHandsDown()}async function Ss(e){let t=Q.current();t&&await t.updateDisplayLayout(e)}async function Cs(e,t,n=!1){return ws((await $.getOkIdsByExternalIds([e]))[0],X.getDeviceIdx(e),t,n)}async function ws(e,t,n,r=!1){let i=Q.current();i&&await i.grantRoles(N.composeParticipantId(e,M.USER,t),n,r)}async function Ts({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){let i=null;return e&&(i=(await $.getOkIdsByExternalIds([e]))[0]),Es({uid:i,muteStates:t,requestedMedia:n,deviceIdx:X.getDeviceIdx(e),roomId:r})}async function Es({uid:e=null,muteStates:t,requestedMedia:n=[],deviceIdx:r=0,roomId:i=null}){let a=Q.current();if(a){let o=e?N.composeParticipantId(e,M.USER,r):null;await a.muteParticipant(o,t,n,i)}}async function Ds(e,t=!1,n=null){return Os((await $.getOkIdsByExternalIds([e]))[0],t,X.getDeviceIdx(e),n)}async function Os(e,t=!1,n=0,r=null){let i=Q.current();i&&await i.pinParticipant(N.composeParticipantId(e,M.USER,n),t,r)}async function ks(e){let t=Q.current();t&&await t.updateMediaModifiers(e)}async function As(e){let t=Q.current();t&&await t.enableVideoSuspend(e)}async function js(e){let t=Q.current();t&&await t.enableVideoSuspendSuggest(e)}async function Ms(e){let t=Q.current();t&&await t.changeOptions(e)}async function Ns(e,t=null){let n=null;return t&&(n=(await $.getOkIdsByExternalIds([t]))[0]),Ps(e,n)}async function Ps(e,t=null){let n=Q.current();if(n){let r=t?N.composeUserId(t):null;await n.chatMessage(e,r)}}async function Fs(e=10){let t=Q.current();if(t)return t.chatHistory(e)}async function Is(e,t=null){let n=null;return t&&(n=(await $.getOkIdsByExternalIds([t]))[0]),Ls(e,n,X.getDeviceIdx(t))}async function Ls(e,t=null,n=0){let r=Q.current();if(r){let i=t?N.composeParticipantId(t,M.USER,n):null;await r.customData(e,i)}}async function Rs(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await $.createConversation(a??N.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function zs(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=X.fromIds(i),o=await $.getOkIdsByExternalIds(a);return(await $.createConversation(N.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},o)).join_link}async function Bs(){let e=Q.current();return e?e.createJoinLink():Promise.reject()}async function Vs(){let e=Q.current();return e?e.removeJoinLink():Promise.reject()}async function Hs(e,t){return $.getAnonymTokenByLink(e,t)}function Us(e){let t=Q.current();t&&t.setVolume(e)}function Ws(e){P.forceRelayPolicy=e}async function Gs(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o=Q.current();return o?o.startStream(e,t,n,r,i,a):Promise.reject()}async function Ks(e=null,t){let n=Q.current();return n?n.stopStream(e,t):Promise.reject()}async function qs(e=null){let t=Q.current();return t?t.publishStream(e):Promise.reject()}async function Js(e,t,n=!1,r=null){let i=Q.current();if(!i)return Promise.reject();let a,o,s=[];if(t?.length&&s.push(...t),e&&s.push(e),s.length){let t=await $.getParticipantIdsByExternalIds(s);e&&(a=t.get(e),t.delete(e)),o=Array.from(t.values())}return i.recordSetConf(a,o,n,r)}async function Ys(){let e=Q.current();return e?e.getStreamInfo():Promise.reject()}async function Xs(e){let t=Q.current();return t?t.addMovie(e):Promise.reject()}async function Zs(e){let t=Q.current();return t?t.updateMovie(e):Promise.reject()}async function Qs(e){let t=Q.current();return t?t.removeMovie(e):Promise.reject()}async function $s(e,t){let n=Q.current();if(n){let r=[];for(let t of e){let e,n;t.addParticipantIds&&(e=(await $.getOkIdsByExternalIds(t.addParticipantIds)).map(e=>N.composeUserId(e))),t.removeParticipantIds&&(n=(await $.getOkIdsByExternalIds(t.removeParticipantIds)).map(e=>N.composeUserId(e))),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:n,countdownSec:t.countdownSec})}return n.updateRooms(r,t)}return Promise.reject()}async function ec(e,t){let n=Q.current();return n?n.activateRooms(e,t):Promise.reject()}async function tc(e=null,t=null){let n=Q.current();if(!n)return Promise.reject();let r;if(t){let e=await $.getOkIdsByExternalIds([t]),n=X.getDeviceIdx(t);r=N.composeParticipantId(e[0],M.USER,n)}return n.switchRoom(e,r)}async function nc(e){let t=Q.current();return t?t.removeRooms(e):Promise.reject()}function rc(e){P.statisticsInterval=e;let t=Q.current();if(t)return t.updateStatisticsInterval()}function ic(e){c.default.disableLog(!e),B.toggle(e)}function ac(e,...t){P.debugLog&&B.send(e,`[external]`,...t)}var oc={list:Ie,get:Le,getJson:Re,download:ze,clear:Be,stats:Ve};function sc(){let e=[[`Calls SDK ${P.sdkVersion}`,P.toJSON()],[`UserAgent:`,navigator.userAgent],[`Screen resolution:`,`${window.screen.width}x${window.screen.height}`],[`Permissions:`,`Camera: ${k.hasCameraPermission()}, Mic: ${k.hasMicrophonePermission()}`]],t=new Date,n=t.getTime(),r=t.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`});return e.map(e=>({h:r,t:n,l:yn.LOG,d:e}))}async function cc(){let e=Q.id(),t=Q.debugSessionId();if(!t||!e)throw B.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let n=await Le({sessionId:t});if(n.length===0)throw B.error(`[uploadDebugLogs]`,`No logs found`),Error(`No logs found`);let r=n[0].t,i=n[n.length-1].t;try{return $?.uploadDebugLogs(e,r,i,JSON.stringify([...sc(),...n]))}catch(e){throw B.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function lc(e){let t=Q.current();if(t)return t.videoEffect(e)}async function uc(e,t){let n=Q.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function dc(e){let t=Q.current();t&&await t.setAudioStream(e)}async function fc(e,t=null,n=null){let r=Q.current();if(!r)return;let i=n??t?.id,a=null;if(t){let e=(await $.getOkIdsByExternalIds([t]))[0];if(!e)throw Error(`Could not get user id to set animoji svg`);a=N.composeParticipantId(e,M.USER,X.getDeviceIdx(t))}r.setAnimojiSvg(e,a,i)}function pc(e){let t=Q.current();t&&t.setAnimojiFill(e)}async function mc(e=null,t,n=!1){return Tc().getWaitingHall(e,t,n)}async function hc(){return Tc().getAudienceModeHands()}async function gc(e,t=!1){let n=Tc(),r;if(e){let[t]=await $.getOkIdsByExternalIds([e]);r=N.composeUserId(t)}return n.promoteParticipant(r,t)}async function _c(e=!1){return Tc().requestPromotion(e)}async function vc(e=!1){return Tc().acceptPromotion(e)}async function yc(e){return Tc().getParticipantListChunk(e)}async function bc(e){return Tc().getParticipants(e)}async function xc(e){return Tc().feedback(e)}function Sc(e,t,n){return Tc().userFeedbackStats(e,t,n)}function Cc(e,t={},n=!1){let r=Q.current();r&&r.sendClientEvent(e,t,n)}async function wc(e,t){return Tc().enableFeatureForRoles(e,t)}function Tc(){let e=Q.current();if(!e)throw Error(`Conversation not found`);return e}async function Ec(e){await $.removeHistoryRecords(e)}async function Dc(e){let t=Q.current();t&&await t.startAsr(e)}async function Oc(e){let t=Q.current();t&&await t.stopAsr(e)}async function kc(e){let t=Q.current();t&&await t.requestAsr(e)}async function Ac(e){let t=Q.current();return t?t.startUrlSharing(e):Promise.reject()}async function jc(){let e=Q.current();return e?e.stopUrlSharing():Promise.reject()}function Mc(){return Q.getSyncedTime()}function Nc(){return P.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=gn),exports.Api=Io,exports.ApiExternal=Vo,exports.ArrayDequeue=Bo,exports.AuthData=C,exports.BaseLogger=m,exports.CallDirection=K,exports.CallType=Mr,exports.ChatRoomEventType=Nr,exports.ConversationFeature=Pr,exports.ConversationOption=Fr,exports.DebugMessageType=yn,exports.ExternalIdType=Gr,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return Mt}}),exports.FatalError=w,exports.HangupReason=y,exports.HangupType=v,exports.MediaOption=T,exports.MediaTrackKind=j,exports.MediaType=V,exports.MuteState=Rr,exports.ParticipantState=q,exports.ParticipantStateDataValue=zo,exports.ParticipantStatus=F,exports.RecordRole=Ro,exports.RoomsEventType=zr,exports.Signaling=jr,exports.SignalingCommandType=b,exports.SignalingConnectionType=fr,exports.SignalingNotification=G,exports.TransportTopology=Y,exports.UserRole=Ur,exports.UserType=M,exports.VolumeDetector=gi,exports.acceptCall=ts,exports.acceptPromotion=vc,exports.activateRooms=ec,exports.addMovie=Xs,exports.addParticipant=ss,exports.addParticipantInternal=cs,exports.authorize=es,exports.browser=Uo,exports.callInternal=Zo,exports.callTo=Xo,exports.captureScreen=fs,exports.captureVmoji=ps,exports.changeAudioEffect=uc,exports.changeConversationOptions=Ms,exports.changeDevice=ds,exports.changeParticipantState=ys,exports.changePriorities=vs,exports.changeVideoEffect=lc,exports.chatHistory=Fs,exports.chatMessage=Ns,exports.chatMessageInternal=Ps,exports.createJoinLink=Bs,exports.customData=Is,exports.customDataInternal=Ls,exports.debug=ic,exports.debugLogs=oc,exports.debugMessage=ac,exports.declineCall=ns,exports.enableFeatureForRoles=wc,exports.enableVideoSuspend=As,exports.enableVideoSuspendSuggest=js,exports.feedback=xc,exports.forceRelayPolicy=Ws,exports.getAnonymTokenByLink=Hs,exports.getAudienceModeHands=hc,exports.getParticipantListChunk=yc,exports.getParticipants=bc,exports.getStreamInfo=Ys,exports.getSyncedTime=Mc,exports.getWaitingHall=mc,exports.grantRoles=Cs,exports.grantRolesInternal=ws,exports.hangup=os,exports.hold=bs,exports.init=Yo,exports.joinCall=rs,exports.joinCallByLink=as,exports.joinCallInternal=is,exports.logClientEvent=Cc,exports.muteParticipant=Ts,exports.muteParticipantInternal=Es,exports.pinParticipant=Ds,exports.pinParticipantInternal=Os,exports.processPush=Qo,exports.processPushInternal=$o,exports.promoteParticipant=gc,exports.publishStream=qs,exports.putHandsDown=xs,exports.recordSetConf=Js,exports.removeHistoryRecords=Ec,exports.removeJoinLink=Vs,exports.removeMovie=Qs,exports.removeParticipant=ls,exports.removeParticipantInternal=us,exports.removeRooms=nc,exports.requestAsr=kc,exports.requestPromotion=_c,exports.setAudioEffects=qo,exports.setAudioStream=dc,exports.setLocalResolution=_s,exports.setLogger=Go,exports.setMediaModifiers=ks,exports.setStatisticsInterval=rc,exports.setVideoEffects=Ko,exports.setVideoStream=ms,exports.setVmoji=Jo,exports.setVmojiFill=pc,exports.setVmojiSvg=fc,exports.setVolume=Us,exports.startAsr=Dc,exports.startAudienceConversation=zs,exports.startConversation=Rs,exports.startStream=Gs,exports.startUrlSharing=Ac,exports.stopAsr=Oc,exports.stopStream=Ks,exports.stopUrlSharing=jc,exports.switchRoom=tc,exports.toggleLocalAudio=gs,exports.toggleLocalVideo=hs,exports.updateDisplayLayout=Ss,exports.updateMovie=Zs,exports.updateRooms=$s,exports.uploadDebugLogs=cc,exports.userFeedbackStats=Sc,exports.utils=Wo,exports.version=Nc;
|