@vkontakte/calls-sdk 2.8.11-dev.5500645b.0 → 2.8.11-dev.882b025a.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 +11 -7
- package/abstract/BaseApi.d.ts +0 -1
- package/abstract/BaseSignaling.d.ts +3 -4
- package/calls-sdk.cjs.js +10 -11
- package/calls-sdk.esm.js +10 -11
- package/classes/CallRegistry.d.ts +20 -0
- package/classes/Conversation.d.ts +9 -9
- package/classes/Logger.d.ts +0 -5
- package/classes/MediaSource.d.ts +7 -0
- package/classes/SignalingActor.d.ts +5 -0
- package/classes/transport/DirectTransport.d.ts +0 -5
- package/classes/transport/ServerTransport.d.ts +0 -8
- package/classes/transport/Transport.d.ts +1 -16
- package/default/Api.d.ts +1 -3
- package/package.json +1 -1
- package/static/Capabilities.d.ts +5 -0
- package/static/External.d.ts +38 -18
- package/static/Params.d.ts +22 -31
- package/static/WebRTCUtils.d.ts +1 -0
- package/types/Capabilities.d.ts +24 -0
- package/types/Statistics.d.ts +0 -4
- package/static/DebugVideoStats.d.ts +0 -22
package/calls-sdk.cjs.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @vkontakte/calls-sdk v2.8.11-dev.
|
|
3
|
-
*
|
|
2
|
+
* @vkontakte/calls-sdk v2.8.11-dev.882b025a.0
|
|
3
|
+
* Fri, 22 May 2026 07:44:22 GMT
|
|
4
4
|
* https://st.mycdn.me/static/callssdk/2-8-11/doc/
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
"use strict";var Ns=Object.create;var ui=Object.defineProperty;var Ls=Object.getOwnPropertyDescriptor;var Us=Object.getOwnPropertyNames;var Bs=Object.getPrototypeOf,Fs=Object.prototype.hasOwnProperty;var Vs=(n,r,e)=>r in n?ui(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var js=(n,r)=>{for(var e in r)ui(n,e,{get:r[e],enumerable:!0})},$a=(n,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Us(r))!Fs.call(n,i)&&i!==e&&ui(n,i,{get:()=>r[i],enumerable:!(t=Ls(r,i))||t.enumerable});return n};var mi=(n,r,e)=>(e=n!=null?Ns(Bs(n)):{},$a(r||!n||!n.__esModule?ui(e,"default",{value:n,enumerable:!0}):e,n)),Hs=n=>$a(ui({},"__esModule",{value:!0}),n);var c=(n,r,e)=>Vs(n,typeof r!="symbol"?r+"":r,e);var dl={};js(dl,{Api:()=>ci,ApiExternal:()=>Kr,ArrayDequeue:()=>Wr,AuthData:()=>Ce,BaseLogger:()=>Pt,CallDirection:()=>Oe,CallType:()=>nt,ChatRoomEventType:()=>xr,ConversationFeature:()=>Nr,ConversationOption:()=>Ze,DebugMessageType:()=>ma,ExternalIdType:()=>Lr,FacingMode:()=>ft,FatalError:()=>oe,HangupReason:()=>B,HangupType:()=>R,MediaOption:()=>pe,MediaTrackKind:()=>Ge,MediaType:()=>kt,MuteState:()=>je,ParticipantState:()=>Z,ParticipantStateDataValue:()=>wa,ParticipantStatus:()=>Qi,RecordRole:()=>Ts,RoomsEventType:()=>ai,Signaling:()=>Vt,SignalingCommandType:()=>x,SignalingConnectionType:()=>Ke,SignalingNotification:()=>U,TransportTopology:()=>Fe,UserRole:()=>gt,UserType:()=>se,VolumeDetector:()=>Ct,acceptCall:()=>jc,acceptPromotion:()=>Jd,activateRooms:()=>Od,addMovie:()=>Md,addParticipant:()=>$c,addParticipantInternal:()=>qc,authorize:()=>Vc,browser:()=>wc,callInternal:()=>Rs,callTo:()=>Bc,captureScreen:()=>Yc,captureVmoji:()=>Qc,changeAudioEffect:()=>jd,changeConversationOptions:()=>md,changeDevice:()=>Jc,changeParticipantState:()=>rd,changePriorities:()=>id,changeVideoEffect:()=>Vd,chatHistory:()=>gd,chatMessage:()=>hd,chatMessageInternal:()=>Ds,createJoinLink:()=>vd,customData:()=>_d,customDataInternal:()=>ws,debug:()=>Ud,debugMessage:()=>Bd,declineCall:()=>Hc,enableFeatureForRoles:()=>tl,enableVideoSuspend:()=>pd,enableVideoSuspendSuggest:()=>ud,feedback:()=>Xd,forceRelayPolicy:()=>Rd,getAnonymTokenByLink:()=>Ed,getAudienceModeHands:()=>$d,getParticipantListChunk:()=>Yd,getParticipants:()=>Qd,getStreamInfo:()=>Ad,getWaitingHall:()=>Kd,grantRoles:()=>od,grantRolesInternal:()=>Ps,hangup:()=>Kc,hold:()=>ad,init:()=>Uc,joinCall:()=>Gc,joinCallByLink:()=>Wc,joinCallInternal:()=>bs,logClientEvent:()=>el,muteParticipant:()=>cd,muteParticipantInternal:()=>As,pinParticipant:()=>dd,pinParticipantInternal:()=>Ms,processPush:()=>Fc,processPushInternal:()=>Cs,promoteParticipant:()=>qd,publishStream:()=>yd,putHandsDown:()=>nd,recordSetConf:()=>Pd,removeHistoryRecords:()=>il,removeJoinLink:()=>Id,removeMovie:()=>wd,removeParticipant:()=>zc,removeParticipantInternal:()=>ys,removeRooms:()=>Nd,requestAsr:()=>nl,requestPromotion:()=>zd,setAudioEffects:()=>Nc,setAudioStream:()=>Hd,setLocalResolution:()=>td,setLogger:()=>Oc,setMediaModifiers:()=>ld,setStatisticsInterval:()=>Ld,setVideoEffects:()=>xc,setVideoStream:()=>Xc,setVmoji:()=>Lc,setVmojiFill:()=>Wd,setVmojiSvg:()=>Gd,setVolume:()=>Td,startAsr:()=>rl,startAudienceConversation:()=>Sd,startConversation:()=>fd,startStream:()=>Cd,startUrlSharing:()=>sl,stopAsr:()=>al,stopStream:()=>bd,stopUrlSharing:()=>ol,switchRoom:()=>xd,toggleLocalAudio:()=>ed,toggleLocalVideo:()=>Zc,updateDisplayLayout:()=>sd,updateMovie:()=>Dd,updateRooms:()=>kd,uploadDebugLogs:()=>Fd,userFeedbackStats:()=>Zd,utils:()=>kc,version:()=>cl});module.exports=Hs(dl);var ka=mi(require("webrtc-adapter"));var Pt=class{log(r,e,t=!1){}destroy(){}};var de=class{constructor(){c(this,"_handlers",{});c(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 hi=class extends de{constructor(){super(...arguments);c(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 qa=(ee=>(ee.CANCELED="CANCELED",ee.REJECTED="REJECTED",ee.REMOVED="REMOVED",ee.HUNGUP="HUNGUP",ee.MISSED="MISSED",ee.BUSY="BUSY",ee.FAILED="FAILED",ee.NETWORK_ERROR="NETWORK_ERROR",ee.KILLED="KILLED",ee.BANNED="BANNED",ee.HAS_ACTIVE_CALL="HAS_ACTIVE_CALL",ee.CALLER_IS_BLOCKED="CALLER_IS_BLOCKED",ee.NOT_FRIENDS="NOT_FRIENDS",ee.CALLEE_IS_OFFLINE="CALLEE_IS_OFFLINE",ee.CALLER_IS_REJECTED="CALLER_IS_REJECTED",ee.UNKNOWN_ERROR="UNKNOWN_ERROR",ee.UNSUPPORTED="UNSUPPORTED",ee.OLD_VERSION="OLD_VERSION",ee.SERVICE_DISABLED="SERVICE_DISABLED",ee.SERVICE_UNAVAILABLE="SERVICE_UNAVAILABLE",ee.EXTERNAL_API_ERROR="EXTERNAL_API_ERROR",ee.SOCKET_CLOSED="SOCKET_CLOSED",ee.ENDED="ENDED",ee.KILLED_WITHOUT_DELETE="KILLED_WITHOUT_DELETE",ee.ANOTHER_DEVICE="ANOTHER_DEVICE",ee.NOT_FOUND="NOT_FOUND",ee.VCHAT_DETAILED_ERROR="VCHAT_DETAILED_ERROR",ee.TIMEOUT="TIMEOUT",ee.PARTICIPANT_LIMIT_REACHED="PARTICIPANT_LIMIT_REACHED",ee.FAST_START_ERROR="FAST_START_ERROR",ee.FAST_JOIN_ERROR="FAST_JOIN_ERROR",ee.CALL_TIMEOUT="CALL_TIMEOUT",ee))(qa||{}),R=qa;var B=class n extends Error{constructor(e,t){super();c(this,"message");c(this,"hangup");c(this,"error");c(this,"code");c(this,"remote");c(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(R).indexOf(e)>-1?this.hangup=e:this.error=e;let i=[];this.error&&i.push("error"),this.remote&&i.push("remote"),this.code&&i.push(`code: ${this.code}`),t&&t.message&&i.push(`message: '${t.message}'`),this.message=e+(i.length?` (${i.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,n)}};var ve=class ve extends Pt{constructor(e,t){super();c(this,"_externalLogger");c(this,"_api");c(this,"_batchInterval",3e3);c(this,"_batchedLogItems",[]);c(this,"_batchedClientStats",[]);c(this,"_batchedClientEvents",[]);c(this,"_batchTimeout",null);c(this,"_serverTimeDelta",0);this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}static setConversationIdProvider(e){ve._conversationIdProvider=e}static create(e,t){ve._instance||(ve._instance=new ve(e,t))}static log(e,t,i=!1){ve._instance&&ve._instance.log(e,t,i)}static logCustom(e,t,i=!1){ve._instance&&ve._instance.logCustom(e,t,i)}static logClientStats(e,t=!1){ve._instance&&ve._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){ve._instance&&ve._instance.logClientEvent(e,t)}static destroy(){ve._instance&&ve._instance.destroy(),ve._instance=null}log(e,t,i=!1){let a={};typeof t<"u"&&(a.param=t),this._logInternal(e,a,i),this._externalLogger&&this._externalLogger.log(e,t,i)}logCustom(e,t,i=!1){this._logInternal(e,t,i)}logClientStats(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(i).forEach(a=>{i[a]===void 0&&delete i[a]}),this._batchedClientStats.push(i),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(i),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}_logInternal(e,t,i){let a={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:this._getConversationId()}),uid:this._api.getUserId()};this._batchedLogItems.push(a),(i||!this._batchTimeout)&&this._sendBatch()}_getConversationId(){if(ve._conversationIdProvider)try{return ve._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedLogItems.length>0&&(this._sendLogItems(this._batchedLogItems),this._batchedLogItems=[],e=!0),this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendLogItems(e){this._api.log(e)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}};c(ve,"_instance"),c(ve,"_conversationIdProvider",null);var b=ve;var L=require("messagepack");var za=(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))(za||{}),x=za;var Ja=($=>($.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",$))(Ja||{}),oe=Ja;var Ya=(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))(Ya||{}),pe=Ya;var Qa=(ne=>(ne.ACCEPT_CONCURRENT="callAcceptConcurrent",ne.ACCEPT_INCOMING="callAcceptIncoming",ne.ACCEPTED_OUTGOING="callAcceptedOutgoing",ne.ADD_PARTICIPANT="callAddParticipant",ne.CALL_SPEC_ERROR="callSpecError",ne.DECLINE_INCOMING="callDeclineIncoming",ne.DEVICE_CHANGED="callDeviceChanged",ne.DEVICES="callDevices",ne.ERROR="callError",ne.HANGUP="callHangup",ne.ICE_CONNECTION_STATE="callIceConnectionState",ne.ICE_CONNECTION_TYPE="callIceConnectionType",ne.ICE_RESTART="callIceRestart",ne.JOIN_CONVERSATION="callJoinConversation",ne.MEDIA_STATUS="callMediaStatus",ne.OUTGOING_CALL="callStart",ne.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",ne.PAT_ALLOCATED="patAllocate",ne.PAT_DEALLOCATED="patDeallocate",ne.PAT_ERROR="patError",ne.PAT_OUTDATED_RESPONSE="patOutdatedResponse",ne.PAT_WAITING_TIME_ERROR="patWaitingTimeError",ne.POOR_CONNECTION="callPoorConnection",ne.PUSH="callPush",ne.RECONNECT="callReconnect",ne.RELAY_POLICY="callForceRelay",ne.REMOVE_PARTICIPANT="callRemoveParticipant",ne.SOCKET_ACTION="callSocketAction",ne.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",ne))(Qa||{}),w=Qa;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}};c(He,"_sessionKey"),c(He,"_sessionSecretKey"),c(He,"_accessToken");var Ce=He;var Xa=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Xa||{}),se=Xa;var _t={HEIGHT:720,WIDTH:1280,BITRATE:1e6},gi="L1T2",en=[{dimension:320,bitrate:18e4},{dimension:520,bitrate:4e5},{dimension:640,bitrate:5e5},{dimension:960,bitrate:9e5},{dimension:1280,bitrate:12e5},{dimension:1920,bitrate:25e5},{dimension:2560,bitrate:35e5},{dimension:3840,bitrate:5e6}],Gs={h:1,m:2,l:4};function tn(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 Za(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:en[0].bitrate}function _i(n=_t.WIDTH,r=_t.HEIGHT,e=en){let t=["h","m","l"],i=Math.max(n,r),a=1;i>=960?a=3:i>=480&&(a=2);let s={streams:[]},o=30,l=Za(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:o,bitrate:l}),n=Math.round(n/2),r=Math.round(r/2),l=Za(Math.max(n,r),e)??Math.round(l/2)}return s}function Ki(n){return n?Gs[n]??1:1}var rn=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 an(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var Wt=":",qi="d",Ws=533,$i="a=fmtp:",Ks="sps-pps-idr-in-keyframe=1",Yr;(qe=>{let n=/[\r\n]+/,r=`\r
|
|
8
|
-
`;function e(g,T){let y=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),S,
|
|
9
|
-
`);for(let k of y)if(k.startsWith("a=fingerprint")){let K=k.split(" ");if(K.length===2){T=K[1];break}}if(!T)return BigInt(-1);let S=T.split(":"),A=BigInt(0);for(let k=Math.min(7,S.length-1);k>=0;k--){let K=BigInt(parseInt(S[k],16));A<<=BigInt(8),A|=K}return BigInt.asIntN(64,A)}qe.sdpFingerprint=Ua;async function ee(g,{signal:T}={}){return new Promise((y,S)=>{if(T?.aborted)return S(T.reason);let A=setTimeout(()=>{T?.removeEventListener("abort",k),y()},g),k=()=>{clearTimeout(A),S(T?.reason)};T?.addEventListener("abort",k,{once:!0})})}qe.delay=ee;function Ba(g,T,y){let S=[];return g.getSenders().forEach(A=>Wi(T,A,A.track,y,S)),S}qe.applySettings=Ba;function Wi(g,T,y,S,A){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!g||!y||y.kind!=="video")return;let k=y.getSettings();if(!k)return;let K=g.maxBitrateK?g.maxBitrateK*1024:null,H=k.width,q=k.height,Ee=H&&q&&g.maxDimension?Math.max(1,Math.max(H,q)/g.maxDimension):null,N=g.maxFramerate||null;if(H&&q&&g.maxDimension&&g.maxDimension>Math.max(H,q)){let fe=Math.round(H*q/256),xe=(Math.round(fe*Ws/1e4)+1)*1e4;K=K===null?xe:Math.min(xe,K)}let Ie=g.degradationPreference||"balanced",Se=S[y.id];if(Se&&Se.bitrate===K&&Se.scaleResolutionDownBy===Ee&&Se.maxFramerate===N&&Se.degradationPreference===Ie){A[y.id]=Se;return}A[y.id]={bitrate:K,scaleResolutionDownBy:Ee,maxFramerate:N,degradationPreference:Ie};let De=T.getParameters();if(De.encodings||(De.encodings=[{}]),De.encodings.length>1&&H&&q&&g.maxDimension){let fe=Math.round(g.maxDimension*1.35),xe=Math.max(H,q),bt=_i(H,q,g?.bitrates?.generic),Gt=bt.streams.length;d.log(`applyVideoTrackSettings: maxDim=${g.maxDimension} targetDim=${fe} track=${H}x${q} sim=${JSON.stringify(bt)}`),De.encodings.forEach((tt,pi)=>{tt.scaleResolutionDownBy=Ki(tt.rid);let Wa=Math.round(xe/tt.scaleResolutionDownBy);pi<Gt-1?tt.active=Wa<fe:pi>=Gt?tt.active=!1:tt.active=!0,pi<Gt?tt.maxBitrate=bt.streams[pi].bitrate:tt.maxBitrate=0,tt.scalabilityMode=gi})}else De.encodings.forEach(fe=>{g?.scalabilityMode&&(fe.scalabilityMode=g.scalabilityMode),K?fe.maxBitrate=K:delete fe.maxBitrate,Ee?fe.scaleResolutionDownBy=Ee:delete fe.scaleResolutionDownBy,N?fe.maxFramerate=N:delete fe.maxFramerate});if(De.degradationPreference=Ie,De.encodings.length>0){T.setParameters?.(De).catch(xe=>{d.error("Failed to set sender parameters",De,xe)});let fe=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(fe.encodings)}`)}}qe.applyVideoTrackSettings=Wi;function $r(g,T){Array.isArray(T)||(T=[T]);for(let y of T)if(g.includes(y))return!0;return!1}qe.includesOneOf=$r;function Fa(g){return Object.entries(g.participantState?.state||{}).reduce((T,[y,S])=>(g.participantState&&(T[y]={ts:g.participantState.stateUpdateTs[y],state:S}),T),{})}qe.mapParticipantState=Fa;function Va(g){let T=g.map(y=>({uid:y.externalId,mediaSettings:y.mediaSettings,status:y.status,muteStates:y.muteStates,unmuteOptions:y.unmuteOptions,participantState:y.participantState,markers:y.markers,movieShareInfos:y.movieShareInfos,roles:y.roles}));return p.filterObservers?T.filter(y=>!y.uid.observer):T}qe.mapSharedParticipants=Va;function ja(g,T){let y=Object.keys(g),S=Object.keys(T);if(y.length!==S.length)return!1;for(let A of y)if(!Object.hasOwn(S,A)||g[A].state!==T[A].state||g[A].ts!==T[A].ts)return!1;return!0}qe.isEqualParticipantState=ja;function qr(g,T,y=!1){let S=Object.keys(g),A=Object.keys(T);if(S.length!==A.length)return!1;for(let k of S){if(!Object.hasOwn(T,k))return!1;let K=g[k],H=T[k];if(y&&_e(K)&&_e(H))return qr(K,H,y);if(K!==H)return!1}return!0}qe.isObjectsEquals=qr;function Ha(g,T){if(g.length!==T.length)return!1;for(let y of g)if(T.indexOf(y)<0)return!1;return!0}qe.isArraysEquals=Ha;function Ga(g){return!Object.keys(g).length}qe.isEmptyObject=Ga;function he(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)||y(g,T);function y(A,k){let K={[se.USER]:0,[se.GROUP]:1},{compositeUserId:H,deviceIdx:q}=li(A.id),{compositeUserId:Ee,deviceIdx:N}=li(k.id),{id:Ie,type:Se}=di(H),{id:De,type:fe}=di(Ee);return S(K[Se],K[fe])||S(Ie,De)||S(q,N)}function S(A,k){return A<k?-1:A===k?0:1}}qe.participantMarkerCompare=he;function j(g,T){let y=Object.entries(g).filter(([,S])=>Array.isArray(T)?!T.includes(S):S!==T);return rn(y)}qe.objectFilterOutValues=j;function ie(g,T,y){let S=y;for(let A in g)Object.hasOwn(g,A)&&(S=T(S,g[A],A));return S}qe.objectReduce=ie,qe.setImmediate=(()=>{let g=1,T={},y=null;return typeof MessageChannel<"u"&&(y=new MessageChannel,y.port1.onmessage=S=>{let A=S.data;T[A]&&(T[A](),delete T[A])}),function(S){if(y&&document.visibilityState==="hidden"){let k=g;return g=g>=Number.MAX_SAFE_INTEGER?1:g+1,T[k]=S,y.port2.postMessage(k),()=>{T[k]&&delete T[k]}}let A=setTimeout(S,0);return()=>clearTimeout(A)}})();function _e(g){return g!==null&&typeof g=="object"&&!Array.isArray(g)}qe.isObject=_e;function st(g,T,y,S){function A(H,q){let Ee=0,N=H.length,Ie=!1;for(let Se=0;Se<H.length;Se++)if(!Ie&&H[Se].startsWith("m=video")&&(Ee=Se),H[Se].startsWith("a=mid:"+q)&&(Ie=!0),Ie&&H[Se].startsWith("m=")){N=Se;break}return{start:Ee,end:N}}function k(H,q,Ee,N,Ie,Se,De){let fe="a=rid:"+N+" send";for(let xe=q;xe<Ee;xe++)if(H[xe]===fe){let Gt=fe+" max-width="+Se+";max-height="+De+";max-br="+Ie;H[xe]=Gt}}let K=T?.sender;if(K&&K.track&&T.mid){let H=g.split(n),{start:q,end:Ee}=A(H,T.mid),N=K.getParameters();if(N.encodings)return N.encodings.forEach(Ie=>{let Se=Ie.rid,De=Ie.maxBitrate,fe=Ie.scaleResolutionDownBy;if(y&&S&&fe){let xe=""+Math.round(y/fe),bt=""+Math.round(S/fe);k(H,q,Ee,Se,De,xe,bt)}}),H.join(r)}return g}qe.patchSimulcastAnswerSdp=st})(Yr||(Yr={}));var I=Yr;var Kt="__CALLS_SDK_DEVTOOLS_",fi=class{set(r,e){try{this.getStorage().setItem(Kt+r,JSON.stringify(e))}catch(t){d.warn("DevTools: Failed to save option",r,t)}}get(r){try{let t=this.getStorage().getItem(Kt+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(Kt+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(Kt)&&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(Kt)){let a=i.substring(Kt.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 Si=class{constructor(r){c(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(){c(this,"params");c(this,"storage");this.storage=new fi,this.params=new Si(this.storage)}static getInstance(){return At.instance||(At.instance=new At),At.instance}};c(At,"instance",null);var Qr=At,Xr=Qr.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=Xr.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.5500645b.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 debugVideoStreams(){return _._params.debugVideoStreams&&_._params.onVideoStreamDebug}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||(M.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 M.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}}};c(_,"_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,debugVideoStreams:!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 nn(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 be(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var sn=n=>n.stop(),vi=n=>n.getTracks().forEach(sn),on=n=>n.getVideoTracks().forEach(sn);async function zi(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 Ji=class extends de{constructor(){super(...arguments);c(this,"FPS_LIMITS",[13,20,Math.max(p.videoFrameRate,25)]);c(this,"THRESHOLD",.8);c(this,"HISTORY_LENGTH",10);c(this,"_fpsMeterUnsubscribe",null);c(this,"_fpsHistory",{cursor:0,arr:[]});c(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 Yi=class extends de{constructor(){super();c(this,"_stream",null);c(this,"_screenTrack",null);c(this,"_audioShareTrack",null);c(this,"_screenShareTrack",null);c(this,"_sendVideoTrack",null);c(this,"_cameraVideoTrack",null);c(this,"_micAudioTrack",null);c(this,"_audioEffectsTrack",null);c(this,"_mediaSettings",be());c(this,"_videoStatusOnScreenCapturingEnabled",!1);c(this,"_effect",null);c(this,"_audioEffectParams",null);c(this,"_onDeviceChange");c(this,"_animojiEnabled",!1);c(this,"_videoEffectsFpsLimiter");c(this,"videoTrackMuteHandler",()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)});this._initDeviceChangeListener(),p.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),p.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Ji,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=[pe.AUDIO],t=!0){if(this._stream)return;let i=e.includes(pe.VIDEO),a=e.includes(pe.AUDIO),s=e.includes(pe.ANIMOJI);if(!M.isBrowserSupported())throw new B(oe.UNSUPPORTED);try{this._stream=await M.getUserMedia(i,a,t),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=i&&this._stream.getVideoTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(o){throw new B(o)}}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(),o=this.getSendVideoTrack(i);if(!a||!s&&!o&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,a),o&&!t&&e.addTrack(o,a)}getMediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case"videoinput":if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case"audioinput":if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(oe.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&on(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_initDeviceChangeListener(){!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices||!navigator.mediaDevices.addEventListener||(this._onDeviceChange=async e=>{if(!this._stream)return;let t=M.getSavedMicrophone(),i=M.getSavedCamera(),a=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,s=this._mediaSettings.isVideoEnabled&&i?.groupId!==e.camera?.groupId;try{a&&await this._changeAudioInput(),s&&await this._changeVideoInput()}catch{}},M.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&M.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await M._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=i.getVideoTracks()[0],!this._stream)vi(i);else{let a=await this._setEffect(this._effect,this.cameraVideoTrack);b.log(w.DEVICE_CHANGED,t),d.log("Video stream changed"),await this._replaceLocalTrack(a),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw b.log(w.ERROR,"change_video"),d.warn("Camera change failed",t),t}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await M.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)vi(t);else{let i=await this._applyAudioEffect();b.log(w.DEVICE_CHANGED,"audio"),d.log("Audio stream changed",i),await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw b.log(w.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await M.getScreenMedia(e,t),!this._stream)vi(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),b.log(w.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 b.log(w.ERROR,"screen"),d.warn("Screen capturing failed",a),a}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent("SCREEN_STATUS",{track:null}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"}))}async stopAudioShareTrack(){if(this._audioShareTrack){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!p.audioEffects||!this._audioEffectParams)return p.audioEffects?.pause(),this._micAudioTrack;p.audioEffects.isInitialized||await p.audioEffects.init(),p.audioEffects.resume(),p.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),p.audioEffects.setSource(this._micAudioTrack);let e=p.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=M.getSilentMediaTrack();return e.contentHint="music",e.stop(),e}getBlackScreenShareTrack(){let e=M.getBlackMediaTrack();return e.contentHint="motion",e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let i=this._stream.getTracks().find(a=>a.kind===e.kind&&a.contentHint===e.contentHint);i?.id!==e.id&&(i?(i!==this._audioEffectsTrack&&i.stop(),this._stream?.removeTrack(i),this._stream?.addTrack(e),this._triggerEvent("TRACK_REPLACED",e,t)):(this._stream.addTrack(e),this._triggerEvent("TRACK_REPLACED",e,t)))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(p.videoEffects),!p.videoEffects)return t;try{return p.videoEffects.setEffect(e,t)}catch(i){return d.warn("Video effect failed",i),t}}_stopEffect(){if(p.videoEffects)try{p.videoEffects.stopEffect()}catch(e){d.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),p.videoEffects&&(this._effect=null,p.videoEffects.destroy()),p.audioEffects&&p.audioEffects.destroy(),this._stream&&(vi(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),M.getAudioContext()?.suspend().catch(t=>d.error(t)),this._videoEffectsFpsLimiter?.destroy()}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return this._disableScreenCapture()}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;this.cameraVideoTrack?.stop();let t;if(e){let i=await M._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=M.getBlackMediaTrack(p.videoMinWidth,p.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent("ANIMOJI_STATUS",!e);return}this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(i,a)=>{await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=a,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})};if(e)try{let i=await M.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw p.audioEffects?.pause(),t(M.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else p.audioEffects?.pause(),t(M.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent("ANIMOJI_STATUS",e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}async setResolution({video:e,effect:t}){if(!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw new Error("Local stream not found");if(!this.cameraVideoTrack)throw new Error("Local video track not found");let i=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,i)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(t=>!t.contentHint);if(!e)throw new Error("Local audio track not found");if(e.enabled)return e.applyConstraints({noiseSuppression:p.noiseSuppression})}async videoEffect(e){if(!p.videoEffects)throw new Error("Video Effects library is not set");if(b.log(w.DEVICE_CHANGED,`effect_${e?.effect||"none"}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let i=this.cameraVideoTrack.clone(),a=new MediaStream([i]);await this._applyVideoConstraints(i),await this._changeVideoInput(a)}catch(i){this._effect=t;let a=this.cameraVideoTrack.clone(),s=new MediaStream([a]);throw await this._changeVideoInput(s),i}}}async audioEffect(e){if(!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 zi(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 Ii=class{constructor(){c(this,"_cameraPermissionStatus");c(this,"_microphonePermissionStatus");c(this,"_listener")}static isSupported(){return M.browserName()!=="Firefox"&&"permissions"in navigator&&"PermissionStatus"in window}async init(r){try{let[e,t]=await Promise.all([navigator.permissions.query({name:"camera"}),navigator.permissions.query({name:"microphone"})]);this._cameraPermissionStatus=e,this._microphonePermissionStatus=t,this._listener=r,this._cameraPermissionStatus.onchange=i=>this.handlePermissionChange(i),this._microphonePermissionStatus.onchange=i=>this.handlePermissionChange(i)}catch(e){d.warn("NavigatorPermissions init error",e)}}handlePermissionChange(r){let e=r.target;if(e instanceof PermissionStatus){let{name:t,state:i}=e;switch(t){case"audio_capture":this._listener("microphone",i);break;case"video_capture":this._listener("camera",i);break}}}getPermissionState(r){let e=null;switch(r){case"camera":e=this._cameraPermissionStatus.state;break;case"microphone":e=this._microphonePermissionStatus.state;break}return e}};var Qi=(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))(Qi||{});function G(n,...r){let e=p.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function ge(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}G(n,r,...e)}function ye(n){return Object.assign({},n)}function Mt(n){return n.slice()}var Zr;(Rl=>{function n(f,D){G("onLocalStream",f,ye(D))}Rl.onLocalStream=n;function r(f,D){G("onScreenStream",f,ye(D))}Rl.onScreenStream=r;function e(f,D){G("onVmojiStream",f,ye(D))}Rl.onVmojiStream=e;function t(f){G("onVmojiError",f)}Rl.onVmojiError=t;function i(f,D){G("onLocalStreamUpdate",ye(f),D)}Rl.onLocalStreamUpdate=i;function a(f){d.debug("Local status:",f),G("onLocalStatus",f)}Rl.onLocalStatus=a;function s(f,D){ge("onRemoteStream",f,D)}Rl.onRemoteStream=s;function o(f,D){ge("onRemoteLive",f,D)}Rl.onRemoteLive=o;function l(f,D){ge("onLocalLive",f,D)}Rl.onLocalLive=l;function u(f,D){ge("onRemoteLiveUpdate",f,D)}Rl.onRemoteLiveUpdate=u;function m(f,D){ge("onLocalLiveUpdate",f,D)}Rl.onLocalLiveUpdate=m;function h(f,D){ge("onRemoteScreenStream",f,D)}Rl.onRemoteScreenStream=h;function E(f,D){ge("onRemoteVmojiStream",f,D)}Rl.onRemoteVmojiStream=E;function P(f,D,z){ge("onRemoteStreamSuspended",f,D,z)}Rl.onRemoteStreamSuspended=P;function C(f,D,z,Ue,yt){ge("onConversation",f,ye(D),ye(z),Ue,yt)}Rl.onConversation=C;function W(f){f&&G("onConversationParticipantListChunk",f)}Rl.onConversationParticipantListChunk=W;function $(f,D,z){ge("onRemoteMediaSettings",f,ye(D),z)}Rl.onRemoteMediaSettings=$;function J(f,D){ge("onLocalMediaSettings",f,ye(D))}Rl.onLocalMediaSettings=J;function Te(f,D,z){ge("onRemoteSharedMovieInfo",f,ye(D),z)}Rl.onRemoteSharedMovieInfo=Te;function Re(f,D,z){ge("onRemoteSharedMovieStoppedInfo",f,ye(D),z)}Rl.onRemoteSharedMovieStoppedInfo=Re;function re(f,D,z){ge("onLocalSharedMovieInfo",f,ye(D),z)}Rl.onLocalSharedMovieInfo=re;function ae(f,D,z){ge("onLocalSharedMovieStoppedInfo",f,ye(D),z)}Rl.onLocalSharedMovieStoppedInfo=ae;function Y(f,D,z){ge("onRemoteSharedUrl",f,D,z)}Rl.onRemoteSharedUrl=Y;function Ht(f,D){ge("onParticipantAdded",f,D)}Rl.onParticipantAdded=Ht;function Oa(f,D){ge("onParticipantJoined",f,D)}Rl.onParticipantJoined=Oa;function xa(f,D=!1){G("onLocalParticipantState",ye(f),D)}Rl.onLocalParticipantState=xa;function Na(f,D,z){ge("onRemoteParticipantState",f,ye(D),z)}Rl.onRemoteParticipantState=Na;function di(f,D){G("onRemoteParticipantsState",f,D)}Rl.onRemoteParticipantsState=di;function li(f,D,z=null){d.debug("Remote status:",D,f),ge("onRemoteStatus",f,D,z)}Rl.onRemoteStatus=li;function ne(){G("onPermissionsRequested")}Rl.onPermissionsRequested=ne;function La(f,D){G("onPermissionsError",f,D)}Rl.onPermissionsError=La;function Ua(f,D){ge("onRemoteRemoved",f,D)}Rl.onRemoteRemoved=Ua;function ee(f,D,z){G("onCallState",f,D,ye(z))}Rl.onCallState=ee;function Ba(f,D){G("onDeviceSwitched",f,D)}Rl.onDeviceSwitched=Ba;function Wi(f,D,z,Ue=!1,yt=!1,zr=null,Jr=null,ks,Ka,Os=null){let xs=Ka?Mt(Ka):void 0;G("onMuteStates",ye(f),Mt(D),Mt(z),Ue,yt,zr,Jr,ks,xs,Os)}Rl.onMuteStates=Wi;function $r(f,D,z=!1){ge("onRolesChanged",f,Mt(D),z)}Rl.onRolesChanged=$r;function Fa(f,D=!1){G("onLocalRolesChanged",Mt(f),D)}Rl.onLocalRolesChanged=Fa;function Va(f,D,z,Ue){ge("onPinnedParticipant",f,D,z,Ue)}Rl.onPinnedParticipant=Va;function ja(f,D){G("onLocalPin",f,D)}Rl.onLocalPin=ja;function qr(f){G("onOptionsChanged",Mt(f))}Rl.onOptionsChanged=qr;function Ha(){G("onCallAccepted")}Rl.onCallAccepted=Ha;function Ga(f,D){ge("onAcceptedCall",f,D)}Rl.onAcceptedCall=Ga;function he(){G("onRateNeeded")}Rl.onRateNeeded=he;function j(f){ge("onSpeakerChanged",f)}Rl.onSpeakerChanged=j;function ie(f){G("onVolumesDetected",Mt(f))}Rl.onVolumesDetected=ie;function le(f,D){G("onLocalVolume",f,D)}Rl.onLocalVolume=le;function _e(f,D){G("onJoinStatus",f,D)}Rl.onJoinStatus=_e;function st(f,D){G("onHangup",f,D)}Rl.onHangup=st;function qe(f){G("onMultipartyChatCreated",ye(f))}Rl.onMultipartyChatCreated=qe;function g(){G("onDeviceChange")}Rl.onDeviceChange=g;function T(f){G("onFingerprintChange",f)}Rl.onFingerprintChange=T;function y(){G("onTokenExpired")}Rl.onTokenExpired=y;function S(f,D,z=!1){G("onChatMessage",f,D,z)}Rl.onChatMessage=S;function A(f,D,z=!1){G("onCustomData",f,D,z)}Rl.onCustomData=A;function k(f,D,z,Ue,yt,zr,Jr=null){G("onRecordStarted",f,D,z,Ue,yt,zr,Jr)}Rl.onRecordStarted=k;function K(f=null,D){G("onRecordStopped",f,D)}Rl.onRecordStopped=K;function H(f){G("onLocalNetworkStatusChanged",f)}Rl.onLocalNetworkStatusChanged=H;function q(f){G("onNetworkStatusChanged",f)}Rl.onNetworkStatusChanged=q;function Ee(f,...D){G("onDebugMessage",f,...D)}Rl.onDebugMessage=Ee;function N(f,D){let z=Object.assign({},f,{memory:D});G("onStatistics",z)}Rl.onStatistics=N;function Ie(){G("onAutoplayError")}Rl.onAutoplayError=Ie;function Se(f,D,z,Ue,yt){G("onChatRoomUpdated",f,D,z,Ue,yt)}Rl.onChatRoomUpdated=Se;function De(f){G("onPromoted",f)}Rl.onPromoted=De;function fe(f){G("onRemoteMixedAudioStream",f)}Rl.onRemoteMixedAudioStream=fe;function xe(f){G("onJoinLinkChanged",f)}Rl.onJoinLinkChanged=xe;function bt(f){G("onRoomsUpdated",f)}Rl.onRoomsUpdated=bt;function Gt(f,D,z,Ue){G("onRoomUpdated",f,D,z,Ue)}Rl.onRoomUpdated=Gt;function tt(f){G("onRoomParticipantsUpdated",f)}Rl.onRoomParticipantsUpdated=tt;function pi(f){G("onRoomSwitched",f)}Rl.onRoomSwitched=pi;function Wa(f){G("onRoomStart",f)}Rl.onRoomStart=Wa;function ll(f,D=null){G("onFeedback",f,D)}Rl.onFeedback=ll;function pl(f){G("onFeaturesPerRoleChanged",f)}Rl.onFeaturesPerRoleChanged=pl;function ul(f){G("onParticipantVmojiUpdate",f)}Rl.onParticipantVmojiUpdate=ul;function ml(f,D){G("onAsrSet",f,D)}Rl.onAsrSet=ml;function hl(f,D,z){G("onAsrStarted",f,D,z)}Rl.onAsrStarted=hl;function gl(f){G("onAsrStopped",f)}Rl.onAsrStopped=gl;function _l(f,D,z,Ue){G("onAsrTranscription",f,D,z,Ue)}Rl.onAsrTranscription=_l;function fl(f,D){G("onParticipantIdChanged",f,D)}Rl.onParticipantIdChanged=fl;function Sl(f){G("onVideoSuspendSuggest",f)}Rl.onVideoSuspendSuggest=Sl;function vl(f){G("onSignalingMessage",typeof f=="string"?f:ye(f))}Rl.onSignalingMessage=vl;function Il(f){G("onPromotionApproved",f)}Rl.onPromotionApproved=Il;function El(){G("onPeerRegistered")}Rl.onPeerRegistered=El;function Tl(f,D){G("onVideoStreamDebug",f,D)}Rl.onVideoStreamDebug=Tl})(Zr||(Zr={}));var v=Zr;var ta="_okcls_",$t=(()=>{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 $s(n){let r=$t?$t.getItem(ta+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function qs(n,r){try{$t&&$t.setItem(ta+n,JSON.stringify(r))}catch{}}function zs(n){$t&&$t.removeItem(ta+n)}var ea;(t=>{function n(i){return $s(i)||null}t.get=n;function r(i,a){qs(i,a)}t.set=r;function e(i){zs(i)}t.remove=e})(ea||(ea={}));var St=ea;var zt=null,Xi=null,ar=null,sr=[],or=[],nr=[],ze=null,Je=null,cr=null,dr=!1,lr=!1,Zi,qt,er,ia=null,ra="",cn=null,tr=[],ir=null,dn=navigator.appVersion,Js=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 wt=class{constructor(r,e=!1,t=p.videoMaxWidth,i=p.videoMaxHeight,a=p.videoFrameRate){c(this,"audio");c(this,"video");c(this,"needVideo");c(this,"lastSimplifyWasReached");c(this,"supportedConstraints");c(this,"isVideoRequested",()=>this.needVideo);this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(r){s={noiseSuppression:p.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let l=Pe.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&&Pe.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 o=!1;if(e){o={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=Pe.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&&Pe.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?o.groupId={exact:m}:u&&(o.deviceId={exact:u}),p.videoFacingMode&&(o.facingMode={ideal:p.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=s,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 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}},aa=class extends wt{constructor(e,t,i,a){super(!1,!0);c(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,Pe.browserName()==="Safari"){let s=Number(Pe.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})}},Dt=class Dt{constructor(){c(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(Dt._lockId)throw b.log(w.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");Dt._lockId=this._lockId}free(){Dt._lockId===this._lockId&&(Dt._lockId=0)}};c(Dt,"_lockId",0);var pr=Dt;async function ln(){lr=!1,dr=!1,zt=null;let n={camera:Pe.getSavedCamera(),microphone:Pe.getSavedMicrophone(),output:Pe.getSavedOutput()};await na(),Ys("devicechange",n),v.onDeviceChange()}function Ys(n,...r){if(ot[n])for(let e of ot[n])e(...r)}async function na(){return zt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!Xi&&navigator.mediaDevices.addEventListener&&(Xi=I.debounce(ln,p.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",Xi)),!ar&&Ii.isSupported()&&(ar=new Ii,await ar.init((n,r)=>{switch(r){case"denied":case"prompt":Xi?.();break}})),zt=navigator.mediaDevices.enumerateDevices().then(n=>{sr=n.filter(i=>i.kind==="videoinput"?(i.label&&(dr=!0),!0):!1),or=n.filter(i=>i.kind==="audioinput"?(i.label?lr=!0:Pe.isMobile()&&Pe.browserName()==="Firefox"&&(lr=dr),!0):!1),nr=n.filter(i=>i.kind==="audiooutput");let r=ze?.deviceId??St.get("videoinput"),e=Je?.deviceId??St.get("audioinput"),t=cr?.deviceId??St.get("audiooutput");return ze=sr.find(i=>i.deviceId===r)||null,Je=or.find(i=>i.deviceId===e)||null,cr=nr.find(i=>i.deviceId===t)||nr[0]||null,zt=Promise.resolve(n),n}).catch(()=>(zt=null,[]))))}async function Qs(){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]);cn=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function Xs(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(Pe.getMicrophones(),e):!ze&&e.kind==="video"&&(ze=r(Pe.getCameras(),e))})}async function Ei(n,r){d.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative())));let e=(!n.isVideo()||Pe.hasCameraPermission())&&(!n.isAudio()||Pe.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new pr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await ln(),Xs(i),i}catch(i){switch(t.free(),d.error("getUserMedia error",i),i.name){case"PermissionDeniedError":case"PermissionDismissedError":case"NotAllowedError":case"SecurityError":case"DOMException":case"NotFoundError":r=n.isVideoRequested()?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 Ei(n.simplify(),r);let a=r||oe.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function Zs(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new pr;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 rr(){return tr.length||(tr=(()=>{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]:Js,n&&n[1]||i[2]||dn,r,e,t]})()),tr}var Pe;(he=>{async function n(){await na(),await Qs()}he.init=n;function r(){return sr}he.getCameras=r;function e(){return or}he.getMicrophones=e;function t(){return nr}he.getOutput=t;function i(){return sr.length>0}he.hasCamera=i;function a(){return or.length>0}he.hasMicrophone=a;function s(){return ze}he.getSavedCamera=s;function o(){return Je}he.getSavedMicrophone=o;function l(){return cr}he.getSavedOutput=l;function u(){return p.videoFacingMode}he.getVideoFacingMode=u;function m(){return dr}he.hasCameraPermission=m;function h(){return lr}he.hasMicrophonePermission=h;function E(){return ar?.getPermissionState("microphone")??null}he.getMicrophonePermissionState=E;function P(j=!1){return h()?i()&&j?m():!0:!1}he.hasPermissions=P;async function C(j=!1,ie=!0,le=!0){let _e=a()&&ie,st=i()&&j,qe;if(!_e&&!st)qe=new MediaStream;else try{qe=await Ei(new wt(_e,st))}catch{qe=new MediaStream}return!qe.getVideoTracks().length&&le&&qe.addTrack(he.getBlackMediaTrack()),!qe.getAudioTracks().length&&le&&qe.addTrack(he.getSilentMediaTrack()),qe}he.getUserMedia=C;async function W(j,ie){let le=j&&!p.consumerFastScreenShare?p.fastScreenShareWidth:window.screen.width,_e=j&&!p.consumerFastScreenShare?p.fastScreenShareHeight:window.screen.height,st=p.getScreenFrameRate(j);return Zs(new aa(le,_e,st,ie))}he.getScreenMedia=W;async function $(j=!1,ie){let le=j?p.videoEffectMaxWidth:p.videoMaxWidth,_e=j?p.videoEffectMaxHeight:p.videoMaxHeight;return Ei(new wt(!1,!0,le,_e,ie))}he._getUserVideo=$;async function J(j,ie){let le=ie?.width||p.videoMaxWidth,_e=ie?.height||p.videoMaxHeight;return Ei(new wt(!1,j||!0,le,_e))}he.getUserVideo=J;async function Te(j){return Ei(new wt(j||!0,!1))}he.getUserAudio=Te;async function Re(j,ie){let[le]=j.getVideoTracks();if(!le)throw new Error("Video track not found in stream");return zi(le,ie)}he.setResolution=Re;async function re(j,ie){let _e=(await na()).find(st=>st.kind===j&&st.deviceId===ie);return _e?(j==="videoinput"?ze=_e:j==="audioinput"?Je=_e:j==="audiooutput"&&(cr=_e),St.set(j,ie),_e):null}he._saveDeviceId=re;function ae(){if(!er||er.readyState==="ended"){let j=he.getAudioContext(),ie=j.createMediaStreamDestination(),le=j.createGain();le.gain.value=1e-5,le.connect(ie),le.connect(j.destination);let _e=j.createOscillator();_e.type="sine",_e.frequency.value=0,_e.connect(le),_e.start(),er=ie.stream.getAudioTracks()[0]}return Object.assign(er.clone(),{enabled:!1})}he.getSilentMediaTrack=ae;function Y(j=p.videoMinWidth,ie=p.videoMinHeight){qt||(qt=document.createElement("canvas")),qt.width=j,qt.height=ie;let le=qt.getContext("2d");return le.rect(0,0,j,ie),le.fillStyle="black",le.fill(),(!Zi||Zi.readyState==="ended")&&(Zi=qt.captureStream(p.videoFrameRate).getVideoTracks()[0]),Object.assign(Zi.clone(),{enabled:!1})}he.getBlackMediaTrack=Y;function Ht(){if(Wi()==="Edge"&&Number($r())<70)return!1;try{let j=window;return"mediaDevices"in j.navigator&&"getUserMedia"in j.navigator.mediaDevices&&j.RTCPeerConnection&&j.RTCIceCandidate&&j.RTCSessionDescription&&j.HTMLCanvasElement&&j.HTMLCanvasElement.prototype.captureStream&&j.RTCRtpSender&&j.RTCRtpSender.prototype.replaceTrack&&j.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}he.isBrowserSupported=Ht;function Oa(){return!!navigator.mediaDevices.getDisplayMedia}he.isScreenCapturingSupported=Oa;function xa(){let j=he.browserName()==="Safari"&&he.browserVersion()==="15"&&he.browserSubVersion()==="1",ie=he.browserName()==="Opera",le=he.browserName()==="Yandex";return j||ie||le}he.isBrokenH264Decoder=xa;function Na(){return he.browserName()==="Yandex"&&he.os()==="Windows"||p.simulcast}he.isBrokenVP9Encoder=Na;function di(){let j=he.browserName()==="Safari"&&Number(he.browserVersion())===17&&[4,5,6].includes(Number(he.browserSubVersion())),ie=he.os()==="Windows"&&he.osVersion()===10;return j||ie}he.isBrokenVP9Decoder=di;function li(){return he.browserName()==="Firefox"&&Number(he.browserVersion())<60}he.isOldDataChannelDescription=li;function ne(){return!(he.baseChromeVersion()&&he.isMobile())}he.canPreferH264=ne;function La(){return!(he.browserName()==="Firefox"||he.browserName()==="Safari")}he.isSimulcastSupportedByBrowser=La;function Ua(){return ra||(ra=(()=>{let j={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let ie in j)if(Object.hasOwn(j,ie)&&j[ie].test(Be))return ie;return"Unknown"})()),ra}he.os=Ua;function ee(){return cn}he.osVersion=ee;function Ba(){return ia===null&&(ia=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(dn)),ia}he.isMobile=Ba;function Wi(){return rr()[0]}he.browserName=Wi;function $r(){return rr()[1]}he.browserVersion=$r;function Fa(){return rr()[3]}he.baseChromeVersion=Fa;function Va(){return ir||(ir=new(window.AudioContext||window.webkitAudioContext)),ir.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),ir}he.getAudioContext=Va;function ja(){return rr()[4]}he.browserSubVersion=ja;function qr(){return he.baseChromeVersion()>=105&&!he.isMobile()}he.isAudioShareSupported=qr;function Ha(j,ie){ot[j]||(ot[j]=[]),ot[j].push(ie)}he.addEventListener=Ha;function Ga(j,ie){if(ot[j])if(!ie)delete ot[j];else{let le=ot[j].indexOf(ie);le>-1&&ot[j].splice(le,1)}}he.removeEventListener=Ga})(Pe||(Pe={}));var M=Pe;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: ${M.hasCameraPermission()}, Mic: ${M.hasMicrophonePermission()}`]],e=new Date,t=e.getTime(),i=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return r.map(a=>({h:i,t,l:"LOG",d:a}))}static collectLogs(){let r=We._list;return r.length===0?[]:[...We._createContextLogs(),...r]}};c(We,"_list",[]),c(We,"_conversationId",null);var Ne=We;var ur=class{constructor(){c(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 sa=2*1024*1024,pn=512*1024,Jt=100*1024,eo=5,ca="_okcls_logs_session_",to=3e4,da=class{constructor(){c(this,"_items",[]);c(this,"_itemsSize",0);c(this,"_storageSize",sa);try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(ca)!==0)continue;let t=r.getItem(e);if(!t){un(e);continue}let i=hn(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(Jt)}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,sa)}add(r,e){let t=parseInt(r.replace(ca,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(un(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>sa||this.length>eo-1||this.size+r>this.available);)this.deleteOldestItem()}};function mn(){return`${ca}${Date.now()}`}function hn(n){return new Blob([n]).size}function un(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function mr(){let n=vt.toString();if(!ke.available||!n)return;let r=hn(n);if(r>pn){vt.bisect(),mr();return}ke.cleanup(Jt+r);try{window.localStorage.setItem(hr,n)}catch(e){if(console.warn("Failed to write log to storage",e),ke.storageSize=ke.size+r,ke.cleanup(Jt+r),ke.available>=Jt+r){mr();return}if(r>Jt){vt.bisect(),mr();return}ke.storageSize=0;return}r>pn&&(ke.add(hr,r),hr=mn(),vt.clear(),ke.cleanup(Jt))}function la(){!ke.available||!vt.length||mr()}function io(n=!1){let r=[];try{let i=window.localStorage;for(let s of ke.items){let o=i.getItem(s.key);r.push(o)}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 ro(e,t),t}function ro(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 gn(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),oa||(oa=window.setTimeout(()=>{oa=null,la()},to))}function pa(){ke||(ke=new da,vt=new ur,hr=mn(),window.addEventListener("beforeunload",la))}var ke,vt,hr,oa=null;window.__VKCallsSDKLogs__=(n=!1)=>(ke||pa(),la(),io(n));var ma=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(ma||{}),ua;(re=>{let n="📞",r=(ae,...Y)=>{v.onDebugMessage(ae,...Y)},e=!1,t=(ae,Y)=>(...Ht)=>{ae(...Ht),gn(Y,Ht)},i=console.debug.bind(console,n),a=console.log.bind(console,n),s=console.warn.bind(console,n),o=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");re.debug=l,re.log=u,re.warn=m,re.error=h;function $(){return e}re.enabled=$;function J(ae){e=ae,p.debugLog&&pa(),ae?(re.debug=p.debugLog?t(i,"DEBUG"):i,re.log=p.debugLog?t(a,"LOG"):a,re.warn=p.debugLog?t(s,"WARN"):s,re.error=p.debugLog?t(o,"ERROR"):o):(re.debug=p.debugLog?t(l,"DEBUG"):l,re.log=p.debugLog?t(u,"LOG"):u,re.warn=p.debugLog?t(m,"WARN"):m,re.error=p.debugLog?t(h,"ERROR"):h)}re.toggle=J;function Te(ae,...Y){switch(ae){case"DEBUG":(0,re.debug)(...Y);break;case"LOG":(0,re.log)(...Y);break;case"WARN":(0,re.warn)(...Y);break;case"ERROR":(0,re.error)(...Y);break}}re.send=Te;function Re(ae,...Y){}re.test=Re})(ua||(ua={}));var d=ua;var no="kf";function Yt(n){return n.stopStream}function ha(n){return n.keyFrameRequested}function _n(n){if(Yt(n))return"ss";if(ha(n))return no;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 kt=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(kt||{}),fn="s",Sn="m";function it(n){return n.participantId+(n.mediaType?Wt+fn+n.mediaType:"")+(n.streamName?Wt+Sn+n.streamName:"")}function Qt(n){let r=n.split(Wt),e=r.shift();if(!e)throw new Error("Illegal stream description: "+n);let t=null,i,a=0;for(let o of r)switch(o.charAt(0)){case fn:t=so(o.slice(1));break;case Sn:i=o.slice(1);break;case qi:a=Number.parseInt(o.slice(1),10);break;default:throw new Error("Unexpected parameter type "+o.charAt(0)+" in stream description "+n)}return{participantId:I.compose(e,a),mediaType:t,streamName:i}}function so(n){for(let r of Object.keys(kt))if(r===n)return kt[r];return null}function rt(){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),oo(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 oo(n){return n.buffer!==void 0}function gr(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 vn=0,In=1,co=2,lo=3,po=4,uo=5,mo=6,ho=7,go=0,_o=1,fo=2,ct=0,So=0,vo=0,Io=1,_r=class{constructor(){c(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=rt();L.Int.enc(t,vn),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=rt();if(this.writeStreamDesc(e,a),Yt(i))L.Int.enc(a,_o);else if(ha(i))L.Int.enc(a,fo);else if(L.Int.enc(a,go),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,vo);break;case"cn":L.Int.enc(a,Io);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=rt();return L.Int.enc(t,In),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=rt();return L.Int.enc(t,co),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=rt();return L.Int.enc(t,lo),L.Int.enc(t,ct),L.Int.enc(t,r),L.Bool.enc(t,e.request),t.ui8array().buffer}serializeNetworkStatReport(r,e){let t=rt();return L.Int.enc(t,po),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=rt();return L.Int.enc(t,uo),L.Int.enc(t,ct),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeEnableVideoSuspendSuggest(r,e){let t=rt();return L.Int.enc(t,mo),L.Int.enc(t,ct),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=rt();L.Int.enc(t,ho),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 an(r);e=gr(s)}else e=gr(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)!==So){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case vn:return this.deserializeUpdateDisplayLayoutResponse(e);case In: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=gr(a),o=L.Any.dec(s);if(typeof o=="string")i[o]=L.Int.dec(s);else{let l=o,u=it(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 En=(Y=>(Y.CALL_FINISH="call_finish",Y.CODEC_USAGE="codec_usage",Y.SIGNALING_CONNECTED="signaling_connected",Y.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",Y.FIRST_MEDIA_RECEIVED="first_media_received",Y.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",Y.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",Y.CALL_START="call_start",Y.SIGNALING_PING_SUMMARY="signaling_ping_summary",Y.SIGNALING_COMMAND_SUMMARY="signaling_command_summary",Y.WEBSOCKET_CONNECTED="websocket_connected",Y.WEBSOCKET_RECONNECTED="websocket_reconnected",Y.WEBSOCKET_FAILED_PINGS="websocket_failed_pings",Y.WEBSOCKET_FAILED_EXCEPTION="websocket_failed_exception",Y.WEBSOCKET_TIMEOUT="websocket_timeout",Y.WEBSOCKET_RESTART="websocket_restart",Y.WEBTRANSPORT_CONNECTED="webtransport_connected",Y.WEBTRANSPORT_RECONNECTED="webtransport_reconnected",Y.WEBTRANSPORT_FAILED_PINGS="webtransport_failed_pings",Y.WEBTRANSPORT_FAILED_EXCEPTION="webtransport_failed_exception",Y.WEBTRANSPORT_TIMEOUT="webtransport_timeout",Y.WEBTRANSPORT_RESTART="webtransport_restart",Y))(En||{}),X=En;var Eo=1e3;function ce(n,r,e=0){return r in n&&n[r]?n[r]:e}function ga(...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 To(n){return(r,e)=>e[n]-r[n]}function Ti(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function Tn(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function fa(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])?fa(e[1]):e[1],r),{})}function Rn(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function Ro(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(Rn).then(Tn)}function Cn(n){let r=n.filter(It("type","candidate-pair")).sort(To("priority")).find(ga(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}}),fa(e)}function _a(n,r,e=!1){let t=Ti("id",n),i=e?n.filter(ga(It("type","remote-inbound-rtp"))):n.filter(ga(It("type","inbound-rtp"),It("type","outbound-rtp")));return M.browserName()==="Firefox"&&(i=Object.values(i.reduce((a,s)=>{if(!a[s.ssrc])a[s.ssrc]=s;else{let o=Object.assign({},a[s.ssrc],s),l=a[s.ssrc].isRemote?s:a[s.ssrc];o.id=l.id,o.type=l.type,delete o.isRemote,delete o.remoteId,a[o.ssrc]=o}return a},{}))),i.map(a=>{let s=Number(a.ssrc),o=a.mediaType||a.kind,l=("trackIdentifier"in a&&typeof a.trackIdentifier=="string"?a.trackIdentifier:void 0)||a.remoteId||a.trackId,u=a.type,m=a.codecId;if(!u||!s||!o)return null;let h={ssrc:s,type:u,kind:o,bytesReceived:ce(a,"bytesReceived"),bytesSent:ce(a,"bytesSent"),headerBytesReceived:ce(a,"headerBytesReceived"),headerBytesSent:ce(a,"headerBytesSent"),jitter:ce(a,"jitter"),packetsLost:ce(a,"packetsLost"),packetsReceived:ce(a,"packetsReceived"),packetsSent:ce(a,"packetsSent"),fractionLost:ce(a,"fractionLost"),pliCount:ce(a,"pliCount"),firCount:ce(a,"firCount"),nackCount:ce(a,"nackCount"),userId:r[s],freezeCount:ce(a,"freezeCount",0),totalFreezesDuration:ce(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),l&&(h.trackId=l),o==="video"){let C=ce(a,"framesDecoded"),W=ce(a,"totalInterFrameDelay"),$=ce(a,"totalSquaredInterFrameDelay"),J=ce(a,"encoderImplementation"),Te=ce(a,"decoderImplementation"),Re=ce(a,"frameHeight",void 0),re=ce(a,"frameWidth",void 0),ae=ce(a,"framesPerSecond",void 0);J&&(h.encoderImplementation=J),Te&&(h.decoderImplementation=Te),Re&&(h.frameHeight=Re),re&&(h.frameWidth=re),ae&&(h.framesPerSecond=ae),h.interframeDelayVariance=($-W*W/C)/C}if(o==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=ce(a,"totalEncodeTime")??0),o==="audio"&&(h.totalSamplesReceived=ce(a,"totalSamplesReceived"),h.concealedSamples=ce(a,"concealedSamples"),h.insertedSamplesForDeceleration=ce(a,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=ce(a,"removedSamplesForAcceleration"),h.silentConcealedSamples=ce(a,"silentConcealedSamples"),h.concealmentEvents=ce(a,"concealmentEvents"),h.totalAudioEnergy=ce(a,"totalAudioEnergy")),m&&t[m]){let C=t[m];h.clockRate=C.clockRate,h.mimeType=C.mimeType,o==="audio"&&C.sdpFmtpLine&&(h.sdpFmtpLine=C.sdpFmtpLine)}if(l&&t[l]){let C=t[l];h.frameHeight=h.frameHeight??C.frameHeight,h.frameWidth=h.frameWidth??C.frameWidth,h.framesDecoded=C.framesDecoded,h.framesReceived=C.framesReceived,h.framesDropped=C.framesDropped}return fa(h)}).filter(a=>!!a)}function bn(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=Ti("ssrc",n?.remoteRtps||[]),i=Ti("ssrc",r?.remoteRtps||[]));let a=Ti("ssrc",n.rtps),s=Ti("ssrc",r.rtps),o=(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)/o),u.bandwidth+=Math.round((u.headerBytesReceived-m.headerBytesReceived)/o)),u.bytesSent&&u.bytesSent>m.bytesSent&&(u.bandwidth=Math.round((u.bytesSent-m.bytesSent)/o),u.bandwidth+=Math.round((u.headerBytesSent-m.headerBytesSent)/o)),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)/o).toFixed(0))),e&&u.type==="outbound-rtp"&&u.kind==="video"){let h=t?.[l],E=i?.[l],P=$=>$??0,C=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(C/W*100)}}}}),n}async function yn(n,r,e={},t=!1){let i=await Ro(n),a={timestamp:Date.now(),transport:Cn(i),rtps:_a(i,e)};return t&&(a.remoteRtps=_a(i,e,!0)),r?bn(a,r,t):(await I.delay(Eo),yn(n,a,e,t))}function Co(n){performance.clearMarks(n),performance.mark(n)}function bo(n){performance.clearMarks(n)}function yo(n){let r=performance.getEntriesByName(n)[0];if(typeof r>"u")return null;let e=Math.round(performance.now()-r.startTime);return performance.clearMarks(n),e}function Po(n){return`${X.SCREENSHARE_FIRST_FRAME}_${Ao(n)}`}function Ao(n){return typeof n=="string"?n:JSON.stringify(n)}var ue={distinctById:Tn,rtcStatsToArray:Rn,extractTransport:Cn,extractRtps:_a,delta:bn,collectStats:yn,setMark:Co,clearMark:bo,measureMark:yo,getMarkNameScreenshareFirstFrame:Po};var Ye=class Ye{constructor(){c(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}),b.logClientStats(e);Ye._instance._eventualLogs.clear()}b.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=ue.measureMark(r.name)),r.value!==null&&Ye._instance?._eventualLogs.add(r)}static destroy(){Ye._instance?._destroy(),Ye._instance=null}_destroy(){this._eventualLogs.clear()}};c(Ye,"_instance",null);var Ae=Ye;var Sa={connected:{wt:X.WEBTRANSPORT_CONNECTED,ws:X.WEBSOCKET_CONNECTED},reconnected:{wt:X.WEBTRANSPORT_RECONNECTED,ws:X.WEBSOCKET_RECONNECTED},failed_pings:{wt:X.WEBTRANSPORT_FAILED_PINGS,ws:X.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:X.WEBTRANSPORT_FAILED_EXCEPTION,ws:X.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:X.WEBTRANSPORT_TIMEOUT,ws:X.WEBSOCKET_TIMEOUT},restart:{wt:X.WEBTRANSPORT_RESTART,ws:X.WEBSOCKET_RESTART}};var Ri=class{constructor(r){c(this,"q");c(this,"inits",[]);c(this,"n",[1,2,3,4,5]);c(this,"np",[1,1,1,1,1]);c(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 fr=class{constructor(){c(this,"n",0);c(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(){c(this,"count",0);c(this,"minVal",1/0);c(this,"maxVal",-1/0);c(this,"mean",new fr);c(this,"p50",new Ri(.5));c(this,"p95",new Ri(.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 Pn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(Pn||{}),Me=Pn;var An=(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))(An||{}),U=An;var Mn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(Mn||{}),lt=Mn;var{isObject:Dn,isObjectsEquals:Mo}=I;function Sr(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||Dn(n.bitrates)&&Dn(r.bitrates)&&!Mo(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function vr(n,r){return!(!Sr(n.camera,r.camera)||!Sr(n.screenSharing,r.screenSharing)||!Sr(n.fastScreenSharing,r.fastScreenSharing))}function va(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 wn(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Et=class Et{constructor(){c(this,"_codecUsages",new Map);c(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 o=a.find(l=>l.kind==="video");return o?o.totalEncodeTime=(o.totalEncodeTime??0)+(s.totalEncodeTime??0):a.push(s),a},[])),i.forEach(a=>{let s=a.kind,o=a.mimeType;if((s==="audio"||s==="video")&&o){let l=a.encoderImplementation,u=[o,"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:X.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),b.logClientStats(e)}static destroy(){Et._instance?._destroy(),Et._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};c(Et,"_instance",null);var at=Et;var Ot=class extends de{constructor(e,t){super();c(this,"_signaling");c(this,"_mediaSource");c(this,"_state","IDLE");c(this,"_pc",null);this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var kn="videochat-epi",Do=5e3,wo=500,Tt=class extends de{constructor(e,t,i=!1){super();c(this,"_previousPerfStatReportTimestamp",0);c(this,"_previousNetworkStatReportTimestamp",Date.now());c(this,"_previousCallStatReportTimestamp",Date.now());c(this,"_previousCallStatReport",null);c(this,"_screenShareStats",[]);c(this,"_signaling");c(this,"_directTopology");c(this,"_handleScreenSharingStat",e=>{this._screenShareStats.push(e)});c(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(kn)||"",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+Do<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+wo<=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(kn,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:xn(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:xn(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&&!Ir(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!Ir(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!Ir(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&&!Ir(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),C=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=xt(m/u*1e3),s.removed_audio_samples_for_acceleration=xt(h/u*1e3),s.concealed_audio_samples=xt(E/u*1e3),s.concealed_silent_audio_samples=xt(P/u*1e3),s.concealment_audio_avg_size=xt(E/C),s.total_audio_energy=t.total_audio_energy}On(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),On(t,"remote_address","remote_connection_type")&&(s.remote_address=t.remote_address,s.remote_connection_type=t.remote_connection_type);let o=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(o>0){let u=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=xt(u/o*100)}if(l>0){let u=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=xt(u/l*100)}Ae.logCallStat(s),p.enableLogPerfStatReport&&d.log("Sent call stats",s),this._previousCallStatReport=t}};function On(n,...r){for(let e of r)if(!Object.hasOwn(n,e)||n[e]===void 0)return!1;return!0}function xn(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function Ir(n){return n===void 0}function xt(n){return Number.isNaN(n)?0:n}function Er(n){return n==null?"-":String(n)}function ko(n,r){return n&&r?`${n}x${r}`:"-"}function Oo(n){return n==null?"-":`${Math.round(n/1e3)} kbps`}var Ia;(t=>{function n(i){return[`[${i.direction} video]`,`participant: ${i.externalParticipantId.id}`,`track: ${Er(i.trackId)}`,`codec: ${Er(i.mimeType)}`,`resolution: ${ko(i.width,i.height)}`,`fps: ${Er(i.frameRate)}`,`bitrate: ${Oo(i.bitrate)}`,`packets lost: ${Er(i.packetsLost)}`].join(`
|
|
10
|
-
`)}t.format=n;function r(i){!p.debugVideoStreams||!p.get("onVideoStreamDebug")||v.onVideoStreamDebug(i.externalParticipantId,n(i))}t.send=r;function e(i){!p.debugVideoStreams||!p.get("onVideoStreamDebug")||v.onVideoStreamDebug(i,"")}t.clear=e})(Ia||(Ia={}));var Ea=Ia;var bi=class{constructor(r,e=null){c(this,"weightUp");c(this,"weightDown");c(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 Nn=.25,Ln=.35,xo=85,No=.1,Lo=1.5,Uo=.1,Bo=1,Fo=.6,Vo=.3;var yi=class extends de{constructor(e){super();c(this,"_signaling");c(this,"_localNetworkStat");c(this,"_remoteNetworkStat");c(this,"_lastNetworkStat");c(this,"_networkLimits",{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}});c(this,"_lastStatSentTimestamp",0);c(this,"_currentState","good");this._signaling=e,this._localNetworkStat={rtt:new bi(Nn,Nn),loss:new bi(Ln,Ln),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 o=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||o-this._lastStatSentTimestamp>p.networkStatisticsInterval)&&(this._lastStatSentTimestamp=o,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 Ho=30*1e3,Pi=class n extends Ot{constructor(e,t,i,a,s){super(i,a);c(this,"_participantId");c(this,"_isMaster");c(this,"_hasOutboundVideoDebug",!1);c(this,"_hasInboundVideoDebug",!1);c(this,"_videoDebugBytes",{});c(this,"_remoteSDP",{});c(this,"_remoteCandidates",{});c(this,"_lastRemoteSDP",null);c(this,"_animojiDataChannel",null);c(this,"_animojiReceiver",null);c(this,"_animojiSender",null);c(this,"_remoteAnimojiVersion",1);c(this,"_isOpen",!1);c(this,"_remotePeerId",null);c(this,"_statInterval",null);c(this,"_settingsInterval",null);c(this,"_failedOnCreate",null);c(this,"_remoteStream",null);c(this,"_iceRestartTimeout",null);c(this,"_reconnectionTimeout",null);c(this,"_reconnectionPrevented",!1);c(this,"_lastStat");c(this,"_fingerprint",null);c(this,"_neverConnected",!0);c(this,"_serverSettings");c(this,"_prevConsumerSettings",{});c(this,"_networkLimitsForVideo",{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}});c(this,"_videoMaxDimensionsForNet",{worst:320,bad:640,good:1280});c(this,"_lastVideoMaxDimension",this._videoMaxDimensionsForNet.good);c(this,"_lastBadConnection",0);c(this,"_perfStatReporter");c(this,"_directStatReporter");this._participantId=e,this._isMaster=t,this._serverSettings=s,this._perfStatReporter=new Tt(this,i,!0),this._directStatReporter=new yi(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(o){d.error("Failed to create RTCPeerConnection:",o),this.close(o);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,o=>{this._animojiDataChannel=o,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(o){b.log(w.ERROR,"addTrack-direct"),d.error("Unable to add media source tracks",o,{participantId:this._participantId}),this._failedOnCreate=o;return}this._createOffer(!1).catch(o=>{this._state==="IDLE"?this._failedOnCreate=o:this.close(o)})}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){b.log(w.ERROR,"addTrack-direct"),d.error("DirectTransport: Unable to add media source tracks",i,{participantId:this._participantId}),this.close(i);return}this._setState("OPENED");let t=e;if(!e){let i=Object.keys(this._remoteSDP);t=i[i.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){vr(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 b.log(w.ERROR,"addIceCandidate-direct"),d.error("Unable to add remote ice candidate",i,{participantId:this._participantId,candidate:t}),i}}else d.debug("Cache remote ice candidate",{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){d.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let i of t)try{await this._addIceCandidate(e,i)}catch{}}async _setRemoteDescription(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc){if(this._lastRemoteSDP?.sdp===t.sdp)return;this._lastRemoteSDP=t,t=n._patchRemoteDescription(t),d.debug("Add remote description",{participantId:this._participantId,sdp:t}),this._calcFingerprint(t.sdp);try{await this._pc.setRemoteDescription(t),await this._setRemoteCandidates(e),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(i){throw b.log(w.ERROR,"setRemoteDescription-direct"),d.error("Unable to set remote description",i,{participantId:this._participantId,sdp:t}),i}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,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":M.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&&(b.log(w.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}),b.log(w.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?(b.log(w.ICE_RESTART),d.log("Ice restart",{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):d.debug("Waiting for ice restart...",{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,d.error("Ice restart failed",{participantId:this._participantId}),b.log(w.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}),b.log(w.ERROR,"createOffer-direct"),a}try{return d.debug("Set local description",{participantId:this._participantId,offer:i}),this._calcFingerprint(i.sdp),await this._pc?.setLocalDescription(i),i}catch(a){throw d.error("Unable to set local description",a,{participantId:this._participantId}),b.log(w.ERROR,"setLocalDescription-direct"),a}}async _createAnswer(){d.debug("Create answer",{participantId:this._participantId});let e;try{e=await this._pc?.createAnswer(),d.debug("Created answer",{participantId:this._participantId,answer:e}),e=n._patchLocalDescription(e)}catch(t){throw d.error("Unable to create answer",t,{participantId:this._participantId}),b.log(w.ERROR,"createAnswer-direct"),t}try{return d.debug("Set local description",{participantId:this._participantId,answer:e}),this._calcFingerprint(e.sdp),await this._pc?.setLocalDescription(e),e}catch(t){throw d.error("Unable to set local description",t,{participantId:this._participantId}),b.log(w.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!M.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,p.preferH264&&M.canPreferH264(),M.isBrokenH264Decoder(),p.preferVP9,t&&p.audioNack),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,p.preferVP9,M.isBrokenVP9Encoder(),M.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(i=>{d.error("DirectTransport: Unable to replace track",i,{participantId:this._participantId}),b.log(w.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}ue.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,at.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._reportVideoStreamDebug(i),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)}_reportVideoStreamDebug(e){if(!p.debugVideoStreams)return;let t=e.outbound.rtps.find(s=>s.kind==="video");if(t){this._hasOutboundVideoDebug=!0;let s=this._mediaSource.getSendVideoTrack(),o=s?.getSettings();this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"outbound",trackId:s?.id,mimeType:t.mimeType,width:t.frameWidth??o?.width,height:t.frameHeight??o?.height,frameRate:t.framesPerSecond??o?.frameRate,bitrate:t.bandwidth?t.bandwidth*8:this._getVideoDebugBitrate("outbound",t.bytesSent,t.headerBytesSent),packetsLost:t.packetsLost})}else!t&&this._hasOutboundVideoDebug&&(this._hasOutboundVideoDebug=!1,this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"outbound",clear:!0}));let i=e.inbound.rtps.find(s=>s.kind==="video"),a=this._remoteStream?.getVideoTracks()[0];i?(this._hasInboundVideoDebug=!0,this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"inbound",streamId:this._participantId,trackId:a?.id,mimeType:i.mimeType,width:i.frameWidth,height:i.frameHeight,frameRate:i.framesPerSecond,bitrate:i.bandwidth?i.bandwidth*8:this._getVideoDebugBitrate("inbound",i.bytesReceived,i.headerBytesReceived),packetsLost:i.packetsLost})):!i&&this._hasInboundVideoDebug&&(this._hasInboundVideoDebug=!1,this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"inbound",streamId:this._participantId,clear:!0}))}_getVideoDebugBitrate(e,t,i){if(t===void 0||i===void 0)return;let a=this._videoDebugBytes[e];if(this._videoDebugBytes[e]={bytes:t,headerBytes:i},!(!a||t<a.bytes||i<a.headerBytes))return Math.round((t-a.bytes+i-a.headerBytes)/(p.statisticsInterval/1e3)*8)}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 o={type:M.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:s.width,height:s.height,bitrate:a.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(o)).supported||!1}catch(l){return d.warn("Failed to get encodingInfo",o,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,o=this._videoMaxDimensionsForNet.good,l="L1T1";if(a?(this._lastBadConnection=Date.now(),s?(o=this._videoMaxDimensionsForNet.bad,l="L1T2"):(o=this._videoMaxDimensionsForNet.worst,l="L1T3")):i&&(o=this._videoMaxDimensionsForNet.good,l="L1T1"),!(o<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Ho)||this._lastVideoMaxDimension===o)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:o}),this._lastVideoMaxDimension=o;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.getMediaSettings().isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState==="connected"&&(this._prevConsumerSettings=I.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{negotiated:!0,id:1});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),a.onerror=o=>{d.error(`[${t}] data channel error`,o)},i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)}}};var Un=(t=>(t.AUDIO_MIX="audio-mix",t.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",t.TRANSPARENT_AUDIO_TRACK_PREFIX="ta",t))(Un||{}),we=Un;var Go=16,Rr=class n{constructor(r,e,t){c(this,"_datachannel");c(this,"_participantIdRegistry");c(this,"_asrCallback");c(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),o=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:o,duration:l,data:r.slice(Go)}}_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(){c(this,"_value",1)}get value(){return this._value}set value(r){this._value=r}};c(Rt,"_instance",null),c(Rt,"getInstance",()=>(Rt._instance||(Rt._instance=new Rt),Rt._instance));var Xt=Rt;var pt=require("messagepack");var Cr=class{constructor(){c(this,"streamDescriptionByCompactId",new Map);c(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,C])=>{let W=Qt(P);this.streamDescriptionByCompactId.set(C,W),this.compactIdByStreamDescription.set(P,C)}),null;case 2:case 4:let s=(0,pt.decode)(i),o=[];for(let P of s){let C=this.getStreamDescription(P);C&&o.push(C.participantId)}return t===2?{type:"notification",notification:U.AUDIO_ACTIVITY,activeParticipants:o}:{type:"notification",notification:U.STALLED_ACTIVITY,stalledParticipants:o};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,C]of Object.entries(m)){let W=this.getStreamDescription(Number(P))?.participantId;W&&(h[W]=C/100)}return{type:"notification",notification:U.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let C=(0,pt.decode)(i).map(W=>{let[$,J,Te,Re,re,ae,Y]=W;return{participantId:this.getStreamDescription($)?.participantId,gain:J,pause:Te,offset:Re,mute:re,liveStatus:ae,startTimeMs:Y}});return{type:"notification",notification:U.MOVIE_UPDATE_NOTIFICATION,data:C}}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],o=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=we.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,P=o?o>>>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 Ta=mi(require("@vkontakte/libvpx"));var Qe=class{constructor(){c(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,o)=>{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":o(h.data.error);break;case"frame":e(h.data);break;case"debug":d.debug(h.data.message);break;case"log_error":b.log(w.ERROR,h.data.message);break}},this._sendToWorker("init",i,a)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(r,e={},t=[]){this._worker?.postMessage(Object.assign({type:r},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var Ai=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)}},[Ta.default,Ta.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())},[M.baseChromeVersion()>=92||M.browserName()==="Safari"])}decodeFrame(r,e,t,i=!1){this._sendToWorker("frame",{timestamp:r,data:e.buffer,isVP9:t,keyFrame:i},[e.buffer])}destroy(){this._removeWorker(),d.debug("WebCodecsDecoder destroyed")}static isBrowserSupported(){return"VideoDecoder"in window&&"Worker"in window&&"VideoFrame"in window&&!M.isBrokenVP9Decoder()&&M.browserName()!=="Firefox"}};var Lt=class{constructor(r=null,e=0){c(this,"_counter",0);c(this,"_interval",0);c(this,"_lastCalculationTime",Date.now());c(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 Bn=require("bit-buffer");var yr=class{constructor(r){c(this,"_participantId");c(this,"_firstFrameReceived",!1);this._participantId=r}measure(r,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=ue.getMarkNameScreenshareFirstFrame(this._participantId),i=ue.measureMark(t);i!==null&&Ae.logEventualStat({name:X.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Wo=65536,Ra="MARK_SCREENSHARE_FREEZE_DURATION",Zt=class n{constructor(r,e,t,i){c(this,"_participantId");c(this,"_onStream");c(this,"_onStat");c(this,"_onKeyFrameRequested");c(this,"_statScreenShareFirstFrame");c(this,"_chunks",[]);this._participantId=r,this._onStream=e,this._onStat=t,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new yr(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)%Wo!==r.sequence){d.warn("[FrameBuilder] Got incorrect chunk");return}if(this._chunks.push(r),r.end){let t=this._processFrameData(),{width:i,height:a}=n.getFrameSize(t);this._processFrame({timestamp:r.timestamp,frameData:t,isVP9:r.isVP9,keyframe:r.keyframe,width:i,height:a}),this._statScreenShareFirstFrame.measure(i,a)}}destroy(){ue.clearMark(Ra),ue.clearMark(ue.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let r=this._chunks;this._chunks=[];let e=r.reduce((a,s)=>a+s.data.byteLength,0),t=new Uint8Array(e),i=0;for(let a of r)t.set(new Uint8Array(a.data),i),i+=a.data.byteLength;return t}static getFrameSize(r){let e={width:0,height:0},t=new Bn.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){ue.setMark(Ra);return}let e=ue.measureMark(Ra);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Ut=class{constructor(r){c(this,"_onStream");this._onStream=r}async drawFrame(r){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(r){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var ei=class extends Ut{constructor(e){super(e);c(this,"_useImageBitmap");c(this,"_canvas",null);c(this,"_canvasContext",null);c(this,"_stream",null);c(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:o,data:l}=e,u=s*o*4;if(l.byteLength!==u){d.warn("Bad frame buffer",{w:s,h:o,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)&&!(M.browserName()==="Safari"&&Number(M.browserVersion())===15)&&!(M.browserName()==="Firefox"&&Number(M.browserVersion())<60)}};var Bt=class extends Ut{constructor(e){super(e);c(this,"_generator");c(this,"_writer");c(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 Mi=class extends Zt{constructor(e,t,i,a){super(e,t,i,a);c(this,"_renderer");c(this,"_decoder");c(this,"_decoderReady",!1);c(this,"_decoderBusy",!1);c(this,"_decoderQueue",[]);c(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 Lt(e=>d.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Bt.isBrowserSupported()?this._renderer=new ei(this._onStream):this._renderer=new Bt(this._onStream)}_initDecoder(e=!1){e||!ut.isBrowserSupported()?this._decoder=new Ai: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 ei.isBrowserSupported()||Bt.isBrowserSupported()}};function Fn(n,r,e,t,i,a,s){let o=0;r&&(o|=1),e&&(o|=2),t&&(o|=4),s||(o|=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,o),!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 Vn(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),o=r.getUint8(10),l=!!(o&1),u=!!(o&2),m=!!(o&4),h=!!(o&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 jn(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 Hn(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 Gn(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=mi(require("simple-ebml-builder"));var Ko=2**15-1,Ca=1,$o=5,qo=5;var ba=class n{constructor(r){c(this,"_mediaSource");c(this,"_codec");c(this,"_sourceBuffer",null);c(this,"_queue",[]);c(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)-$o);i-t>qo&&(this._clearBufferTill=i)}destroy(){this._queue=[],this._mediaSource.readyState==="open"&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},ti=class n extends Zt{constructor(e,t,i){super(e,t,i);c(this,"_mediaBuffer",null);c(this,"_video",null);c(this,"_stream",null);c(this,"_earliestTimestamp",0);c(this,"_clusterStartTime",0);c(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))],o=O.element(O.ID.Tracks,O.element(O.ID.TrackEntry,[O.element(O.ID.TrackNumber,O.number(Ca)),O.element(O.ID.TrackUID,O.number(Ca)),O.element(O.ID.TrackType,O.number(1)),O.element(O.ID.FlagLacing,O.number(0)),O.element(O.ID.DefaultDuration,O.number(1e9)),O.element(O.ID.CodecID,O.string(`V_${i.toUpperCase()}`)),O.element(O.ID.Video,s)]));return O.unknownSizeElement(O.ID.Segment,[a,o])}static _genClusterHeader(e){return O.unknownSizeElement(O.ID.Cluster,[O.element(O.ID.Timecode,O.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new ba(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 o=n._genWebmHeader();this._mediaBuffer?.append(o);let l=n._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(l)}let a=Math.round(i-this._clusterStartTime);if(a>Ko&&(this._clusterStartTime=i,a=0),a===0){d.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let o=n._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(o)}let s=O.element(O.ID.SimpleBlock,[O.vintEncodedNumber(Ca),O.bytes(n._intToU16BE(a)),O.number((e.keyframe?1:0)<<7),O.bytes(e.frameData)]);this._mediaBuffer?.append(s,!0)}destroy(){super.destroy(),this._video&&(this._video.onpause=null,this._video.onwaiting=null,this._video.onstalled=null,this._video.onerror=null,this._video.pause(),this._video.src="",document.body.removeChild(this._video)),this._mediaBuffer&&(this._mediaBuffer.destroy(),this._mediaBuffer=null),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),d.debug(`[WebmBuilder] destroyed for participant [${this._participantId}]`)}static isBrowserSupported(){return"captureStream"in window.HTMLVideoElement?.prototype&&window.MediaSource?.isTypeSupported('video/webm; codecs="vp8"')&&window.MediaSource?.isTypeSupported('video/webm; codecs="vp9"')}};var Di=class{constructor(r,e,t,i,a){c(this,"_datachannel");c(this,"_participantIdRegistry",null);c(this,"_streamBuilders",{});c(this,"_onStream",()=>{});c(this,"_onEos",()=>{});c(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=Vn(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=o=>this._onStream(t,o),s=()=>{this._requestKeyFrame(e.ssrc)};p.screenShareWebmBuilder&&ti.isBrowserSupported()?i=new ti(t,a,this._onStat):i=new Mi(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=Gn(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 ya=class{constructor(r,e,t){c(this,"_prev");c(this,"_next");c(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}},wi=class{constructor(){c(this,"_head",null);c(this,"_tail",null);c(this,"_length",0)}get length(){return this._length}push(...r){for(let e of r)this._tail=new ya(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 Pa=mi(require("@vkontakte/libvpx"));var zo=1e3,ii=class extends Qe{constructor(e,t,i,a){super();c(this,"_sourceTrack");c(this,"_onFrame");c(this,"_useCongestionControl");c(this,"_maxBitrate");c(this,"_useImageCapture");c(this,"_video",null);c(this,"_imageCapture",null);c(this,"_canvas",null);c(this,"_canvasCtx",null);c(this,"_frameReadTimeout",0);c(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(),o=()=>i(new Error("Autoplay is disabled"));s?s.catch(o):o()}})}_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);})();
|
|
11
|
-
`,i=>{i.error?this._onFrame(null,i.error):this._onFrame({type:i.frameType,timestamp:i.timestamp,duration:i.duration,data:i.data,byteLength:i.data?.byteLength,width:i.width,height:i.height})},[Pa.default,Pa.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:d.enabled()})}_encode(e,t){let i=e.data.buffer;this._sendToWorker("frame",{width:e.width,height:e.height,imageData:i,keyFrame:t},[i])}_requestFrameVideo(e){let t=this._drawFrameVideo();this._encode(t,e)}_requestFrameBitmap(e){window.clearTimeout(this._frameReadTimeout),this._frameReadTimeout=window.setTimeout(()=>{if(this._lastFrame){let t=this._drawFrameData(this._lastFrame);this._encode(t,e)}else this._onFrame(null)},zo),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let i=this._drawFrameData(t);this._encode(i,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),d.debug("LibVPxEncoder destroyed")}};var Ft=class extends Qe{constructor(e,t,i,a,s,o){super();c(this,"_sourceTrack");c(this,"_trackProcessor");c(this,"_onFrame");c(this,"_useCongestionControl");c(this,"_maxBitrate");c(this,"_useCbr");c(this,"_frameRate");this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=i,this._maxBitrate=a,this._useCbr=s,this._frameRate=o,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,i=this._trackProcessor.readable;d.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?"VP9":"VP8"}`),await this._createWorker(`"use strict";var exports=(()=>{var p=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var _=(a,t)=>{for(var n in t)p(a,n,{get:t[n],enumerable:!0})},I=(a,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of B(t))!x.call(a,o)&&o!==n&&p(a,o,{get:()=>t[o],enumerable:!(i=T(t,o))||i.enumerable});return a};var M=a=>I(p({},"__esModule",{value:!0}),a);var O={};_(O,{default:()=>S});var S=()=>{let t,n,i,o,g,m,d=null,f=0,b=!1,u=0,F,V,c=!1,l=!1;function h(e){t=e.readable,n=t.getReader(),i=e.width,o=e.height,g=e.isVP9,m=e.framerate,F=e.useCongestionControl,V=e.maxBitrate,F&&(u=V,c=e.useCbr),E(),self.postMessage({type:"ready"})}function A(e){e&&!l&&(l=!0),self.clearTimeout(f),f=self.setTimeout(()=>{d&&y(d,l)},1e3),!b&&(b=!0,n.read().finally(()=>{b=!1,self.clearTimeout(f)}).then(({done:r,value:s})=>{if(d?.close(),d=null,!(r||!s)){if(!R){n.releaseLock(),t.cancel();return}d=s,y(s,l)}}))}function y(e,r){(e.codedWidth!==i||e.codedHeight!==o)&&(i=e.codedWidth,o=e.codedHeight,E(),l=!0),R.encode(e,{keyFrame:r}),r&&(l=!1)}function E(){let e={framerate:m,codec:g?"vp09.00.50.08":"vp8",width:i,height:o,latencyMode:"realtime",bitrateMode:c?"constant":"variable"};u>0&&(e.bitrate=u),R.configure(e)}function C(e,r,s){u=e,c=r,m=s,E()}let R=new VideoEncoder({output:e=>{let r;e.data?r=e.data:(r=new ArrayBuffer(e.byteLength),e.copyTo(r)),self.postMessage({type:"frame",frameType:e.type,timestamp:e.timestamp,duration:e.duration,width:i,height:o,data:r},[r])},error:e=>{self.postMessage({type:"frame",error:String(e)})}});self.onmessage=e=>{switch(e.data.type){case"init":h(e.data);break;case"frame":A(e.data.keyFrame);break;case"set_bitrate":C(e.data.bitrate,e.data.useCbr,e.data.fps);break}}};return M(O);})();
|
|
12
|
-
`,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 Jo=2100,Yo=600,Qo=1.2,Wn=.8,Xo=2e3,Zo=8e3,Aa=8e3,ec=16e3,tc=4,ic=2e3,Pr=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Pr||{}),ki=class{constructor(r,e,t,i,a,s,o){c(this,"_onCongestion");c(this,"_ccEnabled");c(this,"_fastSharing");c(this,"_trendDelayThreshold");c(this,"_highDelayThreshold");c(this,"_targetFps");c(this,"_minBitrate");c(this,"_maxBitrate");c(this,"_targetBitrate");c(this,"_lastDown");c(this,"_lastUp");c(this,"_lastProbing");c(this,"_lastCheckDelay");c(this,"_upPenalty",0);c(this,"_probing");c(this,"_delayAvgShort",-1);c(this,"_delayAvgLong",-1);c(this,"_minDelay",Number.MAX_VALUE);c(this,"_maxDelay",0);c(this,"_largeDelayDuration",0);c(this,"_lastFpsCalcMs");c(this,"_frames",0);c(this,"_fps",0);this._onCongestion=r,this._ccEnabled=i,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=a,this._targetFps=o,s>0?this._highDelayThreshold=s:this._highDelayThreshold=Jo,a&&(this._highDelayThreshold=Yo),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,o=Math.round(Math.abs(s)*100/this._delayAvgLong),l=s>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,u=this._delayAvgShort>this._highDelayThreshold;l||u?a=2:Math.abs(s)<40&&o<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=${o} -> ${Pr[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>Xo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,tc),this._probing=!1);let J=Wn*h*1e3;if(J>=this._targetBitrate&&(J=this._targetBitrate*Wn),J=Math.max(J,this._minBitrate),J<this._targetBitrate){let Te=Math.round(J/1e3),Re=Math.round(this._upPenalty*Aa/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${Pr[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Te} penalty=${Re}s`),this._setBitrate(J,!0),this._targetBitrate=J}this._lastDown=i}let P=i-this._lastUp,C=Zo+this._upPenalty*Aa;if(a===1&&P>C&&E>C){let J=Math.min(this._targetBitrate*Qo,this._maxBitrate);if(J>this._targetBitrate){let Te=Math.round(J/1e3),Re=Math.round(this._targetBitrate/1e3),re=Math.round(this._upPenalty*Aa/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${Pr[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${Re} -> newBitrate=${Te} penalty=${re}s`),this._setBitrate(J,!1),this._targetBitrate=J,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let W=i-this._lastProbing;this._probing&&W>ec&&(this._probing=!1);let $=i-this._lastDown;this._upPenalty>0&&$>3*C&&(d.log(`#${r}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(r,e){this._fastSharing&&(e=!0);let t=this._targetFps;this._fps>0&&(t=this._fps),this._onCongestion(r,e,t)}_calcDelay(r,e){if(!(r<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=r,this._delayAvgLong=r),this._delayAvgShort=Math.round((this._delayAvgShort*3+r)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+r)/24),r>0&&r<this._minDelay?this._minDelay=r:r>this._maxDelay&&(this._maxDelay=r),this._lastCheckDelay===0&&(this._lastCheckDelay=e),r>ic){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 Oi=class{constructor(r){c(this,"_maxSize");c(this,"_size",0);c(this,"_buffer");c(this,"_head",0);c(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 o=0;o<this._maxSize;o++){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 o=a-i;e=Math.round(o>0?t*8/o: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 o=this._buffer[a];if(o){if(i===-1&&o.end&&!o.start&&(i=o.ts2,e=0),t===-1&&i>=0&&o.start&&!o.end&&(t=o.ts2),t>=0&&i>=0){let l=i-t;r=l>0?e*8/l:0;break}if(i>=0&&(e+=o.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 Ma=65536,ac=50,nc=400,sc=1e6,oc=3e5,cc=3e4,dc=2e3,lc=5,Ar=0,xi=class{constructor(r,e,t,i){c(this,"_encoder");c(this,"_datachannel");c(this,"_signaling");c(this,"_fastSharing");c(this,"_destroyed",!1);c(this,"_needKeyframe",!0);c(this,"DATA_SIZE");c(this,"_congestionControl");c(this,"_frameNum",0);c(this,"_width");c(this,"_height");c(this,"_feedback",new Oi(1024));c(this,"_lastSentFrameSeq",0);c(this,"_lastDeliveredFrameSeq",0);c(this,"_lastFrameDelay",0);c(this,"_lastFramerateReduced",Date.now());c(this,"_lastSharingStat",Date.now());c(this,"_congestionControlEnabled");c(this,"_queue",new wi);c(this,"_fpsMeter");c(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:o}=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(o/1e3)}k delayThreshold=${p.screenShareCongestionControlThreshold}`),this._congestionControl=new ki(l,s,o,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(Ft.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Ft(r,u,this._congestionControlEnabled,o,m,a)}else this._encoder=new ii(r,u,this._congestionControlEnabled,o);this._datachannel.onmessage=m=>{jn(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Hn(m.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(m=>d.warn("ScreenCaptureSender init failed",m)),this._fpsMeter=new Lt(m=>d.log(`[ScreenCaptureSender] fps: ${m}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Ma)%Ma>lc&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>dc&&(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 wi;for(let a=0;a<t;a+=this.DATA_SIZE){let s=r.data.slice(a,a+this.DATA_SIZE),o=a===0,l=t<=a+s.byteLength,u=this._wrapHeader(r.timestamp,o,l,e,s);i.push({data:u.data,sequence:u.sequence,frameSize:t,isFirst:o,isLast:l,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=Fn(r,e,t,i,Ar,this._encoder.isVP9(),a),o={sequence:Ar,data:s};return Ar=(Ar+1)%Ma,o}_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 Ft.isBrowserSupported()||ii.isBrowserSupported()}_onCongestionCallback(r,e,t){this._encoder.setBitrate(r,e,t)}_onResize(r,e){let{minBitrate:t,maxBitrate:i}=this._calcMinMaxBitrate(r,e),a=Math.round(t/1e3),s=Math.round(i/1e3);d.log(`cc: resize to ${r}x${e}, minBitrate=${a} maxBitrate=${s}`),this._congestionControl.reconfigure(t,i)}_calcMinMaxBitrate(r,e){(r===void 0||r<640)&&(r=640),(e===void 0||e<360)&&(e=360);let t=r*e/256,i=Math.max(oc,Math.min(sc,Math.round(t*ac))),a=Math.round(t*nc);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>cc){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var pc=90,uc=4294967295,Ni=class n extends Ot{constructor(e,t,i){super(e,t);c(this,"_hasOutboundVideoDebug",!1);c(this,"_inboundVideoDebugParticipants",new Set);c(this,"_videoDebugBytes",{});c(this,"_producerNotification",null);c(this,"_producerCommand",null);c(this,"_producerScreen",null);c(this,"_consumerScreen",null);c(this,"_asr",null);c(this,"_animojiDataChannel",null);c(this,"_animojiReceiver",null);c(this,"_animojiSender",null);c(this,"_isOpen",!1);c(this,"_observer",!1);c(this,"_reconnectionPrevented",!1);c(this,"_statInterval",null);c(this,"_settingsInterval",null);c(this,"_monitorRtpShareInterval",null);c(this,"_statBytes",{});c(this,"_ssrcMap",{});c(this,"_ssrcMapUpdated",!1);c(this,"_perfStatReporter");c(this,"_producerOfferIsProcessing",!1);c(this,"_producerNextOffer",null);c(this,"_producerNextSessionId",null);c(this,"_lastStat",null);c(this,"_serverSettings");c(this,"_prevConsumerSettings",{});c(this,"_prevConsumerFastSharingSettings",{});c(this,"_asrTrack",null);c(this,"_captureSender",null);c(this,"_captureReceiver",null);c(this,"_participantIdRegistry",null);c(this,"_disabledSenders",new Set);c(this,"_rtpReceiversByStreamId",{});c(this,"_participantIdByVideoTrackId",{});c(this,"_producerSessionId","");c(this,"_newAudioShareTrack",null);c(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){vr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(p.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,this._participantIdRegistry&&e.setParticipantIdRegistry(this._participantIdRegistry),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}async onCameraResolutionChanged(){p.simulcast&&M.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new 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 o=s.error;d.error(`[${t}] data channel error`,o?.errorDetail,o?.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 Cr,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 Rr(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),b.log(w.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.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!=="OPENED"&&(this._setState("RECONNECTING"),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_signalStalledParticipants(e){this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_signalSpeakerChanged(e){this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_signalNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
13
|
-
`).forEach(t=>{let i=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${we.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${we.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,a=new RegExp(i).exec(t);a&&(this._ssrcMap[a[1]]=/^\d+$/.test(a[3])?I.composeUserId(a[3]):a[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new xi(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Di(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,t)},e=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,null)},e=>{this._triggerEvent("SCREEN_SHARING_STAT",e)}))}_removeCaptureReceiver(){this._captureReceiver?.destroy(),this._captureReceiver=null}_applyConsumerSettings(){let e=this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(i=>{if(!i.track||i.track.kind!=="video"||i.track.contentHint==="motion")return;let a=!this._disabledSenders.has(i),s=e.maxDimension!==0;if(a&&!s){d.log("Disabling video upload"),this._disabledSenders.add(i),i.replaceTrack(M.getBlackMediaTrack()).catch(l=>{d.error("Could not disable video upload",l)});return}let o=this._mediaSource.getSendVideoTrack();if(!a&&s&&o){d.log("Enabling video upload"),this._disabledSenders.delete(i);let l=i.track;l.enabled=o.enabled,i.replaceTrack(o).then(()=>l.stop()).catch(u=>{d.error("Could not enable video upload",u)})}I.applyVideoTrackSettings(e,i,o??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&p.consumerFastScreenShare){let t=this._serverSettings.fastScreenSharing;if(t&&this._pc){let i=[];this._pc.getSenders().forEach(a=>{!a.track||a.track.kind!=="video"||a.track.contentHint!=="motion"||I.applyVideoTrackSettings(t,a,a.track,this._prevConsumerFastSharingSettings,i)}),this._prevConsumerFastSharingSettings=i}}}_onScreenSharingStatus(e){e.track?(!p.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent("STATE_CHANGED",e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(t=>{this._reportStats(t),this._detectStaleTracks(t),at.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 ue.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){let t={inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(i=>i.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(i=>i.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}};this._reportVideoStreamDebug(t),this._triggerEvent("REMOTE_DATA_STATS",t)}_reportVideoStreamDebug(e){if(!p.debugVideoStreams)return;let t=e.outbound.rtps.find(o=>o.kind==="video");if(t){this._hasOutboundVideoDebug=!0;let o=this._mediaSource.getSendVideoTrack(),l=o?.getSettings();this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"outbound",trackId:o?.id,mimeType:t.mimeType,width:t.frameWidth??l?.width,height:t.frameHeight??l?.height,frameRate:t.framesPerSecond??l?.frameRate,bitrate:t.bandwidth?t.bandwidth*8:this._getVideoDebugBitrate("outbound",t.bytesSent,t.headerBytesSent),packetsLost:t.packetsLost})}else!t&&this._hasOutboundVideoDebug&&(this._hasOutboundVideoDebug=!1,this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"outbound",clear:!0}));let i=e.inbound.rtps.filter(o=>o.kind==="video"),a=i.some(o=>!this._getVideoDebugStreamId(o)),s=new Set;if(i.map(o=>({rtp:o,streamId:this._getVideoDebugStreamId(o)})).filter(({streamId:o})=>o).forEach(o=>{let l=o.streamId;s.add(l),this._inboundVideoDebugParticipants.add(l),this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"inbound",streamId:l,trackId:this._getVideoDebugTrackId(o.rtp),mimeType:o.rtp.mimeType,width:o.rtp.frameWidth,height:o.rtp.frameHeight,frameRate:o.rtp.framesPerSecond,bitrate:o.rtp.bandwidth?o.rtp.bandwidth*8:this._getVideoDebugBitrate(`inbound:${l}`,o.rtp.bytesReceived,o.rtp.headerBytesReceived),packetsLost:o.rtp.packetsLost})}),!a)for(let o of this._inboundVideoDebugParticipants)s.has(o)||(this._triggerEvent("VIDEO_STREAM_DEBUG",{direction:"inbound",streamId:o,clear:!0}),this._inboundVideoDebugParticipants.delete(o))}_getVideoDebugStreamId(e){let t=this._getVideoDebugTrackId(e),i=(t?this._participantIdByVideoTrackId[t]:void 0)||e.userId;if(!(!i||i==="undefined"))return i}_getVideoDebugTrackId(e){return e.trackId}_getVideoDebugBitrate(e,t,i){if(t===void 0||i===void 0)return;let a=this._videoDebugBytes[e];if(this._videoDebugBytes[e]={bytes:t,headerBytes:i},!(!a||t<a.bytes||i<a.headerBytes))return Math.round((t-a.bytes+i-a.headerBytes)/(p.statisticsInterval/1e3)*8)}_detectStaleTracks(e){let t=e.rtps.find(o=>o.type==="inbound-rtp"&&o.kind==="audio"&&this._ssrcMap[o.ssrc]==="mix");if(!t)return;let i=we.AUDIO_MIX,a=this._statBytes[i],s=!1;if(a){let o=t.bytesReceived-a.bytesReceived;o>=0&&o<=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&&M.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&&M.isSimulcastSupportedByBrowser(),a=i;try{await this._pc.setRemoteDescription(e)}catch(l){throw d.error("[single] unable to set remote offer",l),b.log(w.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 o;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");o=await this._pc.createAnswer()}catch(l){throw d.error("[single] unable to create answer",l),b.log(w.ERROR,"createAnswer-single"),l}try{if(!this._pc)throw new Error("Interrupt allocation");o.sdp=I.patchLocalSDP(o.sdp,!1,M.isBrokenH264Decoder(),!1),d.debug("[single] set local answer",{answer:o}),await this._pc.setLocalDescription(o)}catch(l){throw d.error("[single] unable to set local answer",l),b.log(w.ERROR,"setLocalDescription-single"),l}if(a&&s){o.sdp=I.patchSimulcastAnswerSdp(o.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:o}),this._updateSSRCMap(e),await this._signaling.acceptProducer(o,Object.keys(this._ssrcMap),t),d.debug("[single] remote offer has been processed")}catch(l){d.warn("[single] unable to send local answer",l),b.log(w.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=_i(_t.WIDTH,_t.HEIGHT,this._serverSettings.camera?.bitrates?.generic),o=0,l=1;for(let m of a.encodings)m.scalabilityMode=gi,m.active=!0,o>=s.streams.length?m.maxBitrate=0:m.maxBitrate=s.streams[o].bitrate,m.scaleResolutionDownBy=l,l=l*2,o++;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,M.isOldDataChannelDescription(),!1,!1,!1,M.isBrokenVP9Encoder(),M.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),b.log(w.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=>{s.track.kind==="video"&&delete this._participantIdByVideoTrackId[s.track.id],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,t.track.kind==="video"&&(this._participantIdByVideoTrackId[t.track.id]=i.id),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),b.log(w.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(b.logCustom(w.RECONNECT,{param:1}),this._reconnect());break;case"connecting":let i=this.getState();i==="IDLE"||i==="OPENED"?this._setState("CONNECTING"):e.iceConnectionState==="checking"&&this._setState("RECONNECTING");break;case"disconnected":this._reconnectionPrevented?this.close(new Error("Ice connection disconnected")):this._setState("RECONNECTING");break;case"connected":this._setState("CONNECTED"),I.getPeerConnectionHostInfo(e).then(a=>{a?.local&&(b.log(w.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))}),b.logCustom(w.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){d.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let i=(a,s)=>{a.replaceTrack(s).catch(o=>{d.error("ServerTransport: Unable to replace track",o),b.log(w.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),p.simulcast&&M.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(o=>o.direction==="sendonly"&&o.sender?.track?.kind==="video"&&o.sender.track.contentHint===e.contentHint)?.sender;s?.track?(i(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):d.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let a=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);a?.track?i(a,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e==="screen"&&p.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return b.log(w.PAT_WAITING_TIME_ERROR,"noConnection"),d.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return b.log(w.PAT_WAITING_TIME_ERROR,"oldBrowser"),d.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let i=this._rtpReceiversByStreamId[e];if(!i)return b.log(w.PAT_WAITING_TIME_ERROR,"noReceiver"),d.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let a=i.getSynchronizationSources();if(!a||!a.length)return d.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let o=a[0].rtpTimestamp;if(!Number.isInteger(o))return b.log(w.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),d.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${o}`),0;let l=t-o&uc,u=Math.ceil(l/pc);return Math.min(100,Math.max(0,u))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!p.simulcast||!M.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let o=s.getVideoTracks()[0],l=o.getSettings().width,u=o.getSettings().height,m=_i(l,u,this._serverSettings.camera?.bitrates?.generic),h=t||!tn(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 C of E.encodings)C.scaleResolutionDownBy=Ki(C.rid),C.scalabilityMode=gi,P>=m.streams.length?(C.maxBitrate=0,C.active=!1):(C.active=!0,C.maxBitrate=m.streams[P].bitrate),P++;await a.sender.setParameters?.(E).catch(C=>{d.error("Failed to set sender parameters",E,C)}),d.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(E.encodings)} `)}if(this._simulcastInfo=m,m.streams){let P={mediaSource:1,simulcastInfo:m};await this._signaling.changeSimulcast(P)}}}async _monitorRtpShare(){let e=Xt.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!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
|
+
"use strict";var Bs=Object.create;var hi=Object.defineProperty;var Fs=Object.getOwnPropertyDescriptor;var Vs=Object.getOwnPropertyNames;var js=Object.getPrototypeOf,Hs=Object.prototype.hasOwnProperty;var Gs=(n,r,e)=>r in n?hi(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var Ws=(n,r)=>{for(var e in r)hi(n,e,{get:r[e],enumerable:!0})},Ja=(n,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Vs(r))!Hs.call(n,i)&&i!==e&&hi(n,i,{get:()=>r[i],enumerable:!(t=Fs(r,i))||t.enumerable});return n};var gi=(n,r,e)=>(e=n!=null?Bs(js(n)):{},Ja(r||!n||!n.__esModule?hi(e,"default",{value:n,enumerable:!0}):e,n)),Ks=n=>Ja(hi({},"__esModule",{value:!0}),n);var o=(n,r,e)=>Gs(n,typeof r!="symbol"?r+"":r,e);var hl={};Ws(hl,{Api:()=>di,ApiExternal:()=>qr,ArrayDequeue:()=>$r,AuthData:()=>Ce,BaseLogger:()=>bt,CallDirection:()=>Oe,CallType:()=>st,ChatRoomEventType:()=>Nr,ConversationFeature:()=>Lr,ConversationOption:()=>Ze,DebugMessageType:()=>_a,ExternalIdType:()=>Ur,FacingMode:()=>St,FatalError:()=>oe,HangupReason:()=>B,HangupType:()=>C,MediaOption:()=>de,MediaTrackKind:()=>Ge,MediaType:()=>Ot,MuteState:()=>je,ParticipantState:()=>Q,ParticipantStateDataValue:()=>xa,ParticipantStatus:()=>Xi,RecordRole:()=>ys,RoomsEventType:()=>si,Signaling:()=>jt,SignalingCommandType:()=>x,SignalingConnectionType:()=>Ke,SignalingNotification:()=>U,TransportTopology:()=>Fe,UserRole:()=>_t,UserType:()=>ae,VolumeDetector:()=>Ct,acceptCall:()=>Gc,acceptPromotion:()=>Qd,activateRooms:()=>Nd,addMovie:()=>Dd,addParticipant:()=>zc,addParticipantInternal:()=>Jc,authorize:()=>Hc,browser:()=>Oc,callInternal:()=>Ps,callTo:()=>Vc,captureScreen:()=>Xc,captureVmoji:()=>Zc,changeAudioEffect:()=>Gd,changeConversationOptions:()=>gd,changeDevice:()=>Qc,changeParticipantState:()=>nd,changePriorities:()=>ad,changeVideoEffect:()=>Hd,chatHistory:()=>fd,chatMessage:()=>_d,chatMessageInternal:()=>Os,createJoinLink:()=>Ed,customData:()=>Sd,customDataInternal:()=>xs,debug:()=>Fd,debugMessage:()=>Vd,declineCall:()=>Wc,enableFeatureForRoles:()=>rl,enableVideoSuspend:()=>md,enableVideoSuspendSuggest:()=>hd,feedback:()=>el,forceRelayPolicy:()=>yd,getActiveCallId:()=>ul,getAnonymTokenByLink:()=>Rd,getAudienceModeHands:()=>zd,getCalls:()=>pl,getParticipantListChunk:()=>Xd,getParticipants:()=>Zd,getStreamInfo:()=>wd,getWaitingHall:()=>qd,grantRoles:()=>dd,grantRolesInternal:()=>ws,hangup:()=>qc,hold:()=>sd,init:()=>Fc,joinCall:()=>Kc,joinCallByLink:()=>$c,joinCallInternal:()=>As,logClientEvent:()=>il,muteParticipant:()=>ld,muteParticipantInternal:()=>Ds,pinParticipant:()=>pd,pinParticipantInternal:()=>ks,processPush:()=>jc,processPushInternal:()=>bs,promoteParticipant:()=>Jd,publishStream:()=>Ad,putHandsDown:()=>od,recordSetConf:()=>Md,removeHistoryRecords:()=>al,removeJoinLink:()=>Td,removeMovie:()=>Od,removeParticipant:()=>Yc,removeParticipantInternal:()=>Ms,removeRooms:()=>Ud,requestAsr:()=>ol,requestPromotion:()=>Yd,setAudioEffects:()=>Uc,setAudioStream:()=>Wd,setLocalResolution:()=>rd,setLogger:()=>Nc,setMediaModifiers:()=>ud,setStatisticsInterval:()=>Bd,setVideoEffects:()=>Lc,setVideoStream:()=>ed,setVmoji:()=>Bc,setVmojiFill:()=>$d,setVmojiSvg:()=>Kd,setVolume:()=>Cd,startAsr:()=>nl,startAudienceConversation:()=>Id,startConversation:()=>vd,startStream:()=>Pd,startUrlSharing:()=>cl,stopAsr:()=>sl,stopStream:()=>bd,stopUrlSharing:()=>dl,switchCall:()=>ll,switchRoom:()=>Ld,toggleLocalAudio:()=>id,toggleLocalVideo:()=>td,updateDisplayLayout:()=>cd,updateMovie:()=>kd,updateRooms:()=>xd,uploadDebugLogs:()=>jd,userFeedbackStats:()=>tl,utils:()=>xc,version:()=>ml});module.exports=Ks(hl);var Na=gi(require("webrtc-adapter"));var bt=class{log(r,e,t=!1){}destroy(){}};var ce=class{constructor(){o(this,"_handlers",{});o(this,"_listeners",[])}_triggerEvent(r,...e){if(Object.hasOwn(this._handlers,r))for(let t of this._handlers[r])t.apply(this,e)}addEventListener(r,e){if(typeof e!="function")throw new Error("Listener should be a function");return Object.hasOwn(this._handlers,r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!Object.hasOwn(this._handlers,r))return;e||delete this._handlers[r];let t=this._handlers[r].indexOf(e);t>=0&&this._handlers[r].splice(t,1)}subscribe(r,e,t){let i=r.addEventListener(e,t);this._listeners.push(i)}unsubscribe(){this._listeners.forEach(r=>{r.dispose()})}};var Ya=(K=>(K.MIC_CAMERA_PERMISSION="mic_camera",K.CAMERA_PERMISSION="camera",K.MIC_PERMISSION="mic",K.CAMERA_ACCESS="cameralock",K.MIC_ACCESS="miclock",K.MIC_NOT_FOUND="nomic",K.SCREEN_PERMISSION="screenpermission",K.SCREEN_ACCESS="screenlock",K.CONNECTION="connection",K.NETWORK="network",K.UNKNOWN="unknown",K.UNSUPPORTED="unsupported",K.SIGNALING_FAILED="signalingfailed",K.API="api",K.AUTH="auth",K.OVERCONSTRAINED="overconstrained",K))(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||{}),de=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 ft={HEIGHT:720,WIDTH:1280,BITRATE:1e6},_i="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}],$s={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 fi(n=ft.WIDTH,r=ft.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)??ft.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 $i(n){return n?$s[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=":",zi="d",qs=533,qi="a=fmtp:",zs="sps-pps-idr-in-keyframe=1",Zr;(tt=>{let n=/[\r\n]+/,r=`\r
|
|
8
|
+
`;function e(g,T){let y=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),S,w=[];for(S=0;S<g.length;++S){let D=g[S].match(y);D&&D.length===3&&D[2]===T&&w.push(D[1])}return w}function t(g,T,y){let S=g.split(" "),w=S.slice(0,3),D;for(D=3;D<S.length;D++)y.includes(S[D])&&w.push(S[D]);for(D=3;D<S.length;D++)!y.includes(S[D])&&!T.includes(S[D])&&w.push(S[D]);return w.join(" ")}function i(g,T,y,S){let w,D="m="+T;for(w=0;w<g.length;++w)g[w].startsWith(D)&&(g[w]=t(g[w],y,S))}function a(g,T){let y=new RegExp(qi+"(\\d+)");for(let S=0;S<g.length;++S){let w=g[S].match(y);if(w&&w.length===2&&T.includes(w[1])){let D=g[S].trim()===qi+w[1]?" ":";";g[S]+=D+zs}}}function s(g,T,y="video"){let S=e(g,T);if(!S.length)return;let w=S.slice(0),D=new RegExp(qi+"(\\d+) apt=(\\d+)"),$;for($=0;$<g.length;++$){let q=g[$].match(D);q&&q.length===3&&w.includes(q[2])&&w.push(q[1])}let j=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for($=g.length;$--;){let q=g[$].match(j);q&&q.length===3&&w.includes(q[2])&&g.splice($,1)}i(g,y,w,[])}function c(g,T,y,S){let w=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),D,$=[];for(D=T;D<y;++D){let q=g[D].match(w);q&&q.length===3&&q[2]===S&&$.push(q[1])}if(!$.length)return $;let j=new RegExp(qi+"(\\d+) apt=(\\d+)");for(D=T;D<y;++D){let q=g[D].match(j);q&&q.length===3&&$.includes(q[2])&&$.push(q[1])}return $}function l(g,T,y,S){let w=c(g,T,y,S);if(!w.length)return y+1;let D=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),$=0,j=y;for(;j>=T;){let q=g[j].match(D);q&&q.length===3&&w.includes(q[2])&&(g.splice(j,1),$++),j--}return g[T]=t(g[T],w,[]),y-$+1}function u(g,T,y,S){let w=-1,D=-1,$=!1;for(let j=0;j<g.length;++j)if(w>=0&&g[j].startsWith("m=")&&(D=j-1,$&&(j=l(g,w,D,T)),w=-1,D=-1,$=!1),g[j].startsWith("m=video")&&(w=j),w>=0){let q=y==="remote"&&S==="encoder"||y==="local"&&S==="decoder"?"recvonly":"sendonly";(g[j].startsWith(`a=${q}`)||g[j].startsWith("a=sendrecv"))&&($=!0)}D=g.length-1,w>=0&&$&&l(g,w,D,T)}function m(g,T){let y=e(g,"H264");T&&i(g,"video",[],y),a(g,y)}function h(g){let T=e(g,"VP9");i(g,"video",[],T)}function E(g){["G722","PCMU","PCMA","CN","telephone-event"].forEach(T=>{s(g,T,"audio")})}function P(g,T,y,S,w=!1){let D=g.split(n);if(E(D),!T&&!y&&!S&&!w)return D.join(r);function $(q){let Ee=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],N="a=rtcp-fb:111",Ie=q.findIndex(fe=>fe.startsWith(N));return~Ie&&(q[Ie]=q[Ie]+r+Ee.join(r)),q}function j(q){let Ee=e(q,"red");Ee.length>0&&i(q,"audio",[],Ee)}return y?u(D,"H264","local","decoder"):m(D,T),S&&h(D),j(D),w&&$(D),D.join(r)}tt.patchLocalSDP=P;function R(g,T,y,S,w,D,$){T&&(g=g.replace("m=application 9 UDP/DTLS/SCTP webrtc-datachannel","m=application 9 DTLS/SCTP 5000").replace("a=sctp-port:5000","a=sctpmap:5000 webrtc-datachannel 256"));let j=g.split(n);return S?s(j,"H264"):y&&m(j,y),D&&$?s(j,"VP9"):D?u(j,"VP9","remote","encoder"):$?u(j,"VP9","remote","decoder"):w&&h(j),E(j),j.join(r)}tt.patchRemoteSDP=R;function W(g){return g?`${g.type||"WEB_SOCKET"}_${g.id}`:"_"}tt.getPeerIdString=W;function K(g,T){return g&&g.id===T.id&&(g.type||"WEB_SOCKET")===(T.type||"WEB_SOCKET")}tt.comparePeerId=K;async function z(g){let T={local:null,remote:null};if(!g||!g.getStats)return T;try{let y=await g.getStats(null),S=null;if(y.forEach(w=>{w.type==="transport"&&w.selectedCandidatePairId?S=y.get(w.selectedCandidatePairId):w.type==="candidate-pair"&&w.state==="succeeded"&&!S&&(!Object.hasOwn(w,"selected")||w.selected)&&(S=w)}),S?.localCandidateId){let w=y.get(S.localCandidateId);w&&(T.local={type:w.candidateType,ip:w.ip||w.ipAddress,port:w.port||w.portNumber})}if(S?.remoteCandidateId){let w=y.get(S.remoteCandidateId);w&&(T.remote={type:w.candidateType,ip:w.ip||w.ipAddress,port:w.port||w.portNumber})}return T}catch{return T}}tt.getPeerConnectionHostInfo=z;let Re=/^[0-9]+$/,De=/^([gu])([0-9]+)$/;function ne(g,T=ae.USER){let y=String(g);return De.test(y)?(d.warn(`Already composite id [${g}] type supplied [${T}]`),y):T===ae.GROUP?"g"+y:T===ae.USER?"u"+y:(d.warn(`Unknown type [${T}] for id [${g}]`),y.match(Re)?"u"+y:y)}tt.composeUserId=ne;function ie(g,T,y=0){let S=ne(g,T);return J(S,y)}tt.composeParticipantId=ie;function J(g,T){return T?g+$t+zi+T:g}tt.compose=J;function Wt(g){return ie(g.id,g.idType||ae.USER,g.deviceIdx)}tt.composeId=Wt;function La(g){if(g.decorativeUserId)return ie(g.decorativeUserId,g.idType||ae.USER,g.deviceIdx)}tt.composeDecorativeId=La;function Ua(g){return g.participant?Wt(g.participant):ie(g.participantId,g.participantType||ae.USER,g.deviceIdx)}tt.composeMessageId=Ua;function Ba(g){return typeof g=="string"?li(pi(g).compositeUserId).id:g}tt.extractOkId=Ba;function li(g){let T=String(g),y=T.match(De);return y?{id:Number(y[2]),type:y[1]==="g"?ae.GROUP:ae.USER}:(d.warn(`Unsupported compositeId [${g}]`),{id:Number(T),type:ae.USER})}tt.decomposeId=li;function pi(g){let T=g.split($t+zi);return{compositeUserId:T[0],deviceIdx:T.length>1?parseInt(T[1],10):0}}tt.decomposeParticipantId=pi;function re(){let g=window.crypto?.randomUUID?.();if(g)return g;let T="0123456789abcdefghijklmnopqrstuvwxyz".split(""),y=new Array(36),S=0,w,D;for(D=0;D<36;D++)D===8||D===13||D===18||D===23?y[D]="-":D===14?y[D]="4":(S<=2&&(S=33554432+Math.random()*16777216|0),w=S&15,S=S>>4,y[D]=T[D===19?w&3|8:w]);return y.join("")}tt.uuid=re;function Fa(g,T){let y;function S(...w){let D=this;y&&window.clearTimeout(y),y=window.setTimeout(()=>{g.apply(D,w)},T)}return S}tt.debounce=Fa;function Va(g){if(!window.BigInt)return null;let T="",y=g.split(`
|
|
9
|
+
`);for(let D of y)if(D.startsWith("a=fingerprint")){let $=D.split(" ");if($.length===2){T=$[1];break}}if(!T)return BigInt(-1);let S=T.split(":"),w=BigInt(0);for(let D=Math.min(7,S.length-1);D>=0;D--){let $=BigInt(parseInt(S[D],16));w<<=BigInt(8),w|=$}return BigInt.asIntN(64,w)}tt.sdpFingerprint=Va;async function X(g,{signal:T}={}){return new Promise((y,S)=>{if(T?.aborted)return S(T.reason);let w=setTimeout(()=>{T?.removeEventListener("abort",D),y()},g),D=()=>{clearTimeout(w),S(T?.reason)};T?.addEventListener("abort",D,{once:!0})})}tt.delay=X;function ja(g,T,y){let S=[];return g.getSenders().forEach(w=>zr(T,w,w.track,y,S)),S}tt.applySettings=ja;function zr(g,T,y,S,w){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!g||!y||y.kind!=="video")return;let D=y.getSettings();if(!D)return;let $=g.maxBitrateK?g.maxBitrateK*1024:null,j=D.width,q=D.height,Ee=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 _e=Math.round(j*q/256),xe=(Math.round(_e*qs/1e4)+1)*1e4;$=$===null?xe:Math.min(xe,$)}let Ie=g.degradationPreference||"balanced",fe=S[y.id];if(fe&&fe.bitrate===$&&fe.scaleResolutionDownBy===Ee&&fe.maxFramerate===N&&fe.degradationPreference===Ie){w[y.id]=fe;return}w[y.id]={bitrate:$,scaleResolutionDownBy:Ee,maxFramerate:N,degradationPreference:Ie};let we=T.getParameters();if(we.encodings||(we.encodings=[{}]),we.encodings.length>1&&j&&q&&g.maxDimension){let _e=Math.round(g.maxDimension*1.35),xe=Math.max(j,q),yt=fi(j,q,g?.bitrates?.generic),Kt=yt.streams.length;d.log(`applyVideoTrackSettings: maxDim=${g.maxDimension} targetDim=${_e} track=${j}x${q} sim=${JSON.stringify(yt)}`),we.encodings.forEach((it,ui)=>{it.scaleResolutionDownBy=$i(it.rid);let qa=Math.round(xe/it.scaleResolutionDownBy);ui<Kt-1?it.active=qa<_e:ui>=Kt?it.active=!1:it.active=!0,ui<Kt?it.maxBitrate=yt.streams[ui].bitrate:it.maxBitrate=0,it.scalabilityMode=_i})}else we.encodings.forEach(_e=>{g?.scalabilityMode&&(_e.scalabilityMode=g.scalabilityMode),$?_e.maxBitrate=$:delete _e.maxBitrate,Ee?_e.scaleResolutionDownBy=Ee:delete _e.scaleResolutionDownBy,N?_e.maxFramerate=N:delete _e.maxFramerate});if(we.degradationPreference=Ie,we.encodings.length>0){T.setParameters?.(we).catch(xe=>{d.error("Failed to set sender parameters",we,xe)});let _e=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(_e.encodings)}`)}}tt.applyVideoTrackSettings=zr;function Jr(g,T){Array.isArray(T)||(T=[T]);for(let y of T)if(g.includes(y))return!0;return!1}tt.includesOneOf=Jr;function Yr(g){return Object.entries(g.participantState?.state||{}).reduce((T,[y,S])=>(g.participantState&&(T[y]={ts:g.participantState.stateUpdateTs[y],state:S}),T),{})}tt.mapParticipantState=Yr;function Ha(g){let T=g.map(y=>({uid:y.externalId,mediaSettings:y.mediaSettings,status:y.status,muteStates:y.muteStates,unmuteOptions:y.unmuteOptions,participantState:y.participantState,markers:y.markers,movieShareInfos:y.movieShareInfos,roles:y.roles}));return p.filterObservers?T.filter(y=>!y.uid.observer):T}tt.mapSharedParticipants=Ha;function Ga(g,T){let y=Object.keys(g),S=Object.keys(T);if(y.length!==S.length)return!1;for(let w of y)if(!Object.hasOwn(S,w)||g[w].state!==T[w].state||g[w].ts!==T[w].ts)return!1;return!0}tt.isEqualParticipantState=Ga;function Qr(g,T,y=!1){let S=Object.keys(g),w=Object.keys(T);if(S.length!==w.length)return!1;for(let D of S){if(!Object.hasOwn(T,D))return!1;let $=g[D],j=T[D];if(y&&se($)&&se(j))return Qr($,j,y);if($!==j)return!1}return!0}tt.isObjectsEquals=Qr;function Wa(g,T){if(g.length!==T.length)return!1;for(let y of g)if(T.indexOf(y)<0)return!1;return!0}tt.isArraysEquals=Wa;function Ka(g){return!Object.keys(g).length}tt.isEmptyObject=Ka;function $a(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)||y(g,T);function y(w,D){let $={[ae.USER]:0,[ae.GROUP]:1},{compositeUserId:j,deviceIdx:q}=pi(w.id),{compositeUserId:Ee,deviceIdx:N}=pi(D.id),{id:Ie,type:fe}=li(j),{id:we,type:_e}=li(Ee);return S($[fe],$[_e])||S(Ie,we)||S(q,N)}function S(w,D){return w<D?-1:w===D?0:1}}tt.participantMarkerCompare=$a;function me(g,T){let y=Object.entries(g).filter(([,S])=>Array.isArray(T)?!T.includes(S):S!==T);return an(y)}tt.objectFilterOutValues=me;function F(g,T,y){let S=y;for(let w in g)Object.hasOwn(g,w)&&(S=T(S,g[w],w));return S}tt.objectReduce=F,tt.setImmediate=(()=>{let g=1,T={},y=null;return typeof MessageChannel<"u"&&(y=new MessageChannel,y.port1.onmessage=S=>{let w=S.data;T[w]&&(T[w](),delete T[w])}),function(S){if(y&&document.visibilityState==="hidden"){let D=g;return g=g>=Number.MAX_SAFE_INTEGER?1:g+1,T[D]=S,y.port2.postMessage(D),()=>{T[D]&&delete T[D]}}let w=setTimeout(S,0);return()=>clearTimeout(w)}})();function se(g){return g!==null&&typeof g=="object"&&!Array.isArray(g)}tt.isObject=se;function Se(g,T,y,S){function w(j,q){let Ee=0,N=j.length,Ie=!1;for(let fe=0;fe<j.length;fe++)if(!Ie&&j[fe].startsWith("m=video")&&(Ee=fe),j[fe].startsWith("a=mid:"+q)&&(Ie=!0),Ie&&j[fe].startsWith("m=")){N=fe;break}return{start:Ee,end:N}}function D(j,q,Ee,N,Ie,fe,we){let _e="a=rid:"+N+" send";for(let xe=q;xe<Ee;xe++)if(j[xe]===_e){let Kt=_e+" max-width="+fe+";max-height="+we+";max-br="+Ie;j[xe]=Kt}}let $=T?.sender;if($&&$.track&&T.mid){let j=g.split(n),{start:q,end:Ee}=w(j,T.mid),N=$.getParameters();if(N.encodings)return N.encodings.forEach(Ie=>{let fe=Ie.rid,we=Ie.maxBitrate,_e=Ie.scaleResolutionDownBy;if(y&&S&&_e){let xe=""+Math.round(y/_e),yt=""+Math.round(S/_e);D(j,q,Ee,fe,we,xe,yt)}}),j.join(r)}return g}tt.patchSimulcastAnswerSdp=Se})(Zr||(Zr={}));var I=Zr;var qt="__CALLS_SDK_DEVTOOLS_",Si=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 vi=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 Si,this.params=new vi(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.882b025a.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||(A.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 A.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 Ji(n,r){try{let e=typeof r.width=="number"?r.width:void 0,t=typeof r.height=="number"?r.height:void 0;await n.applyConstraints({...r,...e&&{width:{max:e,ideal:e}},...t&&{height:{max:t,ideal:t}}})}catch(e){d.warn("setVideoConstraints failed",e)}}var dn=(X=>(X.CANCELED="CANCELED",X.REJECTED="REJECTED",X.REMOVED="REMOVED",X.HUNGUP="HUNGUP",X.MISSED="MISSED",X.BUSY="BUSY",X.FAILED="FAILED",X.NETWORK_ERROR="NETWORK_ERROR",X.KILLED="KILLED",X.BANNED="BANNED",X.HAS_ACTIVE_CALL="HAS_ACTIVE_CALL",X.CALLER_IS_BLOCKED="CALLER_IS_BLOCKED",X.NOT_FRIENDS="NOT_FRIENDS",X.CALLEE_IS_OFFLINE="CALLEE_IS_OFFLINE",X.CALLER_IS_REJECTED="CALLER_IS_REJECTED",X.UNKNOWN_ERROR="UNKNOWN_ERROR",X.UNSUPPORTED="UNSUPPORTED",X.OLD_VERSION="OLD_VERSION",X.SERVICE_DISABLED="SERVICE_DISABLED",X.SERVICE_UNAVAILABLE="SERVICE_UNAVAILABLE",X.EXTERNAL_API_ERROR="EXTERNAL_API_ERROR",X.SOCKET_CLOSED="SOCKET_CLOSED",X.ENDED="ENDED",X.KILLED_WITHOUT_DELETE="KILLED_WITHOUT_DELETE",X.ANOTHER_DEVICE="ANOTHER_DEVICE",X.NOT_FOUND="NOT_FOUND",X.VCHAT_DETAILED_ERROR="VCHAT_DETAILED_ERROR",X.TIMEOUT="TIMEOUT",X.PARTICIPANT_LIMIT_REACHED="PARTICIPANT_LIMIT_REACHED",X.FAST_START_ERROR="FAST_START_ERROR",X.FAST_JOIN_ERROR="FAST_JOIN_ERROR",X.CALL_TIMEOUT="CALL_TIMEOUT",X))(dn||{}),C=dn;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(C).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 Te=class Te extends bt{constructor(e,t){super();o(this,"_externalLogger");o(this,"_api");o(this,"_batchInterval",3e3);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){Te._conversationIdProvider=e}static create(e,t){Te._instance||(Te._instance=new Te(e,t))}static log(e,t,i=!1){Te._instance&&Te._instance.log(e,t,i)}static logClientStats(e,t=!1){Te._instance&&Te._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){Te._instance&&Te._instance.logClientEvent(e,t)}static destroy(){Te._instance&&Te._instance.destroy(),Te._instance=null}log(e,t,i=!1){this._externalLogger&&this._externalLogger.log(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()}_getConversationId(){if(Te._conversationIdProvider)try{return Te._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}};o(Te,"_instance"),o(Te,"_conversationIdProvider",null);var M=Te;var Yi=class extends ce{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 Qi=class extends ce{constructor(){super();o(this,"_stream",null);o(this,"_screenTrack",null);o(this,"_audioShareTrack",null);o(this,"_screenShareTrack",null);o(this,"_sendVideoTrack",null);o(this,"_cameraVideoTrack",null);o(this,"_micAudioTrack",null);o(this,"_audioEffectsTrack",null);o(this,"_mediaSettings",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 Yi,this._videoEffectsFpsLimiter.addEventListener("fps-limit",this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener("mute",this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&this._cameraVideoTrack.addEventListener("mute",this.videoTrackMuteHandler),p.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[de.AUDIO],t=!0){if(this._stream)return;let i=e.includes(de.VIDEO),a=e.includes(de.AUDIO),s=e.includes(de.ANIMOJI);if(!A.isBrowserSupported())throw new B(oe.UNSUPPORTED);try{this._stream=await A.getUserMedia(i,a,t),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=i&&this._stream.getVideoTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(c){throw new B(c)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,i){let a=this.getStream(),s=this.getSendAudioTrack(),c=this.getSendVideoTrack(i);if(!a||!s&&!c&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,a),c&&!t&&e.addTrack(c,a)}getMediaSettings(){return this._mediaSettings}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=A.getSavedMicrophone(),i=A.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{}},A.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&A.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await A._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);M.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 M.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 A.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Mt(t);else{let i=await this._applyAudioEffect();M.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 M.log(k.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await A.getScreenMedia(e,t),!this._stream)Mt(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),M.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 M.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=A.getSilentMediaTrack();return e.contentHint="music",e.stop(),e}getBlackScreenShareTrack(){let e=A.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(),A.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(),A.getAudioContext()?.suspend().catch(t=>d.error(t)),this._videoEffectsFpsLimiter?.destroy()}async stopLocalMedia(){if(this._mediaSettings.isScreenSharingEnabled&&await this.disableScreenCapturing(),!this._stream)return;this._lastMediaSettings={...this._mediaSettings};let e=[...this._stream.getTracks()];this._stream.getAudioTracks().length>0&&await this.toggleAudio(!1),this._stream.getVideoTracks().length>0&&await this.toggleVideo(!1);for(let t of e)t.stop();this._stream=null,this.cameraVideoTrack=null,this._micAudioTrack=null}async resumeLocalMedia(){if(!this._lastMediaSettings)return;let e=[];if(this._lastMediaSettings.isAudioEnabled&&e.push(de.AUDIO),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 A._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=A.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 A.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw p.audioEffects?.pause(),t(A.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else p.audioEffects?.pause(),t(A.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(M.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 Ji(e,{width:this._effect?p.videoEffectMaxWidth:p.videoMaxWidth,height:this._effect?p.videoEffectMaxHeight:p.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}};var Ii=class{constructor(){o(this,"_cameraPermissionStatus");o(this,"_microphonePermissionStatus");o(this,"_listener")}static isSupported(){return A.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 Xi=(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))(Xi||{});function H(n,...r){let e=p.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function ge(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 wt(n){return n.slice()}var ia;(Al=>{function n(f,b,V){H("onLocalStream",f,Pe(b),V)}Al.onLocalStream=n;function r(f,b){H("onScreenStream",f,Pe(b))}Al.onScreenStream=r;function e(f,b){H("onVmojiStream",f,Pe(b))}Al.onVmojiStream=e;function t(f){H("onVmojiError",f)}Al.onVmojiError=t;function i(f,b){H("onLocalStreamUpdate",Pe(f),b)}Al.onLocalStreamUpdate=i;function a(f,b){d.debug("Local status:",f),H("onLocalStatus",f,b)}Al.onLocalStatus=a;function s(f,b,V){ge("onRemoteStream",f,b,V)}Al.onRemoteStream=s;function c(f,b){ge("onRemoteLive",f,b)}Al.onRemoteLive=c;function l(f,b){ge("onLocalLive",f,b)}Al.onLocalLive=l;function u(f,b){ge("onRemoteLiveUpdate",f,b)}Al.onRemoteLiveUpdate=u;function m(f,b){ge("onLocalLiveUpdate",f,b)}Al.onLocalLiveUpdate=m;function h(f,b,V){ge("onRemoteScreenStream",f,b,V)}Al.onRemoteScreenStream=h;function E(f,b){ge("onRemoteVmojiStream",f,b)}Al.onRemoteVmojiStream=E;function P(f,b,V){ge("onRemoteStreamSuspended",f,b,V)}Al.onRemoteStreamSuspended=P;function R(f,b,V,be,Pt,mi){ge("onConversation",f,Pe(b),Pe(V),be,Pt,mi)}Al.onConversation=R;function W(f){f&&H("onConversationParticipantListChunk",f)}Al.onConversationParticipantListChunk=W;function K(f,b,V){ge("onRemoteMediaSettings",f,Pe(b),V)}Al.onRemoteMediaSettings=K;function z(f,b){ge("onLocalMediaSettings",f,Pe(b))}Al.onLocalMediaSettings=z;function Re(f,b,V){ge("onRemoteSharedMovieInfo",f,Pe(b),V)}Al.onRemoteSharedMovieInfo=Re;function De(f,b,V){ge("onRemoteSharedMovieStoppedInfo",f,Pe(b),V)}Al.onRemoteSharedMovieStoppedInfo=De;function ne(f,b,V){ge("onLocalSharedMovieInfo",f,Pe(b),V)}Al.onLocalSharedMovieInfo=ne;function ie(f,b,V){ge("onLocalSharedMovieStoppedInfo",f,Pe(b),V)}Al.onLocalSharedMovieStoppedInfo=ie;function J(f,b,V){ge("onRemoteSharedUrl",f,b,V)}Al.onRemoteSharedUrl=J;function Wt(f,b,V){ge("onParticipantAdded",f,b,V)}Al.onParticipantAdded=Wt;function La(f,b,V){ge("onParticipantJoined",f,b,V)}Al.onParticipantJoined=La;function Ua(f,b=!1){H("onLocalParticipantState",Pe(f),b)}Al.onLocalParticipantState=Ua;function Ba(f,b,V){ge("onRemoteParticipantState",f,Pe(b),V)}Al.onRemoteParticipantState=Ba;function li(f,b){H("onRemoteParticipantsState",f,b)}Al.onRemoteParticipantsState=li;function pi(f,b,V=null,be){d.debug("Remote status:",b,f),ge("onRemoteStatus",f,b,V,be)}Al.onRemoteStatus=pi;function re(){H("onPermissionsRequested")}Al.onPermissionsRequested=re;function Fa(f,b){H("onPermissionsError",f,b)}Al.onPermissionsError=Fa;function Va(f,b,V){ge("onRemoteRemoved",f,b,V)}Al.onRemoteRemoved=Va;function X(f,b,V,be){H("onCallState",f,b,Pe(V),be)}Al.onCallState=X;function ja(f,b,V){H("onDeviceSwitched",f,b,V)}Al.onDeviceSwitched=ja;function zr(f,b,V,be=!1,Pt=!1,mi=null,Xr=null,Ns,za,Ls=null){let Us=za?wt(za):void 0;H("onMuteStates",Pe(f),wt(b),wt(V),be,Pt,mi,Xr,Ns,Us,Ls)}Al.onMuteStates=zr;function Jr(f,b,V=!1){ge("onRolesChanged",f,wt(b),V)}Al.onRolesChanged=Jr;function Yr(f,b=!1){H("onLocalRolesChanged",wt(f),b)}Al.onLocalRolesChanged=Yr;function Ha(f,b,V,be){ge("onPinnedParticipant",f,b,V,be)}Al.onPinnedParticipant=Ha;function Ga(f,b){H("onLocalPin",f,b)}Al.onLocalPin=Ga;function Qr(f){H("onOptionsChanged",wt(f))}Al.onOptionsChanged=Qr;function Wa(f){H("onCallAccepted",f)}Al.onCallAccepted=Wa;function Ka(f,b,V){H("onIncomingCall",f,b,V)}Al.onIncomingCall=Ka;function $a(f,b,V){ge("onAcceptedCall",f,b,V)}Al.onAcceptedCall=$a;function me(){H("onRateNeeded")}Al.onRateNeeded=me;function F(f,b){ge("onSpeakerChanged",f,b)}Al.onSpeakerChanged=F;function Z(f){H("onVolumesDetected",wt(f))}Al.onVolumesDetected=Z;function se(f,b){H("onLocalVolume",f,b)}Al.onLocalVolume=se;function Se(f,b){H("onJoinStatus",f,b)}Al.onJoinStatus=Se;function tt(f,b){H("onHangup",f,b)}Al.onHangup=tt;function g(f){H("onMultipartyChatCreated",Pe(f))}Al.onMultipartyChatCreated=g;function T(){H("onDeviceChange")}Al.onDeviceChange=T;function y(f){H("onFingerprintChange",f)}Al.onFingerprintChange=y;function S(){H("onTokenExpired")}Al.onTokenExpired=S;function w(f,b,V=!1){H("onChatMessage",f,b,V)}Al.onChatMessage=w;function D(f,b,V=!1){H("onCustomData",f,b,V)}Al.onCustomData=D;function $(f,b,V,be,Pt,mi,Xr=null){H("onRecordStarted",f,b,V,be,Pt,mi,Xr)}Al.onRecordStarted=$;function j(f=null,b){H("onRecordStopped",f,b)}Al.onRecordStopped=j;function q(f){H("onLocalNetworkStatusChanged",f)}Al.onLocalNetworkStatusChanged=q;function Ee(f){H("onNetworkStatusChanged",f)}Al.onNetworkStatusChanged=Ee;function N(f,...b){H("onDebugMessage",f,...b)}Al.onDebugMessage=N;function Ie(f,b){let V=Object.assign({},f,{memory:b});H("onStatistics",V)}Al.onStatistics=Ie;function fe(){H("onAutoplayError")}Al.onAutoplayError=fe;function we(f,b,V,be,Pt){H("onChatRoomUpdated",f,b,V,be,Pt)}Al.onChatRoomUpdated=we;function _e(f){H("onPromoted",f)}Al.onPromoted=_e;function xe(f){H("onRemoteMixedAudioStream",f)}Al.onRemoteMixedAudioStream=xe;function yt(f){H("onJoinLinkChanged",f)}Al.onJoinLinkChanged=yt;function Kt(f){H("onRoomsUpdated",f)}Al.onRoomsUpdated=Kt;function it(f,b,V,be){H("onRoomUpdated",f,b,V,be)}Al.onRoomUpdated=it;function ui(f){H("onRoomParticipantsUpdated",f)}Al.onRoomParticipantsUpdated=ui;function qa(f){H("onRoomSwitched",f)}Al.onRoomSwitched=qa;function gl(f){H("onRoomStart",f)}Al.onRoomStart=gl;function _l(f,b=null){H("onFeedback",f,b)}Al.onFeedback=_l;function fl(f){H("onFeaturesPerRoleChanged",f)}Al.onFeaturesPerRoleChanged=fl;function Sl(f){H("onParticipantVmojiUpdate",f)}Al.onParticipantVmojiUpdate=Sl;function vl(f,b){H("onAsrSet",f,b)}Al.onAsrSet=vl;function Il(f,b,V){H("onAsrStarted",f,b,V)}Al.onAsrStarted=Il;function El(f){H("onAsrStopped",f)}Al.onAsrStopped=El;function Tl(f,b,V,be){H("onAsrTranscription",f,b,V,be)}Al.onAsrTranscription=Tl;function Rl(f,b){H("onParticipantIdChanged",f,b)}Al.onParticipantIdChanged=Rl;function Cl(f){H("onVideoSuspendSuggest",f)}Al.onVideoSuspendSuggest=Cl;function yl(f){H("onSignalingMessage",typeof f=="string"?f:Pe(f))}Al.onSignalingMessage=yl;function Pl(f){H("onPromotionApproved",f)}Al.onPromotionApproved=Pl;function bl(){H("onPeerRegistered")}Al.onPeerRegistered=bl})(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 Js(n){let r=zt?zt.getItem(aa+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function Ys(n,r){try{zt&&zt.setItem(aa+n,JSON.stringify(r))}catch{}}function Qs(n){zt&&zt.removeItem(aa+n)}var ra;(t=>{function n(i){return Js(i)||null}t.get=n;function r(i,a){Ys(i,a)}t.set=r;function e(i){Qs(i)}t.remove=e})(ra||(ra={}));var vt=ra;var Yt=null,Zi=null,nr=null,or=[],cr=[],sr=[],ze=null,Je=null,dr=null,lr=!1,pr=!1,er,Jt,tr,Ti=null,na=null,sa="",ln=null,ir=[],rr=null,pn=navigator.appVersion,Xs=navigator.appName,Be=navigator.userAgent,ot={},St=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(St||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(St||(St={}));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})}},Dt=class Dt{constructor(){o(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(Dt._lockId)throw M.log(k.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");Dt._lockId=this._lockId}free(){Dt._lockId===this._lockId&&(Dt._lockId=0)}};o(Dt,"_lockId",0);var ur=Dt;async function un(){pr=!1,lr=!1,Yt=null;let n={camera:ve.getSavedCamera(),microphone:ve.getSavedMicrophone(),output:ve.getSavedOutput()};await ca(),Zs("devicechange",n),v.onDeviceChange()}function Zs(n,...r){if(ot[n])for(let e of ot[n])e(...r)}async function ca(){return Yt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!Zi&&navigator.mediaDevices.addEventListener&&(Zi=I.debounce(un,p.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",Zi)),!nr&&Ii.isSupported()&&(nr=new Ii,await nr.init((n,r)=>{switch(r){case"denied":case"prompt":Zi?.();break}})),Yt=navigator.mediaDevices.enumerateDevices().then(n=>{or=n.filter(i=>i.kind==="videoinput"?(i.label&&(lr=!0),!0):!1),cr=n.filter(i=>i.kind==="audioinput"?(i.label?pr=!0:ve.isMobile()&&ve.browserName()==="Firefox"&&(pr=lr),!0):!1),sr=n.filter(i=>i.kind==="audiooutput");let r=ze?.deviceId??vt.get("videoinput"),e=Je?.deviceId??vt.get("audioinput"),t=dr?.deviceId??vt.get("audiooutput");return ze=or.find(i=>i.deviceId===r)||null,Je=cr.find(i=>i.deviceId===e)||null,dr=sr.find(i=>i.deviceId===t)||sr[0]||null,Yt=Promise.resolve(n),n}).catch(()=>(Yt=null,[]))))}async function eo(){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]);ln=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function to(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 Ei(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 ur;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await un(),to(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 Ei(n.simplify(),r);let a=r||oe.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function io(){if(!(Ti||ve.browserName()!=="Firefox"||!navigator.mediaDevices?.getUserMedia))try{ve.hasMicrophonePermission()||v.onPermissionsRequested(),Ti=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(n){d.warn("Firefox microphone permission warmup failed",n)}}async function ro(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new ur;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 ar(){return ir.length||(ir=(()=>{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]:Xs,n&&n[1]||i[2]||pn,r,e,t]})()),ir}var ve;(me=>{async function n(){await ca(),await eo()}me.init=n;function r(){return or}me.getCameras=r;function e(){return cr}me.getMicrophones=e;function t(){return sr}me.getOutput=t;function i(){return or.length>0}me.hasCamera=i;function a(){return cr.length>0}me.hasMicrophone=a;function s(){return ze}me.getSavedCamera=s;function c(){return Je}me.getSavedMicrophone=c;function l(){return dr}me.getSavedOutput=l;function u(){return p.videoFacingMode}me.getVideoFacingMode=u;function m(){return lr}me.hasCameraPermission=m;function h(){return pr}me.hasMicrophonePermission=h;function E(){return nr?.getPermissionState("microphone")??null}me.getMicrophonePermissionState=E;function P(F=!1){return h()?i()&&F?m():!0:!1}me.hasPermissions=P;function R(){Ti&&(Mt(Ti),Ti=null)}me.releaseFirefoxMicrophonePermissionWarmup=R;async function W(F=!1,Z=!0,se=!0){!F&&!Z?await io():me.releaseFirefoxMicrophonePermissionWarmup();let Se=a()&&Z,tt=i()&&F,g;if(!Se&&!tt)g=new MediaStream;else try{g=await Ei(new kt(Se,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 K(F,Z){let se=F&&!p.consumerFastScreenShare?p.fastScreenShareWidth:window.screen.width,Se=F&&!p.consumerFastScreenShare?p.fastScreenShareHeight:window.screen.height,tt=p.getScreenFrameRate(F);return ro(new oa(se,Se,tt,Z))}me.getScreenMedia=K;async function z(F=!1,Z){let se=F?p.videoEffectMaxWidth:p.videoMaxWidth,Se=F?p.videoEffectMaxHeight:p.videoMaxHeight;return Ei(new kt(!1,!0,se,Se,Z))}me._getUserVideo=z;async function Re(F,Z){let se=Z?.width||p.videoMaxWidth,Se=Z?.height||p.videoMaxHeight;return Ei(new kt(!1,F||!0,se,Se))}me.getUserVideo=Re;async function De(F){return Ei(new kt(F||!0,!1))}me.getUserAudio=De;async function ne(F,Z){let[se]=F.getVideoTracks();if(!se)throw new Error("Video track not found in stream");return Ji(se,Z)}me.setResolution=ne;async function ie(F,Z){let Se=(await ca()).find(tt=>tt.kind===F&&tt.deviceId===Z);return Se?(F==="videoinput"?ze=Se:F==="audioinput"?Je=Se:F==="audiooutput"&&(dr=Se),vt.set(F,Z),Se):null}me._saveDeviceId=ie;function J(){if(!tr||tr.readyState==="ended"){let F=me.getAudioContext(),Z=F.createMediaStreamDestination(),se=F.createGain();se.gain.value=1e-5,se.connect(Z),se.connect(F.destination);let Se=F.createOscillator();Se.type="sine",Se.frequency.value=0,Se.connect(se),Se.start(),tr=Z.stream.getAudioTracks()[0]}return Object.assign(tr.clone(),{enabled:!1})}me.getSilentMediaTrack=J;function Wt(F=p.videoMinWidth,Z=p.videoMinHeight){Jt||(Jt=document.createElement("canvas")),Jt.width=F,Jt.height=Z;let se=Jt.getContext("2d");return se.rect(0,0,F,Z),se.fillStyle="black",se.fill(),(!er||er.readyState==="ended")&&(er=Jt.captureStream(p.videoFrameRate).getVideoTracks()[0]),Object.assign(er.clone(),{enabled:!1})}me.getBlackMediaTrack=Wt;function La(){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=La;function Ua(){return!!navigator.mediaDevices.getDisplayMedia}me.isScreenCapturingSupported=Ua;function Ba(){let F=me.browserName()==="Safari"&&me.browserVersion()==="15"&&me.browserSubVersion()==="1",Z=me.browserName()==="Opera",se=me.browserName()==="Yandex";return F||Z||se}me.isBrokenH264Decoder=Ba;function li(){return me.browserName()==="Yandex"&&me.os()==="Windows"||p.simulcast}me.isBrokenVP9Encoder=li;function pi(){let F=me.browserName()==="Safari"&&Number(me.browserVersion())===17&&[4,5,6].includes(Number(me.browserSubVersion())),Z=me.os()==="Windows"&&me.osVersion()===10;return F||Z}me.isBrokenVP9Decoder=pi;function re(){return me.browserName()==="Firefox"&&Number(me.browserVersion())<60}me.isOldDataChannelDescription=re;function Fa(){return!(me.baseChromeVersion()&&me.isMobile())}me.canPreferH264=Fa;function Va(){return!(me.browserName()==="Firefox"||me.browserName()==="Safari")}me.isSimulcastSupportedByBrowser=Va;function X(){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 Z in F)if(Object.hasOwn(F,Z)&&F[Z].test(Be))return Z;return"Unknown"})()),sa}me.os=X;function ja(){return ln}me.osVersion=ja;function zr(){return na===null&&(na=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(pn)),na}me.isMobile=zr;function Jr(){return ar()[0]}me.browserName=Jr;function Yr(){return ar()[1]}me.browserVersion=Yr;function Ha(){return ar()[3]}me.baseChromeVersion=Ha;function Ga(){return rr||(rr=new(window.AudioContext||window.webkitAudioContext)),rr.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),rr}me.getAudioContext=Ga;function Qr(){return ar()[4]}me.browserSubVersion=Qr;function Wa(){return me.baseChromeVersion()>=105&&!me.isMobile()}me.isAudioShareSupported=Wa;function Ka(F,Z){ot[F]||(ot[F]=[]),ot[F].push(Z)}me.addEventListener=Ka;function $a(F,Z){if(ot[F])if(!Z)delete ot[F];else{let se=ot[F].indexOf(Z);se>-1&&ot[F].splice(se,1)}}me.removeEventListener=$a})(ve||(ve={}));var A=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: ${A.hasCameraPermission()}, Mic: ${A.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 mr=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,mn=512*1024,Qt=100*1024,ao=5,pa="_okcls_logs_session_",no=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){hn(e);continue}let i=_n(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&&(hn(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>da||this.length>ao-1||this.size+r>this.available);)this.deleteOldestItem()}};function gn(){return`${pa}${Date.now()}`}function _n(n){return new Blob([n]).size}function hn(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function hr(){let n=It.toString();if(!ke.available||!n)return;let r=_n(n);if(r>mn){It.bisect(),hr();return}ke.cleanup(Qt+r);try{window.localStorage.setItem(gr,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){hr();return}if(r>Qt){It.bisect(),hr();return}ke.storageSize=0;return}r>mn&&(ke.add(gr,r),gr=gn(),It.clear(),ke.cleanup(Qt))}function ma(){!ke.available||!It.length||hr()}function so(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=It.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 oo(e,t),t}function oo(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 fn(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"})};It.push(t),Ne.add(t),la||(la=window.setTimeout(()=>{la=null,ma()},no))}function ha(){ke||(ke=new ua,It=new mr,gr=gn(),window.addEventListener("beforeunload",ma))}var ke,It,gr,la=null;window.__VKCallsSDKLogs__=(n=!1)=>(ke||ha(),ma(),so(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),fn(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 K(){return e}ne.enabled=K;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 De(ie,...J){}ne.test=De})(ga||(ga={}));var d=ga;var fa=class{constructor(){o(this,"_conversations",new Map);o(this,"_activeId",null)}add(r){if(this._conversations.has(r.id))throw new Error(`CallRegistry: conversation ${r.id} already exists`);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();if(e)try{await e.hold(!0)}catch(i){throw d.error(`Can't hold previous active, error: ${i}`),new Error("Cannot switch call: hold failed")}this._activeId=r;let t=this._conversations.get(r);if(t&&t?.isCallHeld)try{await t.hold(!1)}catch(i){throw d.error(`Can't hold next active, error: ${i}`),new Error("Cannot switch call: hold failed")}}clear(){this._conversations.clear(),this._activeId=null}},le=new fa;var Ri=class extends ce{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 L=require("messagepack");var Sn=(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))(Sn||{}),x=Sn;var lo="kf";function Xt(n){return n.stopStream}function Sa(n){return n.keyFrameRequested}function vn(n){if(Xt(n))return"ss";if(Sa(n))return lo;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||{}),In="s",En="m";function rt(n){return n.participantId+(n.mediaType?$t+In+n.mediaType:"")+(n.streamName?$t+En+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 In:t=po(c.slice(1));break;case En:i=c.slice(1);break;case zi: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 po(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),uo(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 uo(n){return n.buffer!==void 0}function _r(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 Tn=0,Rn=1,mo=2,ho=3,go=4,_o=5,fo=6,So=7,vo=0,Io=1,Eo=2,ct=0,To=0,Ro=0,Co=1,fr=class{constructor(){o(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=at();L.Int.enc(t,Tn),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,Io);else if(Sa(i))L.Int.enc(a,Eo);else if(L.Int.enc(a,vo),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,Ro);break;case"cn":L.Int.enc(a,Co);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,Rn),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,mo),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,ho),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,go),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,_o),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,fo),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,So),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=_r(s)}else e=_r(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)!==To){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case Tn:return this.deserializeUpdateDisplayLayoutResponse(e);case Rn: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=_r(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 Cn=(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))(Cn||{}),ee=Cn;var yo=1e3;function pe(n,r,e=0){return r in n&&n[r]?n[r]:e}function va(...n){return r=>{for(let e of n)if(e(r))return!0;return!1}}function Et(n,r){return e=>e[n]===r}function Po(n){return(r,e)=>e[n]-r[n]}function Ci(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function yn(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function Ea(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])?Ea(e[1]):e[1],r),{})}function Pn(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function bo(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(Pn).then(yn)}function bn(n){let r=n.filter(Et("type","candidate-pair")).sort(Po("priority")).find(va(Et("nominated",!0),Et("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(Et("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(Et("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}}),Ea(e)}function Ia(n,r,e=!1){let t=Ci("id",n),i=e?n.filter(va(Et("type","remote-inbound-rtp"))):n.filter(va(Et("type","inbound-rtp"),Et("type","outbound-rtp")));return A.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:pe(a,"bytesReceived"),bytesSent:pe(a,"bytesSent"),headerBytesReceived:pe(a,"headerBytesReceived"),headerBytesSent:pe(a,"headerBytesSent"),jitter:pe(a,"jitter"),packetsLost:pe(a,"packetsLost"),packetsReceived:pe(a,"packetsReceived"),packetsSent:pe(a,"packetsSent"),fractionLost:pe(a,"fractionLost"),pliCount:pe(a,"pliCount"),firCount:pe(a,"firCount"),nackCount:pe(a,"nackCount"),userId:r[s],freezeCount:pe(a,"freezeCount",0),totalFreezesDuration:pe(a,"totalFreezesDuration",0)},E="mid"in a&&typeof a.mid=="string"?a.mid:void 0,P="rid"in a&&typeof a.rid=="string"?a.rid:void 0;if(E&&(h.mid=E),P&&(h.rid=P),c==="video"){let R=pe(a,"framesDecoded"),W=pe(a,"totalInterFrameDelay"),K=pe(a,"totalSquaredInterFrameDelay"),z=pe(a,"encoderImplementation"),Re=pe(a,"decoderImplementation");z&&(h.encoderImplementation=z),Re&&(h.decoderImplementation=Re),h.interframeDelayVariance=(K-W*W/R)/R}if(c==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=pe(a,"totalEncodeTime")??0),c==="audio"&&(h.totalSamplesReceived=pe(a,"totalSamplesReceived"),h.concealedSamples=pe(a,"concealedSamples"),h.insertedSamplesForDeceleration=pe(a,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=pe(a,"removedSamplesForAcceleration"),h.silentConcealedSamples=pe(a,"silentConcealedSamples"),h.concealmentEvents=pe(a,"concealmentEvents"),h.totalAudioEnergy=pe(a,"totalAudioEnergy")),m&&t[m]){let 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 Ea(h)}).filter(a=>!!a)}function An(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=Ci("ssrc",n?.remoteRtps||[]),i=Ci("ssrc",r?.remoteRtps||[]));let a=Ci("ssrc",n.rtps),s=Ci("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=K=>K??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 Mn(n,r,e={},t=!1){let i=await bo(n),a={timestamp:Date.now(),transport:bn(i),rtps:Ia(i,e)};return t&&(a.remoteRtps=Ia(i,e,!0)),r?An(a,r,t):(await I.delay(yo),Mn(n,a,e,t))}function Ao(n){performance.clearMarks(n),performance.mark(n)}function Mo(n){performance.clearMarks(n)}function wo(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 Do(n){return`${ee.SCREENSHARE_FIRST_FRAME}_${ko(n)}`}function ko(n){return typeof n=="string"?n:JSON.stringify(n)}var he={distinctById:yn,rtcStatsToArray:Pn,extractTransport:bn,extractRtps:Ia,delta:An,collectStats:Mn,setMark:Ao,clearMark:Mo,measureMark:wo,getMarkNameScreenshareFirstFrame:Do};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}),M.logClientStats(e);Ye._instance._eventualLogs.clear()}M.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=he.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 Ta={connected:{wt:ee.WEBTRANSPORT_CONNECTED,ws:ee.WEBSOCKET_CONNECTED},reconnected:{wt:ee.WEBTRANSPORT_RECONNECTED,ws:ee.WEBSOCKET_RECONNECTED},failed_pings:{wt:ee.WEBTRANSPORT_FAILED_PINGS,ws:ee.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:ee.WEBTRANSPORT_FAILED_EXCEPTION,ws:ee.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:ee.WEBTRANSPORT_TIMEOUT,ws:ee.WEBSOCKET_TIMEOUT},restart:{wt:ee.WEBTRANSPORT_RESTART,ws:ee.WEBSOCKET_RESTART}};var yi=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 Sr=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 Sr);o(this,"p50",new yi(.5));o(this,"p95",new yi(.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 wn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(wn||{}),Me=wn;var Dn=(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))(Dn||{}),U=Dn;var kn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(kn||{}),lt=kn;var{isObject:On,isObjectsEquals:Oo}=I;function vr(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||On(n.bitrates)&&On(r.bitrates)&&!Oo(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function Ir(n,r){return!(!vr(n.camera,r.camera)||!vr(n.screenSharing,r.screenSharing)||!vr(n.fastScreenSharing,r.fastScreenSharing))}function Ra(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 xn(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Tt=class Tt{constructor(){o(this,"_codecUsages",new Map);o(this,"getCurrentTransportTopology",()=>{})}static create(r){let e=new Tt;e.getCurrentTransportTopology=r,Tt._instance=e}static reportUsage(r){let e=Tt._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:ee.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),M.logClientStats(e)}static destroy(){Tt._instance?._destroy(),Tt._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};o(Tt,"_instance",null);var nt=Tt;var xt=class extends ce{constructor(e,t){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_state","IDLE");o(this,"_pc",null);this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var Nn="videochat-epi",xo=5e3,No=500,pt=class extends ce{constructor(e,t,i=!1){super();o(this,"_previousPerfStatReportTimestamp",0);o(this,"_previousNetworkStatReportTimestamp",Date.now());o(this,"_previousCallStatReportTimestamp",Date.now());o(this,"_previousCallStatReport",null);o(this,"_screenShareStats",[]);o(this,"_signaling");o(this,"_directTopology");o(this,"_handleScreenSharingStat",e=>{this._screenShareStats.push(e)});o(this,"_handleTransportStateChanged",e=>{(this._directTopology&&e==="CONNECTED"||!this._directTopology&&e==="OPENED")&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())});this._signaling=t,this._directTopology=i,this.subscribe(e,"REMOTE_DATA_STATS",this._handleStats.bind(this)),this.subscribe(e,"SCREEN_SHARING_STAT",this._handleScreenSharingStat.bind(this)),this.subscribe(e,"STATE_CHANGED",this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(Nn)||"",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+xo<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+No<=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(Nn,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:Un(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:Un(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&&!Er(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!Er(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!Er(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&&!Er(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}Ln(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),Ln(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 Ln(n,...r){for(let e of r)if(!Object.hasOwn(n,e)||n[e]===void 0)return!1;return!0}function Un(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function Er(n){return n===void 0}function Nt(n){return Number.isNaN(n)?0:n}var bi=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 Bn=.25,Fn=.35,Lo=85,Uo=.1,Bo=1.5,Fo=.1,Vo=1,jo=.6,Ho=.3;var Ai=class extends ce{constructor(e){super();o(this,"_signaling");o(this,"_localNetworkStat");o(this,"_remoteNetworkStat");o(this,"_lastNetworkStat");o(this,"_networkLimits",{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}});o(this,"_lastStatSentTimestamp",0);o(this,"_currentState","good");this._signaling=e,this._localNetworkStat={rtt:new bi(Bn,Bn),loss:new bi(Fn,Fn),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)/Lo);for(let s=0;s<a;s++)i*=1-Uo;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)/Bo);for(let s=0;s<a;s++)i*=1-Fo;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*Vo;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>=jo?"good":e>=Ho?"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 Go=30*1e3,Mi=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 pt(this,i,!0),this._directStatReporter=new Ai(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){M.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){M.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){Ir(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 M.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 M.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":A.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&&(M.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}),M.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?(M.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}),M.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}),M.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}),M.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}),M.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}),M.log(k.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!A.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,p.preferH264&&A.canPreferH264(),A.isBrokenH264Decoder(),p.preferVP9,t&&p.audioNack),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,p.preferVP9,A.isBrokenVP9Encoder(),A.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}),M.log(k.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}he.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:A.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>Go)||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 Vn=(t=>(t.AUDIO_MIX="audio-mix",t.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",t.TRANSPARENT_AUDIO_TRACK_PREFIX="ta",t))(Vn||{}),Le=Vn;var Ca;(r=>{function n(){return{estimatedPerformanceIndex:pt.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&&A.isSimulcastSupportedByBrowser(),consumerFastScreenShare:p.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:p.consumerFastScreenShareQualityOnDemand,transparentAudio:p.transparentAudio}}r.get=n})(Ca||(Ca={}));var Rr=Ca;var Wo=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(Wo)}}_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 ut=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,ut.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,ut.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,ut.decode)(i);return{type:"notification",notification:U.SPEAKER_CHANGED,speaker:this.getStreamDescription(l)?.participantId};case 5:let u=(0,ut.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,ut.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,ut.decode)(i).map(W=>{let[K,z,Re,De,ne,ie,J]=W;return{participantId:this.getStreamDescription(K)?.participantId,gain:z,pause:Re,offset:De,mute:ne,liveStatus:ie,startTimeMs:J}});return{type:"notification",notification:U.MOVIE_UPDATE_NOTIFICATION,data:R}}case 9:let E=(0,ut.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,ut.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 ya=gi(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":M.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)}},[ya.default,ya.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 mt=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())},[A.baseChromeVersion()>=92||A.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&&!A.isBrokenVP9Decoder()&&A.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 jn=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=he.getMarkNameScreenshareFirstFrame(this._participantId),i=he.measureMark(t);i!==null&&Ae.logEventualStat({name:ee.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Ko=65536,Pa="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)%Ko!==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(){he.clearMark(Pa),he.clearMark(he.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 jn.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){he.setMark(Pa);return}let e=he.measureMark(Pa);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)&&!(A.browserName()==="Safari"&&Number(A.browserVersion())===15)&&!(A.browserName()==="Firefox"&&Number(A.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&&mt.isBrowserSupported()}};var Di=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||!mt.isBrowserSupported()?this._decoder=new wi:this._decoder=new mt;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 mt&&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 Hn(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 Gn(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 Wn(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 Kn(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 $n(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=gi(require("simple-ebml-builder"));var $o=2**15-1,ba=1,qo=5,zo=5;var Aa=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)-qo);i-t>zo&&(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(ba)),O.element(O.ID.TrackUID,O.number(ba)),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 Aa(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>$o&&(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(ba),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 ki=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=Gn(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 Di(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=$n(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 Ma=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}},Oi=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 Ma(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 wa=gi(require("@vkontakte/libvpx"));var Jo=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
|
+
`,i=>{i.error?this._onFrame(null,i.error):this._onFrame({type:i.frameType,timestamp:i.timestamp,duration:i.duration,data:i.data,byteLength:i.data?.byteLength,width:i.width,height:i.height})},[wa.default,wa.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:d.enabled()})}_encode(e,t){let i=e.data.buffer;this._sendToWorker("frame",{width:e.width,height:e.height,imageData:i,keyFrame:t},[i])}_requestFrameVideo(e){let t=this._drawFrameVideo();this._encode(t,e)}_requestFrameBitmap(e){window.clearTimeout(this._frameReadTimeout),this._frameReadTimeout=window.setTimeout(()=>{if(this._lastFrame){let t=this._drawFrameData(this._lastFrame);this._encode(t,e)}else this._onFrame(null)},Jo),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let i=this._drawFrameData(t);this._encode(i,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),d.debug("LibVPxEncoder destroyed")}};var Vt=class extends Qe{constructor(e,t,i,a,s,c){super();o(this,"_sourceTrack");o(this,"_trackProcessor");o(this,"_onFrame");o(this,"_useCongestionControl");o(this,"_maxBitrate");o(this,"_useCbr");o(this,"_frameRate");this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=i,this._maxBitrate=a,this._useCbr=s,this._frameRate=c,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,i=this._trackProcessor.readable;d.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?"VP9":"VP8"}`),await this._createWorker(`"use strict";var exports=(()=>{var p=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var _=(a,t)=>{for(var n in t)p(a,n,{get:t[n],enumerable:!0})},I=(a,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of B(t))!x.call(a,o)&&o!==n&&p(a,o,{get:()=>t[o],enumerable:!(i=T(t,o))||i.enumerable});return a};var M=a=>I(p({},"__esModule",{value:!0}),a);var O={};_(O,{default:()=>S});var S=()=>{let t,n,i,o,g,m,d=null,f=0,b=!1,u=0,F,V,c=!1,l=!1;function h(e){t=e.readable,n=t.getReader(),i=e.width,o=e.height,g=e.isVP9,m=e.framerate,F=e.useCongestionControl,V=e.maxBitrate,F&&(u=V,c=e.useCbr),E(),self.postMessage({type:"ready"})}function A(e){e&&!l&&(l=!0),self.clearTimeout(f),f=self.setTimeout(()=>{d&&y(d,l)},1e3),!b&&(b=!0,n.read().finally(()=>{b=!1,self.clearTimeout(f)}).then(({done:r,value:s})=>{if(d?.close(),d=null,!(r||!s)){if(!R){n.releaseLock(),t.cancel();return}d=s,y(s,l)}}))}function y(e,r){(e.codedWidth!==i||e.codedHeight!==o)&&(i=e.codedWidth,o=e.codedHeight,E(),l=!0),R.encode(e,{keyFrame:r}),r&&(l=!1)}function E(){let e={framerate:m,codec:g?"vp09.00.50.08":"vp8",width:i,height:o,latencyMode:"realtime",bitrateMode:c?"constant":"variable"};u>0&&(e.bitrate=u),R.configure(e)}function C(e,r,s){u=e,c=r,m=s,E()}let R=new VideoEncoder({output:e=>{let r;e.data?r=e.data:(r=new ArrayBuffer(e.byteLength),e.copyTo(r)),self.postMessage({type:"frame",frameType:e.type,timestamp:e.timestamp,duration:e.duration,width:i,height:o,data:r},[r])},error:e=>{self.postMessage({type:"frame",error:String(e)})}});self.onmessage=e=>{switch(e.data.type){case"init":h(e.data);break;case"frame":A(e.data.keyFrame);break;case"set_bitrate":C(e.data.bitrate,e.data.useCbr,e.data.fps);break}}};return M(O);})();
|
|
11
|
+
`,a=>{a.error?this._onFrame(null,a.error):this._onFrame({type:a.frameType,timestamp:a.timestamp,duration:a.duration,data:a.data,byteLength:a.data?.byteLength,width:a.width,height:a.height})},[],{readable:i,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[i])}requestFrame(e=!1){this._sendToWorker("frame",{keyFrame:e})}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t,fps:i})}isVP9(){return!0}destroy(){this._removeWorker(),d.debug("WebCodecsEncoder destroyed")}static isBrowserSupported(){return"VideoEncoder"in window&&"Worker"in window&&"EncodedVideoChunk"in window&&"MediaStreamTrackProcessor"in window}};var Yo=2100,Qo=600,Xo=1.2,qn=.8,Zo=2e3,ec=8e3,Da=8e3,tc=16e3,ic=4,rc=2e3,Ar=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Ar||{}),xi=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=Yo,a&&(this._highDelayThreshold=Qo),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>Zo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,ic),this._probing=!1);let z=qn*h*1e3;if(z>=this._targetBitrate&&(z=this._targetBitrate*qn),z=Math.max(z,this._minBitrate),z<this._targetBitrate){let Re=Math.round(z/1e3),De=Math.round(this._upPenalty*Da/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=${De}s`),this._setBitrate(z,!0),this._targetBitrate=z}this._lastDown=i}let P=i-this._lastUp,R=ec+this._upPenalty*Da;if(a===1&&P>R&&E>R){let z=Math.min(this._targetBitrate*Xo,this._maxBitrate);if(z>this._targetBitrate){let Re=Math.round(z/1e3),De=Math.round(this._targetBitrate/1e3),ne=Math.round(this._upPenalty*Da/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=${De} -> 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>tc&&(this._probing=!1);let K=i-this._lastDown;this._upPenalty>0&&K>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>rc){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 Ni=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 ka=65536,nc=50,sc=400,oc=1e6,cc=3e5,dc=3e4,lc=2e3,pc=5,Mr=0,Li=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 Ni(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 Oi);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 xi(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=>{Wn(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Kn(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+ka)%ka>pc&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>lc&&(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 Oi;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=Hn(r,e,t,i,Mr,this._encoder.isVP9(),a),c={sequence:Mr,data:s};return Mr=(Mr+1)%ka,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(cc,Math.min(oc,Math.round(t*nc))),a=Math.round(t*sc);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>dc){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var uc=90,mc=4294967295,Ui=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){Ir(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&&A.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new pt(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),M.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 Li(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new ki(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent("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(A.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 he.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=Rr.get();!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&&A.isSimulcastSupportedByBrowser(),a=i;try{await this._pc.setRemoteDescription(e)}catch(l){throw d.error("[single] unable to set remote offer",l),M.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),M.log(k.ERROR,"createAnswer-single"),l}try{if(!this._pc)throw new Error("Interrupt allocation");c.sdp=I.patchLocalSDP(c.sdp,!1,A.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),M.log(k.ERROR,"setLocalDescription-single"),l}if(a&&s){c.sdp=I.patchSimulcastAnswerSdp(c.sdp,s,ft.WIDTH,ft.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),M.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=fi(ft.WIDTH,ft.HEIGHT,this._serverSettings.camera?.bitrates?.generic),c=0,l=1;for(let m of a.encodings)m.scalabilityMode=_i,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,A.isOldDataChannelDescription(),!1,!1,!1,A.isBrokenVP9Encoder(),A.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),M.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),M.log(k.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):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&&(M.log(k.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))});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),M.log(k.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),p.simulcast&&A.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 M.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 M.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 M.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 M.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&mc,u=Math.ceil(l/uc);return Math.min(100,Math.max(0,u))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.mediaSettings.isVideoEnabled,a=this._findFirstSimTransceiver();if(!p.simulcast||!A.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=fi(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=$i(R.rid),R.scalabilityMode=_i,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(`
|
|
14
13
|
degradationPreference updated for fast share RTP Sender
|
|
15
14
|
Actual senderStats: ${JSON.stringify(a)}
|
|
16
15
|
serverSettings: ${JSON.stringify(this._serverSettings.fastScreenSharing)}
|
|
17
|
-
`)}})}_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||{}),Mr=class extends de{constructor(e,t,i,a){super();c(this,"_signaling");c(this,"_mediaSource");c(this,"_topology");c(this,"_allocated",[]);c(this,"_opened",[]);c(this,"_directTransport",null);c(this,"_serverTransport",null);c(this,"_serverSettings");c(this,"_dtListeners",[]);c(this,"_stListeners",[]);c(this,"_states",{});c(this,"_localState","IDLE");c(this,"_animojiReceiver",null);c(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 o of e){if(this._opened.indexOf(o)!==-1){d.warn(`The participant [${o}] has already had opened transport`);continue}if(this._allocated.indexOf(o)===-1){d.warn(`The participant [${o}] has no allocated transport`);continue}this._opened.push(o),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}`),b.log(w.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology==="SERVER"&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology==="DIRECT"){let t=e.offerTo||[],i=e.offerToTypes||[],a=e.offerToDeviceIdxs||[],s=t.length&&i.length?I.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){d.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&d.warn("Topology changed to DIRECT, but the allocated participants count more then one");let o=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let l=s===o;this._directTransport=this._createDirectTransport(o,l)}this._opened.indexOf(o)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new Pi(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("VIDEO_STREAM_DEBUG",this._onVideoStreamDebug.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 Ni(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("VIDEO_STREAM_DEBUG",this._onVideoStreamDebug.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)}_onVideoStreamDebug(e){this._triggerEvent("VIDEO_STREAM_DEBUG",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"?(b.log(w.PAT_WAITING_TIME_ERROR,"wrongTopology"),d.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(b.log(w.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var Le=class Le{constructor(){c(this,"trackerByTransport",{ws:new dt,wt:new dt});c(this,"lastSeen",{})}static create(){Le._instance||(Le._instance=new Le)}static mark(r){if(!Le._instance)return;let e=Date.now(),t=Le._instance.lastSeen[r];if(typeof t=="number"){let i=e-t;i>=0&&Le._instance.trackerByTransport[r].add(i)}Le._instance.lastSeen[r]=e}static logMetrics(r){Le._instance&&["ws","wt"].forEach(e=>{if(!Le._instance.trackerByTransport[e].hasData)return;let t=Le._instance.trackerByTransport[e].snapshot();b.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_PING_SUMMARY,min_value:t.min,max_value:t.max,avg_value:t.avg,median_value:t.median,p95_value:t.p95,values_count:t.count,signaling_transport:e})})}static destroy(){Le._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new dt,wt:new dt},this.lastSeen={}}};c(Le,"_instance");var mt=Le;var Ve=class Ve{constructor(){c(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();b.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_COMMAND_SUMMARY,api_method:i,min_value:s.min,max_value:s.max,avg_value:s.avg,median_value:s.median,p95_value:s.p95,values_count:s.count,signaling_transport:a})}}static destroy(){Ve._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};c(Ve,"_instance");var ht=Ve;var Kn=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(Kn||{}),Ke=Kn;var $n={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($n),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($n).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};var $e=mi(require("fflate"));var hc=63n,gc=16383n;var _c=4611686018427387903n,Dr=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=hc)return new Uint8Array([Number(e)]);if(e<=gc)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<=_c)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")}},wr=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 kr=class{constructor(r){c(this,"encoder");c(this,"compression");c(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new Dr,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}}},Or=class{constructor(r){c(this,"decoder");c(this,"compression");c(this,"lengthDecoder");c(this,"buffer");c(this,"expectedLength");c(this,"offset");c(this,"lengthPrefixLength");this.decoder=new TextDecoder,this.lengthDecoder=new wr,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 ri=class{constructor(r,e={}){c(this,"webTransport");c(this,"stream",null);c(this,"writer",null);c(this,"reader",null);c(this,"url");c(this,"options");c(this,"compression");c(this,"encoder");c(this,"decoder");c(this,"onopen",null);c(this,"onmessage",null);c(this,"onerror",null);c(this,"onclose",null);c(this,"readyState",WebSocket.CONNECTING);this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new kr(this.compression),this.decoder=new Or(this.compression),this.connect()}getCompressionTypeFromUrl(r){try{let t=new URL(r).searchParams.get("compression");switch(t){case"gzip":case"deflate":case"deflate-raw":return t;default:return null}}catch(e){return d.log("Exception while parsing compression",e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,d.debug("[WebTransport] WebTransport connected to "+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event("open")),await this.readLoop()}catch(r){d.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error")),this.onclose?.(new CloseEvent("close",{code:1006,reason:"Connection Failed"}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:r,value:e}=await this.reader.read();if(r)break;e&&(yield e)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let r of this.readChunks())this.decoder.decode(r).forEach(t=>{this.onmessage?.(new MessageEvent("message",{data:t}))});this.close(1e3,"Stream Closed")}catch(r){d.error("[WebTransport] Stream read failed",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(r){if(this.readyState!==WebSocket.OPEN){d.warn("[WebTransport] Attempt to send data before webtransport is open");return}if(!this.writer){d.warn("[WebTransport] Attempt to send data before stream is ready");return}try{await this.writer.ready;let e=this.encoder.encode(r);await this.writer.write(e)}catch(e){d.error("[WebTransport] Failed to send data",e),this.onerror?.(new Event("error")),this.close(1006,"Failed to send data")}}close(r=1e3,e){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(t){d.warn("[WebTransport] already closed. Did we get a STOP_SENDING? ignore",t)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent("close",{code:r,reason:e})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return"WebTransport"in window&&typeof WebTransport=="function"?M.browserName()==="Firefox"?p.webtransportFF:M.browserName()!=="Safari":!1}};var qn="open",zn=10,fc=["service-unavailable","conversation-ended","invalid-token"],Vt=class n extends hi{constructor(){super(...arguments);c(this,"socket",null);c(this,"sequence",1);c(this,"lastStamp",0);c(this,"websocketCommandsQueue",[]);c(this,"datachannelCommandsQueue",[]);c(this,"incomingCache",[]);c(this,"responseHandlers",{});c(this,"connectionType");c(this,"reconnectCount",0);c(this,"endpoint");c(this,"wtEndpoint",null);c(this,"conversationResolve",null);c(this,"conversationReject",null);c(this,"connected",!1);c(this,"listenersReady",!1);c(this,"postfix","&platform="+p.platform+"&appVersion="+p.appVersion+"&version="+p.protocolVersion+"&device="+p.device+"&capabilities="+Xe.getFlags());c(this,"peerId",null);c(this,"conversationId",null);c(this,"reconnectTimer",0);c(this,"connectionMessageWaitTimer",0);c(this,"doctorTimer",0);c(this,"participantIdRegistry",null);c(this,"producerNotificationDataChannel",null);c(this,"producerCommandDataChannel",null);c(this,"producerCommandDataChannelEnabled",!1);c(this,"producerCommandSerializationService",new _r)}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){b.log(w.SOCKET_ACTION,"already_opened"),i(Error("Socket already opened"));return}this.conversationResolve=a=>{t(a),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=a=>{i(a),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},i=!0,a=0){if(t.participantId){let s=I.decomposeParticipantId(t.participantId),o=I.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:o.id,participantType:o.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,i,a)}async _sendRaw(e,t={},i=!0,a=0){let s=o=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(o),this.producerCommandDataChannel?.readyState===qn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){b.log(w.SOCKET_ACTION,"not_opened"),d.warn("[signaling] socket is not opened"),o.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(b.log(w.SOCKET_ACTION,"invalid_state"),d.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(o),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((o,l)=>{let u=(P,C=!1)=>{!a||C?l(P):(d.debug("[signaling] resending a signaling message",e,E.sequence),a--,s(E))},m=this.sequence++,h=`${e}_${m}`;ue.setMark(h);let E={sequence:m,name:e,statMarkName:h,params:t,responseTimer:0,needResponse:i,resolve:o,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,zn)}async acceptCall(e){return this._send(x.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(x.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,zn)}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 ri(this.wtEndpoint+this.postfix+i)):(d.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+i),this.socket=new WebSocket(this.endpoint+this.postfix+i)),this._markTransportStat(e===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 o=p.participantListChunkInitIndex;s+=`&partIdx=${o}`;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"),b.log(w.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){b.log(w.SOCKET_ACTION,"parse_error"),d.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(d.debug("[signaling] signaling connected",e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.postfix+=`&peerId=${e.peerId.id}`,this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat("restart"),this._triggerEvent(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:b.log(w.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){b.log(w.SOCKET_ACTION,`error-${e.error}`);let t=e.error?fc.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(R.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Me.NOTIFICATION,{notification:U.CLOSED_CONVERSATION,reason:R.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){b.log(w.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){if(b.log(w.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(R.CANCELED));return}this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new B(R.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})`),b.log(w.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=ue.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],b.log(w.SOCKET_ACTION,"response-error"),i.reject(new Error(t.error||`Response error [${i.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],b.log(w.SOCKET_ACTION,"response-timeout"),i.reject(new Error(t.error||`Response timeout [${i.name}]`))):i.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),n.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(d.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==qn){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]=_n(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 ri.isBrowserSupported()&&this.wtEndpoint!==null&&p.webtransport}_getSocketType(){return this.socket instanceof ri?"wt":"ws"}_markTransportStat(e){let t=this._getSocketType(),i=Sa[e][t];ue.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=Sa[e][i];Ae.logEventualStat({name:a,...t})}};var Jn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(Jn||{}),Oe=Jn;var Yn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(Yn||{}),nt=Yn;var Qn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(Qn||{}),xr=Qn;var Xn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(Xn||{}),Nr=Xn;var Zn=(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))(Zn||{}),Ze=Zn;function es(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function ts(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 is=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(is||{}),je=is;var rs=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(rs||{}),Z=rs;var as=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(as||{}),ai=as;var ns=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(ns||{}),ss=ns;function os(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var cs=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(cs||{}),gt=cs;function Li(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var Lr=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Lr||{}),Q;(m=>{function n(h){return h.length?typeof h[0]=="object"?h:h.map(E=>r(E)):[]}m.fromIds=n;function r(h,E="USER",P=0){return{id:h,type:E,deviceIdx:P}}m.fromId=r;function e(h,E=!0){let P=E?h.decorativeExternalUserId:h.externalId,C=h.deviceIdx??0;if(P)return t(P,C)}m.fromSignalingParticipant=e;function t(h,E=0){return{id:h.id,type:h.type==="ANONYM"?"ANONYM":"USER",deviceIdx:E}}m.fromSignaling=t;function i(h){return h.id}m.toSignaling=i;function a(h){let E=h.deviceIdx||0;return`{"id":"${h.id}","type":"${h.type}","deviceIdx":${E}}`}m.toString=a;function s(h,E="USER",P=0){return a(r(h,E,P))}m.fromIdToString=s;function o(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}m.fromString=o;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})(Q||(Q={}));function ds(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function ls(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var Ur=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function ps(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 Sc(n,r){switch(n){case pe.AUDIO:return!!r.isAudioEnabled;case pe.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case pe.VIDEO:return!!r.isVideoEnabled;case pe.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function us(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case je.MUTE:case je.MUTE_PERMANENT:{Sc(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function ms(n){let{muteStates:r={},mediaSettings:e}=n;return us(r,e)}function hs(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return us(r,t)}function gs(n,r){let e=new Uint8Array(r),t=0,i=0;for(;t<n.length&&i<r;){let a=n[t++],s=a>>4,o=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,o===15){let m;do m=n[t++],o+=m;while(m===255)}o+=4;let u=i-l;for(let m=0;m<o&&!(i>=r);m++)e[i++]=e[u+m]}return e}var ni=class{constructor(r){c(this,"_fixNoPacketsApplied",!1);c(this,"_fixNoPacketsChecked",!1);c(this,"_fixTooManyPacketsApplied",!1);c(this,"_fixTooManyPacketsSucceeded",!1);c(this,"_fixTooManyPacketsFailed",!1);c(this,"_fixTooManyPacketsTime");c(this,"_mediaSource");c(this,"_lastPacketsSent");c(this,"_lastPacketsSentTime");c(this,"_toggleAudioPromise",null);c(this,"_fixNoPacketsAppliedVideo",!1);this._mediaSource=r}_fixAudioDeviceNoPackets(r){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,b.log(w.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,b.log(w.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(M.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"),b.log(w.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),b.log(w.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,b.log(w.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0).catch(a=>{d.warn("[AudioFix] Failed to fix RV (too many packets)",a)}),this._fixTooManyPacketsTime=t)}}fix(r){if(!this._mediaSource)return;let e=r.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(r){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=r.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.getMediaSettings().isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(t=>{d.warn("[AudioFix] Failed to fix RV (no packets): video restart",t)}))}};var Ui=class{constructor(r,e=!1){c(this,"_audioElement",null);c(this,"_audioTracks",new Map);c(this,"_allowMultipleTracks");c(this,"_volume",1);c(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});c(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=M.getSavedOutput();r&&await this._audioElement.setSinkId?.(r.deviceId)}catch(r){throw b.log(w.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=M.browserName()!=="Safari"||M.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=o=>{d.debug("[audio] Play audio"),t.srcObject=null,t.srcObject=new MediaStream(o),t.load();let l=t.play();l&&l.catch(i)},s=()=>{d.debug("[audio] Recover audio playback");let o=this._getTracks();o.length?a(o):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 vc=90,Ic=3,Bi=class extends de{constructor(){super(...arguments);c(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>vc?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=Ic)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var Ec=44100,Ct=class{constructor(r,e){c(this,"_analyser",null);c(this,"_gainNode",null);c(this,"_fftBins",null);c(this,"_mediaStreamSource",null);c(this,"_lastSmoothedLevel",0);c(this,"_trackId");c(this,"_track");c(this,"_stream");this._trackId=r,this._track=e,this._stream=new MediaStream([e]);try{let t=M.getAudioContext();this._gainNode=t.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(t.destination),this._analyser=t.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=t.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let r=Ec/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 Fi=class extends de{constructor(e){super();c(this,"_detector",null);c(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,p.voiceParams.interval)};this._interval=window.setTimeout(t,p.voiceParams.interval);let i=()=>{let a=e.getSendAudioTrack();a&&this.init(a)};this.subscribe(e,"SOURCE_CHANGED",a=>{a.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&i()}),this.subscribe(e,"SOURCE_READY",i),i()}init(e){this._stopDetector(),this._detector=new 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 Br=class{constructor(r){this.processor=r;c(this,"queue",[]);c(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 Fr=class extends de{constructor(e){super();c(this,"_detectors",new Map);c(this,"_interval",null);c(this,"_activeParticipants");c(this,"_removedParticipants");c(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(we.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(`${we.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 Vr=class extends de{constructor(e,t,i){super();c(this,"_speakerId",null);c(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 Vi=class extends de{constructor(e,t,i){super();c(this,"_transport");c(this,"_volumes",{});c(this,"_participants",{});c(this,"_connectionTimeout",0);c(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"),b.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){let e=i=>i!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(d.warn("There is not connected transport, send callSpecError"),b.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let i="UNKNOWN",a=this._participants[t];a&&a.platform&&(i=a.platform),e.indexOf(i)<0&&(e.push(i),b.log(w.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var jr=class n{static correctHangupReason(r){switch(r){case R.HUNGUP:return"hangup";case R.CANCELED:return"canceled";case R.REJECTED:return"rejected";case R.BUSY:return"busy";case R.FAILED:return"failed";case R.MISSED:return"missed";case R.ANOTHER_DEVICE:return"another_device";case R.REMOVED:return"removed";case R.BANNED:return"banned";case R.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![R.HUNGUP,R.CANCELED,R.REJECTED,R.FAILED,R.BUSY,R.MISSED,R.ANOTHER_DEVICE,R.REMOVED,R.BANNED,R.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;b.logClientStats({name:X.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Hr=class{constructor(){c(this,"_isCallMarked",!1);c(this,"_isFinished",!1);c(this,"_callType",null)}markAcceptCall(r){this.mark(r==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(r){r==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(r){r==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(r){r==="SERVER"&&this.mark("server_join_server")}mark(r){this._isCallMarked||(this._isCallMarked=!0,this._callType=r,ue.setMark(X.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Ae.logEventualStat({name:X.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var Tc=1e3,Rc=1e4;var Cc=15,V=class V extends de{constructor(e,t){super();c(this,"_api");c(this,"_signaling");c(this,"_signalingActor");c(this,"_mediaSource",null);c(this,"_conversation",null);c(this,"_myLastRequestedLayouts",{});c(this,"_state","IDLE");c(this,"_participantState",Z.CALLED);c(this,"_participants",{});c(this,"_pendingParticipants",new Map);c(this,"_transport",null);c(this,"_debugInfo",null);c(this,"_volumesDetector",null);c(this,"_speakerDetector",null);c(this,"_localVolumeDetector",null);c(this,"_specListener",null);c(this,"_activeSpeakerId",null);c(this,"_lastSignalledActiveSpeakerId",null);c(this,"_isRealTimeAsrRequested",!1);c(this,"_serverSettings",wn());c(this,"_onUnload");c(this,"_audioOutput");c(this,"_lastStalled",{});c(this,"_audioMixStalled",!1);c(this,"_audioFix",null);c(this,"_streamByStreamId",new Map);c(this,"_streamIdByStreamDescription",new Map);c(this,"_participantIdByDebugStreamId",new Map);c(this,"_streamWaitTimerByStreamDescription",new Map);c(this,"_sequenceNumberByStreamDescription",new Map);c(this,"_cooldownTimestampByStreamDescription",new Map);c(this,"_cooldownQueueCleanupTimer",null);c(this,"_statFirstMediaReceived");c(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));b.create(e,t),b.setConversationIdProvider(()=>this._conversation?.id||null),Ae.create(),at.create(()=>this._transport?.getTopology()),mt.create(),ht.create(),this._api=e,this._signaling=new Vt,this._signalingActor=new Br(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?R.CANCELED:R.HUNGUP),p.clientEventsLoggingEnabled&&b.logClientEvent({event_type:X.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),b.destroy(),Ae.destroy(),at.destroy(),mt.destroy(),ht.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new Hr,this._audioOutput=new Ui(this._statFirstMediaReceived,p.transparentAudio),p.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),Tc))}static current(){return V._current}static hangupAfterInit(){V._activationMutex&&!V._current&&(V._delayedHangup=!0,V._abortController?.abort(new B(R.CANCELED)))}static id(){return V._current?._conversation?.id||null}async onStart({opponentIds:e,opponentType:t,mediaOptions:i,payload:a="",joiningAllowed:s=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:l,externalIds:u,onFastStart:m,conversationId:h}){if(V._activationMutex)throw b.log(w.ERROR,"startCall"),d.warn("Conversation: there is already running activation"),new B(R.FAILED);let E=Date.now();V._activationMutex=!0,Ne.startSession(),V._abortController=new AbortController,this._api.setAbortSignal(V._abortController?.signal),this._signaling.setAbortSignal(V._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let P=this._mediaSource.getMediaSettings();t===nt.CHAT||e&&e.length>1?this._logWithMediaSettings(w.OUTGOING_MULTIPARTY_CALL,P):this._logWithMediaSettings(w.OUTGOING_CALL,P);let C=await this._startConversation({opponentIds:e,opponentType:t,direction:Oe.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:o,onlyAdminCanShareMovie:l,externalIds:u,startedTime:E,onFastStart:m,conversationId:h});if(!this._conversation)throw new B(R.UNKNOWN_ERROR);if(this._participantState=Z.ACCEPTED,this._changeMediaSettings(P),await this._processConnection(C),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),V._delayedHangup)throw new B(R.CANCELED);return d.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:i}),await this._processConnectionSharedMovieInfo(C),await this._processConversationUrlSharingInfo(C),v.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants()),await this._onConversationParticipantListChunk(C),await this._processPinnedParticipants(C),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),V._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(P){throw this._close(P,"Unable to start conversation"),P}finally{V._activationMutex=!1}}async onJoin(e){if(V._activationMutex)throw b.log(w.ERROR,"joinCall"),d.warn("Conversation: there is already running activation"),new B(R.FAILED);let t=Date.now();V._activationMutex=!0,this._state="PROCESSING",Ne.startSession(),V._abortController=new AbortController,this._api.setAbortSignal(V._abortController?.signal),this._signaling.setAbortSignal(V._abortController?.signal);try{let i=!!e.observedIds?.length;if(i&&p.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new B(R.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(w.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new B(R.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a),this._conversation.waitForAdmin||this._conversation.waitingHall?(d.log(this._conversation.waitForAdmin?"Wait for admin":"In waiting hall"),V._current=this,V._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus(this._conversation.waitForAdmin?"WAIT_FOR_ADMIN":"WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(i){throw V._activationMutex=!1,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){d.debug("Join conversation part 2"),V._activationMutex=!0;try{if(this._participantState=Z.ACCEPTED,!this._conversation||!this._mediaSource)throw new B(R.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(e),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state==="CLOSE")return this._conversation;if(V._delayedHangup)throw new B(R.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),t),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),V._current=this;let i=this._extractLocalParticipantFromConnection(e);if(i){let a=I.mapParticipantState(i);Object.keys(a).length>0&&v.onLocalParticipantState(a)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(t){throw this._close(t,"Unable to join conversation"),t}finally{V._activationMutex=!1}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(a=>!!a)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let i={rooms:await this._extractExternalRooms(e)};return t&&(i.roomId=t),i}async onPush(e,t=se.USER,i,a,s){if(V._activationMutex)throw d.warn("Conversation: there is already running activation"),new B(R.REJECTED);V._activationMutex=!0,V._abortController=new AbortController,this._api.setAbortSignal(V._abortController?.signal),this._signaling.setAbortSignal(V._abortController?.signal);try{let o=Date.now(),l=await this._prepareConversation(e,t,i,a,s);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new B(R.UNKNOWN_ERROR);if(!l.conversation.participants.find(m=>m.state===Z.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),b.log(w.PUSH,"rejected"),new B(R.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(o,Oe.INCOMING),b.log(w.PUSH,"accepted"),V._current=this,V._delayedHangup)throw new B(R.CANCELED);V._activationMutex=!1}catch(o){throw V._activationMutex=!1,this._close(o,"Unable to handle inbound call push"),o}}_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(R.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(w.ACCEPT_CONCURRENT,e),d.debug("Concurrent call",{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.getMediaSettings()),v.onCallAccepted(),this._state="ACTIVE",this._participantState=Z.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}async _getMainRoomParticipants(){let e=await this._getParticipants();return I.mapSharedParticipants(Object.values(e).filter(t=>!t.isInRoom))}_decodeExternalConversationParams(e){let[t,i]=e.split(":"),a=parseInt(t,10);if(isNaN(a))throw new Error("Invalid original length in prefix");let s=atob(i),o=new Uint8Array(s.length);for(let l=0;l<s.length;l++)o[l]=s.charCodeAt(l);try{let u=gs(o,a).reduce((Te,Re)=>(Te+=String.fromCharCode(Re),Te),""),{srcp:m,stne:h,tkn:E,trne:P,trnp:C,trnu:W,wse:$,wte:J}=JSON.parse(u);return{token:E,endpoint:$,wt_endpoint:J,turn_server:{urls:P.split(","),username:W,credential:C},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:X.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw b.log(w.ERROR,"acceptIncoming"),d.error("Unable to accept a call - invalid state"),new Error("Unable to accept a call - invalid state");if(!this._mediaSource||!this._conversation||!this._transport)throw new B(R.UNKNOWN_ERROR);this._state="PROCESSING",d.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(w.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=Z.ACCEPTED;let i=this._getMuteStatesForCurrentRoom(),a=Object.keys(i);a.length&&this._onMuteParticipant({muteStates:i,mediaOptions:a,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());if(s.rooms?.rooms){let 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 o=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(v.onCallAccepted(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),o),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._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 b.log(w.ERROR,"declineIncoming"),d.error("Unable to decline a call - invalid state"),new Error("Unable to decline a call - invalid state");this._state="PROCESSING",d.debug("Decline incoming call"),this._logWithMediaSettings(w.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=Z.HUNGUP,this._signaling.ready&&await this._signaling.hangup(R.REJECTED),this._close(new B(R.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?R.HUNGUP:R.CANCELED;b.log(w.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new B(e))):v.onHangup(new B(R.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new B(R.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map(Q.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=R.UNKNOWN_ERROR);let s=i.participants;if(!s&&i.rejectedParticipants)throw new Error(i.rejectedParticipants[0].reason);for(let o of s)await this._onAddParticipant(I.composeId(o),o,a)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new B(R.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=R.UNKNOWN_ERROR);let s=i.participants;for(let o of s)await this._onAddParticipant(I.composeId(o),o,a)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let i=[];for(let a of e)(a.state===Z.CALLED||a.state===Z.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===Z.ACCEPTED&&i.push(a.id);i.length?this._transport.open(i,null,!!this._conversation?.observer):this._transport.getTopology()==="SERVER"&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&d.error(t,e),d.debug("Close conversation",e),jr.sendHangupEvent(e,this._transport?.getTopology()),at.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(R.FAILED):b.log(w.ERROR,e.hangup),V._activationMutex=!1;let i=this._conversation&&this._conversation.id;if([R.CANCELED,R.NOT_FRIENDS,R.CALLEE_IS_OFFLINE,R.CALLER_IS_BLOCKED,R.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===R.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===R.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===R.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===R.SOCKET_CLOSED||e.hangup===R.NOT_FOUND)&&V._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===R.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state="CLOSE",this._participantState=Z.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),b.destroy(),Ae.destroy(),this._conversation=null,this._myLastRequestedLayouts={},V._current=null,V._delayedHangup=!1,V._abortController=null,v.onHangup(e||new B(R.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=Z.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),V._delayedHangup&&e)try{this._api.hangupConversation(e,R.CANCELED)}catch{}this._cleanupListeners(),b.destroy(),Ae.destroy(),this._conversation=null,this._myLastRequestedLayouts={},V._current=null,V._delayedHangup=!1,V._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 o=a.urls.filter((l,u,m)=>m.indexOf(l)===u);o.push(`${o[o.length-1]}?transport=tcp`),i.push({urls:o,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:o}){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),o&&(p.clientType=o)}_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:o=!1,requireAuthToJoin:l=!1,onlyAdminCanShareMovie:u,externalIds:m,startedTime:h,onFastStart:E,conversationId:P}){ue.setMark(X.SIGNALING_CONNECTED);let C=P??I.uuid();d.debug("Conversation: start",{conversationId:C,opponentIds:e,opponentType:t,direction:i});let W=a.includes(pe.VIDEO),$;if(E){let Te={deviceId:this._api.deviceId(),sdkVersion:p.sdkVersion,clientAppKey:p.apiKey,platform:p.platform,protocolVersion:p.protocolVersion,domainId:p.domain,capabilities:Xe.getFlags()},Re=JSON.stringify(Te),re;try{if(re=await E({internalParams:Re,conversationId:C,externalIds:m,opponentType:t,mediaOptions:a,isVideo:W,joiningAllowed:o,requireAuthToJoin:l},V._abortController?.signal),!re.internalCallerParams)throw new B(R.FAST_START_ERROR,{message:JSON.stringify(re)})}catch(ae){throw V._delayedHangup&&V._abortController?.signal.aborted?new B(R.CANCELED):ae instanceof Error?new B(R.FAST_START_ERROR,{message:ae.message}):new B(R.FAST_START_ERROR,{message:String(ae)})}try{let ae=JSON.parse(re.internalCallerParams);$={endpoint:ae.endpoint,wt_endpoint:ae.wtEndpoint,id:C,is_concurrent:ae.isConcurrent,client_type:ae.clientType,rejected_participants:re.rejectedParticipants?.map(Y=>({...Y,status:Y.status})),stun_server:ae.stun,turn_server:ae.turn,token:new URL(ae.endpoint).searchParams.get("token")??""},d.debug("FastStart",$)}catch{throw new B(R.FAST_START_ERROR,{message:"Cannot parse internal params"})}}else $=await this._api.startConversation(C,e,t,W,s,o,l,{onlyAdminCanShareMovie:u},m),d.debug("Api.startConversation",$);this._setConversationParams($);let J=await this._connectSignaling(Ke.START,$);return await this._setConversation($,J,i),this._logCallStartEvent(h,Oe.OUTGOING),J}async _joinConversation(e,t){ue.setMark(X.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:o,observedIds:l,payload:u,onFastJoin:m}=e;d.debug("Conversation: join",{conversationId:i,joinLink:o,observedIds:l});let h=a.includes(pe.VIDEO),E;if(m){if(!o)throw new B(R.FAST_JOIN_ERROR,{message:"joinLink is required for fast join"});let C={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(C),$;try{if($=await m({joinLink:o,isVideo:h,internalParams:W},V._abortController?.signal),!$.internalCallerParams||!$.conversationId)throw new B(R.FAST_JOIN_ERROR,{message:JSON.stringify($)})}catch(J){throw V._delayedHangup&&V._abortController?.signal.aborted?new B(R.CANCELED):J instanceof B?J:J instanceof Error?new B(R.FAST_JOIN_ERROR,{message:J.message}):new B(R.FAST_JOIN_ERROR,{message:String(J)})}try{let J=JSON.parse($.internalCallerParams);E={endpoint:J.endpoint,wt_endpoint:J.wtEndpoint,id:$.conversationId,is_concurrent:J.isConcurrent,client_type:J.clientType,stun_server:J.stun,turn_server:J.turn,token:new URL(J.endpoint).searchParams.get("token")??""},d.debug("FastJoin",E)}catch{throw new B(R.FAST_JOIN_ERROR,{message:"Cannot parse internal params"})}}else if(i)E=await this._api.joinConversation(i,h,s);else if(o)E=await this._api.joinConversationByLink(o,h,l,u);else throw new B(R.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=se.USER,i,a,s){ue.setMark(X.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let o=this._api.getUserId();if(!o)throw new B(R.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=${o}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${p.wssToken}`,h.token=P.token,h.endpoint=u,p.wtsBase&&(m=`${p.wtsBase}?userId=${o}&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=${o}&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=${o}&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 V._current&&(V._current._participantState===Z.ACCEPTED||V._current._participantState===Z.CALLED)?(d.log("Push rejected (busy)"),b.log(w.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(R.BUSY),Promise.reject(new B(R.BUSY))):(V._current&&(V._current.destroy(),V._current=null),await this._setConversation(h,E,Oe.INCOMING,t),E)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:be(),participantState:{},state:Z.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return i.externalId||(i.externalId=await this._getParticipantId(t??i.id)),this._api.cacheExternalId(t??i.id,i.externalId),t&&this._api.mapDecorativeId(t,i.id),i.observedIds?.length&&(i.externalId.observer=!0),e.markers&&(i.markers=this._denormalizeMarkers(i.id,e.markers)),i}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new B(R.NETWORK_ERROR),t),t}}async _setConversation(e,t,i,a=se.USER){let{participants:s}=t.conversation;s.forEach(h=>{let E=I.composeId(h),P=Q.fromSignalingParticipant(h,!1);if(P){this._api.cacheExternalId(E,P);let C=I.composeDecorativeId(h),W=Q.fromSignalingParticipant(h);C&&W&&(this._api.cacheExternalId(C,W),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let o=this._api.getUserId(),l=this._extractLocalParticipantFromConnection(t),u=e.device_idx||0;if(!o){if(!l)throw new B(R.UNKNOWN_ERROR);o=Number(l.id),l.idType&&(a=l.idType),l.deviceIdx&&(u=l.deviceIdx),this._api.setUserId(o)}let m=I.composeParticipantId(o,a,u);this._conversation={userId:o,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),b.log(w.RELAY_POLICY,p.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new B(R.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 Yi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new ni(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,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:X.SIGNALING_CONNECTED}),i}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(xr.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 o=I.composeId(s);return t[o]&&a.push(t[o]),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 o=I.composeId(s);if(d.test("Conversation:RegisterParticipant",o),this._isMe(o)){this._conversation.roles=s.roles||[],this._conversation.roles.length&&(d.debug(`Local roles changed: ${s.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(s);continue}if(s.state===Z.HUNGUP||s.state===Z.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],R.HUNGUP);continue}let l=I.composeDecorativeId(s);this._registerParticipant({id:o,externalId:Q.fromSignalingParticipant(s),mediaSettings:be(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(o,s.markers),movieShareInfos:s.movieShareInfos,isInRoom:t},l);let u=await this._getParticipant(o);u&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${o}] changed: ${s.roles}`),v.onRolesChanged(u.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=Ur(e,je.MUTE),s=Ur(e,je.MUTE_PERMANENT);for(let o of[a,s])o.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:o,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,o])=>(a[s]={...i,...o,id:e},a),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let i=ps(e);this._setMuteStatesForRoomId(i,null);for(let l of e.rooms?.rooms??[])this._setMuteStatesForRoomId(l.muteStates,l.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=hs(e,a));let s=Object.keys(a),o=this._conversation?.roomId;s.length&&this._onMuteParticipant({muteStates:a,mediaOptions:s,muteAll:!0,stateUpdated:!0,roomId:o},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 Mr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Bi,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,"VIDEO_STREAM_DEBUG",this._onVideoStreamDebug.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===Z.ACCEPTED||i.state===Z.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Fr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new Vr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Fi(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Vi(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=M.getCameras().length,t=M.getMicrophones().length;d.debug("Cameras: "+e+(M.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(M.hasMicrophonePermission()?"✔":"✖")),b.log(w.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){b.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}async _removeParticipant(e,t){if(e.state===Z.CALLED||e.state===Z.ACCEPTED||this._state==="CLOSE")return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let i=await this._getParticipants();if(i[e.id]){t===R.HUNGUP?this._setParticipantsStatus([e],"HANGUP"):this._setParticipantsStatus([e],"ERROR",t),e.mediaSource?.disconnect(),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[a,s]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(a),this._sequenceNumberByStreamDescription.delete(a),this._cooldownTimestampByStreamDescription.delete(a),this._streamWaitTimerByStreamDescription.has(a)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(a)),this._streamWaitTimerByStreamDescription.delete(a)),this._sendUpdateDisplayLayout({[a]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete i[e.id],v.onRemoteRemoved(e.externalId,e.markers)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener("unload",this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(t=>t.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(t=>t.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){d.debug("cleaning up participant-agnostic streams"),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(t=>{t.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._participantIdByDebugStreamId=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_cleanupSignaling(){this._signaling.close(),this._signaling.cleanup()}async _onAddParticipant(e,t,i){d.debug(`Add new participant [${e}]`);let a=await this._getParticipant(e);if(a&&(a.state===Z.ACCEPTED||a.state===Z.CALLED)){d.warn(`Participant [${a.id}:${a.state}] is already in conversation`);return}if(!a){let s=I.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(t),mediaSettings:be(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s),a=await this._getParticipant(e)}this._setParticipantsStatus([a],"WAITING"),i?(a.state=Z.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=Z.CALLED,this._transport.allocate(a.id,!0),b.log(w.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=Cc;a++){let s=I.compose(e,a),o=i[s];o&&t.push(o)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let a of t)this._transport.close(a.id);b.log(w.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 o=i??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:o,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 b.log(w.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return b.log(w.MEDIA_STATUS,e?"audio_1":"audio_0"),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},i={};for(let s of e){let o=typeof s.uid=="object"?s.uid:Q.fromId(s.uid),l=Q.toString(o);i[l]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let o=Q.toString(s.externalId);Object.hasOwn(i,o)&&(t[s.id]=i[o])}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)}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[it(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 o=typeof s.uid=="object"?s.uid:Q.fromId(s.uid),l=this._api.getCachedOkIdByExternalId(o);if(!l){let h=Q.toString(o);d.log(`Unknown participant external ID ${h}`);continue}let u=it({participantId:l,mediaType:s.mediaType,streamName:s.streamName}),m=i[l];m?m.lastRequestedLayouts[u]=s:this._isMe(l)&&(this._myLastRequestedLayouts[u]=s),Yt(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"&&!Yt(s)&&ue.setMark(ue.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:X.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),b.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};b.logClientEvent(a,i)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(d.log("Client asked to stop streaming before stream became available",e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let i=await this._getParticipants(),a=Qt(e),s=i[a.participantId],o=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(o,u):v.onRemoteLive(s.externalId,u)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null);break}}b.log(w.PAT_DEALLOCATED)}else d.log(`Cannot find participant to stop streaming: ${a.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;d.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let i;try{if(i=await this._signaling.updateDisplayLayout(e),!i)return}catch(o){if(d.warn(`Failed to update display layout ${JSON.stringify(e)}. ${o}`),t)throw o;return}let a=[],s=await this._getParticipants();for(let[o,l]of Object.entries(i.errorCodeByParticipantId||{})){let u=Qt(o),m=s[u.participantId];if(m){let h;typeof l!="number"?(d.warn(`Unexpected error code ${l} received for participant ${u.participantId}`),h=ss.UNKNOWN_ERROR):h=os(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 Da("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]+Rc>Date.now())break;let o=a[0];await this._stopStreaming(o),e[o]={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._registerVideoStreamDebugParticipant(i),this._waitForStreamIfNeeded(i)}}_registerVideoStreamDebugParticipant(e){let{participantStreamDescription:t,streamId:i}=e;!t?.participantId||!i.startsWith(`${we.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-`)||this._participantIdByDebugStreamId.set(i,t.participantId)}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(d.log("Promoted in audience mode",!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(d.log("Promoted in waiting hall",!e.demote),e.demote?(d.log("Kicked from waiting hall"),this._close(new B(R.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 o=[],l=[],u=[],m=[],h=[];if(i.length&&i.forEach(C=>{if(C.externalId){let W=Q.fromSignaling(C.externalId);h.push(W),this._api.cacheExternalId(C.id.id,W)}else{let W=I.decomposeId(C.id.id).id;o.push(W),m.push(W)}}),a?.length&&a.forEach(C=>{let W=I.decomposeId(C).id;o.push(W),l.push(W)}),s?.length&&s.forEach(C=>{let W=I.decomposeId(C).id;o.push(W),u.push(W)}),!o.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let C=await this._api.getExternalIdsByOkIds(m);h.push(...C)}let E=await this._api.getExternalIdsByOkIds(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:o=null}=e,l={initiatorId:i,movieId:a,source:s};if(this._isMe(i))v.onLocalSharedMovieStoppedInfo(t,l,o);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,o)}}}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:o=null}=e;if(s?t.set(o,{sharedUrl:s,initiatorId:a}):t.delete(o),!(!s&&o!==i&&t.has(i))&&(!s||!this._isMe(a))){let l=await this._getExternalIdByParticipantId(a);l&&v.onRemoteSharedUrl(l,s,o)}}_onFeaturesPerRoleChanged(e){d.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),v.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let h=this._getStreamDescriptionById(e.streamId);if(h){let E=Qt(h),P=await this._getParticipant(E.participantId);v.onRemoteScreenStream(P.externalId,null);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:i,participantId:a}=t;if(i==="ANIMOJI")return;let s=await this._getParticipant(a);if(i==="SCREEN"&&!e.fastScreenShare){d.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let o=it(t),l=this._sequenceNumberByStreamDescription.get(o);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}`),b.log(w.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&i&&(d.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(s.externalId,i,e.suspend));let u=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(u,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(o);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){b.log(w.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let P=E?h:s.externalId,C=this._streamByStreamId.get(u);if(!C){b.log(w.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${u}`);return}b.log(w.PAT_ALLOCATED),this._streamIdByStreamDescription.set(o,u);let W=e.participantStreamDescription?.mediaType;if(W==="STREAM"||W==="MOVIE"){if(e.participantStreamDescription?.streamName){let $={streamName:e.participantStreamDescription.streamName,stream:C,mediaType:W};E?v.onLocalLive(P,$):v.onRemoteLive(P,$)}}else W==="SCREEN"?v.onRemoteScreenStream(s.externalId,C):E||v.onRemoteStream(s.externalId,C)}else{d.debug(`Waiting for ${m} until stream ${u} for ${o} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),m);this._streamWaitTimerByStreamDescription.set(o,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(it(e)))return e;let t=e.participantId;if(e.mediaType){let i={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(it(i)))return i}else{let i={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(it(i)))return i;let a={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(it(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===Z.CALLED}async grantRoles(e,t,i){this._checkAdminRole(),await this._signaling.grantRoles(e,t,i)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,i=[],a=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,i,a)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,i=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,i),this._conversation?.pinnedParticipantIdByRoom.set(i,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=ts(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=ls(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 o=s.participants||[],{externalIds:l}=await this._resolveWaitingHallExternalIds(o),u=null;return o.length&&s.hasMore&&(u=ds(o[o.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(o=>{if(t.set(o.id.id,o.id.addedTs),o.externalId){let l=Q.fromSignaling(o.externalId);i.push(o.id.addedTs),a.push(l),this._api.cacheExternalId(o.id.id,l)}else s.push(I.decomposeId(o.id.id).id)}),s.length&&!a.length&&(a=await this._api.getExternalIdsByOkIds(s),i=a.map(o=>{let l=this._api.getCachedOkIdByExternalId(o);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 o=await this._signaling.addMovie(s);if(o.error)throw new Error(o.error);return{movieId:o.movieId,streamType:o.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,o=null){let l={movieId:i,name:t,privacy:a,groupId:s,roomId:o,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 o=>{let l=I.composeId(o);return this._createParticipant({id:l,externalId:Q.fromSignalingParticipant(o),mediaSettings:be(o.mediaSettings),participantState:I.mapParticipantState(o),state:o.state,roles:o.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:o.muteStates||{},unmuteOptions:o.unmuteOptions||[],observedIds:o.observedIds||[],markers:this._denormalizeMarkers(l,o.markers)},o.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 o=this._transport?.getState();return i.participants.forEach(l=>{let u=I.composeId(l),m=a[u];m.status=this._getStatusByTransportState(o)??"WAITING",m.movieShareInfos=l.movieShareInfos,Object.assign(m.mediaSettings,be(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.getMediaSettings();d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new ni(this._mediaSource)),v.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this._mediaSource?.getMediaSettings();d.log("Screen sharing changed",e.track,t);let i=e.track?new MediaStream([e.track]):null;v.onScreenStream(i,t)}async _changeRemoteMediaSettings(e,t){d.debug(`Remote media settings changed [${e}]`,t);let i=this._conversation?.externalId;if(this._isMe(e)&&i){v.onLocalMediaSettings(i,t);return}let s=await this._getParticipant(e);if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&v.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(a=>a.id===t||I.comparePeerId(a.peerId,e.peerId))}_changeLocalParticipantState(e){d.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){d.debug(`Remote participant state changed [${e}]`,t);let i=await this._getParticipant(e);if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}async _changeMultipleParticipantState(e,t){d.debug("Multiple participants state changed",e);let i=[],a,s=await this._getParticipants();e.forEach((o,l)=>{if(this._isMe(l))a=o;else{let u=s[l];if(!u){this._warnParticipantNotInConversation(l);return}u.participantState=o,i.push({externalId:u.externalId,participantState:{...o},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()),o=[];for(let u of e.conversation.participants){let m=I.composeId(u),h=u.roles||[];if(this._isMe(m)){Li(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:ms(u),unmuteOptions:u.unmuteOptions})};continue}o.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:u.id,participant:u,mediaSettings:u.mediaSettings});else{let P=be(u.mediaSettings);nn(P,E.mediaSettings)||await this._changeRemoteMediaSettings(m,P);let C=I.mapParticipantState(u),W=E.participantState;I.isEqualParticipantState(C,W)||await this._changeRemoteParticipantState(m,C),Li(h,E.roles)||this._onRolesChanged(E.id,h)}}let l=await this._getParticipants();for(let u of s)o.indexOf(u)<0&&l[u]&&this._removeParticipant(l[u],R.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(R.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let o=this._api.getDecorativeIdByInitialId(t),l=o?I.composeUserId(o,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:be(e.mediaSettings)},l))}a.state=Z.ACCEPTED,a.mediaSettings=be(e.mediaSettings),this._logWithMediaSettings(w.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))}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===R.REJECTED?Z.REJECTED:Z.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,R.HUNGUP)}async _onAddedParticipant(e){d.debug(`Participant added [${e.participantId}]`);let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state!==Z.HUNGUP&&i.state!==Z.REJECTED){d.debug(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:a}=e,s=a.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(a),mediaSettings:be(a.mediaSettings),state:a.state,participantState:I.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},s),i=await this._getParticipant(t)}i.state=Z.CALLED,i.mediaSettings=be(e.participant?.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant?.roles||[],this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(i.id,!0),v.onParticipantAdded(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i)}async _onJoinedParticipant(e){d.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state===Z.ACCEPTED){d.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:s}=e,o=s.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(s),mediaSettings:be(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)},o),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=Z.ACCEPTED,i.mediaSettings=be(e.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i);let a=Object.keys(i.muteStates);a.length&&this._onMuteParticipant({muteStates:i.muteStates,mediaOptions:a,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(i.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new B(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=I.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,be(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,o=t.map(({id:l,participantState:u})=>this._getExternalIdByParticipantId(l).then(m=>[l,m&&I.mapParticipantState({participantState:u})]));try{(await Promise.all(o)).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.getMediaSettings(),i=be(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=va(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=va(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(pe.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onChatMessage(e.message,i,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,"sdk"))return;let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onCustomData(e.data,i,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let i=this._conversation.recordsInfoByRoom.get(t);if(i?.recordMovieId!==e?.recordMovieId||i?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let s=await this._getExternalIdByParticipantId(e.initiator);s?v.onRecordStarted(s,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},i=null){if(!this._conversation)return;let a=this._conversation.recordsInfoByRoom.get(i);if(!(!a||a.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(i,null),e){let s=await this._getExternalIdByParticipantId(e);v.onRecordStopped(i,s??null)}else v.onRecordStopped(i,null)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let i=await this._getExternalIdByParticipantId(t);i&&v.onPinnedParticipant(i,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiator);i?v.onRecordStarted(i,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else v.onRecordStopped(e,null)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiatorId);i&&v.onAsrSet({externalId:i,movieId:t.movieId},e)}else v.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,i=t.get(e);if(i){let a=await this._getExternalIdByParticipantId(i.initiatorId);a&&v.onRemoteSharedUrl(a,i.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,i=e.roomId||null;this._conversation.asrInfoByRoom.set(i,t);let a=await this._getExternalIdByParticipantId(t.initiatorId);if(!a){this._warnParticipantNotInConversation(t.initiatorId);return}v.onAsrStarted(a,t.movieId,i)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),v.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!Li(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:Ur(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&&!Li(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:o=[],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,o,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,o,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:o,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),o=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...s,...o])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Z.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:o,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.getMediaSettings(),P=Object.entries(h);for(let[C,W]of P){let $=this._isCallAdmin()&&i;if(!(W!==je.MUTE&&W!==je.MUTE_PERMANENT||$)&&(this._isCallAdmin()&&W===je.MUTE_PERMANENT&&!i&&(h[C]=je.MUTE),!(!t.includes(C)||a)))switch(C){case pe.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(pe.VIDEO,!1),await this.toggleLocalVideo(!1));break;case pe.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(pe.AUDIO,!1),await this.toggleLocalAudio(!1));break;case pe.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(pe.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case pe.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(pe.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:E.isScreenSharingEnabled,fastScreenSharing:E.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(h,u,t,i,a,null,m,s,o,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 o=await this._getExternalIdByParticipantId(s);o&&v.onPinnedParticipant(o,!0,this._denormalizeMarkers(e,i),a)}if(this._isMe(e))v.onLocalPin(t,a);else{let o=await this._getExternalIdByParticipantId(e);o&&v.onPinnedParticipant(o,t,this._denormalizeMarkers(e,i),a)}this._conversation.pinnedParticipantIdByRoom.set(a,t?null:e)}_onOptionsChanged(e){this._conversation&&!es(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"):e.includes(Ze.WAIT_FOR_ADMIN)&&this._conversation.restricted&&v.onLocalStatus("WAIT_FOR_ADMIN"))}async _onNetworkStatus(e){if(this._conversation){let t=[],i=await this._getParticipants();for(let[a,s]of Object.entries(e)){let o;if(this._isMe(a)||a==="")o=this._conversation.networkRating;else if(i[a])o=i[a].networkRating;else continue;if(o!==s)if(this._isMe(a)||a==="")this._conversation.networkRating=s,Xt.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)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){v.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let i=await this._getParticipant(e);i&&v.onRemoteVmojiStream(i.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,v.onVmojiError({...e,externalId:t}))}catch(t){d.warn("_onAnimojiError failed",t)}}_onPeerConnectionClosed(e){e==="SERVER"&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy()}_changeFeatureSet(){if(this._conversation){let e=this._state==="ACTIVE",t=this._conversation.features.includes(Nr.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&v.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let s=await this._getParticipant(i);s&&s.externalId&&t.push({uid:s.externalId,volume:a.real})}v.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){d.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=await this._getParticipants(),s=e.reduce((o,l)=>{if(l in a){let u=a[l];o.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 o},[]);s.length&&this._setParticipantsStatus(s,i)}async _onTransportLocalStateChanged(e){if(d.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(v.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&v.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&v.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(R.FAILED),this._close(new B(R.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(we.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(e,i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(we.TRANSPARENT_AUDIO_TRACK_PREFIX))d.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,i);else if(e.startsWith(we.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),o=s?I.composeUserId(s):void 0;d.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${o}]`),this._registerParticipant({id:e},o),a=await this._getParticipant(e),this._setParticipantsStatus([a],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(a.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(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)}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!==we.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"))}async _onRemoteSignalledStall(e){let t={},i=[],a=[];d.debug("Participants stalled:",e);let s=await this._getParticipants();for(let o of e){if(t[o]=!0,!this._lastStalled[o]){let l=s[o];l&&i.push(l)}delete this._lastStalled[o]}for(let o of Object.keys(this._lastStalled)){let l=s[o];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)}async _onVideoStreamDebug(e){let t=e.direction==="inbound"?this._resolveVideoStreamDebugParticipantId(e.streamId):void 0,i=e.direction==="outbound"?this._conversation?.externalId:t?await this._getExternalIdByParticipantId(t):void 0;if(i){if(e.clear){Ea.clear(i);return}Ea.send({...e,externalParticipantId:i})}}_resolveVideoStreamDebugParticipantId(e){if(e)return e.startsWith(`${we.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-`)?this._participantIdByDebugStreamId.get(e):e}_fixAudioDevice(e){!M.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!M.hasCamera()||!this._audioFix||!this._mediaSource?.getMediaSettings().isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!=="CLOSE"||!1;e&&(d.debug("Toggle join availability",{available:t,chatId:e}),v.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!=="SERVER")return;let t=await this._getParticipant(e);if(t&&t.lastRequestedLayouts&&Object.keys(t.lastRequestedLayouts).length)try{await this.updateDisplayLayout(Object.values(t.lastRequestedLayouts))}catch(i){d.warn(`_updateDisplayLayoutFromCache failed: ${i}`)}}_setParticipantsStatus(e,t,i=null){if(!e.length)return;let a=e.reduce((s,o)=>(o.status!==t&&(o.status=t,s.push(o.externalId)),s),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(ai)){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===ai.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(o=>this._getExternalIdByParticipantId(o))||[]),i=await Promise.all(e.addParticipantIds?.map(o=>this._getExternalIdByParticipantId(o))||[]),a=await Promise.all(e.removeParticipantIds?.map?.(o=>this._getExternalIdByParticipantId(o))||[]),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),o=e.addedParticipants;if(s.length&&o?.length!==s.length&&!this._isCalledState()){let P=this._convertExternalIdsToServerExternalIds(s);o=(await this._signaling.getParticipants(P)).participants}let l=await Promise.all(o?.map(async P=>{let C=I.composeId(P);return this._createParticipant({id:C,externalId:Q.fromSignalingParticipant(P),mediaSettings:be(P.mediaSettings),participantState:I.mapParticipantState(P),state:P.state,roles:P.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:P.muteStates||{},unmuteOptions:P.unmuteOptions||[],observedIds:P.observedIds||[],markers:this._denormalizeMarkers(C,P.markers),isInRoom:i!==null},P.decorativeUserId)})||[]),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 C=this._getExternalIdByParticipantId(P.GRID.id);h.push(C)}m=await Promise.all(h)}if(u&&await this._onRoomSwitched(i),m){let P=this._conversation?.pinnedParticipantIdByRoom.get(i);if(P){let C=await this._getExternalIdByParticipantId(P);if(C){for(let W of m)if(Q.compare(C,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 o=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,o),this._conversation?.recordsInfoByRoom.set(o,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(o,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(o,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(o,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(o),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({[ai.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 o=await this._getExternalIdByParticipantId(s.participantId);o?a.items.push({...s,participantId:o}):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 o=await this._getExternalIdByParticipantId(t);if(!o){this._warnParticipantNotInConversation(t);return}let l=Q.fromSignaling(a,o.deviceIdx);if(v.onParticipantIdChanged(o,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 o=t[a];if(o.status==="fulfilled"){let l=o.value;this._participants[l.id]=l;continue}i=i??o.reason,d.warn(`Failed to resolve pending participant [${s}]`,o.reason)}if(i)throw i}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};c(V,"_current"),c(V,"_activationMutex"),c(V,"_delayedHangup",!1),c(V,"_abortController",null);var F=V,Da=class n extends Error{constructor(e,t){super(e);c(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var jt=null,si=null;function fs(){jt=null,si=null}function bc(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Gr(n=null,r){let e=bc(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 Ss(){return jt||si||(si=Gr(),jt=await si,si=null,jt)}async function oi(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Ss();let t=Is(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${jt}/fb.do`,i)}async function ji(n,r={},e=!1,t){await Ss();let i=Is(n,r,e);return yc(i,t)}async function yc(n,r){let e=`${r??jt}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new B(R.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(),o;try{o=JSON.parse(s)}catch{o={result:s}}if(!a.ok||Object.hasOwn(o,"error_msg"))throw o;return o}async function vs(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 Is(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 Hi=class{constructor(){c(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=R.HUNGUP){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var Ac=700,Mc=3e3,ci=class extends Hi{constructor(){super(...arguments);c(this,"_userId",null);c(this,"_uuid");c(this,"_externalUidsCache",new Map);c(this,"_decorativeIdToInitialId",new Map);c(this,"_initialIdToDecorativeId",new Map)}async _callUnsafe(e,t={},i=!1){let a=async s=>{try{return await ji(e,t,i)}catch(o){if(!Object.hasOwn(o,"error_msg")){s++;let l=Object.getOwnPropertyNames(o).map(u=>`${u}: ${JSON.stringify(o[u])}`);if(d.debug(`${e} network error, attempt ${s}: ${l.join(`
|
|
18
|
-
`)}`),this._abortSignal?.aborted&&(d.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),s<p.apiMaxAttempt)return await I.delay(Math.min(s*Ac,Mc),{signal:this._abortSignal}),a(s)}throw d.warn(e,"error",o),o}};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 o={message:a.error_msg,code:a.error_code};if(a instanceof B)throw a;if(a.custom_error&&(o.custom_error=a.custom_error),Dc(a))switch(a.error_code){case 1101:s=R.SERVICE_DISABLED;break;case 4:a.error_msg.includes("participants.limit.exceeded")&&(s=R.PARTICIPANT_LIMIT_REACHED);break;case 300:s=R.NOT_FOUND;break;case 1102:s=R.CALLEE_IS_OFFLINE;break;case 1103:s=R.NOT_FRIENDS;break;case 1104:case 1106:s=R.EXTERNAL_API_ERROR;break;case 1113:s=R.CALLER_IS_REJECTED;break;case 1114:s=R.VCHAT_DETAILED_ERROR;break;case 2:s=R.SERVICE_UNAVAILABLE;break}throw new B(s,o)}}async userId(e){let t=I.extractOkId(e);if(Ce.isEmpty())return Q.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),Q.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!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})};oi("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)};oi("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)};oi("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let s={conversationId:e,webrtcPlatform:p.platform,startTime:t,endTime:i},o=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(o.upload_url);return m.searchParams.append("size",u.size.toString()),vs(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:o,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:o,speakerIds:m});return this._startConversation(h)}async startConversation(e,t,i,a=!1,s="",o=!1,l=!1,{onlyAdminCanShareMovie:u,waitForAdmin:m}={},h){let E=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:o,payload:s,requireAuthToJoin:l,onlyAdminCanShareMovie:u,waitForAdmin:m,externalIds:h});if(t&&t.length)switch(i){case nt.USER:E.uids=t.join(",");break;case nt.GROUP:E.gid=t[0];break;case nt.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:o,waitForAdmin:l,audienceMode:u=!1,audioOnly:m=!1,speakerIds:h=[],closedConversation:E=!1,externalIds:P}){let C={conversationId:e,isVideo:t,protocolVersion:p.protocolVersion};if(a&&(C.createJoinLink=!0),i&&(C.payload=i),p.domain&&(C.domainId=p.domain),p.externalDomain&&(C.externalDomain=p.externalDomain),s&&(C.requireAuthToJoin=!0),o!==void 0&&(C.onlyAdminCanShareMovie=o),l!==void 0&&(C.waitForAdmin=l),u&&(C.audienceMode=u),m&&(C.audioOnly=m),h.length){let W=h.map($=>I.composeUserId($));C.speakerIds=W.join(",")}return E&&(C.closed=E),P&&(C.externalIds=P.map(Q.toSignaling).join(",")),C}async _startConversation(e){return this._call("vchat.startConversation",e)}async createJoinLink(e){return this._call("vchat.createJoinLink",{conversationId:e})}async removeJoinLink(e){return this._call("vchat.removeJoinLink",{conversationId:e})}async getAnonymTokenByLink(e,t){let i={joinLink:e};t&&(i.anonymName=t);let a=await this._call("vchat.getAnonymTokenByLink",i);return this._userId=Number(a.uid),a.token}async joinConversationByLink(e,t=!1,i,a){let s={joinLink:e,isVideo:t,protocolVersion: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()),o=Array.from(this._externalUidsCache.values());for(let u of e){let m=Q.toString(u),h=o.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,Q.fromString(a.get(E))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let s of e){let o=Q.toString(s),l=a.indexOf(o);if(l>-1){let u=I.composeParticipantId(this.replaceByInitialIdIdIfExists(i[l]),se.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 o=this.getDecorativeIdByInitialId(s),l=this._externalUidsCache.get(o??s);t.push(Q.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=Q.toString(e),s=i.indexOf(a);return s>-1?I.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),se.USER,e.deviceIdx):s>-1?I.composeParticipantId(t[s],se.USER,e.deviceIdx):null}cacheExternalId(e,t){let i=I.extractOkId(e);this._externalUidsCache.set(i,Q.toString(t))}mapDecorativeId(e,t){let i=I.extractOkId(e),a=I.extractOkId(t);this._decorativeIdToInitialId.set(i,a),this._initialIdToDecorativeId.set(a,i)}unmapDecorativeId(e){let t=I.extractOkId(e),i=this.getDecorativeIdByInitialId(t);i&&this._decorativeIdToInitialId.delete(i),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=I.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=I.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}async getConversationParams(e){let t={};return 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=R.HUNGUP){let i={conversationId:e,reason:t};p.anonymToken&&(i.anonymToken=p.anonymToken),oi("vchat.hangupConversation",i)}sendUserFeedbackStats(e,t,i,a){let s={collector:"app.vchat.events.product",data:JSON.stringify({application:`${p.appName}:${p.sdkVersion}`,platform:p.platform,items:[{type:1,operation:X.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};oi("log.externalLog",s)}async removeHistoryRecords(e){await this._call("vchat.removeHistoryRecords",{recordIds:e.join(",")})}cleanup(){this._decorativeIdToInitialId=new Map,this._initialIdToDecorativeId=new Map}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(i=>this.getDecorativeIdByInitialId(i)??i);try{let i=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),a=(s,o)=>{for(let[l,u]of Object.entries(s)){let m=Number(l),h=Q.fromId(u,o);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 o=Number(s);if(!t.has(o)){let l=Q.fromId(String(o));t.set(o,l),this.cacheExternalId(o,l)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};function Dc(n){return typeof n=="object"&&n!==null&&"error_code"in n&&"error_msg"in n}var Es=(e=>(e.KING="KING",e.PAWN="PAWN",e))(Es||{}),Ts=Es;var wa=(e=>(e.OFF="0",e.ON="1",e))(wa||{});var Wr=class{constructor(r){c(this,"_queue");c(this,"_readCursor");c(this,"_writeCursor");c(this,"_moveReadCursor");c(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 Kr=class{constructor(r,e,t,i=null){c(this,"_uuid");c(this,"_apiKey");c(this,"_callToken");c(this,"_apiEnv");c(this,"_baseApiUrl");c(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 Gr(this._baseApiUrl,this._apiEnv),t=await ji("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:R.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Gr(this._baseApiUrl,this._apiEnv);await ji("vchat.hangupConversation",e,!0,t)}};var me,Gi=null,wc={getCameras:M.getCameras,getMicrophones:M.getMicrophones,getOutput:M.getOutput,getVideoFacingMode:M.getVideoFacingMode,hasCamera:M.hasCamera,hasMicrophone:M.hasMicrophone,getSavedCamera:M.getSavedCamera,getSavedMicrophone:M.getSavedMicrophone,getSavedOutput:M.getSavedOutput,hasCameraPermission:M.hasCameraPermission,hasMicrophonePermission:M.hasMicrophonePermission,hasPermissions:M.hasPermissions,getUserMedia:M.getUserMedia,getUserVideo:M.getUserVideo,getUserAudio:M.getUserAudio,setResolution:M.setResolution,isBrowserSupported:M.isBrowserSupported,isScreenCapturingSupported:M.isScreenCapturingSupported,os:M.os,isMobile:M.isMobile,browserName:M.browserName,browserVersion:M.browserVersion,baseChromeVersion:M.baseChromeVersion,getAudioContext:M.getAudioContext,isAudioShareSupported:M.isAudioShareSupported},kc={participantMarkerCompare:I.participantMarkerCompare};function Oc(n){Gi=n}function xc(n){p.videoEffects=n}function Nc(n){p.audioEffects=n}function Lc(n,r=null,e={},t=1){p.vmoji=n,p.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function Uc(n){if(p.set(n),me||(me=new ci),ka.default.disableLog(!p.debug),d.toggle(p.debug),d.log(`Calls SDK ${p.sdkVersion}`,n),await M.init(),!M.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: ${M.hasCameraPermission()}, Mic: ${M.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${p.simulcast}`)}async function Bc(n,r=[pe.AUDIO],e="",t=!1,i=!1,a,s,o){let l=[];return Array.isArray(n)?l=n.length?n:[]:n&&(l=[n]),Rs([],nt.USER,r,e,t,i,a,l,s,o)}async function Rs(n,r=nt.USER,e,t="",i=!1,a=!1,s,o,l,u){if(F.current())throw d.error("There is already active call"),new B(R.FAILED);return new F(me,Gi).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:o,onFastStart:l,conversationId:u})}async function Fc(n,r){return Cs(n,se.USER,void 0,r)}async function Cs(n,r=se.USER,e,t,i,a){if(n===F.id())throw new Error("Push has already been processed");return a&&me.setUserId(a),new F(me,Gi).onPush(n,r,e,t,i)}async function Vc(n,r){return n&&(p.authToken=n),r!==void 0&&p.apiBaseUrl!==r&&(p.apiBaseUrl=r,fs()),me.authorize()}async function jc(n=[pe.AUDIO]){return et().accept(n)}async function Hc(){let n=F.current();if(n)return n.decline()}async function Gc(n,r=[pe.AUDIO]){return bs(n,r)}async function bs(n,r,e){if(F.current())throw d.error("There is already active call"),new B(R.FAILED);return new F(me,Gi).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function Wc(n,r=[pe.AUDIO],e,t,i,a){if(F.current())throw d.error("There is already active call"),new B(R.FAILED);return e&&(p.anonymToken=e),new F(me,Gi).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i,onFastJoin:a})}async function Kc(){let n=F.current();if(n)return n.hangup();F.hangupAfterInit()}async function $c(n,r){let e=Array.isArray(n)?n:[n],t=F.current();t&&await t.addParticipant(e,r)}async function qc(n,r){let e=F.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function zc(n,r=!1){let e=await me.getOkIdsByExternalIds([n]);return ys(e[0],r)}async function ys(n,r=!1){let e=F.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 Jc(n,r){let e=F.current();if(n==="videoinput"&&ft.contains(r))return p.videoFacingMode=r,e?(M.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await M._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function Yc(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&p.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=F.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function Qc(n){let r=F.current();r&&r.toggleAnimojiCapturing(n)}async function Xc(n,r=!1){let e=F.current();e&&await e.setVideoStream(n,r)}async function Zc(n){let r=F.current();r&&await r.toggleLocalVideo(n)}async function ed(n){let r=F.current();r&&await r.toggleLocalAudio(n)}async function td(n){let r=F.current();if(r)return r.setLocalResolution(n)}async function id(n){let r=F.current();r&&await r.changePriorities(n)}async function rd(n,r){let e=F.current();if(e){let t;if(r){let[i]=await me.getOkIdsByExternalIds([r]);t=I.composeParticipantId(i,se.USER,r.deviceIdx)}await e.changeParticipantState(n,t)}}async function ad(n){let r=F.current();r&&await r.hold(n)}async function nd(){let n=F.current();n&&await n.putHandsDown()}async function sd(n){let r=F.current();r&&await r.updateDisplayLayout(n)}async function od(n,r,e=!1){let t=await me.getOkIdsByExternalIds([n]);return Ps(t[0],Q.getDeviceIdx(n),r,e)}async function Ps(n,r,e,t=!1){let i=F.current();i&&await i.grantRoles(I.composeParticipantId(n,se.USER,r),e,t)}async function cd({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await me.getOkIdsByExternalIds([n]))[0]),As({uid:i,muteStates:r,requestedMedia:e,deviceIdx:Q.getDeviceIdx(n),roomId:t})}async function As({uid:n=null,muteStates:r,requestedMedia:e=[],deviceIdx:t=0,roomId:i=null}){let a=F.current();if(a){let s=n?I.composeParticipantId(n,se.USER,t):null;await a.muteParticipant(s,r,e,i)}}async function dd(n,r=!1,e=null){let t=await me.getOkIdsByExternalIds([n]);return Ms(t[0],r,Q.getDeviceIdx(n),e)}async function Ms(n,r=!1,e=0,t=null){let i=F.current();i&&await i.pinParticipant(I.composeParticipantId(n,se.USER,e),r,t)}async function ld(n){let r=F.current();r&&await r.updateMediaModifiers(n)}async function pd(n){let r=F.current();r&&await r.enableVideoSuspend(n)}async function ud(n){let r=F.current();r&&await r.enableVideoSuspendSuggest(n)}async function md(n){let r=F.current();r&&await r.changeOptions(n)}async function hd(n,r=null){let e=null;return r&&(e=(await me.getOkIdsByExternalIds([r]))[0]),Ds(n,e)}async function Ds(n,r=null){let e=F.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function gd(n=10){let r=F.current();if(r)return r.chatHistory(n)}async function _d(n,r=null){let e=null;return r&&(e=(await me.getOkIdsByExternalIds([r]))[0]),ws(n,e,Q.getDeviceIdx(r))}async function ws(n,r=null,e=0){let t=F.current();if(t){let i=r?I.composeParticipantId(r,se.USER,e):null;await t.customData(n,i)}}async function fd(n="",r=!1,{onlyAdminCanShareMovie:e=!1,waitForAdmin:t=!1,closedConversation:i=!1}={},a){return(await me.createConversation(a??I.uuid(),n,r,{onlyAdminCanShareMovie:e,waitForAdmin:t,closedConversation:i})).join_link}async function Sd(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=Q.fromIds(i),s=await me.getOkIdsByExternalIds(a);return(await me.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},s)).join_link}async function vd(){let n=F.current();return n?n.createJoinLink():Promise.reject()}async function Id(){let n=F.current();return n?n.removeJoinLink():Promise.reject()}async function Ed(n,r){return me.getAnonymTokenByLink(n,r)}function Td(n){let r=F.current();r&&r.setVolume(n)}function Rd(n){p.forceRelayPolicy=n}async function Cd(n=!1,r=null,e=null,t="DIRECT_LINK",i=null,a=null){let s=F.current();return s?s.startStream(n,r,e,t,i,a):Promise.reject()}async function bd(n=null,r){let e=F.current();return e?e.stopStream(n,r):Promise.reject()}async function yd(n=null){let r=F.current();return r?r.publishStream(n):Promise.reject()}async function Pd(n,r,e=!1,t=null){let i=F.current();if(!i)return Promise.reject();let a,s,o=[];if(r?.length&&o.push(...r),n&&o.push(n),o.length){let l=await me.getParticipantIdsByExternalIds(o);n&&(a=l.get(n),l.delete(n)),s=Array.from(l.values())}return i.recordSetConf(a,s,e,t)}async function Ad(){let n=F.current();return n?n.getStreamInfo():Promise.reject()}async function Md(n){let r=F.current();return r?r.addMovie(n):Promise.reject()}async function Dd(n){let r=F.current();return r?r.updateMovie(n):Promise.reject()}async function wd(n){let r=F.current();return r?r.removeMovie(n):Promise.reject()}async function kd(n,r){let e=F.current();if(e){let t=[];for(let i of n){let a,s;i.addParticipantIds&&(a=(await me.getOkIdsByExternalIds(i.addParticipantIds)).map(o=>I.composeUserId(o))),i.removeParticipantIds&&(s=(await me.getOkIdsByExternalIds(i.removeParticipantIds)).map(o=>I.composeUserId(o))),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 Od(n,r){let e=F.current();return e?e.activateRooms(n,r):Promise.reject()}async function xd(n=null,r=null){let e=F.current();if(!e)return Promise.reject();let t;if(r){let i=await me.getOkIdsByExternalIds([r]),a=Q.getDeviceIdx(r);t=I.composeParticipantId(i[0],se.USER,a)}return e.switchRoom(n,t)}async function Nd(n){let r=F.current();return r?r.removeRooms(n):Promise.reject()}function Ld(n){p.statisticsInterval=n;let r=F.current();if(r)return r.updateStatisticsInterval()}function Ud(n){ka.default.disableLog(!n),d.toggle(n)}function Bd(n,...r){p.debugLog&&d.send(n,"[external]",...r)}async function Fd(){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 me?.uploadDebugLogs(n,e,t,JSON.stringify(r))}catch(i){throw d.error("[uploadDebugLogs]","Error while uploading logs",i),new Error("Error while uploading logs",{cause:i})}}async function Vd(n){let r=F.current();if(r)return r.videoEffect(n)}async function jd(n,r){let e=F.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function Hd(n){let r=F.current();r&&await r.setAudioStream(n)}async function Gd(n,r=null,e=null){let t=F.current();if(!t)return;let i=e??r?.id,a=null;if(r){let o=(await me.getOkIdsByExternalIds([r]))[0];if(!o)throw new Error("Could not get user id to set animoji svg");a=I.composeParticipantId(o,se.USER,Q.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function Wd(n){let r=F.current();r&&r.setAnimojiFill(n)}async function Kd(n=null,r,e=!1){return et().getWaitingHall(n,r,e)}async function $d(){return et().getAudienceModeHands()}async function qd(n,r=!1){let e=et(),t;if(n){let[i]=await me.getOkIdsByExternalIds([n]);t=I.composeUserId(i)}return e.promoteParticipant(t,r)}async function zd(n=!1){return et().requestPromotion(n)}async function Jd(n=!1){return et().acceptPromotion(n)}async function Yd(n){return et().getParticipantListChunk(n)}async function Qd(n){return et().getParticipants(n)}async function Xd(n){return et().feedback(n)}function Zd(n,r,e){return et().userFeedbackStats(n,r,e)}function el(n,r={},e=!1){let t=F.current();t&&t.sendClientEvent(n,r,e)}async function tl(n,r){return et().enableFeatureForRoles(n,r)}function et(){let n=F.current();if(!n)throw new Error("Conversation not found");return n}async function il(n){await me.removeHistoryRecords(n)}async function rl(n){let r=F.current();r&&await r.startAsr(n)}async function al(n){let r=F.current();r&&await r.stopAsr(n)}async function nl(n){let r=F.current();r&&await r.requestAsr(n)}async function sl(n){let r=F.current();return r?r.startUrlSharing(n):Promise.reject()}async function ol(){let n=F.current();return n?n.stopUrlSharing():Promise.reject()}function cl(){return p.sdkVersion}
|
|
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||{}),wr=class extends ce{constructor(e,t,i,a){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_topology");o(this,"_allocated",[]);o(this,"_opened",[]);o(this,"_directTransport",null);o(this,"_serverTransport",null);o(this,"_serverSettings");o(this,"_dtListeners",[]);o(this,"_stListeners",[]);o(this,"_states",{});o(this,"_localState","IDLE");o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,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}`),M.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 Mi(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 Ui(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"?(M.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):(M.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();M.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:ee.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 ht=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();M.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:ee.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 gt=Ve;var zn=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(zn||{}),Ke=zn;var Jn={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(Jn),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(Jn).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};var $e=gi(require("fflate"));var gc=63n,_c=16383n;var fc=4611686018427387903n,Dr=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=gc)return new Uint8Array([Number(e)]);if(e<=_c)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<=fc)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 Dr,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"?A.browserName()==="Firefox"?p.webtransportFF:A.browserName()!=="Safari":!1}};var Yn="open",Qn=10,Sc=["service-unavailable","conversation-ended","invalid-token"],jt=class n extends Ri{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 fr)}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){M.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===Yn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){M.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&&(M.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}`;he.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,Qn)}async acceptCall(e){return this._send(x.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(x.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Qn)}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"),M.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"){ht.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){M.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:M.log(k.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){M.log(k.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Sc.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(C.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Me.NOTIFICATION,{notification:U.CLOSED_CONVERSATION,reason:C.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){M.log(k.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){if(M.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(C.CANCELED));return}this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new B(C.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})`),M.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=he.measureMark(i.statMarkName);a!==null&>.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],M.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],M.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!==Yn){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]=vn(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=Ta[e][t];he.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=Ta[e][i];Ae.logEventualStat({name:a,...t})}};var Xn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(Xn||{}),Oe=Xn;var Zn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(Zn||{}),st=Zn;var es=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(es||{}),Nr=es;var ts=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(ts||{}),Lr=ts;var is=(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))(is||{}),Ze=is;function rs(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function as(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 ns=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(ns||{}),je=ns;var ss=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(ss||{}),Q=ss;var os=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(os||{}),si=os;var cs=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(cs||{}),ds=cs;function ls(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var ps=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(ps||{}),_t=ps;function Bi(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 us(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function ms(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 hs(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 vc(n,r){switch(n){case de.AUDIO:return!!r.isAudioEnabled;case de.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case de.VIDEO:return!!r.isVideoEnabled;case de.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function gs(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case je.MUTE:case je.MUTE_PERMANENT:{vc(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function _s(n){let{muteStates:r={},mediaSettings:e}=n;return gs(r,e)}function fs(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return gs(r,t)}function Ss(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,M.log(k.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,M.log(k.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(A.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"),M.log(k.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),M.log(k.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,M.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 Fi=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=A.getSavedOutput();r&&await this._audioElement.setSinkId?.(r.deviceId)}catch(r){throw M.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=A.browserName()!=="Safari"||A.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 Ic=90,Ec=3,Vi=class extends ce{constructor(){super(...arguments);o(this,"_lastMemoryStat",{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(i=>{let a=typeof i.userId=="string"&&t[i.userId]||null;i.userId=a?.externalId}),v.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),i=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>Ic?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=Ec)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var Tc=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=A.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=Tc/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 ji=class extends ce{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.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 Rc=[U.HUNGUP,U.CLOSED_CONVERSATION],Fr=class{constructor(r){this.processor=r;o(this,"queue",[]);o(this,"isProcessing",!1);o(this,"isHeld",!1);o(this,"isDestroyed",!1)}add(r){this.isDestroyed||(this.queue.push(r),this.processQueue())}hold(){this.isHeld=!0}unhold(){this.isHeld=!1,this.processQueue()}destroy(){this.isDestroyed=!0,this.queue=[]}async processQueue(){if(!(this.isProcessing||this.isDestroyed)){for(this.isProcessing=!0;this.queue.length&&!this.isDestroyed;){if(this.isHeld){let e=this.queue.findIndex(i=>Rc.includes(i.notification));if(e===-1)break;let[t]=this.queue.splice(e,1);try{await this.processor(t)}catch{d.error(`Can't process message ${JSON.stringify(t)}`)}continue}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 Vr=class extends ce{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 jr=class extends ce{constructor(e,t,i){super();o(this,"_speakerId",null);o(this,"_serverSideSpeakerDetection",!1);this._serverSideSpeakerDetection=i==="SERVER",this.subscribe(e,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this.subscribe(t,"SIGNALLED_SPEAKER_CHANGED",this._onServerSpeakerChanged.bind(this)),this.subscribe(t,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,i=null;if(Object.keys(e).forEach(a=>{let s=e[a].smoothed;s>t&&s>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 Hi=class extends ce{constructor(e,t,i){super();o(this,"_transport");o(this,"_volumes",{});o(this,"_participants",{});o(this,"_connectionTimeout",0);o(this,"_volumeTimeout",0);this._transport=e,this._participants=i,this.subscribe(e,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(t,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_onTransportStateChanged(e,t){t==="OPENED"&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),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"),M.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"),M.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),M.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 Hr=class n{static correctHangupReason(r){switch(r){case C.HUNGUP:return"hangup";case C.CANCELED:return"canceled";case C.REJECTED:return"rejected";case C.BUSY:return"busy";case C.FAILED:return"failed";case C.MISSED:return"missed";case C.ANOTHER_DEVICE:return"another_device";case C.REMOVED:return"removed";case C.BANNED:return"banned";case C.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![C.HUNGUP,C.CANCELED,C.REJECTED,C.FAILED,C.BUSY,C.MISSED,C.ANOTHER_DEVICE,C.REMOVED,C.BANNED,C.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;M.logClientStats({name:ee.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Gr=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,he.setMark(ee.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Ae.logEventualStat({name:ee.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var Cc=1e3,yc=1e4;var Pc=15,G=class extends ce{constructor(e,t){super();o(this,"_api");o(this,"_signaling");o(this,"_signalingActor");o(this,"_mediaSource",null);o(this,"_conversation",null);o(this,"_myLastRequestedLayouts",{});o(this,"_state","IDLE");o(this,"_participantState",Q.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",xn());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));M.create(e,t),M.setConversationIdProvider(()=>this._conversation?.id||null),Ae.create(),nt.create(()=>this._transport?.getTopology()),ht.create(),gt.create(),this._api=e,this._signaling=new jt,this._signalingActor=new Fr(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?C.CANCELED:C.HUNGUP),p.clientEventsLoggingEnabled&&M.logClientEvent({event_type:ee.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),M.destroy(),Ae.destroy(),nt.destroy(),ht.destroy(),gt.destroy()},window.addEventListener("pagehide",this._onUnload),this._statFirstMediaReceived=new Gr,this._audioOutput=new Fi(this._statFirstMediaReceived,p.transparentAudio),p.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),Cc))}static current(){return le.getActive()}static hangupAfterInit(){let e=qe;e&&e._delayedHangup===!1&&!e._conversation&&(e._delayedHangup=!0,e._abortController?.abort(new B(C.CANCELED)))}static id(){return le.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(C.UNKNOWN_ERROR);if(this._participantState=Q.ACCEPTED,this._changeMediaSettings(P),await this._processConnection(R),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._delayedHangup)throw new B(C.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(),le.add(this),await le.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(C.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(C.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"),le.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=Q.ACCEPTED,!this._conversation||!this._mediaSource)throw new B(C.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(C.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(),le.has(this.id)||le.add(this),le.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){if(le.has(e))throw new B(C.HAS_ACTIVE_CALL);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(C.UNKNOWN_ERROR);if(!l.conversation.participants.find(m=>m.state===Q.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),M.log(k.PUSH,"rejected"),new B(C.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),M.log(k.PUSH,"accepted"),le.add(this),await le.setActive(this.id),qe=null,this._delayedHangup)throw new B(C.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(C.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=Q.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=Ss(c,a).reduce((Re,De)=>(Re+=String.fromCharCode(De),Re),""),{srcp:m,stne:h,tkn:E,trne:P,trnp:R,trnu:W,wse:K,wte:z}=JSON.parse(u);return{token:E,endpoint:K,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:ee.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw M.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(C.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=Q.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 M.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=Q.HUNGUP,this._signaling.ready&&await this._signaling.hangup(C.REJECTED),this._close(new B(C.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?C.HUNGUP:C.CANCELED;M.log(k.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new B(e))):v.onHangup(new B(C.HUNGUP),this._conversation&&this._conversation.id),this._conversation?.id&&le.has(this._conversation.id)&&le.remove(this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new B(C.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=C.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(C.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=C.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===Q.CALLED||a.state===Q.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===Q.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),Hr.sendHangupEvent(e,this._transport?.getTopology()),nt.destroy(),ht.logMetrics(this._transport?.getTopology()),ht.destroy(),gt.logMetrics(this._transport?.getTopology()),gt.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(C.FAILED):M.log(k.ERROR,e.hangup);let i=this._conversation&&this._conversation.id;if([C.CANCELED,C.NOT_FRIENDS,C.CALLEE_IS_OFFLINE,C.CALLER_IS_BLOCKED,C.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===C.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===C.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===C.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===C.SOCKET_CLOSED||e.hangup===C.NOT_FOUND)&&le.getActive()&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===C.BUSY&&!e.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),M.destroy(),Ae.destroy(),le.remove(this.id),this._conversation=null,this._myLastRequestedLayouts={},this._delayedHangup=!1,this._abortController=null,v.onHangup(e||new B(C.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=Q.HUNGUP,this._signalingActor.destroy(),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,C.CANCELED)}catch{}this._cleanupListeners(),M.destroy(),Ae.destroy(),le.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}){let R=P??I.uuid();if(le.has(R))throw new B(C.HAS_ACTIVE_CALL);d.debug("Conversation: start",{conversationId:R,opponentIds:e,opponentType:t,direction:i});let W=a.includes(de.VIDEO),K;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()},De=JSON.stringify(Re),ne;try{if(ne=await E({internalParams:De,conversationId:R,externalIds:m,opponentType:t,mediaOptions:a,isVideo:W,joiningAllowed:c,requireAuthToJoin:l},this._abortController?.signal),!ne.internalCallerParams)throw new B(C.FAST_START_ERROR,{message:JSON.stringify(ne)})}catch(ie){throw this._delayedHangup&&this._abortController?.signal.aborted?new B(C.CANCELED):ie instanceof B?ie:ie instanceof Error?new B(C.FAST_START_ERROR,{message:ie.message}):new B(C.FAST_START_ERROR,{message:String(ie)})}try{let ie=JSON.parse(ne.internalCallerParams);K={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",K)}catch{throw new B(C.FAST_START_ERROR,{message:"Cannot parse internal params"})}}else K=await this._api.startConversation(R,e,t,W,s,c,l,{onlyAdminCanShareMovie:u},m),d.debug("Api.startConversation",K);this._setConversationParams(K);let z=await this._connectSignaling(Ke.START,K);return await this._setConversation(K,z,i),this._logCallStartEvent(h,Oe.OUTGOING),z}async _joinConversation(e,t){he.setMark(ee.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:c,observedIds:l,payload:u,onFastJoin:m}=e;if(d.debug("Conversation: join",{conversationId:i,joinLink:c,observedIds:l}),i&&le.has(i))throw new B(C.HAS_ACTIVE_CALL);let h=a.includes(de.VIDEO),E;if(m){if(!c)throw new B(C.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),K;try{if(K=await m({joinLink:c,isVideo:h,internalParams:W},this._abortController?.signal),!K.internalCallerParams||!K.conversationId)throw new B(C.FAST_JOIN_ERROR,{message:JSON.stringify(K)})}catch(z){throw this._delayedHangup&&this._abortController?.signal.aborted?new B(C.CANCELED):z instanceof B?z:z instanceof Error?new B(C.FAST_JOIN_ERROR,{message:z.message}):new B(C.FAST_JOIN_ERROR,{message:String(z)})}try{let z=JSON.parse(K.internalCallerParams);if(le.has(K.conversationId))throw new B(C.HAS_ACTIVE_CALL);E={endpoint:z.endpoint,wt_endpoint:z.wtEndpoint,id:K.conversationId,is_concurrent:z.isConcurrent,client_type:z.clientType,stun_server:z.stun,turn_server:z.turn,token:new URL(z.endpoint).searchParams.get("token")??""},d.debug("FastJoin",E)}catch{throw new B(C.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(C.UNKNOWN_ERROR);if(d.debug("Api.joinConversation",E),E.id&&le.has(E.id))throw new B(C.HAS_ACTIVE_CALL);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){he.setMark(ee.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let c=this._api.getUserId();if(!c)throw new B(C.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: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 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(C.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(C.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),M.log(k.RELAY_POLICY,p.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new B(C.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 Qi;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:ee.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===Q.HUNGUP||s.state===Q.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],C.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=hs(e);this._setMuteStatesForRoomId(i,null);for(let l of e.rooms?.rooms??[])this._setMuteStatesForRoomId(l.muteStates,l.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=fs(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 wr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Vi,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===Q.ACCEPTED||i.state===Q.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Vr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new jr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new ji(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Hi(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=A.getCameras().length,t=A.getMicrophones().length;d.debug("Cameras: "+e+(A.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(A.hasMicrophonePermission()?"✔":"✖")),M.log(k.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){M.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 i=await this._getParticipants();if(i[e.id]){t===C.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("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(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===Q.ACCEPTED||a.state===Q.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=Q.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=Q.CALLED,this._transport.allocate(a.id,!0),M.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<=Pc;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);M.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 M.log(k.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return M.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){let t=Rr.get();await this._signaling.hold(e,e?void 0:t),e?(this._state==="ACTIVE"&&(this._state="HELD"),this._signalingActor.hold(),await this._mediaSource?.stopLocalMedia()):(this._state==="HELD"&&(this._state="ACTIVE"),await this._mediaSource?.resumeLocalMedia(),this._signalingActor.unhold(),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)&&he.setMark(he.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&&p.clientEventsLoggingEnabled){let a={event_type:ee.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),M.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};M.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}}M.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=ds.UNKNOWN_ERROR):h=ls(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 Oa("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]+yc>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(C.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}`),M.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){M.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){M.log(k.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${u}`);return}M.log(k.PAT_ALLOCATED),this._streamIdByStreamDescription.set(c,u);let W=e.participantStreamDescription?.mediaType;if(W==="STREAM"||W==="MOVIE"){if(e.participantStreamDescription?.streamName){let K={streamName:e.participantStreamDescription.streamName,stream:R,mediaType:W};E?v.onLocalLive(P,K):v.onRemoteLive(P,K)}}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,[_t.ADMIN,_t.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!I.includesOneOf(this._conversation.roles,[_t.ADMIN,_t.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===Q.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=as(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=ms(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=us(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)){Bi(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:_s(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),Bi(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],C.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(C.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=Q.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===C.REJECTED?Q.REJECTED:Q.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,C.HUNGUP)}async _onAddedParticipant(e){d.debug(`Participant added [${e.participantId}]`);let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state!==Q.HUNGUP&&i.state!==Q.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=Q.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===Q.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=Q.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=Ra(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=Ra(this._serverSettings,s),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=I.composeMessageId(e),i=await this._getParticipant(t);i&&(i.clientType=e.clientType,i.platform=e.platform),v.onPeerRegistered()}async _onMicSwitched(e){v.onDeviceSwitched(de.AUDIO,!e.mute,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)&&!Bi(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,[_t.ADMIN,_t.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=await this._getParticipant(e);i&&!Bi(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!==Q.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 K=this._isCallAdmin()&&i;if(!(W!==je.MUTE&&W!==je.MUTE_PERMANENT||K)&&(this._isCallAdmin()&&W===je.MUTE_PERMANENT&&!i&&(h[R]=je.MUTE),!(!t.includes(R)||a)))switch(R){case de.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(de.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case de.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(de.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case de.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(de.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case de.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(de.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&&!rs(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"&&(A.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(C.FAILED),this._close(new B(C.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){!A.hasMicrophone()||!this._audioFix||!this.mediaSettings?.isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!A.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]}},qe=null;var Oa=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 Is(){Ht=null,ci=null}function bc(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Wr(n=null,r){let e=bc(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 Es(){return Ht||ci||(ci=Wr(),Ht=await ci,ci=null,Ht)}async function Kr(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Es();let t=Rs(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${Ht}/fb.do`,i)}async function Gi(n,r={},e=!1,t){await Es();let i=Rs(n,r,e);return Ac(i,t)}async function Ac(n,r){let e=`${r??Ht}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new B(C.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 Ts(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 Rs(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 Wi=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=C.HUNGUP){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var wc=700,Dc=3e3,di=class extends Wi{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 Gi(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*wc,Dc),{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),kc(a))switch(a.error_code){case 1101:s=C.SERVICE_DISABLED;break;case 4:a.error_msg.includes("participants.limit.exceeded")&&(s=C.PARTICIPANT_LIMIT_REACHED);break;case 300:s=C.NOT_FOUND;break;case 1102:s=C.CALLEE_IS_OFFLINE;break;case 1103:s=C.NOT_FRIENDS;break;case 1104:case 1106:s=C.EXTERNAL_API_ERROR;break;case 1113:s=C.CALLER_IS_REJECTED;break;case 1114:s=C.VCHAT_DETAILED_ERROR;break;case 2:s=C.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})})}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)};Kr("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)};Kr("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()),Ts(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=vt.get("uuid");e||(e=I.uuid(),vt.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(K=>I.composeUserId(K));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=C.HUNGUP){let i={conversationId:e,reason:t};p.anonymToken&&(i.anonymToken=p.anonymToken),Kr("vchat.hangupConversation",i)}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 kc(n){return typeof n=="object"&&n!==null&&"error_code"in n&&"error_msg"in n}var Cs=(e=>(e.KING="KING",e.PAWN="PAWN",e))(Cs||{}),ys=Cs;var xa=(e=>(e.OFF="0",e.ON="1",e))(xa||{});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 Wr(this._baseApiUrl,this._apiEnv),t=await Gi("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:C.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Wr(this._baseApiUrl,this._apiEnv);await Gi("vchat.hangupConversation",e,!0,t)}};var ue,Ki=null,Oc={getCameras:A.getCameras,getMicrophones:A.getMicrophones,getOutput:A.getOutput,getVideoFacingMode:A.getVideoFacingMode,hasCamera:A.hasCamera,hasMicrophone:A.hasMicrophone,getSavedCamera:A.getSavedCamera,getSavedMicrophone:A.getSavedMicrophone,getSavedOutput:A.getSavedOutput,hasCameraPermission:A.hasCameraPermission,hasMicrophonePermission:A.hasMicrophonePermission,hasPermissions:A.hasPermissions,getUserMedia:A.getUserMedia,getUserVideo:A.getUserVideo,getUserAudio:A.getUserAudio,setResolution:A.setResolution,isBrowserSupported:A.isBrowserSupported,isScreenCapturingSupported:A.isScreenCapturingSupported,os:A.os,isMobile:A.isMobile,browserName:A.browserName,browserVersion:A.browserVersion,baseChromeVersion:A.baseChromeVersion,getAudioContext:A.getAudioContext,isAudioShareSupported:A.isAudioShareSupported},xc={participantMarkerCompare:I.participantMarkerCompare};function Nc(n){Ki=n}function Lc(n){p.videoEffects=n}function Uc(n){p.audioEffects=n}function Bc(n,r=null,e={},t=1){p.vmoji=n,p.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function Fc(n){if(p.set(n),ue||(ue=new di),Na.default.disableLog(!p.debug),d.toggle(p.debug),d.log(`Calls SDK ${p.sdkVersion}`,n),await A.init(),!A.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: ${A.hasCameraPermission()}, Mic: ${A.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${p.simulcast}`)}async function Vc(n,r=[de.AUDIO],e="",t=!1,i=!1,a,s,c){let l=[];return Array.isArray(n)?l=n.length?n:[]:n&&(l=[n]),Ps([],st.USER,r,e,t,i,a,l,s,c)}async function Ps(n,r=st.USER,e,t="",i=!1,a=!1,s,c,l,u){return new G(ue,Ki).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:l,conversationId:u})}async function jc(n,r){return bs(n,ae.USER,void 0,r)}async function bs(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,Ki);if(await s.onPush(n,r,e,t,i),le.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 Hc(n,r){return n&&(p.authToken=n),r!==void 0&&p.apiBaseUrl!==r&&(p.apiBaseUrl=r,Is()),ue.authorize()}async function Gc(n=[de.AUDIO],r){return et(r).accept(n)}async function Wc(n){let r=Gt(n);if(r)return r.decline()}async function Kc(n,r=[de.AUDIO]){return As(n,r)}async function As(n,r,e){return new G(ue,Ki).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function $c(n,r=[de.AUDIO],e,t,i,a){return e&&(p.anonymToken=e),new G(ue,Ki).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i,onFastJoin:a})}async function qc(n){let r=Gt(n);if(r)return r.hangup();G.hangupAfterInit()}async function zc(n,r){let e=Array.isArray(n)?n:[n],t=G.current();t&&await t.addParticipant(e,r)}async function Jc(n,r){let e=G.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function Yc(n,r=!1){let e=await ue.getOkIdsByExternalIds([n]);return Ms(e[0],r)}async function Ms(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 Qc(n,r){let e=G.current();if(n==="videoinput"&&St.contains(r))return p.videoFacingMode=r,e?(A.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await A._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function Xc(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 Zc(n){let r=G.current();r&&r.toggleAnimojiCapturing(n)}async function ed(n,r=!1){let e=G.current();e&&await e.setVideoStream(n,r)}async function td(n,r){let e=Gt(r);e&&await e.toggleLocalVideo(n)}async function id(n,r){let e=Gt(r);e&&await e.toggleLocalAudio(n)}async function rd(n){let r=G.current();if(r)return r.setLocalResolution(n)}async function ad(n){let r=G.current();r&&await r.changePriorities(n)}async function nd(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 sd(n,r){let e=Gt(r);e&&await e.hold(n)}async function od(){let n=G.current();n&&await n.putHandsDown()}async function cd(n){let r=G.current();r&&await r.updateDisplayLayout(n)}async function dd(n,r,e=!1){let t=await ue.getOkIdsByExternalIds([n]);return ws(t[0],Y.getDeviceIdx(n),r,e)}async function ws(n,r,e,t=!1){let i=G.current();i&&await i.grantRoles(I.composeParticipantId(n,ae.USER,r),e,t)}async function ld({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await ue.getOkIdsByExternalIds([n]))[0]),Ds({uid:i,muteStates:r,requestedMedia:e,deviceIdx:Y.getDeviceIdx(n),roomId:t})}async function Ds({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 pd(n,r=!1,e=null){let t=await ue.getOkIdsByExternalIds([n]);return ks(t[0],r,Y.getDeviceIdx(n),e)}async function ks(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 ud(n){let r=G.current();r&&await r.updateMediaModifiers(n)}async function md(n){let r=G.current();r&&await r.enableVideoSuspend(n)}async function hd(n){let r=G.current();r&&await r.enableVideoSuspendSuggest(n)}async function gd(n){let r=G.current();r&&await r.changeOptions(n)}async function _d(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),Os(n,e)}async function Os(n,r=null){let e=G.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function fd(n=10){let r=G.current();if(r)return r.chatHistory(n)}async function Sd(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),xs(n,e,Y.getDeviceIdx(r))}async function xs(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 vd(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 Id(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 Ed(){let n=G.current();return n?n.createJoinLink():Promise.reject()}async function Td(){let n=G.current();return n?n.removeJoinLink():Promise.reject()}async function Rd(n,r){return ue.getAnonymTokenByLink(n,r)}function Cd(n){let r=G.current();r&&r.setVolume(n)}function yd(n){p.forceRelayPolicy=n}async function Pd(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 bd(n=null,r){let e=G.current();return e?e.stopStream(n,r):Promise.reject()}async function Ad(n=null){let r=G.current();return r?r.publishStream(n):Promise.reject()}async function Md(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 wd(){let n=G.current();return n?n.getStreamInfo():Promise.reject()}async function Dd(n){let r=G.current();return r?r.addMovie(n):Promise.reject()}async function kd(n){let r=G.current();return r?r.updateMovie(n):Promise.reject()}async function Od(n){let r=G.current();return r?r.removeMovie(n):Promise.reject()}async function xd(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 Nd(n,r){let e=G.current();return e?e.activateRooms(n,r):Promise.reject()}async function Ld(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 Ud(n){let r=G.current();return r?r.removeRooms(n):Promise.reject()}function Bd(n){p.statisticsInterval=n;let r=G.current();if(r)return r.updateStatisticsInterval()}function Fd(n){Na.default.disableLog(!n),d.toggle(n)}function Vd(n,...r){p.debugLog&&d.send(n,"[external]",...r)}async function jd(){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 Hd(n){let r=G.current();if(r)return r.videoEffect(n)}async function Gd(n,r){let e=G.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function Wd(n){let r=G.current();r&&await r.setAudioStream(n)}async function Kd(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 $d(n){let r=G.current();r&&r.setAnimojiFill(n)}async function qd(n=null,r,e=!1){return et().getWaitingHall(n,r,e)}async function zd(){return et().getAudienceModeHands()}async function Jd(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 Yd(n=!1){return et().requestPromotion(n)}async function Qd(n=!1){return et().acceptPromotion(n)}async function Xd(n){return et().getParticipantListChunk(n)}async function Zd(n){return et().getParticipants(n)}async function el(n){return et().feedback(n)}function tl(n,r,e){return et().userFeedbackStats(n,r,e)}function il(n,r={},e=!1){let t=G.current();t&&t.sendClientEvent(n,r,e)}async function rl(n,r){return et().enableFeatureForRoles(n,r)}function Gt(n){return n?le.get(n)??null:G.current()}function et(n){let r=Gt(n);if(!r)throw new Error("Conversation not found");return r}async function al(n){await ue.removeHistoryRecords(n)}async function nl(n){let r=G.current();r&&await r.startAsr(n)}async function sl(n){let r=G.current();r&&await r.stopAsr(n)}async function ol(n){let r=G.current();r&&await r.requestAsr(n)}async function cl(n){let r=G.current();return r?r.startUrlSharing(n):Promise.reject()}async function dl(){let n=G.current();return n?n.stopUrlSharing():Promise.reject()}async function ll(n){await le.setActive(n)}function pl(){let n=new Map;for(let r of le.getAll())n.set(r.id,r);return n}function ul(){return le.getActiveId()}function ml(){return p.sdkVersion}
|