@vkontakte/calls-sdk 2.8.11-beta.1 → 2.8.11-dev.1ead2f25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/calls-sdk.cjs.js CHANGED
@@ -1,17 +1,20 @@
1
- /**
2
- * @vkontakte/calls-sdk v2.8.11-beta.1
3
- * Mon, 18 May 2026 13:18:32 GMT
4
- * https://st.mycdn.me/static/callssdk/2-8-11/doc/
1
+ /*!
2
+ * @vkontakte/calls-sdk v2.8.11-dev.1ead2f25.0
3
+ * Tue, 26 May 2026 15:11:30 GMT
4
+ * https://calls-sdk.cdn-vk.ru/doc/latest/index.html
5
5
  */
6
6
 
7
- "use strict";var Os=Object.create;var pi=Object.defineProperty;var xs=Object.getOwnPropertyDescriptor;var Ns=Object.getOwnPropertyNames;var Ls=Object.getPrototypeOf,Us=Object.prototype.hasOwnProperty;var Bs=(n,r,e)=>r in n?pi(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var Fs=(n,r)=>{for(var e in r)pi(n,e,{get:r[e],enumerable:!0})},Wa=(n,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Ns(r))!Us.call(n,i)&&i!==e&&pi(n,i,{get:()=>r[i],enumerable:!(t=xs(r,i))||t.enumerable});return n};var ui=(n,r,e)=>(e=n!=null?Os(Ls(n)):{},Wa(r||!n||!n.__esModule?pi(e,"default",{value:n,enumerable:!0}):e,n)),Vs=n=>Wa(pi({},"__esModule",{value:!0}),n);var o=(n,r,e)=>Bs(n,typeof r!="symbol"?r+"":r,e);var nl={};Fs(nl,{Api:()=>oi,ApiExternal:()=>Gr,ArrayDequeue:()=>Hr,AuthData:()=>Ce,BaseLogger:()=>Pt,CallDirection:()=>ke,CallType:()=>nt,ChatRoomEventType:()=>wr,ConversationFeature:()=>kr,ConversationOption:()=>Xe,DebugMessageType:()=>ma,ExternalIdType:()=>Or,FacingMode:()=>_t,FatalError:()=>ne,HangupReason:()=>U,HangupType:()=>R,MediaOption:()=>le,MediaTrackKind:()=>Ge,MediaType:()=>kt,MuteState:()=>je,ParticipantState:()=>X,ParticipantStateDataValue:()=>Ma,ParticipantStatus:()=>Ji,RecordRole:()=>Is,RoomsEventType:()=>ai,Signaling:()=>Vt,SignalingCommandType:()=>x,SignalingConnectionType:()=>Ke,SignalingNotification:()=>B,TransportTopology:()=>Fe,UserRole:()=>ht,UserType:()=>se,VolumeDetector:()=>Rt,acceptCall:()=>Uc,acceptPromotion:()=>Kd,activateRooms:()=>Md,addMovie:()=>yd,addParticipant:()=>Hc,addParticipantInternal:()=>Gc,authorize:()=>Lc,browser:()=>bc,callInternal:()=>Es,callTo:()=>xc,captureScreen:()=>qc,captureVmoji:()=>$c,changeAudioEffect:()=>Ud,changeConversationOptions:()=>dd,changeDevice:()=>Kc,changeParticipantState:()=>Zc,changePriorities:()=>Xc,changeVideoEffect:()=>Ld,chatHistory:()=>pd,chatMessage:()=>ld,chatMessageInternal:()=>As,createJoinLink:()=>gd,customData:()=>ud,customDataInternal:()=>Ms,debug:()=>Od,debugMessage:()=>xd,declineCall:()=>Bc,enableFeatureForRoles:()=>Qd,enableVideoSuspend:()=>od,enableVideoSuspendSuggest:()=>cd,feedback:()=>zd,forceRelayPolicy:()=>vd,getAnonymTokenByLink:()=>fd,getAudienceModeHands:()=>Hd,getParticipantListChunk:()=>qd,getParticipants:()=>$d,getStreamInfo:()=>Cd,getWaitingHall:()=>jd,grantRoles:()=>rd,grantRolesInternal:()=>ys,hangup:()=>jc,hold:()=>ed,init:()=>Oc,joinCall:()=>Fc,joinCallByLink:()=>Vc,joinCallInternal:()=>Rs,logClientEvent:()=>Yd,muteParticipant:()=>ad,muteParticipantInternal:()=>Ps,pinParticipant:()=>nd,pinParticipantInternal:()=>bs,processPush:()=>Nc,processPushInternal:()=>Ts,promoteParticipant:()=>Gd,publishStream:()=>Td,putHandsDown:()=>td,recordSetConf:()=>Rd,removeHistoryRecords:()=>Xd,removeJoinLink:()=>_d,removeMovie:()=>bd,removeParticipant:()=>Wc,removeParticipantInternal:()=>Cs,removeRooms:()=>wd,requestAsr:()=>tl,requestPromotion:()=>Wd,setAudioEffects:()=>wc,setAudioStream:()=>Bd,setLocalResolution:()=>Qc,setLogger:()=>Mc,setMediaModifiers:()=>sd,setStatisticsInterval:()=>kd,setVideoEffects:()=>Dc,setVideoStream:()=>zc,setVmoji:()=>kc,setVmojiFill:()=>Vd,setVmojiSvg:()=>Fd,setVolume:()=>Sd,startAsr:()=>Zd,startAudienceConversation:()=>hd,startConversation:()=>md,startStream:()=>Id,startUrlSharing:()=>il,stopAsr:()=>el,stopStream:()=>Ed,stopUrlSharing:()=>rl,switchRoom:()=>Dd,toggleLocalAudio:()=>Yc,toggleLocalVideo:()=>Jc,updateDisplayLayout:()=>id,updateMovie:()=>Pd,updateRooms:()=>Ad,uploadDebugLogs:()=>Nd,userFeedbackStats:()=>Jd,utils:()=>Ac,version:()=>al});module.exports=Vs(nl);var Da=ui(require("webrtc-adapter"));var Pt=class{log(r,e,t=!1){}destroy(){}};var de=class{constructor(){o(this,"_handlers",{});o(this,"_listeners",[])}_triggerEvent(r,...e){if(Object.hasOwn(this._handlers,r))for(let t of this._handlers[r])t.apply(this,e)}addEventListener(r,e){if(typeof e!="function")throw new Error("Listener should be a function");return Object.hasOwn(this._handlers,r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!Object.hasOwn(this._handlers,r))return;e||delete this._handlers[r];let t=this._handlers[r].indexOf(e);t>=0&&this._handlers[r].splice(t,1)}subscribe(r,e,t){let i=r.addEventListener(e,t);this._listeners.push(i)}unsubscribe(){this._listeners.forEach(r=>{r.dispose()})}};var mi=class extends de{constructor(){super(...arguments);o(this,"_abortSignal")}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}setConversationId(e){}readyToSend(e=!0){}cleanup(){}requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}};var Ka=(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))(Ka||{}),R=Ka;var U=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(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 Te=class Te extends Pt{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 y=Te;var L=require("messagepack");var qa=(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))(qa||{}),x=qa;var $a=(q=>(q.MIC_CAMERA_PERMISSION="mic_camera",q.CAMERA_PERMISSION="camera",q.MIC_PERMISSION="mic",q.CAMERA_ACCESS="cameralock",q.MIC_ACCESS="miclock",q.MIC_NOT_FOUND="nomic",q.SCREEN_PERMISSION="screenpermission",q.SCREEN_ACCESS="screenlock",q.CONNECTION="connection",q.NETWORK="network",q.UNKNOWN="unknown",q.UNSUPPORTED="unsupported",q.SIGNALING_FAILED="signalingfailed",q.API="api",q.AUTH="auth",q.OVERCONSTRAINED="overconstrained",q))($a||{}),ne=$a;var za=(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))(za||{}),le=za;var Ja=(ae=>(ae.ACCEPT_CONCURRENT="callAcceptConcurrent",ae.ACCEPT_INCOMING="callAcceptIncoming",ae.ACCEPTED_OUTGOING="callAcceptedOutgoing",ae.ADD_PARTICIPANT="callAddParticipant",ae.CALL_SPEC_ERROR="callSpecError",ae.DECLINE_INCOMING="callDeclineIncoming",ae.DEVICE_CHANGED="callDeviceChanged",ae.DEVICES="callDevices",ae.ERROR="callError",ae.HANGUP="callHangup",ae.ICE_CONNECTION_STATE="callIceConnectionState",ae.ICE_CONNECTION_TYPE="callIceConnectionType",ae.ICE_RESTART="callIceRestart",ae.JOIN_CONVERSATION="callJoinConversation",ae.MEDIA_STATUS="callMediaStatus",ae.OUTGOING_CALL="callStart",ae.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",ae.PAT_ALLOCATED="patAllocate",ae.PAT_DEALLOCATED="patDeallocate",ae.PAT_ERROR="patError",ae.PAT_OUTDATED_RESPONSE="patOutdatedResponse",ae.PAT_WAITING_TIME_ERROR="patWaitingTimeError",ae.POOR_CONNECTION="callPoorConnection",ae.PUSH="callPush",ae.RECONNECT="callReconnect",ae.RELAY_POLICY="callForceRelay",ae.REMOVE_PARTICIPANT="callRemoveParticipant",ae.SOCKET_ACTION="callSocketAction",ae.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",ae))(Ja||{}),k=Ja;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 Ya=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Ya||{}),se=Ya;var gt={HEIGHT:720,WIDTH:1280,BITRATE:1e6},hi="L1T2",Xa=[{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}],js={h:1,m:2,l:4};function Za(n,r){return!n||!r?n===r:n.streams.length===r.streams.length?n.streams.every((e,t)=>I.isObjectsEquals(e,r.streams[t])):!1}function Qa(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:Xa[0].bitrate}function gi(n=gt.WIDTH,r=gt.HEIGHT,e=Xa){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=Qa(i,e)??gt.BITRATE;for(let p=0;p<a;p++){let m=t[p];s.streams.push({rid:m,width:n,height:r,fps:c,bitrate:l}),n=Math.round(n/2),r=Math.round(r/2),l=Qa(Math.max(n,r),e)??Math.round(l/2)}return s}function Gi(n){return n?js[n]??1:1}var en=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 tn(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=":",Ki="d",Hs=533,Wi="a=fmtp:",Gs="sps-pps-idr-in-keyframe=1",Yr;(et=>{let n=/[\r\n]+/,r=`\r
8
- `;function e(g,T){let P=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),S,A=[];for(S=0;S<g.length;++S){let w=g[S].match(P);w&&w.length===3&&w[2]===T&&A.push(w[1])}return A}function t(g,T,P){let S=g.split(" "),A=S.slice(0,3),w;for(w=3;w<S.length;w++)P.includes(S[w])&&A.push(S[w]);for(w=3;w<S.length;w++)!P.includes(S[w])&&!T.includes(S[w])&&A.push(S[w]);return A.join(" ")}function i(g,T,P,S){let A,w="m="+T;for(A=0;A<g.length;++A)g[A].startsWith(w)&&(g[A]=t(g[A],P,S))}function a(g,T){let P=new RegExp(Wi+"(\\d+)");for(let S=0;S<g.length;++S){let A=g[S].match(P);if(A&&A.length===2&&T.includes(A[1])){let w=g[S].trim()===Wi+A[1]?" ":";";g[S]+=w+Gs}}}function s(g,T,P="video"){let S=e(g,T);if(!S.length)return;let A=S.slice(0),w=new RegExp(Wi+"(\\d+) apt=(\\d+)"),K;for(K=0;K<g.length;++K){let $=g[K].match(w);$&&$.length===3&&A.includes($[2])&&A.push($[1])}let H=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for(K=g.length;K--;){let $=g[K].match(H);$&&$.length===3&&A.includes($[2])&&g.splice(K,1)}i(g,P,A,[])}function c(g,T,P,S){let A=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),w,K=[];for(w=T;w<P;++w){let $=g[w].match(A);$&&$.length===3&&$[2]===S&&K.push($[1])}if(!K.length)return K;let H=new RegExp(Wi+"(\\d+) apt=(\\d+)");for(w=T;w<P;++w){let $=g[w].match(H);$&&$.length===3&&K.includes($[2])&&K.push($[1])}return K}function l(g,T,P,S){let A=c(g,T,P,S);if(!A.length)return P+1;let w=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),K=0,H=P;for(;H>=T;){let $=g[H].match(w);$&&$.length===3&&A.includes($[2])&&(g.splice(H,1),K++),H--}return g[T]=t(g[T],A,[]),P-K+1}function p(g,T,P,S){let A=-1,w=-1,K=!1;for(let H=0;H<g.length;++H)if(A>=0&&g[H].startsWith("m=")&&(w=H-1,K&&(H=l(g,A,w,T)),A=-1,w=-1,K=!1),g[H].startsWith("m=video")&&(A=H),A>=0){let $=P==="remote"&&S==="encoder"||P==="local"&&S==="decoder"?"recvonly":"sendonly";(g[H].startsWith(`a=${$}`)||g[H].startsWith("a=sendrecv"))&&(K=!0)}w=g.length-1,A>=0&&K&&l(g,A,w,T)}function m(g,T){let P=e(g,"H264");T&&i(g,"video",[],P),a(g,P)}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 b(g,T,P,S,A=!1){let w=g.split(n);if(E(w),!T&&!P&&!S&&!A)return w.join(r);function K($){let Ee=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],N="a=rtcp-fb:111",Ie=$.findIndex(fe=>fe.startsWith(N));return~Ie&&($[Ie]=$[Ie]+r+Ee.join(r)),$}function H($){let Ee=e($,"red");Ee.length>0&&i($,"audio",[],Ee)}return P?p(w,"H264","local","decoder"):m(w,T),S&&h(w),H(w),A&&K(w),w.join(r)}et.patchLocalSDP=b;function C(g,T,P,S,A,w,K){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 H=g.split(n);return S?s(H,"H264"):P&&m(H,P),w&&K?s(H,"VP9"):w?p(H,"VP9","remote","encoder"):K?p(H,"VP9","remote","decoder"):A&&h(H),E(H),H.join(r)}et.patchRemoteSDP=C;function W(g){return g?`${g.type||"WEB_SOCKET"}_${g.id}`:"_"}et.getPeerIdString=W;function q(g,T){return g&&g.id===T.id&&(g.type||"WEB_SOCKET")===(T.type||"WEB_SOCKET")}et.comparePeerId=q;async function J(g){let T={local:null,remote:null};if(!g||!g.getStats)return T;try{let P=await g.getStats(null),S=null;if(P.forEach(A=>{A.type==="transport"&&A.selectedCandidatePairId?S=P.get(A.selectedCandidatePairId):A.type==="candidate-pair"&&A.state==="succeeded"&&!S&&(!Object.hasOwn(A,"selected")||A.selected)&&(S=A)}),S?.localCandidateId){let A=P.get(S.localCandidateId);A&&(T.local={type:A.candidateType,ip:A.ip||A.ipAddress,port:A.port||A.portNumber})}if(S?.remoteCandidateId){let A=P.get(S.remoteCandidateId);A&&(T.remote={type:A.candidateType,ip:A.ip||A.ipAddress,port:A.port||A.portNumber})}return T}catch{return T}}et.getPeerConnectionHostInfo=J;let Re=/^[0-9]+$/,De=/^([gu])([0-9]+)$/;function oe(g,T=se.USER){let P=String(g);return De.test(P)?(d.warn(`Already composite id [${g}] type supplied [${T}]`),P):T===se.GROUP?"g"+P:T===se.USER?"u"+P:(d.warn(`Unknown type [${T}] for id [${g}]`),P.match(Re)?"u"+P:P)}et.composeUserId=oe;function re(g,T,P=0){let S=oe(g,T);return Y(S,P)}et.composeParticipantId=re;function Y(g,T){return T?g+Wt+Ki+T:g}et.compose=Y;function Ht(g){return re(g.id,g.idType||se.USER,g.deviceIdx)}et.composeId=Ht;function wa(g){if(g.decorativeUserId)return re(g.decorativeUserId,g.idType||se.USER,g.deviceIdx)}et.composeDecorativeId=wa;function ka(g){return g.participant?Ht(g.participant):re(g.participantId,g.participantType||se.USER,g.deviceIdx)}et.composeMessageId=ka;function Oa(g){return typeof g=="string"?ci(di(g).compositeUserId).id:g}et.extractOkId=Oa;function ci(g){let T=String(g),P=T.match(De);return P?{id:Number(P[2]),type:P[1]==="g"?se.GROUP:se.USER}:(d.warn(`Unsupported compositeId [${g}]`),{id:Number(T),type:se.USER})}et.decomposeId=ci;function di(g){let T=g.split(Wt+Ki);return{compositeUserId:T[0],deviceIdx:T.length>1?parseInt(T[1],10):0}}et.decomposeParticipantId=di;function ae(){let g=window.crypto?.randomUUID?.();if(g)return g;let T="0123456789abcdefghijklmnopqrstuvwxyz".split(""),P=new Array(36),S=0,A,w;for(w=0;w<36;w++)w===8||w===13||w===18||w===23?P[w]="-":w===14?P[w]="4":(S<=2&&(S=33554432+Math.random()*16777216|0),A=S&15,S=S>>4,P[w]=T[w===19?A&3|8:A]);return P.join("")}et.uuid=ae;function xa(g,T){let P;function S(...A){let w=this;P&&window.clearTimeout(P),P=window.setTimeout(()=>{g.apply(w,A)},T)}return S}et.debounce=xa;function Na(g){if(!window.BigInt)return null;let T="",P=g.split(`
9
- `);for(let w of P)if(w.startsWith("a=fingerprint")){let K=w.split(" ");if(K.length===2){T=K[1];break}}if(!T)return BigInt(-1);let S=T.split(":"),A=BigInt(0);for(let w=Math.min(7,S.length-1);w>=0;w--){let K=BigInt(parseInt(S[w],16));A<<=BigInt(8),A|=K}return BigInt.asIntN(64,A)}et.sdpFingerprint=Na;async function ee(g,{signal:T}={}){return new Promise((P,S)=>{if(T?.aborted)return S(T.reason);let A=setTimeout(()=>{T?.removeEventListener("abort",w),P()},g),w=()=>{clearTimeout(A),S(T?.reason)};T?.addEventListener("abort",w,{once:!0})})}et.delay=ee;function La(g,T,P){let S=[];return g.getSenders().forEach(A=>Wr(T,A,A.track,P,S)),S}et.applySettings=La;function Wr(g,T,P,S,A){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!g||!P||P.kind!=="video")return;let w=P.getSettings();if(!w)return;let K=g.maxBitrateK?g.maxBitrateK*1024:null,H=w.width,$=w.height,Ee=H&&$&&g.maxDimension?Math.max(1,Math.max(H,$)/g.maxDimension):null,N=g.maxFramerate||null;if(H&&$&&g.maxDimension&&g.maxDimension>Math.max(H,$)){let _e=Math.round(H*$/256),Oe=(Math.round(_e*Hs/1e4)+1)*1e4;K=K===null?Oe:Math.min(Oe,K)}let Ie=g.degradationPreference||"balanced",fe=S[P.id];if(fe&&fe.bitrate===K&&fe.scaleResolutionDownBy===Ee&&fe.maxFramerate===N&&fe.degradationPreference===Ie){A[P.id]=fe;return}A[P.id]={bitrate:K,scaleResolutionDownBy:Ee,maxFramerate:N,degradationPreference:Ie};let Me=T.getParameters();if(Me.encodings||(Me.encodings=[{}]),Me.encodings.length>1&&H&&$&&g.maxDimension){let _e=Math.round(g.maxDimension*1.35),Oe=Math.max(H,$),Ct=gi(H,$,g?.bitrates?.generic),Gt=Ct.streams.length;d.log(`applyVideoTrackSettings: maxDim=${g.maxDimension} targetDim=${_e} track=${H}x${$} sim=${JSON.stringify(Ct)}`),Me.encodings.forEach((tt,li)=>{tt.scaleResolutionDownBy=Gi(tt.rid);let Ha=Math.round(Oe/tt.scaleResolutionDownBy);li<Gt-1?tt.active=Ha<_e:li>=Gt?tt.active=!1:tt.active=!0,li<Gt?tt.maxBitrate=Ct.streams[li].bitrate:tt.maxBitrate=0,tt.scalabilityMode=hi})}else Me.encodings.forEach(_e=>{g?.scalabilityMode&&(_e.scalabilityMode=g.scalabilityMode),K?_e.maxBitrate=K:delete _e.maxBitrate,Ee?_e.scaleResolutionDownBy=Ee:delete _e.scaleResolutionDownBy,N?_e.maxFramerate=N:delete _e.maxFramerate});if(Me.degradationPreference=Ie,Me.encodings.length>0){T.setParameters?.(Me).catch(Oe=>{d.error("Failed to set sender parameters",Me,Oe)});let _e=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(_e.encodings)}`)}}et.applyVideoTrackSettings=Wr;function Kr(g,T){Array.isArray(T)||(T=[T]);for(let P of T)if(g.includes(P))return!0;return!1}et.includesOneOf=Kr;function qr(g){return Object.entries(g.participantState?.state||{}).reduce((T,[P,S])=>(g.participantState&&(T[P]={ts:g.participantState.stateUpdateTs[P],state:S}),T),{})}et.mapParticipantState=qr;function Ua(g){let T=g.map(P=>({uid:P.externalId,mediaSettings:P.mediaSettings,status:P.status,muteStates:P.muteStates,unmuteOptions:P.unmuteOptions,participantState:P.participantState,markers:P.markers,movieShareInfos:P.movieShareInfos,roles:P.roles}));return u.filterObservers?T.filter(P=>!P.uid.observer):T}et.mapSharedParticipants=Ua;function Ba(g,T){let P=Object.keys(g),S=Object.keys(T);if(P.length!==S.length)return!1;for(let A of P)if(!Object.hasOwn(S,A)||g[A].state!==T[A].state||g[A].ts!==T[A].ts)return!1;return!0}et.isEqualParticipantState=Ba;function $r(g,T,P=!1){let S=Object.keys(g),A=Object.keys(T);if(S.length!==A.length)return!1;for(let w of S){if(!Object.hasOwn(T,w))return!1;let K=g[w],H=T[w];if(P&&ce(K)&&ce(H))return $r(K,H,P);if(K!==H)return!1}return!0}et.isObjectsEquals=$r;function Fa(g,T){if(g.length!==T.length)return!1;for(let P of g)if(T.indexOf(P)<0)return!1;return!0}et.isArraysEquals=Fa;function Va(g){return!Object.keys(g).length}et.isEmptyObject=Va;function ja(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)||P(g,T);function P(A,w){let K={[se.USER]:0,[se.GROUP]:1},{compositeUserId:H,deviceIdx:$}=di(A.id),{compositeUserId:Ee,deviceIdx:N}=di(w.id),{id:Ie,type:fe}=ci(H),{id:Me,type:_e}=ci(Ee);return S(K[fe],K[_e])||S(Ie,Me)||S($,N)}function S(A,w){return A<w?-1:A===w?0:1}}et.participantMarkerCompare=ja;function he(g,T){let P=Object.entries(g).filter(([,S])=>Array.isArray(T)?!T.includes(S):S!==T);return en(P)}et.objectFilterOutValues=he;function V(g,T,P){let S=P;for(let A in g)Object.hasOwn(g,A)&&(S=T(S,g[A],A));return S}et.objectReduce=V,et.setImmediate=(()=>{let g=1,T={},P=null;return typeof MessageChannel<"u"&&(P=new MessageChannel,P.port1.onmessage=S=>{let A=S.data;T[A]&&(T[A](),delete T[A])}),function(S){if(P&&document.visibilityState==="hidden"){let w=g;return g=g>=Number.MAX_SAFE_INTEGER?1:g+1,T[w]=S,P.port2.postMessage(w),()=>{T[w]&&delete T[w]}}let A=setTimeout(S,0);return()=>clearTimeout(A)}})();function ce(g){return g!==null&&typeof g=="object"&&!Array.isArray(g)}et.isObject=ce;function Se(g,T,P,S){function A(H,$){let Ee=0,N=H.length,Ie=!1;for(let fe=0;fe<H.length;fe++)if(!Ie&&H[fe].startsWith("m=video")&&(Ee=fe),H[fe].startsWith("a=mid:"+$)&&(Ie=!0),Ie&&H[fe].startsWith("m=")){N=fe;break}return{start:Ee,end:N}}function w(H,$,Ee,N,Ie,fe,Me){let _e="a=rid:"+N+" send";for(let Oe=$;Oe<Ee;Oe++)if(H[Oe]===_e){let Gt=_e+" max-width="+fe+";max-height="+Me+";max-br="+Ie;H[Oe]=Gt}}let K=T?.sender;if(K&&K.track&&T.mid){let H=g.split(n),{start:$,end:Ee}=A(H,T.mid),N=K.getParameters();if(N.encodings)return N.encodings.forEach(Ie=>{let fe=Ie.rid,Me=Ie.maxBitrate,_e=Ie.scaleResolutionDownBy;if(P&&S&&_e){let Oe=""+Math.round(P/_e),Ct=""+Math.round(S/_e);w(H,$,Ee,fe,Me,Oe,Ct)}}),H.join(r)}return g}et.patchSimulcastAnswerSdp=Se})(Yr||(Yr={}));var I=Yr;var Kt="__CALLS_SDK_DEVTOOLS_",_i=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 fi=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 bt=class bt{constructor(){o(this,"params");o(this,"storage");this.storage=new _i,this.params=new fi(this.storage)}static getInstance(){return bt.instance||(bt.instance=new bt),bt.instance}};o(bt,"instance",null);var Qr=bt,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-beta.1"}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||(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}}};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 u=_;function rn(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 an=n=>n.stop(),At=n=>n.getTracks().forEach(an),nn=n=>n.getVideoTracks().forEach(an);async function qi(n,r){try{let e=typeof r.width=="number"?r.width:void 0,t=typeof r.height=="number"?r.height:void 0;await n.applyConstraints({...r,...e&&{width:{max:e,ideal:e}},...t&&{height:{max:t,ideal:t}}})}catch(e){d.warn("setVideoConstraints failed",e)}}var $i=class extends de{constructor(){super(...arguments);o(this,"FPS_LIMITS",[13,20,Math.max(u.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 zi=class extends de{constructor(){super();o(this,"_stream",null);o(this,"_screenTrack",null);o(this,"_audioShareTrack",null);o(this,"_screenShareTrack",null);o(this,"_sendVideoTrack",null);o(this,"_cameraVideoTrack",null);o(this,"_micAudioTrack",null);o(this,"_audioEffectsTrack",null);o(this,"_mediaSettings",ye());o(this,"_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(),u.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),u.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new $i,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),u.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[le.AUDIO],t=!0){if(this._stream)return;let i=e.includes(le.VIDEO),a=e.includes(le.AUDIO),s=e.includes(le.ANIMOJI);if(!M.isBrowserSupported())throw new U(ne.UNSUPPORTED);try{this._stream=await M.getUserMedia(i,a,t),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=i&&this._stream.getVideoTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(c){throw new U(c)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,i){let a=this.getStream(),s=this.getSendAudioTrack(),c=this.getSendVideoTrack(i);if(!a||!s&&!c&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,a),c&&!t&&e.addTrack(c,a)}getMediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case"videoinput":if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case"audioinput":if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(ne.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&nn(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)At(i);else{let a=await this._setEffect(this._effect,this.cameraVideoTrack);y.log(k.DEVICE_CHANGED,t),d.log("Video stream changed"),await this._replaceLocalTrack(a),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw y.log(k.ERROR,"change_video"),d.warn("Camera change failed",t),t}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await M.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)At(t);else{let i=await this._applyAudioEffect();y.log(k.DEVICE_CHANGED,"audio"),d.log("Audio stream changed",i),await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw y.log(k.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await M.getScreenMedia(e,t),!this._stream)At(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),y.log(k.DEVICE_CHANGED,"screen"),d.log("Screen capturing started"),this._screenTrack=a,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,u.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(a.contentHint="motion",this._screenShareTrack=a),i.getAudioTracks().length>0){let s=i.getAudioTracks()[0];s.contentHint="music",this._audioShareTrack=s,await this._replaceLocalTrack(s),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&d.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:a}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(a){throw y.log(k.ERROR,"screen"),d.warn("Screen capturing failed",a),a}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent("SCREEN_STATUS",{track:null}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"}))}async stopAudioShareTrack(){if(this._audioShareTrack){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!u.audioEffects||!this._audioEffectParams)return u.audioEffects?.pause(),this._micAudioTrack;u.audioEffects.isInitialized||await u.audioEffects.init(),u.audioEffects.resume(),u.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),u.audioEffects.setSource(this._micAudioTrack);let e=u.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(u.videoEffects),!u.videoEffects)return t;try{return u.videoEffects.setEffect(e,t)}catch(i){return d.warn("Video effect failed",i),t}}_stopEffect(){if(u.videoEffects)try{u.videoEffects.stopEffect()}catch(e){d.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),M.releaseFirefoxMicrophonePermissionWarmup(),u.videoEffects&&(this._effect=null,u.videoEffects.destroy()),u.audioEffects&&u.audioEffects.destroy(),this._stream&&(At(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(u.videoMinWidth,u.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 u.audioEffects?.pause(),t(M.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else u.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:u.noiseSuppression})}async videoEffect(e){if(!u.videoEffects)throw new Error("Video Effects library is not set");if(y.log(k.DEVICE_CHANGED,`effect_${e?.effect||"none"}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let i=this.cameraVideoTrack.clone(),a=new MediaStream([i]);await this._applyVideoConstraints(i),await this._changeVideoInput(a)}catch(i){this._effect=t;let a=this.cameraVideoTrack.clone(),s=new MediaStream([a]);throw await this._changeVideoInput(s),i}}}async audioEffect(e){if(!u.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<u.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(t=>{d.warn("MediaSource handleVideoEffectsLowFps error",t)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??u.videoFrameRate;return this._effect?Math.min(e,u.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await qi(e,{width:this._effect?u.videoEffectMaxWidth:u.videoMaxWidth,height:this._effect?u.videoEffectMaxHeight:u.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}};var Si=class{constructor(){o(this,"_cameraPermissionStatus");o(this,"_microphonePermissionStatus");o(this,"_listener")}static isSupported(){return M.browserName()!=="Firefox"&&"permissions"in navigator&&"PermissionStatus"in window}async init(r){try{let[e,t]=await Promise.all([navigator.permissions.query({name:"camera"}),navigator.permissions.query({name:"microphone"})]);this._cameraPermissionStatus=e,this._microphonePermissionStatus=t,this._listener=r,this._cameraPermissionStatus.onchange=i=>this.handlePermissionChange(i),this._microphonePermissionStatus.onchange=i=>this.handlePermissionChange(i)}catch(e){d.warn("NavigatorPermissions init error",e)}}handlePermissionChange(r){let e=r.target;if(e instanceof PermissionStatus){let{name:t,state:i}=e;switch(t){case"audio_capture":this._listener("microphone",i);break;case"video_capture":this._listener("camera",i);break}}}getPermissionState(r){let e=null;switch(r){case"camera":e=this._cameraPermissionStatus.state;break;case"microphone":e=this._microphonePermissionStatus.state;break}return e}};var Ji=(p=>(p.WAITING_HALL="WAITING_HALL",p.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",p.WAITING="WAITING",p.CONNECTING="CONNECTING",p.CONNECTED="CONNECTED",p.RECONNECT="RECONNECT",p.ERROR="ERROR",p.HANGUP="HANGUP",p.PERMISSIONS="PERMISSIONS",p))(Ji||{});function G(n,...r){let e=u.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function ge(n,r,...e){if(u.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 Pe(n){return Object.assign({},n)}function Mt(n){return n.slice()}var Zr;(Sl=>{function n(f,D){G("onLocalStream",f,Pe(D))}Sl.onLocalStream=n;function r(f,D){G("onScreenStream",f,Pe(D))}Sl.onScreenStream=r;function e(f,D){G("onVmojiStream",f,Pe(D))}Sl.onVmojiStream=e;function t(f){G("onVmojiError",f)}Sl.onVmojiError=t;function i(f,D){G("onLocalStreamUpdate",Pe(f),D)}Sl.onLocalStreamUpdate=i;function a(f){d.debug("Local status:",f),G("onLocalStatus",f)}Sl.onLocalStatus=a;function s(f,D){ge("onRemoteStream",f,D)}Sl.onRemoteStream=s;function c(f,D){ge("onRemoteLive",f,D)}Sl.onRemoteLive=c;function l(f,D){ge("onLocalLive",f,D)}Sl.onLocalLive=l;function p(f,D){ge("onRemoteLiveUpdate",f,D)}Sl.onRemoteLiveUpdate=p;function m(f,D){ge("onLocalLiveUpdate",f,D)}Sl.onLocalLiveUpdate=m;function h(f,D){ge("onRemoteScreenStream",f,D)}Sl.onRemoteScreenStream=h;function E(f,D){ge("onRemoteVmojiStream",f,D)}Sl.onRemoteVmojiStream=E;function b(f,D,z){ge("onRemoteStreamSuspended",f,D,z)}Sl.onRemoteStreamSuspended=b;function C(f,D,z,Ue,yt){ge("onConversation",f,Pe(D),Pe(z),Ue,yt)}Sl.onConversation=C;function W(f){f&&G("onConversationParticipantListChunk",f)}Sl.onConversationParticipantListChunk=W;function q(f,D,z){ge("onRemoteMediaSettings",f,Pe(D),z)}Sl.onRemoteMediaSettings=q;function J(f,D){ge("onLocalMediaSettings",f,Pe(D))}Sl.onLocalMediaSettings=J;function Re(f,D,z){ge("onRemoteSharedMovieInfo",f,Pe(D),z)}Sl.onRemoteSharedMovieInfo=Re;function De(f,D,z){ge("onRemoteSharedMovieStoppedInfo",f,Pe(D),z)}Sl.onRemoteSharedMovieStoppedInfo=De;function oe(f,D,z){ge("onLocalSharedMovieInfo",f,Pe(D),z)}Sl.onLocalSharedMovieInfo=oe;function re(f,D,z){ge("onLocalSharedMovieStoppedInfo",f,Pe(D),z)}Sl.onLocalSharedMovieStoppedInfo=re;function Y(f,D,z){ge("onRemoteSharedUrl",f,D,z)}Sl.onRemoteSharedUrl=Y;function Ht(f,D){ge("onParticipantAdded",f,D)}Sl.onParticipantAdded=Ht;function wa(f,D){ge("onParticipantJoined",f,D)}Sl.onParticipantJoined=wa;function ka(f,D=!1){G("onLocalParticipantState",Pe(f),D)}Sl.onLocalParticipantState=ka;function Oa(f,D,z){ge("onRemoteParticipantState",f,Pe(D),z)}Sl.onRemoteParticipantState=Oa;function ci(f,D){G("onRemoteParticipantsState",f,D)}Sl.onRemoteParticipantsState=ci;function di(f,D,z=null){d.debug("Remote status:",D,f),ge("onRemoteStatus",f,D,z)}Sl.onRemoteStatus=di;function ae(){G("onPermissionsRequested")}Sl.onPermissionsRequested=ae;function xa(f,D){G("onPermissionsError",f,D)}Sl.onPermissionsError=xa;function Na(f,D){ge("onRemoteRemoved",f,D)}Sl.onRemoteRemoved=Na;function ee(f,D,z){G("onCallState",f,D,Pe(z))}Sl.onCallState=ee;function La(f,D){G("onDeviceSwitched",f,D)}Sl.onDeviceSwitched=La;function Wr(f,D,z,Ue=!1,yt=!1,zr=null,Jr=null,Ds,Ga,ws=null){let ks=Ga?Mt(Ga):void 0;G("onMuteStates",Pe(f),Mt(D),Mt(z),Ue,yt,zr,Jr,Ds,ks,ws)}Sl.onMuteStates=Wr;function Kr(f,D,z=!1){ge("onRolesChanged",f,Mt(D),z)}Sl.onRolesChanged=Kr;function qr(f,D=!1){G("onLocalRolesChanged",Mt(f),D)}Sl.onLocalRolesChanged=qr;function Ua(f,D,z,Ue){ge("onPinnedParticipant",f,D,z,Ue)}Sl.onPinnedParticipant=Ua;function Ba(f,D){G("onLocalPin",f,D)}Sl.onLocalPin=Ba;function $r(f){G("onOptionsChanged",Mt(f))}Sl.onOptionsChanged=$r;function Fa(){G("onCallAccepted")}Sl.onCallAccepted=Fa;function Va(f,D){ge("onAcceptedCall",f,D)}Sl.onAcceptedCall=Va;function ja(){G("onRateNeeded")}Sl.onRateNeeded=ja;function he(f){ge("onSpeakerChanged",f)}Sl.onSpeakerChanged=he;function V(f){G("onVolumesDetected",Mt(f))}Sl.onVolumesDetected=V;function te(f,D){G("onLocalVolume",f,D)}Sl.onLocalVolume=te;function ce(f,D){G("onJoinStatus",f,D)}Sl.onJoinStatus=ce;function Se(f,D){G("onHangup",f,D)}Sl.onHangup=Se;function et(f){G("onMultipartyChatCreated",Pe(f))}Sl.onMultipartyChatCreated=et;function g(){G("onDeviceChange")}Sl.onDeviceChange=g;function T(f){G("onFingerprintChange",f)}Sl.onFingerprintChange=T;function P(){G("onTokenExpired")}Sl.onTokenExpired=P;function S(f,D,z=!1){G("onChatMessage",f,D,z)}Sl.onChatMessage=S;function A(f,D,z=!1){G("onCustomData",f,D,z)}Sl.onCustomData=A;function w(f,D,z,Ue,yt,zr,Jr=null){G("onRecordStarted",f,D,z,Ue,yt,zr,Jr)}Sl.onRecordStarted=w;function K(f=null,D){G("onRecordStopped",f,D)}Sl.onRecordStopped=K;function H(f){G("onLocalNetworkStatusChanged",f)}Sl.onLocalNetworkStatusChanged=H;function $(f){G("onNetworkStatusChanged",f)}Sl.onNetworkStatusChanged=$;function Ee(f,...D){G("onDebugMessage",f,...D)}Sl.onDebugMessage=Ee;function N(f,D){let z=Object.assign({},f,{memory:D});G("onStatistics",z)}Sl.onStatistics=N;function Ie(){G("onAutoplayError")}Sl.onAutoplayError=Ie;function fe(f,D,z,Ue,yt){G("onChatRoomUpdated",f,D,z,Ue,yt)}Sl.onChatRoomUpdated=fe;function Me(f){G("onPromoted",f)}Sl.onPromoted=Me;function _e(f){G("onRemoteMixedAudioStream",f)}Sl.onRemoteMixedAudioStream=_e;function Oe(f){G("onJoinLinkChanged",f)}Sl.onJoinLinkChanged=Oe;function Ct(f){G("onRoomsUpdated",f)}Sl.onRoomsUpdated=Ct;function Gt(f,D,z,Ue){G("onRoomUpdated",f,D,z,Ue)}Sl.onRoomUpdated=Gt;function tt(f){G("onRoomParticipantsUpdated",f)}Sl.onRoomParticipantsUpdated=tt;function li(f){G("onRoomSwitched",f)}Sl.onRoomSwitched=li;function Ha(f){G("onRoomStart",f)}Sl.onRoomStart=Ha;function sl(f,D=null){G("onFeedback",f,D)}Sl.onFeedback=sl;function ol(f){G("onFeaturesPerRoleChanged",f)}Sl.onFeaturesPerRoleChanged=ol;function cl(f){G("onParticipantVmojiUpdate",f)}Sl.onParticipantVmojiUpdate=cl;function dl(f,D){G("onAsrSet",f,D)}Sl.onAsrSet=dl;function ll(f,D,z){G("onAsrStarted",f,D,z)}Sl.onAsrStarted=ll;function pl(f){G("onAsrStopped",f)}Sl.onAsrStopped=pl;function ul(f,D,z,Ue){G("onAsrTranscription",f,D,z,Ue)}Sl.onAsrTranscription=ul;function ml(f,D){G("onParticipantIdChanged",f,D)}Sl.onParticipantIdChanged=ml;function hl(f){G("onVideoSuspendSuggest",f)}Sl.onVideoSuspendSuggest=hl;function gl(f){G("onSignalingMessage",typeof f=="string"?f:Pe(f))}Sl.onSignalingMessage=gl;function _l(f){G("onPromotionApproved",f)}Sl.onPromotionApproved=_l;function fl(){G("onPeerRegistered")}Sl.onPeerRegistered=fl})(Zr||(Zr={}));var v=Zr;var ta="_okcls_",qt=(()=>{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 Ws(n){let r=qt?qt.getItem(ta+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function Ks(n,r){try{qt&&qt.setItem(ta+n,JSON.stringify(r))}catch{}}function qs(n){qt&&qt.removeItem(ta+n)}var ea;(t=>{function n(i){return Ws(i)||null}t.get=n;function r(i,a){Ks(i,a)}t.set=r;function e(i){qs(i)}t.remove=e})(ea||(ea={}));var ft=ea;var zt=null,Yi=null,ir=null,ar=[],nr=[],rr=[],$e=null,ze=null,sr=null,or=!1,cr=!1,Qi,$t,Xi,Ii=null,ia=null,ra="",sn=null,Zi=[],er=null,on=navigator.appVersion,$s=navigator.appName,Be=navigator.userAgent,st={},_t=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(_t||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(_t||(_t={}));var wt=class{constructor(r,e=!1,t=u.videoMaxWidth,i=u.videoMaxHeight,a=u.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:u.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let l=ve.getMicrophones(),p,m;if(ze&&(m=ze.groupId,p=ze.deviceId),typeof r=="string")m=l.find(E=>E.deviceId===r)?.groupId,p=r;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,p=h.deviceId)}m&&this.supportedConstraints.groupId?s.groupId={exact:m}:p&&(s.deviceId={exact:p})}let c=!1;if(e){c={width:{min:u.videoMinWidth,max:t,ideal:t},height:{min:u.videoMinHeight,max:i,ideal:i},aspectRatio:{ideal:u.videoAspectRatio},frameRate:{ideal:a}};let l=ve.getCameras(),p,m;if($e&&(m=$e.groupId,p=$e.deviceId),typeof e=="string")m=l.find(E=>E.deviceId===e)?.groupId,p=e;else if(!$e&&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,p=h.deviceId)}m&&this.supportedConstraints.groupId?c.groupId={exact:m}:p&&(c.deviceId={exact:p}),u.videoFacingMode&&(c.facingMode={ideal:u.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}},aa=class extends wt{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=u.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:u.audioShareSystemInclude?"include":"exclude",windowAudio:u.audioShareWindowInclude?"include":"exclude",controller:this.captureController})}},Dt=class Dt{constructor(){o(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(Dt._lockId)throw y.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 dr=Dt;async function cn(){cr=!1,or=!1,zt=null;let n={camera:ve.getSavedCamera(),microphone:ve.getSavedMicrophone(),output:ve.getSavedOutput()};await na(),zs("devicechange",n),v.onDeviceChange()}function zs(n,...r){if(st[n])for(let e of st[n])e(...r)}async function na(){return zt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!Yi&&navigator.mediaDevices.addEventListener&&(Yi=I.debounce(cn,u.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",Yi)),!ir&&Si.isSupported()&&(ir=new Si,await ir.init((n,r)=>{switch(r){case"denied":case"prompt":Yi?.();break}})),zt=navigator.mediaDevices.enumerateDevices().then(n=>{ar=n.filter(i=>i.kind==="videoinput"?(i.label&&(or=!0),!0):!1),nr=n.filter(i=>i.kind==="audioinput"?(i.label?cr=!0:ve.isMobile()&&ve.browserName()==="Firefox"&&(cr=or),!0):!1),rr=n.filter(i=>i.kind==="audiooutput");let r=$e?.deviceId??ft.get("videoinput"),e=ze?.deviceId??ft.get("audioinput"),t=sr?.deviceId??ft.get("audiooutput");return $e=ar.find(i=>i.deviceId===r)||null,ze=nr.find(i=>i.deviceId===e)||null,sr=rr.find(i=>i.deviceId===t)||rr[0]||null,zt=Promise.resolve(n),n}).catch(()=>(zt=null,[]))))}async function Js(){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]);sn=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function Ys(n){if($e&&ze)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=>{!ze&&e.kind==="audio"?ze=r(ve.getMicrophones(),e):!$e&&e.kind==="video"&&($e=r(ve.getCameras(),e))})}async function vi(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 dr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await cn(),Ys(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()?ne.CAMERA_PERMISSION:ne.MIC_PERMISSION;break;case"OverconstrainedError":r=ne.OVERCONSTRAINED;break;case"TypeError":r=ne.UNKNOWN;break;case"AbortError":case"NotReadableError":r=n.isVideoRequested()?ne.CAMERA_ACCESS:ne.MIC_ACCESS;break;case"Error":if(i.message==="MediaSource is busy"){r=n.isVideoRequested()?ne.CAMERA_ACCESS:ne.MIC_ACCESS;break}}if(n.canSimplify())return vi(n.simplify(),r);let a=r||ne.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function Qs(){if(!(Ii||ve.browserName()!=="Firefox"||!navigator.mediaDevices?.getUserMedia))try{ve.hasMicrophonePermission()||v.onPermissionsRequested(),Ii=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(n){d.warn("Firefox microphone permission warmup failed",n)}}async function Xs(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new dr;try{r.busy();let e=await navigator.mediaDevices.getDisplayMedia(n.getNative()),t=e?.getVideoTracks()[0];if(t){let i=t.getSettings()?.displaySurface;if(d.debug(`Got display media track: ${t.id} (${i})`),t.contentHint="text",n.captureController&&(i==="browser"||i==="window"))try{n.captureController.setFocusBehavior("no-focus-change")}catch(a){d.warn("Failed to set focus behavior",a)}}return e}catch(e){switch(e.name){case"PermissionDeniedError":case"NotAllowedError":case"SecurityError":throw ne.SCREEN_PERMISSION;default:throw ne.SCREEN_ACCESS}}finally{r.free()}}function tr(){return Zi.length||(Zi=(()=>{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]:$s,n&&n[1]||i[2]||on,r,e,t]})()),Zi}var ve;(he=>{async function n(){await na(),await Js()}he.init=n;function r(){return ar}he.getCameras=r;function e(){return nr}he.getMicrophones=e;function t(){return rr}he.getOutput=t;function i(){return ar.length>0}he.hasCamera=i;function a(){return nr.length>0}he.hasMicrophone=a;function s(){return $e}he.getSavedCamera=s;function c(){return ze}he.getSavedMicrophone=c;function l(){return sr}he.getSavedOutput=l;function p(){return u.videoFacingMode}he.getVideoFacingMode=p;function m(){return or}he.hasCameraPermission=m;function h(){return cr}he.hasMicrophonePermission=h;function E(){return ir?.getPermissionState("microphone")??null}he.getMicrophonePermissionState=E;function b(V=!1){return h()?i()&&V?m():!0:!1}he.hasPermissions=b;function C(){Ii&&(At(Ii),Ii=null)}he.releaseFirefoxMicrophonePermissionWarmup=C;async function W(V=!1,te=!0,ce=!0){!V&&!te?await Qs():he.releaseFirefoxMicrophonePermissionWarmup();let Se=a()&&te,et=i()&&V,g;if(!Se&&!et)g=new MediaStream;else try{g=await vi(new wt(Se,et))}catch{g=new MediaStream}return!g.getVideoTracks().length&&ce&&g.addTrack(he.getBlackMediaTrack()),!g.getAudioTracks().length&&ce&&g.addTrack(he.getSilentMediaTrack()),g}he.getUserMedia=W;async function q(V,te){let ce=V&&!u.consumerFastScreenShare?u.fastScreenShareWidth:window.screen.width,Se=V&&!u.consumerFastScreenShare?u.fastScreenShareHeight:window.screen.height,et=u.getScreenFrameRate(V);return Xs(new aa(ce,Se,et,te))}he.getScreenMedia=q;async function J(V=!1,te){let ce=V?u.videoEffectMaxWidth:u.videoMaxWidth,Se=V?u.videoEffectMaxHeight:u.videoMaxHeight;return vi(new wt(!1,!0,ce,Se,te))}he._getUserVideo=J;async function Re(V,te){let ce=te?.width||u.videoMaxWidth,Se=te?.height||u.videoMaxHeight;return vi(new wt(!1,V||!0,ce,Se))}he.getUserVideo=Re;async function De(V){return vi(new wt(V||!0,!1))}he.getUserAudio=De;async function oe(V,te){let[ce]=V.getVideoTracks();if(!ce)throw new Error("Video track not found in stream");return qi(ce,te)}he.setResolution=oe;async function re(V,te){let Se=(await na()).find(et=>et.kind===V&&et.deviceId===te);return Se?(V==="videoinput"?$e=Se:V==="audioinput"?ze=Se:V==="audiooutput"&&(sr=Se),ft.set(V,te),Se):null}he._saveDeviceId=re;function Y(){if(!Xi||Xi.readyState==="ended"){let V=he.getAudioContext(),te=V.createMediaStreamDestination(),ce=V.createGain();ce.gain.value=1e-5,ce.connect(te),ce.connect(V.destination);let Se=V.createOscillator();Se.type="sine",Se.frequency.value=0,Se.connect(ce),Se.start(),Xi=te.stream.getAudioTracks()[0]}return Object.assign(Xi.clone(),{enabled:!1})}he.getSilentMediaTrack=Y;function Ht(V=u.videoMinWidth,te=u.videoMinHeight){$t||($t=document.createElement("canvas")),$t.width=V,$t.height=te;let ce=$t.getContext("2d");return ce.rect(0,0,V,te),ce.fillStyle="black",ce.fill(),(!Qi||Qi.readyState==="ended")&&(Qi=$t.captureStream(u.videoFrameRate).getVideoTracks()[0]),Object.assign(Qi.clone(),{enabled:!1})}he.getBlackMediaTrack=Ht;function wa(){if(Kr()==="Edge"&&Number(qr())<70)return!1;try{let V=window;return"mediaDevices"in V.navigator&&"getUserMedia"in V.navigator.mediaDevices&&V.RTCPeerConnection&&V.RTCIceCandidate&&V.RTCSessionDescription&&V.HTMLCanvasElement&&V.HTMLCanvasElement.prototype.captureStream&&V.RTCRtpSender&&V.RTCRtpSender.prototype.replaceTrack&&V.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}he.isBrowserSupported=wa;function ka(){return!!navigator.mediaDevices.getDisplayMedia}he.isScreenCapturingSupported=ka;function Oa(){let V=he.browserName()==="Safari"&&he.browserVersion()==="15"&&he.browserSubVersion()==="1",te=he.browserName()==="Opera",ce=he.browserName()==="Yandex";return V||te||ce}he.isBrokenH264Decoder=Oa;function ci(){return he.browserName()==="Yandex"&&he.os()==="Windows"||u.simulcast}he.isBrokenVP9Encoder=ci;function di(){let V=he.browserName()==="Safari"&&Number(he.browserVersion())===17&&[4,5,6].includes(Number(he.browserSubVersion())),te=he.os()==="Windows"&&he.osVersion()===10;return V||te}he.isBrokenVP9Decoder=di;function ae(){return he.browserName()==="Firefox"&&Number(he.browserVersion())<60}he.isOldDataChannelDescription=ae;function xa(){return!(he.baseChromeVersion()&&he.isMobile())}he.canPreferH264=xa;function Na(){return!(he.browserName()==="Firefox"||he.browserName()==="Safari")}he.isSimulcastSupportedByBrowser=Na;function ee(){return ra||(ra=(()=>{let V={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let te in V)if(Object.hasOwn(V,te)&&V[te].test(Be))return te;return"Unknown"})()),ra}he.os=ee;function La(){return sn}he.osVersion=La;function Wr(){return ia===null&&(ia=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(on)),ia}he.isMobile=Wr;function Kr(){return tr()[0]}he.browserName=Kr;function qr(){return tr()[1]}he.browserVersion=qr;function Ua(){return tr()[3]}he.baseChromeVersion=Ua;function Ba(){return er||(er=new(window.AudioContext||window.webkitAudioContext)),er.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),er}he.getAudioContext=Ba;function $r(){return tr()[4]}he.browserSubVersion=$r;function Fa(){return he.baseChromeVersion()>=105&&!he.isMobile()}he.isAudioShareSupported=Fa;function Va(V,te){st[V]||(st[V]=[]),st[V].push(te)}he.addEventListener=Va;function ja(V,te){if(st[V])if(!te)delete st[V];else{let ce=st[V].indexOf(te);ce>-1&&st[V].splice(ce,1)}}he.removeEventListener=ja})(ve||(ve={}));var M=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 ${u.sdkVersion}`,u.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]}};o(We,"_list",[]),o(We,"_conversationId",null);var xe=We;var lr=class{constructor(){o(this,"_items",[])}get length(){return this._items.length}push(...r){this._items.push(...r)}merge(r){this._items.push(...r._items)}shift(){return this._items.shift()||null}bisect(){let r=this.length>1?Math.floor(this.length/2):1;this._items=this._items.slice(r)}head(){return this._items[0]||null}tail(){let r=this._items.length;return r?this._items[r-1]:null}clear(){this._items=[]}toString(){return this._items.length?JSON.stringify(this._items,(r,e)=>e instanceof Error?String(e):e):""}};var sa=2*1024*1024,dn=512*1024,Jt=100*1024,Zs=5,ca="_okcls_logs_session_",eo=3e4,da=class{constructor(){o(this,"_items",[]);o(this,"_itemsSize",0);o(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){ln(e);continue}let i=un(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&&(ln(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>sa||this.length>Zs-1||this.size+r>this.available);)this.deleteOldestItem()}};function pn(){return`${ca}${Date.now()}`}function un(n){return new Blob([n]).size}function ln(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function pr(){let n=St.toString();if(!we.available||!n)return;let r=un(n);if(r>dn){St.bisect(),pr();return}we.cleanup(Jt+r);try{window.localStorage.setItem(ur,n)}catch(e){if(console.warn("Failed to write log to storage",e),we.storageSize=we.size+r,we.cleanup(Jt+r),we.available>=Jt+r){pr();return}if(r>Jt){St.bisect(),pr();return}we.storageSize=0;return}r>dn&&(we.add(ur,r),ur=pn(),St.clear(),we.cleanup(Jt))}function la(){!we.available||!St.length||pr()}function to(n=!1){let r=[];try{let i=window.localStorage;for(let s of we.items){let c=i.getItem(s.key);r.push(c)}let a=St.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 io(e,t),t}function io(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 mn(n,r){if(!we.available)return;let e=new Date,t={t:e.getTime(),l:n,d:r,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};St.push(t),xe.add(t),oa||(oa=window.setTimeout(()=>{oa=null,la()},eo))}function pa(){we||(we=new da,St=new lr,ur=pn(),window.addEventListener("beforeunload",la))}var we,St,ur,oa=null;window.__VKCallsSDKLogs__=(n=!1)=>(we||pa(),la(),to(n));var ma=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(ma||{}),ua;(oe=>{let n="📞",r=(re,...Y)=>{v.onDebugMessage(re,...Y)},e=!1,t=(re,Y)=>(...Ht)=>{re(...Ht),mn(Y,Ht)},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"),p=r.bind(null,"LOG"),m=r.bind(null,"WARN"),h=r.bind(null,"ERROR");oe.debug=l,oe.log=p,oe.warn=m,oe.error=h;function q(){return e}oe.enabled=q;function J(re){e=re,u.debugLog&&pa(),re?(oe.debug=u.debugLog?t(i,"DEBUG"):i,oe.log=u.debugLog?t(a,"LOG"):a,oe.warn=u.debugLog?t(s,"WARN"):s,oe.error=u.debugLog?t(c,"ERROR"):c):(oe.debug=u.debugLog?t(l,"DEBUG"):l,oe.log=u.debugLog?t(p,"LOG"):p,oe.warn=u.debugLog?t(m,"WARN"):m,oe.error=u.debugLog?t(h,"ERROR"):h)}oe.toggle=J;function Re(re,...Y){switch(re){case"DEBUG":(0,oe.debug)(...Y);break;case"LOG":(0,oe.log)(...Y);break;case"WARN":(0,oe.warn)(...Y);break;case"ERROR":(0,oe.error)(...Y);break}}oe.send=Re;function De(re,...Y){}oe.test=De})(ua||(ua={}));var d=ua;var ao="kf";function Yt(n){return n.stopStream}function ha(n){return n.keyFrameRequested}function hn(n){if(Yt(n))return"ss";if(ha(n))return ao;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||{}),gn="s",_n="m";function it(n){return n.participantId+(n.mediaType?Wt+gn+n.mediaType:"")+(n.streamName?Wt+_n+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 c of r)switch(c.charAt(0)){case gn:t=no(c.slice(1));break;case _n:i=c.slice(1);break;case Ki: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 no(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),so(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 so(n){return n.buffer!==void 0}function mr(n){let r=ArrayBuffer.isView(n)?new DataView(n.buffer,n.byteOffset,n.byteLength):new DataView(n),e=0;return{peek(){return r.getUint8(e)},get(t){e+=t;let i=r.byteOffset;return r.buffer.slice(i+e-t,i+e)},getI8(){return r.getInt8(e++)},getI16(){return e+=2,r.getInt16(e-2)},getI32(){return e+=4,r.getInt32(e-4)},getI64(){e+=8;let t=r.getInt32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getUi8(){return r.getUint8(e++)},getUi16(){return e+=2,r.getUint16(e-2)},getUi32(){return e+=4,r.getUint32(e-4)},getUi64(){e+=8;let t=r.getUint32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getF32(){return e+=4,r.getFloat32(e-4)},getF64(){return e+=8,r.getFloat64(e-8)}}}var fn=0,Sn=1,oo=2,co=3,lo=4,po=5,uo=6,mo=7,ho=0,go=1,_o=2,ot=0,fo=0,So=0,vo=1,hr=class{constructor(){o(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=rt();L.Int.enc(t,fn),L.Int.enc(t,ot),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,go);else if(ha(i))L.Int.enc(a,_o);else if(L.Int.enc(a,ho),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,So);break;case"cn":L.Int.enc(a,vo);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,Sn),L.Int.enc(t,ot),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,oo),L.Int.enc(t,ot),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,co),L.Int.enc(t,ot),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,lo),L.Int.enc(t,ot),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,po),L.Int.enc(t,ot),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,uo),L.Int.enc(t,ot),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=rt();L.Int.enc(t,mo),L.Int.enc(t,ot),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 tn(r);e=mr(s)}else e=mr(r);let t=L.Int.dec(e),i=L.Int.dec(e);if(i!==ot){d.warn("Unsupported version for command type: "+t+", version "+i);return}if(L.Int.dec(e)!==fo){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case fn:return this.deserializeUpdateDisplayLayoutResponse(e);case Sn: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=mr(a),c=L.Any.dec(s);if(typeof c=="string")i[c]=L.Int.dec(s);else{let l=c,p=it(this.participantIdRegistry?.getStreamDescription(l));i[p]=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 vn=(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))(vn||{}),Z=vn;var Io=1e3;function pe(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 vt(n,r){return e=>e[n]===r}function Eo(n){return(r,e)=>e[n]-r[n]}function Ei(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function In(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 En(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function To(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(En).then(In)}function Tn(n){let r=n.filter(vt("type","candidate-pair")).sort(Eo("priority")).find(ga(vt("nominated",!0),vt("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(vt("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(vt("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=Ei("id",n),i=e?n.filter(ga(vt("type","remote-inbound-rtp"))):n.filter(ga(vt("type","inbound-rtp"),vt("type","outbound-rtp")));return M.browserName()==="Firefox"&&(i=Object.values(i.reduce((a,s)=>{if(!a[s.ssrc])a[s.ssrc]=s;else{let c=Object.assign({},a[s.ssrc],s),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,p=a.type,m=a.codecId;if(!p||!s||!c)return null;let h={ssrc:s,type:p,kind:c,bytesReceived:pe(a,"bytesReceived"),bytesSent:pe(a,"bytesSent"),headerBytesReceived:pe(a,"headerBytesReceived"),headerBytesSent:pe(a,"headerBytesSent"),jitter:pe(a,"jitter"),packetsLost:pe(a,"packetsLost"),packetsReceived:pe(a,"packetsReceived"),packetsSent:pe(a,"packetsSent"),fractionLost:pe(a,"fractionLost"),pliCount:pe(a,"pliCount"),firCount:pe(a,"firCount"),nackCount:pe(a,"nackCount"),userId:r[s],freezeCount:pe(a,"freezeCount",0),totalFreezesDuration:pe(a,"totalFreezesDuration",0)},E="mid"in a&&typeof a.mid=="string"?a.mid:void 0,b="rid"in a&&typeof a.rid=="string"?a.rid:void 0;if(E&&(h.mid=E),b&&(h.rid=b),c==="video"){let C=pe(a,"framesDecoded"),W=pe(a,"totalInterFrameDelay"),q=pe(a,"totalSquaredInterFrameDelay"),J=pe(a,"encoderImplementation"),Re=pe(a,"decoderImplementation");J&&(h.encoderImplementation=J),Re&&(h.decoderImplementation=Re),h.interframeDelayVariance=(q-W*W/C)/C}if(c==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=pe(a,"totalEncodeTime")??0),c==="audio"&&(h.totalSamplesReceived=pe(a,"totalSamplesReceived"),h.concealedSamples=pe(a,"concealedSamples"),h.insertedSamplesForDeceleration=pe(a,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=pe(a,"removedSamplesForAcceleration"),h.silentConcealedSamples=pe(a,"silentConcealedSamples"),h.concealmentEvents=pe(a,"concealmentEvents"),h.totalAudioEnergy=pe(a,"totalAudioEnergy")),m&&t[m]){let C=t[m];h.clockRate=C.clockRate,h.mimeType=C.mimeType,c==="audio"&&C.sdpFmtpLine&&(h.sdpFmtpLine=C.sdpFmtpLine)}if(l&&t[l]){let C=t[l];h.frameHeight=C.frameHeight,h.frameWidth=C.frameWidth,h.framesDecoded=C.framesDecoded,h.framesReceived=C.framesReceived,h.framesDropped=C.framesDropped}return fa(h)}).filter(a=>!!a)}function Rn(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=Ei("ssrc",n?.remoteRtps||[]),i=Ei("ssrc",r?.remoteRtps||[]));let a=Ei("ssrc",n.rtps),s=Ei("ssrc",r.rtps),c=(n.timestamp-r.timestamp)/1e3;return!a||!s||Object.keys(a).forEach(l=>{let p=a[l],m=s[l];if(!(!p||!m)){if(p.bytesReceived&&p.bytesReceived>m.bytesReceived&&(p.bandwidth=Math.round((p.bytesReceived-m.bytesReceived)/c),p.bandwidth+=Math.round((p.headerBytesReceived-m.headerBytesReceived)/c)),p.bytesSent&&p.bytesSent>m.bytesSent&&(p.bandwidth=Math.round((p.bytesSent-m.bytesSent)/c),p.bandwidth+=Math.round((p.headerBytesSent-m.headerBytesSent)/c)),p.packetsReceived)if(p.packetsReceived>m.packetsReceived||p.packetsLost>m.packetsLost){let h=p.packetsLost-m.packetsLost,E=p.packetsReceived-m.packetsReceived;p.packetLoss=parseFloat((100*h/(h+E)).toFixed(2))}else p.packetLoss=0;if(p.freezeCount>m.freezeCount&&(p.freezeCountDelta=p.freezeCount-m.freezeCount),p.totalFreezesDuration>m.totalFreezesDuration){let h=p.totalFreezesDuration-m.totalFreezesDuration;p.totalFreezesDurationDelta=h}if(p.framesDropped&&m.framesDropped&&p.framesDropped>m.framesDropped&&(p.framesDroppedDelta=parseFloat(((p.framesDropped-m.framesDropped)/c).toFixed(0))),e&&p.type==="outbound-rtp"&&p.kind==="video"){let h=t?.[l],E=i?.[l],b=q=>q??0,C=Math.max(0,b(h?.packetsLost)-b(E?.packetsLost)),W=Math.max(1,p.packetsSent-m.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(C/W*100)}}}}),n}async function Cn(n,r,e={},t=!1){let i=await To(n),a={timestamp:Date.now(),transport:Tn(i),rtps:_a(i,e)};return t&&(a.remoteRtps=_a(i,e,!0)),r?Rn(a,r,t):(await I.delay(Io),Cn(n,a,e,t))}function Ro(n){performance.clearMarks(n),performance.mark(n)}function Co(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`${Z.SCREENSHARE_FIRST_FRAME}_${bo(n)}`}function bo(n){return typeof n=="string"?n:JSON.stringify(n)}var ue={distinctById:In,rtcStatsToArray:En,extractTransport:Tn,extractRtps:_a,delta:Rn,collectStats:Cn,setMark:Ro,clearMark:Co,measureMark:yo,getMarkNameScreenshareFirstFrame:Po};var Je=class Je{constructor(){o(this,"_eventualLogs",new Set)}static create(){Je._instance=new Je}static logCallStat(r){if(Je._instance?._eventualLogs.size){for(let e of Je._instance._eventualLogs)Object.assign(e,{call_topology:r.call_topology,local_address:r.local_address,local_connection_type:r.local_connection_type,network_type:r.network_type,remote_address:r.remote_address,remote_connection_type:r.remote_connection_type,transport:r.transport}),y.logClientStats(e);Je._instance._eventualLogs.clear()}y.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=ue.measureMark(r.name)),r.value!==null&&Je._instance?._eventualLogs.add(r)}static destroy(){Je._instance?._destroy(),Je._instance=null}_destroy(){this._eventualLogs.clear()}};o(Je,"_instance",null);var be=Je;var Sa={connected:{wt:Z.WEBTRANSPORT_CONNECTED,ws:Z.WEBSOCKET_CONNECTED},reconnected:{wt:Z.WEBTRANSPORT_RECONNECTED,ws:Z.WEBSOCKET_RECONNECTED},failed_pings:{wt:Z.WEBTRANSPORT_FAILED_PINGS,ws:Z.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:Z.WEBTRANSPORT_FAILED_EXCEPTION,ws:Z.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:Z.WEBTRANSPORT_TIMEOUT,ws:Z.WEBSOCKET_TIMEOUT},restart:{wt:Z.WEBTRANSPORT_RESTART,ws:Z.WEBSOCKET_RESTART}};var Ti=class{constructor(r){o(this,"q");o(this,"inits",[]);o(this,"n",[1,2,3,4,5]);o(this,"np",[1,1,1,1,1]);o(this,"qv",[]);if(!(r>0&&r<1))throw new Error("q must be in (0,1)");this.q=r}add(r){if(this.inits.length<5){this.inits.push(r),this.inits.length===5&&this.bootstrap();return}let e=0;if(r<this.qv[0])this.qv[0]=r,e=0;else if(r>=this.qv[4])this.qv[4]=r,e=3;else for(;!(r<this.qv[e+1]);)e++;for(let t=0;t<5;t++)this.n[t]+=t<=e?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let t=1;t<=3;t++){let i=this.np[t]-this.n[t];if(i>=1&&this.n[t+1]-this.n[t]>1||i<=-1&&this.n[t]-this.n[t-1]>1){let a=Math.sign(i),s=this.qv[t]+a/(this.n[t+1]-this.n[t-1])*((this.n[t]-this.n[t-1]+a)*(this.qv[t+1]-this.qv[t])/(this.n[t+1]-this.n[t])+(this.n[t+1]-this.n[t]-a)*(this.qv[t]-this.qv[t-1])/(this.n[t]-this.n[t-1]));s>this.qv[t-1]&&s<this.qv[t+1]?this.qv[t]=s:this.qv[t]=this.qv[t]+a*(this.qv[t+a]-this.qv[t])/(this.n[t+a]-this.n[t]),this.n[t]+=a}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let r=[...this.inits].sort((a,s)=>a-s),e=this.q*(r.length-1),t=Math.floor(e),i=e-t;return t+1<r.length?r[t]*(1-i)+r[t+1]*i:r[t]}return this.qv[2]}bootstrap(){this.inits.sort((r,e)=>r-e),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}};var gr=class{constructor(){o(this,"n",0);o(this,"mean",0)}add(r){this.n++;let e=r-this.mean;this.mean+=e/this.n}get avg(){return this.n?this.mean:NaN}};var ct=class{constructor(){o(this,"count",0);o(this,"minVal",1/0);o(this,"maxVal",-1/0);o(this,"mean",new gr);o(this,"p50",new Ti(.5));o(this,"p95",new Ti(.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 yn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(yn||{}),Ae=yn;var Pn=(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))(Pn||{}),B=Pn;var bn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(bn||{}),dt=bn;var{isObject:An,isObjectsEquals:Ao}=I;function _r(n,r){return n===null||r===null?n===null&&r===null:n.maxDimension!==r.maxDimension||n.maxBitrateK!==r.maxBitrateK||n.maxFramerate!==r.maxFramerate||n.degradationPreference!==r.degradationPreference||n.scalabilityMode!==r.scalabilityMode||An(n.bitrates)&&An(r.bitrates)&&!Ao(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function fr(n,r){return!(!_r(n.camera,r.camera)||!_r(n.screenSharing,r.screenSharing)||!_r(n.fastScreenSharing,r.fastScreenSharing))}function 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 Mn(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var It=class It{constructor(){o(this,"_codecUsages",new Map);o(this,"getCurrentTransportTopology",()=>{})}static create(r){let e=new It;e.getCurrentTransportTopology=r,It._instance=e}static reportUsage(r){let e=It._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let i=r.rtps.filter(a=>a.type==="outbound-rtp"&&!a.mid?.endsWith("s"));u.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,p=[c,"encoder",l].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:p,totalEncodeTime:(a.totalEncodeTime??0)*1e3,audioCodecParams:a.sdpFmtpLine,topology:t})}})}saveUsage({kind:r,codecName:e,totalEncodeTime:t,audioCodecParams:i,topology:a}){let s=this._codecUsages.get(r);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(r,{...s,totalEncodeTime:t,topology:a});return}this._codecUsages.set(r,{kind:r,codecName:e,audioCodecParams:i,totalEncodeTime:t,topology:a})}report(r){if(r.kind==="video"&&r.totalEncodeTime===0)return;let e={name:Z.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),y.logClientStats(e)}static destroy(){It._instance?._destroy(),It._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};o(It,"_instance",null);var at=It;var Ot=class extends de{constructor(e,t){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_state","IDLE");o(this,"_pc",null);this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var Dn="videochat-epi",Mo=5e3,Do=500,Et=class extends de{constructor(e,t,i=!1){super();o(this,"_previousPerfStatReportTimestamp",0);o(this,"_previousNetworkStatReportTimestamp",Date.now());o(this,"_previousCallStatReportTimestamp",Date.now());o(this,"_previousCallStatReport",null);o(this,"_screenShareStats",[]);o(this,"_signaling");o(this,"_directTopology");o(this,"_handleScreenSharingStat",e=>{this._screenShareStats.push(e)});o(this,"_handleTransportStateChanged",e=>{(this._directTopology&&e==="CONNECTED"||!this._directTopology&&e==="OPENED")&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())});this._signaling=t,this._directTopology=i,this.subscribe(e,"REMOTE_DATA_STATS",this._handleStats.bind(this)),this.subscribe(e,"SCREEN_SHARING_STAT",this._handleScreenSharingStat.bind(this)),this.subscribe(e,"STATE_CHANGED",this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(Dn)||"",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&&u.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+Mo<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+Do<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),u.callStatReportEnabled&&this._previousCallStatReportTimestamp+u.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(Dn,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:kn(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:kn(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let i=!1,a=!1;for(e.inbound.rtps.reduce((p,m)=>(m.kind==="video"?(i=!0,m.framesReceived&&(p.jitter_video=p.jitter_video*p.inbound_video_count/(p.inbound_video_count+1)+m.jitter*1e3/(p.inbound_video_count+1),p.interframe_delay_variance=p.interframe_delay_variance*p.inbound_video_count/(p.inbound_video_count+1)+(m.interframeDelayVariance||0)*1e6/(p.inbound_video_count+1),p.inbound_video_count++),p.frames_dropped+=m.framesDropped||0,p.nack_sent+=m.nackCount,p.pli_sent+=m.pliCount,p.fir_sent+=m.firCount,p.freeze_count+=m.freezeCountDelta||0,p.total_freezes_duration+=m.totalFreezesDurationDelta||0):(a=!0,m.totalSamplesReceived&&(p.jitter_audio=p.jitter_audio*p.inbound_audio_count/(p.inbound_audio_count+1)+m.jitter*1e3/(p.inbound_audio_count+1),p.total_audio_energy=p.total_audio_energy*p.inbound_audio_count/(p.inbound_audio_count+1)+(m.totalAudioEnergy||0)/(p.inbound_audio_count+1),p.inbound_audio_count++),p.total_audio_samples_received+=m.totalSamplesReceived||0,p.inserted_audio_samples_for_deceleration+=m.insertedSamplesForDeceleration||0,p.removed_audio_samples_for_acceleration+=m.removedSamplesForAcceleration||0,p.concealed_audio_samples+=m.concealedSamples||0,p.silent_concealed_audio_samples+=m.silentConcealedSamples||0,p.audio_concealment_events+=m.concealmentEvents||0),p),t),e.outbound.rtps.reduce((p,m)=>(m.kind==="video"?(p.nack_received+=m.nackCount,p.pli_received+=m.pliCount,p.fir_received+=m.firCount,p.packets_sent_video+=m.packetsSent):p.packets_sent_audio+=m.packetsSent,p),t),e.remoteInbound.rtps.reduce((p,m)=>(m.kind==="video"?p.packets_lost_video+=m.packetsLost:p.packets_lost_audio+=m.packetsLost,p),t);this._screenShareStats.length;){let p=this._screenShareStats.pop();p?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=p.freeze_duration)}let s={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(navigator.hardwareConcurrency&&(s.cpu_hardware_concurrency=navigator.hardwareConcurrency),i&&!Sr(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!Sr(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!Sr(t.interframe_delay_variance)&&(s.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(s.freeze_count=t.freeze_count,s.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(s.ss_freeze_count=t.ss_freeze_count,s.ss_total_freezes_duration=t.ss_total_freezes_duration),a&&!Sr(t.total_audio_samples_received)){let p=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),m=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),h=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),E=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),b=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/p*1e3),s.removed_audio_samples_for_acceleration=xt(h/p*1e3),s.concealed_audio_samples=xt(E/p*1e3),s.concealed_silent_audio_samples=xt(b/p*1e3),s.concealment_audio_avg_size=xt(E/C),s.total_audio_energy=t.total_audio_energy}wn(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),wn(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 p=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=xt(p/c*100)}if(l>0){let p=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=xt(p/l*100)}be.logCallStat(s),u.enableLogPerfStatReport&&d.log("Sent call stats",s),this._previousCallStatReport=t}};function wn(n,...r){for(let e of r)if(!Object.hasOwn(n,e)||n[e]===void 0)return!1;return!0}function kn(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function Sr(n){return n===void 0}function xt(n){return Number.isNaN(n)?0:n}var Ci=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 On=.25,xn=.35,wo=85,ko=.1,Oo=1.5,xo=.1,No=1,Lo=.6,Uo=.3;var yi=class extends de{constructor(e){super();o(this,"_signaling");o(this,"_localNetworkStat");o(this,"_remoteNetworkStat");o(this,"_lastNetworkStat");o(this,"_networkLimits",{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}});o(this,"_lastStatSentTimestamp",0);o(this,"_currentState","good");this._signaling=e,this._localNetworkStat={rtt:new Ci(On,On),loss:new Ci(xn,xn),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)/wo);for(let s=0;s<a;s++)i*=1-ko;return i}_calcLossRating(e){let t=typeof e=="number"?e:e.getValue(),i=1;if(isNaN(t))return i;let a=Math.round((t-this._networkLimits.goodNet.loss)/Oo);for(let s=0;s<a;s++)i*=1-xo;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*No;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>=Lo?"good":e>=Uo?"medium":"bad"}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol==="tcp",i=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),a=e.inbound.rtps.reduce((h,E)=>Math.max(h,E.packetLoss||0),0),s={rtt:this._localNetworkStat.rtt.update(i),loss:this._localNetworkStat.loss.update(a)};if(t){let h=e.outbound.rtps.reduce((E,b)=>E+(b.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let c=Date.now(),l=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),p=Math.max(Math.round(l*10)/10,.1),m=this._getNetworkState(p);(t||m!==this._currentState||c-this._lastStatSentTimestamp>u.networkStatisticsInterval)&&(this._lastStatSentTimestamp=c,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{d.warn("Unable to send [bad-net]",h)})),this._currentState=m,this._triggerEvent("NETWORK_STATUS",p)}reportRemote(e){let{rtt:t,loss:i,bitrate:a}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=i||0,this._remoteNetworkStat.bitrate=a||0}};var Bo=30*1e3,Pi=class n extends Ot{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 Et(this,i,!0),this._directStatReporter=new yi(i),this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applySettings.bind(this)),this.subscribe(this._directStatReporter,"NETWORK_STATUS",this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:u.iceServers,iceTransportPolicy:u.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={},u.vmoji&&this._createDataChannel(this._pc,dt.animoji,c=>{this._animojiDataChannel=c,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(c){y.log(k.ERROR,"addTrack-direct"),d.error("Unable to add media source tracks",c,{participantId:this._participantId}),this._failedOnCreate=c;return}this._createOffer(!1).catch(c=>{this._state==="IDLE"?this._failedOnCreate=c:this.close(c)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return["IDLE","CLOSED","FAILED"].includes(this.getState())}async open(e=null){if(this._isOpen){d.warn("DirectTransport: Already opened",{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(d.debug("DirectTransport: Open transport",{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(i){y.log(k.ERROR,"addTrack-direct"),d.error("DirectTransport: Unable to add media source tracks",i,{participantId:this._participantId}),this.close(i);return}this._setState("OPENED");let t=e;if(!e){let i=Object.keys(this._remoteSDP);t=i[i.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){fr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(u.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 B.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case B.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case B.CUSTOM_DATA:Object.hasOwn(e.data,"sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,i=I.getPeerIdString(e.peerId);I.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(i,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(i,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){d.debug("Add remote ice candidate",{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(i){throw y.log(k.ERROR,"addIceCandidate-direct"),d.error("Unable to add remote ice candidate",i,{participantId:this._participantId,candidate:t}),i}}else d.debug("Cache remote ice candidate",{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){d.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let i of t)try{await this._addIceCandidate(e,i)}catch{}}async _setRemoteDescription(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc){if(this._lastRemoteSDP?.sdp===t.sdp)return;this._lastRemoteSDP=t,t=n._patchRemoteDescription(t),d.debug("Add remote description",{participantId:this._participantId,sdp:t}),this._calcFingerprint(t.sdp);try{await this._pc.setRemoteDescription(t),await this._setRemoteCandidates(e),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(i){throw y.log(k.ERROR,"setRemoteDescription-direct"),d.error("Unable to set remote description",i,{participantId:this._participantId,sdp:t}),i}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,u.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:u.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&&(y.log(k.ICE_CONNECTION_TYPE,e.local.type),d.debug("Selected ICE candidates",e))}),this._startStatInterval()}_onConnectionStateChange(){switch(d.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),y.log(k.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._markConnected();break;case"failed":case"disconnected":this._reconnectionPrevented?this.close(new Error(`Ice connection ${this._pc.connectionState}`)):(this._setState("RECONNECTING"),this._startReconnection());break;case"closed":this.close(new Error("Ice connection closed"));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(d.log("Waiting for reconnection...",{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},u.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(d.log("Switch topology DIRECT to SERVER",{participantId:this._participantId}),this._signaling.switchTopology("SERVER"))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(y.log(k.ICE_RESTART),d.log("Ice restart",{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):d.debug("Waiting for ice restart...",{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,d.error("Ice restart failed",{participantId:this._participantId}),y.log(k.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},u.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};d.debug("Create offer",{participantId:this._participantId,options:t});let i;try{i=await this._pc?.createOffer(t),d.debug("Created offer",{participantId:this._participantId,offer:i}),i=n._patchLocalDescription(i)}catch(a){throw d.error("Unable to create offer",a,{participantId:this._participantId}),y.log(k.ERROR,"createOffer-direct"),a}try{return d.debug("Set local description",{participantId:this._participantId,offer:i}),this._calcFingerprint(i.sdp),await this._pc?.setLocalDescription(i),i}catch(a){throw d.error("Unable to set local description",a,{participantId:this._participantId}),y.log(k.ERROR,"setLocalDescription-direct"),a}}async _createAnswer(){d.debug("Create answer",{participantId:this._participantId});let e;try{e=await this._pc?.createAnswer(),d.debug("Created answer",{participantId:this._participantId,answer:e}),e=n._patchLocalDescription(e)}catch(t){throw d.error("Unable to create answer",t,{participantId:this._participantId}),y.log(k.ERROR,"createAnswer-direct"),t}try{return d.debug("Set local description",{participantId:this._participantId,answer:e}),this._calcFingerprint(e.sdp),await this._pc?.setLocalDescription(e),e}catch(t){throw d.error("Unable to set local description",t,{participantId:this._participantId}),y.log(k.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!M.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,u.preferH264&&M.canPreferH264(),M.isBrokenH264Decoder(),u.preferVP9,t&&u.audioNack),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,u.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}),y.log(k.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._checkPPTNetwork(i),this._directStatReporter.reportLocal(i),this._triggerEvent("REMOTE_DATA_STATS",i),this._statInterval=window.setTimeout(e,u.statisticsInterval)})};this._statInterval=window.setTimeout(e,u.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:M.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:s.width,height:s.height,bitrate:a.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(c)).supported||!1}catch(l){return d.warn("Failed to get encodingInfo",c,l),!1}}async _checkPPTNetwork(e){if(!u.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>Bo)||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.getMediaSettings().isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState==="connected"&&(this._prevConsumerSettings=I.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{negotiated:!0,id:1});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),a.onerror=c=>{d.error(`[${t}] data channel error`,c)},i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)}}};var Nn=(t=>(t.AUDIO_MIX="audio-mix",t.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",t.TRANSPARENT_AUDIO_TRACK_PREFIX="ta",t))(Nn||{}),Ne=Nn;var Fo=16,Ir=class n{constructor(r,e,t){o(this,"_datachannel");o(this,"_participantIdRegistry");o(this,"_asrCallback");o(this,"_textDecoder");d.debug("AsrReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._asrCallback=t,this._textDecoder=new TextDecoder,this._datachannel.onmessage=i=>this._onDataChannelMessage(i.data)}static parse(r){let e=new DataView(r),t=e.getUint8(0),i=e.getUint8(1);if(i!==0)throw new Error(`Unsupported message type. Message type: ${i}`);let a=e.getUint16(2),s=e.getUint32(4),c=e.getUint32(8),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(Fo)}}_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 Tt=class Tt{constructor(){o(this,"_value",1)}get value(){return this._value}set value(r){this._value=r}};o(Tt,"_instance",null),o(Tt,"getInstance",()=>(Tt._instance||(Tt._instance=new Tt),Tt._instance));var Xt=Tt;var lt=require("messagepack");var Er=class{constructor(){o(this,"streamDescriptionByCompactId",new Map);o(this,"compactIdByStreamDescription",new Map)}getStreamDescription(r){return this.streamDescriptionByCompactId.get(r)}getCompactId(r){return this.compactIdByStreamDescription.get(r)}handleMessage(r){let e=new Uint8Array(r),t=e[0],i=e.subarray(1);switch(t){case 1:let a=(0,lt.decode)(i);return Object.entries(a).forEach(([b,C])=>{let W=Qt(b);this.streamDescriptionByCompactId.set(C,W),this.compactIdByStreamDescription.set(b,C)}),null;case 2:case 4:let s=(0,lt.decode)(i),c=[];for(let b of s){let C=this.getStreamDescription(b);C&&c.push(C.participantId)}return t===2?{type:"notification",notification:B.AUDIO_ACTIVITY,activeParticipants:c}:{type:"notification",notification:B.STALLED_ACTIVITY,stalledParticipants:c};case 3:let l=(0,lt.decode)(i);return{type:"notification",notification:B.SPEAKER_CHANGED,speaker:this.getStreamDescription(l)?.participantId};case 5:let p=(0,lt.decode)(i);return{type:"notification",notification:B.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:p[0],maxDimension:p[1]},mediaType:this._decodeMediaType(p[2])};case 6:let m=(0,lt.decode)(i),h={};for(let[b,C]of Object.entries(m)){let W=this.getStreamDescription(Number(b))?.participantId;W&&(h[W]=C/100)}return{type:"notification",notification:B.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let C=(0,lt.decode)(i).map(W=>{let[q,J,Re,De,oe,re,Y]=W;return{participantId:this.getStreamDescription(q)?.participantId,gain:J,pause:Re,offset:De,mute:oe,liveStatus:re,startTimeMs:Y}});return{type:"notification",notification:B.MOVIE_UPDATE_NOTIFICATION,data:C}}case 9:let E=(0,lt.decode)(i);return{type:"notification",notification:B.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,lt.decode)(r),t=[];for(let[i,a]of Object.entries(e)){let s=a[0],c=a[1],l=a[2],p=!!a[3],m=a[4]!==null?!!a[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){d.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(l===null){d.error("unexpected null sequenceNumber",i,a);continue}let E=Ne.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,b=c?c>>>0:null;t.push({participantStreamDescription:h,streamId:E,rtpTimestamp:b,sequenceNumber:l,fastScreenShare:p,suspend:m})}return{type:"notification",notification:B.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var Ia=ui(require("@vkontakte/libvpx"));var Ye=class{constructor(){o(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,c)=>{let l=t.join(","),p=new Blob([r,`exports.default(${l});`],{type:"application/javascript; charset=utf-8"}),m=window.URL.createObjectURL(p);this._worker=new Worker(m),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":c(h.data.error);break;case"frame":e(h.data);break;case"debug":d.debug(h.data.message);break;case"log_error":y.log(k.ERROR,h.data.message);break}},this._sendToWorker("init",i,a)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(r,e={},t=[]){this._worker?.postMessage(Object.assign({type:r},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var bi=class extends Ye{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)}},[Ia.default,Ia.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 pt=class extends Ye{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){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 Ln=require("bit-buffer");var Rr=class{constructor(r){o(this,"_participantId");o(this,"_firstFrameReceived",!1);this._participantId=r}measure(r,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=ue.getMarkNameScreenshareFirstFrame(this._participantId),i=ue.measureMark(t);i!==null&&be.logEventualStat({name:Z.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Vo=65536,Ea="MARK_SCREENSHARE_FREEZE_DURATION",Zt=class n{constructor(r,e,t,i){o(this,"_participantId");o(this,"_onStream");o(this,"_onStat");o(this,"_onKeyFrameRequested");o(this,"_statScreenShareFirstFrame");o(this,"_chunks",[]);this._participantId=r,this._onStream=e,this._onStat=t,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new Rr(r)}appendChunk(r){let e=this._chunks.length;if(r.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),e&&(d.warn("[FrameBuilder] Cleanup buffer",Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!e||(this._chunks[e-1].sequence+1)%Vo!==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(Ea),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 Ln.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(Ea);return}let e=ue.measureMark(Ea);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Ut=class{constructor(r){o(this,"_onStream");this._onStream=r}async drawFrame(r){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(r){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var ei=class extends Ut{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,p=s*c*4;if(l.byteLength!==p){d.warn("Bad frame buffer",{w:s,h:c,got:l.byteLength,expected:p});return}i=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){d.warn("Canvas context is null"),i.close();return}this._canvasContext.transferFromImageBitmap(i),i.close()}else{let i=this._canvasContext;i.clearRect(0,0,t.width,t.height),i.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t="createImageBitmap"in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),d.debug("CanvasRenderer destroyed")}static isBrowserSupported(){return("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)&&!(M.browserName()==="Safari"&&Number(M.browserVersion())===15)&&!(M.browserName()==="Firefox"&&Number(M.browserVersion())<60)}};var Bt=class extends Ut{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&&pt.isBrowserSupported()}};var Ai=class extends Zt{constructor(e,t,i,a){super(e,t,i,a);o(this,"_renderer");o(this,"_decoder");o(this,"_decoderReady",!1);o(this,"_decoderBusy",!1);o(this,"_decoderQueue",[]);o(this,"_fpsMeter");d.debug(`StreamBuilder started for participant [${e}]`),this._initFpsMeter(),this._initRenderer(),this._initDecoder()}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_initFpsMeter(){this._fpsMeter=new 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||!pt.isBrowserSupported()?this._decoder=new bi:this._decoder=new pt;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 pt&&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 Un(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),p=new DataView(l);if(p.setUint8(0,1),p.setUint16(1,i),p.setUint32(3,n),p.setUint8(7,a?1:0),p.setUint16(8,0),p.setUint8(10,c),!s)return 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 Bn(n){let r=new DataView(n),e=r.getUint8(0),t=r.getUint16(1),i=r.getUint32(3),a=r.getUint8(7)===1,s=r.getUint16(8),c=r.getUint8(10),l=!!(c&1),p=!!(c&2),m=!!(c&4),h=!!(c&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:i,start:l,end:p,keyframe:m,sequence:t,isVP9:a,ssrc:s,eos:h,data:n.slice(11)}}function Fn(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 Vn(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 jn(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=ui(require("simple-ebml-builder"));var jo=2**15-1,Ta=1,Ho=5,Go=5;var Ra=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)-Ho);i-t>Go&&(this._clearBufferTill=i)}destroy(){this._queue=[],this._mediaSource.readyState==="open"&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},ti=class n extends Zt{constructor(e,t,i){super(e,t,i);o(this,"_mediaBuffer",null);o(this,"_video",null);o(this,"_stream",null);o(this,"_earliestTimestamp",0);o(this,"_clusterStartTime",0);o(this,"_lastFrameTimestamp",0);d.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return O.element(O.ID.EBML,[O.element(O.ID.EBMLVersion,O.number(1)),O.element(O.ID.EBMLReadVersion,O.number(1)),O.element(O.ID.EBMLMaxIDLength,O.number(4)),O.element(O.ID.EBMLMaxSizeLength,O.number(8)),O.element(O.ID.DocType,O.string("webm")),O.element(O.ID.DocTypeVersion,O.number(2)),O.element(O.ID.DocTypeReadVersion,O.number(2))])}static _genSegmentHeader(e,t,i){let a=O.element(O.ID.Info,[O.element(O.ID.TimecodeScale,O.number(1e6)),O.element(O.ID.MuxingApp,O.string("vk-webm-builder")),O.element(O.ID.WritingApp,O.string("vk-webm-builder"))]),s=[O.element(O.ID.PixelWidth,O.number(e)),O.element(O.ID.PixelHeight,O.number(t))],c=O.element(O.ID.Tracks,O.element(O.ID.TrackEntry,[O.element(O.ID.TrackNumber,O.number(Ta)),O.element(O.ID.TrackUID,O.number(Ta)),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 Ra(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>jo&&(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(Ta),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 Mi=class{constructor(r,e,t,i,a){o(this,"_datachannel");o(this,"_participantIdRegistry",null);o(this,"_streamBuilders",{});o(this,"_onStream",()=>{});o(this,"_onEos",()=>{});o(this,"_onStat");d.debug("ScreenCaptureReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._onStream=t,this._onEos=i,this._onStat=a,this._datachannel.onmessage=s=>this._onDataChannelMessage(s.data)}_onDataChannelMessage(r){let e=Bn(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){d.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}if(e.eos){this.close(t),this._onEos(t);return}let i=this._streamBuilders[t];if(!i){let a=c=>this._onStream(t,c),s=()=>{this._requestKeyFrame(e.ssrc)};u.screenShareWebmBuilder&&ti.isBrowserSupported()?i=new ti(t,a,this._onStat):i=new Ai(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=jn(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 Ca=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}},Di=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 Ca(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 ya=ui(require("@vkontakte/libvpx"));var Wo=1e3,ii=class extends Ye{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})},[ya.default,ya.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)},Wo),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 Ye{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 Ko=2100,qo=600,$o=1.2,Hn=.8,zo=2e3,Jo=8e3,Pa=8e3,Yo=16e3,Qo=4,Xo=2e3,Cr=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Cr||{}),wi=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=Ko,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,p=this._delayAvgShort>this._highDelayThreshold;l||p?a=2:Math.abs(s)<40&&c<10&&!p&&(a=1);let m=Math.round(this._targetBitrate/1e3),h=t;r%20===0&&d.debug(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Cr[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>zo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Qo),this._probing=!1);let J=Hn*h*1e3;if(J>=this._targetBitrate&&(J=this._targetBitrate*Hn),J=Math.max(J,this._minBitrate),J<this._targetBitrate){let Re=Math.round(J/1e3),De=Math.round(this._upPenalty*Pa/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Cr[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Re} penalty=${De}s`),this._setBitrate(J,!0),this._targetBitrate=J}this._lastDown=i}let b=i-this._lastUp,C=Jo+this._upPenalty*Pa;if(a===1&&b>C&&E>C){let J=Math.min(this._targetBitrate*$o,this._maxBitrate);if(J>this._targetBitrate){let Re=Math.round(J/1e3),De=Math.round(this._targetBitrate/1e3),oe=Math.round(this._upPenalty*Pa/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Cr[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${De} -> newBitrate=${Re} penalty=${oe}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>Yo&&(this._probing=!1);let q=i-this._lastDown;this._upPenalty>0&&q>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>Xo){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 ki=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 ba=65536,ec=50,tc=400,ic=1e6,rc=3e5,ac=3e4,nc=2e3,sc=5,yr=0,Oi=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 ki(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 Di);o(this,"_fpsMeter");o(this,"_maxFrameDelay");d.debug("ScreenCaptureSender started"),this.DATA_SIZE=u.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=i,this._congestionControlEnabled=u.screenShareCongestionControl||this._fastSharing,this._width=r.getSettings().width,this._height=r.getSettings().height,this._maxFrameDelay=this._fastSharing?u.screenShareCongestionControlThreshold:u.screenShareCongestionControlThreshold*2;let a=u.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=${u.screenShareCongestionControlThreshold}`),this._congestionControl=new wi(l,s,c,this._congestionControlEnabled,this._fastSharing,u.screenShareCongestionControlThreshold,a);let p=(m,h)=>{if(this._destroyed)return;if(!m){d.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),this._needKeyframe=!0,this._handleQueue();return}(m.width!==this._width||m.height!==this._height)&&(this._width=m.width,this._height=m.height,this._onResize(this._width,this._height));let E=this._sliceFrame(m);this._queue.merge(E),this._handleQueue(),this._sendSharingStat()};if(Ft.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Ft(r,p,this._congestionControlEnabled,c,m,a)}else this._encoder=new ii(r,p,this._congestionControlEnabled,c);this._datachannel.onmessage=m=>{Fn(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Vn(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+ba)%ba>sc&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>nc&&(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 Di;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,p=this._wrapHeader(r.timestamp,c,l,e,s);i.push({data:p.data,sequence:p.sequence,frameSize:t,isFirst:c,isLast:l,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=Un(r,e,t,i,yr,this._encoder.isVP9(),a),c={sequence:yr,data:s};return yr=(yr+1)%ba,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 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(rc,Math.min(ic,Math.round(t*ec))),a=Math.round(t*tc);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>ac){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var oc=90,cc=4294967295,xi=class n extends Ot{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,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=i,d.debug("ServerTransport: Created")}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!=="IDLE"&&e!=="CLOSED"&&e!=="FAILED"&&this._startStatInterval()}open(e=!1){if(this._isOpen){d.log("ServerTransport: Already opened connections");return}this._isOpen=!0,this._observer=e,this._openConnection()}close(e){this._isOpen&&(this._isOpen=!1,this._closeConnection(),this.unsubscribe(),e?(d.error("ServerTransport: Closed",e),this._setState("FAILED")):(d.debug("ServerTransport: Closed"),this._setState("CLOSED")))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){fr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(u.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(){u.simulcast&&M.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new Et(this,this._signaling)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcastInfo=null,this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,n._closeDataChannel(this._producerNotification),n._closeDataChannel(this._producerCommand),n._closeDataChannel(this._producerScreen),n._closeDataChannel(this._consumerScreen),n._closeDataChannel(this._asr),n._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent("PEER_CONNECTION_CLOSED")}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{ordered:!0});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)},a.onerror=s=>{let c=s.error;d.error(`[${t}] data channel error`,c?.errorDetail,c?.message)}}_openConnection(e=!1){d.debug("ServerTransport: Open single connection");try{this._pc=new RTCPeerConnection}catch(t){d.error("Failed to create RTCPeerConnection:",t),this.close(t);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=I.debounce(t=>{this._pc&&this._onConnectionStateChange(this._pc,t)},500),this._pc.onsignalingstatechange=n._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Er,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,dt.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,dt.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)}),this._createDataChannel(this._pc,dt.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),u.asrDataChannel&&this._createDataChannel(this._pc,dt.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new Ir(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),u.vmoji&&this._createDataChannel(this._pc,dt.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(u.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(t){d.error("ServerTransport: Unable to add media source tracks",t),y.log(k.ERROR,"addTrack-single"),this.close(t);return}this._createDataChannel(this._pc,dt.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&(!u.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!=="OPENED"&&(this._setState("RECONNECTING"),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_signalStalledParticipants(e){this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_signalSpeakerChanged(e){this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_signalNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_updateSSRCMap(e){e&&e.sdp.split(`
12
- `).forEach(t=>{let i=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Ne.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Ne.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,a=new RegExp(i).exec(t);a&&(this._ssrcMap[a[1]]=a[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Oi(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Mi(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 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(p=>{d.error("Could not enable video upload",p)})}I.applyVideoTrackSettings(e,i,c??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&u.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?(!u.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,u.statisticsInterval)};this._statInterval=window.setTimeout(e,u.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await ue.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent("REMOTE_DATA_STATS",{inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(c=>c.type==="inbound-rtp"&&c.kind==="audio"&&this._ssrcMap[c.ssrc]==="mix");if(!t)return;let i=Ne.AUDIO_MIX,a=this._statBytes[i],s=!1;if(a){let c=t.bytesReceived-a.bytesReceived;c>=0&&c<=5&&(s=!0),a.stalled!==s&&this._triggerEvent("AUDIO_MIX_STALL",s)}this._statBytes[i]={bytesReceived:t.bytesReceived,stalled:s}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:Et.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:u.asrDataChannel?1:0,animojiDataChannelVersion:u.vmoji?u.vmojiOptions.protocolVersion:1,animojiBackendRender:!u.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:u.videoTracksCount,red:!0,audioShare:u.audioShare,fastScreenShare:u.fastScreenShare,videoSuspend:u.videoSuspend,simulcast:u.simulcast&&M.isSimulcastSupportedByBrowser(),consumerFastScreenShare:u.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:u.consumerFastScreenShareQualityOnDemand,transparentAudio:u.transparentAudio};!u.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=u.simulcast&&M.isSimulcastSupportedByBrowser(),a=i;try{await this._pc.setRemoteDescription(e)}catch(l){throw d.error("[single] unable to set remote offer",l),y.log(k.ERROR,"setRemoteDescription-single"),l}let s=this._findFirstSimTransceiver();if(i)if(s){d.log(`_processOffer: caps.simulcast=${u.simulcast} mid=${s.mid} dir=${s.direction}`);let l=this._mediaSource.getStream(),p=await this._setupSimulcastTransceiver(l,s);d.log("_processOffer: simulcastInfo",p),p||(d.log(`_processOffer: simulcast transceiver not found in server offer mid=${s.mid}, disable simulcast`),a=!1)}else d.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),a=!1;let c;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");c=await this._pc.createAnswer()}catch(l){throw d.error("[single] unable to create answer",l),y.log(k.ERROR,"createAnswer-single"),l}try{if(!this._pc)throw new Error("Interrupt allocation");c.sdp=I.patchLocalSDP(c.sdp,!1,M.isBrokenH264Decoder(),!1),d.debug("[single] set local answer",{answer:c}),await this._pc.setLocalDescription(c)}catch(l){throw d.error("[single] unable to set local answer",l),y.log(k.ERROR,"setLocalDescription-single"),l}if(a&&s){c.sdp=I.patchSimulcastAnswerSdp(c.sdp,s,gt.WIDTH,gt.HEIGHT);for(let l of this._pc.getTransceivers())l.mid===null&&l.stop()}try{d.debug("[single] transmit local answer",{answer:c}),this._updateSSRCMap(e),await this._signaling.acceptProducer(c,Object.keys(this._ssrcMap),t),d.debug("[single] remote offer has been processed")}catch(l){d.warn("[single] unable to send local answer",l),y.log(k.ERROR,"acceptProducer")}a&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!=="video")continue;let i=e.sender.getParameters();if(!(!i.encodings||i.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let i=e.getVideoTracks()[0];await t.sender.replaceTrack(i),t.sender.setStreams(e);let a=t.sender.getParameters();if(!a.encodings||a.encodings.length<=1)return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(a.encodings)}`),null;let s=gi(gt.WIDTH,gt.HEIGHT,this._serverSettings.camera?.bitrates?.generic),c=0,l=1;for(let m of a.encodings)m.scalabilityMode=hi,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 p=i.getSettings();return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${p.width}x${p.height} encodings=${JSON.stringify(a.encodings)}`),!0}async _acceptProducer(e,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),y.log(k.ERROR,"replaceTrack-single")}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case B.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case B.REALLOC_CON:this._reconnect();break;case B.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case B.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case B.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case B.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(),u.breakVideoPayloadTypes&&(d.log("test mode enabled, video switched off"),this._signaling.requestTestMode("breakVideoPayloadTypes",null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description,e.sessionId)}_onAddTrack(e,t){d.debug("[single] remote track (added)",{track:t.track});let i=t.streams[0];i?(i.onremovetrack||(i.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",i.id,i,s.track)}),i.getTracks().find(s=>s.id===t.track.id)||i.addTrack(t.track),this._rtpReceiversByStreamId[i.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",i.id,i,t.track)):d.error("[single] unable to get media stream from track event")}static _onSignalingStateChange(e,t){d.debug("[single] signaling state changed",{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(d.debug("[single] connection state changed",{state:e.connectionState},t),y.log(k.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):this._reconnect();break;case"connecting":let i=this.getState();i==="IDLE"||i==="OPENED"?this._setState("CONNECTING"):e.iceConnectionState==="checking"&&this._setState("RECONNECTING");break;case"disconnected":this._reconnectionPrevented?this.close(new Error("Ice connection disconnected")):this._setState("RECONNECTING");break;case"connected":this._setState("CONNECTED"),I.getPeerConnectionHostInfo(e).then(a=>{a?.local&&(y.log(k.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))});break}}_onReplacedTrack(e,t){if(this._pc){d.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let i=(a,s)=>{a.replaceTrack(s).catch(c=>{d.error("ServerTransport: Unable to replace track",c),y.log(k.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),u.simulcast&&M.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(c=>c.direction==="sendonly"&&c.sender?.track?.kind==="video"&&c.sender.track.contentHint===e.contentHint)?.sender;s?.track?(i(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):d.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let a=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);a?.track?i(a,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e==="screen"&&u.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return y.log(k.PAT_WAITING_TIME_ERROR,"noConnection"),d.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return y.log(k.PAT_WAITING_TIME_ERROR,"oldBrowser"),d.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let i=this._rtpReceiversByStreamId[e];if(!i)return y.log(k.PAT_WAITING_TIME_ERROR,"noReceiver"),d.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let a=i.getSynchronizationSources();if(!a||!a.length)return d.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let c=a[0].rtpTimestamp;if(!Number.isInteger(c))return y.log(k.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),d.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${c}`),0;let l=t-c&cc,p=Math.ceil(l/oc);return Math.min(100,Math.max(0,p))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!u.simulcast||!M.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let c=s.getVideoTracks()[0],l=c.getSettings().width,p=c.getSettings().height,m=gi(l,p,this._serverSettings.camera?.bitrates?.generic),h=t||!Za(this._simulcastInfo,m);if(!m.streams.length||!h)return;let E=a.sender.getParameters();if(E.encodings||(E.encodings=[{}]),!(E.encodings.length<=1)){if(d.log(`_changeSimulcastInfo: ${l}x${p} command: ${JSON.stringify(m)} `),e){let b=0;for(let C of E.encodings)C.scaleResolutionDownBy=Gi(C.rid),C.scalabilityMode=hi,b>=m.streams.length?(C.maxBitrate=0,C.active=!1):(C.active=!0,C.maxBitrate=m.streams[b].bitrate),b++;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 b={mediaSource:1,simulcastInfo:m};await this._signaling.changeSimulcast(b)}}}async _monitorRtpShare(){let e=Xt.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!u.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(a=>a.track?.kind==="video"&&a.track?.contentHint==="motion");if(!t)return;(await t.getStats()).forEach(a=>{if(a.type==="outbound-rtp"&&this._serverSettings.fastScreenSharing&&a.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&a.frameWidth<window.screen.width){let s=t.getParameters();s.degradationPreference="maintain-resolution",t.setParameters(s),d.log(`
7
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("webrtc-adapter");c=s(c);let l=require("messagepack"),u=require("@vkontakte/libvpx");u=s(u);let d=require("bit-buffer"),f=require("simple-ebml-builder");f=s(f);let p=require("fflate");p=s(p);var m=class{log(e,t,n=!1){}destroy(){}};function h(e){"@babel/helpers - typeof";return h=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},h(e)}function ee(e,t){if(h(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(h(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function te(e){var t=ee(e,`string`);return h(t)==`symbol`?t:t+``}function g(e,t,n){return(t=te(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var _=class{constructor(){g(this,`_handlers`,{}),g(this,`_listeners`,[])}_triggerEvent(e,...t){if(Object.hasOwn(this._handlers,e))for(let n of this._handlers[e])n.apply(this,t)}addEventListener(e,t){if(typeof t!=`function`)throw Error(`Listener should be a function`);return Object.hasOwn(this._handlers,e)||(this._handlers[e]=[]),this._handlers[e].push(t),{dispose:this.removeEventListener.bind(this,e,t)}}removeEventListener(e,t){if(!Object.hasOwn(this._handlers,e))return;t||delete this._handlers[e];let n=this._handlers[e].indexOf(t);n>=0&&this._handlers[e].splice(n,1)}subscribe(e,t,n){let r=e.addEventListener(t,n);this._listeners.push(r)}unsubscribe(){this._listeners.forEach(e=>{e.dispose()})}},v=function(e){return e.MIC_CAMERA_PERMISSION=`mic_camera`,e.CAMERA_PERMISSION=`camera`,e.MIC_PERMISSION=`mic`,e.CAMERA_ACCESS=`cameralock`,e.MIC_ACCESS=`miclock`,e.MIC_NOT_FOUND=`nomic`,e.SCREEN_PERMISSION=`screenpermission`,e.SCREEN_ACCESS=`screenlock`,e.CONNECTION=`connection`,e.NETWORK=`network`,e.UNKNOWN=`unknown`,e.UNSUPPORTED=`unsupported`,e.SIGNALING_FAILED=`signalingfailed`,e.API=`api`,e.AUTH=`auth`,e.OVERCONSTRAINED=`overconstrained`,e}(v||{}),y=function(e){return e.AUDIO=`AUDIO`,e.VIDEO=`VIDEO`,e.SCREEN_SHARING=`SCREEN_SHARING`,e.MOVIE_SHARING=`MOVIE_SHARING`,e.AUDIO_SHARING=`AUDIO_SHARING`,e.ANIMOJI=`ANIMOJI`,e}(y||{}),b=function(e){return e.ACCEPT_CONCURRENT=`callAcceptConcurrent`,e.ACCEPT_INCOMING=`callAcceptIncoming`,e.ACCEPTED_OUTGOING=`callAcceptedOutgoing`,e.ADD_PARTICIPANT=`callAddParticipant`,e.CALL_SPEC_ERROR=`callSpecError`,e.DECLINE_INCOMING=`callDeclineIncoming`,e.DEVICE_CHANGED=`callDeviceChanged`,e.DEVICES=`callDevices`,e.ERROR=`callError`,e.HANGUP=`callHangup`,e.ICE_CONNECTION_STATE=`callIceConnectionState`,e.ICE_CONNECTION_TYPE=`callIceConnectionType`,e.ICE_RESTART=`callIceRestart`,e.JOIN_CONVERSATION=`callJoinConversation`,e.MEDIA_STATUS=`callMediaStatus`,e.OUTGOING_CALL=`callStart`,e.OUTGOING_MULTIPARTY_CALL=`callStartMultiparty`,e.PAT_ALLOCATED=`patAllocate`,e.PAT_DEALLOCATED=`patDeallocate`,e.PAT_ERROR=`patError`,e.PAT_OUTDATED_RESPONSE=`patOutdatedResponse`,e.PAT_WAITING_TIME_ERROR=`patWaitingTimeError`,e.POOR_CONNECTION=`callPoorConnection`,e.PUSH=`callPush`,e.RECONNECT=`callReconnect`,e.RELAY_POLICY=`callForceRelay`,e.REMOVE_PARTICIPANT=`callRemoveParticipant`,e.SOCKET_ACTION=`callSocketAction`,e.TOPOLOGY_CHANGE_REQUESTED=`callTopologyChangeRequested`,e}(b||{}),x=class e{static get sessionKey(){return e._sessionKey}static set sessionKey(t){e._sessionKey=t}static get sessionSecretKey(){return e._sessionSecretKey}static set sessionSecretKey(t){e._sessionSecretKey=t}static get accessToken(){return e._accessToken}static set accessToken(t){e._accessToken=t}static isEmpty(){return!e._sessionKey}};g(x,`_sessionKey`,void 0),g(x,`_sessionSecretKey`,void 0),g(x,`_accessToken`,void 0);var S=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e}(S||{}),ne={HEIGHT:720,WIDTH:1280,BITRATE:1e6},re=`L1T2`,ie=[{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}],ae={h:1,m:2,l:4};function oe(e,t){return!e||!t?e===t:e.streams.length===t.streams.length?e.streams.every((e,n)=>C.isObjectsEquals(e,t.streams[n])):!1}function se(e,t){for(let n of t)if(e<=n.dimension)return n.bitrate;return length>0?t[length-1].bitrate:ie[0].bitrate}function ce(e=ne.WIDTH,t=ne.HEIGHT,n=ie){let r=[`h`,`m`,`l`],i=Math.max(e,t),a=1;i>=960?a=3:i>=480&&(a=2);let o={streams:[]},s=se(i,n)??ne.BITRATE;for(let i=0;i<a;i++){let a=r[i];o.streams.push({rid:a,width:e,height:t,fps:30,bitrate:s}),e=Math.round(e/2),t=Math.round(t/2),s=se(Math.max(e,t),n)??Math.round(s/2)}return o}function le(e){return e?ae[e]??1:1}var ue=typeof Object.fromEntries==`function`?Object.fromEntries:function(e){if(!e||!e[Symbol.iterator])throw Error(`Object.fromEntries() requires a single iterable argument`);let t={};for(let[n,r]of e)t[n]=r;return t};async function de(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{t(e.target?.result)},r.onerror=n,r.readAsArrayBuffer(e)})}var fe=533,pe=`a=fmtp:`,me=`sps-pps-idr-in-keyframe=1`,he;(function(e){let t=/[\r\n]+/;function n(e,t){let n=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),r,i=[];for(r=0;r<e.length;++r){let a=e[r].match(n);a&&a.length===3&&a[2]===t&&i.push(a[1])}return i}function r(e,t,n){let r=e.split(` `),i=r.slice(0,3),a;for(a=3;a<r.length;a++)n.includes(r[a])&&i.push(r[a]);for(a=3;a<r.length;a++)!n.includes(r[a])&&!t.includes(r[a])&&i.push(r[a]);return i.join(` `)}function i(e,t,n,i){let a,o=`m=`+t;for(a=0;a<e.length;++a)e[a].startsWith(o)&&(e[a]=r(e[a],n,i))}function a(e,t){let n=RegExp(`a=fmtp:(\\d+)`);for(let r=0;r<e.length;++r){let i=e[r].match(n);if(i&&i.length===2&&t.includes(i[1])){let t=e[r].trim()===pe+i[1]?` `:`;`;e[r]+=t+me}}}function o(e,t,r=`video`){let a=n(e,t);if(!a.length)return;let o=a.slice(0),s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`),c;for(c=0;c<e.length;++c){let t=e[c].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}let l=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`);for(c=e.length;c--;){let t=e[c].match(l);t&&t.length===3&&o.includes(t[2])&&e.splice(c,1)}i(e,r,o,[])}function s(e,t,n,r){let i=RegExp(`a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+`),a,o=[];for(a=t;a<n;++a){let t=e[a].match(i);t&&t.length===3&&t[2]===r&&o.push(t[1])}if(!o.length)return o;let s=RegExp(`a=fmtp:(\\d+) apt=(\\d+)`);for(a=t;a<n;++a){let t=e[a].match(s);t&&t.length===3&&o.includes(t[2])&&o.push(t[1])}return o}function c(e,t,n,i){let a=s(e,t,n,i);if(!a.length)return n+1;let o=RegExp(`a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*`),c=0,l=n;for(;l>=t;){let t=e[l].match(o);t&&t.length===3&&a.includes(t[2])&&(e.splice(l,1),c++),l--}return e[t]=r(e[t],a,[]),n-c+1}function l(e,t,n,r){let i=-1,a=-1,o=!1;for(let s=0;s<e.length;++s)if(i>=0&&e[s].startsWith(`m=`)&&(a=s-1,o&&(s=c(e,i,a,t)),i=-1,a=-1,o=!1),e[s].startsWith(`m=video`)&&(i=s),i>=0){let t=n===`remote`&&r===`encoder`||n===`local`&&r===`decoder`?`recvonly`:`sendonly`;(e[s].startsWith(`a=${t}`)||e[s].startsWith(`a=sendrecv`))&&(o=!0)}a=e.length-1,i>=0&&o&&c(e,i,a,t)}function u(e,t){let r=n(e,`H264`);t&&i(e,`video`,[],r),a(e,r)}function d(e){i(e,`video`,[],n(e,`VP9`))}function f(e){[`G722`,`PCMU`,`PCMA`,`CN`,`telephone-event`].forEach(t=>{o(e,t,`audio`)})}function p(e,r,a,o,s=!1){let c=e.split(t);if(f(c),!r&&!a&&!o&&!s)return c.join(`\r
8
+ `);function p(e){let t=[`a=rtcp-fb:111 nack`,`a=rtcp-fb:111 nack pli`],n=e.findIndex(e=>e.startsWith(`a=rtcp-fb:111`));return~n&&(e[n]=e[n]+`\r
9
+ `+t.join(`\r
10
+ `)),e}function m(e){let t=n(e,`red`);t.length>0&&i(e,`audio`,[],t)}return a?l(c,`H264`,`local`,`decoder`):u(c,r),o&&d(c),m(c),s&&p(c),c.join(`\r
11
+ `)}e.patchLocalSDP=p;function m(e,n,r,i,a,s,c){n&&(e=e.replace(`m=application 9 UDP/DTLS/SCTP webrtc-datachannel`,`m=application 9 DTLS/SCTP 5000`).replace(`a=sctp-port:5000`,`a=sctpmap:5000 webrtc-datachannel 256`));let p=e.split(t);return i?o(p,`H264`):r&&u(p,r),s&&c?o(p,`VP9`):s?l(p,`VP9`,`remote`,`encoder`):c?l(p,`VP9`,`remote`,`decoder`):a&&d(p),f(p),p.join(`\r
12
+ `)}e.patchRemoteSDP=m;function h(e){return e?`${e.type||`WEB_SOCKET`}_${e.id}`:`_`}e.getPeerIdString=h;function ee(e,t){return e&&e.id===t.id&&(e.type||`WEB_SOCKET`)===(t.type||`WEB_SOCKET`)}e.comparePeerId=ee;async function te(e){let t={local:null,remote:null};if(!e||!e.getStats)return t;try{let n=await e.getStats(null),r=null;if(n.forEach(e=>{e.type===`transport`&&e.selectedCandidatePairId?r=n.get(e.selectedCandidatePairId):e.type===`candidate-pair`&&e.state===`succeeded`&&!r&&(!Object.hasOwn(e,`selected`)||e.selected)&&(r=e)}),r?.localCandidateId){let e=n.get(r.localCandidateId);e&&(t.local={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}if(r?.remoteCandidateId){let e=n.get(r.remoteCandidateId);e&&(t.remote={type:e.candidateType,ip:e.ip||e.ipAddress,port:e.port||e.portNumber})}return t}catch{return t}}e.getPeerConnectionHostInfo=te;let g=/^[0-9]+$/,_=/^([gu])([0-9]+)$/;function v(e,t=S.USER){let n=String(e);return _.test(n)?(R.warn(`Already composite id [${e}] type supplied [${t}]`),n):t===S.GROUP?`g`+n:t===S.USER?`u`+n:(R.warn(`Unknown type [${t}] for id [${e}]`),n.match(g)?`u`+n:n)}e.composeUserId=v;function y(e,t,n=0){return b(v(e,t),n)}e.composeParticipantId=y;function b(e,t){return t?e+`:d`+t:e}e.compose=b;function x(e){return y(e.id,e.idType||S.USER,e.deviceIdx)}e.composeId=x;function ne(e){if(e.decorativeUserId)return y(e.decorativeUserId,e.idType||S.USER,e.deviceIdx)}e.composeDecorativeId=ne;function ie(e){return e.participant?x(e.participant):y(e.participantId,e.participantType||S.USER,e.deviceIdx)}e.composeMessageId=ie;function ae(e){return typeof e==`string`?oe(se(e).compositeUserId).id:e}e.extractOkId=ae;function oe(e){let t=String(e),n=t.match(_);return n?{id:Number(n[2]),type:n[1]===`g`?S.GROUP:S.USER}:(R.warn(`Unsupported compositeId [${e}]`),{id:Number(t),type:S.USER})}e.decomposeId=oe;function se(e){let t=e.split(`:d`);return{compositeUserId:t[0],deviceIdx:t.length>1?parseInt(t[1],10):0}}e.decomposeParticipantId=se;function de(){let e=window.crypto?.randomUUID?.();if(e)return e;let t=`0123456789abcdefghijklmnopqrstuvwxyz`.split(``),n=Array(36),r=0,i,a;for(a=0;a<36;a++)a===8||a===13||a===18||a===23?n[a]=`-`:a===14?n[a]=`4`:(r<=2&&(r=33554432+Math.random()*16777216|0),i=r&15,r>>=4,n[a]=t[a===19?i&3|8:i]);return n.join(``)}e.uuid=de;function he(e,t){let n;function r(...r){let i=this;n&&window.clearTimeout(n),n=window.setTimeout(()=>{e.apply(i,r)},t)}return r}e.debounce=he;function C(e){if(!window.BigInt)return null;let t=``,n=e.split(`
13
+ `);for(let e of n)if(e.startsWith(`a=fingerprint`)){let n=e.split(` `);if(n.length===2){t=n[1];break}}if(!t)return BigInt(-1);let r=t.split(`:`),i=BigInt(0);for(let e=Math.min(7,r.length-1);e>=0;e--){let t=BigInt(parseInt(r[e],16));i<<=BigInt(8),i|=t}return BigInt.asIntN(64,i)}e.sdpFingerprint=C;async function ge(e,{signal:t}={}){return new Promise((n,r)=>{if(t?.aborted)return r(t.reason);let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason)};t?.addEventListener(`abort`,a,{once:!0})})}e.delay=ge;function _e(e,t,n){let r=[];return e.getSenders().forEach(e=>ve(t,e,e.track,n,r)),r}e.applySettings=_e;function ve(e,t,n,r,i){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!e||!n||n.kind!==k.video)return;let a=n.getSettings();if(!a)return;let o=e.maxBitrateK?e.maxBitrateK*1024:null,s=a.width,c=a.height,l=s&&c&&e.maxDimension?Math.max(1,Math.max(s,c)/e.maxDimension):null,u=e.maxFramerate||null;if(s&&c&&e.maxDimension&&e.maxDimension>Math.max(s,c)){let e=Math.round(s*c/256),t=(Math.round(e*fe/1e4)+1)*1e4;o=o===null?t:Math.min(t,o)}let d=e.degradationPreference||`balanced`,f=r[n.id];if(f&&f.bitrate===o&&f.scaleResolutionDownBy===l&&f.maxFramerate===u&&f.degradationPreference===d){i[n.id]=f;return}i[n.id]={bitrate:o,scaleResolutionDownBy:l,maxFramerate:u,degradationPreference:d};let p=t.getParameters();if(p.encodings||(p.encodings=[{}]),p.encodings.length>1&&s&&c&&e.maxDimension){let t=Math.round(e.maxDimension*1.35),n=Math.max(s,c),r=ce(s,c,e?.bitrates?.generic),i=r.streams.length;R.log(`applyVideoTrackSettings: maxDim=${e.maxDimension} targetDim=${t} track=${s}x${c} sim=${JSON.stringify(r)}`),p.encodings.forEach((e,a)=>{e.scaleResolutionDownBy=le(e.rid);let o=Math.round(n/e.scaleResolutionDownBy);a<i-1?e.active=o<t:a>=i?e.active=!1:e.active=!0,a<i?e.maxBitrate=r.streams[a].bitrate:e.maxBitrate=0,e.scalabilityMode=re})}else p.encodings.forEach(t=>{e?.scalabilityMode&&(t.scalabilityMode=e.scalabilityMode),o?t.maxBitrate=o:delete t.maxBitrate,l?t.scaleResolutionDownBy=l:delete t.scaleResolutionDownBy,u?t.maxFramerate=u:delete t.maxFramerate});if(p.degradationPreference=d,p.encodings.length>0){t.setParameters?.(p).catch(e=>{R.error(`Failed to set sender parameters`,p,e)});let e=t.getParameters();R.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(e.encodings)}`)}}e.applyVideoTrackSettings=ve;function ye(e,t){Array.isArray(t)||(t=[t]);for(let n of t)if(e.includes(n))return!0;return!1}e.includesOneOf=ye;function be(e){return Object.entries(e.participantState?.state||{}).reduce((t,[n,r])=>(e.participantState&&(t[n]={ts:e.participantState.stateUpdateTs[n],state:r}),t),{})}e.mapParticipantState=be;function xe(e){let t=e.map(e=>({uid:e.externalId,mediaSettings:e.mediaSettings,status:e.status,muteStates:e.muteStates,unmuteOptions:e.unmuteOptions,participantState:e.participantState,markers:e.markers,movieShareInfos:e.movieShareInfos,roles:e.roles}));return w.filterObservers?t.filter(e=>!e.uid.observer):t}e.mapSharedParticipants=xe;function T(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let i of n)if(!Object.hasOwn(r,i)||e[i].state!==t[i].state||e[i].ts!==t[i].ts)return!1;return!0}e.isEqualParticipantState=T;function Se(e,t,n=!1){let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let i of r){if(!Object.hasOwn(t,i))return!1;let r=e[i],a=t[i];if(n&&O(r)&&O(a))return Se(r,a,n);if(r!==a)return!1}return!0}e.isObjectsEquals=Se;function Ce(e,t){if(e.length!==t.length)return!1;for(let n of e)if(t.indexOf(n)<0)return!1;return!0}e.isArraysEquals=Ce;function we(e){return!Object.keys(e).length}e.isEmptyObject=we;function Te(e,t){if(!e&&!t)return 0;if(!e||!t)return e?-1:1;return r(t.rank,e.rank)||r(e.ts,t.ts)||n(e,t);function n(e,t){let n={[S.USER]:0,[S.GROUP]:1},{compositeUserId:i,deviceIdx:a}=se(e.id),{compositeUserId:o,deviceIdx:s}=se(t.id),{id:c,type:l}=oe(i),{id:u,type:d}=oe(o);return r(n[l],n[d])||r(c,u)||r(a,s)}function r(e,t){return e<t?-1:e===t?0:1}}e.participantMarkerCompare=Te;function E(e,t){return ue(Object.entries(e).filter(([,e])=>Array.isArray(t)?!t.includes(e):e!==t))}e.objectFilterOutValues=E;function D(e,t,n){let r=n;for(let n in e)Object.hasOwn(e,n)&&(r=t(r,e[n],n));return r}e.objectReduce=D,e.setImmediate=(()=>{let e=1,t={},n=null;return typeof MessageChannel<`u`&&(n=new MessageChannel,n.port1.onmessage=e=>{let n=e.data;t[n]&&(t[n](),delete t[n])}),function(r){if(n&&document.visibilityState===`hidden`){let i=e;return e=e>=2**53-1?1:e+1,t[i]=r,n.port2.postMessage(i),()=>{t[i]&&delete t[i]}}let i=setTimeout(r,0);return()=>clearTimeout(i)}})();function O(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}e.isObject=O;function Ee(e,n,r,i){function a(e,t){let n=0,r=e.length,i=!1;for(let a=0;a<e.length;a++)if(!i&&e[a].startsWith(`m=video`)&&(n=a),e[a].startsWith(`a=mid:`+t)&&(i=!0),i&&e[a].startsWith(`m=`)){r=a;break}return{start:n,end:r}}function o(e,t,n,r,i,a,o){let s=`a=rid:`+r+` send`;for(let r=t;r<n;r++)e[r]===s&&(e[r]=s+` max-width=`+a+`;max-height=`+o+`;max-br=`+i)}let s=n?.sender;if(s&&s.track&&n.mid){let c=e.split(t),{start:l,end:u}=a(c,n.mid),d=s.getParameters();if(d.encodings)return d.encodings.forEach(e=>{let t=e.rid,n=e.maxBitrate,a=e.scaleResolutionDownBy;r&&i&&a&&o(c,l,u,t,n,``+Math.round(r/a),``+Math.round(i/a))}),c.join(`\r
14
+ `)}return e}e.patchSimulcastAnswerSdp=Ee})(he||(he={}));var C=he,ge=`__CALLS_SDK_DEVTOOLS_`,_e=class{set(e,t){try{this.getStorage().setItem(ge+e,JSON.stringify(t))}catch(t){R.warn(`DevTools: Failed to save option`,e,t)}}get(e){try{let t=this.getStorage().getItem(ge+e);return t===null?null:JSON.parse(t)}catch(t){return R.warn(`DevTools: Failed to read option`,e,t),null}}remove(e){try{this.getStorage().removeItem(ge+e)}catch(t){R.warn(`DevTools: Failed to remove option`,e,t)}}clear(){try{let e=this.getStorage(),t=Object.keys(e);for(let n of t)n.startsWith(ge)&&e.removeItem(n)}catch(e){R.warn(`DevTools: Failed to clear options`,e)}}getAll(){try{let e=this.getStorage(),t=Object.keys(e),n={};for(let r of t)if(r.startsWith(ge)){let t=r.substring(21),i=e.getItem(r);if(i!==null)try{n[t]=JSON.parse(i)}catch{}}return n}catch(e){return R.warn(`DevTools: Failed to get all options`,e),{}}}getStorage(){return window.localStorage}},ve=class{constructor(e){g(this,`storage`,void 0),this.storage=e}set(e,t){this.storage.set(e,t),console.debug(`DevTools: ${String(e)} override set to ${t}`)}get(e){return this.storage.get(e)}clear(e){this.storage.remove(e),console.debug(`DevTools: ${String(e)} override cleared`)}clearAll(){this.storage.clear(),console.debug(`DevTools: All overrides cleared`)}getAll(){return this.storage.getAll()}applyOverrides(e){let t=this.getAll(),n={...e},r=Object.keys(t);if(r.length>0){console.debug(`DevTools: Current overrides:`,t);for(let e of r)t[e]!==void 0&&(n[e]=t[e]);console.debug(`DevTools: Overrides applied`)}return n}},ye=class e{static getInstance(){return e.instance||(e.instance=new e),e.instance}constructor(){g(this,`params`,void 0),g(this,`storage`,void 0),this.storage=new _e,this.params=new ve(this.storage)}};g(ye,`instance`,null);var be=ye.getInstance(),w=class e{static set(t){Object.hasOwn(t,`voiceParams`)&&(Object.assign(e._params.voiceParams,t.voiceParams),delete t.voiceParams),Object.hasOwn(t,`specListenerParams`)&&(Object.assign(e._params.specListenerParams,t.specListenerParams),delete t.specListenerParams),Object.hasOwn(t,`apiAuth`)&&(x.accessToken=t.apiAuth.accessToken,x.sessionKey=t.apiAuth.sessionKey,x.sessionSecretKey=t.apiAuth.sessionSecretKey);let n=be.params.applyOverrides(t);Object.assign(e._params,C.objectFilterOutValues(n,void 0))}static getScreenFrameRate(t){return t?e._params.fastScreenShareFrameRate:e._params.screenFrameRate}static get(t){return e._params[t]}static get appName(){return`ok.calls.sdk.js`}static get appVersion(){return 1.1}static get sdkVersion(){return`2.8.11-dev.1ead2f25.0`}static get debug(){return e._params.debug}static get protocolVersion(){return e._params.joinFromMultipleDevices?6:5}static get platform(){return e._params.platform}static set platform(t){e._params.platform=t}static get clientStatsPlatform(){return e._params.clientStatsPlatform}static set clientStatsPlatform(t){e._params.clientStatsPlatform=t}static get clientType(){return e._params.clientType}static set clientType(t){e._params.clientType=t}static get externalUserType(){return e._params.externalUserType}static set externalUserType(t){e._params.externalUserType=t}static get device(){return e._params.device}static get apiKey(){return e._params.apiKey}static get apiEnv(){return e._params.apiEnv}static get apiBaseUrl(){return e._params.apiBaseUrl}static set apiBaseUrl(t){e._params.apiBaseUrl=t}static apiEndpoint(t){switch(t??e.apiEnv){case`AUTO`:case`PROD`:return`https://api.mycdn.me`;case`CALLS`:return`https://calls.okcdn.ru`;case`PROD_OK`:return`https://api.ok.ru`;case`TEST`:return`https://apitest.ok.ru/api`;case`VIDEOTEST`:return`https://videotestapi.ok.ru/api`;case`CALLSTEST`:return`https://calls-test.okcdn.ru/api`;case`CALLS_BETA`:return`https://api-beta.calls-test.oneme.ru/api`;case`CALLS_BENDER`:return`https://api-bender.calls-test.oneme.ru/api`;case`CALLS_MAMES`:return`https://api-mames.calls-test.oneme.ru/api`;case`CALLS_MARS`:return`https://api-mars.calls-test.oneme.ru/api`;default:return e._params.apiEnv}}static get apiTimeout(){return e._params.apiTimeout}static get apiMaxAttempt(){return e._params.apiMaxAttempt}static get authToken(){return e._params.authToken}static set authToken(t){e._params.authToken=t}static get anonymToken(){return e._params.anonymToken}static set anonymToken(t){e._params.anonymToken=t}static get domain(){return e._params.domain}static get externalDomain(){return e._params.externalDomain}static get iceServers(){return e._params.iceServers}static set iceServers(t){e._params.iceServers=t}static get wssBase(){return e._params.wssBase}static set wssBase(t){e._params.wssBase=t}static get wtsBase(){return e._params.wtsBase}static set wtsBase(t){e._params.wtsBase=t}static get wssToken(){return e._params.wssToken}static set wssToken(t){e._params.wssToken=t}static get signalingReconnectDelay(){return e._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return e._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return e._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return e._params.waitConnectionDelay}static get waitResponseDelay(){return e._params.waitResponseDelay}static get waitMessageDelay(){return e._params.waitMessageDelay}static get waitAnotherTabDelay(){return e._params.waitAnotherTabDelay}static get debugLog(){return e._params.debugLog}static get forceRelayPolicy(){return e._params.forceRelayPolicy}static set forceRelayPolicy(t){e._params.forceRelayPolicy=t}static get videoMinWidth(){return e._params.videoMinWidth}static get videoMaxWidth(){return e._params.videoMaxWidth}static set videoMaxWidth(t){e._params.videoMaxWidth=t}static get videoMinHeight(){return e._params.videoMinHeight}static get videoMaxHeight(){return e._params.videoMaxHeight}static set videoMaxHeight(t){e._params.videoMaxHeight=t}static get videoAspectRatio(){return e._params.videoAspectRatio}static get videoFrameRate(){return e._params.videoFrameRate}static get videoFacingMode(){return e._params.videoFacingMode||(I.isMobile()?dt.USER:null)}static set videoFacingMode(t){e._params.videoFacingMode=t}static get displaySurface(){return e._params.displaySurface}static get audioEffects(){return e._params.audioEffects}static set audioEffects(t){e._params.audioEffects=t,e._params.audioEffects?.setLogger((e,...t)=>R.send(e,...t))}static get videoEffects(){return e._params.videoEffects}static set videoEffects(t){e._params.videoEffects=t,e._params.videoEffects?.setLogger((e,...t)=>R.send(e,...t))}static get videoEffectMaxWidth(){return e._params.videoEffectMaxWidth}static set videoEffectMaxWidth(t){e._params.videoEffectMaxWidth=t}static get videoEffectMaxHeight(){return e._params.videoEffectMaxHeight}static set videoEffectMaxHeight(t){e._params.videoEffectMaxHeight=t}static get vmoji(){return e._params.vmoji?.isBrowserSupported()?e._params.vmoji:null}static set vmoji(t){e._params.vmoji=t}static get vmojiOptions(){return e._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(t){e._params.vmojiOptions=t}static get voiceParams(){return e._params.voiceParams}static get specListenerParams(){return e._params.specListenerParams}static get iceRestartWaitTime(){return e._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return e._params.transportConnectionWaitTime}static get statisticsInterval(){return e._params.statisticsInterval}static set statisticsInterval(t){e._params.statisticsInterval=t}static get networkStatisticsInterval(){return e._params.networkStatisticsInterval}static get perfStatReportEnabled(){return e._params.perfStatReportEnabled}static get callStatReportEnabled(){return e._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return e._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return e._params.enableLogPerfStatReport}static get asrDataChannel(){return e._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return e._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return e._params.screenShareWebmBuilder}static get noiseSuppression(){return e._params.noiseSuppression}static get preferH264(){return e._params.preferH264}static get preferVP9(){return e._params.preferVP9}static get audioNack(){return e._params.audioNack}static get movieShare(){return e._params.movieShare&&e.videoTracksCount>0}static get videoTracksCount(){return Number(e._params.videoTracksCount)}static get breakVideoPayloadTypes(){return e._params.breakVideoPayloadTypes}static get useCallsToContacts(){return e._params.useCallsToContacts}static get useParticipantListChunk(){return e._params.useParticipantListChunk&&e.videoTracksCount>0}static get useRooms(){return e._params.useRooms}static get useChatRooms(){return e._params.useChatRooms}static get addParticipant(){return e._params.addParticipant}static get waitForAdminInGroupCalls(){return e._params.waitForAdminInGroupCalls}static get hold(){return e._params.hold}static get participantListChunkInitIndex(){return e._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return e._params.participantListChunkInitCount??null}static get filterObservers(){return e._params.filterObservers}static get muteMode(){return e._params.muteMode}static get preserveAudioTracks(){return e._params.preserveAudioTracks}static get audioShare(){return I.isAudioShareSupported()&&e._params.audioShare}static get audioShareWindowInclude(){return e._params.audioShareWindowInclude}static get audioShareSystemInclude(){return e._params.audioShareSystemInclude}static get fastScreenShare(){return e._params.fastScreenShare}static get screenShareCongestionControl(){return e._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return e._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return e._params.fastScreenShareWidth}static get fastScreenShareHeight(){return e._params.fastScreenShareHeight}static get consumerFastScreenShare(){return e._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return e._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return e._params.videoSuspend}static get enumerateDevicesDelay(){return e._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return e._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return e._params.enableVideoEffectsFpsDegradation}static get simulcast(){return e._params.simulcast}static get webtransport(){return e._params.webtransport}static get webtransportFF(){return e._params.webtransportFF}static get transparentAudio(){return e._params.transparentAudio}static toJSON(){return{apiKey:e._params.apiKey,apiEnv:e._params.apiEnv,audioShare:e._params.audioShare,audioShareWindowInclude:e._params.audioShareWindowInclude,audioShareSystemInclude:e._params.audioShareSystemInclude,useCallsToContacts:e._params.useCallsToContacts,useParticipantListChunk:e._params.useParticipantListChunk,useRooms:e._params.useRooms,useChatRooms:e._params.useChatRooms,addParticipant:e._params.addParticipant,fastScreenShare:e._params.fastScreenShare,participantListChunkInitCount:e._params.participantListChunkInitCount,screenShareCongestionControl:e._params.screenShareCongestionControl,screenShareCongestionControlThreshold:e._params.screenShareCongestionControlThreshold,videoTracksCount:e._params.videoTracksCount,asrDataChannel:e._params.asrDataChannel,videoMaxHeight:e._params.videoMaxHeight,videoMaxWidth:e._params.videoMaxWidth,videoEffectMaxHeight:e._params.videoEffectMaxHeight,videoEffectMaxWidth:e._params.videoEffectMaxWidth,videoSuspend:e._params.videoSuspend,debugLog:e._params.debugLog,callStatReportEnabled:e._params.callStatReportEnabled,joinFromMultipleDevices:e._params.joinFromMultipleDevices,movieShare:e._params.movieShare,clientType:e._params.clientType,clientStatsPlatform:e._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:e._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:e._params.switchVideoAtBadNetwork,simulcast:e._params.simulcast,webtransport:e._params.webtransport,webtransportFF:e._params.webtransportFF,transparentAudio:e._params.transparentAudio}}};g(w,`_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});function xe(e,t){return!(e.isAudioEnabled!==t.isAudioEnabled||e.isVideoEnabled!==t.isVideoEnabled||e.isScreenSharingEnabled!==t.isScreenSharingEnabled||e.isFastScreenSharingEnabled!==t.isFastScreenSharingEnabled||e.isAudioSharingEnabled!==t.isAudioSharingEnabled||e.isAnimojiEnabled!==t.isAnimojiEnabled)}function T(e){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},e||{})}var Se=e=>e.stop(),Ce=e=>e.getTracks().forEach(Se),we=e=>e.getVideoTracks().forEach(Se);async function Te(e,t){try{let n=typeof t.width==`number`?t.width:void 0,r=typeof t.height==`number`?t.height:void 0;await e.applyConstraints({...t,...n&&{width:{max:n,ideal:n}},...r&&{height:{max:r,ideal:r}}})}catch(e){R.warn(`setVideoConstraints failed`,e)}}var E=function(e){return e.CANCELED=`CANCELED`,e.REJECTED=`REJECTED`,e.REMOVED=`REMOVED`,e.HUNGUP=`HUNGUP`,e.MISSED=`MISSED`,e.BUSY=`BUSY`,e.FAILED=`FAILED`,e.NETWORK_ERROR=`NETWORK_ERROR`,e.KILLED=`KILLED`,e.BANNED=`BANNED`,e.HAS_ACTIVE_CALL=`HAS_ACTIVE_CALL`,e.CALLER_IS_BLOCKED=`CALLER_IS_BLOCKED`,e.NOT_FRIENDS=`NOT_FRIENDS`,e.CALLEE_IS_OFFLINE=`CALLEE_IS_OFFLINE`,e.CALLER_IS_REJECTED=`CALLER_IS_REJECTED`,e.UNKNOWN_ERROR=`UNKNOWN_ERROR`,e.UNSUPPORTED=`UNSUPPORTED`,e.OLD_VERSION=`OLD_VERSION`,e.SERVICE_DISABLED=`SERVICE_DISABLED`,e.SERVICE_UNAVAILABLE=`SERVICE_UNAVAILABLE`,e.EXTERNAL_API_ERROR=`EXTERNAL_API_ERROR`,e.SOCKET_CLOSED=`SOCKET_CLOSED`,e.ENDED=`ENDED`,e.KILLED_WITHOUT_DELETE=`KILLED_WITHOUT_DELETE`,e.ANOTHER_DEVICE=`ANOTHER_DEVICE`,e.NOT_FOUND=`NOT_FOUND`,e.VCHAT_DETAILED_ERROR=`VCHAT_DETAILED_ERROR`,e.TIMEOUT=`TIMEOUT`,e.PARTICIPANT_LIMIT_REACHED=`PARTICIPANT_LIMIT_REACHED`,e.FAST_START_ERROR=`FAST_START_ERROR`,e.FAST_JOIN_ERROR=`FAST_JOIN_ERROR`,e.CALL_TIMEOUT=`CALL_TIMEOUT`,e}(E||{}),D=class e extends Error{constructor(t,n){super(),g(this,`message`,void 0),g(this,`hangup`,void 0),g(this,`error`,void 0),g(this,`code`,void 0),g(this,`remote`,void 0),g(this,`custom_error`,void 0),this.name=`HangupReason`,this.code=n&&n.code||0,this.remote=n&&n.remote||!1,this.custom_error=n?.custom_error??null,Object.values(E).indexOf(t)>-1?this.hangup=t:this.error=t;let r=[];this.error&&r.push(`error`),this.remote&&r.push(`remote`),this.code&&r.push(`code: ${this.code}`),n&&n.message&&r.push(`message: '${n.message}'`),this.message=t+(r.length?` (${r.join(`, `)})`:``),Error.captureStackTrace&&Error.captureStackTrace(this,e)}},O=class e extends m{static setConversationIdProvider(t){e._conversationIdProvider=t}static create(t,n){e._instance||(e._instance=new e(t,n))}static log(t,n,r=!1){e._instance&&e._instance.log(t,n,r)}static logClientStats(t,n=!1){e._instance&&e._instance.logClientStats(t,n)}static logClientEvent(t,n=!1){e._instance&&e._instance.logClientEvent(t,n)}static destroy(){e._instance&&e._instance.destroy(),e._instance=null}constructor(e,t){super(),g(this,`_externalLogger`,void 0),g(this,`_api`,void 0),g(this,`_batchInterval`,3e3),g(this,`_batchedClientStats`,[]),g(this,`_batchedClientEvents`,[]),g(this,`_batchTimeout`,null),g(this,`_serverTimeDelta`,0),this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}log(e,t,n=!1){this._externalLogger&&this._externalLogger.log(e,t,n)}logClientStats(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(n).forEach(e=>{n[e]===void 0&&delete n[e]}),this._batchedClientStats.push(n),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let n=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(n),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}_getConversationId(){if(e._conversationIdProvider)try{return e._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}};g(O,`_instance`,void 0),g(O,`_conversationIdProvider`,null);var Ee=function(e){return e.FpsLimit=`fps-limit`,e}({}),De=class extends _{constructor(...e){super(...e),g(this,`FPS_LIMITS`,[13,20,Math.max(w.videoFrameRate,25)]),g(this,`THRESHOLD`,.8),g(this,`HISTORY_LENGTH`,10),g(this,`_fpsMeterUnsubscribe`,null),g(this,`_fpsHistory`,{cursor:0,arr:[]}),g(this,`_fpsLimitCursor`,this.FPS_LIMITS.length-1)}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(e){R.warn(`VideoEffectsFpsLimiter error`,e)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let e=this._fpsHistory.arr.reduce((e,t)=>e+t,0)/this.HISTORY_LENGTH,t=this.FPS_LIMITS[this._fpsLimitCursor];e<t*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),t!==this.fpsLimit&&this._triggerEvent(`fps-limit`,this.fpsLimit)}}_assertsVideoEffect(e){if(!(`addFpsMeterListener`in e))throw Error(`Outdated VideoEffect version`)}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}},Oe=function(e){return e.SOURCE_CHANGED=`SOURCE_CHANGED`,e.SOURCE_READY=`SOURCE_READY`,e.TRACK_REPLACED=`TRACK_REPLACED`,e.SCREEN_STATUS=`SCREEN_STATUS`,e.ANIMOJI_STATUS=`ANIMOJI_STATUS`,e}({}),k=function(e){return e.audio=`audio`,e.video=`video`,e.screen=`screen`,e.audioshare=`audioshare`,e}({}),ke=function(e){return e[e.CAMERA=1]=`CAMERA`,e[e.SCREEN=2]=`SCREEN`,e}({}),Ae=class extends _{constructor(){super(),g(this,`_stream`,null),g(this,`_screenTrack`,null),g(this,`_audioShareTrack`,null),g(this,`_screenShareTrack`,null),g(this,`_sendVideoTrack`,null),g(this,`_cameraVideoTrack`,null),g(this,`_micAudioTrack`,null),g(this,`_audioEffectsTrack`,null),g(this,`_mediaSettings`,T()),g(this,`_lastMediaSettings`,null),g(this,`_videoStatusOnScreenCapturingEnabled`,!1),g(this,`_effect`,null),g(this,`_audioEffectParams`,null),g(this,`_onDeviceChange`,void 0),g(this,`_animojiEnabled`,!1),g(this,`_videoEffectsFpsLimiter`,void 0),g(this,`videoTrackMuteHandler`,()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)}),this._initDeviceChangeListener(),w.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),w.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new De,this._videoEffectsFpsLimiter.addEventListener(Ee.FpsLimit,this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener(`mute`,this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&this._cameraVideoTrack.addEventListener(`mute`,this.videoTrackMuteHandler),w.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[y.AUDIO],t=!0){if(this._stream)return;let n=e.includes(y.VIDEO),r=e.includes(y.AUDIO),i=e.includes(y.ANIMOJI);if(!I.isBrowserSupported())throw new D(v.UNSUPPORTED);try{this._stream=await I.getUserMedia(n,r,t),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=n&&this._stream.getVideoTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=r&&this._stream.getAudioTracks().filter(e=>e.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=i&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=i,this._triggerEvent(`SOURCE_READY`)}catch(e){throw new D(e)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(e=>!e.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,n){let r=this.getStream(),i=this.getSendAudioTrack(),a=this.getSendVideoTrack(n);if(!r||!i&&!a&&!t)throw Error(`No local stream found`);i&&!t&&e.addTrack(i,r),a&&!t&&e.addTrack(a,r)}getMediaSettings(){return this._mediaSettings}get mediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case`videoinput`:if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case`audioinput`:if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(v.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&we(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=I.getSavedMicrophone(),n=I.getSavedCamera(),r=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,i=this._mediaSettings.isVideoEnabled&&n?.groupId!==e.camera?.groupId;try{r&&await this._changeAudioInput(),i&&await this._changeVideoInput()}catch{}},I.addEventListener(`devicechange`,this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&I.removeEventListener(`devicechange`,this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?`stream`:`video`,n=e||await I._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=n.getVideoTracks()[0],!this._stream)Ce(n);else{let e=await this._setEffect(this._effect,this.cameraVideoTrack);O.log(b.DEVICE_CHANGED,t),R.log(`Video stream changed`),await this._replaceLocalTrack(e),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}}catch(e){throw O.log(b.ERROR,`change_video`),R.warn(`Camera change failed`,e),e}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await I.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Ce(t);else{let e=await this._applyAudioEffect();O.log(b.DEVICE_CHANGED,`audio`),R.log(`Audio stream changed`,e),await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})}}catch(e){throw O.log(b.ERROR,`change_audio`),R.error(`Microphone change failed`,e),e}}async _changeScreen(e,t,n){try{if(n=n||await I.getScreenMedia(e,t),!this._stream)Ce(n);else{let r=n.getVideoTracks()[0];if(r.addEventListener(`ended`,()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),O.log(b.DEVICE_CHANGED,`screen`),R.log(`Screen capturing started`),this._screenTrack=r,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,w.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(r.contentHint=`motion`,this._screenShareTrack=r),n.getAudioTracks().length>0){let e=n.getAudioTracks()[0];e.contentHint=`music`,this._audioShareTrack=e,await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&R.debug(`Audio share requested but not captured`),this._triggerEvent(`SCREEN_STATUS`,{track:r}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`})}}catch(e){throw O.log(b.ERROR,`screen`),R.warn(`Screen capturing failed`,e),e}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent(`SCREEN_STATUS`,{track:null}),this._triggerEvent(`SOURCE_CHANGED`,{kind:`screen`}))}async stopAudioShareTrack(){if(this._audioShareTrack){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!w.audioEffects||!this._audioEffectParams)return w.audioEffects?.pause(),this._micAudioTrack;w.audioEffects.isInitialized||await w.audioEffects.init(),w.audioEffects.resume(),w.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),w.audioEffects.setSource(this._micAudioTrack);let e=w.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=I.getSilentMediaTrack();return e.contentHint=`music`,e.stop(),e}getBlackScreenShareTrack(){let e=I.getBlackMediaTrack();return e.contentHint=`motion`,e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let n=this._stream.getTracks().find(t=>t.kind===e.kind&&t.contentHint===e.contentHint);n?.id!==e.id&&(n?(n!==this._audioEffectsTrack&&n.stop(),this._stream?.removeTrack(n),this._stream?.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)):(this._stream.addTrack(e),this._triggerEvent(`TRACK_REPLACED`,e,t)))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(w.videoEffects),!w.videoEffects)return t;try{return w.videoEffects.setEffect(e,t)}catch(e){return R.warn(`Video effect failed`,e),t}}_stopEffect(){if(w.videoEffects)try{w.videoEffects.stopEffect()}catch(e){R.warn(`Video effect failed`,e)}}destroy(){this._destroyDeviceChangeListener(),I.releaseFirefoxMicrophonePermissionWarmup(),w.videoEffects&&(this._effect=null,w.videoEffects.destroy()),w.audioEffects&&w.audioEffects.destroy(),this._stream&&(Ce(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),I.getAudioContext()?.suspend().catch(e=>R.error(e)),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(y.AUDIO),await this.request(e),this._lastMediaSettings=null,this._stream)for(let e of this._stream.getTracks())this._triggerEvent(`TRACK_REPLACED`,e)}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return this._disableScreenCapture()}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;this.cameraVideoTrack?.stop();let t;if(e){let e=await I._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=e.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=I.getBlackMediaTrack(w.videoMinWidth,w.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent(`ANIMOJI_STATUS`,!e);return}this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(e,t)=>{await this._replaceLocalTrack(e),this._mediaSettings.isAudioEnabled=t,this._triggerEvent(`SOURCE_CHANGED`,{kind:`audio`})};if(e)try{let e=await I.getUserAudio();this._micAudioTrack=e.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(e){throw w.audioEffects?.pause(),t(I.getSilentMediaTrack(),!1),typeof e==`string`?Error(e):e}else w.audioEffects?.pause(),t(I.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent(`ANIMOJI_STATUS`,e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent(`SOURCE_CHANGED`,{kind:`video`})}async setResolution({video:e,effect:t}){if(!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw Error(`Local stream not found`);if(!this.cameraVideoTrack)throw Error(`Local video track not found`);let n=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,n)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(e=>!e.contentHint);if(!e)throw Error(`Local audio track not found`);if(e.enabled)return e.applyConstraints({noiseSuppression:w.noiseSuppression})}async videoEffect(e){if(!w.videoEffects)throw Error(`Video Effects library is not set`);if(O.log(b.DEVICE_CHANGED,`effect_${e?.effect||`none`}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let e=this.cameraVideoTrack.clone(),t=new MediaStream([e]);await this._applyVideoConstraints(e),await this._changeVideoInput(t)}catch(e){this._effect=t;let n=this.cameraVideoTrack.clone(),r=new MediaStream([n]);throw await this._changeVideoInput(r),e}}}async audioEffect(e){if(!w.audioEffects)throw Error(`Audio Effects library is not set`);if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!C.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let e=this._micAudioTrack.clone(),t=new MediaStream([e]);await this._changeAudioInput(t)}catch(e){this._audioEffectParams=t;let n=this._micAudioTrack.clone(),r=new MediaStream([n]);throw await this._changeAudioInput(r),e}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<w.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(e=>{R.warn(`MediaSource handleVideoEffectsLowFps error`,e)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??w.videoFrameRate;return this._effect?Math.min(e,w.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await Te(e,{width:this._effect?w.videoEffectMaxWidth:w.videoMaxWidth,height:this._effect?w.videoEffectMaxHeight:w.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}},je=class{constructor(){g(this,`_cameraPermissionStatus`,void 0),g(this,`_microphonePermissionStatus`,void 0),g(this,`_listener`,void 0)}static isSupported(){return I.browserName()!==`Firefox`&&`permissions`in navigator&&`PermissionStatus`in window}async init(e){try{let[t,n]=await Promise.all([navigator.permissions.query({name:`camera`}),navigator.permissions.query({name:`microphone`})]);this._cameraPermissionStatus=t,this._microphonePermissionStatus=n,this._listener=e,this._cameraPermissionStatus.onchange=e=>this.handlePermissionChange(e),this._microphonePermissionStatus.onchange=e=>this.handlePermissionChange(e)}catch(e){R.warn(`NavigatorPermissions init error`,e)}}handlePermissionChange(e){let t=e.target;if(t instanceof PermissionStatus){let{name:e,state:n}=t;switch(e){case`audio_capture`:this._listener(`microphone`,n);break;case`video_capture`:this._listener(`camera`,n);break}}}getPermissionState(e){let t=null;switch(e){case`camera`:t=this._cameraPermissionStatus.state;break;case`microphone`:t=this._microphonePermissionStatus.state;break}return t}},A=function(e){return e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.WAITING=`WAITING`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`,e.RECONNECT=`RECONNECT`,e.ERROR=`ERROR`,e.HANGUP=`HANGUP`,e.PERMISSIONS=`PERMISSIONS`,e.ONHOLD=`ONHOLD`,e}({});function j(e,...t){let n=w.get(e);typeof n==`function`&&setTimeout(n,0,...t)}function M(e,t,...n){if(w.filterObservers){if(Array.isArray(t)){if(t=t.filter(e=>!e.observer),!t.length)return}else if(t.observer)return}j(e,t,...n)}function N(e){return Object.assign({},e)}function Me(e){return e.slice()}var Ne;(function(e){function t(e,t,n){j(`onLocalStream`,e,N(t),n)}e.onLocalStream=t;function n(e,t){j(`onScreenStream`,e,N(t))}e.onScreenStream=n;function r(e,t){j(`onVmojiStream`,e,N(t))}e.onVmojiStream=r;function i(e){j(`onVmojiError`,e)}e.onVmojiError=i;function a(e,t){j(`onLocalStreamUpdate`,N(e),t)}e.onLocalStreamUpdate=a;function o(e,t){R.debug(`Local status:`,e),j(`onLocalStatus`,e,t)}e.onLocalStatus=o;function s(e,t,n){M(`onRemoteStream`,e,t,n)}e.onRemoteStream=s;function c(e,t){M(`onRemoteLive`,e,t)}e.onRemoteLive=c;function l(e,t){M(`onLocalLive`,e,t)}e.onLocalLive=l;function u(e,t){M(`onRemoteLiveUpdate`,e,t)}e.onRemoteLiveUpdate=u;function d(e,t){M(`onLocalLiveUpdate`,e,t)}e.onLocalLiveUpdate=d;function f(e,t,n){M(`onRemoteScreenStream`,e,t,n)}e.onRemoteScreenStream=f;function p(e,t){M(`onRemoteVmojiStream`,e,t)}e.onRemoteVmojiStream=p;function m(e,t,n){M(`onRemoteStreamSuspended`,e,t,n)}e.onRemoteStreamSuspended=m;function h(e,t,n,r,i,a){M(`onConversation`,e,N(t),N(n),r,i,a)}e.onConversation=h;function ee(e){e&&j(`onConversationParticipantListChunk`,e)}e.onConversationParticipantListChunk=ee;function te(e,t,n){M(`onRemoteMediaSettings`,e,N(t),n)}e.onRemoteMediaSettings=te;function g(e,t){M(`onLocalMediaSettings`,e,N(t))}e.onLocalMediaSettings=g;function _(e,t,n){M(`onRemoteSharedMovieInfo`,e,N(t),n)}e.onRemoteSharedMovieInfo=_;function v(e,t,n){M(`onRemoteSharedMovieStoppedInfo`,e,N(t),n)}e.onRemoteSharedMovieStoppedInfo=v;function y(e,t,n){M(`onLocalSharedMovieInfo`,e,N(t),n)}e.onLocalSharedMovieInfo=y;function b(e,t,n){M(`onLocalSharedMovieStoppedInfo`,e,N(t),n)}e.onLocalSharedMovieStoppedInfo=b;function x(e,t,n){M(`onRemoteSharedUrl`,e,t,n)}e.onRemoteSharedUrl=x;function S(e,t,n){M(`onParticipantAdded`,e,t,n)}e.onParticipantAdded=S;function ne(e,t,n){M(`onParticipantJoined`,e,t,n)}e.onParticipantJoined=ne;function re(e,t=!1){j(`onLocalParticipantState`,N(e),t)}e.onLocalParticipantState=re;function ie(e,t,n){M(`onRemoteParticipantState`,e,N(t),n)}e.onRemoteParticipantState=ie;function ae(e,t){j(`onRemoteParticipantsState`,e,t)}e.onRemoteParticipantsState=ae;function oe(e,t,n=null,r){R.debug(`Remote status:`,t,e),M(`onRemoteStatus`,e,t,n,r)}e.onRemoteStatus=oe;function se(){j(`onPermissionsRequested`)}e.onPermissionsRequested=se;function ce(e,t){j(`onPermissionsError`,e,t)}e.onPermissionsError=ce;function le(e,t,n){M(`onRemoteRemoved`,e,t,n)}e.onRemoteRemoved=le;function ue(e,t,n,r){j(`onCallState`,e,t,N(n),r)}e.onCallState=ue;function de(e,t,n){j(`onDeviceSwitched`,e,t,n)}e.onDeviceSwitched=de;function fe(e,t,n,r=!1,i=!1,a=null,o=null,s,c,l=null){let u=c?Me(c):void 0;j(`onMuteStates`,N(e),Me(t),Me(n),r,i,a,o,s,u,l)}e.onMuteStates=fe;function pe(e,t,n=!1){M(`onRolesChanged`,e,Me(t),n)}e.onRolesChanged=pe;function me(e,t=!1){j(`onLocalRolesChanged`,Me(e),t)}e.onLocalRolesChanged=me;function he(e,t,n,r){M(`onPinnedParticipant`,e,t,n,r)}e.onPinnedParticipant=he;function C(e,t){j(`onLocalPin`,e,t)}e.onLocalPin=C;function ge(e){j(`onOptionsChanged`,Me(e))}e.onOptionsChanged=ge;function _e(e){j(`onCallAccepted`,e)}e.onCallAccepted=_e;function ve(e){j(`onCallActive`,e)}e.onCallActive=ve;function ye(e,t,n){M(`onAcceptedCall`,e,t,n)}e.onAcceptedCall=ye;function be(){j(`onRateNeeded`)}e.onRateNeeded=be;function w(e,t){M(`onSpeakerChanged`,e,t)}e.onSpeakerChanged=w;function xe(e){j(`onVolumesDetected`,Me(e))}e.onVolumesDetected=xe;function T(e,t){j(`onLocalVolume`,e,t)}e.onLocalVolume=T;function Se(e,t){j(`onJoinStatus`,e,t)}e.onJoinStatus=Se;function Ce(e,t){j(`onHangup`,e,t)}e.onHangup=Ce;function we(e){j(`onMultipartyChatCreated`,N(e))}e.onMultipartyChatCreated=we;function Te(){j(`onDeviceChange`)}e.onDeviceChange=Te;function E(e){j(`onFingerprintChange`,e)}e.onFingerprintChange=E;function D(){j(`onTokenExpired`)}e.onTokenExpired=D;function O(e,t,n=!1){j(`onChatMessage`,e,t,n)}e.onChatMessage=O;function Ee(e,t,n=!1){j(`onCustomData`,e,t,n)}e.onCustomData=Ee;function De(e,t,n,r,i,a,o=null){j(`onRecordStarted`,e,t,n,r,i,a,o)}e.onRecordStarted=De;function Oe(e=null,t){j(`onRecordStopped`,e,t)}e.onRecordStopped=Oe;function k(e){j(`onLocalNetworkStatusChanged`,e)}e.onLocalNetworkStatusChanged=k;function ke(e){j(`onNetworkStatusChanged`,e)}e.onNetworkStatusChanged=ke;function Ae(e,...t){j(`onDebugMessage`,e,...t)}e.onDebugMessage=Ae;function je(e,t){j(`onStatistics`,Object.assign({},e,{memory:t}))}e.onStatistics=je;function A(){j(`onAutoplayError`)}e.onAutoplayError=A;function Ne(e,t,n,r,i){j(`onChatRoomUpdated`,e,t,n,r,i)}e.onChatRoomUpdated=Ne;function P(e){j(`onPromoted`,e)}e.onPromoted=P;function Pe(e){j(`onRemoteMixedAudioStream`,e)}e.onRemoteMixedAudioStream=Pe;function Fe(e){j(`onJoinLinkChanged`,e)}e.onJoinLinkChanged=Fe;function Ie(e){j(`onRoomsUpdated`,e)}e.onRoomsUpdated=Ie;function Le(e,t,n,r){j(`onRoomUpdated`,e,t,n,r)}e.onRoomUpdated=Le;function Re(e){j(`onRoomParticipantsUpdated`,e)}e.onRoomParticipantsUpdated=Re;function ze(e){j(`onRoomSwitched`,e)}e.onRoomSwitched=ze;function Be(e){j(`onRoomStart`,e)}e.onRoomStart=Be;function Ve(e,t=null){j(`onFeedback`,e,t)}e.onFeedback=Ve;function He(e){j(`onFeaturesPerRoleChanged`,e)}e.onFeaturesPerRoleChanged=He;function Ue(e){j(`onParticipantVmojiUpdate`,e)}e.onParticipantVmojiUpdate=Ue;function We(e,t){j(`onAsrSet`,e,t)}e.onAsrSet=We;function Ge(e,t,n){j(`onAsrStarted`,e,t,n)}e.onAsrStarted=Ge;function Ke(e){j(`onAsrStopped`,e)}e.onAsrStopped=Ke;function qe(e,t,n,r){j(`onAsrTranscription`,e,t,n,r)}e.onAsrTranscription=qe;function Je(e,t){j(`onParticipantIdChanged`,e,t)}e.onParticipantIdChanged=Je;function Ye(e){j(`onVideoSuspendSuggest`,e)}e.onVideoSuspendSuggest=Ye;function Xe(e){j(`onSignalingMessage`,typeof e==`string`?e:N(e))}e.onSignalingMessage=Xe;function Ze(e){j(`onPromotionApproved`,e)}e.onPromotionApproved=Ze;function Qe(){j(`onPeerRegistered`)}e.onPeerRegistered=Qe})(Ne||(Ne={}));var P=Ne,Pe=`_okcls_`,Fe=(()=>{try{let e=Date.now().toString(),t=window.localStorage,n=!1;return t.setItem(e,e),n=t.getItem(e)===e,t.removeItem(e),n?t:null}catch{return null}})();function Ie(e){let t=Fe?Fe.getItem(Pe+e):null;if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function Le(e,t){try{Fe&&Fe.setItem(Pe+e,JSON.stringify(t))}catch{}}function Re(e){Fe&&Fe.removeItem(Pe+e)}var ze;(function(e){function t(e){return Ie(e)||null}e.get=t;function n(e,t){Le(e,t)}e.set=n;function r(e){Re(e)}e.remove=r})(ze||(ze={}));var Be=ze,Ve=null,He=null,Ue=null,We=[],Ge=[],Ke=[],qe=null,Je=null,Ye=null,Xe=!1,Ze=!1,Qe,$e,et,tt=null,nt=null,rt=``,it=null,at=[],ot=null,st=navigator.appVersion,ct=navigator.appName,lt=navigator.userAgent,ut={},dt=function(e){return e.USER=`user`,e.ENVIRONMENT=`environment`,e}({});(function(e){function t(e){return Object.values(dt).includes(e)}e.contains=t})(dt||(dt={}));var ft=class{constructor(e,t=!1,n=w.videoMaxWidth,r=w.videoMaxHeight,i=w.videoFrameRate){g(this,`audio`,void 0),g(this,`video`,void 0),g(this,`needVideo`,void 0),g(this,`lastSimplifyWasReached`,void 0),g(this,`supportedConstraints`,void 0),g(this,`isVideoRequested`,()=>this.needVideo),this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let a=!1;if(e){a={noiseSuppression:w.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let t=F.getMicrophones(),n,r;if(Je&&(r=Je.groupId,n=Je.deviceId),typeof e==`string`)r=t.find(t=>t.deviceId===e)?.groupId,n=e;else if(!Je&&F.os()===`MacOS`&&t.find(e=>e.label.includes(`iPhone`))){let e=t.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));e&&(r=e.groupId,n=e.deviceId)}r&&this.supportedConstraints.groupId?a.groupId={exact:r}:n&&(a.deviceId={exact:n})}let o=!1;if(t){o={width:{min:w.videoMinWidth,max:n,ideal:n},height:{min:w.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:w.videoAspectRatio},frameRate:{ideal:i}};let e=F.getCameras(),a,s;if(qe&&(s=qe.groupId,a=qe.deviceId),typeof t==`string`)s=e.find(e=>e.deviceId===t)?.groupId,a=t;else if(!qe&&F.os()===`MacOS`&&e.find(e=>e.label.includes(`iPhone`))){let t=e.find(e=>!e.label.includes(`Virtual`)&&!e.label.includes(`iPhone`));t&&(s=t.groupId,a=t.deviceId)}s&&this.supportedConstraints.groupId?o.groupId={exact:s}:a&&(o.deviceId={exact:a}),w.videoFacingMode&&(o.facingMode={ideal:w.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=a,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video==`object`&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio==`object`&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let e=typeof this.video==`object`&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio==`object`&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||e)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},pt=class extends ft{constructor(e,t,n,r){if(super(!1,!0),g(this,`captureController`,void 0),this.captureController=`CaptureController`in window?new CaptureController:null,typeof this.video==`object`?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode):this.video={},this.video.cursor=`motion`,this.video.width=e,this.video.height=t,this.video.frameRate=n,this.video.displaySurface=w.displaySurface,F.browserName()===`Safari`){let n=Number(F.browserVersion());n===16?(this.video.width={max:e},this.video.height={max:t}):n===17&&(delete this.video.width,delete this.video.height)}r&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:w.audioShareSystemInclude?`include`:`exclude`,windowAudio:w.audioShareWindowInclude?`include`:`exclude`,controller:this.captureController})}},mt=class e{constructor(){g(this,`_lockId`,Math.round(Math.random()*99998)+1)}busy(){if(e._lockId)throw O.log(b.ERROR,`change_device`),R.warn(`Device change failed: MediaSource is busy`),Error(`MediaSource is busy`);e._lockId=this._lockId}free(){e._lockId===this._lockId&&(e._lockId=0)}};g(mt,`_lockId`,0);async function ht(){Ze=!1,Xe=!1,Ve=null;let e={camera:F.getSavedCamera(),microphone:F.getSavedMicrophone(),output:F.getSavedOutput()};await _t(),gt(`devicechange`,e),P.onDeviceChange()}function gt(e,...t){if(ut[e])for(let n of ut[e])n(...t)}async function _t(){return Ve||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!He&&navigator.mediaDevices.addEventListener&&(He=C.debounce(ht,w.enumerateDevicesDelay),navigator.mediaDevices.addEventListener(`devicechange`,He)),!Ue&&je.isSupported()&&(Ue=new je,await Ue.init((e,t)=>{switch(t){case`denied`:case`prompt`:He?.();break}})),Ve=navigator.mediaDevices.enumerateDevices().then(e=>{We=e.filter(e=>e.kind===`videoinput`?(e.label&&(Xe=!0),!0):!1),Ge=e.filter(e=>e.kind===`audioinput`?(e.label?Ze=!0:F.isMobile()&&F.browserName()===`Firefox`&&(Ze=Xe),!0):!1),Ke=e.filter(e=>e.kind===`audiooutput`);let t=qe?.deviceId??Be.get(`videoinput`),n=Je?.deviceId??Be.get(`audioinput`),r=Ye?.deviceId??Be.get(`audiooutput`);return qe=We.find(e=>e.deviceId===t)||null,Je=Ge.find(e=>e.deviceId===n)||null,Ye=Ke.find(e=>e.deviceId===r)||Ke[0]||null,Ve=Promise.resolve(e),e}).catch(()=>(Ve=null,[]))))}async function vt(){if(`userAgentData`in navigator)try{let{platformVersion:e}=await navigator.userAgentData.getHighEntropyValues([`platformVersion`]);if(!e){R.warn(`Can't to get OS version`);return}let t=parseInt(e.split(`.`)[0]);it=isNaN(t)?null:t}catch(e){R.warn(`Failed to get OS version`,e)}}function yt(e){if(qe&&Je)return;let t=(e,t)=>{let n=t.getSettings()?.deviceId;return e.find(e=>e.deviceId===n||e.label===t.label)||null};e?.getTracks().forEach(e=>{!Je&&e.kind===k.audio?Je=t(F.getMicrophones(),e):!qe&&e.kind===k.video&&(qe=t(F.getCameras(),e))})}async function bt(e,t){R.debug(`Try to get media`,JSON.parse(JSON.stringify(e.getNative()))),F.releaseFirefoxMicrophonePermissionWarmup();let n=(!e.isVideo()||F.hasCameraPermission())&&(!e.isAudio()||F.hasMicrophonePermission());!n&&!t&&P.onPermissionsRequested();let r=new mt;try{r.busy();let t=await navigator.mediaDevices.getUserMedia(e.getNative());return r.free(),n||await ht(),yt(t),t}catch(n){switch(r.free(),R.error(`getUserMedia error`,n),n.name){case`PermissionDeniedError`:case`PermissionDismissedError`:case`NotAllowedError`:case`SecurityError`:case`DOMException`:case`NotFoundError`:t=e.isVideoRequested()?v.CAMERA_PERMISSION:v.MIC_PERMISSION;break;case`OverconstrainedError`:t=v.OVERCONSTRAINED;break;case`TypeError`:t=v.UNKNOWN;break;case`AbortError`:case`NotReadableError`:t=e.isVideoRequested()?v.CAMERA_ACCESS:v.MIC_ACCESS;break;case`Error`:if(n.message===`MediaSource is busy`){t=e.isVideoRequested()?v.CAMERA_ACCESS:v.MIC_ACCESS;break}}if(e.canSimplify())return bt(e.simplify(),t);let i=t||v.UNKNOWN;throw P.onPermissionsError(i,n),i}}async function xt(){if(!(tt||F.browserName()!==`Firefox`||!navigator.mediaDevices?.getUserMedia))try{F.hasMicrophonePermission()||P.onPermissionsRequested(),tt=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1})}catch(e){R.warn(`Firefox microphone permission warmup failed`,e)}}async function St(e){R.debug(`Try to get screen`,JSON.parse(JSON.stringify(e.getNative())));let t=new mt;try{t.busy();let n=await navigator.mediaDevices.getDisplayMedia(e.getNative()),r=n?.getVideoTracks()[0];if(r){let t=r.getSettings()?.displaySurface;if(R.debug(`Got display media track: ${r.id} (${t})`),r.contentHint=`text`,e.captureController&&(t===`browser`||t===`window`))try{e.captureController.setFocusBehavior(`no-focus-change`)}catch(e){R.warn(`Failed to set focus behavior`,e)}}return n}catch(e){switch(e.name){case`PermissionDeniedError`:case`NotAllowedError`:case`SecurityError`:throw v.SCREEN_PERMISSION;default:throw v.SCREEN_ACCESS}}finally{t.free()}}function Ct(){return at.length||(at=(()=>{let e,t=!1,n=0,r=`0`,i=lt.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return e=/\brv[ :]+(\d+)/g.exec(lt),[`IE`,e&&e[1]||`Unknown`,t,n,r];if(i[1]===`Safari`){if(e=lt.match(/\bEdge\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(e=lt.match(/\bCriOS\/(\d+)/),e)return[`Chrome`,e[1],!0,Number(e[1]),r];if(e=lt.match(/\bFxiOS\/(\d+)/),e)return[`Firefox`,e[1],!1,n,r];if(e=lt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1],!1,n,r];if(e=lt.match(/\bOPT\/(\d+)/),e)return[`Opera`,e[1],!1,n,r]}if(i[1]===`Chrome`){if(t=!0,n=Number(i[2]),e=lt.match(/\bOPR\/(\d+)/),e)return[`Opera`,e[1]||`Unknown`,t,n,r];if(e=lt.match(/\bYaBrowser\/(\d+)/),e)return[`Yandex`,e[1]||`Unknown`,t,n,r];if(e=lt.match(/\bSferum\/((\d+)(?:\.\d+)*)/),e)return[`Sferum`,e[1]||`Unknown`,t,n,r];if(e=lt.match(/\bEdge?\/(\d+)/),e)return[`Edge`,e[1]||`Unknown`,t,n,r];if(window.opr!==void 0&&/^(.+\.)?ok.ru$/.test(window.location.host))return[`Opera`,`Hidden`,t,n,r]}return e=lt.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),e&&e[2]!==void 0&&(r=e[2]),[i[2]?i[1]:ct,e&&e[1]||i[2]||st,t,n,r]})()),at}var F;(function(e){async function t(){await _t(),await vt()}e.init=t;function n(){return We}e.getCameras=n;function r(){return Ge}e.getMicrophones=r;function i(){return Ke}e.getOutput=i;function a(){return We.length>0}e.hasCamera=a;function o(){return Ge.length>0}e.hasMicrophone=o;function s(){return qe}e.getSavedCamera=s;function c(){return Je}e.getSavedMicrophone=c;function l(){return Ye}e.getSavedOutput=l;function u(){return w.videoFacingMode}e.getVideoFacingMode=u;function d(){return Xe}e.hasCameraPermission=d;function f(){return Ze}e.hasMicrophonePermission=f;function p(){return Ue?.getPermissionState(`microphone`)??null}e.getMicrophonePermissionState=p;function m(e=!1){return f()?a()&&e?d():!0:!1}e.hasPermissions=m;function h(){tt&&(Ce(tt),tt=null)}e.releaseFirefoxMicrophonePermissionWarmup=h;async function ee(e=!1,t=!0,n=!0){!e&&!t?await xt():F.releaseFirefoxMicrophonePermissionWarmup();let r=o()&&t,i=a()&&e,s;if(!r&&!i)s=new MediaStream;else try{s=await bt(new ft(r,i))}catch{s=new MediaStream}return!s.getVideoTracks().length&&n&&s.addTrack(F.getBlackMediaTrack()),!s.getAudioTracks().length&&n&&s.addTrack(F.getSilentMediaTrack()),s}e.getUserMedia=ee;async function te(e,t){return St(new pt(e&&!w.consumerFastScreenShare?w.fastScreenShareWidth:window.screen.width,e&&!w.consumerFastScreenShare?w.fastScreenShareHeight:window.screen.height,w.getScreenFrameRate(e),t))}e.getScreenMedia=te;async function g(e=!1,t){return bt(new ft(!1,!0,e?w.videoEffectMaxWidth:w.videoMaxWidth,e?w.videoEffectMaxHeight:w.videoMaxHeight,t))}e._getUserVideo=g;async function _(e,t){let n=t?.width||w.videoMaxWidth,r=t?.height||w.videoMaxHeight;return bt(new ft(!1,e||!0,n,r))}e.getUserVideo=_;async function v(e){return bt(new ft(e||!0,!1))}e.getUserAudio=v;async function y(e,t){let[n]=e.getVideoTracks();if(!n)throw Error(`Video track not found in stream`);return Te(n,t)}e.setResolution=y;async function b(e,t){let n=(await _t()).find(n=>n.kind===e&&n.deviceId===t);return n?(e===`videoinput`?qe=n:e===`audioinput`?Je=n:e===`audiooutput`&&(Ye=n),Be.set(e,t),n):null}e._saveDeviceId=b;function x(){if(!et||et.readyState===`ended`){let e=F.getAudioContext(),t=e.createMediaStreamDestination(),n=e.createGain();n.gain.value=1e-5,n.connect(t),n.connect(e.destination);let r=e.createOscillator();r.type=`sine`,r.frequency.value=0,r.connect(n),r.start(),et=t.stream.getAudioTracks()[0]}return Object.assign(et.clone(),{enabled:!1})}e.getSilentMediaTrack=x;function S(e=w.videoMinWidth,t=w.videoMinHeight){$e||($e=document.createElement(`canvas`)),$e.width=e,$e.height=t;let n=$e.getContext(`2d`);return n.rect(0,0,e,t),n.fillStyle=`black`,n.fill(),(!Qe||Qe.readyState===`ended`)&&(Qe=$e.captureStream(w.videoFrameRate).getVideoTracks()[0]),Object.assign(Qe.clone(),{enabled:!1})}e.getBlackMediaTrack=S;function ne(){if(pe()===`Edge`&&Number(me())<70)return!1;try{let e=window;return`mediaDevices`in e.navigator&&`getUserMedia`in e.navigator.mediaDevices&&e.RTCPeerConnection&&e.RTCIceCandidate&&e.RTCSessionDescription&&e.HTMLCanvasElement&&e.HTMLCanvasElement.prototype.captureStream&&e.RTCRtpSender&&e.RTCRtpSender.prototype.replaceTrack&&e.RTCRtpSender.prototype.getParameters&&`sendBeacon`in navigator&&!0||!1}catch{return!1}}e.isBrowserSupported=ne;function re(){return!!navigator.mediaDevices.getDisplayMedia}e.isScreenCapturingSupported=re;function ie(){let e=F.browserName()===`Safari`&&F.browserVersion()===`15`&&F.browserSubVersion()===`1`,t=F.browserName()===`Opera`,n=F.browserName()===`Yandex`;return e||t||n}e.isBrokenH264Decoder=ie;function ae(){return F.browserName()===`Yandex`&&F.os()===`Windows`||w.simulcast}e.isBrokenVP9Encoder=ae;function oe(){let e=F.browserName()===`Safari`&&Number(F.browserVersion())===17&&[4,5,6].includes(Number(F.browserSubVersion())),t=F.os()===`Windows`&&F.osVersion()===10;return e||t}e.isBrokenVP9Decoder=oe;function se(){return F.browserName()===`Firefox`&&Number(F.browserVersion())<60}e.isOldDataChannelDescription=se;function ce(){return!(F.baseChromeVersion()&&F.isMobile())}e.canPreferH264=ce;function le(){return!(F.browserName()===`Firefox`||F.browserName()===`Safari`)}e.isSimulcastSupportedByBrowser=le;function ue(){return rt||(rt=(()=>{let e={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let t in e)if(Object.hasOwn(e,t)&&e[t].test(lt))return t;return`Unknown`})()),rt}e.os=ue;function de(){return it}e.osVersion=de;function fe(){return nt===null&&(nt=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(st)),nt}e.isMobile=fe;function pe(){return Ct()[0]}e.browserName=pe;function me(){return Ct()[1]}e.browserVersion=me;function he(){return Ct()[3]}e.baseChromeVersion=he;function C(){return ot||(ot=new(window.AudioContext||window.webkitAudioContext)),ot.resume().catch(()=>{R.warn(`Failed to resume AudioContext`)}),ot}e.getAudioContext=C;function ge(){return Ct()[4]}e.browserSubVersion=ge;function _e(){return F.baseChromeVersion()>=105&&!F.isMobile()}e.isAudioShareSupported=_e;function ve(e,t){ut[e]||(ut[e]=[]),ut[e].push(t)}e.addEventListener=ve;function ye(e,t){if(ut[e])if(!t)delete ut[e];else{let n=ut[e].indexOf(t);n>-1&&ut[e].splice(n,1)}}e.removeEventListener=ye})(F||(F={}));var I=F,wt=class e{static get startTime(){return e._list[0]?.t||0}static get endTime(){let t=e._list;return t[t.length-1]?.t||0}static startSession(){e._list=[]}static get conversationId(){return e._conversationId}static set conversationId(t){e._conversationId=t}static add(t){e._list.push(t)}static _createContextLogs(){let e=[[`Calls SDK ${w.sdkVersion}`,w.toJSON()],[`UserAgent:`,navigator.userAgent],[`Screen resolution:`,`${window.screen.width}x${window.screen.height}`],[`Permissions:`,`Camera: ${I.hasCameraPermission()}, Mic: ${I.hasMicrophonePermission()}`]],t=new Date,n=t.getTime(),r=t.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`});return e.map(e=>({h:r,t:n,l:`LOG`,d:e}))}static collectLogs(){let t=e._list;return t.length===0?[]:[...e._createContextLogs(),...t]}};g(wt,`_list`,[]),g(wt,`_conversationId`,null);var Tt=class{constructor(){g(this,`_items`,[])}get length(){return this._items.length}push(...e){this._items.push(...e)}merge(e){this._items.push(...e._items)}shift(){return this._items.shift()||null}bisect(){let e=this.length>1?Math.floor(this.length/2):1;this._items=this._items.slice(e)}head(){return this._items[0]||null}tail(){let e=this._items.length;return e?this._items[e-1]:null}clear(){this._items=[]}toString(){return this._items.length?JSON.stringify(this._items,(e,t)=>t instanceof Error?String(t):t):``}},Et=2*1024*1024,Dt=512*1024,Ot=100*1024,kt=5,At=`_okcls_logs_session_`,jt=3e4,Mt=class{constructor(){g(this,`_items`,[]),g(this,`_itemsSize`,0),g(this,`_storageSize`,Et);try{let e=window.localStorage;for(let t of Object.keys(e)){if(t.indexOf(At)!==0)continue;let n=e.getItem(t);if(!n){Ft(t);continue}let r=Pt(n);this.add(t,r)}}catch(e){console.error(`Storage is blocked`,e),this._storageSize=0}this._items.sort((e,t)=>e.date-t.date),this.cleanup(Ot)}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(e){this._storageSize=Math.min(e,this._storageSize,Et)}add(e,t){let n=parseInt(e.replace(At,``),10);this._itemsSize+=t,this._items.push({key:e,size:t,date:n})}deleteOldestItem(){let e=this._items.shift();e&&(Ft(e.key),this._itemsSize-=e.size)}cleanup(e){for(;this.length&&(this.size>Et||this.length>kt-1||this.size+e>this.available);)this.deleteOldestItem()}};function Nt(){return`${At}${Date.now()}`}function Pt(e){return new Blob([e]).size}function Ft(e){try{window.localStorage.removeItem(e)}catch(e){console.error(`Failed to remove log from storage`,e)}}function It(){let e=Ht.toString();if(!L.available||!e)return;let t=Pt(e);if(t>Dt){Ht.bisect(),It();return}L.cleanup(Ot+t);try{window.localStorage.setItem(Ut,e)}catch(e){if(console.warn(`Failed to write log to storage`,e),L.storageSize=L.size+t,L.cleanup(Ot+t),L.available>=Ot+t){It();return}if(t>Ot){Ht.bisect(),It();return}L.storageSize=0;return}t>Dt&&(L.add(Ut,t),Ut=Nt(),Ht.clear(),L.cleanup(Ot))}function Lt(){!L.available||!Ht.length||It()}function Rt(e=!1){let t=[];try{let e=window.localStorage;for(let n of L.items){let r=e.getItem(n.key);t.push(r)}let n=Ht.toString();n&&t.push(n)}catch(e){console.error(`Storage is blocked`,e)}let n=`[${t.join(`,`)}]`;if(e)return n;let r=`logs_${Date.now()}.json`;return zt(n,r),r}function zt(e,t){let n=document.createElement(`a`),r=new Blob([e],{type:`text/json`});n.href=URL.createObjectURL(r),n.download=t,n.click()}function Bt(e,t){if(!L.available)return;let n=new Date,r={t:n.getTime(),l:e,d:t,h:n.toLocaleString(`ru-RU`,{dateStyle:`short`,timeStyle:`long`})};Ht.push(r),wt.add(r),Wt||(Wt=window.setTimeout(()=>{Wt=null,Lt()},jt))}function Vt(){L||(L=new Mt,Ht=new Tt,Ut=Nt(),window.addEventListener(`beforeunload`,Lt))}var L,Ht,Ut,Wt=null;window.__VKCallsSDKLogs__=(e=!1)=>(L||Vt(),Lt(),Rt(e));var Gt=function(e){return e.DEBUG=`DEBUG`,e.LOG=`LOG`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({}),Kt;(function(e){let t=`📞`,n=(e,...t)=>{P.onDebugMessage(e,...t)},r=!1,i=(e,t)=>(...n)=>{e(...n),Bt(t,n)},a=console.debug.bind(console,t),o=console.log.bind(console,t),s=console.warn.bind(console,t),c=console.error.bind(console,t),l=n.bind(null,`DEBUG`),u=n.bind(null,`LOG`),d=n.bind(null,`WARN`),f=n.bind(null,`ERROR`),p=l,m=u,h=d,ee=f;function te(...e){p(...e)}e.debug=te;function g(...e){m(...e)}e.log=g;function _(...e){h(...e)}e.warn=_;function v(...e){ee(...e)}e.error=v;function y(){return r}e.enabled=y;function b(e){r=e,w.debugLog&&Vt(),e?(p=w.debugLog?i(a,`DEBUG`):a,m=w.debugLog?i(o,`LOG`):o,h=w.debugLog?i(s,`WARN`):s,ee=w.debugLog?i(c,`ERROR`):c):(p=w.debugLog?i(l,`DEBUG`):l,m=w.debugLog?i(u,`LOG`):u,h=w.debugLog?i(d,`WARN`):d,ee=w.debugLog?i(f,`ERROR`):f)}e.toggle=b;function x(e,...t){switch(e){case`DEBUG`:te(...t);break;case`LOG`:g(...t);break;case`WARN`:_(...t);break;case`ERROR`:v(...t);break}}e.send=x;function S(e,...t){}e.test=S})(Kt||(Kt={}));var R=Kt,z=new class{constructor(){g(this,`_conversations`,new Map),g(this,`_activeId`,null)}add(e){if(this._conversations.has(e.id))throw Error(`CallRegistry: conversation ${e.id} already exists`);this._conversations.set(e.id,e)}remove(e){e&&this._conversations.delete(e),this._activeId===e&&(this._activeId=null)}get(e){return this._conversations.get(e)}getActive(){return this._activeId?this._conversations.get(this._activeId)??null:null}getActiveId(){return this._activeId}has(e){return this._conversations.has(e)}getAll(){return Array.from(this._conversations.values())}async setActive(e){if(this._activeId===e||!this._conversations.has(e))return;let t=this.getActive();if(t)try{await t.hold(!0)}catch(e){throw R.error(`Can't hold previous active, error: ${e}`),Error(`Cannot switch call: hold failed`)}this._activeId=e;let n=this._conversations.get(e);if(n&&n?.isCallHeld)try{await n.hold(!1)}catch(e){throw R.error(`Can't hold next active, error: ${e}`),Error(`Cannot switch call: hold failed`)}}clear(){this._conversations.clear(),this._activeId=null}},qt=class extends _{constructor(...e){super(...e),g(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}get ready(){return!0}setParticipantIdRegistry(e){}requestRealloc(){}setEndpoint(e){}setWebTransportEndpoint(e){}setConversationId(e){}readyToSend(e=!0){}cleanup(){}requestTestMode(e,t){}getNextCommandSequenceNumber(){return 0}},B=function(e){return e.RECOVER=`recover`,e.ACCEPT_CALL=`accept-call`,e.ADD_PARTICIPANT=`add-participant`,e.REMOVE_PARTICIPANT=`remove-participant`,e.HANGUP=`hangup`,e.TRANSMIT_DATA=`transmit-data`,e.ACCEPT_PRODUCER=`accept-producer`,e.ALLOCATE_CONSUMER=`allocate-consumer`,e.CHANGE_MEDIA_SETTINGS=`change-media-settings`,e.CHANGE_PARTICIPANT_STATE=`change-participant-state`,e.CHANGE_STREAM_PRIORITIES=`change-streams-priorities`,e.UPDATE_DISPLAY_LAYOUT=`update-display-layout`,e.REPORT_PERF_STAT=`report-perf-stat`,e.REPORT_SHARING_STAT=`report-sharing-stat`,e.REPORT_NETWORK_STAT=`report-network-stat`,e.RECORD_START=`record-start`,e.RECORD_STOP=`record-stop`,e.RECORD_PUBLISH=`record-publish`,e.RECORD_SET_CONF=`record-set-conf`,e.RECORD_GET_STATUS=`record-get-status`,e.SWITCH_MICRO=`switch-micro`,e.SWITCH_TOPOLOGY=`switch-topology`,e.REQUEST_REALLOC=`request-realloc`,e.CHAT_MESSAGE=`chat-message`,e.CHAT_HISTORY=`chat-history`,e.CUSTOM_DATA=`custom-data`,e.GRANT_ROLES=`grant-roles`,e.MUTE_PARTICIPANT=`mute-participant`,e.ENABLE_FEATURE_FOR_ROLES=`enable-feature-for-roles`,e.PIN_PARTICIPANT=`pin-participant`,e.UPDATE_MEDIA_MODIFIERS=`update-media-modifiers`,e.CHANGE_OPTIONS=`change-options`,e.GET_WAITING_HALL=`get-waiting-hall`,e.GET_PARTICIPANT_LIST_CHUNK=`get-participant-list-chunk`,e.GET_PARTICIPANTS=`get-participants`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.REQUEST_TEST_MODE=`request-test-mode`,e.ADD_MOVIE=`add-movie`,e.UPDATE_MOVIE=`update-movie`,e.REMOVE_MOVIE=`remove-movie`,e.START_URL_SHARING=`start-url-sharing`,e.STOP_URL_SHARING=`stop-url-sharing`,e.GET_ROOMS=`get-rooms`,e.UPDATE_ROOMS=`update-rooms`,e.ACTIVATE_ROOMS=`activate-rooms`,e.REMOVE_ROOMS=`remove-rooms`,e.SWITCH_ROOM=`switch-room`,e.FEEDBACK=`feedback`,e.ASR_START=`asr-start`,e.ASR_STOP=`asr-stop`,e.REQUEST_ASR=`request-asr`,e.REQUEST_PROMOTION=`request-promotion`,e.ACCEPT_PROMOTION=`accept-promotion`,e.GET_HAND_QUEUE=`get-hand-queue`,e.ENABLE_VIDEO_SUSPEND=`enable-video-suspend`,e.ENABLE_VIDEO_SUSPEND_SUGGEST=`enable-video-suspend-suggest`,e.HOLD=`hold`,e.PUT_HANDS_DOWN=`put-hands-down`,e.CHANGE_SIMULCAST=`change-simulcast`,e}(B||{});function Jt(e){return e.stopStream}function Yt(e){return e.keyFrameRequested}function Xt(e){if(Jt(e))return`ss`;if(Yt(e))return`kf`;let t=``;return e.priority!==void 0&&(t+=`p=`+e.priority),e.width!==void 0&&e.height!==void 0&&(t!==``&&(t+=`:`),t+=`sz=`+Math.round(e.width)+`x`+Math.round(e.height)),e.fit!==void 0&&(t!==``&&(t+=`:`),t+=`fit=`+e.fit),t}var V=function(e){return e.CAMERA=`CAMERA`,e.SCREEN=`SCREEN`,e.STREAM=`STREAM`,e.MOVIE=`MOVIE`,e.ANIMOJI=`ANIMOJI`,e.SHARED_URL=`SHARED_URL`,e}({}),Zt=`s`,Qt=`m`;function $t(e){return e.participantId+(e.mediaType?`:`+Zt+e.mediaType:``)+(e.streamName?`:`+Qt+e.streamName:``)}function en(e){let t=e.split(`:`),n=t.shift();if(!n)throw Error(`Illegal stream description: `+e);let r=null,i,a=0;for(let n of t)switch(n.charAt(0)){case Zt:r=tn(n.slice(1));break;case Qt:i=n.slice(1);break;case`d`:a=Number.parseInt(n.slice(1),10);break;default:throw Error(`Unexpected parameter type `+n.charAt(0)+` in stream description `+e)}return{participantId:C.compose(n,a),mediaType:r,streamName:i}}function tn(e){for(let t of Object.keys(V))if(t===e)return V[t];return null}function nn(){let e=new DataView(new ArrayBuffer(64)),t=0;function n(n){if(t+n>e.byteLength){let r=new Uint8Array(Math.max(t+n,e.byteLength+64));r.set(new Uint8Array(e.buffer.slice(0,t))),e=new DataView(r.buffer)}}return{put(r){if(n(r.byteLength),rn(r)){let n=r.buffer;new Uint8Array(e.buffer).set(new Uint8Array(n),t)}else new Uint8Array(e.buffer).set(new Uint8Array(r),t);t+=r.byteLength},putI8(r){n(1),e.setInt8(t,r),++t},putI16(r){n(2),e.setInt16(t,r),t+=2},putI32(r){n(4),e.setInt32(t,r),t+=4},putI64(r){n(8);let i=r<0;i&&(r=-r);let a=r/4294967296|0,o=r%4294967296|0;i&&(o=~o+1|0,a=o===0?~a+1|0:~a),e.setUint32(t,a),e.setUint32(t+4,o),t+=8},putUi8(r){n(1),e.setUint8(t,r),++t},putUi16(r){n(2),e.setUint16(t,r),t+=2},putUi32(r){n(4),e.setUint32(t,r),t+=4},putUi64(r){n(8),e.setUint32(t,r/4294967296|0),e.setUint32(t+4,r%4294967296),t+=8},putF(r){n(8),e.setFloat64(t,r),t+=8},ui8array(){return new Uint8Array(e.buffer.slice(0,t))}}}function rn(e){return e.buffer!==void 0}function an(e){let t=ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),n=0;return{peek(){return t.getUint8(n)},get(e){n+=e;let r=t.byteOffset;return t.buffer.slice(r+n-e,r+n)},getI8(){return t.getInt8(n++)},getI16(){return n+=2,t.getInt16(n-2)},getI32(){return n+=4,t.getInt32(n-4)},getI64(){n+=8;let e=t.getInt32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getUi8(){return t.getUint8(n++)},getUi16(){return n+=2,t.getUint16(n-2)},getUi32(){return n+=4,t.getUint32(n-4)},getUi64(){n+=8;let e=t.getUint32(n-8),r=t.getUint32(n-4);return e*4294967296+r},getF32(){return n+=4,t.getFloat32(n-4)},getF64(){return n+=8,t.getFloat64(n-8)}}}var on=0,sn=1,cn=2,ln=3,un=4,dn=5,fn=6,pn=7,mn=0,hn=1,gn=2,_n=0,vn=0,yn=0,bn=1,xn=class{constructor(){g(this,`participantIdRegistry`,null)}setParticipantIdRegistry(e){this.participantIdRegistry=e}serializeUpdateDisplayLayout(e,t){let n=nn();l.Int.enc(n,on),l.Int.enc(n,_n),l.Int.enc(n,e),l.Nil.enc(n,null);let r=[];for(let e in t)Object.hasOwn(t,e)&&this.writeLayout(t,e,r);return l.Arr.enc(n,r),l.Nil.enc(n,null),n.ui8array().buffer}writeLayout(e,t,n){let r=e[t],i=nn();if(this.writeStreamDesc(t,i),Jt(r))l.Int.enc(i,hn);else if(Yt(r))l.Int.enc(i,gn);else if(l.Int.enc(i,mn),r.priority===void 0?l.Nil.enc(i,null):l.Int.enc(i,r.priority),r.width!==void 0&&r.height!==void 0?(l.Int.enc(i,Math.round(r.width)),l.Int.enc(i,Math.round(r.height))):(l.Nil.enc(i,null),l.Nil.enc(i,null)),r.fit!==void 0)switch(r.fit){case`cv`:l.Int.enc(i,yn);break;case`cn`:l.Int.enc(i,bn);break;default:l.Nil.enc(i,null)}else l.Nil.enc(i,null);n.push(i.ui8array().buffer)}writeStreamDesc(e,t){if(this.participantIdRegistry){let n=this.participantIdRegistry.getCompactId(e);if(n!==void 0){l.Int.enc(t,n);return}}l.Str.enc(t,e)}serializePerfStatReport(e,t){let n=nn();return l.Int.enc(n,sn),l.Int.enc(n,_n),l.Int.enc(n,e),l.Int.enc(n,t.framesDecoded),l.Int.enc(n,t.framesReceived),n.ui8array().buffer}serializeSharingStatReport(e,t){let n=nn();return l.Int.enc(n,cn),l.Int.enc(n,_n),l.Int.enc(n,e),l.Int.enc(n,t.minDelay),l.Int.enc(n,t.maxDelay),l.Int.enc(n,t.avgDelay),l.Int.enc(n,t.largeDelayDuration),n.ui8array().buffer}serializeRequestAsr(e,t){let n=nn();return l.Int.enc(n,ln),l.Int.enc(n,_n),l.Int.enc(n,e),l.Bool.enc(n,t.request),n.ui8array().buffer}serializeNetworkStatReport(e,t){let n=nn();return l.Int.enc(n,un),l.Int.enc(n,_n),l.Int.enc(n,e),l.Int.enc(n,t.timestamp),l.Int.enc(n,t.sendBitrate),n.ui8array().buffer}serializeEnableVideoSuspend(e,t){let n=nn();return l.Int.enc(n,dn),l.Int.enc(n,_n),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeEnableVideoSuspendSuggest(e,t){let n=nn();return l.Int.enc(n,fn),l.Int.enc(n,_n),l.Int.enc(n,e),l.Bool.enc(n,t.enabled),n.ui8array().buffer}serializeChangeSimulcast(e,t){let n=nn();l.Int.enc(n,pn),l.Int.enc(n,_n),l.Int.enc(n,e);let r=t.simulcastInfo.streams.length;l.Int.enc(n,t.mediaSource),l.Int.enc(n,r);for(let e of t.simulcastInfo.streams)l.Str.enc(n,e.rid),l.Int.enc(n,e.width),l.Int.enc(n,e.height),l.Int.enc(n,e.fps),l.Int.enc(n,e.bitrate/1e3);return n.ui8array().buffer}async deserializeCommandResponse(e){let t;t=e instanceof Blob?an(`arrayBuffer`in Blob.prototype?await e.arrayBuffer():await de(e)):an(e);let n=l.Int.dec(t),r=l.Int.dec(t);if(r!==_n){R.warn(`Unsupported version for command type: `+n+`, version `+r);return}if(l.Int.dec(t)!==vn){R.warn(`Error code: `+n+`received for command type: `+n+`, version `+r);return}switch(n){case on:return this.deserializeUpdateDisplayLayoutResponse(t);case sn:return this.deserializeReportPerfStatResponse(t);default:R.warn(`unsupported command response commandType: `+n);return}}deserializeUpdateDisplayLayoutResponse(e){let t=l.Int.dec(e),n=l.Arr.dec(e),r={};return n.forEach(e=>{let t=an(e),n=l.Any.dec(t);if(typeof n==`string`)r[n]=l.Int.dec(t);else{let e=n,i=$t(this.participantIdRegistry?.getStreamDescription(e));r[i]=l.Int.dec(t)}}),{type:`response`,sequence:t,response:B.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:r}}deserializeReportPerfStatResponse(e){let t=l.Int.dec(e),n=l.Int.dec(e);return{type:`response`,sequence:t,response:B.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:n}}},H=function(e){return e.CALL_FINISH=`call_finish`,e.CODEC_USAGE=`codec_usage`,e.SIGNALING_CONNECTED=`signaling_connected`,e.SCREENSHARE_FIRST_FRAME=`screen_share_first_frame`,e.FIRST_MEDIA_RECEIVED=`first_media_received`,e.CALL_DECLINED_OR_HANGED_LOCALLY=`CallDeclinedOrHangedLocally`,e.USER_FEEDBACK_RECEIVED=`UserFeedbackReceived`,e.CALL_START=`call_start`,e.SIGNALING_PING_SUMMARY=`signaling_ping_summary`,e.SIGNALING_COMMAND_SUMMARY=`signaling_command_summary`,e.WEBSOCKET_CONNECTED=`websocket_connected`,e.WEBSOCKET_RECONNECTED=`websocket_reconnected`,e.WEBSOCKET_FAILED_PINGS=`websocket_failed_pings`,e.WEBSOCKET_FAILED_EXCEPTION=`websocket_failed_exception`,e.WEBSOCKET_TIMEOUT=`websocket_timeout`,e.WEBSOCKET_RESTART=`websocket_restart`,e.WEBTRANSPORT_CONNECTED=`webtransport_connected`,e.WEBTRANSPORT_RECONNECTED=`webtransport_reconnected`,e.WEBTRANSPORT_FAILED_PINGS=`webtransport_failed_pings`,e.WEBTRANSPORT_FAILED_EXCEPTION=`webtransport_failed_exception`,e.WEBTRANSPORT_TIMEOUT=`webtransport_timeout`,e.WEBTRANSPORT_RESTART=`webtransport_restart`,e}(H||{}),Sn=1e3;function U(e,t,n=0){return t in e&&e[t]?e[t]:n}function Cn(...e){return t=>{for(let n of e)if(n(t))return!0;return!1}}function wn(e,t){return n=>n[e]===t}function Tn(e){return(t,n)=>n[e]-t[e]}function En(e,t){return t.reduce((t,n)=>(t[n[e]]=n,t),{})}function Dn(e){let t={},n=[];for(let r of e)t[r.id]||(t[r.id]=!0,n.push(r));return n}function On(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>[t,e[t]]).reduce((e,t)=>(e[t[0]]=C.isObject(t[1])?On(t[1]):t[1],e),{})}function kn(e){let t=[];for(let n of e)n.forEach(e=>t.push(e));return t}async function An(e){let t=[];return RTCRtpReceiver.prototype.getStats?(t.push(...e.getReceivers().map(e=>e.getStats())),t.push(...e.getSenders().map(e=>e.getStats()))):t.push(e.getStats()),Promise.all(t).then(kn).then(Dn)}function jn(e){let t=e.filter(wn(`type`,`candidate-pair`)).sort(Tn(`priority`)).find(Cn(wn(`nominated`,!0),wn(`selected`,!0)));if(!t)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let n={timestamp:t.timestamp,availableOutgoingBitrate:t.availableOutgoingBitrate||0,totalRoundTripTime:t.totalRoundTripTime||0,currentRoundTripTime:t.currentRoundTripTime||0,bytesSent:t.bytesSent||0,bytesReceived:t.bytesReceived||0},r=e.find(wn(`id`,t.remoteCandidateId));r&&Object.assign(n,{remote:{type:r.candidateType,address:r.ip||r.address,port:r.port,protocol:r.protocol}});let i=e.find(wn(`id`,t.localCandidateId));return i&&Object.assign(n,{local:{type:i.candidateType,address:i.ip||i.address,port:i.port,protocol:i.protocol,relayProtocol:i.relayProtocol,networkType:i.networkType}}),On(n)}function Mn(e,t,n=!1){let r=En(`id`,e),i=n?e.filter(Cn(wn(`type`,`remote-inbound-rtp`))):e.filter(Cn(wn(`type`,`inbound-rtp`),wn(`type`,`outbound-rtp`)));return I.browserName()===`Firefox`&&(i=Object.values(i.reduce((e,t)=>{if(!e[t.ssrc])e[t.ssrc]=t;else{let n=Object.assign({},e[t.ssrc],t),r=e[t.ssrc].isRemote?t:e[t.ssrc];n.id=r.id,n.type=r.type,delete n.isRemote,delete n.remoteId,e[n.ssrc]=n}return e},{}))),i.map(e=>{let n=Number(e.ssrc),i=e.mediaType||e.kind,a=e.remoteId||e.trackId,o=e.type,s=e.codecId;if(!o||!n||!i)return null;let c={ssrc:n,type:o,kind:i,bytesReceived:U(e,`bytesReceived`),bytesSent:U(e,`bytesSent`),headerBytesReceived:U(e,`headerBytesReceived`),headerBytesSent:U(e,`headerBytesSent`),jitter:U(e,`jitter`),packetsLost:U(e,`packetsLost`),packetsReceived:U(e,`packetsReceived`),packetsSent:U(e,`packetsSent`),fractionLost:U(e,`fractionLost`),pliCount:U(e,`pliCount`),firCount:U(e,`firCount`),nackCount:U(e,`nackCount`),userId:t[n],freezeCount:U(e,`freezeCount`,0),totalFreezesDuration:U(e,`totalFreezesDuration`,0)},l=`mid`in e&&typeof e.mid==`string`?e.mid:void 0,u=`rid`in e&&typeof e.rid==`string`?e.rid:void 0;if(l&&(c.mid=l),u&&(c.rid=u),i===`video`){let t=U(e,`framesDecoded`),n=U(e,`totalInterFrameDelay`),r=U(e,`totalSquaredInterFrameDelay`),i=U(e,`encoderImplementation`),a=U(e,`decoderImplementation`);i&&(c.encoderImplementation=i),a&&(c.decoderImplementation=a),c.interframeDelayVariance=(r-n*n/t)/t}if(i===`video`&&c.type===`outbound-rtp`&&(c.totalEncodeTime=U(e,`totalEncodeTime`)??0),i===`audio`&&(c.totalSamplesReceived=U(e,`totalSamplesReceived`),c.concealedSamples=U(e,`concealedSamples`),c.insertedSamplesForDeceleration=U(e,`insertedSamplesForDeceleration`),c.removedSamplesForAcceleration=U(e,`removedSamplesForAcceleration`),c.silentConcealedSamples=U(e,`silentConcealedSamples`),c.concealmentEvents=U(e,`concealmentEvents`),c.totalAudioEnergy=U(e,`totalAudioEnergy`)),s&&r[s]){let e=r[s];c.clockRate=e.clockRate,c.mimeType=e.mimeType,i===`audio`&&e.sdpFmtpLine&&(c.sdpFmtpLine=e.sdpFmtpLine)}if(a&&r[a]){let e=r[a];c.frameHeight=e.frameHeight,c.frameWidth=e.frameWidth,c.framesDecoded=e.framesDecoded,c.framesReceived=e.framesReceived,c.framesDropped=e.framesDropped}return On(c)}).filter(e=>!!e)}function Nn(e,t,n=!1){if(!t||!t.rtps||!e.rtps)return e;let r,i;n&&(r=En(`ssrc`,e?.remoteRtps||[]),i=En(`ssrc`,t?.remoteRtps||[]));let a=En(`ssrc`,e.rtps),o=En(`ssrc`,t.rtps),s=(e.timestamp-t.timestamp)/1e3;return!a||!o||Object.keys(a).forEach(c=>{let l=a[c],u=o[c];if(!(!l||!u)){if(l.bytesReceived&&l.bytesReceived>u.bytesReceived&&(l.bandwidth=Math.round((l.bytesReceived-u.bytesReceived)/s),l.bandwidth+=Math.round((l.headerBytesReceived-u.headerBytesReceived)/s)),l.bytesSent&&l.bytesSent>u.bytesSent&&(l.bandwidth=Math.round((l.bytesSent-u.bytesSent)/s),l.bandwidth+=Math.round((l.headerBytesSent-u.headerBytesSent)/s)),l.packetsReceived)if(l.packetsReceived>u.packetsReceived||l.packetsLost>u.packetsLost){let e=l.packetsLost-u.packetsLost,t=l.packetsReceived-u.packetsReceived;l.packetLoss=parseFloat((100*e/(e+t)).toFixed(2))}else l.packetLoss=0;if(l.freezeCount>u.freezeCount&&(l.freezeCountDelta=l.freezeCount-u.freezeCount),l.totalFreezesDuration>u.totalFreezesDuration&&(l.totalFreezesDurationDelta=l.totalFreezesDuration-u.totalFreezesDuration),l.framesDropped&&u.framesDropped&&l.framesDropped>u.framesDropped&&(l.framesDroppedDelta=parseFloat(((l.framesDropped-u.framesDropped)/s).toFixed(0))),n&&l.type===`outbound-rtp`&&l.kind===k.video){let n=r?.[c],a=i?.[c],o=e=>e??0,s=Math.max(0,o(n?.packetsLost)-o(a?.packetsLost)),d=Math.max(1,l.packetsSent-u.packetsSent);e.transport.averageNetStat={currentRoundTripTime:(e.transport.currentRoundTripTime+t.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(s/d*100)}}}}),e}async function Pn(e,t,n={},r=!1){let i=await An(e),a={timestamp:Date.now(),transport:jn(i),rtps:Mn(i,n)};return r&&(a.remoteRtps=Mn(i,n,!0)),t?Nn(a,t,r):(await C.delay(Sn),Pn(e,a,n,r))}function Fn(e){performance.clearMarks(e),performance.mark(e)}function In(e){performance.clearMarks(e)}function Ln(e){let t=performance.getEntriesByName(e)[0];if(t===void 0)return null;let n=Math.round(performance.now()-t.startTime);return performance.clearMarks(e),n}function Rn(e){return`${H.SCREENSHARE_FIRST_FRAME}_${zn(e)}`}function zn(e){return typeof e==`string`?e:JSON.stringify(e)}var W={distinctById:Dn,rtcStatsToArray:kn,extractTransport:jn,extractRtps:Mn,delta:Nn,collectStats:Pn,setMark:Fn,clearMark:In,measureMark:Ln,getMarkNameScreenshareFirstFrame:Rn},Bn=class e{constructor(){g(this,`_eventualLogs`,new Set)}static create(){e._instance=new e}static logCallStat(t){if(e._instance?._eventualLogs.size){for(let n of e._instance._eventualLogs)Object.assign(n,{call_topology:t.call_topology,local_address:t.local_address,local_connection_type:t.local_connection_type,network_type:t.network_type,remote_address:t.remote_address,remote_connection_type:t.remote_connection_type,transport:t.transport}),O.logClientStats(n);e._instance._eventualLogs.clear()}O.logClientStats(t)}static logEventualStat(t){t.value===void 0&&(t.value=W.measureMark(t.name)),t.value!==null&&e._instance?._eventualLogs.add(t)}static destroy(){e._instance?._destroy(),e._instance=null}_destroy(){this._eventualLogs.clear()}};g(Bn,`_instance`,null);var Vn=function(e){return e.WEBSOCKET=`ws`,e.WEBTRANSPORT=`wt`,e}({}),Hn=function(e){return e.CONNECTED=`connected`,e.RECONNECTED=`reconnected`,e.FAILED_PINGS=`failed_pings`,e.FAILED_EXCEPTIONS=`failed_exception`,e.TIMEOUT=`timeout`,e.RESTART=`restart`,e}({}),Un={connected:{wt:H.WEBTRANSPORT_CONNECTED,ws:H.WEBSOCKET_CONNECTED},reconnected:{wt:H.WEBTRANSPORT_RECONNECTED,ws:H.WEBSOCKET_RECONNECTED},failed_pings:{wt:H.WEBTRANSPORT_FAILED_PINGS,ws:H.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:H.WEBTRANSPORT_FAILED_EXCEPTION,ws:H.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:H.WEBTRANSPORT_TIMEOUT,ws:H.WEBSOCKET_TIMEOUT},restart:{wt:H.WEBTRANSPORT_RESTART,ws:H.WEBSOCKET_RESTART}},Wn=class{constructor(e){if(g(this,`q`,void 0),g(this,`inits`,[]),g(this,`n`,[1,2,3,4,5]),g(this,`np`,[1,1,1,1,1]),g(this,`qv`,[]),!(e>0&&e<1))throw Error(`q must be in (0,1)`);this.q=e}add(e){if(this.inits.length<5){this.inits.push(e),this.inits.length===5&&this.bootstrap();return}let t=0;if(e<this.qv[0])this.qv[0]=e,t=0;else if(e>=this.qv[4])this.qv[4]=e,t=3;else for(;!(e<this.qv[t+1]);)t++;for(let e=0;e<5;e++)this.n[e]+=e<=t?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let e=1;e<=3;e++){let t=this.np[e]-this.n[e];if(t>=1&&this.n[e+1]-this.n[e]>1||t<=-1&&this.n[e]-this.n[e-1]>1){let n=Math.sign(t),r=this.qv[e]+n/(this.n[e+1]-this.n[e-1])*((this.n[e]-this.n[e-1]+n)*(this.qv[e+1]-this.qv[e])/(this.n[e+1]-this.n[e])+(this.n[e+1]-this.n[e]-n)*(this.qv[e]-this.qv[e-1])/(this.n[e]-this.n[e-1]));r>this.qv[e-1]&&r<this.qv[e+1]?this.qv[e]=r:this.qv[e]=this.qv[e]+n*(this.qv[e+n]-this.qv[e])/(this.n[e+n]-this.n[e]),this.n[e]+=n}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let e=[...this.inits].sort((e,t)=>e-t),t=this.q*(e.length-1),n=Math.floor(t),r=t-n;return n+1<e.length?e[n]*(1-r)+e[n+1]*r:e[n]}return this.qv[2]}bootstrap(){this.inits.sort((e,t)=>e-t),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}},Gn=class{constructor(){g(this,`n`,0),g(this,`mean`,0)}add(e){this.n++;let t=e-this.mean;this.mean+=t/this.n}get avg(){return this.n?this.mean:NaN}},Kn=class{constructor(){g(this,`count`,0),g(this,`minVal`,1/0),g(this,`maxVal`,-1/0),g(this,`mean`,new Gn),g(this,`p50`,new Wn(.5)),g(this,`p95`,new Wn(.95))}add(e){e<this.minVal&&(this.minVal=e),e>this.maxVal&&(this.maxVal=e),this.mean.add(e),this.p50.add(e),this.p95.add(e),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}},qn=function(e){return e.NOTIFICATION=`NOTIFICATION`,e.FAILED=`FAILED`,e.RECONNECT=`RECONNECT`,e}(qn||{}),G=function(e){return e.TRANSMITTED_DATA=`transmitted-data`,e.ACCEPTED_CALL=`accepted-call`,e.HUNGUP=`hungup`,e.PARTICIPANT_ADDED=`participant-added`,e.PARTICIPANT_JOINED=`participant-joined`,e.CLOSED_CONVERSATION=`closed-conversation`,e.MEDIA_SETTINGS_CHANGED=`media-settings-changed`,e.PARTICIPANT_STATE_CHANGED=`participant-state-changed`,e.PARTICIPANTS_STATE_CHANGED=`participants-state-changed`,e.RATE_CALL_DATA=`rate-call-data`,e.FEATURE_SET_CHANGED=`feature-set-changed`,e.TOPOLOGY_CHANGED=`topology-changed`,e.PRODUCER_UPDATED=`producer-updated`,e.CONSUMER_ANSWERED=`consumer-answered`,e.MULTIPARTY_CHAT_CREATED=`multiparty-chat-created`,e.FORCE_MEDIA_SETTINGS_CHANGE=`force-media-settings-change`,e.SETTINGS_UPDATE=`settings-update`,e.VIDEO_QUALITY_UPDATE=`video-quality-update`,e.REGISTERED_PEER=`registered-peer`,e.SWITCH_MICRO=`switch-micro`,e.RECORD_STARTED=`record-started`,e.RECORD_STOPPED=`record-stopped`,e.REALLOC_CON=`realloc-con`,e.AUDIO_ACTIVITY=`audio-activity`,e.SPEAKER_CHANGED=`speaker-changed`,e.STALLED_ACTIVITY=`stalled-activity`,e.CHAT_MESSAGE=`chat-message`,e.CUSTOM_DATA=`custom-data`,e.ROLES_CHANGED=`roles-changed`,e.MUTE_PARTICIPANT=`mute-participant`,e.PIN_PARTICIPANT=`pin-participant`,e.OPTIONS_CHANGED=`options-changed`,e.NETWORK_STATUS=`network-status`,e.PARTICIPANT_SOURCES_UPDATE=`participant-sources-update`,e.PROMOTE_PARTICIPANT=`promote-participant`,e.CHAT_ROOM_UPDATED=`chat-room-updated`,e.PROMOTION_APPROVED=`promotion-approved`,e.JOIN_LINK_CHANGED=`join-link-changed`,e.FEEDBACK=`feedback`,e.MOVIE_UPDATE_NOTIFICATION=`movie-update-notification`,e.MOVIE_SHARE_STARTED=`movie-share-started`,e.MOVIE_SHARE_STOPPED=`movie-share-stopped`,e.URL_SHARING_INFO_UPDATED=`url-sharing-info-updated`,e.ROOM_UPDATED=`room-updated`,e.ROOMS_UPDATED=`rooms-updated`,e.ROOM_PARTICIPANTS_UPDATED=`room-participants-updated`,e.FEATURES_PER_ROLE_CHANGED=`features-per-role-changed`,e.PARTICIPANT_ANIMOJI_CHANGED=`participant-animoji-changed`,e.ASR_STARTED=`asr-started`,e.ASR_STOPPED=`asr-stopped`,e.DECORATIVE_PARTICIPANT_ID_CHANGED=`decorative-participant-id-changed`,e.VIDEO_SUSPEND_SUGGEST=`video-suspend-suggest`,e.HOLD=`hold`,e}(G||{}),Jn=function(e){return e.producerNotification=`producerNotification`,e.producerCommand=`producerCommand`,e.consumerScreenShare=`consumerScreenShare`,e.producerScreenShare=`producerScreenShare`,e.asr=`asr`,e.animoji=`animoji`,e}(Jn||{}),{isObject:Yn,isObjectsEquals:Xn}=C;function Zn(e,t){return e===null||t===null?e===null&&t===null:e.maxDimension!==t.maxDimension||e.maxBitrateK!==t.maxBitrateK||e.maxFramerate!==t.maxFramerate||e.degradationPreference!==t.degradationPreference||e.scalabilityMode!==t.scalabilityMode||Yn(e.bitrates)&&Yn(t.bitrates)&&!Xn(e.bitrates,t.bitrates,!0)?!1:e.bitrates===t.bitrates}var Qn=function(e){return e.L1T1=`L1T1`,e.L1T2=`L1T2`,e.L1T3=`L1T3`,e}({});function $n(e,t){return!(!Zn(e.camera,t.camera)||!Zn(e.screenSharing,t.screenSharing)||!Zn(e.fastScreenSharing,t.fastScreenSharing))}function er(e,t){return{camera:Object.assign({},e.camera,t.camera),screenSharing:Object.assign({},e.screenSharing,t.screenSharing),fastScreenSharing:Object.assign({},e.fastScreenSharing,t.fastScreenSharing)}}function tr(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var nr=class e{constructor(){g(this,`_codecUsages`,new Map),g(this,`getCurrentTransportTopology`,()=>void 0)}static create(t){let n=new e;n.getCurrentTransportTopology=t,e._instance=n}static reportUsage(t){let n=e._instance,r=n?.getCurrentTransportTopology();if(!n||!r)return;let i=t.rtps.filter(e=>e.type===`outbound-rtp`&&!e.mid?.endsWith(`s`));w.simulcast&&(i=i.reduce((e,t)=>{if(t.kind!==`video`)return e.concat(t);let n=e.find(e=>e.kind===`video`);return n?n.totalEncodeTime=(n.totalEncodeTime??0)+(t.totalEncodeTime??0):e.push(t),e},[])),i.forEach(e=>{let t=e.kind,i=e.mimeType;if((t===`audio`||t===`video`)&&i){let a=[i,`encoder`,e.encoderImplementation].filter(Boolean).join(`/`);n.saveUsage({kind:t,codecName:a,totalEncodeTime:(e.totalEncodeTime??0)*1e3,audioCodecParams:e.sdpFmtpLine,topology:r})}})}saveUsage({kind:e,codecName:t,totalEncodeTime:n,audioCodecParams:r,topology:i}){let a=this._codecUsages.get(e);if(a&&a.codecName!==t&&this.report(a),a&&a.codecName===t){this._codecUsages.set(e,{...a,totalEncodeTime:n,topology:i});return}this._codecUsages.set(e,{kind:e,codecName:t,audioCodecParams:r,totalEncodeTime:n,topology:i})}report(e){if(e.kind===`video`&&e.totalEncodeTime===0)return;let t={name:H.CODEC_USAGE,codec_implementation:e.codecName,value:e.totalEncodeTime,call_topology:e.topology===J.DIRECT?`D`:`S`};e.audioCodecParams&&(t.string_value=e.audioCodecParams),O.logClientStats(t)}static destroy(){e._instance?._destroy(),e._instance=null}_destroy(){this._codecUsages.forEach(e=>{this.report(e)}),this._codecUsages.clear()}};g(nr,`_instance`,null);var rr=class extends _{constructor(e,t){super(),g(this,`_signaling`,void 0),g(this,`_mediaSource`,void 0),g(this,`_state`,q.IDLE),g(this,`_pc`,null),this._signaling=e,this._mediaSource=t}getState(){return this._state||q.IDLE}},ir=`videochat-epi`,ar=5e3,or=500,sr=class extends _{constructor(e,t,n=!1){super(),g(this,`_previousPerfStatReportTimestamp`,0),g(this,`_previousNetworkStatReportTimestamp`,Date.now()),g(this,`_previousCallStatReportTimestamp`,Date.now()),g(this,`_previousCallStatReport`,null),g(this,`_screenShareStats`,[]),g(this,`_signaling`,void 0),g(this,`_directTopology`,void 0),g(this,`_handleScreenSharingStat`,e=>{this._screenShareStats.push(e)}),g(this,`_handleTransportStateChanged`,e=>{(this._directTopology&&e===q.CONNECTED||!this._directTopology&&e===q.OPENED)&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())}),this._signaling=t,this._directTopology=n,this.subscribe(e,K.REMOTE_DATA_STATS,this._handleStats.bind(this)),this.subscribe(e,K.SCREEN_SHARING_STAT,this._handleScreenSharingStat.bind(this)),this.subscribe(e,K.STATE_CHANGED,this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(ir)||``,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&&w.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+ar<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let n=e.outbound.transport.local?.protocol===`tcp`;!this._directTopology&&n&&this._previousNetworkStatReportTimestamp+or<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),w.callStatReportEnabled&&this._previousCallStatReportTimestamp+w.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((e,t)=>(t.kind===`video`&&(e.framesDecoded+=t.framesDecoded||0,e.framesReceived+=t.framesReceived||0),e),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let e=await this._signaling.reportPerfStat(t);localStorage.setItem(ir,e.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0)};if(t.timestamp)try{await this._signaling.reportNetworkStat(t)}catch{}}_reportCallStats(e){let t={call_topology:this._directTopology?`D`:`S`,stat_time_delta:0,nack_received:0,pli_received:0,fir_received:0,frames_dropped:0,jitter_video:0,jitter_audio:0,interframe_delay_variance:0,nack_sent:0,pli_sent:0,fir_sent:0,total_audio_samples_received:0,concealed_audio_samples:0,silent_concealed_audio_samples:0,inserted_audio_samples_for_deceleration:0,removed_audio_samples_for_acceleration:0,audio_concealment_events:0,total_audio_energy:0,inbound_video_count:0,inbound_audio_count:0,packets_lost_video:0,packets_sent_video:0,packets_lost_audio:0,packets_sent_audio:0,freeze_count:0,total_freezes_duration:0,rtt:Math.round(e.inbound.transport.currentRoundTripTime*1e3),ss_freeze_count:0,ss_total_freezes_duration:0,local_address:lr(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:lr(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let n=!1,r=!1;for(e.inbound.rtps.reduce((e,t)=>(t.kind===`video`?(n=!0,t.framesReceived&&(e.jitter_video=e.jitter_video*e.inbound_video_count/(e.inbound_video_count+1)+t.jitter*1e3/(e.inbound_video_count+1),e.interframe_delay_variance=e.interframe_delay_variance*e.inbound_video_count/(e.inbound_video_count+1)+(t.interframeDelayVariance||0)*1e6/(e.inbound_video_count+1),e.inbound_video_count++),e.frames_dropped+=t.framesDropped||0,e.nack_sent+=t.nackCount,e.pli_sent+=t.pliCount,e.fir_sent+=t.firCount,e.freeze_count+=t.freezeCountDelta||0,e.total_freezes_duration+=t.totalFreezesDurationDelta||0):(r=!0,t.totalSamplesReceived&&(e.jitter_audio=e.jitter_audio*e.inbound_audio_count/(e.inbound_audio_count+1)+t.jitter*1e3/(e.inbound_audio_count+1),e.total_audio_energy=e.total_audio_energy*e.inbound_audio_count/(e.inbound_audio_count+1)+(t.totalAudioEnergy||0)/(e.inbound_audio_count+1),e.inbound_audio_count++),e.total_audio_samples_received+=t.totalSamplesReceived||0,e.inserted_audio_samples_for_deceleration+=t.insertedSamplesForDeceleration||0,e.removed_audio_samples_for_acceleration+=t.removedSamplesForAcceleration||0,e.concealed_audio_samples+=t.concealedSamples||0,e.silent_concealed_audio_samples+=t.silentConcealedSamples||0,e.audio_concealment_events+=t.concealmentEvents||0),e),t),e.outbound.rtps.reduce((e,t)=>(t.kind===`video`?(e.nack_received+=t.nackCount,e.pli_received+=t.pliCount,e.fir_received+=t.firCount,e.packets_sent_video+=t.packetsSent):e.packets_sent_audio+=t.packetsSent,e),t),e.remoteInbound.rtps.reduce((e,t)=>(t.kind===`video`?e.packets_lost_video+=t.packetsLost:e.packets_lost_audio+=t.packetsLost,e),t);this._screenShareStats.length;){let e=this._screenShareStats.pop();e?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=e.freeze_duration)}let i={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(navigator.hardwareConcurrency&&(i.cpu_hardware_concurrency=navigator.hardwareConcurrency),n&&!ur(t.jitter_video)&&(i.jitter_video=Math.round(t.jitter_video)),r&&!ur(t.jitter_audio)&&(i.jitter_audio=Math.round(t.jitter_audio)),n&&!ur(t.interframe_delay_variance)&&(i.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(i.freeze_count=t.freeze_count,i.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(i.ss_freeze_count=t.ss_freeze_count,i.ss_total_freezes_duration=t.ss_total_freezes_duration),r&&!ur(t.total_audio_samples_received)){let e=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),n=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),r=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),a=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),o=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),s=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);i.inserted_audio_samples_for_deceleration=dr(n/e*1e3),i.removed_audio_samples_for_acceleration=dr(r/e*1e3),i.concealed_audio_samples=dr(a/e*1e3),i.concealed_silent_audio_samples=dr(o/e*1e3),i.concealment_audio_avg_size=dr(a/s),i.total_audio_energy=t.total_audio_energy}cr(t,`local_address`,`local_connection_type`,`network_type`,`transport`)&&(i.local_address=t.local_address,i.local_connection_type=t.local_connection_type,i.network_type=t.network_type,i.transport=t.transport),cr(t,`remote_address`,`remote_connection_type`)&&(i.remote_address=t.remote_address,i.remote_connection_type=t.remote_connection_type);let a=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),o=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);a>0&&(i.video_loss=dr(Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video)/a*100)),o>0&&(i.audio_loss=dr(Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio)/o*100)),Bn.logCallStat(i),w.enableLogPerfStatReport&&R.log(`Sent call stats`,i),this._previousCallStatReport=t}};function cr(e,...t){for(let n of t)if(!Object.hasOwn(e,n)||e[n]===void 0)return!1;return!0}function lr(e,t=!1){if(e?.address)return e.address+(t?`:${e.port}`:``)}function ur(e){return e===void 0}function dr(e){return Number.isNaN(e)?0:e}var fr=class{constructor(e,t=null){g(this,`weightUp`,void 0),g(this,`weightDown`,void 0),g(this,`value`,NaN),this.weightUp=e,this.weightDown=t??e}set(e){this.value=e}update(e){return this.value=Number.parseFloat(this.getNext(e).toFixed(3)),this.value}getNext(e){if(isNaN(this.value))return e;let t=e<this.value?this.weightDown:this.weightUp;return this.value*(1-t)+e*t}getValue(){return this.value}},pr=.25,mr=.35,hr=85,gr=.1,_r=1.5,vr=.1,yr=1,br=.6,xr=.3,Sr=class extends _{constructor(e){super(),g(this,`_signaling`,void 0),g(this,`_localNetworkStat`,void 0),g(this,`_remoteNetworkStat`,void 0),g(this,`_lastNetworkStat`,void 0),g(this,`_networkLimits`,{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}}),g(this,`_lastStatSentTimestamp`,0),g(this,`_currentState`,`good`),this._signaling=e,this._localNetworkStat={rtt:new fr(pr,pr),loss:new fr(mr,mr),bitrate:0},this._remoteNetworkStat={rtt:0,loss:0,bitrate:0},this._lastNetworkStat={rtt:0,loss:0,date:0}}_calcRttRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.rtt)/hr);for(let e=0;e<r;e++)n*=1-gr;return n}_calcLossRating(e){let t=typeof e==`number`?e:e.getValue(),n=1;if(isNaN(t))return n;let r=Math.round((t-this._networkLimits.goodNet.loss)/_r);for(let e=0;e<r;e++)n*=1-vr;return n}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*yr;return Math.min(n,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,n){return n?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=br?`good`:e>=xr?`medium`:`bad`}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol===`tcp`,n=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),r=e.inbound.rtps.reduce((e,t)=>Math.max(e,t.packetLoss||0),0),i={rtt:this._localNetworkStat.rtt.update(n),loss:this._localNetworkStat.loss.update(r)};if(t){let t=e.outbound.rtps.reduce((e,t)=>e+(t.bandwidth??0)*8,0);i.bitrate=t,this._localNetworkStat.bitrate=t}let a=Date.now(),o=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),s=Math.max(Math.round(o*10)/10,.1),c=this._getNetworkState(s);(t||c!==this._currentState||a-this._lastStatSentTimestamp>w.networkStatisticsInterval)&&(this._lastStatSentTimestamp=a,this._signaling.customData({sdk:Object.assign({type:`bad-net`},i)},null).catch(e=>{R.warn(`Unable to send [bad-net]`,e)})),this._currentState=c,this._triggerEvent(K.NETWORK_STATUS,s)}reportRemote(e){let{rtt:t,loss:n,bitrate:r}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=n||0,this._remoteNetworkStat.bitrate=r||0}},Cr=30*1e3,wr=class e extends rr{constructor(e,t,n,r,i){super(n,r),g(this,`_participantId`,void 0),g(this,`_isMaster`,void 0),g(this,`_remoteSDP`,{}),g(this,`_remoteCandidates`,{}),g(this,`_lastRemoteSDP`,null),g(this,`_animojiDataChannel`,null),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),g(this,`_remoteAnimojiVersion`,1),g(this,`_isOpen`,!1),g(this,`_remotePeerId`,null),g(this,`_statInterval`,null),g(this,`_settingsInterval`,null),g(this,`_failedOnCreate`,null),g(this,`_remoteStream`,null),g(this,`_iceRestartTimeout`,null),g(this,`_reconnectionTimeout`,null),g(this,`_reconnectionPrevented`,!1),g(this,`_lastStat`,void 0),g(this,`_fingerprint`,null),g(this,`_neverConnected`,!0),g(this,`_serverSettings`,void 0),g(this,`_prevConsumerSettings`,{}),g(this,`_networkLimitsForVideo`,{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}}),g(this,`_videoMaxDimensionsForNet`,{worst:320,bad:640,good:1280}),g(this,`_lastVideoMaxDimension`,this._videoMaxDimensionsForNet.good),g(this,`_lastBadConnection`,0),g(this,`_perfStatReporter`,void 0),g(this,`_directStatReporter`,void 0),this._participantId=e,this._isMaster=t,this._serverSettings=i,this._perfStatReporter=new sr(this,n,!0),this._directStatReporter=new Sr(n),this.subscribe(this._signaling,qn.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Oe.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Oe.SOURCE_CHANGED,this._applySettings.bind(this)),this.subscribe(this._directStatReporter,K.NETWORK_STATUS,this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:w.iceServers,iceTransportPolicy:w.forceRelayPolicy?`relay`:`all`})}catch(e){R.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}if(this._pc.onicecandidate=this._handleIceCandidate.bind(this),this._pc.ontrack=this._onAddTrack.bind(this),this._pc.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),this._pc.onconnectionstatechange=this._onConnectionStateChange.bind(this),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},w.vmoji&&this._createDataChannel(this._pc,Jn.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){O.log(b.ERROR,`addTrack-direct`),R.error(`Unable to add media source tracks`,e,{participantId:this._participantId}),this._failedOnCreate=e;return}this._createOffer(!1).catch(e=>{this._state===q.IDLE?this._failedOnCreate=e:this.close(e)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return[q.IDLE,q.CLOSED,q.FAILED].includes(this.getState())}async open(e=null){if(this._isOpen){R.warn(`DirectTransport: Already opened`,{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(R.debug(`DirectTransport: Open transport`,{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(e){O.log(b.ERROR,`addTrack-direct`),R.error(`DirectTransport: Unable to add media source tracks`,e,{participantId:this._participantId}),this.close(e);return}this._setState(q.OPENED);let t=e;if(!e){let e=Object.keys(this._remoteSDP);t=e[e.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){$n(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(w.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&(this._isOpen=!1,this._stopReconnection(),this._remoteStream&&(this._remoteStream.getTracks().forEach(e=>{e.stop(),this._triggerEvent(K.REMOTE_TRACK_REMOVED,this._remoteStream,e)}),this._remoteStream=null),this._stopStatInterval(),this._stopSettingsInterval(),this._pc&&(this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close()),this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.oniceconnectionstatechange=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._pc.close(),this._pc=null),this._onNetworkStatus(1),this.unsubscribe(),e?(R.error(`DirectTransport: Closed`,e,{participantId:this._participantId}),this._setState(q.FAILED)):(R.debug(`DirectTransport: Closed`,{participantId:this._participantId}),this._setState(q.CLOSED)),this._triggerEvent(K.PEER_CONNECTION_CLOSED))}_setState(e){this._state!==e&&(R.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent(K.STATE_CHANGED,e))}_onSignalingNotification(e){switch(e.notification){case G.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case G.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case G.CUSTOM_DATA:Object.hasOwn(e.data,`sdk`)&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,n=C.getPeerIdString(e.peerId);C.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(n,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(n,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){R.debug(`Add remote ice candidate`,{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(e){throw O.log(b.ERROR,`addIceCandidate-direct`),R.error(`Unable to add remote ice candidate`,e,{participantId:this._participantId,candidate:t}),e}}else R.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]){R.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let n of t)try{await this._addIceCandidate(e,n)}catch{}}async _setRemoteDescription(t,n){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===t)&&this._pc){if(this._lastRemoteSDP?.sdp===n.sdp)return;this._lastRemoteSDP=n,n=e._patchRemoteDescription(n),R.debug(`Add remote description`,{participantId:this._participantId,sdp:n}),this._calcFingerprint(n.sdp);try{await this._pc.setRemoteDescription(n),await this._setRemoteCandidates(t),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(e){throw O.log(b.ERROR,`setRemoteDescription-direct`),R.error(`Unable to set remote description`,e,{participantId:this._participantId,sdp:n}),e}}else this._remoteSDP[t]=n}_processAnimojiProtocolVersion(e){let t=Math.min(e,w.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){R.debug(`Added remote track`,{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=e=>{this._triggerEvent(K.REMOTE_TRACK_REMOVED,this._remoteStream,e.track)}),this._triggerEvent(K.REMOTE_TRACK_ADDED,this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(R.debug(`Local ice candidate`,{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){R.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:w.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case`have-local-offer`:let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(Error());break;case`have-remote-offer`:this._createAnswer().then(t=>this._signaling.sendSdp(this._participantId,t,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(R.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case`checking`:let e=this.getState();e===q.IDLE||e===q.OPENED?this._setState(q.CONNECTING):this._setState(q.RECONNECTING);break;case`connected`:case`completed`:I.browserName()===`Safari`&&this._pc?.connectionState!==`connected`&&this._markConnected();break}}_markConnected(){this._neverConnected=!1,this._setState(q.CONNECTED),this._stopReconnection(),this._pc&&C.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(O.log(b.ICE_CONNECTION_TYPE,e.local.type),R.debug(`Selected ICE candidates`,e))}),this._startStatInterval()}_onConnectionStateChange(){switch(R.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),O.log(b.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case`connected`:this._markConnected();break;case`failed`:case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection ${this._pc.connectionState}`)):(this._setState(q.RECONNECTING),this._startReconnection());break;case`closed`:this.close(Error(`Ice connection closed`));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(R.log(`Waiting for reconnection...`,{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},w.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(R.log(`Switch topology DIRECT to SERVER`,{participantId:this._participantId}),this._signaling.switchTopology(J.SERVER))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(O.log(b.ICE_RESTART),R.log(`Ice restart`,{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):R.debug(`Waiting for ice restart...`,{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,R.error(`Ice restart failed`,{participantId:this._participantId}),O.log(b.ERROR,`iceRestart-direct`),this._requestTopologySwitch()},w.iceRestartWaitTime)}async _createOffer(t){let n={iceRestart:t,offerToReceiveAudio:!0,offerToReceiveVideo:!0};R.debug(`Create offer`,{participantId:this._participantId,options:n});let r;try{r=await this._pc?.createOffer(n),R.debug(`Created offer`,{participantId:this._participantId,offer:r}),r=e._patchLocalDescription(r)}catch(e){throw R.error(`Unable to create offer`,e,{participantId:this._participantId}),O.log(b.ERROR,`createOffer-direct`),e}try{return R.debug(`Set local description`,{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(e){throw R.error(`Unable to set local description`,e,{participantId:this._participantId}),O.log(b.ERROR,`setLocalDescription-direct`),e}}async _createAnswer(){R.debug(`Create answer`,{participantId:this._participantId});let t;try{t=await this._pc?.createAnswer(),R.debug(`Created answer`,{participantId:this._participantId,answer:t}),t=e._patchLocalDescription(t)}catch(e){throw R.error(`Unable to create answer`,e,{participantId:this._participantId}),O.log(b.ERROR,`createAnswer-direct`),e}try{return R.debug(`Set local description`,{participantId:this._participantId,answer:t}),this._calcFingerprint(t.sdp),await this._pc?.setLocalDescription(t),t}catch(e){throw R.error(`Unable to set local description`,e,{participantId:this._participantId}),O.log(b.ERROR,`setLocalDescription-direct`),e}}static _patchLocalDescription(e){let t=!!I.baseChromeVersion();return e.sdp=C.patchLocalSDP(e.sdp,w.preferH264&&I.canPreferH264(),I.isBrokenH264Decoder(),w.preferVP9,t&&w.audioNack),e}static _patchRemoteDescription(e){return e.sdp=C.patchRemoteSDP(e.sdp,!1,!1,!1,w.preferVP9,I.isBrokenVP9Encoder(),I.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(e=>{R.error(`DirectTransport: Unable to replace track`,e,{participantId:this._participantId}),O.log(b.ERROR,`replaceTrack-direct`)})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}W.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,nr.reportUsage(t);let n={inbound:{topology:J.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`inbound-rtp`?(e.userId=this._participantId,!0):!1)},outbound:{topology:J.DIRECT,transport:t.transport,rtps:t.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:J.DIRECT,transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(n),this._directStatReporter.reportLocal(n),this._triggerEvent(K.REMOTE_DATA_STATS,n),this._statInterval=window.setTimeout(e,w.statisticsInterval)})};this._statInterval=window.setTimeout(e,w.statisticsInterval)}async _isSVCSupported(e,t){let n=this._mediaSource.getSendVideoTrack(),r=e.outbound.rtps.find(e=>e.kind===`video`);if(!r?.mimeType||!r?.bandwidth||!n)return!1;let i=n.getSettings();if(!i.width||!i.height||!i.frameRate)return!1;let a={type:I.browserName()===`Firefox`?`transmission`:`webrtc`,video:{contentType:r.mimeType,width:i.width,height:i.height,bitrate:r.bandwidth,framerate:i.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(a)).supported||!1}catch(e){return R.warn(`Failed to get encodingInfo`,a,e),!1}}async _checkPPTNetwork(e){if(!w.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,n=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,r=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,i=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,a=this._videoMaxDimensionsForNet.good,o=Qn.L1T1;if(r?(this._lastBadConnection=Date.now(),i?(a=this._videoMaxDimensionsForNet.bad,o=Qn.L1T2):(a=this._videoMaxDimensionsForNet.worst,o=Qn.L1T3)):n&&(a=this._videoMaxDimensionsForNet.good,o=Qn.L1T1),!(a<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Cr)||this._lastVideoMaxDimension===a)return;let s=this._serverSettings.camera;if(!s||!await this._isSVCSupported(e,o))return;R.debug(`Switch outbound video frame size and scalabilityMode`,{scalabilityMode:o,averageNetStat:t,nextVideoMaxDimension:a}),this._lastVideoMaxDimension=a;let c={...this._serverSettings,camera:{...s,scalabilityMode:o,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(c)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[``]=e,this._triggerEvent(K.NETWORK_STATUS,t)}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=C.sdpFingerprint(e);if(t===null){R.warn(`Fingerprint calculation is unsupported`);return}this._fingerprint===null?this._fingerprint=t:(P.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=C.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,n){R.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{negotiated:!0,id:1});r.onopen=()=>{let e=r.readyState;e===`open`?(R.debug(`[${t}] data channel opened`),r.onerror=e=>{R.error(`[${t}] data channel error`,e)},n(r)):R.error(`[${t}] data channel open failed, state [${e}]`)}}},Tr=function(e){return e.AUDIO_MIX=`audio-mix`,e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX=`pat`,e.TRANSPARENT_AUDIO_TRACK_PREFIX=`ta`,e}({}),Er;(function(e){function t(){return{estimatedPerformanceIndex:sr.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:8,producerCommandDataChannelVersion:3,consumerScreenDataChannelVersion:1,producerScreenDataChannelVersion:1,asrDataChannelVersion:+!!w.asrDataChannel,animojiDataChannelVersion:w.vmoji?w.vmojiOptions.protocolVersion:1,animojiBackendRender:!w.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:w.videoTracksCount,red:!0,audioShare:w.audioShare,fastScreenShare:w.fastScreenShare,videoSuspend:w.videoSuspend,simulcast:w.simulcast&&I.isSimulcastSupportedByBrowser(),consumerFastScreenShare:w.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:w.consumerFastScreenShareQualityOnDemand,transparentAudio:w.transparentAudio}}e.get=t})(Er||(Er={}));var Dr=Er,Or=16,kr=class e{constructor(e,t,n){g(this,`_datachannel`,void 0),g(this,`_participantIdRegistry`,void 0),g(this,`_asrCallback`,void 0),g(this,`_textDecoder`,void 0),R.debug(`AsrReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._asrCallback=n,this._textDecoder=new TextDecoder,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}static parse(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint8(1);if(r!==0)throw Error(`Unsupported message type. Message type: ${r}`);let i=t.getUint16(2),a=t.getUint32(4),o=t.getUint32(8),s=t.getUint32(12);if(n!==1)throw Error(`Unexpected protocol version. Got ${n}, expected 1`);return{sequence:i,ssrc:a,timestamp:o,duration:s,data:e.slice(Or)}}_onDataChannelMessage(t){let n=e.parse(t),r=this._participantIdRegistry?.getStreamDescription(n.ssrc)?.participantId;if(!r){R.warn(`Participant id for ssrc ${n.ssrc} not found in registry`);return}let i={participantId:r,text:this._textDecoder.decode(n.data),timestamp:n.timestamp,duration:n.duration};this._asrCallback(i)}destroy(){this._datachannel.onmessage=null}},Ar,jr=class{constructor(){g(this,`_value`,1)}get value(){return this._value}set value(e){this._value=e}};Ar=jr,g(jr,`_instance`,null),g(jr,`getInstance`,()=>(Ar._instance||(Ar._instance=new Ar),Ar._instance));var Mr=class{constructor(){g(this,`streamDescriptionByCompactId`,new Map),g(this,`compactIdByStreamDescription`,new Map)}getStreamDescription(e){return this.streamDescriptionByCompactId.get(e)}getCompactId(e){return this.compactIdByStreamDescription.get(e)}handleMessage(e){let t=new Uint8Array(e),n=t[0],r=t.subarray(1);switch(n){case 1:let e=(0,l.decode)(r);return Object.entries(e).forEach(([e,t])=>{let n=en(e);this.streamDescriptionByCompactId.set(t,n),this.compactIdByStreamDescription.set(e,t)}),null;case 2:case 4:let t=(0,l.decode)(r),i=[];for(let e of t){let t=this.getStreamDescription(e);t&&i.push(t.participantId)}return n===2?{type:`notification`,notification:G.AUDIO_ACTIVITY,activeParticipants:i}:{type:`notification`,notification:G.STALLED_ACTIVITY,stalledParticipants:i};case 3:let a=(0,l.decode)(r);return{type:`notification`,notification:G.SPEAKER_CHANGED,speaker:this.getStreamDescription(a)?.participantId};case 5:let o=(0,l.decode)(r);return{type:`notification`,notification:G.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:o[0],maxDimension:o[1]},mediaType:this._decodeMediaType(o[2])};case 6:let s=(0,l.decode)(r),c={};for(let[e,t]of Object.entries(s)){let n=this.getStreamDescription(Number(e))?.participantId;n&&(c[n]=t/100)}return{type:`notification`,notification:G.NETWORK_STATUS,statuses:c};case 7:return this._createParticipantSourcesUpdateNotification(r);case 8:{let e=(0,l.decode)(r).map(e=>{let[t,n,r,i,a,o,s]=e;return{participantId:this.getStreamDescription(t)?.participantId,gain:n,pause:r,offset:i,mute:a,liveStatus:o,startTimeMs:s}});return{type:`notification`,notification:G.MOVIE_UPDATE_NOTIFICATION,data:e}}case 9:let u=(0,l.decode)(r);return{type:`notification`,notification:G.VIDEO_SUSPEND_SUGGEST,bandwidth:u};default:return R.debug(`unsupported message type: `+n),null}}_decodeMediaType(e){if(e===null)return null;switch(e){case 0:return V.CAMERA;case 1:return V.SCREEN;default:throw Error(`Unsupported media type: ${e}`)}}_createParticipantSourcesUpdateNotification(e){let t=(0,l.decode)(e),n=[];for(let[e,r]of Object.entries(t)){let t=r[0],i=r[1],a=r[2],o=!!r[3],s=r[4]===null?void 0:!!r[4],c;if(t!==null){if(c=this.getStreamDescription(t),!c){R.error(`could not uncompress participant ID ${t}`);continue}}else c=null;if(a===null){R.error(`unexpected null sequenceNumber`,e,r);continue}let l=Tr.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+`-`+e,u=i?i>>>0:null;n.push({participantStreamDescription:c,streamId:l,rtpTimestamp:u,sequenceNumber:a,fastScreenShare:o,suspend:s})}return{type:`notification`,notification:G.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:n}}},Nr=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({}),Pr=class{constructor(){g(this,`_worker`,null)}async _createWorker(e,t,n=[],r={},i=[]){return new Promise((a,o)=>{let s=n.join(`,`),c=new Blob([e,`exports.default(${s});`],{type:`application/javascript; charset=utf-8`}),l=window.URL.createObjectURL(c);this._worker=new Worker(l),this._worker.onmessage=e=>{switch(e.data.type){case Nr.READY:a();break;case Nr.ERROR:o(e.data.error);break;case Nr.FRAME:t(e.data);break;case Nr.DEBUG:R.debug(e.data.message);break;case Nr.LOG_ERROR:O.log(b.ERROR,e.data.message);break}},this._sendToWorker(Nr.INIT,r,i)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(e,t={},n=[]){this._worker?.postMessage(Object.assign({type:e},t),n)}static isBrowserSupported(){throw Error(`Not implemented`)}},Fr=class extends Pr{async init(e,t,n){R.debug(`LibVPxDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n)=>{let r=null,i=null,a=!0,o=!1;function s(){return t({locateFile:n}).then(e=>i=e)}function c(t,n,s,c){if(!i){self.postMessage({type:e.LOG_ERROR,message:`decoder-init-fail-libvpx`}),self.postMessage({type:e.FRAME,error:`Fatal initialization error`});return}if(a!==s&&(a=s,r&&(r=null,self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec changed to ${s?`VP9`:`VP8`} - reinitialize`}))),!r&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder codec ${s?`VP9`:`VP8`}`}),r=new i.VpxDecoder,r.debug(c),!r.init(s?i.VpxType.VP9:i.VpxType.VP8))){r=null,self.postMessage({type:e.FRAME,error:`Decoder failed to create`});return}try{r.allocateBuffer(n.byteLength).set(new Uint8Array(n))}catch(t){self.postMessage({type:e.DEBUG,message:t}),r=null,self.postMessage({type:e.FRAME,error:String(t)});return}if(r.decode()&&r.nextImage())o=!1;else{self.postMessage({type:e.FRAME,error:`Decode failed`}),l();return}let u=r.getImageBuffer();if(!u){self.postMessage({type:e.FRAME,error:`No decoded data`});return}let d=r.getImageWidth(),f=r.getImageHeight();r.nextImage()&&(self.postMessage({type:e.DEBUG,message:`LibVPxDecoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxDecoder-drop`}));let p=new Uint8ClampedArray(u.byteLength);p.set(u),self.postMessage({type:e.FRAME,data:p.buffer,width:d,height:f},[p.buffer])}function l(){o||(self.postMessage({type:e.FRAME,requestKeyFrame:!0}),o=!0)}s().then(()=>{self.onmessage=t=>{switch(t.data.type){case e.FRAME:c(t.data.timestamp,t.data.data,t.data.isVP9,t.data.debug);break}},self.postMessage({type:e.READY})}).catch(t=>{self.postMessage({type:e.ERROR,error:String(t)})})}})(),exports={default:workerExports};",r=>{r.error?(R.warn(`LibVPxDecoder`,r.error),t(r.error)):r.requestKeyFrame?(R.debug(`LibVPxDecoder requests key frame`),n()):e(new ImageData(new Uint8ClampedArray(r.data),r.width,r.height))},[u.default,u.default.getUrl])}decodeFrame(e,t,n,r){this._sendToWorker(Nr.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r,debug:R.enabled()},[t.buffer])}destroy(){this._removeWorker(),R.debug(`LibVPxDecoder destroyed`)}static isBrowserSupported(){return`WebAssembly`in window&&`Worker`in window}},Ir=class extends Pr{async init(e,t,n){R.debug(`WebCodecsDecoder started`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return n=>{let r=null,i=`no-preference`,a=!0,o=!1,s=!1,c=null,l=null;function u(){self.postMessage({type:t.READY})}function d(e,n,r,i=!1){c={timestamp:e,data:n,isVP9:r,keyFrame:i};let a=p(r);if(o&&!i){self.postMessage({type:t.FRAME,error:`WebCodecsDecoder waiting for keyframe`}),f();return}else o&&i&&(o=!1,s=!1,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder got keyframe. Start decoding`}));let l=new EncodedVideoChunk({type:i?`key`:`delta`,timestamp:e,data:n});try{a.decode(l)}catch(e){m(`because failed call decode: ${e.message}`);return}h(i)}self.onmessage=e=>{switch(e.data.type){case t.INIT:u();break;case t.FRAME:d(e.data.timestamp,e.data.data,e.data.isVP9,e.data.keyFrame);break}};function f(){s||(self.postMessage({type:t.FRAME,requestKeyFrame:!0}),s=!0)}function p(e){return a!==e&&(a=e,m(`because codec is changed to ${a?`VP9`:`VP8`}`)),r||(o=!0,self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec ${a?`VP9`:`VP8`}`}),r=new VideoDecoder({output:e=>{g();let r=n?[e]:[];self.postMessage({type:t.FRAME,data:e},r),e.close()},error:e=>{g(),m(`because error during decoding: ${e.message}`),i===`prefer-software`?self.postMessage({type:t.FRAME,error:`WebCodecsDecoder failed, reinitialize: `+String(e)}):(i=`prefer-software`,c&&c.keyFrame&&d(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:t.DEBUG,message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${e.message}`}))}}),r.configure(_(a,i))),r}function m(e){if(r){try{r&&r.state!==`closed`&&r.close()}catch{}r=null,self.postMessage({type:t.FRAME,error:`WebCodecsDecoder reset ${e}`})}}function h(e=!1){l=setTimeout(()=>{m(`because of decode timeout`)},3e3)}function g(){l&&clearTimeout(l),l=null}function _(t,n){return{codec:t?e.VP9:e.VP8,hardwareAcceleration:n}}}})(),exports={default:workerExports};",r=>{r.error?(R.warn(`WebCodecsDecoder`,r.error),t(r.error)):r.requestKeyFrame?(R.debug(`WebCodecsDecoder requests key frame`),n()):(e(r.data),r.data.close())},[I.baseChromeVersion()>=92||I.browserName()===`Safari`])}decodeFrame(e,t,n,r=!1){this._sendToWorker(Nr.FRAME,{timestamp:e,data:t.buffer,isVP9:n,keyFrame:r},[t.buffer])}destroy(){this._removeWorker(),R.debug(`WebCodecsDecoder destroyed`)}static isBrowserSupported(){return`VideoDecoder`in window&&`Worker`in window&&`VideoFrame`in window&&!I.isBrokenVP9Decoder()&&I.browserName()!==`Firefox`}},Lr=class{constructor(e=null,t=0){g(this,`_counter`,0),g(this,`_interval`,0),g(this,`_lastCalculationTime`,Date.now()),g(this,`_onCalculated`,null),this._onCalculated=e,t&&(this._interval=window.setInterval(()=>this.calculate(),t))}increment(e=1){this._counter+=e}calculate(){let e=Date.now(),t=e-this._lastCalculationTime,n=Math.round(this._counter*1e3/t);return this._counter=0,this._lastCalculationTime=e,this._onCalculated?.(n),n}destroy(){window.clearInterval(this._interval),this._interval=0}},Rr=class{constructor(e){g(this,`_participantId`,void 0),g(this,`_firstFrameReceived`,!1),this._participantId=e}measure(e,t){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let n=W.getMarkNameScreenshareFirstFrame(this._participantId),r=W.measureMark(n);r!==null&&Bn.logEventualStat({name:H.SCREENSHARE_FIRST_FRAME,value:r,width:e,height:t})}},zr=65536,Br=`MARK_SCREENSHARE_FREEZE_DURATION`,Vr=class e{constructor(e,t,n,r){g(this,`_participantId`,void 0),g(this,`_onStream`,void 0),g(this,`_onStat`,void 0),g(this,`_onKeyFrameRequested`,void 0),g(this,`_statScreenShareFirstFrame`,void 0),g(this,`_chunks`,[]),this._participantId=e,this._onStream=t,this._onStat=n,this._onKeyFrameRequested=r,this._statScreenShareFirstFrame=new Rr(e)}appendChunk(t){let n=this._chunks.length;if(t.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),n&&(R.warn(`[FrameBuilder] Cleanup buffer`,Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!n||(this._chunks[n-1].sequence+1)%zr!==t.sequence){R.warn(`[FrameBuilder] Got incorrect chunk`);return}if(this._chunks.push(t),t.end){let n=this._processFrameData(),{width:r,height:i}=e.getFrameSize(n);this._processFrame({timestamp:t.timestamp,frameData:n,isVP9:t.isVP9,keyframe:t.keyframe,width:r,height:i}),this._statScreenShareFirstFrame.measure(r,i)}}destroy(){W.clearMark(Br),W.clearMark(W.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let e=this._chunks;this._chunks=[];let t=e.reduce((e,t)=>e+t.data.byteLength,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(new Uint8Array(t.data),r),r+=t.data.byteLength;return n}static getFrameSize(e){let t={width:0,height:0},n=new d.BitStream(e.buffer);n.bigEndian=!0,n.index+=2;let r=n.readBits(1),i=n.readBits(1)<<1|r;return i===3&&n.index++,n.readBits(1)===1||n.readBits(1)!==0?t:(n.index++,n.index++,n.index+=24,i>=2&&n.index++,n.readBits(3)===7?(i===1||i===3)&&n.index++:(n.index++,(i===1||i===3)&&(n.index+=3)),t.width=n.readBits(16)+1,t.height=n.readBits(16)+1,t)}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(e){if(e){W.setMark(Br);return}let t=W.measureMark(Br);t!==null&&t>1e3&&this._onStat({freeze_duration:t})}},Hr=class{constructor(e){g(this,`_onStream`,void 0),this._onStream=e}async drawFrame(e){throw Error("Method `drawFrame` is not supported by this implementation")}async drawImage(e){throw Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw Error("Method `isBrowserSupported` is not implemented")}},Ur=class extends Hr{constructor(e){super(e),g(this,`_useImageBitmap`,void 0),g(this,`_canvas`,null),g(this,`_canvasContext`,null),g(this,`_stream`,null),g(this,`_track`,null),R.debug(`CanvasRenderer started`),this._useImageBitmap=`ImageBitmap`in window}_createStream(e,t){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.width=e,this._canvas.height=t,this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`0`,this._canvas.style.zIndex=`5000`,document.body.appendChild(this._canvas),this._useImageBitmap?this._canvasContext=this._canvas.getContext(`bitmaprenderer`):this._canvasContext=this._canvas.getContext(`2d`),this._stream=this._canvas.captureStream(0),this._track=this._stream.getVideoTracks()[0],this._track.contentHint=`text`)}_removeStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null,this._track=null),this._canvasContext=null;try{this._canvas&&document.body.removeChild(this._canvas)}catch{}this._canvas=null}_requestCanvasFrame(){this._track&&this._track.requestFrame?this._track.requestFrame():this._stream&&this._stream.requestFrame&&this._stream.requestFrame()}async _drawImage(e){this._track||(this._createStream(e.width,e.height),this._onStream(this._stream));let t=this._canvas;if(t.width=e.width,t.height=e.height,this._useImageBitmap){let t;if(e instanceof ImageBitmap)t=e;else{let{width:n,height:r,data:i}=e,a=n*r*4;if(i.byteLength!==a){R.warn(`Bad frame buffer`,{w:n,h:r,got:i.byteLength,expected:a});return}t=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){R.warn(`Canvas context is null`),t.close();return}this._canvasContext.transferFromImageBitmap(t),t.close()}else{let n=this._canvasContext;n.clearRect(0,0,t.width,t.height),n.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t=`createImageBitmap`in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),R.debug(`CanvasRenderer destroyed`)}static isBrowserSupported(){return(`CanvasCaptureMediaStream`in window||`CanvasCaptureMediaStreamTrack`in window)&&!(I.browserName()===`Safari`&&Number(I.browserVersion())===15)&&!(I.browserName()===`Firefox`&&Number(I.browserVersion())<60)}},Wr=class extends Hr{constructor(e){super(e),g(this,`_generator`,void 0),g(this,`_writer`,void 0),g(this,`_stream`,void 0),R.debug(`TrackGeneratorRenderer started`),this._generator=new MediaStreamTrackGenerator({kind:k.video}),this._writer=this._generator.writable.getWriter(),this._stream=new MediaStream([this._generator]),this._onStream(this._stream)}async drawFrame(e){await this._writer.write(e)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),R.debug(`TrackGeneratorRenderer destroyed`)}static isBrowserSupported(){return`VideoFrame`in window&&`MediaStreamTrackGenerator`in window&&Ir.isBrowserSupported()}},Gr=class extends Vr{constructor(e,t,n,r){super(e,t,n,r),g(this,`_renderer`,void 0),g(this,`_decoder`,void 0),g(this,`_decoderReady`,!1),g(this,`_decoderBusy`,!1),g(this,`_decoderQueue`,[]),g(this,`_fpsMeter`,void 0),R.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 Lr(e=>R.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Wr.isBrowserSupported()?this._renderer=new Ur(this._onStream):this._renderer=new Wr(this._onStream)}_initDecoder(e=!1){e||!Ir.isBrowserSupported()?this._decoder=new Fr:this._decoder=new Ir,this._decoder.init(async e=>{this._decoderBusy=!1,`VideoFrame`in window&&e instanceof VideoFrame?await this._renderer.drawFrame(e):await this._renderer.drawImage(e),this._fpsMeter.increment(),this._decodeQueue()},e=>{this._decoderBusy=!1,this._decodeQueue(),this._decoder instanceof Ir&&typeof e==`string`&&e.includes(`EncodingError`)&&this._switchToLibVPXDecoder()},this._onKeyFrameRequested).then(()=>{this._decoderReady=!0,this._decodeQueue()})}_switchToLibVPXDecoder(){R.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(),R.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return Ur.isBrowserSupported()||Wr.isBrowserSupported()}},Kr=1,qr=1,Jr=2,Yr=0,Xr=1,Zr=2,Qr=4,$r=8;function ei(e,t,n,r,i,a,o){let s=0;t&&(s|=Xr),n&&(s|=Zr),r&&(s|=Qr),o||(s|=$r);let c=new ArrayBuffer(11),l=new DataView(c);if(l.setUint8(0,Kr),l.setUint16(1,i),l.setUint32(3,e),l.setUint8(7,+!!a),l.setUint16(8,Yr),l.setUint8(10,s),!o)return c;let u=new Uint8Array(c.byteLength+o.byteLength);return u.set(new Uint8Array(c),0),u.set(new Uint8Array(o),c.byteLength),u.buffer}function ti(e){let t=new DataView(e),n=t.getUint8(0),r=t.getUint16(1),i=t.getUint32(3),a=t.getUint8(7)===1,o=t.getUint16(8),s=t.getUint8(10),c=!!(s&Xr),l=!!(s&Zr),u=!!(s&Qr),d=!!(s&$r);if(n!==Kr)throw Error(`Unexpected protocol version. Got ${n}, expected ${Kr}`);return{timestamp:i,start:c,end:l,keyframe:u,sequence:r,isVP9:a,ssrc:o,eos:d,data:e.slice(11)}}function ni(e){if(!e||!e.byteLength||e.byteLength!==4)return!1;let t=new DataView(e);return!(t.getUint8(0)!==Kr||t.getUint8(1)!==qr||t.getUint16(2)!==Yr)}function ri(e){if(!e||!e.byteLength||e.byteLength!==10)return null;let t=new DataView(e);return t.getUint8(0)!==Kr||t.getUint8(1)!==Jr||t.getUint16(2)!==Yr?null:{seq:t.getUint16(4),ts2:t.getUint32(6)}}function ii(e){let t=new ArrayBuffer(4),n=new DataView(t);return n.setUint8(0,Kr),n.setUint8(1,qr),n.setUint16(2,e),t}var ai=2**15-1,oi=1,si=5,ci=5,li=class e{constructor(e){g(this,`_mediaSource`,void 0),g(this,`_codec`,void 0),g(this,`_sourceBuffer`,null),g(this,`_queue`,[]),g(this,`_clearBufferTill`,0),this._mediaSource=new MediaSource,this._codec=e;let t=()=>{this._mediaSource.removeEventListener(`sourceopen`,t),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener(`sourceopen`,t,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let e=this._sourceBuffer.buffered.start(0);e<this._clearBufferTill&&(this._sourceBuffer.remove(e,this._clearBufferTill),R.debug(`[WebmBuilder] SourceBuffer cleanup from ${e} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let t=this._queue;this._queue=[];let n=e._buildQueue(t);this._sourceBuffer.appendBuffer(n)}static _buildQueue(e){if(!e.length)return new Uint8Array;if(e.length===1)return f.build(e[0]);let t=e.reduce((e,t)=>e+t.countSize(),0),n=new Uint8Array(t),r=0;for(let t of e){let e=f.build(t);n.set(e,r),r+=e.byteLength}return n}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode=`sequence`,this._sourceBuffer.addEventListener(`updateend`,()=>this._handleQueue())}changeType(e){return this._codec=e,this._sourceBuffer?.changeType(e)}append(e,t=!1){this._queue.push(e),t&&this._handleQueue()}cleanup(){this._mediaSource?.readyState===`open`&&this._sourceBuffer?.abort();let e=this._sourceBuffer?.buffered,t=e?.length;if(!t)return;let n=e.start(0),r=Math.max(0,e.end(t-1)-si);r-n>ci&&(this._clearBufferTill=r)}destroy(){this._queue=[],this._mediaSource.readyState===`open`&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},ui=class e extends Vr{constructor(e,t,n){super(e,t,n),g(this,`_mediaBuffer`,null),g(this,`_video`,null),g(this,`_stream`,null),g(this,`_earliestTimestamp`,0),g(this,`_clusterStartTime`,0),g(this,`_lastFrameTimestamp`,0),R.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return f.element(f.ID.EBML,[f.element(f.ID.EBMLVersion,f.number(1)),f.element(f.ID.EBMLReadVersion,f.number(1)),f.element(f.ID.EBMLMaxIDLength,f.number(4)),f.element(f.ID.EBMLMaxSizeLength,f.number(8)),f.element(f.ID.DocType,f.string(`webm`)),f.element(f.ID.DocTypeVersion,f.number(2)),f.element(f.ID.DocTypeReadVersion,f.number(2))])}static _genSegmentHeader(e,t,n){let r=f.element(f.ID.Info,[f.element(f.ID.TimecodeScale,f.number(1e6)),f.element(f.ID.MuxingApp,f.string(`vk-webm-builder`)),f.element(f.ID.WritingApp,f.string(`vk-webm-builder`))]),i=[f.element(f.ID.PixelWidth,f.number(e)),f.element(f.ID.PixelHeight,f.number(t))],a=f.element(f.ID.Tracks,f.element(f.ID.TrackEntry,[f.element(f.ID.TrackNumber,f.number(oi)),f.element(f.ID.TrackUID,f.number(oi)),f.element(f.ID.TrackType,f.number(1)),f.element(f.ID.FlagLacing,f.number(0)),f.element(f.ID.DefaultDuration,f.number(1e9)),f.element(f.ID.CodecID,f.string(`V_${n.toUpperCase()}`)),f.element(f.ID.Video,i)]));return f.unknownSizeElement(f.ID.Segment,[r,a])}static _genClusterHeader(e){return f.unknownSizeElement(f.ID.Cluster,[f.element(f.ID.Timecode,f.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new li(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){R.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let e=this._video.seekable;e.length&&(this._video.currentTime=e.end(e.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>R.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(t){let n=t.isVP9?`vp9`:`vp8`;this._mediaBuffer?this._mediaBuffer.codec!==n&&this._mediaBuffer.changeType(n):this._createVideo(n);let r=t.timestamp;if(r<=this._lastFrameTimestamp&&(r=this._lastFrameTimestamp+10,R.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=r,this._earliestTimestamp)r-=this._earliestTimestamp;else{if(!t.keyframe)return;this._earliestTimestamp=r,r=0}if(t.keyframe){this._clusterStartTime=r,this._mediaBuffer?.cleanup(),R.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let i=e._genWebmHeader();this._mediaBuffer?.append(i);let a=e._genSegmentHeader(t.width,t.height,n);this._mediaBuffer?.append(a)}let i=Math.round(r-this._clusterStartTime);if(i>ai&&(this._clusterStartTime=r,i=0),i===0){R.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let t=e._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(t)}let a=f.element(f.ID.SimpleBlock,[f.vintEncodedNumber(oi),f.bytes(e._intToU16BE(i)),f.number(!!t.keyframe<<7),f.bytes(t.frameData)]);this._mediaBuffer?.append(a,!0)}destroy(){super.destroy(),this._video&&(this._video.onpause=null,this._video.onwaiting=null,this._video.onstalled=null,this._video.onerror=null,this._video.pause(),this._video.src=``,document.body.removeChild(this._video)),this._mediaBuffer&&(this._mediaBuffer.destroy(),this._mediaBuffer=null),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),R.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"`)}},di=class{constructor(e,t,n,r,i){g(this,`_datachannel`,void 0),g(this,`_participantIdRegistry`,null),g(this,`_streamBuilders`,{}),g(this,`_onStream`,()=>{}),g(this,`_onEos`,()=>{}),g(this,`_onStat`,void 0),R.debug(`ScreenCaptureReceiver started`),this._datachannel=e,this._participantIdRegistry=t,this._onStream=n,this._onEos=r,this._onStat=i,this._datachannel.onmessage=e=>this._onDataChannelMessage(e.data)}_onDataChannelMessage(e){let t=ti(e),n=this._participantIdRegistry?.getStreamDescription(t.ssrc)?.participantId;if(!n){R.warn(`Participant id for ssrc ${t.ssrc} not found in registry`);return}if(t.eos){this.close(n),this._onEos(n);return}let r=this._streamBuilders[n];if(!r){let e=e=>this._onStream(n,e);r=w.screenShareWebmBuilder&&ui.isBrowserSupported()?new ui(n,e,this._onStat):new Gr(n,e,this._onStat,()=>{this._requestKeyFrame(t.ssrc)}),this._streamBuilders[n]=r}r.appendChunk(t)}_requestKeyFrame(e){if(!(!this._datachannel||this._datachannel.readyState!==`open`))try{let t=ii(e);this._datachannel.send(t),R.debug(`ScreenCaptureReceiver request for keyframe for ssrc ${e}`)}catch(e){R.warn(`Failed to send keyframe request`,e)}}close(e){let t=this._streamBuilders[e];t&&(t.destroy(),delete this._streamBuilders[e])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(e=>e.destroy()),this._streamBuilders={},this._participantIdRegistry=null,R.debug(`ScreenCaptureReceiver destroyed`)}},fi=class{constructor(e,t,n){g(this,`_prev`,void 0),g(this,`_next`,void 0),g(this,`_data`,void 0),this._next=n,n&&(n.prev=this),this._prev=t,t&&(t.next=this),this._data=e}get prev(){return this._prev}set prev(e){this._prev=e}get next(){return this._next}set next(e){this._next=e}get data(){return this._data}},pi=class{constructor(){g(this,`_head`,null),g(this,`_tail`,null),g(this,`_length`,0)}get length(){return this._length}push(...e){for(let t of e)this._tail=new fi(t,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(e){this._tail&&(this._tail.next=e._head),this._head||(this._head=e._head),this._tail=e._tail,this._length+=e._length,e.clear()}shift(){if(!this._length||!this._head)return null;let e=this._head;return this._head=e.next,this._head&&(e.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),e.data}bisect(){if(this.length){let e=this.length>1?Math.floor(this.length/2):1;for(let t=0;t<e;t++)this.shift()}}head(){return this._head?.data||null}tail(){return this._tail?.data||null}clear(){this._head=null,this._tail=null,this._length=0}toString(){let e=[],t=this._head;for(;t!==null;)e.push(t.data),t=t.next;return e.length?JSON.stringify(e,(e,t)=>t instanceof Error?String(t):t):``}},mi=1e3,hi=class extends Pr{constructor(e,t,n,r){super(),g(this,`_sourceTrack`,void 0),g(this,`_onFrame`,void 0),g(this,`_useCongestionControl`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_useImageCapture`,void 0),g(this,`_video`,null),g(this,`_imageCapture`,null),g(this,`_canvas`,null),g(this,`_canvasCtx`,null),g(this,`_frameReadTimeout`,0),g(this,`_lastFrame`,null),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useImageCapture=`ImageCapture`in window&&ImageCapture.prototype.grabFrame!==void 0&&`ImageBitmap`in window,(e.readyState!==`live`||!e.enabled||e.muted)&&(this._useImageCapture=!1)}_createDom(){this._canvas||(this._canvas=document.createElement(`canvas`),this._canvas.style.pointerEvents=`none`,this._canvas.style.visibility=`hidden`,this._canvas.style.position=`absolute`,this._canvas.style.width=`160px`,this._canvas.style.height=`90px`,this._canvas.style.bottom=`0`,this._canvas.style.right=`160px`,this._canvas.style.zIndex=`5000`,this._canvasCtx=this._canvas.getContext(`2d`),document.body.appendChild(this._canvas)),!this._video&&!this._useImageCapture&&(this._video=document.createElement(`video`),this._video.controls=!1,this._video.autoplay=!1,this._video.preload=`auto`,this._video.muted=!0,this._video.style.pointerEvents=`none`,this._video.style.visibility=`hidden`,this._video.style.position=`absolute`,this._video.style.width=`160px`,this._video.style.height=`90px`,this._video.style.bottom=`0`,this._video.style.right=`0`,this._video.style.zIndex=`5000`,document.body.appendChild(this._video))}_removeDom(){try{this._canvas&&document.body.removeChild(this._canvas),this._video&&document.body.removeChild(this._video)}catch{}this._canvasCtx=null,this._canvas=null,this._video=null}async _createStream(e){if(!this._canvas)throw Error(`Canvas not found`);if(!this._video&&!this._useImageCapture)throw Error(`Video element not found`);return new Promise((t,n)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let r=this._video;r.srcObject=new MediaStream([e]),r.onloadeddata=e=>t(),r.onerror=()=>n(Error(`Video element error`));let i=r.play(),a=()=>n(Error(`Autoplay is disabled`));i?i.catch(a):a()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw Error(`Fatal error`);this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw Error(`Destroyed`);return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw Error(`Destroyed`);let t=e.width,n=e.height;return this._canvas.width=t,this._canvas.height=n,this._canvasCtx.clearRect(0,0,t,n),this._canvasCtx.drawImage(e,0,0,t,n),this._canvasCtx?.getImageData(0,0,t,n)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;R.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createStream(this._sourceTrack),await this._createWorker("var workerExports=(function(){var e=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return(t,n,r,i)=>{let a;function o(o,s){return t({locateFile:n}).then(t=>{if(a=new t.VpxEncoder,a.debug(s),!a.init(o?t.VpxType.VP9:t.VpxType.VP8))throw self.postMessage({type:e.LOG_ERROR,message:`encoder-init-fail-libvpx`}),Error(`LibVPxEncoder failed to create`);if(r){let e=Math.round(i/1e3);a.setTargetBitrate(e)}else a.setMaxQuantizer(10),a.setTargetBitrate(1024)})}function s(t,n,r,i){let o=a.allocateImage(t,n);if(!o){self.postMessage({type:e.FRAME,error:`No buffer data`});return}o.set(new Uint8Array(r));let s=Math.round(performance.now());if(!a.encode(s,150,i)){self.postMessage({type:e.FRAME,error:`Encode failed`});return}let c=a.readFrame();if(!c){self.postMessage({type:e.FRAME,error:`No encoded data`});return}a.readFrame()&&(self.postMessage({type:e.DEBUG,message:`LibVPxEncoder dropped frame`}),self.postMessage({type:e.LOG_ERROR,message:`LibVPxEncoder-drop`}));let l=new Uint8Array(c.byteLength);l.set(c),self.postMessage({type:e.FRAME,frameType:i?`key`:`delta`,timestamp:s,duration:150,width:t,height:n,data:l.buffer},[l.buffer])}function c(e,t){let n=Math.round(e/1e3);a.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case e.INIT:o(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:e.READY})).catch(t=>self.postMessage({type:e.ERROR,error:String(t)}));break;case e.FRAME:s(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case e.SET_BITRATE:c(t.data.bitrate,t.data.useCbr);break}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[u.default,u.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:R.enabled()})}_encode(e,t){let n=e.data.buffer;this._sendToWorker(Nr.FRAME,{width:e.width,height:e.height,imageData:n,keyFrame:t},[n])}_requestFrameVideo(e){let t=this._drawFrameVideo();this._encode(t,e)}_requestFrameBitmap(e){window.clearTimeout(this._frameReadTimeout),this._frameReadTimeout=window.setTimeout(()=>{if(this._lastFrame){let t=this._drawFrameData(this._lastFrame);this._encode(t,e)}else this._onFrame(null)},mi),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let n=this._drawFrameData(t);this._encode(n,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,n){this._sendToWorker(Nr.SET_BITRATE,{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),R.debug(`LibVPxEncoder destroyed`)}},gi=class extends Pr{constructor(e,t,n,r,i,a){super(),g(this,`_sourceTrack`,void 0),g(this,`_trackProcessor`,void 0),g(this,`_onFrame`,void 0),g(this,`_useCongestionControl`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_useCbr`,void 0),g(this,`_frameRate`,void 0),this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=n,this._maxBitrate=r,this._useCbr=i,this._frameRate=a,this._trackProcessor=new MediaStreamTrackProcessor({track:e})}async init(){let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height,n=this._trackProcessor.readable;R.debug(`WebCodecsEncoder started ${e}x${t}, codec ${this.isVP9()?`VP9`:`VP8`}`),await this._createWorker("var workerExports=(function(){var e=function(e){return e.VP9=`vp09.00.50.08`,e.VP8=`vp8`,e}({}),t=function(e){return e.INIT=`init`,e.READY=`ready`,e.FRAME=`frame`,e.SET_BITRATE=`set_bitrate`,e.ERROR=`error`,e.DEBUG=`debug`,e.LOG_ERROR=`log_error`,e}({});return()=>{let n,r,i,a,o,s,c=null,l=0,u=!1,d=0,f,p,m=!1,h=!1;function g(e){n=e.readable,r=n.getReader(),i=e.width,a=e.height,o=e.isVP9,s=e.framerate,f=e.useCongestionControl,p=e.maxBitrate,f&&(d=p,m=e.useCbr),y(),self.postMessage({type:t.READY})}function _(e){e&&!h&&(h=!0),self.clearTimeout(l),l=self.setTimeout(()=>{c&&v(c,h)},1e3),!u&&(u=!0,r.read().finally(()=>{u=!1,self.clearTimeout(l)}).then(({done:e,value:t})=>{if(c?.close(),c=null,!(e||!t)){if(!x){r.releaseLock(),n.cancel();return}c=t,v(t,h)}}))}function v(e,t){(e.codedWidth!==i||e.codedHeight!==a)&&(i=e.codedWidth,a=e.codedHeight,y(),h=!0),x.encode(e,{keyFrame:t}),t&&(h=!1)}function y(){let t={framerate:s,codec:o?e.VP9:e.VP8,width:i,height:a,latencyMode:`realtime`,bitrateMode:m?`constant`:`variable`};d>0&&(t.bitrate=d),x.configure(t)}function b(e,t,n){d=e,m=t,s=n,y()}let x=new VideoEncoder({output:e=>{let n;e.data?n=e.data:(n=new ArrayBuffer(e.byteLength),e.copyTo(n)),self.postMessage({type:t.FRAME,frameType:e.type,timestamp:e.timestamp,duration:e.duration,width:i,height:a,data:n},[n])},error:e=>{self.postMessage({type:t.FRAME,error:String(e)})}});self.onmessage=e=>{switch(e.data.type){case t.INIT:g(e.data);break;case t.FRAME:_(e.data.keyFrame);break;case t.SET_BITRATE:b(e.data.bitrate,e.data.useCbr,e.data.fps);break}}}})(),exports={default:workerExports};",e=>{e.error?this._onFrame(null,e.error):this._onFrame({type:e.frameType,timestamp:e.timestamp,duration:e.duration,data:e.data,byteLength:e.data?.byteLength,width:e.width,height:e.height})},[],{readable:n,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[n])}requestFrame(e=!1){this._sendToWorker(Nr.FRAME,{keyFrame:e})}setBitrate(e,t,n){this._sendToWorker(Nr.SET_BITRATE,{bitrate:e,useCbr:t,fps:n})}isVP9(){return!0}destroy(){this._removeWorker(),R.debug(`WebCodecsEncoder destroyed`)}static isBrowserSupported(){return`VideoEncoder`in window&&`Worker`in window&&`EncodedVideoChunk`in window&&`MediaStreamTrackProcessor`in window}},_i=2100,vi=600,yi=1.2,bi=.8,xi=2e3,Si=8e3,Ci=8e3,wi=16e3,Ti=4,Ei=2e3,Di=function(e){return e[e.NONE=0]=`NONE`,e[e.UP=1]=`UP`,e[e.DOWN=2]=`DOWN`,e}(Di||{}),Oi=class{constructor(e,t,n,r,i,a,o){g(this,`_onCongestion`,void 0),g(this,`_ccEnabled`,void 0),g(this,`_fastSharing`,void 0),g(this,`_trendDelayThreshold`,void 0),g(this,`_highDelayThreshold`,void 0),g(this,`_targetFps`,void 0),g(this,`_minBitrate`,void 0),g(this,`_maxBitrate`,void 0),g(this,`_targetBitrate`,void 0),g(this,`_lastDown`,void 0),g(this,`_lastUp`,void 0),g(this,`_lastProbing`,void 0),g(this,`_lastCheckDelay`,void 0),g(this,`_upPenalty`,0),g(this,`_probing`,void 0),g(this,`_delayAvgShort`,-1),g(this,`_delayAvgLong`,-1),g(this,`_minDelay`,Number.MAX_VALUE),g(this,`_maxDelay`,0),g(this,`_largeDelayDuration`,0),g(this,`_lastFpsCalcMs`,void 0),g(this,`_frames`,0),g(this,`_fps`,0),this._onCongestion=e,this._ccEnabled=r,this._minBitrate=t,this._maxBitrate=n,this._fastSharing=i,this._targetFps=o,a>0?this._highDelayThreshold=a:this._highDelayThreshold=_i,i&&(this._highDelayThreshold=vi),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let s=Date.now();this._lastDown=0,this._lastUp=s,this._lastProbing=s,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(e,t,n){let r=Date.now();if(this._calcFps(r),this._calcDelay(t,r),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let i=0,a=this._delayAvgShort-this._delayAvgLong,o=Math.round(Math.abs(a)*100/this._delayAvgLong),s=a>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,c=this._delayAvgShort>this._highDelayThreshold;s||c?i=2:Math.abs(a)<40&&o<10&&!c&&(i=1);let l=Math.round(this._targetBitrate/1e3),u=n;e%20==0&&R.debug(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Di[i]} tr=${l} br=${n}`);let d=r-this._lastDown;if(i===2&&d>xi){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Ti),this._probing=!1);let n=bi*u*1e3;if(n>=this._targetBitrate&&(n=this._targetBitrate*bi),n=Math.max(n,this._minBitrate),n<this._targetBitrate){let r=Math.round(n/1e3),s=Math.round(this._upPenalty*Ci/1e3);R.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Di[i]}`),R.log(`#${e}: cc: DOWN delay=${t} bitrate=${u} target=${l} -> newBitrate=${r} penalty=${s}s`),this._setBitrate(n,!0),this._targetBitrate=n}this._lastDown=r}let f=r-this._lastUp,p=Si+this._upPenalty*Ci;if(i===1&&f>p&&d>p){let n=Math.min(this._targetBitrate*yi,this._maxBitrate);if(n>this._targetBitrate){let s=Math.round(n/1e3),c=Math.round(this._targetBitrate/1e3),l=Math.round(this._upPenalty*Ci/1e3);R.log(`#${e}: cc: delay=${t} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${a} percent=${o} -> ${Di[i]}`),R.log(`#${e}: cc: UP bitrate=${u} target=${c} -> newBitrate=${s} penalty=${l}s`),this._setBitrate(n,!1),this._targetBitrate=n,this._probing=!0,this._lastProbing=r,this._lastUp=r}}let m=r-this._lastProbing;this._probing&&m>wi&&(this._probing=!1);let h=r-this._lastDown;this._upPenalty>0&&h>3*p&&(R.log(`#${e}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(e,t){this._fastSharing&&(t=!0);let n=this._targetFps;this._fps>0&&(n=this._fps),this._onCongestion(e,t,n)}_calcDelay(e,t){if(!(e<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=e,this._delayAvgLong=e),this._delayAvgShort=Math.round((this._delayAvgShort*3+e)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+e)/24),e>0&&e<this._minDelay?this._minDelay=e:e>this._maxDelay&&(this._maxDelay=e),this._lastCheckDelay===0&&(this._lastCheckDelay=t),e>Ei){let e=t-this._lastCheckDelay;this._largeDelayDuration+=e}this._lastCheckDelay=t}}reconfigure(e,t){this._minBitrate=e,this._maxBitrate=t}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let e={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,e}_calcFps(e){this._frames++;let t=e-this._lastFpsCalcMs;if(t>5e3){this._lastFpsCalcMs=e;let n=this._fps,r=this._frames*1e3/t;this._fps===0?this._fps=Math.round(r):this._fps=Math.round((this._fps*3+r)/4),this._frames=0,this._fps!==n&&R.log(`cc: fps=${this._fps}`)}}},ki=class{constructor(e){g(this,`_maxSize`,void 0),g(this,`_size`,0),g(this,`_buffer`,void 0),g(this,`_head`,0),g(this,`_tail`,0),this._maxSize=e,this._buffer=Array(e)}add(e,t,n,r,i){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let a=this._tail;return this._buffer[this._tail]={seq:e,ts:t,size:n,sent:Date.now(),start:r,end:i,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,a}update(e,t){let n=this.get(e);return n===null?null:(n.ts2=t,n.recv=Date.now(),n)}get(e){let t=this._head;for(let n=0;n<this._maxSize;n++){let n=this._buffer[t];if(e===n?.seq)return n;if(t=++t%this._maxSize,t===this._tail)break}return null}getServerBitrateK(e){let t=0,n=0,r=-1,i=-1,a=this._tail;for(let t=0;t<this._maxSize;t++){a>0?--a:a=this._maxSize-1;let t=this._buffer[a];if(!t||(i===-1&&(i=t.ts2,n=0),i>=0&&(n+=t.size),r=t.ts2,i-r>=e)||a===this._head)break}if(r>=0&&i>=0){let e=i-r;t=Math.round(e>0?n*8/e:0)}return t}getCurrentDelay(){let e=this._tail;for(let t=0;t<this._maxSize;t++){e>0?--e:e=this._maxSize-1;let t=this._buffer[e];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(e===this._head)break}return 0}getMaxBandwidth(){let e=0,t=0,n=-1,r=-1,i=this._tail;for(let a=0;a<this._maxSize;a++){i>0?--i:i=this._maxSize-1;let a=this._buffer[i];if(a){if(r===-1&&a.end&&!a.start&&(r=a.ts2,t=0),n===-1&&r>=0&&a.start&&!a.end&&(n=a.ts2),n>=0&&r>=0){let i=r-n;e=i>0?t*8/i:0;break}if(r>=0&&(t+=a.size),i===this._head)break}}return Math.round(e)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}},Ai=65536,ji=50,Mi=400,Ni=1e6,Pi=3e5,Fi=3e4,Ii=2e3,Li=5,Ri=0,zi=class{constructor(e,t,n,r){g(this,`_encoder`,void 0),g(this,`_datachannel`,void 0),g(this,`_signaling`,void 0),g(this,`_fastSharing`,void 0),g(this,`_destroyed`,!1),g(this,`_needKeyframe`,!0),g(this,`DATA_SIZE`,void 0),g(this,`_congestionControl`,void 0),g(this,`_frameNum`,0),g(this,`_width`,void 0),g(this,`_height`,void 0),g(this,`_feedback`,new ki(1024)),g(this,`_lastSentFrameSeq`,0),g(this,`_lastDeliveredFrameSeq`,0),g(this,`_lastFrameDelay`,0),g(this,`_lastFramerateReduced`,Date.now()),g(this,`_lastSharingStat`,Date.now()),g(this,`_congestionControlEnabled`,void 0),g(this,`_queue`,new pi),g(this,`_fpsMeter`,void 0),g(this,`_maxFrameDelay`,void 0),R.debug(`ScreenCaptureSender started`),this.DATA_SIZE=w.consumerScreenDataChannelPacketSize-11,this._datachannel=t,this._signaling=n,this._fastSharing=r,this._congestionControlEnabled=w.screenShareCongestionControl||this._fastSharing,this._width=e.getSettings().width,this._height=e.getSettings().height,this._maxFrameDelay=this._fastSharing?w.screenShareCongestionControlThreshold:w.screenShareCongestionControlThreshold*2;let i=w.getScreenFrameRate(this._fastSharing),{minBitrate:a,maxBitrate:o}=this._calcMinMaxBitrate(this._width,this._height),s=this._onCongestionCallback.bind(this);R.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(a/1e3)}k maxBitrate=${Math.round(o/1e3)}k delayThreshold=${w.screenShareCongestionControlThreshold}`),this._congestionControl=new Oi(s,a,o,this._congestionControlEnabled,this._fastSharing,w.screenShareCongestionControlThreshold,i);let c=(e,t)=>{if(this._destroyed)return;if(!e){R.warn(`requestFrame failed, keyFrame: `+this._needKeyframe,t),this._needKeyframe=!0,this._handleQueue();return}(e.width!==this._width||e.height!==this._height)&&(this._width=e.width,this._height=e.height,this._onResize(this._width,this._height));let n=this._sliceFrame(e);this._queue.merge(n),this._handleQueue(),this._sendSharingStat()};if(gi.isBrowserSupported()){let t=this._fastSharing;this._encoder=new gi(e,c,this._congestionControlEnabled,o,t,i)}else this._encoder=new hi(e,c,this._congestionControlEnabled,o);this._datachannel.onmessage=e=>{ni(e.data)&&(R.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let t=ri(e.data);t!==null&&this._checkCcFeedback(t)},this._encoder.init().then(()=>this._handleQueue()).catch(e=>R.warn(`ScreenCaptureSender init failed`,e)),this._fpsMeter=new Lr(e=>R.log(`[ScreenCaptureSender] fps: ${e}`),5e3)}_handleQueue(){if(this._destroyed)return;let e=this._queue.shift();if(!e){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Ai)%Ai>Li&&this._lastFrameDelay>this._maxFrameDelay){let e=Date.now();e-this._lastFramerateReduced>Ii&&(this._lastFramerateReduced=e,R.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(e)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),C.setImmediate(()=>this._handleQueue());return}if(e.isLast){this._frameNum++,this._fpsMeter.increment(),e.isKey&&R.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(e.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),n=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,n)}else C.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let e=this._queue.head();for(;e;){if(e.isFirst&&e.isKey)return!0;this._queue.shift(),e=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(e){let t=e.type===`key`,n=e.data.byteLength,r=new pi;for(let i=0;i<n;i+=this.DATA_SIZE){let a=e.data.slice(i,i+this.DATA_SIZE),o=i===0,s=n<=i+a.byteLength,c=this._wrapHeader(e.timestamp,o,s,t,a);r.push({data:c.data,sequence:c.sequence,frameSize:n,isFirst:o,isLast:s,isKey:t,timestamp:e.timestamp})}return r}_wrapHeader(e,t,n,r,i){let a=ei(e,t,n,r,Ri,this._encoder.isVP9(),i),o={sequence:Ri,data:a};return Ri=(Ri+1)%Ai,o}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(e){if(!this._datachannel||this._datachannel.readyState!==`open`)return!1;try{return this._datachannel.send(e.data),this._feedback.add(e.sequence,e.timestamp,e.data.byteLength,e.isFirst,e.isLast),e.isLast&&(this._lastSentFrameSeq=e.sequence),!0}catch(e){return R.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(),R.debug(`ScreenCaptureSender destroyed`)}static isBrowserSupported(){return gi.isBrowserSupported()||hi.isBrowserSupported()}_onCongestionCallback(e,t,n){this._encoder.setBitrate(e,t,n)}_onResize(e,t){let{minBitrate:n,maxBitrate:r}=this._calcMinMaxBitrate(e,t),i=Math.round(n/1e3),a=Math.round(r/1e3);R.log(`cc: resize to ${e}x${t}, minBitrate=${i} maxBitrate=${a}`),this._congestionControl.reconfigure(n,r)}_calcMinMaxBitrate(e,t){(e===void 0||e<640)&&(e=640),(t===void 0||t<360)&&(t=360);let n=e*t/256;return{minBitrate:Math.max(Pi,Math.min(Ni,Math.round(n*ji))),maxBitrate:Math.round(n*Mi)}}_checkCcFeedback(e){let t=this._feedback.update(e.seq,e.ts2);if(t===null)R.debug(`cc: update failed, seq=${e.seq}`);else if(t.end){this._lastDeliveredFrameSeq=t.seq;let e=t.recv-t.sent;e>0&&(this._lastFrameDelay=e),this._handleQueue()}}_sendSharingStat(){let e=Date.now();if(e-this._lastSharingStat>Fi){let t=this._congestionControl.getStat();t!==null&&(R.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=e}}},Bi=90,Vi=4294967295,Hi=class e extends rr{constructor(e,t,n){super(e,t),g(this,`_producerNotification`,null),g(this,`_producerCommand`,null),g(this,`_producerScreen`,null),g(this,`_consumerScreen`,null),g(this,`_asr`,null),g(this,`_animojiDataChannel`,null),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),g(this,`_isOpen`,!1),g(this,`_observer`,!1),g(this,`_reconnectionPrevented`,!1),g(this,`_statInterval`,null),g(this,`_settingsInterval`,null),g(this,`_monitorRtpShareInterval`,null),g(this,`_statBytes`,{}),g(this,`_ssrcMap`,{}),g(this,`_ssrcMapUpdated`,!1),g(this,`_perfStatReporter`,void 0),g(this,`_producerOfferIsProcessing`,!1),g(this,`_producerNextOffer`,null),g(this,`_producerNextSessionId`,null),g(this,`_lastStat`,null),g(this,`_serverSettings`,void 0),g(this,`_prevConsumerSettings`,{}),g(this,`_prevConsumerFastSharingSettings`,{}),g(this,`_asrTrack`,null),g(this,`_captureSender`,null),g(this,`_captureReceiver`,null),g(this,`_participantIdRegistry`,null),g(this,`_disabledSenders`,new Set),g(this,`_rtpReceiversByStreamId`,{}),g(this,`_producerSessionId`,``),g(this,`_newAudioShareTrack`,null),g(this,`_simulcastInfo`,null),this.subscribe(this._signaling,qn.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Oe.TRACK_REPLACED,this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,Oe.SOURCE_CHANGED,this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,Oe.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=n,R.debug(`ServerTransport: Created`)}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!==q.IDLE&&e!==q.CLOSED&&e!==q.FAILED&&this._startStatInterval()}open(e=!1){if(this._isOpen){R.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?(R.error(`ServerTransport: Closed`,e),this._setState(q.FAILED)):(R.debug(`ServerTransport: Closed`),this._setState(q.CLOSED)))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){$n(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(w.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(){w.simulcast&&I.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new sr(this,this._signaling)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcastInfo=null,this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,e._closeDataChannel(this._producerNotification),e._closeDataChannel(this._producerCommand),e._closeDataChannel(this._producerScreen),e._closeDataChannel(this._consumerScreen),e._closeDataChannel(this._asr),e._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent(K.PEER_CONNECTION_CLOSED)}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,n){R.debug(`[${t}] data channel opening`);let r=e.createDataChannel(t,{ordered:!0});r.onopen=()=>{let e=r.readyState;e===`open`?(R.debug(`[${t}] data channel opened`),n(r)):R.error(`[${t}] data channel open failed, state [${e}]`)},r.onerror=e=>{let n=e.error;R.error(`[${t}] data channel error`,n?.errorDetail,n?.message)}}_openConnection(t=!1){R.debug(`ServerTransport: Open single connection`);try{this._pc=new RTCPeerConnection}catch(e){R.error(`Failed to create RTCPeerConnection:`,e),this.close(e);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=C.debounce(e=>{this._pc&&this._onConnectionStateChange(this._pc,e)},500),this._pc.onsignalingstatechange=e._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Mr,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),this._createDataChannel(this._pc,Jn.producerNotification,e=>{this._producerNotification=e,this._producerNotification.binaryType=`arraybuffer`,this._signaling.setProducerNotificationDataChannel(e)}),this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,Jn.producerCommand,e=>{this._producerCommand=e,this._signaling.setProducerCommandDataChannel(e)}),this._createDataChannel(this._pc,Jn.producerScreenShare,e=>{this._producerScreen=e,this._producerScreen.binaryType=`arraybuffer`,this._createCaptureReceiver()}),w.asrDataChannel&&this._createDataChannel(this._pc,Jn.asr,e=>{this._asr=e,this._asr.binaryType=`arraybuffer`,this._removeAsrTrack(),this._asrTrack=new kr(e,this._participantIdRegistry,e=>{this._onAsrTranscription(e)})}),w.vmoji&&this._createDataChannel(this._pc,Jn.animoji,e=>{this._animojiDataChannel=e,this._animojiDataChannel.binaryType=`arraybuffer`,this._animojiReceiver?.setDataChannel(e),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(e),this._animojiSender?.setProtocolVersion(w.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(e){R.error(`ServerTransport: Unable to add media source tracks`,e),O.log(b.ERROR,`addTrack-single`),this.close(e);return}this._createDataChannel(this._pc,Jn.consumerScreenShare,e=>{this._consumerScreen=e,this._consumerScreen.binaryType=`arraybuffer`;let t=this._mediaSource.getScreenTrack();t&&(!w.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(t)}),t||this._allocateConsumer(),this._setState(q.OPENED),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!==q.OPENED&&(this._setState(q.RECONNECTING),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent(K.SIGNALLED_ACTIVE_PARTICIPANTS,e)}_signalStalledParticipants(e){this._triggerEvent(K.SIGNALLED_STALLED_PARTICIPANTS,e)}_signalSpeakerChanged(e){this._triggerEvent(K.SIGNALLED_SPEAKER_CHANGED,e)}_signalNetworkStatus(e){this._triggerEvent(K.NETWORK_STATUS,e)}_updateSSRCMap(e){e&&e.sdp.split(`
15
+ `).forEach(e=>{let t=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Tr.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+)|(?:${Tr.TRANSPARENT_AUDIO_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(t).exec(e);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.mediaSettings;!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new zi(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(K.REMOTE_STREAM_SECOND,e,t)},e=>{this._triggerEvent(K.REMOTE_STREAM_SECOND,e,null)},e=>{this._triggerEvent(K.SCREEN_SHARING_STAT,e)}))}_removeCaptureReceiver(){this._captureReceiver?.destroy(),this._captureReceiver=null}_applyConsumerSettings(){let e=this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{if(!n.track||n.track.kind!==k.video||n.track.contentHint===`motion`)return;let r=!this._disabledSenders.has(n),i=e.maxDimension!==0;if(r&&!i){R.log(`Disabling video upload`),this._disabledSenders.add(n),n.replaceTrack(I.getBlackMediaTrack()).catch(e=>{R.error(`Could not disable video upload`,e)});return}let a=this._mediaSource.getSendVideoTrack();if(!r&&i&&a){R.log(`Enabling video upload`),this._disabledSenders.delete(n);let e=n.track;e.enabled=a.enabled,n.replaceTrack(a).then(()=>e.stop()).catch(e=>{R.error(`Could not enable video upload`,e)})}C.applyVideoTrackSettings(e,n,a??n.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&w.consumerFastScreenShare){let e=this._serverSettings.fastScreenSharing;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(n=>{!n.track||n.track.kind!==k.video||n.track.contentHint!==`motion`||C.applyVideoTrackSettings(e,n,n.track,this._prevConsumerFastSharingSettings,t)}),this._prevConsumerFastSharingSettings=t}}}_onScreenSharingStatus(e){e.track?(!w.consumerFastScreenShare||!this._mediaSource.mediaSettings.isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent(K.STATE_CHANGED,e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(e=>{this._reportStats(e),this._detectStaleTracks(e),nr.reportUsage(e)}).catch(()=>{}),this._statInterval=window.setTimeout(e,w.statisticsInterval)};this._statInterval=window.setTimeout(e,w.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){let e=2e3;if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,e)};this._settingsInterval=window.setTimeout(t,e)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await W.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent(K.REMOTE_DATA_STATS,{inbound:{topology:J.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`inbound-rtp`)},outbound:{topology:J.SERVER,transport:e.transport,rtps:e.rtps.filter(e=>e.type===`outbound-rtp`)},remoteInbound:{topology:J.SERVER,transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(e=>e.type===`inbound-rtp`&&e.kind===`audio`&&this._ssrcMap[e.ssrc]===`mix`);if(!t)return;let n=Tr.AUDIO_MIX,r=this._statBytes[n],i=!1;if(r){let e=t.bytesReceived-r.bytesReceived;e>=0&&e<=5&&(i=!0),r.stalled!==i&&this._triggerEvent(K.AUDIO_MIX_STALL,i)}this._statBytes[n]={bytesReceived:t.bytesReceived,stalled:i}}_allocateConsumer(){if(!this._signaling.ready)return;let e=Dr.get();!w.videoTracksCount&&!this._observer&&R.warn(`Setting videoTracksCount to 0 is deprecated`),this._signaling.allocateConsumer(null,e)}async _processOffer(e,t){if(!this._pc)throw Error(`Interrupt allocation`);let n=w.simulcast&&I.isSimulcastSupportedByBrowser(),r=n;try{await this._pc.setRemoteDescription(e)}catch(e){throw R.error(`[single] unable to set remote offer`,e),O.log(b.ERROR,`setRemoteDescription-single`),e}let i=this._findFirstSimTransceiver();if(n)if(i){R.log(`_processOffer: caps.simulcast=${w.simulcast} mid=${i.mid} dir=${i.direction}`);let e=this._mediaSource.getStream(),t=await this._setupSimulcastTransceiver(e,i);R.log(`_processOffer: simulcastInfo`,t),t||(R.log(`_processOffer: simulcast transceiver not found in server offer mid=${i.mid}, disable simulcast`),r=!1)}else R.log(`_processOffer: simulcast transceiver not found in server offer, disable simulcast`),r=!1;let a;try{if(await this._handleTracks(),R.debug(`[single] create local answer`),!this._pc)throw Error(`Interrupt allocation`);a=await this._pc.createAnswer()}catch(e){throw R.error(`[single] unable to create answer`,e),O.log(b.ERROR,`createAnswer-single`),e}try{if(!this._pc)throw Error(`Interrupt allocation`);a.sdp=C.patchLocalSDP(a.sdp,!1,I.isBrokenH264Decoder(),!1),R.debug(`[single] set local answer`,{answer:a}),await this._pc.setLocalDescription(a)}catch(e){throw R.error(`[single] unable to set local answer`,e),O.log(b.ERROR,`setLocalDescription-single`),e}if(r&&i){a.sdp=C.patchSimulcastAnswerSdp(a.sdp,i,ne.WIDTH,ne.HEIGHT);for(let e of this._pc.getTransceivers())e.mid===null&&e.stop()}try{R.debug(`[single] transmit local answer`,{answer:a}),this._updateSSRCMap(e),await this._signaling.acceptProducer(a,Object.keys(this._ssrcMap),t),R.debug(`[single] remote offer has been processed`)}catch(e){R.warn(`[single] unable to send local answer`,e),O.log(b.ERROR,`acceptProducer`)}r&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!==k.video)continue;let n=e.sender.getParameters();if(!(!n.encodings||n.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction=`sendonly`;let n=e.getVideoTracks()[0];await t.sender.replaceTrack(n),t.sender.setStreams(e);let r=t.sender.getParameters();if(!r.encodings||r.encodings.length<=1)return R.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(r.encodings)}`),null;let i=ce(ne.WIDTH,ne.HEIGHT,this._serverSettings.camera?.bitrates?.generic),a=0,o=1;for(let e of r.encodings)e.scalabilityMode=re,e.active=!0,a>=i.streams.length?e.maxBitrate=0:e.maxBitrate=i.streams[a].bitrate,e.scaleResolutionDownBy=o,o*=2,a++;await t.sender.setParameters(r);let s=n.getSettings();return R.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${s.width}x${s.height} encodings=${JSON.stringify(r.encodings)}`),!0}async _acceptProducer(e,t){if(this._producerOfferIsProcessing){this._producerNextOffer=e,this._producerNextSessionId=t,R.debug(`[single] wait until other remote offer is processed`);return}this._producerOfferIsProcessing=!0;let n={type:`offer`,sdp:C.patchRemoteSDP(e,I.isOldDataChannelDescription(),!1,!1,!1,I.isBrokenVP9Encoder(),I.isBrokenVP9Decoder())};if(R.debug(`[single] set remote offer`,{offer:n}),!this._pc)throw Error(`Interrupt allocation`);try{if(await this._processOffer(n,t),this._producerOfferIsProcessing=!1,this._producerNextOffer&&this._producerNextSessionId){R.debug(`[single] there is other unprocessed remote offer, process it`);let e=this._producerNextOffer,t=this._producerNextSessionId;this._producerNextOffer=null,this._producerNextSessionId=null,await this._acceptProducer(e,t)}}catch(e){this.close(e)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===k.video);if(!e||!e.sender){R.warn(`Cannot find screenshare transceiver`);return}try{e.direction=`sendonly`,await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(e){R.error(`ServerTransport: Unable to replace track`,e)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(e=>e.mid?.endsWith(`s`)&&e?.receiver?.track.kind===k.audio);if(!e||!e.sender){R.warn(`Cannot find audioshare transceiver`);return}e.sender.track!==null&&R.warn(`Unexpected track assigned to audioshare`);try{e.direction=`sendonly`,await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(e){R.error(`ServerTransport: Unable to replace track`,e),O.log(b.ERROR,`replaceTrack-single`)}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case G.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case G.REALLOC_CON:this._reconnect();break;case G.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case G.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case G.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case G.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent(K.ASR_TRANSCRIPTION,e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),w.breakVideoPayloadTypes&&(R.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){R.debug(`[single] remote track (added)`,{track:t.track});let n=t.streams[0];n?(n.onremovetrack||(n.onremovetrack=e=>{this._triggerEvent(K.REMOTE_TRACK_REMOVED,n.id,n,e.track)}),n.getTracks().find(e=>e.id===t.track.id)||n.addTrack(t.track),this._rtpReceiversByStreamId[n.id]=t.receiver,this._triggerEvent(K.REMOTE_TRACK_ADDED,n.id,n,t.track)):R.error(`[single] unable to get media stream from track event`)}static _onSignalingStateChange(e,t){R.debug(`[single] signaling state changed`,{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(R.debug(`[single] connection state changed`,{state:e.connectionState},t),O.log(b.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case`failed`:this._reconnectionPrevented?this.close(Error(`Ice connection failed`)):this._reconnect();break;case`connecting`:let t=this.getState();t===q.IDLE||t===q.OPENED?this._setState(q.CONNECTING):e.iceConnectionState===`checking`&&this._setState(q.RECONNECTING);break;case`disconnected`:this._reconnectionPrevented?this.close(Error(`Ice connection disconnected`)):this._setState(q.RECONNECTING);break;case`connected`:this._setState(q.CONNECTED),C.getPeerConnectionHostInfo(e).then(e=>{e?.local&&(O.log(b.ICE_CONNECTION_TYPE,e.local.type),R.debug(`Selected ICE candidates`,e))});break}}_onReplacedTrack(e,t){if(this._pc){R.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let n=(e,t)=>{e.replaceTrack(t).catch(e=>{R.error(`ServerTransport: Unable to replace track`,e),O.log(b.ERROR,`replaceTrack-single`)})};if(R.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),w.simulcast&&I.isSimulcastSupportedByBrowser()&&e.kind===k.video){let t=this._pc?.getTransceivers().find(t=>t.direction===`sendonly`&&t.sender?.track?.kind===k.video&&t.sender.track.contentHint===e.contentHint)?.sender;t?.track?(n(t,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):R.warn(`_onReplacedTrack: simulcast video transceiver not found`)}else{let t=this._pc?.getSenders().find(t=>t.track&&t.track.kind===e.kind&&!this._disabledSenders.has(t)&&t.track.contentHint===e.contentHint);t?.track?n(t,e):e.kind===k.audio&&e.contentHint===`music`&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e===k.screen&&w.consumerFastScreenShare&&this._mediaSource.mediaSettings.isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return O.log(b.PAT_WAITING_TIME_ERROR,`noConnection`),R.error(`Cannot get stream waiting time, peer connection is not initialized`),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return O.log(b.PAT_WAITING_TIME_ERROR,`oldBrowser`),R.error(`Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported`),0;let n=this._rtpReceiversByStreamId[e];if(!n)return O.log(b.PAT_WAITING_TIME_ERROR,`noReceiver`),R.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let r=n.getSynchronizationSources();if(!r||!r.length)return R.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let i=r[0].rtpTimestamp;if(!Number.isInteger(i))return O.log(b.PAT_WAITING_TIME_ERROR,`timestampNotInteger`),R.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${i}`),0;let a=t-i&Vi,o=Math.ceil(a/Bi);return Math.min(100,Math.max(0,o))}async _changeSimulcastInfo(e,t){let n=this._mediaSource.mediaSettings.isVideoEnabled,r=this._findFirstSimTransceiver();if(!w.simulcast||!I.isSimulcastSupportedByBrowser()||!n||!r||!r.sender)return;let i=this._mediaSource.getStream();if(!i)return;let a=i.getVideoTracks()[0],o=a.getSettings().width,s=a.getSettings().height,c=ce(o,s,this._serverSettings.camera?.bitrates?.generic),l=t||!oe(this._simulcastInfo,c);if(!c.streams.length||!l)return;let u=r.sender.getParameters();if(u.encodings||(u.encodings=[{}]),!(u.encodings.length<=1)){if(R.log(`_changeSimulcastInfo: ${o}x${s} command: ${JSON.stringify(c)} `),e){let e=0;for(let t of u.encodings)t.scaleResolutionDownBy=le(t.rid),t.scalabilityMode=re,e>=c.streams.length?(t.maxBitrate=0,t.active=!1):(t.active=!0,t.maxBitrate=c.streams[e].bitrate),e++;await r.sender.setParameters?.(u).catch(e=>{R.error(`Failed to set sender parameters`,u,e)}),R.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(u.encodings)} `)}if(this._simulcastInfo=c,c.streams){let e={mediaSource:ke.CAMERA,simulcastInfo:c};await this._signaling.changeSimulcast(e)}}}async _monitorRtpShare(){let e=jr.getInstance().value;if(!this._mediaSource.mediaSettings.isFastScreenSharingEnabled||!w.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(e=>e.track?.kind===k.video&&e.track?.contentHint===`motion`);t&&(await t.getStats()).forEach(e=>{if(e.type===`outbound-rtp`&&this._serverSettings.fastScreenSharing&&e.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&e.frameWidth<window.screen.width){let n=t.getParameters();n.degradationPreference=`maintain-resolution`,t.setParameters(n),R.log(`
13
16
  degradationPreference updated for fast share RTP Sender
14
- Actual senderStats: ${JSON.stringify(a)}
17
+ Actual senderStats: ${JSON.stringify(e)}
15
18
  serverSettings: ${JSON.stringify(this._serverSettings.fastScreenSharing)}
16
- `)}})}_startMonitorRtpShareInterval(){if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,5e3)};this._monitorRtpShareInterval=window.setTimeout(t,5e3)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}};var Fe=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(Fe||{}),Pr=class extends de{constructor(e,t,i,a){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_topology");o(this,"_allocated",[]);o(this,"_opened",[]);o(this,"_directTransport",null);o(this,"_serverTransport",null);o(this,"_serverSettings");o(this,"_dtListeners",[]);o(this,"_stListeners",[]);o(this,"_states",{});o(this,"_localState","IDLE");o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"ANIMOJI_STATUS",this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e==="SERVER"&&(this._serverTransport=this._createServerTransport())}updateSettings(e){d.log("Update transport settings",e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(d.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){d.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology==="DIRECT"&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology==="SERVER"&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,i=!1,a=!1){d.log("Trying open participant",{participantIds:e});let s=a;for(let c of e){if(this._opened.indexOf(c)!==-1){d.warn(`The participant [${c}] has already had opened transport`);continue}if(this._allocated.indexOf(c)===-1){d.warn(`The participant [${c}] has no allocated transport`);continue}this._opened.push(c),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(i),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),d.debug("The transport has been opened",e))}close(e){let t=this._allocated.indexOf(e),i=this._opened.indexOf(e);t<0&&d.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&i>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),i>=0&&this._opened.splice(i,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),u.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){u.vmoji&&t.isMe&&u.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===B.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(d.log(`Topology changed ${this._topology} -> ${e.topology}`),y.log(k.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology==="SERVER"&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology==="DIRECT"){let t=e.offerTo||[],i=e.offerToTypes||[],a=e.offerToDeviceIdxs||[],s=t.length&&i.length?I.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){d.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&d.warn("Topology changed to DIRECT, but the allocated participants count more then one");let c=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let l=s===c;this._directTransport=this._createDirectTransport(c,l)}this._opened.indexOf(c)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new 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("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 xi(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(!u.vmoji)return;this._animojiReceiver=new u.vmoji.AnimojiReceiver((t,i)=>this._onAnimojiStream(t,i),t=>this._onAnimojiStream(t,null),t=>{this._triggerEvent("ANIMOJI_ERROR",t)},u.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new u.vmoji.AnimojiSender(e,this._signaling.getPeerId(),u.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:u.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=t=>this._animojiReceiver?.receive(t)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology!=="SERVER"?(y.log(k.PAT_WAITING_TIME_ERROR,"wrongTopology"),d.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(y.log(k.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var Le=class Le{constructor(){o(this,"trackerByTransport",{ws:new ct,wt:new ct});o(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();y.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:Z.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 ct,wt:new ct},this.lastSeen={}}};o(Le,"_instance");var ut=Le;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 ct,Ve._instance.trackerByCommand.set(i,a)),a.add(e)}static logMetrics(r){if(Ve._instance)for(let[e,t]of Ve._instance.trackerByCommand.entries()){if(!t.hasData)continue;let[i,a]=e.split("|"),s=t.snapshot();y.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:Z.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 mt=Ve;var Gn=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(Gn||{}),Ke=Gn;var Wn={producerScreenTrack:()=>!0,videoTracksCount:()=>u.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>u.movieShare,useParticipantListChunk:()=>u.useParticipantListChunk,useRooms:()=>u.useRooms,vmoji:()=>!!u.vmoji,useCallsToContacts:()=>u.useCallsToContacts,useChatRooms:()=>u.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!u.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>u.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>u.waitForAdminInGroupCalls,hold:()=>u.hold},Qe=class{static getFlags(){let r=Object.values(Wn),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(Wn).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};var qe=ui(require("fflate"));var lc=63n,pc=16383n;var uc=4611686018427387903n,br=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=lc)return new Uint8Array([Number(e)]);if(e<=pc)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<=uc)return new Uint8Array([192|Number(e>>56n),Number(e>>48n&0xffn),Number(e>>40n&0xffn),Number(e>>32n&0xffn),Number(e>>24n&0xffn),Number(e>>16n&0xffn),Number(e>>8n&0xffn),Number(e&0xffn)]);throw new RangeError("Number is too large to encode using varint")}},Ar=class{decode(r){let e=this.getNumBytesForLengthInteger(r);if(e<0)throw new Error("Invalid length prefix");if(r.length<e)return null;let t=BigInt(0);switch(e){case 1:t=BigInt(r[0]&63);break;case 2:t=BigInt(r[0]&63)<<8n|BigInt(r[1]);break;case 4:t=BigInt(r[0]&63)<<24n|BigInt(r[1])<<16n|BigInt(r[2])<<8n|BigInt(r[3]);break;case 8:t=BigInt(r[0]&63)<<56n|BigInt(r[1])<<48n|BigInt(r[2])<<40n|BigInt(r[3])<<32n|BigInt(r[4])<<24n|BigInt(r[5])<<16n|BigInt(r[6])<<8n|BigInt(r[7]);break}return t}getNumBytesForLengthInteger(r){let e=r[0]&192;return e===0?1:e===64?2:e===128?4:e===192?8:-1}};var Mr=class{constructor(r){o(this,"encoder");o(this,"compression");o(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new br,this.compression=r??null}encode(r){let e=this.encoder.encode(r);e=this.compress(e);let t=this.lengthEncoder.encode(e.length),i=new Uint8Array(t.length+e.length);return i.set(t),i.set(e,t.length),i}compress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return qe.gzipSync(r);case"deflate":return qe.zlibSync(r);case"deflate-raw":return qe.deflateSync(r);default:return r}}},Dr=class{constructor(r){o(this,"decoder");o(this,"compression");o(this,"lengthDecoder");o(this,"buffer");o(this,"expectedLength");o(this,"offset");o(this,"lengthPrefixLength");this.decoder=new TextDecoder,this.lengthDecoder=new Ar,this.compression=r??null,this.buffer=new Uint8Array(0),this.expectedLength=null,this.offset=0}decode(r){let e=[];for(this.buffer=new Uint8Array([...this.buffer,...r]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return e;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return e;let t=this.buffer.subarray(this.offset,this.offset+this.expectedLength);t=this.decompress(t),e.push(this.decoder.decode(t)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return e}readLength(r){if(r.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(r),this.lengthPrefixLength<0)throw new Error("Invalid length prefix");let e=this.lengthDecoder.decode(r.subarray(0,this.lengthPrefixLength));return e===null?null:Number(e)}decompress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return qe.gunzipSync(r);case"deflate":return qe.unzlibSync(r);case"deflate-raw":return qe.inflateSync(r);default:return r}}};var ri=class{constructor(r,e={}){o(this,"webTransport");o(this,"stream",null);o(this,"writer",null);o(this,"reader",null);o(this,"url");o(this,"options");o(this,"compression");o(this,"encoder");o(this,"decoder");o(this,"onopen",null);o(this,"onmessage",null);o(this,"onerror",null);o(this,"onclose",null);o(this,"readyState",WebSocket.CONNECTING);this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new Mr(this.compression),this.decoder=new Dr(this.compression),this.connect()}getCompressionTypeFromUrl(r){try{let t=new URL(r).searchParams.get("compression");switch(t){case"gzip":case"deflate":case"deflate-raw":return t;default:return null}}catch(e){return d.log("Exception while parsing compression",e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,d.debug("[WebTransport] WebTransport connected to "+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event("open")),await this.readLoop()}catch(r){d.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error")),this.onclose?.(new CloseEvent("close",{code:1006,reason:"Connection Failed"}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:r,value:e}=await this.reader.read();if(r)break;e&&(yield e)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let r of this.readChunks())this.decoder.decode(r).forEach(t=>{this.onmessage?.(new MessageEvent("message",{data:t}))});this.close(1e3,"Stream Closed")}catch(r){d.error("[WebTransport] Stream read failed",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(r){if(this.readyState!==WebSocket.OPEN){d.warn("[WebTransport] Attempt to send data before webtransport is open");return}if(!this.writer){d.warn("[WebTransport] Attempt to send data before stream is ready");return}try{await this.writer.ready;let e=this.encoder.encode(r);await this.writer.write(e)}catch(e){d.error("[WebTransport] Failed to send data",e),this.onerror?.(new Event("error")),this.close(1006,"Failed to send data")}}close(r=1e3,e){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(t){d.warn("[WebTransport] already closed. Did we get a STOP_SENDING? ignore",t)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent("close",{code:r,reason:e})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return"WebTransport"in window&&typeof WebTransport=="function"?M.browserName()==="Firefox"?u.webtransportFF:M.browserName()!=="Safari":!1}};var Kn="open",qn=10,mc=["service-unavailable","conversation-ended","invalid-token"],Vt=class n extends mi{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,"peerId",null);o(this,"conversationId",null);o(this,"reconnectTimer",0);o(this,"connectionMessageWaitTimer",0);o(this,"doctorTimer",0);o(this,"participantIdRegistry",null);o(this,"producerNotificationDataChannel",null);o(this,"producerCommandDataChannel",null);o(this,"producerCommandDataChannelEnabled",!1);o(this,"producerCommandSerializationService",new hr)}static get RECONNECT_DELAY(){return u.signalingReconnectDelay}static get RECONNECT_MAX_DELAY(){return u.signalingReconnectMaxDelay}static get RECONNECT_MAX_COUNT(){return u.signalingReconnectMaxCount}static get WAIT_CONNECTION_DELAY(){return u.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return u.waitResponseDelay}static get WAIT_MESSAGE_DELAY(){return u.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 new Promise((t,i)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){y.log(k.SOCKET_ACTION,"already_opened"),i(Error("Socket already opened"));return}this.conversationResolve=a=>{t(a),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=a=>{i(a),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},i=!0,a=0){if(t.participantId){let s=I.decomposeParticipantId(t.participantId),c=I.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:c.id,participantType:c.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,i,a)}async _sendRaw(e,t={},i=!0,a=0){let s=c=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(c),this.producerCommandDataChannel?.readyState===Kn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){y.log(k.SOCKET_ACTION,"not_opened"),d.warn("[signaling] socket is not opened"),c.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(y.log(k.SOCKET_ACTION,"invalid_state"),d.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(c),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((c,l)=>{let p=(b,C=!1)=>{!a||C?l(b):(d.debug("[signaling] resending a signaling message",e,E.sequence),a--,s(E))},m=this.sequence++,h=`${e}_${m}`;ue.setMark(h);let E={sequence:m,name:e,statMarkName:h,params:t,responseTimer:0,needResponse:i,resolve:c,reject:p};s(E)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===x.UPDATE_DISPLAY_LAYOUT||e===x.REPORT_PERF_STAT||e===x.REPORT_SHARING_STAT||e===x.REQUEST_ASR||e===x.ENABLE_VIDEO_SUSPEND||e===x.ENABLE_VIDEO_SUSPEND_SUGGEST||e===x.REPORT_NETWORK_STAT||e===x.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(x.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(x.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(x.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,i){let a=Object.assign({sdp:t},i);return this._send(x.TRANSMIT_DATA,{participantId:e,data:a},!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)}_buildUrl(e,t,i){let a=new URL(e),s=a.searchParams;return s.set("platform",u.platform),s.set("appVersion",String(u.appVersion)),s.set("version",String(u.protocolVersion)),s.set("device",u.device),s.set("capabilities",Qe.getFlags()),s.set("clientType",u.clientType),t&&s.set("tgt",t),t===Ke.RETRY&&this.lastStamp&&s.set("recoverTs",String(this.lastStamp)),u.useParticipantListChunk&&(s.set("partIdx",String(u.participantListChunkInitIndex)),u.participantListChunkInitCount!==null&&s.set("partCount",String(u.participantListChunkInitCount))),i&&(s.set("compression","deflate-raw"),s.set("ua",navigator.userAgent)),this.peerId!==null&&s.set("peerId",String(this.peerId)),a.toString()}_connect(e,t){if(!(this.socket&&this.socket.readyState<WebSocket.CLOSING)){if(this.connectionType=e,t){if(!this.wtEndpoint){d.error("[signaling] empty wt endpoint"),this.conversationReject?.(new U(ne.SIGNALING_FAILED,{message:"Unable to connect to the signaling: wtEndpoint is not set",remote:!0}));return}let i=this._buildUrl(this.wtEndpoint,e,!0);d.debug("[signaling] connecting to wt "+i),this.socket=new ri(i)}else{let i=this._buildUrl(this.endpoint,e,!1);d.debug("[signaling] connecting to ws "+i),this.socket=new WebSocket(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()}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){d.debug("[signaling] socket opened"),y.log(k.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Ke.RETRY?"reconnected":"connected")}_onMessage(e){if(this._startDoctor(),e.data==="ping"){ut.mark(this._getSocketType()),this._markTransportStat("failed_pings"),v.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send("pong");return}try{let t=JSON.parse(e.data);v.onSignalingMessage(t),this._handleMessage(t)}catch(t){y.log(k.SOCKET_ACTION,"parse_error"),d.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(d.debug("[signaling] signaling connected",e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat("restart"),this._triggerEvent(Ae.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Ae.NOTIFICATION,{type:"notification",notification:B.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===B.ACCEPTED_CALL&&t.peerId.id===this.peerId&&t.peerId.type==="WEB_TRANSPORT"||this._handleMessage(t)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(Ae.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:y.log(k.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){y.log(k.SOCKET_ACTION,`error-${e.error}`);let t=e.error?mc.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 U(R.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Ae.NOTIFICATION,{notification:B.CLOSED_CONVERSATION,reason:R.SERVICE_UNAVAILABLE});break;case"conversation-ended":this.conversationReject?this.conversationReject(new U(e.reason||ne.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(Ae.NOTIFICATION,{notification:B.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 U(e.reason||ne.SIGNALING_FAILED,{message:`Unable to connect to the signaling: ${e.error}`,remote:!0})),this._closeSocket())}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(Ae.FAILED,e)}_onError(e){y.log(k.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){if(y.log(k.SOCKET_ACTION,"closed"),d.debug("[signaling] connection closed",{code:e.code,reason:e.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this._abortSignal?.aborted){d.debug("[signaling] aborted reconnect"),this._closeSocket(new U(R.CANCELED));return}this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new U(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})`),y.log(k.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Ke.RETRY,!1),e)}_handleCommandResponse(e,t){if(!Object.hasOwn(this.responseHandlers,t.sequence))return;let i=this.responseHandlers[t.sequence];window.clearTimeout(i.responseTimer);let a=ue.measureMark(i.statMarkName);a!==null&&mt.mark(i.name,a,this._getSocketType()),d.debug(`[signaling] command response [${t.sequence}]`,t),e?(delete this.responseHandlers[t.sequence],i.resolve(t)):t.type==="error"?(delete this.responseHandlers[t.sequence],y.log(k.SOCKET_ACTION,"response-error"),i.reject(new Error(t.error||`Response error [${i.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],y.log(k.SOCKET_ACTION,"response-timeout"),i.reject(new Error(t.error||`Response timeout [${i.name}]`))):i.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),n.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(d.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Kn){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]=hn(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new U(ne.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&&u.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];be.logEventualStat({name:a,...t})}};var $n=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))($n||{}),ke=$n;var zn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(zn||{}),nt=zn;var Jn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(Jn||{}),wr=Jn;var Yn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(Yn||{}),kr=Yn;var Qn=(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))(Qn||{}),Xe=Qn;function Xn(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function Zn(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 es=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(es||{}),je=es;var ts=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(ts||{}),X=ts;var is=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(is||{}),ai=is;var rs=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(rs||{}),as=rs;function ns(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var ss=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(ss||{}),ht=ss;function Ni(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var Or=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Or||{}),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",b=0){return{id:h,type:E,deviceIdx:b}}m.fromId=r;function e(h,E=!0){let b=E?h.decorativeExternalUserId:h.externalId,C=h.deviceIdx??0;if(b)return t(b,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",b=0){return a(r(h,E,b))}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 p(h){return h?.deviceIdx||0}m.getDeviceIdx=p})(Q||(Q={}));function os(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function cs(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var xr=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function ds(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 hc(n,r){switch(n){case le.AUDIO:return!!r.isAudioEnabled;case le.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case le.VIDEO:return!!r.isVideoEnabled;case le.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function ls(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case je.MUTE:case je.MUTE_PERMANENT:{hc(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function ps(n){let{muteStates:r={},mediaSettings:e}=n;return ls(r,e)}function us(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return ls(r,t)}function ms(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 p=i-l;for(let m=0;m<c&&!(i>=r);m++)e[i++]=e[p+m]}return e}var ni=class{constructor(r){o(this,"_fixNoPacketsApplied",!1);o(this,"_fixNoPacketsChecked",!1);o(this,"_fixTooManyPacketsApplied",!1);o(this,"_fixTooManyPacketsSucceeded",!1);o(this,"_fixTooManyPacketsFailed",!1);o(this,"_fixTooManyPacketsTime");o(this,"_mediaSource");o(this,"_lastPacketsSent");o(this,"_lastPacketsSentTime");o(this,"_toggleAudioPromise",null);o(this,"_fixNoPacketsAppliedVideo",!1);this._mediaSource=r}_fixAudioDeviceNoPackets(r){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,y.log(k.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,y.log(k.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(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"),y.log(k.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),y.log(k.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,y.log(k.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0).catch(a=>{d.warn("[AudioFix] Failed to fix RV (too many packets)",a)}),this._fixTooManyPacketsTime=t)}}fix(r){if(!this._mediaSource)return;let e=r.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(r){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=r.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.getMediaSettings().isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(t=>{d.warn("[AudioFix] Failed to fix RV (no packets): video restart",t)}))}};var Li=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=M.getSavedOutput();r&&await this._audioElement.setSinkId?.(r.deviceId)}catch(r){throw y.log(k.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(u.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=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 gc=90,_c=3,Ui=class extends de{constructor(){super(...arguments);o(this,"_lastMemoryStat",{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(i=>{let a=typeof i.userId=="string"&&t[i.userId]||null;i.userId=a?.externalId}),v.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),i=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>gc?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=_c)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var fc=44100,Rt=class{constructor(r,e){o(this,"_analyser",null);o(this,"_gainNode",null);o(this,"_fftBins",null);o(this,"_mediaStreamSource",null);o(this,"_lastSmoothedLevel",0);o(this,"_trackId");o(this,"_track");o(this,"_stream");this._trackId=r,this._track=e,this._stream=new MediaStream([e]);try{let t=M.getAudioContext();this._gainNode=t.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(t.destination),this._analyser=t.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=t.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let r=fc/this._fftBins.length,e=Math.ceil(u.voiceParams.minFreq/r),t=Math.floor(u.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*u.voiceParams.smoothing+t*(1-u.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 Bi=class extends de{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,u.voiceParams.interval)};this._interval=window.setTimeout(t,u.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 Rt("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 Nr=class{constructor(r){this.processor=r;o(this,"queue",[]);o(this,"isProcessing",!1)}add(r){this.queue.push(r),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let r=this.queue.shift();if(r)try{await this.processor(r)}catch{d.error(`Can't process message ${JSON.stringify(r)}`)}}this.isProcessing=!1}}};var Lr=class extends de{constructor(e){super();o(this,"_detectors",new Map);o(this,"_interval",null);o(this,"_activeParticipants");o(this,"_removedParticipants");o(this,"_topology");this._topology=e.getTopology(),this.subscribe(e,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(e,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,"SIGNALLED_ACTIVE_PARTICIPANTS",this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._destroyDetectors()}_onRemoteTrackAdded(e,t,i){if(i.kind==="audio"&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new Rt(e,i)),!this._interval)){let a=()=>{this._collectVolumes(),this._interval=window.setTimeout(a,u.voiceParams.interval)};this._interval=window.setTimeout(a,u.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(Ne.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(`${Ne.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"&&u.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}};var Ur=class extends de{constructor(e,t,i){super();o(this,"_speakerId",null);o(this,"_serverSideSpeakerDetection",!1);this._serverSideSpeakerDetection=i==="SERVER",this.subscribe(e,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this.subscribe(t,"SIGNALLED_SPEAKER_CHANGED",this._onServerSpeakerChanged.bind(this)),this.subscribe(t,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,i=null;if(Object.keys(e).forEach(a=>{let s=e[a].smoothed;s>t&&s>u.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*u.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 Fi=class extends de{constructor(e,t,i){super();o(this,"_transport");o(this,"_volumes",{});o(this,"_participants",{});o(this,"_connectionTimeout",0);o(this,"_volumeTimeout",0);this._transport=e,this._participants=i,this.subscribe(e,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(t,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_onTransportStateChanged(e,t){t==="OPENED"&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),u.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),u.specListenerParams.volumeTimeout))),t==="FAILED"&&this._connectionTimeout&&(d.warn("Transport failed, send callSpecError"),y.log(k.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){let e=i=>i!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(d.warn("There is not connected transport, send callSpecError"),y.log(k.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let i="UNKNOWN",a=this._participants[t];a&&a.platform&&(i=a.platform),e.indexOf(i)<0&&(e.push(i),y.log(k.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var Br=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;y.logClientStats({name:Z.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Fr=class{constructor(){o(this,"_isCallMarked",!1);o(this,"_isFinished",!1);o(this,"_callType",null)}markAcceptCall(r){this.mark(r==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(r){r==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(r){r==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(r){r==="SERVER"&&this.mark("server_join_server")}mark(r){this._isCallMarked||(this._isCallMarked=!0,this._callType=r,ue.setMark(Z.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&be.logEventualStat({name:Z.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var Sc=1e3,vc=1e4;var Ic=15,j=class j extends de{constructor(e,t){super();o(this,"_api");o(this,"_signaling");o(this,"_signalingActor");o(this,"_mediaSource",null);o(this,"_conversation",null);o(this,"_myLastRequestedLayouts",{});o(this,"_state","IDLE");o(this,"_participantState",X.CALLED);o(this,"_participants",{});o(this,"_pendingParticipants",new Map);o(this,"_transport",null);o(this,"_debugInfo",null);o(this,"_volumesDetector",null);o(this,"_speakerDetector",null);o(this,"_localVolumeDetector",null);o(this,"_specListener",null);o(this,"_activeSpeakerId",null);o(this,"_lastSignalledActiveSpeakerId",null);o(this,"_isRealTimeAsrRequested",!1);o(this,"_serverSettings",Mn());o(this,"_onUnload");o(this,"_audioOutput");o(this,"_lastStalled",{});o(this,"_audioMixStalled",!1);o(this,"_audioFix",null);o(this,"_streamByStreamId",new Map);o(this,"_streamIdByStreamDescription",new Map);o(this,"_streamWaitTimerByStreamDescription",new Map);o(this,"_sequenceNumberByStreamDescription",new Map);o(this,"_cooldownTimestampByStreamDescription",new Map);o(this,"_cooldownQueueCleanupTimer",null);o(this,"_statFirstMediaReceived");o(this,"_changeMediaSettings",I.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(t){if(d.warn("changeMediaSettings failed with error",t),t.message==="chatRoom.maxShareCountExceeded")return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100));y.create(e,t),y.setConversationIdProvider(()=>this._conversation?.id||null),be.create(),at.create(()=>this._transport?.getTopology()),ut.create(),mt.create(),this._api=e,this._signaling=new Vt,this._signalingActor=new Nr(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?R.CANCELED:R.HUNGUP),u.clientEventsLoggingEnabled&&y.logClientEvent({event_type:Z.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),y.destroy(),be.destroy(),at.destroy(),ut.destroy(),mt.destroy()},window.addEventListener("pagehide",this._onUnload),this._statFirstMediaReceived=new Fr,this._audioOutput=new Li(this._statFirstMediaReceived,u.transparentAudio),u.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),Sc))}static current(){return j._current}static hangupAfterInit(){j._activationMutex&&!j._current&&(j._delayedHangup=!0,j._abortController?.abort(new U(R.CANCELED)))}static id(){return j._current?._conversation?.id||null}async onStart({opponentIds:e,opponentType:t,mediaOptions:i,payload:a="",joiningAllowed:s=!1,requireAuthToJoin:c=!1,onlyAdminCanShareMovie:l,externalIds:p,onFastStart:m,conversationId:h}){if(j._activationMutex)throw y.log(k.ERROR,"startCall"),d.warn("Conversation: there is already running activation"),new U(R.FAILED);let E=Date.now();j._activationMutex=!0,xe.startSession(),j._abortController=new AbortController,this._api.setAbortSignal(j._abortController?.signal),this._signaling.setAbortSignal(j._abortController?.signal);try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let b=this._mediaSource.getMediaSettings();t===nt.CHAT||e&&e.length>1?this._logWithMediaSettings(k.OUTGOING_MULTIPARTY_CALL,b):this._logWithMediaSettings(k.OUTGOING_CALL,b);let C=await this._startConversation({opponentIds:e,opponentType:t,direction:ke.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:c,onlyAdminCanShareMovie:l,externalIds:p,startedTime:E,onFastStart:m,conversationId:h});if(!this._conversation)throw new U(R.UNKNOWN_ERROR);if(this._participantState=X.ACCEPTED,this._changeMediaSettings(b),await this._processConnection(C),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),j._delayedHangup)throw new U(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(),j._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(b){throw this._close(b,"Unable to start conversation"),b}finally{j._activationMutex=!1}}async onJoin(e){if(j._activationMutex)throw y.log(k.ERROR,"joinCall"),d.warn("Conversation: there is already running activation"),new U(R.FAILED);let t=Date.now();j._activationMutex=!0,this._state="PROCESSING",xe.startSession(),j._abortController=new AbortController,this._api.setAbortSignal(j._abortController?.signal),this._signaling.setAbortSignal(j._abortController?.signal);try{let i=!!e.observedIds?.length;if(i&&u.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new U(R.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(k.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new U(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"),j._current=this,j._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus(this._conversation.waitForAdmin?"WAIT_FOR_ADMIN":"WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(i){throw j._activationMutex=!1,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){d.debug("Join conversation part 2"),j._activationMutex=!0;try{if(this._participantState=X.ACCEPTED,!this._conversation||!this._mediaSource)throw new U(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(j._delayedHangup)throw new U(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(),j._current=this;let i=this._extractLocalParticipantFromConnection(e);if(i){let a=I.mapParticipantState(i);Object.keys(a).length>0&&v.onLocalParticipantState(a)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(t){throw this._close(t,"Unable to join conversation"),t}finally{j._activationMutex=!1}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(a=>!!a)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let i={rooms:await this._extractExternalRooms(e)};return t&&(i.roomId=t),i}async onPush(e,t=se.USER,i,a,s){if(j._activationMutex)throw d.warn("Conversation: there is already running activation"),new U(R.REJECTED);j._activationMutex=!0,j._abortController=new AbortController,this._api.setAbortSignal(j._abortController?.signal),this._signaling.setAbortSignal(j._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 U(R.UNKNOWN_ERROR);if(!l.conversation.participants.find(m=>m.state===X.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),y.log(k.PUSH,"rejected"),new U(R.REJECTED);if(xe.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,ke.INCOMING),y.log(k.PUSH,"accepted"),j._current=this,j._delayedHangup)throw new U(R.CANCELED);j._activationMutex=!1}catch(c){throw j._activationMutex=!1,this._close(c,"Unable to handle inbound call push"),c}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(Xe.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(Xe.WAIT_FOR_ADMIN),i=e.conversation.options.includes(Xe.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(Xe.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new U(R.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();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.getMediaSettings()),v.onCallAccepted(),this._state="ACTIVE",this._participantState=X.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}async _getMainRoomParticipants(){let e=await this._getParticipants();return I.mapSharedParticipants(Object.values(e).filter(t=>!t.isInRoom))}_decodeExternalConversationParams(e){let[t,i]=e.split(":"),a=parseInt(t,10);if(isNaN(a))throw new Error("Invalid original length in prefix");let s=atob(i),c=new Uint8Array(s.length);for(let l=0;l<s.length;l++)c[l]=s.charCodeAt(l);try{let p=ms(c,a).reduce((Re,De)=>(Re+=String.fromCharCode(De),Re),""),{srcp:m,stne:h,tkn:E,trne:b,trnp:C,trnu:W,wse:q,wte:J}=JSON.parse(p);return{token:E,endpoint:q,wt_endpoint:J,turn_server:{urls:b.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={[ke.OUTGOING]:"outgoing",[ke.INCOMING]:"incoming",[ke.JOINING]:"join"};be.logEventualStat({name:Z.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw y.log(k.ERROR,"acceptIncoming"),d.error("Unable to accept a call - invalid state"),new Error("Unable to accept a call - invalid state");if(!this._mediaSource||!this._conversation||!this._transport)throw new U(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(k.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=X.ACCEPTED;let i=this._getMuteStatesForCurrentRoom(),a=Object.keys(i);a.length&&this._onMuteParticipant({muteStates:i,mediaOptions:a,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());if(s.rooms?.rooms){let l=await this._getParticipants();s.rooms.rooms.forEach(p=>{p.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(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),c),u.useParticipantListChunk){let l=await this._getInitialParticiapntListChunk(),p=await this._getParticipants();l?.participants?.forEach(m=>{let h=I.composeId(m),E=p[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 y.log(k.ERROR,"declineIncoming"),d.error("Unable to decline a call - invalid state"),new Error("Unable to decline a call - invalid state");this._state="PROCESSING",d.debug("Decline incoming call"),this._logWithMediaSettings(k.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=X.HUNGUP,this._signaling.ready&&await this._signaling.hangup(R.REJECTED),this._close(new U(R.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?R.HUNGUP:R.CANCELED;y.log(k.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new U(e))):v.onHangup(new U(R.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new U(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 c of s)await this._onAddParticipant(I.composeId(c),c,a)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new U(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 c of s)await this._onAddParticipant(I.composeId(c),c,a)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let i=[];for(let a of e)(a.state===X.CALLED||a.state===X.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===X.ACCEPTED&&i.push(a.id);i.length?this._transport.open(i,null,!!this._conversation?.observer):this._transport.getTopology()==="SERVER"&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&d.error(t,e),d.debug("Close conversation",e),Br.sendHangupEvent(e,this._transport?.getTopology()),at.destroy(),ut.logMetrics(this._transport?.getTopology()),ut.destroy(),mt.logMetrics(this._transport?.getTopology()),mt.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(R.FAILED):y.log(k.ERROR,e.hangup),j._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)&&j._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=X.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),y.destroy(),be.destroy(),this._conversation=null,this._myLastRequestedLayouts={},j._current=null,j._delayedHangup=!1,j._abortController=null,v.onHangup(e||new U(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=X.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),j._delayedHangup&&e)try{this._api.hangupConversation(e,R.CANCELED)}catch{}this._cleanupListeners(),y.destroy(),be.destroy(),this._conversation=null,this._myLastRequestedLayouts={},j._current=null,j._delayedHangup=!1,j._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,p,m)=>m.indexOf(l)===p);c.push(`${c[c.length-1]}?transport=tcp`),i.push({urls:c,username:a.username,credential:a.credential})}return u.iceServers=i,u.wssBase=t.endpoint,t.wt_endpoint&&(u.wtsBase=t.wt_endpoint),u.wssToken=t.token,t.client_type&&(u.clientType=t.client_type),t.external_user_type&&(u.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 p=e.urls.filter((m,h,E)=>E.indexOf(m)===h);p.push(`${p[p.length-1]}?transport=tcp`),l.push({urls:p,username:e.username,credential:e.credential})}u.iceServers=l,u.wssBase=i,u.wssToken=s,a&&(u.wtsBase=a),c&&(u.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:p,externalIds:m,startedTime:h,onFastStart:E,conversationId:b}){ue.setMark(Z.SIGNALING_CONNECTED);let C=b??I.uuid();d.debug("Conversation: start",{conversationId:C,opponentIds:e,opponentType:t,direction:i});let W=a.includes(le.VIDEO),q;if(E){let Re={deviceId:this._api.deviceId(),sdkVersion:u.sdkVersion,clientAppKey:u.apiKey,platform:u.platform,protocolVersion:u.protocolVersion,domainId:u.domain,capabilities:Qe.getFlags()},De=JSON.stringify(Re),oe;try{if(oe=await E({internalParams:De,conversationId:C,externalIds:m,opponentType:t,mediaOptions:a,isVideo:W,joiningAllowed:c,requireAuthToJoin:l},j._abortController?.signal),!oe.internalCallerParams)throw new U(R.FAST_START_ERROR,{message:JSON.stringify(oe)})}catch(re){throw j._delayedHangup&&j._abortController?.signal.aborted?new U(R.CANCELED):re instanceof U?re:re instanceof Error?new U(R.FAST_START_ERROR,{message:re.message}):new U(R.FAST_START_ERROR,{message:String(re)})}try{let re=JSON.parse(oe.internalCallerParams);q={endpoint:re.endpoint,wt_endpoint:re.wtEndpoint,id:C,is_concurrent:re.isConcurrent,client_type:re.clientType,rejected_participants:oe.rejectedParticipants?.map(Y=>({...Y,status:Y.status})),stun_server:re.stun,turn_server:re.turn,token:new URL(re.endpoint).searchParams.get("token")??""},d.debug("FastStart",q)}catch{throw new U(R.FAST_START_ERROR,{message:"Cannot parse internal params"})}}else q=await this._api.startConversation(C,e,t,W,s,c,l,{onlyAdminCanShareMovie:p},m),d.debug("Api.startConversation",q);this._setConversationParams(q);let J=await this._connectSignaling(Ke.START,q);return await this._setConversation(q,J,i),this._logCallStartEvent(h,ke.OUTGOING),J}async _joinConversation(e,t){ue.setMark(Z.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:c,observedIds:l,payload:p,onFastJoin:m}=e;d.debug("Conversation: join",{conversationId:i,joinLink:c,observedIds:l});let h=a.includes(le.VIDEO),E;if(m){if(!c)throw new U(R.FAST_JOIN_ERROR,{message:"joinLink is required for fast join"});let C={deviceId:this._api.deviceId(),sdkVersion:u.sdkVersion,clientAppKey:u.apiKey,platform:u.platform,protocolVersion:u.protocolVersion,domainId:u.domain,capabilities:Qe.getFlags()},W=JSON.stringify(C),q;try{if(q=await m({joinLink:c,isVideo:h,internalParams:W},j._abortController?.signal),!q.internalCallerParams||!q.conversationId)throw new U(R.FAST_JOIN_ERROR,{message:JSON.stringify(q)})}catch(J){throw j._delayedHangup&&j._abortController?.signal.aborted?new U(R.CANCELED):J instanceof U?J:J instanceof Error?new U(R.FAST_JOIN_ERROR,{message:J.message}):new U(R.FAST_JOIN_ERROR,{message:String(J)})}try{let J=JSON.parse(q.internalCallerParams);E={endpoint:J.endpoint,wt_endpoint:J.wtEndpoint,id:q.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 U(R.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,p);else throw new U(R.UNKNOWN_ERROR);d.debug("Api.joinConversation",E),this._setConversationParams(E);let b=await this._connectSignaling(Ke.JOIN,E);return await this._setConversation(E,b,ke.JOINING),this._logCallStartEvent(t,ke.JOINING),b}async _prepareConversation(e,t=se.USER,i,a,s){ue.setMark(Z.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let c=this._api.getUserId();if(!c)throw new U(R.UNKNOWN_ERROR);let l=0,p="",m="",h={id:e,peerId:i,endpoint:p,wt_endpoint:m,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let b=this._decodeExternalConversationParams(a);this._setConversationParams(b),p=s??`${u.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${u.wssToken}`,h.token=b.token,h.endpoint=p,u.wtsBase&&(m=`${u.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${u.wssToken}`,h.wt_endpoint=m)}else{let b=await this._getConversationParams(e);l=b.device_idx||0,p=s??`${u.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${u.wssToken}`,p=this._addGeoParamsToEndpoint(p,b),h.token=b.token,h.endpoint=p,h.device_idx=l,u.wtsBase&&(m=`${u.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${l}&conversationId=${e}&token=${u.wssToken}`,m=this._addGeoParamsToEndpoint(m,b),h.wt_endpoint=m)}let E=await this._connectSignaling(Ke.ACCEPT,h);return j._current&&(j._current._participantState===X.ACCEPTED||j._current._participantState===X.CALLED)?(d.log("Push rejected (busy)"),y.log(k.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(R.BUSY),Promise.reject(new U(R.BUSY))):(j._current&&(j._current.destroy(),j._current=null),await this._setConversation(h,E,ke.INCOMING,t),E)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:ye(),participantState:{},state:X.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return i.externalId||(i.externalId=await this._getParticipantId(t??i.id)),this._api.cacheExternalId(t??i.id,i.externalId),t&&this._api.mapDecorativeId(t,i.id),i.observedIds?.length&&(i.externalId.observer=!0),e.markers&&(i.markers=this._denormalizeMarkers(i.id,e.markers)),i}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new U(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),b=Q.fromSignalingParticipant(h,!1);if(b){this._api.cacheExternalId(E,b);let C=I.composeDecorativeId(h),W=Q.fromSignalingParticipant(h);C&&W&&(this._api.cacheExternalId(C,W),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let c=this._api.getUserId(),l=this._extractLocalParticipantFromConnection(t),p=e.device_idx||0;if(!c){if(!l)throw new U(R.UNKNOWN_ERROR);c=Number(l.id),l.idType&&(a=l.idType),l.deviceIdx&&(p=l.deviceIdx),this._api.setUserId(c)}let m=I.composeParticipantId(c,a,p);this._conversation={userId:c,compositeUserId:m,externalId:await this._getExternalIdByParticipantId(m),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||"DIRECT",direction:i,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles: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},xe.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(u.forceRelayPolicy=e.p2p_forbidden),y.log(k.RELAY_POLICY,u.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new U(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 zi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new ni(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,Ae.NOTIFICATION,a=>this._signalingActor.add(a)),this.subscribe(this._signaling,Ae.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Ae.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return be.logEventualStat({name:Z.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(wr.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&&(u.externalUserType=i);let a=await this._getParticipants();for(let s of e){let c=I.composeId(s);if(d.test("Conversation:RegisterParticipant",c),this._isMe(c)){this._conversation.roles=s.roles||[],this._conversation.roles.length&&(d.debug(`Local roles changed: ${s.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(s);continue}if(s.state===X.HUNGUP||s.state===X.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],R.HUNGUP);continue}let l=I.composeDecorativeId(s);this._registerParticipant({id:c,externalId:Q.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 p=await this._getParticipant(c);p&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${c}] changed: ${s.roles}`),v.onRolesChanged(p.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=xr(e,je.MUTE),s=xr(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(u.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(u.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=ds(e);this._setMuteStatesForRoomId(i,null);for(let l of e.rooms?.rooms??[])this._setMuteStatesForRoomId(l.muteStates,l.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=us(e,a));let s=Object.keys(a),c=this._conversation?.roomId;s.length&&this._onMuteParticipant({muteStates:a,mediaOptions:s,muteAll:!0,stateUpdated:!0,roomId:c},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}async _processPinnedParticipants(e){e.conversation.pinnedParticipantId?await this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?await this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}async _allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new Pr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Ui,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===ke.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let i of Object.values(t))(i.state===X.ACCEPTED||i.state===X.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Lr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new Ur(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Bi(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Fi(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()?"✔":"✖")),y.log(k.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){y.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}async _removeParticipant(e,t){if(e.state===X.CALLED||e.state===X.ACCEPTED||this._state==="CLOSE")return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let i=await this._getParticipants();if(i[e.id]){t===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("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===X.ACCEPTED||a.state===X.CALLED)){d.warn(`Participant [${a.id}:${a.state}] is already in conversation`);return}if(!a){let s=I.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Q.fromSignalingParticipant(t),mediaSettings:ye(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s),a=await this._getParticipant(e)}this._setParticipantsStatus([a],"WAITING"),i?(a.state=X.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=X.CALLED,this._transport.allocate(a.id,!0),y.log(k.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=Ic;a++){let s=I.compose(e,a),c=i[s];c&&t.push(c)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let a of t)this._transport.close(a.id);y.log(k.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(ne.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(ne.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(ne.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,i=null){if(!this._transport||!this._conversation)return;let a=!t,s=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let c=i??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:c,isMe:a});return}this._transport.setAnimojiSvg(s,{svg:e,isMe:a})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return y.log(k.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return y.log(k.MEDIA_STATUS,e?"audio_1":"audio_0"),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},i={};for(let s of e){let c=typeof s.uid=="object"?s.uid:Q.fromId(s.uid),l=Q.toString(c);i[l]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let c=Q.toString(s.externalId);Object.hasOwn(i,c)&&(t[s.id]=i[c])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[i,a]of Object.entries(e))if(i.length>5||a.length>5)throw new Error("key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded");t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async 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 c=typeof s.uid=="object"?s.uid:Q.fromId(s.uid),l=this._api.getCachedOkIdByExternalId(c);if(!l){let h=Q.toString(c);d.log(`Unknown participant external ID ${h}`);continue}let p=it({participantId:l,mediaType:s.mediaType,streamName:s.streamName}),m=i[l];m?m.lastRequestedLayouts[p]=s:this._isMe(l)&&(this._myLastRequestedLayouts[p]=s),Yt(s)?(this._isMe(l)&&delete this._myLastRequestedLayouts[p],this._streamIdByStreamDescription.has(p)&&!this._cooldownTimestampByStreamDescription.has(p)&&this._cooldownTimestampByStreamDescription.set(p,Date.now())):(this._cooldownTimestampByStreamDescription.delete(p),!this._streamIdByStreamDescription.has(p)&&u.videoTracksCount>0&&this._streamIdByStreamDescription.set(p,null),t[p]=s),s.mediaType==="SCREEN"&&!Yt(s)&&ue.setMark(ue.getMarkNameScreenshareFirstFrame(l))}let a=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>u.videoTracksCount;){let s=a.next();if(s.done){d.error("Cannot accommodate all streaming requests: tracks available "+u.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&&u.clientEventsLoggingEnabled){let a={event_type:Z.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),y.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};y.logClientEvent(a,i)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(d.log("Client asked to stop streaming before stream became available",e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let i=await this._getParticipants(),a=Qt(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 p={stream:null,streamName:a.streamName,mediaType:a.mediaType};l?v.onLocalLive(c,p):v.onRemoteLive(s.externalId,p)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null);break}}y.log(k.PAT_DEALLOCATED)}else d.log(`Cannot find participant to stop streaming: ${a.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;d.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let i;try{if(i=await this._signaling.updateDisplayLayout(e),!i)return}catch(c){if(d.warn(`Failed to update display layout ${JSON.stringify(e)}. ${c}`),t)throw c;return}let a=[],s=await this._getParticipants();for(let[c,l]of Object.entries(i.errorCodeByParticipantId||{})){let p=Qt(c),m=s[p.participantId];if(m){let h;typeof l!="number"?(d.warn(`Unexpected error code ${l} received for participant ${p.participantId}`),h=as.UNKNOWN_ERROR):h=ns(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 Aa("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]+vc>Date.now())break;let c=a[0];await this._stopStreaming(c),e[c]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;d.log("Received participant sources update notification",t);for(let i of t)this._waitForStreamIfNeeded(i)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(d.log("Promoted in audience mode",!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(d.log("Promoted in waiting hall",!e.demote),e.demote?(d.log("Kicked from waiting hall"),this._close(new U(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 c=[],l=[],p=[],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;c.push(W),m.push(W)}}),a?.length&&a.forEach(C=>{let W=I.decomposeId(C).id;c.push(W),l.push(W)}),s?.length&&s.forEach(C=>{let W=I.decomposeId(C).id;c.push(W),p.push(W)}),!c.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let C=await this._api.getExternalIdsByOkIds(m);h.push(...C)}let E=await this._api.getExternalIdsByOkIds(l),b=await this._api.getExternalIdsByOkIds(p);v.onChatRoomUpdated(e,t,h,E,b)}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(b=>b&&b.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=Qt(h),b=await this._getParticipant(E.participantId);v.onRemoteScreenStream(b.externalId,null);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:i,participantId:a}=t;if(i==="ANIMOJI")return;let s=await this._getParticipant(a);if(i==="SCREEN"&&!e.fastScreenShare){d.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let c=it(t),l=this._sequenceNumberByStreamDescription.get(c);if(l&&l>e.sequenceNumber){d.warn(`Participant ${a} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${l}`),y.log(k.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&i&&(d.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(s.externalId,i,e.suspend));let p=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(p,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(c);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){y.log(k.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let b=E?h:s.externalId,C=this._streamByStreamId.get(p);if(!C){y.log(k.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${p}`);return}y.log(k.PAT_ALLOCATED),this._streamIdByStreamDescription.set(c,p);let W=e.participantStreamDescription?.mediaType;if(W==="STREAM"||W==="MOVIE"){if(e.participantStreamDescription?.streamName){let q={streamName:e.participantStreamDescription.streamName,stream:C,mediaType:W};E?v.onLocalLive(b,q):v.onRemoteLive(b,q)}}else W==="SCREEN"?v.onRemoteScreenStream(s.externalId,C):E||v.onRemoteStream(s.externalId,C)}else{d.debug(`Waiting for ${m} until stream ${p} for ${c} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),m);this._streamWaitTimerByStreamDescription.set(c,h)}}_getStreamDescriptionById(e){for(let[t,i]of this._streamIdByStreamDescription.entries())if(i===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(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,[ht.ADMIN,ht.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!I.includesOneOf(this._conversation.roles,[ht.ADMIN,ht.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===X.CALLED}async grantRoles(e,t,i){this._checkAdminRole(),await this._signaling.grantRoles(e,t,i)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,i=[],a=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,i,a)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,i=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,i),this._conversation?.pinnedParticipantIdByRoom.set(i,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Zn(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=cs(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),p=null;return c.length&&s.hasMore&&(p=os(c[c.length-1].id)),{participants:l,pageMarker:p,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,i=[],a=[];if(e.length){let s=[];e.forEach(c=>{if(t.set(c.id.id,c.id.addedTs),c.externalId){let l=Q.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,[Xe.WAITING_HALL,Xe.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},p=await this._signaling.startStream(l);if(p.error)return Promise.reject(p.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async recordSetConf(e,t,i=!1,a=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:i,roomId:a});if(s.error)throw new Error(s.error)}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<u.videoMinWidth||e.height<u.videoMinHeight)throw new Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<u.videoMinWidth||t.height<u.videoMinHeight)throw new Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");u.videoEffectMaxHeight=t.height,u.videoEffectMaxWidth=t.width}u.videoMaxWidth=e.width,u.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:u.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:Q.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 p=I.composeId(l);return!a[p]});await this._registerParticipants(s);let c=this._transport?.getState();return i.participants.forEach(l=>{let p=I.composeId(l),m=a[p];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=u.participantListChunkInitIndex,t=u.participantListChunkInitCount,a=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return d.debug("Get initial participant list chunk",a.chunk),a.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new ni(this._mediaSource)),v.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this._mediaSource?.getMediaSettings();d.log("Screen sharing changed",e.track,t);let i=e.track?new MediaStream([e.track]):null;v.onScreenStream(i,t)}async _changeRemoteMediaSettings(e,t){d.debug(`Remote media settings changed [${e}]`,t);let i=this._conversation?.externalId;if(this._isMe(e)&&i){v.onLocalMediaSettings(i,t);return}let s=await this._getParticipant(e);if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&v.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(a=>a.id===t||I.comparePeerId(a.peerId,e.peerId))}_changeLocalParticipantState(e){d.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){d.debug(`Remote participant state changed [${e}]`,t);let i=await this._getParticipant(e);if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}async _changeMultipleParticipantState(e,t){d.debug("Multiple participants state changed",e);let i=[],a,s=await this._getParticipants();e.forEach((c,l)=>{if(this._isMe(l))a=c;else{let p=s[l];if(!p){this._warnParticipantNotInConversation(l);return}p.participantState=c,i.push({externalId:p.externalId,participantState:{...c},markers:p.markers})}}),this._state==="ACTIVE"&&(a&&v.onLocalParticipantState(a,!0),i.length&&v.onRemoteParticipantsState(i,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(d.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),v.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case B.ACCEPTED_CALL:return this._onAcceptedCall(e);case B.HUNGUP:return this._onHungup(e);case B.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case B.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case B.CLOSED_CONVERSATION:return this._onClosedConversation(e);case B.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case B.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case B.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case B.RATE_CALL_DATA:return this._onNeedRate();case B.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case B.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case B.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case B.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case B.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case B.REGISTERED_PEER:return this._onPeerRegistered(e);case B.SWITCH_MICRO:return this._onMicSwitched(e);case B.CHAT_MESSAGE:return this._onChatMessage(e);case B.CUSTOM_DATA:return this._onCustomData(e);case B.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case B.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case B.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case B.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case B.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case B.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case B.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case B.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case B.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case B.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case B.FEEDBACK:return this._onFeedback(e);case B.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case B.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case B.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case B.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case B.ROOMS_UPDATED:return this._onRoomsUpdated(e);case B.ROOM_UPDATED:return this._onRoomUpdated(e);case B.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case B.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case B.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case B.ASR_STARTED:return this._onAsrStart(e);case B.ASR_STOPPED:return this._onAsrStop(e);case B.PROMOTION_APPROVED:return this._onPromotionApproved(e);case B.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case B.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}v.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),await this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let s=Object.keys(await this._getParticipants()),c=[];for(let p of e.conversation.participants){let m=I.composeId(p),h=p.roles||[];if(this._isMe(m)){Ni(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:ps(p),unmuteOptions:p.unmuteOptions})};continue}c.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:p.id,participant:p,mediaSettings:p.mediaSettings});else{let b=ye(p.mediaSettings);rn(b,E.mediaSettings)||await this._changeRemoteMediaSettings(m,b);let C=I.mapParticipantState(p),W=E.participantState;I.isEqualParticipantState(C,W)||await this._changeRemoteParticipantState(m,C),Ni(h,E.roles)||this._onRolesChanged(E.id,h)}}let l=await this._getParticipants();for(let p of s)c.indexOf(p)<0&&l[p]&&this._removeParticipant(l[p],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 U(R.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let c=this._api.getDecorativeIdByInitialId(t),l=c?I.composeUserId(c,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:ye(e.mediaSettings)},l))}a.state=X.ACCEPTED,a.mediaSettings=ye(e.mediaSettings),this._logWithMediaSettings(k.ACCEPTED_OUTGOING,a.mediaSettings),this._conversation&&this._conversation.direction===ke.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),this._state==="ACTIVE"&&this._transport&&this._transport.open([a.id],i),await this._changeRemoteMediaSettings(t,a.mediaSettings),await this._changeRemoteParticipantState(t);let s=Object.keys(a.muteStates);s.length&&this._onMuteParticipant({muteStates:a.muteStates,mediaOptions:s,stateUpdated:!0,participantId:t}),this._state==="ACTIVE"&&v.onAcceptedCall(a.externalId,Qe.parseCapabilities(e.capabilities))}async _onHungup(e){d.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=I.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new U(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?X.REJECTED:X.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!==X.HUNGUP&&i.state!==X.REJECTED){d.debug(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:a}=e,s=a.decorativeUserId;this._registerParticipant({id:t,externalId:Q.fromSignalingParticipant(a),mediaSettings:ye(a.mediaSettings),state:a.state,participantState:I.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},s),i=await this._getParticipant(t)}i.state=X.CALLED,i.mediaSettings=ye(e.participant?.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant?.roles||[],this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(i.id,!0),v.onParticipantAdded(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i)}async _onJoinedParticipant(e){d.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state===X.ACCEPTED){d.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:s}=e,c=s.decorativeUserId;this._registerParticipant({id:t,externalId:Q.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===ke.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),i.state=X.ACCEPTED,i.mediaSettings=ye(e.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers),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 U(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:p})=>this._registerParticipantAndSetMarkersIfChunkEnabled(l,p));await Promise.all(a);let s=new Map,c=t.map(({id:l,participantState:p})=>this._getExternalIdByParticipantId(l).then(m=>[l,m&&I.mapParticipantState({participantState:p})]));try{(await Promise.all(c)).forEach(([p,m])=>{m&&s.set(p,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=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=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(le.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onChatMessage(e.message,i,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,"sdk"))return;let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onCustomData(e.data,i,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let i=this._conversation.recordsInfoByRoom.get(t);if(i?.recordMovieId!==e?.recordMovieId||i?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let s=await this._getExternalIdByParticipantId(e.initiator);s?v.onRecordStarted(s,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},i=null){if(!this._conversation)return;let a=this._conversation.recordsInfoByRoom.get(i);if(!(!a||a.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(i,null),e){let s=await this._getExternalIdByParticipantId(e);v.onRecordStopped(i,s??null)}else v.onRecordStopped(i,null)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let i=await this._getExternalIdByParticipantId(t);i&&v.onPinnedParticipant(i,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiator);i?v.onRecordStarted(i,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else v.onRecordStopped(e,null)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let i=await this._getExternalIdByParticipantId(t.initiatorId);i&&v.onAsrSet({externalId:i,movieId:t.movieId},e)}else v.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,i=t.get(e);if(i){let a=await this._getExternalIdByParticipantId(i.initiatorId);a&&v.onRemoteSharedUrl(a,i.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,i=e.roomId||null;this._conversation.asrInfoByRoom.set(i,t);let a=await this._getExternalIdByParticipantId(t.initiatorId);if(!a){this._warnParticipantNotInConversation(t.initiatorId);return}v.onAsrStarted(a,t.movieId,i)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),v.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!Ni(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:xr(this._getMuteStatesForCurrentRoom(),je.MUTE_PERMANENT),stateUpdated:!0}),I.includesOneOf(t,[ht.ADMIN,ht.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=await this._getParticipant(e);i&&!Ni(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 p=await this._getParticipant(e.participantId);if(p){d.debug(`Mute states for participant [${e.participantId}] changed`,a);let m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;v.onMuteStates(a,s,c,i,e.unmute,p.externalId,m,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,l):i||(this._conversation.muteStatesPersonal=a)),e.adminId&&this._isMe(e.adminId)){i&&v.onMuteStates(a,s,c,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:c,muteAll:i,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:a})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let i=this._getMuteStatesForRoomId(t),a=this._getMuteStatesForRoomId(e),s=Object.keys(i),c=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...s,...c])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==X.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:c,roomId:l=null,unmuteOptions:p=[]}=e,m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(l)),E=this._mediaSource.getMediaSettings(),b=Object.entries(h);for(let[C,W]of b){let q=this._isCallAdmin()&&i;if(!(W!==je.MUTE&&W!==je.MUTE_PERMANENT||q)&&(this._isCallAdmin()&&W===je.MUTE_PERMANENT&&!i&&(h[C]=je.MUTE),!(!t.includes(C)||a)))switch(C){case le.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(le.VIDEO,!1),await this.toggleLocalVideo(!1));break;case le.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(le.AUDIO,!1),await this.toggleLocalAudio(!1));break;case le.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(le.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case le.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(le.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:E.isScreenSharingEnabled,fastScreenSharing:E.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(h,p,t,i,a,null,m,s,c,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&&!Xn(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e),e.includes(Xe.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&v.onLocalStatus("WAITING_HALL"):e.includes(Xe.WAIT_FOR_ADMIN)&&this._conversation.restricted&&v.onLocalStatus("WAIT_FOR_ADMIN"))}async _onNetworkStatus(e){if(this._conversation){let t=[],i=await this._getParticipants();for(let[a,s]of Object.entries(e)){let c;if(this._isMe(a)||a==="")c=this._conversation.networkRating;else if(i[a])c=i[a].networkRating;else continue;if(c!==s)if(this._isMe(a)||a==="")this._conversation.networkRating=s,Xt.getInstance().value=s,v.onLocalNetworkStatusChanged(s);else{let 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(kr.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&v.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let s=await this._getParticipant(i);s&&s.externalId&&t.push({uid:s.externalId,volume:a.real})}v.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){d.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=await this._getParticipants(),s=e.reduce((c,l)=>{if(l in a){let p=a[l];c.push(p),t==="CONNECTED"&&(p.remoteStream||(p.mediaSettings&&this._changeRemoteMediaSettings(l,p.mediaSettings),this._changeRemoteParticipantState(l,p.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"&&(M.releaseFirefoxMicrophonePermissionWarmup(),v.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&v.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&v.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(R.FAILED),this._close(new U(R.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(Ne.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(e,i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(Ne.TRANSPARENT_AUDIO_TRACK_PREFIX))d.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,i);else if(e.startsWith(Ne.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))d.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{d.debug(`Remote track added on the participant [${e}]`,{kind:i.kind});let a=await this._getParticipant(e);if(!a){let s=this._api.getDecorativeIdByInitialId(e),c=s?I.composeUserId(s):void 0;d.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${c}]`),this._registerParticipant({id:e},c),a=await this._getParticipant(e),this._setParticipantsStatus([a],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(a.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(e,i),u.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!==Ne.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 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){!M.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!M.hasCamera()||!this._audioFix||!this._mediaSource?.getMediaSettings().isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!=="CLOSE"||!1;e&&(d.debug("Toggle join availability",{available:t,chatId:e}),v.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!=="SERVER")return;let t=await this._getParticipant(e);if(t&&t.lastRequestedLayouts&&Object.keys(t.lastRequestedLayouts).length)try{await this.updateDisplayLayout(Object.values(t.lastRequestedLayouts))}catch(i){d.warn(`_updateDisplayLayoutFromCache failed: ${i}`)}}_setParticipantsStatus(e,t,i=null){if(!e.length)return;let a=e.reduce((s,c)=>(c.status!==t&&(c.status=t,s.push(c.externalId)),s),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(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(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(b=>I.decomposeId(b).id)||[],s=await this._api.getExternalIdsByOkIds(a),c=e.addedParticipants;if(s.length&&c?.length!==s.length&&!this._isCalledState()){let b=this._convertExternalIdsToServerExternalIds(s);c=(await this._signaling.getParticipants(b)).participants}let l=await Promise.all(c?.map(async b=>{let C=I.composeId(b);return this._createParticipant({id:C,externalId:Q.fromSignalingParticipant(b),mediaSettings:ye(b.mediaSettings),participantState:I.mapParticipantState(b),state:b.state,roles:b.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:b.muteStates||{},unmuteOptions:b.unmuteOptions||[],observedIds:b.observedIds||[],markers:this._denormalizeMarkers(C,b.markers),isInRoom:i!==null},b.decorativeUserId)})||[]),p=!1;for(let b of l)b.id===this._conversation?.compositeUserId&&(p=!0),this._registerParticipantInCache(b);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(l,!0);let m=[],h=[];if(e?.removedParticipantMarkers){for(let b of e.removedParticipantMarkers)if(b.GRID?.id){let C=this._getExternalIdByParticipantId(b.GRID.id);h.push(C)}m=await Promise.all(h)}if(p&&await this._onRoomSwitched(i),m){let b=this._conversation?.pinnedParticipantIdByRoom.get(i);if(b){let C=await this._getExternalIdByParticipantId(b);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 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 p=await this._convertRoomToExternal(s);p&&a.push(p)}}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 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=Q.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 p=await this._getParticipants();p[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]}};o(j,"_current"),o(j,"_activationMutex"),o(j,"_delayedHangup",!1),o(j,"_abortController",null);var F=j,Aa=class n extends Error{constructor(e,t){super(e);o(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var jt=null,si=null;function gs(){jt=null,si=null}function Ec(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Vr(n=null,r){let e=Ec(n??u.apiBaseUrl);if(e)return e;if((r??u.apiEnv)!=="AUTO")return u.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),u.apiEndpoint(r)}}async function _s(){return jt||si||(si=Vr(),jt=await si,si=null,jt)}async function jr(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await _s();let t=Ss(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${jt}/fb.do`,i)}async function Vi(n,r={},e=!1,t){await _s();let i=Ss(n,r,e);return Tc(i,t)}async function Tc(n,r){let e=`${r??jt}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new U(R.NETWORK_ERROR)),u.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 fs(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 Ss(n,r={},e=!1){r.method=n,r.format="JSON",r.application_key||(r.application_key=u.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 ji=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=R.HUNGUP){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var Cc=700,yc=3e3,oi=class extends ji{constructor(){super(...arguments);o(this,"_userId",null);o(this,"_uuid");o(this,"_externalUidsCache",new Map);o(this,"_decorativeIdToInitialId",new Map);o(this,"_initialIdToDecorativeId",new Map)}async _callUnsafe(e,t={},i=!1){let a=async s=>{try{return await Vi(e,t,i)}catch(c){if(!Object.hasOwn(c,"error_msg")){s++;let l=Object.getOwnPropertyNames(c).map(p=>`${p}: ${JSON.stringify(c[p])}`);if(d.debug(`${e} network error, attempt ${s}: ${l.join(`
17
- `)}`),this._abortSignal?.aborted&&(d.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),s<u.apiMaxAttempt)return await I.delay(Math.min(s*Cc,yc),{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=ne.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 U)throw a;if(a.custom_error&&(c.custom_error=a.custom_error),Pc(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 U(s,c)}}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(),!u.apiKey)throw new U(ne.API,{message:"Required argument apiAppKey not passed"});let e={session_data:{version:2,device_id:this._uuid,client_version:u.appVersion,client_type:"SDK_JS"}};return u.authToken&&(e.session_data.auth_token=u.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 U(ne.AUTH,{message:t.error_msg,code:t.error_code})})}logClientStats(e){let t={app_version:String(u.appVersion),sdk_type:"WEB",sdk_version:u.sdkVersion,version:1,items:e};u.clientStatsPlatform&&(t.platform=u.clientStatsPlatform);let i={data:JSON.stringify(t)};jr("vchat.clientStats",i)}logClientEvents(e){let t={app_version:String(u.appVersion),sdk_type:"WEB",sdk_version:u.sdkVersion,version:1,items:e};u.clientStatsPlatform&&(t.platform=u.clientStatsPlatform);let i={data:JSON.stringify(t)};jr("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let s={conversationId:e,webrtcPlatform:u.platform,startTime:t,endTime:i},c=await this._callUnsafe("vchat.getLogUploadUrl",s),l=new FormData,p=new Blob([a],{type:"application/json"});l.append("file",p,"log.json");let m=new URL(c.upload_url);return m.searchParams.append("size",p.size.toString()),fs(m.toString(),l)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:u.protocolVersion,capabilities:Qe.getFlags()};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:c,waitForAdmin:l,closedConversation:p}={},m){let h=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,waitForAdmin:l,closedConversation:p,audienceMode:s,audioOnly:c,speakerIds:m});return this._startConversation(h)}async startConversation(e,t,i,a=!1,s="",c=!1,l=!1,{onlyAdminCanShareMovie:p,waitForAdmin:m}={},h){let E=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:c,payload:s,requireAuthToJoin:l,onlyAdminCanShareMovie:p,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=ft.get("uuid");e||(e=I.uuid(),ft.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:p=!1,audioOnly:m=!1,speakerIds:h=[],closedConversation:E=!1,externalIds:b}){let C={conversationId:e,isVideo:t,protocolVersion:u.protocolVersion};if(a&&(C.createJoinLink=!0),i&&(C.payload=i),u.domain&&(C.domainId=u.domain),u.externalDomain&&(C.externalDomain=u.externalDomain),s&&(C.requireAuthToJoin=!0),c!==void 0&&(C.onlyAdminCanShareMovie=c),l!==void 0&&(C.waitForAdmin=l),p&&(C.audienceMode=p),m&&(C.audioOnly=m),h.length){let W=h.map(q=>I.composeUserId(q));C.speakerIds=W.join(",")}return E&&(C.closed=E),b&&(C.externalIds=b.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:u.protocolVersion,capabilities:Qe.getFlags()};return i?.length&&(s.observedIds=i.join(",")),u.anonymToken&&(s.anonymToken=u.anonymToken),a&&(s.payload=a),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],i=[],a=new Map,s=Array.from(this._externalUidsCache.keys()),c=Array.from(this._externalUidsCache.values());for(let p of e){let m=Q.toString(p),h=c.indexOf(m);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(a.set(String(p.id),m),i.push({id:p.id,ok_anonym:p.type==="ANONYM"}))}return i.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:i})).ids.forEach((p,m)=>{let h=Number(p.ok_user_id),E=String(p.external_user_id.id);a.has(E)&&(this.cacheExternalId(h,Q.fromString(a.get(E))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let s of e){let c=Q.toString(s),l=a.indexOf(c);if(l>-1){let p=I.composeParticipantId(this.replaceByInitialIdIdIfExists(i[l]),se.USER,s.deviceIdx);t.set(s,p)}}return t}async getExternalIdsByOkIds(e){let t=[],i=[];for(let s of e)if(this._externalUidsCache.has(s)){let c=this.getDecorativeIdByInitialId(s),l=this._externalUidsCache.get(c??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 u.anonymToken&&(t.anonymToken=u.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};u.anonymToken&&(i.anonymToken=u.anonymToken),jr("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,p]of Object.entries(s)){let m=Number(l),h=Q.fromId(p,c);t.set(m,h),this.cacheExternalId(m,h)}};i.external_ids&&a(i.external_ids,"USER"),i.anonym_ids&&a(i.anonym_ids,"ANONYM");for(let s of e){let c=Number(s);if(!t.has(c)){let l=Q.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 Pc(n){return typeof n=="object"&&n!==null&&"error_code"in n&&"error_msg"in n}var vs=(e=>(e.KING="KING",e.PAWN="PAWN",e))(vs||{}),Is=vs;var Ma=(e=>(e.OFF="0",e.ON="1",e))(Ma||{});var Hr=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 Gr=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:u.appVersion,client_type:"SDK_JS",auth_token:this._callToken,version:3},application_key:this._apiKey},e=await Vr(this._baseApiUrl,this._apiEnv),t=await Vi("auth.anonymLogin",r,!0,e);return I.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(r){let e={conversationId:r,reason:R.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Vr(this._baseApiUrl,this._apiEnv);await Vi("vchat.hangupConversation",e,!0,t)}};var me,Hi=null,bc={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},Ac={participantMarkerCompare:I.participantMarkerCompare};function Mc(n){Hi=n}function Dc(n){u.videoEffects=n}function wc(n){u.audioEffects=n}function kc(n,r=null,e={},t=1){u.vmoji=n,u.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function Oc(n){if(u.set(n),me||(me=new oi),Da.default.disableLog(!u.debug),d.toggle(u.debug),d.log(`Calls SDK ${u.sdkVersion}`,n),await M.init(),!M.isBrowserSupported())throw new U(ne.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} => ${u.simulcast}`)}async function xc(n,r=[le.AUDIO],e="",t=!1,i=!1,a,s,c){let l=[];return Array.isArray(n)?l=n.length?n:[]:n&&(l=[n]),Es([],nt.USER,r,e,t,i,a,l,s,c)}async function Es(n,r=nt.USER,e,t="",i=!1,a=!1,s,c,l,p){if(F.current())throw d.error("There is already active call"),new U(R.FAILED);return new F(me,Hi).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:l,conversationId:p})}async function Nc(n,r){return Ts(n,se.USER,void 0,r)}async function Ts(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,Hi).onPush(n,r,e,t,i)}async function Lc(n,r){return n&&(u.authToken=n),r!==void 0&&u.apiBaseUrl!==r&&(u.apiBaseUrl=r,gs()),me.authorize()}async function Uc(n=[le.AUDIO]){return Ze().accept(n)}async function Bc(){let n=F.current();if(n)return n.decline()}async function Fc(n,r=[le.AUDIO]){return Rs(n,r)}async function Rs(n,r,e){if(F.current())throw d.error("There is already active call"),new U(R.FAILED);return new F(me,Hi).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function Vc(n,r=[le.AUDIO],e,t,i,a){if(F.current())throw d.error("There is already active call"),new U(R.FAILED);return e&&(u.anonymToken=e),new F(me,Hi).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i,onFastJoin:a})}async function jc(){let n=F.current();if(n)return n.hangup();F.hangupAfterInit()}async function Hc(n,r){let e=Array.isArray(n)?n:[n],t=F.current();t&&await t.addParticipant(e,r)}async function Gc(n,r){let e=F.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function Wc(n,r=!1){let e=await me.getOkIdsByExternalIds([n]);return Cs(e[0],r)}async function Cs(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 Kc(n,r){let e=F.current();if(n==="videoinput"&&_t.contains(r))return u.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 qc(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&u.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=F.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function $c(n){let r=F.current();r&&r.toggleAnimojiCapturing(n)}async function zc(n,r=!1){let e=F.current();e&&await e.setVideoStream(n,r)}async function Jc(n){let r=F.current();r&&await r.toggleLocalVideo(n)}async function Yc(n){let r=F.current();r&&await r.toggleLocalAudio(n)}async function Qc(n){let r=F.current();if(r)return r.setLocalResolution(n)}async function Xc(n){let r=F.current();r&&await r.changePriorities(n)}async function Zc(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 ed(n){let r=F.current();r&&await r.hold(n)}async function td(){let n=F.current();n&&await n.putHandsDown()}async function id(n){let r=F.current();r&&await r.updateDisplayLayout(n)}async function rd(n,r,e=!1){let t=await me.getOkIdsByExternalIds([n]);return ys(t[0],Q.getDeviceIdx(n),r,e)}async function ys(n,r,e,t=!1){let i=F.current();i&&await i.grantRoles(I.composeParticipantId(n,se.USER,r),e,t)}async function ad({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await me.getOkIdsByExternalIds([n]))[0]),Ps({uid:i,muteStates:r,requestedMedia:e,deviceIdx:Q.getDeviceIdx(n),roomId:t})}async function Ps({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 nd(n,r=!1,e=null){let t=await me.getOkIdsByExternalIds([n]);return bs(t[0],r,Q.getDeviceIdx(n),e)}async function bs(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 sd(n){let r=F.current();r&&await r.updateMediaModifiers(n)}async function od(n){let r=F.current();r&&await r.enableVideoSuspend(n)}async function cd(n){let r=F.current();r&&await r.enableVideoSuspendSuggest(n)}async function dd(n){let r=F.current();r&&await r.changeOptions(n)}async function ld(n,r=null){let e=null;return r&&(e=(await me.getOkIdsByExternalIds([r]))[0]),As(n,e)}async function As(n,r=null){let e=F.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function pd(n=10){let r=F.current();if(r)return r.chatHistory(n)}async function ud(n,r=null){let e=null;return r&&(e=(await me.getOkIdsByExternalIds([r]))[0]),Ms(n,e,Q.getDeviceIdx(r))}async function Ms(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 md(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 hd(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 gd(){let n=F.current();return n?n.createJoinLink():Promise.reject()}async function _d(){let n=F.current();return n?n.removeJoinLink():Promise.reject()}async function fd(n,r){return me.getAnonymTokenByLink(n,r)}function Sd(n){let r=F.current();r&&r.setVolume(n)}function vd(n){u.forceRelayPolicy=n}async function Id(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 Ed(n=null,r){let e=F.current();return e?e.stopStream(n,r):Promise.reject()}async function Td(n=null){let r=F.current();return r?r.publishStream(n):Promise.reject()}async function Rd(n,r,e=!1,t=null){let i=F.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 me.getParticipantIdsByExternalIds(c);n&&(a=l.get(n),l.delete(n)),s=Array.from(l.values())}return i.recordSetConf(a,s,e,t)}async function Cd(){let n=F.current();return n?n.getStreamInfo():Promise.reject()}async function yd(n){let r=F.current();return r?r.addMovie(n):Promise.reject()}async function Pd(n){let r=F.current();return r?r.updateMovie(n):Promise.reject()}async function bd(n){let r=F.current();return r?r.removeMovie(n):Promise.reject()}async function Ad(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(c=>I.composeUserId(c))),i.removeParticipantIds&&(s=(await me.getOkIdsByExternalIds(i.removeParticipantIds)).map(c=>I.composeUserId(c))),t.push({id:i.id,name:i.name,participantCount:i.participantCount,addParticipantIds:a,removeParticipantIds:s,countdownSec:i.countdownSec})}return e.updateRooms(t,r)}return Promise.reject()}async function Md(n,r){let e=F.current();return e?e.activateRooms(n,r):Promise.reject()}async function Dd(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 wd(n){let r=F.current();return r?r.removeRooms(n):Promise.reject()}function kd(n){u.statisticsInterval=n;let r=F.current();if(r)return r.updateStatisticsInterval()}function Od(n){Da.default.disableLog(!n),d.toggle(n)}function xd(n,...r){u.debugLog&&d.send(n,"[external]",...r)}async function Nd(){let n=xe.conversationId;if(!n)throw d.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let r=xe.collectLogs();if(r.length===0)throw d.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=xe.startTime,t=xe.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 Ld(n){let r=F.current();if(r)return r.videoEffect(n)}async function Ud(n,r){let e=F.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function Bd(n){let r=F.current();r&&await r.setAudioStream(n)}async function Fd(n,r=null,e=null){let t=F.current();if(!t)return;let i=e??r?.id,a=null;if(r){let c=(await me.getOkIdsByExternalIds([r]))[0];if(!c)throw new Error("Could not get user id to set animoji svg");a=I.composeParticipantId(c,se.USER,Q.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function Vd(n){let r=F.current();r&&r.setAnimojiFill(n)}async function jd(n=null,r,e=!1){return Ze().getWaitingHall(n,r,e)}async function Hd(){return Ze().getAudienceModeHands()}async function Gd(n,r=!1){let e=Ze(),t;if(n){let[i]=await me.getOkIdsByExternalIds([n]);t=I.composeUserId(i)}return e.promoteParticipant(t,r)}async function Wd(n=!1){return Ze().requestPromotion(n)}async function Kd(n=!1){return Ze().acceptPromotion(n)}async function qd(n){return Ze().getParticipantListChunk(n)}async function $d(n){return Ze().getParticipants(n)}async function zd(n){return Ze().feedback(n)}function Jd(n,r,e){return Ze().userFeedbackStats(n,r,e)}function Yd(n,r={},e=!1){let t=F.current();t&&t.sendClientEvent(n,r,e)}async function Qd(n,r){return Ze().enableFeatureForRoles(n,r)}function Ze(){let n=F.current();if(!n)throw new Error("Conversation not found");return n}async function Xd(n){await me.removeHistoryRecords(n)}async function Zd(n){let r=F.current();r&&await r.startAsr(n)}async function el(n){let r=F.current();r&&await r.stopAsr(n)}async function tl(n){let r=F.current();r&&await r.requestAsr(n)}async function il(n){let r=F.current();return r?r.startUrlSharing(n):Promise.reject()}async function rl(){let n=F.current();return n?n.stopUrlSharing():Promise.reject()}function al(){return u.sdkVersion}
19
+ `)}})}_startMonitorRtpShareInterval(){let e=5e3;if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,e)};this._monitorRtpShareInterval=window.setTimeout(t,e)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}},K=function(e){return e.REMOTE_TRACK_ADDED=`REMOTE_TRACK_ADDED`,e.REMOTE_TRACK_REMOVED=`REMOTE_TRACK_REMOVED`,e.REMOTE_STREAM_SECOND=`REMOTE_STREAM_SECOND`,e.AUDIO_MIX_STALL=`AUDIO_MIX_STALL`,e.REMOTE_DATA_STATS=`REMOTE_DATA_STATS`,e.STATE_CHANGED=`STATE_CHANGED`,e.LOCAL_STATE_CHANGED=`LOCAL_STATE_CHANGED`,e.SIGNALLED_ACTIVE_PARTICIPANTS=`SIGNALLED_ACTIVE_PARTICIPANTS`,e.SIGNALLED_SPEAKER_CHANGED=`SIGNALLED_SPEAKER_CHANGED`,e.SIGNALLED_STALLED_PARTICIPANTS=`SIGNALLED_STALLED_PARTICIPANTS`,e.TOPOLOGY_CHANGED=`TOPOLOGY_CHANGED`,e.NETWORK_STATUS=`NETWORK_STATUS`,e.PEER_CONNECTION_CLOSED=`PEER_CONNECTION_CLOSED`,e.ASR_TRANSCRIPTION=`ASR_TRANSCRIPTION`,e.ANIMOJI_STREAM=`ANIMOJI_STREAM`,e.ANIMOJI_ERROR=`ANIMOJI_ERROR`,e.SCREEN_SHARING_STAT=`SCREEN_SHARING_STAT`,e}({}),q=function(e){return e.IDLE=`IDLE`,e.OPENED=`OPENED`,e.CONNECTING=`CONNECTING`,e.RECONNECTING=`RECONNECTING`,e.CONNECTED=`CONNECTED`,e.CLOSED=`CLOSED`,e.FAILED=`FAILED`,e}({}),J=function(e){return e.DIRECT=`DIRECT`,e.SERVER=`SERVER`,e}({}),Ui=class extends _{constructor(e,t,n,r){super(),g(this,`_signaling`,void 0),g(this,`_mediaSource`,void 0),g(this,`_topology`,void 0),g(this,`_allocated`,[]),g(this,`_opened`,[]),g(this,`_directTransport`,null),g(this,`_serverTransport`,null),g(this,`_serverSettings`,void 0),g(this,`_dtListeners`,[]),g(this,`_stListeners`,[]),g(this,`_states`,{}),g(this,`_localState`,`IDLE`),g(this,`_animojiReceiver`,null),g(this,`_animojiSender`,null),this._signaling=t,this._mediaSource=n,this._topology=e,this._serverSettings=r,this.subscribe(this._signaling,qn.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,Oe.ANIMOJI_STATUS,this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,Oe.SOURCE_CHANGED,this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e===`SERVER`&&(this._serverTransport=this._createServerTransport())}updateSettings(e){R.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(R.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){R.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology===`DIRECT`&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology===`SERVER`&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,n=!1,r=!1){R.log(`Trying open participant`,{participantIds:e});let i=r;for(let t of e){if(this._opened.indexOf(t)!==-1){R.warn(`The participant [${t}] has already had opened transport`);continue}if(this._allocated.indexOf(t)===-1){R.warn(`The participant [${t}] has no allocated transport`);continue}this._opened.push(t),i=!0}i&&(this._topology===`DIRECT`&&this._directTransport&&this._directTransport.open(t),this._topology===`SERVER`&&this._serverTransport&&(this._serverTransport.open(n),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),R.debug(`The transport has been opened`,e))}close(e){let t=this._allocated.indexOf(e),n=this._opened.indexOf(e);t<0&&R.warn(`The participant [${e}] transport has already deallocated`),this._topology===`DIRECT`&&this._directTransport&&n>=0&&this._releaseDirectTransport(),this._topology===`SERVER`&&(this._serverTransport?.removeParticipant(e),this._setStates([e],`CLOSED`)),n>=0&&this._opened.splice(n,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),w.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){w.vmoji&&t.isMe&&w.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology===`SERVER`&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let n=e.filter(e=>this._states[e]===t?!1:(this._states[e]=t,!0));n.length&&this._triggerEvent(`STATE_CHANGED`,n,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent(`LOCAL_STATE_CHANGED`,e))}_onSignalingNotification(e){if(e.notification===G.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(R.log(`Topology changed ${this._topology} -> ${e.topology}`),O.log(b.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology===`SERVER`&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology===`DIRECT`){let t=e.offerTo||[],n=e.offerToTypes||[],r=e.offerToDeviceIdxs||[],i=t.length&&n.length?C.composeParticipantId(t[0],n[0],r[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){R.error(`Topology changed to DIRECT, but the list of allocated participants is empty`);return}this._allocated.length>1&&R.warn(`Topology changed to DIRECT, but the allocated participants count more then one`);let a=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let e=i===a;this._directTransport=this._createDirectTransport(a,e)}this._opened.indexOf(a)>=0&&this._directTransport.open()}this._triggerEvent(`TOPOLOGY_CHANGED`,this._topology)}}_createDirectTransport(e,t=!1){let n=new wr(e,t,this._signaling,this._mediaSource,this._serverSettings);return this._dtListeners.length>0&&R.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(n.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this,e)),n.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this,e)),n.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),n.addEventListener(`STATE_CHANGED`,this._onDirectTransportChanged.bind(this)),n.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),n.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,`DIRECT`))),this._animojiReceiver&&this._animojiSender&&n.setAnimojiTransport(this._animojiReceiver,this._animojiSender),n}_createServerTransport(){let e=new Hi(this._signaling,this._mediaSource,this._serverSettings);return this._stListeners.length>0&&R.warn(`The list of server transport listeners is not empty`),this._stListeners=[],this._stListeners.push(e.addEventListener(`REMOTE_TRACK_ADDED`,this._onRemoteTrackAdded.bind(this)),e.addEventListener(`REMOTE_TRACK_REMOVED`,this._onRemoteTrackRemoved.bind(this)),e.addEventListener(`AUDIO_MIX_STALL`,this._onServerAudioMixStall.bind(this)),e.addEventListener(`REMOTE_DATA_STATS`,this._onRemoteDataStats.bind(this)),e.addEventListener(`STATE_CHANGED`,this._onServerTransportChanged.bind(this)),e.addEventListener(`SIGNALLED_ACTIVE_PARTICIPANTS`,this._onTransportActiveParticipants.bind(this)),e.addEventListener(`SIGNALLED_SPEAKER_CHANGED`,this._onTransportSpeakerChanged.bind(this)),e.addEventListener(`SIGNALLED_STALLED_PARTICIPANTS`,this._onTransportStalledParticipants.bind(this)),e.addEventListener(`NETWORK_STATUS`,this._onTransportNetworkStatus.bind(this)),e.addEventListener(`REMOTE_STREAM_SECOND`,this._onRemoteStreamSecond.bind(this)),e.addEventListener(`PEER_CONNECTION_CLOSED`,this._onPeerConnectionClosed.bind(this,`SERVER`)),e.addEventListener(`ASR_TRANSCRIPTION`,this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e===`CONNECTED`&&this._topology===`DIRECT`&&this._releaseServerTransport(),(e===`CLOSED`||e===`FAILED`)&&(this._releaseDirectTransport(),this._topology===`DIRECT`)){let e=this._opened.indexOf(t);e>=0&&this._opened.splice(e,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology===`DIRECT`&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e===`CONNECTED`&&this._topology===`SERVER`&&this._releaseDirectTransport(),(e===`CLOSED`||e===`FAILED`)&&(this._releaseServerTransport(),this._topology===`SERVER`&&(this._allocated=[],this._opened=[])),this._topology===`SERVER`&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology===`SERVER`&&this._triggerEvent(`SIGNALLED_ACTIVE_PARTICIPANTS`,e)}_onTransportStalledParticipants(e){this._topology===`SERVER`&&this._triggerEvent(`SIGNALLED_STALLED_PARTICIPANTS`,e)}_onTransportSpeakerChanged(e){this._topology===`SERVER`&&this._triggerEvent(`SIGNALLED_SPEAKER_CHANGED`,e)}_onTransportNetworkStatus(e){this._triggerEvent(`NETWORK_STATUS`,e)}_onRemoteStreamSecond(e,t){this._triggerEvent(`REMOTE_STREAM_SECOND`,e,t)}_onPeerConnectionClosed(e){this._triggerEvent(`PEER_CONNECTION_CLOSED`,e)}_onServerAudioMixStall(e){this._topology===`SERVER`&&this._triggerEvent(`AUDIO_MIX_STALL`,e)}_onRemoteDataStats(e){this._triggerEvent(`REMOTE_DATA_STATS`,e)}_onRemoteTrackAdded(e,t,n){this._triggerEvent(`REMOTE_TRACK_ADDED`,e,t,n)}_onRemoteTrackRemoved(e,t,n){this._triggerEvent(`REMOTE_TRACK_REMOVED`,e,t,n)}_onAsrTranscription(e){this._triggerEvent(`ASR_TRANSCRIPTION`,e)}_onSourceChanged(){let e=this._mediaSource.getStream();e&&this._animojiSender?.setStream(e)}_onAnimojiStream(e,t){this._triggerEvent(`ANIMOJI_STREAM`,e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createAnimojiTransport(){if(!w.vmoji)return;this._animojiReceiver=new w.vmoji.AnimojiReceiver((e,t)=>this._onAnimojiStream(e,t),e=>this._onAnimojiStream(e,null),e=>{this._triggerEvent(`ANIMOJI_ERROR`,e)},w.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new w.vmoji.AnimojiSender(e,this._signaling.getPeerId(),w.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:w.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=e=>this._animojiReceiver?.receive(e)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology===`SERVER`?this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(O.log(b.PAT_WAITING_TIME_ERROR,`noTransport`),R.error(`Cannot get stream waiting time, server transport is not initialized`),0):(O.log(b.PAT_WAITING_TIME_ERROR,`wrongTopology`),R.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0)}},Wi=class e{constructor(){g(this,`trackerByTransport`,{ws:new Kn,wt:new Kn}),g(this,`lastSeen`,{})}static create(){e._instance||(e._instance=new e)}static mark(t){if(!e._instance)return;let n=Date.now(),r=e._instance.lastSeen[t];if(typeof r==`number`){let i=n-r;i>=0&&e._instance.trackerByTransport[t].add(i)}e._instance.lastSeen[t]=n}static logMetrics(t){e._instance&&[Vn.WEBSOCKET,Vn.WEBTRANSPORT].forEach(n=>{if(!e._instance.trackerByTransport[n].hasData)return;let r=e._instance.trackerByTransport[n].snapshot();O.logClientStats({call_topology:t===J.DIRECT?`D`:`S`,name:H.SIGNALING_PING_SUMMARY,min_value:r.min,max_value:r.max,avg_value:r.avg,median_value:r.median,p95_value:r.p95,values_count:r.count,signaling_transport:n})})}static destroy(){e._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new Kn,wt:new Kn},this.lastSeen={}}};g(Wi,`_instance`,void 0);var Gi=class e{constructor(){g(this,`trackerByCommand`,new Map)}static create(){e._instance||(e._instance=new e)}static mark(t,n,r){if(!e._instance)return;let i=`${t}|${r}`,a;e._instance.trackerByCommand.has(i)?a=e._instance.trackerByCommand.get(i):(a=new Kn,e._instance.trackerByCommand.set(i,a)),a.add(n)}static logMetrics(t){if(e._instance)for(let[n,r]of e._instance.trackerByCommand.entries()){if(!r.hasData)continue;let[e,i]=n.split(`|`),a=r.snapshot();O.logClientStats({call_topology:t===J.DIRECT?`D`:`S`,name:H.SIGNALING_COMMAND_SUMMARY,api_method:e,min_value:a.min,max_value:a.max,avg_value:a.avg,median_value:a.median,p95_value:a.p95,values_count:a.count,signaling_transport:i})}}static destroy(){e._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};g(Gi,`_instance`,void 0);var Ki=function(e){return e.START=`start`,e.ACCEPT=`accept`,e.JOIN=`join`,e.RETRY=`retry`,e}(Ki||{}),qi={producerScreenTrack:()=>!0,videoTracksCount:()=>w.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>w.movieShare,useParticipantListChunk:()=>w.useParticipantListChunk,useRooms:()=>w.useRooms,vmoji:()=>!!w.vmoji,useCallsToContacts:()=>w.useCallsToContacts,useChatRooms:()=>w.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!w.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>w.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>w.waitForAdminInGroupCalls,hold:()=>w.hold},Ji=class{static getFlags(){let e=Object.values(qi),t=0;for(let n=0;n<e.length;n++)e[n]()&&(t|=1<<n);return t.toString(16).toUpperCase()}static parseCapabilities(e){let t=parseInt(e||`0`,16);return Object.keys(qi).reduce((e,n,r)=>(e[n]=!!(t&1<<r),e),{})}},Yi=63n,Xi=16383n,Zi=1073741823,Qi=4611686018427387903n,$i=class{encode(e){let t=typeof e==`number`?BigInt(e):e;if(t<=Yi)return new Uint8Array([Number(t)]);if(t<=Xi)return new Uint8Array([64|Number(t>>8n),Number(t&255n)]);if(t<=BigInt(Zi))return new Uint8Array([128|Number(t>>24n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);if(t<=Qi)return new Uint8Array([192|Number(t>>56n),Number(t>>48n&255n),Number(t>>40n&255n),Number(t>>32n&255n),Number(t>>24n&255n),Number(t>>16n&255n),Number(t>>8n&255n),Number(t&255n)]);throw RangeError(`Number is too large to encode using varint`)}},ea=class{decode(e){let t=this.getNumBytesForLengthInteger(e);if(t<0)throw Error(`Invalid length prefix`);if(e.length<t)return null;let n=BigInt(0);switch(t){case 1:n=BigInt(e[0]&63);break;case 2:n=BigInt(e[0]&63)<<8n|BigInt(e[1]);break;case 4:n=BigInt(e[0]&63)<<24n|BigInt(e[1])<<16n|BigInt(e[2])<<8n|BigInt(e[3]);break;case 8:n=BigInt(e[0]&63)<<56n|BigInt(e[1])<<48n|BigInt(e[2])<<40n|BigInt(e[3])<<32n|BigInt(e[4])<<24n|BigInt(e[5])<<16n|BigInt(e[6])<<8n|BigInt(e[7]);break}return n}getNumBytesForLengthInteger(e){let t=e[0]&192;return t===0?1:t===64?2:t===128?4:t===192?8:-1}},ta=class{constructor(e){g(this,`encoder`,void 0),g(this,`compression`,void 0),g(this,`lengthEncoder`,void 0),this.encoder=new TextEncoder,this.lengthEncoder=new $i,this.compression=e??null}encode(e){let t=this.encoder.encode(e);t=this.compress(t);let n=this.lengthEncoder.encode(t.length),r=new Uint8Array(n.length+t.length);return r.set(n),r.set(t,n.length),r}compress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gzipSync(e);case`deflate`:return p.zlibSync(e);case`deflate-raw`:return p.deflateSync(e);default:return e}}},na=class{constructor(e){g(this,`decoder`,void 0),g(this,`compression`,void 0),g(this,`lengthDecoder`,void 0),g(this,`buffer`,void 0),g(this,`expectedLength`,void 0),g(this,`offset`,void 0),g(this,`lengthPrefixLength`,void 0),this.decoder=new TextDecoder,this.lengthDecoder=new ea,this.compression=e??null,this.buffer=new Uint8Array,this.expectedLength=null,this.offset=0}decode(e){let t=[];for(this.buffer=new Uint8Array([...this.buffer,...e]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return t;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return t;let e=this.buffer.subarray(this.offset,this.offset+this.expectedLength);e=this.decompress(e),t.push(this.decoder.decode(e)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return t}readLength(e){if(e.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(e),this.lengthPrefixLength<0)throw Error(`Invalid length prefix`);let t=this.lengthDecoder.decode(e.subarray(0,this.lengthPrefixLength));return t===null?null:Number(t)}decompress(e){if(!this.compression)return e;switch(this.compression){case`gzip`:return p.gunzipSync(e);case`deflate`:return p.unzlibSync(e);case`deflate-raw`:return p.inflateSync(e);default:return e}}},ra=class{constructor(e,t={}){g(this,`webTransport`,void 0),g(this,`stream`,null),g(this,`writer`,null),g(this,`reader`,null),g(this,`url`,void 0),g(this,`options`,void 0),g(this,`compression`,void 0),g(this,`encoder`,void 0),g(this,`decoder`,void 0),g(this,`onopen`,null),g(this,`onmessage`,null),g(this,`onerror`,null),g(this,`onclose`,null),g(this,`readyState`,WebSocket.CONNECTING),this.url=e,this.options=t,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(e),this.encoder=new ta(this.compression),this.decoder=new na(this.compression),this.connect()}getCompressionTypeFromUrl(e){try{let t=new URL(e).searchParams.get(`compression`);switch(t){case`gzip`:case`deflate`:case`deflate-raw`:return t;default:return null}}catch(e){return R.log(`Exception while parsing compression`,e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,R.debug(`[WebTransport] WebTransport connected to `+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event(`open`)),await this.readLoop()}catch(e){R.error(`[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`connect`)),this.onclose?.(new CloseEvent(`close`,{code:1006,reason:`Connection Failed`}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:e,value:t}=await this.reader.read();if(e)break;t&&(yield t)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let e of this.readChunks())this.decoder.decode(e).forEach(e=>{this.onmessage?.(new MessageEvent(`message`,{data:e}))});this.close(1e3,`Stream Closed`)}catch(e){R.error(`[WebTransport] Stream read failed`,e),this.readyState=WebSocket.CLOSED,this.onerror?.(this.createErrorEvent(e,`read`))}}async send(e){if(this.readyState!==WebSocket.OPEN){R.warn(`[WebTransport] Attempt to send data before webtransport is open`);return}if(!this.writer){R.warn(`[WebTransport] Attempt to send data before stream is ready`);return}try{await this.writer.ready;let t=this.encoder.encode(e);await this.writer.write(t)}catch(e){R.error(`[WebTransport] Failed to send data`,e),this.onerror?.(this.createErrorEvent(e,`send`)),this.close(1006,`Failed to send data`)}}createErrorEvent(e,t){let n=new Event(`error`),r=e instanceof Error?e:null;return n.error=e,n.errorInfo={phase:t,name:r?.name,message:r?.message||String(e),stack:r?.stack,readyState:this.readyState,compression:this.compression},n}close(e=1e3,t){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(e){R.warn(`[WebTransport] already closed. Did we get a STOP_SENDING? ignore`,e)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent(`close`,{code:e,reason:t})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return`WebTransport`in window&&typeof WebTransport==`function`?I.browserName()===`Firefox`?w.webtransportFF:I.browserName()!==`Safari`:!1}},ia=`open`,aa=10,oa=[`service-unavailable`,`conversation-ended`,`invalid-token`],sa=class e extends qt{constructor(...e){super(...e),g(this,`socket`,null),g(this,`sequence`,1),g(this,`lastStamp`,0),g(this,`websocketCommandsQueue`,[]),g(this,`datachannelCommandsQueue`,[]),g(this,`incomingCache`,[]),g(this,`responseHandlers`,{}),g(this,`connectionType`,void 0),g(this,`reconnectCount`,0),g(this,`endpoint`,void 0),g(this,`wtEndpoint`,null),g(this,`conversationResolve`,null),g(this,`conversationReject`,null),g(this,`connected`,!1),g(this,`listenersReady`,!1),g(this,`peerId`,null),g(this,`conversationId`,null),g(this,`reconnectTimer`,0),g(this,`connectionMessageWaitTimer`,0),g(this,`doctorTimer`,0),g(this,`participantIdRegistry`,null),g(this,`producerNotificationDataChannel`,null),g(this,`producerCommandDataChannel`,null),g(this,`producerCommandDataChannelEnabled`,!1),g(this,`producerCommandSerializationService`,new xn)}static get RECONNECT_DELAY(){return w.signalingReconnectDelay}static get RECONNECT_MAX_DELAY(){return w.signalingReconnectMaxDelay}static get RECONNECT_MAX_COUNT(){return w.signalingReconnectMaxCount}static get WAIT_CONNECTION_DELAY(){return w.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return w.waitResponseDelay}static get WAIT_MESSAGE_DELAY(){return w.waitMessageDelay}get ready(){return this.socket!==null}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e}setConversationId(e){this.conversationId=e}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=e=>{let t=this.participantIdRegistry?.handleMessage(e.data);t&&this._handleMessage(t)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=e=>{this.producerCommandSerializationService.deserializeCommandResponse(e.data).then(e=>{e&&this._handleMessage(e)}).catch(e=>{R.warn(`[signaling] cannot parse message at producerCommandDataChannel`,e)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return new Promise((t,n)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){O.log(b.SOCKET_ACTION,`already_opened`),n(Error(`Socket already opened`));return}this.conversationResolve=e=>{t(e),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=e=>{n(e),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},n=!0,r=0){if(t.participantId){let e=C.decomposeParticipantId(t.participantId),n=C.decomposeId(e.compositeUserId);t=Object.assign({},t,{participantId:n.id,participantType:n.type}),e.deviceIdx&&(t.deviceIdx=e.deviceIdx)}return this._sendRaw(e,t,n,r)}async _sendRaw(e,t={},n=!0,r=0){let i=t=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(t),this.producerCommandDataChannel?.readyState===ia&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){O.log(b.SOCKET_ACTION,`not_opened`),R.warn(`[signaling] socket is not opened`),t.reject(Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(O.log(b.SOCKET_ACTION,`invalid_state`),R.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(t),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((a,o)=>{let s=(t,n=!1)=>{!r||n?o(t):(R.debug(`[signaling] resending a signaling message`,e,u.sequence),r--,i(u))},c=this.sequence++,l=`${e}_${c}`;W.setMark(l);let u={sequence:c,name:e,statMarkName:l,params:t,responseTimer:0,needResponse:n,resolve:a,reject:s};i(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===B.UPDATE_DISPLAY_LAYOUT||e===B.REPORT_PERF_STAT||e===B.REPORT_SHARING_STAT||e===B.REQUEST_ASR||e===B.ENABLE_VIDEO_SUSPEND||e===B.ENABLE_VIDEO_SUSPEND_SUGGEST||e===B.REPORT_NETWORK_STAT||e===B.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(B.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(B.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(B.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,n){let r=Object.assign({sdp:t},n);return this._send(B.TRANSMIT_DATA,{participantId:e,data:r},!0,aa)}async acceptCall(e){return this._send(B.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(B.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,aa)}async changeParticipantState(e,t){let n={participantState:{state:e}};return t&&(n.participantId=t),this._sendRaw(B.CHANGE_PARTICIPANT_STATE,n)}async hold(e){return this._send(B.HOLD,{hold:e})}async putHandsDown(){return this._send(B.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(B.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(B.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(B.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let n={capabilities:t};return e&&(n.description=e.sdp),this._send(B.ALLOCATE_CONSUMER,n)}async acceptProducer(e,t,n){let r={description:e.sdp,sessionId:n};return t&&(r.ssrcs=t),this._send(B.ACCEPT_PRODUCER,r)}async changePriorities(e){return this._send(B.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(B.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(B.ADD_MOVIE,e)}async updateMovie(e){return this._send(B.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(B.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(B.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(B.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(B.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(B.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(B.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(B.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(B.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(B.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(B.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(B.RECORD_PUBLISH,e)}async recordSetConf(e={hideParticipantCount:!1,roomId:null}){let t={options:{hideParticipantCount:e.hideParticipantCount},roomId:e.roomId};return e.king&&(t.king=e.king),e.pawns?.length&&(t.pawns=e.pawns.join(`,`)),this._send(B.RECORD_SET_CONF,t)}async getRecordStatus(){return this._send(B.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(B.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(B.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(B.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(B.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(B.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(B.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(B.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(B.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,n){let r={participantId:e,roles:t};return n&&(r.revoke=!0),this._sendRaw(B.GRANT_ROLES,r)}async muteParticipant(e,t,n,r=null){return this._sendRaw(B.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:n,roomId:r})}async enableFeatureForRoles(e,t){return this._sendRaw(B.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,n){let r={participantId:e,roomId:n};return t&&(r.unpin=!0),this._sendRaw(B.PIN_PARTICIPANT,r)}async updateMediaModifiers(e){return this._send(B.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(B.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(B.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(B.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(B.CHANGE_OPTIONS,{options:e})}async getWaitingHall(e=null,t,n=!1){let r={};return e&&(r.fromId=e),t&&(r.count=t),n&&(r.backward=n),this._send(B.GET_WAITING_HALL,r)}async promoteParticipant(e,t=!1){let n={};return e&&(n.participantId=e),t&&(n.demote=t),this._sendRaw(B.PROMOTE_PARTICIPANT,n)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(B.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(B.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(B.FEEDBACK,{key:e})}async getHandQueue(){return this._send(B.GET_HAND_QUEUE)}close(){this.socket&&this.socket.readyState<WebSocket.CLOSING&&this._closeSocket(),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(B.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(B.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(B.ASR_START,e)}async stopAsr(e){return this._send(B.ASR_STOP,e)}async requestAsr(e){return this._send(B.REQUEST_ASR,{request:e},!1)}_buildUrl(e,t,n){let r=new URL(e),i=r.searchParams;return i.set(`platform`,w.platform),i.set(`appVersion`,String(w.appVersion)),i.set(`version`,String(w.protocolVersion)),i.set(`device`,w.device),i.set(`capabilities`,Ji.getFlags()),i.set(`clientType`,w.clientType),t&&i.set(`tgt`,t),t===Ki.RETRY&&this.lastStamp&&i.set(`recoverTs`,String(this.lastStamp)),w.useParticipantListChunk&&(i.set(`partIdx`,String(w.participantListChunkInitIndex)),w.participantListChunkInitCount!==null&&i.set(`partCount`,String(w.participantListChunkInitCount))),n&&(i.set(`compression`,`deflate-raw`),i.set(`ua`,navigator.userAgent)),this.peerId!==null&&i.set(`peerId`,String(this.peerId)),r.toString()}_connect(e,t){if(!(this.socket&&this.socket.readyState<WebSocket.CLOSING)){if(this.connectionType=e,t){if(!this.wtEndpoint){R.error(`[signaling] empty wt endpoint`),this.conversationReject?.(new D(v.SIGNALING_FAILED,{message:`Unable to connect to the signaling: wtEndpoint is not set`,remote:!0}));return}let t=this._buildUrl(this.wtEndpoint,e,!0);R.debug(`[signaling] connecting to wt `+t),this.socket=new ra(t,{congestionControl:`low-latency`})}else{let t=this._buildUrl(this.endpoint,e,!1);R.debug(`[signaling] connecting to ws `+t),this.socket=new WebSocket(t)}this._markTransportStat(e===Ki.RETRY?Hn.RECONNECTED:Hn.CONNECTED),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor()}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){R.debug(`[signaling] socket opened`),O.log(b.SOCKET_ACTION,`opened`),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Ki.RETRY?Hn.RECONNECTED:Hn.CONNECTED)}_onMessage(e){if(this._startDoctor(),e.data===`ping`){Wi.mark(this._getSocketType()),this._markTransportStat(Hn.FAILED_PINGS),P.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(`pong`);return}try{let t=JSON.parse(e.data);P.onSignalingMessage(t),this._handleMessage(t)}catch(t){O.log(b.SOCKET_ACTION,`parse_error`),R.error(`[signaling] unable to parse message`,t,e.data)}}_handleMessage(e){switch(e.type){case`notification`:e.notification===`connection`?(R.debug(`[signaling] signaling connected`,e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat(Hn.RESTART),this._triggerEvent(qn.RECONNECT,e),e.conversation.topology&&this._triggerEvent(qn.NOTIFICATION,{type:`notification`,notification:G.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(e=>{e.notification===G.ACCEPTED_CALL&&e.peerId.id===this.peerId&&e.peerId.type===`WEB_TRANSPORT`||this._handleMessage(e)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(qn.NOTIFICATION,e);break;case`response`:this._handleCommandResponse(!0,e);break;case`error`:this._handleErrorMessage(e);break;default:O.log(b.SOCKET_ACTION,`unknown_message`),R.warn(`[signaling] unhandled message`,e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){O.log(b.SOCKET_ACTION,`error-${e.error}`);let t=e.error?oa.includes(e.error):!1;switch(R.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case`service-unavailable`:let n=new D(E.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(n):this._triggerEvent(qn.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:E.SERVICE_UNAVAILABLE});break;case`conversation-ended`:this.conversationReject?this.conversationReject(new D(e.reason||v.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(qn.NOTIFICATION,{notification:G.CLOSED_CONVERSATION,reason:e.reason});break;case`participant-not-found`:this._throwError(Error(`Signaling error: ${e.error}`));break;default:if(!t)break;this.connected?this._throwError(Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new D(e.reason||v.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(qn.FAILED,e)}_onError(e){O.log(b.SOCKET_ACTION,`error`),R.error(`[signaling] signaling error`,e),this._logTransportStat(Hn.FAILED_EXCEPTIONS,{string_value:this._serializeErrorEvent(e)})}_serializeErrorEvent(e){let t=e,n=t.error instanceof Error?t.error:null;return JSON.stringify({eventType:e.type,socketType:this._getSocketType(),readyState:this.socket?.readyState,errorName:n?.name||t.errorInfo?.name,errorMessage:n?.message||t.errorInfo?.message||t.message,errorStack:n?.stack||t.errorInfo?.stack,errorInfo:t.errorInfo})}_onClose(t){if(O.log(b.SOCKET_ACTION,`closed`),R.debug(`[signaling] connection closed`,{code:t.code,reason:t.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this._abortSignal?.aborted){R.debug(`[signaling] aborted reconnect`),this._closeSocket(new D(E.CANCELED));return}this.socket&&this.reconnectCount++<e.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new D(E.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let t=Math.min(e.RECONNECT_MAX_DELAY,e.RECONNECT_DELAY*2**(this.reconnectCount-1));R.log(`[signaling] reconnect websocket after ${t}ms (${this.reconnectCount})`),O.log(b.SOCKET_ACTION,`reconnect`),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Ki.RETRY,!1),t)}_handleCommandResponse(t,n){if(!Object.hasOwn(this.responseHandlers,n.sequence))return;let r=this.responseHandlers[n.sequence];window.clearTimeout(r.responseTimer);let i=W.measureMark(r.statMarkName);i!==null&&Gi.mark(r.name,i,this._getSocketType()),R.debug(`[signaling] command response [${n.sequence}]`,n),t?(delete this.responseHandlers[n.sequence],r.resolve(n)):n.type===`error`?(delete this.responseHandlers[n.sequence],O.log(b.SOCKET_ACTION,`response-error`),r.reject(Error(n.error||`Response error [${r.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[n.sequence],O.log(b.SOCKET_ACTION,`response-timeout`),r.reject(Error(n.error||`Response timeout [${r.name}]`))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(t,n),e.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(R.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==ia){t.reject(Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let e=this._serializeBinary(t);e!==null&&this.producerCommandDataChannel.send(e)}else{if(!this.socket||this.socket.readyState!==WebSocket.OPEN){t.reject(Error(`Invalid state or socket already closed`));continue}this._startResponseTimer(t),this.socket.send(this._serializeJson(t))}}}_startResponseTimer(t){if(!t.needResponse){t.resolve({type:`response`,sequence:t.sequence,response:t.name});return}t.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:t.name,sequence:t.sequence,type:`timeout`}),e.WAIT_RESPONSE_DELAY),this.responseHandlers[t.sequence]=t}_serializeBinary(e){switch(e.name){case B.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case B.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case B.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case B.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case B.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case B.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case B.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case B.CHANGE_SIMULCAST:return this.producerCommandSerializationService.serializeChangeSimulcast(e.sequence,e.params)}return R.warn(`[signaling] cannot get binary data for data channel command: `+e.name),null}_serializeJson(e){let t;t=e.name===B.UPDATE_DISPLAY_LAYOUT?this._convertDisplayLayout(e.params):e.params;let n=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(n)}_convertDisplayLayout(e){let t=e,n={};for(let e in t)Object.hasOwn(t,e)&&(n[e]=Xt(t[e]));return{layouts:n}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new D(v.SIGNALING_FAILED,{message:`Unable to connect to the signaling: connection timeout`,remote:!0}))},e.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=e.RECONNECT_MAX_COUNT)&&(this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?R.warn(`[signaling] socket is dead. Fallback to WebSocket. Trying to connect ${this.reconnectCount}`):R.warn(`[signaling] socket is dead, trying to reconnect ${this.reconnectCount}`),this._logTransportStat(Hn.FAILED_PINGS),this._disconnect(4e3),this._connect(Ki.RETRY,!1),this.reconnectCount++},e.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return ra.isBrowserSupported()&&this.wtEndpoint!==null&&w.webtransport}_getSocketType(){return this.socket instanceof ra?Vn.WEBTRANSPORT:Vn.WEBSOCKET}_markTransportStat(e){let t=this._getSocketType(),n=Un[e][t];W.setMark(n)}_logTransportStat(e,t){let n=this._getSocketType(),r=Un[e][n];Bn.logEventualStat({name:r,...t})}},Y=function(e){return e.INCOMING=`INCOMING`,e.OUTGOING=`OUTGOING`,e.JOINING=`JOINING`,e}(Y||{}),ca=function(e){return e.USER=`USER`,e.GROUP=`GROUP`,e.CHAT=`CHAT`,e}(ca||{}),la=function(e){return e.ATTENDEE=`ATTENDEE`,e.HAND_UP=`HAND_UP`,e}(la||{}),ua=function(e){return e.ADD_PARTICIPANT=`ADD_PARTICIPANT`,e.RECORD=`RECORD`,e.MOVIE_SHARE=`MOVIE_SHARE`,e}(ua||{}),da=function(e){return e.REQUIRE_AUTH_TO_JOIN=`REQUIRE_AUTH_TO_JOIN`,e.AUDIENCE_MODE=`AUDIENCE_MODE`,e.WAITING_HALL=`WAITING_HALL`,e.WAIT_FOR_ADMIN=`WAIT_FOR_ADMIN`,e.ADMIN_IS_HERE=`ADMIN_IS_HERE`,e.ASR=`ASR`,e.FEEDBACK=`FEEDBACK`,e.RECURRING=`RECURRING`,e}(da||{});function fa(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}function pa(e,t){let n=new Set(e);for(let[e,r]of Object.entries(t))r?n.add(e):n.delete(e);return Array.from(n)}var ma=function(e){return e.UNMUTE=`UNMUTE`,e.MUTE=`MUTE`,e.MUTE_PERMANENT=`MUTE_PERMANENT`,e}(ma||{}),X=function(e){return e.CALLED=`CALLED`,e.ACCEPTED=`ACCEPTED`,e.REJECTED=`REJECTED`,e.HUNGUP=`HUNGUP`,e}(X||{}),ha=function(e){return e.UPDATE=`UPDATE`,e.REMOVE=`REMOVE`,e.ACTIVATE=`ACTIVATE`,e.TIMEOUT=`TIMEOUT`,e}(ha||{}),ga=function(e){return e.NO_AVAILABLE_TRACKS=`no-available-tracks`,e.UNKNOWN_ERROR=`unknown-error`,e}(ga||{});function _a(e){switch(e){case 1:return`no-available-tracks`;default:return`unknown-error`}}var va=function(e){return e.CREATOR=`CREATOR`,e.ADMIN=`ADMIN`,e}(va||{});function ya(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.includes(n))return!1;return!0}var ba=function(e){return e.USER=`USER`,e.ANONYM=`ANONYM`,e.GROUP=`GROUP`,e}({}),Z;(function(e){function t(e){return e.length?typeof e[0]==`object`?e:e.map(e=>n(e)):[]}e.fromIds=t;function n(e,t=`USER`,n=0){return{id:e,type:t,deviceIdx:n}}e.fromId=n;function r(e,t=!0){let n=t?e.decorativeExternalUserId:e.externalId,r=e.deviceIdx??0;if(n)return i(n,r)}e.fromSignalingParticipant=r;function i(e,t=0){return{id:e.id,type:e.type===`ANONYM`?`ANONYM`:`USER`,deviceIdx:t}}e.fromSignaling=i;function a(e){return e.id}e.toSignaling=a;function o(e){let t=e.deviceIdx||0;return`{"id":"${e.id}","type":"${e.type}","deviceIdx":${t}}`}e.toString=o;function s(e,t=`USER`,r=0){return o(n(e,t,r))}e.fromIdToString=s;function c(e){try{return JSON.parse(e)}catch{throw Error(`Failed to parse ExternalId from string '${e}'`)}}e.fromString=c;function l(e,t){return e.id===t.id&&e.type===t.type&&e.deviceIdx===t.deviceIdx}e.compare=l;function u(e){return e?.deviceIdx||0}e.getDeviceIdx=u})(Z||(Z={}));function xa(e){try{return btoa(JSON.stringify(e))}catch(t){R.warn(`WaitingParticipant: failed convert to string`,e,t)}return null}function Sa(e){try{return JSON.parse(atob(e))}catch(t){R.warn(`WaitingParticipant: failed convert from string`,e,t)}return null}var Ca=(e,t)=>C.objectReduce(e,(e,n,r)=>(n===t&&e.push(r),e),[]);function wa(e){if(e.conversation?.muteStates)return e.conversation.muteStates;if(e.muteState&&e.muteOptions)return e.muteOptions.reduce((t,n)=>(t[n]=e.muteState,t),{})}function Ta(e,t){switch(e){case y.AUDIO:return!!t.isAudioEnabled;case y.AUDIO_SHARING:return!!t.isAudioSharingEnabled;case y.VIDEO:return!!t.isVideoEnabled;case y.SCREEN_SHARING:return!!t.isFastScreenSharingEnabled||!!t.isScreenSharingEnabled;default:return!1}}function Ea(e,t){return C.objectReduce(e,(e,n,r)=>{switch(n){case ma.MUTE:case ma.MUTE_PERMANENT:Ta(r,t)||(e[r]=n);break;default:e[r]=n;break}return e},{})}function Da(e){let{muteStates:t={},mediaSettings:n}=e;return Ea(t,n)}function Oa(e,t){let n=e.conversation.participants.find(t=>C.comparePeerId(t.peerId,e.peerId));if(!n)return t;let{mediaSettings:r}=n;return Ea(t,r)}function ka(e,t){let n=new Uint8Array(t),r=0,i=0;for(;r<e.length&&i<t;){let a=e[r++],o=a>>4,s=a&15;if(o===15){let t;do t=e[r++],o+=t;while(t===255)}for(let a=0;a<o&&!(i>=t);a++)n[i++]=e[r++];if(r>=e.length||i>=t)break;let c=e[r]|e[r+1]<<8;if(r+=2,s===15){let t;do t=e[r++],s+=t;while(t===255)}s+=4;let l=i-c;for(let e=0;e<s&&!(i>=t);e++)n[i++]=n[l+e]}return n}var Aa=class{constructor(e){g(this,`_fixNoPacketsApplied`,!1),g(this,`_fixNoPacketsChecked`,!1),g(this,`_fixTooManyPacketsApplied`,!1),g(this,`_fixTooManyPacketsSucceeded`,!1),g(this,`_fixTooManyPacketsFailed`,!1),g(this,`_fixTooManyPacketsTime`,void 0),g(this,`_mediaSource`,void 0),g(this,`_lastPacketsSent`,void 0),g(this,`_lastPacketsSentTime`,void 0),g(this,`_toggleAudioPromise`,null),g(this,`_fixNoPacketsAppliedVideo`,!1),this._mediaSource=e}_fixAudioDeviceNoPackets(e){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,O.log(b.ERROR,`audio_device_recover_${e.bandwidth?`success`:`fail`}`);return}!this._fixNoPacketsApplied&&!e.bandwidth&&(this._fixNoPacketsApplied=!0,O.log(b.ERROR,`audio_device_recover`),R.log(`[AudioFix] Trying to fix RV (no packets)`),this._toggleAudioPromise=this._mediaSource.toggleAudio(I.getMicrophonePermissionState()!==`denied`),this._toggleAudioPromise.catch(()=>void 0))}}_fixAudioDeviceTooManyPackets(e){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let t=Date.now();if(!this._lastPacketsSentTime)e.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent);else if(t-this._lastPacketsSentTime>500){let n=(e.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=e.packetsSent,this._fixTooManyPacketsApplied?n>75?(R.log(`[AudioFix] Failed to fix RV`),O.log(b.ERROR,`audio_device_recover_rv_fail`),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(R.log(`[AudioFix] Fixed RV`),O.log(b.ERROR,`audio_device_recover_rv_success`),this._fixTooManyPacketsSucceeded=!0):n>75&&(this._fixTooManyPacketsApplied=!0,O.log(b.ERROR,`audio_device_recover`),R.log(`[AudioFix] Trying to fix RV (too many packets)`),this._mediaSource.toggleAudio(!0).catch(e=>{R.warn(`[AudioFix] Failed to fix RV (too many packets)`,e)}),this._fixTooManyPacketsTime=t)}}fix(e){if(!this._mediaSource)return;let t=e.find(e=>e.kind===k.audio);t&&(this._fixAudioDeviceNoPackets(t),this._fixAudioDeviceTooManyPackets(t))}fixVideo(e){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let t=e.find(e=>e.kind===k.video);t&&!t.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{if(this._mediaSource.mediaSettings.isVideoEnabled)return this._mediaSource.toggleVideo(!0)}).catch(e=>{R.warn(`[AudioFix] Failed to fix RV (no packets): video restart`,e)}))}},ja=class{constructor(e,t=!1){g(this,`_audioElement`,null),g(this,`_audioTracks`,new Map),g(this,`_allowMultipleTracks`,void 0),g(this,`_volume`,1),g(this,`_features`,{setSinkId:!!Audio.prototype.setSinkId}),g(this,`_statFirstMediaReceived`,void 0),this._statFirstMediaReceived=e,this._allowMultipleTracks=t}add(e,t){this._allowMultipleTracks||this._clearTracks();let n=this._audioTracks.get(e);n&&n!==t&&(this._removeTrackFromAudioElement(n),n.stop()),this._audioTracks.set(e,t),this._audioElement?this._addTrackToAudioElement(t):this._initAudioElement()}remove(e,t){let n=this._audioTracks.get(e);if(!n){t.stop();return}if(n!==t){t.stop();return}if(!this._allowMultipleTracks){this.destroy();return}this._removeTrackFromAudioElement(t),t.stop(),this._audioTracks.delete(e),this._audioTracks.size||this.destroy()}get volume(){return this._volume}set volume(e){this._volume=Math.max(0,Math.min(1,e)),this._audioElement&&(this._audioElement.volume=this._volume)}destroy(){!this._audioElement&&!this._audioTracks.size||(this._stopAudioElement(),this._audioElement=null,this._audioTracks.clear())}async changeOutput(){try{if(!this._features.setSinkId)throw Error(`Feature "setSinkId" is not supported`);if(!this._audioElement)return;let e=I.getSavedOutput();e&&await this._audioElement.setSinkId?.(e.deviceId)}catch(e){throw O.log(b.ERROR,`change_output`),R.error(`[audio] Output change failed`,e),e}}_getTracks(){return Array.from(this._audioTracks.values())}_initAudioElement(){if(w.muteMode)return;let e=this._getTracks();if(!e.length)return;let t=I.browserName()!==`Safari`||I.isMobile(),n=document.createElement(t?`audio`:`video`);n.muted=!1,n.volume=this._volume,n.preload=`auto`;let r=()=>{R.warn(`[audio] Error on play audio`),P.onAutoplayError()},i=e=>{R.debug(`[audio] Play audio`),n.srcObject=null,n.srcObject=new MediaStream(e),n.load();let t=n.play();t&&t.catch(r)},a=()=>{R.debug(`[audio] Recover audio playback`);let e=this._getTracks();e.length?i(e):R.warn(`[audio] Broken audio tracks`)};n.onpause=a,n.onstalled=a,n.onerror=a,n.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(e),this._audioElement=n}_stopAudioElement(){this._audioElement&&(this._audioElement.pause(),this._audioElement.srcObject=null);for(let e of this._audioTracks.values())e.stop()}_addTrackToAudioElement(e){if(!this._audioElement)return;R.debug(`[audio] Adding track ${e}`);let t=this._audioElement.srcObject;t||(t=new MediaStream,this._audioElement.srcObject=t),t.addTrack(e)}_removeTrackFromAudioElement(e){this._audioElement?.srcObject&&(R.debug(`[audio] Removing track ${e}`),this._audioElement.srcObject.removeTrack(e))}_clearTracks(){for(let e of this._audioTracks.values())this._removeTrackFromAudioElement(e),e.stop();this._audioTracks.clear()}},Ma=90,Na=3,Pa=class extends _{constructor(...e){super(...e),g(this,`_lastMemoryStat`,{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(e=>{e.userId=(typeof e.userId==`string`&&t[e.userId]||null)?.externalId}),P.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),n=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>Ma?R.warn(`High memory usage: ${t}% (${n} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=Na)&&(R.debug(`Memory usage: ${t}% (${n} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}},Fa=44100,Ia=class{constructor(e,t){g(this,`_analyser`,null),g(this,`_gainNode`,null),g(this,`_fftBins`,null),g(this,`_mediaStreamSource`,null),g(this,`_lastSmoothedLevel`,0),g(this,`_trackId`,void 0),g(this,`_track`,void 0),g(this,`_stream`,void 0),this._trackId=e,this._track=t,this._stream=new MediaStream([t]);try{let e=I.getAudioContext();this._gainNode=e.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(e.destination),this._analyser=e.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=e.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let e=Fa/this._fftBins.length,t=Math.ceil(w.voiceParams.minFreq/e),n=Math.floor(w.voiceParams.maxFreq/e);return this._fftBins.subarray(t,n)}getLevel(){let e=this._getBins(),t=e.reduce((e,t)=>e+t,0)/e.length/255,n=this._lastSmoothedLevel*w.voiceParams.smoothing+t*(1-w.voiceParams.smoothing);return this._lastSmoothedLevel=n,{real:t,smoothed:n}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}},La=class extends _{constructor(e){super(),g(this,`_detector`,null),g(this,`_interval`,null);let t=()=>{this._detector&&P.onLocalVolume(this._detector.getLevel().real,e.mediaSettings.isAudioEnabled),this._interval=window.setTimeout(t,w.voiceParams.interval)};this._interval=window.setTimeout(t,w.voiceParams.interval);let n=()=>{let t=e.getSendAudioTrack();t&&this.init(t)};this.subscribe(e,Oe.SOURCE_CHANGED,t=>{t.kind===k.audio&&e.mediaSettings.isAudioEnabled&&n()}),this.subscribe(e,Oe.SOURCE_READY,n),n()}init(e){this._stopDetector(),this._detector=new Ia(`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()}},Ra=[G.HUNGUP,G.CLOSED_CONVERSATION],za=class{constructor(e){g(this,`processor`,void 0),g(this,`queue`,[]),g(this,`isProcessing`,!1),g(this,`isHeld`,!1),g(this,`isDestroyed`,!1),this.processor=e}add(e){this.isDestroyed||(this.queue.push(e),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(e=>Ra.includes(e.notification));if(e===-1)break;let[t]=this.queue.splice(e,1);try{await this.processor(t)}catch{R.error(`Can't process message ${JSON.stringify(t)}`)}continue}let e=this.queue.shift();if(e)try{await this.processor(e)}catch{R.error(`Can't process message ${JSON.stringify(e)}`)}}this.isProcessing=!1}}},Ba=function(e){return e.VOLUMES_DETECTED=`VOLUMES_DETECTED`,e}({}),Va=class extends _{constructor(e){super(),g(this,`_detectors`,new Map),g(this,`_interval`,null),g(this,`_activeParticipants`,void 0),g(this,`_removedParticipants`,void 0),g(this,`_topology`,void 0),this._topology=e.getTopology(),this.subscribe(e,K.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(e,K.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,K.SIGNALLED_ACTIVE_PARTICIPANTS,this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,K.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._destroyDetectors()}_onRemoteTrackAdded(e,t,n){if(n.kind===k.audio&&(this._detectors.get(e)?.destroy(),this._detectors.set(e,new Ia(e,n)),!this._interval)){let e=()=>{this._collectVolumes(),this._interval=window.setTimeout(e,w.voiceParams.interval)};this._interval=window.setTimeout(e,w.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,n){if(n.kind!==k.audio)return;let r=this._detectors.get(e);!r||r.track!==n||(r.destroy(),this._detectors.delete(e))}_collectVolumes(){if(!this._detectors.size)return;let e={};if(this._topology===J.SERVER){if(this._activeParticipants)for(let t of this._activeParticipants){let n=this._getAudioTrackLevelByParticipantId(t);n&&(e[t]=n)}if(this._removedParticipants){for(let t of this._removedParticipants)e[t]={real:0,smoothed:0};this._removedParticipants=null}}else for(let[t,n]of this._detectors.entries())e[t]=n.getLevel();this._triggerEvent(`VOLUMES_DETECTED`,e)}_getAudioTrackLevelByParticipantId(e){if(this._isTransparentAudioMode())return this._getTransparentAudioLevelByParticipantId(e);let t=this._detectors.get(Tr.AUDIO_MIX);return t?t.getLevel():null}_getTransparentAudioLevelByParticipantId(e){if(!this._activeParticipants?.includes(e))return null;let t=null;return this._detectors.forEach((e,n)=>{if(!n.startsWith(`${Tr.TRANSPARENT_AUDIO_TRACK_PREFIX}-`))return;let r=e.getLevel();(!t||r.real>t.real)&&(t=r)}),t}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){this._topology=e,this._destroyDetectors(),e===J.DIRECT&&(this._activeParticipants=null,this._removedParticipants=null)}_isTransparentAudioMode(){return this._topology===J.SERVER&&w.transparentAudio}_destroyDetectors(){this._detectors.forEach(e=>{e.destroy()}),this._detectors.clear()}},Ha=function(e){return e.SPEAKER_CHANGED=`SPEAKER_CHANGED`,e}({}),Ua=class extends _{constructor(e,t,n){super(),g(this,`_speakerId`,null),g(this,`_serverSideSpeakerDetection`,!1),this._serverSideSpeakerDetection=n===J.SERVER,this.subscribe(e,Ba.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this.subscribe(t,K.SIGNALLED_SPEAKER_CHANGED,this._onServerSpeakerChanged.bind(this)),this.subscribe(t,K.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,n=null;if(Object.keys(e).forEach(r=>{let i=e[r].smoothed;i>t&&i>w.voiceParams.threshold&&(t=i,n=r)}),n&&n!==this._speakerId){let r=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>r*w.voiceParams.speakerLevelMultiplier&&(this._speakerId=n,this._triggerEvent(`SPEAKER_CHANGED`,n))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent(`SPEAKER_CHANGED`,e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e===J.SERVER}},Wa=class extends _{constructor(e,t,n){super(),g(this,`_transport`,void 0),g(this,`_volumes`,{}),g(this,`_participants`,{}),g(this,`_connectionTimeout`,0),g(this,`_volumeTimeout`,0),this._transport=e,this._participants=n,this.subscribe(e,K.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(t,Ba.VOLUMES_DETECTED,this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_onTransportStateChanged(e,t){t===q.OPENED&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),w.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),w.specListenerParams.volumeTimeout))),t===q.FAILED&&this._connectionTimeout&&(R.warn(`Transport failed, send callSpecError`),O.log(b.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){Object.values(this._transport.getStates()).filter(e=>e!==q.CONNECTED).length>0&&(R.warn(`There is not connected transport, send callSpecError`),O.log(b.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let n=`UNKNOWN`,r=this._participants[t];r&&r.platform&&(n=r.platform),e.indexOf(n)<0&&(e.push(n),O.log(b.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${n}`))}),e.length&&R.warn(`There is silent participant, send callSpecError`),this._volumeTimeout=0}},Ga=class e{static correctHangupReason(e){switch(e){case E.HUNGUP:return`hangup`;case E.CANCELED:return`canceled`;case E.REJECTED:return`rejected`;case E.BUSY:return`busy`;case E.FAILED:return`failed`;case E.MISSED:return`missed`;case E.ANOTHER_DEVICE:return`another_device`;case E.REMOVED:return`removed`;case E.BANNED:return`banned`;case E.VCHAT_DETAILED_ERROR:return`error`;default:return`hangup`}}static sendHangupEvent(t,n){if(![E.HUNGUP,E.CANCELED,E.REJECTED,E.FAILED,E.BUSY,E.MISSED,E.ANOTHER_DEVICE,E.REMOVED,E.BANNED,E.VCHAT_DETAILED_ERROR].includes(t.hangup))return;let r=t.custom_error?.vchat_detailed_api_error?.code;O.logClientStats({name:H.CALL_FINISH,reason:e.correctHangupReason(t.hangup),call_topology:n===J.DIRECT?`D`:`S`,...r&&{string_value:r}})}},Ka=class{constructor(){g(this,`_isCallMarked`,!1),g(this,`_isFinished`,!1),g(this,`_callType`,null)}markAcceptCall(e){this.mark(e===J.DIRECT?`direct_incoming`:`server_incoming`)}markAcceptedCall(e){e===J.DIRECT&&this.mark(`direct_outgoing`)}markParticipantJoined(e){e===J.DIRECT&&this.mark(`server_change_topology`)}markOnJoin(e){e===J.SERVER&&this.mark(`server_join_server`)}mark(e){this._isCallMarked||(this._isCallMarked=!0,this._callType=e,W.setMark(H.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Bn.logEventualStat({name:H.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}},qa=1e3,Ja=1e4,Ya=15,Q=class extends _{constructor(e,t){super(),g(this,`_api`,void 0),g(this,`_signaling`,void 0),g(this,`_signalingActor`,void 0),g(this,`_mediaSource`,null),g(this,`_conversation`,null),g(this,`_myLastRequestedLayouts`,{}),g(this,`_state`,`IDLE`),g(this,`_participantState`,X.CALLED),g(this,`_participants`,{}),g(this,`_pendingParticipants`,new Map),g(this,`_transport`,null),g(this,`_debugInfo`,null),g(this,`_volumesDetector`,null),g(this,`_speakerDetector`,null),g(this,`_localVolumeDetector`,null),g(this,`_specListener`,null),g(this,`_activeSpeakerId`,null),g(this,`_lastSignalledActiveSpeakerId`,null),g(this,`_isRealTimeAsrRequested`,!1),g(this,`_serverSettings`,tr()),g(this,`_delayedHangup`,!1),g(this,`_abortController`,null),g(this,`_onUnload`,void 0),g(this,`_audioOutput`,void 0),g(this,`_lastStalled`,{}),g(this,`_audioMixStalled`,!1),g(this,`_audioFix`,null),g(this,`_streamByStreamId`,new Map),g(this,`_streamIdByStreamDescription`,new Map),g(this,`_streamWaitTimerByStreamDescription`,new Map),g(this,`_sequenceNumberByStreamDescription`,new Map),g(this,`_cooldownTimestampByStreamDescription`,new Map),g(this,`_cooldownQueueCleanupTimer`,null),g(this,`_statFirstMediaReceived`,void 0),g(this,`_changeMediaSettings`,C.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(e){if(R.warn(`changeMediaSettings failed with error`,e),e.message===`chatRoom.maxShareCountExceeded`)return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100)),O.create(e,t),O.setConversationIdProvider(()=>this._conversation?.id||null),Bn.create(),nr.create(()=>this._transport?.getTopology()),Wi.create(),Gi.create(),this._api=e,this._signaling=new sa,this._signalingActor=new za(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state===`IDLE`?E.CANCELED:E.HUNGUP),w.clientEventsLoggingEnabled&&O.logClientEvent({event_type:H.CALL_DECLINED_OR_HANGED_LOCALLY,reason:`none`},!0)),O.destroy(),Bn.destroy(),nr.destroy(),Wi.destroy(),Gi.destroy()},window.addEventListener(`pagehide`,this._onUnload),this._statFirstMediaReceived=new Ka,this._audioOutput=new ja(this._statFirstMediaReceived,w.transparentAudio),w.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),qa))}static current(){return z.getActive()}static hangupAfterInit(){let e=Xa;e&&e._delayedHangup===!1&&!e._conversation&&(e._delayedHangup=!0,e._abortController?.abort(new D(E.CANCELED)))}static id(){return z.getActiveId()}get id(){return this._conversation?.id??``}get externalId(){return this._conversation?.externalId}get mediaSettings(){return this._mediaSource?.mediaSettings}get isCallHeld(){return this._state===`HELD`}async onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r=``,joiningAllowed:i=!1,requireAuthToJoin:a=!1,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l}){let u=Date.now();Xa=this,wt.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(n);let d=this._mediaSource.mediaSettings;t===ca.CHAT||e&&e.length>1?this._logWithMediaSettings(b.OUTGOING_MULTIPARTY_CALL,d):this._logWithMediaSettings(b.OUTGOING_CALL,d);let f=await this._startConversation({opponentIds:e,opponentType:t,direction:Y.OUTGOING,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,startedTime:u,onFastStart:c,conversationId:l});if(!this._conversation)throw new D(E.UNKNOWN_ERROR);if(this._participantState=X.ACCEPTED,this._changeMediaSettings(d),await this._processConnection(f),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._delayedHangup)throw new D(E.CANCELED);return R.debug(`Outgoing call`,{opponentIds:e,opponentType:t,mediaOptions:n}),await this._processConnectionSharedMovieInfo(f),await this._processConversationUrlSharingInfo(f),P.onLocalStream(this._mediaSource.getStream(),this._mediaSource.mediaSettings,this.id),P.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),void 0,this.id),await this._onConversationParticipantListChunk(f),await this._processPinnedParticipants(f),P.onLocalStatus(A.WAITING,this.id),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),z.add(this),await z.setActive(this.id),P.onCallActive(this.id),Xa=null,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(e){throw Xa=null,this._close(e,`Unable to start conversation`),e}}async onJoin(e){let t=Date.now();Xa=this,this._state=`PROCESSING`,wt.startSession(),this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let n=!!e.observedIds?.length;if(n&&w.videoTracksCount>0)throw R.error(`Observer mode: please set videoTracksCount=0`),new D(E.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!n);let r=this._mediaSource.mediaSettings;this._logWithMediaSettings(b.JOIN_CONVERSATION,r);let i=await this._joinConversation(e,t);if(!this._conversation)throw new D(E.UNKNOWN_ERROR);return this._conversation.observer=n,P.onLocalStream(this._mediaSource.getStream(),r,this.id),this._conversation.waitForAdmin||this._conversation.waitingHall?(R.log(this._conversation.waitForAdmin?`Wait for admin`:`In waiting hall`),z.add(this),Xa=null,this._signaling.readyToSend(),P.onLocalStatus(this._conversation.waitForAdmin?A.WAIT_FOR_ADMIN:A.WAITING_HALL,this.id),this._conversation):this._onJoinPart2(i)}catch(e){throw Xa=null,this._close(e,`Unable to join conversation`),e}}async _onJoinPart2(e){R.debug(`Join conversation part 2`);try{if(this._participantState=X.ACCEPTED,!this._conversation||!this._mediaSource)throw new D(E.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 D(E.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);P.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),t,this.id),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),P.onLocalStatus(A.WAITING,this.id),this._toggleJoinAvailability(),this._changeNeedRate(),this._state=`ACTIVE`,this._changeFeatureSet(),z.has(this.id)||z.add(this),await z.setActive(this.id),P.onCallActive(this.id),Xa=null;let n=this._extractLocalParticipantFromConnection(e);if(n){let e=C.mapParticipantState(n);Object.keys(e).length>0&&P.onLocalParticipantState(e)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(e){throw Xa=null,this._close(e,`Unable to join conversation`),e}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(e=>!!e)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let n={rooms:await this._extractExternalRooms(e)};return t&&(n.roomId=t),n}async onPush(e,t=S.USER,n,r,i){if(z.has(e))throw new D(E.HAS_ACTIVE_CALL);Xa=this,this._abortController=new AbortController,this._api.setAbortSignal(this._abortController?.signal),this._signaling.setAbortSignal(this._abortController?.signal);try{let a=Date.now(),o=await this._prepareConversation(e,t,n,r,i);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new D(E.UNKNOWN_ERROR);if(!o.conversation.participants.find(e=>e.state===X.CALLED&&e.id===this._conversation?.userId))throw R.log(`Push rejected (there is an active call)`),O.log(b.PUSH,`rejected`),new D(E.REJECTED);if(wt.startSession(),await this._processConnection(o),this._extractConnectionUrlSharingInfo(o),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(o),this._signaling.readyToSend(),this._logCallStartEvent(a,Y.INCOMING),O.log(b.PUSH,`accepted`),z.add(this),Xa=null,this._delayedHangup)throw new D(E.CANCELED)}catch(e){throw Xa=null,this._close(e,`Unable to handle inbound call push`),e}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(da.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(da.WAIT_FOR_ADMIN),n=e.conversation.options.includes(da.ADMIN_IS_HERE);return!t||t&&n?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(t=>C.comparePeerId(t.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(da.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new D(E.UNKNOWN_ERROR);this._state=`PROCESSING`;let e=this._mediaSource.mediaSettings;this._logWithMediaSettings(b.ACCEPT_CONCURRENT,e),R.debug(`Concurrent call`,{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.mediaSettings),P.onCallAccepted(this.id),this._state=`ACTIVE`,this._participantState=X.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(e){this._close(e,`Unable to accept concurrent call`)}}async _getMainRoomParticipants(){let e=await this._getParticipants();return C.mapSharedParticipants(Object.values(e).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,n]=e.split(`:`),r=parseInt(t,10);if(isNaN(r))throw Error(`Invalid original length in prefix`);let i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);try{let e=ka(a,r).reduce((e,t)=>(e+=String.fromCharCode(t),e),``),{srcp:t,stne:n,tkn:i,trne:o,trnp:s,trnu:c,wse:l,wte:u}=JSON.parse(e);return{token:i,endpoint:l,wt_endpoint:u,turn_server:{urls:o.split(`,`),username:c,credential:s},stun_server:{urls:n.split(`,`)},client_type:t}}catch(e){throw this._close(e,`Can't decompress conversation params`),e}}_logCallStartEvent(e,t){let n={[Y.OUTGOING]:`outgoing`,[Y.INCOMING]:`incoming`,[Y.JOINING]:`join`};Bn.logEventualStat({name:H.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[n[t],`warmup_start`]})})}async accept(e){if(this._state!==`IDLE`)throw O.log(b.ERROR,`acceptIncoming`),R.error(`Unable to accept a call - invalid state`),Error(`Unable to accept a call - invalid state`);if(!this._mediaSource||!this._conversation||!this._transport)throw new D(E.UNKNOWN_ERROR);this._state=`PROCESSING`,R.debug(`Accept incoming call`,e);try{await this._mediaSource.request(e);let t=this._mediaSource.mediaSettings;this._logWithMediaSettings(b.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=X.ACCEPTED;let n=this._getMuteStatesForCurrentRoom(),r=Object.keys(n);r.length&&this._onMuteParticipant({muteStates:n,mediaOptions:r,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let i=await this._signaling.getRooms(this._isCallAdmin());if(i.rooms?.rooms){let e=await this._getParticipants();i.rooms.rooms.forEach(t=>{t.participantIds?.forEach(t=>{e[t]&&(e[t].isInRoom=!0)})})}this._conversation.roomId=i.rooms?.roomId||null;let a=await this._extractExternalRoomsData(i.rooms?.rooms,i.rooms?.roomId);if(P.onCallAccepted(this.id),P.onLocalStream(this._mediaSource.getStream(),t,this.id),P.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),a,this.id),w.useParticipantListChunk){let e=await this._getInitialParticiapntListChunk(),t=await this._getParticipants();e?.participants?.forEach(e=>{let n=t[C.composeId(e)];n&&(n.movieShareInfos=e.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:e})}return P.onLocalStatus(A.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(),await z.setActive(this.id),P.onCallActive(this.id),this._conversation}catch(e){throw this._close(e,`Unable to accept call`),e}}async decline(){if(this._state!==`IDLE`)throw O.log(b.ERROR,`declineIncoming`),R.error(`Unable to decline a call - invalid state`),Error(`Unable to decline a call - invalid state`);this._state=`PROCESSING`,R.debug(`Decline incoming call`),this._logWithMediaSettings(b.DECLINE_INCOMING,this.mediaSettings),this._participantState=X.HUNGUP,this._signaling.ready&&await this._signaling.hangup(E.REJECTED),this._close(new D(E.REJECTED))}async hangup(){R.debug(`Hangup`);let e=this._state===`ACTIVE`?E.HUNGUP:E.CANCELED;O.log(b.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new D(e))):P.onHangup(new D(E.HUNGUP),this._conversation&&this._conversation.id),this._conversation?.id&&z.has(this._conversation.id)&&z.remove(this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new D(E.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipant(e.map(Z.toSignaling),t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:E.UNKNOWN_ERROR);let i=n.participants;if(!i&&n.rejectedParticipants)throw Error(n.rejectedParticipants[0].reason);for(let e of i)await this._onAddParticipant(C.composeId(e),e,r)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new D(E.UNKNOWN_ERROR),`Unable to add participant`);return}let n=await this._signaling.addParticipantLegacy(e,t),r=null;n.type===`error`&&(r=n.error===`call-unfeasible`?n.status:E.UNKNOWN_ERROR);let i=n.participants;for(let e of i)await this._onAddParticipant(C.composeId(e),e,r)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let n=[];for(let r of e)(r.state===X.CALLED||r.state===X.ACCEPTED)&&(this._transport.isAllocated(r.id)||this._transport.allocate(r.id,t)),r.state===X.ACCEPTED&&n.push(r.id);n.length?this._transport.open(n,null,!!this._conversation?.observer):this._transport.getTopology()===J.SERVER&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&R.error(t,e),R.debug(`Close conversation`,e),Ga.sendHangupEvent(e,this._transport?.getTopology()),nr.destroy(),Wi.logMetrics(this._transport?.getTopology()),Wi.destroy(),Gi.logMetrics(this._transport?.getTopology()),Gi.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(E.FAILED):O.log(b.ERROR,e.hangup);let n=this._conversation&&this._conversation.id;if([E.CANCELED,E.NOT_FRIENDS,E.CALLEE_IS_OFFLINE,E.CALLER_IS_BLOCKED,E.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===E.REJECTED&&!e.remote){P.onHangup(e,n),this.destroy();return}if(e.hangup===E.HUNGUP&&(!e.remote||this._isCalledState())){P.onHangup(e,n),this.destroy();return}if(e.hangup===E.MISSED&&!e.remote){P.onHangup(e,n),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===E.SOCKET_CLOSED||e.hangup===E.NOT_FOUND)&&z.getActive()&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===E.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state=`CLOSE`,this._participantState=X.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._api.setAbortSignal(void 0),this._signaling.setAbortSignal(void 0),O.destroy(),Bn.destroy(),z.remove(this.id),this._conversation=null,this._myLastRequestedLayouts={},this._delayedHangup=!1,this._abortController=null,P.onHangup(e||new D(E.UNKNOWN_ERROR),n)}async destroy(){let e=this._conversation&&this._conversation.id;if(R.debug(`Destroy conversation`,{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state=`CLOSE`,this._participantState=X.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,E.CANCELED)}catch{}this._cleanupListeners(),O.destroy(),Bn.destroy(),z.remove(this.id),this._conversation=null,this._myLastRequestedLayouts={},this._delayedHangup=!1,this._abortController=null}async _getConversationParams(e){let t=await this._api.getConversationParams(e);R.debug(`Api.getConversationParams`,t);let n=[],{turn_server:r,stun_server:i}=t;if(i&&n.push(i),r&&r.urls){let e=r.urls.filter((e,t,n)=>n.indexOf(e)===t);e.push(`${e[e.length-1]}?transport=tcp`),n.push({urls:e,username:r.username,credential:r.credential})}return w.iceServers=n,w.wssBase=t.endpoint,t.wt_endpoint&&(w.wtsBase=t.wt_endpoint),w.wssToken=t.token,t.client_type&&(w.clientType=t.client_type),t.external_user_type&&(w.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:n,wt_endpoint:r,token:i,client_type:a}){let o=[];if(t&&o.push(t),e&&e.urls){let t=e.urls.filter((e,t,n)=>n.indexOf(e)===t);t.push(`${t[t.length-1]}?transport=tcp`),o.push({urls:t,username:e.username,credential:e.credential})}w.iceServers=o,w.wssBase=n,w.wssToken=i,r&&(w.wtsBase=r),a&&(w.clientType=a)}_addGeoParamsToEndpoint(e,t){return t.isp_as_no&&(e+=`&ispAsNo=${t.isp_as_no}`),t.isp_as_org&&(e+=`&ispAsOrg=${t.isp_as_org}`),t.loc_cc&&(e+=`&locCc=${t.loc_cc}`),t.loc_reg&&(e+=`&locReg=${t.loc_reg}`),e}async _startConversation({opponentIds:e,opponentType:t,direction:n,mediaOptions:r,payload:i=``,joiningAllowed:a=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:s,externalIds:c,startedTime:l,onFastStart:u,conversationId:d}){let f=d??C.uuid();if(z.has(f))throw new D(E.HAS_ACTIVE_CALL);R.debug(`Conversation: start`,{conversationId:f,opponentIds:e,opponentType:t,direction:n});let p=r.includes(y.VIDEO),m;if(u){let e={deviceId:this._api.deviceId(),sdkVersion:w.sdkVersion,clientAppKey:w.apiKey,platform:w.platform,protocolVersion:w.protocolVersion,domainId:w.domain,capabilities:Ji.getFlags()},n=JSON.stringify(e),i;try{if(i=await u({internalParams:n,conversationId:f,externalIds:c,opponentType:t,mediaOptions:r,isVideo:p,joiningAllowed:a,requireAuthToJoin:o},this._abortController?.signal),!i.internalCallerParams)throw new D(E.FAST_START_ERROR,{message:JSON.stringify(i)})}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new D(E.CANCELED):e instanceof D?e:e instanceof Error?new D(E.FAST_START_ERROR,{message:e.message}):new D(E.FAST_START_ERROR,{message:String(e)})}try{let e=JSON.parse(i.internalCallerParams);m={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:f,is_concurrent:e.isConcurrent,client_type:e.clientType,rejected_participants:i.rejectedParticipants?.map(e=>({...e,status:e.status})),stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},R.debug(`FastStart`,m)}catch{throw new D(E.FAST_START_ERROR,{message:`Cannot parse internal params`})}}else m=await this._api.startConversation(f,e,t,p,i,a,o,{onlyAdminCanShareMovie:s},c),R.debug(`Api.startConversation`,m);this._setConversationParams(m);let h=await this._connectSignaling(Ki.START,m);return await this._setConversation(m,h,n),this._logCallStartEvent(l,Y.OUTGOING),h}async _joinConversation(e,t){W.setMark(H.SIGNALING_CONNECTED);let{conversationId:n,mediaOptions:r,chatId:i,joinLink:a,observedIds:o,payload:s,onFastJoin:c}=e;if(R.debug(`Conversation: join`,{conversationId:n,joinLink:a,observedIds:o}),n&&z.has(n))throw new D(E.HAS_ACTIVE_CALL);let l=r.includes(y.VIDEO),u;if(c){if(!a)throw new D(E.FAST_JOIN_ERROR,{message:`joinLink is required for fast join`});let e={deviceId:this._api.deviceId(),sdkVersion:w.sdkVersion,clientAppKey:w.apiKey,platform:w.platform,protocolVersion:w.protocolVersion,domainId:w.domain,capabilities:Ji.getFlags()},t=JSON.stringify(e),n;try{if(n=await c({joinLink:a,isVideo:l,internalParams:t},this._abortController?.signal),!n.internalCallerParams||!n.conversationId)throw new D(E.FAST_JOIN_ERROR,{message:JSON.stringify(n)})}catch(e){throw this._delayedHangup&&this._abortController?.signal.aborted?new D(E.CANCELED):e instanceof D?e:e instanceof Error?new D(E.FAST_JOIN_ERROR,{message:e.message}):new D(E.FAST_JOIN_ERROR,{message:String(e)})}try{let e=JSON.parse(n.internalCallerParams);if(z.has(n.conversationId))throw new D(E.HAS_ACTIVE_CALL);u={endpoint:e.endpoint,wt_endpoint:e.wtEndpoint,id:n.conversationId,is_concurrent:e.isConcurrent,client_type:e.clientType,stun_server:e.stun,turn_server:e.turn,token:new URL(e.endpoint).searchParams.get(`token`)??``},R.debug(`FastJoin`,u)}catch{throw new D(E.FAST_JOIN_ERROR,{message:`Cannot parse internal params`})}}else if(n)u=await this._api.joinConversation(n,l,i);else if(a)u=await this._api.joinConversationByLink(a,l,o,s);else throw new D(E.UNKNOWN_ERROR);if(R.debug(`Api.joinConversation`,u),u.id&&z.has(u.id))throw new D(E.HAS_ACTIVE_CALL);this._setConversationParams(u);let d=await this._connectSignaling(Ki.JOIN,u);return await this._setConversation(u,d,Y.JOINING),this._logCallStartEvent(t,Y.JOINING),d}async _prepareConversation(e,t=S.USER,n,r,i){W.setMark(H.SIGNALING_CONNECTED),R.debug(`Conversation: push`,{conversationId:e,type:t,peerId:n});let a=this._api.getUserId();if(!a)throw new D(E.UNKNOWN_ERROR);let o=0,s=``,c=``,l={id:e,peerId:n,endpoint:s,wt_endpoint:c,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:``};if(r){let n=this._decodeExternalConversationParams(r);this._setConversationParams(n),s=i??`${w.wssBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${w.wssToken}`,l.token=n.token,l.endpoint=s,w.wtsBase&&(c=`${w.wtsBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${w.wssToken}`,l.wt_endpoint=c)}else{let n=await this._getConversationParams(e);o=n.device_idx||0,s=i??`${w.wssBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${w.wssToken}`,s=this._addGeoParamsToEndpoint(s,n),l.token=n.token,l.endpoint=s,l.device_idx=o,w.wtsBase&&(c=`${w.wtsBase}?userId=${a}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${w.wssToken}`,c=this._addGeoParamsToEndpoint(c,n),l.wt_endpoint=c)}let u=await this._connectSignaling(Ki.ACCEPT,l);return await this._setConversation(l,u,Y.INCOMING,t),u}async _createParticipant(e,t){let n=Object.assign({id:null,externalId:null,mediaSettings:T(),participantState:{},state:X.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return n.externalId||(n.externalId=await this._getParticipantId(t??n.id)),this._api.cacheExternalId(t??n.id,n.externalId),t&&this._api.mapDecorativeId(t,n.id),n.observedIds?.length&&(n.externalId.observer=!0),e.markers&&(n.markers=this._denormalizeMarkers(n.id,e.markers)),n}async _getParticipantId(e){try{return await this._api.userId(e)}catch(e){throw this._close(new D(E.NETWORK_ERROR),e),e}}async _setConversation(e,t,n,r=S.USER){let{participants:i}=t.conversation;i.forEach(e=>{let t=C.composeId(e),n=Z.fromSignalingParticipant(e,!1);if(n){this._api.cacheExternalId(t,n);let r=C.composeDecorativeId(e),i=Z.fromSignalingParticipant(e);r&&i&&(this._api.cacheExternalId(r,i),this._api.mapDecorativeId(e.decorativeUserId,e.id))}});let a=this._api.getUserId(),o=this._extractLocalParticipantFromConnection(t),s=e.device_idx||0;if(!a){if(!o)throw new D(E.UNKNOWN_ERROR);a=Number(o.id),o.idType&&(r=o.idType),o.deviceIdx&&(s=o.deviceIdx),this._api.setUserId(a)}let c=C.composeParticipantId(a,r,s);this._conversation={userId:a,compositeUserId:c,externalId:await this._getExternalIdByParticipantId(c),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||J.DIRECT,direction:n,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:o?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},wt.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(w.forceRelayPolicy=e.p2p_forbidden),O.log(b.RELAY_POLICY,w.forceRelayPolicy?`1`:`0`),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new D(E.UNKNOWN_ERROR);this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||J.DIRECT,this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1}_createMediaSource(){let e=new Ae;return this.subscribe(e,Oe.SOURCE_CHANGED,this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,Oe.SCREEN_STATUS,this._onScreenSharingStatus.bind(this)),this._audioFix=new Aa(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,qn.NOTIFICATION,e=>this._signalingActor.add(e)),this.subscribe(this._signaling,qn.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,qn.RECONNECT,this._onSignalingReconnect.bind(this));let n=await this._signaling.connect(e,t);return Bn.logEventualStat({name:H.SIGNALING_CONNECTED}),n}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(la.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&P.onConversationParticipantListChunk(await this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{participants:[],countBefore:0,countAfter:0,markerFound:!1,...e}}async _participantListChunkToExternalChunk(e){let t=await this._getParticipants(),n=C.mapSharedParticipants(e.participants.reduce((e,n)=>{let r=C.composeId(n);return t[r]&&e.push(t[r]),e},[]));return{...e,participants:n}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let e of t)await this._registerParticipants(e?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let n=e[0]?.externalId?.type;n&&(w.externalUserType=n);let r=await this._getParticipants();for(let n of e){let e=C.composeId(n);if(R.test(`Conversation:RegisterParticipant`,e),this._isMe(e)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(R.debug(`Local roles changed: ${n.roles}`),P.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(n);continue}if(n.state===X.HUNGUP||n.state===X.REJECTED){r[n.id]&&await this._removeParticipant(r[n.id],E.HUNGUP);continue}let i=C.composeDecorativeId(n);this._registerParticipant({id:e,externalId:Z.fromSignalingParticipant(n),mediaSettings:T(n.mediaSettings),participantState:C.mapParticipantState(n),state:n.state,roles:n.roles||[],status:A.WAITING,muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(e,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},i);let a=await this._getParticipant(e);a&&n.roles&&n.roles.length&&(R.debug(`Roles for participant [${e}] changed: ${n.roles}`),P.onRolesChanged(a.externalId,n.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let n=async()=>{let n=Ca(e,ma.MUTE),r=Ca(e,ma.MUTE_PERMANENT);for(let i of[n,r])i.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:i,stateUpdated:!0})};C.setImmediate(()=>n().catch(e=>R.error(e)))}_getStatusByTransportState(e){let t=null;return e===q.CONNECTED?t=A.CONNECTED:e===q.CONNECTING||e===q.OPENED?t=A.CONNECTING:e===q.RECONNECTING&&(t=A.RECONNECT),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let t=(await this._getParticipants())[e];if(t)return t;let n=this._api.getDecorativeIdByInitialId(C.decomposeId(e).id),r=n?C.composeUserId(n):void 0;return this._createParticipant({id:e},r)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(w.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let t=await this._getParticipantId(e);return this._api.cacheExternalId(e,t),t}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(w.useParticipantListChunk){let n=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return n.markers=this._denormalizeMarkers(n.id,t),n}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){R.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let n=Object.values(t).find(e=>`ts`in e&&`rank`in e);return Object.entries(t).reduce((t,[r,i])=>(t[r]={...n,...i,id:e},t),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let n=wa(e);this._setMuteStatesForRoomId(n,null);for(let t of e.rooms?.rooms??[])this._setMuteStatesForRoomId(t.muteStates,t.id);let r=this._getMuteStatesForCurrentRoom();t&&(r=Oa(e,r));let i=Object.keys(r),a=this._conversation?.roomId;i.length&&this._onMuteParticipant({muteStates:r,mediaOptions:i,muteAll:!0,stateUpdated:!0,roomId:a},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}async _processPinnedParticipants(e){e.conversation.pinnedParticipantId?await this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?await this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}async _allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new Ui(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Pa,this.subscribe(this._transport,K.STATE_CHANGED,this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,K.LOCAL_STATE_CHANGED,this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,K.REMOTE_TRACK_ADDED,this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,K.REMOTE_TRACK_REMOVED,this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,K.AUDIO_MIX_STALL,this._onAudioMixStall.bind(this)),this.subscribe(this._transport,K.REMOTE_DATA_STATS,this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,K.SIGNALLED_STALLED_PARTICIPANTS,this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,K.TOPOLOGY_CHANGED,this._onTopologyChanged.bind(this)),this.subscribe(this._transport,K.NETWORK_STATUS,this._onNetworkStatus.bind(this)),this.subscribe(this._transport,K.REMOTE_STREAM_SECOND,this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,K.PEER_CONNECTION_CLOSED,this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,K.ASR_TRANSCRIPTION,this._onAsrTranscription.bind(this)),this.subscribe(this._transport,K.ANIMOJI_STREAM,this._onAnimojiStream.bind(this)),this.subscribe(this._transport,K.ANIMOJI_ERROR,this._onAnimojiError.bind(this));let e=this._conversation.direction===Y.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let n of Object.values(t))(n.state===X.ACCEPTED||n.state===X.CALLED)&&this._transport.allocate(n.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Va(this._transport),this.subscribe(this._volumesDetector,Ba.VOLUMES_DETECTED,this._onVolumesDetected.bind(this)),this._speakerDetector=new Ua(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,Ha.SPEAKER_CHANGED,this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new La(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Wa(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=I.getCameras().length,t=I.getMicrophones().length;R.debug(`Cameras: `+e+(I.hasCameraPermission()?`✔`:`✖`)+`, Microphones: `+t+(I.hasMicrophonePermission()?`✔`:`✖`)),O.log(b.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){O.log(e,[t?.isAudioEnabled&&`audio`,t?.isVideoEnabled&&`video`].filter(Boolean).join(`_`))}async _removeParticipant(e,t){if(e.state===X.CALLED||e.state===X.ACCEPTED||this._state===`CLOSE`)return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let n=await this._getParticipants();if(n[e.id]){t===E.HUNGUP?this._setParticipantsStatus([e],A.HANGUP):this._setParticipantsStatus([e],A.ERROR,t),e.mediaSource?.disconnect(),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[t,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(t),this._sequenceNumberByStreamDescription.delete(t),this._cooldownTimestampByStreamDescription.delete(t),this._streamWaitTimerByStreamDescription.has(t)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(t)),this._streamWaitTimerByStreamDescription.delete(t)),this._sendUpdateDisplayLayout({[t]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete n[e.id],P.onRemoteRemoved(e.externalId,e.markers,this.id)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener(`pagehide`,this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(e=>e.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(e=>e.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){R.debug(`cleaning up participant-agnostic streams`),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(e=>{e.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_cleanupSignaling(){this._signaling.close(),this._signaling.cleanup()}async _onAddParticipant(e,t,n){R.debug(`Add new participant [${e}]`);let r=await this._getParticipant(e);if(r&&(r.state===X.ACCEPTED||r.state===X.CALLED)){R.warn(`Participant [${r.id}:${r.state}] is already in conversation`);return}if(!r){let n=C.composeDecorativeId(t);this._registerParticipant({id:e,externalId:Z.fromSignalingParticipant(t),mediaSettings:T(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},n),r=await this._getParticipant(e)}this._setParticipantsStatus([r],A.WAITING),n?(r.state=X.HUNGUP,await this._removeParticipant(r,n)):this._transport&&(r.state=X.CALLED,this._transport.allocate(r.id,!0),O.log(b.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(r))}async _onRemoveParticipant(e){R.debug(`Remove participant [${e}]`);let t=[],n=await this._getParticipants();for(let r=0;r<=Ya;r++){let i=n[C.compose(e,r)];i&&t.push(i)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let e of t)this._transport.close(e.id);O.log(b.REMOVE_PARTICIPANT)}async changeDevice(e){return e===`audiooutput`?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(v.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(v.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(v.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,n=null){if(!this._transport||!this._conversation)return;let r=!t,i=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let t=n??this._conversation.externalId.id;this._transport.setAnimojiSvg(i,{svg:e,userId:t,isMe:r});return}this._transport.setAnimojiSvg(i,{svg:e,isMe:r})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return O.log(b.MEDIA_STATUS,e?`video_1`:`video_0`),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return O.log(b.MEDIA_STATUS,e?`audio_1`:`audio_0`),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},n={};for(let t of e){let e=typeof t.uid==`object`?t.uid:Z.fromId(t.uid),r=Z.toString(e);n[r]=t.priority}let r=await this._getParticipants();for(let e of Object.values(r)){let r=Z.toString(e.externalId);Object.hasOwn(n,r)&&(t[e.id]=n[r])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[t,n]of Object.entries(e))if(t.length>5||n.length>5)throw Error(`key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded`);t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async hold(e){let t=Dr.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&&P.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[$t(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;R.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},n=await this._getParticipants();for(let r of e){let e=typeof r.uid==`object`?r.uid:Z.fromId(r.uid),i=this._api.getCachedOkIdByExternalId(e);if(!i){let t=Z.toString(e);R.log(`Unknown participant external ID ${t}`);continue}let a=$t({participantId:i,mediaType:r.mediaType,streamName:r.streamName}),o=n[i];o?o.lastRequestedLayouts[a]=r:this._isMe(i)&&(this._myLastRequestedLayouts[a]=r),Jt(r)?(this._isMe(i)&&delete this._myLastRequestedLayouts[a],this._streamIdByStreamDescription.has(a)&&!this._cooldownTimestampByStreamDescription.has(a)&&this._cooldownTimestampByStreamDescription.set(a,Date.now())):(this._cooldownTimestampByStreamDescription.delete(a),!this._streamIdByStreamDescription.has(a)&&w.videoTracksCount>0&&this._streamIdByStreamDescription.set(a,null),t[a]=r),r.mediaType===V.SCREEN&&!Jt(r)&&W.setMark(W.getMarkNameScreenshareFirstFrame(i))}let r=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>w.videoTracksCount;){let e=r.next();if(e.done){R.error(`Cannot accommodate all streaming requests: tracks available `+w.videoTracksCount+`; requested streams: `+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(e.value),t[e.value]={stopStream:!0}}this._transport?.getTopology()===J.SERVER&&await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,n){if(this._conversation&&w.clientEventsLoggingEnabled){let r={event_type:H.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(r.reason=t),n!==void 0&&(r.group_call_users_count=n),O.logClientEvent(r,!0)}}sendClientEvent(e,t={},n=!1){let r={event_type:e,...t};O.logClientEvent(r,n)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(R.log(`Client asked to stop streaming before stream became available`,e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let t=await this._getParticipants(),n=en(e),r=t[n.participantId],i=this._conversation?.externalId,a=this._isMe(n.participantId);if(r||a){switch(n.mediaType){case V.STREAM:case V.MOVIE:if(n.streamName){let e={stream:null,streamName:n.streamName,mediaType:n.mediaType};a?P.onLocalLive(i,e):P.onRemoteLive(r.externalId,e)}break;case V.CAMERA:P.onRemoteStream(r.externalId,null,this.id);break;case V.SCREEN:P.onRemoteScreenStream(r.externalId,null,this.id);break}O.log(b.PAT_DEALLOCATED)}else R.log(`Cannot find participant to stop streaming: ${n.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;R.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let n;try{if(n=await this._signaling.updateDisplayLayout(e),!n)return}catch(n){if(R.warn(`Failed to update display layout ${JSON.stringify(e)}. ${n}`),t)throw n;return}let r=[],i=await this._getParticipants();for(let[e,t]of Object.entries(n.errorCodeByParticipantId||{})){let n=en(e),a=i[n.participantId];if(a){let e;typeof t==`number`?e=_a(t):(R.warn(`Unexpected error code ${t} received for participant ${n.participantId}`),e=ga.UNKNOWN_ERROR),r.push({externalId:a.externalId,errorReason:e})}}if(r&&r.length&&(R.warn(`Could not allocate one or more participants`,r),t))throw new Za(`Could not allocate one or more participants`,r)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let n=t.next();if(n.done)break;let r=n.value;if(r[1]+Ja>Date.now())break;let i=r[0];await this._stopStreaming(i),e[i]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;R.log(`Received participant sources update notification`,t);for(let e of t)this._waitForStreamIfNeeded(e)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(R.log(`Promoted in audience mode`,!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.mediaSettings)):(R.log(`Promoted in waiting hall`,!e.demote),e.demote?(R.log(`Kicked from waiting hall`),this._close(new D(E.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),P.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,n=[],r,i){R.log(`Chat room updated: ${e}`);let a=[],o=[],s=[],c=[],l=[];if(n.length&&n.forEach(e=>{if(e.externalId){let t=Z.fromSignaling(e.externalId);l.push(t),this._api.cacheExternalId(e.id.id,t)}else{let t=C.decomposeId(e.id.id).id;a.push(t),c.push(t)}}),r?.length&&r.forEach(e=>{let t=C.decomposeId(e).id;a.push(t),o.push(t)}),i?.length&&i.forEach(e=>{let t=C.decomposeId(e).id;a.push(t),s.push(t)}),!a.length){P.onChatRoomUpdated(e,t,l,[],[]);return}if(c.length){let e=await this._api.getExternalIdsByOkIds(c);l.push(...e)}let u=await this._api.getExternalIdsByOkIds(o),d=await this._api.getExternalIdsByOkIds(s);P.onChatRoomUpdated(e,t,l,u,d)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let n of e.data)if(this._isMe(n.participantId))P.onLocalLiveUpdate(t,n);else{let e=await this._getExternalIdByParticipantId(n.participantId);e&&P.onRemoteLiveUpdate(e,n)}}async _onSharedMovieInfoStarted(e){R.log(`Shared movie started data received: ${e.notification}`),await this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}async _processSharedMovieInfos(e,t=null){e&&await Promise.all(e.map(e=>this._processSharedMovieInfo(e,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let n=this._conversation?.externalId;if(this._isMe(e.initiatorId))P.onLocalSharedMovieInfo(n,e,t);else{let n=await this._getExternalIdByParticipantId(e.initiatorId);n&&P.onRemoteSharedMovieInfo(n,e,t)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(e=>this._isMe(C.composeId(e)));await this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}async _processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let t of e.rooms.rooms)t.asrInfo&&this._conversation?.asrInfoByRoom.set(t.id,t.asrInfo);let n=e?.rooms?.roomId??this._conversation?.roomId??null,r=this._conversation?.asrInfoByRoom.get(n);if(r){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&P.onAsrSet({externalId:e,movieId:r.movieId},n)}else n&&P.onAsrSet(null,n)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,n=this._conversation.roomId,r=t.get(n);if(r&&!this._isMe(r.initiatorId)){let e=await this._getExternalIdByParticipantId(r.initiatorId);e&&P.onRemoteSharedUrl(e,r.sharedUrl,n)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let n of e.rooms.rooms)n.urlSharingInfo?t.set(n.id,n.urlSharingInfo):t.delete(n.id)}async _onSharedMovieInfoStopped(e){R.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:n,movieId:r,source:i,roomId:a=null}=e,o={initiatorId:n,movieId:r,source:i};if(this._isMe(n))P.onLocalSharedMovieStoppedInfo(t,o,a);else{let e=await this._getExternalIdByParticipantId(n);if(e){let t=(await this._getParticipants())[n];t?.movieShareInfos&&(t.movieShareInfos=t.movieShareInfos.filter(e=>e&&e.movieId!==r)),P.onRemoteSharedMovieStoppedInfo(e,o,a)}}}async _onUrlSharingInfoUpdated(e){if(R.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:n}=this._conversation,{initiatorId:r,sharedUrl:i,roomId:a=null}=e;if(i?t.set(a,{sharedUrl:i,initiatorId:r}):t.delete(a),!(!i&&a!==n&&t.has(n))&&(!i||!this._isMe(r))){let e=await this._getExternalIdByParticipantId(r);e&&P.onRemoteSharedUrl(e,i,a)}}_onFeaturesPerRoleChanged(e){R.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),P.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let t=this._getStreamDescriptionById(e.streamId);if(t){let e=en(t),n=await this._getParticipant(e.participantId);P.onRemoteScreenStream(n.externalId,null,this.id);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:n,participantId:r}=t;if(n===V.ANIMOJI)return;let i=await this._getParticipant(r);if(n===V.SCREEN&&!e.fastScreenShare){R.log(`skipping participant-sources-update notification since screenshare will be received over datachannel`);return}let a=$t(t),o=this._sequenceNumberByStreamDescription.get(a);if(o&&o>e.sequenceNumber){R.warn(`Participant ${r} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${o}`),O.log(b.PAT_OUTDATED_RESPONSE);return}i&&e.suspend!==void 0&&n&&(R.debug(`participant-sources-update: mediaType=${n}, suspend=${e.suspend}`),P.onRemoteStreamSuspended(i.externalId,n,e.suspend));let s=e.streamId,c=e.rtpTimestamp?this._getWaitingTime(s,e.rtpTimestamp):0;if(c<=0){this._streamWaitTimerByStreamDescription.delete(a);let t=this._conversation?.externalId,n=this._isMe(r);if(!i&&!n){O.log(b.PAT_ERROR,`participantMissing`),R.error(`Could not find participant by ID: ${r}`);return}let o=n?t:i.externalId,c=this._streamByStreamId.get(s);if(!c){O.log(b.PAT_ERROR,`streamNotFound`),R.error(`Could not find stream by ID: ${s}`);return}O.log(b.PAT_ALLOCATED),this._streamIdByStreamDescription.set(a,s);let l=e.participantStreamDescription?.mediaType;if(l===V.STREAM||l===V.MOVIE){if(e.participantStreamDescription?.streamName){let t={streamName:e.participantStreamDescription.streamName,stream:c,mediaType:l};n?P.onLocalLive(o,t):P.onRemoteLive(o,t)}}else l===V.SCREEN?P.onRemoteScreenStream(i.externalId,c,this.id):n||P.onRemoteStream(i.externalId,c,this.id)}else{R.debug(`Waiting for ${c} until stream ${s} for ${a} is switched`);let t=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),c);this._streamWaitTimerByStreamDescription.set(a,t)}}_getStreamDescriptionById(e){for(let[t,n]of this._streamIdByStreamDescription.entries())if(n===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has($t(e)))return e;let t=e.participantId;if(e.mediaType){let e={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has($t(e)))return e}else{let e={participantId:t,mediaType:V.CAMERA};if(this._streamIdByStreamDescription.has($t(e)))return e;let n={participantId:t,mediaType:V.SCREEN};if(this._streamIdByStreamDescription.has($t(n)))return n}return R.error(`Received unrequested allocation`,e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw Error(`transport is not initialized`)}_isCallAdmin(){return this._conversation?C.includesOneOf(this._conversation.roles,[va.ADMIN,va.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!C.includesOneOf(this._conversation.roles,[va.ADMIN,va.CREATOR]))throw Error(`You don't have the required permission`)}_isCalledState(){return this._participantState===X.CALLED}async grantRoles(e,t,n){this._checkAdminRole(),await this._signaling.grantRoles(e,t,n)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,n=[],r=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,n,r)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,n=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,n),this._conversation?.pinnedParticipantIdByRoom.set(n,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===J.SERVER&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()===J.SERVER&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=pa(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,n){if(!this._signaling)return Promise.reject();let r=null;if(e&&(r=Sa(e),r)){let e=this._api.getDecorativeIdByInitialId(r.id);r.id=e?C.composeUserId(e):r.id}let i=await this._signaling.getWaitingHall(r,t,n);if(i.error)return Promise.reject(i.message);let a=i.participants||[],{externalIds:o}=await this._resolveWaitingHallExternalIds(a),s=null;return a.length&&i.hasMore&&(s=xa(a[a.length-1].id)),{participants:o,pageMarker:s,totalCount:i.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,n=[],r=[];if(e.length){let i=[];e.forEach(e=>{if(t.set(e.id.id,e.id.addedTs),e.externalId){let t=Z.fromSignaling(e.externalId);n.push(e.id.addedTs),r.push(t),this._api.cacheExternalId(e.id.id,t)}else i.push(C.decomposeId(e.id.id).id)}),i.length&&!r.length&&(r=await this._api.getExternalIdsByOkIds(i),n=r.map(e=>{let n=this._api.getCachedOkIdByExternalId(e);return(n?t.get(n):void 0)||Date.now()}))}return{externalIds:r,timestamps:n}}async getAudienceModeHands(){if(!this._signaling.ready)throw Error(`Signaling is not ready`);let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:n,timestamps:r}=await this._resolveWaitingHallExternalIds(t);return{timestamps:r,participants:n,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!C.includesOneOf(this._conversation.options,[da.WAITING_HALL,da.AUDIENCE_MODE]))throw Error(`Unable to promote a participant in the conversation with current options`);if(this._checkAdminRole(),!e&&t)throw Error(`participantId is required`);await this._signaling.promoteParticipant(e,t)}catch(t){throw R.warn(`Failed to promote participant ${e}. ${t}`),t}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let e=t.messages.length-1;e>=0;e--){let n=t.messages[e];await this._onChatMessage(n)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let e=(await this._api.createJoinLink(this._conversation.id)).join_link;if(e)return this._conversation.joinLink=e,e}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:n,lang:r}){let i={movieId:e,lang:r};(t||t===0)&&(i.gain=t),n&&(i.metadata=n);let a=await this._signaling.addMovie(i);if(a.error)throw Error(a.error);return{movieId:a.movieId,streamType:a.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw Error(t.error)}async removeMovie(e){let t={movieId:e},n=await this._signaling.removeMovie(t);if(n.error)throw Error(n.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw Error(e.error)}async updateRooms(e,t){let n=await this._signaling.updateRooms(e,t);if(n.error)throw Error(n.error)}async activateRooms(e,t){let n=await this._signaling.activateRooms(e,t);if(n.error)throw Error(n.error)}async switchRoom(e,t){let n=await this._signaling.switchRoom(e,t);if(n.error)throw Error(n.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw Error(t.error)}async startStream(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o={movieId:n,name:t,privacy:r,groupId:i,roomId:a,streamMovie:!e},s=await this._signaling.startStream(o);if(s.error)return Promise.reject(s.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async recordSetConf(e,t,n=!1,r=null){let i=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:n,roomId:r});if(i.error)throw Error(i.error)}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<w.videoMinWidth||e.height<w.videoMinHeight)throw Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<w.videoMinWidth||t.height<w.videoMinHeight)throw Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");w.videoEffectMaxHeight=t.height,w.videoEffectMaxWidth=t.width}w.videoMaxWidth=e.width,w.videoMaxHeight=e.height,R.debug(`Set local video resolution:`,`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:``)),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(e=>({id:e.id,type:w.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),n=await this._signaling.getParticipants(t);if(n.error)throw Error(n.error);let r=n.participants,i=this._transport?.getState();return Promise.all(r.map(async e=>{let t=C.composeId(e);return this._createParticipant({id:t,externalId:Z.fromSignalingParticipant(e),mediaSettings:T(e.mediaSettings),participantState:C.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(i)??A.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(t,e.markers)},e.decorativeUserId)})).then(C.mapSharedParticipants)}async getParticipantListChunk(e){R.log(`Request participant list chunk`,e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw Error(t.error);let n=this._createParticipantListChunk(t.chunk),r=await this._getParticipants(),i=n.participants.filter(e=>!r[C.composeId(e)]);await this._registerParticipants(i);let a=this._transport?.getState();return n.participants.forEach(e=>{let t=r[C.composeId(e)];t.status=this._getStatusByTransportState(a)??A.WAITING,t.movieShareInfos=e.movieShareInfos,Object.assign(t.mediaSettings,T(e.mediaSettings)),Object.assign(t.muteStates,e.muteStates),t.unmuteOptions=e.unmuteOptions??t.unmuteOptions,this._openTransport([t],!0)}),this._participantListChunkToExternalChunk(n)}async _getInitialParticiapntListChunk(){let e=w.participantListChunkInitIndex,t=w.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:`GRID`,fromIdx:e,count:t});return R.debug(`Get initial participant list chunk`,n.chunk),n.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.mediaSettings;R.debug(`Local media stream changed`,t),e.kind===k.audio&&this._mediaSource&&(this._audioFix=new Aa(this._mediaSource)),P.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this.mediaSettings;R.log(`Screen sharing changed`,e.track,t);let n=e.track?new MediaStream([e.track]):null;P.onScreenStream(n,t)}async _changeRemoteMediaSettings(e,t){R.debug(`Remote media settings changed [${e}]`,t);let n=this._conversation?.externalId;if(this._isMe(e)&&n){P.onLocalMediaSettings(n,t);return}let r=await this._getParticipant(e);if(!r){this._warnParticipantNotInConversation(e);return}r.mediaSettings=t,this._state===`ACTIVE`&&P.onRemoteMediaSettings(r.externalId,t,r.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(n=>n.id===t||C.comparePeerId(n.peerId,e.peerId))}_changeLocalParticipantState(e){R.debug(`Local participant state force changed by admin`,e),this._state===`ACTIVE`&&P.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){R.debug(`Remote participant state changed [${e}]`,t);let n=await this._getParticipant(e);if(!n){this._warnParticipantNotInConversation(e);return}n.participantState=t||{},this._state===`ACTIVE`&&P.onRemoteParticipantState(n.externalId,n.participantState,n.markers)}async _changeMultipleParticipantState(e,t){R.debug(`Multiple participants state changed`,e);let n=[],r,i=await this._getParticipants();e.forEach((e,t)=>{if(this._isMe(t))r=e;else{let r=i[t];if(!r){this._warnParticipantNotInConversation(t);return}r.participantState=e,n.push({externalId:r.externalId,participantState:{...e},markers:r.markers})}}),this._state===`ACTIVE`&&(r&&P.onLocalParticipantState(r,!0),n.length&&P.onRemoteParticipantsState(n,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state===`ACTIVE`&&e.roles&&e.roles.length&&(R.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),P.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case G.ACCEPTED_CALL:return this._onAcceptedCall(e);case G.HUNGUP:return this._onHungup(e);case G.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case G.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case G.CLOSED_CONVERSATION:return this._onClosedConversation(e);case G.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case G.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case G.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case G.RATE_CALL_DATA:return this._onNeedRate();case G.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case G.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case G.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case G.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case G.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case G.REGISTERED_PEER:return this._onPeerRegistered(e);case G.SWITCH_MICRO:return this._onMicSwitched(e);case G.CHAT_MESSAGE:return this._onChatMessage(e);case G.CUSTOM_DATA:return this._onCustomData(e);case G.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case G.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case G.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case G.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case G.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case G.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case G.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case G.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case G.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case G.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case G.FEEDBACK:return this._onFeedback(e);case G.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case G.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case G.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case G.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case G.ROOMS_UPDATED:return this._onRoomsUpdated(e);case G.ROOM_UPDATED:return this._onRoomUpdated(e);case G.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case G.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case G.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case G.ASR_STARTED:return this._onAsrStart(e);case G.ASR_STOPPED:return this._onAsrStop(e);case G.PROMOTION_APPROVED:return this._onPromotionApproved(e);case G.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case G.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e);case G.HOLD:return this._onParticipantHold(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}P.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 n=Object.keys(await this._getParticipants()),r=[];for(let n of e.conversation.participants){let e=C.composeId(n),i=n.roles||[];if(this._isMe(e)){ya(this._conversation.roles,i)||this._onRolesChanged(e,i),t=()=>{this._registerParticipantLocalMuteState({muteStates:Da(n),unmuteOptions:n.unmuteOptions})};continue}r.push(e);let a=await this._getParticipant(e);if(!a)await this._onJoinedParticipant({participantId:n.id,participant:n,mediaSettings:n.mediaSettings});else{let t=T(n.mediaSettings);xe(t,a.mediaSettings)||await this._changeRemoteMediaSettings(e,t);let r=C.mapParticipantState(n),o=a.participantState;C.isEqualParticipantState(r,o)||await this._changeRemoteParticipantState(e,r),ya(i,a.roles)||this._onRolesChanged(a.id,i)}}let i=await this._getParticipants();for(let e of n)r.indexOf(e)<0&&i[e]&&this._removeParticipant(i[e],E.HUNGUP)}let n=e.rooms?.roomId??null;if(!this._conversation){R.warn(`Conversation is empty, but should be filled`);return}this._conversation.roomId===n?this._processMuteStates(e,!0):await this._onRoomSwitched(n),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){R.error(`Signaling failed`,e),this._close(e)}async _onAcceptedCall(e){let t=C.composeMessageId(e),n=C.getPeerIdString(e.peerId);if(R.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new D(E.MISSED),`Call accepted on other device`);return}let r=await this._getParticipant(t);if(!r){let n=this._api.getDecorativeIdByInitialId(t),i=n?C.composeUserId(n,e.participantType):void 0;r=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:T(e.mediaSettings)},i))}r.state=X.ACCEPTED,r.mediaSettings=T(e.mediaSettings),this._logWithMediaSettings(b.ACCEPTED_OUTGOING,r.mediaSettings),this._conversation&&this._conversation.direction===Y.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),this._state===`ACTIVE`&&this._transport&&this._transport.open([r.id],n),await this._changeRemoteMediaSettings(t,r.mediaSettings),await this._changeRemoteParticipantState(t);let i=Object.keys(r.muteStates);i.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:i,stateUpdated:!0,participantId:t}),this._state===`ACTIVE`&&P.onAcceptedCall(r.externalId,Ji.parseCapabilities(e.capabilities),this.id)}async _onHungup(e){R.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=C.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new D(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let n=await this._getParticipant(t);if(!n){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),n.state=e.reason===E.REJECTED?X.REJECTED:X.HUNGUP,this._state!==`CLOSE`&&this._removeParticipant(n,E.HUNGUP)}async _onAddedParticipant(e){R.debug(`Participant added [${e.participantId}]`);let t=C.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state!==X.HUNGUP&&n.state!==X.REJECTED){R.debug(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Z.fromSignalingParticipant(r),mediaSettings:T(r.mediaSettings),state:r.state,participantState:C.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[]},i),n=await this._getParticipant(t)}n.state=X.CALLED,n.mediaSettings=T(e.participant?.mediaSettings),n.participantState=C.mapParticipantState(e.participant),n.roles=e.participant?.roles||[],this._setParticipantsStatus([n],A.WAITING),this._state!==`IDLE`&&this._transport&&this._transport.allocate(n.id,!0),P.onParticipantAdded(n.externalId,n.markers,this.id),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n)}async _onJoinedParticipant(e){R.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=C.composeMessageId(e),n=await this._getParticipant(t);if(n&&n.state===X.ACCEPTED){R.warn(`Participant [${t}] is already in conversation and is active`);return}if(!n){let{participant:r}=e,i=r.decorativeUserId;this._registerParticipant({id:t,externalId:Z.fromSignalingParticipant(r),mediaSettings:T(r.mediaSettings),state:r.state,participantState:C.mapParticipantState(r),roles:r.roles||[],muteStates:r.muteStates||{},movieShareInfos:r.movieShareInfos,unmuteOptions:r.unmuteOptions||[],observedIds:r.observedIds||[],markers:this._denormalizeMarkers(t,r.markers)},i),n=await this._getParticipant(t)}this._conversation&&this._conversation.direction===Y.OUTGOING&&(this._state===`IDLE`||this._state===`PROCESSING`)&&(this._state=`ACTIVE`,this._changeFeatureSet()),n.state=X.ACCEPTED,n.mediaSettings=T(e.mediaSettings),n.participantState=C.mapParticipantState(e.participant),n.roles=e.participant.roles||[],this._transport?.isAllocated(n.id)?this._setParticipantsStatus([n],A.CONNECTED):this._setParticipantsStatus([n],A.WAITING),this._state!==`IDLE`&&this._transport&&(this._transport.isAllocated(n.id)||this._transport.allocate(n.id,!0),this._transport.open([n.id],null,!!this._conversation?.observer)),P.onParticipantJoined(n.externalId,n.markers,this.id),await this._changeRemoteMediaSettings(t,n.mediaSettings),await this._changeRemoteParticipantState(t,n.participantState),this._invokeRolesChangedCallbackIfNeeded(n);let r=Object.keys(n.muteStates);r.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:r,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(n.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new D(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=C.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,T(e.mediaSettings))}async _onParticipantStateChanged(e){let t=C.composeMessageId(e),n=C.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(n):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,n))}async _onParticipantsStateChanged(e){let{participants:t,roomId:n}=e,r=t.map(({id:e,markers:t})=>this._registerParticipantAndSetMarkersIfChunkEnabled(e,t));await Promise.all(r);let i=new Map,a=t.map(({id:e,participantState:t})=>this._getExternalIdByParticipantId(e).then(n=>[e,n&&C.mapParticipantState({participantState:t})]));try{(await Promise.all(a)).forEach(([e,t])=>{t&&i.set(e,t)}),await this._changeMultipleParticipantState(i,n)}catch(e){R.warn(`_onParticipantsStateChanged: Failed to get external ids. ${e}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),P.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.mediaSettings,n=T(e.mediaSettings);t.isAudioEnabled!==n.isAudioEnabled&&await this._mediaSource.toggleAudio(n.isAudioEnabled),t.isVideoEnabled!==n.isVideoEnabled&&await this._mediaSource.toggleVideo(n.isVideoEnabled),t.isScreenSharingEnabled!==n.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:n.isScreenSharingEnabled,fastScreenSharing:n.isFastScreenSharingEnabled,captureAudio:n.isAudioSharingEnabled})}_onSettingsUpdate(e){R.debug(`Got settings update notification`,e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=er(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){R.debug(`Got video quality update notification`,e);let t={maxBitrateK:Math.round(e.quality.maxBitrate/1024),maxDimension:e.quality.maxDimension},n;n=e.mediaType&&e.mediaType===V.SCREEN?{camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,t)}:{camera:Object.assign({},this._serverSettings.camera,t),screenSharing:null,fastScreenSharing:null},this._serverSettings=er(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=C.composeMessageId(e),n=await this._getParticipant(t);n&&(n.clientType=e.clientType,n.platform=e.platform),P.onPeerRegistered()}async _onMicSwitched(e){P.onDeviceSwitched(y.AUDIO,!e.mute,this.id),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=C.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}P.onChatMessage(e.message,n,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,`sdk`))return;let t=C.composeMessageId(e),n=await this._getExternalIdByParticipantId(t);if(!n){this._warnParticipantNotInConversation(t);return}P.onCustomData(e.data,n,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let n=this._conversation.recordsInfoByRoom.get(t);if(n?.recordMovieId!==e?.recordMovieId||n?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let n=await this._getExternalIdByParticipantId(e.initiator);n?P.onRecordStarted(n,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}}async _onStopRecordInfo({participant:e,recordMovieId:t},n=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(n);if(!(!r||r.recordMovieId!==t))if(this._conversation.recordsInfoByRoom.set(n,null),e){let t=await this._getExternalIdByParticipantId(e);P.onRecordStopped(n,t??null)}else P.onRecordStopped(n,null)}async _changePinnedParticipantForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.pinnedParticipantIdByRoom.get(e);if(t&&!this._isMe(t)){let n=await this._getExternalIdByParticipantId(t);n&&P.onPinnedParticipant(n,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiator);n?P.onRecordStarted(n,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else P.onRecordStopped(e,null)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let n=await this._getExternalIdByParticipantId(t.initiatorId);n&&P.onAsrSet({externalId:n,movieId:t.movieId},e)}else P.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,n=t.get(e);if(n){let t=await this._getExternalIdByParticipantId(n.initiatorId);t&&P.onRemoteSharedUrl(t,n.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}P.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,n=e.roomId||null;this._conversation.asrInfoByRoom.set(n,t);let r=await this._getExternalIdByParticipantId(t.initiatorId);if(!r){this._warnParticipantNotInConversation(t.initiatorId);return}P.onAsrStarted(r,t.movieId,n)}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),P.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}P.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!ya(this._conversation.roles,t)){R.debug(`Local roles changed: ${t}`),this._conversation.roles=t,P.onLocalRolesChanged(t),this._processMuteState({mediaOptions:Ca(this._getMuteStatesForCurrentRoom(),ma.MUTE_PERMANENT),stateUpdated:!0}),C.includesOneOf(t,[va.ADMIN,va.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let n=await this._getParticipant(e);n&&!ya(n.roles,t)&&(R.debug(`Roles for participant [${e}] changed: ${t}`),n.roles=t,P.onRolesChanged(n.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:n,muteStates:r={},unmuteOptions:i=[],mediaOptions:a=[],roomId:o=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){R.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let t=await this._getParticipant(e.participantId);if(t){R.debug(`Mute states for participant [${e.participantId}] changed`,r);let o=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;P.onMuteStates(r,i,a,n,e.unmute,t.externalId,o,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(n&&!t?this._setMuteStatesForRoomId(r,o):n||(this._conversation.muteStatesPersonal=r)),e.adminId&&this._isMe(e.adminId)){n&&P.onMuteStates(r,i,a,n,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:a,muteAll:n,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:i,muteStates:r})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let n=this._getMuteStatesForRoomId(t),r=this._getMuteStatesForRoomId(e),i=Object.keys(n),a=Object.keys(r);this._processMuteState({mediaOptions:Array.from(new Set([...i,...a])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==X.ACCEPTED)return;let{mediaOptions:t=[],muteAll:n,unmute:r,stateUpdated:i,requestedMedia:a,roomId:o=null,unmuteOptions:s=[]}=e,c=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,l=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(o)),u=this._mediaSource.mediaSettings,d=Object.entries(l);for(let[e,i]of d){let a=this._isCallAdmin()&&n;if(!(i!==ma.MUTE&&i!==ma.MUTE_PERMANENT||a)&&(this._isCallAdmin()&&i===ma.MUTE_PERMANENT&&!n&&(l[e]=ma.MUTE),!(!t.includes(e)||r)))switch(e){case y.VIDEO:u.isVideoEnabled&&(P.onDeviceSwitched(y.VIDEO,!1,this.id),await this.toggleLocalVideo(!1));break;case y.AUDIO:u.isAudioEnabled&&(P.onDeviceSwitched(y.AUDIO,!1,this.id),await this.toggleLocalAudio(!1));break;case y.SCREEN_SHARING:u.isScreenSharingEnabled&&(P.onDeviceSwitched(y.SCREEN_SHARING,!1,this.id),await this.disableScreenCapturing());break;case y.AUDIO_SHARING:u.isAudioSharingEnabled&&(P.onDeviceSwitched(y.AUDIO_SHARING,!1,this.id),await this.toggleScreenCapturing({captureScreen:u.isScreenSharingEnabled,fastScreenSharing:u.isFastScreenSharingEnabled,captureAudio:!1}));break}}P.onMuteStates(l,s,t,n,r,null,c,i,a,o)}async _onPinParticipant(e,t=!1,n,r=null){if(!this._conversation)return;let i=this._conversation.pinnedParticipantIdByRoom.get(r);if(i&&i!==e)if(this._isMe(i))P.onLocalPin(!0,r);else{let t=await this._getExternalIdByParticipantId(i);t&&P.onPinnedParticipant(t,!0,this._denormalizeMarkers(e,n),r)}if(this._isMe(e))P.onLocalPin(t,r);else{let i=await this._getExternalIdByParticipantId(e);i&&P.onPinnedParticipant(i,t,this._denormalizeMarkers(e,n),r)}this._conversation.pinnedParticipantIdByRoom.set(r,t?null:e)}_onOptionsChanged(e){this._conversation&&!fa(this._conversation.options,e)&&(this._conversation.options=e,P.onOptionsChanged(e),e.includes(da.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&P.onLocalStatus(A.WAITING_HALL,this.id):e.includes(da.WAIT_FOR_ADMIN)&&this._conversation.restricted&&P.onLocalStatus(A.WAIT_FOR_ADMIN,this.id))}async _onNetworkStatus(e){if(this._conversation){let t=[],n=await this._getParticipants();for(let[r,i]of Object.entries(e)){let e;if(this._isMe(r)||r===``)e=this._conversation.networkRating;else if(n[r])e=n[r].networkRating;else continue;if(e!==i)if(this._isMe(r)||r===``)this._conversation.networkRating=i,jr.getInstance().value=i,P.onLocalNetworkStatusChanged(i);else{let e=n[r];e.networkRating=i,t.push({uid:e.externalId,rating:i})}}if(t.length===0)return;R.log(`Received network status update: `,e),P.onNetworkStatusChanged(t)}}async _onRemoteStreamSecond(e,t){let n=await this._getParticipant(e);n&&P.onRemoteScreenStream(n.externalId,t,this.id)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){P.onVmojiStream(t,this._mediaSource.mediaSettings);return}let n=await this._getParticipant(e);n&&P.onRemoteVmojiStream(n.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,P.onVmojiError({...e,externalId:t}))}catch(e){R.warn(`_onAnimojiError failed`,e)}}_onPeerConnectionClosed(e){e===J.SERVER&&this._cleanupParticipantAgnosticStreams(),this._audioOutput.destroy()}_changeFeatureSet(){if(this._conversation){let e=this._state===`ACTIVE`,t=this._conversation.features.includes(ua.ADD_PARTICIPANT);P.onCallState(e,t,this._conversation,this.id)}}_changeFeaturesPerRole(){this._conversation&&P.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&P.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[n,r]of Object.entries(e)){let e=await this._getParticipant(n);e&&e.externalId&&t.push({uid:e.externalId,volume:r.real})}P.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(P.onSpeakerChanged(t.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){R.debug(`Transport state has changed: ${t}`,e);let n=this._getStatusByTransportState(t);if(!n)return;let r=await this._getParticipants(),i=e.reduce((e,n)=>{if(n in r){let i=r[n];e.push(i),t===q.CONNECTED&&(i.remoteStream||(i.mediaSettings&&this._changeRemoteMediaSettings(n,i.mediaSettings),this._changeRemoteParticipantState(n,i.participantState)),this._updateDisplayLayoutFromCache(n))}else this._warnParticipantNotInConversation(n);return e},[]);i.length&&this._setParticipantsStatus(i,n)}async _onTransportLocalStateChanged(e){if(R.debug(`Local transport state has changed: ${e}`),e===q.CONNECTED&&(I.releaseFirefoxMicrophonePermissionWarmup(),P.onLocalStatus(A.CONNECTED,this.id),this._transport?.getTopology()===J.SERVER)){let e=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(e)}e===q.CONNECTING&&P.onLocalStatus(A.CONNECTING,this.id),e===q.RECONNECTING&&P.onLocalStatus(A.RECONNECT,this.id),e===q.FAILED&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(E.FAILED),this._close(new D(E.FAILED),`Transport failed`))}async _onRemoteTrackAdded(e,t,n){if(e.endsWith(Tr.AUDIO_MIX))R.debug(`Remote audio mix track added`),this._audioOutput.add(e,n),P.onRemoteMixedAudioStream(t);else if(e.startsWith(Tr.TRANSPARENT_AUDIO_TRACK_PREFIX))R.debug(`Remote transparent audio track added: ${e}`),this._audioOutput.add(e,n);else if(e.startsWith(Tr.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))R.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{R.debug(`Remote track added on the participant [${e}]`,{kind:n.kind});let r=await this._getParticipant(e);if(!r){let t=this._api.getDecorativeIdByInitialId(e),n=t?C.composeUserId(t):void 0;R.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${n}]`),this._registerParticipant({id:e},n),r=await this._getParticipant(e),this._setParticipantsStatus([r],A.WAITING),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(P.onSpeakerChanged(r.externalId,this.id),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(r.id)&&this._transport.allocate(r.id,!1),n.kind===k.audio&&(this._audioOutput.add(e,n),w.preserveAudioTracks||(r.remoteAudioTrack=n,t.removeTrack(n))),r.remoteStream!==t&&t.getTracks().length){if(r.remoteStream=t,r.secondStream)return;P.onRemoteStream(r.externalId,t,this.id)}r.mediaSettings&&this._changeRemoteMediaSettings(e,r.mediaSettings)}}_onRemoteTrackRemoved(e,t,n){switch(R.debug(`[${e}] remote track (removed)`,{track:n}),n.kind){case k.audio:this._removeAudioTrack(e,t,n);break;case k.video:case k.screen:this._removeVideoTrack(e,t,n);break}}async _removeAudioTrack(e,t,n){if(e!==Tr.AUDIO_MIX){let n=await this._getParticipant(e);if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(e,n)}_removeVideoTrack(e,t,n){}_onTopologyChanged(e){e===J.DIRECT&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall()),this._audioOutput.destroy()}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,R.debug(`Audio mix stalled:`,e),P.onLocalStatus(e?A.RECONNECT:A.CONNECTED,this.id))}async _onRemoteSignalledStall(e){let t={},n=[],r=[];R.debug(`Participants stalled:`,e);let i=await this._getParticipants();for(let r of e){if(t[r]=!0,!this._lastStalled[r]){let e=i[r];e&&n.push(e)}delete this._lastStalled[r]}for(let e of Object.keys(this._lastStalled)){let t=i[e];t&&r.push(t)}n.length&&this._setParticipantsStatus(n,A.RECONNECT),r.length&&this._setParticipantsStatus(r,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){!I.hasMicrophone()||!this._audioFix||!this.mediaSettings?.isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!I.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&&(R.debug(`Toggle join availability`,{available:t,chatId:e}),P.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!==J.SERVER)return;let t=await this._getParticipant(e);if(t&&t.lastRequestedLayouts&&Object.keys(t.lastRequestedLayouts).length)try{await this.updateDisplayLayout(Object.values(t.lastRequestedLayouts))}catch(e){R.warn(`_updateDisplayLayoutFromCache failed: ${e}`)}}_setParticipantsStatus(e,t,n=null){if(!e.length)return;let r=e.reduce((e,n)=>(n.status!==t&&(n.status=t,e.push(n.externalId)),e),[]);r.length&&P.onRemoteStatus(r,t,n,this.id)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),P.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let n of Object.keys(ha)){let r=e.updates[n];r&&(t[n]={rooms:await Promise.all(r?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:r?.roomIds,deactivated:r?.deactivated})}P.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(e=>e===ha.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()||P.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),n=await Promise.all(e.addParticipantIds?.map(e=>this._getExternalIdByParticipantId(e))||[]),r=await Promise.all(e.removeParticipantIds?.map?.(e=>this._getExternalIdByParticipantId(e))||[]),i=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:n,removeParticipantIds:r,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:i,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),n=e.roomId??null,r=e.addedParticipantIds?.map(e=>C.decomposeId(e).id)||[],i=await this._api.getExternalIdsByOkIds(r),a=e.addedParticipants;if(i.length&&a?.length!==i.length&&!this._isCalledState()){let e=this._convertExternalIdsToServerExternalIds(i);a=(await this._signaling.getParticipants(e)).participants}let o=await Promise.all(a?.map(async e=>{let r=C.composeId(e);return this._createParticipant({id:r,externalId:Z.fromSignalingParticipant(e),mediaSettings:T(e.mediaSettings),participantState:C.mapParticipantState(e),state:e.state,roles:e.roles||[],status:this._getStatusByTransportState(t)??A.WAITING,muteStates:e.muteStates||{},unmuteOptions:e.unmuteOptions||[],observedIds:e.observedIds||[],markers:this._denormalizeMarkers(r,e.markers),isInRoom:n!==null},e.decorativeUserId)})||[]),s=!1;for(let e of o)e.id===this._conversation?.compositeUserId&&(s=!0),this._registerParticipantInCache(e);this._transport?.getState()===q.IDLE&&!this._isCalledState()&&this._openTransport(o,!0);let c=[],l=[];if(e?.removedParticipantMarkers){for(let t of e.removedParticipantMarkers)if(t.GRID?.id){let e=this._getExternalIdByParticipantId(t.GRID.id);l.push(e)}c=await Promise.all(l)}if(s&&await this._onRoomSwitched(n),c){let e=this._conversation?.pinnedParticipantIdByRoom.get(n);if(e){let t=await this._getExternalIdByParticipantId(e);if(t){for(let e of c)if(Z.compare(t,e)){this._conversation?.pinnedParticipantIdByRoom.delete(n);break}}}}let u={roomId:n,participantCount:e.participantCount,addedParticipantIds:i,addedParticipants:C.mapSharedParticipants(o),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:c};this._isCalledState()||P.onRoomParticipantsUpdated(u)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let n=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){P.onRoomStart(e);return}this._isCalledState()||P.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,n),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let n=t?.rooms?.rooms??[],r=[];for(let t of n){let n=t.id??null;if(this._setMuteStatesForRoomId(t.muteStates,n),this._conversation?.recordsInfoByRoom.set(n,t.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(n,t.pinnedParticipantId??null),t.asrInfo&&this._conversation?.asrInfoByRoom.set(n,t.asrInfo),t.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(n,t.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(n),e){let e=await this._getParticipants();await this._registerParticipants(t?.participants?.participants?.filter(t=>!e[C.composeId(t)])||[],!0);let n=await this._convertRoomToExternal(t);n&&r.push(n)}}r.length&&!this._isCalledState()&&P.onRoomsUpdated({[ha.UPDATE]:{rooms:r}})}async _onFeedback(e){let t=[];for(let n of e.feedback){let e={...n,items:[]};for(let t of n.items){let n=await this._getExternalIdByParticipantId(t.participantId);n?e.items.push({...t,participantId:n}):this._warnParticipantNotInConversation(t.participantId)}t.push(e)}P.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:n,decorativeExternalParticipantId:r}=e,i=this._isMe(t);R.debug(`Decorative participant id changed [${t}]`,e);let a=await this._getExternalIdByParticipantId(t);if(!a){this._warnParticipantNotInConversation(t);return}let o=Z.fromSignaling(r,a.deviceIdx);if(P.onParticipantIdChanged(a,o),this._api.cacheExternalId(n,o),this._api.mapDecorativeId(n,t),i)this._conversation.externalId=o;else{let e=await this._getParticipants();e[t].externalId=o}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!==J.SERVER||(R.debug(`Video suspend suggested`,e),P.onVideoSuspendSuggest(e.bandwidth))}async _onParticipantHold(e){R.debug(`Participant hold suggested`,e);let t=await this._getParticipant(e.participantId);e.hold?this._setParticipantsStatus([t],A.ONHOLD):this._setParticipantsStatus([t],A.CONNECTED)}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()===J.SERVER&&this._transport?.getState()===q.IDLE&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){let n=this._createParticipant(e,t);n.catch(()=>void 0),this._pendingParticipants.set(e.id,n)}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.entries()),t=await Promise.allSettled(e.map(e=>e[1])),n=null;for(let r=0;r<t.length;r++){let[i]=e[r];this._pendingParticipants.delete(i);let a=t[r];if(a.status===`fulfilled`){let e=a.value;this._participants[e.id]=e;continue}n=n??a.reason,R.warn(`Failed to resolve pending participant [${i}]`,a.reason)}if(n)throw n}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}},Xa=null,Za=class e extends Error{constructor(t,n){super(t),g(this,`participantErrors`,void 0),Object.setPrototypeOf(this,e.prototype),this.participantErrors=n}},Qa=null,$a=null;function eo(){Qa=null,$a=null}function to(e){return e?.endsWith(`/`)?e.slice(0,-1):e}async function no(e=null,t){let n=to(e??w.apiBaseUrl);if(n)return n;if((t??w.apiEnv)!==`AUTO`)return w.apiEndpoint(t);try{let e=atob(`aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ=`),t=(await(await fetch(e,{method:`GET`,mode:`cors`,cache:`no-cache`})).json())?.Answer[0]?.data;if(!t)throw Error(`Wrong DNS response`);return R.debug(`Resolved API endpoint`,t),t}catch(e){return R.warn(`Failed to resolve API endpoint using DNS, default is used`,e),w.apiEndpoint(t)}}async function ro(){return Qa||$a||($a=no(),Qa=await $a,$a=null,Qa)}async function io(e,t={},n=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await ro();let r=co(e,t,n),i=new window.Blob([r],{type:`application/x-www-form-urlencoded`});window.navigator.sendBeacon(`${Qa}/fb.do`,i)}async function ao(e,t={},n=!1,r){return await ro(),oo(co(e,t,n),r)}async function oo(e,t){let n=`${t??Qa}/fb.do`,r=new AbortController,i=setTimeout(()=>r.abort(new D(E.NETWORK_ERROR)),w.apiTimeout),a=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:e,signal:r.signal});clearTimeout(i);let o=await a.text(),s;try{s=JSON.parse(o)}catch{s={result:o}}if(!a.ok||Object.hasOwn(s,`error_msg`))throw s;return s}async function so(e,t){try{let n=await fetch(e,{method:`POST`,body:t});if(!n.ok)throw Error(`HTTP error! status: ${n.status}`);let r=await n.text();R.debug(`Form data sent successfully`,r)}catch(e){throw R.warn(`Failed to send form data`,e),e}}function co(e,t={},n=!1){t.method=e,t.format=`JSON`,t.application_key||(t.application_key=w.apiKey),n||(x.sessionKey?t.session_key=x.sessionKey:x.accessToken&&(t.access_token=x.accessToken));for(let[e,n]of Object.entries(t))typeof n==`object`&&(t[e]=JSON.stringify(n));let r=``;for(let[e,n]of Object.entries(t))r&&(r+=`&`),r+=`${e}=${encodeURIComponent(n)}`;return r}var lo=class{constructor(){g(this,`_abortSignal`,void 0)}setAbortSignal(e){this._abortSignal=e}async createJoinLink(e){return{join_link:`nop`}}async removeJoinLink(e){return{success:!0}}async getAnonymTokenByLink(e,t){return``}log(e){}logClientStats(e){}logClientEvents(e){}getCachedOkIdByExternalId(e){return null}cacheExternalId(e,t){}mapDecorativeId(e,t){}unmapDecorativeId(e){}getDecorativeIdByInitialId(e){}replaceByInitialIdIdIfExists(e){return typeof e==`string`?parseInt(e,10):e}hangupConversation(e,t=E.HUNGUP){}async removeHistoryRecords(e){}async getServerTime(){return Date.now()}cleanup(){}},uo=700,fo=3e3,po=class extends lo{constructor(...e){super(...e),g(this,`_userId`,null),g(this,`_uuid`,void 0),g(this,`_externalUidsCache`,new Map),g(this,`_decorativeIdToInitialId`,new Map),g(this,`_initialIdToDecorativeId`,new Map)}async _callUnsafe(e,t={},n=!1){let r=async i=>{try{return await ao(e,t,n)}catch(t){if(!Object.hasOwn(t,`error_msg`)){i++;let n=Object.getOwnPropertyNames(t).map(e=>`${e}: ${JSON.stringify(t[e])}`);if(R.debug(`${e} network error, attempt ${i}: ${n.join(`
20
+ `)}`),this._abortSignal?.aborted&&(R.debug(`${e} aborted`),this._abortSignal.throwIfAborted()),i<w.apiMaxAttempt)return await C.delay(Math.min(i*uo,fo),{signal:this._abortSignal}),r(i)}throw R.warn(e,`error`,t),t}};return r(0)}async _call(e,t={},n=!1){try{return await this._callUnsafe(e,t,n)}catch(r){R.warn(`Api call error`,r);let i=v.API;switch(r.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,n)}let a={message:r.error_msg,code:r.error_code};if(r instanceof D)throw r;if(r.custom_error&&(a.custom_error=r.custom_error),mo(r))switch(r.error_code){case 1101:i=E.SERVICE_DISABLED;break;case 4:r.error_msg.includes(`participants.limit.exceeded`)&&(i=E.PARTICIPANT_LIMIT_REACHED);break;case 300:i=E.NOT_FOUND;break;case 1102:i=E.CALLEE_IS_OFFLINE;break;case 1103:i=E.NOT_FRIENDS;break;case 1104:case 1106:i=E.EXTERNAL_API_ERROR;break;case 1113:i=E.CALLER_IS_REJECTED;break;case 1114:i=E.VCHAT_DETAILED_ERROR;break;case 2:i=E.SERVICE_UNAVAILABLE;break}throw new D(i,a)}}async userId(e){let t=C.extractOkId(e);if(x.isEmpty())return Z.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let n=this.getDecorativeIdByInitialId(t);return n&&(t=n),Z.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!w.apiKey)throw new D(v.API,{message:`Required argument apiAppKey not passed`});let e={session_data:{version:2,device_id:this._uuid,client_version:w.appVersion,client_type:`SDK_JS`}};return w.authToken&&(e.session_data.auth_token=w.authToken,e.session_data.version=3),this._callUnsafe(`auth.anonymLogin`,e,!0).then(e=>{e.uid&&(this._userId=Number(e.uid)),x.sessionKey=e.session_key,x.sessionSecretKey=e.session_secret_key}).catch(e=>{throw e.error_code===401&&P.onTokenExpired(),new D(v.AUTH,{message:e.error_msg,code:e.error_code})})}logClientStats(e){let t={app_version:String(w.appVersion),sdk_type:`WEB`,sdk_version:w.sdkVersion,version:1,items:e};w.clientStatsPlatform&&(t.platform=w.clientStatsPlatform),io(`vchat.clientStats`,{data:JSON.stringify(t)})}logClientEvents(e){let t={app_version:String(w.appVersion),sdk_type:`WEB`,sdk_version:w.sdkVersion,version:1,items:e};w.clientStatsPlatform&&(t.platform=w.clientStatsPlatform),io(`vchat.clientEvents`,{data:JSON.stringify(t)})}async uploadDebugLogs(e,t,n,r){let i={conversationId:e,webrtcPlatform:w.platform,startTime:t,endTime:n},a=await this._callUnsafe(`vchat.getLogUploadUrl`,i),o=new FormData,s=new Blob([r],{type:`application/json`});o.append(`file`,s,`log.json`);let c=new URL(a.upload_url);return c.searchParams.append(`size`,s.size.toString()),so(c.toString(),o)}async joinConversation(e,t=!1,n){let r={conversationId:e,isVideo:t,protocolVersion:w.protocolVersion,capabilities:Ji.getFlags()};return n&&(r.chatId=n),this._call(`vchat.joinConversation`,r)}async createConversation(e,t=``,n=!1,{onlyAdminCanShareMovie:r,audienceMode:i,audioOnly:a,waitForAdmin:o,closedConversation:s}={},c){let l=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:n,onlyAdminCanShareMovie:r,waitForAdmin:o,closedConversation:s,audienceMode:i,audioOnly:a,speakerIds:c});return this._startConversation(l)}async startConversation(e,t,n,r=!1,i=``,a=!1,o=!1,{onlyAdminCanShareMovie:s,waitForAdmin:c}={},l){let u=this._preareStartConversationData({conversationId:e,isVideo:r,joiningAllowed:a,payload:i,requireAuthToJoin:o,onlyAdminCanShareMovie:s,waitForAdmin:c,externalIds:l});if(t&&t.length)switch(n){case ca.USER:u.uids=t.join(`,`);break;case ca.GROUP:u.gid=t[0];break;case ca.CHAT:u.chatId=t[0];break}return this._startConversation(u)}_ensureUuid(){if(!this._uuid){let e=Be.get(`uuid`);e||(e=C.uuid(),Be.set(`uuid`,e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:n=``,joiningAllowed:r=!1,requireAuthToJoin:i=!1,onlyAdminCanShareMovie:a,waitForAdmin:o,audienceMode:s=!1,audioOnly:c=!1,speakerIds:l=[],closedConversation:u=!1,externalIds:d}){let f={conversationId:e,isVideo:t,protocolVersion:w.protocolVersion};return r&&(f.createJoinLink=!0),n&&(f.payload=n),w.domain&&(f.domainId=w.domain),w.externalDomain&&(f.externalDomain=w.externalDomain),i&&(f.requireAuthToJoin=!0),a!==void 0&&(f.onlyAdminCanShareMovie=a),o!==void 0&&(f.waitForAdmin=o),s&&(f.audienceMode=s),c&&(f.audioOnly=c),l.length&&(f.speakerIds=l.map(e=>C.composeUserId(e)).join(`,`)),u&&(f.closed=u),d&&(f.externalIds=d.map(Z.toSignaling).join(`,`)),f}async _startConversation(e){return this._call(`vchat.startConversation`,e)}async createJoinLink(e){return this._call(`vchat.createJoinLink`,{conversationId:e})}async removeJoinLink(e){return this._call(`vchat.removeJoinLink`,{conversationId:e})}async getAnonymTokenByLink(e,t){let n={joinLink:e};t&&(n.anonymName=t);let r=await this._call(`vchat.getAnonymTokenByLink`,n);return this._userId=Number(r.uid),r.token}async joinConversationByLink(e,t=!1,n,r){let i={joinLink:e,isVideo:t,protocolVersion:w.protocolVersion,capabilities:Ji.getFlags()};return n?.length&&(i.observedIds=n.join(`,`)),w.anonymToken&&(i.anonymToken=w.anonymToken),r&&(i.payload=r),this._call(`vchat.joinConversationByLink`,i)}async getOkIdsByExternalIds(e){let t=[],n=[],r=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let o of e){let e=Z.toString(o),s=a.indexOf(e);s>-1?t.push(this.replaceByInitialIdIdIfExists(i[s])):(r.set(String(o.id),e),n.push({id:o.id,ok_anonym:o.type===ba.ANONYM}))}return n.length&&(await this._call(`vchat.getOkIdsByExternalIds`,{externalIds:n})).ids.forEach((e,n)=>{let i=Number(e.ok_user_id),a=String(e.external_user_id.id);r.has(a)&&(this.cacheExternalId(i,Z.fromString(r.get(a))),t.push(i))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,n=Array.from(this._externalUidsCache.keys()),r=Array.from(this._externalUidsCache.values());for(let i of e){let e=Z.toString(i),a=r.indexOf(e);if(a>-1){let e=C.composeParticipantId(this.replaceByInitialIdIdIfExists(n[a]),S.USER,i.deviceIdx);t.set(i,e)}}return t}async getExternalIdsByOkIds(e){let t=[],n=[];for(let r of e)if(this._externalUidsCache.has(r)){let e=this.getDecorativeIdByInitialId(r),n=this._externalUidsCache.get(e??r);t.push(Z.fromString(n))}else n.push(r);if(!n.length)return t;let r=await this._getExternalIdsByOkIds(n);return Array.from(r.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),n=Array.from(this._externalUidsCache.values()),r=Z.toString(e),i=n.indexOf(r);return i>-1?C.composeParticipantId(this.replaceByInitialIdIdIfExists(t[i]),S.USER,e.deviceIdx):i>-1?C.composeParticipantId(t[i],S.USER,e.deviceIdx):null}cacheExternalId(e,t){let n=C.extractOkId(e);this._externalUidsCache.set(n,Z.toString(t))}mapDecorativeId(e,t){let n=C.extractOkId(e),r=C.extractOkId(t);this._decorativeIdToInitialId.set(n,r),this._initialIdToDecorativeId.set(r,n)}unmapDecorativeId(e){let t=C.extractOkId(e),n=this.getDecorativeIdByInitialId(t);n&&this._decorativeIdToInitialId.delete(n),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=C.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=C.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}async getConversationParams(e){let t={};return w.anonymToken&&(t.anonymToken=w.anonymToken),e&&(t.conversationId=e),this._call(`vchat.getConversationParams`,t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e,t=E.HUNGUP){let n={conversationId:e,reason:t};w.anonymToken&&(n.anonymToken=w.anonymToken),io(`vchat.hangupConversation`,n)}async removeHistoryRecords(e){await this._call(`vchat.removeHistoryRecords`,{recordIds:e.join(`,`)})}cleanup(){this._decorativeIdToInitialId=new Map,this._initialIdToDecorativeId=new Map}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(e=>this.getDecorativeIdByInitialId(e)??e);try{let n=await this._call(`vchat.getExternalIdsByOkIds`,{uids:e.join(`,`)}),r=(e,n)=>{for(let[r,i]of Object.entries(e)){let e=Number(r),a=Z.fromId(i,n);t.set(e,a),this.cacheExternalId(e,a)}};n.external_ids&&r(n.external_ids,ba.USER),n.anonym_ids&&r(n.anonym_ids,ba.ANONYM);for(let n of e){let e=Number(n);if(!t.has(e)){let n=Z.fromId(String(e));t.set(e,n),this.cacheExternalId(e,n)}}return t}catch{return t}}async getServerTime(){return(await this._call(`system.getInfo`)).serverTime}};function mo(e){return typeof e==`object`&&!!e&&`error_code`in e&&`error_msg`in e}var ho=function(e){return e.KING=`KING`,e.PAWN=`PAWN`,e}(ho||{}),go=function(e){return e.OFF=`0`,e.ON=`1`,e}({}),_o=class{constructor(e){g(this,`_queue`,void 0),g(this,`_readCursor`,void 0),g(this,`_writeCursor`,void 0),g(this,`_moveReadCursor`,void 0),g(this,`_left`,void 0),this._queue=Array(e).fill(null),this._readCursor=this._writeCursor=this._left=0,this._moveReadCursor=!1}get length(){return this._queue.length}get left(){return this._left}toArray(){return Array.from(this._queue)}add(e){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=e,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(e){return(e+1)%this._queue.length}next(){let e=this._queue[this._readCursor];return e&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),--this._left),e}},vo=class{constructor(e,t,n,r=null){g(this,`_uuid`,void 0),g(this,`_apiKey`,void 0),g(this,`_callToken`,void 0),g(this,`_apiEnv`,void 0),g(this,`_baseApiUrl`,void 0),g(this,`_sessionKey`,void 0),this._uuid=C.uuid(),this._apiKey=t,this._callToken=n,this._apiEnv=e,this._baseApiUrl=r}async authorize(){let e=await ao(`auth.anonymLogin`,{session_data:{device_id:this._uuid,client_version:w.appVersion,client_type:`SDK_JS`,auth_token:this._callToken,version:3},application_key:this._apiKey},!0,await no(this._baseApiUrl,this._apiEnv));return C.isObject(e)&&!(`error_msg`in e)?(this._sessionKey=e.session_key,!0):!1}async hangupConversation(e){await ao(`vchat.hangupConversation`,{conversationId:e,reason:E.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},!0,await no(this._baseApiUrl,this._apiEnv))}},$,yo=null,bo={getCameras:I.getCameras,getMicrophones:I.getMicrophones,getOutput:I.getOutput,getVideoFacingMode:I.getVideoFacingMode,hasCamera:I.hasCamera,hasMicrophone:I.hasMicrophone,getSavedCamera:I.getSavedCamera,getSavedMicrophone:I.getSavedMicrophone,getSavedOutput:I.getSavedOutput,hasCameraPermission:I.hasCameraPermission,hasMicrophonePermission:I.hasMicrophonePermission,hasPermissions:I.hasPermissions,getUserMedia:I.getUserMedia,getUserVideo:I.getUserVideo,getUserAudio:I.getUserAudio,setResolution:I.setResolution,isBrowserSupported:I.isBrowserSupported,isScreenCapturingSupported:I.isScreenCapturingSupported,os:I.os,isMobile:I.isMobile,browserName:I.browserName,browserVersion:I.browserVersion,baseChromeVersion:I.baseChromeVersion,getAudioContext:I.getAudioContext,isAudioShareSupported:I.isAudioShareSupported},xo={participantMarkerCompare:C.participantMarkerCompare};function So(e){yo=e}function Co(e){w.videoEffects=e}function wo(e){w.audioEffects=e}function To(e,t=null,n={},r=1){w.vmoji=e,w.vmojiOptions={protocolVersion:r,renderingOptions:n},t&&e.setSDK(t)}async function Eo(e){if(w.set(e),$||($=new po),c.default.disableLog(!w.debug),R.toggle(w.debug),R.log(`Calls SDK ${w.sdkVersion}`,e),await I.init(),!I.isBrowserSupported())throw new D(v.UNSUPPORTED);R.log(`UserAgent:`,navigator.userAgent),R.log(`Screen resolution:`,`${window.screen.width}x${window.screen.height}`),R.log(`Permissions:`,`Camera: ${I.hasCameraPermission()}, Mic: ${I.hasMicrophonePermission()}`),R.log(`Simulcast:`,`${e.simulcast} => ${w.simulcast}`)}async function Do(e,t=[y.AUDIO],n=``,r=!1,i=!1,a,o,s){let c=[];return Array.isArray(e)?c=e.length?e:[]:e&&(c=[e]),Oo([],ca.USER,t,n,r,i,a,c,o,s)}async function Oo(e,t=ca.USER,n,r=``,i=!1,a=!1,o,s,c,l){return new Q($,yo).onStart({opponentIds:e,opponentType:t,mediaOptions:n,payload:r,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:c,conversationId:l})}async function ko(e,t){return Ao(e,S.USER,void 0,t)}async function Ao(e,t=S.USER,n,r,i,a){if(e===Q.id())throw Error(`Push has already been processed`);a&&$.setUserId(a);let o=new Q($,yo);if(await o.onPush(e,t,n,r,i),z.getAll().length>1)if(w.get(`onCallActive`))P.onCallActive(o.id);else{R.log(`Push rejected (busy) — no onCallActive handler`),await o.decline();return}}async function jo(e,t){return e&&(w.authToken=e),t!==void 0&&w.apiBaseUrl!==t&&(w.apiBaseUrl=t,eo()),$.authorize()}async function Mo(e=[y.AUDIO],t){return ec(t).accept(e)}async function No(e){let t=$s(e);if(t)return t.decline()}async function Po(e,t=[y.AUDIO]){return Fo(e,t)}async function Fo(e,t,n){return new Q($,yo).onJoin({conversationId:e,mediaOptions:t,chatId:n})}async function Io(e,t=[y.AUDIO],n,r,i,a){return n&&(w.anonymToken=n),new Q($,yo).onJoin({joinLink:e,mediaOptions:t,observedIds:r,payload:i,onFastJoin:a})}async function Lo(e){let t=$s(e);if(t)return t.hangup();Q.hangupAfterInit()}async function Ro(e,t){let n=Array.isArray(e)?e:[e],r=Q.current();r&&await r.addParticipant(n,t)}async function zo(e,t){let n=Q.current();if(n){let r=e.map(e=>C.composeUserId(e));await n.addParticipantLegacy(r,t)}}async function Bo(e,t=!1){return Vo((await $.getOkIdsByExternalIds([e]))[0],t)}async function Vo(e,t=!1){let n=Q.current();if(n)try{await n.removeParticipant(C.composeUserId(e),t)}catch(t){R.warn(`Failed to remove participant ${e}. Perhaps he is no longer on the call. ${t}`)}}async function Ho(e,t){let n=Q.current();if(e===`videoinput`&&dt.contains(t))return w.videoFacingMode=t,n?(I.isMobile()&&n.stopVideoTrack(),n.changeDevice(e)):void 0;if(!await I._saveDeviceId(e,t))throw Error(`Device not found: ${t}`);if(n)return n.changeDevice(e)}async function Uo(e,t){let n=typeof e==`object`?{...e,fastScreenSharing:e.captureScreen&&e.fastScreenSharing,captureAudio:e.captureScreen&&e.captureAudio&&w.audioShare}:{captureScreen:e,fastScreenSharing:!1,captureAudio:!1},r=$s(t);return r?r.toggleScreenCapturing(n):Promise.reject()}function Wo(e){let t=Q.current();t&&t.toggleAnimojiCapturing(e)}async function Go(e,t=!1){let n=Q.current();n&&await n.setVideoStream(e,t)}async function Ko(e,t){let n=$s(t);n&&await n.toggleLocalVideo(e)}async function qo(e,t){let n=$s(t);n&&await n.toggleLocalAudio(e)}async function Jo(e){let t=Q.current();if(t)return t.setLocalResolution(e)}async function Yo(e){let t=Q.current();t&&await t.changePriorities(e)}async function Xo(e,t){let n=Q.current();if(n){let r;if(t){let[e]=await $.getOkIdsByExternalIds([t]);r=C.composeParticipantId(e,S.USER,t.deviceIdx)}await n.changeParticipantState(e,r)}}async function Zo(){let e=Q.current();e&&await e.putHandsDown()}async function Qo(e){let t=Q.current();t&&await t.updateDisplayLayout(e)}async function $o(e,t,n=!1){return es((await $.getOkIdsByExternalIds([e]))[0],Z.getDeviceIdx(e),t,n)}async function es(e,t,n,r=!1){let i=Q.current();i&&await i.grantRoles(C.composeParticipantId(e,S.USER,t),n,r)}async function ts({externalId:e=null,muteStates:t,requestedMedia:n=[],roomId:r=null}){let i=null;return e&&(i=(await $.getOkIdsByExternalIds([e]))[0]),ns({uid:i,muteStates:t,requestedMedia:n,deviceIdx:Z.getDeviceIdx(e),roomId:r})}async function ns({uid:e=null,muteStates:t,requestedMedia:n=[],deviceIdx:r=0,roomId:i=null}){let a=Q.current();if(a){let o=e?C.composeParticipantId(e,S.USER,r):null;await a.muteParticipant(o,t,n,i)}}async function rs(e,t=!1,n=null){return is((await $.getOkIdsByExternalIds([e]))[0],t,Z.getDeviceIdx(e),n)}async function is(e,t=!1,n=0,r=null){let i=Q.current();i&&await i.pinParticipant(C.composeParticipantId(e,S.USER,n),t,r)}async function as(e){let t=Q.current();t&&await t.updateMediaModifiers(e)}async function os(e){let t=Q.current();t&&await t.enableVideoSuspend(e)}async function ss(e){let t=Q.current();t&&await t.enableVideoSuspendSuggest(e)}async function cs(e){let t=Q.current();t&&await t.changeOptions(e)}async function ls(e,t=null){let n=null;return t&&(n=(await $.getOkIdsByExternalIds([t]))[0]),us(e,n)}async function us(e,t=null){let n=Q.current();if(n){let r=t?C.composeUserId(t):null;await n.chatMessage(e,r)}}async function ds(e=10){let t=Q.current();if(t)return t.chatHistory(e)}async function fs(e,t=null){let n=null;return t&&(n=(await $.getOkIdsByExternalIds([t]))[0]),ps(e,n,Z.getDeviceIdx(t))}async function ps(e,t=null,n=0){let r=Q.current();if(r){let i=t?C.composeParticipantId(t,S.USER,n):null;await r.customData(e,i)}}async function ms(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,waitForAdmin:r=!1,closedConversation:i=!1}={},a){return(await $.createConversation(a??C.uuid(),e,t,{onlyAdminCanShareMovie:n,waitForAdmin:r,closedConversation:i})).join_link}async function hs(e=``,t=!1,{onlyAdminCanShareMovie:n=!1,audioOnly:r=!1}={},i){let a=Z.fromIds(i),o=await $.getOkIdsByExternalIds(a);return(await $.createConversation(C.uuid(),e,t,{onlyAdminCanShareMovie:n,audienceMode:!0,audioOnly:r},o)).join_link}async function gs(){let e=Q.current();return e?e.createJoinLink():Promise.reject()}async function _s(){let e=Q.current();return e?e.removeJoinLink():Promise.reject()}async function vs(e,t){return $.getAnonymTokenByLink(e,t)}function ys(e){let t=Q.current();t&&t.setVolume(e)}function bs(e){w.forceRelayPolicy=e}async function xs(e=!1,t=null,n=null,r=`DIRECT_LINK`,i=null,a=null){let o=Q.current();return o?o.startStream(e,t,n,r,i,a):Promise.reject()}async function Ss(e=null,t){let n=Q.current();return n?n.stopStream(e,t):Promise.reject()}async function Cs(e=null){let t=Q.current();return t?t.publishStream(e):Promise.reject()}async function ws(e,t,n=!1,r=null){let i=Q.current();if(!i)return Promise.reject();let a,o,s=[];if(t?.length&&s.push(...t),e&&s.push(e),s.length){let t=await $.getParticipantIdsByExternalIds(s);e&&(a=t.get(e),t.delete(e)),o=Array.from(t.values())}return i.recordSetConf(a,o,n,r)}async function Ts(){let e=Q.current();return e?e.getStreamInfo():Promise.reject()}async function Es(e){let t=Q.current();return t?t.addMovie(e):Promise.reject()}async function Ds(e){let t=Q.current();return t?t.updateMovie(e):Promise.reject()}async function Os(e){let t=Q.current();return t?t.removeMovie(e):Promise.reject()}async function ks(e,t){let n=Q.current();if(n){let r=[];for(let t of e){let e,n;t.addParticipantIds&&(e=(await $.getOkIdsByExternalIds(t.addParticipantIds)).map(e=>C.composeUserId(e))),t.removeParticipantIds&&(n=(await $.getOkIdsByExternalIds(t.removeParticipantIds)).map(e=>C.composeUserId(e))),r.push({id:t.id,name:t.name,participantCount:t.participantCount,addParticipantIds:e,removeParticipantIds:n,countdownSec:t.countdownSec})}return n.updateRooms(r,t)}return Promise.reject()}async function As(e,t){let n=Q.current();return n?n.activateRooms(e,t):Promise.reject()}async function js(e=null,t=null){let n=Q.current();if(!n)return Promise.reject();let r;if(t){let e=await $.getOkIdsByExternalIds([t]),n=Z.getDeviceIdx(t);r=C.composeParticipantId(e[0],S.USER,n)}return n.switchRoom(e,r)}async function Ms(e){let t=Q.current();return t?t.removeRooms(e):Promise.reject()}function Ns(e){w.statisticsInterval=e;let t=Q.current();if(t)return t.updateStatisticsInterval()}function Ps(e){c.default.disableLog(!e),R.toggle(e)}function Fs(e,...t){w.debugLog&&R.send(e,`[external]`,...t)}async function Is(){let e=wt.conversationId;if(!e)throw R.error(`[uploadDebugLogs]`,`No conversation id found`),Error(`No conversation id found`);let t=wt.collectLogs();if(t.length===0)throw R.error(`[uploadDebugLogs]`,`No logs found`),Error(`No logs found`);let n=wt.startTime,r=wt.endTime;try{return $?.uploadDebugLogs(e,n,r,JSON.stringify(t))}catch(e){throw R.error(`[uploadDebugLogs]`,`Error while uploading logs`,e),Error(`Error while uploading logs`,{cause:e})}}async function Ls(e){let t=Q.current();if(t)return t.videoEffect(e)}async function Rs(e,t){let n=Q.current();if(n)return n.audioEffect(e.length>0?e:null,t)}async function zs(e){let t=Q.current();t&&await t.setAudioStream(e)}async function Bs(e,t=null,n=null){let r=Q.current();if(!r)return;let i=n??t?.id,a=null;if(t){let e=(await $.getOkIdsByExternalIds([t]))[0];if(!e)throw Error(`Could not get user id to set animoji svg`);a=C.composeParticipantId(e,S.USER,Z.getDeviceIdx(t))}r.setAnimojiSvg(e,a,i)}function Vs(e){let t=Q.current();t&&t.setAnimojiFill(e)}async function Hs(e=null,t,n=!1){return ec().getWaitingHall(e,t,n)}async function Us(){return ec().getAudienceModeHands()}async function Ws(e,t=!1){let n=ec(),r;if(e){let[t]=await $.getOkIdsByExternalIds([e]);r=C.composeUserId(t)}return n.promoteParticipant(r,t)}async function Gs(e=!1){return ec().requestPromotion(e)}async function Ks(e=!1){return ec().acceptPromotion(e)}async function qs(e){return ec().getParticipantListChunk(e)}async function Js(e){return ec().getParticipants(e)}async function Ys(e){return ec().feedback(e)}function Xs(e,t,n){return ec().userFeedbackStats(e,t,n)}function Zs(e,t={},n=!1){let r=Q.current();r&&r.sendClientEvent(e,t,n)}async function Qs(e,t){return ec().enableFeatureForRoles(e,t)}function $s(e){return e?z.get(e)??null:Q.current()}function ec(e){let t=$s(e);if(!t)throw Error(`Conversation not found`);return t}async function tc(e){await $.removeHistoryRecords(e)}async function nc(e){let t=Q.current();t&&await t.startAsr(e)}async function rc(e){let t=Q.current();t&&await t.stopAsr(e)}async function ic(e){let t=Q.current();t&&await t.requestAsr(e)}async function ac(e){let t=Q.current();return t?t.startUrlSharing(e):Promise.reject()}async function oc(){let e=Q.current();return e?e.stopUrlSharing():Promise.reject()}async function sc(e){await z.setActive(e)}function cc(){return z.getActiveId()}function lc(){return w.sdkVersion}typeof window<`u`&&(window.__CALLS_SDK=be),exports.Api=po,exports.ApiExternal=vo,exports.ArrayDequeue=_o,exports.AuthData=x,exports.BaseLogger=m,exports.CallDirection=Y,exports.CallType=ca,exports.ChatRoomEventType=la,exports.ConversationFeature=ua,exports.ConversationOption=da,exports.DebugMessageType=Gt,exports.ExternalIdType=ba,Object.defineProperty(exports,"FacingMode",{enumerable:!0,get:function(){return dt}}),exports.FatalError=v,exports.HangupReason=D,exports.HangupType=E,exports.MediaOption=y,exports.MediaTrackKind=k,exports.MediaType=V,exports.MuteState=ma,exports.ParticipantState=X,exports.ParticipantStateDataValue=go,exports.ParticipantStatus=A,exports.RecordRole=ho,exports.RoomsEventType=ha,exports.Signaling=sa,exports.SignalingCommandType=B,exports.SignalingConnectionType=Ki,exports.SignalingNotification=G,exports.TransportTopology=J,exports.UserRole=va,exports.UserType=S,exports.VolumeDetector=Ia,exports.acceptCall=Mo,exports.acceptPromotion=Ks,exports.activateRooms=As,exports.addMovie=Es,exports.addParticipant=Ro,exports.addParticipantInternal=zo,exports.authorize=jo,exports.browser=bo,exports.callInternal=Oo,exports.callTo=Do,exports.captureScreen=Uo,exports.captureVmoji=Wo,exports.changeAudioEffect=Rs,exports.changeConversationOptions=cs,exports.changeDevice=Ho,exports.changeParticipantState=Xo,exports.changePriorities=Yo,exports.changeVideoEffect=Ls,exports.chatHistory=ds,exports.chatMessage=ls,exports.chatMessageInternal=us,exports.createJoinLink=gs,exports.customData=fs,exports.customDataInternal=ps,exports.debug=Ps,exports.debugMessage=Fs,exports.declineCall=No,exports.enableFeatureForRoles=Qs,exports.enableVideoSuspend=os,exports.enableVideoSuspendSuggest=ss,exports.feedback=Ys,exports.forceRelayPolicy=bs,exports.getActiveCallId=cc,exports.getAnonymTokenByLink=vs,exports.getAudienceModeHands=Us,exports.getParticipantListChunk=qs,exports.getParticipants=Js,exports.getStreamInfo=Ts,exports.getWaitingHall=Hs,exports.grantRoles=$o,exports.grantRolesInternal=es,exports.hangup=Lo,exports.init=Eo,exports.joinCall=Po,exports.joinCallByLink=Io,exports.joinCallInternal=Fo,exports.logClientEvent=Zs,exports.muteParticipant=ts,exports.muteParticipantInternal=ns,exports.pinParticipant=rs,exports.pinParticipantInternal=is,exports.processPush=ko,exports.processPushInternal=Ao,exports.promoteParticipant=Ws,exports.publishStream=Cs,exports.putHandsDown=Zo,exports.recordSetConf=ws,exports.removeHistoryRecords=tc,exports.removeJoinLink=_s,exports.removeMovie=Os,exports.removeParticipant=Bo,exports.removeParticipantInternal=Vo,exports.removeRooms=Ms,exports.requestAsr=ic,exports.requestPromotion=Gs,exports.setAudioEffects=wo,exports.setAudioStream=zs,exports.setLocalResolution=Jo,exports.setLogger=So,exports.setMediaModifiers=as,exports.setStatisticsInterval=Ns,exports.setVideoEffects=Co,exports.setVideoStream=Go,exports.setVmoji=To,exports.setVmojiFill=Vs,exports.setVmojiSvg=Bs,exports.setVolume=ys,exports.startAsr=nc,exports.startAudienceConversation=hs,exports.startConversation=ms,exports.startStream=xs,exports.startUrlSharing=ac,exports.stopAsr=rc,exports.stopStream=Ss,exports.stopUrlSharing=oc,exports.switchCall=sc,exports.switchRoom=js,exports.toggleLocalAudio=qo,exports.toggleLocalVideo=Ko,exports.updateDisplayLayout=Qo,exports.updateMovie=Ds,exports.updateRooms=ks,exports.uploadDebugLogs=Is,exports.userFeedbackStats=Xs,exports.utils=xo,exports.version=lc;