@vkontakte/calls-sdk 2.8.10-dev.af368d75.0 → 2.8.10-dev.dbd4139e.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 +10 -10
- package/calls-sdk.esm.js +10 -10
- package/classes/Conversation.d.ts +0 -1
- package/classes/MediaSource.d.ts +0 -1
- package/classes/codec/LibVPxEncoder.d.ts +0 -1
- package/classes/screenshare/ScreenCaptureReceiver.d.ts +0 -1
- package/classes/transport/Transport.d.ts +0 -1
- package/enums/Stat.d.ts +1 -9
- package/package.json +2 -2
- package/static/Params.d.ts +19 -77
- package/static/Utils.d.ts +1 -1
- package/classes/stat/StatSdpErrors.d.ts +0 -7
package/calls-sdk.cjs.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @vkontakte/calls-sdk v2.8.10-dev.
|
|
3
|
-
*
|
|
2
|
+
* @vkontakte/calls-sdk v2.8.10-dev.dbd4139e.0
|
|
3
|
+
* Wed, 04 Mar 2026 05:34:19 GMT
|
|
4
4
|
* https://st.mycdn.me/static/callssdk/2-8-10/doc/
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
"use strict";var Ps=Object.create;var _i=Object.defineProperty;var ys=Object.getOwnPropertyDescriptor;var bs=Object.getOwnPropertyNames;var Ms=Object.getPrototypeOf,As=Object.prototype.hasOwnProperty;var Ds=(n,r,e)=>r in n?_i(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var ws=(n,r)=>{for(var e in r)_i(n,e,{get:r[e],enumerable:!0})},Ua=(n,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of bs(r))!As.call(n,i)&&i!==e&&_i(n,i,{get:()=>r[i],enumerable:!(t=ys(r,i))||t.enumerable});return n};var gi=(n,r,e)=>(e=n!=null?Ps(Ms(n)):{},Ua(r||!n||!n.__esModule?_i(e,"default",{value:n,enumerable:!0}):e,n)),ks=n=>Ua(_i({},"__esModule",{value:!0}),n);var c=(n,r,e)=>Ds(n,typeof r!="symbol"?r+"":r,e);var Yd={};ws(Yd,{Api:()=>li,ApiExternal:()=>Vr,ArrayDequeue:()=>Fr,AuthData:()=>be,BaseLogger:()=>Mt,CallDirection:()=>Te,CallType:()=>ct,ChatRoomEventType:()=>Ar,ConversationFeature:()=>Dr,ConversationOption:()=>et,DebugMessageType:()=>va,ExternalIdType:()=>wr,FacingMode:()=>vt,FatalError:()=>se,HangupReason:()=>j,HangupType:()=>y,MediaOption:()=>ce,MediaTrackKind:()=>He,MediaType:()=>Vt,MuteState:()=>je,ParticipantState:()=>Q,ParticipantStateDataValue:()=>Ca,ParticipantStatus:()=>Qi,RecordRole:()=>us,RoomsEventType:()=>si,Signaling:()=>Wt,SignalingCommandType:()=>N,SignalingConnectionType:()=>Ke,SignalingNotification:()=>U,TransportTopology:()=>Fe,UserRole:()=>gt,UserType:()=>ae,VolumeDetector:()=>Pt,acceptCall:()=>Ac,acceptPromotion:()=>Ld,activateRooms:()=>Id,addMovie:()=>gd,addParticipant:()=>xc,addParticipantInternal:()=>Nc,authorize:()=>Mc,browser:()=>vc,callInternal:()=>ms,callTo:()=>yc,captureScreen:()=>Bc,captureVmoji:()=>Fc,changeAudioEffect:()=>Md,changeConversationOptions:()=>ed,changeDevice:()=>Uc,changeParticipantState:()=>Kc,changePriorities:()=>Wc,changeVideoEffect:()=>bd,chatHistory:()=>id,chatMessage:()=>td,chatMessageInternal:()=>Is,createJoinLink:()=>sd,customData:()=>rd,customDataInternal:()=>Es,debug:()=>Cd,debugMessage:()=>Pd,declineCall:()=>Dc,enableFeatureForRoles:()=>Hd,enableVideoSuspend:()=>Xc,enableVideoSuspendSuggest:()=>Zc,feedback:()=>Fd,forceRelayPolicy:()=>ld,getAnonymTokenByLink:()=>cd,getAudienceModeHands:()=>Od,getParticipantListChunk:()=>Ud,getParticipants:()=>Bd,getStreamInfo:()=>_d,getWaitingHall:()=>kd,grantRoles:()=>zc,grantRolesInternal:()=>fs,hangup:()=>Oc,init:()=>Pc,joinCall:()=>wc,joinCallByLink:()=>kc,joinCallInternal:()=>_s,logClientEvent:()=>jd,muteParticipant:()=>Jc,muteParticipantInternal:()=>Ss,pinParticipant:()=>Yc,pinParticipantInternal:()=>vs,processPush:()=>bc,processPushInternal:()=>hs,promoteParticipant:()=>xd,publishStream:()=>md,putHandsDown:()=>$c,recordSetConf:()=>hd,removeHistoryRecords:()=>Gd,removeJoinLink:()=>od,removeMovie:()=>Sd,removeParticipant:()=>Lc,removeParticipantInternal:()=>gs,removeRooms:()=>Td,requestAsr:()=>$d,requestPromotion:()=>Nd,setAudioEffects:()=>Rc,setAudioStream:()=>Ad,setLocalResolution:()=>Gc,setLogger:()=>Ec,setMediaModifiers:()=>Qc,setStatisticsInterval:()=>Rd,setVideoEffects:()=>Tc,setVideoStream:()=>Vc,setVmoji:()=>Cc,setVmojiFill:()=>wd,setVmojiSvg:()=>Dd,setVolume:()=>dd,startAsr:()=>Wd,startAudienceConversation:()=>nd,startConversation:()=>ad,startStream:()=>pd,startUrlSharing:()=>qd,stopAsr:()=>Kd,stopStream:()=>ud,stopUrlSharing:()=>zd,switchRoom:()=>Ed,toggleLocalAudio:()=>Hc,toggleLocalVideo:()=>jc,updateDisplayLayout:()=>qc,updateMovie:()=>fd,updateRooms:()=>vd,uploadDebugLogs:()=>yd,userFeedbackStats:()=>Vd,utils:()=>Ic,version:()=>Jd});module.exports=ks(Yd);var Pa=gi(require("webrtc-adapter"));var Mt=class{log(r,e,t=!1){}destroy(){}};var oe=class{constructor(){c(this,"_handlers",{});c(this,"_listeners",[])}_triggerEvent(r,...e){if(Object.hasOwn(this._handlers,r))for(let t of this._handlers[r])t.apply(this,e)}addEventListener(r,e){if(typeof e!="function")throw new Error("Listener should be a function");return Object.hasOwn(this._handlers,r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!Object.hasOwn(this._handlers,r))return;e||delete this._handlers[r];let t=this._handlers[r].indexOf(e);t>=0&&this._handlers[r].splice(t,1)}subscribe(r,e,t){let i=r.addEventListener(e,t);this._listeners.push(i)}unsubscribe(){this._listeners.forEach(r=>{r.dispose()})}};var fi=class extends oe{get ready(){return!0}setParticipantIdRegistry(r){}requestRealloc(){}setEndpoint(r){}setWebTransportEndpoint(r){}setConversationId(r){}readyToSend(r=!0){}cleanup(){}requestTestMode(r,e){}getNextCommandSequenceNumber(){return 0}};var Ba=(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.CALL_TIMEOUT="CALL_TIMEOUT",ee))(Ba||{}),y=Ba;var j=class n extends Error{constructor(e,t){super();c(this,"message");c(this,"hangup");c(this,"error");c(this,"code");c(this,"remote");c(this,"custom_error");this.name="HangupReason",this.code=t&&t.code||0,this.remote=t&&t.remote||!1,this.custom_error=t?.custom_error??null,Object.values(y).indexOf(e)>-1?this.hangup=e:this.error=e;let i=[];this.error&&i.push("error"),this.remote&&i.push("remote"),this.code&&i.push(`code: ${this.code}`),t&&t.message&&i.push(`message: '${t.message}'`),this.message=e+(i.length?` (${i.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,n)}};var Ee=class Ee extends Mt{constructor(e,t){super();c(this,"_externalLogger");c(this,"_api");c(this,"_batchInterval",3e3);c(this,"_batchedLogItems",[]);c(this,"_batchedClientStats",[]);c(this,"_batchedClientEvents",[]);c(this,"_batchTimeout",null);c(this,"_serverTimeDelta",0);this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}static setConversationIdProvider(e){Ee._conversationIdProvider=e}static create(e,t){Ee._instance||(Ee._instance=new Ee(e,t))}static log(e,t,i=!1){Ee._instance&&Ee._instance.log(e,t,i)}static logCustom(e,t,i=!1){Ee._instance&&Ee._instance.logCustom(e,t,i)}static logClientStats(e,t=!1){Ee._instance&&Ee._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){Ee._instance&&Ee._instance.logClientEvent(e,t)}static destroy(){Ee._instance&&Ee._instance.destroy(),Ee._instance=null}log(e,t,i=!1){let a={};typeof t<"u"&&(a.param=t),this._logInternal(e,a,i),this._externalLogger&&this._externalLogger.log(e,t,i)}logCustom(e,t,i=!1){this._logInternal(e,t,i)}logClientStats(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(i).forEach(a=>{i[a]===void 0&&delete i[a]}),this._batchedClientStats.push(i),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(i),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}_logInternal(e,t,i){let a={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:this._getConversationId()}),uid:this._api.getUserId()};this._batchedLogItems.push(a),(i||!this._batchTimeout)&&this._sendBatch()}_getConversationId(){if(Ee._conversationIdProvider)try{return Ee._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedLogItems.length>0&&(this._sendLogItems(this._batchedLogItems),this._batchedLogItems=[],e=!0),this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendLogItems(e){this._api.log(e)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}};c(Ee,"_instance"),c(Ee,"_conversationIdProvider",null);var R=Ee;var L=require("messagepack");var Fa=(x=>(x.RECOVER="recover",x.ACCEPT_CALL="accept-call",x.ADD_PARTICIPANT="add-participant",x.REMOVE_PARTICIPANT="remove-participant",x.HANGUP="hangup",x.TRANSMIT_DATA="transmit-data",x.ACCEPT_PRODUCER="accept-producer",x.ALLOCATE_CONSUMER="allocate-consumer",x.CHANGE_MEDIA_SETTINGS="change-media-settings",x.CHANGE_PARTICIPANT_STATE="change-participant-state",x.CHANGE_STREAM_PRIORITIES="change-streams-priorities",x.UPDATE_DISPLAY_LAYOUT="update-display-layout",x.REPORT_PERF_STAT="report-perf-stat",x.REPORT_SHARING_STAT="report-sharing-stat",x.REPORT_NETWORK_STAT="report-network-stat",x.RECORD_START="record-start",x.RECORD_STOP="record-stop",x.RECORD_PUBLISH="record-publish",x.RECORD_SET_CONF="record-set-conf",x.RECORD_GET_STATUS="record-get-status",x.SWITCH_MICRO="switch-micro",x.SWITCH_TOPOLOGY="switch-topology",x.REQUEST_REALLOC="request-realloc",x.CHAT_MESSAGE="chat-message",x.CHAT_HISTORY="chat-history",x.CUSTOM_DATA="custom-data",x.GRANT_ROLES="grant-roles",x.MUTE_PARTICIPANT="mute-participant",x.ENABLE_FEATURE_FOR_ROLES="enable-feature-for-roles",x.PIN_PARTICIPANT="pin-participant",x.UPDATE_MEDIA_MODIFIERS="update-media-modifiers",x.CHANGE_OPTIONS="change-options",x.GET_WAITING_HALL="get-waiting-hall",x.GET_PARTICIPANT_LIST_CHUNK="get-participant-list-chunk",x.GET_PARTICIPANTS="get-participants",x.PROMOTE_PARTICIPANT="promote-participant",x.REQUEST_TEST_MODE="request-test-mode",x.ADD_MOVIE="add-movie",x.UPDATE_MOVIE="update-movie",x.REMOVE_MOVIE="remove-movie",x.START_URL_SHARING="start-url-sharing",x.STOP_URL_SHARING="stop-url-sharing",x.GET_ROOMS="get-rooms",x.UPDATE_ROOMS="update-rooms",x.ACTIVATE_ROOMS="activate-rooms",x.REMOVE_ROOMS="remove-rooms",x.SWITCH_ROOM="switch-room",x.FEEDBACK="feedback",x.ASR_START="asr-start",x.ASR_STOP="asr-stop",x.REQUEST_ASR="request-asr",x.REQUEST_PROMOTION="request-promotion",x.ACCEPT_PROMOTION="accept-promotion",x.GET_HAND_QUEUE="get-hand-queue",x.ENABLE_VIDEO_SUSPEND="enable-video-suspend",x.ENABLE_VIDEO_SUSPEND_SUGGEST="enable-video-suspend-suggest",x.PUT_HANDS_DOWN="put-hands-down",x.CHANGE_SIMULCAST="change-simulcast",x))(Fa||{}),N=Fa;var Va=(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))(Va||{}),se=Va;var ja=(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))(ja||{}),ce=ja;var Ha=(re=>(re.ACCEPT_CONCURRENT="callAcceptConcurrent",re.ACCEPT_INCOMING="callAcceptIncoming",re.ACCEPTED_OUTGOING="callAcceptedOutgoing",re.ADD_PARTICIPANT="callAddParticipant",re.CALL_SPEC_ERROR="callSpecError",re.DECLINE_INCOMING="callDeclineIncoming",re.DEVICE_CHANGED="callDeviceChanged",re.DEVICES="callDevices",re.ERROR="callError",re.HANGUP="callHangup",re.ICE_CONNECTION_STATE="callIceConnectionState",re.ICE_CONNECTION_TYPE="callIceConnectionType",re.ICE_RESTART="callIceRestart",re.JOIN_CONVERSATION="callJoinConversation",re.MEDIA_STATUS="callMediaStatus",re.OUTGOING_CALL="callStart",re.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",re.PAT_ALLOCATED="patAllocate",re.PAT_DEALLOCATED="patDeallocate",re.PAT_ERROR="patError",re.PAT_OUTDATED_RESPONSE="patOutdatedResponse",re.PAT_WAITING_TIME_ERROR="patWaitingTimeError",re.POOR_CONNECTION="callPoorConnection",re.PUSH="callPush",re.RECONNECT="callReconnect",re.RELAY_POLICY="callForceRelay",re.REMOVE_PARTICIPANT="callRemoveParticipant",re.SOCKET_ACTION="callSocketAction",re.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",re))(Ha||{}),D=Ha;var qr=gi(require("@vkontakte/libvpx"));var qe=class{constructor(){c(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,o)=>{let u=t.join(","),p=new Blob([r,`exports.default(${u});`],{type:"application/javascript; charset=utf-8"}),m=window.URL.createObjectURL(p);this._worker=new Worker(m),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":o(h.data.error);break;case"frame":e(h.data);break;case"debug":d.debug(h.data.message);break;case"log_error":R.log(D.ERROR,h.data.message);break}},this._sendToWorker("init",i,a)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(r,e={},t=[]){this._worker?.postMessage(Object.assign({type:r},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var At=class extends qe{async init(r,e,t){d.debug("LibVPxDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var h=(s,t)=>{for(var e in t)u(s,e,{get:t[e],enumerable:!0})},F=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of x(t))!M.call(s,a)&&a!==e&&u(s,a,{get:()=>t[a],enumerable:!(o=R(t,a))||o.enumerable});return s};var V=s=>F(u({},"__esModule",{value:!0}),s);var D={};h(D,{default:()=>A});var A=(s,t)=>{let e=null,o=null,a=!0,l=!1;function c(){return s({locateFile:t}).then(r=>o=r)}function m(r,f,n,g){if(!o){self.postMessage({type:"log_error",message:"decoder-init-fail-libvpx"}),self.postMessage({type:"frame",error:"Fatal initialization error"});return}if(a!==n&&(a=n,e&&(e=null,self.postMessage({type:"debug",message:`LibVPxDecoder codec changed to ${n?"VP9":"VP8"} - reinitialize`}))),!e&&(self.postMessage({type:"debug",message:`LibVPxDecoder codec ${n?"VP9":"VP8"}`}),e=new o.VpxDecoder,e.debug(g),!e.init(n?o.VpxType.VP9:o.VpxType.VP8))){e=null,self.postMessage({type:"frame",error:"Decoder failed to create"});return}try{e.allocateBuffer(f.byteLength).set(new Uint8Array(f))}catch(i){self.postMessage({type:"debug",message:i}),e=null,self.postMessage({type:"frame",error:String(i)});return}if(e.decode()&&e.nextImage())l=!1;else{self.postMessage({type:"frame",error:"Decode failed"}),b();return}let p=e.getImageBuffer();if(!p){self.postMessage({type:"frame",error:"No decoded data"});return}let y=e.getImageWidth(),E=e.getImageHeight();e.nextImage()&&(self.postMessage({type:"debug",message:"LibVPxDecoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxDecoder-drop"}));let d=new Uint8ClampedArray(p.byteLength);d.set(p),self.postMessage({type:"frame",data:d.buffer,width:y,height:E},[d.buffer])}function b(){l||(self.postMessage({type:"frame",requestKeyFrame:!0}),l=!0)}c().then(()=>{self.onmessage=r=>{switch(r.data.type){case"frame":m(r.data.timestamp,r.data.data,r.data.isVP9,r.data.debug);break}},self.postMessage({type:"ready"})}).catch(r=>{self.postMessage({type:"error",error:String(r)})})};return V(D);})();\n',i=>{if(i.error)d.warn("LibVPxDecoder",i.error),e(i.error);else if(i.requestKeyFrame)d.debug("LibVPxDecoder requests key frame"),t();else{let a=new ImageData(new Uint8ClampedArray(i.data),i.width,i.height);r(a)}},[qr.default,qr.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 ze=class extends qe{async init(r,e,t){d.debug("WebCodecsDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var m=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var M=(a,e)=>{for(var s in e)m(a,s,{get:e[s],enumerable:!0})},P=(a,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of C(e))!w.call(a,o)&&o!==s&&m(a,o,{get:()=>e[o],enumerable:!(n=k(e,o))||n.enumerable});return a};var B=a=>P(m({},"__esModule",{value:!0}),a);var I={};M(I,{default:()=>x});var x=a=>{let e=null,s="no-preference",n=!0,o=!1,f=!1,c=null,i=null,g=3e3;function y(){self.postMessage({type:"ready"})}function p(t,r,u,d=!1){c={timestamp:t,data:r,isVP9:u,keyFrame:d};let V=D(u);if(o&&!d){self.postMessage({type:"frame",error:"WebCodecsDecoder waiting for keyframe"}),E();return}else o&&d&&(o=!1,f=!1,self.postMessage({type:"debug",message:"WebCodecsDecoder got keyframe. Start decoding"}));let A=new EncodedVideoChunk({type:d?"key":"delta",timestamp:t,data:r});try{V.decode(A)}catch(h){l(`because failed call decode: ${h.message}`);return}F(d)}self.onmessage=t=>{switch(t.data.type){case"init":y();break;case"frame":p(t.data.timestamp,t.data.data,t.data.isVP9,t.data.keyFrame);break}};function E(){f||(self.postMessage({type:"frame",requestKeyFrame:!0}),f=!0)}function D(t){return n!==t&&(n=t,l(`because codec is changed to ${n?"VP9":"VP8"}`)),e||(o=!0,self.postMessage({type:"debug",message:`WebCodecsDecoder codec ${n?"VP9":"VP8"}`}),e=new VideoDecoder({output:r=>{b();let u=a?[r]:[];self.postMessage({type:"frame",data:r},u),r.close()},error:r=>{b(),l(`because error during decoding: ${r.message}`),s!=="prefer-software"?(s="prefer-software",c&&c.keyFrame&&p(c.timestamp,c.data,c.isVP9,c.keyFrame),self.postMessage({type:"debug",message:`WebCodecsDecoder codec switch to prefer-software because decoding issue: ${r.message}`})):self.postMessage({type:"frame",error:"WebCodecsDecoder failed, reinitialize: "+String(r)})}}),e.configure(R(n,s))),e}function l(t){if(e){try{e&&e.state!=="closed"&&e.close()}catch{}e=null,self.postMessage({type:"frame",error:`WebCodecsDecoder reset ${t}`})}}function F(t=!1){i=setTimeout(()=>{l("because of decode timeout")},g)}function b(){i&&clearTimeout(i),i=null}function R(t,r){return{codec:t?"vp09.00.50.08":"vp8",hardwareAcceleration:r}}};return B(I);})();\n',i=>{i.error?(d.warn("WebCodecsDecoder",i.error),e(i.error)):i.requestKeyFrame?(d.debug("WebCodecsDecoder requests key frame"),t()):(r(i.data),i.data.close())},[b.baseChromeVersion()>=92||b.browserName()==="Safari"])}decodeFrame(r,e,t,i=!1){this._sendToWorker("frame",{timestamp:r,data:e.buffer,isVP9:t,keyFrame:i},[e.buffer])}destroy(){this._removeWorker(),d.debug("WebCodecsDecoder destroyed")}static isBrowserSupported(){return"VideoDecoder"in window&&"Worker"in window&&"VideoFrame"in window&&!b.isBrokenVP9Decoder()&&b.browserName()!=="Firefox"}};var Dt=class{constructor(r=null,e=0){c(this,"_counter",0);c(this,"_interval",0);c(this,"_lastCalculationTime",Date.now());c(this,"_onCalculated",null);this._onCalculated=r,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(r=1){this._counter+=r}calculate(){let r=Date.now(),e=r-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=r,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};var tn=require("bit-buffer");var Ga=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Ga||{}),ae=Ga;var ft={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Si="L1T2",Ka=[{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}],Os={h:1,m:2,l:4};function $a(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 Wa(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:Ka[0].bitrate}function vi(n=ft.WIDTH,r=ft.HEIGHT,e=Ka){let t=["h","m","l"],i=Math.max(n,r),a=1;i>=960?a=3:i>=480&&(a=2);let s={streams:[]},o=30,u=Wa(i,e)??ft.BITRATE;for(let p=0;p<a;p++){let m=t[p];s.streams.push({rid:m,width:n,height:r,fps:o,bitrate:u}),n=Math.round(n/2),r=Math.round(r/2),u=Wa(Math.max(n,r),e)??Math.round(u/2)}return s}function Hi(n){return n?Os[n]??1:1}var qa=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 za(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var qt=":",Wi="d",xs=533,Gi="a=fmtp:",Ns="sps-pps-idr-in-keyframe=1",zr;(it=>{let n=/[\r\n]+/,r=`\r
|
|
8
|
-
`;function e(_,T){let
|
|
9
|
-
`);for(let k of P)if(k.startsWith("a=fingerprint")){let W=k.split(" ");if(W.length===2){T=W[1];break}}if(!T)return BigInt(-1);let w=T.split(":"),f=BigInt(0);for(let k=Math.min(7,w.length-1);k>=0;k--){let W=BigInt(parseInt(w[k],16));f<<=BigInt(8),f|=W}return BigInt.asIntN(64,f)}it.sdpFingerprint=ie;async function ee(_){return new Promise(T=>window.setTimeout(T,_))}it.delay=ee;function Aa(_,T,P){let w=[];return _.getSenders().forEach(f=>jr(T,f,f.track,P,w)),w}it.applySettings=Aa;function jr(_,T,P,w,f){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!_||!P||P.kind!=="video")return;let k=P.getSettings();if(!k)return;let W=_.maxBitrateK?_.maxBitrateK*1024:null,F=k.width,X=k.height,ve=F&&X&&_.maxDimension?Math.max(1,Math.max(F,X)/_.maxDimension):null,x=_.maxFramerate||null;if(F&&X&&_.maxDimension&&_.maxDimension>Math.max(F,X)){let me=Math.round(F*X/256),xe=(Math.round(me*xs/1e4)+1)*1e4;W=W===null?xe:Math.min(xe,W)}let Ie=_.degradationPreference||"balanced",fe=w[P.id];if(fe&&fe.bitrate===W&&fe.scaleResolutionDownBy===ve&&fe.maxFramerate===x&&fe.degradationPreference===Ie){f[P.id]=fe;return}f[P.id]={bitrate:W,scaleResolutionDownBy:ve,maxFramerate:x,degradationPreference:Ie};let Re=T.getParameters();if(Re.encodings||(Re.encodings=[{}]),Re.encodings.length>1&&F&&X&&_.maxDimension){let me=Math.round(_.maxDimension*1.35),xe=Math.max(F,X),yt=vi(F,X,_?.bitrates?.generic),$t=yt.streams.length;d.log(`applyVideoTrackSettings: maxDim=${_.maxDimension} targetDim=${me} track=${F}x${X} sim=${JSON.stringify(yt)}`),Re.encodings.forEach((rt,hi)=>{rt.scaleResolutionDownBy=Hi(rt.rid);let Na=Math.round(xe/rt.scaleResolutionDownBy);hi<$t-1?rt.active=Na<me:hi>=$t?rt.active=!1:rt.active=!0,hi<$t?rt.maxBitrate=yt.streams[hi].bitrate:rt.maxBitrate=0,rt.scalabilityMode=Si})}else Re.encodings.forEach(me=>{_?.scalabilityMode&&(me.scalabilityMode=_.scalabilityMode),W?me.maxBitrate=W:delete me.maxBitrate,ve?me.scaleResolutionDownBy=ve:delete me.scaleResolutionDownBy,x?me.maxFramerate=x:delete me.maxFramerate});if(Re.degradationPreference=Ie,Re.encodings.length>0){T.setParameters?.(Re).catch(xe=>{d.error("Failed to set sender parameters",Re,xe)});let me=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(me.encodings)}`)}}it.applyVideoTrackSettings=jr;function Hr(_,T){Array.isArray(T)||(T=[T]);for(let P of T)if(_.includes(P))return!0;return!1}it.includesOneOf=Hr;function Gr(_){return Object.entries(_.participantState?.state||{}).reduce((T,[P,w])=>(_.participantState&&(T[P]={ts:_.participantState.stateUpdateTs[P],state:w}),T),{})}it.mapParticipantState=Gr;function Da(_){let T=_.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 l.filterObservers?T.filter(P=>!P.uid.observer):T}it.mapSharedParticipants=Da;function wa(_,T){let P=Object.keys(_),w=Object.keys(T);if(P.length!==w.length)return!1;for(let f of P)if(!Object.hasOwn(w,f)||_[f].state!==T[f].state||_[f].ts!==T[f].ts)return!1;return!0}it.isEqualParticipantState=wa;function Wr(_,T,P=!1){let w=Object.keys(_),f=Object.keys(T);if(w.length!==f.length)return!1;for(let k of w){if(!Object.hasOwn(T,k))return!1;let W=_[k],F=T[k];if(P&&ne(W)&&ne(F))return Wr(W,F,P);if(W!==F)return!1}return!0}it.isObjectsEquals=Wr;function ka(_,T){if(_.length!==T.length)return!1;for(let P of _)if(T.indexOf(P)<0)return!1;return!0}it.isArraysEquals=ka;function Oa(_){return!Object.keys(_).length}it.isEmptyObject=Oa;function xa(_,T){if(!_&&!T)return 0;if(!_||!T)return _?-1:1;return w(T.rank,_.rank)||w(_.ts,T.ts)||P(_,T);function P(f,k){let W={[ae.USER]:0,[ae.GROUP]:1},{compositeUserId:F,deviceIdx:X}=mi(f.id),{compositeUserId:ve,deviceIdx:x}=mi(k.id),{id:Ie,type:fe}=ui(F),{id:Re,type:me}=ui(ve);return w(W[fe],W[me])||w(Ie,Re)||w(X,x)}function w(f,k){return f<k?-1:f===k?0:1}}it.participantMarkerCompare=xa;function he(_,T){let P=Object.entries(_).filter(([,w])=>Array.isArray(T)?!T.includes(w):w!==T);return qa(P)}it.objectFilterOutValues=he;function V(_,T,P){let w=P;for(let f in _)Object.hasOwn(_,f)&&(w=T(w,_[f],f));return w}it.objectReduce=V,it.setImmediate=(()=>{let _=1,T={},P=null;return typeof MessageChannel<"u"&&(P=new MessageChannel,P.port1.onmessage=w=>{let f=w.data;T[f]&&(T[f](),delete T[f])}),function(w){if(P&&document.visibilityState==="hidden"){let k=_;return _=_>=Number.MAX_SAFE_INTEGER?1:_+1,T[k]=w,P.port2.postMessage(k),()=>{T[k]&&delete T[k]}}let f=setTimeout(w,0);return()=>clearTimeout(f)}})();function ne(_){return _!==null&&typeof _=="object"&&!Array.isArray(_)}it.isObject=ne;function Se(_,T,P,w){function f(F,X){let ve=0,x=F.length,Ie=!1;for(let fe=0;fe<F.length;fe++)if(!Ie&&F[fe].startsWith("m=video")&&(ve=fe),F[fe].startsWith("a=mid:"+X)&&(Ie=!0),Ie&&F[fe].startsWith("m=")){x=fe;break}return{start:ve,end:x}}function k(F,X,ve,x,Ie,fe,Re){let me="a=rid:"+x+" send";for(let xe=X;xe<ve;xe++)if(F[xe]===me){let $t=me+" max-width="+fe+";max-height="+Re+";max-br="+Ie;F[xe]=$t}}let W=T?.sender;if(W&&W.track&&T.mid){let F=_.split(n),{start:X,end:ve}=f(F,T.mid),x=W.getParameters();if(x.encodings)return x.encodings.forEach(Ie=>{let fe=Ie.rid,Re=Ie.maxBitrate,me=Ie.scaleResolutionDownBy;if(P&&w&&me){let xe=""+Math.round(P/me),yt=""+Math.round(w/me);k(F,X,ve,fe,Re,xe,yt)}}),F.join(r)}return _}it.patchSimulcastAnswerSdp=Se})(zr||(zr={}));var I=zr;var Ja=(ie=>(ie.CALL_FINISH="call_finish",ie.CODEC_USAGE="codec_usage",ie.SIGNALING_CONNECTED="signaling_connected",ie.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",ie.FIRST_MEDIA_RECEIVED="first_media_received",ie.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",ie.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",ie.CALL_START="call_start",ie.CALL_INIT="call_init",ie.SIGNALING_PING_SUMMARY="signaling_ping_summary",ie.SIGNALING_COMMAND_SUMMARY="signaling_command_summary",ie.WEBSOCKET_CONNECTED="websocket_connected",ie.WEBSOCKET_RECONNECTED="websocket_reconnected",ie.WEBSOCKET_FAILED_PINGS="websocket_failed_pings",ie.WEBSOCKET_FAILED_EXCEPTION="websocket_failed_exception",ie.WEBSOCKET_TIMEOUT="websocket_timeout",ie.WEBSOCKET_RESTART="websocket_restart",ie.WEBTRANSPORT_CONNECTED="webtransport_connected",ie.WEBTRANSPORT_RECONNECTED="webtransport_reconnected",ie.WEBTRANSPORT_FAILED_PINGS="webtransport_failed_pings",ie.WEBTRANSPORT_FAILED_EXCEPTION="webtransport_failed_exception",ie.WEBTRANSPORT_TIMEOUT="webtransport_timeout",ie.WEBTRANSPORT_RESTART="webtransport_restart",ie.SDP_CREATE_ANSWER="sdp_create_answer",ie.SDP_CREATE_OFFER="sdp_create_offer",ie.SDP_SET_LOCAL_ANSWER="sdp_set_local_answer",ie.SDP_SET_LOCAL_OFFER="sdp_set_local_offer",ie.SDP_SET_REMOTE_ANSWER="sdp_set_remote_answer",ie.SDP_SET_REMOTE_OFFER="sdp_set_remote_offer",ie.CONNECTION_STATE_CHANGED="connection_state_changed",ie))(Ja||{}),K=Ja;var Ls=1e3;function le(n,r,e=0){return r in n&&n[r]?n[r]:e}function Jr(...n){return r=>{for(let e of n)if(e(r))return!0;return!1}}function St(n,r){return e=>e[n]===r}function Us(n){return(r,e)=>e[n]-r[n]}function Ii(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function Ya(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function Qr(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])?Qr(e[1]):e[1],r),{})}function Qa(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function Bs(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(Qa).then(Ya)}function Xa(n){let r=n.filter(St("type","candidate-pair")).sort(Us("priority")).find(Jr(St("nominated",!0),St("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(St("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(St("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}}),Qr(e)}function Yr(n,r,e=!1){let t=Ii("id",n),i=e?n.filter(Jr(St("type","remote-inbound-rtp"))):n.filter(Jr(St("type","inbound-rtp"),St("type","outbound-rtp")));return b.browserName()==="Firefox"&&(i=Object.values(i.reduce((a,s)=>{if(!a[s.ssrc])a[s.ssrc]=s;else{let o=Object.assign({},a[s.ssrc],s),u=a[s.ssrc].isRemote?s:a[s.ssrc];o.id=u.id,o.type=u.type,delete o.isRemote,delete o.remoteId,a[o.ssrc]=o}return a},{}))),i.map(a=>{let s=Number(a.ssrc),o=a.mediaType||a.kind,u=a.remoteId||a.trackId,p=a.type,m=a.codecId;if(!p||!s||!o)return null;let h={ssrc:s,type:p,kind:o,bytesReceived:le(a,"bytesReceived"),bytesSent:le(a,"bytesSent"),headerBytesReceived:le(a,"headerBytesReceived"),headerBytesSent:le(a,"headerBytesSent"),jitter:le(a,"jitter"),packetsLost:le(a,"packetsLost"),packetsReceived:le(a,"packetsReceived"),packetsSent:le(a,"packetsSent"),fractionLost:le(a,"fractionLost"),pliCount:le(a,"pliCount"),firCount:le(a,"firCount"),nackCount:le(a,"nackCount"),userId:r[s],freezeCount:le(a,"freezeCount",0),totalFreezesDuration:le(a,"totalFreezesDuration",0)},E="mid"in a&&typeof a.mid=="string"?a.mid:void 0,C="rid"in a&&typeof a.rid=="string"?a.rid:void 0;if(E&&(h.mid=E),C&&(h.rid=C),o==="video"){let M=le(a,"framesDecoded"),H=le(a,"totalInterFrameDelay"),q=le(a,"totalSquaredInterFrameDelay"),de=le(a,"encoderImplementation"),Ce=le(a,"decoderImplementation");de&&(h.encoderImplementation=de),Ce&&(h.decoderImplementation=Ce),h.interframeDelayVariance=(q-H*H/M)/M}if(o==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=le(a,"totalEncodeTime")??0),o==="audio"&&(h.totalSamplesReceived=le(a,"totalSamplesReceived"),h.concealedSamples=le(a,"concealedSamples"),h.insertedSamplesForDeceleration=le(a,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=le(a,"removedSamplesForAcceleration"),h.silentConcealedSamples=le(a,"silentConcealedSamples"),h.concealmentEvents=le(a,"concealmentEvents"),h.totalAudioEnergy=le(a,"totalAudioEnergy")),m&&t[m]){let M=t[m];h.clockRate=M.clockRate,h.mimeType=M.mimeType,o==="audio"&&M.sdpFmtpLine&&(h.sdpFmtpLine=M.sdpFmtpLine)}if(u&&t[u]){let M=t[u];h.frameHeight=M.frameHeight,h.frameWidth=M.frameWidth,h.framesDecoded=M.framesDecoded,h.framesReceived=M.framesReceived,h.framesDropped=M.framesDropped}return Qr(h)}).filter(a=>!!a)}function Za(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=Ii("ssrc",n?.remoteRtps||[]),i=Ii("ssrc",r?.remoteRtps||[]));let a=Ii("ssrc",n.rtps),s=Ii("ssrc",r.rtps),o=(n.timestamp-r.timestamp)/1e3;return!a||!s||Object.keys(a).forEach(u=>{let p=a[u],m=s[u];if(!(!p||!m)){if(p.bytesReceived&&p.bytesReceived>m.bytesReceived&&(p.bandwidth=Math.round((p.bytesReceived-m.bytesReceived)/o),p.bandwidth+=Math.round((p.headerBytesReceived-m.headerBytesReceived)/o)),p.bytesSent&&p.bytesSent>m.bytesSent&&(p.bandwidth=Math.round((p.bytesSent-m.bytesSent)/o),p.bandwidth+=Math.round((p.headerBytesSent-m.headerBytesSent)/o)),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)/o).toFixed(0))),e&&p.type==="outbound-rtp"&&p.kind==="video"){let h=t?.[u],E=i?.[u],C=q=>q??0,M=Math.max(0,C(h?.packetsLost)-C(E?.packetsLost)),H=Math.max(1,p.packetsSent-m.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(M/H*100)}}}}),n}async function en(n,r,e={},t=!1){let i=await Bs(n),a={timestamp:Date.now(),transport:Xa(i),rtps:Yr(i,e)};return t&&(a.remoteRtps=Yr(i,e,!0)),r?Za(a,r,t):(await I.delay(Ls),en(n,a,e,t))}function Fs(n){performance.clearMarks(n),performance.mark(n)}function Vs(n){performance.clearMarks(n)}function js(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 Hs(n){return`${K.SCREENSHARE_FIRST_FRAME}_${Gs(n)}`}function Gs(n){return typeof n=="string"?n:JSON.stringify(n)}var pe={distinctById:Ya,rtcStatsToArray:Qa,extractTransport:Xa,extractRtps:Yr,delta:Za,collectStats:en,setMark:Fs,clearMark:Vs,measureMark:js,getMarkNameScreenshareFirstFrame:Hs};var Je=class Je{constructor(){c(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}),R.logClientStats(e);Je._instance._eventualLogs.clear()}R.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=pe.measureMark(r.name)),r.value!==null&&Je._instance?._eventualLogs.add(r)}static destroy(){Je._instance?._destroy(),Je._instance=null}_destroy(){this._eventualLogs.clear()}};c(Je,"_instance",null);var ge=Je;var Ki=class{constructor(r){c(this,"_participantId");c(this,"_firstFrameReceived",!1);this._participantId=r}measure(r,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=pe.getMarkNameScreenshareFirstFrame(this._participantId),i=pe.measureMark(t);i!==null&&ge.logEventualStat({name:K.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Ws=65536,Xr="MARK_SCREENSHARE_FREEZE_DURATION",zt=class n{constructor(r,e,t,i){c(this,"_participantId");c(this,"_onStream");c(this,"_onStat");c(this,"_onKeyFrameRequested");c(this,"_statScreenShareFirstFrame");c(this,"_chunks",[]);this._participantId=r,this._onStream=e,this._onStat=t,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new Ki(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)%Ws!==r.sequence){d.warn("[FrameBuilder] Got incorrect chunk");return}if(this._chunks.push(r),r.end){let t=this._processFrameData(),{width:i,height:a}=n.getFrameSize(t);this._processFrame({timestamp:r.timestamp,frameData:t,isVP9:r.isVP9,keyframe:r.keyframe,width:i,height:a}),this._statScreenShareFirstFrame.measure(i,a)}}destroy(){pe.clearMark(Xr),pe.clearMark(pe.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let r=this._chunks;this._chunks=[];let e=r.reduce((a,s)=>a+s.data.byteLength,0),t=new Uint8Array(e),i=0;for(let a of r)t.set(new Uint8Array(a.data),i),i+=a.data.byteLength;return t}static getFrameSize(r){let e={width:0,height:0},t=new tn.BitStream(r.buffer);t.bigEndian=!0,t.index+=2;let i=t.readBits(1),s=t.readBits(1)<<1|i;return s===3&&t.index++,t.readBits(1)===1||t.readBits(1)!==0||(t.index++,t.index++,t.index+=24,s>=2&&t.index++,t.readBits(3)!==7?(t.index++,(s===1||s===3)&&(t.index+=3)):(s===1||s===3)&&t.index++,e.width=t.readBits(16)+1,e.height=t.readBits(16)+1),e}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(r){if(r){pe.setMark(Xr);return}let e=pe.measureMark(Xr);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var wt=class{constructor(r){c(this,"_onStream");this._onStream=r}async drawFrame(r){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(r){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var Jt=class extends wt{constructor(e){super(e);c(this,"_useImageBitmap");c(this,"_canvas",null);c(this,"_canvasContext",null);c(this,"_stream",null);c(this,"_track",null);d.debug("CanvasRenderer started"),this._useImageBitmap="ImageBitmap"in window}_createStream(e,t){this._canvas||(this._canvas=document.createElement("canvas"),this._canvas.width=e,this._canvas.height=t,this._canvas.style.pointerEvents="none",this._canvas.style.visibility="hidden",this._canvas.style.position="absolute",this._canvas.style.width="160px",this._canvas.style.height="90px",this._canvas.style.bottom="0",this._canvas.style.right="0",this._canvas.style.zIndex="5000",document.body.appendChild(this._canvas),this._useImageBitmap?this._canvasContext=this._canvas.getContext("bitmaprenderer"):this._canvasContext=this._canvas.getContext("2d"),this._stream=this._canvas.captureStream(0),this._track=this._stream.getVideoTracks()[0],this._track.contentHint="text")}_removeStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null,this._track=null),this._canvasContext=null;try{this._canvas&&document.body.removeChild(this._canvas)}catch{}this._canvas=null}_requestCanvasFrame(){this._track&&this._track.requestFrame?this._track.requestFrame():this._stream&&this._stream.requestFrame&&this._stream.requestFrame()}async _drawImage(e){this._track||(this._createStream(e.width,e.height),this._onStream(this._stream));let t=this._canvas;if(t.width=e.width,t.height=e.height,this._useImageBitmap){let i;if(e instanceof ImageBitmap)i=e;else{let{width:s,height:o,data:u}=e,p=s*o*4;if(u.byteLength!==p){d.warn("Bad frame buffer",{w:s,h:o,got:u.byteLength,expected:p});return}i=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){d.warn("Canvas context is null"),i.close();return}this._canvasContext.transferFromImageBitmap(i),i.close()}else{let i=this._canvasContext;i.clearRect(0,0,t.width,t.height),i.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t="createImageBitmap"in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),d.debug("CanvasRenderer destroyed")}static isBrowserSupported(){return("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)&&!(b.browserName()==="Safari"&&Number(b.browserVersion())===15)&&!(b.browserName()==="Firefox"&&Number(b.browserVersion())<60)}};var kt=class extends wt{constructor(e){super(e);c(this,"_generator");c(this,"_writer");c(this,"_stream");d.debug("TrackGeneratorRenderer started"),this._generator=new MediaStreamTrackGenerator({kind:"video"}),this._writer=this._generator.writable.getWriter(),this._stream=new MediaStream([this._generator]),this._onStream(this._stream)}async drawFrame(e){await this._writer.write(e)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),d.debug("TrackGeneratorRenderer destroyed")}static isBrowserSupported(){return"VideoFrame"in window&&"MediaStreamTrackGenerator"in window&&ze.isBrowserSupported()}};var Yt=class extends zt{constructor(e,t,i,a){super(e,t,i,a);c(this,"_renderer");c(this,"_decoder");c(this,"_decoderReady",!1);c(this,"_decoderBusy",!1);c(this,"_decoderQueue",[]);c(this,"_fpsMeter");d.debug(`StreamBuilder started for participant [${e}]`),this._initFpsMeter(),this._initRenderer(),this._initDecoder()}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_initFpsMeter(){this._fpsMeter=new Dt(e=>d.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!kt.isBrowserSupported()?this._renderer=new Jt(this._onStream):this._renderer=new kt(this._onStream)}_initDecoder(e=!1){e||!ze.isBrowserSupported()?this._decoder=new At:this._decoder=new ze;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 ze&&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 Jt.isBrowserSupported()||kt.isBrowserSupported()}};function rn(n,r,e,t,i,a,s){let o=0;r&&(o|=1),e&&(o|=2),t&&(o|=4),s||(o|=8);let u=new ArrayBuffer(11),p=new DataView(u);if(p.setUint8(0,1),p.setUint16(1,i),p.setUint32(3,n),p.setUint8(7,a?1:0),p.setUint16(8,0),p.setUint8(10,o),!s)return u;let m=new Uint8Array(u.byteLength+s.byteLength);return m.set(new Uint8Array(u),0),m.set(new Uint8Array(s),u.byteLength),m.buffer}function an(n){let r=new DataView(n),e=r.getUint8(0),t=r.getUint16(1),i=r.getUint32(3),a=r.getUint8(7)===1,s=r.getUint16(8),o=r.getUint8(10),u=!!(o&1),p=!!(o&2),m=!!(o&4),h=!!(o&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:i,start:u,end:p,keyframe:m,sequence:t,isVP9:a,ssrc:s,eos:h,data:n.slice(11)}}function nn(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 sn(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 on(n){let r=new ArrayBuffer(4),e=new DataView(r);return e.setUint8(0,1),e.setUint8(1,1),e.setUint16(2,n),r}var O=gi(require("simple-ebml-builder"));var Ks=2**15-1,Zr=1,$s=5,qs=5;var ea=class n{constructor(r){c(this,"_mediaSource");c(this,"_codec");c(this,"_sourceBuffer",null);c(this,"_queue",[]);c(this,"_clearBufferTill",0);this._mediaSource=new MediaSource,this._codec=r;let e=()=>{this._mediaSource.removeEventListener("sourceopen",e),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener("sourceopen",e,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let t=this._sourceBuffer.buffered.start(0);t<this._clearBufferTill&&(this._sourceBuffer.remove(t,this._clearBufferTill),d.debug(`[WebmBuilder] SourceBuffer cleanup from ${t} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let r=this._queue;this._queue=[];let e=n._buildQueue(r);this._sourceBuffer.appendBuffer(e)}static _buildQueue(r){if(r.length){if(r.length===1)return O.build(r[0])}else return new Uint8Array;let e=r.reduce((a,s)=>a+s.countSize(),0),t=new Uint8Array(e),i=0;for(let a of r){let s=O.build(a);t.set(s,i),i+=s.byteLength}return t}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode="sequence",this._sourceBuffer.addEventListener("updateend",()=>this._handleQueue())}changeType(r){return this._codec=r,this._sourceBuffer?.changeType(r)}append(r,e=!1){this._queue.push(r),e&&this._handleQueue()}cleanup(){this._mediaSource?.readyState==="open"&&this._sourceBuffer?.abort();let r=this._sourceBuffer?.buffered,e=r?.length;if(!e)return;let t=r.start(0),i=Math.max(0,r.end(e-1)-$s);i-t>qs&&(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}},Ot=class n extends zt{constructor(e,t,i){super(e,t,i);c(this,"_mediaBuffer",null);c(this,"_video",null);c(this,"_stream",null);c(this,"_earliestTimestamp",0);c(this,"_clusterStartTime",0);c(this,"_lastFrameTimestamp",0);d.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return O.element(O.ID.EBML,[O.element(O.ID.EBMLVersion,O.number(1)),O.element(O.ID.EBMLReadVersion,O.number(1)),O.element(O.ID.EBMLMaxIDLength,O.number(4)),O.element(O.ID.EBMLMaxSizeLength,O.number(8)),O.element(O.ID.DocType,O.string("webm")),O.element(O.ID.DocTypeVersion,O.number(2)),O.element(O.ID.DocTypeReadVersion,O.number(2))])}static _genSegmentHeader(e,t,i){let a=O.element(O.ID.Info,[O.element(O.ID.TimecodeScale,O.number(1e6)),O.element(O.ID.MuxingApp,O.string("vk-webm-builder")),O.element(O.ID.WritingApp,O.string("vk-webm-builder"))]),s=[O.element(O.ID.PixelWidth,O.number(e)),O.element(O.ID.PixelHeight,O.number(t))],o=O.element(O.ID.Tracks,O.element(O.ID.TrackEntry,[O.element(O.ID.TrackNumber,O.number(Zr)),O.element(O.ID.TrackUID,O.number(Zr)),O.element(O.ID.TrackType,O.number(1)),O.element(O.ID.FlagLacing,O.number(0)),O.element(O.ID.DefaultDuration,O.number(1e9)),O.element(O.ID.CodecID,O.string(`V_${i.toUpperCase()}`)),O.element(O.ID.Video,s)]));return O.unknownSizeElement(O.ID.Segment,[a,o])}static _genClusterHeader(e){return O.unknownSizeElement(O.ID.Cluster,[O.element(O.ID.Timecode,O.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new ea(e),this._video=document.createElement("video"),this._video.autoplay=!0,this._video.controls=!1,this._video.muted=!0,this._video.style.pointerEvents="none",this._video.style.visibility="hidden",this._video.style.position="absolute",this._video.style.width="160px",this._video.style.height="90px",this._video.style.bottom="0",this._video.style.right="0",this._video.style.zIndex="5000",this._video.src=URL.createObjectURL(this._mediaBuffer.mediaSource),document.body.appendChild(this._video);let t=()=>{if(this._video?.src){d.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let i=this._video.seekable;i.length&&(this._video.currentTime=i.end(i.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>d.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(e){let t=e.isVP9?"vp9":"vp8";this._mediaBuffer?this._mediaBuffer.codec!==t&&this._mediaBuffer.changeType(t):this._createVideo(t);let i=e.timestamp;if(i<=this._lastFrameTimestamp&&(i=this._lastFrameTimestamp+10,d.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=i,this._earliestTimestamp)i-=this._earliestTimestamp;else{if(!e.keyframe)return;this._earliestTimestamp=i,i=0}if(e.keyframe){this._clusterStartTime=i,this._mediaBuffer?.cleanup(),d.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let o=n._genWebmHeader();this._mediaBuffer?.append(o);let u=n._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(u)}let a=Math.round(i-this._clusterStartTime);if(a>Ks&&(this._clusterStartTime=i,a=0),a===0){d.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let o=n._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(o)}let s=O.element(O.ID.SimpleBlock,[O.vintEncodedNumber(Zr),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 xt=class{constructor(r,e,t,i,a){c(this,"_datachannel");c(this,"_participantIdRegistry",null);c(this,"_streamBuilders",{});c(this,"_onStream",()=>{});c(this,"_onEos",()=>{});c(this,"_onStat");d.debug("ScreenCaptureReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._onStream=t,this._onEos=i,this._onStat=a,this._datachannel.onmessage=s=>this._onDataChannelMessage(s.data)}_onDataChannelMessage(r){let e=an(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){d.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}if(e.eos){this.close(t),this._onEos(t);return}let i=this._streamBuilders[t];if(!i){let a=o=>this._onStream(t,o),s=()=>{this._requestKeyFrame(e.ssrc)};l.screenShareWebmBuilder&&Ot.isBrowserSupported()?i=new Ot(t,a,this._onStat):i=new Yt(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=on(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")}static isBrowserSupported(){return(ze.isBrowserSupported()||At.isBrowserSupported())&&(Yt.isBrowserSupported()||Ot.isBrowserSupported())}};var ta=class{constructor(r,e,t){c(this,"_prev");c(this,"_next");c(this,"_data");this._next=t,t&&(t.prev=this),this._prev=e,e&&(e.next=this),this._data=r}get prev(){return this._prev}set prev(r){this._prev=r}get next(){return this._next}set next(r){this._next=r}get data(){return this._data}},Ei=class{constructor(){c(this,"_head",null);c(this,"_tail",null);c(this,"_length",0)}get length(){return this._length}push(...r){for(let e of r)this._tail=new ta(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 ia=gi(require("@vkontakte/libvpx"));var zs=1e3,Qt=class extends qe{constructor(e,t,i,a){super();c(this,"_sourceTrack");c(this,"_onFrame");c(this,"_useCongestionControl");c(this,"_maxBitrate");c(this,"_useImageCapture");c(this,"_video",null);c(this,"_imageCapture",null);c(this,"_canvas",null);c(this,"_canvasCtx",null);c(this,"_frameReadTimeout",0);c(this,"_lastFrame",null);this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=i,this._maxBitrate=a,this._useImageCapture="ImageCapture"in window&&ImageCapture.prototype.grabFrame!==void 0&&"ImageBitmap"in window,(e.readyState!=="live"||!e.enabled||e.muted)&&(this._useImageCapture=!1)}_createDom(){this._canvas||(this._canvas=document.createElement("canvas"),this._canvas.style.pointerEvents="none",this._canvas.style.visibility="hidden",this._canvas.style.position="absolute",this._canvas.style.width="160px",this._canvas.style.height="90px",this._canvas.style.bottom="0",this._canvas.style.right="160px",this._canvas.style.zIndex="5000",this._canvasCtx=this._canvas.getContext("2d"),document.body.appendChild(this._canvas)),!this._video&&!this._useImageCapture&&(this._video=document.createElement("video"),this._video.controls=!1,this._video.autoplay=!1,this._video.preload="auto",this._video.muted=!0,this._video.style.pointerEvents="none",this._video.style.visibility="hidden",this._video.style.position="absolute",this._video.style.width="160px",this._video.style.height="90px",this._video.style.bottom="0",this._video.style.right="0",this._video.style.zIndex="5000",document.body.appendChild(this._video))}_removeDom(){try{this._canvas&&document.body.removeChild(this._canvas),this._video&&document.body.removeChild(this._video)}catch{}this._canvasCtx=null,this._canvas=null,this._video=null}async _createStream(e){if(!this._canvas)throw new Error("Canvas not found");if(!this._video&&!this._useImageCapture)throw new Error("Video element not found");return new Promise((t,i)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let a=this._video;a.srcObject=new MediaStream([e]),a.onloadeddata=u=>t(),a.onerror=()=>i(new Error("Video element error"));let s=a.play(),o=()=>i(new Error("Autoplay is disabled"));s?s.catch(o):o()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw new Error("Fatal error");this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw new Error("Destroyed");return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw new Error("Destroyed");let t=e.width,i=e.height;return this._canvas.width=t,this._canvas.height=i,this._canvasCtx.clearRect(0,0,t,i),this._canvasCtx.drawImage(e,0,0,t,i),this._canvasCtx?.getImageData(0,0,t,i)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;d.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?"VP9":"VP8"}`),await this._createStream(this._sourceTrack),await this._createWorker(`"use strict";var exports=(()=>{var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var V=(a,r)=>{for(var s in r)u(a,s,{get:r[s],enumerable:!0})},h=(a,r,s,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of y(r))!x.call(a,e)&&e!==s&&u(a,e,{get:()=>r[e],enumerable:!(i=R(r,e))||i.enumerable});return a};var A=a=>h(u({},"__esModule",{value:!0}),a);var M={};V(M,{default:()=>F});var F=(a,r,s,i)=>{let e;function m(t,o){return a({locateFile:r}).then(n=>{if(e=new n.VpxEncoder,e.debug(o),!e.init(t?n.VpxType.VP9:n.VpxType.VP8))throw self.postMessage({type:"log_error",message:"encoder-init-fail-libvpx"}),new Error("LibVPxEncoder failed to create");if(s){let d=Math.round(i/1e3);e.setTargetBitrate(d)}else e.setMaxQuantizer(10),e.setTargetBitrate(1024)})}function E(t,o,n,p){let d=e.allocateImage(t,o);if(!d){self.postMessage({type:"frame",error:"No buffer data"});return}d.set(new Uint8Array(n));let l=Math.round(performance.now()),f=150;if(!e.encode(l,f,p)){self.postMessage({type:"frame",error:"Encode failed"});return}let b=e.readFrame();if(!b){self.postMessage({type:"frame",error:"No encoded data"});return}e.readFrame()&&(self.postMessage({type:"debug",message:"LibVPxEncoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxEncoder-drop"}));let c=new Uint8Array(b.byteLength);c.set(b),self.postMessage({type:"frame",frameType:p?"key":"delta",timestamp:l,duration:f,width:t,height:o,data:c.buffer},[c.buffer])}function g(t,o){let n=Math.round(t/1e3);e.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case"init":m(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:"ready"})).catch(o=>self.postMessage({type:"error",error:String(o)}));break;case"frame":E(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case"set_bitrate":g(t.data.bitrate,t.data.useCbr);break}}};return A(M);})();
|
|
10
|
-
`,i=>{i.error?this._onFrame(null,i.error):this._onFrame({type:i.frameType,timestamp:i.timestamp,duration:i.duration,data:i.data,byteLength:i.data?.byteLength,width:i.width,height:i.height})},[
|
|
11
|
-
`,a=>{a.error?this._onFrame(null,a.error):this._onFrame({type:a.frameType,timestamp:a.timestamp,duration:a.duration,data:a.data,byteLength:a.data?.byteLength,width:a.width,height:a.height})},[],{readable:i,width:e,height:t,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[i])}requestFrame(e=!1){this._sendToWorker("frame",{keyFrame:e})}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t,fps:i})}isVP9(){return!0}destroy(){this._removeWorker(),d.debug("WebCodecsEncoder destroyed")}static isBrowserSupported(){return"VideoEncoder"in window&&"Worker"in window&&"EncodedVideoChunk"in window&&"MediaStreamTrackProcessor"in window}};var Js=2100,Ys=600,Qs=1.2,cn=.8,Xs=2e3,Zs=8e3,ra=8e3,eo=16e3,to=4,io=2e3,$i=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))($i||{}),Ti=class{constructor(r,e,t,i,a,s,o){c(this,"_onCongestion");c(this,"_ccEnabled");c(this,"_fastSharing");c(this,"_trendDelayThreshold");c(this,"_highDelayThreshold");c(this,"_targetFps");c(this,"_minBitrate");c(this,"_maxBitrate");c(this,"_targetBitrate");c(this,"_lastDown");c(this,"_lastUp");c(this,"_lastProbing");c(this,"_lastCheckDelay");c(this,"_upPenalty",0);c(this,"_probing");c(this,"_delayAvgShort",-1);c(this,"_delayAvgLong",-1);c(this,"_minDelay",Number.MAX_VALUE);c(this,"_maxDelay",0);c(this,"_largeDelayDuration",0);c(this,"_lastFpsCalcMs");c(this,"_frames",0);c(this,"_fps",0);this._onCongestion=r,this._ccEnabled=i,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=a,this._targetFps=o,s>0?this._highDelayThreshold=s:this._highDelayThreshold=Js,a&&(this._highDelayThreshold=Ys),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let u=Date.now();this._lastDown=0,this._lastUp=u,this._lastProbing=u,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(r,e,t){let i=Date.now();if(this._calcFps(i),this._calcDelay(e,i),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let a=0,s=this._delayAvgShort-this._delayAvgLong,o=Math.round(Math.abs(s)*100/this._delayAvgLong),u=s>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,p=this._delayAvgShort>this._highDelayThreshold;u||p?a=2:Math.abs(s)<40&&o<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=${o} -> ${$i[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>Xs){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,to),this._probing=!1);let de=cn*h*1e3;if(de>=this._targetBitrate&&(de=this._targetBitrate*cn),de=Math.max(de,this._minBitrate),de<this._targetBitrate){let Ce=Math.round(de/1e3),Pe=Math.round(this._upPenalty*ra/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${$i[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Ce} penalty=${Pe}s`),this._setBitrate(de,!0),this._targetBitrate=de}this._lastDown=i}let C=i-this._lastUp,M=Zs+this._upPenalty*ra;if(a===1&&C>M&&E>M){let de=Math.min(this._targetBitrate*Qs,this._maxBitrate);if(de>this._targetBitrate){let Ce=Math.round(de/1e3),Pe=Math.round(this._targetBitrate/1e3),Y=Math.round(this._upPenalty*ra/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${$i[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${Pe} -> newBitrate=${Ce} penalty=${Y}s`),this._setBitrate(de,!1),this._targetBitrate=de,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let H=i-this._lastProbing;this._probing&&H>eo&&(this._probing=!1);let q=i-this._lastDown;this._upPenalty>0&&q>3*M&&(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>io){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 Ri=class{constructor(r){c(this,"_maxSize");c(this,"_size",0);c(this,"_buffer");c(this,"_head",0);c(this,"_tail",0);this._maxSize=r,this._buffer=new Array(r)}add(r,e,t,i,a){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let s=this._tail;return this._buffer[this._tail]={seq:r,ts:e,size:t,sent:Date.now(),start:i,end:a,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,s}update(r,e){let t=this.get(r);return t===null?null:(t.ts2=e,t.recv=Date.now(),t)}get(r){let e=this._head;for(let t=0;t<this._maxSize;t++){let i=this._buffer[e];if(r===i?.seq)return i;if(e=++e%this._maxSize,e===this._tail)break}return null}getServerBitrateK(r){let e=0,t=0,i=-1,a=-1,s=this._tail;for(let o=0;o<this._maxSize;o++){s>0?--s:s=this._maxSize-1;let u=this._buffer[s];if(!u||(a===-1&&(a=u.ts2,t=0),a>=0&&(t+=u.size),i=u.ts2,a-i>=r)||s===this._head)break}if(i>=0&&a>=0){let o=a-i;e=Math.round(o>0?t*8/o:0)}return e}getCurrentDelay(){let r=this._tail;for(let e=0;e<this._maxSize;e++){r>0?--r:r=this._maxSize-1;let t=this._buffer[r];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(r===this._head)break}return 0}getMaxBandwidth(){let r=0,e=0,t=-1,i=-1,a=this._tail;for(let s=0;s<this._maxSize;s++){a>0?--a:a=this._maxSize-1;let o=this._buffer[a];if(o){if(i===-1&&o.end&&!o.start&&(i=o.ts2,e=0),t===-1&&i>=0&&o.start&&!o.end&&(t=o.ts2),t>=0&&i>=0){let u=i-t;r=u>0?e*8/u:0;break}if(i>=0&&(e+=o.size),a===this._head)break}}return Math.round(r)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}};var aa=65536,ao=50,no=400,so=1e6,oo=3e5,co=3e4,lo=2e3,po=5,qi=0,Lt=class{constructor(r,e,t,i){c(this,"_encoder");c(this,"_datachannel");c(this,"_signaling");c(this,"_fastSharing");c(this,"_destroyed",!1);c(this,"_needKeyframe",!0);c(this,"DATA_SIZE");c(this,"_congestionControl");c(this,"_frameNum",0);c(this,"_width");c(this,"_height");c(this,"_feedback",new Ri(1024));c(this,"_lastSentFrameSeq",0);c(this,"_lastDeliveredFrameSeq",0);c(this,"_lastFrameDelay",0);c(this,"_lastFramerateReduced",Date.now());c(this,"_lastSharingStat",Date.now());c(this,"_congestionControlEnabled");c(this,"_queue",new Ei);c(this,"_fpsMeter");c(this,"_maxFrameDelay");d.debug("ScreenCaptureSender started"),this.DATA_SIZE=l.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=i,this._congestionControlEnabled=l.screenShareCongestionControl||this._fastSharing,this._width=r.getSettings().width,this._height=r.getSettings().height,this._maxFrameDelay=this._fastSharing?l.screenShareCongestionControlThreshold:l.screenShareCongestionControlThreshold*2;let a=l.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:o}=this._calcMinMaxBitrate(this._width,this._height),u=this._onCongestionCallback.bind(this);d.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(o/1e3)}k delayThreshold=${l.screenShareCongestionControlThreshold}`),this._congestionControl=new Ti(u,s,o,this._congestionControlEnabled,this._fastSharing,l.screenShareCongestionControlThreshold,a);let p=(m,h)=>{if(this._destroyed)return;if(!m){d.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),this._needKeyframe=!0,this._handleQueue();return}(m.width!==this._width||m.height!==this._height)&&(this._width=m.width,this._height=m.height,this._onResize(this._width,this._height));let E=this._sliceFrame(m);this._queue.merge(E),this._handleQueue(),this._sendSharingStat()};if(Nt.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Nt(r,p,this._congestionControlEnabled,o,m,a)}else this._encoder=new Qt(r,p,this._congestionControlEnabled,o);this._datachannel.onmessage=m=>{nn(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=sn(m.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(m=>d.warn("ScreenCaptureSender init failed",m)),this._fpsMeter=new Dt(m=>d.log(`[ScreenCaptureSender] fps: ${m}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+aa)%aa>po&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>lo&&(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 Ei;for(let a=0;a<t;a+=this.DATA_SIZE){let s=r.data.slice(a,a+this.DATA_SIZE),o=a===0,u=t<=a+s.byteLength,p=this._wrapHeader(r.timestamp,o,u,e,s);i.push({data:p.data,sequence:p.sequence,frameSize:t,isFirst:o,isLast:u,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=rn(r,e,t,i,qi,this._encoder.isVP9(),a),o={sequence:qi,data:s};return qi=(qi+1)%aa,o}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(r){if(!this._datachannel||this._datachannel.readyState!=="open")return!1;try{return this._datachannel.send(r.data),this._feedback.add(r.sequence,r.timestamp,r.data.byteLength,r.isFirst,r.isLast),r.isLast&&(this._lastSentFrameSeq=r.sequence),!0}catch(e){return d.warn("Error sending chunk to DataChannel",e),!1}}destroy(){this._queue.clear(),this._fpsMeter.destroy(),this._datachannel.onmessage=null,this._feedback.clear(),this._datachannel.readyState==="open"&&this._datachannel.send(this._stopPacket()),this._destroyed=!0,this._encoder.destroy(),d.debug("ScreenCaptureSender destroyed")}static isBrowserSupported(){return Nt.isBrowserSupported()||Qt.isBrowserSupported()}_onCongestionCallback(r,e,t){this._encoder.setBitrate(r,e,t)}_onResize(r,e){let{minBitrate:t,maxBitrate:i}=this._calcMinMaxBitrate(r,e),a=Math.round(t/1e3),s=Math.round(i/1e3);d.log(`cc: resize to ${r}x${e}, minBitrate=${a} maxBitrate=${s}`),this._congestionControl.reconfigure(t,i)}_calcMinMaxBitrate(r,e){(r===void 0||r<640)&&(r=640),(e===void 0||e<360)&&(e=360);let t=r*e/256,i=Math.max(oo,Math.min(so,Math.round(t*ao))),a=Math.round(t*no);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>co){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var Ge=class Ge{static get sessionKey(){return Ge._sessionKey}static set sessionKey(r){Ge._sessionKey=r}static get sessionSecretKey(){return Ge._sessionSecretKey}static set sessionSecretKey(r){Ge._sessionSecretKey=r}static get accessToken(){return Ge._accessToken}static set accessToken(r){Ge._accessToken=r}static isEmpty(){return!Ge._sessionKey}};c(Ge,"_sessionKey"),c(Ge,"_sessionSecretKey"),c(Ge,"_accessToken");var be=Ge;var g=class g{static set(r){Object.hasOwn(r,"voiceParams")&&(Object.assign(g._params.voiceParams,r.voiceParams),delete r.voiceParams),Object.hasOwn(r,"specListenerParams")&&(Object.assign(g._params.specListenerParams,r.specListenerParams),delete r.specListenerParams),Object.hasOwn(r,"apiAuth")&&(be.accessToken=r.apiAuth.accessToken,be.sessionKey=r.apiAuth.sessionKey,be.sessionSecretKey=r.apiAuth.sessionSecretKey),Object.assign(g._params,I.objectFilterOutValues(r,void 0))}static get(r){return g._params[r]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.10-dev.af368d75.0"}static get debug(){return g._params.debug}static get protocolVersion(){return g._params.joinFromMultipleDevices?6:5}static get platform(){return g._params.platform}static set platform(r){g._params.platform=r}static get clientStatsPlatform(){return g._params.clientStatsPlatform}static set clientStatsPlatform(r){g._params.clientStatsPlatform=r}static get clientType(){return g._params.clientType}static set clientType(r){g._params.clientType=r}static get externalUserType(){return g._params.externalUserType}static set externalUserType(r){g._params.externalUserType=r}static get device(){return g._params.device}static get apiKey(){return g._params.apiKey}static get apiEnv(){return g._params.apiEnv}static get apiBaseUrl(){return g._params.apiBaseUrl}static set apiBaseUrl(r){g._params.apiBaseUrl=r}static apiEndpoint(r){switch(r??g.apiEnv){case"AUTO":case"PROD":return"https://api.mycdn.me";case"CALLS":return"https://calls.okcdn.ru";case"PROD_OK":return"https://api.ok.ru";case"TEST":return"https://apitest.ok.ru/api";case"VIDEOTEST":return"https://videotestapi.ok.ru/api";case"CALLSTEST":return"https://calls-test.okcdn.ru/api";case"CALLS_BETA":return"https://api-beta.calls-test.oneme.ru/api";case"CALLS_BENDER":return"https://api-bender.calls-test.oneme.ru/api";case"CALLS_MAMES":return"https://api-mames.calls-test.oneme.ru/api";case"CALLS_MARS":return"https://api-mars.calls-test.oneme.ru/api";default:return g._params.apiEnv}}static get apiTimeout(){return g._params.apiTimeout}static get apiMaxAttempt(){return g._params.apiMaxAttempt}static get authToken(){return g._params.authToken}static set authToken(r){g._params.authToken=r}static get anonymToken(){return g._params.anonymToken}static set anonymToken(r){g._params.anonymToken=r}static get domain(){return g._params.domain}static get externalDomain(){return g._params.externalDomain}static get iceServers(){return g._params.iceServers}static set iceServers(r){g._params.iceServers=r}static get wssBase(){return g._params.wssBase}static set wssBase(r){g._params.wssBase=r}static get wtsBase(){return g._params.wtsBase}static set wtsBase(r){g._params.wtsBase=r}static get wssToken(){return g._params.wssToken}static set wssToken(r){g._params.wssToken=r}static get signalingReconnectDelay(){return g._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return g._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return g._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return g._params.waitConnectionDelay}static get waitResponseDelay(){return g._params.waitResponseDelay}static get waitMessageDelay(){return g._params.waitMessageDelay}static get waitAnotherTabDelay(){return g._params.waitAnotherTabDelay}static get debugLog(){return g._params.debugLog}static get forceRelayPolicy(){return g._params.forceRelayPolicy}static set forceRelayPolicy(r){g._params.forceRelayPolicy=r}static get videoMinWidth(){return g._params.videoMinWidth}static get videoMaxWidth(){return g._params.videoMaxWidth}static set videoMaxWidth(r){g._params.videoMaxWidth=r}static get videoMinHeight(){return g._params.videoMinHeight}static get videoMaxHeight(){return g._params.videoMaxHeight}static set videoMaxHeight(r){g._params.videoMaxHeight=r}static get videoAspectRatio(){return g._params.videoAspectRatio}static get videoFrameRate(){return g._params.videoFrameRate}static get videoFacingMode(){return g._params.videoFacingMode||(b.isMobile()?"user":null)}static set videoFacingMode(r){g._params.videoFacingMode=r}static get displaySurface(){return g._params.displaySurface}static get audioEffects(){return g._params.audioEffects}static set audioEffects(r){g._params.audioEffects=r,g._params.audioEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffects(){return g._params.videoEffects}static set videoEffects(r){g._params.videoEffects=r,g._params.videoEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffectMaxWidth(){return g._params.videoEffectMaxWidth}static set videoEffectMaxWidth(r){g._params.videoEffectMaxWidth=r}static get videoEffectMaxHeight(){return g._params.videoEffectMaxHeight}static set videoEffectMaxHeight(r){g._params.videoEffectMaxHeight=r}static get vmoji(){return g._params.vmoji?.isBrowserSupported()?g._params.vmoji:null}static set vmoji(r){g._params.vmoji=r}static get vmojiOptions(){return g._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(r){g._params.vmojiOptions=r}static get voiceParams(){return g._params.voiceParams}static get specListenerParams(){return g._params.specListenerParams}static get iceRestartWaitTime(){return g._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return g._params.transportConnectionWaitTime}static get statisticsInterval(){return g._params.statisticsInterval}static set statisticsInterval(r){g._params.statisticsInterval=r}static get networkStatisticsInterval(){return g._params.networkStatisticsInterval}static get perfStatReportEnabled(){return g._params.perfStatReportEnabled}static get callStatReportEnabled(){return g._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return g._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return g._params.enableLogPerfStatReport}static get producerNotificationDataChannel(){return g._params.producerNotificationDataChannel}static get producerCommandDataChannel(){return g._params.producerCommandDataChannel}static get consumerScreenDataChannel(){return g._params.consumerScreenDataChannel&&Lt.isBrowserSupported()}static get producerScreenDataChannel(){return g._params.producerScreenDataChannel&&g.producerNotificationDataChannel&&xt.isBrowserSupported()}static get asrDataChannel(){return g._params.asrDataChannel&&g.producerNotificationDataChannel}static get consumerScreenDataChannelPacketSize(){return g._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return g._params.screenShareWebmBuilder}static get noiseSuppression(){return g._params.noiseSuppression}static set noiseSuppression(r){g._params.noiseSuppression=r}static get preferH264(){return g._params.preferH264}static get preferVP9(){return g._params.preferVP9}static get audioNack(){return g._params.audioNack}static get consumerScreenTrack(){return g._params.consumerScreenTrack&&g.consumerScreenDataChannel}static get producerScreenTrack(){return g._params.producerScreenTrack}static get movieShare(){return g._params.movieShare&&g.videoTracksCount>0}static get videoTracksCount(){return g.producerNotificationDataChannel?Number(g._params.videoTracksCount):0}static get breakVideoPayloadTypes(){return g._params.breakVideoPayloadTypes}static get useCallsToContacts(){return g._params.useCallsToContacts}static get useParticipantListChunk(){return g._params.useParticipantListChunk&&g.videoTracksCount>0}static get useRooms(){return g._params.useRooms}static get useChatRooms(){return g._params.useChatRooms}static get addParticipant(){return g._params.addParticipant}static get waitForAdminInGroupCalls(){return g._params.waitForAdminInGroupCalls}static get participantListChunkInitIndex(){return g._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return g._params.participantListChunkInitCount??null}static get serverAudioRed(){return g._params.serverAudioRed}static get p2pAudioRed(){return g._params.p2pAudioRed}static get h264spsPpsIdrInKeyframe(){return g._params.h264spsPpsIdrInKeyframe}static get filterObservers(){return g._params.filterObservers}static get muteMode(){return g._params.muteMode}static get preserveAudioTracks(){return g._params.preserveAudioTracks}static get audioShare(){return b.isAudioShareSupported()&&g._params.audioShare}static get fastScreenShare(){return g._params.fastScreenShare}static get screenShareCongestionControl(){return g._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return g._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return g._params.fastScreenShareWidth}static get fastScreenShareHeight(){return g._params.fastScreenShareHeight}static get consumerFastScreenShare(){return g._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return g._params.consumerFastScreenShareQualityOnDemand}static get newMuteRules(){return g._params.newMuteRules}static get videoSuspend(){return g._params.videoSuspend}static get enumerateDevicesDelay(){return g._params.enumerateDevicesDelay}static getScreenFrameRate(r){return r?g._params.fastScreenShareFrameRate:g._params.screenFrameRate}static get switchVideoAtBadNetwork(){return g._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return g._params.enableVideoEffectsFpsDegradation}static get simulcast(){return g._params.simulcast}static set simulcast(r){g._params.simulcast=r}static get webtransport(){return g._params.webtransport}static set webtransport(r){g._params.webtransport=r}static get webtransportFF(){return g._params.webtransportFF}static set webtransportFF(r){g._params.webtransportFF=r}static toJSON(){return{apiKey:g._params.apiKey,apiEnv:g._params.apiEnv,audioShare:g._params.audioShare,useCallsToContacts:g._params.useCallsToContacts,useParticipantListChunk:g._params.useParticipantListChunk,useRooms:g._params.useRooms,useChatRooms:g._params.useChatRooms,addParticipant:g._params.addParticipant,fastScreenShare:g._params.fastScreenShare,participantListChunkInitCount:g._params.participantListChunkInitCount,screenShareCongestionControl:g._params.screenShareCongestionControl,screenShareCongestionControlThreshold:g._params.screenShareCongestionControlThreshold,videoTracksCount:g._params.videoTracksCount,asrDataChannel:g._params.asrDataChannel,videoMaxHeight:g._params.videoMaxHeight,videoMaxWidth:g._params.videoMaxWidth,videoEffectMaxHeight:g._params.videoEffectMaxHeight,videoEffectMaxWidth:g._params.videoEffectMaxWidth,videoSuspend:g._params.videoSuspend,debugLog:g._params.debugLog,callStatReportEnabled:g._params.callStatReportEnabled,joinFromMultipleDevices:g._params.joinFromMultipleDevices,movieShare:g._params.movieShare,newMuteRules:g._params.newMuteRules,clientType:g._params.clientType,clientStatsPlatform:g._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:g._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:g._params.switchVideoAtBadNetwork,simulcast:g._params.simulcast,webtransport:g._params.webtransport,webtransportFF:g._params.webtransportFF}}};c(g,"_params",{platform:"WEB",clientStatsPlatform:"",clientType:"PORTAL",externalUserType:"",device:"browser",apiKey:"",authToken:"",anonymToken:"",apiEnv:"AUTO",apiBaseUrl:null,domain:"",externalDomain:"",iceServers:[],wssBase:"",wtsBase:"",wssToken:"",signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,apiTimeout:5e3,apiMaxAttempt:10,forceRelayPolicy:!1,videoMinWidth:428,videoMinHeight:240,videoMaxWidth:1280,videoMaxHeight:720,videoAspectRatio:16/9,videoFrameRate:25,screenFrameRate:15,videoFacingMode:null,displaySurface:"monitor",audioEffects:null,videoEffects:null,videoEffectMaxWidth:640,videoEffectMaxHeight:360,vmoji:null,vmojiOptions:null,iceRestartWaitTime:2e4,transportConnectionWaitTime:5e3,statisticsInterval:5e3,networkStatisticsInterval:2e4,perfStatReportEnabled:!0,callStatReportEnabled:!1,clientEventsLoggingEnabled:!1,enableLogPerfStatReport:!1,voiceParams:{smoothing:.8,minFreq:200,maxFreq:5e3,interval:500,threshold:.35,speakerLevelMultiplier:1.8},specListenerParams:{connectionTimeout:1e4,volumeTimeout:1e4},producerNotificationDataChannel:!0,producerCommandDataChannel:!0,consumerScreenDataChannel:!0,producerScreenDataChannel:!0,asrDataChannel:!1,consumerScreenDataChannelPacketSize:64*1024,screenShareWebmBuilder:!1,noiseSuppression:!0,preferH264:!1,preferVP9:!1,audioNack:!0,consumerScreenTrack:!0,producerScreenTrack:!0,videoTracksCount:30,movieShare:!1,useCallsToContacts:!1,useParticipantListChunk:!1,useRooms:!1,useChatRooms:!1,addParticipant:!1,waitForAdminInGroupCalls:!1,participantListChunkInitIndex:0,participantListChunkInitCount:null,serverAudioRed:!0,p2pAudioRed:!0,h264spsPpsIdrInKeyframe:!0,breakVideoPayloadTypes:!1,joinFromMultipleDevices:!1,filterObservers:!1,muteMode:!1,preserveAudioTracks:!1,audioShare:!1,fastScreenShare:!1,screenShareCongestionControl:!1,screenShareCongestionControlThreshold:2100,consumerFastScreenShare:!1,consumerFastScreenShareQualityOnDemand:!1,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,newMuteRules:!1,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,webtransportFF:!1});var l=g;function dn(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 Me(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var ln=n=>n.stop(),Ci=n=>n.getTracks().forEach(ln),pn=n=>n.getVideoTracks().forEach(ln);async function zi(n,r){try{let e=typeof r.width=="number"?r.width:void 0,t=typeof r.height=="number"?r.height:void 0;await n.applyConstraints({...r,...e&&{width:{max:e,ideal:e}},...t&&{height:{max:t,ideal:t}}})}catch(e){d.warn("setVideoConstraints failed",e)}}var Ji=class extends oe{constructor(){super(...arguments);c(this,"FPS_LIMITS",[13,20,Math.max(l.videoFrameRate,25)]);c(this,"THRESHOLD",.8);c(this,"HISTORY_LENGTH",10);c(this,"_fpsMeterUnsubscribe",null);c(this,"_fpsHistory",{cursor:0,arr:[]});c(this,"_fpsLimitCursor",this.FPS_LIMITS.length-1)}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(t){d.warn("VideoEffectsFpsLimiter error",t)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let t=this._fpsHistory.arr.reduce((a,s)=>a+s,0)/this.HISTORY_LENGTH,i=this.FPS_LIMITS[this._fpsLimitCursor];t<i*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),i!==this.fpsLimit&&this._triggerEvent("fps-limit",this.fpsLimit)}}_assertsVideoEffect(e){if(!("addFpsMeterListener"in e))throw new Error("Outdated VideoEffect version")}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}};var He=(i=>(i.audio="audio",i.video="video",i.screen="screen",i.audioshare="audioshare",i))(He||{});var Yi=class extends oe{constructor(){super();c(this,"_stream",null);c(this,"_screenTrack",null);c(this,"_audioShareTrack",null);c(this,"_screenShareTrack",null);c(this,"_sendVideoTrack",null);c(this,"_cameraVideoTrack",null);c(this,"_micAudioTrack",null);c(this,"_audioEffectsTrack",null);c(this,"_mediaSettings",Me());c(this,"_videoStatusOnScreenCapturingEnabled",!1);c(this,"_effect",null);c(this,"_audioEffectParams",null);c(this,"_onDeviceChange");c(this,"_animojiEnabled",!1);c(this,"_videoEffectsFpsLimiter");c(this,"videoTrackMuteHandler",()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)});this._initDeviceChangeListener(),l.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),l.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Ji,this._videoEffectsFpsLimiter.addEventListener("fps-limit",this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener("mute",this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&this._cameraVideoTrack.addEventListener("mute",this.videoTrackMuteHandler),l.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[ce.AUDIO],t=!0){if(this._stream)return;let i=e.includes(ce.VIDEO),a=e.includes(ce.AUDIO),s=e.includes(ce.ANIMOJI);if(!b.isBrowserSupported())throw new j(se.UNSUPPORTED);try{this._stream=await b.getUserMedia(i,a,t),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=i&&this._stream.getVideoTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(o){throw new j(o)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,i){let a=this.getStream(),s=this.getSendAudioTrack(),o=this.getSendVideoTrack(i);if(!a||!s&&!o&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,a),o&&!t&&e.addTrack(o,a)}getMediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case"videoinput":if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case"audioinput":if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(se.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&pn(this._stream),this.cameraVideoTrack?.stop())}async setVideoStream(e,t){return t?this._changeScreen(!1,!1,e):this._changeVideoInput(e)}_initDeviceChangeListener(){!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices||!navigator.mediaDevices.addEventListener||(this._onDeviceChange=async e=>{if(!this._stream)return;let t=b.getSavedMicrophone(),i=b.getSavedCamera(),a=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,s=this._mediaSettings.isVideoEnabled&&i?.groupId!==e.camera?.groupId;try{a&&await this._changeAudioInput(),s&&await this._changeVideoInput()}catch{}},b.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&b.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await b._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=i.getVideoTracks()[0],!this._stream)Ci(i);else{l.consumerScreenTrack||await this._disableScreenCapture();let a=await this._setEffect(this._effect,this.cameraVideoTrack);R.log(D.DEVICE_CHANGED,t),d.log("Video stream changed"),await this._replaceLocalTrack(a),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw R.log(D.ERROR,"change_video"),d.warn("Camera change failed",t),t}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await b.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)Ci(t);else{let i=await this._applyAudioEffect();R.log(D.DEVICE_CHANGED,"audio"),d.log("Audio stream changed",i),await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw R.log(D.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await b.getScreenMedia(e,t),!this._stream)Ci(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),l.consumerScreenTrack||this._stopEffect(),R.log(D.DEVICE_CHANGED,"screen"),d.log("Screen capturing started"),this._screenTrack=a,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,l.consumerScreenTrack||(this._videoStatusOnScreenCapturingEnabled=this._mediaSettings.isVideoEnabled,this._mediaSettings.isVideoEnabled=!0,this._sendVideoTrack=l.consumerScreenDataChannel?b.getBlackMediaTrack(l.videoMinWidth,l.videoMinHeight):a,await this._replaceLocalTrack(a,this._sendVideoTrack)),l.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(a.contentHint="motion",this._screenShareTrack=a),i.getAudioTracks().length>0){let s=i.getAudioTracks()[0];s.contentHint="music",this._audioShareTrack=s,await this._replaceLocalTrack(s),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&d.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:a}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(a){throw R.log(D.ERROR,"screen"),d.warn("Screen capturing failed",a),a}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent("SCREEN_STATUS",{track:null}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"}))}async disableAudioShare(){await this.stopAudioShareTrack(),this._triggerEvent("SCREEN_STATUS",{track:null}),this._triggerEvent("SOURCE_CHANGED",{kind:"audioshare"})}async stopAudioShareTrack(){if(this._audioShareTrack){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!l.audioEffects||!this._audioEffectParams)return l.audioEffects?.pause(),this._micAudioTrack;l.audioEffects.isInitialized||await l.audioEffects.init(),l.audioEffects.resume(),l.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),l.audioEffects.setSource(this._micAudioTrack);let e=l.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=b.getSilentMediaTrack();return e.contentHint="music",e.stop(),e}getBlackScreenShareTrack(){let e=b.getBlackMediaTrack();return e.contentHint="motion",e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let i=this._stream.getTracks().find(a=>a.kind===e.kind&&a.contentHint===e.contentHint);i?.id!==e.id&&(i?(i!==this._audioEffectsTrack&&i.stop(),this._stream?.removeTrack(i),this._stream?.addTrack(e),this._triggerEvent("TRACK_REPLACED",e,t)):(this._stream.addTrack(e),this._triggerEvent("TRACK_REPLACED",e,t)))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(l.videoEffects),!l.videoEffects)return t;try{return l.videoEffects.setEffect(e,t)}catch(i){return d.warn("Video effect failed",i),t}}_stopEffect(){if(l.videoEffects)try{l.videoEffects.stopEffect()}catch(e){d.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),l.videoEffects&&(this._effect=null,l.videoEffects.destroy()),l.audioEffects&&l.audioEffects.destroy(),this._stream&&(Ci(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),b.getAudioContext()?.suspend().catch(t=>d.error(t)),this._videoEffectsFpsLimiter?.destroy()}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return l.consumerScreenTrack?this._disableScreenCapture():(e.captureAudio||await this.disableAudioShare(),this._videoStatusOnScreenCapturingEnabled?this._changeVideoInput():this.toggleVideo(!1))}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;l.consumerScreenTrack||await this._disableScreenCapture(),this.cameraVideoTrack?.stop();let t;if(e){let i=await b._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=b.getBlackMediaTrack(l.videoMinWidth,l.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent("ANIMOJI_STATUS",!e);return}this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(i,a)=>{await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=a,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})};if(e)try{let i=await b.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw l.audioEffects?.pause(),t(b.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else l.audioEffects?.pause(),t(b.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent("ANIMOJI_STATUS",e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}async setResolution({video:e,effect:t}){if(!l.consumerScreenTrack&&this._mediaSettings.isScreenSharingEnabled||!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw new Error("Local stream not found");if(!this.cameraVideoTrack)throw new Error("Local video track not found");let i=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,i)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(t=>!t.contentHint);if(!e)throw new Error("Local audio track not found");if(e.enabled)return e.applyConstraints({noiseSuppression:l.noiseSuppression})}async videoEffect(e){if(!l.videoEffects)throw new Error("Video Effects library is not set");if(!l.consumerScreenTrack&&this._mediaSettings.isScreenSharingEnabled)throw new Error("Can't apply effect to screensharing");if(R.log(D.DEVICE_CHANGED,`effect_${e?.effect||"none"}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let i=this.cameraVideoTrack.clone(),a=new MediaStream([i]);await this._applyVideoConstraints(i),await this._changeVideoInput(a)}catch(i){this._effect=t;let a=this.cameraVideoTrack.clone(),s=new MediaStream([a]);throw await this._changeVideoInput(s),i}}}async audioEffect(e){if(!l.audioEffects)throw new Error("Audio Effects library is not set");if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!I.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let i=this._micAudioTrack.clone(),a=new MediaStream([i]);await this._changeAudioInput(a)}catch(i){this._audioEffectParams=t;let a=this._micAudioTrack.clone(),s=new MediaStream([a]);throw await this._changeAudioInput(s),i}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<l.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(t=>{d.warn("MediaSource handleVideoEffectsLowFps error",t)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??l.videoFrameRate;return this._effect?Math.min(e,l.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await zi(e,{width:this._effect?l.videoEffectMaxWidth:l.videoMaxWidth,height:this._effect?l.videoEffectMaxHeight:l.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}};var Pi=class{constructor(){c(this,"_cameraPermissionStatus");c(this,"_microphonePermissionStatus");c(this,"_listener")}static isSupported(){return b.browserName()!=="Firefox"&&"permissions"in navigator&&"PermissionStatus"in window}async init(r){try{let[e,t]=await Promise.all([navigator.permissions.query({name:"camera"}),navigator.permissions.query({name:"microphone"})]);this._cameraPermissionStatus=e,this._microphonePermissionStatus=t,this._listener=r,this._cameraPermissionStatus.onchange=i=>this.handlePermissionChange(i),this._microphonePermissionStatus.onchange=i=>this.handlePermissionChange(i)}catch(e){d.warn("NavigatorPermissions init error",e)}}handlePermissionChange(r){let e=r.target;if(e instanceof PermissionStatus){let{name:t,state:i}=e;switch(t){case"audio_capture":this._listener("microphone",i);break;case"video_capture":this._listener("camera",i);break}}}getPermissionState(r){let e=null;switch(r){case"camera":e=this._cameraPermissionStatus.state;break;case"microphone":e=this._microphonePermissionStatus.state;break}return e}};var Qi=(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))(Qi||{});function G(n,...r){let e=l.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function _e(n,r,...e){if(l.filterObservers){if(Array.isArray(r)){if(r=r.filter(t=>!t.observer),!r.length)return}else if(r.observer)return}G(n,r,...e)}function Ae(n){return Object.assign({},n)}function Ut(n){return n.slice()}var na;(ll=>{function n(S,A){G("onLocalStream",S,Ae(A))}ll.onLocalStream=n;function r(S,A){G("onScreenStream",S,Ae(A))}ll.onScreenStream=r;function e(S,A){G("onVmojiStream",S,Ae(A))}ll.onVmojiStream=e;function t(S){G("onVmojiError",S)}ll.onVmojiError=t;function i(S,A){G("onLocalStreamUpdate",Ae(S),A)}ll.onLocalStreamUpdate=i;function a(S){d.debug("Local status:",S),G("onLocalStatus",S)}ll.onLocalStatus=a;function s(S,A){_e("onRemoteStream",S,A)}ll.onRemoteStream=s;function o(S,A){_e("onRemoteLive",S,A)}ll.onRemoteLive=o;function u(S,A){_e("onLocalLive",S,A)}ll.onLocalLive=u;function p(S,A){_e("onRemoteLiveUpdate",S,A)}ll.onRemoteLiveUpdate=p;function m(S,A){_e("onLocalLiveUpdate",S,A)}ll.onLocalLiveUpdate=m;function h(S,A){_e("onRemoteScreenStream",S,A)}ll.onRemoteScreenStream=h;function E(S,A){_e("onRemoteVmojiStream",S,A)}ll.onRemoteVmojiStream=E;function C(S,A,$){_e("onRemoteStreamSuspended",S,A,$)}ll.onRemoteStreamSuspended=C;function M(S,A,$,Ue,bt){_e("onConversation",S,Ae(A),Ae($),Ue,bt)}ll.onConversation=M;function H(S){S&&G("onConversationParticipantListChunk",S)}ll.onConversationParticipantListChunk=H;function q(S,A,$){_e("onRemoteMediaSettings",S,Ae(A),$)}ll.onRemoteMediaSettings=q;function de(S,A){_e("onLocalMediaSettings",S,Ae(A))}ll.onLocalMediaSettings=de;function Ce(S,A,$){_e("onRemoteSharedMovieInfo",S,Ae(A),$)}ll.onRemoteSharedMovieInfo=Ce;function Pe(S,A,$){_e("onRemoteSharedMovieStoppedInfo",S,Ae(A),$)}ll.onRemoteSharedMovieStoppedInfo=Pe;function Y(S,A,$){_e("onLocalSharedMovieInfo",S,Ae(A),$)}ll.onLocalSharedMovieInfo=Y;function ye(S,A,$){_e("onLocalSharedMovieStoppedInfo",S,Ae(A),$)}ll.onLocalSharedMovieStoppedInfo=ye;function ke(S,A,$){_e("onRemoteSharedUrl",S,A,$)}ll.onRemoteSharedUrl=ke;function pi(S,A){_e("onParticipantAdded",S,A)}ll.onParticipantAdded=pi;function ya(S,A){_e("onParticipantJoined",S,A)}ll.onParticipantJoined=ya;function ba(S,A=!1){G("onLocalParticipantState",Ae(S),A)}ll.onLocalParticipantState=ba;function ui(S,A,$){_e("onRemoteParticipantState",S,Ae(A),$)}ll.onRemoteParticipantState=ui;function mi(S,A){G("onRemoteParticipantsState",S,A)}ll.onRemoteParticipantsState=mi;function Ma(S,A,$=null){d.debug("Remote status:",A,S),_e("onRemoteStatus",S,A,$)}ll.onRemoteStatus=Ma;function re(){G("onPermissionsRequested")}ll.onPermissionsRequested=re;function ie(S,A){G("onPermissionsError",S,A)}ll.onPermissionsError=ie;function ee(S,A){_e("onRemoteRemoved",S,A)}ll.onRemoteRemoved=ee;function Aa(S,A,$){G("onCallState",S,A,Ae($))}ll.onCallState=Aa;function jr(S,A){G("onDeviceSwitched",S,A)}ll.onDeviceSwitched=jr;function Hr(S,A,$,Ue=!1,bt=!1,Kr=null,$r=null,Ts,La,Rs=null){let Cs=La?Ut(La):void 0;G("onMuteStates",Ae(S),Ut(A),Ut($),Ue,bt,Kr,$r,Ts,Cs,Rs)}ll.onMuteStates=Hr;function Gr(S,A,$=!1){_e("onRolesChanged",S,Ut(A),$)}ll.onRolesChanged=Gr;function Da(S,A=!1){G("onLocalRolesChanged",Ut(S),A)}ll.onLocalRolesChanged=Da;function wa(S,A,$,Ue){_e("onPinnedParticipant",S,A,$,Ue)}ll.onPinnedParticipant=wa;function Wr(S,A){G("onLocalPin",S,A)}ll.onLocalPin=Wr;function ka(S){G("onOptionsChanged",Ut(S))}ll.onOptionsChanged=ka;function Oa(){G("onCallAccepted")}ll.onCallAccepted=Oa;function xa(S,A){_e("onAcceptedCall",S,A)}ll.onAcceptedCall=xa;function he(){G("onRateNeeded")}ll.onRateNeeded=he;function V(S){_e("onSpeakerChanged",S)}ll.onSpeakerChanged=V;function te(S){G("onVolumesDetected",Ut(S))}ll.onVolumesDetected=te;function ne(S,A){G("onLocalVolume",S,A)}ll.onLocalVolume=ne;function Se(S,A){G("onJoinStatus",S,A)}ll.onJoinStatus=Se;function it(S,A){G("onHangup",S,A)}ll.onHangup=it;function _(S){G("onMultipartyChatCreated",Ae(S))}ll.onMultipartyChatCreated=_;function T(){G("onDeviceChange")}ll.onDeviceChange=T;function P(S){G("onFingerprintChange",S)}ll.onFingerprintChange=P;function w(){G("onTokenExpired")}ll.onTokenExpired=w;function f(S,A,$=!1){G("onChatMessage",S,A,$)}ll.onChatMessage=f;function k(S,A,$=!1){G("onCustomData",S,A,$)}ll.onCustomData=k;function W(S,A,$,Ue,bt,Kr,$r=null){G("onRecordStarted",S,A,$,Ue,bt,Kr,$r)}ll.onRecordStarted=W;function F(S=null,A){G("onRecordStopped",S,A)}ll.onRecordStopped=F;function X(S){G("onLocalNetworkStatusChanged",S)}ll.onLocalNetworkStatusChanged=X;function ve(S){G("onNetworkStatusChanged",S)}ll.onNetworkStatusChanged=ve;function x(S,...A){G("onDebugMessage",S,...A)}ll.onDebugMessage=x;function Ie(S,A){let $=Object.assign({},S,{memory:A});G("onStatistics",$)}ll.onStatistics=Ie;function fe(){G("onAutoplayError")}ll.onAutoplayError=fe;function Re(S,A,$,Ue,bt){G("onChatRoomUpdated",S,A,$,Ue,bt)}ll.onChatRoomUpdated=Re;function me(S){G("onPromoted",S)}ll.onPromoted=me;function xe(S){G("onRemoteMixedAudioStream",S)}ll.onRemoteMixedAudioStream=xe;function yt(S){G("onJoinLinkChanged",S)}ll.onJoinLinkChanged=yt;function $t(S){G("onRoomsUpdated",S)}ll.onRoomsUpdated=$t;function rt(S,A,$,Ue){G("onRoomUpdated",S,A,$,Ue)}ll.onRoomUpdated=rt;function hi(S){G("onRoomParticipantsUpdated",S)}ll.onRoomParticipantsUpdated=hi;function Na(S){G("onRoomSwitched",S)}ll.onRoomSwitched=Na;function Qd(S){G("onRoomStart",S)}ll.onRoomStart=Qd;function Xd(S,A=null){G("onFeedback",S,A)}ll.onFeedback=Xd;function Zd(S){G("onFeaturesPerRoleChanged",S)}ll.onFeaturesPerRoleChanged=Zd;function el(S){G("onParticipantVmojiUpdate",S)}ll.onParticipantVmojiUpdate=el;function tl(S,A){G("onAsrSet",S,A)}ll.onAsrSet=tl;function il(S,A,$){G("onAsrStarted",S,A,$)}ll.onAsrStarted=il;function rl(S){G("onAsrStopped",S)}ll.onAsrStopped=rl;function al(S,A,$,Ue){G("onAsrTranscription",S,A,$,Ue)}ll.onAsrTranscription=al;function nl(S,A){G("onParticipantIdChanged",S,A)}ll.onParticipantIdChanged=nl;function sl(S){G("onVideoSuspendSuggest",S)}ll.onVideoSuspendSuggest=sl;function ol(S){G("onSignalingMessage",typeof S=="string"?S:Ae(S))}ll.onSignalingMessage=ol;function cl(S){G("onPromotionApproved",S)}ll.onPromotionApproved=cl;function dl(){G("onPeerRegistered")}ll.onPeerRegistered=dl})(na||(na={}));var v=na;var oa="_okcls_",Xt=(()=>{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 uo(n){let r=Xt?Xt.getItem(oa+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function mo(n,r){try{Xt&&Xt.setItem(oa+n,JSON.stringify(r))}catch{}}function ho(n){Xt&&Xt.removeItem(oa+n)}var sa;(t=>{function n(i){return uo(i)||null}t.get=n;function r(i,a){mo(i,a)}t.set=r;function e(i){ho(i)}t.remove=e})(sa||(sa={}));var It=sa;var ei=null,Xi=null,ar=null,sr=[],or=[],nr=[],Ye=null,Qe=null,cr=null,dr=!1,lr=!1,Zi,Zt,er,ca=null,da="",un=null,tr=[],ir=null,mn=navigator.appVersion,_o=navigator.appName,Be=navigator.userAgent,dt={},vt=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(vt||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(vt||(vt={}));var Ft=class{constructor(r,e=!1,t=l.videoMaxWidth,i=l.videoMaxHeight,a=l.videoFrameRate){c(this,"audio");c(this,"video");c(this,"needVideo");c(this,"lastSimplifyWasReached");c(this,"supportedConstraints");c(this,"isVideoRequested",()=>this.needVideo);this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(r){s={noiseSuppression:l.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let u=De.getMicrophones(),p,m;if(Qe&&(m=Qe.groupId,p=Qe.deviceId),typeof r=="string")m=u.find(E=>E.deviceId===r)?.groupId,p=r;else if(!Qe&&De.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,p=h.deviceId)}m&&this.supportedConstraints.groupId?s.groupId={exact:m}:p&&(s.deviceId={exact:p})}let o=!1;if(e){o={width:{min:l.videoMinWidth,max:t,ideal:t},height:{min:l.videoMinHeight,max:i,ideal:i},aspectRatio:{ideal:l.videoAspectRatio},frameRate:{ideal:a}};let u=De.getCameras(),p,m;if(Ye&&(m=Ye.groupId,p=Ye.deviceId),typeof e=="string")m=u.find(E=>E.deviceId===e)?.groupId,p=e;else if(!Ye&&De.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,p=h.deviceId)}m&&this.supportedConstraints.groupId?o.groupId={exact:m}:p&&(o.deviceId={exact:p}),l.videoFacingMode&&(o.facingMode={ideal:l.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=s,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video=="object"&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio=="object"&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let r=typeof this.video=="object"&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio=="object"&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||r)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},la=class extends Ft{constructor(e,t,i,a){super(!1,!0);c(this,"captureController");if(this.captureController="CaptureController"in window?new CaptureController:null,typeof this.video=="object"?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode):this.video={},this.video.cursor="motion",this.video.width=e,this.video.height=t,this.video.frameRate=i,this.video.displaySurface=l.displaySurface,De.browserName()==="Safari"){let s=Number(De.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:"exclude",controller:this.captureController})}},Bt=class Bt{constructor(){c(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(Bt._lockId)throw R.log(D.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");Bt._lockId=this._lockId}free(){Bt._lockId===this._lockId&&(Bt._lockId=0)}};c(Bt,"_lockId",0);var pr=Bt;async function hn(){lr=!1,dr=!1,ei=null;let n={camera:De.getSavedCamera(),microphone:De.getSavedMicrophone(),output:De.getSavedOutput()};await pa(),go("devicechange",n),v.onDeviceChange()}function go(n,...r){if(dt[n])for(let e of dt[n])e(...r)}async function pa(){return ei||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!Xi&&navigator.mediaDevices.addEventListener&&(Xi=I.debounce(hn,l.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",Xi)),!ar&&Pi.isSupported()&&(ar=new Pi,await ar.init((n,r)=>{switch(r){case"denied":case"prompt":Xi?.();break}})),ei=navigator.mediaDevices.enumerateDevices().then(n=>{sr=n.filter(i=>i.kind==="videoinput"?(i.label&&(dr=!0),!0):!1),or=n.filter(i=>i.kind==="audioinput"?(i.label?lr=!0:De.isMobile()&&De.browserName()==="Firefox"&&(lr=dr),!0):!1),nr=n.filter(i=>i.kind==="audiooutput");let r=Ye?.deviceId??It.get("videoinput"),e=Qe?.deviceId??It.get("audioinput"),t=cr?.deviceId??It.get("audiooutput");return Ye=sr.find(i=>i.deviceId===r)||null,Qe=or.find(i=>i.deviceId===e)||null,cr=nr.find(i=>i.deviceId===t)||nr[0]||null,ei=Promise.resolve(n),n}).catch(()=>(ei=null,[]))))}async function fo(){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]);un=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function So(n){if(Ye&&Qe)return;let r=(e,t)=>{let i=t.getSettings()?.deviceId;return e.find(a=>a.deviceId===i||a.label===t.label)||null};n?.getTracks().forEach(e=>{!Qe&&e.kind==="audio"?Qe=r(De.getMicrophones(),e):!Ye&&e.kind==="video"&&(Ye=r(De.getCameras(),e))})}async function yi(n,r){d.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative())));let e=(!n.isVideo()||De.hasCameraPermission())&&(!n.isAudio()||De.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new pr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await hn(),So(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()?se.CAMERA_PERMISSION:se.MIC_PERMISSION;break;case"OverconstrainedError":r=se.OVERCONSTRAINED;break;case"TypeError":r=se.UNKNOWN;break;case"AbortError":case"NotReadableError":r=n.isVideoRequested()?se.CAMERA_ACCESS:se.MIC_ACCESS;break;case"Error":if(i.message==="MediaSource is busy"){r=n.isVideoRequested()?se.CAMERA_ACCESS:se.MIC_ACCESS;break}}if(n.canSimplify())return yi(n.simplify(),r);let a=r||se.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function vo(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new pr;try{r.busy();let e=await navigator.mediaDevices.getDisplayMedia(n.getNative()),t=e?.getVideoTracks()[0];if(t){let i=t.getSettings()?.displaySurface;if(d.debug(`Got display media track: ${t.id} (${i})`),t.contentHint="text",n.captureController&&(i==="browser"||i==="window"))try{n.captureController.setFocusBehavior("no-focus-change")}catch(a){d.warn("Failed to set focus behavior",a)}}return e}catch(e){switch(e.name){case"PermissionDeniedError":case"NotAllowedError":case"SecurityError":throw se.SCREEN_PERMISSION;default:throw se.SCREEN_ACCESS}}finally{r.free()}}function rr(){return tr.length||(tr=(()=>{let n,r=!1,e=0,t="0",i=Be.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return n=/\brv[ :]+(\d+)/g.exec(Be),["IE",n&&n[1]||"Unknown",r,e,t];if(i[1]==="Safari"){if(n=Be.match(/\bEdge\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(n=Be.match(/\bCriOS\/(\d+)/),n)return["Chrome",n[1],!0,Number(n[1]),t];if(n=Be.match(/\bFxiOS\/(\d+)/),n)return["Firefox",n[1],!1,e,t];if(n=Be.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1],!1,e,t];if(n=Be.match(/\bOPT\/(\d+)/),n)return["Opera",n[1],!1,e,t]}if(i[1]==="Chrome"){if(r=!0,e=Number(i[2]),n=Be.match(/\bOPR\/(\d+)/),n)return["Opera",n[1]||"Unknown",r,e,t];if(n=Be.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1]||"Unknown",r,e,t];if(n=Be.match(/\bSferum\/((\d+)(?:\.\d+)*)/),n)return["Sferum",n[1]||"Unknown",r,e,t];if(n=Be.match(/\bEdge?\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(typeof window.opr<"u"&&/^(.+\.)?ok.ru$/.test(window.location.host))return["Opera","Hidden",r,e,t]}return n=Be.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),n&&n[2]!==void 0&&(t=n[2]),[i[2]?i[1]:_o,n&&n[1]||i[2]||mn,r,e,t]})()),tr}var De;(he=>{async function n(){await pa(),await fo()}he.init=n;function r(){return sr}he.getCameras=r;function e(){return or}he.getMicrophones=e;function t(){return nr}he.getOutput=t;function i(){return sr.length>0}he.hasCamera=i;function a(){return or.length>0}he.hasMicrophone=a;function s(){return Ye}he.getSavedCamera=s;function o(){return Qe}he.getSavedMicrophone=o;function u(){return cr}he.getSavedOutput=u;function p(){return l.videoFacingMode}he.getVideoFacingMode=p;function m(){return dr}he.hasCameraPermission=m;function h(){return lr}he.hasMicrophonePermission=h;function E(){return ar?.getPermissionState("microphone")??null}he.getMicrophonePermissionState=E;function C(V=!1){return h()?i()&&V?m():!0:!1}he.hasPermissions=C;async function M(V=!1,te=!0,ne=!0){let Se=a()&&te,it=i()&&V,_;if(!Se&&!it)_=new MediaStream;else try{_=await yi(new Ft(Se,it))}catch{_=new MediaStream}return!_.getVideoTracks().length&&ne&&_.addTrack(he.getBlackMediaTrack()),!_.getAudioTracks().length&&ne&&_.addTrack(he.getSilentMediaTrack()),_}he.getUserMedia=M;async function H(V,te){let ne=V&&!l.consumerFastScreenShare?l.fastScreenShareWidth:window.screen.width,Se=V&&!l.consumerFastScreenShare?l.fastScreenShareHeight:window.screen.height,it=l.getScreenFrameRate(V);return vo(new la(ne,Se,it,te))}he.getScreenMedia=H;async function q(V=!1,te){let ne=V?l.videoEffectMaxWidth:l.videoMaxWidth,Se=V?l.videoEffectMaxHeight:l.videoMaxHeight;return yi(new Ft(!1,!0,ne,Se,te))}he._getUserVideo=q;async function de(V,te){let ne=te?.width||l.videoMaxWidth,Se=te?.height||l.videoMaxHeight;return yi(new Ft(!1,V||!0,ne,Se))}he.getUserVideo=de;async function Ce(V){return yi(new Ft(V||!0,!1))}he.getUserAudio=Ce;async function Pe(V,te){let[ne]=V.getVideoTracks();if(!ne)throw new Error("Video track not found in stream");return zi(ne,te)}he.setResolution=Pe;async function Y(V,te){let Se=(await pa()).find(it=>it.kind===V&&it.deviceId===te);return Se?(V==="videoinput"?Ye=Se:V==="audioinput"?Qe=Se:V==="audiooutput"&&(cr=Se),It.set(V,te),Se):null}he._saveDeviceId=Y;function ye(){if(!er||er.readyState==="ended"){let V=he.getAudioContext(),te=V.createMediaStreamDestination(),ne=V.createGain();ne.gain.value=1e-5,ne.connect(te),ne.connect(V.destination);let Se=V.createOscillator();Se.type="sine",Se.frequency.value=0,Se.connect(ne),Se.start(),er=te.stream.getAudioTracks()[0]}return Object.assign(er.clone(),{enabled:!1})}he.getSilentMediaTrack=ye;function ke(V=l.videoMinWidth,te=l.videoMinHeight){Zt||(Zt=document.createElement("canvas")),Zt.width=V,Zt.height=te;let ne=Zt.getContext("2d");return ne.rect(0,0,V,te),ne.fillStyle="black",ne.fill(),(!Zi||Zi.readyState==="ended")&&(Zi=Zt.captureStream(l.videoFrameRate).getVideoTracks()[0]),Object.assign(Zi.clone(),{enabled:!1})}he.getBlackMediaTrack=ke;function pi(){if(Hr()==="Edge"&&Number(Gr())<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=pi;function ya(){return!!navigator.mediaDevices.getDisplayMedia}he.isScreenCapturingSupported=ya;function ba(){let V=he.browserName()==="Safari"&&he.browserVersion()==="15"&&he.browserSubVersion()==="1",te=he.browserName()==="Opera",ne=he.browserName()==="Yandex";return V||te||ne}he.isBrokenH264Decoder=ba;function ui(){return he.browserName()==="Yandex"&&he.os()==="Windows"||l.simulcast}he.isBrokenVP9Encoder=ui;function mi(){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=mi;function Ma(){return he.browserName()==="Firefox"&&Number(he.browserVersion())<60}he.isOldDataChannelDescription=Ma;function re(){return!(he.baseChromeVersion()&&he.isMobile())}he.canPreferH264=re;function ie(){return!(he.browserName()==="Firefox"||he.browserName()==="Safari")}he.isSimulcastSupportedByBrowser=ie;function ee(){return da||(da=(()=>{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"})()),da}he.os=ee;function Aa(){return un}he.osVersion=Aa;function jr(){return ca===null&&(ca=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(mn)),ca}he.isMobile=jr;function Hr(){return rr()[0]}he.browserName=Hr;function Gr(){return rr()[1]}he.browserVersion=Gr;function Da(){return rr()[3]}he.baseChromeVersion=Da;function wa(){return ir||(ir=new(window.AudioContext||window.webkitAudioContext)),ir.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),ir}he.getAudioContext=wa;function Wr(){return rr()[4]}he.browserSubVersion=Wr;function ka(){return he.baseChromeVersion()>=105&&!he.isMobile()}he.isAudioShareSupported=ka;function Oa(V,te){dt[V]||(dt[V]=[]),dt[V].push(te)}he.addEventListener=Oa;function xa(V,te){if(dt[V])if(!te)delete dt[V];else{let ne=dt[V].indexOf(te);ne>-1&&dt[V].splice(ne,1)}}he.removeEventListener=xa})(De||(De={}));var b=De;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 ${l.sdkVersion}`,l.toJSON()],["UserAgent:",navigator.userAgent],["Screen resolution:",`${window.screen.width}x${window.screen.height}`],["Permissions:",`Camera: ${b.hasCameraPermission()}, Mic: ${b.hasMicrophonePermission()}`]],e=new Date,t=e.getTime(),i=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return r.map(a=>({h:i,t,l:"LOG",d:a}))}static collectLogs(){let r=We._list;return r.length===0?[]:[...We._createContextLogs(),...r]}};c(We,"_list",[]),c(We,"_conversationId",null);var Ne=We;var ur=class{constructor(){c(this,"_items",[])}get length(){return this._items.length}push(...r){this._items.push(...r)}merge(r){this._items.push(...r._items)}shift(){return this._items.shift()||null}bisect(){let r=this.length>1?Math.floor(this.length/2):1;this._items=this._items.slice(r)}head(){return this._items[0]||null}tail(){let r=this._items.length;return r?this._items[r-1]:null}clear(){this._items=[]}toString(){return this._items.length?JSON.stringify(this._items,(r,e)=>e instanceof Error?String(e):e):""}};var ua=2*1024*1024,_n=512*1024,ti=100*1024,Io=5,ha="_okcls_logs_session_",Eo=3e4,_a=class{constructor(){c(this,"_items",[]);c(this,"_itemsSize",0);c(this,"_storageSize",ua);try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(ha)!==0)continue;let t=r.getItem(e);if(!t){gn(e);continue}let i=Sn(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(ti)}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,ua)}add(r,e){let t=parseInt(r.replace(ha,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(gn(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>ua||this.length>Io-1||this.size+r>this.available);)this.deleteOldestItem()}};function fn(){return`${ha}${Date.now()}`}function Sn(n){return new Blob([n]).size}function gn(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function mr(){let n=Et.toString();if(!Oe.available||!n)return;let r=Sn(n);if(r>_n){Et.bisect(),mr();return}Oe.cleanup(ti+r);try{window.localStorage.setItem(hr,n)}catch(e){if(console.warn("Failed to write log to storage",e),Oe.storageSize=Oe.size+r,Oe.cleanup(ti+r),Oe.available>=ti+r){mr();return}if(r>ti){Et.bisect(),mr();return}Oe.storageSize=0;return}r>_n&&(Oe.add(hr,r),hr=fn(),Et.clear(),Oe.cleanup(ti))}function ga(){!Oe.available||!Et.length||mr()}function To(n=!1){let r=[];try{let i=window.localStorage;for(let s of Oe.items){let o=i.getItem(s.key);r.push(o)}let a=Et.toString();a&&r.push(a)}catch(i){console.error("Storage is blocked",i)}let e=`[${r.join(",")}]`;if(n)return e;let t=`logs_${Date.now()}.json`;return Ro(e,t),t}function Ro(n,r){let e=document.createElement("a"),t=new Blob([n],{type:"text/json"});e.href=URL.createObjectURL(t),e.download=r,e.click()}function vn(n,r){if(!Oe.available)return;let e=new Date,t={t:e.getTime(),l:n,d:r,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};Et.push(t),Ne.add(t),ma||(ma=window.setTimeout(()=>{ma=null,ga()},Eo))}function fa(){Oe||(Oe=new _a,Et=new ur,hr=fn(),window.addEventListener("beforeunload",ga))}var Oe,Et,hr,ma=null;window.__VKCallsSDKLogs__=(n=!1)=>(Oe||fa(),ga(),To(n));var va=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(va||{}),Sa;(Y=>{let n="📞",r=(ye,...ke)=>{v.onDebugMessage(ye,...ke)},e=!1,t=(ye,ke)=>(...pi)=>{ye(...pi),vn(ke,pi)},i=console.debug.bind(console,n),a=console.log.bind(console,n),s=console.warn.bind(console,n),o=console.error.bind(console,n),u=r.bind(null,"DEBUG"),p=r.bind(null,"LOG"),m=r.bind(null,"WARN"),h=r.bind(null,"ERROR");Y.debug=u,Y.log=p,Y.warn=m,Y.error=h;function q(){return e}Y.enabled=q;function de(ye){e=ye,l.debugLog&&fa(),ye?(Y.debug=l.debugLog?t(i,"DEBUG"):i,Y.log=l.debugLog?t(a,"LOG"):a,Y.warn=l.debugLog?t(s,"WARN"):s,Y.error=l.debugLog?t(o,"ERROR"):o):(Y.debug=l.debugLog?t(u,"DEBUG"):u,Y.log=l.debugLog?t(p,"LOG"):p,Y.warn=l.debugLog?t(m,"WARN"):m,Y.error=l.debugLog?t(h,"ERROR"):h)}Y.toggle=de;function Ce(ye,...ke){switch(ye){case"DEBUG":(0,Y.debug)(...ke);break;case"LOG":(0,Y.log)(...ke);break;case"WARN":(0,Y.warn)(...ke);break;case"ERROR":(0,Y.error)(...ke);break}}Y.send=Ce;function Pe(ye,...ke){}Y.test=Pe})(Sa||(Sa={}));var d=Sa;var Po="kf";function ii(n){return n.stopStream}function Ia(n){return n.keyFrameRequested}function In(n){if(ii(n))return"ss";if(Ia(n))return Po;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 Vt=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(Vt||{}),En="s",Tn="m";function at(n){return n.participantId+(n.mediaType?qt+En+n.mediaType:"")+(n.streamName?qt+Tn+n.streamName:"")}function ri(n){let r=n.split(qt),e=r.shift();if(!e)throw new Error("Illegal stream description: "+n);let t=null,i,a=0;for(let o of r)switch(o.charAt(0)){case En:t=yo(o.slice(1));break;case Tn:i=o.slice(1);break;case Wi:a=Number.parseInt(o.slice(1),10);break;default:throw new Error("Unexpected parameter type "+o.charAt(0)+" in stream description "+n)}return{participantId:I.compose(e,a),mediaType:t,streamName:i}}function yo(n){for(let r of Object.keys(Vt))if(r===n)return Vt[r];return null}function nt(){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),bo(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 bo(n){return n.buffer!==void 0}function _r(n){let r=ArrayBuffer.isView(n)?new DataView(n.buffer,n.byteOffset,n.byteLength):new DataView(n),e=0;return{peek(){return r.getUint8(e)},get(t){e+=t;let i=r.byteOffset;return r.buffer.slice(i+e-t,i+e)},getI8(){return r.getInt8(e++)},getI16(){return e+=2,r.getInt16(e-2)},getI32(){return e+=4,r.getInt32(e-4)},getI64(){e+=8;let t=r.getInt32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getUi8(){return r.getUint8(e++)},getUi16(){return e+=2,r.getUint16(e-2)},getUi32(){return e+=4,r.getUint32(e-4)},getUi64(){e+=8;let t=r.getUint32(e-8),i=r.getUint32(e-4);return t*4294967296+i},getF32(){return e+=4,r.getFloat32(e-4)},getF64(){return e+=8,r.getFloat64(e-8)}}}var Rn=0,Cn=1,Mo=2,Ao=3,Do=4,wo=5,ko=6,Oo=7,xo=0,No=1,Lo=2,lt=0,Uo=0,Bo=0,Fo=1,gr=class{constructor(){c(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=nt();L.Int.enc(t,Rn),L.Int.enc(t,lt),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=nt();if(this.writeStreamDesc(e,a),ii(i))L.Int.enc(a,No);else if(Ia(i))L.Int.enc(a,Lo);else if(L.Int.enc(a,xo),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,Bo);break;case"cn":L.Int.enc(a,Fo);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=nt();return L.Int.enc(t,Cn),L.Int.enc(t,lt),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=nt();return L.Int.enc(t,Mo),L.Int.enc(t,lt),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=nt();return L.Int.enc(t,Ao),L.Int.enc(t,lt),L.Int.enc(t,r),L.Bool.enc(t,e.request),t.ui8array().buffer}serializeNetworkStatReport(r,e){let t=nt();return L.Int.enc(t,Do),L.Int.enc(t,lt),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=nt();return L.Int.enc(t,wo),L.Int.enc(t,lt),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeEnableVideoSuspendSuggest(r,e){let t=nt();return L.Int.enc(t,ko),L.Int.enc(t,lt),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=nt();L.Int.enc(t,Oo),L.Int.enc(t,lt),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 za(r);e=_r(s)}else e=_r(r);let t=L.Int.dec(e),i=L.Int.dec(e);if(i!==lt){d.warn("Unsupported version for command type: "+t+", version "+i);return}if(L.Int.dec(e)!==Uo){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case Rn:return this.deserializeUpdateDisplayLayoutResponse(e);case Cn:return this.deserializeReportPerfStatResponse(e);default:d.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(r){let e=L.Int.dec(r),t=L.Arr.dec(r),i={};return t.forEach(a=>{let s=_r(a),o=L.Any.dec(s);if(typeof o=="string")i[o]=L.Int.dec(s);else{let u=o,p=at(this.participantIdRegistry?.getStreamDescription(u));i[p]=L.Int.dec(s)}}),{type:"response",sequence:e,response:N.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:N.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var Ea={connected:{wt:K.WEBTRANSPORT_CONNECTED,ws:K.WEBSOCKET_CONNECTED},reconnected:{wt:K.WEBTRANSPORT_RECONNECTED,ws:K.WEBSOCKET_RECONNECTED},failed_pings:{wt:K.WEBTRANSPORT_FAILED_PINGS,ws:K.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:K.WEBTRANSPORT_FAILED_EXCEPTION,ws:K.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:K.WEBTRANSPORT_TIMEOUT,ws:K.WEBSOCKET_TIMEOUT},restart:{wt:K.WEBTRANSPORT_RESTART,ws:K.WEBSOCKET_RESTART}};var bi=class{constructor(r){c(this,"q");c(this,"inits",[]);c(this,"n",[1,2,3,4,5]);c(this,"np",[1,1,1,1,1]);c(this,"qv",[]);if(!(r>0&&r<1))throw new Error("q must be in (0,1)");this.q=r}add(r){if(this.inits.length<5){this.inits.push(r),this.inits.length===5&&this.bootstrap();return}let e=0;if(r<this.qv[0])this.qv[0]=r,e=0;else if(r>=this.qv[4])this.qv[4]=r,e=3;else for(;!(r<this.qv[e+1]);)e++;for(let t=0;t<5;t++)this.n[t]+=t<=e?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let t=1;t<=3;t++){let i=this.np[t]-this.n[t];if(i>=1&&this.n[t+1]-this.n[t]>1||i<=-1&&this.n[t]-this.n[t-1]>1){let a=Math.sign(i),s=this.qv[t]+a/(this.n[t+1]-this.n[t-1])*((this.n[t]-this.n[t-1]+a)*(this.qv[t+1]-this.qv[t])/(this.n[t+1]-this.n[t])+(this.n[t+1]-this.n[t]-a)*(this.qv[t]-this.qv[t-1])/(this.n[t]-this.n[t-1]));s>this.qv[t-1]&&s<this.qv[t+1]?this.qv[t]=s:this.qv[t]=this.qv[t]+a*(this.qv[t+a]-this.qv[t])/(this.n[t+a]-this.n[t]),this.n[t]+=a}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let r=[...this.inits].sort((a,s)=>a-s),e=this.q*(r.length-1),t=Math.floor(e),i=e-t;return t+1<r.length?r[t]*(1-i)+r[t+1]*i:r[t]}return this.qv[2]}bootstrap(){this.inits.sort((r,e)=>r-e),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}};var fr=class{constructor(){c(this,"n",0);c(this,"mean",0)}add(r){this.n++;let e=r-this.mean;this.mean+=e/this.n}get avg(){return this.n?this.mean:NaN}};var pt=class{constructor(){c(this,"count",0);c(this,"minVal",1/0);c(this,"maxVal",-1/0);c(this,"mean",new fr);c(this,"p50",new bi(.5));c(this,"p95",new bi(.95))}add(r){r<this.minVal&&(this.minVal=r),r>this.maxVal&&(this.maxVal=r),this.mean.add(r),this.p50.add(r),this.p95.add(r),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}};var Pn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(Pn||{}),we=Pn;var yn=(f=>(f.TRANSMITTED_DATA="transmitted-data",f.ACCEPTED_CALL="accepted-call",f.HUNGUP="hungup",f.PARTICIPANT_ADDED="participant-added",f.PARTICIPANT_JOINED="participant-joined",f.CLOSED_CONVERSATION="closed-conversation",f.MEDIA_SETTINGS_CHANGED="media-settings-changed",f.PARTICIPANT_STATE_CHANGED="participant-state-changed",f.PARTICIPANTS_STATE_CHANGED="participants-state-changed",f.RATE_CALL_DATA="rate-call-data",f.FEATURE_SET_CHANGED="feature-set-changed",f.TOPOLOGY_CHANGED="topology-changed",f.PRODUCER_UPDATED="producer-updated",f.CONSUMER_ANSWERED="consumer-answered",f.MULTIPARTY_CHAT_CREATED="multiparty-chat-created",f.FORCE_MEDIA_SETTINGS_CHANGE="force-media-settings-change",f.SETTINGS_UPDATE="settings-update",f.VIDEO_QUALITY_UPDATE="video-quality-update",f.REGISTERED_PEER="registered-peer",f.SWITCH_MICRO="switch-micro",f.RECORD_STARTED="record-started",f.RECORD_STOPPED="record-stopped",f.REALLOC_CON="realloc-con",f.AUDIO_ACTIVITY="audio-activity",f.SPEAKER_CHANGED="speaker-changed",f.STALLED_ACTIVITY="stalled-activity",f.CHAT_MESSAGE="chat-message",f.CUSTOM_DATA="custom-data",f.ROLES_CHANGED="roles-changed",f.MUTE_PARTICIPANT="mute-participant",f.PIN_PARTICIPANT="pin-participant",f.OPTIONS_CHANGED="options-changed",f.NETWORK_STATUS="network-status",f.PARTICIPANT_SOURCES_UPDATE="participant-sources-update",f.PROMOTE_PARTICIPANT="promote-participant",f.CHAT_ROOM_UPDATED="chat-room-updated",f.PROMOTION_APPROVED="promotion-approved",f.JOIN_LINK_CHANGED="join-link-changed",f.FEEDBACK="feedback",f.MOVIE_UPDATE_NOTIFICATION="movie-update-notification",f.MOVIE_SHARE_STARTED="movie-share-started",f.MOVIE_SHARE_STOPPED="movie-share-stopped",f.URL_SHARING_INFO_UPDATED="url-sharing-info-updated",f.ROOM_UPDATED="room-updated",f.ROOMS_UPDATED="rooms-updated",f.ROOM_PARTICIPANTS_UPDATED="room-participants-updated",f.FEATURES_PER_ROLE_CHANGED="features-per-role-changed",f.PARTICIPANT_ANIMOJI_CHANGED="participant-animoji-changed",f.ASR_STARTED="asr-started",f.ASR_STOPPED="asr-stopped",f.DECORATIVE_PARTICIPANT_ID_CHANGED="decorative-participant-id-changed",f.VIDEO_SUSPEND_SUGGEST="video-suspend-suggest",f))(yn||{}),U=yn;var bn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(bn||{}),ut=bn;var{isObject:Mn,isObjectsEquals:Vo}=I;function Sr(n,r){return n===null||r===null?n===null&&r===null:n.maxDimension!==r.maxDimension||n.maxBitrateK!==r.maxBitrateK||n.maxFramerate!==r.maxFramerate||n.degradationPreference!==r.degradationPreference||n.scalabilityMode!==r.scalabilityMode||Mn(n.bitrates)&&Mn(r.bitrates)&&!Vo(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function vr(n,r){return!(!Sr(n.camera,r.camera)||!Sr(n.screenSharing,r.screenSharing)||!Sr(n.fastScreenSharing,r.fastScreenSharing))}function Ta(n,r){return{camera:Object.assign({},n.camera,r.camera),screenSharing:Object.assign({},n.screenSharing,r.screenSharing),fastScreenSharing:Object.assign({},n.fastScreenSharing,r.fastScreenSharing)}}function An(){return{camera:null,screenSharing:null,fastScreenSharing:null}}var Tt=class Tt{constructor(){c(this,"_codecUsages",new Map);c(this,"getCurrentTransportTopology",()=>{})}static create(r){let e=new Tt;e.getCurrentTransportTopology=r,Tt._instance=e}static reportUsage(r){let e=Tt._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let i=r.rtps.filter(a=>a.type==="outbound-rtp"&&!a.mid?.endsWith("s"));l.simulcast&&(i=i.reduce((a,s)=>{if(s.kind!=="video")return a.concat(s);let o=a.find(u=>u.kind==="video");return o?o.totalEncodeTime=(o.totalEncodeTime??0)+(s.totalEncodeTime??0):a.push(s),a},[])),i.forEach(a=>{let s=a.kind,o=a.mimeType;if((s==="audio"||s==="video")&&o){let u=a.encoderImplementation,p=[o,"encoder",u].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:p,totalEncodeTime:(a.totalEncodeTime??0)*1e3,audioCodecParams:a.sdpFmtpLine,topology:t})}})}saveUsage({kind:r,codecName:e,totalEncodeTime:t,audioCodecParams:i,topology:a}){let s=this._codecUsages.get(r);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(r,{...s,totalEncodeTime:t,topology:a});return}this._codecUsages.set(r,{kind:r,codecName:e,audioCodecParams:i,totalEncodeTime:t,topology:a})}report(r){if(r.kind==="video"&&r.totalEncodeTime===0)return;let e={name:K.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),R.logClientStats(e)}static destroy(){Tt._instance?._destroy(),Tt._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};c(Tt,"_instance",null);var st=Tt;var Xe=class{static logCreateAnswer(r){ge.logEventualStat({name:K.SDP_CREATE_ANSWER,string_value:JSON.stringify({error:r})})}static logCreateOffer(r){ge.logEventualStat({name:K.SDP_CREATE_OFFER,string_value:JSON.stringify({error:r})})}static logSetLocalAnswer(r,e){ge.logEventualStat({name:K.SDP_SET_LOCAL_ANSWER,string_value:JSON.stringify({sdp:r,error:e})})}static logSetLocalOffer(r,e){ge.logEventualStat({name:K.SDP_SET_LOCAL_OFFER,string_value:JSON.stringify({sdp:r,error:e})})}static logSetRemoteOffer(r,e){ge.logEventualStat({name:K.SDP_SET_REMOTE_OFFER,string_value:JSON.stringify({sdp:r,error:e})})}};var jt=class extends oe{constructor(e,t){super();c(this,"_signaling");c(this,"_mediaSource");c(this,"_state","IDLE");c(this,"_pc",null);this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var Dn="videochat-epi",jo=5e3,Ho=500,Rt=class extends oe{constructor(e,t,i=!1){super();c(this,"_previousPerfStatReportTimestamp",0);c(this,"_previousNetworkStatReportTimestamp",Date.now());c(this,"_previousCallStatReportTimestamp",Date.now());c(this,"_previousCallStatReport",null);c(this,"_screenShareStats",[]);c(this,"_signaling");c(this,"_directTopology");c(this,"_handleScreenSharingStat",e=>{this._screenShareStats.push(e)});c(this,"_handleTransportStateChanged",e=>{(this._directTopology&&e==="CONNECTED"||!this._directTopology&&e==="OPENED")&&(this._previousNetworkStatReportTimestamp=Date.now(),this._previousCallStatReportTimestamp=Date.now())});this._signaling=t,this._directTopology=i,this.subscribe(e,"REMOTE_DATA_STATS",this._handleStats.bind(this)),this.subscribe(e,"SCREEN_SHARING_STAT",this._handleScreenSharingStat.bind(this)),this.subscribe(e,"STATE_CHANGED",this._handleTransportStateChanged.bind(this))}destroy(){this.unsubscribe()}static getEstimatedPerformanceIndex(){try{let e=parseInt(localStorage.getItem(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&&l.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+jo<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+Ho<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),l.callStatReportEnabled&&this._previousCallStatReportTimestamp+l.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((i,a)=>(a.kind==="video"&&(i.framesDecoded+=a.framesDecoded||0,i.framesReceived+=a.framesReceived||0),i),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let i=await this._signaling.reportPerfStat(t);localStorage.setItem(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&&!Ir(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!Ir(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!Ir(t.interframe_delay_variance)&&(s.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(s.freeze_count=t.freeze_count,s.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(s.ss_freeze_count=t.ss_freeze_count,s.ss_total_freezes_duration=t.ss_total_freezes_duration),a&&!Ir(t.total_audio_samples_received)){let 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),C=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),M=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=Ht(m/p*1e3),s.removed_audio_samples_for_acceleration=Ht(h/p*1e3),s.concealed_audio_samples=Ht(E/p*1e3),s.concealed_silent_audio_samples=Ht(C/p*1e3),s.concealment_audio_avg_size=Ht(E/M),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 o=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),u=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(o>0){let p=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=Ht(p/o*100)}if(u>0){let p=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=Ht(p/u*100)}ge.logCallStat(s),l.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 Ir(n){return n===void 0}function Ht(n){return Number.isNaN(n)?0:n}var Ai=class{constructor(r,e=null){c(this,"weightUp");c(this,"weightDown");c(this,"value",NaN);this.weightUp=r,this.weightDown=e??r}set(r){this.value=r}update(r){return this.value=this.getNext(r),this.value}getNext(r){if(isNaN(this.value))return r;let e=r<this.value?this.weightDown:this.weightUp;return this.value*(1-e)+r*e}getValue(){return this.value}};var On=.25,xn=.35,Go=85,Wo=.1,Ko=1.5,$o=.1,qo=1,zo=.6,Jo=.3;var Di=class extends oe{constructor(e){super();c(this,"_signaling");c(this,"_localNetworkStat");c(this,"_remoteNetworkStat");c(this,"_lastNetworkStat");c(this,"_networkLimits",{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}});c(this,"_lastStatSentTimestamp",0);c(this,"_currentState","good");this._signaling=e,this._localNetworkStat={rtt:new Ai(On,On),loss:new Ai(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)/Go);for(let s=0;s<a;s++)i*=1-Wo;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)/Ko);for(let s=0;s<a;s++)i*=1-$o;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*qo;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>=zo?"good":e>=Jo?"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,C)=>E+(C.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let o=Date.now(),u=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),p=Math.max(Math.round(u*10)/10,.1),m=this._getNetworkState(p);(t||m!==this._currentState||o-this._lastStatSentTimestamp>l.networkStatisticsInterval)&&(this._lastStatSentTimestamp=o,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{d.warn("Unable to send [bad-net]",h)})),this._currentState=m,this._triggerEvent("NETWORK_STATUS",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 Yo=30*1e3,wi=class n extends jt{constructor(e,t,i,a,s){super(i,a);c(this,"_participantId");c(this,"_isMaster");c(this,"_remoteSDP",{});c(this,"_remoteCandidates",{});c(this,"_lastRemoteSDP",null);c(this,"_animojiDataChannel",null);c(this,"_animojiReceiver",null);c(this,"_animojiSender",null);c(this,"_remoteAnimojiVersion",1);c(this,"_isOpen",!1);c(this,"_remotePeerId",null);c(this,"_statInterval",null);c(this,"_settingsInterval",null);c(this,"_failedOnCreate",null);c(this,"_remoteStream",null);c(this,"_iceRestartTimeout",null);c(this,"_reconnectionTimeout",null);c(this,"_reconnectionPrevented",!1);c(this,"_lastStat");c(this,"_fingerprint",null);c(this,"_neverConnected",!0);c(this,"_serverSettings");c(this,"_prevConsumerSettings",{});c(this,"_networkLimitsForVideo",{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}});c(this,"_videoMaxDimensionsForNet",{worst:320,bad:640,good:1280});c(this,"_lastVideoMaxDimension",this._videoMaxDimensionsForNet.good);c(this,"_lastBadConnection",0);c(this,"_perfStatReporter");c(this,"_directStatReporter");this._participantId=e,this._isMaster=t,this._serverSettings=s,this._perfStatReporter=new Rt(this,i,!0),this._directStatReporter=new Di(i),this.subscribe(this._signaling,we.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applySettings.bind(this)),this.subscribe(this._directStatReporter,"NETWORK_STATUS",this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:l.iceServers,iceTransportPolicy:l.forceRelayPolicy?"relay":"all"})}catch(o){d.error("Failed to create RTCPeerConnection:",o),this.close(o);return}if(this._pc.onicecandidate=this._handleIceCandidate.bind(this),this._pc.ontrack=this._onAddTrack.bind(this),this._pc.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),this._pc.onconnectionstatechange=this._onConnectionStateChange.bind(this),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},l.vmoji&&this._createDataChannel(this._pc,ut.animoji,o=>{this._animojiDataChannel=o,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(o){R.log(D.ERROR,"addTrack-direct"),d.error("Unable to add media source tracks",o,{participantId:this._participantId}),this._failedOnCreate=o;return}this._createOffer(!1).catch(o=>{this._state==="IDLE"?this._failedOnCreate=o:this.close(o)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return["IDLE","CLOSED","FAILED"].includes(this.getState())}async open(e=null){if(this._isOpen){d.warn("DirectTransport: Already opened",{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(d.debug("DirectTransport: Open transport",{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(i){R.log(D.ERROR,"addTrack-direct"),d.error("DirectTransport: Unable to add media source tracks",i,{participantId:this._participantId}),this.close(i);return}this._setState("OPENED");let t=e;if(!e){let i=Object.keys(this._remoteSDP);t=i[i.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){vr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(l.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&(this._isOpen=!1,this._stopReconnection(),this._remoteStream&&(this._remoteStream.getTracks().forEach(t=>{t.stop(),this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t)}),this._remoteStream=null),this._stopStatInterval(),this._stopSettingsInterval(),this._pc&&(this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close()),this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.oniceconnectionstatechange=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._pc.close(),this._pc=null),this._onNetworkStatus(1),this.unsubscribe(),e?(d.error("DirectTransport: Closed",e,{participantId:this._participantId}),this._setState("FAILED")):(d.debug("DirectTransport: Closed",{participantId:this._participantId}),this._setState("CLOSED")),this._triggerEvent("PEER_CONNECTION_CLOSED"))}_setState(e){this._state!==e&&(d.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent("STATE_CHANGED",e))}_onSignalingNotification(e){switch(e.notification){case U.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case U.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case U.CUSTOM_DATA:Object.hasOwn(e.data,"sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,i=I.getPeerIdString(e.peerId);I.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(i,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(i,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){d.debug("Add remote ice candidate",{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(i){throw R.log(D.ERROR,"addIceCandidate-direct"),d.error("Unable to add remote ice candidate",i,{participantId:this._participantId,candidate:t}),i}}else d.debug("Cache remote ice candidate",{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){d.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let i of t)try{await this._addIceCandidate(e,i)}catch{}}async _setRemoteDescription(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc){if(this._lastRemoteSDP?.sdp===t.sdp)return;this._lastRemoteSDP=t,t=n._patchRemoteDescription(t),d.debug("Add remote description",{participantId:this._participantId,sdp:t}),this._calcFingerprint(t.sdp);try{await this._pc.setRemoteDescription(t),await this._setRemoteCandidates(e),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(i){throw R.log(D.ERROR,"setRemoteDescription-direct"),d.error("Unable to set remote description",i,{participantId:this._participantId,sdp:t}),Xe.logSetRemoteOffer(t,i),i}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,l.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){d.debug("Added remote track",{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=t=>{this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t.track)}),this._triggerEvent("REMOTE_TRACK_ADDED",this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(d.debug("Local ice candidate",{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){d.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:l.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case"have-local-offer":let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(new Error);break;case"have-remote-offer":this._createAnswer().then(i=>this._signaling.sendSdp(this._participantId,i,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(d.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case"checking":let e=this.getState();e==="IDLE"||e==="OPENED"?this._setState("CONNECTING"):this._setState("RECONNECTING");break}}_onConnectionStateChange(){switch(d.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),R.log(D.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),I.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(R.log(D.ICE_CONNECTION_TYPE,e.local.type),d.debug("Selected ICE candidates",e))}),this._startStatInterval();break;case"failed":case"disconnected":this._reconnectionPrevented?this.close(new Error(`Ice connection ${this._pc.connectionState}`)):(this._setState("RECONNECTING"),this._startReconnection());break;case"closed":this.close(new Error("Ice connection closed"));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(d.log("Waiting for reconnection...",{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},l.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(d.log("Switch topology DIRECT to SERVER",{participantId:this._participantId}),this._signaling.switchTopology("SERVER"))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(R.log(D.ICE_RESTART),d.log("Ice restart",{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):d.debug("Waiting for ice restart...",{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,d.error("Ice restart failed",{participantId:this._participantId}),R.log(D.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},l.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};d.debug("Create offer",{participantId:this._participantId,options:t});let i;try{i=await this._pc?.createOffer(t),d.debug("Created offer",{participantId:this._participantId,offer:i}),i=n._patchLocalDescription(i)}catch(a){throw d.error("Unable to create offer",a,{participantId:this._participantId}),Xe.logCreateOffer(a),R.log(D.ERROR,"createOffer-direct"),a}try{return d.debug("Set local description",{participantId:this._participantId,offer:i}),this._calcFingerprint(i.sdp),await this._pc?.setLocalDescription(i),i}catch(a){throw d.error("Unable to set local description",a,{participantId:this._participantId}),Xe.logSetLocalOffer(i,a),R.log(D.ERROR,"setLocalDescription-direct"),a}}async _createAnswer(){d.debug("Create answer",{participantId:this._participantId});let e;try{e=await this._pc?.createAnswer(),d.debug("Created answer",{participantId:this._participantId,answer:e}),e=n._patchLocalDescription(e)}catch(t){throw d.error("Unable to create answer",t,{participantId:this._participantId}),Xe.logCreateAnswer(t),R.log(D.ERROR,"createAnswer-direct"),t}try{return d.debug("Set local description",{participantId:this._participantId,answer:e}),this._calcFingerprint(e.sdp),await this._pc?.setLocalDescription(e),e}catch(t){throw d.error("Unable to set local description",t,{participantId:this._participantId}),Xe.logSetLocalAnswer(e,t),R.log(D.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!b.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,l.preferH264&&b.canPreferH264(),b.isBrokenH264Decoder(),l.preferVP9,l.h264spsPpsIdrInKeyframe,t&&l.audioNack,l.p2pAudioRed),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,l.preferVP9,b.isBrokenVP9Encoder(),b.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(i=>{d.error("DirectTransport: Unable to replace track",i,{participantId:this._participantId}),R.log(D.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}pe.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,st.reportUsage(t);let i={inbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="inbound-rtp"?(a.userId=this._participantId,!0):!1)},outbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="outbound-rtp")},remoteInbound:{topology:"DIRECT",transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(i),this._directStatReporter.reportLocal(i),this._triggerEvent("REMOTE_DATA_STATS",i),this._statInterval=window.setTimeout(e,l.statisticsInterval)})};this._statInterval=window.setTimeout(e,l.statisticsInterval)}async _isSVCSupported(e,t){let i=this._mediaSource.getSendVideoTrack(),a=e.outbound.rtps.find(u=>u.kind==="video");if(!a?.mimeType||!a?.bandwidth||!i)return!1;let s=i.getSettings();if(!s.width||!s.height||!s.frameRate)return!1;let o={type:b.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:s.width,height:s.height,bitrate:a.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(o)).supported||!1}catch(u){return d.warn("Failed to get encodingInfo",o,u),!1}}async _checkPPTNetwork(e){if(!l.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,i=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,a=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,s=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,o=this._videoMaxDimensionsForNet.good,u="L1T1";if(a?(this._lastBadConnection=Date.now(),s?(o=this._videoMaxDimensionsForNet.bad,u="L1T2"):(o=this._videoMaxDimensionsForNet.worst,u="L1T3")):i&&(o=this._videoMaxDimensionsForNet.good,u="L1T1"),!(o<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Yo)||this._lastVideoMaxDimension===o)return;let m=this._serverSettings.camera;if(!m||!await this._isSVCSupported(e,u))return;d.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:u,averageNetStat:t,nextVideoMaxDimension:o}),this._lastVideoMaxDimension=o;let E={...this._serverSettings,camera:{...m,scalabilityMode:u,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(E)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[""]=e,this._triggerEvent("NETWORK_STATUS",t)}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=I.sdpFingerprint(e);if(t===null){d.warn("Fingerprint calculation is unsupported");return}this._fingerprint===null?this._fingerprint=t:(v.onFingerprintChange((this._fingerprint^t).toString()),this._fingerprint=null)}_applySettings(){let e=this._mediaSource.getMediaSettings().isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState==="connected"&&(this._prevConsumerSettings=I.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{negotiated:!0,id:1});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),a.onerror=o=>{d.error(`[${t}] data channel error`,o)},i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)}}};var Nn=(e=>(e.AUDIO_MIX="audio-mix",e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",e))(Nn||{}),Ze=Nn;var Qo=16,Tr=class n{constructor(r,e,t){c(this,"_datachannel");c(this,"_participantIdRegistry");c(this,"_asrCallback");c(this,"_textDecoder");d.debug("AsrReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._asrCallback=t,this._textDecoder=new TextDecoder,this._datachannel.onmessage=i=>this._onDataChannelMessage(i.data)}static parse(r){let e=new DataView(r),t=e.getUint8(0),i=e.getUint8(1);if(i!==0)throw new Error(`Unsupported message type. Message type: ${i}`);let a=e.getUint16(2),s=e.getUint32(4),o=e.getUint32(8),u=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:a,ssrc:s,timestamp:o,duration:u,data:r.slice(Qo)}}_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 Ct=class Ct{constructor(){c(this,"_value",1)}get value(){return this._value}set value(r){this._value=r}};c(Ct,"_instance",null),c(Ct,"getInstance",()=>(Ct._instance||(Ct._instance=new Ct),Ct._instance));var ai=Ct;var mt=require("messagepack");var Rr=class{constructor(){c(this,"streamDescriptionByCompactId",new Map);c(this,"compactIdByStreamDescription",new Map)}getStreamDescription(r){return this.streamDescriptionByCompactId.get(r)}getCompactId(r){return this.compactIdByStreamDescription.get(r)}handleMessage(r){let e=new Uint8Array(r),t=e[0],i=e.subarray(1);switch(t){case 1:let a=(0,mt.decode)(i);return Object.entries(a).forEach(([C,M])=>{let H=ri(C);this.streamDescriptionByCompactId.set(M,H),this.compactIdByStreamDescription.set(C,M)}),null;case 2:case 4:let s=(0,mt.decode)(i),o=[];for(let C of s){let M=this.getStreamDescription(C);M&&o.push(M.participantId)}return t===2?{type:"notification",notification:U.AUDIO_ACTIVITY,activeParticipants:o}:{type:"notification",notification:U.STALLED_ACTIVITY,stalledParticipants:o};case 3:let u=(0,mt.decode)(i);return{type:"notification",notification:U.SPEAKER_CHANGED,speaker:this.getStreamDescription(u)?.participantId};case 5:let p=(0,mt.decode)(i);return{type:"notification",notification:U.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:p[0],maxDimension:p[1]},mediaType:this._decodeMediaType(p[2])};case 6:let m=(0,mt.decode)(i),h={};for(let[C,M]of Object.entries(m)){let H=this.getStreamDescription(Number(C))?.participantId;H&&(h[H]=M/100)}return{type:"notification",notification:U.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let M=(0,mt.decode)(i).map(H=>{let[q,de,Ce,Pe,Y,ye,ke]=H;return{participantId:this.getStreamDescription(q)?.participantId,gain:de,pause:Ce,offset:Pe,mute:Y,liveStatus:ye,startTimeMs:ke}});return{type:"notification",notification:U.MOVIE_UPDATE_NOTIFICATION,data:M}}case 9:let E=(0,mt.decode)(i);return{type:"notification",notification:U.VIDEO_SUSPEND_SUGGEST,bandwidth:E};default:return d.debug("unsupported message type: "+t),null}}_decodeMediaType(r){if(r===null)return null;switch(r){case 0:return"CAMERA";case 1:return"SCREEN";default:throw new Error(`Unsupported media type: ${r}`)}}_createParticipantSourcesUpdateNotification(r){let e=(0,mt.decode)(r),t=[];for(let[i,a]of Object.entries(e)){let s=a[0],o=a[1],u=a[2],p=!!a[3],m=a[4]!==null?!!a[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){d.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(u===null){d.error("unexpected null sequenceNumber",i,a);continue}let E=Ze.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,C=o?o>>>0:null;t.push({participantStreamDescription:h,streamId:E,rtpTimestamp:C,sequenceNumber:u,fastScreenShare:p,suspend:m})}return{type:"notification",notification:U.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var Xo=90,Zo=4294967295,ki=class n extends jt{constructor(e,t,i){super(e,t);c(this,"_producerNotification",null);c(this,"_producerCommand",null);c(this,"_producerScreen",null);c(this,"_consumerScreen",null);c(this,"_asr",null);c(this,"_animojiDataChannel",null);c(this,"_animojiReceiver",null);c(this,"_animojiSender",null);c(this,"_isOpen",!1);c(this,"_observer",!1);c(this,"_reconnectionPrevented",!1);c(this,"_statInterval",null);c(this,"_settingsInterval",null);c(this,"_monitorRtpShareInterval",null);c(this,"_statBytes",{});c(this,"_ssrcMap",{});c(this,"_ssrcMapUpdated",!1);c(this,"_perfStatReporter");c(this,"_producerOfferIsProcessing",!1);c(this,"_producerNextOffer",null);c(this,"_lastStat",null);c(this,"_serverSettings");c(this,"_prevConsumerSettings",{});c(this,"_prevConsumerFastSharingSettings",{});c(this,"_asrTrack",null);c(this,"_captureSender",null);c(this,"_captureReceiver",null);c(this,"_participantIdRegistry",null);c(this,"_disabledSenders",new Set);c(this,"_rtpReceiversByStreamId",{});c(this,"_producerSessionId","");c(this,"_newAudioShareTrack",null);c(this,"_simulcastInfo",null);this.subscribe(this._signaling,we.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=i,d.debug("ServerTransport: Created")}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!=="IDLE"&&e!=="CLOSED"&&e!=="FAILED"&&this._startStatInterval()}open(e=!1){if(this._isOpen){d.log("ServerTransport: Already opened connections");return}this._isOpen=!0,this._observer=e,this._openConnection()}close(e){this._isOpen&&(this._isOpen=!1,this._closeConnection(),this.unsubscribe(),e?(d.error("ServerTransport: Closed",e),this._setState("FAILED")):(d.debug("ServerTransport: Closed"),this._setState("CLOSED")))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){vr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(l.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,this._participantIdRegistry&&e.setParticipantIdRegistry(this._participantIdRegistry),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}async onCameraResolutionChanged(){l.simulcast&&b.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new Rt(this,this._signaling)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),this._stopMonitorRtpShareInterval(),this._removeAsrTrack(),this._removeCaptureSender(),this._removeCaptureReceiver(),this._simulcastInfo=null,this._pc&&(this._rtpReceiversByStreamId={},this._disabledSenders.forEach(e=>e.track?.stop()),this._disabledSenders.clear(),this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._participantIdRegistry=null,n._closeDataChannel(this._producerNotification),n._closeDataChannel(this._producerCommand),n._closeDataChannel(this._producerScreen),n._closeDataChannel(this._consumerScreen),n._closeDataChannel(this._asr),n._closeDataChannel(this._animojiDataChannel),this._pc.close(),this._pc=null,this._producerOfferIsProcessing=!1,this._producerNextOffer=null),this._triggerEvent("PEER_CONNECTION_CLOSED")}static _closeDataChannel(e){e&&(e.onopen=null,e.onmessage=null,e.onerror=null,e.close())}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{ordered:!0});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)},a.onerror=s=>{let o=s.error;d.error(`[${t}] data channel error`,o?.errorDetail,o?.message)}}_openConnection(e=!1){d.debug("ServerTransport: Open single connection");try{this._pc=new RTCPeerConnection}catch(t){d.error("Failed to create RTCPeerConnection:",t),this.close(t);return}this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=I.debounce(t=>{this._pc&&this._onConnectionStateChange(this._pc,t)},500),this._pc.onsignalingstatechange=n._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new Rr,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),l.producerNotificationDataChannel&&this._createDataChannel(this._pc,ut.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),l.producerCommandDataChannel&&(this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,ut.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)})),l.producerScreenDataChannel&&this._createDataChannel(this._pc,ut.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),l.asrDataChannel&&this._createDataChannel(this._pc,ut.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new Tr(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),l.vmoji&&this._createDataChannel(this._pc,ut.animoji,t=>{this._animojiDataChannel=t,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(t),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(t),this._animojiSender?.setProtocolVersion(l.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(t){d.error("ServerTransport: Unable to add media source tracks",t),R.log(D.ERROR,"addTrack-single"),this.close(t);return}l.consumerScreenDataChannel&&this._createDataChannel(this._pc,ut.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&(!l.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!=="OPENED"&&(this._setState("RECONNECTING"),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_signalStalledParticipants(e){this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_signalSpeakerChanged(e){this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_signalNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
12
|
-
`).forEach(t=>{let i=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Ze.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+))`,a=new RegExp(i).exec(t);a&&(this._ssrcMap[a[1]]=a[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!l.consumerScreenDataChannel||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Lt(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){!l.producerScreenDataChannel||!this._producerScreen||(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new xt(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._mediaSource.getMediaSettings().isScreenSharingEnabled&&!l.consumerScreenDataChannel?this._serverSettings.screenSharing:this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(i=>{if(!i.track||i.track.kind!=="video"||i.track.contentHint==="motion")return;let a=!this._disabledSenders.has(i),s=e.maxDimension!==0;if(a&&!s){d.log("Disabling video upload"),this._disabledSenders.add(i),i.replaceTrack(b.getBlackMediaTrack()).catch(u=>{d.error("Could not disable video upload",u)});return}let o=this._mediaSource.getSendVideoTrack();if(!a&&s&&o){d.log("Enabling video upload"),this._disabledSenders.delete(i);let u=i.track;u.enabled=o.enabled,i.replaceTrack(o).then(()=>u.stop()).catch(p=>{d.error("Could not enable video upload",p)})}I.applyVideoTrackSettings(e,i,o??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&l.consumerFastScreenShare){let t=this._serverSettings.fastScreenSharing;if(t&&this._pc){let i=[];this._pc.getSenders().forEach(a=>{!a.track||a.track.kind!=="video"||a.track.contentHint!=="motion"||I.applyVideoTrackSettings(t,a,a.track,this._prevConsumerFastSharingSettings,i)}),this._prevConsumerFastSharingSettings=i}}}_onScreenSharingStatus(e){e.track?(!l.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent("STATE_CHANGED",e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(t=>{this._reportStats(t),this._detectStaleTracks(t),st.reportUsage(t)}).catch(()=>{}),this._statInterval=window.setTimeout(e,l.statisticsInterval)};this._statInterval=window.setTimeout(e,l.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await pe.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent("REMOTE_DATA_STATS",{inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(o=>o.type==="inbound-rtp"&&o.kind==="audio"&&this._ssrcMap[o.ssrc]==="mix");if(!t)return;let i=Ze.AUDIO_MIX,a=this._statBytes[i],s=!1;if(a){let o=t.bytesReceived-a.bytesReceived;o>=0&&o<=5&&(s=!0),a.stalled!==s&&this._triggerEvent("AUDIO_MIX_STALL",s)}this._statBytes[i]={bytesReceived:t.bytesReceived,stalled:s}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:Rt.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:l.producerNotificationDataChannel?8:0,producerCommandDataChannelVersion:l.producerCommandDataChannel?3:0,consumerScreenDataChannelVersion:l.consumerScreenDataChannel?1:0,producerScreenDataChannelVersion:l.producerScreenDataChannel?1:0,asrDataChannelVersion:l.asrDataChannel?1:0,animojiDataChannelVersion:l.vmoji?l.vmojiOptions.protocolVersion:1,animojiBackendRender:!l.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:l.videoTracksCount,red:l.serverAudioRed,audioShare:l.audioShare,fastScreenShare:l.fastScreenShare,videoSuspend:l.videoSuspend,simulcast:l.simulcast&&b.isSimulcastSupportedByBrowser(),consumerFastScreenShare:l.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:l.consumerFastScreenShareQualityOnDemand};!l.videoTracksCount&&!this._observer&&d.warn("Setting videoTracksCount to 0 is deprecated"),this._signaling.allocateConsumer(null,e)}async _processOffer(e){if(!this._pc)throw new Error("Interrupt allocation");let t=l.simulcast&&b.isSimulcastSupportedByBrowser(),i=t;try{await this._pc.setRemoteDescription(e)}catch(o){throw d.error("[single] unable to set remote offer",o),R.log(D.ERROR,"setRemoteDescription-single"),Xe.logSetRemoteOffer(e,o),o}let a=this._findFirstSimTransceiver();if(t)if(a){d.log(`_processOffer: caps.simulcast=${l.simulcast} mid=${a.mid} dir=${a.direction}`);let o=this._mediaSource.getStream(),u=await this._setupSimulcastTransceiver(o,a);d.log("_processOffer: simulcastInfo",u),u||(d.log(`_processOffer: simulcast transceiver not found in server offer mid=${a.mid}, disable simulcast`),i=!1)}else d.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),i=!1;let s;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");s=await this._pc.createAnswer()}catch(o){throw d.error("[single] unable to create answer",o),Xe.logCreateAnswer(o),R.log(D.ERROR,"createAnswer-single"),o}try{if(!this._pc)throw new Error("Interrupt allocation");s.sdp=I.patchLocalSDP(s.sdp,!1,b.isBrokenH264Decoder(),!1,l.h264spsPpsIdrInKeyframe),d.debug("[single] set local answer",{answer:s}),await this._pc.setLocalDescription(s)}catch(o){throw d.error("[single] unable to set local answer",o),R.log(D.ERROR,"setLocalDescription-single"),o}if(i&&a){s.sdp=I.patchSimulcastAnswerSdp(s.sdp,a,ft.WIDTH,ft.HEIGHT);for(let o of this._pc.getTransceivers())o.mid===null&&o.stop()}try{d.debug("[single] transmit local answer",{answer:s}),this._updateSSRCMap(e),await this._signaling.acceptProducer(s,Object.keys(this._ssrcMap)),d.debug("[single] remote offer has been processed")}catch(o){d.warn("[single] unable to send local answer",o),R.log(D.ERROR,"acceptProducer")}i&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!=="video")continue;let i=e.sender.getParameters();if(!(!i.encodings||i.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let i=e.getVideoTracks()[0];await t.sender.replaceTrack(i),t.sender.setStreams(e);let a=t.sender.getParameters();if(!a.encodings||a.encodings.length<=1)return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(a.encodings)}`),null;let s=vi(ft.WIDTH,ft.HEIGHT,this._serverSettings.camera?.bitrates?.generic),o=0,u=1;for(let m of a.encodings)m.scalabilityMode=Si,m.active=!0,o>=s.streams.length?m.maxBitrate=0:m.maxBitrate=s.streams[o].bitrate,m.scaleResolutionDownBy=u,u=u*2,o++;await t.sender.setParameters(a);let p=i.getSettings();return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${p.width}x${p.height} encodings=${JSON.stringify(a.encodings)}`),!0}async _acceptProducer(e){if(this._producerOfferIsProcessing){this._producerNextOffer=e,d.debug("[single] wait until other remote offer is processed");return}this._producerOfferIsProcessing=!0;let t={type:"offer",sdp:I.patchRemoteSDP(e,b.isOldDataChannelDescription(),!1,!1,!1,b.isBrokenVP9Encoder(),b.isBrokenVP9Decoder())};if(d.debug("[single] set remote offer",{offer:t}),!this._pc)throw new Error("Interrupt allocation");try{if(await this._processOffer(t),this._producerOfferIsProcessing=!1,this._producerNextOffer){d.debug("[single] there is other unprocessed remote offer, process it");let i=this._producerNextOffer;this._producerNextOffer=null,await this._acceptProducer(i)}}catch(i){this.close(i)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="video");if(!e||!e.sender){d.warn("Cannot find screenshare transceiver");return}try{e.direction="sendonly",await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(t){d.error("ServerTransport: Unable to replace track",t)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="audio");if(!e||!e.sender){d.warn("Cannot find audioshare transceiver");return}e.sender.track!==null&&d.warn("Unexpected track assigned to audioshare");try{e.direction="sendonly",await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(t){d.error("ServerTransport: Unable to replace track",t),R.log(D.ERROR,"replaceTrack-single")}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case U.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case U.REALLOC_CON:this._reconnect();break;case U.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case U.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case U.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case U.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent("ASR_TRANSCRIPTION",e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),l.breakVideoPayloadTypes&&(d.log("test mode enabled, video switched off"),this._signaling.requestTestMode("breakVideoPayloadTypes",null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description)}_onAddTrack(e,t){d.debug("[single] remote track (added)",{track:t.track});let i=t.streams[0];i?(i.onremovetrack||(i.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",i.id,i,s.track)}),i.getTracks().find(s=>s.id===t.track.id)||i.addTrack(t.track),this._rtpReceiversByStreamId[i.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",i.id,i,t.track)):d.error("[single] unable to get media stream from track event")}static _onSignalingStateChange(e,t){d.debug("[single] signaling state changed",{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(d.debug("[single] connection state changed",{state:e.connectionState},t),R.log(D.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(R.logCustom(D.RECONNECT,{param:1}),this._reconnect());break;case"connecting":let i=this.getState();i==="IDLE"||i==="OPENED"?this._setState("CONNECTING"):e.iceConnectionState==="checking"&&this._setState("RECONNECTING");break;case"disconnected":this._reconnectionPrevented?this.close(new Error("Ice connection disconnected")):this._setState("RECONNECTING");break;case"connected":this._setState("CONNECTED"),I.getPeerConnectionHostInfo(e).then(a=>{a?.local&&(R.log(D.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))}),R.logCustom(D.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){d.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),l.consumerScreenDataChannel&&t&&(e=t);let i=(a,s)=>{a.replaceTrack(s).catch(o=>{d.error("ServerTransport: Unable to replace track",o),R.log(D.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),l.simulcast&&b.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(o=>o.direction==="sendonly"&&o.sender?.track?.kind==="video"&&o.sender.track.contentHint===e.contentHint)?.sender;s?.track?(i(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):d.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let a=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);a?.track?i(a,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e==="screen"&&l.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return R.log(D.PAT_WAITING_TIME_ERROR,"noConnection"),d.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return R.log(D.PAT_WAITING_TIME_ERROR,"oldBrowser"),d.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let i=this._rtpReceiversByStreamId[e];if(!i)return R.log(D.PAT_WAITING_TIME_ERROR,"noReceiver"),d.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let a=i.getSynchronizationSources();if(!a||!a.length)return d.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let o=a[0].rtpTimestamp;if(!Number.isInteger(o))return R.log(D.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),d.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${o}`),0;let u=t-o&Zo,p=Math.ceil(u/Xo);return Math.min(100,Math.max(0,p))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!l.simulcast||!b.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let o=s.getVideoTracks()[0],u=o.getSettings().width,p=o.getSettings().height,m=vi(u,p,this._serverSettings.camera?.bitrates?.generic),h=t||!$a(this._simulcastInfo,m);if(!m.streams.length||!h)return;let E=a.sender.getParameters();if(E.encodings||(E.encodings=[{}]),!(E.encodings.length<=1)){if(d.log(`_changeSimulcastInfo: ${u}x${p} command: ${JSON.stringify(m)} `),e){let C=0;for(let M of E.encodings)M.scaleResolutionDownBy=Hi(M.rid),M.scalabilityMode=Si,C>=m.streams.length?(M.maxBitrate=0,M.active=!1):(M.active=!0,M.maxBitrate=m.streams[C].bitrate),C++;await a.sender.setParameters?.(E).catch(M=>{d.error("Failed to set sender parameters",E,M)}),d.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(E.encodings)} `)}if(this._simulcastInfo=m,m.streams){let C={mediaSource:1,simulcastInfo:m};await this._signaling.changeSimulcast(C)}}}async _monitorRtpShare(){let e=ai.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!l.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(a=>a.track?.kind==="video"&&a.track?.contentHint==="motion");if(!t)return;(await t.getStats()).forEach(a=>{if(a.type==="outbound-rtp"&&this._serverSettings.fastScreenSharing&&a.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&a.frameWidth<window.screen.width){let s=t.getParameters();s.degradationPreference="maintain-resolution",t.setParameters(s),d.log(`
|
|
7
|
+
"use strict";var Cs=Object.create;var di=Object.defineProperty;var Ps=Object.getOwnPropertyDescriptor;var ys=Object.getOwnPropertyNames;var bs=Object.getPrototypeOf,Ms=Object.prototype.hasOwnProperty;var As=(n,r,e)=>r in n?di(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var Ds=(n,r)=>{for(var e in r)di(n,e,{get:r[e],enumerable:!0})},La=(n,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of ys(r))!Ms.call(n,i)&&i!==e&&di(n,i,{get:()=>r[i],enumerable:!(t=Ps(r,i))||t.enumerable});return n};var li=(n,r,e)=>(e=n!=null?Cs(bs(n)):{},La(r||!n||!n.__esModule?di(e,"default",{value:n,enumerable:!0}):e,n)),ws=n=>La(di({},"__esModule",{value:!0}),n);var o=(n,r,e)=>As(n,typeof r!="symbol"?r+"":r,e);var Jd={};Ds(Jd,{Api:()=>ai,ApiExternal:()=>Br,ArrayDequeue:()=>Ur,AuthData:()=>Ce,BaseLogger:()=>yt,CallDirection:()=>ke,CallType:()=>nt,ChatRoomEventType:()=>br,ConversationFeature:()=>Mr,ConversationOption:()=>Qe,DebugMessageType:()=>sa,ExternalIdType:()=>Ar,FacingMode:()=>gt,FatalError:()=>se,HangupReason:()=>j,HangupType:()=>y,MediaOption:()=>ce,MediaTrackKind:()=>He,MediaType:()=>Dt,MuteState:()=>Ve,ParticipantState:()=>Z,ParticipantStateDataValue:()=>Ta,ParticipantStatus:()=>Ki,RecordRole:()=>ps,RoomsEventType:()=>ei,Signaling:()=>Bt,SignalingCommandType:()=>x,SignalingConnectionType:()=>We,SignalingNotification:()=>U,TransportTopology:()=>Be,UserRole:()=>ht,UserType:()=>ae,VolumeDetector:()=>Rt,acceptCall:()=>Mc,acceptPromotion:()=>Nd,activateRooms:()=>vd,addMovie:()=>_d,addParticipant:()=>Oc,addParticipantInternal:()=>xc,authorize:()=>bc,browser:()=>Sc,callInternal:()=>us,callTo:()=>Pc,captureScreen:()=>Uc,captureVmoji:()=>Bc,changeAudioEffect:()=>bd,changeConversationOptions:()=>Zc,changeDevice:()=>Lc,changeParticipantState:()=>Wc,changePriorities:()=>Gc,changeVideoEffect:()=>yd,chatHistory:()=>td,chatMessage:()=>ed,chatMessageInternal:()=>vs,createJoinLink:()=>nd,customData:()=>id,customDataInternal:()=>Is,debug:()=>Rd,debugMessage:()=>Cd,declineCall:()=>Ac,enableFeatureForRoles:()=>jd,enableVideoSuspend:()=>Qc,enableVideoSuspendSuggest:()=>Xc,feedback:()=>Bd,forceRelayPolicy:()=>dd,getAnonymTokenByLink:()=>od,getAudienceModeHands:()=>kd,getParticipantListChunk:()=>Ld,getParticipants:()=>Ud,getStreamInfo:()=>hd,getWaitingHall:()=>wd,grantRoles:()=>qc,grantRolesInternal:()=>gs,hangup:()=>kc,init:()=>Cc,joinCall:()=>Dc,joinCallByLink:()=>wc,joinCallInternal:()=>hs,logClientEvent:()=>Vd,muteParticipant:()=>zc,muteParticipantInternal:()=>fs,pinParticipant:()=>Jc,pinParticipantInternal:()=>Ss,processPush:()=>yc,processPushInternal:()=>ms,promoteParticipant:()=>Od,publishStream:()=>ud,putHandsDown:()=>Kc,recordSetConf:()=>md,removeHistoryRecords:()=>Hd,removeJoinLink:()=>sd,removeMovie:()=>fd,removeParticipant:()=>Nc,removeParticipantInternal:()=>_s,removeRooms:()=>Ed,requestAsr:()=>Kd,requestPromotion:()=>xd,setAudioEffects:()=>Tc,setAudioStream:()=>Md,setLocalResolution:()=>Hc,setLogger:()=>Ic,setMediaModifiers:()=>Yc,setStatisticsInterval:()=>Td,setVideoEffects:()=>Ec,setVideoStream:()=>Fc,setVmoji:()=>Rc,setVmojiFill:()=>Dd,setVmojiSvg:()=>Ad,setVolume:()=>cd,startAsr:()=>Gd,startAudienceConversation:()=>ad,startConversation:()=>rd,startStream:()=>ld,startUrlSharing:()=>$d,stopAsr:()=>Wd,stopStream:()=>pd,stopUrlSharing:()=>qd,switchRoom:()=>Id,toggleLocalAudio:()=>jc,toggleLocalVideo:()=>Vc,updateDisplayLayout:()=>$c,updateMovie:()=>gd,updateRooms:()=>Sd,uploadDebugLogs:()=>Pd,userFeedbackStats:()=>Fd,utils:()=>vc,version:()=>zd});module.exports=ws(Jd);var Ra=li(require("webrtc-adapter"));var yt=class{log(r,e,t=!1){}destroy(){}};var oe=class{constructor(){o(this,"_handlers",{});o(this,"_listeners",[])}_triggerEvent(r,...e){if(Object.hasOwn(this._handlers,r))for(let t of this._handlers[r])t.apply(this,e)}addEventListener(r,e){if(typeof e!="function")throw new Error("Listener should be a function");return Object.hasOwn(this._handlers,r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!Object.hasOwn(this._handlers,r))return;e||delete this._handlers[r];let t=this._handlers[r].indexOf(e);t>=0&&this._handlers[r].splice(t,1)}subscribe(r,e,t){let i=r.addEventListener(e,t);this._listeners.push(i)}unsubscribe(){this._listeners.forEach(r=>{r.dispose()})}};var pi=class extends oe{get ready(){return!0}setParticipantIdRegistry(r){}requestRealloc(){}setEndpoint(r){}setWebTransportEndpoint(r){}setConversationId(r){}readyToSend(r=!0){}cleanup(){}requestTestMode(r,e){}getNextCommandSequenceNumber(){return 0}};var Ua=(te=>(te.CANCELED="CANCELED",te.REJECTED="REJECTED",te.REMOVED="REMOVED",te.HUNGUP="HUNGUP",te.MISSED="MISSED",te.BUSY="BUSY",te.FAILED="FAILED",te.NETWORK_ERROR="NETWORK_ERROR",te.KILLED="KILLED",te.BANNED="BANNED",te.HAS_ACTIVE_CALL="HAS_ACTIVE_CALL",te.CALLER_IS_BLOCKED="CALLER_IS_BLOCKED",te.NOT_FRIENDS="NOT_FRIENDS",te.CALLEE_IS_OFFLINE="CALLEE_IS_OFFLINE",te.CALLER_IS_REJECTED="CALLER_IS_REJECTED",te.UNKNOWN_ERROR="UNKNOWN_ERROR",te.UNSUPPORTED="UNSUPPORTED",te.OLD_VERSION="OLD_VERSION",te.SERVICE_DISABLED="SERVICE_DISABLED",te.SERVICE_UNAVAILABLE="SERVICE_UNAVAILABLE",te.EXTERNAL_API_ERROR="EXTERNAL_API_ERROR",te.SOCKET_CLOSED="SOCKET_CLOSED",te.ENDED="ENDED",te.KILLED_WITHOUT_DELETE="KILLED_WITHOUT_DELETE",te.ANOTHER_DEVICE="ANOTHER_DEVICE",te.NOT_FOUND="NOT_FOUND",te.VCHAT_DETAILED_ERROR="VCHAT_DETAILED_ERROR",te.TIMEOUT="TIMEOUT",te.PARTICIPANT_LIMIT_REACHED="PARTICIPANT_LIMIT_REACHED",te.FAST_START_ERROR="FAST_START_ERROR",te.CALL_TIMEOUT="CALL_TIMEOUT",te))(Ua||{}),y=Ua;var j=class n extends Error{constructor(e,t){super();o(this,"message");o(this,"hangup");o(this,"error");o(this,"code");o(this,"remote");o(this,"custom_error");this.name="HangupReason",this.code=t&&t.code||0,this.remote=t&&t.remote||!1,this.custom_error=t?.custom_error??null,Object.values(y).indexOf(e)>-1?this.hangup=e:this.error=e;let i=[];this.error&&i.push("error"),this.remote&&i.push("remote"),this.code&&i.push(`code: ${this.code}`),t&&t.message&&i.push(`message: '${t.message}'`),this.message=e+(i.length?` (${i.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,n)}};var Se=class Se extends yt{constructor(e,t){super();o(this,"_externalLogger");o(this,"_api");o(this,"_batchInterval",3e3);o(this,"_batchedLogItems",[]);o(this,"_batchedClientStats",[]);o(this,"_batchedClientEvents",[]);o(this,"_batchTimeout",null);o(this,"_serverTimeDelta",0);this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}static setConversationIdProvider(e){Se._conversationIdProvider=e}static create(e,t){Se._instance||(Se._instance=new Se(e,t))}static log(e,t,i=!1){Se._instance&&Se._instance.log(e,t,i)}static logCustom(e,t,i=!1){Se._instance&&Se._instance.logCustom(e,t,i)}static logClientStats(e,t=!1){Se._instance&&Se._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){Se._instance&&Se._instance.logClientEvent(e,t)}static destroy(){Se._instance&&Se._instance.destroy(),Se._instance=null}log(e,t,i=!1){let a={};typeof t<"u"&&(a.param=t),this._logInternal(e,a,i),this._externalLogger&&this._externalLogger.log(e,t,i)}logCustom(e,t,i=!1){this._logInternal(e,t,i)}logClientStats(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});Object.keys(i).forEach(a=>{i[a]===void 0&&delete i[a]}),this._batchedClientStats.push(i),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let i=Object.assign(e,{vcid:this._getConversationId(),timestamp:this._now()});this._batchedClientEvents.push(i),(t||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}_logInternal(e,t,i){let a={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:this._getConversationId()}),uid:this._api.getUserId()};this._batchedLogItems.push(a),(i||!this._batchTimeout)&&this._sendBatch()}_getConversationId(){if(Se._conversationIdProvider)try{return Se._conversationIdProvider()}catch{return null}return null}_sendBatch(){this._stopTimeout();let e=!1;this._batchedLogItems.length>0&&(this._sendLogItems(this._batchedLogItems),this._batchedLogItems=[],e=!0),this._batchedClientStats.length>0&&(this._sendClientStats(this._batchedClientStats),this._batchedClientStats=[],e=!0),this._batchedClientEvents.length>0&&(this._sendClientEvents(this._batchedClientEvents),this._batchedClientEvents=[],e=!0),e&&this._startTimeout()}_startTimeout(){this._batchTimeout=window.setTimeout(()=>this._sendBatch(),this._batchInterval)}_stopTimeout(){this._batchTimeout&&(clearTimeout(this._batchTimeout),this._batchTimeout=null)}_sendLogItems(e){this._api.log(e)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}};o(Se,"_instance"),o(Se,"_conversationIdProvider",null);var R=Se;var L=require("messagepack");var Ba=(N=>(N.RECOVER="recover",N.ACCEPT_CALL="accept-call",N.ADD_PARTICIPANT="add-participant",N.REMOVE_PARTICIPANT="remove-participant",N.HANGUP="hangup",N.TRANSMIT_DATA="transmit-data",N.ACCEPT_PRODUCER="accept-producer",N.ALLOCATE_CONSUMER="allocate-consumer",N.CHANGE_MEDIA_SETTINGS="change-media-settings",N.CHANGE_PARTICIPANT_STATE="change-participant-state",N.CHANGE_STREAM_PRIORITIES="change-streams-priorities",N.UPDATE_DISPLAY_LAYOUT="update-display-layout",N.REPORT_PERF_STAT="report-perf-stat",N.REPORT_SHARING_STAT="report-sharing-stat",N.REPORT_NETWORK_STAT="report-network-stat",N.RECORD_START="record-start",N.RECORD_STOP="record-stop",N.RECORD_PUBLISH="record-publish",N.RECORD_SET_CONF="record-set-conf",N.RECORD_GET_STATUS="record-get-status",N.SWITCH_MICRO="switch-micro",N.SWITCH_TOPOLOGY="switch-topology",N.REQUEST_REALLOC="request-realloc",N.CHAT_MESSAGE="chat-message",N.CHAT_HISTORY="chat-history",N.CUSTOM_DATA="custom-data",N.GRANT_ROLES="grant-roles",N.MUTE_PARTICIPANT="mute-participant",N.ENABLE_FEATURE_FOR_ROLES="enable-feature-for-roles",N.PIN_PARTICIPANT="pin-participant",N.UPDATE_MEDIA_MODIFIERS="update-media-modifiers",N.CHANGE_OPTIONS="change-options",N.GET_WAITING_HALL="get-waiting-hall",N.GET_PARTICIPANT_LIST_CHUNK="get-participant-list-chunk",N.GET_PARTICIPANTS="get-participants",N.PROMOTE_PARTICIPANT="promote-participant",N.REQUEST_TEST_MODE="request-test-mode",N.ADD_MOVIE="add-movie",N.UPDATE_MOVIE="update-movie",N.REMOVE_MOVIE="remove-movie",N.START_URL_SHARING="start-url-sharing",N.STOP_URL_SHARING="stop-url-sharing",N.GET_ROOMS="get-rooms",N.UPDATE_ROOMS="update-rooms",N.ACTIVATE_ROOMS="activate-rooms",N.REMOVE_ROOMS="remove-rooms",N.SWITCH_ROOM="switch-room",N.FEEDBACK="feedback",N.ASR_START="asr-start",N.ASR_STOP="asr-stop",N.REQUEST_ASR="request-asr",N.REQUEST_PROMOTION="request-promotion",N.ACCEPT_PROMOTION="accept-promotion",N.GET_HAND_QUEUE="get-hand-queue",N.ENABLE_VIDEO_SUSPEND="enable-video-suspend",N.ENABLE_VIDEO_SUSPEND_SUGGEST="enable-video-suspend-suggest",N.PUT_HANDS_DOWN="put-hands-down",N.CHANGE_SIMULCAST="change-simulcast",N))(Ba||{}),x=Ba;var Fa=(J=>(J.MIC_CAMERA_PERMISSION="mic_camera",J.CAMERA_PERMISSION="camera",J.MIC_PERMISSION="mic",J.CAMERA_ACCESS="cameralock",J.MIC_ACCESS="miclock",J.MIC_NOT_FOUND="nomic",J.SCREEN_PERMISSION="screenpermission",J.SCREEN_ACCESS="screenlock",J.CONNECTION="connection",J.NETWORK="network",J.UNKNOWN="unknown",J.UNSUPPORTED="unsupported",J.SIGNALING_FAILED="signalingfailed",J.API="api",J.AUTH="auth",J.OVERCONSTRAINED="overconstrained",J))(Fa||{}),se=Fa;var Va=(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))(Va||{}),ce=Va;var ja=(re=>(re.ACCEPT_CONCURRENT="callAcceptConcurrent",re.ACCEPT_INCOMING="callAcceptIncoming",re.ACCEPTED_OUTGOING="callAcceptedOutgoing",re.ADD_PARTICIPANT="callAddParticipant",re.CALL_SPEC_ERROR="callSpecError",re.DECLINE_INCOMING="callDeclineIncoming",re.DEVICE_CHANGED="callDeviceChanged",re.DEVICES="callDevices",re.ERROR="callError",re.HANGUP="callHangup",re.ICE_CONNECTION_STATE="callIceConnectionState",re.ICE_CONNECTION_TYPE="callIceConnectionType",re.ICE_RESTART="callIceRestart",re.JOIN_CONVERSATION="callJoinConversation",re.MEDIA_STATUS="callMediaStatus",re.OUTGOING_CALL="callStart",re.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",re.PAT_ALLOCATED="patAllocate",re.PAT_DEALLOCATED="patDeallocate",re.PAT_ERROR="patError",re.PAT_OUTDATED_RESPONSE="patOutdatedResponse",re.PAT_WAITING_TIME_ERROR="patWaitingTimeError",re.POOR_CONNECTION="callPoorConnection",re.PUSH="callPush",re.RECONNECT="callReconnect",re.RELAY_POLICY="callForceRelay",re.REMOVE_PARTICIPANT="callRemoveParticipant",re.SOCKET_ACTION="callSocketAction",re.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",re))(ja||{}),D=ja;var je=class je{static get sessionKey(){return je._sessionKey}static set sessionKey(r){je._sessionKey=r}static get sessionSecretKey(){return je._sessionSecretKey}static set sessionSecretKey(r){je._sessionSecretKey=r}static get accessToken(){return je._accessToken}static set accessToken(r){je._accessToken=r}static isEmpty(){return!je._sessionKey}};o(je,"_sessionKey"),o(je,"_sessionSecretKey"),o(je,"_accessToken");var Ce=je;var Ha=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Ha||{}),ae=Ha;var _t={HEIGHT:720,WIDTH:1280,BITRATE:1e6},ui="L1T2",Wa=[{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}],ks={h:1,m:2,l:4};function Ka(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 Ga(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:Wa[0].bitrate}function mi(n=_t.WIDTH,r=_t.HEIGHT,e=Wa){let t=["h","m","l"],i=Math.max(n,r),a=1;i>=960?a=3:i>=480&&(a=2);let s={streams:[]},c=30,u=Ga(i,e)??_t.BITRATE;for(let l=0;l<a;l++){let m=t[l];s.streams.push({rid:m,width:n,height:r,fps:c,bitrate:u}),n=Math.round(n/2),r=Math.round(r/2),u=Ga(Math.max(n,r),e)??Math.round(u/2)}return s}function Fi(n){return n?ks[n]??1:1}var $a=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 qa(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var jt=":",ji="d",Os=533,Vi="a=fmtp:",xs="sps-pps-idr-in-keyframe=1",Kr;(Ze=>{let n=/[\r\n]+/,r=`\r
|
|
8
|
+
`;function e(_,T){let C=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),w,f=[];for(w=0;w<_.length;++w){let k=_[w].match(C);k&&k.length===3&&k[2]===T&&f.push(k[1])}return f}function t(_,T,C){let w=_.split(" "),f=w.slice(0,3),k;for(k=3;k<w.length;k++)C.includes(w[k])&&f.push(w[k]);for(k=3;k<w.length;k++)!C.includes(w[k])&&!T.includes(w[k])&&f.push(w[k]);return f.join(" ")}function i(_,T,C,w){let f,k="m="+T;for(f=0;f<_.length;++f)_[f].startsWith(k)&&(_[f]=t(_[f],C,w))}function a(_,T){let C=new RegExp(Vi+"(\\d+)");for(let w=0;w<_.length;++w){let f=_[w].match(C);if(f&&f.length===2&&T.includes(f[1])){let k=_[w].trim()===Vi+f[1]?" ":";";_[w]+=k+xs}}}function s(_,T){let C=e(_,T);if(!C.length)return;let w=C.slice(0),f=new RegExp(Vi+"(\\d+) apt=(\\d+)"),k;for(k=0;k<_.length;++k){let B=_[k].match(f);B&&B.length===3&&w.includes(B[2])&&w.push(B[1])}let W=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for(k=_.length;k--;){let B=_[k].match(W);B&&B.length===3&&w.includes(B[2])&&_.splice(k,1)}i(_,"video",w,[])}function c(_,T,C,w){let f=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),k,W=[];for(k=T;k<C;++k){let $=_[k].match(f);$&&$.length===3&&$[2]===w&&W.push($[1])}if(!W.length)return W;let B=new RegExp(Vi+"(\\d+) apt=(\\d+)");for(k=T;k<C;++k){let $=_[k].match(B);$&&$.length===3&&W.includes($[2])&&W.push($[1])}return W}function u(_,T,C,w){let f=c(_,T,C,w);if(!f.length)return C+1;let k=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),W=0,B=C;for(;B>=T;){let $=_[B].match(k);$&&$.length===3&&f.includes($[2])&&(_.splice(B,1),W++),B--}return _[T]=t(_[T],f,[]),C-W+1}function l(_,T,C,w){let f=-1,k=-1,W=!1;for(let B=0;B<_.length;++B)if(f>=0&&_[B].startsWith("m=")&&(k=B-1,W&&(B=u(_,f,k,T)),f=-1,k=-1,W=!1),_[B].startsWith("m=video")&&(f=B),f>=0){let $=C==="remote"&&w==="encoder"||C==="local"&&w==="decoder"?"recvonly":"sendonly";(_[B].startsWith(`a=${$}`)||_[B].startsWith("a=sendrecv"))&&(W=!0)}k=_.length-1,f>=0&&W&&u(_,f,k,T)}function m(_,T){let C=e(_,"H264");T&&i(_,"video",[],C),a(_,C)}function h(_){let T=e(_,"VP9");i(_,"video",[],T)}function E(_,T,C,w,f=!1){if(!T&&!C&&!w&&!f)return _;function k($){let Ee=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],N="a=rtcp-fb:111",ve=$.findIndex(ge=>ge.startsWith(N));return~ve&&($[ve]=$[ve]+r+Ee.join(r)),$}function W($){let Ee=e($,"red");Ee.length>0&&i($,"audio",[],Ee)}let B=_.split(n);return C?l(B,"H264","local","decoder"):m(B,T),w&&h(B),W(B),f&&k(B),B.join(r)}Ze.patchLocalSDP=E;function P(_,T,C,w,f,k,W){T&&(_=_.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 B=_.split(n);return w?s(B,"H264"):C&&m(B,C),k&&W?s(B,"VP9"):k?l(B,"VP9","remote","encoder"):W?l(B,"VP9","remote","decoder"):f&&h(B),B.join(r)}Ze.patchRemoteSDP=P;function b(_){return _?`${_.type||"WEB_SOCKET"}_${_.id}`:"_"}Ze.getPeerIdString=b;function H(_,T){return _&&_.id===T.id&&(_.type||"WEB_SOCKET")===(T.type||"WEB_SOCKET")}Ze.comparePeerId=H;async function J(_){let T={local:null,remote:null};if(!_||!_.getStats)return T;try{let C=await _.getStats(null),w=null;if(C.forEach(f=>{f.type==="transport"&&f.selectedCandidatePairId?w=C.get(f.selectedCandidatePairId):f.type==="candidate-pair"&&f.state==="succeeded"&&!w&&(!Object.hasOwn(f,"selected")||f.selected)&&(w=f)}),w?.localCandidateId){let f=C.get(w.localCandidateId);f&&(T.local={type:f.candidateType,ip:f.ip||f.ipAddress,port:f.port||f.portNumber})}if(w?.remoteCandidateId){let f=C.get(w.remoteCandidateId);f&&(T.remote={type:f.candidateType,ip:f.ip||f.ipAddress,port:f.port||f.portNumber})}return T}catch{return T}}Ze.getPeerConnectionHostInfo=J;let de=/^[0-9]+$/,Ie=/^([gu])([0-9]+)$/;function Te(_,T=ae.USER){let C=String(_);return Ie.test(C)?(d.warn(`Already composite id [${_}] type supplied [${T}]`),C):T===ae.GROUP?"g"+C:T===ae.USER?"u"+C:(d.warn(`Unknown type [${T}] for id [${_}]`),C.match(de)?"u"+C:C)}Ze.composeUserId=Te;function Y(_,T,C=0){let w=Te(_,T);return Re(w,C)}Ze.composeParticipantId=Y;function Re(_,T){return T?_+jt+ji+T:_}Ze.compose=Re;function Q(_){return Y(_.id,_.idType||ae.USER,_.deviceIdx)}Ze.composeId=Q;function ni(_){if(_.decorativeUserId)return Y(_.decorativeUserId,_.idType||ae.USER,_.deviceIdx)}Ze.composeDecorativeId=ni;function Ca(_){return _.participant?Q(_.participant):Y(_.participantId,_.participantType||ae.USER,_.deviceIdx)}Ze.composeMessageId=Ca;function Pa(_){return typeof _=="string"?si(oi(_).compositeUserId).id:_}Ze.extractOkId=Pa;function si(_){let T=String(_),C=T.match(Ie);return C?{id:Number(C[2]),type:C[1]==="g"?ae.GROUP:ae.USER}:(d.warn(`Unsupported compositeId [${_}]`),{id:Number(T),type:ae.USER})}Ze.decomposeId=si;function oi(_){let T=_.split(jt+ji);return{compositeUserId:T[0],deviceIdx:T.length>1?parseInt(T[1],10):0}}Ze.decomposeParticipantId=oi;function ya(){let _=window.crypto?.randomUUID?.();if(_)return _;let T="0123456789abcdefghijklmnopqrstuvwxyz".split(""),C=new Array(36),w=0,f,k;for(k=0;k<36;k++)k===8||k===13||k===18||k===23?C[k]="-":k===14?C[k]="4":(w<=2&&(w=33554432+Math.random()*16777216|0),f=w&15,w=w>>4,C[k]=T[k===19?f&3|8:f]);return C.join("")}Ze.uuid=ya;function re(_,T){let C;function w(...f){let k=this;C&&window.clearTimeout(C),C=window.setTimeout(()=>{_.apply(k,f)},T)}return w}Ze.debounce=re;function ba(_){if(!window.BigInt)return null;let T="",C=_.split(`
|
|
9
|
+
`);for(let k of C)if(k.startsWith("a=fingerprint")){let W=k.split(" ");if(W.length===2){T=W[1];break}}if(!T)return BigInt(-1);let w=T.split(":"),f=BigInt(0);for(let k=Math.min(7,w.length-1);k>=0;k--){let W=BigInt(parseInt(w[k],16));f<<=BigInt(8),f|=W}return BigInt.asIntN(64,f)}Ze.sdpFingerprint=ba;async function te(_){return new Promise(T=>window.setTimeout(T,_))}Ze.delay=te;function Ma(_,T,C){let w=[];return _.getSenders().forEach(f=>Fr(T,f,f.track,C,w)),w}Ze.applySettings=Ma;function Fr(_,T,C,w,f){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!_||!C||C.kind!=="video")return;let k=C.getSettings();if(!k)return;let W=_.maxBitrateK?_.maxBitrateK*1024:null,B=k.width,$=k.height,Ee=B&&$&&_.maxDimension?Math.max(1,Math.max(B,$)/_.maxDimension):null,N=_.maxFramerate||null;if(B&&$&&_.maxDimension&&_.maxDimension>Math.max(B,$)){let _e=Math.round(B*$/256),Oe=(Math.round(_e*Os/1e4)+1)*1e4;W=W===null?Oe:Math.min(Oe,W)}let ve=_.degradationPreference||"balanced",ge=w[C.id];if(ge&&ge.bitrate===W&&ge.scaleResolutionDownBy===Ee&&ge.maxFramerate===N&&ge.degradationPreference===ve){f[C.id]=ge;return}f[C.id]={bitrate:W,scaleResolutionDownBy:Ee,maxFramerate:N,degradationPreference:ve};let De=T.getParameters();if(De.encodings||(De.encodings=[{}]),De.encodings.length>1&&B&&$&&_.maxDimension){let _e=Math.round(_.maxDimension*1.35),Oe=Math.max(B,$),Ct=mi(B,$,_?.bitrates?.generic),Vt=Ct.streams.length;d.log(`applyVideoTrackSettings: maxDim=${_.maxDimension} targetDim=${_e} track=${B}x${$} sim=${JSON.stringify(Ct)}`),De.encodings.forEach((et,ci)=>{et.scaleResolutionDownBy=Fi(et.rid);let xa=Math.round(Oe/et.scaleResolutionDownBy);ci<Vt-1?et.active=xa<_e:ci>=Vt?et.active=!1:et.active=!0,ci<Vt?et.maxBitrate=Ct.streams[ci].bitrate:et.maxBitrate=0,et.scalabilityMode=ui})}else De.encodings.forEach(_e=>{_?.scalabilityMode&&(_e.scalabilityMode=_.scalabilityMode),W?_e.maxBitrate=W:delete _e.maxBitrate,Ee?_e.scaleResolutionDownBy=Ee:delete _e.scaleResolutionDownBy,N?_e.maxFramerate=N:delete _e.maxFramerate});if(De.degradationPreference=ve,De.encodings.length>0){T.setParameters?.(De).catch(Oe=>{d.error("Failed to set sender parameters",De,Oe)});let _e=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(_e.encodings)}`)}}Ze.applyVideoTrackSettings=Fr;function Vr(_,T){Array.isArray(T)||(T=[T]);for(let C of T)if(_.includes(C))return!0;return!1}Ze.includesOneOf=Vr;function jr(_){return Object.entries(_.participantState?.state||{}).reduce((T,[C,w])=>(_.participantState&&(T[C]={ts:_.participantState.stateUpdateTs[C],state:w}),T),{})}Ze.mapParticipantState=jr;function Aa(_){let T=_.map(C=>({uid:C.externalId,mediaSettings:C.mediaSettings,status:C.status,muteStates:C.muteStates,unmuteOptions:C.unmuteOptions,participantState:C.participantState,markers:C.markers,movieShareInfos:C.movieShareInfos,roles:C.roles}));return p.filterObservers?T.filter(C=>!C.uid.observer):T}Ze.mapSharedParticipants=Aa;function Da(_,T){let C=Object.keys(_),w=Object.keys(T);if(C.length!==w.length)return!1;for(let f of C)if(!Object.hasOwn(w,f)||_[f].state!==T[f].state||_[f].ts!==T[f].ts)return!1;return!0}Ze.isEqualParticipantState=Da;function Hr(_,T,C=!1){let w=Object.keys(_),f=Object.keys(T);if(w.length!==f.length)return!1;for(let k of w){if(!Object.hasOwn(T,k))return!1;let W=_[k],B=T[k];if(C&&ne(W)&&ne(B))return Hr(W,B,C);if(W!==B)return!1}return!0}Ze.isObjectsEquals=Hr;function wa(_,T){if(_.length!==T.length)return!1;for(let C of _)if(T.indexOf(C)<0)return!1;return!0}Ze.isArraysEquals=wa;function ka(_){return!Object.keys(_).length}Ze.isEmptyObject=ka;function Oa(_,T){if(!_&&!T)return 0;if(!_||!T)return _?-1:1;return w(T.rank,_.rank)||w(_.ts,T.ts)||C(_,T);function C(f,k){let W={[ae.USER]:0,[ae.GROUP]:1},{compositeUserId:B,deviceIdx:$}=oi(f.id),{compositeUserId:Ee,deviceIdx:N}=oi(k.id),{id:ve,type:ge}=si(B),{id:De,type:_e}=si(Ee);return w(W[ge],W[_e])||w(ve,De)||w($,N)}function w(f,k){return f<k?-1:f===k?0:1}}Ze.participantMarkerCompare=Oa;function me(_,T){let C=Object.entries(_).filter(([,w])=>Array.isArray(T)?!T.includes(w):w!==T);return $a(C)}Ze.objectFilterOutValues=me;function V(_,T,C){let w=C;for(let f in _)Object.hasOwn(_,f)&&(w=T(w,_[f],f));return w}Ze.objectReduce=V,Ze.setImmediate=(()=>{let _=1,T={},C=null;return typeof MessageChannel<"u"&&(C=new MessageChannel,C.port1.onmessage=w=>{let f=w.data;T[f]&&(T[f](),delete T[f])}),function(w){if(C&&document.visibilityState==="hidden"){let k=_;return _=_>=Number.MAX_SAFE_INTEGER?1:_+1,T[k]=w,C.port2.postMessage(k),()=>{T[k]&&delete T[k]}}let f=setTimeout(w,0);return()=>clearTimeout(f)}})();function ne(_){return _!==null&&typeof _=="object"&&!Array.isArray(_)}Ze.isObject=ne;function fe(_,T,C,w){function f(B,$){let Ee=0,N=B.length,ve=!1;for(let ge=0;ge<B.length;ge++)if(!ve&&B[ge].startsWith("m=video")&&(Ee=ge),B[ge].startsWith("a=mid:"+$)&&(ve=!0),ve&&B[ge].startsWith("m=")){N=ge;break}return{start:Ee,end:N}}function k(B,$,Ee,N,ve,ge,De){let _e="a=rid:"+N+" send";for(let Oe=$;Oe<Ee;Oe++)if(B[Oe]===_e){let Vt=_e+" max-width="+ge+";max-height="+De+";max-br="+ve;B[Oe]=Vt}}let W=T?.sender;if(W&&W.track&&T.mid){let B=_.split(n),{start:$,end:Ee}=f(B,T.mid),N=W.getParameters();if(N.encodings)return N.encodings.forEach(ve=>{let ge=ve.rid,De=ve.maxBitrate,_e=ve.scaleResolutionDownBy;if(C&&w&&_e){let Oe=""+Math.round(C/_e),Ct=""+Math.round(w/_e);k(B,$,Ee,ge,De,Oe,Ct)}}),B.join(r)}return _}Ze.patchSimulcastAnswerSdp=fe})(Kr||(Kr={}));var I=Kr;var g=class g{static set(r){Object.hasOwn(r,"voiceParams")&&(Object.assign(g._params.voiceParams,r.voiceParams),delete r.voiceParams),Object.hasOwn(r,"specListenerParams")&&(Object.assign(g._params.specListenerParams,r.specListenerParams),delete r.specListenerParams),Object.hasOwn(r,"apiAuth")&&(Ce.accessToken=r.apiAuth.accessToken,Ce.sessionKey=r.apiAuth.sessionKey,Ce.sessionSecretKey=r.apiAuth.sessionSecretKey),Object.assign(g._params,I.objectFilterOutValues(r,void 0))}static getScreenFrameRate(r){return r?g._params.fastScreenShareFrameRate:g._params.screenFrameRate}static get(r){return g._params[r]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.10-dev.dbd4139e.0"}static get debug(){return g._params.debug}static get protocolVersion(){return g._params.joinFromMultipleDevices?6:5}static get platform(){return g._params.platform}static set platform(r){g._params.platform=r}static get clientStatsPlatform(){return g._params.clientStatsPlatform}static set clientStatsPlatform(r){g._params.clientStatsPlatform=r}static get clientType(){return g._params.clientType}static set clientType(r){g._params.clientType=r}static get externalUserType(){return g._params.externalUserType}static set externalUserType(r){g._params.externalUserType=r}static get device(){return g._params.device}static get apiKey(){return g._params.apiKey}static get apiEnv(){return g._params.apiEnv}static get apiBaseUrl(){return g._params.apiBaseUrl}static set apiBaseUrl(r){g._params.apiBaseUrl=r}static apiEndpoint(r){switch(r??g.apiEnv){case"AUTO":case"PROD":return"https://api.mycdn.me";case"CALLS":return"https://calls.okcdn.ru";case"PROD_OK":return"https://api.ok.ru";case"TEST":return"https://apitest.ok.ru/api";case"VIDEOTEST":return"https://videotestapi.ok.ru/api";case"CALLSTEST":return"https://calls-test.okcdn.ru/api";case"CALLS_BETA":return"https://api-beta.calls-test.oneme.ru/api";case"CALLS_BENDER":return"https://api-bender.calls-test.oneme.ru/api";case"CALLS_MAMES":return"https://api-mames.calls-test.oneme.ru/api";case"CALLS_MARS":return"https://api-mars.calls-test.oneme.ru/api";default:return g._params.apiEnv}}static get apiTimeout(){return g._params.apiTimeout}static get apiMaxAttempt(){return g._params.apiMaxAttempt}static get authToken(){return g._params.authToken}static set authToken(r){g._params.authToken=r}static get anonymToken(){return g._params.anonymToken}static set anonymToken(r){g._params.anonymToken=r}static get domain(){return g._params.domain}static get externalDomain(){return g._params.externalDomain}static get iceServers(){return g._params.iceServers}static set iceServers(r){g._params.iceServers=r}static get wssBase(){return g._params.wssBase}static set wssBase(r){g._params.wssBase=r}static get wtsBase(){return g._params.wtsBase}static set wtsBase(r){g._params.wtsBase=r}static get wssToken(){return g._params.wssToken}static set wssToken(r){g._params.wssToken=r}static get signalingReconnectDelay(){return g._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return g._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return g._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return g._params.waitConnectionDelay}static get waitResponseDelay(){return g._params.waitResponseDelay}static get waitMessageDelay(){return g._params.waitMessageDelay}static get waitAnotherTabDelay(){return g._params.waitAnotherTabDelay}static get debugLog(){return g._params.debugLog}static get forceRelayPolicy(){return g._params.forceRelayPolicy}static set forceRelayPolicy(r){g._params.forceRelayPolicy=r}static get videoMinWidth(){return g._params.videoMinWidth}static get videoMaxWidth(){return g._params.videoMaxWidth}static set videoMaxWidth(r){g._params.videoMaxWidth=r}static get videoMinHeight(){return g._params.videoMinHeight}static get videoMaxHeight(){return g._params.videoMaxHeight}static set videoMaxHeight(r){g._params.videoMaxHeight=r}static get videoAspectRatio(){return g._params.videoAspectRatio}static get videoFrameRate(){return g._params.videoFrameRate}static get videoFacingMode(){return g._params.videoFacingMode||(M.isMobile()?"user":null)}static set videoFacingMode(r){g._params.videoFacingMode=r}static get displaySurface(){return g._params.displaySurface}static get audioEffects(){return g._params.audioEffects}static set audioEffects(r){g._params.audioEffects=r,g._params.audioEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffects(){return g._params.videoEffects}static set videoEffects(r){g._params.videoEffects=r,g._params.videoEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffectMaxWidth(){return g._params.videoEffectMaxWidth}static set videoEffectMaxWidth(r){g._params.videoEffectMaxWidth=r}static get videoEffectMaxHeight(){return g._params.videoEffectMaxHeight}static set videoEffectMaxHeight(r){g._params.videoEffectMaxHeight=r}static get vmoji(){return g._params.vmoji?.isBrowserSupported()?g._params.vmoji:null}static set vmoji(r){g._params.vmoji=r}static get vmojiOptions(){return g._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(r){g._params.vmojiOptions=r}static get voiceParams(){return g._params.voiceParams}static get specListenerParams(){return g._params.specListenerParams}static get iceRestartWaitTime(){return g._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return g._params.transportConnectionWaitTime}static get statisticsInterval(){return g._params.statisticsInterval}static set statisticsInterval(r){g._params.statisticsInterval=r}static get networkStatisticsInterval(){return g._params.networkStatisticsInterval}static get perfStatReportEnabled(){return g._params.perfStatReportEnabled}static get callStatReportEnabled(){return g._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return g._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return g._params.enableLogPerfStatReport}static get asrDataChannel(){return g._params.asrDataChannel}static get consumerScreenDataChannelPacketSize(){return g._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return g._params.screenShareWebmBuilder}static get noiseSuppression(){return g._params.noiseSuppression}static get preferH264(){return g._params.preferH264}static get preferVP9(){return g._params.preferVP9}static get audioNack(){return g._params.audioNack}static get movieShare(){return g._params.movieShare&&g.videoTracksCount>0}static get videoTracksCount(){return Number(g._params.videoTracksCount)}static get breakVideoPayloadTypes(){return g._params.breakVideoPayloadTypes}static get useCallsToContacts(){return g._params.useCallsToContacts}static get useParticipantListChunk(){return g._params.useParticipantListChunk&&g.videoTracksCount>0}static get useRooms(){return g._params.useRooms}static get useChatRooms(){return g._params.useChatRooms}static get addParticipant(){return g._params.addParticipant}static get waitForAdminInGroupCalls(){return g._params.waitForAdminInGroupCalls}static get participantListChunkInitIndex(){return g._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return g._params.participantListChunkInitCount??null}static get filterObservers(){return g._params.filterObservers}static get muteMode(){return g._params.muteMode}static get preserveAudioTracks(){return g._params.preserveAudioTracks}static get audioShare(){return M.isAudioShareSupported()&&g._params.audioShare}static get audioShareWindowInclude(){return g._params.audioShareWindowInclude}static get audioShareSystemInclude(){return g._params.audioShareSystemInclude}static get fastScreenShare(){return g._params.fastScreenShare}static get screenShareCongestionControl(){return g._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return g._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return g._params.fastScreenShareWidth}static get fastScreenShareHeight(){return g._params.fastScreenShareHeight}static get consumerFastScreenShare(){return g._params.consumerFastScreenShare}static get consumerFastScreenShareQualityOnDemand(){return g._params.consumerFastScreenShareQualityOnDemand}static get videoSuspend(){return g._params.videoSuspend}static get enumerateDevicesDelay(){return g._params.enumerateDevicesDelay}static get switchVideoAtBadNetwork(){return g._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return g._params.enableVideoEffectsFpsDegradation}static get simulcast(){return g._params.simulcast}static get webtransport(){return g._params.webtransport}static get webtransportFF(){return g._params.webtransportFF}static toJSON(){return{apiKey:g._params.apiKey,apiEnv:g._params.apiEnv,audioShare:g._params.audioShare,audioShareWindowInclude:g._params.audioShareWindowInclude,audioShareSystemInclude:g._params.audioShareSystemInclude,useCallsToContacts:g._params.useCallsToContacts,useParticipantListChunk:g._params.useParticipantListChunk,useRooms:g._params.useRooms,useChatRooms:g._params.useChatRooms,addParticipant:g._params.addParticipant,fastScreenShare:g._params.fastScreenShare,participantListChunkInitCount:g._params.participantListChunkInitCount,screenShareCongestionControl:g._params.screenShareCongestionControl,screenShareCongestionControlThreshold:g._params.screenShareCongestionControlThreshold,videoTracksCount:g._params.videoTracksCount,asrDataChannel:g._params.asrDataChannel,videoMaxHeight:g._params.videoMaxHeight,videoMaxWidth:g._params.videoMaxWidth,videoEffectMaxHeight:g._params.videoEffectMaxHeight,videoEffectMaxWidth:g._params.videoEffectMaxWidth,videoSuspend:g._params.videoSuspend,debugLog:g._params.debugLog,callStatReportEnabled:g._params.callStatReportEnabled,joinFromMultipleDevices:g._params.joinFromMultipleDevices,movieShare:g._params.movieShare,clientType:g._params.clientType,clientStatsPlatform:g._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:g._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:g._params.switchVideoAtBadNetwork,simulcast:g._params.simulcast,webtransport:g._params.webtransport,webtransportFF:g._params.webtransportFF}}};o(g,"_params",{platform:"WEB",clientStatsPlatform:"",clientType:"PORTAL",externalUserType:"",device:"browser",apiKey:"",authToken:"",anonymToken:"",apiEnv:"AUTO",apiBaseUrl:null,domain:"",externalDomain:"",iceServers:[],wssBase:"",wtsBase:"",wssToken:"",signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,apiTimeout:5e3,apiMaxAttempt:10,forceRelayPolicy:!1,videoMinWidth:428,videoMinHeight:240,videoMaxWidth:1280,videoMaxHeight:720,videoAspectRatio:16/9,videoFrameRate:25,screenFrameRate:15,videoFacingMode:null,displaySurface:"monitor",audioEffects:null,videoEffects:null,videoEffectMaxWidth:640,videoEffectMaxHeight:360,vmoji:null,vmojiOptions:null,iceRestartWaitTime:2e4,transportConnectionWaitTime:5e3,statisticsInterval:5e3,networkStatisticsInterval:2e4,perfStatReportEnabled:!0,callStatReportEnabled:!1,clientEventsLoggingEnabled:!1,enableLogPerfStatReport:!1,voiceParams:{smoothing:.8,minFreq:200,maxFreq:5e3,interval:500,threshold:.35,speakerLevelMultiplier:1.8},specListenerParams:{connectionTimeout:1e4,volumeTimeout:1e4},asrDataChannel:!1,consumerScreenDataChannelPacketSize:64*1024,screenShareWebmBuilder:!1,noiseSuppression:!0,preferH264:!1,preferVP9:!1,audioNack:!0,videoTracksCount:30,movieShare:!1,useCallsToContacts:!1,useParticipantListChunk:!1,useRooms:!1,useChatRooms:!1,addParticipant:!1,waitForAdminInGroupCalls:!1,participantListChunkInitIndex:0,participantListChunkInitCount:null,breakVideoPayloadTypes:!1,joinFromMultipleDevices:!1,filterObservers:!1,muteMode:!1,preserveAudioTracks:!1,audioShare:!1,audioShareWindowInclude:!1,audioShareSystemInclude:!1,fastScreenShare:!1,screenShareCongestionControl:!1,screenShareCongestionControlThreshold:2100,consumerFastScreenShare:!1,consumerFastScreenShareQualityOnDemand:!1,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,webtransportFF:!1});var p=g;function za(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 Pe(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var Ja=n=>n.stop(),hi=n=>n.getTracks().forEach(Ja),Ya=n=>n.getVideoTracks().forEach(Ja);async function Hi(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 Gi=class extends oe{constructor(){super(...arguments);o(this,"FPS_LIMITS",[13,20,Math.max(p.videoFrameRate,25)]);o(this,"THRESHOLD",.8);o(this,"HISTORY_LENGTH",10);o(this,"_fpsMeterUnsubscribe",null);o(this,"_fpsHistory",{cursor:0,arr:[]});o(this,"_fpsLimitCursor",this.FPS_LIMITS.length-1)}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(t){d.warn("VideoEffectsFpsLimiter error",t)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let t=this._fpsHistory.arr.reduce((a,s)=>a+s,0)/this.HISTORY_LENGTH,i=this.FPS_LIMITS[this._fpsLimitCursor];t<i*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),i!==this.fpsLimit&&this._triggerEvent("fps-limit",this.fpsLimit)}}_assertsVideoEffect(e){if(!("addFpsMeterListener"in e))throw new Error("Outdated VideoEffect version")}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}};var He=(i=>(i.audio="audio",i.video="video",i.screen="screen",i.audioshare="audioshare",i))(He||{});var Wi=class extends oe{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",Pe());o(this,"_videoStatusOnScreenCapturingEnabled",!1);o(this,"_effect",null);o(this,"_audioEffectParams",null);o(this,"_onDeviceChange");o(this,"_animojiEnabled",!1);o(this,"_videoEffectsFpsLimiter");o(this,"videoTrackMuteHandler",()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)});this._initDeviceChangeListener(),p.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),p.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Gi,this._videoEffectsFpsLimiter.addEventListener("fps-limit",this.handleVideoEffectsLowFps.bind(this)))}get cameraVideoTrack(){return this._cameraVideoTrack}set cameraVideoTrack(e){this._cameraVideoTrack&&this._cameraVideoTrack.removeEventListener("mute",this.videoTrackMuteHandler),this._cameraVideoTrack=e,this._cameraVideoTrack&&this._cameraVideoTrack.addEventListener("mute",this.videoTrackMuteHandler),p.consumerFastScreenShare&&(this._screenShareTrack=this.getBlackScreenShareTrack())}async request(e=[ce.AUDIO],t=!0){if(this._stream)return;let i=e.includes(ce.VIDEO),a=e.includes(ce.AUDIO),s=e.includes(ce.ANIMOJI);if(!M.isBrowserSupported())throw new j(se.UNSUPPORTED);try{this._stream=await M.getUserMedia(i,a,t),this.cameraVideoTrack?.stop(),this.cameraVideoTrack=this._stream.getVideoTracks()[0],this._micAudioTrack?.stop(),this._micAudioTrack=this._stream.getAudioTracks()[0],this._audioEffectsTrack?.stop(),this._mediaSettings.isVideoEnabled=i&&this._stream.getVideoTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(c=>c.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(c){throw new j(c)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,i){let a=this.getStream(),s=this.getSendAudioTrack(),c=this.getSendVideoTrack(i);if(!a||!s&&!c&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,a),c&&!t&&e.addTrack(c,a)}getMediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case"videoinput":if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case"audioinput":if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(se.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Ya(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)hi(i);else{let a=await this._setEffect(this._effect,this.cameraVideoTrack);R.log(D.DEVICE_CHANGED,t),d.log("Video stream changed"),await this._replaceLocalTrack(a),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw R.log(D.ERROR,"change_video"),d.warn("Camera change failed",t),t}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await M.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)hi(t);else{let i=await this._applyAudioEffect();R.log(D.DEVICE_CHANGED,"audio"),d.log("Audio stream changed",i),await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw R.log(D.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await M.getScreenMedia(e,t),!this._stream)hi(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),R.log(D.DEVICE_CHANGED,"screen"),d.log("Screen capturing started"),this._screenTrack=a,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,p.consumerFastScreenShare&&this._mediaSettings.isFastScreenSharingEnabled&&(a.contentHint="motion",this._screenShareTrack=a),i.getAudioTracks().length>0){let s=i.getAudioTracks()[0];s.contentHint="music",this._audioShareTrack=s,await this._replaceLocalTrack(s),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&d.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:a}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(a){throw R.log(D.ERROR,"screen"),d.warn("Screen capturing failed",a),a}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),this._screenShareTrack&&(this._screenShareTrack.stop(),this._screenShareTrack=this.getBlackScreenShareTrack()),await this.stopAudioShareTrack(),this._mediaSettings.isScreenSharingEnabled&&(this._mediaSettings.isScreenSharingEnabled=!1,this._mediaSettings.isFastScreenSharingEnabled=!1,this._triggerEvent("SCREEN_STATUS",{track:null}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"}))}async stopAudioShareTrack(){if(this._audioShareTrack){this._audioShareTrack.stop();let e=this.getSilentAudioShareTrack();await this._replaceLocalTrack(e),this._mediaSettings.isAudioSharingEnabled=!1}}async _applyAudioEffect(){if(!p.audioEffects||!this._audioEffectParams)return p.audioEffects?.pause(),this._micAudioTrack;p.audioEffects.isInitialized||await p.audioEffects.init(),p.audioEffects.resume(),p.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),p.audioEffects.setSource(this._micAudioTrack);let e=p.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=M.getSilentMediaTrack();return e.contentHint="music",e.stop(),e}getBlackScreenShareTrack(){let e=M.getBlackMediaTrack();return e.contentHint="motion",e.stop(),e}async _replaceLocalTrack(e,t){if(!this._stream)return;let i=this._stream.getTracks().find(a=>a.kind===e.kind&&a.contentHint===e.contentHint);i?.id!==e.id&&(i?(i!==this._audioEffectsTrack&&i.stop(),this._stream?.removeTrack(i),this._stream?.addTrack(e),this._triggerEvent("TRACK_REPLACED",e,t)):(this._stream.addTrack(e),this._triggerEvent("TRACK_REPLACED",e,t)))}async _setEffect(e,t){if(this._videoEffectsFpsLimiter?.watch(p.videoEffects),!p.videoEffects)return t;try{return p.videoEffects.setEffect(e,t)}catch(i){return d.warn("Video effect failed",i),t}}_stopEffect(){if(p.videoEffects)try{p.videoEffects.stopEffect()}catch(e){d.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),p.videoEffects&&(this._effect=null,p.videoEffects.destroy()),p.audioEffects&&p.audioEffects.destroy(),this._stream&&(hi(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),M.getAudioContext()?.suspend().catch(t=>d.error(t)),this._videoEffectsFpsLimiter?.destroy()}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return this._disableScreenCapture()}async disableScreenCapturing(){return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}async toggleVideo(e){if(!this._stream)return;this.cameraVideoTrack?.stop();let t;if(e){let i=await M._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=M.getBlackMediaTrack(p.videoMinWidth,p.videoMinHeight),this._stopEffect();if(this._mediaSettings.isVideoEnabled=e,await this._replaceLocalTrack(t),this._animojiEnabled){this._triggerEvent("ANIMOJI_STATUS",!e);return}this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}async toggleAudio(e){if(!this._stream)return;this._micAudioTrack?.stop();let t=async(i,a)=>{await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=a,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})};if(e)try{let i=await M.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw p.audioEffects?.pause(),t(M.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else p.audioEffects?.pause(),t(M.getSilentMediaTrack(),!1)}toggleAnimojiCapturing(e){this._animojiEnabled=e,this._mediaSettings.isVideoEnabled||this._triggerEvent("ANIMOJI_STATUS",e)}onAnimojiSender(e){this._mediaSettings.isAnimojiEnabled=e,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}async setResolution({video:e,effect:t}){if(!this._mediaSettings.isVideoEnabled)return;if(!this._stream)throw new Error("Local stream not found");if(!this.cameraVideoTrack)throw new Error("Local video track not found");let i=this._effect&&t||e;await this._applyVideoConstraints(this.cameraVideoTrack,i)}getCameraVideoTrack(){return this.cameraVideoTrack}async updateNoiseSuppression(){if(!this._stream||!this._mediaSettings.isAudioEnabled)return;let e=this._stream.getAudioTracks().find(t=>!t.contentHint);if(!e)throw new Error("Local audio track not found");if(e.enabled)return e.applyConstraints({noiseSuppression:p.noiseSuppression})}async videoEffect(e){if(!p.videoEffects)throw new Error("Video Effects library is not set");if(R.log(D.DEVICE_CHANGED,`effect_${e?.effect||"none"}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this.cameraVideoTrack){let t=this._effect;this._effect=e;try{let i=this.cameraVideoTrack.clone(),a=new MediaStream([i]);await this._applyVideoConstraints(i),await this._changeVideoInput(a)}catch(i){this._effect=t;let a=this.cameraVideoTrack.clone(),s=new MediaStream([a]);throw await this._changeVideoInput(s),i}}}async audioEffect(e){if(!p.audioEffects)throw new Error("Audio Effects library is not set");if(!this._mediaSettings.isAudioEnabled){this._audioEffectParams=e;return}if(this._stream&&(!e&&this._audioEffectParams||e&&!this._audioEffectParams||!I.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let i=this._micAudioTrack.clone(),a=new MediaStream([i]);await this._changeAudioInput(a)}catch(i){this._audioEffectParams=t;let a=this._micAudioTrack.clone(),s=new MediaStream([a]);throw await this._changeAudioInput(s),i}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this.cameraVideoTrack&&e<p.videoFrameRate&&this._applyVideoConstraints(this.cameraVideoTrack).catch(t=>{d.warn("MediaSource handleVideoEffectsLowFps error",t)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??p.videoFrameRate;return this._effect?Math.min(e,p.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await Hi(e,{width:this._effect?p.videoEffectMaxWidth:p.videoMaxWidth,height:this._effect?p.videoEffectMaxHeight:p.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}getScreenShareTrack(){return this._screenShareTrack}};var _i=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 Ki=(l=>(l.WAITING_HALL="WAITING_HALL",l.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",l.WAITING="WAITING",l.CONNECTING="CONNECTING",l.CONNECTED="CONNECTED",l.RECONNECT="RECONNECT",l.ERROR="ERROR",l.HANGUP="HANGUP",l.PERMISSIONS="PERMISSIONS",l))(Ki||{});function G(n,...r){let e=p.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function he(n,r,...e){if(p.filterObservers){if(Array.isArray(r)){if(r=r.filter(t=>!t.observer),!r.length)return}else if(r.observer)return}G(n,r,...e)}function ye(n){return Object.assign({},n)}function bt(n){return n.slice()}var $r;(dl=>{function n(S,A){G("onLocalStream",S,ye(A))}dl.onLocalStream=n;function r(S,A){G("onScreenStream",S,ye(A))}dl.onScreenStream=r;function e(S,A){G("onVmojiStream",S,ye(A))}dl.onVmojiStream=e;function t(S){G("onVmojiError",S)}dl.onVmojiError=t;function i(S,A){G("onLocalStreamUpdate",ye(S),A)}dl.onLocalStreamUpdate=i;function a(S){d.debug("Local status:",S),G("onLocalStatus",S)}dl.onLocalStatus=a;function s(S,A){he("onRemoteStream",S,A)}dl.onRemoteStream=s;function c(S,A){he("onRemoteLive",S,A)}dl.onRemoteLive=c;function u(S,A){he("onLocalLive",S,A)}dl.onLocalLive=u;function l(S,A){he("onRemoteLiveUpdate",S,A)}dl.onRemoteLiveUpdate=l;function m(S,A){he("onLocalLiveUpdate",S,A)}dl.onLocalLiveUpdate=m;function h(S,A){he("onRemoteScreenStream",S,A)}dl.onRemoteScreenStream=h;function E(S,A){he("onRemoteVmojiStream",S,A)}dl.onRemoteVmojiStream=E;function P(S,A,K){he("onRemoteStreamSuspended",S,A,K)}dl.onRemoteStreamSuspended=P;function b(S,A,K,Le,Pt){he("onConversation",S,ye(A),ye(K),Le,Pt)}dl.onConversation=b;function H(S){S&&G("onConversationParticipantListChunk",S)}dl.onConversationParticipantListChunk=H;function J(S,A,K){he("onRemoteMediaSettings",S,ye(A),K)}dl.onRemoteMediaSettings=J;function de(S,A){he("onLocalMediaSettings",S,ye(A))}dl.onLocalMediaSettings=de;function Ie(S,A,K){he("onRemoteSharedMovieInfo",S,ye(A),K)}dl.onRemoteSharedMovieInfo=Ie;function Te(S,A,K){he("onRemoteSharedMovieStoppedInfo",S,ye(A),K)}dl.onRemoteSharedMovieStoppedInfo=Te;function Y(S,A,K){he("onLocalSharedMovieInfo",S,ye(A),K)}dl.onLocalSharedMovieInfo=Y;function Re(S,A,K){he("onLocalSharedMovieStoppedInfo",S,ye(A),K)}dl.onLocalSharedMovieStoppedInfo=Re;function Q(S,A,K){he("onRemoteSharedUrl",S,A,K)}dl.onRemoteSharedUrl=Q;function ni(S,A){he("onParticipantAdded",S,A)}dl.onParticipantAdded=ni;function Ca(S,A){he("onParticipantJoined",S,A)}dl.onParticipantJoined=Ca;function Pa(S,A=!1){G("onLocalParticipantState",ye(S),A)}dl.onLocalParticipantState=Pa;function si(S,A,K){he("onRemoteParticipantState",S,ye(A),K)}dl.onRemoteParticipantState=si;function oi(S,A){G("onRemoteParticipantsState",S,A)}dl.onRemoteParticipantsState=oi;function ya(S,A,K=null){d.debug("Remote status:",A,S),he("onRemoteStatus",S,A,K)}dl.onRemoteStatus=ya;function re(){G("onPermissionsRequested")}dl.onPermissionsRequested=re;function ba(S,A){G("onPermissionsError",S,A)}dl.onPermissionsError=ba;function te(S,A){he("onRemoteRemoved",S,A)}dl.onRemoteRemoved=te;function Ma(S,A,K){G("onCallState",S,A,ye(K))}dl.onCallState=Ma;function Fr(S,A){G("onDeviceSwitched",S,A)}dl.onDeviceSwitched=Fr;function Vr(S,A,K,Le=!1,Pt=!1,Gr=null,Wr=null,Es,Na,Ts=null){let Rs=Na?bt(Na):void 0;G("onMuteStates",ye(S),bt(A),bt(K),Le,Pt,Gr,Wr,Es,Rs,Ts)}dl.onMuteStates=Vr;function jr(S,A,K=!1){he("onRolesChanged",S,bt(A),K)}dl.onRolesChanged=jr;function Aa(S,A=!1){G("onLocalRolesChanged",bt(S),A)}dl.onLocalRolesChanged=Aa;function Da(S,A,K,Le){he("onPinnedParticipant",S,A,K,Le)}dl.onPinnedParticipant=Da;function Hr(S,A){G("onLocalPin",S,A)}dl.onLocalPin=Hr;function wa(S){G("onOptionsChanged",bt(S))}dl.onOptionsChanged=wa;function ka(){G("onCallAccepted")}dl.onCallAccepted=ka;function Oa(S,A){he("onAcceptedCall",S,A)}dl.onAcceptedCall=Oa;function me(){G("onRateNeeded")}dl.onRateNeeded=me;function V(S){he("onSpeakerChanged",S)}dl.onSpeakerChanged=V;function ie(S){G("onVolumesDetected",bt(S))}dl.onVolumesDetected=ie;function ne(S,A){G("onLocalVolume",S,A)}dl.onLocalVolume=ne;function fe(S,A){G("onJoinStatus",S,A)}dl.onJoinStatus=fe;function Ze(S,A){G("onHangup",S,A)}dl.onHangup=Ze;function _(S){G("onMultipartyChatCreated",ye(S))}dl.onMultipartyChatCreated=_;function T(){G("onDeviceChange")}dl.onDeviceChange=T;function C(S){G("onFingerprintChange",S)}dl.onFingerprintChange=C;function w(){G("onTokenExpired")}dl.onTokenExpired=w;function f(S,A,K=!1){G("onChatMessage",S,A,K)}dl.onChatMessage=f;function k(S,A,K=!1){G("onCustomData",S,A,K)}dl.onCustomData=k;function W(S,A,K,Le,Pt,Gr,Wr=null){G("onRecordStarted",S,A,K,Le,Pt,Gr,Wr)}dl.onRecordStarted=W;function B(S=null,A){G("onRecordStopped",S,A)}dl.onRecordStopped=B;function $(S){G("onLocalNetworkStatusChanged",S)}dl.onLocalNetworkStatusChanged=$;function Ee(S){G("onNetworkStatusChanged",S)}dl.onNetworkStatusChanged=Ee;function N(S,...A){G("onDebugMessage",S,...A)}dl.onDebugMessage=N;function ve(S,A){let K=Object.assign({},S,{memory:A});G("onStatistics",K)}dl.onStatistics=ve;function ge(){G("onAutoplayError")}dl.onAutoplayError=ge;function De(S,A,K,Le,Pt){G("onChatRoomUpdated",S,A,K,Le,Pt)}dl.onChatRoomUpdated=De;function _e(S){G("onPromoted",S)}dl.onPromoted=_e;function Oe(S){G("onRemoteMixedAudioStream",S)}dl.onRemoteMixedAudioStream=Oe;function Ct(S){G("onJoinLinkChanged",S)}dl.onJoinLinkChanged=Ct;function Vt(S){G("onRoomsUpdated",S)}dl.onRoomsUpdated=Vt;function et(S,A,K,Le){G("onRoomUpdated",S,A,K,Le)}dl.onRoomUpdated=et;function ci(S){G("onRoomParticipantsUpdated",S)}dl.onRoomParticipantsUpdated=ci;function xa(S){G("onRoomSwitched",S)}dl.onRoomSwitched=xa;function Yd(S){G("onRoomStart",S)}dl.onRoomStart=Yd;function Qd(S,A=null){G("onFeedback",S,A)}dl.onFeedback=Qd;function Xd(S){G("onFeaturesPerRoleChanged",S)}dl.onFeaturesPerRoleChanged=Xd;function Zd(S){G("onParticipantVmojiUpdate",S)}dl.onParticipantVmojiUpdate=Zd;function el(S,A){G("onAsrSet",S,A)}dl.onAsrSet=el;function tl(S,A,K){G("onAsrStarted",S,A,K)}dl.onAsrStarted=tl;function il(S){G("onAsrStopped",S)}dl.onAsrStopped=il;function rl(S,A,K,Le){G("onAsrTranscription",S,A,K,Le)}dl.onAsrTranscription=rl;function al(S,A){G("onParticipantIdChanged",S,A)}dl.onParticipantIdChanged=al;function nl(S){G("onVideoSuspendSuggest",S)}dl.onVideoSuspendSuggest=nl;function sl(S){G("onSignalingMessage",typeof S=="string"?S:ye(S))}dl.onSignalingMessage=sl;function ol(S){G("onPromotionApproved",S)}dl.onPromotionApproved=ol;function cl(){G("onPeerRegistered")}dl.onPeerRegistered=cl})($r||($r={}));var v=$r;var zr="_okcls_",Ht=(()=>{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 Ns(n){let r=Ht?Ht.getItem(zr+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function Ls(n,r){try{Ht&&Ht.setItem(zr+n,JSON.stringify(r))}catch{}}function Us(n){Ht&&Ht.removeItem(zr+n)}var qr;(t=>{function n(i){return Ns(i)||null}t.get=n;function r(i,a){Ls(i,a)}t.set=r;function e(i){Us(i)}t.remove=e})(qr||(qr={}));var ft=qr;var Wt=null,$i=null,Xi=null,er=[],tr=[],Zi=[],$e=null,qe=null,ir=null,rr=!1,ar=!1,qi,Gt,zi,Jr=null,Yr="",Qa=null,Ji=[],Yi=null,Xa=navigator.appVersion,Bs=navigator.appName,Ue=navigator.userAgent,st={},gt=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(gt||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(gt||(gt={}));var At=class{constructor(r,e=!1,t=p.videoMaxWidth,i=p.videoMaxHeight,a=p.videoFrameRate){o(this,"audio");o(this,"video");o(this,"needVideo");o(this,"lastSimplifyWasReached");o(this,"supportedConstraints");o(this,"isVideoRequested",()=>this.needVideo);this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(r){s={noiseSuppression:p.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let u=be.getMicrophones(),l,m;if(qe&&(m=qe.groupId,l=qe.deviceId),typeof r=="string")m=u.find(E=>E.deviceId===r)?.groupId,l=r;else if(!qe&&be.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,l=h.deviceId)}m&&this.supportedConstraints.groupId?s.groupId={exact:m}:l&&(s.deviceId={exact:l})}let c=!1;if(e){c={width:{min:p.videoMinWidth,max:t,ideal:t},height:{min:p.videoMinHeight,max:i,ideal:i},aspectRatio:{ideal:p.videoAspectRatio},frameRate:{ideal:a}};let u=be.getCameras(),l,m;if($e&&(m=$e.groupId,l=$e.deviceId),typeof e=="string")m=u.find(E=>E.deviceId===e)?.groupId,l=e;else if(!$e&&be.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,l=h.deviceId)}m&&this.supportedConstraints.groupId?c.groupId={exact:m}:l&&(c.deviceId={exact:l}),p.videoFacingMode&&(c.facingMode={ideal:p.videoFacingMode},delete c.deviceId,delete c.groupId)}this.audio=s,this.video=c,this.needVideo=!!c,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video=="object"&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio=="object"&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let r=typeof this.video=="object"&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio=="object"&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||r)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Qr=class extends At{constructor(e,t,i,a){super(!1,!0);o(this,"captureController");if(this.captureController="CaptureController"in window?new CaptureController:null,typeof this.video=="object"?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode):this.video={},this.video.cursor="motion",this.video.width=e,this.video.height=t,this.video.frameRate=i,this.video.displaySurface=p.displaySurface,be.browserName()==="Safari"){let s=Number(be.browserVersion());s===16?(this.video.width={max:e},this.video.height={max:t}):s===17&&(delete this.video.width,delete this.video.height)}a&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:p.audioShareSystemInclude?"include":"exclude",windowAudio:p.audioShareWindowInclude?"include":"exclude",controller:this.captureController})}},Mt=class Mt{constructor(){o(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(Mt._lockId)throw R.log(D.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");Mt._lockId=this._lockId}free(){Mt._lockId===this._lockId&&(Mt._lockId=0)}};o(Mt,"_lockId",0);var nr=Mt;async function Za(){ar=!1,rr=!1,Wt=null;let n={camera:be.getSavedCamera(),microphone:be.getSavedMicrophone(),output:be.getSavedOutput()};await Xr(),Fs("devicechange",n),v.onDeviceChange()}function Fs(n,...r){if(st[n])for(let e of st[n])e(...r)}async function Xr(){return Wt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!$i&&navigator.mediaDevices.addEventListener&&($i=I.debounce(Za,p.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",$i)),!Xi&&_i.isSupported()&&(Xi=new _i,await Xi.init((n,r)=>{switch(r){case"denied":case"prompt":$i?.();break}})),Wt=navigator.mediaDevices.enumerateDevices().then(n=>{er=n.filter(i=>i.kind==="videoinput"?(i.label&&(rr=!0),!0):!1),tr=n.filter(i=>i.kind==="audioinput"?(i.label?ar=!0:be.isMobile()&&be.browserName()==="Firefox"&&(ar=rr),!0):!1),Zi=n.filter(i=>i.kind==="audiooutput");let r=$e?.deviceId??ft.get("videoinput"),e=qe?.deviceId??ft.get("audioinput"),t=ir?.deviceId??ft.get("audiooutput");return $e=er.find(i=>i.deviceId===r)||null,qe=tr.find(i=>i.deviceId===e)||null,ir=Zi.find(i=>i.deviceId===t)||Zi[0]||null,Wt=Promise.resolve(n),n}).catch(()=>(Wt=null,[]))))}async function Vs(){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]);Qa=isNaN(r)?null:r}catch(n){d.warn("Failed to get OS version",n)}}function js(n){if($e&&qe)return;let r=(e,t)=>{let i=t.getSettings()?.deviceId;return e.find(a=>a.deviceId===i||a.label===t.label)||null};n?.getTracks().forEach(e=>{!qe&&e.kind==="audio"?qe=r(be.getMicrophones(),e):!$e&&e.kind==="video"&&($e=r(be.getCameras(),e))})}async function gi(n,r){d.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative())));let e=(!n.isVideo()||be.hasCameraPermission())&&(!n.isAudio()||be.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new nr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await Za(),js(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()?se.CAMERA_PERMISSION:se.MIC_PERMISSION;break;case"OverconstrainedError":r=se.OVERCONSTRAINED;break;case"TypeError":r=se.UNKNOWN;break;case"AbortError":case"NotReadableError":r=n.isVideoRequested()?se.CAMERA_ACCESS:se.MIC_ACCESS;break;case"Error":if(i.message==="MediaSource is busy"){r=n.isVideoRequested()?se.CAMERA_ACCESS:se.MIC_ACCESS;break}}if(n.canSimplify())return gi(n.simplify(),r);let a=r||se.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function Hs(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new nr;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 se.SCREEN_PERMISSION;default:throw se.SCREEN_ACCESS}}finally{r.free()}}function Qi(){return Ji.length||(Ji=(()=>{let n,r=!1,e=0,t="0",i=Ue.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return n=/\brv[ :]+(\d+)/g.exec(Ue),["IE",n&&n[1]||"Unknown",r,e,t];if(i[1]==="Safari"){if(n=Ue.match(/\bEdge\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bCriOS\/(\d+)/),n)return["Chrome",n[1],!0,Number(n[1]),t];if(n=Ue.match(/\bFxiOS\/(\d+)/),n)return["Firefox",n[1],!1,e,t];if(n=Ue.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1],!1,e,t];if(n=Ue.match(/\bOPT\/(\d+)/),n)return["Opera",n[1],!1,e,t]}if(i[1]==="Chrome"){if(r=!0,e=Number(i[2]),n=Ue.match(/\bOPR\/(\d+)/),n)return["Opera",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bSferum\/((\d+)(?:\.\d+)*)/),n)return["Sferum",n[1]||"Unknown",r,e,t];if(n=Ue.match(/\bEdge?\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(typeof window.opr<"u"&&/^(.+\.)?ok.ru$/.test(window.location.host))return["Opera","Hidden",r,e,t]}return n=Ue.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),n&&n[2]!==void 0&&(t=n[2]),[i[2]?i[1]:Bs,n&&n[1]||i[2]||Xa,r,e,t]})()),Ji}var be;(me=>{async function n(){await Xr(),await Vs()}me.init=n;function r(){return er}me.getCameras=r;function e(){return tr}me.getMicrophones=e;function t(){return Zi}me.getOutput=t;function i(){return er.length>0}me.hasCamera=i;function a(){return tr.length>0}me.hasMicrophone=a;function s(){return $e}me.getSavedCamera=s;function c(){return qe}me.getSavedMicrophone=c;function u(){return ir}me.getSavedOutput=u;function l(){return p.videoFacingMode}me.getVideoFacingMode=l;function m(){return rr}me.hasCameraPermission=m;function h(){return ar}me.hasMicrophonePermission=h;function E(){return Xi?.getPermissionState("microphone")??null}me.getMicrophonePermissionState=E;function P(V=!1){return h()?i()&&V?m():!0:!1}me.hasPermissions=P;async function b(V=!1,ie=!0,ne=!0){let fe=a()&&ie,Ze=i()&&V,_;if(!fe&&!Ze)_=new MediaStream;else try{_=await gi(new At(fe,Ze))}catch{_=new MediaStream}return!_.getVideoTracks().length&&ne&&_.addTrack(me.getBlackMediaTrack()),!_.getAudioTracks().length&&ne&&_.addTrack(me.getSilentMediaTrack()),_}me.getUserMedia=b;async function H(V,ie){let ne=V&&!p.consumerFastScreenShare?p.fastScreenShareWidth:window.screen.width,fe=V&&!p.consumerFastScreenShare?p.fastScreenShareHeight:window.screen.height,Ze=p.getScreenFrameRate(V);return Hs(new Qr(ne,fe,Ze,ie))}me.getScreenMedia=H;async function J(V=!1,ie){let ne=V?p.videoEffectMaxWidth:p.videoMaxWidth,fe=V?p.videoEffectMaxHeight:p.videoMaxHeight;return gi(new At(!1,!0,ne,fe,ie))}me._getUserVideo=J;async function de(V,ie){let ne=ie?.width||p.videoMaxWidth,fe=ie?.height||p.videoMaxHeight;return gi(new At(!1,V||!0,ne,fe))}me.getUserVideo=de;async function Ie(V){return gi(new At(V||!0,!1))}me.getUserAudio=Ie;async function Te(V,ie){let[ne]=V.getVideoTracks();if(!ne)throw new Error("Video track not found in stream");return Hi(ne,ie)}me.setResolution=Te;async function Y(V,ie){let fe=(await Xr()).find(Ze=>Ze.kind===V&&Ze.deviceId===ie);return fe?(V==="videoinput"?$e=fe:V==="audioinput"?qe=fe:V==="audiooutput"&&(ir=fe),ft.set(V,ie),fe):null}me._saveDeviceId=Y;function Re(){if(!zi||zi.readyState==="ended"){let V=me.getAudioContext(),ie=V.createMediaStreamDestination(),ne=V.createGain();ne.gain.value=1e-5,ne.connect(ie),ne.connect(V.destination);let fe=V.createOscillator();fe.type="sine",fe.frequency.value=0,fe.connect(ne),fe.start(),zi=ie.stream.getAudioTracks()[0]}return Object.assign(zi.clone(),{enabled:!1})}me.getSilentMediaTrack=Re;function Q(V=p.videoMinWidth,ie=p.videoMinHeight){Gt||(Gt=document.createElement("canvas")),Gt.width=V,Gt.height=ie;let ne=Gt.getContext("2d");return ne.rect(0,0,V,ie),ne.fillStyle="black",ne.fill(),(!qi||qi.readyState==="ended")&&(qi=Gt.captureStream(p.videoFrameRate).getVideoTracks()[0]),Object.assign(qi.clone(),{enabled:!1})}me.getBlackMediaTrack=Q;function ni(){if(Vr()==="Edge"&&Number(jr())<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}}me.isBrowserSupported=ni;function Ca(){return!!navigator.mediaDevices.getDisplayMedia}me.isScreenCapturingSupported=Ca;function Pa(){let V=me.browserName()==="Safari"&&me.browserVersion()==="15"&&me.browserSubVersion()==="1",ie=me.browserName()==="Opera",ne=me.browserName()==="Yandex";return V||ie||ne}me.isBrokenH264Decoder=Pa;function si(){return me.browserName()==="Yandex"&&me.os()==="Windows"||p.simulcast}me.isBrokenVP9Encoder=si;function oi(){let V=me.browserName()==="Safari"&&Number(me.browserVersion())===17&&[4,5,6].includes(Number(me.browserSubVersion())),ie=me.os()==="Windows"&&me.osVersion()===10;return V||ie}me.isBrokenVP9Decoder=oi;function ya(){return me.browserName()==="Firefox"&&Number(me.browserVersion())<60}me.isOldDataChannelDescription=ya;function re(){return!(me.baseChromeVersion()&&me.isMobile())}me.canPreferH264=re;function ba(){return!(me.browserName()==="Firefox"||me.browserName()==="Safari")}me.isSimulcastSupportedByBrowser=ba;function te(){return Yr||(Yr=(()=>{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 ie in V)if(Object.hasOwn(V,ie)&&V[ie].test(Ue))return ie;return"Unknown"})()),Yr}me.os=te;function Ma(){return Qa}me.osVersion=Ma;function Fr(){return Jr===null&&(Jr=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Xa)),Jr}me.isMobile=Fr;function Vr(){return Qi()[0]}me.browserName=Vr;function jr(){return Qi()[1]}me.browserVersion=jr;function Aa(){return Qi()[3]}me.baseChromeVersion=Aa;function Da(){return Yi||(Yi=new(window.AudioContext||window.webkitAudioContext)),Yi.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),Yi}me.getAudioContext=Da;function Hr(){return Qi()[4]}me.browserSubVersion=Hr;function wa(){return me.baseChromeVersion()>=105&&!me.isMobile()}me.isAudioShareSupported=wa;function ka(V,ie){st[V]||(st[V]=[]),st[V].push(ie)}me.addEventListener=ka;function Oa(V,ie){if(st[V])if(!ie)delete st[V];else{let ne=st[V].indexOf(ie);ne>-1&&st[V].splice(ne,1)}}me.removeEventListener=Oa})(be||(be={}));var M=be;var Ge=class Ge{static get startTime(){return Ge._list[0]?.t||0}static get endTime(){let r=Ge._list;return r[r.length-1]?.t||0}static startSession(){Ge._list=[]}static get conversationId(){return Ge._conversationId}static set conversationId(r){Ge._conversationId=r}static add(r){Ge._list.push(r)}static _createContextLogs(){let r=[[`Calls SDK ${p.sdkVersion}`,p.toJSON()],["UserAgent:",navigator.userAgent],["Screen resolution:",`${window.screen.width}x${window.screen.height}`],["Permissions:",`Camera: ${M.hasCameraPermission()}, Mic: ${M.hasMicrophonePermission()}`]],e=new Date,t=e.getTime(),i=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return r.map(a=>({h:i,t,l:"LOG",d:a}))}static collectLogs(){let r=Ge._list;return r.length===0?[]:[...Ge._createContextLogs(),...r]}};o(Ge,"_list",[]),o(Ge,"_conversationId",null);var xe=Ge;var sr=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 Zr=2*1024*1024,en=512*1024,Kt=100*1024,Gs=5,ta="_okcls_logs_session_",Ws=3e4,ia=class{constructor(){o(this,"_items",[]);o(this,"_itemsSize",0);o(this,"_storageSize",Zr);try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(ta)!==0)continue;let t=r.getItem(e);if(!t){tn(e);continue}let i=an(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(Kt)}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,Zr)}add(r,e){let t=parseInt(r.replace(ta,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(tn(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>Zr||this.length>Gs-1||this.size+r>this.available);)this.deleteOldestItem()}};function rn(){return`${ta}${Date.now()}`}function an(n){return new Blob([n]).size}function tn(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function or(){let n=St.toString();if(!we.available||!n)return;let r=an(n);if(r>en){St.bisect(),or();return}we.cleanup(Kt+r);try{window.localStorage.setItem(cr,n)}catch(e){if(console.warn("Failed to write log to storage",e),we.storageSize=we.size+r,we.cleanup(Kt+r),we.available>=Kt+r){or();return}if(r>Kt){St.bisect(),or();return}we.storageSize=0;return}r>en&&(we.add(cr,r),cr=rn(),St.clear(),we.cleanup(Kt))}function ra(){!we.available||!St.length||or()}function Ks(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 $s(e,t),t}function $s(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 nn(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),ea||(ea=window.setTimeout(()=>{ea=null,ra()},Ws))}function aa(){we||(we=new ia,St=new sr,cr=rn(),window.addEventListener("beforeunload",ra))}var we,St,cr,ea=null;window.__VKCallsSDKLogs__=(n=!1)=>(we||aa(),ra(),Ks(n));var sa=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(sa||{}),na;(Y=>{let n="📞",r=(Re,...Q)=>{v.onDebugMessage(Re,...Q)},e=!1,t=(Re,Q)=>(...ni)=>{Re(...ni),nn(Q,ni)},i=console.debug.bind(console,n),a=console.log.bind(console,n),s=console.warn.bind(console,n),c=console.error.bind(console,n),u=r.bind(null,"DEBUG"),l=r.bind(null,"LOG"),m=r.bind(null,"WARN"),h=r.bind(null,"ERROR");Y.debug=u,Y.log=l,Y.warn=m,Y.error=h;function J(){return e}Y.enabled=J;function de(Re){e=Re,p.debugLog&&aa(),Re?(Y.debug=p.debugLog?t(i,"DEBUG"):i,Y.log=p.debugLog?t(a,"LOG"):a,Y.warn=p.debugLog?t(s,"WARN"):s,Y.error=p.debugLog?t(c,"ERROR"):c):(Y.debug=p.debugLog?t(u,"DEBUG"):u,Y.log=p.debugLog?t(l,"LOG"):l,Y.warn=p.debugLog?t(m,"WARN"):m,Y.error=p.debugLog?t(h,"ERROR"):h)}Y.toggle=de;function Ie(Re,...Q){switch(Re){case"DEBUG":(0,Y.debug)(...Q);break;case"LOG":(0,Y.log)(...Q);break;case"WARN":(0,Y.warn)(...Q);break;case"ERROR":(0,Y.error)(...Q);break}}Y.send=Ie;function Te(Re,...Q){}Y.test=Te})(na||(na={}));var d=na;var zs="kf";function $t(n){return n.stopStream}function oa(n){return n.keyFrameRequested}function sn(n){if($t(n))return"ss";if(oa(n))return zs;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 Dt=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(Dt||{}),on="s",cn="m";function tt(n){return n.participantId+(n.mediaType?jt+on+n.mediaType:"")+(n.streamName?jt+cn+n.streamName:"")}function qt(n){let r=n.split(jt),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 on:t=Js(c.slice(1));break;case cn:i=c.slice(1);break;case ji:a=Number.parseInt(c.slice(1),10);break;default:throw new Error("Unexpected parameter type "+c.charAt(0)+" in stream description "+n)}return{participantId:I.compose(e,a),mediaType:t,streamName:i}}function Js(n){for(let r of Object.keys(Dt))if(r===n)return Dt[r];return null}function it(){let n=new DataView(new ArrayBuffer(64)),r=0;function e(t){if(r+t>n.byteLength){let i=new Uint8Array(Math.max(r+t,n.byteLength+64));i.set(new Uint8Array(n.buffer.slice(0,r))),n=new DataView(i.buffer)}}return{put(t){if(e(t.byteLength),Ys(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 Ys(n){return n.buffer!==void 0}function dr(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 dn=0,ln=1,Qs=2,Xs=3,Zs=4,eo=5,to=6,io=7,ro=0,ao=1,no=2,ot=0,so=0,oo=0,co=1,lr=class{constructor(){o(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=it();L.Int.enc(t,dn),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=it();if(this.writeStreamDesc(e,a),$t(i))L.Int.enc(a,ao);else if(oa(i))L.Int.enc(a,no);else if(L.Int.enc(a,ro),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,oo);break;case"cn":L.Int.enc(a,co);break;default:L.Nil.enc(a,null)}else L.Nil.enc(a,null);t.push(a.ui8array().buffer)}writeStreamDesc(r,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(r);if(t!==void 0){L.Int.enc(e,t);return}}L.Str.enc(e,r)}serializePerfStatReport(r,e){let t=it();return L.Int.enc(t,ln),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=it();return L.Int.enc(t,Qs),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=it();return L.Int.enc(t,Xs),L.Int.enc(t,ot),L.Int.enc(t,r),L.Bool.enc(t,e.request),t.ui8array().buffer}serializeNetworkStatReport(r,e){let t=it();return L.Int.enc(t,Zs),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=it();return L.Int.enc(t,eo),L.Int.enc(t,ot),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeEnableVideoSuspendSuggest(r,e){let t=it();return L.Int.enc(t,to),L.Int.enc(t,ot),L.Int.enc(t,r),L.Bool.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=it();L.Int.enc(t,io),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 qa(r);e=dr(s)}else e=dr(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)!==so){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case dn:return this.deserializeUpdateDisplayLayoutResponse(e);case ln: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=dr(a),c=L.Any.dec(s);if(typeof c=="string")i[c]=L.Int.dec(s);else{let u=c,l=tt(this.participantIdRegistry?.getStreamDescription(u));i[l]=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 pn=(Q=>(Q.CALL_FINISH="call_finish",Q.CODEC_USAGE="codec_usage",Q.SIGNALING_CONNECTED="signaling_connected",Q.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",Q.FIRST_MEDIA_RECEIVED="first_media_received",Q.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",Q.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",Q.CALL_START="call_start",Q.SIGNALING_PING_SUMMARY="signaling_ping_summary",Q.SIGNALING_COMMAND_SUMMARY="signaling_command_summary",Q.WEBSOCKET_CONNECTED="websocket_connected",Q.WEBSOCKET_RECONNECTED="websocket_reconnected",Q.WEBSOCKET_FAILED_PINGS="websocket_failed_pings",Q.WEBSOCKET_FAILED_EXCEPTION="websocket_failed_exception",Q.WEBSOCKET_TIMEOUT="websocket_timeout",Q.WEBSOCKET_RESTART="websocket_restart",Q.WEBTRANSPORT_CONNECTED="webtransport_connected",Q.WEBTRANSPORT_RECONNECTED="webtransport_reconnected",Q.WEBTRANSPORT_FAILED_PINGS="webtransport_failed_pings",Q.WEBTRANSPORT_FAILED_EXCEPTION="webtransport_failed_exception",Q.WEBTRANSPORT_TIMEOUT="webtransport_timeout",Q.WEBTRANSPORT_RESTART="webtransport_restart",Q))(pn||{}),X=pn;var lo=1e3;function le(n,r,e=0){return r in n&&n[r]?n[r]:e}function ca(...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 po(n){return(r,e)=>e[n]-r[n]}function fi(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function un(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function la(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])?la(e[1]):e[1],r),{})}function mn(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function uo(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(mn).then(un)}function hn(n){let r=n.filter(vt("type","candidate-pair")).sort(po("priority")).find(ca(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}}),la(e)}function da(n,r,e=!1){let t=fi("id",n),i=e?n.filter(ca(vt("type","remote-inbound-rtp"))):n.filter(ca(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),u=a[s.ssrc].isRemote?s:a[s.ssrc];c.id=u.id,c.type=u.type,delete c.isRemote,delete c.remoteId,a[c.ssrc]=c}return a},{}))),i.map(a=>{let s=Number(a.ssrc),c=a.mediaType||a.kind,u=a.remoteId||a.trackId,l=a.type,m=a.codecId;if(!l||!s||!c)return null;let h={ssrc:s,type:l,kind:c,bytesReceived:le(a,"bytesReceived"),bytesSent:le(a,"bytesSent"),headerBytesReceived:le(a,"headerBytesReceived"),headerBytesSent:le(a,"headerBytesSent"),jitter:le(a,"jitter"),packetsLost:le(a,"packetsLost"),packetsReceived:le(a,"packetsReceived"),packetsSent:le(a,"packetsSent"),fractionLost:le(a,"fractionLost"),pliCount:le(a,"pliCount"),firCount:le(a,"firCount"),nackCount:le(a,"nackCount"),userId:r[s],freezeCount:le(a,"freezeCount",0),totalFreezesDuration:le(a,"totalFreezesDuration",0)},E="mid"in a&&typeof a.mid=="string"?a.mid:void 0,P="rid"in a&&typeof a.rid=="string"?a.rid:void 0;if(E&&(h.mid=E),P&&(h.rid=P),c==="video"){let b=le(a,"framesDecoded"),H=le(a,"totalInterFrameDelay"),J=le(a,"totalSquaredInterFrameDelay"),de=le(a,"encoderImplementation"),Ie=le(a,"decoderImplementation");de&&(h.encoderImplementation=de),Ie&&(h.decoderImplementation=Ie),h.interframeDelayVariance=(J-H*H/b)/b}if(c==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=le(a,"totalEncodeTime")??0),c==="audio"&&(h.totalSamplesReceived=le(a,"totalSamplesReceived"),h.concealedSamples=le(a,"concealedSamples"),h.insertedSamplesForDeceleration=le(a,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=le(a,"removedSamplesForAcceleration"),h.silentConcealedSamples=le(a,"silentConcealedSamples"),h.concealmentEvents=le(a,"concealmentEvents"),h.totalAudioEnergy=le(a,"totalAudioEnergy")),m&&t[m]){let b=t[m];h.clockRate=b.clockRate,h.mimeType=b.mimeType,c==="audio"&&b.sdpFmtpLine&&(h.sdpFmtpLine=b.sdpFmtpLine)}if(u&&t[u]){let b=t[u];h.frameHeight=b.frameHeight,h.frameWidth=b.frameWidth,h.framesDecoded=b.framesDecoded,h.framesReceived=b.framesReceived,h.framesDropped=b.framesDropped}return la(h)}).filter(a=>!!a)}function _n(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=fi("ssrc",n?.remoteRtps||[]),i=fi("ssrc",r?.remoteRtps||[]));let a=fi("ssrc",n.rtps),s=fi("ssrc",r.rtps),c=(n.timestamp-r.timestamp)/1e3;return!a||!s||Object.keys(a).forEach(u=>{let l=a[u],m=s[u];if(!(!l||!m)){if(l.bytesReceived&&l.bytesReceived>m.bytesReceived&&(l.bandwidth=Math.round((l.bytesReceived-m.bytesReceived)/c),l.bandwidth+=Math.round((l.headerBytesReceived-m.headerBytesReceived)/c)),l.bytesSent&&l.bytesSent>m.bytesSent&&(l.bandwidth=Math.round((l.bytesSent-m.bytesSent)/c),l.bandwidth+=Math.round((l.headerBytesSent-m.headerBytesSent)/c)),l.packetsReceived)if(l.packetsReceived>m.packetsReceived||l.packetsLost>m.packetsLost){let h=l.packetsLost-m.packetsLost,E=l.packetsReceived-m.packetsReceived;l.packetLoss=parseFloat((100*h/(h+E)).toFixed(2))}else l.packetLoss=0;if(l.freezeCount>m.freezeCount&&(l.freezeCountDelta=l.freezeCount-m.freezeCount),l.totalFreezesDuration>m.totalFreezesDuration){let h=l.totalFreezesDuration-m.totalFreezesDuration;l.totalFreezesDurationDelta=h}if(l.framesDropped&&m.framesDropped&&l.framesDropped>m.framesDropped&&(l.framesDroppedDelta=parseFloat(((l.framesDropped-m.framesDropped)/c).toFixed(0))),e&&l.type==="outbound-rtp"&&l.kind==="video"){let h=t?.[u],E=i?.[u],P=J=>J??0,b=Math.max(0,P(h?.packetsLost)-P(E?.packetsLost)),H=Math.max(1,l.packetsSent-m.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(b/H*100)}}}}),n}async function gn(n,r,e={},t=!1){let i=await uo(n),a={timestamp:Date.now(),transport:hn(i),rtps:da(i,e)};return t&&(a.remoteRtps=da(i,e,!0)),r?_n(a,r,t):(await I.delay(lo),gn(n,a,e,t))}function mo(n){performance.clearMarks(n),performance.mark(n)}function ho(n){performance.clearMarks(n)}function _o(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 go(n){return`${X.SCREENSHARE_FIRST_FRAME}_${fo(n)}`}function fo(n){return typeof n=="string"?n:JSON.stringify(n)}var pe={distinctById:un,rtcStatsToArray:mn,extractTransport:hn,extractRtps:da,delta:_n,collectStats:gn,setMark:mo,clearMark:ho,measureMark:_o,getMarkNameScreenshareFirstFrame:go};var ze=class ze{constructor(){o(this,"_eventualLogs",new Set)}static create(){ze._instance=new ze}static logCallStat(r){if(ze._instance?._eventualLogs.size){for(let e of ze._instance._eventualLogs)Object.assign(e,{call_topology:r.call_topology,local_address:r.local_address,local_connection_type:r.local_connection_type,network_type:r.network_type,remote_address:r.remote_address,remote_connection_type:r.remote_connection_type,transport:r.transport}),R.logClientStats(e);ze._instance._eventualLogs.clear()}R.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=pe.measureMark(r.name)),r.value!==null&&ze._instance?._eventualLogs.add(r)}static destroy(){ze._instance?._destroy(),ze._instance=null}_destroy(){this._eventualLogs.clear()}};o(ze,"_instance",null);var Me=ze;var pa={connected:{wt:X.WEBTRANSPORT_CONNECTED,ws:X.WEBSOCKET_CONNECTED},reconnected:{wt:X.WEBTRANSPORT_RECONNECTED,ws:X.WEBSOCKET_RECONNECTED},failed_pings:{wt:X.WEBTRANSPORT_FAILED_PINGS,ws:X.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:X.WEBTRANSPORT_FAILED_EXCEPTION,ws:X.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:X.WEBTRANSPORT_TIMEOUT,ws:X.WEBSOCKET_TIMEOUT},restart:{wt:X.WEBTRANSPORT_RESTART,ws:X.WEBSOCKET_RESTART}};var Si=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 pr=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 pr);o(this,"p50",new Si(.5));o(this,"p95",new Si(.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 fn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(fn||{}),Ae=fn;var Sn=(f=>(f.TRANSMITTED_DATA="transmitted-data",f.ACCEPTED_CALL="accepted-call",f.HUNGUP="hungup",f.PARTICIPANT_ADDED="participant-added",f.PARTICIPANT_JOINED="participant-joined",f.CLOSED_CONVERSATION="closed-conversation",f.MEDIA_SETTINGS_CHANGED="media-settings-changed",f.PARTICIPANT_STATE_CHANGED="participant-state-changed",f.PARTICIPANTS_STATE_CHANGED="participants-state-changed",f.RATE_CALL_DATA="rate-call-data",f.FEATURE_SET_CHANGED="feature-set-changed",f.TOPOLOGY_CHANGED="topology-changed",f.PRODUCER_UPDATED="producer-updated",f.CONSUMER_ANSWERED="consumer-answered",f.MULTIPARTY_CHAT_CREATED="multiparty-chat-created",f.FORCE_MEDIA_SETTINGS_CHANGE="force-media-settings-change",f.SETTINGS_UPDATE="settings-update",f.VIDEO_QUALITY_UPDATE="video-quality-update",f.REGISTERED_PEER="registered-peer",f.SWITCH_MICRO="switch-micro",f.RECORD_STARTED="record-started",f.RECORD_STOPPED="record-stopped",f.REALLOC_CON="realloc-con",f.AUDIO_ACTIVITY="audio-activity",f.SPEAKER_CHANGED="speaker-changed",f.STALLED_ACTIVITY="stalled-activity",f.CHAT_MESSAGE="chat-message",f.CUSTOM_DATA="custom-data",f.ROLES_CHANGED="roles-changed",f.MUTE_PARTICIPANT="mute-participant",f.PIN_PARTICIPANT="pin-participant",f.OPTIONS_CHANGED="options-changed",f.NETWORK_STATUS="network-status",f.PARTICIPANT_SOURCES_UPDATE="participant-sources-update",f.PROMOTE_PARTICIPANT="promote-participant",f.CHAT_ROOM_UPDATED="chat-room-updated",f.PROMOTION_APPROVED="promotion-approved",f.JOIN_LINK_CHANGED="join-link-changed",f.FEEDBACK="feedback",f.MOVIE_UPDATE_NOTIFICATION="movie-update-notification",f.MOVIE_SHARE_STARTED="movie-share-started",f.MOVIE_SHARE_STOPPED="movie-share-stopped",f.URL_SHARING_INFO_UPDATED="url-sharing-info-updated",f.ROOM_UPDATED="room-updated",f.ROOMS_UPDATED="rooms-updated",f.ROOM_PARTICIPANTS_UPDATED="room-participants-updated",f.FEATURES_PER_ROLE_CHANGED="features-per-role-changed",f.PARTICIPANT_ANIMOJI_CHANGED="participant-animoji-changed",f.ASR_STARTED="asr-started",f.ASR_STOPPED="asr-stopped",f.DECORATIVE_PARTICIPANT_ID_CHANGED="decorative-participant-id-changed",f.VIDEO_SUSPEND_SUGGEST="video-suspend-suggest",f))(Sn||{}),U=Sn;var vn=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(vn||{}),dt=vn;var{isObject:In,isObjectsEquals:So}=I;function ur(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||In(n.bitrates)&&In(r.bitrates)&&!So(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function mr(n,r){return!(!ur(n.camera,r.camera)||!ur(n.screenSharing,r.screenSharing)||!ur(n.fastScreenSharing,r.fastScreenSharing))}function ua(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 En(){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"));p.simulcast&&(i=i.reduce((a,s)=>{if(s.kind!=="video")return a.concat(s);let c=a.find(u=>u.kind==="video");return c?c.totalEncodeTime=(c.totalEncodeTime??0)+(s.totalEncodeTime??0):a.push(s),a},[])),i.forEach(a=>{let s=a.kind,c=a.mimeType;if((s==="audio"||s==="video")&&c){let u=a.encoderImplementation,l=[c,"encoder",u].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:l,totalEncodeTime:(a.totalEncodeTime??0)*1e3,audioCodecParams:a.sdpFmtpLine,topology:t})}})}saveUsage({kind:r,codecName:e,totalEncodeTime:t,audioCodecParams:i,topology:a}){let s=this._codecUsages.get(r);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(r,{...s,totalEncodeTime:t,topology:a});return}this._codecUsages.set(r,{kind:r,codecName:e,audioCodecParams:i,totalEncodeTime:t,topology:a})}report(r){if(r.kind==="video"&&r.totalEncodeTime===0)return;let e={name:X.CODEC_USAGE,codec_implementation:r.codecName,value:r.totalEncodeTime,call_topology:r.topology==="DIRECT"?"D":"S"};r.audioCodecParams&&(e.string_value=r.audioCodecParams),R.logClientStats(e)}static destroy(){It._instance?._destroy(),It._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};o(It,"_instance",null);var rt=It;var wt=class extends oe{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 Tn="videochat-epi",vo=5e3,Io=500,Et=class extends oe{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(Tn)||"",10);return isNaN(e)?0:e}catch{return 0}}async _handleStats(e){if(!e.inbound||!e.inbound.rtps)return;let t=Date.now();!this._directTopology&&p.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+vo<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+Io<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),p.callStatReportEnabled&&this._previousCallStatReportTimestamp+p.statisticsInterval<=t&&(this._reportCallStats(e),this._previousCallStatReportTimestamp=t)}async reportPerfStats(e){let t=e.inbound.rtps.reduce((i,a)=>(a.kind==="video"&&(i.framesDecoded+=a.framesDecoded||0,i.framesReceived+=a.framesReceived||0),i),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let i=await this._signaling.reportPerfStat(t);localStorage.setItem(Tn,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:Cn(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:Cn(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let i=!1,a=!1;for(e.inbound.rtps.reduce((l,m)=>(m.kind==="video"?(i=!0,m.framesReceived&&(l.jitter_video=l.jitter_video*l.inbound_video_count/(l.inbound_video_count+1)+m.jitter*1e3/(l.inbound_video_count+1),l.interframe_delay_variance=l.interframe_delay_variance*l.inbound_video_count/(l.inbound_video_count+1)+(m.interframeDelayVariance||0)*1e6/(l.inbound_video_count+1),l.inbound_video_count++),l.frames_dropped+=m.framesDropped||0,l.nack_sent+=m.nackCount,l.pli_sent+=m.pliCount,l.fir_sent+=m.firCount,l.freeze_count+=m.freezeCountDelta||0,l.total_freezes_duration+=m.totalFreezesDurationDelta||0):(a=!0,m.totalSamplesReceived&&(l.jitter_audio=l.jitter_audio*l.inbound_audio_count/(l.inbound_audio_count+1)+m.jitter*1e3/(l.inbound_audio_count+1),l.total_audio_energy=l.total_audio_energy*l.inbound_audio_count/(l.inbound_audio_count+1)+(m.totalAudioEnergy||0)/(l.inbound_audio_count+1),l.inbound_audio_count++),l.total_audio_samples_received+=m.totalSamplesReceived||0,l.inserted_audio_samples_for_deceleration+=m.insertedSamplesForDeceleration||0,l.removed_audio_samples_for_acceleration+=m.removedSamplesForAcceleration||0,l.concealed_audio_samples+=m.concealedSamples||0,l.silent_concealed_audio_samples+=m.silentConcealedSamples||0,l.audio_concealment_events+=m.concealmentEvents||0),l),t),e.outbound.rtps.reduce((l,m)=>(m.kind==="video"?(l.nack_received+=m.nackCount,l.pli_received+=m.pliCount,l.fir_received+=m.firCount,l.packets_sent_video+=m.packetsSent):l.packets_sent_audio+=m.packetsSent,l),t),e.remoteInbound.rtps.reduce((l,m)=>(m.kind==="video"?l.packets_lost_video+=m.packetsLost:l.packets_lost_audio+=m.packetsLost,l),t);this._screenShareStats.length;){let l=this._screenShareStats.pop();l?.freeze_duration&&(t.ss_freeze_count+=1,t.ss_total_freezes_duration+=l.freeze_duration)}let s={call_topology:t.call_topology,stat_time_delta:Math.max(0,Date.now()-this._previousCallStatReportTimestamp),nack_sent:Math.max(0,t.nack_sent-this._previousCallStatReport.nack_sent),nack_received:Math.max(0,t.nack_received-this._previousCallStatReport.nack_received),pli_sent:Math.max(0,t.pli_sent-this._previousCallStatReport.pli_sent),pli_received:Math.max(0,t.pli_received-this._previousCallStatReport.pli_received),fir_sent:Math.max(0,t.fir_sent-this._previousCallStatReport.fir_sent),fir_received:Math.max(0,t.fir_received-this._previousCallStatReport.fir_received),frames_dropped:Math.max(0,t.frames_dropped-this._previousCallStatReport.frames_dropped),rtt:Math.max(0,t.rtt)};if(navigator.hardwareConcurrency&&(s.cpu_hardware_concurrency=navigator.hardwareConcurrency),i&&!hr(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),a&&!hr(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),i&&!hr(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&&!hr(t.total_audio_samples_received)){let l=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),m=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),h=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),E=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),P=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),b=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=kt(m/l*1e3),s.removed_audio_samples_for_acceleration=kt(h/l*1e3),s.concealed_audio_samples=kt(E/l*1e3),s.concealed_silent_audio_samples=kt(P/l*1e3),s.concealment_audio_avg_size=kt(E/b),s.total_audio_energy=t.total_audio_energy}Rn(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),Rn(t,"remote_address","remote_connection_type")&&(s.remote_address=t.remote_address,s.remote_connection_type=t.remote_connection_type);let c=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),u=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(c>0){let l=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=kt(l/c*100)}if(u>0){let l=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=kt(l/u*100)}Me.logCallStat(s),p.enableLogPerfStatReport&&d.log("Sent call stats",s),this._previousCallStatReport=t}};function Rn(n,...r){for(let e of r)if(!Object.hasOwn(n,e)||n[e]===void 0)return!1;return!0}function Cn(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function hr(n){return n===void 0}function kt(n){return Number.isNaN(n)?0:n}var Ii=class{constructor(r,e=null){o(this,"weightUp");o(this,"weightDown");o(this,"value",NaN);this.weightUp=r,this.weightDown=e??r}set(r){this.value=r}update(r){return this.value=this.getNext(r),this.value}getNext(r){if(isNaN(this.value))return r;let e=r<this.value?this.weightDown:this.weightUp;return this.value*(1-e)+r*e}getValue(){return this.value}};var Pn=.25,yn=.35,Eo=85,To=.1,Ro=1.5,Co=.1,Po=1,yo=.6,bo=.3;var Ei=class extends oe{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 Ii(Pn,Pn),loss:new Ii(yn,yn),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)/Eo);for(let s=0;s<a;s++)i*=1-To;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)/Ro);for(let s=0;s<a;s++)i*=1-Co;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*Po;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>=yo?"good":e>=bo?"medium":"bad"}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol==="tcp",i=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),a=e.inbound.rtps.reduce((h,E)=>Math.max(h,E.packetLoss||0),0),s={rtt:this._localNetworkStat.rtt.update(i),loss:this._localNetworkStat.loss.update(a)};if(t){let h=e.outbound.rtps.reduce((E,P)=>E+(P.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let c=Date.now(),u=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),l=Math.max(Math.round(u*10)/10,.1),m=this._getNetworkState(l);(t||m!==this._currentState||c-this._lastStatSentTimestamp>p.networkStatisticsInterval)&&(this._lastStatSentTimestamp=c,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{d.warn("Unable to send [bad-net]",h)})),this._currentState=m,this._triggerEvent("NETWORK_STATUS",l)}reportRemote(e){let{rtt:t,loss:i,bitrate:a}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=i||0,this._remoteNetworkStat.bitrate=a||0}};var Mo=30*1e3,Ti=class n extends wt{constructor(e,t,i,a,s){super(i,a);o(this,"_participantId");o(this,"_isMaster");o(this,"_remoteSDP",{});o(this,"_remoteCandidates",{});o(this,"_lastRemoteSDP",null);o(this,"_animojiDataChannel",null);o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);o(this,"_remoteAnimojiVersion",1);o(this,"_isOpen",!1);o(this,"_remotePeerId",null);o(this,"_statInterval",null);o(this,"_settingsInterval",null);o(this,"_failedOnCreate",null);o(this,"_remoteStream",null);o(this,"_iceRestartTimeout",null);o(this,"_reconnectionTimeout",null);o(this,"_reconnectionPrevented",!1);o(this,"_lastStat");o(this,"_fingerprint",null);o(this,"_neverConnected",!0);o(this,"_serverSettings");o(this,"_prevConsumerSettings",{});o(this,"_networkLimitsForVideo",{bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}});o(this,"_videoMaxDimensionsForNet",{worst:320,bad:640,good:1280});o(this,"_lastVideoMaxDimension",this._videoMaxDimensionsForNet.good);o(this,"_lastBadConnection",0);o(this,"_perfStatReporter");o(this,"_directStatReporter");this._participantId=e,this._isMaster=t,this._serverSettings=s,this._perfStatReporter=new Et(this,i,!0),this._directStatReporter=new Ei(i),this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applySettings.bind(this)),this.subscribe(this._directStatReporter,"NETWORK_STATUS",this._onNetworkStatus.bind(this));try{this._pc=new RTCPeerConnection({iceServers:p.iceServers,iceTransportPolicy:p.forceRelayPolicy?"relay":"all"})}catch(c){d.error("Failed to create RTCPeerConnection:",c),this.close(c);return}if(this._pc.onicecandidate=this._handleIceCandidate.bind(this),this._pc.ontrack=this._onAddTrack.bind(this),this._pc.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),this._pc.onconnectionstatechange=this._onConnectionStateChange.bind(this),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},p.vmoji&&this._createDataChannel(this._pc,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){R.log(D.ERROR,"addTrack-direct"),d.error("Unable to add media source tracks",c,{participantId:this._participantId}),this._failedOnCreate=c;return}this._createOffer(!1).catch(c=>{this._state==="IDLE"?this._failedOnCreate=c:this.close(c)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return["IDLE","CLOSED","FAILED"].includes(this.getState())}async open(e=null){if(this._isOpen){d.warn("DirectTransport: Already opened",{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(d.debug("DirectTransport: Open transport",{participantId:this._participantId}),this._isOpen=!0,this._remotePeerId=e,!this._isMaster)try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(i){R.log(D.ERROR,"addTrack-direct"),d.error("DirectTransport: Unable to add media source tracks",i,{participantId:this._participantId}),this.close(i);return}this._setState("OPENED");let t=e;if(!e){let i=Object.keys(this._remoteSDP);t=i[i.length-1]}if(t&&this._remoteSDP[t])try{await this._setRemoteDescription(t,this._remoteSDP[t])}catch{this.close();return}this._remoteSDP={},this._remoteCandidates={}}updateSettings(e){mr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(p.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&(this._isOpen=!1,this._stopReconnection(),this._remoteStream&&(this._remoteStream.getTracks().forEach(t=>{t.stop(),this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t)}),this._remoteStream=null),this._stopStatInterval(),this._stopSettingsInterval(),this._pc&&(this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close()),this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.oniceconnectionstatechange=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._pc.close(),this._pc=null),this._onNetworkStatus(1),this.unsubscribe(),e?(d.error("DirectTransport: Closed",e,{participantId:this._participantId}),this._setState("FAILED")):(d.debug("DirectTransport: Closed",{participantId:this._participantId}),this._setState("CLOSED")),this._triggerEvent("PEER_CONNECTION_CLOSED"))}_setState(e){this._state!==e&&(d.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent("STATE_CHANGED",e))}_onSignalingNotification(e){switch(e.notification){case U.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case U.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case U.CUSTOM_DATA:Object.hasOwn(e.data,"sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,i=I.getPeerIdString(e.peerId);I.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(i,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(i,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){d.debug("Add remote ice candidate",{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(i){throw R.log(D.ERROR,"addIceCandidate-direct"),d.error("Unable to add remote ice candidate",i,{participantId:this._participantId,candidate:t}),i}}else d.debug("Cache remote ice candidate",{participantId:this._participantId,candidate:t}),this._remoteCandidates[e]=this._remoteCandidates[e]||[],this._remoteCandidates[e].push(t)}async _setRemoteCandidates(e){if(!this._remoteCandidates[e]){d.log(`No cached candidates found for peer ${e}`);return}let t=this._remoteCandidates[e];this._remoteCandidates[e]=[];for(let i of t)try{await this._addIceCandidate(e,i)}catch{}}async _setRemoteDescription(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc){if(this._lastRemoteSDP?.sdp===t.sdp)return;this._lastRemoteSDP=t,t=n._patchRemoteDescription(t),d.debug("Add remote description",{participantId:this._participantId,sdp:t}),this._calcFingerprint(t.sdp);try{await this._pc.setRemoteDescription(t),await this._setRemoteCandidates(e),this._processAnimojiProtocolVersion(this._remoteAnimojiVersion)}catch(i){throw R.log(D.ERROR,"setRemoteDescription-direct"),d.error("Unable to set remote description",i,{participantId:this._participantId,sdp:t}),i}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,p.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){d.debug("Added remote track",{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=t=>{this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t.track)}),this._triggerEvent("REMOTE_TRACK_ADDED",this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(d.debug("Local ice candidate",{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){d.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:p.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case"have-local-offer":let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(new Error);break;case"have-remote-offer":this._createAnswer().then(i=>this._signaling.sendSdp(this._participantId,i,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(d.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case"checking":let e=this.getState();e==="IDLE"||e==="OPENED"?this._setState("CONNECTING"):this._setState("RECONNECTING");break}}_onConnectionStateChange(){switch(d.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),R.log(D.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),I.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(R.log(D.ICE_CONNECTION_TYPE,e.local.type),d.debug("Selected ICE candidates",e))}),this._startStatInterval();break;case"failed":case"disconnected":this._reconnectionPrevented?this.close(new Error(`Ice connection ${this._pc.connectionState}`)):(this._setState("RECONNECTING"),this._startReconnection());break;case"closed":this.close(new Error("Ice connection closed"));break}}_startReconnection(){this._reconnectionTimeout||this._iceRestartTimeout||(d.log("Waiting for reconnection...",{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},p.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(d.log("Switch topology DIRECT to SERVER",{participantId:this._participantId}),this._signaling.switchTopology("SERVER"))}_stopReconnection(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=null),this._iceRestartTimeout&&(clearTimeout(this._iceRestartTimeout),this._iceRestartTimeout=null)}_startIceRestart(){this._isMaster?(R.log(D.ICE_RESTART),d.log("Ice restart",{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):d.debug("Waiting for ice restart...",{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,d.error("Ice restart failed",{participantId:this._participantId}),R.log(D.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},p.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};d.debug("Create offer",{participantId:this._participantId,options:t});let i;try{i=await this._pc?.createOffer(t),d.debug("Created offer",{participantId:this._participantId,offer:i}),i=n._patchLocalDescription(i)}catch(a){throw d.error("Unable to create offer",a,{participantId:this._participantId}),R.log(D.ERROR,"createOffer-direct"),a}try{return d.debug("Set local description",{participantId:this._participantId,offer:i}),this._calcFingerprint(i.sdp),await this._pc?.setLocalDescription(i),i}catch(a){throw d.error("Unable to set local description",a,{participantId:this._participantId}),R.log(D.ERROR,"setLocalDescription-direct"),a}}async _createAnswer(){d.debug("Create answer",{participantId:this._participantId});let e;try{e=await this._pc?.createAnswer(),d.debug("Created answer",{participantId:this._participantId,answer:e}),e=n._patchLocalDescription(e)}catch(t){throw d.error("Unable to create answer",t,{participantId:this._participantId}),R.log(D.ERROR,"createAnswer-direct"),t}try{return d.debug("Set local description",{participantId:this._participantId,answer:e}),this._calcFingerprint(e.sdp),await this._pc?.setLocalDescription(e),e}catch(t){throw d.error("Unable to set local description",t,{participantId:this._participantId}),R.log(D.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!M.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,p.preferH264&&M.canPreferH264(),M.isBrokenH264Decoder(),p.preferVP9,t&&p.audioNack),e}static _patchRemoteDescription(e){return e.sdp=I.patchRemoteSDP(e.sdp,!1,!1,!1,p.preferVP9,M.isBrokenVP9Encoder(),M.isBrokenVP9Decoder()),e}_onReplacedTrack(e){this._pc&&(this._pc.getSenders().forEach(t=>{t.track&&t.track.kind===e.kind&&t.track.contentHint===e.contentHint&&t.replaceTrack(e).catch(i=>{d.error("DirectTransport: Unable to replace track",i,{participantId:this._participantId}),R.log(D.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}pe.collectStats(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,rt.reportUsage(t);let i={inbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="inbound-rtp"?(a.userId=this._participantId,!0):!1)},outbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(a=>a.type==="outbound-rtp")},remoteInbound:{topology:"DIRECT",transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(i),this._directStatReporter.reportLocal(i),this._triggerEvent("REMOTE_DATA_STATS",i),this._statInterval=window.setTimeout(e,p.statisticsInterval)})};this._statInterval=window.setTimeout(e,p.statisticsInterval)}async _isSVCSupported(e,t){let i=this._mediaSource.getSendVideoTrack(),a=e.outbound.rtps.find(u=>u.kind==="video");if(!a?.mimeType||!a?.bandwidth||!i)return!1;let s=i.getSettings();if(!s.width||!s.height||!s.frameRate)return!1;let c={type:M.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:s.width,height:s.height,bitrate:a.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(c)).supported||!1}catch(u){return d.warn("Failed to get encodingInfo",c,u),!1}}async _checkPPTNetwork(e){if(!p.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,i=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,a=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,s=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,c=this._videoMaxDimensionsForNet.good,u="L1T1";if(a?(this._lastBadConnection=Date.now(),s?(c=this._videoMaxDimensionsForNet.bad,u="L1T2"):(c=this._videoMaxDimensionsForNet.worst,u="L1T3")):i&&(c=this._videoMaxDimensionsForNet.good,u="L1T1"),!(c<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Mo)||this._lastVideoMaxDimension===c)return;let m=this._serverSettings.camera;if(!m||!await this._isSVCSupported(e,u))return;d.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:u,averageNetStat:t,nextVideoMaxDimension:c}),this._lastVideoMaxDimension=c;let E={...this._serverSettings,camera:{...m,scalabilityMode:u,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(E)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null)}_onNetworkStatus(e){let t={};t[this._participantId]=t[""]=e,this._triggerEvent("NETWORK_STATUS",t)}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applySettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}_calcFingerprint(e){let t=I.sdpFingerprint(e);if(t===null){d.warn("Fingerprint calculation is unsupported");return}this._fingerprint===null?this._fingerprint=t:(v.onFingerprintChange((this._fingerprint^t).toString()),this._fingerprint=null)}_applySettings(){let e=this._mediaSource.getMediaSettings().isScreenSharingEnabled?this._serverSettings.screenSharing:this._serverSettings.camera;e&&this._pc?.connectionState==="connected"&&(this._prevConsumerSettings=I.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,i){d.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{negotiated:!0,id:1});a.onopen=()=>{let s=a.readyState;s==="open"?(d.debug(`[${t}] data channel opened`),a.onerror=c=>{d.error(`[${t}] data channel error`,c)},i(a)):d.error(`[${t}] data channel open failed, state [${s}]`)}}};var bn=(e=>(e.AUDIO_MIX="audio-mix",e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",e))(bn||{}),Je=bn;var Ao=16,gr=class n{constructor(r,e,t){o(this,"_datachannel");o(this,"_participantIdRegistry");o(this,"_asrCallback");o(this,"_textDecoder");d.debug("AsrReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._asrCallback=t,this._textDecoder=new TextDecoder,this._datachannel.onmessage=i=>this._onDataChannelMessage(i.data)}static parse(r){let e=new DataView(r),t=e.getUint8(0),i=e.getUint8(1);if(i!==0)throw new Error(`Unsupported message type. Message type: ${i}`);let a=e.getUint16(2),s=e.getUint32(4),c=e.getUint32(8),u=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:a,ssrc:s,timestamp:c,duration:u,data:r.slice(Ao)}}_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 zt=Tt;var lt=require("messagepack");var fr=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(([P,b])=>{let H=qt(P);this.streamDescriptionByCompactId.set(b,H),this.compactIdByStreamDescription.set(P,b)}),null;case 2:case 4:let s=(0,lt.decode)(i),c=[];for(let P of s){let b=this.getStreamDescription(P);b&&c.push(b.participantId)}return t===2?{type:"notification",notification:U.AUDIO_ACTIVITY,activeParticipants:c}:{type:"notification",notification:U.STALLED_ACTIVITY,stalledParticipants:c};case 3:let u=(0,lt.decode)(i);return{type:"notification",notification:U.SPEAKER_CHANGED,speaker:this.getStreamDescription(u)?.participantId};case 5:let l=(0,lt.decode)(i);return{type:"notification",notification:U.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:l[0],maxDimension:l[1]},mediaType:this._decodeMediaType(l[2])};case 6:let m=(0,lt.decode)(i),h={};for(let[P,b]of Object.entries(m)){let H=this.getStreamDescription(Number(P))?.participantId;H&&(h[H]=b/100)}return{type:"notification",notification:U.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let b=(0,lt.decode)(i).map(H=>{let[J,de,Ie,Te,Y,Re,Q]=H;return{participantId:this.getStreamDescription(J)?.participantId,gain:de,pause:Ie,offset:Te,mute:Y,liveStatus:Re,startTimeMs:Q}});return{type:"notification",notification:U.MOVIE_UPDATE_NOTIFICATION,data:b}}case 9:let E=(0,lt.decode)(i);return{type:"notification",notification:U.VIDEO_SUSPEND_SUGGEST,bandwidth:E};default:return d.debug("unsupported message type: "+t),null}}_decodeMediaType(r){if(r===null)return null;switch(r){case 0:return"CAMERA";case 1:return"SCREEN";default:throw new Error(`Unsupported media type: ${r}`)}}_createParticipantSourcesUpdateNotification(r){let e=(0,lt.decode)(r),t=[];for(let[i,a]of Object.entries(e)){let s=a[0],c=a[1],u=a[2],l=!!a[3],m=a[4]!==null?!!a[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){d.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(u===null){d.error("unexpected null sequenceNumber",i,a);continue}let E=Je.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,P=c?c>>>0:null;t.push({participantStreamDescription:h,streamId:E,rtpTimestamp:P,sequenceNumber:u,fastScreenShare:l,suspend:m})}return{type:"notification",notification:U.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var ma=li(require("@vkontakte/libvpx"));var Ye=class{constructor(){o(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,c)=>{let u=t.join(","),l=new Blob([r,`exports.default(${u});`],{type:"application/javascript; charset=utf-8"}),m=window.URL.createObjectURL(l);this._worker=new Worker(m),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":c(h.data.error);break;case"frame":e(h.data);break;case"debug":d.debug(h.data.message);break;case"log_error":R.log(D.ERROR,h.data.message);break}},this._sendToWorker("init",i,a)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(r,e={},t=[]){this._worker?.postMessage(Object.assign({type:r},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var Ri=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)}},[ma.default,ma.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 xt=class{constructor(r=null,e=0){o(this,"_counter",0);o(this,"_interval",0);o(this,"_lastCalculationTime",Date.now());o(this,"_onCalculated",null);this._onCalculated=r,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(r=1){this._counter+=r}calculate(){let r=Date.now(),e=r-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=r,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};var Mn=require("bit-buffer");var vr=class{constructor(r){o(this,"_participantId");o(this,"_firstFrameReceived",!1);this._participantId=r}measure(r,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=pe.getMarkNameScreenshareFirstFrame(this._participantId),i=pe.measureMark(t);i!==null&&Me.logEventualStat({name:X.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Do=65536,ha="MARK_SCREENSHARE_FREEZE_DURATION",Jt=class n{constructor(r,e,t,i){o(this,"_participantId");o(this,"_onStream");o(this,"_onStat");o(this,"_onKeyFrameRequested");o(this,"_statScreenShareFirstFrame");o(this,"_chunks",[]);this._participantId=r,this._onStream=e,this._onStat=t,this._onKeyFrameRequested=i,this._statScreenShareFirstFrame=new vr(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)%Do!==r.sequence){d.warn("[FrameBuilder] Got incorrect chunk");return}if(this._chunks.push(r),r.end){let t=this._processFrameData(),{width:i,height:a}=n.getFrameSize(t);this._processFrame({timestamp:r.timestamp,frameData:t,isVP9:r.isVP9,keyframe:r.keyframe,width:i,height:a}),this._statScreenShareFirstFrame.measure(i,a)}}destroy(){pe.clearMark(ha),pe.clearMark(pe.getMarkNameScreenshareFirstFrame(this._participantId)),this._chunks=[]}_processFrameData(){let r=this._chunks;this._chunks=[];let e=r.reduce((a,s)=>a+s.data.byteLength,0),t=new Uint8Array(e),i=0;for(let a of r)t.set(new Uint8Array(a.data),i),i+=a.data.byteLength;return t}static getFrameSize(r){let e={width:0,height:0},t=new Mn.BitStream(r.buffer);t.bigEndian=!0,t.index+=2;let i=t.readBits(1),s=t.readBits(1)<<1|i;return s===3&&t.index++,t.readBits(1)===1||t.readBits(1)!==0||(t.index++,t.index++,t.index+=24,s>=2&&t.index++,t.readBits(3)!==7?(t.index++,(s===1||s===3)&&(t.index+=3)):(s===1||s===3)&&t.index++,e.width=t.readBits(16)+1,e.height=t.readBits(16)+1),e}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}_measureFreezeDuration(r){if(r){pe.setMark(ha);return}let e=pe.measureMark(ha);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Nt=class{constructor(r){o(this,"_onStream");this._onStream=r}async drawFrame(r){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(r){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var Yt=class extends Nt{constructor(e){super(e);o(this,"_useImageBitmap");o(this,"_canvas",null);o(this,"_canvasContext",null);o(this,"_stream",null);o(this,"_track",null);d.debug("CanvasRenderer started"),this._useImageBitmap="ImageBitmap"in window}_createStream(e,t){this._canvas||(this._canvas=document.createElement("canvas"),this._canvas.width=e,this._canvas.height=t,this._canvas.style.pointerEvents="none",this._canvas.style.visibility="hidden",this._canvas.style.position="absolute",this._canvas.style.width="160px",this._canvas.style.height="90px",this._canvas.style.bottom="0",this._canvas.style.right="0",this._canvas.style.zIndex="5000",document.body.appendChild(this._canvas),this._useImageBitmap?this._canvasContext=this._canvas.getContext("bitmaprenderer"):this._canvasContext=this._canvas.getContext("2d"),this._stream=this._canvas.captureStream(0),this._track=this._stream.getVideoTracks()[0],this._track.contentHint="text")}_removeStream(){this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null,this._track=null),this._canvasContext=null;try{this._canvas&&document.body.removeChild(this._canvas)}catch{}this._canvas=null}_requestCanvasFrame(){this._track&&this._track.requestFrame?this._track.requestFrame():this._stream&&this._stream.requestFrame&&this._stream.requestFrame()}async _drawImage(e){this._track||(this._createStream(e.width,e.height),this._onStream(this._stream));let t=this._canvas;if(t.width=e.width,t.height=e.height,this._useImageBitmap){let i;if(e instanceof ImageBitmap)i=e;else{let{width:s,height:c,data:u}=e,l=s*c*4;if(u.byteLength!==l){d.warn("Bad frame buffer",{w:s,h:c,got:u.byteLength,expected:l});return}i=await createImageBitmap(e,0,0,e.width,e.height)}if(!this._canvasContext){d.warn("Canvas context is null"),i.close();return}this._canvasContext.transferFromImageBitmap(i),i.close()}else{let i=this._canvasContext;i.clearRect(0,0,t.width,t.height),i.putImageData(e,0,0)}this._requestCanvasFrame()}async drawFrame(e){let t="createImageBitmap"in e?await e.createImageBitmap():await createImageBitmap(e);await this._drawImage(t)}async drawImage(e){await this._drawImage(e)}destroy(){this._removeStream(),d.debug("CanvasRenderer destroyed")}static isBrowserSupported(){return("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)&&!(M.browserName()==="Safari"&&Number(M.browserVersion())===15)&&!(M.browserName()==="Firefox"&&Number(M.browserVersion())<60)}};var Lt=class extends Nt{constructor(e){super(e);o(this,"_generator");o(this,"_writer");o(this,"_stream");d.debug("TrackGeneratorRenderer started"),this._generator=new MediaStreamTrackGenerator({kind:"video"}),this._writer=this._generator.writable.getWriter(),this._stream=new MediaStream([this._generator]),this._onStream(this._stream)}async drawFrame(e){await this._writer.write(e)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),d.debug("TrackGeneratorRenderer destroyed")}static isBrowserSupported(){return"VideoFrame"in window&&"MediaStreamTrackGenerator"in window&&pt.isBrowserSupported()}};var Ci=class extends Jt{constructor(e,t,i,a){super(e,t,i,a);o(this,"_renderer");o(this,"_decoder");o(this,"_decoderReady",!1);o(this,"_decoderBusy",!1);o(this,"_decoderQueue",[]);o(this,"_fpsMeter");d.debug(`StreamBuilder started for participant [${e}]`),this._initFpsMeter(),this._initRenderer(),this._initDecoder()}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_initFpsMeter(){this._fpsMeter=new xt(e=>d.log(`[StreamBuilder][${this._participantId}] fps: ${e}`),2e4)}_initRenderer(e=!1){e||!Lt.isBrowserSupported()?this._renderer=new Yt(this._onStream):this._renderer=new Lt(this._onStream)}_initDecoder(e=!1){e||!pt.isBrowserSupported()?this._decoder=new Ri: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 Yt.isBrowserSupported()||Lt.isBrowserSupported()}};function An(n,r,e,t,i,a,s){let c=0;r&&(c|=1),e&&(c|=2),t&&(c|=4),s||(c|=8);let u=new ArrayBuffer(11),l=new DataView(u);if(l.setUint8(0,1),l.setUint16(1,i),l.setUint32(3,n),l.setUint8(7,a?1:0),l.setUint16(8,0),l.setUint8(10,c),!s)return u;let m=new Uint8Array(u.byteLength+s.byteLength);return m.set(new Uint8Array(u),0),m.set(new Uint8Array(s),u.byteLength),m.buffer}function Dn(n){let r=new DataView(n),e=r.getUint8(0),t=r.getUint16(1),i=r.getUint32(3),a=r.getUint8(7)===1,s=r.getUint16(8),c=r.getUint8(10),u=!!(c&1),l=!!(c&2),m=!!(c&4),h=!!(c&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:i,start:u,end:l,keyframe:m,sequence:t,isVP9:a,ssrc:s,eos:h,data:n.slice(11)}}function wn(n){if(!n||!n.byteLength||n.byteLength!==4)return!1;let r=new DataView(n);return!(r.getUint8(0)!==1||r.getUint8(1)!==1||r.getUint16(2)!==0)}function kn(n){if(!n||!n.byteLength||n.byteLength!==10)return null;let r=new DataView(n);if(r.getUint8(0)!==1||r.getUint8(1)!==2||r.getUint16(2)!==0)return null;let a=r.getUint16(4),s=r.getUint32(6);return{seq:a,ts2:s}}function On(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=li(require("simple-ebml-builder"));var wo=2**15-1,_a=1,ko=5,Oo=5;var ga=class n{constructor(r){o(this,"_mediaSource");o(this,"_codec");o(this,"_sourceBuffer",null);o(this,"_queue",[]);o(this,"_clearBufferTill",0);this._mediaSource=new MediaSource,this._codec=r;let e=()=>{this._mediaSource.removeEventListener("sourceopen",e),this._initBuffer(),this._handleQueue()};this._mediaSource.addEventListener("sourceopen",e,!1)}_handleQueue(){if(!this._sourceBuffer||this._sourceBuffer.updating||!this._queue.length)return;if(this._clearBufferTill&&this._sourceBuffer.buffered.length){let t=this._sourceBuffer.buffered.start(0);t<this._clearBufferTill&&(this._sourceBuffer.remove(t,this._clearBufferTill),d.debug(`[WebmBuilder] SourceBuffer cleanup from ${t} to ${this._clearBufferTill}`)),this._clearBufferTill=0;return}let r=this._queue;this._queue=[];let e=n._buildQueue(r);this._sourceBuffer.appendBuffer(e)}static _buildQueue(r){if(r.length){if(r.length===1)return O.build(r[0])}else return new Uint8Array;let e=r.reduce((a,s)=>a+s.countSize(),0),t=new Uint8Array(e),i=0;for(let a of r){let s=O.build(a);t.set(s,i),i+=s.byteLength}return t}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode="sequence",this._sourceBuffer.addEventListener("updateend",()=>this._handleQueue())}changeType(r){return this._codec=r,this._sourceBuffer?.changeType(r)}append(r,e=!1){this._queue.push(r),e&&this._handleQueue()}cleanup(){this._mediaSource?.readyState==="open"&&this._sourceBuffer?.abort();let r=this._sourceBuffer?.buffered,e=r?.length;if(!e)return;let t=r.start(0),i=Math.max(0,r.end(e-1)-ko);i-t>Oo&&(this._clearBufferTill=i)}destroy(){this._queue=[],this._mediaSource.readyState==="open"&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},Qt=class n extends Jt{constructor(e,t,i){super(e,t,i);o(this,"_mediaBuffer",null);o(this,"_video",null);o(this,"_stream",null);o(this,"_earliestTimestamp",0);o(this,"_clusterStartTime",0);o(this,"_lastFrameTimestamp",0);d.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return O.element(O.ID.EBML,[O.element(O.ID.EBMLVersion,O.number(1)),O.element(O.ID.EBMLReadVersion,O.number(1)),O.element(O.ID.EBMLMaxIDLength,O.number(4)),O.element(O.ID.EBMLMaxSizeLength,O.number(8)),O.element(O.ID.DocType,O.string("webm")),O.element(O.ID.DocTypeVersion,O.number(2)),O.element(O.ID.DocTypeReadVersion,O.number(2))])}static _genSegmentHeader(e,t,i){let a=O.element(O.ID.Info,[O.element(O.ID.TimecodeScale,O.number(1e6)),O.element(O.ID.MuxingApp,O.string("vk-webm-builder")),O.element(O.ID.WritingApp,O.string("vk-webm-builder"))]),s=[O.element(O.ID.PixelWidth,O.number(e)),O.element(O.ID.PixelHeight,O.number(t))],c=O.element(O.ID.Tracks,O.element(O.ID.TrackEntry,[O.element(O.ID.TrackNumber,O.number(_a)),O.element(O.ID.TrackUID,O.number(_a)),O.element(O.ID.TrackType,O.number(1)),O.element(O.ID.FlagLacing,O.number(0)),O.element(O.ID.DefaultDuration,O.number(1e9)),O.element(O.ID.CodecID,O.string(`V_${i.toUpperCase()}`)),O.element(O.ID.Video,s)]));return O.unknownSizeElement(O.ID.Segment,[a,c])}static _genClusterHeader(e){return O.unknownSizeElement(O.ID.Cluster,[O.element(O.ID.Timecode,O.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new ga(e),this._video=document.createElement("video"),this._video.autoplay=!0,this._video.controls=!1,this._video.muted=!0,this._video.style.pointerEvents="none",this._video.style.visibility="hidden",this._video.style.position="absolute",this._video.style.width="160px",this._video.style.height="90px",this._video.style.bottom="0",this._video.style.right="0",this._video.style.zIndex="5000",this._video.src=URL.createObjectURL(this._mediaBuffer.mediaSource),document.body.appendChild(this._video);let t=()=>{if(this._video?.src){d.warn(`[WebmBuilder] Video paused for participant [${this._participantId}], try to play again`);let i=this._video.seekable;i.length&&(this._video.currentTime=i.end(i.length-1)-.1),this._video.play().catch(()=>{})}};this._video.onpause=t,this._video.onwaiting=t,this._video.onstalled=t,this._video.onerror=()=>d.warn(`[WebmBuilder] Video Error for participant [${this._participantId}]`,this._video?.error),this._stream=this._video.captureStream(),this._onStream(this._stream)}_processFrame(e){let t=e.isVP9?"vp9":"vp8";this._mediaBuffer?this._mediaBuffer.codec!==t&&this._mediaBuffer.changeType(t):this._createVideo(t);let i=e.timestamp;if(i<=this._lastFrameTimestamp&&(i=this._lastFrameTimestamp+10,d.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=i,this._earliestTimestamp)i-=this._earliestTimestamp;else{if(!e.keyframe)return;this._earliestTimestamp=i,i=0}if(e.keyframe){this._clusterStartTime=i,this._mediaBuffer?.cleanup(),d.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let c=n._genWebmHeader();this._mediaBuffer?.append(c);let u=n._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(u)}let a=Math.round(i-this._clusterStartTime);if(a>wo&&(this._clusterStartTime=i,a=0),a===0){d.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let c=n._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(c)}let s=O.element(O.ID.SimpleBlock,[O.vintEncodedNumber(_a),O.bytes(n._intToU16BE(a)),O.number((e.keyframe?1:0)<<7),O.bytes(e.frameData)]);this._mediaBuffer?.append(s,!0)}destroy(){super.destroy(),this._video&&(this._video.onpause=null,this._video.onwaiting=null,this._video.onstalled=null,this._video.onerror=null,this._video.pause(),this._video.src="",document.body.removeChild(this._video)),this._mediaBuffer&&(this._mediaBuffer.destroy(),this._mediaBuffer=null),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),d.debug(`[WebmBuilder] destroyed for participant [${this._participantId}]`)}static isBrowserSupported(){return"captureStream"in window.HTMLVideoElement?.prototype&&window.MediaSource?.isTypeSupported('video/webm; codecs="vp8"')&&window.MediaSource?.isTypeSupported('video/webm; codecs="vp9"')}};var Pi=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=Dn(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){d.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}if(e.eos){this.close(t),this._onEos(t);return}let i=this._streamBuilders[t];if(!i){let a=c=>this._onStream(t,c),s=()=>{this._requestKeyFrame(e.ssrc)};p.screenShareWebmBuilder&&Qt.isBrowserSupported()?i=new Qt(t,a,this._onStat):i=new Ci(t,a,this._onStat,s),this._streamBuilders[t]=i}i.appendChunk(e)}_requestKeyFrame(r){if(!(!this._datachannel||this._datachannel.readyState!=="open"))try{let e=On(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 fa=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}},yi=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 fa(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 Sa=li(require("@vkontakte/libvpx"));var xo=1e3,Xt=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=u=>t(),a.onerror=()=>i(new Error("Video element error"));let s=a.play(),c=()=>i(new Error("Autoplay is disabled"));s?s.catch(c):c()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw new Error("Fatal error");this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw new Error("Destroyed");return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw new Error("Destroyed");let t=e.width,i=e.height;return this._canvas.width=t,this._canvas.height=i,this._canvasCtx.clearRect(0,0,t,i),this._canvasCtx.drawImage(e,0,0,t,i),this._canvasCtx?.getImageData(0,0,t,i)}async init(){this._createDom();let e=this._sourceTrack.getSettings().width,t=this._sourceTrack.getSettings().height;d.debug(`LibVPxEncoder started ${e}x${t}, codec ${this.isVP9()?"VP9":"VP8"}`),await this._createStream(this._sourceTrack),await this._createWorker(`"use strict";var exports=(()=>{var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var V=(a,r)=>{for(var s in r)u(a,s,{get:r[s],enumerable:!0})},h=(a,r,s,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of y(r))!x.call(a,e)&&e!==s&&u(a,e,{get:()=>r[e],enumerable:!(i=R(r,e))||i.enumerable});return a};var A=a=>h(u({},"__esModule",{value:!0}),a);var M={};V(M,{default:()=>F});var F=(a,r,s,i)=>{let e;function m(t,o){return a({locateFile:r}).then(n=>{if(e=new n.VpxEncoder,e.debug(o),!e.init(t?n.VpxType.VP9:n.VpxType.VP8))throw self.postMessage({type:"log_error",message:"encoder-init-fail-libvpx"}),new Error("LibVPxEncoder failed to create");if(s){let d=Math.round(i/1e3);e.setTargetBitrate(d)}else e.setMaxQuantizer(10),e.setTargetBitrate(1024)})}function E(t,o,n,p){let d=e.allocateImage(t,o);if(!d){self.postMessage({type:"frame",error:"No buffer data"});return}d.set(new Uint8Array(n));let l=Math.round(performance.now()),f=150;if(!e.encode(l,f,p)){self.postMessage({type:"frame",error:"Encode failed"});return}let b=e.readFrame();if(!b){self.postMessage({type:"frame",error:"No encoded data"});return}e.readFrame()&&(self.postMessage({type:"debug",message:"LibVPxEncoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxEncoder-drop"}));let c=new Uint8Array(b.byteLength);c.set(b),self.postMessage({type:"frame",frameType:p?"key":"delta",timestamp:l,duration:f,width:t,height:o,data:c.buffer},[c.buffer])}function g(t,o){let n=Math.round(t/1e3);e.setTargetBitrate(n)}self.onmessage=t=>{switch(t.data.type){case"init":m(t.data.isVP9,t.data.debug).then(()=>self.postMessage({type:"ready"})).catch(o=>self.postMessage({type:"error",error:String(o)}));break;case"frame":E(t.data.width,t.data.height,t.data.imageData,t.data.keyFrame);break;case"set_bitrate":g(t.data.bitrate,t.data.useCbr);break}}};return A(M);})();
|
|
10
|
+
`,i=>{i.error?this._onFrame(null,i.error):this._onFrame({type:i.frameType,timestamp:i.timestamp,duration:i.duration,data:i.data,byteLength:i.data?.byteLength,width:i.width,height:i.height})},[Sa.default,Sa.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)},xo),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let i=this._drawFrameData(t);this._encode(i,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,i){this._sendToWorker("set_bitrate",{bitrate:e,useCbr:t})}isVP9(){return!1}destroy(){this._removeWorker(),this._removeStream(),this._removeDom(),d.debug("LibVPxEncoder destroyed")}};var Ut=class extends 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 No=2100,Lo=600,Uo=1.2,xn=.8,Bo=2e3,Fo=8e3,va=8e3,Vo=16e3,jo=4,Ho=2e3,Ir=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Ir||{}),bi=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=No,a&&(this._highDelayThreshold=Lo),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let u=Date.now();this._lastDown=0,this._lastUp=u,this._lastProbing=u,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(r,e,t){let i=Date.now();if(this._calcFps(i),this._calcDelay(e,i),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let a=0,s=this._delayAvgShort-this._delayAvgLong,c=Math.round(Math.abs(s)*100/this._delayAvgLong),u=s>40&&c>30&&this._delayAvgShort>this._trendDelayThreshold,l=this._delayAvgShort>this._highDelayThreshold;u||l?a=2:Math.abs(s)<40&&c<10&&!l&&(a=1);let m=Math.round(this._targetBitrate/1e3),h=t;r%20===0&&d.debug(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Ir[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>Bo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,jo),this._probing=!1);let de=xn*h*1e3;if(de>=this._targetBitrate&&(de=this._targetBitrate*xn),de=Math.max(de,this._minBitrate),de<this._targetBitrate){let Ie=Math.round(de/1e3),Te=Math.round(this._upPenalty*va/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Ir[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Ie} penalty=${Te}s`),this._setBitrate(de,!0),this._targetBitrate=de}this._lastDown=i}let P=i-this._lastUp,b=Fo+this._upPenalty*va;if(a===1&&P>b&&E>b){let de=Math.min(this._targetBitrate*Uo,this._maxBitrate);if(de>this._targetBitrate){let Ie=Math.round(de/1e3),Te=Math.round(this._targetBitrate/1e3),Y=Math.round(this._upPenalty*va/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Ir[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${Te} -> newBitrate=${Ie} penalty=${Y}s`),this._setBitrate(de,!1),this._targetBitrate=de,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let H=i-this._lastProbing;this._probing&&H>Vo&&(this._probing=!1);let J=i-this._lastDown;this._upPenalty>0&&J>3*b&&(d.log(`#${r}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(r,e){this._fastSharing&&(e=!0);let t=this._targetFps;this._fps>0&&(t=this._fps),this._onCongestion(r,e,t)}_calcDelay(r,e){if(!(r<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=r,this._delayAvgLong=r),this._delayAvgShort=Math.round((this._delayAvgShort*3+r)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+r)/24),r>0&&r<this._minDelay?this._minDelay=r:r>this._maxDelay&&(this._maxDelay=r),this._lastCheckDelay===0&&(this._lastCheckDelay=e),r>Ho){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 Mi=class{constructor(r){o(this,"_maxSize");o(this,"_size",0);o(this,"_buffer");o(this,"_head",0);o(this,"_tail",0);this._maxSize=r,this._buffer=new Array(r)}add(r,e,t,i,a){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let s=this._tail;return this._buffer[this._tail]={seq:r,ts:e,size:t,sent:Date.now(),start:i,end:a,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,s}update(r,e){let t=this.get(r);return t===null?null:(t.ts2=e,t.recv=Date.now(),t)}get(r){let e=this._head;for(let t=0;t<this._maxSize;t++){let i=this._buffer[e];if(r===i?.seq)return i;if(e=++e%this._maxSize,e===this._tail)break}return null}getServerBitrateK(r){let e=0,t=0,i=-1,a=-1,s=this._tail;for(let c=0;c<this._maxSize;c++){s>0?--s:s=this._maxSize-1;let u=this._buffer[s];if(!u||(a===-1&&(a=u.ts2,t=0),a>=0&&(t+=u.size),i=u.ts2,a-i>=r)||s===this._head)break}if(i>=0&&a>=0){let c=a-i;e=Math.round(c>0?t*8/c:0)}return e}getCurrentDelay(){let r=this._tail;for(let e=0;e<this._maxSize;e++){r>0?--r:r=this._maxSize-1;let t=this._buffer[r];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(r===this._head)break}return 0}getMaxBandwidth(){let r=0,e=0,t=-1,i=-1,a=this._tail;for(let s=0;s<this._maxSize;s++){a>0?--a:a=this._maxSize-1;let c=this._buffer[a];if(c){if(i===-1&&c.end&&!c.start&&(i=c.ts2,e=0),t===-1&&i>=0&&c.start&&!c.end&&(t=c.ts2),t>=0&&i>=0){let u=i-t;r=u>0?e*8/u:0;break}if(i>=0&&(e+=c.size),a===this._head)break}}return Math.round(r)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}};var Ia=65536,Wo=50,Ko=400,$o=1e6,qo=3e5,zo=3e4,Jo=2e3,Yo=5,Er=0,Ai=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 Mi(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 yi);o(this,"_fpsMeter");o(this,"_maxFrameDelay");d.debug("ScreenCaptureSender started"),this.DATA_SIZE=p.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=i,this._congestionControlEnabled=p.screenShareCongestionControl||this._fastSharing,this._width=r.getSettings().width,this._height=r.getSettings().height,this._maxFrameDelay=this._fastSharing?p.screenShareCongestionControlThreshold:p.screenShareCongestionControlThreshold*2;let a=p.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),u=this._onCongestionCallback.bind(this);d.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${p.screenShareCongestionControlThreshold}`),this._congestionControl=new bi(u,s,c,this._congestionControlEnabled,this._fastSharing,p.screenShareCongestionControlThreshold,a);let l=(m,h)=>{if(this._destroyed)return;if(!m){d.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),this._needKeyframe=!0,this._handleQueue();return}(m.width!==this._width||m.height!==this._height)&&(this._width=m.width,this._height=m.height,this._onResize(this._width,this._height));let E=this._sliceFrame(m);this._queue.merge(E),this._handleQueue(),this._sendSharingStat()};if(Ut.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Ut(r,l,this._congestionControlEnabled,c,m,a)}else this._encoder=new Xt(r,l,this._congestionControlEnabled,c);this._datachannel.onmessage=m=>{wn(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=kn(m.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(m=>d.warn("ScreenCaptureSender init failed",m)),this._fpsMeter=new xt(m=>d.log(`[ScreenCaptureSender] fps: ${m}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Ia)%Ia>Yo&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>Jo&&(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 yi;for(let a=0;a<t;a+=this.DATA_SIZE){let s=r.data.slice(a,a+this.DATA_SIZE),c=a===0,u=t<=a+s.byteLength,l=this._wrapHeader(r.timestamp,c,u,e,s);i.push({data:l.data,sequence:l.sequence,frameSize:t,isFirst:c,isLast:u,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=An(r,e,t,i,Er,this._encoder.isVP9(),a),c={sequence:Er,data:s};return Er=(Er+1)%Ia,c}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(r){if(!this._datachannel||this._datachannel.readyState!=="open")return!1;try{return this._datachannel.send(r.data),this._feedback.add(r.sequence,r.timestamp,r.data.byteLength,r.isFirst,r.isLast),r.isLast&&(this._lastSentFrameSeq=r.sequence),!0}catch(e){return d.warn("Error sending chunk to DataChannel",e),!1}}destroy(){this._queue.clear(),this._fpsMeter.destroy(),this._datachannel.onmessage=null,this._feedback.clear(),this._datachannel.readyState==="open"&&this._datachannel.send(this._stopPacket()),this._destroyed=!0,this._encoder.destroy(),d.debug("ScreenCaptureSender destroyed")}static isBrowserSupported(){return Ut.isBrowserSupported()||Xt.isBrowserSupported()}_onCongestionCallback(r,e,t){this._encoder.setBitrate(r,e,t)}_onResize(r,e){let{minBitrate:t,maxBitrate:i}=this._calcMinMaxBitrate(r,e),a=Math.round(t/1e3),s=Math.round(i/1e3);d.log(`cc: resize to ${r}x${e}, minBitrate=${a} maxBitrate=${s}`),this._congestionControl.reconfigure(t,i)}_calcMinMaxBitrate(r,e){(r===void 0||r<640)&&(r=640),(e===void 0||e<360)&&(e=360);let t=r*e/256,i=Math.max(qo,Math.min($o,Math.round(t*Wo))),a=Math.round(t*Ko);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>zo){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var Qo=90,Xo=4294967295,Di=class n extends wt{constructor(e,t,i){super(e,t);o(this,"_producerNotification",null);o(this,"_producerCommand",null);o(this,"_producerScreen",null);o(this,"_consumerScreen",null);o(this,"_asr",null);o(this,"_animojiDataChannel",null);o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);o(this,"_isOpen",!1);o(this,"_observer",!1);o(this,"_reconnectionPrevented",!1);o(this,"_statInterval",null);o(this,"_settingsInterval",null);o(this,"_monitorRtpShareInterval",null);o(this,"_statBytes",{});o(this,"_ssrcMap",{});o(this,"_ssrcMapUpdated",!1);o(this,"_perfStatReporter");o(this,"_producerOfferIsProcessing",!1);o(this,"_producerNextOffer",null);o(this,"_lastStat",null);o(this,"_serverSettings");o(this,"_prevConsumerSettings",{});o(this,"_prevConsumerFastSharingSettings",{});o(this,"_asrTrack",null);o(this,"_captureSender",null);o(this,"_captureReceiver",null);o(this,"_participantIdRegistry",null);o(this,"_disabledSenders",new Set);o(this,"_rtpReceiversByStreamId",{});o(this,"_producerSessionId","");o(this,"_newAudioShareTrack",null);o(this,"_simulcastInfo",null);this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourcesChanged.bind(this)),this.subscribe(this._mediaSource,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=i,d.debug("ServerTransport: Created")}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!=="IDLE"&&e!=="CLOSED"&&e!=="FAILED"&&this._startStatInterval()}open(e=!1){if(this._isOpen){d.log("ServerTransport: Already opened connections");return}this._isOpen=!0,this._observer=e,this._openConnection()}close(e){this._isOpen&&(this._isOpen=!1,this._closeConnection(),this.unsubscribe(),e?(d.error("ServerTransport: Closed",e),this._setState("FAILED")):(d.debug("ServerTransport: Closed"),this._setState("CLOSED")))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){mr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(p.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,this._participantIdRegistry&&e.setParticipantIdRegistry(this._participantIdRegistry),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}async onCameraResolutionChanged(){p.simulcast&&M.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new 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 fr,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()}),p.asrDataChannel&&this._createDataChannel(this._pc,dt.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new gr(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),p.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(p.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._prevConsumerFastSharingSettings={},this._applyConsumerSettings()}catch(t){d.error("ServerTransport: Unable to add media source tracks",t),R.log(D.ERROR,"addTrack-single"),this.close(t);return}this._createDataChannel(this._pc,dt.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&(!p.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval(),this._startMonitorRtpShareInterval()}_removeAsrTrack(){this._asrTrack?.destroy(),this._asrTrack=null}_reconnect(){this.getState()!=="OPENED"&&(this._setState("RECONNECTING"),this._closeConnection(),this._openConnection(!0))}_signalActiveParticipants(e){this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_signalStalledParticipants(e){this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_signalSpeakerChanged(e){this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_signalNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_updateSSRCMap(e){e&&e.sdp.split(`
|
|
12
|
+
`).forEach(t=>{let i=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${Je.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+))`,a=new RegExp(i).exec(t);a&&(this._ssrcMap[a[1]]=a[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Ai(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){this._producerScreen&&(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Pi(this._producerScreen,this._participantIdRegistry,(e,t)=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,t)},e=>{this._triggerEvent("REMOTE_STREAM_SECOND",e,null)},e=>{this._triggerEvent("SCREEN_SHARING_STAT",e)}))}_removeCaptureReceiver(){this._captureReceiver?.destroy(),this._captureReceiver=null}_applyConsumerSettings(){let e=this._serverSettings.camera;if(e&&this._pc){let t=[];this._pc.getSenders().forEach(i=>{if(!i.track||i.track.kind!=="video"||i.track.contentHint==="motion")return;let a=!this._disabledSenders.has(i),s=e.maxDimension!==0;if(a&&!s){d.log("Disabling video upload"),this._disabledSenders.add(i),i.replaceTrack(M.getBlackMediaTrack()).catch(u=>{d.error("Could not disable video upload",u)});return}let c=this._mediaSource.getSendVideoTrack();if(!a&&s&&c){d.log("Enabling video upload"),this._disabledSenders.delete(i);let u=i.track;u.enabled=c.enabled,i.replaceTrack(c).then(()=>u.stop()).catch(l=>{d.error("Could not enable video upload",l)})}I.applyVideoTrackSettings(e,i,c??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}if(this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&p.consumerFastScreenShare){let t=this._serverSettings.fastScreenSharing;if(t&&this._pc){let i=[];this._pc.getSenders().forEach(a=>{!a.track||a.track.kind!=="video"||a.track.contentHint!=="motion"||I.applyVideoTrackSettings(t,a,a.track,this._prevConsumerFastSharingSettings,i)}),this._prevConsumerFastSharingSettings=i}}}_onScreenSharingStatus(e){e.track?(!p.consumerFastScreenShare||!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled)&&this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent("STATE_CHANGED",e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(t=>{this._reportStats(t),this._detectStaleTracks(t),rt.reportUsage(t)}).catch(()=>{}),this._statInterval=window.setTimeout(e,p.statisticsInterval)};this._statInterval=window.setTimeout(e,p.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await pe.collectStats(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent("REMOTE_DATA_STATS",{inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(c=>c.type==="inbound-rtp"&&c.kind==="audio"&&this._ssrcMap[c.ssrc]==="mix");if(!t)return;let i=Je.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:p.asrDataChannel?1:0,animojiDataChannelVersion:p.vmoji?p.vmojiOptions.protocolVersion:1,animojiBackendRender:!p.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:p.videoTracksCount,red:!0,audioShare:p.audioShare,fastScreenShare:p.fastScreenShare,videoSuspend:p.videoSuspend,simulcast:p.simulcast&&M.isSimulcastSupportedByBrowser(),consumerFastScreenShare:p.consumerFastScreenShare,consumerFastScreenShareQualityOnDemand:p.consumerFastScreenShareQualityOnDemand};!p.videoTracksCount&&!this._observer&&d.warn("Setting videoTracksCount to 0 is deprecated"),this._signaling.allocateConsumer(null,e)}async _processOffer(e){if(!this._pc)throw new Error("Interrupt allocation");let t=p.simulcast&&M.isSimulcastSupportedByBrowser(),i=t;try{await this._pc.setRemoteDescription(e)}catch(c){throw d.error("[single] unable to set remote offer",c),R.log(D.ERROR,"setRemoteDescription-single"),c}let a=this._findFirstSimTransceiver();if(t)if(a){d.log(`_processOffer: caps.simulcast=${p.simulcast} mid=${a.mid} dir=${a.direction}`);let c=this._mediaSource.getStream(),u=await this._setupSimulcastTransceiver(c,a);d.log("_processOffer: simulcastInfo",u),u||(d.log(`_processOffer: simulcast transceiver not found in server offer mid=${a.mid}, disable simulcast`),i=!1)}else d.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),i=!1;let s;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");s=await this._pc.createAnswer()}catch(c){throw d.error("[single] unable to create answer",c),R.log(D.ERROR,"createAnswer-single"),c}try{if(!this._pc)throw new Error("Interrupt allocation");s.sdp=I.patchLocalSDP(s.sdp,!1,M.isBrokenH264Decoder(),!1),d.debug("[single] set local answer",{answer:s}),await this._pc.setLocalDescription(s)}catch(c){throw d.error("[single] unable to set local answer",c),R.log(D.ERROR,"setLocalDescription-single"),c}if(i&&a){s.sdp=I.patchSimulcastAnswerSdp(s.sdp,a,_t.WIDTH,_t.HEIGHT);for(let c of this._pc.getTransceivers())c.mid===null&&c.stop()}try{d.debug("[single] transmit local answer",{answer:s}),this._updateSSRCMap(e),await this._signaling.acceptProducer(s,Object.keys(this._ssrcMap)),d.debug("[single] remote offer has been processed")}catch(c){d.warn("[single] unable to send local answer",c),R.log(D.ERROR,"acceptProducer")}i&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!=="video")continue;let i=e.sender.getParameters();if(!(!i.encodings||i.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let i=e.getVideoTracks()[0];await t.sender.replaceTrack(i),t.sender.setStreams(e);let a=t.sender.getParameters();if(!a.encodings||a.encodings.length<=1)return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(a.encodings)}`),null;let s=mi(_t.WIDTH,_t.HEIGHT,this._serverSettings.camera?.bitrates?.generic),c=0,u=1;for(let m of a.encodings)m.scalabilityMode=ui,m.active=!0,c>=s.streams.length?m.maxBitrate=0:m.maxBitrate=s.streams[c].bitrate,m.scaleResolutionDownBy=u,u=u*2,c++;await t.sender.setParameters(a);let l=i.getSettings();return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${l.width}x${l.height} encodings=${JSON.stringify(a.encodings)}`),!0}async _acceptProducer(e){if(this._producerOfferIsProcessing){this._producerNextOffer=e,d.debug("[single] wait until other remote offer is processed");return}this._producerOfferIsProcessing=!0;let t={type:"offer",sdp:I.patchRemoteSDP(e,M.isOldDataChannelDescription(),!1,!1,!1,M.isBrokenVP9Encoder(),M.isBrokenVP9Decoder())};if(d.debug("[single] set remote offer",{offer:t}),!this._pc)throw new Error("Interrupt allocation");try{if(await this._processOffer(t),this._producerOfferIsProcessing=!1,this._producerNextOffer){d.debug("[single] there is other unprocessed remote offer, process it");let i=this._producerNextOffer;this._producerNextOffer=null,await this._acceptProducer(i)}}catch(i){this.close(i)}}async _replaceScreenShareTrack(){let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="video");if(!e||!e.sender){d.warn("Cannot find screenshare transceiver");return}try{e.direction="sendonly",await e.sender.replaceTrack(this._mediaSource.getScreenShareTrack())}catch(t){d.error("ServerTransport: Unable to replace track",t)}}async _handleTracks(){this._observer||(await this._handleAudioShareTrack(),await this._handleScreenShareTrack())}async _handleAudioShareTrack(){if(!this._newAudioShareTrack)return;let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s")&&t?.receiver?.track.kind==="audio");if(!e||!e.sender){d.warn("Cannot find audioshare transceiver");return}e.sender.track!==null&&d.warn("Unexpected track assigned to audioshare");try{e.direction="sendonly",await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(t){d.error("ServerTransport: Unable to replace track",t),R.log(D.ERROR,"replaceTrack-single")}}async _handleScreenShareTrack(){this._mediaSource.getScreenShareTrack()&&await this._replaceScreenShareTrack()}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case U.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case U.REALLOC_CON:this._reconnect();break;case U.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case U.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case U.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case U.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent("ASR_TRANSCRIPTION",e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),p.breakVideoPayloadTypes&&(d.log("test mode enabled, video switched off"),this._signaling.requestTestMode("breakVideoPayloadTypes",null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description)}_onAddTrack(e,t){d.debug("[single] remote track (added)",{track:t.track});let i=t.streams[0];i?(i.onremovetrack||(i.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",i.id,i,s.track)}),i.getTracks().find(s=>s.id===t.track.id)||i.addTrack(t.track),this._rtpReceiversByStreamId[i.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",i.id,i,t.track)):d.error("[single] unable to get media stream from track event")}static _onSignalingStateChange(e,t){d.debug("[single] signaling state changed",{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(d.debug("[single] connection state changed",{state:e.connectionState},t),R.log(D.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(R.logCustom(D.RECONNECT,{param:1}),this._reconnect());break;case"connecting":let i=this.getState();i==="IDLE"||i==="OPENED"?this._setState("CONNECTING"):e.iceConnectionState==="checking"&&this._setState("RECONNECTING");break;case"disconnected":this._reconnectionPrevented?this.close(new Error("Ice connection disconnected")):this._setState("RECONNECTING");break;case"connected":this._setState("CONNECTED"),I.getPeerConnectionHostInfo(e).then(a=>{a?.local&&(R.log(D.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))}),R.logCustom(D.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){d.debug(`_onReplacedTrack: newTrack=${e}, sendTrack=${t}`),t&&(e=t);let i=(a,s)=>{a.replaceTrack(s).catch(c=>{d.error("ServerTransport: Unable to replace track",c),R.log(D.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),p.simulcast&&M.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(c=>c.direction==="sendonly"&&c.sender?.track?.kind==="video"&&c.sender.track.contentHint===e.contentHint)?.sender;s?.track?(i(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):d.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let a=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);a?.track?i(a,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}async _onSourcesChanged({kind:e}){e==="screen"&&p.consumerFastScreenShare&&this._mediaSource.getMediaSettings().isFastScreenSharingEnabled&&await this._replaceScreenShareTrack(),this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return R.log(D.PAT_WAITING_TIME_ERROR,"noConnection"),d.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return R.log(D.PAT_WAITING_TIME_ERROR,"oldBrowser"),d.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let i=this._rtpReceiversByStreamId[e];if(!i)return R.log(D.PAT_WAITING_TIME_ERROR,"noReceiver"),d.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let a=i.getSynchronizationSources();if(!a||!a.length)return d.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let c=a[0].rtpTimestamp;if(!Number.isInteger(c))return R.log(D.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),d.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${c}`),0;let u=t-c&Xo,l=Math.ceil(u/Qo);return Math.min(100,Math.max(0,l))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!p.simulcast||!M.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let c=s.getVideoTracks()[0],u=c.getSettings().width,l=c.getSettings().height,m=mi(u,l,this._serverSettings.camera?.bitrates?.generic),h=t||!Ka(this._simulcastInfo,m);if(!m.streams.length||!h)return;let E=a.sender.getParameters();if(E.encodings||(E.encodings=[{}]),!(E.encodings.length<=1)){if(d.log(`_changeSimulcastInfo: ${u}x${l} command: ${JSON.stringify(m)} `),e){let P=0;for(let b of E.encodings)b.scaleResolutionDownBy=Fi(b.rid),b.scalabilityMode=ui,P>=m.streams.length?(b.maxBitrate=0,b.active=!1):(b.active=!0,b.maxBitrate=m.streams[P].bitrate),P++;await a.sender.setParameters?.(E).catch(b=>{d.error("Failed to set sender parameters",E,b)}),d.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(E.encodings)} `)}if(this._simulcastInfo=m,m.streams){let P={mediaSource:1,simulcastInfo:m};await this._signaling.changeSimulcast(P)}}}async _monitorRtpShare(){let e=zt.getInstance().value;if(!this._mediaSource.getMediaSettings().isFastScreenSharingEnabled||!p.consumerFastScreenShare||e<.6)return;let t=this._pc?.getSenders().find(a=>a.track?.kind==="video"&&a.track?.contentHint==="motion");if(!t)return;(await t.getStats()).forEach(a=>{if(a.type==="outbound-rtp"&&this._serverSettings.fastScreenSharing&&a.frameWidth<this._serverSettings.fastScreenSharing.maxDimension&&a.frameWidth<window.screen.width){let s=t.getParameters();s.degradationPreference="maintain-resolution",t.setParameters(s),d.log(`
|
|
13
13
|
degradationPreference updated for fast share RTP Sender
|
|
14
14
|
Actual senderStats: ${JSON.stringify(a)}
|
|
15
15
|
serverSettings: ${JSON.stringify(this._serverSettings.fastScreenSharing)}
|
|
16
|
-
`)}})}_startMonitorRtpShareInterval(){if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,5e3)};this._monitorRtpShareInterval=window.setTimeout(t,5e3)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}};var Fe=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(Fe||{}),Cr=class extends oe{constructor(e,t,i,a){super();c(this,"_signaling");c(this,"_mediaSource");c(this,"_topology");c(this,"_allocated",[]);c(this,"_opened",[]);c(this,"_directTransport",null);c(this,"_serverTransport",null);c(this,"_serverSettings");c(this,"_dtListeners",[]);c(this,"_stListeners",[]);c(this,"_states",{});c(this,"_localState","IDLE");c(this,"_animojiReceiver",null);c(this,"_animojiSender",null);this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,we.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"ANIMOJI_STATUS",this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e==="SERVER"&&(this._serverTransport=this._createServerTransport())}updateSettings(e){d.log("Update transport settings",e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(d.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){d.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology==="DIRECT"&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology==="SERVER"&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,i=!1,a=!1){d.log("Trying open participant",{participantIds:e});let s=a;for(let o of e){if(this._opened.indexOf(o)!==-1){d.warn(`The participant [${o}] has already had opened transport`);continue}if(this._allocated.indexOf(o)===-1){d.warn(`The participant [${o}] has no allocated transport`);continue}this._opened.push(o),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(i),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),d.debug("The transport has been opened",e))}close(e){let t=this._allocated.indexOf(e),i=this._opened.indexOf(e);t<0&&d.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&i>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),i>=0&&this._opened.splice(i,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),l.audioEffects?.destroy(),this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}getTopology(){return this._topology}isAllocated(e){return this._allocated.indexOf(e)>=0}allocated(){return this._allocated.slice()}opened(){return this._opened.slice()}getState(){return this._topology==="SERVER"?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){l.vmoji&&t.isMe&&l.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology==="SERVER"&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let i=e.filter(a=>this._states[a]!==t?(this._states[a]=t,!0):!1);i.length&&this._triggerEvent("STATE_CHANGED",i,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent("LOCAL_STATE_CHANGED",e))}_onSignalingNotification(e){if(e.notification===U.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(d.log(`Topology changed ${this._topology} -> ${e.topology}`),R.log(D.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology==="SERVER"&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology==="DIRECT"){let t=e.offerTo||[],i=e.offerToTypes||[],a=e.offerToDeviceIdxs||[],s=t.length&&i.length?I.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){d.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&d.warn("Topology changed to DIRECT, but the allocated participants count more then one");let o=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let u=s===o;this._directTransport=this._createDirectTransport(o,u)}this._opened.indexOf(o)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new wi(e,t,this._signaling,this._mediaSource,this._serverSettings);return this._dtListeners.length>0&&d.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(i.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this,e)),i.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this,e)),i.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),i.addEventListener("STATE_CHANGED",this._onDirectTransportChanged.bind(this)),i.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),i.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"DIRECT"))),this._animojiReceiver&&this._animojiSender&&i.setAnimojiTransport(this._animojiReceiver,this._animojiSender),i}_createServerTransport(){let e=new ki(this._signaling,this._mediaSource,this._serverSettings);return this._stListeners.length>0&&d.warn("The list of server transport listeners is not empty"),this._stListeners=[],this._stListeners.push(e.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),e.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),e.addEventListener("AUDIO_MIX_STALL",this._onServerAudioMixStall.bind(this)),e.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),e.addEventListener("STATE_CHANGED",this._onServerTransportChanged.bind(this)),e.addEventListener("SIGNALLED_ACTIVE_PARTICIPANTS",this._onTransportActiveParticipants.bind(this)),e.addEventListener("SIGNALLED_SPEAKER_CHANGED",this._onTransportSpeakerChanged.bind(this)),e.addEventListener("SIGNALLED_STALLED_PARTICIPANTS",this._onTransportStalledParticipants.bind(this)),e.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),e.addEventListener("REMOTE_STREAM_SECOND",this._onRemoteStreamSecond.bind(this)),e.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"SERVER")),e.addEventListener("ASR_TRANSCRIPTION",this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_setLocalNoiseSuppression(e){l.noiseSuppression!==e&&(l.noiseSuppression=e,this._mediaSource?.updateNoiseSuppression())}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e==="CONNECTED"&&this._topology==="DIRECT"&&this._releaseServerTransport(),(e==="CLOSED"||e==="FAILED")&&(this._releaseDirectTransport(),this._topology==="DIRECT")){let i=this._opened.indexOf(t);i>=0&&this._opened.splice(i,1);let a=this._allocated.indexOf(t);a>=0&&this._allocated.splice(a,1)}this._topology==="DIRECT"&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e==="CONNECTED"&&this._topology==="SERVER"&&this._releaseDirectTransport(),(e==="CLOSED"||e==="FAILED")&&(this._releaseServerTransport(),this._topology==="SERVER"&&(this._allocated=[],this._opened=[])),this._topology==="SERVER"&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_onTransportStalledParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_onTransportSpeakerChanged(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_onTransportNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_onRemoteStreamSecond(e,t){this._triggerEvent("REMOTE_STREAM_SECOND",e,t)}_onPeerConnectionClosed(e){this._triggerEvent("PEER_CONNECTION_CLOSED",e)}_onServerAudioMixStall(e){this._topology==="SERVER"&&this._triggerEvent("AUDIO_MIX_STALL",e)}_onRemoteDataStats(e){this._triggerEvent("REMOTE_DATA_STATS",e)}_onRemoteTrackAdded(e,t,i){this._triggerEvent("REMOTE_TRACK_ADDED",e,t,i)}_onRemoteTrackRemoved(e,t,i){this._triggerEvent("REMOTE_TRACK_REMOVED",e,t,i)}_onAsrTranscription(e){this._triggerEvent("ASR_TRANSCRIPTION",e)}_onSourceChanged(){let e=this._mediaSource.getStream();e&&this._animojiSender?.setStream(e)}_onAnimojiStream(e,t){this._triggerEvent("ANIMOJI_STREAM",e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createAnimojiTransport(){if(!l.vmoji)return;this._animojiReceiver=new l.vmoji.AnimojiReceiver((t,i)=>this._onAnimojiStream(t,i),t=>this._onAnimojiStream(t,null),t=>{this._triggerEvent("ANIMOJI_ERROR",t)},l.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new l.vmoji.AnimojiSender(e,this._signaling.getPeerId(),l.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:l.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=t=>this._animojiReceiver?.receive(t)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology!=="SERVER"?(R.log(D.PAT_WAITING_TIME_ERROR,"wrongTopology"),d.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(R.log(D.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var Le=class Le{constructor(){c(this,"trackerByTransport",{ws:new pt,wt:new pt});c(this,"lastSeen",{})}static create(){Le._instance||(Le._instance=new Le)}static mark(r){if(!Le._instance)return;let e=Date.now(),t=Le._instance.lastSeen[r];if(typeof t=="number"){let i=e-t;i>=0&&Le._instance.trackerByTransport[r].add(i)}Le._instance.lastSeen[r]=e}static logMetrics(r){Le._instance&&["ws","wt"].forEach(e=>{if(!Le._instance.trackerByTransport[e].hasData)return;let t=Le._instance.trackerByTransport[e].snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:K.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 pt,wt:new pt},this.lastSeen={}}};c(Le,"_instance");var ht=Le;var Ve=class Ve{constructor(){c(this,"trackerByCommand",new Map)}static create(){Ve._instance||(Ve._instance=new Ve)}static mark(r,e,t){if(!Ve._instance)return;let i=`${r}|${t}`,a;Ve._instance.trackerByCommand.has(i)?a=Ve._instance.trackerByCommand.get(i):(a=new pt,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();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:K.SIGNALING_COMMAND_SUMMARY,api_method:i,min_value:s.min,max_value:s.max,avg_value:s.avg,median_value:s.median,p95_value:s.p95,values_count:s.count,signaling_transport:a})}}static destroy(){Ve._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};c(Ve,"_instance");var _t=Ve;var Ln=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(Ln||{}),Ke=Ln;var Un={producerScreenTrack:()=>l.producerScreenTrack,videoTracksCount:()=>l.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>l.consumerScreenTrack,muteNotificationForAdmins:()=>!0,movieShare:()=>l.movieShare,useParticipantListChunk:()=>l.useParticipantListChunk,useRooms:()=>l.useRooms,vmoji:()=>!!l.vmoji,useCallsToContacts:()=>l.useCallsToContacts,useChatRooms:()=>l.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!l.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>l.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>l.waitForAdminInGroupCalls},ot=class{static getFlags(){let r=Object.values(Un),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(Un).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};var $e=gi(require("fflate"));var tc=63n,ic=16383n;var rc=4611686018427387903n,Pr=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=tc)return new Uint8Array([Number(e)]);if(e<=ic)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<=rc)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")}},yr=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 br=class{constructor(r){c(this,"encoder");c(this,"compression");c(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new Pr,this.compression=r??null}encode(r){let e=this.encoder.encode(r);e=this.compress(e);let t=this.lengthEncoder.encode(e.length),i=new Uint8Array(t.length+e.length);return i.set(t),i.set(e,t.length),i}compress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return $e.gzipSync(r);case"deflate":return $e.zlibSync(r);case"deflate-raw":return $e.deflateSync(r);default:return r}}},Mr=class{constructor(r){c(this,"decoder");c(this,"compression");c(this,"lengthDecoder");c(this,"buffer");c(this,"expectedLength");c(this,"offset");c(this,"lengthPrefixLength");this.decoder=new TextDecoder,this.lengthDecoder=new yr,this.compression=r??null,this.buffer=new Uint8Array(0),this.expectedLength=null,this.offset=0}decode(r){let e=[];for(this.buffer=new Uint8Array([...this.buffer,...r]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return e;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return e;let t=this.buffer.subarray(this.offset,this.offset+this.expectedLength);t=this.decompress(t),e.push(this.decoder.decode(t)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return e}readLength(r){if(r.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(r),this.lengthPrefixLength<0)throw new Error("Invalid length prefix");let e=this.lengthDecoder.decode(r.subarray(0,this.lengthPrefixLength));return e===null?null:Number(e)}decompress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return $e.gunzipSync(r);case"deflate":return $e.unzlibSync(r);case"deflate-raw":return $e.inflateSync(r);default:return r}}};var ni=class{constructor(r,e={}){c(this,"webTransport");c(this,"stream",null);c(this,"writer",null);c(this,"reader",null);c(this,"url");c(this,"options");c(this,"compression");c(this,"encoder");c(this,"decoder");c(this,"onopen",null);c(this,"onmessage",null);c(this,"onerror",null);c(this,"onclose",null);c(this,"readyState",WebSocket.CONNECTING);this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new br(this.compression),this.decoder=new Mr(this.compression),this.connect()}getCompressionTypeFromUrl(r){try{let t=new URL(r).searchParams.get("compression");switch(t){case"gzip":case"deflate":case"deflate-raw":return t;default:return null}}catch(e){return d.log("Exception while parsing compression",e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,d.debug("[WebTransport] WebTransport connected to "+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event("open")),await this.readLoop()}catch(r){d.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error")),this.onclose?.(new CloseEvent("close",{code:1006,reason:"Connection Failed"}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:r,value:e}=await this.reader.read();if(r)break;e&&(yield e)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let r of this.readChunks())this.decoder.decode(r).forEach(t=>{this.onmessage?.(new MessageEvent("message",{data:t}))});this.close(1e3,"Stream Closed")}catch(r){d.error("[WebTransport] Stream read failed",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(r){if(this.readyState!==WebSocket.OPEN){d.warn("[WebTransport] Attempt to send data before webtransport is open");return}if(!this.writer){d.warn("[WebTransport] Attempt to send data before stream is ready");return}try{await this.writer.ready;let e=this.encoder.encode(r);await this.writer.write(e)}catch(e){d.error("[WebTransport] Failed to send data",e),this.onerror?.(new Event("error")),this.close(1006,"Failed to send data")}}close(r=1e3,e){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(t){d.warn("[WebTransport] already closed. Did we get a STOP_SENDING? ignore",t)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent("close",{code:r,reason:e})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return"WebTransport"in window&&typeof WebTransport=="function"?b.browserName()==="Firefox"?l.webtransportFF:b.browserName()!=="Safari":!1}};var Bn="open",ac=10,nc=["service-unavailable","conversation-ended","invalid-token"],Wt=class n extends fi{constructor(){super(...arguments);c(this,"socket",null);c(this,"sequence",1);c(this,"lastStamp",0);c(this,"websocketCommandsQueue",[]);c(this,"datachannelCommandsQueue",[]);c(this,"incomingCache",[]);c(this,"responseHandlers",{});c(this,"connectionType");c(this,"reconnectCount",0);c(this,"endpoint");c(this,"wtEndpoint",null);c(this,"conversationResolve",null);c(this,"conversationReject",null);c(this,"connected",!1);c(this,"listenersReady",!1);c(this,"postfix","&platform="+l.platform+"&appVersion="+l.appVersion+"&version="+l.protocolVersion+"&device="+l.device+"&capabilities="+ot.getFlags());c(this,"peerId",null);c(this,"conversationId",null);c(this,"reconnectTimer",0);c(this,"connectionMessageWaitTimer",0);c(this,"doctorTimer",0);c(this,"participantIdRegistry",null);c(this,"producerNotificationDataChannel",null);c(this,"producerCommandDataChannel",null);c(this,"producerCommandDataChannelEnabled",!1);c(this,"producerCommandSerializationService",new gr)}static get RECONNECT_DELAY(){return l.signalingReconnectDelay}static get RECONNECT_MAX_DELAY(){return l.signalingReconnectMaxDelay}static get RECONNECT_MAX_COUNT(){return l.signalingReconnectMaxCount}static get WAIT_CONNECTION_DELAY(){return l.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return l.waitResponseDelay}static get WAIT_MESSAGE_DELAY(){return l.waitMessageDelay}get ready(){return this.socket!==null}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e}setConversationId(e){this.conversationId=e}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=t=>{let i=this.participantIdRegistry?.handleMessage(t.data);i&&this._handleMessage(i)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(i=>{i&&this._handleMessage(i)}).catch(i=>{d.warn("[signaling] cannot parse message at producerCommandDataChannel",i)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return this.postfix+=`&clientType=${l.clientType}`,new Promise((t,i)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){R.log(D.SOCKET_ACTION,"already_opened"),i(Error("Socket already opened"));return}this.conversationResolve=a=>{t(a),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=a=>{i(a),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},i=!0,a=0){if(t.participantId){let s=I.decomposeParticipantId(t.participantId),o=I.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:o.id,participantType:o.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,i,a)}async _sendRaw(e,t={},i=!0,a=0){let s=o=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(o),this.producerCommandDataChannel?.readyState===Bn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){R.log(D.SOCKET_ACTION,"not_opened"),d.warn("[signaling] socket is not opened"),o.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(R.log(D.SOCKET_ACTION,"invalid_state"),d.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(o),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((o,u)=>{let p=(C,M=!1)=>{!a||M?u(C):(d.debug("[signaling] resending a signaling message",e,E.sequence),a--,s(E))},m=this.sequence++,h=`${e}_${m}`;pe.setMark(h);let E={sequence:m,name:e,statMarkName:h,params:t,responseTimer:0,needResponse:i,resolve:o,reject:p};s(E)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===N.UPDATE_DISPLAY_LAYOUT||e===N.REPORT_PERF_STAT||e===N.REPORT_SHARING_STAT||e===N.REQUEST_ASR||e===N.ENABLE_VIDEO_SUSPEND||e===N.ENABLE_VIDEO_SUSPEND_SUGGEST||e===N.REPORT_NETWORK_STAT||e===N.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(N.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(N.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(N.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,i){let a=Object.assign({sdp:t},i);return this._send(N.TRANSMIT_DATA,{participantId:e,data:a})}async acceptCall(e){return this._send(N.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(N.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,ac)}async changeParticipantState(e,t){let i={participantState:{state:e}};return t&&(i.participantId=t),this._sendRaw(N.CHANGE_PARTICIPANT_STATE,i)}async putHandsDown(){return this._send(N.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(N.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(N.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(N.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let i={capabilities:t};return e&&(i.description=e.sdp),this._send(N.ALLOCATE_CONSUMER,i)}async acceptProducer(e,t){let i={description:e.sdp};return t&&(i.ssrcs=t),this._send(N.ACCEPT_PRODUCER,i)}async changePriorities(e){return this._send(N.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(N.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(N.ADD_MOVIE,e)}async updateMovie(e){return this._send(N.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(N.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(N.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(N.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(N.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(N.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(N.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(N.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(N.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(N.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(N.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(N.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(N.RECORD_SET_CONF,t)}async getRecordStatus(){return this._send(N.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(N.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(N.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(N.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(N.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(N.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(N.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(N.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(N.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,i){let a={participantId:e,roles:t};return i&&(a.revoke=!0),this._sendRaw(N.GRANT_ROLES,a)}async muteParticipant(e,t,i,a=null){return this._sendRaw(N.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:i,roomId:a})}async enableFeatureForRoles(e,t){return this._sendRaw(N.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(N.PIN_PARTICIPANT,a)}async updateMediaModifiers(e){return this._send(N.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(N.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(N.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(N.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(N.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(N.GET_WAITING_HALL,a)}async promoteParticipant(e,t=!1){let i={};return e&&(i.participantId=e),t&&(i.demote=t),this._sendRaw(N.PROMOTE_PARTICIPANT,i)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(N.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(N.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(N.FEEDBACK,{key:e})}async getHandQueue(){return this._send(N.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(N.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(N.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(N.ASR_START,e)}async stopAsr(e){return this._send(N.ASR_STOP,e)}async requestAsr(e){return this._send(N.REQUEST_ASR,{request:e},!1)}_connect(e,t){if(this.socket&&this.socket.readyState<WebSocket.CLOSING)return;this.connectionType=e;let i="";e&&(i+=`&tgt=${e}`),e===Ke.RETRY&&this.lastStamp&&(i+=`&recoverTs=${this.lastStamp}`),i=a(i),t?(i+="&compression=deflate-raw",i+=`&ua=${navigator.userAgent}`,d.debug("[signaling] connecting to wt "+this.wtEndpoint+this.postfix+i),this.socket=new ni(this.wtEndpoint+this.postfix+i)):(d.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+i),this.socket=new WebSocket(this.endpoint+this.postfix+i)),this._markTransportStat(e===Ke.RETRY?"reconnected":"connected"),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor();function a(s){if(!l.useParticipantListChunk)return s;let o=l.participantListChunkInitIndex;s+=`&partIdx=${o}`;let u=l.participantListChunkInitCount;return u!==null&&(s+=`&partCount=${u}`),s}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){d.debug("[signaling] socket opened"),R.log(D.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Ke.RETRY?"reconnected":"connected")}_onMessage(e){if(this._startDoctor(),e.data==="ping"){ht.mark(this._getSocketType()),this._markTransportStat("failed_pings"),v.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send("pong");return}try{let t=JSON.parse(e.data);v.onSignalingMessage(t),this._handleMessage(t)}catch(t){R.log(D.SOCKET_ACTION,"parse_error"),d.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(d.debug("[signaling] signaling connected",e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.postfix+=`&peerId=${e.peerId.id}`,this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat("restart"),this._triggerEvent(we.RECONNECT,e),e.conversation.topology&&this._triggerEvent(we.NOTIFICATION,{type:"notification",notification:U.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===U.ACCEPTED_CALL&&t.peerId.id===this.peerId&&t.peerId.type==="WEB_TRANSPORT"||this._handleMessage(t)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(we.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:R.log(D.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){R.log(D.SOCKET_ACTION,`error-${e.error}`);let t=e.error?nc.includes(e.error):!1;switch(d.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case"service-unavailable":let i=new j(y.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(we.NOTIFICATION,{notification:U.CLOSED_CONVERSATION,reason:y.SERVICE_UNAVAILABLE});break;case"conversation-ended":this.conversationReject?this.conversationReject(new j(e.reason||se.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(we.NOTIFICATION,{notification:U.CLOSED_CONVERSATION,reason:e.reason});break;case"participant-not-found":this._throwError(new Error(`Signaling error: ${e.error}`));break;case"invalid-token":default:if(!t)break;this.connected?this._throwError(new Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new j(e.reason||se.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(we.FAILED,e)}_onError(e){R.log(D.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){R.log(D.SOCKET_ACTION,"closed"),d.debug("[signaling] connection closed",{code:e.code,reason:e.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new j(y.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(new Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let e=Math.min(n.RECONNECT_MAX_DELAY,n.RECONNECT_DELAY*Math.pow(2,this.reconnectCount-1));d.log(`[signaling] reconnect websocket after ${e}ms (${this.reconnectCount})`),R.log(D.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Ke.RETRY,!1),e)}_handleCommandResponse(e,t){if(!Object.hasOwn(this.responseHandlers,t.sequence))return;let i=this.responseHandlers[t.sequence];window.clearTimeout(i.responseTimer);let a=pe.measureMark(i.statMarkName);a!==null&&_t.mark(i.name,a,this._getSocketType()),d.debug(`[signaling] command response [${t.sequence}]`,t),e?(delete this.responseHandlers[t.sequence],i.resolve(t)):t.type==="error"?(delete this.responseHandlers[t.sequence],R.log(D.SOCKET_ACTION,"response-error"),i.reject(new Error(t.error||`Response error [${i.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],R.log(D.SOCKET_ACTION,"response-timeout"),i.reject(new Error(t.error||`Response timeout [${i.name}]`))):i.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),n.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(d.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Bn){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 N.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case N.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case N.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case N.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case N.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case N.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case N.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case N.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===N.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]=In(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new j(se.SIGNALING_FAILED,{message:"Unable to connect to the signaling: connection timeout",remote:!0}))},n.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),!(this.reconnectCount>=n.RECONNECT_MAX_COUNT)&&(this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?d.warn(`[signaling] socket is dead. Fallback to WebSocket. Trying to connect ${this.reconnectCount}`):d.warn(`[signaling] socket is dead, trying to reconnect ${this.reconnectCount}`),this._logTransportStat("failed_pings"),this._disconnect(4e3),this._connect(Ke.RETRY,!1),this.reconnectCount++},n.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return ni.isBrowserSupported()&&this.wtEndpoint!==null&&l.webtransport}_getSocketType(){return this.socket instanceof ni?"wt":"ws"}_markTransportStat(e){let t=this._getSocketType(),i=Ea[e][t];pe.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=Ea[e][i];ge.logEventualStat({name:a,...t})}};var Fn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(Fn||{}),Te=Fn;var Vn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(Vn||{}),ct=Vn;var jn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(jn||{}),Ar=jn;var Hn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(Hn||{}),Dr=Hn;var Gn=(u=>(u.REQUIRE_AUTH_TO_JOIN="REQUIRE_AUTH_TO_JOIN",u.AUDIENCE_MODE="AUDIENCE_MODE",u.WAITING_HALL="WAITING_HALL",u.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",u.ADMIN_IS_HERE="ADMIN_IS_HERE",u.ASR="ASR",u.FEEDBACK="FEEDBACK",u.RECURRING="RECURRING",u))(Gn||{}),et=Gn;function Wn(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function Kn(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 $n=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))($n||{}),je=$n;var qn=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(qn||{}),Q=qn;var zn=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(zn||{}),si=zn;var Jn=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(Jn||{}),Yn=Jn;function Qn(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var Xn=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(Xn||{}),gt=Xn;function Oi(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var wr=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(wr||{}),J;(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",C=0){return{id:h,type:E,deviceIdx:C}}m.fromId=r;function e(h,E=!0){let C=E?h.decorativeExternalUserId:h.externalId,M=h.deviceIdx??0;if(C)return t(C,M)}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",C=0){return a(r(h,E,C))}m.fromIdToString=s;function o(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}m.fromString=o;function u(h,E){return h.id===E.id&&h.type===E.type&&h.deviceIdx===E.deviceIdx}m.compare=u;function p(h){return h?.deviceIdx||0}m.getDeviceIdx=p})(J||(J={}));function Zn(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function es(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var kr=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function ts(n){if(n.conversation?.muteStates)return n.conversation.muteStates;if(n.muteState&&n.muteOptions)return n.muteOptions.reduce((r,e)=>(r[e]=n.muteState,r),{})}function sc(n,r){switch(n){case ce.AUDIO:return!!r.isAudioEnabled;case ce.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case ce.VIDEO:return!!r.isVideoEnabled;case ce.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function is(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case je.MUTE:case je.MUTE_PERMANENT:{sc(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function rs(n){let{muteStates:r={},mediaSettings:e}=n;return is(r,e)}function as(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return is(r,t)}function ns(n,r){let e=new Uint8Array(r),t=0,i=0;for(;t<n.length&&i<r;){let a=n[t++],s=a>>4,o=a&15;if(s===15){let m;do m=n[t++],s+=m;while(m===255)}for(let m=0;m<s&&!(i>=r);m++)e[i++]=n[t++];if(t>=n.length||i>=r)break;let u=n[t]|n[t+1]<<8;if(t+=2,o===15){let m;do m=n[t++],o+=m;while(m===255)}o+=4;let p=i-u;for(let m=0;m<o&&!(i>=r);m++)e[i++]=e[p+m]}return e}var oi=class{constructor(r){c(this,"_fixNoPacketsApplied",!1);c(this,"_fixNoPacketsChecked",!1);c(this,"_fixTooManyPacketsApplied",!1);c(this,"_fixTooManyPacketsSucceeded",!1);c(this,"_fixTooManyPacketsFailed",!1);c(this,"_fixTooManyPacketsTime");c(this,"_mediaSource");c(this,"_lastPacketsSent");c(this,"_lastPacketsSentTime");c(this,"_toggleAudioPromise",null);c(this,"_fixNoPacketsAppliedVideo",!1);this._mediaSource=r}_fixAudioDeviceNoPackets(r){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,R.log(D.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,R.log(D.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(b.getMicrophonePermissionState()!=="denied"))}}_fixAudioDeviceTooManyPackets(r){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let e=75,t=Date.now();if(!this._lastPacketsSentTime)r.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent);else if(t-this._lastPacketsSentTime>500){let i=(r.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent,this._fixTooManyPacketsApplied?i>e?(d.log("[AudioFix] Failed to fix RV"),R.log(D.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),R.log(D.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,R.log(D.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0),this._fixTooManyPacketsTime=t)}}fix(r){if(!this._mediaSource)return;let e=r.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(r){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=r.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{this._mediaSource.getMediaSettings().isVideoEnabled&&this._mediaSource.toggleVideo(!0)}))}};var xi=class{constructor(r){c(this,"_output",null);c(this,"_volume",1);c(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});c(this,"_statFirstMediaReceived");this._statFirstMediaReceived=r}add(r){this.destroy(),this._output={},this._output.audioTrack=r,this._initAudioElement()}remove(r){!this._output||this._output.audioTrack!==r||this.destroy()}get volume(){return this._volume}set volume(r){this._volume=Math.max(0,Math.min(1,r)),this._output&&this._output.audioElement&&(this._output.audioElement.volume=this._volume)}_initAudioElement(){if(l.muteMode||!this._output?.audioTrack)return;let r=b.browserName()!=="Safari"||b.isMobile(),e=document.createElement(r?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{d.warn("[audio] Error on play audio"),v.onAutoplayError()},i=s=>{e.srcObject=new MediaStream([s]),e.load();let o=e.play();o&&o.catch(t)},a=()=>{d.debug("[audio] Recover audio playback");let s=this._output?.audioTrack;s?i(s):d.warn("[audio] Broken audio track")};e.onpause=a,e.onstalled=a,e.onerror=a,e.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(this._output.audioTrack),this._output.audioElement=e}_stopAudioElement(){this._output?.audioElement&&(this._output.audioElement.pause(),this._output.audioElement.srcObject=null),this._output?.audioTrack?.stop()}destroy(){this._output&&(this._stopAudioElement(),this._output=null)}async changeOutput(){try{if(!this._features.setSinkId)throw new Error('Feature "setSinkId" is not supported');if(!this._output?.audioElement)return;let r=b.getSavedOutput();r&&await this._output.audioElement.setSinkId?.(r.deviceId)}catch(r){throw R.log(D.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}};var oc=90,cc=3,Ni=class extends oe{constructor(){super(...arguments);c(this,"_lastMemoryStat",{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(i=>{let a=typeof i.userId=="string"&&t[i.userId]||null;i.userId=a?.externalId}),v.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),i=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>oc?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=cc)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var dc=44100,Pt=class{constructor(r,e){c(this,"_analyser",null);c(this,"_gainNode",null);c(this,"_fftBins",null);c(this,"_mediaStreamSource",null);c(this,"_lastSmoothedLevel",0);c(this,"_trackId");c(this,"_track");c(this,"_stream");this._trackId=r,this._track=e,this._stream=new MediaStream([e]);try{let t=b.getAudioContext();this._gainNode=t.createGain(),this._gainNode.gain.value=1e-5,this._gainNode.connect(t.destination),this._analyser=t.createAnalyser(),this._analyser.fftSize=1024,this._analyser.smoothingTimeConstant=0,this._analyser.connect(this._gainNode),this._fftBins=new Uint8Array(this._analyser.frequencyBinCount),this._mediaStreamSource=t.createMediaStreamSource(this._stream),this._mediaStreamSource.connect(this._analyser)}catch{}}get track(){return this._track}get trackId(){return this._trackId}_getBins(){if(!this._fftBins||!this._analyser)return new Uint8Array;this._analyser.getByteFrequencyData(this._fftBins);let r=dc/this._fftBins.length,e=Math.ceil(l.voiceParams.minFreq/r),t=Math.floor(l.voiceParams.maxFreq/r);return this._fftBins.subarray(e,t)}getLevel(){let r=this._getBins(),t=r.reduce((a,s)=>a+s,0)/r.length/255,i=this._lastSmoothedLevel*l.voiceParams.smoothing+t*(1-l.voiceParams.smoothing);return this._lastSmoothedLevel=i,{real:t,smoothed:i}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}};var Li=class extends oe{constructor(e){super();c(this,"_detector",null);c(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,l.voiceParams.interval)};this._interval=window.setTimeout(t,l.voiceParams.interval);let i=()=>{let a=e.getSendAudioTrack();a&&this.init(a)};this.subscribe(e,"SOURCE_CHANGED",a=>{a.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&i()}),this.subscribe(e,"SOURCE_READY",i),i()}init(e){this._stopDetector(),this._detector=new Pt("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 Or=class{constructor(r){this.processor=r;c(this,"queue",[]);c(this,"isProcessing",!1)}add(r){this.queue.push(r),this.processQueue()}async processQueue(){if(!this.isProcessing){for(this.isProcessing=!0;this.queue.length;){let r=this.queue.shift();if(r)try{await this.processor(r)}catch{d.error(`Can't process message ${JSON.stringify(r)}`)}}this.isProcessing=!1}}};var xr=class extends oe{constructor(e){super();c(this,"_detector",null);c(this,"_interval",null);c(this,"_activeParticipants");c(this,"_removedParticipants");this.subscribe(e,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(e,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,"SIGNALLED_ACTIVE_PARTICIPANTS",this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._detector?.destroy(),this._detector=null}_onRemoteTrackAdded(e,t,i){if(i.kind==="audio"&&(this._detector?.destroy(),this._detector=new Pt(e,i),!this._interval)){let a=()=>{this._collectVolumes(),this._interval=window.setTimeout(a,l.voiceParams.interval)};this._interval=window.setTimeout(a,l.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,i){i.kind==="audio"&&(!this._detector||this._detector.track!==i||(this._detector.destroy(),this._detector=null))}_collectVolumes(){if(!this._detector)return;let e={},t=this._detector.trackId,i=this._detector.getLevel();if(t===Ze.AUDIO_MIX){if(this._activeParticipants)for(let a of this._activeParticipants)e[a]=i;if(this._removedParticipants){for(let a of this._removedParticipants)e[a]={real:0,smoothed:0};this._removedParticipants=null}}else e[t]=i;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null,this._removedParticipants=null)}};var Nr=class extends oe{constructor(e,t,i){super();c(this,"_speakerId",null);c(this,"_serverSideSpeakerDetection",!1);this._serverSideSpeakerDetection=i==="SERVER",this.subscribe(e,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this.subscribe(t,"SIGNALLED_SPEAKER_CHANGED",this._onServerSpeakerChanged.bind(this)),this.subscribe(t,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,i=null;if(Object.keys(e).forEach(a=>{let s=e[a].smoothed;s>t&&s>l.voiceParams.threshold&&(t=s,i=a)}),i&&i!==this._speakerId){let a=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>a*l.voiceParams.speakerLevelMultiplier&&(this._speakerId=i,this._triggerEvent("SPEAKER_CHANGED",i))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent("SPEAKER_CHANGED",e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e==="SERVER"}};var Ui=class extends oe{constructor(e,t,i){super();c(this,"_transport");c(this,"_volumes",{});c(this,"_participants",{});c(this,"_connectionTimeout",0);c(this,"_volumeTimeout",0);this._transport=e,this._participants=i,this.subscribe(e,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(t,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_onTransportStateChanged(e,t){t==="OPENED"&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),l.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),l.specListenerParams.volumeTimeout))),t==="FAILED"&&this._connectionTimeout&&(d.warn("Transport failed, send callSpecError"),R.log(D.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){let e=i=>i!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(d.warn("There is not connected transport, send callSpecError"),R.log(D.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let i="UNKNOWN",a=this._participants[t];a&&a.platform&&(i=a.platform),e.indexOf(i)<0&&(e.push(i),R.log(D.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var Lr=class n{static correctHangupReason(r){switch(r){case y.HUNGUP:return"hangup";case y.CANCELED:return"canceled";case y.REJECTED:return"rejected";case y.BUSY:return"busy";case y.FAILED:return"failed";case y.MISSED:return"missed";case y.ANOTHER_DEVICE:return"another_device";case y.REMOVED:return"removed";case y.BANNED:return"banned";case y.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![y.HUNGUP,y.CANCELED,y.REJECTED,y.FAILED,y.BUSY,y.MISSED,y.ANOTHER_DEVICE,y.REMOVED,y.BANNED,y.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;R.logClientStats({name:K.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Ur=class{constructor(){c(this,"_isCallMarked",!1);c(this,"_isFinished",!1);c(this,"_callType",null)}markAcceptCall(r){this.mark(r==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(r){r==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(r){r==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(r){r==="SERVER"&&this.mark("server_join_server")}mark(r){this._isCallMarked||(this._isCallMarked=!0,this._callType=r,pe.setMark(K.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&ge.logEventualStat({name:K.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var lc=1e3,pc=1e4;var uc=15,z=class z extends oe{constructor(e,t){super();c(this,"_api");c(this,"_signaling");c(this,"_signalingActor");c(this,"_mediaSource",null);c(this,"_conversation",null);c(this,"_myLastRequestedLayouts",{});c(this,"_state","IDLE");c(this,"_participantState",Q.CALLED);c(this,"_participants",{});c(this,"_pendingParticipants",new Map);c(this,"_transport",null);c(this,"_debugInfo",null);c(this,"_volumesDetector",null);c(this,"_speakerDetector",null);c(this,"_localVolumeDetector",null);c(this,"_specListener",null);c(this,"_activeSpeakerId",null);c(this,"_lastSignalledActiveSpeakerId",null);c(this,"_isRealTimeAsrRequested",!1);c(this,"_serverSettings",An());c(this,"_onUnload");c(this,"_audioOutput");c(this,"_lastStalled",{});c(this,"_audioMixStalled",!1);c(this,"_audioFix",null);c(this,"_streamByStreamId",new Map);c(this,"_streamIdByStreamDescription",new Map);c(this,"_streamWaitTimerByStreamDescription",new Map);c(this,"_sequenceNumberByStreamDescription",new Map);c(this,"_cooldownTimestampByStreamDescription",new Map);c(this,"_cooldownQueueCleanupTimer",null);c(this,"_statFirstMediaReceived");c(this,"_changeMediaSettings",I.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(t){if(d.warn("changeMediaSettings failed with error",t),t.message==="chatRoom.maxShareCountExceeded")return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100));R.create(e,t),R.setConversationIdProvider(()=>this._conversation?.id||null),ge.create(),st.create(()=>this._transport?.getTopology()),ht.create(),_t.create(),this._api=e,this._signaling=new Wt,this._signalingActor=new Or(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?y.CANCELED:y.HUNGUP),l.clientEventsLoggingEnabled&&R.logClientEvent({event_type:K.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),R.destroy(),ge.destroy(),st.destroy(),ht.destroy(),_t.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new Ur,this._audioOutput=new xi(this._statFirstMediaReceived),l.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),lc))}static current(){return z._current}static hangupAfterInit(){z._activationMutex&&!z._current&&(z._delayedHangup=!0)}static id(){return z._current?._conversation?.id||null}async onStart({opponentIds:e,opponentType:t,mediaOptions:i,payload:a="",joiningAllowed:s=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:u,externalIds:p,onFastStart:m}){if(z._activationMutex)throw R.log(D.ERROR,"startCall"),d.warn("Conversation: there is already running activation"),new j(y.FAILED);let h=Date.now();z._activationMutex=!0,Ne.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let E=this._mediaSource.getMediaSettings();t===ct.CHAT||e&&e.length>1?this._logWithMediaSettings(D.OUTGOING_MULTIPARTY_CALL,E):this._logWithMediaSettings(D.OUTGOING_CALL,E);let C=await this._startConversation({opponentIds:e,opponentType:t,direction:Te.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:o,onlyAdminCanShareMovie:u,externalIds:p,startedTime:h,onFastStart:m});if(!this._conversation)throw new j(y.UNKNOWN_ERROR);if(this._participantState=Q.ACCEPTED,this._changeMediaSettings(E),await this._processConnection(C),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),z._delayedHangup)throw new j(y.CANCELED);return d.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:i}),await this._processConnectionSharedMovieInfo(C),await this._processConversationUrlSharingInfo(C),v.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants()),await this._onConversationParticipantListChunk(C),await this._processPinnedParticipants(C),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),z._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(E){throw this._close(E,"Unable to start conversation"),E}finally{z._activationMutex=!1}}async onJoin(e){if(z._activationMutex)throw R.log(D.ERROR,"joinCall"),d.warn("Conversation: there is already running activation"),new j(y.FAILED);let t=Date.now();z._activationMutex=!0,this._state="PROCESSING",Ne.startSession();try{let i=!!e.observedIds?.length;if(i&&l.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new j(y.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new j(y.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a),this._conversation.waitForAdmin||this._conversation.waitingHall?(d.log(this._conversation.waitForAdmin?"Wait for admin":"In waiting hall"),z._current=this,z._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus(this._conversation.waitForAdmin?"WAIT_FOR_ADMIN":"WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(i){throw z._activationMutex=!1,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){d.debug("Join conversation part 2"),z._activationMutex=!0;try{if(this._participantState=Q.ACCEPTED,!this._conversation||!this._mediaSource)throw new j(y.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(e),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state==="CLOSE")return this._conversation;if(z._delayedHangup)throw new j(y.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),t),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),z._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{z._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=ae.USER,i,a,s){if(z._activationMutex)throw d.warn("Conversation: there is already running activation"),new j(y.REJECTED);z._activationMutex=!0;try{let o=Date.now();this._logCallInitEvent(Te.INCOMING);let u=await this._prepareConversation(e,t,i,a,s);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new j(y.UNKNOWN_ERROR);if(!u.conversation.participants.find(m=>m.state===Q.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),R.log(D.PUSH,"rejected"),new j(y.REJECTED);if(Ne.startSession(),await this._processConnection(u),this._extractConnectionUrlSharingInfo(u),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(u),this._signaling.readyToSend(),this._logCallStartEvent(o,Te.INCOMING),R.log(D.PUSH,"accepted"),z._current=this,z._delayedHangup)throw new j(y.CANCELED);z._activationMutex=!1}catch(o){throw z._activationMutex=!1,this._close(o,"Unable to handle inbound call push"),o}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(et.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(et.WAIT_FOR_ADMIN),i=e.conversation.options.includes(et.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(et.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new j(y.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.ACCEPT_CONCURRENT,e),d.debug("Concurrent call",{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.getMediaSettings()),v.onCallAccepted(),this._state="ACTIVE",this._participantState=Q.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}async _getMainRoomParticipants(){let e=await this._getParticipants();return I.mapSharedParticipants(Object.values(e).filter(t=>!t.isInRoom))}_decodeExternalConversationParams(e){let[t,i]=e.split(":"),a=parseInt(t,10);if(isNaN(a))throw new Error("Invalid original length in prefix");let s=atob(i),o=new Uint8Array(s.length);for(let u=0;u<s.length;u++)o[u]=s.charCodeAt(u);try{let p=ns(o,a).reduce((Ce,Pe)=>(Ce+=String.fromCharCode(Pe),Ce),""),{srcp:m,stne:h,tkn:E,trne:C,trnp:M,trnu:H,wse:q,wte:de}=JSON.parse(p);return{token:E,endpoint:q,wt_endpoint:de,turn_server:{urls:C.split(","),username:H,credential:M},stun_server:{urls:h.split(",")},client_type:m}}catch(u){throw this._close(u,"Can't decompress conversation params"),u}}_logCallInitEvent(e){let t={[Te.OUTGOING]:"outgoing",[Te.INCOMING]:"incoming",[Te.JOINING]:"join"};ge.logEventualStat({name:K.CALL_INIT,source:t[e]})}_logCallStartEvent(e,t){let i={[Te.OUTGOING]:"outgoing",[Te.INCOMING]:"incoming",[Te.JOINING]:"join"};ge.logEventualStat({name:K.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw R.log(D.ERROR,"acceptIncoming"),d.error("Unable to accept a call - invalid state"),new Error("Unable to accept a call - invalid state");if(!this._mediaSource||!this._conversation||!this._transport)throw new j(y.UNKNOWN_ERROR);this._state="PROCESSING",d.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=Q.ACCEPTED;let i=this._getMuteStatesForCurrentRoom(),a=Object.keys(i);a.length&&this._onMuteParticipant({muteStates:i,mediaOptions:a,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());if(s.rooms?.rooms){let u=await this._getParticipants();s.rooms.rooms.forEach(p=>{p.participantIds?.forEach(m=>{u[m]&&(u[m].isInRoom=!0)})})}this._conversation.roomId=s.rooms?.roomId||null;let o=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(v.onCallAccepted(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),o),l.useParticipantListChunk){let u=await this._getInitialParticiapntListChunk(),p=await this._getParticipants();u?.participants?.forEach(m=>{let h=I.composeId(m),E=p[h];E&&(E.movieShareInfos=m.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:u})}return v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0),await this._processConversationUrlSharingInfo(),await this._processConnectionAsrInfo(),this._conversation}catch(t){throw this._close(t,"Unable to accept call"),t}}async decline(){if(this._state!=="IDLE")throw R.log(D.ERROR,"declineIncoming"),d.error("Unable to decline a call - invalid state"),new Error("Unable to decline a call - invalid state");this._state="PROCESSING",d.debug("Decline incoming call"),this._logWithMediaSettings(D.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=Q.HUNGUP,this._signaling.ready&&await this._signaling.hangup(y.REJECTED),this._close(new j(y.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?y.HUNGUP:y.CANCELED;R.log(D.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new j(e))):v.onHangup(new j(y.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new j(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map(J.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;if(!s&&i.rejectedParticipants)throw new Error(i.rejectedParticipants[0].reason);for(let o of s)await this._onAddParticipant(I.composeId(o),o,a)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new j(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipantLegacy(e,t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;for(let o of s)await this._onAddParticipant(I.composeId(o),o,a)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let i=[];for(let a of e)(a.state===Q.CALLED||a.state===Q.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===Q.ACCEPTED&&i.push(a.id);i.length?this._transport.open(i,null,!!this._conversation?.observer):this._transport.getTopology()==="SERVER"&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&d.error(t,e),d.debug("Close conversation",e),Lr.sendHangupEvent(e,this._transport?.getTopology()),st.destroy(),ht.logMetrics(this._transport?.getTopology()),ht.destroy(),_t.logMetrics(this._transport?.getTopology()),_t.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(y.FAILED):R.log(D.ERROR,e.hangup),z._activationMutex=!1;let i=this._conversation&&this._conversation.id;if([y.CANCELED,y.NOT_FRIENDS,y.CALLEE_IS_OFFLINE,y.CALLER_IS_BLOCKED,y.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===y.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===y.SOCKET_CLOSED||e.hangup===y.NOT_FOUND)&&z._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===y.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state="CLOSE",this._participantState=Q.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),R.destroy(),ge.destroy(),this._conversation=null,this._myLastRequestedLayouts={},z._current=null,z._delayedHangup=!1,v.onHangup(e||new j(y.UNKNOWN_ERROR),i)}async destroy(){let e=this._conversation&&this._conversation.id;d.debug("Destroy conversation",{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state="CLOSE",this._participantState=Q.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._cleanupListeners(),R.destroy(),ge.destroy(),this._conversation=null,this._myLastRequestedLayouts={},z._current=null,z._delayedHangup=!1}async _getConversationParams(e){let t=await this._api.getConversationParams(e);d.debug("Api.getConversationParams",t);let i=[],{turn_server:a,stun_server:s}=t;if(s&&i.push(s),a&&a.urls){let o=a.urls.filter((u,p,m)=>m.indexOf(u)===p);o.push(`${o[o.length-1]}?transport=tcp`),i.push({urls:o,username:a.username,credential:a.credential})}return l.iceServers=i,l.wssBase=t.endpoint,t.wt_endpoint&&(l.wtsBase=t.wt_endpoint),l.wssToken=t.token,t.client_type&&(l.clientType=t.client_type),t.external_user_type&&(l.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:i,wt_endpoint:a,token:s,client_type:o}){let u=[];if(t&&u.push(t),e&&e.urls){let p=e.urls.filter((m,h,E)=>E.indexOf(m)===h);p.push(`${p[p.length-1]}?transport=tcp`),u.push({urls:p,username:e.username,credential:e.credential})}l.iceServers=u,l.wssBase=i,l.wssToken=s,a&&(l.wtsBase=a),o&&(l.clientType=o)}_addGeoParamsToEndpoint(e,t){return t.isp_as_no&&(e+=`&ispAsNo=${t.isp_as_no}`),t.isp_as_org&&(e+=`&ispAsOrg=${t.isp_as_org}`),t.loc_cc&&(e+=`&locCc=${t.loc_cc}`),t.loc_reg&&(e+=`&locReg=${t.loc_reg}`),e}async _startConversation({opponentIds:e,opponentType:t,direction:i,mediaOptions:a,payload:s="",joiningAllowed:o=!1,requireAuthToJoin:u=!1,onlyAdminCanShareMovie:p,externalIds:m,startedTime:h,onFastStart:E}){pe.setMark(K.SIGNALING_CONNECTED),this._logCallInitEvent(Te.OUTGOING);let C=I.uuid();d.debug("Conversation: start",{conversationId:C,opponentIds:e,opponentType:t,direction:i});let M=a.includes(ce.VIDEO),H;if(E){let de={deviceId:this._api.deviceId(),sdkVersion:l.sdkVersion,clientAppKey:l.apiKey,platform:l.platform,protocolVersion:l.protocolVersion,domainId:l.domain,capabilities:ot.getFlags()},Ce=JSON.stringify(de),Pe;try{if(Pe=await E({internalParams:Ce,conversationId:C,externalIds:m,opponentType:t,mediaOptions:a,isVideo:M,joiningAllowed:o,requireAuthToJoin:u}),!Pe.internalCallerParams)throw new j(y.FAST_START_ERROR,{message:JSON.stringify(Pe)})}catch(Y){throw Y instanceof Error?new j(y.FAST_START_ERROR,{message:Y.message}):new j(y.FAST_START_ERROR,{message:String(Y)})}try{let Y=JSON.parse(Pe.internalCallerParams);H={endpoint:Y.endpoint,wt_endpoint:Y.wtEndpoint,id:C,is_concurrent:Y.isConcurrent,client_type:Y.clientType,rejected_participants:Pe.rejectedParticipants?.map(ye=>({...ye,status:ye.status})),stun_server:Y.stun,turn_server:Y.turn,token:new URL(Y.endpoint).searchParams.get("token")??""},d.debug("FastStart",H)}catch{throw new j(y.UNKNOWN_ERROR,{message:"Cannot parse internal params"})}}else H=await this._api.startConversation(C,e,t,M,s,o,u,{onlyAdminCanShareMovie:p},m),d.debug("Api.startConversation",H);this._setConversationParams(H);let q=await this._connectSignaling(Ke.START,H);return await this._setConversation(H,q,i),this._logCallStartEvent(h,Te.OUTGOING),q}async _joinConversation(e,t){pe.setMark(K.SIGNALING_CONNECTED),this._logCallInitEvent(Te.JOINING);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:o,observedIds:u,payload:p}=e;d.debug("Conversation: join",{conversationId:i,joinLink:o,observedIds:u});let m=a.includes(ce.VIDEO),h;if(i)h=await this._api.joinConversation(i,m,s);else if(o)h=await this._api.joinConversationByLink(o,m,u,p);else throw new j(y.UNKNOWN_ERROR);d.debug("Api.joinConversation",h),this._setConversationParams(h);let E=await this._connectSignaling(Ke.JOIN,h);return await this._setConversation(h,E,Te.JOINING),this._logCallStartEvent(t,Te.JOINING),E}async _prepareConversation(e,t=ae.USER,i,a,s){pe.setMark(K.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let o=this._api.getUserId();if(!o)throw new j(y.UNKNOWN_ERROR);let u=0,p="",m="",h={id:e,peerId:i,endpoint:p,wt_endpoint:m,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let C=this._decodeExternalConversationParams(a);this._setConversationParams(C),p=s??`${l.wssBase}?userId=${o}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,h.token=C.token,h.endpoint=p,l.wtsBase&&(m=`${l.wtsBase}?userId=${o}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,h.wt_endpoint=m)}else{let C=await this._getConversationParams(e);u=C.device_idx||0,p=s??`${l.wssBase}?userId=${o}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,p=this._addGeoParamsToEndpoint(p,C),h.token=C.token,h.endpoint=p,h.device_idx=u,l.wtsBase&&(m=`${l.wtsBase}?userId=${o}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,m=this._addGeoParamsToEndpoint(m,C),h.wt_endpoint=m)}let E=await this._connectSignaling(Ke.ACCEPT,h);return z._current&&(z._current._participantState===Q.ACCEPTED||z._current._participantState===Q.CALLED)?(d.log("Push rejected (busy)"),R.log(D.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(y.BUSY),Promise.reject(new j(y.BUSY))):(z._current&&(z._current.destroy(),z._current=null),await this._setConversation(h,E,Te.INCOMING,t),E)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:Me(),participantState:{},state:Q.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return i.externalId||(i.externalId=await this._getParticipantId(t??i.id)),this._api.cacheExternalId(t??i.id,i.externalId),t&&this._api.mapDecorativeId(t,i.id),i.observedIds?.length&&(i.externalId.observer=!0),e.markers&&(i.markers=this._denormalizeMarkers(i.id,e.markers)),i}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new j(y.NETWORK_ERROR),t),t}}async _setConversation(e,t,i,a=ae.USER){let{participants:s}=t.conversation;s.forEach(h=>{let E=I.composeId(h),C=J.fromSignalingParticipant(h,!1);if(C){this._api.cacheExternalId(E,C);let M=I.composeDecorativeId(h),H=J.fromSignalingParticipant(h);M&&H&&(this._api.cacheExternalId(M,H),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let o=this._api.getUserId(),u=this._extractLocalParticipantFromConnection(t),p=e.device_idx||0;if(!o){if(!u)throw new j(y.UNKNOWN_ERROR);o=Number(u.id),u.idType&&(a=u.idType),u.deviceIdx&&(p=u.deviceIdx),this._api.setUserId(o)}let m=I.composeParticipantId(o,a,p);this._conversation={userId:o,compositeUserId:m,externalId:await this._getExternalIdByParticipantId(m),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||"DIRECT",direction:i,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:u?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},Ne.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(l.forceRelayPolicy=e.p2p_forbidden),R.log(D.RELAY_POLICY,l.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new j(y.UNKNOWN_ERROR);this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||"DIRECT",this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1}_createMediaSource(){let e=new Yi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new oi(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,we.NOTIFICATION,a=>this._signalingActor.add(a)),this.subscribe(this._signaling,we.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,we.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return ge.logEventualStat({name:K.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(Ar.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&v.onConversationParticipantListChunk(await this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{...{participants:[],countBefore:0,countAfter:0,markerFound:!1},...e}}async _participantListChunkToExternalChunk(e){let t=await this._getParticipants(),i=I.mapSharedParticipants(e.participants.reduce((a,s)=>{let o=I.composeId(s);return t[o]&&a.push(t[o]),a},[]));return{...e,participants:i}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let i of t)await this._registerParticipants(i?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let i=e[0]?.externalId?.type;i&&(l.externalUserType=i);let a=await this._getParticipants();for(let s of e){let o=I.composeId(s);if(d.test("Conversation:RegisterParticipant",o),this._isMe(o)){this._conversation.roles=s.roles||[],this._conversation.roles.length&&(d.debug(`Local roles changed: ${s.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(s);continue}if(s.state===Q.HUNGUP||s.state===Q.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],y.HUNGUP);continue}let u=I.composeDecorativeId(s);this._registerParticipant({id:o,externalId:J.fromSignalingParticipant(s),mediaSettings:Me(s.mediaSettings),participantState:I.mapParticipantState(s),state:s.state,roles:s.roles||[],status:"WAITING",muteStates:s.muteStates||{},unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(o,s.markers),movieShareInfos:s.movieShareInfos,isInRoom:t},u);let p=await this._getParticipant(o);p&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${o}] changed: ${s.roles}`),v.onRolesChanged(p.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=kr(e,je.MUTE),s=kr(e,je.MUTE_PERMANENT);for(let o of[a,s])o.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:o,stateUpdated:!0})};I.setImmediate(()=>i().catch(a=>d.error(a)))}_getStatusByTransportState(e){let t=null;return e==="CONNECTED"?t="CONNECTED":e==="CONNECTING"||e==="OPENED"?t="CONNECTING":e==="RECONNECTING"&&(t="RECONNECT"),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let i=(await this._getParticipants())[e];if(i)return i;let a=this._api.getDecorativeIdByInitialId(I.decomposeId(e).id),s=a?I.composeUserId(a):void 0;return this._createParticipant({id:e},s)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(l.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let i=await this._getParticipantId(e);return this._api.cacheExternalId(e,i),i}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(l.useParticipantListChunk){let a=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return a.markers=this._denormalizeMarkers(a.id,t),a}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){d.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let i=Object.values(t).find(a=>"ts"in a&&"rank"in a);return Object.entries(t).reduce((a,[s,o])=>(a[s]={...i,...o,id:e},a),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let i=ts(e);this._setMuteStatesForRoomId(i,null);for(let u of e.rooms?.rooms??[])this._setMuteStatesForRoomId(u.muteStates,u.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=as(e,a));let s=Object.keys(a),o=this._conversation?.roomId;s.length&&this._onMuteParticipant({muteStates:a,mediaOptions:s,muteAll:!0,stateUpdated:!0,roomId:o},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}async _processPinnedParticipants(e){e.conversation.pinnedParticipantId?await this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?await this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}async _allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new Cr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Ni,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===Te.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let i of Object.values(t))(i.state===Q.ACCEPTED||i.state===Q.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new xr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new Nr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Li(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Ui(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=b.getCameras().length,t=b.getMicrophones().length;d.debug("Cameras: "+e+(b.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(b.hasMicrophonePermission()?"✔":"✖")),R.log(D.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){R.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}async _removeParticipant(e,t){if(e.state===Q.CALLED||e.state===Q.ACCEPTED||this._state==="CLOSE")return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let i=await this._getParticipants();if(i[e.id]){t===y.HUNGUP?this._setParticipantsStatus([e],"HANGUP"):this._setParticipantsStatus([e],"ERROR",t),e.mediaSource?.disconnect(),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[a,s]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(a),this._sequenceNumberByStreamDescription.delete(a),this._cooldownTimestampByStreamDescription.delete(a),this._streamWaitTimerByStreamDescription.has(a)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(a)),this._streamWaitTimerByStreamDescription.delete(a)),this._sendUpdateDisplayLayout({[a]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete i[e.id],v.onRemoteRemoved(e.externalId,e.markers)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener("unload",this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(t=>t.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(t=>t.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){d.debug("cleaning up participant-agnostic streams"),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(t=>{t.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_cleanupSignaling(){this._signaling.close(),this._signaling.cleanup()}async _onAddParticipant(e,t,i){d.debug(`Add new participant [${e}]`);let a=await this._getParticipant(e);if(a&&(a.state===Q.ACCEPTED||a.state===Q.CALLED)){d.warn(`Participant [${a.id}:${a.state}] is already in conversation`);return}if(!a){let s=I.composeDecorativeId(t);this._registerParticipant({id:e,externalId:J.fromSignalingParticipant(t),mediaSettings:Me(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s),a=await this._getParticipant(e)}this._setParticipantsStatus([a],"WAITING"),i?(a.state=Q.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=Q.CALLED,this._transport.allocate(a.id,!0),R.log(D.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=uc;a++){let s=I.compose(e,a),o=i[s];o&&t.push(o)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let a of t)this._transport.close(a.id);R.log(D.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(se.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(se.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(se.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,i=null){if(!this._transport||!this._conversation)return;let a=!t,s=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let o=i??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:o,isMe:a});return}this._transport.setAnimojiSvg(s,{svg:e,isMe:a})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return R.log(D.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return R.log(D.MEDIA_STATUS,e?"audio_1":"audio_0"),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},i={};for(let s of e){let o=typeof s.uid=="object"?s.uid:J.fromId(s.uid),u=J.toString(o);i[u]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let o=J.toString(s.externalId);Object.hasOwn(i,o)&&(t[s.id]=i[o])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[i,a]of Object.entries(e))if(i.length>5||a.length>5)throw new Error("key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded");t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[at(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready)return;d.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},i=await this._getParticipants();for(let s of e){let o=typeof s.uid=="object"?s.uid:J.fromId(s.uid),u=this._api.getCachedOkIdByExternalId(o);if(!u){let h=J.toString(o);d.log(`Unknown participant external ID ${h}`);continue}let p=at({participantId:u,mediaType:s.mediaType,streamName:s.streamName}),m=i[u];m?m.lastRequestedLayouts[p]=s:this._isMe(u)&&(this._myLastRequestedLayouts[p]=s),ii(s)?(this._isMe(u)&&delete this._myLastRequestedLayouts[p],this._streamIdByStreamDescription.has(p)&&!this._cooldownTimestampByStreamDescription.has(p)&&this._cooldownTimestampByStreamDescription.set(p,Date.now())):(this._cooldownTimestampByStreamDescription.delete(p),!this._streamIdByStreamDescription.has(p)&&l.videoTracksCount>0&&this._streamIdByStreamDescription.set(p,null),t[p]=s),s.mediaType==="SCREEN"&&!ii(s)&&pe.setMark(pe.getMarkNameScreenshareFirstFrame(u))}let a=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>l.videoTracksCount;){let s=a.next();if(s.done){d.error("Cannot accommodate all streaming requests: tracks available "+l.videoTracksCount+"; requested streams: "+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(s.value),t[s.value]={stopStream:!0}}this._transport?.getTopology()==="SERVER"&&await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,i){if(this._conversation)if(!l.clientEventsLoggingEnabled)this._api.sendUserFeedbackStats(this._conversation.id,e,t,i);else{let a={event_type:K.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),R.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};R.logClientEvent(a,i)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(d.log("Client asked to stop streaming before stream became available",e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let i=await this._getParticipants(),a=ri(e),s=i[a.participantId],o=this._conversation?.externalId,u=this._isMe(a.participantId);if(s||u){switch(a.mediaType){case"STREAM":case"MOVIE":{if(a.streamName){let p={stream:null,streamName:a.streamName,mediaType:a.mediaType};u?v.onLocalLive(o,p):v.onRemoteLive(s.externalId,p)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null);break}}R.log(D.PAT_DEALLOCATED)}else d.log(`Cannot find participant to stop streaming: ${a.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;d.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let i;try{if(i=await this._signaling.updateDisplayLayout(e),!i)return}catch(o){if(d.warn(`Failed to update display layout ${JSON.stringify(e)}. ${o}`),t)throw o;return}let a=[],s=await this._getParticipants();for(let[o,u]of Object.entries(i.errorCodeByParticipantId||{})){let p=ri(o),m=s[p.participantId];if(m){let h;typeof u!="number"?(d.warn(`Unexpected error code ${u} received for participant ${p.participantId}`),h=Yn.UNKNOWN_ERROR):h=Qn(u),a.push({externalId:m.externalId,errorReason:h})}}if(a&&a.length&&(d.warn("Could not allocate one or more participants",a),t))throw new Ra("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]+pc>Date.now())break;let o=a[0];await this._stopStreaming(o),e[o]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;d.log("Received participant sources update notification",t);for(let i of t)this._waitForStreamIfNeeded(i)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(d.log("Promoted in audience mode",!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(d.log("Promoted in waiting hall",!e.demote),e.demote?(d.log("Kicked from waiting hall"),this._close(new j(y.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),v.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,i=[],a,s){d.log(`Chat room updated: ${e}`);let o=[],u=[],p=[],m=[],h=[];if(i.length&&i.forEach(M=>{if(M.externalId){let H=J.fromSignaling(M.externalId);h.push(H),this._api.cacheExternalId(M.id.id,H)}else{let H=I.decomposeId(M.id.id).id;o.push(H),m.push(H)}}),a?.length&&a.forEach(M=>{let H=I.decomposeId(M).id;o.push(H),u.push(H)}),s?.length&&s.forEach(M=>{let H=I.decomposeId(M).id;o.push(H),p.push(H)}),!o.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let M=await this._api.getExternalIdsByOkIds(m);h.push(...M)}let E=await this._api.getExternalIdsByOkIds(u),C=await this._api.getExternalIdsByOkIds(p);v.onChatRoomUpdated(e,t,h,E,C)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let i of e.data)if(this._isMe(i.participantId))v.onLocalLiveUpdate(t,i);else{let s=await this._getExternalIdByParticipantId(i.participantId);s&&v.onRemoteLiveUpdate(s,i)}}async _onSharedMovieInfoStarted(e){d.log(`Shared movie started data received: ${e.notification}`),await this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}async _processSharedMovieInfos(e,t=null){e&&await Promise.all(e.map(i=>this._processSharedMovieInfo(i,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let i=this._conversation?.externalId;if(this._isMe(e.initiatorId))v.onLocalSharedMovieInfo(i,e,t);else{let s=await this._getExternalIdByParticipantId(e.initiatorId);s&&v.onRemoteSharedMovieInfo(s,e,t)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(i=>this._isMe(I.composeId(i)));await this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}async _processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let s of e.rooms.rooms)s.asrInfo&&this._conversation?.asrInfoByRoom.set(s.id,s.asrInfo);let i=e?.rooms?.roomId??this._conversation?.roomId??null,a=this._conversation?.asrInfoByRoom.get(i);if(a){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onAsrSet({externalId:s,movieId:a.movieId},i)}else i&&v.onAsrSet(null,i)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,i=this._conversation.roomId,a=t.get(i);if(a&&!this._isMe(a.initiatorId)){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onRemoteSharedUrl(s,a.sharedUrl,i)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let i of e.rooms.rooms)i.urlSharingInfo?t.set(i.id,i.urlSharingInfo):t.delete(i.id)}async _onSharedMovieInfoStopped(e){d.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:i,movieId:a,source:s,roomId:o=null}=e,u={initiatorId:i,movieId:a,source:s};if(this._isMe(i))v.onLocalSharedMovieStoppedInfo(t,u,o);else{let m=await this._getExternalIdByParticipantId(i);if(m){let E=(await this._getParticipants())[i];E?.movieShareInfos&&(E.movieShareInfos=E.movieShareInfos.filter(C=>C&&C.movieId!==a)),v.onRemoteSharedMovieStoppedInfo(m,u,o)}}}async _onUrlSharingInfoUpdated(e){if(d.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:i}=this._conversation,{initiatorId:a,sharedUrl:s,roomId:o=null}=e;if(s?t.set(o,{sharedUrl:s,initiatorId:a}):t.delete(o),!(!s&&o!==i&&t.has(i))&&(!s||!this._isMe(a))){let u=await this._getExternalIdByParticipantId(a);u&&v.onRemoteSharedUrl(u,s,o)}}_onFeaturesPerRoleChanged(e){d.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),v.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let h=this._getStreamDescriptionById(e.streamId);if(h){let E=ri(h),C=await this._getParticipant(E.participantId);v.onRemoteScreenStream(C.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(l.producerScreenDataChannel&&i==="SCREEN"&&!e.fastScreenShare){d.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let o=at(t),u=this._sequenceNumberByStreamDescription.get(o);if(u&&u>e.sequenceNumber){d.warn(`Participant ${a} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${u}`),R.log(D.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&i&&(d.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(s.externalId,i,e.suspend));let p=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(p,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(o);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){R.log(D.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let C=E?h:s.externalId,M=this._streamByStreamId.get(p);if(!M){R.log(D.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${p}`);return}R.log(D.PAT_ALLOCATED),this._streamIdByStreamDescription.set(o,p);let H=e.participantStreamDescription?.mediaType;if(H==="STREAM"||H==="MOVIE"){if(e.participantStreamDescription?.streamName){let q={streamName:e.participantStreamDescription.streamName,stream:M,mediaType:H};E?v.onLocalLive(C,q):v.onRemoteLive(C,q)}}else if(l.producerScreenTrack&&H==="SCREEN")v.onRemoteScreenStream(s.externalId,M);else if(!E){let q=(l.producerScreenTrack?null:s.secondStream)||M;v.onRemoteStream(s.externalId,q)}}else{d.debug(`Waiting for ${m} until stream ${p} for ${o} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),m);this._streamWaitTimerByStreamDescription.set(o,h)}}_getStreamDescriptionById(e){for(let[t,i]of this._streamIdByStreamDescription.entries())if(i===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(at(e)))return e;let t=e.participantId;if(e.mediaType){let i={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(at(i)))return i}else{let i={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(at(i)))return i;let a={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(at(a)))return a}return d.error("Received unrequested allocation",e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw new Error("transport is not initialized")}_isCallAdmin(){return this._conversation?I.includesOneOf(this._conversation.roles,[gt.ADMIN,gt.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!I.includesOneOf(this._conversation.roles,[gt.ADMIN,gt.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===Q.CALLED}async grantRoles(e,t,i){this._checkAdminRole(),await this._signaling.grantRoles(e,t,i)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,i=[],a=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,i,a)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,i=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,i),this._conversation?.pinnedParticipantIdByRoom.set(i,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Kn(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=es(e),a)){let m=this._api.getDecorativeIdByInitialId(a.id);a.id=m?I.composeUserId(m):a.id}let s=await this._signaling.getWaitingHall(a,t,i);if(s.error)return Promise.reject(s.message);let o=s.participants||[],{externalIds:u}=await this._resolveWaitingHallExternalIds(o),p=null;return o.length&&s.hasMore&&(p=Zn(o[o.length-1].id)),{participants:u,pageMarker:p,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,i=[],a=[];if(e.length){let s=[];e.forEach(o=>{if(t.set(o.id.id,o.id.addedTs),o.externalId){let u=J.fromSignaling(o.externalId);i.push(o.id.addedTs),a.push(u),this._api.cacheExternalId(o.id.id,u)}else s.push(I.decomposeId(o.id.id).id)}),s.length&&!a.length&&(a=await this._api.getExternalIdsByOkIds(s),i=a.map(o=>{let u=this._api.getCachedOkIdByExternalId(o);return(u?t.get(u):void 0)||Date.now()}))}return{externalIds:a,timestamps:i}}async getAudienceModeHands(){if(!this._signaling.ready)throw new Error("Signaling is not ready");let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:i,timestamps:a}=await this._resolveWaitingHallExternalIds(t);return{timestamps:a,participants:i,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!I.includesOneOf(this._conversation.options,[et.WAITING_HALL,et.AUDIENCE_MODE]))throw new Error("Unable to promote a participant in the conversation with current options");if(this._checkAdminRole(),!e&&t)throw new Error("participantId is required");await this._signaling.promoteParticipant(e,t)}catch(i){throw d.warn(`Failed to promote participant ${e}. ${i}`),i}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let i=t.messages.length-1;i>=0;i--){let a=t.messages[i];await this._onChatMessage(a)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let t=(await this._api.createJoinLink(this._conversation.id)).join_link;if(t)return this._conversation.joinLink=t,t}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:i,lang:a}){let s={movieId:e,lang:a};(t||t===0)&&(s.gain=t),i&&(s.metadata=i);let o=await this._signaling.addMovie(s);if(o.error)throw new Error(o.error);return{movieId:o.movieId,streamType:o.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw new Error(t.error)}async removeMovie(e){let t={movieId:e},i=await this._signaling.removeMovie(t);if(i.error)throw new Error(i.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw new Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw new Error(e.error)}async updateRooms(e,t){let i=await this._signaling.updateRooms(e,t);if(i.error)throw new Error(i.error)}async activateRooms(e,t){let i=await this._signaling.activateRooms(e,t);if(i.error)throw new Error(i.error)}async switchRoom(e,t){let i=await this._signaling.switchRoom(e,t);if(i.error)throw new Error(i.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw new Error(t.error)}async startStream(e=!1,t=null,i=null,a="DIRECT_LINK",s=null,o=null){let u={movieId:i,name:t,privacy:a,groupId:s,roomId:o,streamMovie:!e},p=await this._signaling.startStream(u);if(p.error)return Promise.reject(p.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async recordSetConf(e,t,i=!1,a=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:i,roomId:a});if(s.error)throw new Error(s.error)}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<l.videoMinWidth||e.height<l.videoMinHeight)throw new Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<l.videoMinWidth||t.height<l.videoMinHeight)throw new Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");l.videoEffectMaxHeight=t.height,l.videoEffectMaxWidth=t.width}l.videoMaxWidth=e.width,l.videoMaxHeight=e.height,d.debug("Set local video resolution:",`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:"")),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(t=>({id:t.id,type:l.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),i=await this._signaling.getParticipants(t);if(i.error)throw new Error(i.error);let a=i.participants,s=this._transport?.getState();return Promise.all(a.map(async o=>{let u=I.composeId(o);return this._createParticipant({id:u,externalId:J.fromSignalingParticipant(o),mediaSettings:Me(o.mediaSettings),participantState:I.mapParticipantState(o),state:o.state,roles:o.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:o.muteStates||{},unmuteOptions:o.unmuteOptions||[],observedIds:o.observedIds||[],markers:this._denormalizeMarkers(u,o.markers)},o.decorativeUserId)})).then(I.mapSharedParticipants)}async getParticipantListChunk(e){d.log("Request participant list chunk",e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw new Error(t.error);let i=this._createParticipantListChunk(t.chunk),a=await this._getParticipants(),s=i.participants.filter(u=>{let p=I.composeId(u);return!a[p]});await this._registerParticipants(s);let o=this._transport?.getState();return i.participants.forEach(u=>{let p=I.composeId(u),m=a[p];m.status=this._getStatusByTransportState(o)??"WAITING",m.movieShareInfos=u.movieShareInfos,Object.assign(m.mediaSettings,Me(u.mediaSettings)),Object.assign(m.muteStates,u.muteStates),m.unmuteOptions=u.unmuteOptions??m.unmuteOptions,this._openTransport([m],!0)}),this._participantListChunkToExternalChunk(i)}async _getInitialParticiapntListChunk(){let e=l.participantListChunkInitIndex,t=l.participantListChunkInitCount,a=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return d.debug("Get initial participant list chunk",a.chunk),a.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new oi(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();if(d.log("Screen sharing changed",e.track,t),l.consumerScreenTrack){let i=e.track?new MediaStream([e.track]):null;v.onScreenStream(i,t)}}async _changeRemoteMediaSettings(e,t){d.debug(`Remote media settings changed [${e}]`,t);let i=this._conversation?.externalId;if(this._isMe(e)&&i){v.onLocalMediaSettings(i,t);return}let s=await this._getParticipant(e);if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&v.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(a=>a.id===t||I.comparePeerId(a.peerId,e.peerId))}_changeLocalParticipantState(e){d.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){d.debug(`Remote participant state changed [${e}]`,t);let i=await this._getParticipant(e);if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}async _changeMultipleParticipantState(e,t){d.debug("Multiple participants state changed",e);let i=[],a,s=await this._getParticipants();e.forEach((o,u)=>{if(this._isMe(u))a=o;else{let p=s[u];if(!p){this._warnParticipantNotInConversation(u);return}p.participantState=o,i.push({externalId:p.externalId,participantState:{...o},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 U.ACCEPTED_CALL:return this._onAcceptedCall(e);case U.HUNGUP:return this._onHungup(e);case U.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case U.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case U.CLOSED_CONVERSATION:return this._onClosedConversation(e);case U.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case U.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case U.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case U.RATE_CALL_DATA:return this._onNeedRate();case U.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case U.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case U.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case U.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case U.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case U.REGISTERED_PEER:return this._onPeerRegistered(e);case U.SWITCH_MICRO:return this._onMicSwitched(e);case U.CHAT_MESSAGE:return this._onChatMessage(e);case U.CUSTOM_DATA:return this._onCustomData(e);case U.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case U.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case U.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case U.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case U.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case U.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case U.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case U.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case U.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case U.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case U.FEEDBACK:return this._onFeedback(e);case U.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case U.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case U.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case U.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case U.ROOMS_UPDATED:return this._onRoomsUpdated(e);case U.ROOM_UPDATED:return this._onRoomUpdated(e);case U.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case U.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case U.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case U.ASR_STARTED:return this._onAsrStart(e);case U.ASR_STOPPED:return this._onAsrStop(e);case U.PROMOTION_APPROVED:return this._onPromotionApproved(e);case U.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case U.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}v.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),await this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let s=Object.keys(await this._getParticipants()),o=[];for(let p of e.conversation.participants){let m=I.composeId(p),h=p.roles||[];if(this._isMe(m)){Oi(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:rs(p),unmuteOptions:p.unmuteOptions})};continue}o.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:p.id,participant:p,mediaSettings:p.mediaSettings});else{let C=Me(p.mediaSettings);dn(C,E.mediaSettings)||await this._changeRemoteMediaSettings(m,C);let M=I.mapParticipantState(p),H=E.participantState;I.isEqualParticipantState(M,H)||await this._changeRemoteParticipantState(m,M),Oi(h,E.roles)||this._onRolesChanged(E.id,h)}}let u=await this._getParticipants();for(let p of s)o.indexOf(p)<0&&u[p]&&this._removeParticipant(u[p],y.HUNGUP)}let i=e.rooms?.roomId??null;if(!this._conversation){d.warn("Conversation is empty, but should be filled");return}this._conversation.roomId!==i?await this._onRoomSwitched(i):this._processMuteStates(e,!0),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){d.error("Signaling failed",e),this._close(e)}async _onAcceptedCall(e){let t=I.composeMessageId(e),i=I.getPeerIdString(e.peerId);if(d.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new j(y.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let o=this._api.getDecorativeIdByInitialId(t),u=o?I.composeUserId(o,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Me(e.mediaSettings)},u))}a.state=Q.ACCEPTED,a.mediaSettings=Me(e.mediaSettings),this._logWithMediaSettings(D.ACCEPTED_OUTGOING,a.mediaSettings),this._conversation&&this._conversation.direction===Te.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,ot.parseCapabilities(e.capabilities))}async _onHungup(e){d.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=I.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new j(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let i=await this._getParticipant(t);if(!i){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),i.state=e.reason===y.REJECTED?Q.REJECTED:Q.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,y.HUNGUP)}async _onAddedParticipant(e){d.debug(`Participant added [${e.participantId}]`);let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state!==Q.HUNGUP&&i.state!==Q.REJECTED){d.debug(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:a}=e,s=a.decorativeUserId;this._registerParticipant({id:t,externalId:J.fromSignalingParticipant(a),mediaSettings:Me(a.mediaSettings),state:a.state,participantState:I.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},s),i=await this._getParticipant(t)}i.state=Q.CALLED,i.mediaSettings=Me(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===Q.ACCEPTED){d.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:s}=e,o=s.decorativeUserId;this._registerParticipant({id:t,externalId:J.fromSignalingParticipant(s),mediaSettings:Me(s.mediaSettings),state:s.state,participantState:I.mapParticipantState(s),roles:s.roles||[],muteStates:s.muteStates||{},movieShareInfos:s.movieShareInfos,unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(t,s.markers)},o),i=await this._getParticipant(t)}this._conversation&&this._conversation.direction===Te.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),i.state=Q.ACCEPTED,i.mediaSettings=Me(e.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i);let a=Object.keys(i.muteStates);a.length&&this._onMuteParticipant({muteStates:i.muteStates,mediaOptions:a,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(i.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new j(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=I.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,Me(e.mediaSettings))}async _onParticipantStateChanged(e){let t=I.composeMessageId(e),i=I.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(i):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,i))}async _onParticipantsStateChanged(e){let{participants:t,roomId:i}=e,a=t.map(({id:u,markers:p})=>this._registerParticipantAndSetMarkersIfChunkEnabled(u,p));await Promise.all(a);let s=new Map,o=t.map(({id:u,participantState:p})=>this._getExternalIdByParticipantId(u).then(m=>[u,m&&I.mapParticipantState({participantState:p})]));try{(await Promise.all(o)).forEach(([p,m])=>{m&&s.set(p,m)}),await this._changeMultipleParticipantState(s,i)}catch(u){d.warn(`_onParticipantsStateChanged: Failed to get external ids. ${u}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),v.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),i=Me(e.mediaSettings);t.isAudioEnabled!==i.isAudioEnabled&&await this._mediaSource.toggleAudio(i.isAudioEnabled),t.isVideoEnabled!==i.isVideoEnabled&&await this._mediaSource.toggleVideo(i.isVideoEnabled),l.consumerScreenTrack&&t.isScreenSharingEnabled!==i.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:i.isScreenSharingEnabled,fastScreenSharing:i.isFastScreenSharingEnabled,captureAudio:i.isAudioSharingEnabled})}_onSettingsUpdate(e){d.debug("Got settings update notification",e);let t={camera:e.camera,screenSharing:e.screenSharing,fastScreenSharing:e.fastScreenSharing};this._serverSettings=Ta(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){d.debug("Got video quality update notification",e);let t=Math.round(e.quality.maxBitrate/1024),i=e.quality.maxDimension,a={maxBitrateK:t,maxDimension:i},s;e.mediaType&&e.mediaType==="SCREEN"?s={camera:null,screenSharing:null,fastScreenSharing:Object.assign({},this._serverSettings.fastScreenSharing,a)}:s={camera:Object.assign({},this._serverSettings.camera,a),screenSharing:null,fastScreenSharing:null},this._serverSettings=Ta(this._serverSettings,s),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=I.composeMessageId(e),i=await this._getParticipant(t);i&&(i.clientType=e.clientType,i.platform=e.platform),v.onPeerRegistered()}async _onMicSwitched(e){v.onDeviceSwitched(ce.AUDIO,!e.mute),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)&&!Oi(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:kr(this._getMuteStatesForCurrentRoom(),je.MUTE_PERMANENT),stateUpdated:!0}),I.includesOneOf(t,[gt.ADMIN,gt.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=await this._getParticipant(e);i&&!Oi(i.roles,t)&&(d.debug(`Roles for participant [${e}] changed: ${t}`),i.roles=t,v.onRolesChanged(i.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:i,muteStates:a={},unmuteOptions:s=[],mediaOptions:o=[],roomId:u=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){d.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let p=await this._getParticipant(e.participantId);if(p){d.debug(`Mute states for participant [${e.participantId}] changed`,a);let m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;v.onMuteStates(a,s,o,i,e.unmute,p.externalId,m,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,u):i||(this._conversation.muteStatesPersonal=a)),e.adminId&&this._isMe(e.adminId)){i&&v.onMuteStates(a,s,o,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:o,muteAll:i,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:a})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let i=this._getMuteStatesForRoomId(t),a=this._getMuteStatesForRoomId(e),s=Object.keys(i),o=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...s,...o])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Q.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:o,roomId:u=null,unmuteOptions:p=[]}=e,m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(u)),E=this._mediaSource.getMediaSettings(),C=Object.entries(h);for(let[M,H]of C){let q=l.newMuteRules&&this._isCallAdmin()&&i;if(!(H!==je.MUTE&&H!==je.MUTE_PERMANENT||q)&&(this._isCallAdmin()&&H===je.MUTE_PERMANENT&&!i&&(h[M]=je.MUTE),!(!t.includes(M)||a)))switch(M){case ce.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(ce.VIDEO,!1),await this.toggleLocalVideo(!1));break;case ce.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(ce.AUDIO,!1),await this.toggleLocalAudio(!1));break;case ce.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(ce.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case ce.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(ce.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,o,u)}async _onPinParticipant(e,t=!1,i,a=null){if(!this._conversation)return;let s=this._conversation.pinnedParticipantIdByRoom.get(a);if(s&&s!==e)if(this._isMe(s))v.onLocalPin(!0,a);else{let o=await this._getExternalIdByParticipantId(s);o&&v.onPinnedParticipant(o,!0,this._denormalizeMarkers(e,i),a)}if(this._isMe(e))v.onLocalPin(t,a);else{let o=await this._getExternalIdByParticipantId(e);o&&v.onPinnedParticipant(o,t,this._denormalizeMarkers(e,i),a)}this._conversation.pinnedParticipantIdByRoom.set(a,t?null:e)}_onOptionsChanged(e){this._conversation&&!Wn(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e),e.includes(et.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&v.onLocalStatus("WAITING_HALL"):e.includes(et.WAIT_FOR_ADMIN)&&this._conversation.restricted&&v.onLocalStatus("WAIT_FOR_ADMIN"))}async _onNetworkStatus(e){if(this._conversation){let t=[],i=await this._getParticipants();for(let[a,s]of Object.entries(e)){let o;if(this._isMe(a)||a==="")o=this._conversation.networkRating;else if(i[a])o=i[a].networkRating;else continue;if(o!==s)if(this._isMe(a)||a==="")this._conversation.networkRating=s,ai.getInstance().value=s,v.onLocalNetworkStatusChanged(s);else{let u=i[a];u.networkRating=s,t.push({uid:u.externalId,rating:s})}}if(t.length===0)return;d.log("Received network status update: ",e),v.onNetworkStatusChanged(t)}}async _onRemoteStreamSecond(e,t){let i=await this._getParticipant(e);if(i){if(l.producerScreenTrack){v.onRemoteScreenStream(i.externalId,t);return}if(i.secondStream=t,l.videoTracksCount>0){let a=e;if(!this._streamIdByStreamDescription.has(a)){d.error("Received remote stream notification for a participant that has no track associated with it",a);return}let s=this._streamIdByStreamDescription.get(a);if(!s||this._streamWaitTimerByStreamDescription.has(a)){d.log("Delaying secondary stream start/stop until main stream becomes available",a);return}let o=this._streamByStreamId.get(s);if(!o){R.log(D.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${s}`);return}v.onRemoteStream(i.externalId,i.secondStream||o)}else{let a=t||i.remoteStream;a&&v.onRemoteStream(i.externalId,a)}}}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){v.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let i=await this._getParticipant(e);i&&v.onRemoteVmojiStream(i.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,v.onVmojiError({...e,externalId:t}))}catch(t){d.warn("_onAnimojiError failed",t)}}_onPeerConnectionClosed(e){e==="SERVER"&&this._cleanupParticipantAgnosticStreams()}_changeFeatureSet(){if(this._conversation){let e=this._state==="ACTIVE",t=this._conversation.features.includes(Dr.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&v.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let s=await this._getParticipant(i);s&&s.externalId&&t.push({uid:s.externalId,volume:a.real})}v.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){d.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=await this._getParticipants(),s=e.reduce((o,u)=>{if(u in a){let p=a[u];o.push(p),t==="CONNECTED"&&(p.remoteStream||(p.mediaSettings&&this._changeRemoteMediaSettings(u,p.mediaSettings),this._changeRemoteParticipantState(u,p.participantState)),this._updateDisplayLayoutFromCache(u))}else this._warnParticipantNotInConversation(u);return o},[]);s.length&&this._setParticipantsStatus(s,i)}async _onTransportLocalStateChanged(e){if(d.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(v.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&v.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&v.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(y.FAILED),this._close(new j(y.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(Ze.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(Ze.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))d.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{d.debug(`Remote track added on the participant [${e}]`,{kind:i.kind});let a=await this._getParticipant(e);if(!a){let s=this._api.getDecorativeIdByInitialId(e),o=s?I.composeUserId(s):void 0;d.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${o}]`),this._registerParticipant({id:e},o),a=await this._getParticipant(e),this._setParticipantsStatus([a],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(a.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(i),l.preserveAudioTracks||(a.remoteAudioTrack=i,t.removeTrack(i))),a.remoteStream!==t&&t.getTracks().length){if(a.remoteStream=t,a.secondStream)return;v.onRemoteStream(a.externalId,t)}a.mediaSettings&&this._changeRemoteMediaSettings(e,a.mediaSettings)}}_onRemoteTrackRemoved(e,t,i){switch(d.debug(`[${e}] remote track (removed)`,{track:i}),i.kind){case"audio":this._removeAudioTrack(e,t,i);break;case"video":case"screen":this._removeVideoTrack(e,t,i);break}}async _removeAudioTrack(e,t,i){if(e!==Ze.AUDIO_MIX){let a=await this._getParticipant(e);if(!a||a.remoteStream&&a.remoteStream!==t)return}this._audioOutput.remove(i)}_removeVideoTrack(e,t,i){}_onTopologyChanged(e){e==="DIRECT"&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall())}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,d.debug("Audio mix stalled:",e),v.onLocalStatus(e?"RECONNECT":"CONNECTED"))}async _onRemoteSignalledStall(e){let t={},i=[],a=[];d.debug("Participants stalled:",e);let s=await this._getParticipants();for(let o of e){if(t[o]=!0,!this._lastStalled[o]){let u=s[o];u&&i.push(u)}delete this._lastStalled[o]}for(let o of Object.keys(this._lastStalled)){let u=s[o];u&&a.push(u)}i.length&&this._setParticipantsStatus(i,"RECONNECT"),a.length&&this._setParticipantsStatus(a,"CONNECTED"),this._lastStalled=t}async _onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,await this._getParticipants()),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!b.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!b.hasCamera()||!this._audioFix||!this._mediaSource?.getMediaSettings().isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!=="CLOSE"||!1;e&&(d.debug("Toggle join availability",{available:t,chatId:e}),v.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!=="SERVER")return;let t=await this._getParticipant(e);t&&t.lastRequestedLayouts&&Object.keys(t.lastRequestedLayouts).length&&await this.updateDisplayLayout(Object.values(t.lastRequestedLayouts))}_setParticipantsStatus(e,t,i=null){if(!e.length)return;let a=e.reduce((s,o)=>(o.status!==t&&(o.status=t,s.push(o.externalId)),s),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(si)){let a=e.updates[i];a&&(t[i]={rooms:await Promise.all(a?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:a?.roomIds,deactivated:a?.deactivated})}v.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(i=>i===si.UPDATE)&&(e.muteStates!==void 0&&this._setMuteStatesForRoomId(e.muteStates,e.roomId),e.recordInfo!==void 0&&this._conversation?.recordsInfoByRoom.set(e.roomId,e.recordInfo),e.asrInfo!==void 0&&this._conversation?.asrInfoByRoom.set(e.roomId,e.asrInfo)),this._isCalledState()||v.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(o=>this._getExternalIdByParticipantId(o))||[]),i=await Promise.all(e.addParticipantIds?.map(o=>this._getExternalIdByParticipantId(o))||[]),a=await Promise.all(e.removeParticipantIds?.map?.(o=>this._getExternalIdByParticipantId(o))||[]),s=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:i,removeParticipantIds:a,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:s,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),i=e.roomId??null,a=e.addedParticipantIds?.map(C=>I.decomposeId(C).id)||[],s=await this._api.getExternalIdsByOkIds(a),o=e.addedParticipants;if(s.length&&o?.length!==s.length&&!this._isCalledState()){let C=this._convertExternalIdsToServerExternalIds(s);o=(await this._signaling.getParticipants(C)).participants}let u=await Promise.all(o?.map(async C=>{let M=I.composeId(C);return this._createParticipant({id:M,externalId:J.fromSignalingParticipant(C),mediaSettings:Me(C.mediaSettings),participantState:I.mapParticipantState(C),state:C.state,roles:C.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:C.muteStates||{},unmuteOptions:C.unmuteOptions||[],observedIds:C.observedIds||[],markers:this._denormalizeMarkers(M,C.markers),isInRoom:i!==null},C.decorativeUserId)})||[]),p=!1;for(let C of u)C.id===this._conversation?.compositeUserId&&(p=!0),this._registerParticipantInCache(C);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(u,!0);let m=[],h=[];if(e?.removedParticipantMarkers){for(let C of e.removedParticipantMarkers)if(C.GRID?.id){let M=this._getExternalIdByParticipantId(C.GRID.id);h.push(M)}m=await Promise.all(h)}if(p&&await this._onRoomSwitched(i),m){let C=this._conversation?.pinnedParticipantIdByRoom.get(i);if(C){let M=await this._getExternalIdByParticipantId(C);if(M){for(let H of m)if(J.compare(M,H)){this._conversation?.pinnedParticipantIdByRoom.delete(i);break}}}}let E={roomId:i,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:I.mapSharedParticipants(u),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:m};this._isCalledState()||v.onRoomParticipantsUpdated(E)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let i=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){v.onRoomStart(e);return}this._isCalledState()||v.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,i),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let i=t?.rooms?.rooms??[],a=[];for(let s of i){let o=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,o),this._conversation?.recordsInfoByRoom.set(o,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(o,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(o,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(o,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(o),e){let u=await this._getParticipants();await this._registerParticipants(s?.participants?.participants?.filter(m=>!u[I.composeId(m)])||[],!0);let p=await this._convertRoomToExternal(s);p&&a.push(p)}}a.length&&!this._isCalledState()&&v.onRoomsUpdated({[si.UPDATE]:{rooms:a}})}async _onFeedback(e){let t=[];for(let i of e.feedback){let a={...i,items:[]};for(let s of i.items){let o=await this._getExternalIdByParticipantId(s.participantId);o?a.items.push({...s,participantId:o}):this._warnParticipantNotInConversation(s.participantId)}t.push(a)}v.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:i,decorativeExternalParticipantId:a}=e,s=this._isMe(t);d.debug(`Decorative participant id changed [${t}]`,e);let o=await this._getExternalIdByParticipantId(t);if(!o){this._warnParticipantNotInConversation(t);return}let u=J.fromSignaling(a,o.deviceIdx);if(v.onParticipantIdChanged(o,u),this._api.cacheExternalId(i,u),this._api.mapDecorativeId(i,t),s)this._conversation.externalId=u;else{let p=await this._getParticipants();p[t].externalId=u}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(d.debug("Video suspend suggested",e),v.onVideoSuspendSuggest(e.bandwidth))}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()==="SERVER"&&this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){this._pendingParticipants.set(e.id,this._createParticipant(e,t))}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.values()),t=await Promise.all(e);for(let i of t)this._pendingParticipants.delete(i.id),this._participants[i.id]=i}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};c(z,"_current"),c(z,"_activationMutex"),c(z,"_delayedHangup",!1);var B=z,Ra=class n extends Error{constructor(e,t){super(e);c(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var Kt=null,ci=null;function os(){Kt=null,ci=null}function mc(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Br(n=null,r){let e=mc(n??l.apiBaseUrl);if(e)return e;if((r??l.apiEnv)!=="AUTO")return l.apiEndpoint(r);try{let t=atob("aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ="),s=(await(await fetch(t,{method:"GET",mode:"cors",cache:"no-cache"})).json())?.Answer[0]?.data;if(!s)throw new Error("Wrong DNS response");return d.debug("Resolved API endpoint",s),s}catch(t){return d.warn("Failed to resolve API endpoint using DNS, default is used",t),l.apiEndpoint(r)}}async function cs(){return Kt||ci||(ci=Br(),Kt=await ci,ci=null,Kt)}async function di(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await cs();let t=ls(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${Kt}/fb.do`,i)}async function Bi(n,r={},e=!1,t){await cs();let i=ls(n,r,e);return hc(i,t)}async function hc(n,r){let e=`${r??Kt}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new j(y.NETWORK_ERROR)),l.apiTimeout),a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n,signal:t.signal});clearTimeout(i);let s=await a.text(),o;try{o=JSON.parse(s)}catch{o={result:s}}if(!a.ok||Object.hasOwn(o,"error_msg"))throw o;return o}async function ds(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 ls(n,r={},e=!1){r.method=n,r.format="JSON",r.application_key||(r.application_key=l.apiKey),e||(be.sessionKey?r.session_key=be.sessionKey:be.accessToken&&(r.access_token=be.accessToken));for(let[i,a]of Object.entries(r))typeof a=="object"&&(r[i]=JSON.stringify(a));let t="";for(let[i,a]of Object.entries(r))t&&(t+="&"),t+=`${i}=${encodeURIComponent(a)}`;return t}var Fi=class{async createJoinLink(r){return{join_link:"nop"}}async removeJoinLink(r){return{success:!0}}async getAnonymTokenByLink(r,e){return""}log(r){}logClientStats(r){}logClientEvents(r){}getCachedOkIdByExternalId(r){return null}cacheExternalId(r,e){}mapDecorativeId(r,e){}unmapDecorativeId(r){}getDecorativeIdByInitialId(r){}replaceByInitialIdIdIfExists(r){return typeof r=="string"?parseInt(r,10):r}hangupConversation(r,e=y.HUNGUP){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var gc=700,fc=3e3,li=class extends Fi{constructor(){super(...arguments);c(this,"_userId",null);c(this,"_uuid");c(this,"_externalUidsCache",new Map);c(this,"_decorativeIdToInitialId",new Map);c(this,"_initialIdToDecorativeId",new Map)}async _callUnsafe(e,t={},i=!1){let a=async s=>{try{return await Bi(e,t,i)}catch(o){if(!Object.hasOwn(o,"error_msg")){s++;let u=Object.getOwnPropertyNames(o).map(p=>`${p}: ${JSON.stringify(o[p])}`);if(d.debug(`${e} network error, attempt ${s}: ${u.join(`
|
|
17
|
-
`)}`),s<l.apiMaxAttempt)return await I.delay(Math.min(s*gc,fc)),a(s)}throw d.warn(e,"error",o),o}};return a(0)}async _call(e,t={},i=!1){try{return await this._callUnsafe(e,t,i)}catch(a){d.warn("Api call error",a);let s=se.API;switch(a.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,i)}let o={message:a.error_msg,code:a.error_code};if(a instanceof j)throw a;if(a.custom_error&&(o.custom_error=a.custom_error),Sc(a))switch(a.error_code){case 1101:s=y.SERVICE_DISABLED;break;case 4:a.error_msg.includes("participants.limit.exceeded")&&(s=y.PARTICIPANT_LIMIT_REACHED);break;case 300:s=y.NOT_FOUND;break;case 1102:s=y.CALLEE_IS_OFFLINE;break;case 1103:s=y.NOT_FRIENDS;break;case 1104:case 1106:s=y.EXTERNAL_API_ERROR;break;case 1113:s=y.CALLER_IS_REJECTED;break;case 1114:s=y.VCHAT_DETAILED_ERROR;break;case 2:s=y.SERVICE_UNAVAILABLE;break}throw new j(s,o)}}async userId(e){let t=I.extractOkId(e);if(be.isEmpty())return J.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),J.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!l.apiKey)throw new j(se.API,{message:"Required argument apiAppKey not passed"});let e={session_data:{version:2,device_id:this._uuid,client_version:l.appVersion,client_type:"SDK_JS"}};return l.authToken&&(e.session_data.auth_token=l.authToken,e.session_data.version=3),this._callUnsafe("auth.anonymLogin",e,!0).then(t=>{t.uid&&(this._userId=Number(t.uid)),be.sessionKey=t.session_key,be.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&v.onTokenExpired(),new j(se.AUTH,{message:t.error_msg,code:t.error_code})})}log(e){let t={collector:"ok.mobile.apps.video",data:JSON.stringify({application:`${l.appName}:${l.sdkVersion}`,platform:l.platform,items:e})};di("log.externalLog",t)}logClientStats(e){let t={app_version:String(l.appVersion),sdk_type:"WEB",sdk_version:l.sdkVersion,version:1,items:e};l.clientStatsPlatform&&(t.platform=l.clientStatsPlatform);let i={data:JSON.stringify(t)};di("vchat.clientStats",i)}logClientEvents(e){let t={app_version:String(l.appVersion),sdk_type:"WEB",sdk_version:l.sdkVersion,version:1,items:e};l.clientStatsPlatform&&(t.platform=l.clientStatsPlatform);let i={data:JSON.stringify(t)};di("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let s={conversationId:e,webrtcPlatform:l.platform,startTime:t,endTime:i},o=await this._callUnsafe("vchat.getLogUploadUrl",s),u=new FormData,p=new Blob([a],{type:"application/json"});u.append("file",p,"log.json");let m=new URL(o.upload_url);return m.searchParams.append("size",p.size.toString()),ds(m.toString(),u)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion,capabilities:ot.getFlags()};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:o,waitForAdmin:u,closedConversation:p}={},m){let h=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,waitForAdmin:u,closedConversation:p,audienceMode:s,audioOnly:o,speakerIds:m});return this._startConversation(h)}async startConversation(e,t,i,a=!1,s="",o=!1,u=!1,{onlyAdminCanShareMovie:p,waitForAdmin:m}={},h){let E=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:o,payload:s,requireAuthToJoin:u,onlyAdminCanShareMovie:p,waitForAdmin:m,externalIds:h});if(t&&t.length)switch(i){case ct.USER:E.uids=t.join(",");break;case ct.GROUP:E.gid=t[0];break;case ct.CHAT:E.chatId=t[0];break}return this._startConversation(E)}_ensureUuid(){if(!this._uuid){let e=It.get("uuid");e||(e=I.uuid(),It.set("uuid",e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:i="",joiningAllowed:a=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:o,waitForAdmin:u,audienceMode:p=!1,audioOnly:m=!1,speakerIds:h=[],closedConversation:E=!1,externalIds:C}){let M={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};if(a&&(M.createJoinLink=!0),i&&(M.payload=i),l.domain&&(M.domainId=l.domain),l.externalDomain&&(M.externalDomain=l.externalDomain),s&&(M.requireAuthToJoin=!0),o!==void 0&&(M.onlyAdminCanShareMovie=o),u!==void 0&&(M.waitForAdmin=u),p&&(M.audienceMode=p),m&&(M.audioOnly=m),h.length){let H=h.map(q=>I.composeUserId(q));M.speakerIds=H.join(",")}return E&&(M.closed=E),C&&(M.externalIds=C.map(J.toSignaling).join(",")),M}async _startConversation(e){return this._call("vchat.startConversation",e)}async createJoinLink(e){return this._call("vchat.createJoinLink",{conversationId:e})}async removeJoinLink(e){return this._call("vchat.removeJoinLink",{conversationId:e})}async getAnonymTokenByLink(e,t){let i={joinLink:e};t&&(i.anonymName=t);let a=await this._call("vchat.getAnonymTokenByLink",i);return this._userId=Number(a.uid),a.token}async joinConversationByLink(e,t=!1,i,a){let s={joinLink:e,isVideo:t,protocolVersion:l.protocolVersion,capabilities:ot.getFlags()};return i?.length&&(s.observedIds=i.join(",")),l.anonymToken&&(s.anonymToken=l.anonymToken),a&&(s.payload=a),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],i=[],a=new Map,s=Array.from(this._externalUidsCache.keys()),o=Array.from(this._externalUidsCache.values());for(let p of e){let m=J.toString(p),h=o.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,J.fromString(a.get(E))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let s of e){let o=J.toString(s),u=a.indexOf(o);if(u>-1){let p=I.composeParticipantId(this.replaceByInitialIdIdIfExists(i[u]),ae.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 o=this.getDecorativeIdByInitialId(s),u=this._externalUidsCache.get(o??s);t.push(J.fromString(u))}else i.push(s);if(!i.length)return t;let a=await this._getExternalIdsByOkIds(i);return Array.from(a.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),i=Array.from(this._externalUidsCache.values()),a=J.toString(e),s=i.indexOf(a);return s>-1?I.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),ae.USER,e.deviceIdx):s>-1?I.composeParticipantId(t[s],ae.USER,e.deviceIdx):null}cacheExternalId(e,t){let i=I.extractOkId(e);this._externalUidsCache.set(i,J.toString(t))}mapDecorativeId(e,t){let i=I.extractOkId(e),a=I.extractOkId(t);this._decorativeIdToInitialId.set(i,a),this._initialIdToDecorativeId.set(a,i)}unmapDecorativeId(e){let t=I.extractOkId(e),i=this.getDecorativeIdByInitialId(t);i&&this._decorativeIdToInitialId.delete(i),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=I.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=I.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}async getConversationParams(e){let t={};return l.anonymToken&&(t.anonymToken=l.anonymToken),e&&(t.conversationId=e),this._call("vchat.getConversationParams",t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e,t=y.HUNGUP){let i={conversationId:e,reason:t};l.anonymToken&&(i.anonymToken=l.anonymToken),di("vchat.hangupConversation",i)}sendUserFeedbackStats(e,t,i,a){let s={collector:"app.vchat.events.product",data:JSON.stringify({application:`${l.appName}:${l.sdkVersion}`,platform:l.platform,items:[{type:1,operation:K.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};di("log.externalLog",s)}async removeHistoryRecords(e){await this._call("vchat.removeHistoryRecords",{recordIds:e.join(",")})}cleanup(){this._decorativeIdToInitialId=new Map,this._initialIdToDecorativeId=new Map}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(i=>this.getDecorativeIdByInitialId(i)??i);try{let i=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),a=(s,o)=>{for(let[u,p]of Object.entries(s)){let m=Number(u),h=J.fromId(p,o);t.set(m,h),this.cacheExternalId(m,h)}};i.external_ids&&a(i.external_ids,"USER"),i.anonym_ids&&a(i.anonym_ids,"ANONYM");for(let s of e){let o=Number(s);if(!t.has(o)){let u=J.fromId(String(o));t.set(o,u),this.cacheExternalId(o,u)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};function Sc(n){return typeof n=="object"&&n!==null&&"error_code"in n&&"error_msg"in n}var ps=(e=>(e.KING="KING",e.PAWN="PAWN",e))(ps||{}),us=ps;var Ca=(e=>(e.OFF="0",e.ON="1",e))(Ca||{});var Fr=class{constructor(r){c(this,"_queue");c(this,"_readCursor");c(this,"_writeCursor");c(this,"_moveReadCursor");c(this,"_left");this._queue=new Array(r).fill(null),this._readCursor=this._writeCursor=this._left=0,this._moveReadCursor=!1}get length(){return this._queue.length}get left(){return this._left}toArray(){return Array.from(this._queue)}add(r){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=r,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(r){return(r+1)%this._queue.length}next(){let r=this._queue[this._readCursor];return r&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),this._left-=1),r}};var Vr=class{constructor(r,e,t,i=null){c(this,"_uuid");c(this,"_apiKey");c(this,"_callToken");c(this,"_apiEnv");c(this,"_baseApiUrl");c(this,"_sessionKey");this._uuid=I.uuid(),this._apiKey=e,this._callToken=t,this._apiEnv=r,this._baseApiUrl=i}async authorize(){let r={session_data:{device_id:this._uuid,client_version:l.appVersion,client_type:"SDK_JS",auth_token:this._callToken,version:3},application_key:this._apiKey},e=await Br(this._baseApiUrl,this._apiEnv),t=await Bi("auth.anonymLogin",r,!0,e);return I.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(r){let e={conversationId:r,reason:y.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Br(this._baseApiUrl,this._apiEnv);await Bi("vchat.hangupConversation",e,!0,t)}};var ue,Vi=null,vc={getCameras:b.getCameras,getMicrophones:b.getMicrophones,getOutput:b.getOutput,getVideoFacingMode:b.getVideoFacingMode,hasCamera:b.hasCamera,hasMicrophone:b.hasMicrophone,getSavedCamera:b.getSavedCamera,getSavedMicrophone:b.getSavedMicrophone,getSavedOutput:b.getSavedOutput,hasCameraPermission:b.hasCameraPermission,hasMicrophonePermission:b.hasMicrophonePermission,hasPermissions:b.hasPermissions,getUserMedia:b.getUserMedia,getUserVideo:b.getUserVideo,getUserAudio:b.getUserAudio,setResolution:b.setResolution,isBrowserSupported:b.isBrowserSupported,isScreenCapturingSupported:b.isScreenCapturingSupported,os:b.os,isMobile:b.isMobile,browserName:b.browserName,browserVersion:b.browserVersion,baseChromeVersion:b.baseChromeVersion,getAudioContext:b.getAudioContext,isAudioShareSupported:b.isAudioShareSupported},Ic={participantMarkerCompare:I.participantMarkerCompare};function Ec(n){Vi=n}function Tc(n){l.videoEffects=n}function Rc(n){l.audioEffects=n}function Cc(n,r=null,e={},t=1){l.vmoji=n,l.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function Pc(n){if(l.set(n),ue||(ue=new li),Pa.default.disableLog(!l.debug),d.toggle(l.debug),d.log(`Calls SDK ${l.sdkVersion}`,n),await b.init(),!b.isBrowserSupported())throw new j(se.UNSUPPORTED);d.log("UserAgent:",navigator.userAgent),d.log("Screen resolution:",`${window.screen.width}x${window.screen.height}`),d.log("Permissions:",`Camera: ${b.hasCameraPermission()}, Mic: ${b.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${l.simulcast}`)}async function yc(n,r=[ce.AUDIO],e="",t=!1,i=!1,a,s){let o=[];return Array.isArray(n)?o=n.length?n:[]:n&&(o=[n]),ms([],ct.USER,r,e,t,i,a,o,s)}async function ms(n,r=ct.USER,e,t="",i=!1,a=!1,s,o,u){if(B.current())throw d.error("There is already active call"),new j(y.FAILED);return new B(ue,Vi).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:o,onFastStart:u})}async function bc(n,r){return hs(n,ae.USER,void 0,r)}async function hs(n,r=ae.USER,e,t,i,a){if(n===B.id())throw new Error("Push has already been processed");return a&&ue.setUserId(a),new B(ue,Vi).onPush(n,r,e,t,i)}async function Mc(n,r){return n&&(l.authToken=n),r!==void 0&&l.apiBaseUrl!==r&&(l.apiBaseUrl=r,os()),ue.authorize()}async function Ac(n=[ce.AUDIO]){return tt().accept(n)}async function Dc(){let n=B.current();if(n)return n.decline()}async function wc(n,r=[ce.AUDIO]){return _s(n,r)}async function _s(n,r,e){if(B.current())throw d.error("There is already active call"),new j(y.FAILED);return new B(ue,Vi).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function kc(n,r=[ce.AUDIO],e,t,i){if(B.current())throw d.error("There is already active call"),new j(y.FAILED);return e&&(l.anonymToken=e),new B(ue,Vi).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i})}async function Oc(){let n=B.current();if(n)return n.hangup();B.hangupAfterInit()}async function xc(n,r){let e=Array.isArray(n)?n:[n],t=B.current();t&&await t.addParticipant(e,r)}async function Nc(n,r){let e=B.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function Lc(n,r=!1){let e=await ue.getOkIdsByExternalIds([n]);return gs(e[0],r)}async function gs(n,r=!1){let e=B.current();if(e)try{await e.removeParticipant(I.composeUserId(n),r)}catch(t){d.warn(`Failed to remove participant ${n}. Perhaps he is no longer on the call. ${t}`)}}async function Uc(n,r){let e=B.current();if(n==="videoinput"&&vt.contains(r))return l.videoFacingMode=r,e?(b.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await b._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function Bc(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&l.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=B.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function Fc(n){let r=B.current();r&&r.toggleAnimojiCapturing(n)}async function Vc(n,r=!1){let e=B.current();e&&await e.setVideoStream(n,r)}async function jc(n){let r=B.current();r&&await r.toggleLocalVideo(n)}async function Hc(n){let r=B.current();r&&await r.toggleLocalAudio(n)}async function Gc(n){let r=B.current();if(r)return r.setLocalResolution(n)}async function Wc(n){let r=B.current();r&&await r.changePriorities(n)}async function Kc(n,r){let e=B.current();if(e){let t;if(r){let[i]=await ue.getOkIdsByExternalIds([r]);t=I.composeParticipantId(i,ae.USER,r.deviceIdx)}await e.changeParticipantState(n,t)}}async function $c(){let n=B.current();n&&await n.putHandsDown()}async function qc(n){let r=B.current();r&&await r.updateDisplayLayout(n)}async function zc(n,r,e=!1){let t=await ue.getOkIdsByExternalIds([n]);return fs(t[0],J.getDeviceIdx(n),r,e)}async function fs(n,r,e,t=!1){let i=B.current();i&&await i.grantRoles(I.composeParticipantId(n,ae.USER,r),e,t)}async function Jc({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await ue.getOkIdsByExternalIds([n]))[0]),Ss({uid:i,muteStates:r,requestedMedia:e,deviceIdx:J.getDeviceIdx(n),roomId:t})}async function Ss({uid:n=null,muteStates:r,requestedMedia:e=[],deviceIdx:t=0,roomId:i=null}){let a=B.current();if(a){let s=n?I.composeParticipantId(n,ae.USER,t):null;await a.muteParticipant(s,r,e,i)}}async function Yc(n,r=!1,e=null){let t=await ue.getOkIdsByExternalIds([n]);return vs(t[0],r,J.getDeviceIdx(n),e)}async function vs(n,r=!1,e=0,t=null){let i=B.current();i&&await i.pinParticipant(I.composeParticipantId(n,ae.USER,e),r,t)}async function Qc(n){let r=B.current();r&&await r.updateMediaModifiers(n)}async function Xc(n){let r=B.current();r&&await r.enableVideoSuspend(n)}async function Zc(n){let r=B.current();r&&await r.enableVideoSuspendSuggest(n)}async function ed(n){let r=B.current();r&&await r.changeOptions(n)}async function td(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),Is(n,e)}async function Is(n,r=null){let e=B.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function id(n=10){let r=B.current();if(r)return r.chatHistory(n)}async function rd(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),Es(n,e,J.getDeviceIdx(r))}async function Es(n,r=null,e=0){let t=B.current();if(t){let i=r?I.composeParticipantId(r,ae.USER,e):null;await t.customData(n,i)}}async function ad(n="",r=!1,{onlyAdminCanShareMovie:e=!1,waitForAdmin:t=!1,closedConversation:i=!1}={}){return(await ue.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,waitForAdmin:t,closedConversation:i})).join_link}async function nd(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=J.fromIds(i),s=await ue.getOkIdsByExternalIds(a);return(await ue.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},s)).join_link}async function sd(){let n=B.current();return n?n.createJoinLink():Promise.reject()}async function od(){let n=B.current();return n?n.removeJoinLink():Promise.reject()}async function cd(n,r){return ue.getAnonymTokenByLink(n,r)}function dd(n){let r=B.current();r&&r.setVolume(n)}function ld(n){l.forceRelayPolicy=n}async function pd(n=!1,r=null,e=null,t="DIRECT_LINK",i=null,a=null){let s=B.current();return s?s.startStream(n,r,e,t,i,a):Promise.reject()}async function ud(n=null,r){let e=B.current();return e?e.stopStream(n,r):Promise.reject()}async function md(n=null){let r=B.current();return r?r.publishStream(n):Promise.reject()}async function hd(n,r,e=!1,t=null){let i=B.current();if(!i)return Promise.reject();let a,s,o=[];if(r?.length&&o.push(...r),n&&o.push(n),o.length){let u=await ue.getParticipantIdsByExternalIds(o);n&&(a=u.get(n),u.delete(n)),s=Array.from(u.values())}return i.recordSetConf(a,s,e,t)}async function _d(){let n=B.current();return n?n.getStreamInfo():Promise.reject()}async function gd(n){let r=B.current();return r?r.addMovie(n):Promise.reject()}async function fd(n){let r=B.current();return r?r.updateMovie(n):Promise.reject()}async function Sd(n){let r=B.current();return r?r.removeMovie(n):Promise.reject()}async function vd(n,r){let e=B.current();if(e){let t=[];for(let i of n){let a,s;i.addParticipantIds&&(a=(await ue.getOkIdsByExternalIds(i.addParticipantIds)).map(o=>I.composeUserId(o))),i.removeParticipantIds&&(s=(await ue.getOkIdsByExternalIds(i.removeParticipantIds)).map(o=>I.composeUserId(o))),t.push({id:i.id,name:i.name,participantCount:i.participantCount,addParticipantIds:a,removeParticipantIds:s,countdownSec:i.countdownSec})}return e.updateRooms(t,r)}return Promise.reject()}async function Id(n,r){let e=B.current();return e?e.activateRooms(n,r):Promise.reject()}async function Ed(n=null,r=null){let e=B.current();if(!e)return Promise.reject();let t;if(r){let i=await ue.getOkIdsByExternalIds([r]),a=J.getDeviceIdx(r);t=I.composeParticipantId(i[0],ae.USER,a)}return e.switchRoom(n,t)}async function Td(n){let r=B.current();return r?r.removeRooms(n):Promise.reject()}function Rd(n){l.statisticsInterval=n;let r=B.current();if(r)return r.updateStatisticsInterval()}function Cd(n){Pa.default.disableLog(!n),d.toggle(n)}function Pd(n,...r){l.debugLog&&d.send(n,"[external]",...r)}async function yd(){let n=Ne.conversationId;if(!n)throw d.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let r=Ne.collectLogs();if(r.length===0)throw d.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Ne.startTime,t=Ne.endTime;try{return ue?.uploadDebugLogs(n,e,t,JSON.stringify(r))}catch(i){throw d.error("[uploadDebugLogs]","Error while uploading logs",i),new Error("Error while uploading logs",{cause:i})}}async function bd(n){let r=B.current();if(r)return r.videoEffect(n)}async function Md(n,r){let e=B.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function Ad(n){let r=B.current();r&&await r.setAudioStream(n)}async function Dd(n,r=null,e=null){let t=B.current();if(!t)return;let i=e??r?.id,a=null;if(r){let o=(await ue.getOkIdsByExternalIds([r]))[0];if(!o)throw new Error("Could not get user id to set animoji svg");a=I.composeParticipantId(o,ae.USER,J.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function wd(n){let r=B.current();r&&r.setAnimojiFill(n)}async function kd(n=null,r,e=!1){return tt().getWaitingHall(n,r,e)}async function Od(){return tt().getAudienceModeHands()}async function xd(n,r=!1){let e=tt(),t;if(n){let[i]=await ue.getOkIdsByExternalIds([n]);t=I.composeUserId(i)}return e.promoteParticipant(t,r)}async function Nd(n=!1){return tt().requestPromotion(n)}async function Ld(n=!1){return tt().acceptPromotion(n)}async function Ud(n){return tt().getParticipantListChunk(n)}async function Bd(n){return tt().getParticipants(n)}async function Fd(n){return tt().feedback(n)}function Vd(n,r,e){return tt().userFeedbackStats(n,r,e)}function jd(n,r={},e=!1){let t=B.current();t&&t.sendClientEvent(n,r,e)}async function Hd(n,r){return tt().enableFeatureForRoles(n,r)}function tt(){let n=B.current();if(!n)throw new Error("Conversation not found");return n}async function Gd(n){await ue.removeHistoryRecords(n)}async function Wd(n){let r=B.current();r&&await r.startAsr(n)}async function Kd(n){let r=B.current();r&&await r.stopAsr(n)}async function $d(n){let r=B.current();r&&await r.requestAsr(n)}async function qd(n){let r=B.current();return r?r.startUrlSharing(n):Promise.reject()}async function zd(){let n=B.current();return n?n.stopUrlSharing():Promise.reject()}function Jd(){return l.sdkVersion}
|
|
16
|
+
`)}})}_startMonitorRtpShareInterval(){if(this._monitorRtpShareInterval)return;let t=()=>{if(!this._pc){this._stopMonitorRtpShareInterval();return}this._monitorRtpShare(),this._monitorRtpShareInterval=window.setTimeout(t,5e3)};this._monitorRtpShareInterval=window.setTimeout(t,5e3)}_stopMonitorRtpShareInterval(){this._monitorRtpShareInterval&&(window.clearTimeout(this._monitorRtpShareInterval),this._monitorRtpShareInterval=null)}};var Be=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(Be||{}),Tr=class extends oe{constructor(e,t,i,a){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_topology");o(this,"_allocated",[]);o(this,"_opened",[]);o(this,"_directTransport",null);o(this,"_serverTransport",null);o(this,"_serverSettings");o(this,"_dtListeners",[]);o(this,"_stListeners",[]);o(this,"_states",{});o(this,"_localState","IDLE");o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,Ae.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"ANIMOJI_STATUS",this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e==="SERVER"&&(this._serverTransport=this._createServerTransport())}updateSettings(e){d.log("Update transport settings",e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(d.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){d.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology==="DIRECT"&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology==="SERVER"&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,i=!1,a=!1){d.log("Trying open participant",{participantIds:e});let s=a;for(let c of e){if(this._opened.indexOf(c)!==-1){d.warn(`The participant [${c}] has already had opened transport`);continue}if(this._allocated.indexOf(c)===-1){d.warn(`The participant [${c}] has no allocated transport`);continue}this._opened.push(c),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(i),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),d.debug("The transport has been opened",e))}close(e){let t=this._allocated.indexOf(e),i=this._opened.indexOf(e);t<0&&d.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&i>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),i>=0&&this._opened.splice(i,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),p.audioEffects?.destroy(),this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}getTopology(){return this._topology}isAllocated(e){return this._allocated.indexOf(e)>=0}allocated(){return this._allocated.slice()}opened(){return this._opened.slice()}getState(){return this._topology==="SERVER"?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){p.vmoji&&t.isMe&&p.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology==="SERVER"&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let i=e.filter(a=>this._states[a]!==t?(this._states[a]=t,!0):!1);i.length&&this._triggerEvent("STATE_CHANGED",i,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent("LOCAL_STATE_CHANGED",e))}_onSignalingNotification(e){if(e.notification===U.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(d.log(`Topology changed ${this._topology} -> ${e.topology}`),R.log(D.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology==="SERVER"&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology==="DIRECT"){let t=e.offerTo||[],i=e.offerToTypes||[],a=e.offerToDeviceIdxs||[],s=t.length&&i.length?I.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){d.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&d.warn("Topology changed to DIRECT, but the allocated participants count more then one");let c=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let u=s===c;this._directTransport=this._createDirectTransport(c,u)}this._opened.indexOf(c)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new Ti(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 Di(this._signaling,this._mediaSource,this._serverSettings);return this._stListeners.length>0&&d.warn("The list of server transport listeners is not empty"),this._stListeners=[],this._stListeners.push(e.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),e.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),e.addEventListener("AUDIO_MIX_STALL",this._onServerAudioMixStall.bind(this)),e.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),e.addEventListener("STATE_CHANGED",this._onServerTransportChanged.bind(this)),e.addEventListener("SIGNALLED_ACTIVE_PARTICIPANTS",this._onTransportActiveParticipants.bind(this)),e.addEventListener("SIGNALLED_SPEAKER_CHANGED",this._onTransportSpeakerChanged.bind(this)),e.addEventListener("SIGNALLED_STALLED_PARTICIPANTS",this._onTransportStalledParticipants.bind(this)),e.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),e.addEventListener("REMOTE_STREAM_SECOND",this._onRemoteStreamSecond.bind(this)),e.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"SERVER")),e.addEventListener("ASR_TRANSCRIPTION",this._onAsrTranscription.bind(this))),this._animojiReceiver&&this._animojiSender&&e.setAnimojiTransport(this._animojiReceiver,this._animojiSender),e}_releaseDirectTransport(){this._directTransport?.close(),this._directTransport=null;for(let e of this._dtListeners)e.dispose();this._dtListeners=[]}_releaseServerTransport(){this._serverTransport?.close(),this._serverTransport=null;for(let e of this._stListeners)e.dispose();this._stListeners=[]}_onDirectTransportChanged(e){let t=this._directTransport?.participantId;if(e==="CONNECTED"&&this._topology==="DIRECT"&&this._releaseServerTransport(),(e==="CLOSED"||e==="FAILED")&&(this._releaseDirectTransport(),this._topology==="DIRECT")){let i=this._opened.indexOf(t);i>=0&&this._opened.splice(i,1);let a=this._allocated.indexOf(t);a>=0&&this._allocated.splice(a,1)}this._topology==="DIRECT"&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e==="CONNECTED"&&this._topology==="SERVER"&&this._releaseDirectTransport(),(e==="CLOSED"||e==="FAILED")&&(this._releaseServerTransport(),this._topology==="SERVER"&&(this._allocated=[],this._opened=[])),this._topology==="SERVER"&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_onTransportStalledParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_onTransportSpeakerChanged(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_onTransportNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_onRemoteStreamSecond(e,t){this._triggerEvent("REMOTE_STREAM_SECOND",e,t)}_onPeerConnectionClosed(e){this._triggerEvent("PEER_CONNECTION_CLOSED",e)}_onServerAudioMixStall(e){this._topology==="SERVER"&&this._triggerEvent("AUDIO_MIX_STALL",e)}_onRemoteDataStats(e){this._triggerEvent("REMOTE_DATA_STATS",e)}_onRemoteTrackAdded(e,t,i){this._triggerEvent("REMOTE_TRACK_ADDED",e,t,i)}_onRemoteTrackRemoved(e,t,i){this._triggerEvent("REMOTE_TRACK_REMOVED",e,t,i)}_onAsrTranscription(e){this._triggerEvent("ASR_TRANSCRIPTION",e)}_onSourceChanged(){let e=this._mediaSource.getStream();e&&this._animojiSender?.setStream(e)}_onAnimojiStream(e,t){this._triggerEvent("ANIMOJI_STREAM",e,t)}_onAnimojiStatus(e){e?this._animojiSender?.resume():this._animojiSender?.pause(),this._mediaSource.onAnimojiSender(e)}_createAnimojiTransport(){if(!p.vmoji)return;this._animojiReceiver=new p.vmoji.AnimojiReceiver((t,i)=>this._onAnimojiStream(t,i),t=>this._onAnimojiStream(t,null),t=>{this._triggerEvent("ANIMOJI_ERROR",t)},p.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new p.vmoji.AnimojiSender(e,this._signaling.getPeerId(),p.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:p.vmojiOptions.renderingOptions.useAI}),this._animojiSender.onLocalData=t=>this._animojiReceiver?.receive(t)}_removeAnimojiTransport(){this._animojiSender?.destroy(),this._animojiSender=null,this._animojiReceiver?.destroy(),this._animojiReceiver=null}getStreamWaitingTimeMs(e,t){return this._topology!=="SERVER"?(R.log(D.PAT_WAITING_TIME_ERROR,"wrongTopology"),d.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(R.log(D.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var Ne=class Ne{constructor(){o(this,"trackerByTransport",{ws:new ct,wt:new ct});o(this,"lastSeen",{})}static create(){Ne._instance||(Ne._instance=new Ne)}static mark(r){if(!Ne._instance)return;let e=Date.now(),t=Ne._instance.lastSeen[r];if(typeof t=="number"){let i=e-t;i>=0&&Ne._instance.trackerByTransport[r].add(i)}Ne._instance.lastSeen[r]=e}static logMetrics(r){Ne._instance&&["ws","wt"].forEach(e=>{if(!Ne._instance.trackerByTransport[e].hasData)return;let t=Ne._instance.trackerByTransport[e].snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_PING_SUMMARY,min_value:t.min,max_value:t.max,avg_value:t.avg,median_value:t.median,p95_value:t.p95,values_count:t.count,signaling_transport:e})})}static destroy(){Ne._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new ct,wt:new ct},this.lastSeen={}}};o(Ne,"_instance");var ut=Ne;var Fe=class Fe{constructor(){o(this,"trackerByCommand",new Map)}static create(){Fe._instance||(Fe._instance=new Fe)}static mark(r,e,t){if(!Fe._instance)return;let i=`${r}|${t}`,a;Fe._instance.trackerByCommand.has(i)?a=Fe._instance.trackerByCommand.get(i):(a=new ct,Fe._instance.trackerByCommand.set(i,a)),a.add(e)}static logMetrics(r){if(Fe._instance)for(let[e,t]of Fe._instance.trackerByCommand.entries()){if(!t.hasData)continue;let[i,a]=e.split("|"),s=t.snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:X.SIGNALING_COMMAND_SUMMARY,api_method:i,min_value:s.min,max_value:s.max,avg_value:s.avg,median_value:s.median,p95_value:s.p95,values_count:s.count,signaling_transport:a})}}static destroy(){Fe._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};o(Fe,"_instance");var mt=Fe;var Nn=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(Nn||{}),We=Nn;var Ln={producerScreenTrack:()=>!0,videoTracksCount:()=>p.videoTracksCount>0,waitingHall:()=>!0,filteredMessages:()=>!0,consumerScreenTrack:()=>!0,muteNotificationForAdmins:()=>!0,movieShare:()=>p.movieShare,useParticipantListChunk:()=>p.useParticipantListChunk,useRooms:()=>p.useRooms,vmoji:()=>!!p.vmoji,useCallsToContacts:()=>p.useCallsToContacts,useChatRooms:()=>p.useChatRooms,audienceModeHandUpTimestamps:()=>!1,animojiBackendRender:()=>!p.vmojiOptions.renderingOptions.useFullClientRendering,sessionStateUpdates:()=>!1,addParticipant:()=>p.addParticipant,p2pRelay:()=>!1,waitForAdmin:()=>p.waitForAdminInGroupCalls},at=class{static getFlags(){let r=Object.values(Ln),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(Ln).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};var Ke=li(require("fflate"));var ec=63n,tc=16383n;var ic=4611686018427387903n,Rr=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=ec)return new Uint8Array([Number(e)]);if(e<=tc)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<=ic)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")}},Cr=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 Pr=class{constructor(r){o(this,"encoder");o(this,"compression");o(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new Rr,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 Ke.gzipSync(r);case"deflate":return Ke.zlibSync(r);case"deflate-raw":return Ke.deflateSync(r);default:return r}}},yr=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 Cr,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 Ke.gunzipSync(r);case"deflate":return Ke.unzlibSync(r);case"deflate-raw":return Ke.inflateSync(r);default:return r}}};var Zt=class{constructor(r,e={}){o(this,"webTransport");o(this,"stream",null);o(this,"writer",null);o(this,"reader",null);o(this,"url");o(this,"options");o(this,"compression");o(this,"encoder");o(this,"decoder");o(this,"onopen",null);o(this,"onmessage",null);o(this,"onerror",null);o(this,"onclose",null);o(this,"readyState",WebSocket.CONNECTING);this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new Pr(this.compression),this.decoder=new yr(this.compression),this.connect()}getCompressionTypeFromUrl(r){try{let t=new URL(r).searchParams.get("compression");switch(t){case"gzip":case"deflate":case"deflate-raw":return t;default:return null}}catch(e){return d.log("Exception while parsing compression",e),null}}async connect(){try{this.webTransport=new WebTransport(this.url,{...this.options}),await this.webTransport.ready,d.debug("[WebTransport] WebTransport connected to "+this.url),this.stream=await this.webTransport.createBidirectionalStream(),this.writer=this.stream.writable.getWriter(),this.reader=this.stream.readable.getReader(),this.readyState=WebSocket.OPEN,this.onopen?.(new Event("open")),await this.readLoop()}catch(r){d.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error")),this.onclose?.(new CloseEvent("close",{code:1006,reason:"Connection Failed"}))}}async*readChunks(){if(this.reader)try{for(;;){let{done:r,value:e}=await this.reader.read();if(r)break;e&&(yield e)}}finally{this.reader.releaseLock()}}async readLoop(){if(this.reader)try{for await(let r of this.readChunks())this.decoder.decode(r).forEach(t=>{this.onmessage?.(new MessageEvent("message",{data:t}))});this.close(1e3,"Stream Closed")}catch(r){d.error("[WebTransport] Stream read failed",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(r){if(this.readyState!==WebSocket.OPEN){d.warn("[WebTransport] Attempt to send data before webtransport is open");return}if(!this.writer){d.warn("[WebTransport] Attempt to send data before stream is ready");return}try{await this.writer.ready;let e=this.encoder.encode(r);await this.writer.write(e)}catch(e){d.error("[WebTransport] Failed to send data",e),this.onerror?.(new Event("error")),this.close(1006,"Failed to send data")}}close(r=1e3,e){if(!(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)){this.readyState=WebSocket.CLOSING,this.reader?.cancel();try{this.webTransport.close()}catch(t){d.warn("[WebTransport] already closed. Did we get a STOP_SENDING? ignore",t)}this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent("close",{code:r,reason:e})),this.webTransport.closed.then(()=>{this.writer=null,this.reader=null,this.stream=null})}}static isBrowserSupported(){return"WebTransport"in window&&typeof WebTransport=="function"?M.browserName()==="Firefox"?p.webtransportFF:M.browserName()!=="Safari":!1}};var Un="open",rc=10,ac=["service-unavailable","conversation-ended","invalid-token"],Bt=class n extends pi{constructor(){super(...arguments);o(this,"socket",null);o(this,"sequence",1);o(this,"lastStamp",0);o(this,"websocketCommandsQueue",[]);o(this,"datachannelCommandsQueue",[]);o(this,"incomingCache",[]);o(this,"responseHandlers",{});o(this,"connectionType");o(this,"reconnectCount",0);o(this,"endpoint");o(this,"wtEndpoint",null);o(this,"conversationResolve",null);o(this,"conversationReject",null);o(this,"connected",!1);o(this,"listenersReady",!1);o(this,"postfix","&platform="+p.platform+"&appVersion="+p.appVersion+"&version="+p.protocolVersion+"&device="+p.device+"&capabilities="+at.getFlags());o(this,"peerId",null);o(this,"conversationId",null);o(this,"reconnectTimer",0);o(this,"connectionMessageWaitTimer",0);o(this,"doctorTimer",0);o(this,"participantIdRegistry",null);o(this,"producerNotificationDataChannel",null);o(this,"producerCommandDataChannel",null);o(this,"producerCommandDataChannelEnabled",!1);o(this,"producerCommandSerializationService",new lr)}static get RECONNECT_DELAY(){return p.signalingReconnectDelay}static get RECONNECT_MAX_DELAY(){return p.signalingReconnectMaxDelay}static get RECONNECT_MAX_COUNT(){return p.signalingReconnectMaxCount}static get WAIT_CONNECTION_DELAY(){return p.waitConnectionDelay}static get WAIT_RESPONSE_DELAY(){return p.waitResponseDelay}static get WAIT_MESSAGE_DELAY(){return p.waitMessageDelay}get ready(){return this.socket!==null}setEndpoint(e){this.endpoint=e}setWebTransportEndpoint(e){this.wtEndpoint=e}setConversationId(e){this.conversationId=e}setParticipantIdRegistry(e){this.participantIdRegistry=e,this.producerCommandSerializationService.setParticipantIdRegistry(e)}setProducerNotificationDataChannel(e){this.producerNotificationDataChannel=e,this.producerNotificationDataChannel.onmessage=t=>{let i=this.participantIdRegistry?.handleMessage(t.data);i&&this._handleMessage(i)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(i=>{i&&this._handleMessage(i)}).catch(i=>{d.warn("[signaling] cannot parse message at producerCommandDataChannel",i)})},this._handleCommandsQueue(this.datachannelCommandsQueue)}useCommandDataChannel(e){this.producerCommandDataChannelEnabled=e}cleanup(){this.datachannelCommandsQueue=[],this.incomingCache=[]}async connect(e){return this.postfix+=`&clientType=${p.clientType}`,new Promise((t,i)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){R.log(D.SOCKET_ACTION,"already_opened"),i(Error("Socket already opened"));return}this.conversationResolve=a=>{t(a),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=a=>{i(a),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},i=!0,a=0){if(t.participantId){let s=I.decomposeParticipantId(t.participantId),c=I.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:c.id,participantType:c.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,i,a)}async _sendRaw(e,t={},i=!0,a=0){let s=c=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(c),this.producerCommandDataChannel?.readyState===Un&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){R.log(D.SOCKET_ACTION,"not_opened"),d.warn("[signaling] socket is not opened"),c.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(R.log(D.SOCKET_ACTION,"invalid_state"),d.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(c),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((c,u)=>{let l=(P,b=!1)=>{!a||b?u(P):(d.debug("[signaling] resending a signaling message",e,E.sequence),a--,s(E))},m=this.sequence++,h=`${e}_${m}`;pe.setMark(h);let E={sequence:m,name:e,statMarkName:h,params:t,responseTimer:0,needResponse:i,resolve:c,reject:l};s(E)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===x.UPDATE_DISPLAY_LAYOUT||e===x.REPORT_PERF_STAT||e===x.REPORT_SHARING_STAT||e===x.REQUEST_ASR||e===x.ENABLE_VIDEO_SUSPEND||e===x.ENABLE_VIDEO_SUSPEND_SUGGEST||e===x.REPORT_NETWORK_STAT||e===x.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(x.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(x.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(x.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,i){let a=Object.assign({sdp:t},i);return this._send(x.TRANSMIT_DATA,{participantId:e,data:a})}async acceptCall(e){return this._send(x.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(x.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,rc)}async changeParticipantState(e,t){let i={participantState:{state:e}};return t&&(i.participantId=t),this._sendRaw(x.CHANGE_PARTICIPANT_STATE,i)}async putHandsDown(){return this._send(x.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(x.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(x.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(x.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let i={capabilities:t};return e&&(i.description=e.sdp),this._send(x.ALLOCATE_CONSUMER,i)}async acceptProducer(e,t){let i={description:e.sdp};return t&&(i.ssrcs=t),this._send(x.ACCEPT_PRODUCER,i)}async changePriorities(e){return this._send(x.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(x.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(x.ADD_MOVIE,e)}async updateMovie(e){return this._send(x.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(x.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(x.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(x.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(x.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(x.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(x.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(x.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(x.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(x.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(x.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(x.RECORD_PUBLISH,e)}async recordSetConf(e={hideParticipantCount:!1,roomId:null}){let t={options:{hideParticipantCount:e.hideParticipantCount},roomId:e.roomId};return e.king&&(t.king=e.king),e.pawns?.length&&(t.pawns=e.pawns.join(",")),this._send(x.RECORD_SET_CONF,t)}async getRecordStatus(){return this._send(x.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(x.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(x.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(x.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(x.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(x.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(x.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(x.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(x.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,i){let a={participantId:e,roles:t};return i&&(a.revoke=!0),this._sendRaw(x.GRANT_ROLES,a)}async muteParticipant(e,t,i,a=null){return this._sendRaw(x.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:i,roomId:a})}async enableFeatureForRoles(e,t){return this._sendRaw(x.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,i){let a={participantId:e,roomId:i};return t&&(a.unpin=!0),this._sendRaw(x.PIN_PARTICIPANT,a)}async updateMediaModifiers(e){return this._send(x.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(x.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(x.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(x.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(x.CHANGE_OPTIONS,{options:e})}async getWaitingHall(e=null,t,i=!1){let a={};return e&&(a.fromId=e),t&&(a.count=t),i&&(a.backward=i),this._send(x.GET_WAITING_HALL,a)}async promoteParticipant(e,t=!1){let i={};return e&&(i.participantId=e),t&&(i.demote=t),this._sendRaw(x.PROMOTE_PARTICIPANT,i)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(x.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(x.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(x.FEEDBACK,{key:e})}async getHandQueue(){return this._send(x.GET_HAND_QUEUE)}close(){this.socket&&this.socket.readyState<WebSocket.CLOSING&&this._closeSocket(),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}readyToSend(e=!0){this.listenersReady=e,this._handleCachedMessages()}async getParticipantListChunk(e){return this._send(x.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(x.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(x.ASR_START,e)}async stopAsr(e){return this._send(x.ASR_STOP,e)}async requestAsr(e){return this._send(x.REQUEST_ASR,{request:e},!1)}_connect(e,t){if(this.socket&&this.socket.readyState<WebSocket.CLOSING)return;this.connectionType=e;let i="";e&&(i+=`&tgt=${e}`),e===We.RETRY&&this.lastStamp&&(i+=`&recoverTs=${this.lastStamp}`),i=a(i),t?(i+="&compression=deflate-raw",i+=`&ua=${navigator.userAgent}`,d.debug("[signaling] connecting to wt "+this.wtEndpoint+this.postfix+i),this.socket=new Zt(this.wtEndpoint+this.postfix+i)):(d.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+i),this.socket=new WebSocket(this.endpoint+this.postfix+i)),this._markTransportStat(e===We.RETRY?"reconnected":"connected"),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor();function a(s){if(!p.useParticipantListChunk)return s;let c=p.participantListChunkInitIndex;s+=`&partIdx=${c}`;let u=p.participantListChunkInitCount;return u!==null&&(s+=`&partCount=${u}`),s}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){d.debug("[signaling] socket opened"),R.log(D.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===We.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){R.log(D.SOCKET_ACTION,"parse_error"),d.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(d.debug("[signaling] signaling connected",e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.postfix+=`&peerId=${e.peerId.id}`,this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat("restart"),this._triggerEvent(Ae.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Ae.NOTIFICATION,{type:"notification",notification:U.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===U.ACCEPTED_CALL&&t.peerId.id===this.peerId&&t.peerId.type==="WEB_TRANSPORT"||this._handleMessage(t)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(Ae.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:R.log(D.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){R.log(D.SOCKET_ACTION,`error-${e.error}`);let t=e.error?ac.includes(e.error):!1;switch(d.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case"service-unavailable":let i=new j(y.SERVICE_UNAVAILABLE,{message:`Conversation ended: ${e.error}`,remote:!0});this.conversationReject?this.conversationReject(i):this._triggerEvent(Ae.NOTIFICATION,{notification:U.CLOSED_CONVERSATION,reason:y.SERVICE_UNAVAILABLE});break;case"conversation-ended":this.conversationReject?this.conversationReject(new j(e.reason||se.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(Ae.NOTIFICATION,{notification:U.CLOSED_CONVERSATION,reason:e.reason});break;case"participant-not-found":this._throwError(new Error(`Signaling error: ${e.error}`));break;case"invalid-token":default:if(!t)break;this.connected?this._throwError(new Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new j(e.reason||se.SIGNALING_FAILED,{message:`Unable to connect to the signaling: ${e.error}`,remote:!0})),this._closeSocket())}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(Ae.FAILED,e)}_onError(e){R.log(D.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){R.log(D.SOCKET_ACTION,"closed"),d.debug("[signaling] connection closed",{code:e.code,reason:e.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this.reconnectCount++<n.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new j(y.NETWORK_ERROR))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(new Error(`Connection closed. Command ${t.name}`),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(e))}_reconnect(){let e=Math.min(n.RECONNECT_MAX_DELAY,n.RECONNECT_DELAY*Math.pow(2,this.reconnectCount-1));d.log(`[signaling] reconnect websocket after ${e}ms (${this.reconnectCount})`),R.log(D.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,We.RETRY,!1),e)}_handleCommandResponse(e,t){if(!Object.hasOwn(this.responseHandlers,t.sequence))return;let i=this.responseHandlers[t.sequence];window.clearTimeout(i.responseTimer);let a=pe.measureMark(i.statMarkName);a!==null&&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],R.log(D.SOCKET_ACTION,"response-error"),i.reject(new Error(t.error||`Response error [${i.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],R.log(D.SOCKET_ACTION,"response-timeout"),i.reject(new Error(t.error||`Response timeout [${i.name}]`))):i.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),n.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(d.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==Un){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]=sn(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new j(se.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(We.RETRY,!1),this.reconnectCount++},n.WAIT_MESSAGE_DELAY))}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return Zt.isBrowserSupported()&&this.wtEndpoint!==null&&p.webtransport}_getSocketType(){return this.socket instanceof Zt?"wt":"ws"}_markTransportStat(e){let t=this._getSocketType(),i=pa[e][t];pe.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=pa[e][i];Me.logEventualStat({name:a,...t})}};var Bn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(Bn||{}),ke=Bn;var Fn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(Fn||{}),nt=Fn;var Vn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(Vn||{}),br=Vn;var jn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(jn||{}),Mr=jn;var Hn=(u=>(u.REQUIRE_AUTH_TO_JOIN="REQUIRE_AUTH_TO_JOIN",u.AUDIENCE_MODE="AUDIENCE_MODE",u.WAITING_HALL="WAITING_HALL",u.WAIT_FOR_ADMIN="WAIT_FOR_ADMIN",u.ADMIN_IS_HERE="ADMIN_IS_HERE",u.ASR="ASR",u.FEEDBACK="FEEDBACK",u.RECURRING="RECURRING",u))(Hn||{}),Qe=Hn;function Gn(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function Wn(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 Kn=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(Kn||{}),Ve=Kn;var $n=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))($n||{}),Z=$n;var qn=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(qn||{}),ei=qn;var zn=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(zn||{}),Jn=zn;function Yn(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var Qn=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(Qn||{}),ht=Qn;function wi(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var Ar=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Ar||{}),z;(m=>{function n(h){return h.length?typeof h[0]=="object"?h:h.map(E=>r(E)):[]}m.fromIds=n;function r(h,E="USER",P=0){return{id:h,type:E,deviceIdx:P}}m.fromId=r;function e(h,E=!0){let P=E?h.decorativeExternalUserId:h.externalId,b=h.deviceIdx??0;if(P)return t(P,b)}m.fromSignalingParticipant=e;function t(h,E=0){return{id:h.id,type:h.type==="ANONYM"?"ANONYM":"USER",deviceIdx:E}}m.fromSignaling=t;function i(h){return h.id}m.toSignaling=i;function a(h){let E=h.deviceIdx||0;return`{"id":"${h.id}","type":"${h.type}","deviceIdx":${E}}`}m.toString=a;function s(h,E="USER",P=0){return a(r(h,E,P))}m.fromIdToString=s;function c(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}m.fromString=c;function u(h,E){return h.id===E.id&&h.type===E.type&&h.deviceIdx===E.deviceIdx}m.compare=u;function l(h){return h?.deviceIdx||0}m.getDeviceIdx=l})(z||(z={}));function Xn(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function Zn(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var Dr=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function es(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 nc(n,r){switch(n){case ce.AUDIO:return!!r.isAudioEnabled;case ce.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case ce.VIDEO:return!!r.isVideoEnabled;case ce.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function ts(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case Ve.MUTE:case Ve.MUTE_PERMANENT:{nc(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function is(n){let{muteStates:r={},mediaSettings:e}=n;return ts(r,e)}function rs(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return ts(r,t)}function as(n,r){let e=new Uint8Array(r),t=0,i=0;for(;t<n.length&&i<r;){let a=n[t++],s=a>>4,c=a&15;if(s===15){let m;do m=n[t++],s+=m;while(m===255)}for(let m=0;m<s&&!(i>=r);m++)e[i++]=n[t++];if(t>=n.length||i>=r)break;let u=n[t]|n[t+1]<<8;if(t+=2,c===15){let m;do m=n[t++],c+=m;while(m===255)}c+=4;let l=i-u;for(let m=0;m<c&&!(i>=r);m++)e[i++]=e[l+m]}return e}var ti=class{constructor(r){o(this,"_fixNoPacketsApplied",!1);o(this,"_fixNoPacketsChecked",!1);o(this,"_fixTooManyPacketsApplied",!1);o(this,"_fixTooManyPacketsSucceeded",!1);o(this,"_fixTooManyPacketsFailed",!1);o(this,"_fixTooManyPacketsTime");o(this,"_mediaSource");o(this,"_lastPacketsSent");o(this,"_lastPacketsSentTime");o(this,"_toggleAudioPromise",null);o(this,"_fixNoPacketsAppliedVideo",!1);this._mediaSource=r}_fixAudioDeviceNoPackets(r){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,R.log(D.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,R.log(D.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(M.getMicrophonePermissionState()!=="denied"))}}_fixAudioDeviceTooManyPackets(r){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let e=75,t=Date.now();if(!this._lastPacketsSentTime)r.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent);else if(t-this._lastPacketsSentTime>500){let i=(r.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=r.packetsSent,this._fixTooManyPacketsApplied?i>e?(d.log("[AudioFix] Failed to fix RV"),R.log(D.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),R.log(D.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,R.log(D.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0),this._fixTooManyPacketsTime=t)}}fix(r){if(!this._mediaSource)return;let e=r.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(r){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=r.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{this._mediaSource.getMediaSettings().isVideoEnabled&&this._mediaSource.toggleVideo(!0)}))}};var ki=class{constructor(r){o(this,"_output",null);o(this,"_volume",1);o(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});o(this,"_statFirstMediaReceived");this._statFirstMediaReceived=r}add(r){this.destroy(),this._output={},this._output.audioTrack=r,this._initAudioElement()}remove(r){!this._output||this._output.audioTrack!==r||this.destroy()}get volume(){return this._volume}set volume(r){this._volume=Math.max(0,Math.min(1,r)),this._output&&this._output.audioElement&&(this._output.audioElement.volume=this._volume)}_initAudioElement(){if(p.muteMode||!this._output?.audioTrack)return;let r=M.browserName()!=="Safari"||M.isMobile(),e=document.createElement(r?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{d.warn("[audio] Error on play audio"),v.onAutoplayError()},i=s=>{e.srcObject=new MediaStream([s]),e.load();let c=e.play();c&&c.catch(t)},a=()=>{d.debug("[audio] Recover audio playback");let s=this._output?.audioTrack;s?i(s):d.warn("[audio] Broken audio track")};e.onpause=a,e.onstalled=a,e.onerror=a,e.onloadeddata=()=>{this._statFirstMediaReceived.measure()},i(this._output.audioTrack),this._output.audioElement=e}_stopAudioElement(){this._output?.audioElement&&(this._output.audioElement.pause(),this._output.audioElement.srcObject=null),this._output?.audioTrack?.stop()}destroy(){this._output&&(this._stopAudioElement(),this._output=null)}async changeOutput(){try{if(!this._features.setSinkId)throw new Error('Feature "setSinkId" is not supported');if(!this._output?.audioElement)return;let r=M.getSavedOutput();r&&await this._output.audioElement.setSinkId?.(r.deviceId)}catch(r){throw R.log(D.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}};var sc=90,oc=3,Oi=class extends oe{constructor(){super(...arguments);o(this,"_lastMemoryStat",{percent:0,bytes:0})}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(i=>{let a=typeof i.userId=="string"&&t[i.userId]||null;i.userId=a?.externalId}),v.onStatistics(e,this._lastMemoryStat)}_calcMemory(){let e=window?.performance?.memory;if(!e||!e.usedJSHeapSize||!e.jsHeapSizeLimit)return;let t=Number((100*e.usedJSHeapSize/e.jsHeapSizeLimit).toFixed(2)),i=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>sc?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=oc)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var cc=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=cc/this._fftBins.length,e=Math.ceil(p.voiceParams.minFreq/r),t=Math.floor(p.voiceParams.maxFreq/r);return this._fftBins.subarray(e,t)}getLevel(){let r=this._getBins(),t=r.reduce((a,s)=>a+s,0)/r.length/255,i=this._lastSmoothedLevel*p.voiceParams.smoothing+t*(1-p.voiceParams.smoothing);return this._lastSmoothedLevel=i,{real:t,smoothed:i}}destroy(){this._mediaStreamSource&&(this._mediaStreamSource.disconnect(),this._mediaStreamSource=null),this._gainNode&&(this._gainNode.disconnect(),this._gainNode=null),this._analyser&&(this._analyser.disconnect(),this._analyser=null,this._fftBins=null,this._lastSmoothedLevel=0),this._stream.removeTrack(this._track)}};var xi=class extends oe{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,p.voiceParams.interval)};this._interval=window.setTimeout(t,p.voiceParams.interval);let i=()=>{let a=e.getSendAudioTrack();a&&this.init(a)};this.subscribe(e,"SOURCE_CHANGED",a=>{a.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&i()}),this.subscribe(e,"SOURCE_READY",i),i()}init(e){this._stopDetector(),this._detector=new 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 wr=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 kr=class extends oe{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);o(this,"_activeParticipants");o(this,"_removedParticipants");this.subscribe(e,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(e,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(e,"SIGNALLED_ACTIVE_PARTICIPANTS",this._onSignalledActiveParticipants.bind(this)),this.subscribe(e,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this._interval&&(window.clearTimeout(this._interval),this._interval=null),this.unsubscribe(),this._detector?.destroy(),this._detector=null}_onRemoteTrackAdded(e,t,i){if(i.kind==="audio"&&(this._detector?.destroy(),this._detector=new Rt(e,i),!this._interval)){let a=()=>{this._collectVolumes(),this._interval=window.setTimeout(a,p.voiceParams.interval)};this._interval=window.setTimeout(a,p.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,i){i.kind==="audio"&&(!this._detector||this._detector.track!==i||(this._detector.destroy(),this._detector=null))}_collectVolumes(){if(!this._detector)return;let e={},t=this._detector.trackId,i=this._detector.getLevel();if(t===Je.AUDIO_MIX){if(this._activeParticipants)for(let a of this._activeParticipants)e[a]=i;if(this._removedParticipants){for(let a of this._removedParticipants)e[a]={real:0,smoothed:0};this._removedParticipants=null}}else e[t]=i;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._removedParticipants=this._activeParticipants?.filter(t=>!e.includes(t))??null,this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null,this._removedParticipants=null)}};var Or=class extends oe{constructor(e,t,i){super();o(this,"_speakerId",null);o(this,"_serverSideSpeakerDetection",!1);this._serverSideSpeakerDetection=i==="SERVER",this.subscribe(e,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this.subscribe(t,"SIGNALLED_SPEAKER_CHANGED",this._onServerSpeakerChanged.bind(this)),this.subscribe(t,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,i=null;if(Object.keys(e).forEach(a=>{let s=e[a].smoothed;s>t&&s>p.voiceParams.threshold&&(t=s,i=a)}),i&&i!==this._speakerId){let a=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>a*p.voiceParams.speakerLevelMultiplier&&(this._speakerId=i,this._triggerEvent("SPEAKER_CHANGED",i))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent("SPEAKER_CHANGED",e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e==="SERVER"}};var Ni=class extends oe{constructor(e,t,i){super();o(this,"_transport");o(this,"_volumes",{});o(this,"_participants",{});o(this,"_connectionTimeout",0);o(this,"_volumeTimeout",0);this._transport=e,this._participants=i,this.subscribe(e,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(t,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_onTransportStateChanged(e,t){t==="OPENED"&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),p.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),p.specListenerParams.volumeTimeout))),t==="FAILED"&&this._connectionTimeout&&(d.warn("Transport failed, send callSpecError"),R.log(D.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){let e=i=>i!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(d.warn("There is not connected transport, send callSpecError"),R.log(D.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let i="UNKNOWN",a=this._participants[t];a&&a.platform&&(i=a.platform),e.indexOf(i)<0&&(e.push(i),R.log(D.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var xr=class n{static correctHangupReason(r){switch(r){case y.HUNGUP:return"hangup";case y.CANCELED:return"canceled";case y.REJECTED:return"rejected";case y.BUSY:return"busy";case y.FAILED:return"failed";case y.MISSED:return"missed";case y.ANOTHER_DEVICE:return"another_device";case y.REMOVED:return"removed";case y.BANNED:return"banned";case y.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![y.HUNGUP,y.CANCELED,y.REJECTED,y.FAILED,y.BUSY,y.MISSED,y.ANOTHER_DEVICE,y.REMOVED,y.BANNED,y.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;R.logClientStats({name:X.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Nr=class{constructor(){o(this,"_isCallMarked",!1);o(this,"_isFinished",!1);o(this,"_callType",null)}markAcceptCall(r){this.mark(r==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(r){r==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(r){r==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(r){r==="SERVER"&&this.mark("server_join_server")}mark(r){this._isCallMarked||(this._isCallMarked=!0,this._callType=r,pe.setMark(X.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Me.logEventualStat({name:X.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var dc=1e3,lc=1e4;var pc=15,q=class q extends oe{constructor(e,t){super();o(this,"_api");o(this,"_signaling");o(this,"_signalingActor");o(this,"_mediaSource",null);o(this,"_conversation",null);o(this,"_myLastRequestedLayouts",{});o(this,"_state","IDLE");o(this,"_participantState",Z.CALLED);o(this,"_participants",{});o(this,"_pendingParticipants",new Map);o(this,"_transport",null);o(this,"_debugInfo",null);o(this,"_volumesDetector",null);o(this,"_speakerDetector",null);o(this,"_localVolumeDetector",null);o(this,"_specListener",null);o(this,"_activeSpeakerId",null);o(this,"_lastSignalledActiveSpeakerId",null);o(this,"_isRealTimeAsrRequested",!1);o(this,"_serverSettings",En());o(this,"_onUnload");o(this,"_audioOutput");o(this,"_lastStalled",{});o(this,"_audioMixStalled",!1);o(this,"_audioFix",null);o(this,"_streamByStreamId",new Map);o(this,"_streamIdByStreamDescription",new Map);o(this,"_streamWaitTimerByStreamDescription",new Map);o(this,"_sequenceNumberByStreamDescription",new Map);o(this,"_cooldownTimestampByStreamDescription",new Map);o(this,"_cooldownQueueCleanupTimer",null);o(this,"_statFirstMediaReceived");o(this,"_changeMediaSettings",I.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(t){if(d.warn("changeMediaSettings failed with error",t),t.message==="chatRoom.maxShareCountExceeded")return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100));R.create(e,t),R.setConversationIdProvider(()=>this._conversation?.id||null),Me.create(),rt.create(()=>this._transport?.getTopology()),ut.create(),mt.create(),this._api=e,this._signaling=new Bt,this._signalingActor=new wr(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id,this._state==="IDLE"?y.CANCELED:y.HUNGUP),p.clientEventsLoggingEnabled&&R.logClientEvent({event_type:X.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),R.destroy(),Me.destroy(),rt.destroy(),ut.destroy(),mt.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new Nr,this._audioOutput=new ki(this._statFirstMediaReceived),p.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),dc))}static current(){return q._current}static hangupAfterInit(){q._activationMutex&&!q._current&&(q._delayedHangup=!0)}static id(){return q._current?._conversation?.id||null}async onStart({opponentIds:e,opponentType:t,mediaOptions:i,payload:a="",joiningAllowed:s=!1,requireAuthToJoin:c=!1,onlyAdminCanShareMovie:u,externalIds:l,onFastStart:m}){if(q._activationMutex)throw R.log(D.ERROR,"startCall"),d.warn("Conversation: there is already running activation"),new j(y.FAILED);let h=Date.now();q._activationMutex=!0,xe.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let E=this._mediaSource.getMediaSettings();t===nt.CHAT||e&&e.length>1?this._logWithMediaSettings(D.OUTGOING_MULTIPARTY_CALL,E):this._logWithMediaSettings(D.OUTGOING_CALL,E);let P=await this._startConversation({opponentIds:e,opponentType:t,direction:ke.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:c,onlyAdminCanShareMovie:u,externalIds:l,startedTime:h,onFastStart:m});if(!this._conversation)throw new j(y.UNKNOWN_ERROR);if(this._participantState=Z.ACCEPTED,this._changeMediaSettings(E),await this._processConnection(P),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),q._delayedHangup)throw new j(y.CANCELED);return d.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:i}),await this._processConnectionSharedMovieInfo(P),await this._processConversationUrlSharingInfo(P),v.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants()),await this._onConversationParticipantListChunk(P),await this._processPinnedParticipants(P),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),q._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(E){throw this._close(E,"Unable to start conversation"),E}finally{q._activationMutex=!1}}async onJoin(e){if(q._activationMutex)throw R.log(D.ERROR,"joinCall"),d.warn("Conversation: there is already running activation"),new j(y.FAILED);let t=Date.now();q._activationMutex=!0,this._state="PROCESSING",xe.startSession();try{let i=!!e.observedIds?.length;if(i&&p.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new j(y.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new j(y.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a),this._conversation.waitForAdmin||this._conversation.waitingHall?(d.log(this._conversation.waitForAdmin?"Wait for admin":"In waiting hall"),q._current=this,q._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus(this._conversation.waitForAdmin?"WAIT_FOR_ADMIN":"WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(i){throw q._activationMutex=!1,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){d.debug("Join conversation part 2"),q._activationMutex=!0;try{if(this._participantState=Z.ACCEPTED,!this._conversation||!this._mediaSource)throw new j(y.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(e),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),this._state==="CLOSE")return this._conversation;if(q._delayedHangup)throw new j(y.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),t),await this._onConversationParticipantListChunk(e),await this._processPinnedParticipants(e),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),q._current=this;let i=this._extractLocalParticipantFromConnection(e);if(i){let a=I.mapParticipantState(i);Object.keys(a).length>0&&v.onLocalParticipantState(a)}return this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation}catch(t){throw this._close(t,"Unable to join conversation"),t}finally{q._activationMutex=!1}}async _extractExternalRooms(e){let t=e.map(this._convertRoomToExternal.bind(this));return(await Promise.all(t)).filter(a=>!!a)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let i={rooms:await this._extractExternalRooms(e)};return t&&(i.roomId=t),i}async onPush(e,t=ae.USER,i,a,s){if(q._activationMutex)throw d.warn("Conversation: there is already running activation"),new j(y.REJECTED);q._activationMutex=!0;try{let c=Date.now(),u=await this._prepareConversation(e,t,i,a,s);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new j(y.UNKNOWN_ERROR);if(!u.conversation.participants.find(m=>m.state===Z.CALLED&&m.id===this._conversation?.userId))throw d.log("Push rejected (there is an active call)"),R.log(D.PUSH,"rejected"),new j(y.REJECTED);if(xe.startSession(),await this._processConnection(u),this._extractConnectionUrlSharingInfo(u),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(u),this._signaling.readyToSend(),this._logCallStartEvent(c,ke.INCOMING),R.log(D.PUSH,"accepted"),q._current=this,q._delayedHangup)throw new j(y.CANCELED);q._activationMutex=!1}catch(c){throw q._activationMutex=!1,this._close(c,"Unable to handle inbound call push"),c}}_isInWaitingHall(e){return!e.conversation||!e.conversation.options.includes(Qe.WAITING_HALL)?!1:this._isRestricted(e)}_isWaitForAdmin(e){if(!e.conversation)return!1;let t=e.conversation.options.includes(Qe.WAIT_FOR_ADMIN),i=e.conversation.options.includes(Qe.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(Qe.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new j(y.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.ACCEPT_CONCURRENT,e),d.debug("Concurrent call",{conversationId:this._conversation.id});try{this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(this._mediaSource.getMediaSettings()),v.onCallAccepted(),this._state="ACTIVE",this._participantState=Z.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}async _getMainRoomParticipants(){let e=await this._getParticipants();return I.mapSharedParticipants(Object.values(e).filter(t=>!t.isInRoom))}_decodeExternalConversationParams(e){let[t,i]=e.split(":"),a=parseInt(t,10);if(isNaN(a))throw new Error("Invalid original length in prefix");let s=atob(i),c=new Uint8Array(s.length);for(let u=0;u<s.length;u++)c[u]=s.charCodeAt(u);try{let l=as(c,a).reduce((Ie,Te)=>(Ie+=String.fromCharCode(Te),Ie),""),{srcp:m,stne:h,tkn:E,trne:P,trnp:b,trnu:H,wse:J,wte:de}=JSON.parse(l);return{token:E,endpoint:J,wt_endpoint:de,turn_server:{urls:P.split(","),username:H,credential:b},stun_server:{urls:h.split(",")},client_type:m}}catch(u){throw this._close(u,"Can't decompress conversation params"),u}}_logCallStartEvent(e,t){let i={[ke.OUTGOING]:"outgoing",[ke.INCOMING]:"incoming",[ke.JOINING]:"join"};Me.logEventualStat({name:X.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[i[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw R.log(D.ERROR,"acceptIncoming"),d.error("Unable to accept a call - invalid state"),new Error("Unable to accept a call - invalid state");if(!this._mediaSource||!this._conversation||!this._transport)throw new j(y.UNKNOWN_ERROR);this._state="PROCESSING",d.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(D.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=Z.ACCEPTED;let i=this._getMuteStatesForCurrentRoom(),a=Object.keys(i);a.length&&this._onMuteParticipant({muteStates:i,mediaOptions:a,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());if(s.rooms?.rooms){let u=await this._getParticipants();s.rooms.rooms.forEach(l=>{l.participantIds?.forEach(m=>{u[m]&&(u[m].isInRoom=!0)})})}this._conversation.roomId=s.rooms?.roomId||null;let c=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(v.onCallAccepted(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),c),p.useParticipantListChunk){let u=await this._getInitialParticiapntListChunk(),l=await this._getParticipants();u?.participants?.forEach(m=>{let h=I.composeId(m),E=l[h];E&&(E.movieShareInfos=m.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:u})}return v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0),await this._processConversationUrlSharingInfo(),await this._processConnectionAsrInfo(),this._conversation}catch(t){throw this._close(t,"Unable to accept call"),t}}async decline(){if(this._state!=="IDLE")throw R.log(D.ERROR,"declineIncoming"),d.error("Unable to decline a call - invalid state"),new Error("Unable to decline a call - invalid state");this._state="PROCESSING",d.debug("Decline incoming call"),this._logWithMediaSettings(D.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=Z.HUNGUP,this._signaling.ready&&await this._signaling.hangup(y.REJECTED),this._close(new j(y.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?y.HUNGUP:y.CANCELED;R.log(D.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new j(e))):v.onHangup(new j(y.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new j(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map(z.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;if(!s&&i.rejectedParticipants)throw new Error(i.rejectedParticipants[0].reason);for(let c of s)await this._onAddParticipant(I.composeId(c),c,a)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new j(y.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipantLegacy(e,t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=y.UNKNOWN_ERROR);let s=i.participants;for(let c of s)await this._onAddParticipant(I.composeId(c),c,a)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let i=[];for(let a of e)(a.state===Z.CALLED||a.state===Z.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===Z.ACCEPTED&&i.push(a.id);i.length?this._transport.open(i,null,!!this._conversation?.observer):this._transport.getTopology()==="SERVER"&&this._forceOpenTransportForAloneInCall()}async _close(e,t){t&&d.error(t,e),d.debug("Close conversation",e),xr.sendHangupEvent(e,this._transport?.getTopology()),rt.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(y.FAILED):R.log(D.ERROR,e.hangup),q._activationMutex=!1;let i=this._conversation&&this._conversation.id;if([y.CANCELED,y.NOT_FRIENDS,y.CALLEE_IS_OFFLINE,y.CALLER_IS_BLOCKED,y.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===y.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===y.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===y.SOCKET_CLOSED||e.hangup===y.NOT_FOUND)&&q._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===y.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state="CLOSE",this._participantState=Z.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),R.destroy(),Me.destroy(),this._conversation=null,this._myLastRequestedLayouts={},q._current=null,q._delayedHangup=!1,v.onHangup(e||new j(y.UNKNOWN_ERROR),i)}async destroy(){let e=this._conversation&&this._conversation.id;d.debug("Destroy conversation",{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state="CLOSE",this._participantState=Z.HUNGUP,this._cleanupMediaSource(),await this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._cleanupListeners(),R.destroy(),Me.destroy(),this._conversation=null,this._myLastRequestedLayouts={},q._current=null,q._delayedHangup=!1}async _getConversationParams(e){let t=await this._api.getConversationParams(e);d.debug("Api.getConversationParams",t);let i=[],{turn_server:a,stun_server:s}=t;if(s&&i.push(s),a&&a.urls){let c=a.urls.filter((u,l,m)=>m.indexOf(u)===l);c.push(`${c[c.length-1]}?transport=tcp`),i.push({urls:c,username:a.username,credential:a.credential})}return p.iceServers=i,p.wssBase=t.endpoint,t.wt_endpoint&&(p.wtsBase=t.wt_endpoint),p.wssToken=t.token,t.client_type&&(p.clientType=t.client_type),t.external_user_type&&(p.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:i,wt_endpoint:a,token:s,client_type:c}){let u=[];if(t&&u.push(t),e&&e.urls){let l=e.urls.filter((m,h,E)=>E.indexOf(m)===h);l.push(`${l[l.length-1]}?transport=tcp`),u.push({urls:l,username:e.username,credential:e.credential})}p.iceServers=u,p.wssBase=i,p.wssToken=s,a&&(p.wtsBase=a),c&&(p.clientType=c)}_addGeoParamsToEndpoint(e,t){return t.isp_as_no&&(e+=`&ispAsNo=${t.isp_as_no}`),t.isp_as_org&&(e+=`&ispAsOrg=${t.isp_as_org}`),t.loc_cc&&(e+=`&locCc=${t.loc_cc}`),t.loc_reg&&(e+=`&locReg=${t.loc_reg}`),e}async _startConversation({opponentIds:e,opponentType:t,direction:i,mediaOptions:a,payload:s="",joiningAllowed:c=!1,requireAuthToJoin:u=!1,onlyAdminCanShareMovie:l,externalIds:m,startedTime:h,onFastStart:E}){pe.setMark(X.SIGNALING_CONNECTED);let P=I.uuid();d.debug("Conversation: start",{conversationId:P,opponentIds:e,opponentType:t,direction:i});let b=a.includes(ce.VIDEO),H;if(E){let de={deviceId:this._api.deviceId(),sdkVersion:p.sdkVersion,clientAppKey:p.apiKey,platform:p.platform,protocolVersion:p.protocolVersion,domainId:p.domain,capabilities:at.getFlags()},Ie=JSON.stringify(de),Te;try{if(Te=await E({internalParams:Ie,conversationId:P,externalIds:m,opponentType:t,mediaOptions:a,isVideo:b,joiningAllowed:c,requireAuthToJoin:u}),!Te.internalCallerParams)throw new j(y.FAST_START_ERROR,{message:JSON.stringify(Te)})}catch(Y){throw Y instanceof Error?new j(y.FAST_START_ERROR,{message:Y.message}):new j(y.FAST_START_ERROR,{message:String(Y)})}try{let Y=JSON.parse(Te.internalCallerParams);H={endpoint:Y.endpoint,wt_endpoint:Y.wtEndpoint,id:P,is_concurrent:Y.isConcurrent,client_type:Y.clientType,rejected_participants:Te.rejectedParticipants?.map(Re=>({...Re,status:Re.status})),stun_server:Y.stun,turn_server:Y.turn,token:new URL(Y.endpoint).searchParams.get("token")??""},d.debug("FastStart",H)}catch{throw new j(y.UNKNOWN_ERROR,{message:"Cannot parse internal params"})}}else H=await this._api.startConversation(P,e,t,b,s,c,u,{onlyAdminCanShareMovie:l},m),d.debug("Api.startConversation",H);this._setConversationParams(H);let J=await this._connectSignaling(We.START,H);return await this._setConversation(H,J,i),this._logCallStartEvent(h,ke.OUTGOING),J}async _joinConversation(e,t){pe.setMark(X.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:c,observedIds:u,payload:l}=e;d.debug("Conversation: join",{conversationId:i,joinLink:c,observedIds:u});let m=a.includes(ce.VIDEO),h;if(i)h=await this._api.joinConversation(i,m,s);else if(c)h=await this._api.joinConversationByLink(c,m,u,l);else throw new j(y.UNKNOWN_ERROR);d.debug("Api.joinConversation",h),this._setConversationParams(h);let E=await this._connectSignaling(We.JOIN,h);return await this._setConversation(h,E,ke.JOINING),this._logCallStartEvent(t,ke.JOINING),E}async _prepareConversation(e,t=ae.USER,i,a,s){pe.setMark(X.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let c=this._api.getUserId();if(!c)throw new j(y.UNKNOWN_ERROR);let u=0,l="",m="",h={id:e,peerId:i,endpoint:l,wt_endpoint:m,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let P=this._decodeExternalConversationParams(a);this._setConversationParams(P),l=s??`${p.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,h.token=P.token,h.endpoint=l,p.wtsBase&&(m=`${p.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,h.wt_endpoint=m)}else{let P=await this._getConversationParams(e);u=P.device_idx||0,l=s??`${p.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,l=this._addGeoParamsToEndpoint(l,P),h.token=P.token,h.endpoint=l,h.device_idx=u,p.wtsBase&&(m=`${p.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${p.wssToken}`,m=this._addGeoParamsToEndpoint(m,P),h.wt_endpoint=m)}let E=await this._connectSignaling(We.ACCEPT,h);return q._current&&(q._current._participantState===Z.ACCEPTED||q._current._participantState===Z.CALLED)?(d.log("Push rejected (busy)"),R.log(D.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(y.BUSY),Promise.reject(new j(y.BUSY))):(q._current&&(q._current.destroy(),q._current=null),await this._setConversation(h,E,ke.INCOMING,t),E)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:Pe(),participantState:{},state:Z.CALLED,status:null,remoteStream:null,mediaSource:null,platform:null,clientType:null,roles:[],networkRating:1,lastRequestedLayouts:{},muteStates:{},unmuteOptions:[],observedIds:[],isInRoom:!1,markers:null},e);return i.externalId||(i.externalId=await this._getParticipantId(t??i.id)),this._api.cacheExternalId(t??i.id,i.externalId),t&&this._api.mapDecorativeId(t,i.id),i.observedIds?.length&&(i.externalId.observer=!0),e.markers&&(i.markers=this._denormalizeMarkers(i.id,e.markers)),i}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new j(y.NETWORK_ERROR),t),t}}async _setConversation(e,t,i,a=ae.USER){let{participants:s}=t.conversation;s.forEach(h=>{let E=I.composeId(h),P=z.fromSignalingParticipant(h,!1);if(P){this._api.cacheExternalId(E,P);let b=I.composeDecorativeId(h),H=z.fromSignalingParticipant(h);b&&H&&(this._api.cacheExternalId(b,H),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let c=this._api.getUserId(),u=this._extractLocalParticipantFromConnection(t),l=e.device_idx||0;if(!c){if(!u)throw new j(y.UNKNOWN_ERROR);c=Number(u.id),u.idType&&(a=u.idType),u.deviceIdx&&(l=u.deviceIdx),this._api.setUserId(c)}let m=I.composeParticipantId(c,a,l);this._conversation={userId:c,compositeUserId:m,externalId:await this._getExternalIdByParticipantId(m),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||"DIRECT",direction:i,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:u?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),waitForAdmin:this._isWaitForAdmin(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},xe.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(p.forceRelayPolicy=e.p2p_forbidden),R.log(D.RELAY_POLICY,p.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new j(y.UNKNOWN_ERROR);this._conversation.acceptTime=e.conversation.acceptTime,this._conversation.features=e.conversation.features||[],this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._conversation.participantsLimit=e.conversation.participantsLimit||30,this._conversation.topology=e.conversation.topology||"DIRECT",this._conversation.concurrent=e.isConcurrent||!1,this._conversation.chatId=e.conversation.multichatId,this._conversation.mediaModifiers=e.mediaModifiers,this._conversation.waitingHall=!1,this._conversation.waitForAdmin=!1,this._conversation.restricted=!1}_createMediaSource(){let e=new Wi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new ti(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint?t.wt_endpoint:null),this.subscribe(this._signaling,Ae.NOTIFICATION,a=>this._signalingActor.add(a)),this.subscribe(this._signaling,Ae.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Ae.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return Me.logEventualStat({name:X.SIGNALING_CONNECTED}),i}async _processConnection(e){await this._registerConnectionParticipants(e),this._processRooms(e),this._processMuteStates(e),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options),e.chatRoom&&e.chatRoom.totalCount&&this._onChatRoomUpdated(br.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&v.onConversationParticipantListChunk(await this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{...{participants:[],countBefore:0,countAfter:0,markerFound:!1},...e}}async _participantListChunkToExternalChunk(e){let t=await this._getParticipants(),i=I.mapSharedParticipants(e.participants.reduce((a,s)=>{let c=I.composeId(s);return t[c]&&a.push(t[c]),a},[]));return{...e,participants:i}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let i of t)await this._registerParticipants(i?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let i=e[0]?.externalId?.type;i&&(p.externalUserType=i);let a=await this._getParticipants();for(let s of e){let c=I.composeId(s);if(d.test("Conversation:RegisterParticipant",c),this._isMe(c)){this._conversation.roles=s.roles||[],this._conversation.roles.length&&(d.debug(`Local roles changed: ${s.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(s);continue}if(s.state===Z.HUNGUP||s.state===Z.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],y.HUNGUP);continue}let u=I.composeDecorativeId(s);this._registerParticipant({id:c,externalId:z.fromSignalingParticipant(s),mediaSettings:Pe(s.mediaSettings),participantState:I.mapParticipantState(s),state:s.state,roles:s.roles||[],status:"WAITING",muteStates:s.muteStates||{},unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(c,s.markers),movieShareInfos:s.movieShareInfos,isInRoom:t},u);let l=await this._getParticipant(c);l&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${c}] changed: ${s.roles}`),v.onRolesChanged(l.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=Dr(e,Ve.MUTE),s=Dr(e,Ve.MUTE_PERMANENT);for(let c of[a,s])c.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:c,stateUpdated:!0})};I.setImmediate(()=>i().catch(a=>d.error(a)))}_getStatusByTransportState(e){let t=null;return e==="CONNECTED"?t="CONNECTED":e==="CONNECTING"||e==="OPENED"?t="CONNECTING":e==="RECONNECTING"&&(t="RECONNECT"),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let i=(await this._getParticipants())[e];if(i)return i;let a=this._api.getDecorativeIdByInitialId(I.decomposeId(e).id),s=a?I.composeUserId(a):void 0;return this._createParticipant({id:e},s)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(p.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let i=await this._getParticipantId(e);return this._api.cacheExternalId(e,i),i}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(p.useParticipantListChunk){let a=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return a.markers=this._denormalizeMarkers(a.id,t),a}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){d.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let i=Object.values(t).find(a=>"ts"in a&&"rank"in a);return Object.entries(t).reduce((a,[s,c])=>(a[s]={...i,...c,id:e},a),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let i=es(e);this._setMuteStatesForRoomId(i,null);for(let u of e.rooms?.rooms??[])this._setMuteStatesForRoomId(u.muteStates,u.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=rs(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 Tr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Oi,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===Z.ACCEPTED||i.state===Z.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new kr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new Or(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new xi(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Ni(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=M.getCameras().length,t=M.getMicrophones().length;d.debug("Cameras: "+e+(M.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(M.hasMicrophonePermission()?"✔":"✖")),R.log(D.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){R.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}async _removeParticipant(e,t){if(e.state===Z.CALLED||e.state===Z.ACCEPTED||this._state==="CLOSE")return;e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null);let i=await this._getParticipants();if(i[e.id]){t===y.HUNGUP?this._setParticipantsStatus([e],"HANGUP"):this._setParticipantsStatus([e],"ERROR",t),e.mediaSource?.disconnect(),this._conversation&&this._conversation.pinnedParticipantIdByRoom.get(null)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(null),this._conversation&&this._conversation.roomId&&this._conversation.pinnedParticipantIdByRoom.get(this._conversation.roomId)===e.id&&this._conversation.pinnedParticipantIdByRoom.delete(this._conversation.roomId);for(let[a,s]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(a),this._sequenceNumberByStreamDescription.delete(a),this._cooldownTimestampByStreamDescription.delete(a),this._streamWaitTimerByStreamDescription.has(a)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(a)),this._streamWaitTimerByStreamDescription.delete(a)),this._sendUpdateDisplayLayout({[a]:{stopStream:!0}},!1);this._api.unmapDecorativeId(e.id),delete i[e.id],v.onRemoteRemoved(e.externalId,e.markers)}}_cleanupListeners(){this.unsubscribe(),window.removeEventListener("unload",this._onUnload)}_cleanupMediaSource(){this._mediaSource&&(this._mediaSource.destroy(),this._mediaSource=null)}async _cleanupParticipants(){Object.values(await this._getParticipants()).forEach(e=>{e.remoteStream?.getTracks().forEach(t=>t.stop()),e.remoteAudioTrack?.stop(),e.secondStream?.getTracks().forEach(t=>t.stop()),e.mediaSource?.disconnect()}),this._participants={},this._audioOutput&&this._audioOutput.destroy()}_cleanupParticipantAgnosticStreams(){d.debug("cleaning up participant-agnostic streams"),this._streamByStreamId.forEach(e=>{e.getTracks().forEach(t=>{t.stop()})}),this._streamByStreamId=new Map,this._streamWaitTimerByStreamDescription.forEach(e=>{window.clearTimeout(e)}),this._streamWaitTimerByStreamDescription=new Map,this._streamIdByStreamDescription=new Map,this._sequenceNumberByStreamDescription=new Map,this._cooldownTimestampByStreamDescription=new Map}_cleanupTransport(){this._transport&&(this._transport.destroy(),this._transport=null),this._debugInfo&&(this._debugInfo=null)}_cleanupSpeakerDetector(){this._speakerDetector&&(this._speakerDetector.destroy(),this._speakerDetector=null),this._volumesDetector&&(this._volumesDetector.destroy(),this._volumesDetector=null),this._localVolumeDetector&&(this._localVolumeDetector.destroy(),this._localVolumeDetector=null)}_cleanupSpecListener(){this._specListener&&(this._specListener.destroy(),this._specListener=null)}_cleanupSignaling(){this._signaling.close(),this._signaling.cleanup()}async _onAddParticipant(e,t,i){d.debug(`Add new participant [${e}]`);let a=await this._getParticipant(e);if(a&&(a.state===Z.ACCEPTED||a.state===Z.CALLED)){d.warn(`Participant [${a.id}:${a.state}] is already in conversation`);return}if(!a){let s=I.composeDecorativeId(t);this._registerParticipant({id:e,externalId:z.fromSignalingParticipant(t),mediaSettings:Pe(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s),a=await this._getParticipant(e)}this._setParticipantsStatus([a],"WAITING"),i?(a.state=Z.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=Z.CALLED,this._transport.allocate(a.id,!0),R.log(D.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=pc;a++){let s=I.compose(e,a),c=i[s];c&&t.push(c)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let a of t)this._transport.close(a.id);R.log(D.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(se.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(se.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(se.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,i=null){if(!this._transport||!this._conversation)return;let a=!t,s=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let c=i??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:c,isMe:a});return}this._transport.setAnimojiSvg(s,{svg:e,isMe:a})}setAnimojiFill(e){this._transport?.setAnimojiFill(e)}async setVideoStream(e,t=!1){if(this._mediaSource)return this._mediaSource.setVideoStream(e,t)}async setAudioStream(e){if(this._mediaSource)return this._mediaSource.setAudioStream(e)}async toggleLocalVideo(e){if(this._mediaSource)return R.log(D.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return R.log(D.MEDIA_STATUS,e?"audio_1":"audio_0"),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},i={};for(let s of e){let c=typeof s.uid=="object"?s.uid:z.fromId(s.uid),u=z.toString(c);i[u]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let c=z.toString(s.externalId);Object.hasOwn(i,c)&&(t[s.id]=i[c])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[i,a]of Object.entries(e))if(i.length>5||a.length>5)throw new Error("key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded");t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[tt(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready)return;d.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={},i=await this._getParticipants();for(let s of e){let c=typeof s.uid=="object"?s.uid:z.fromId(s.uid),u=this._api.getCachedOkIdByExternalId(c);if(!u){let h=z.toString(c);d.log(`Unknown participant external ID ${h}`);continue}let l=tt({participantId:u,mediaType:s.mediaType,streamName:s.streamName}),m=i[u];m?m.lastRequestedLayouts[l]=s:this._isMe(u)&&(this._myLastRequestedLayouts[l]=s),$t(s)?(this._isMe(u)&&delete this._myLastRequestedLayouts[l],this._streamIdByStreamDescription.has(l)&&!this._cooldownTimestampByStreamDescription.has(l)&&this._cooldownTimestampByStreamDescription.set(l,Date.now())):(this._cooldownTimestampByStreamDescription.delete(l),!this._streamIdByStreamDescription.has(l)&&p.videoTracksCount>0&&this._streamIdByStreamDescription.set(l,null),t[l]=s),s.mediaType==="SCREEN"&&!$t(s)&&pe.setMark(pe.getMarkNameScreenshareFirstFrame(u))}let a=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>p.videoTracksCount;){let s=a.next();if(s.done){d.error("Cannot accommodate all streaming requests: tracks available "+p.videoTracksCount+"; requested streams: "+Array.from(this._streamIdByStreamDescription.keys()));break}await this._stopStreaming(s.value),t[s.value]={stopStream:!0}}this._transport?.getTopology()==="SERVER"&&await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,i){if(this._conversation)if(!p.clientEventsLoggingEnabled)this._api.sendUserFeedbackStats(this._conversation.id,e,t,i);else{let a={event_type:X.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(a.reason=t),i!==void 0&&(a.group_call_users_count=i),R.logClientEvent(a,!0)}}sendClientEvent(e,t={},i=!1){let a={event_type:e,...t};R.logClientEvent(a,i)}async _stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(d.log("Client asked to stop streaming before stream became available",e),window.clearTimeout(this._streamWaitTimerByStreamDescription.get(e)),this._streamWaitTimerByStreamDescription.delete(e)),this._streamIdByStreamDescription.get(e)){let i=await this._getParticipants(),a=qt(e),s=i[a.participantId],c=this._conversation?.externalId,u=this._isMe(a.participantId);if(s||u){switch(a.mediaType){case"STREAM":case"MOVIE":{if(a.streamName){let l={stream:null,streamName:a.streamName,mediaType:a.mediaType};u?v.onLocalLive(c,l):v.onRemoteLive(s.externalId,l)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null);break}}R.log(D.PAT_DEALLOCATED)}else d.log(`Cannot find participant to stop streaming: ${a.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e,t=!0){if(Object.keys(e).length===0)return;d.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let i;try{if(i=await this._signaling.updateDisplayLayout(e),!i)return}catch(c){if(d.warn(`Failed to update display layout ${JSON.stringify(e)}. ${c}`),t)throw c;return}let a=[],s=await this._getParticipants();for(let[c,u]of Object.entries(i.errorCodeByParticipantId||{})){let l=qt(c),m=s[l.participantId];if(m){let h;typeof u!="number"?(d.warn(`Unexpected error code ${u} received for participant ${l.participantId}`),h=Jn.UNKNOWN_ERROR):h=Yn(u),a.push({externalId:m.externalId,errorReason:h})}}if(a&&a.length&&(d.warn("Could not allocate one or more participants",a),t))throw new Ea("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]+lc>Date.now())break;let c=a[0];await this._stopStreaming(c),e[c]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e,!1)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;d.log("Received participant sources update notification",t);for(let i of t)this._waitForStreamIfNeeded(i)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(d.log("Promoted in audience mode",!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(d.log("Promoted in waiting hall",!e.demote),e.demote?(d.log("Kicked from waiting hall"),this._close(new j(y.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),v.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,i=[],a,s){d.log(`Chat room updated: ${e}`);let c=[],u=[],l=[],m=[],h=[];if(i.length&&i.forEach(b=>{if(b.externalId){let H=z.fromSignaling(b.externalId);h.push(H),this._api.cacheExternalId(b.id.id,H)}else{let H=I.decomposeId(b.id.id).id;c.push(H),m.push(H)}}),a?.length&&a.forEach(b=>{let H=I.decomposeId(b).id;c.push(H),u.push(H)}),s?.length&&s.forEach(b=>{let H=I.decomposeId(b).id;c.push(H),l.push(H)}),!c.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let b=await this._api.getExternalIdsByOkIds(m);h.push(...b)}let E=await this._api.getExternalIdsByOkIds(u),P=await this._api.getExternalIdsByOkIds(l);v.onChatRoomUpdated(e,t,h,E,P)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let i of e.data)if(this._isMe(i.participantId))v.onLocalLiveUpdate(t,i);else{let s=await this._getExternalIdByParticipantId(i.participantId);s&&v.onRemoteLiveUpdate(s,i)}}async _onSharedMovieInfoStarted(e){d.log(`Shared movie started data received: ${e.notification}`),await this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}async _processSharedMovieInfos(e,t=null){e&&await Promise.all(e.map(i=>this._processSharedMovieInfo(i,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let i=this._conversation?.externalId;if(this._isMe(e.initiatorId))v.onLocalSharedMovieInfo(i,e,t);else{let s=await this._getExternalIdByParticipantId(e.initiatorId);s&&v.onRemoteSharedMovieInfo(s,e,t)}}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(i=>this._isMe(I.composeId(i)));await this._processSharedMovieInfos(t?.movieShareInfos,e?.rooms?.roomId??null)}async _processConnectionAsrInfo(e){let t=e?.conversation.asrInfo??this._conversation?.asrInfo;if(t&&this._conversation?.asrInfoByRoom.set(null,t),e?.rooms?.rooms)for(let s of e.rooms.rooms)s.asrInfo&&this._conversation?.asrInfoByRoom.set(s.id,s.asrInfo);let i=e?.rooms?.roomId??this._conversation?.roomId??null,a=this._conversation?.asrInfoByRoom.get(i);if(a){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onAsrSet({externalId:s,movieId:a.movieId},i)}else i&&v.onAsrSet(null,i)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,i=this._conversation.roomId,a=t.get(i);if(a&&!this._isMe(a.initiatorId)){let s=await this._getExternalIdByParticipantId(a.initiatorId);s&&v.onRemoteSharedUrl(s,a.sharedUrl,i)}}_extractConnectionUrlSharingInfo(e){if(!this._conversation)return;let{urlSharingInfoByRoom:t}=this._conversation;if(e.conversation.urlSharingInfo?t.set(null,e.conversation.urlSharingInfo):t.delete(null),e.rooms?.rooms)for(let i of e.rooms.rooms)i.urlSharingInfo?t.set(i.id,i.urlSharingInfo):t.delete(i.id)}async _onSharedMovieInfoStopped(e){d.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:i,movieId:a,source:s,roomId:c=null}=e,u={initiatorId:i,movieId:a,source:s};if(this._isMe(i))v.onLocalSharedMovieStoppedInfo(t,u,c);else{let m=await this._getExternalIdByParticipantId(i);if(m){let E=(await this._getParticipants())[i];E?.movieShareInfos&&(E.movieShareInfos=E.movieShareInfos.filter(P=>P&&P.movieId!==a)),v.onRemoteSharedMovieStoppedInfo(m,u,c)}}}async _onUrlSharingInfoUpdated(e){if(d.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:i}=this._conversation,{initiatorId:a,sharedUrl:s,roomId:c=null}=e;if(s?t.set(c,{sharedUrl:s,initiatorId:a}):t.delete(c),!(!s&&c!==i&&t.has(i))&&(!s||!this._isMe(a))){let u=await this._getExternalIdByParticipantId(a);u&&v.onRemoteSharedUrl(u,s,c)}}_onFeaturesPerRoleChanged(e){d.log(`Features per role changed: ${e.notification}`),this._conversation&&(this._conversation.featuresPerRole=e.featuresPerRole??{}),v.onFeaturesPerRoleChanged(e.featuresPerRole)}async _waitForStreamIfNeeded(e){if(e.fastScreenShare&&!e.participantStreamDescription){let h=this._getStreamDescriptionById(e.streamId);if(h){let E=qt(h),P=await this._getParticipant(E.participantId);v.onRemoteScreenStream(P.externalId,null);return}}let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:i,participantId:a}=t;if(i==="ANIMOJI")return;let s=await this._getParticipant(a);if(i==="SCREEN"&&!e.fastScreenShare){d.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let c=tt(t),u=this._sequenceNumberByStreamDescription.get(c);if(u&&u>e.sequenceNumber){d.warn(`Participant ${a} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${u}`),R.log(D.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&i&&(d.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(s.externalId,i,e.suspend));let l=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(l,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(c);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){R.log(D.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let P=E?h:s.externalId,b=this._streamByStreamId.get(l);if(!b){R.log(D.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${l}`);return}R.log(D.PAT_ALLOCATED),this._streamIdByStreamDescription.set(c,l);let H=e.participantStreamDescription?.mediaType;if(H==="STREAM"||H==="MOVIE"){if(e.participantStreamDescription?.streamName){let J={streamName:e.participantStreamDescription.streamName,stream:b,mediaType:H};E?v.onLocalLive(P,J):v.onRemoteLive(P,J)}}else H==="SCREEN"?v.onRemoteScreenStream(s.externalId,b):E||v.onRemoteStream(s.externalId,b)}else{d.debug(`Waiting for ${m} until stream ${l} for ${c} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),m);this._streamWaitTimerByStreamDescription.set(c,h)}}_getStreamDescriptionById(e){for(let[t,i]of this._streamIdByStreamDescription.entries())if(i===e)return t;return null}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(tt(e)))return e;let t=e.participantId;if(e.mediaType){let i={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(tt(i)))return i}else{let i={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(tt(i)))return i;let a={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(tt(a)))return a}return d.error("Received unrequested allocation",e),null}_getWaitingTime(e,t){if(this._transport)return this._transport.getStreamWaitingTimeMs(e,t);throw new Error("transport is not initialized")}_isCallAdmin(){return this._conversation?I.includesOneOf(this._conversation.roles,[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===Z.CALLED}async grantRoles(e,t,i){this._checkAdminRole(),await this._signaling.grantRoles(e,t,i)}async startAsr(e){await this._signaling.startAsr(e)}async stopAsr(e){await this._signaling.stopAsr(e)}async requestAsr(e){this._isRealTimeAsrRequested=e,await this._signaling.requestAsr(e)}async muteParticipant(e=null,t,i=[],a=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,i,a)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,i=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,i),this._conversation?.pinnedParticipantIdByRoom.set(i,t?null:e)}async updateMediaModifiers(e){this._signaling.ready&&this._conversation&&(this._conversation.mediaModifiers=e,await this._signaling.updateMediaModifiers(e))}async enableVideoSuspend(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspend(e)}async enableVideoSuspendSuggest(e){this._signaling.ready&&this._conversation&&this._transport?.getTopology()==="SERVER"&&await this._signaling.enableVideoSuspendSuggest(e)}async changeOptions(e){if(this._signaling.ready&&this._conversation){this._checkAdminRole(),await this._signaling.changeOptions(e);let t=Wn(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=Zn(e),a)){let m=this._api.getDecorativeIdByInitialId(a.id);a.id=m?I.composeUserId(m):a.id}let s=await this._signaling.getWaitingHall(a,t,i);if(s.error)return Promise.reject(s.message);let c=s.participants||[],{externalIds:u}=await this._resolveWaitingHallExternalIds(c),l=null;return c.length&&s.hasMore&&(l=Xn(c[c.length-1].id)),{participants:u,pageMarker:l,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,i=[],a=[];if(e.length){let s=[];e.forEach(c=>{if(t.set(c.id.id,c.id.addedTs),c.externalId){let u=z.fromSignaling(c.externalId);i.push(c.id.addedTs),a.push(u),this._api.cacheExternalId(c.id.id,u)}else s.push(I.decomposeId(c.id.id).id)}),s.length&&!a.length&&(a=await this._api.getExternalIdsByOkIds(s),i=a.map(c=>{let u=this._api.getCachedOkIdByExternalId(c);return(u?t.get(u):void 0)||Date.now()}))}return{externalIds:a,timestamps:i}}async getAudienceModeHands(){if(!this._signaling.ready)throw new Error("Signaling is not ready");let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:i,timestamps:a}=await this._resolveWaitingHallExternalIds(t);return{timestamps:a,participants:i,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!I.includesOneOf(this._conversation.options,[Qe.WAITING_HALL,Qe.AUDIENCE_MODE]))throw new Error("Unable to promote a participant in the conversation with current options");if(this._checkAdminRole(),!e&&t)throw new Error("participantId is required");await this._signaling.promoteParticipant(e,t)}catch(i){throw d.warn(`Failed to promote participant ${e}. ${i}`),i}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let i=t.messages.length-1;i>=0;i--){let a=t.messages[i];await this._onChatMessage(a)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let t=(await this._api.createJoinLink(this._conversation.id)).join_link;if(t)return this._conversation.joinLink=t,t}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:i,lang:a}){let s={movieId:e,lang:a};(t||t===0)&&(s.gain=t),i&&(s.metadata=i);let c=await this._signaling.addMovie(s);if(c.error)throw new Error(c.error);return{movieId:c.movieId,streamType:c.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw new Error(t.error)}async removeMovie(e){let t={movieId:e},i=await this._signaling.removeMovie(t);if(i.error)throw new Error(i.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw new Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw new Error(e.error)}async updateRooms(e,t){let i=await this._signaling.updateRooms(e,t);if(i.error)throw new Error(i.error)}async activateRooms(e,t){let i=await this._signaling.activateRooms(e,t);if(i.error)throw new Error(i.error)}async switchRoom(e,t){let i=await this._signaling.switchRoom(e,t);if(i.error)throw new Error(i.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw new Error(t.error)}async startStream(e=!1,t=null,i=null,a="DIRECT_LINK",s=null,c=null){let u={movieId:i,name:t,privacy:a,groupId:s,roomId:c,streamMovie:!e},l=await this._signaling.startStream(u);if(l.error)return Promise.reject(l.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async recordSetConf(e,t,i=!1,a=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:i,roomId:a});if(s.error)throw new Error(s.error)}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<p.videoMinWidth||e.height<p.videoMinHeight)throw new Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<p.videoMinWidth||t.height<p.videoMinHeight)throw new Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");p.videoEffectMaxHeight=t.height,p.videoEffectMaxWidth=t.width}p.videoMaxWidth=e.width,p.videoMaxHeight=e.height,d.debug("Set local video resolution:",`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:"")),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(t=>({id:t.id,type:p.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),i=await this._signaling.getParticipants(t);if(i.error)throw new Error(i.error);let a=i.participants,s=this._transport?.getState();return Promise.all(a.map(async c=>{let u=I.composeId(c);return this._createParticipant({id:u,externalId:z.fromSignalingParticipant(c),mediaSettings:Pe(c.mediaSettings),participantState:I.mapParticipantState(c),state:c.state,roles:c.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:c.muteStates||{},unmuteOptions:c.unmuteOptions||[],observedIds:c.observedIds||[],markers:this._denormalizeMarkers(u,c.markers)},c.decorativeUserId)})).then(I.mapSharedParticipants)}async getParticipantListChunk(e){d.log("Request participant list chunk",e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw new Error(t.error);let i=this._createParticipantListChunk(t.chunk),a=await this._getParticipants(),s=i.participants.filter(u=>{let l=I.composeId(u);return!a[l]});await this._registerParticipants(s);let c=this._transport?.getState();return i.participants.forEach(u=>{let l=I.composeId(u),m=a[l];m.status=this._getStatusByTransportState(c)??"WAITING",m.movieShareInfos=u.movieShareInfos,Object.assign(m.mediaSettings,Pe(u.mediaSettings)),Object.assign(m.muteStates,u.muteStates),m.unmuteOptions=u.unmuteOptions??m.unmuteOptions,this._openTransport([m],!0)}),this._participantListChunkToExternalChunk(i)}async _getInitialParticiapntListChunk(){let e=p.participantListChunkInitIndex,t=p.participantListChunkInitCount,a=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return d.debug("Get initial participant list chunk",a.chunk),a.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new ti(this._mediaSource)),v.onLocalStreamUpdate(t,e.kind),!this._conversation?.waitingHall&&!this._conversation?.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(t)}_onScreenSharingStatus(e){let t=this._mediaSource?.getMediaSettings();d.log("Screen sharing changed",e.track,t);let i=e.track?new MediaStream([e.track]):null;v.onScreenStream(i,t)}async _changeRemoteMediaSettings(e,t){d.debug(`Remote media settings changed [${e}]`,t);let i=this._conversation?.externalId;if(this._isMe(e)&&i){v.onLocalMediaSettings(i,t);return}let s=await this._getParticipant(e);if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&v.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_extractLocalParticipantFromConnection(e){let t=this._api.getUserId();return(e.conversation.participants||[]).find(a=>a.id===t||I.comparePeerId(a.peerId,e.peerId))}_changeLocalParticipantState(e){d.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){d.debug(`Remote participant state changed [${e}]`,t);let i=await this._getParticipant(e);if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}async _changeMultipleParticipantState(e,t){d.debug("Multiple participants state changed",e);let i=[],a,s=await this._getParticipants();e.forEach((c,u)=>{if(this._isMe(u))a=c;else{let l=s[u];if(!l){this._warnParticipantNotInConversation(u);return}l.participantState=c,i.push({externalId:l.externalId,participantState:{...c},markers:l.markers})}}),this._state==="ACTIVE"&&(a&&v.onLocalParticipantState(a,!0),i.length&&v.onRemoteParticipantsState(i,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(d.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),v.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case U.ACCEPTED_CALL:return this._onAcceptedCall(e);case U.HUNGUP:return this._onHungup(e);case U.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case U.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case U.CLOSED_CONVERSATION:return this._onClosedConversation(e);case U.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case U.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case U.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case U.RATE_CALL_DATA:return this._onNeedRate();case U.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case U.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case U.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case U.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case U.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case U.REGISTERED_PEER:return this._onPeerRegistered(e);case U.SWITCH_MICRO:return this._onMicSwitched(e);case U.CHAT_MESSAGE:return this._onChatMessage(e);case U.CUSTOM_DATA:return this._onCustomData(e);case U.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case U.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case U.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case U.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case U.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case U.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case U.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case U.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case U.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case U.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case U.FEEDBACK:return this._onFeedback(e);case U.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case U.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case U.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case U.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case U.ROOMS_UPDATED:return this._onRoomsUpdated(e);case U.ROOM_UPDATED:return this._onRoomUpdated(e);case U.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case U.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case U.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case U.ASR_STARTED:return this._onAsrStart(e);case U.ASR_STOPPED:return this._onAsrStop(e);case U.PROMOTION_APPROVED:return this._onPromotionApproved(e);case U.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case U.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}v.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),await this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let s=Object.keys(await this._getParticipants()),c=[];for(let l of e.conversation.participants){let m=I.composeId(l),h=l.roles||[];if(this._isMe(m)){wi(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:is(l),unmuteOptions:l.unmuteOptions})};continue}c.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:l.id,participant:l,mediaSettings:l.mediaSettings});else{let P=Pe(l.mediaSettings);za(P,E.mediaSettings)||await this._changeRemoteMediaSettings(m,P);let b=I.mapParticipantState(l),H=E.participantState;I.isEqualParticipantState(b,H)||await this._changeRemoteParticipantState(m,b),wi(h,E.roles)||this._onRolesChanged(E.id,h)}}let u=await this._getParticipants();for(let l of s)c.indexOf(l)<0&&u[l]&&this._removeParticipant(u[l],y.HUNGUP)}let i=e.rooms?.roomId??null;if(!this._conversation){d.warn("Conversation is empty, but should be filled");return}this._conversation.roomId!==i?await this._onRoomSwitched(i):this._processMuteStates(e,!0),t?.(),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){d.error("Signaling failed",e),this._close(e)}async _onAcceptedCall(e){let t=I.composeMessageId(e),i=I.getPeerIdString(e.peerId);if(d.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new j(y.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let c=this._api.getDecorativeIdByInitialId(t),u=c?I.composeUserId(c,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Pe(e.mediaSettings)},u))}a.state=Z.ACCEPTED,a.mediaSettings=Pe(e.mediaSettings),this._logWithMediaSettings(D.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,at.parseCapabilities(e.capabilities))}async _onHungup(e){d.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=I.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new j(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let i=await this._getParticipant(t);if(!i){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),i.state=e.reason===y.REJECTED?Z.REJECTED:Z.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,y.HUNGUP)}async _onAddedParticipant(e){d.debug(`Participant added [${e.participantId}]`);let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state!==Z.HUNGUP&&i.state!==Z.REJECTED){d.debug(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:a}=e,s=a.decorativeUserId;this._registerParticipant({id:t,externalId:z.fromSignalingParticipant(a),mediaSettings:Pe(a.mediaSettings),state:a.state,participantState:I.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},s),i=await this._getParticipant(t)}i.state=Z.CALLED,i.mediaSettings=Pe(e.participant?.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant?.roles||[],this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(i.id,!0),v.onParticipantAdded(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i)}async _onJoinedParticipant(e){d.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state===Z.ACCEPTED){d.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:s}=e,c=s.decorativeUserId;this._registerParticipant({id:t,externalId:z.fromSignalingParticipant(s),mediaSettings:Pe(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=Z.ACCEPTED,i.mediaSettings=Pe(e.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i);let a=Object.keys(i.muteStates);a.length&&this._onMuteParticipant({muteStates:i.muteStates,mediaOptions:a,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(i.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new j(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=I.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,Pe(e.mediaSettings))}async _onParticipantStateChanged(e){let t=I.composeMessageId(e),i=I.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(i):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,i))}async _onParticipantsStateChanged(e){let{participants:t,roomId:i}=e,a=t.map(({id:u,markers:l})=>this._registerParticipantAndSetMarkersIfChunkEnabled(u,l));await Promise.all(a);let s=new Map,c=t.map(({id:u,participantState:l})=>this._getExternalIdByParticipantId(u).then(m=>[u,m&&I.mapParticipantState({participantState:l})]));try{(await Promise.all(c)).forEach(([l,m])=>{m&&s.set(l,m)}),await this._changeMultipleParticipantState(s,i)}catch(u){d.warn(`_onParticipantsStateChanged: Failed to get external ids. ${u}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),v.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),i=Pe(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=ua(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=ua(this._serverSettings,s),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=I.composeMessageId(e),i=await this._getParticipant(t);i&&(i.clientType=e.clientType,i.platform=e.platform),v.onPeerRegistered()}async _onMicSwitched(e){v.onDeviceSwitched(ce.AUDIO,!e.mute),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)&&!wi(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:Dr(this._getMuteStatesForCurrentRoom(),Ve.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&&!wi(i.roles,t)&&(d.debug(`Roles for participant [${e}] changed: ${t}`),i.roles=t,v.onRolesChanged(i.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:i,muteStates:a={},unmuteOptions:s=[],mediaOptions:c=[],roomId:u=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){d.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let l=await this._getParticipant(e.participantId);if(l){d.debug(`Mute states for participant [${e.participantId}] changed`,a);let m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;v.onMuteStates(a,s,c,i,e.unmute,l.externalId,m,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,u):i||(this._conversation.muteStatesPersonal=a)),e.adminId&&this._isMe(e.adminId)){i&&v.onMuteStates(a,s,c,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:c,muteAll:i,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:a})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let i=this._getMuteStatesForRoomId(t),a=this._getMuteStatesForRoomId(e),s=Object.keys(i),c=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...s,...c])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Z.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:c,roomId:u=null,unmuteOptions:l=[]}=e,m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(u)),E=this._mediaSource.getMediaSettings(),P=Object.entries(h);for(let[b,H]of P){let J=this._isCallAdmin()&&i;if(!(H!==Ve.MUTE&&H!==Ve.MUTE_PERMANENT||J)&&(this._isCallAdmin()&&H===Ve.MUTE_PERMANENT&&!i&&(h[b]=Ve.MUTE),!(!t.includes(b)||a)))switch(b){case ce.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(ce.VIDEO,!1),await this.toggleLocalVideo(!1));break;case ce.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(ce.AUDIO,!1),await this.toggleLocalAudio(!1));break;case ce.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(ce.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case ce.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(ce.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:E.isScreenSharingEnabled,fastScreenSharing:E.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(h,l,t,i,a,null,m,s,c,u)}async _onPinParticipant(e,t=!1,i,a=null){if(!this._conversation)return;let s=this._conversation.pinnedParticipantIdByRoom.get(a);if(s&&s!==e)if(this._isMe(s))v.onLocalPin(!0,a);else{let c=await this._getExternalIdByParticipantId(s);c&&v.onPinnedParticipant(c,!0,this._denormalizeMarkers(e,i),a)}if(this._isMe(e))v.onLocalPin(t,a);else{let c=await this._getExternalIdByParticipantId(e);c&&v.onPinnedParticipant(c,t,this._denormalizeMarkers(e,i),a)}this._conversation.pinnedParticipantIdByRoom.set(a,t?null:e)}_onOptionsChanged(e){this._conversation&&!Gn(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e),e.includes(Qe.ADMIN_IS_HERE)?this._conversation.restricted&&this._conversation.waitingHall&&v.onLocalStatus("WAITING_HALL"):e.includes(Qe.WAIT_FOR_ADMIN)&&this._conversation.restricted&&v.onLocalStatus("WAIT_FOR_ADMIN"))}async _onNetworkStatus(e){if(this._conversation){let t=[],i=await this._getParticipants();for(let[a,s]of Object.entries(e)){let c;if(this._isMe(a)||a==="")c=this._conversation.networkRating;else if(i[a])c=i[a].networkRating;else continue;if(c!==s)if(this._isMe(a)||a==="")this._conversation.networkRating=s,zt.getInstance().value=s,v.onLocalNetworkStatusChanged(s);else{let u=i[a];u.networkRating=s,t.push({uid:u.externalId,rating:s})}}if(t.length===0)return;d.log("Received network status update: ",e),v.onNetworkStatusChanged(t)}}async _onRemoteStreamSecond(e,t){let i=await this._getParticipant(e);i&&v.onRemoteScreenStream(i.externalId,t)}async _onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){v.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let i=await this._getParticipant(e);i&&v.onRemoteVmojiStream(i.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,v.onVmojiError({...e,externalId:t}))}catch(t){d.warn("_onAnimojiError failed",t)}}_onPeerConnectionClosed(e){e==="SERVER"&&this._cleanupParticipantAgnosticStreams()}_changeFeatureSet(){if(this._conversation){let e=this._state==="ACTIVE",t=this._conversation.features.includes(Mr.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&v.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let s=await this._getParticipant(i);s&&s.externalId&&t.push({uid:s.externalId,volume:a.real})}v.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){d.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=await this._getParticipants(),s=e.reduce((c,u)=>{if(u in a){let l=a[u];c.push(l),t==="CONNECTED"&&(l.remoteStream||(l.mediaSettings&&this._changeRemoteMediaSettings(u,l.mediaSettings),this._changeRemoteParticipantState(u,l.participantState)),this._updateDisplayLayoutFromCache(u))}else this._warnParticipantNotInConversation(u);return c},[]);s.length&&this._setParticipantsStatus(s,i)}async _onTransportLocalStateChanged(e){if(d.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(v.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&v.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&v.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(y.FAILED),this._close(new j(y.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(Je.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(Je.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))d.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{d.debug(`Remote track added on the participant [${e}]`,{kind:i.kind});let a=await this._getParticipant(e);if(!a){let s=this._api.getDecorativeIdByInitialId(e),c=s?I.composeUserId(s):void 0;d.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${c}]`),this._registerParticipant({id:e},c),a=await this._getParticipant(e),this._setParticipantsStatus([a],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(a.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(i),p.preserveAudioTracks||(a.remoteAudioTrack=i,t.removeTrack(i))),a.remoteStream!==t&&t.getTracks().length){if(a.remoteStream=t,a.secondStream)return;v.onRemoteStream(a.externalId,t)}a.mediaSettings&&this._changeRemoteMediaSettings(e,a.mediaSettings)}}_onRemoteTrackRemoved(e,t,i){switch(d.debug(`[${e}] remote track (removed)`,{track:i}),i.kind){case"audio":this._removeAudioTrack(e,t,i);break;case"video":case"screen":this._removeVideoTrack(e,t,i);break}}async _removeAudioTrack(e,t,i){if(e!==Je.AUDIO_MIX){let a=await this._getParticipant(e);if(!a||a.remoteStream&&a.remoteStream!==t)return}this._audioOutput.remove(i)}_removeVideoTrack(e,t,i){}_onTopologyChanged(e){e==="DIRECT"&&(this._onRemoteSignalledStall([]),this._onAudioMixStall(!1)),this._conversation&&(this._conversation.topology=e,this._changeFeatureSet(),this._forceOpenTransportForAloneInCall())}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,d.debug("Audio mix stalled:",e),v.onLocalStatus(e?"RECONNECT":"CONNECTED"))}async _onRemoteSignalledStall(e){let t={},i=[],a=[];d.debug("Participants stalled:",e);let s=await this._getParticipants();for(let c of e){if(t[c]=!0,!this._lastStalled[c]){let u=s[c];u&&i.push(u)}delete this._lastStalled[c]}for(let c of Object.keys(this._lastStalled)){let u=s[c];u&&a.push(u)}i.length&&this._setParticipantsStatus(i,"RECONNECT"),a.length&&this._setParticipantsStatus(a,"CONNECTED"),this._lastStalled=t}async _onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,await this._getParticipants()),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!M.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!M.hasCamera()||!this._audioFix||!this._mediaSource?.getMediaSettings().isVideoEnabled||this._audioFix.fixVideo(e)}_toggleJoinAvailability(){let e=this._conversation&&this._conversation.chatId,t=e&&this._state!=="CLOSE"||!1;e&&(d.debug("Toggle join availability",{available:t,chatId:e}),v.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!=="SERVER")return;let t=await this._getParticipant(e);if(t&&t.lastRequestedLayouts&&Object.keys(t.lastRequestedLayouts).length)try{await this.updateDisplayLayout(Object.values(t.lastRequestedLayouts))}catch(i){d.warn(`_updateDisplayLayoutFromCache failed: ${i}`)}}_setParticipantsStatus(e,t,i=null){if(!e.length)return;let a=e.reduce((s,c)=>(c.status!==t&&(c.status=t,s.push(c.externalId)),s),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){this._conversation&&e.joinLink&&(this._conversation.joinLink=e.joinLink),v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(ei)){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===ei.UPDATE)&&(e.muteStates!==void 0&&this._setMuteStatesForRoomId(e.muteStates,e.roomId),e.recordInfo!==void 0&&this._conversation?.recordsInfoByRoom.set(e.roomId,e.recordInfo),e.asrInfo!==void 0&&this._conversation?.asrInfoByRoom.set(e.roomId,e.asrInfo)),this._isCalledState()||v.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(c=>this._getExternalIdByParticipantId(c))||[]),i=await Promise.all(e.addParticipantIds?.map(c=>this._getExternalIdByParticipantId(c))||[]),a=await Promise.all(e.removeParticipantIds?.map?.(c=>this._getExternalIdByParticipantId(c))||[]),s=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:i,removeParticipantIds:a,participants:e.participants?.participants?await this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:s,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),i=e.roomId??null,a=e.addedParticipantIds?.map(P=>I.decomposeId(P).id)||[],s=await this._api.getExternalIdsByOkIds(a),c=e.addedParticipants;if(s.length&&c?.length!==s.length&&!this._isCalledState()){let P=this._convertExternalIdsToServerExternalIds(s);c=(await this._signaling.getParticipants(P)).participants}let u=await Promise.all(c?.map(async P=>{let b=I.composeId(P);return this._createParticipant({id:b,externalId:z.fromSignalingParticipant(P),mediaSettings:Pe(P.mediaSettings),participantState:I.mapParticipantState(P),state:P.state,roles:P.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:P.muteStates||{},unmuteOptions:P.unmuteOptions||[],observedIds:P.observedIds||[],markers:this._denormalizeMarkers(b,P.markers),isInRoom:i!==null},P.decorativeUserId)})||[]),l=!1;for(let P of u)P.id===this._conversation?.compositeUserId&&(l=!0),this._registerParticipantInCache(P);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(u,!0);let m=[],h=[];if(e?.removedParticipantMarkers){for(let P of e.removedParticipantMarkers)if(P.GRID?.id){let b=this._getExternalIdByParticipantId(P.GRID.id);h.push(b)}m=await Promise.all(h)}if(l&&await this._onRoomSwitched(i),m){let P=this._conversation?.pinnedParticipantIdByRoom.get(i);if(P){let b=await this._getExternalIdByParticipantId(P);if(b){for(let H of m)if(z.compare(b,H)){this._conversation?.pinnedParticipantIdByRoom.delete(i);break}}}}let E={roomId:i,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:I.mapSharedParticipants(u),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:m};this._isCalledState()||v.onRoomParticipantsUpdated(E)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let i=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){v.onRoomStart(e);return}this._isCalledState()||v.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,i),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let i=t?.rooms?.rooms??[],a=[];for(let s of i){let c=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,c),this._conversation?.recordsInfoByRoom.set(c,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(c,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(c,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(c,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(c),e){let u=await this._getParticipants();await this._registerParticipants(s?.participants?.participants?.filter(m=>!u[I.composeId(m)])||[],!0);let l=await this._convertRoomToExternal(s);l&&a.push(l)}}a.length&&!this._isCalledState()&&v.onRoomsUpdated({[ei.UPDATE]:{rooms:a}})}async _onFeedback(e){let t=[];for(let i of e.feedback){let a={...i,items:[]};for(let s of i.items){let c=await this._getExternalIdByParticipantId(s.participantId);c?a.items.push({...s,participantId:c}):this._warnParticipantNotInConversation(s.participantId)}t.push(a)}v.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:i,decorativeExternalParticipantId:a}=e,s=this._isMe(t);d.debug(`Decorative participant id changed [${t}]`,e);let c=await this._getExternalIdByParticipantId(t);if(!c){this._warnParticipantNotInConversation(t);return}let u=z.fromSignaling(a,c.deviceIdx);if(v.onParticipantIdChanged(c,u),this._api.cacheExternalId(i,u),this._api.mapDecorativeId(i,t),s)this._conversation.externalId=u;else{let l=await this._getParticipants();l[t].externalId=u}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(d.debug("Video suspend suggested",e),v.onVideoSuspendSuggest(e.bandwidth))}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()==="SERVER"&&this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){this._pendingParticipants.set(e.id,this._createParticipant(e,t))}async _getParticipants(){if(this._pendingParticipants.size){let e=Array.from(this._pendingParticipants.values()),t=await Promise.all(e);for(let i of t)this._pendingParticipants.delete(i.id),this._participants[i.id]=i}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};o(q,"_current"),o(q,"_activationMutex"),o(q,"_delayedHangup",!1);var F=q,Ea=class n extends Error{constructor(e,t){super(e);o(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var Ft=null,ii=null;function ss(){Ft=null,ii=null}function uc(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Lr(n=null,r){let e=uc(n??p.apiBaseUrl);if(e)return e;if((r??p.apiEnv)!=="AUTO")return p.apiEndpoint(r);try{let t=atob("aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ="),s=(await(await fetch(t,{method:"GET",mode:"cors",cache:"no-cache"})).json())?.Answer[0]?.data;if(!s)throw new Error("Wrong DNS response");return d.debug("Resolved API endpoint",s),s}catch(t){return d.warn("Failed to resolve API endpoint using DNS, default is used",t),p.apiEndpoint(r)}}async function os(){return Ft||ii||(ii=Lr(),Ft=await ii,ii=null,Ft)}async function ri(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await os();let t=ds(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${Ft}/fb.do`,i)}async function Li(n,r={},e=!1,t){await os();let i=ds(n,r,e);return mc(i,t)}async function mc(n,r){let e=`${r??Ft}/fb.do`,t=new AbortController,i=setTimeout(()=>t.abort(new j(y.NETWORK_ERROR)),p.apiTimeout),a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n,signal:t.signal});clearTimeout(i);let s=await a.text(),c;try{c=JSON.parse(s)}catch{c={result:s}}if(!a.ok||Object.hasOwn(c,"error_msg"))throw c;return c}async function cs(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 ds(n,r={},e=!1){r.method=n,r.format="JSON",r.application_key||(r.application_key=p.apiKey),e||(Ce.sessionKey?r.session_key=Ce.sessionKey:Ce.accessToken&&(r.access_token=Ce.accessToken));for(let[i,a]of Object.entries(r))typeof a=="object"&&(r[i]=JSON.stringify(a));let t="";for(let[i,a]of Object.entries(r))t&&(t+="&"),t+=`${i}=${encodeURIComponent(a)}`;return t}var Ui=class{async createJoinLink(r){return{join_link:"nop"}}async removeJoinLink(r){return{success:!0}}async getAnonymTokenByLink(r,e){return""}log(r){}logClientStats(r){}logClientEvents(r){}getCachedOkIdByExternalId(r){return null}cacheExternalId(r,e){}mapDecorativeId(r,e){}unmapDecorativeId(r){}getDecorativeIdByInitialId(r){}replaceByInitialIdIdIfExists(r){return typeof r=="string"?parseInt(r,10):r}hangupConversation(r,e=y.HUNGUP){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var _c=700,gc=3e3,ai=class extends Ui{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 Li(e,t,i)}catch(c){if(!Object.hasOwn(c,"error_msg")){s++;let u=Object.getOwnPropertyNames(c).map(l=>`${l}: ${JSON.stringify(c[l])}`);if(d.debug(`${e} network error, attempt ${s}: ${u.join(`
|
|
17
|
+
`)}`),s<p.apiMaxAttempt)return await I.delay(Math.min(s*_c,gc)),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=se.API;switch(a.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,i)}let c={message:a.error_msg,code:a.error_code};if(a instanceof j)throw a;if(a.custom_error&&(c.custom_error=a.custom_error),fc(a))switch(a.error_code){case 1101:s=y.SERVICE_DISABLED;break;case 4:a.error_msg.includes("participants.limit.exceeded")&&(s=y.PARTICIPANT_LIMIT_REACHED);break;case 300:s=y.NOT_FOUND;break;case 1102:s=y.CALLEE_IS_OFFLINE;break;case 1103:s=y.NOT_FRIENDS;break;case 1104:case 1106:s=y.EXTERNAL_API_ERROR;break;case 1113:s=y.CALLER_IS_REJECTED;break;case 1114:s=y.VCHAT_DETAILED_ERROR;break;case 2:s=y.SERVICE_UNAVAILABLE;break}throw new j(s,c)}}async userId(e){let t=I.extractOkId(e);if(Ce.isEmpty())return z.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),z.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!p.apiKey)throw new j(se.API,{message:"Required argument apiAppKey not passed"});let e={session_data:{version:2,device_id:this._uuid,client_version:p.appVersion,client_type:"SDK_JS"}};return p.authToken&&(e.session_data.auth_token=p.authToken,e.session_data.version=3),this._callUnsafe("auth.anonymLogin",e,!0).then(t=>{t.uid&&(this._userId=Number(t.uid)),Ce.sessionKey=t.session_key,Ce.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&v.onTokenExpired(),new j(se.AUTH,{message:t.error_msg,code:t.error_code})})}log(e){let t={collector:"ok.mobile.apps.video",data:JSON.stringify({application:`${p.appName}:${p.sdkVersion}`,platform:p.platform,items:e})};ri("log.externalLog",t)}logClientStats(e){let t={app_version:String(p.appVersion),sdk_type:"WEB",sdk_version:p.sdkVersion,version:1,items:e};p.clientStatsPlatform&&(t.platform=p.clientStatsPlatform);let i={data:JSON.stringify(t)};ri("vchat.clientStats",i)}logClientEvents(e){let t={app_version:String(p.appVersion),sdk_type:"WEB",sdk_version:p.sdkVersion,version:1,items:e};p.clientStatsPlatform&&(t.platform=p.clientStatsPlatform);let i={data:JSON.stringify(t)};ri("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let s={conversationId:e,webrtcPlatform:p.platform,startTime:t,endTime:i},c=await this._callUnsafe("vchat.getLogUploadUrl",s),u=new FormData,l=new Blob([a],{type:"application/json"});u.append("file",l,"log.json");let m=new URL(c.upload_url);return m.searchParams.append("size",l.size.toString()),cs(m.toString(),u)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:p.protocolVersion,capabilities:at.getFlags()};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:c,waitForAdmin:u,closedConversation:l}={},m){let h=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,waitForAdmin:u,closedConversation:l,audienceMode:s,audioOnly:c,speakerIds:m});return this._startConversation(h)}async startConversation(e,t,i,a=!1,s="",c=!1,u=!1,{onlyAdminCanShareMovie:l,waitForAdmin:m}={},h){let E=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:c,payload:s,requireAuthToJoin:u,onlyAdminCanShareMovie:l,waitForAdmin:m,externalIds:h});if(t&&t.length)switch(i){case 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:u,audienceMode:l=!1,audioOnly:m=!1,speakerIds:h=[],closedConversation:E=!1,externalIds:P}){let b={conversationId:e,isVideo:t,protocolVersion:p.protocolVersion};if(a&&(b.createJoinLink=!0),i&&(b.payload=i),p.domain&&(b.domainId=p.domain),p.externalDomain&&(b.externalDomain=p.externalDomain),s&&(b.requireAuthToJoin=!0),c!==void 0&&(b.onlyAdminCanShareMovie=c),u!==void 0&&(b.waitForAdmin=u),l&&(b.audienceMode=l),m&&(b.audioOnly=m),h.length){let H=h.map(J=>I.composeUserId(J));b.speakerIds=H.join(",")}return E&&(b.closed=E),P&&(b.externalIds=P.map(z.toSignaling).join(",")),b}async _startConversation(e){return this._call("vchat.startConversation",e)}async createJoinLink(e){return this._call("vchat.createJoinLink",{conversationId:e})}async removeJoinLink(e){return this._call("vchat.removeJoinLink",{conversationId:e})}async getAnonymTokenByLink(e,t){let i={joinLink:e};t&&(i.anonymName=t);let a=await this._call("vchat.getAnonymTokenByLink",i);return this._userId=Number(a.uid),a.token}async joinConversationByLink(e,t=!1,i,a){let s={joinLink:e,isVideo:t,protocolVersion:p.protocolVersion,capabilities:at.getFlags()};return i?.length&&(s.observedIds=i.join(",")),p.anonymToken&&(s.anonymToken=p.anonymToken),a&&(s.payload=a),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],i=[],a=new Map,s=Array.from(this._externalUidsCache.keys()),c=Array.from(this._externalUidsCache.values());for(let l of e){let m=z.toString(l),h=c.indexOf(m);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(a.set(String(l.id),m),i.push({id:l.id,ok_anonym:l.type==="ANONYM"}))}return i.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:i})).ids.forEach((l,m)=>{let h=Number(l.ok_user_id),E=String(l.external_user_id.id);a.has(E)&&(this.cacheExternalId(h,z.fromString(a.get(E))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,i=Array.from(this._externalUidsCache.keys()),a=Array.from(this._externalUidsCache.values());for(let s of e){let c=z.toString(s),u=a.indexOf(c);if(u>-1){let l=I.composeParticipantId(this.replaceByInitialIdIdIfExists(i[u]),ae.USER,s.deviceIdx);t.set(s,l)}}return t}async getExternalIdsByOkIds(e){let t=[],i=[];for(let s of e)if(this._externalUidsCache.has(s)){let c=this.getDecorativeIdByInitialId(s),u=this._externalUidsCache.get(c??s);t.push(z.fromString(u))}else i.push(s);if(!i.length)return t;let a=await this._getExternalIdsByOkIds(i);return Array.from(a.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),i=Array.from(this._externalUidsCache.values()),a=z.toString(e),s=i.indexOf(a);return s>-1?I.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),ae.USER,e.deviceIdx):s>-1?I.composeParticipantId(t[s],ae.USER,e.deviceIdx):null}cacheExternalId(e,t){let i=I.extractOkId(e);this._externalUidsCache.set(i,z.toString(t))}mapDecorativeId(e,t){let i=I.extractOkId(e),a=I.extractOkId(t);this._decorativeIdToInitialId.set(i,a),this._initialIdToDecorativeId.set(a,i)}unmapDecorativeId(e){let t=I.extractOkId(e),i=this.getDecorativeIdByInitialId(t);i&&this._decorativeIdToInitialId.delete(i),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=I.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=I.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}async getConversationParams(e){let t={};return p.anonymToken&&(t.anonymToken=p.anonymToken),e&&(t.conversationId=e),this._call("vchat.getConversationParams",t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e,t=y.HUNGUP){let i={conversationId:e,reason:t};p.anonymToken&&(i.anonymToken=p.anonymToken),ri("vchat.hangupConversation",i)}sendUserFeedbackStats(e,t,i,a){let s={collector:"app.vchat.events.product",data:JSON.stringify({application:`${p.appName}:${p.sdkVersion}`,platform:p.platform,items:[{type:1,operation:X.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};ri("log.externalLog",s)}async removeHistoryRecords(e){await this._call("vchat.removeHistoryRecords",{recordIds:e.join(",")})}cleanup(){this._decorativeIdToInitialId=new Map,this._initialIdToDecorativeId=new Map}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(i=>this.getDecorativeIdByInitialId(i)??i);try{let i=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),a=(s,c)=>{for(let[u,l]of Object.entries(s)){let m=Number(u),h=z.fromId(l,c);t.set(m,h),this.cacheExternalId(m,h)}};i.external_ids&&a(i.external_ids,"USER"),i.anonym_ids&&a(i.anonym_ids,"ANONYM");for(let s of e){let c=Number(s);if(!t.has(c)){let u=z.fromId(String(c));t.set(c,u),this.cacheExternalId(c,u)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};function fc(n){return typeof n=="object"&&n!==null&&"error_code"in n&&"error_msg"in n}var ls=(e=>(e.KING="KING",e.PAWN="PAWN",e))(ls||{}),ps=ls;var Ta=(e=>(e.OFF="0",e.ON="1",e))(Ta||{});var Ur=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 Br=class{constructor(r,e,t,i=null){o(this,"_uuid");o(this,"_apiKey");o(this,"_callToken");o(this,"_apiEnv");o(this,"_baseApiUrl");o(this,"_sessionKey");this._uuid=I.uuid(),this._apiKey=e,this._callToken=t,this._apiEnv=r,this._baseApiUrl=i}async authorize(){let r={session_data:{device_id:this._uuid,client_version:p.appVersion,client_type:"SDK_JS",auth_token:this._callToken,version:3},application_key:this._apiKey},e=await Lr(this._baseApiUrl,this._apiEnv),t=await Li("auth.anonymLogin",r,!0,e);return I.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(r){let e={conversationId:r,reason:y.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Lr(this._baseApiUrl,this._apiEnv);await Li("vchat.hangupConversation",e,!0,t)}};var ue,Bi=null,Sc={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},vc={participantMarkerCompare:I.participantMarkerCompare};function Ic(n){Bi=n}function Ec(n){p.videoEffects=n}function Tc(n){p.audioEffects=n}function Rc(n,r=null,e={},t=1){p.vmoji=n,p.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function Cc(n){if(p.set(n),ue||(ue=new ai),Ra.default.disableLog(!p.debug),d.toggle(p.debug),d.log(`Calls SDK ${p.sdkVersion}`,n),await M.init(),!M.isBrowserSupported())throw new j(se.UNSUPPORTED);d.log("UserAgent:",navigator.userAgent),d.log("Screen resolution:",`${window.screen.width}x${window.screen.height}`),d.log("Permissions:",`Camera: ${M.hasCameraPermission()}, Mic: ${M.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${p.simulcast}`)}async function Pc(n,r=[ce.AUDIO],e="",t=!1,i=!1,a,s){let c=[];return Array.isArray(n)?c=n.length?n:[]:n&&(c=[n]),us([],nt.USER,r,e,t,i,a,c,s)}async function us(n,r=nt.USER,e,t="",i=!1,a=!1,s,c,u){if(F.current())throw d.error("There is already active call"),new j(y.FAILED);return new F(ue,Bi).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:u})}async function yc(n,r){return ms(n,ae.USER,void 0,r)}async function ms(n,r=ae.USER,e,t,i,a){if(n===F.id())throw new Error("Push has already been processed");return a&&ue.setUserId(a),new F(ue,Bi).onPush(n,r,e,t,i)}async function bc(n,r){return n&&(p.authToken=n),r!==void 0&&p.apiBaseUrl!==r&&(p.apiBaseUrl=r,ss()),ue.authorize()}async function Mc(n=[ce.AUDIO]){return Xe().accept(n)}async function Ac(){let n=F.current();if(n)return n.decline()}async function Dc(n,r=[ce.AUDIO]){return hs(n,r)}async function hs(n,r,e){if(F.current())throw d.error("There is already active call"),new j(y.FAILED);return new F(ue,Bi).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function wc(n,r=[ce.AUDIO],e,t,i){if(F.current())throw d.error("There is already active call"),new j(y.FAILED);return e&&(p.anonymToken=e),new F(ue,Bi).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i})}async function kc(){let n=F.current();if(n)return n.hangup();F.hangupAfterInit()}async function Oc(n,r){let e=Array.isArray(n)?n:[n],t=F.current();t&&await t.addParticipant(e,r)}async function xc(n,r){let e=F.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function Nc(n,r=!1){let e=await ue.getOkIdsByExternalIds([n]);return _s(e[0],r)}async function _s(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 Lc(n,r){let e=F.current();if(n==="videoinput"&>.contains(r))return p.videoFacingMode=r,e?(M.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await M._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function Uc(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&p.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=F.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function Bc(n){let r=F.current();r&&r.toggleAnimojiCapturing(n)}async function Fc(n,r=!1){let e=F.current();e&&await e.setVideoStream(n,r)}async function Vc(n){let r=F.current();r&&await r.toggleLocalVideo(n)}async function jc(n){let r=F.current();r&&await r.toggleLocalAudio(n)}async function Hc(n){let r=F.current();if(r)return r.setLocalResolution(n)}async function Gc(n){let r=F.current();r&&await r.changePriorities(n)}async function Wc(n,r){let e=F.current();if(e){let t;if(r){let[i]=await ue.getOkIdsByExternalIds([r]);t=I.composeParticipantId(i,ae.USER,r.deviceIdx)}await e.changeParticipantState(n,t)}}async function Kc(){let n=F.current();n&&await n.putHandsDown()}async function $c(n){let r=F.current();r&&await r.updateDisplayLayout(n)}async function qc(n,r,e=!1){let t=await ue.getOkIdsByExternalIds([n]);return gs(t[0],z.getDeviceIdx(n),r,e)}async function gs(n,r,e,t=!1){let i=F.current();i&&await i.grantRoles(I.composeParticipantId(n,ae.USER,r),e,t)}async function zc({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await ue.getOkIdsByExternalIds([n]))[0]),fs({uid:i,muteStates:r,requestedMedia:e,deviceIdx:z.getDeviceIdx(n),roomId:t})}async function fs({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,ae.USER,t):null;await a.muteParticipant(s,r,e,i)}}async function Jc(n,r=!1,e=null){let t=await ue.getOkIdsByExternalIds([n]);return Ss(t[0],r,z.getDeviceIdx(n),e)}async function Ss(n,r=!1,e=0,t=null){let i=F.current();i&&await i.pinParticipant(I.composeParticipantId(n,ae.USER,e),r,t)}async function Yc(n){let r=F.current();r&&await r.updateMediaModifiers(n)}async function Qc(n){let r=F.current();r&&await r.enableVideoSuspend(n)}async function Xc(n){let r=F.current();r&&await r.enableVideoSuspendSuggest(n)}async function Zc(n){let r=F.current();r&&await r.changeOptions(n)}async function ed(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),vs(n,e)}async function vs(n,r=null){let e=F.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function td(n=10){let r=F.current();if(r)return r.chatHistory(n)}async function id(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),Is(n,e,z.getDeviceIdx(r))}async function Is(n,r=null,e=0){let t=F.current();if(t){let i=r?I.composeParticipantId(r,ae.USER,e):null;await t.customData(n,i)}}async function rd(n="",r=!1,{onlyAdminCanShareMovie:e=!1,waitForAdmin:t=!1,closedConversation:i=!1}={}){return(await ue.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,waitForAdmin:t,closedConversation:i})).join_link}async function ad(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=z.fromIds(i),s=await ue.getOkIdsByExternalIds(a);return(await ue.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},s)).join_link}async function nd(){let n=F.current();return n?n.createJoinLink():Promise.reject()}async function sd(){let n=F.current();return n?n.removeJoinLink():Promise.reject()}async function od(n,r){return ue.getAnonymTokenByLink(n,r)}function cd(n){let r=F.current();r&&r.setVolume(n)}function dd(n){p.forceRelayPolicy=n}async function ld(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 pd(n=null,r){let e=F.current();return e?e.stopStream(n,r):Promise.reject()}async function ud(n=null){let r=F.current();return r?r.publishStream(n):Promise.reject()}async function md(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 u=await ue.getParticipantIdsByExternalIds(c);n&&(a=u.get(n),u.delete(n)),s=Array.from(u.values())}return i.recordSetConf(a,s,e,t)}async function hd(){let n=F.current();return n?n.getStreamInfo():Promise.reject()}async function _d(n){let r=F.current();return r?r.addMovie(n):Promise.reject()}async function gd(n){let r=F.current();return r?r.updateMovie(n):Promise.reject()}async function fd(n){let r=F.current();return r?r.removeMovie(n):Promise.reject()}async function Sd(n,r){let e=F.current();if(e){let t=[];for(let i of n){let a,s;i.addParticipantIds&&(a=(await ue.getOkIdsByExternalIds(i.addParticipantIds)).map(c=>I.composeUserId(c))),i.removeParticipantIds&&(s=(await ue.getOkIdsByExternalIds(i.removeParticipantIds)).map(c=>I.composeUserId(c))),t.push({id:i.id,name:i.name,participantCount:i.participantCount,addParticipantIds:a,removeParticipantIds:s,countdownSec:i.countdownSec})}return e.updateRooms(t,r)}return Promise.reject()}async function vd(n,r){let e=F.current();return e?e.activateRooms(n,r):Promise.reject()}async function Id(n=null,r=null){let e=F.current();if(!e)return Promise.reject();let t;if(r){let i=await ue.getOkIdsByExternalIds([r]),a=z.getDeviceIdx(r);t=I.composeParticipantId(i[0],ae.USER,a)}return e.switchRoom(n,t)}async function Ed(n){let r=F.current();return r?r.removeRooms(n):Promise.reject()}function Td(n){p.statisticsInterval=n;let r=F.current();if(r)return r.updateStatisticsInterval()}function Rd(n){Ra.default.disableLog(!n),d.toggle(n)}function Cd(n,...r){p.debugLog&&d.send(n,"[external]",...r)}async function Pd(){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 ue?.uploadDebugLogs(n,e,t,JSON.stringify(r))}catch(i){throw d.error("[uploadDebugLogs]","Error while uploading logs",i),new Error("Error while uploading logs",{cause:i})}}async function yd(n){let r=F.current();if(r)return r.videoEffect(n)}async function bd(n,r){let e=F.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function Md(n){let r=F.current();r&&await r.setAudioStream(n)}async function Ad(n,r=null,e=null){let t=F.current();if(!t)return;let i=e??r?.id,a=null;if(r){let c=(await ue.getOkIdsByExternalIds([r]))[0];if(!c)throw new Error("Could not get user id to set animoji svg");a=I.composeParticipantId(c,ae.USER,z.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function Dd(n){let r=F.current();r&&r.setAnimojiFill(n)}async function wd(n=null,r,e=!1){return Xe().getWaitingHall(n,r,e)}async function kd(){return Xe().getAudienceModeHands()}async function Od(n,r=!1){let e=Xe(),t;if(n){let[i]=await ue.getOkIdsByExternalIds([n]);t=I.composeUserId(i)}return e.promoteParticipant(t,r)}async function xd(n=!1){return Xe().requestPromotion(n)}async function Nd(n=!1){return Xe().acceptPromotion(n)}async function Ld(n){return Xe().getParticipantListChunk(n)}async function Ud(n){return Xe().getParticipants(n)}async function Bd(n){return Xe().feedback(n)}function Fd(n,r,e){return Xe().userFeedbackStats(n,r,e)}function Vd(n,r={},e=!1){let t=F.current();t&&t.sendClientEvent(n,r,e)}async function jd(n,r){return Xe().enableFeatureForRoles(n,r)}function Xe(){let n=F.current();if(!n)throw new Error("Conversation not found");return n}async function Hd(n){await ue.removeHistoryRecords(n)}async function Gd(n){let r=F.current();r&&await r.startAsr(n)}async function Wd(n){let r=F.current();r&&await r.stopAsr(n)}async function Kd(n){let r=F.current();r&&await r.requestAsr(n)}async function $d(n){let r=F.current();return r?r.startUrlSharing(n):Promise.reject()}async function qd(){let n=F.current();return n?n.stopUrlSharing():Promise.reject()}function zd(){return p.sdkVersion}
|