@vkontakte/calls-sdk 2.8.6-dev.15af4b30.0 → 2.8.6-dev.164b8e60.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.
Files changed (43) hide show
  1. package/CallsSDK.d.ts +6 -5
  2. package/calls-sdk.cjs.js +8 -8
  3. package/calls-sdk.esm.js +8 -8
  4. package/classes/Conversation.d.ts +12 -5
  5. package/classes/Logger.d.ts +24 -18
  6. package/classes/MediaSource.d.ts +3 -0
  7. package/classes/SignalingActor.d.ts +9 -0
  8. package/classes/codec/IEncoder.d.ts +0 -1
  9. package/classes/screenshare/BaseStreamBuilder.d.ts +1 -1
  10. package/classes/stat/StatPings.d.ts +17 -0
  11. package/classes/stat/StatSignalingCommands.d.ts +12 -0
  12. package/classes/transport/Statistics.d.ts +23 -10
  13. package/default/Signaling.d.ts +12 -9
  14. package/enums/ChatRoomEventType.d.ts +1 -1
  15. package/enums/ConversationOption.d.ts +3 -3
  16. package/enums/HangupType.d.ts +2 -1
  17. package/enums/RecordRole.d.ts +1 -1
  18. package/enums/SignalingTransportStat.d.ts +17 -0
  19. package/enums/Stat.d.ts +18 -36
  20. package/enums/StatLog.d.ts +32 -0
  21. package/package.json +1 -3
  22. package/static/ApiTransport.d.ts +1 -1
  23. package/static/External.d.ts +7 -4
  24. package/static/Params.d.ts +14 -4
  25. package/static/SignalingCapabilities.d.ts +24 -0
  26. package/static/SimulcastInfo.d.ts +1 -1
  27. package/static/Utils.d.ts +1 -1
  28. package/types/ConversationParams.d.ts +1 -0
  29. package/types/ExternalId.d.ts +2 -0
  30. package/types/SignalingCommand.d.ts +1 -0
  31. package/types/SignalingMessage.d.ts +3 -1
  32. package/types/Streams.d.ts +1 -0
  33. package/types/WebTransport.d.ts +2 -11
  34. package/utils/Lz4.d.ts +1 -1
  35. package/utils/MsgPackerBufferUtils.d.ts +1 -1
  36. package/utils/P2Quantile.d.ts +14 -0
  37. package/utils/StatTracker.d.ts +18 -0
  38. package/utils/VariableLengthInteger.d.ts +1 -1
  39. package/utils/Welford.d.ts +9 -0
  40. package/worker/LibVPxDecoderWorker.d.ts +0 -1
  41. package/worker/LibVPxEncoderWorker.d.ts +0 -1
  42. package/worker/WebCodecsDecoderWorker.d.ts +0 -1
  43. package/worker/WebCodecsEncoderWorker.d.ts +0 -1
package/calls-sdk.esm.js CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
- * @vkontakte/calls-sdk v2.8.6-dev.15af4b30.0
3
- * Wed, 18 Jun 2025 14:27:17 GMT
2
+ * @vkontakte/calls-sdk v2.8.6-dev.164b8e60.0
3
+ * Wed, 01 Oct 2025 08:33:55 GMT
4
4
  * https://st.mycdn.me/static/callssdk/2-8-6/doc/
5
5
  */
6
6
 
7
- import Gn from"webrtc-adapter";var Ot=class{log(r,e,t=!1){}destroy(){}};var re=class{constructor(){this._handlers={};this._listeners=[]}_triggerEvent(r,...e){if(this._handlers.hasOwnProperty(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 this._handlers.hasOwnProperty(r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!this._handlers.hasOwnProperty(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 ei=class extends re{get ready(){return!0}setParticipantIdRegistry(r){}requestRealloc(){}setEndpoint(r){}setWebTransportEndpoint(r){}setConversationId(r){}readyToSend(r=!0){}cleanup(){}requestTestMode(r,e){}getNextCommandSequenceNumber(){return 0}};var Sa=(Z=>(Z.CANCELED="CANCELED",Z.REJECTED="REJECTED",Z.REMOVED="REMOVED",Z.HUNGUP="HUNGUP",Z.MISSED="MISSED",Z.BUSY="BUSY",Z.FAILED="FAILED",Z.NETWORK_ERROR="NETWORK_ERROR",Z.KILLED="KILLED",Z.BANNED="BANNED",Z.HAS_ACTIVE_CALL="HAS_ACTIVE_CALL",Z.CALLER_IS_BLOCKED="CALLER_IS_BLOCKED",Z.NOT_FRIENDS="NOT_FRIENDS",Z.CALLEE_IS_OFFLINE="CALLEE_IS_OFFLINE",Z.CALLER_IS_REJECTED="CALLER_IS_REJECTED",Z.UNKNOWN_ERROR="UNKNOWN_ERROR",Z.UNSUPPORTED="UNSUPPORTED",Z.OLD_VERSION="OLD_VERSION",Z.SERVICE_DISABLED="SERVICE_DISABLED",Z.EXTERNAL_API_ERROR="EXTERNAL_API_ERROR",Z.SOCKET_CLOSED="SOCKET_CLOSED",Z.ENDED="ENDED",Z.KILLED_WITHOUT_DELETE="KILLED_WITHOUT_DELETE",Z.ANOTHER_DEVICE="ANOTHER_DEVICE",Z.NOT_FOUND="NOT_FOUND",Z.VCHAT_DETAILED_ERROR="VCHAT_DETAILED_ERROR",Z))(Sa||{}),D=Sa;var H=class n extends Error{constructor(r,e){super(),this.name="HangupReason",this.code=e&&e.code||0,this.remote=e&&e.remote||!1,this.custom_error=e?.custom_error??null,Object.values(D).indexOf(r)>-1?this.hangup=r:this.error=r;let t=[];this.error&&t.push("error"),this.remote&&t.push("remote"),this.code&&t.push(`code: ${this.code}`),e&&e.message&&t.push(`message: '${e.message}'`),this.message=r+(t.length?` (${t.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,n)}};var R=class n extends Ot{constructor(e,t){super();this._batchInterval=3e3;this._batchedLogItems=[];this._batchedClientStats=[];this._batchedClientEvents=[];this._batchTimeout=null;this._serverTimeDelta=0;this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}_sendLogItems(e){this._api.log(e)}_sendClientStats(e){this._api.logClientStats(e)}_sendClientEvents(e){this._api.logClientEvents(e)}_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)}async _calculateServerTimeDelta(){try{let e=await this._api.getServerTime();this._serverTimeDelta=Date.now()-e}catch{}}_now(){return Date.now()-this._serverTimeDelta}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:L.id(),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:L.id(),timestamp:this._now()});this._batchedClientEvents.push(i),(t||!this._batchTimeout)&&this._sendBatch()}_logInternal(e,t,i){let a={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:L.id()}),uid:this._api.getUserId()};this._batchedLogItems.push(a),(i||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}static create(e,t){n._instance||(n._instance=new n(e,t))}static log(e,t,i=!1){n._instance&&n._instance.log(e,t,i)}static logCustom(e,t,i=!1){n._instance&&n._instance.logCustom(e,t,i)}static logClientStats(e,t=!1){n._instance&&n._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){n._instance&&n._instance.logClientEvent(e,t)}static destroy(){n._instance&&n._instance.destroy(),n._instance=null}};import{Any as Ho,Arr as Qa,Int as V,Nil as bt,Str as Xa,Bool as Yr}from"messagepack";var va=(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))(va||{}),O=va;var Ia=(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))(Ia||{}),ae=Ia;var Ea=(o=>(o.AUDIO="AUDIO",o.VIDEO="VIDEO",o.SCREEN_SHARING="SCREEN_SHARING",o.MOVIE_SHARING="MOVIE_SHARING",o.AUDIO_SHARING="AUDIO_SHARING",o.ANIMOJI="ANIMOJI",o))(Ea||{}),oe=Ea;var Ta=(W=>(W.ERROR="callError",W.DEVICES="callDevices",W.CALL_SPEC_ERROR="callSpecError",W.ICE_CONNECTION_STATE="callIceConnectionState",W.ICE_CONNECTION_TYPE="callIceConnectionType",W.ICE_RESTART="callIceRestart",W.PUSH="callPush",W.OUTGOING_CALL="callStart",W.CALL_FINISH="call_finish",W.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",W.JOIN_CONVERSATION="callJoinConversation",W.ACCEPTED_OUTGOING="callAcceptedOutgoing",W.ACCEPT_INCOMING="callAcceptIncoming",W.DECLINE_INCOMING="callDeclineIncoming",W.ACCEPT_CONCURRENT="callAcceptConcurrent",W.HANGUP="callHangup",W.CODEC_USAGE="codec_usage",W.MEDIA_STATUS="callMediaStatus",W.DEVICE_CHANGED="callDeviceChanged",W.SOCKET_ACTION="callSocketAction",W.ADD_PARTICIPANT="callAddParticipant",W.REMOVE_PARTICIPANT="callRemoveParticipant",W.POOR_CONNECTION="callPoorConnection",W.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",W.RELAY_POLICY="callForceRelay",W.PAT_ALLOCATED="patAllocate",W.PAT_DEALLOCATED="patDeallocate",W.PAT_ERROR="patError",W.PAT_WAITING_TIME_ERROR="patWaitingTimeError",W.PAT_OUTDATED_RESPONSE="patOutdatedResponse",W.SIGNALING_CONNECTED="signaling_connected",W.RECONNECT="callReconnect",W.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",W.SCREENSHARE_FREEZE_DURATION="callScreenshareFreezeDuration",W.FIRST_MEDIA_RECEIVED="first_media_received",W.CALL_EVENTUAL_STAT="callEventualStat",W.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",W.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",W.CALL_START="call_start",W.WEBTRANSPORT_CONNECTED="webtransport_connected",W))(Ta||{}),E=Ta;import Ra from"@vkontakte/libvpx";var Be=class{constructor(){this._worker=null}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((o,s)=>{let l=t.join(","),p=new Blob([r,`exports.default(${l});`],{type:"application/javascript; charset=utf-8"}),u=window.URL.createObjectURL(p);this._worker=new Worker(u),this._worker.onmessage=m=>{switch(m.data.type){case"ready":o();break;case"error":s(m.data.error);break;case"frame":e(m.data);break;case"debug":c.debug(m.data.message);break;case"log_error":R.log(E.ERROR,m.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 ht=class extends Be{async init(r,e){c.debug("LibVPxDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var d=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var R=(o,t)=>{for(var e in t)d(o,e,{get:t[e],enumerable:!0})},h=(o,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of x(t))!E.call(o,s)&&s!==e&&d(o,s,{get:()=>t[s],enumerable:!(a=y(t,s))||a.enumerable});return o};var V=o=>h(d({},"__esModule",{value:!0}),o);var D={};R(D,{default:()=>M});var M=(o,t)=>{let e=null,a=null,s=!0;function c(){return o({locateFile:t}).then(r=>a=r)}function f(r,u,n,m){if(!a){self.postMessage({type:"log_error",message:"decoder-init-fail-libvpx"}),self.postMessage({type:"frame",error:"Fatal initialization error"});return}if(s!==n&&(s=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 a.VpxDecoder,e.debug(m),!e.init(n?a.VpxType.VP9:a.VpxType.VP8))){e=null,self.postMessage({type:"frame",error:"Decoder failed to create"});return}try{e.allocateBuffer(u.byteLength).set(new Uint8Array(u))}catch(i){self.postMessage({type:"debug",message:i}),e=null,self.postMessage({type:"frame",error:String(i)});return}if(!(e.decode()&&e.nextImage())){self.postMessage({type:"frame",error:"Decode failed"});return}let l=e.getImageBuffer();if(!l){self.postMessage({type:"frame",error:"No decoded data"});return}let b=e.getImageWidth(),g=e.getImageHeight();e.nextImage()&&(self.postMessage({type:"debug",message:"LibVPxDecoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxDecoder-drop"}));let p=new Uint8ClampedArray(l.byteLength);p.set(l),self.postMessage({type:"frame",data:p.buffer,width:b,height:g},[p.buffer])}c().then(()=>{self.onmessage=r=>{switch(r.data.type){case"frame":f(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',t=>{if(t.error)c.warn("LibVPxDecoder",t.error),e(t.error);else{let i=new ImageData(new Uint8ClampedArray(t.data),t.width,t.height);r(i)}},[Ra,Ra.getUrl])}decodeFrame(r,e,t,i){this._sendToWorker("frame",{timestamp:r,data:e.buffer,isVP9:t,keyFrame:i,debug:c.enabled()},[e.buffer])}destroy(){this._removeWorker(),c.debug("LibVPxDecoder destroyed")}static isBrowserSupported(){return"WebAssembly"in window&&"Worker"in window}};var qe=class extends Be{async init(r,e){c.debug("WebCodecsDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var i=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var C=(o,e)=>{for(var n in e)i(o,n,{get:e[n],enumerable:!0})},A=(o,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of R(e))!y.call(o,t)&&t!==n&&i(o,t,{get:()=>e[t],enumerable:!(a=D(e,t))||a.enumerable});return o};var V=o=>A(i({},"__esModule",{value:!0}),o);var F={};C(F,{default:()=>k});var k=o=>{let e=null,n=!0,a=null,t=!1,f=1e3/15*2;function p(){self.postMessage({type:"ready"})}function m(r,b,d,c=!1){if(!e||n!==d){if(!c){self.postMessage({type:"frame",error:"WebCodecsDecoder dropped frame - waiting for keyframe"});return}n=d,e?self.postMessage({type:"debug",message:`WebCodecsDecoder codec changed to ${d?"VP9":"VP8"}`}):(self.postMessage({type:"debug",message:`WebCodecsDecoder codec ${d?"VP9":"VP8"}`}),e=new VideoDecoder({output:s=>{l();let g=o?[s]:[];self.postMessage({type:"frame",data:s},g),s.close()},error:s=>{l(),e&&e.state!=="closed"&&e.close(),e=null,self.postMessage({type:"frame",error:"WebCodecsDecoder failed, reinitialize: "+String(s)})}})),e.configure(u(d))}if(t&&!c){self.postMessage({type:"frame",error:"WebCodecsDecoder dropped frame after reset - waiting for keyframe"});return}t=!1;let E=new EncodedVideoChunk({type:c?"key":"delta",timestamp:r,data:b});e.decode(E),a=setTimeout(()=>{t=!0,e?.reset(),e?.configure(u(d)),self.postMessage({type:"frame",error:"WebCodecsDecoder reset because of decode timeout"})},f)}self.onmessage=r=>{switch(r.data.type){case"init":p();break;case"frame":m(r.data.timestamp,r.data.data,r.data.isVP9,r.data.keyFrame);break}};function l(){a&&clearTimeout(a),a=null}function u(r){return{codec:r?"vp09.00.50.08":"vp8"}}};return V(F);})();\n',t=>{t.error?(c.warn("WebCodecsDecoder",t.error),e(t.error)):(r(t.data),t.data.close())},[y.baseChromeVersion()>=92||y.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(),c.debug("WebCodecsDecoder destroyed")}static isBrowserSupported(){return"VideoDecoder"in window&&"Worker"in window&&"VideoFrame"in window&&!y.isBrokenVP9Decoder()&&y.browserName()!=="Firefox"}};var _t=class{constructor(r=null,e=0){this._counter=0;this._interval=0;this._lastCalculationTime=Date.now();this._onCalculated=null;this._onCalculated=r,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(r=1){this._counter+=r}calculate(){let r=Date.now(),e=r-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=r,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};import{BitStream as ao}from"bit-buffer";var Ca=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Ca||{}),te=Ca;var at={HEIGHT:720,WIDTH:1280,BITRATE:1e6},ti="L1T2",Pa=[{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}],qn={h:1,m:2,l:4};function ba(n,r){return!n||!r?n===r:n.streams.length===r.streams.length?n.streams.every((e,t)=>S.isObjectsEquals(e,r.streams[t])):!1}function ya(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:Pa[0].bitrate}function ii(n=at.WIDTH,r=at.HEIGHT,e=Pa){let t=["h","m","l"],i=Math.max(n,r),a=1;i>=960?a=3:i>=480&&(a=2);let o={streams:[]},s=30,l=ya(i,e)??at.BITRATE;for(let p=0;p<a;p++){let u=t[p];o.streams.push({rid:u,width:n,height:r,fps:s,bitrate:l}),n=Math.round(n/2),r=Math.round(r/2),l=ya(Math.max(n,r),e)??Math.round(l/2)}return o}function wi(n){return qn[n]??1}var Ma=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 Aa(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var Lt=":",xi="d",zn=533,ki="a=fmtp:",Jn="sps-pps-idr-in-keyframe=1",yr;(Ue=>{let n=/[\r\n]+/,r=`\r
8
- `;function e(h,T){let C=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),P,g=[];for(P=0;P<h.length;++P){let M=h[P].match(C);M&&M.length===3&&M[2]===T&&g.push(M[1])}return g}function t(h,T,C){let P=h.split(" "),g=P.slice(0,3),M;for(M=3;M<P.length;M++)C.includes(P[M])&&g.push(P[M]);for(M=3;M<P.length;M++)!C.includes(P[M])&&!T.includes(P[M])&&g.push(P[M]);return g.join(" ")}function i(h,T,C,P){let g,M="m="+T;for(g=0;g<h.length;++g)h[g].startsWith(M)&&(h[g]=t(h[g],C,P))}function a(h,T){let C=new RegExp(ki+"(\\d+)");for(let P=0;P<h.length;++P){let g=h[P].match(C);if(g&&g.length===2&&T.includes(g[1])){let M=h[P].trim()===ki+g[1]?" ":";";h[P]+=M+Jn}}}function o(h,T){let C=e(h,T);if(!C.length)return;let P=C.slice(0),g=new RegExp(ki+"(\\d+) apt=(\\d+)"),M;for(M=0;M<h.length;++M){let U=h[M].match(g);U&&U.length===3&&P.includes(U[2])&&P.push(U[1])}let G=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for(M=h.length;M--;){let U=h[M].match(G);U&&U.length===3&&P.includes(U[2])&&h.splice(M,1)}i(h,"video",P,[])}function s(h,T,C,P){let g=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),M,G=[];for(M=T;M<C;++M){let Y=h[M].match(g);Y&&Y.length===3&&Y[2]===P&&G.push(Y[1])}if(!G.length)return G;let U=new RegExp(ki+"(\\d+) apt=(\\d+)");for(M=T;M<C;++M){let Y=h[M].match(U);Y&&Y.length===3&&G.includes(Y[2])&&G.push(Y[1])}return G}function l(h,T,C,P){let g=s(h,T,C,P);if(!g.length)return C+1;let M=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),G=0,U=C;for(;U>=T;){let Y=h[U].match(M);Y&&Y.length===3&&g.includes(Y[2])&&(h.splice(U,1),G++),U--}return h[T]=t(h[T],g,[]),C-G+1}function p(h,T,C,P){let g=-1,M=-1,G=!1;for(let U=0;U<h.length;++U)if(g>=0&&h[U].startsWith("m=")&&(M=U-1,G&&(U=l(h,g,M,T)),g=-1,M=-1,G=!1),h[U].startsWith("m=video")&&(g=U),g>=0){let Y=C==="remote"&&P==="encoder"||C==="local"&&P==="decoder"?"recvonly":"sendonly";(h[U].startsWith(`a=${Y}`)||h[U].startsWith("a=sendrecv"))&&(G=!0)}M=h.length-1,g>=0&&G&&l(h,g,M,T)}function u(h,T,C){let P=e(h,"H264");T&&i(h,"video",[],P),C&&a(h,P)}function m(h){let T=e(h,"VP9");i(h,"video",[],T)}function I(h,T,C,P,g,M=!1,G=!1){if(!T&&!C&&!P&&!G&&!M&&!g)return h;function U(x){let _e=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],me="a=rtcp-fb:111",ge=x.findIndex(ce=>ce.startsWith(me));return~ge&&(x[ge]=x[ge]+r+_e.join(r)),x}function Y(x){let _e=e(x,"red");_e.length>0&&i(x,"audio",[],_e)}let he=h.split(n);return C?p(he,"H264","local","decoder"):(T||g)&&u(he,T,g),P&&m(he),G&&Y(he),M&&U(he),he.join(r)}Ue.patchLocalSDP=I;function A(h,T,C,P,g,M,G){T&&(h=h.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 U=h.split(n);return P?o(U,"H264"):C&&u(U,C,!1),M&&G?o(U,"VP9"):M?p(U,"VP9","remote","encoder"):G?p(U,"VP9","remote","decoder"):g&&m(U),U.join(r)}Ue.patchRemoteSDP=A;function w(h){return h?`${h.type||"WEB_SOCKET"}_${h.id}`:"_"}Ue.getPeerIdString=w;function j(h,T){return h&&h.id===T.id&&(h.type||"WEB_SOCKET")===(T.type||"WEB_SOCKET")}Ue.comparePeerId=j;async function q(h){let T={local:null,remote:null};if(!h||!h.getStats)return T;try{let C=await h.getStats(null),P=null;if(C.forEach(g=>{g.type==="transport"&&g.selectedCandidatePairId?P=C.get(g.selectedCandidatePairId):g.type==="candidate-pair"&&g.state==="succeeded"&&!P&&(!g.hasOwnProperty("selected")||g.selected)&&(P=g)}),P?.localCandidateId){let g=C.get(P.localCandidateId);g&&(T.local={type:g.candidateType,ip:g.ip||g.ipAddress,port:g.port||g.portNumber})}if(P?.remoteCandidateId){let g=C.get(P.remoteCandidateId);g&&(T.remote={type:g.candidateType,ip:g.ip||g.ipAddress,port:g.port||g.portNumber})}return T}catch{return T}}Ue.getPeerConnectionHostInfo=q;let ie=/^[0-9]+$/,fe=/^([gu])([0-9]+)$/;function we(h,T=te.USER){let C=String(h);return fe.test(C)?(c.warn(`Already composite id [${h}] type supplied [${T}]`),C):T===te.GROUP?"g"+C:T===te.USER?"u"+C:(c.warn(`Unknown type [${T}] for id [${h}]`),C.match(ie)?"u"+C:C)}Ue.composeUserId=we;function X(h,T,C=0){let P=we(h,T);return ye(P,C)}Ue.composeParticipantId=X;function ye(h,T){return T?h+Lt+xi+T:h}Ue.compose=ye;function Pe(h){return X(h.id,h.idType||te.USER,h.deviceIdx)}Ue.composeId=Pe;function Qt(h){if(h.decorativeUserId)return X(h.decorativeUserId,h.idType||te.USER,h.deviceIdx)}Ue.composeDecorativeId=Qt;function na(h){return h.participant?Pe(h.participant):X(h.participantId,h.participantType||te.USER,h.deviceIdx)}Ue.composeMessageId=na;function oa(h){return typeof h=="string"?Z(Xt(h).compositeUserId).id:h}Ue.extractOkId=oa;function Z(h){let T=String(h),C=T.match(fe);return C?{id:Number(C[2]),type:C[1]==="g"?te.GROUP:te.USER}:(c.warn(`Unsupported compositeId [${h}]`),{id:Number(T),type:te.USER})}Ue.decomposeId=Z;function Xt(h){let T=h.split(Lt+xi);return{compositeUserId:T[0],deviceIdx:T.length>1?parseInt(T[1],10):0}}Ue.decomposeParticipantId=Xt;function sa(){let h=window.crypto?.randomUUID?.();if(h)return h;let T="0123456789abcdefghijklmnopqrstuvwxyz".split(""),C=new Array(36),P=0,g,M;for(M=0;M<36;M++)M===8||M===13||M===18||M===23?C[M]="-":M===14?C[M]="4":(P<=2&&(P=33554432+Math.random()*16777216|0),g=P&15,P=P>>4,C[M]=T[M===19?g&3|8:g]);return C.join("")}Ue.uuid=sa;function ca(h,T){let C;function P(...g){let M=this;C&&window.clearTimeout(C),C=window.setTimeout(()=>{h.apply(M,g)},T)}return P}Ue.debounce=ca;function da(h){if(!window.BigInt)return null;let T="",C=h.split(`
9
- `);for(let M of C)if(M.startsWith("a=fingerprint")){let G=M.split(" ");if(G.length===2){T=G[1];break}}if(!T)return BigInt(-1);let P=T.split(":"),g=BigInt(0);for(let M=Math.min(7,P.length-1);M>=0;M--){let G=BigInt(parseInt(P[M],16));g<<=BigInt(8),g|=G}return BigInt.asIntN(64,g)}Ue.sdpFingerprint=da;async function la(h){return new Promise(T=>window.setTimeout(T,h))}Ue.delay=la;function pa(h,T,C){let P=[];return h.getSenders().forEach(g=>Ai(T,g,g.track,C,P)),P}Ue.applySettings=pa;function Ai(h,T,C,P,g){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!h||!C||C.kind!=="video")return;let M=C.getSettings();if(!M)return;let G=h.maxBitrateK?h.maxBitrateK*1024:null,U=M.width,Y=M.height,he=U&&Y&&h.maxDimension?Math.max(1,Math.max(U,Y)/h.maxDimension):null,x=h.maxFramerate||null;if(U&&Y&&h.maxDimension&&h.maxDimension>Math.max(U,Y)){let ce=Math.round(U*Y/256),Me=(Math.round(ce*zn/1e4)+1)*1e4;G=G===null?Me:Math.min(Me,G)}let _e=h.degradationPreference||"balanced",me=P[C.id];if(me&&me.bitrate===G&&me.scaleResolutionDownBy===he&&me.maxFramerate===x&&me.degradationPreference===_e){g[C.id]=me;return}g[C.id]={bitrate:G,scaleResolutionDownBy:he,maxFramerate:x,degradationPreference:_e};let ge=T.getParameters();if(ge.encodings||(ge.encodings=[{}]),ge.encodings.length>1&&U&&Y&&h.maxDimension){let ce=Math.round(h.maxDimension*1.35),Me=Math.max(U,Y),ut=ii(U,Y,h?.bitrates?.generic),xt=ut.streams.length;c.log(`applyVideoTrackSettings: maxDim=${h.maxDimension} targetDim=${ce} track=${U}x${Y} sim=${JSON.stringify(ut)}`),ge.encodings.forEach((Ke,Zt)=>{Ke.scaleResolutionDownBy=wi(Ke.rid);let ga=Math.round(Me/Ke.scaleResolutionDownBy);Zt<xt-1?Ke.active=ga<ce:Zt>=xt?Ke.active=!1:Ke.active=!0,Zt<xt?Ke.maxBitrate=ut.streams[Zt].bitrate:Ke.maxBitrate=0,Ke.scalabilityMode=ti})}else ge.encodings.forEach(ce=>{h?.scalabilityMode&&(ce.scalabilityMode=h.scalabilityMode),G?ce.maxBitrate=G:delete ce.maxBitrate,he?ce.scaleResolutionDownBy=he:delete ce.scaleResolutionDownBy,x?ce.maxFramerate=x:delete ce.maxFramerate});if(ge.degradationPreference=_e,ge.encodings.length>0){T.setParameters?.(ge).catch(Me=>{c.error("Failed to set sender parameters",ge,Me)});let ce=T.getParameters();c.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(ce.encodings)}`)}}Ue.applyVideoTrackSettings=Ai;function Er(h,T){Array.isArray(T)||(T=[T]);for(let C of T)if(h.includes(C))return!0;return!1}Ue.includesOneOf=Er;function ua(h){return Object.entries(h.participantState?.state||{}).reduce((T,[C,P])=>(h.participantState&&(T[C]={ts:h.participantState.stateUpdateTs[C],state:P}),T),{})}Ue.mapParticipantState=ua;function ma(h){let T=h.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}));return d.filterObservers?T.filter(C=>!C.uid.observer):T}Ue.mapSharedParticipants=ma;function ha(h,T){let C=Object.keys(h),P=Object.keys(T);if(C.length!==P.length)return!1;for(let g of C)if(!P.hasOwnProperty(g)||h[g].state!==T[g].state||h[g].ts!==T[g].ts)return!1;return!0}Ue.isEqualParticipantState=ha;function Tr(h,T,C=!1){let P=Object.keys(h),g=Object.keys(T);if(P.length!==g.length)return!1;for(let M of P){if(!T.hasOwnProperty(M))return!1;let G=h[M],U=T[M];if(C&&ue(G)&&ue(U))return Tr(G,U,C);if(G!==U)return!1}return!0}Ue.isObjectsEquals=Tr;function _a(h,T){if(h.length!==T.length)return!1;for(let C of h)if(T.indexOf(C)<0)return!1;return!0}Ue.isArraysEquals=_a;function W(h){return!Object.keys(h).length}Ue.isEmptyObject=W;function pe(h,T){if(!h&&!T)return 0;if(!h||!T)return h?-1:1;return P(T.rank,h.rank)||P(h.ts,T.ts)||C(h,T);function C(g,M){let G={[te.USER]:0,[te.GROUP]:1},{compositeUserId:U,deviceIdx:Y}=Xt(g.id),{compositeUserId:he,deviceIdx:x}=Xt(M.id),{id:_e,type:me}=Z(U),{id:ge,type:ce}=Z(he);return P(G[me],G[ce])||P(_e,ge)||P(Y,x)}function P(g,M){return g<M?-1:g===M?0:1}}Ue.participantMarkerCompare=pe;function B(h,T){let C=Object.entries(h).filter(([,P])=>Array.isArray(T)?!T.includes(P):P!==T);return Ma(C)}Ue.objectFilterOutValues=B;function ee(h,T,C){let P=C;for(let g in h)h.hasOwnProperty(g)&&(P=T(P,h[g],g));return P}Ue.objectReduce=ee,Ue.setImmediate=(()=>{let h=1,T={},C=null;return typeof MessageChannel<"u"&&(C=new MessageChannel,C.port1.onmessage=P=>{let g=P.data;T[g]&&(T[g](),delete T[g])}),function(P){if(C&&document.visibilityState==="hidden"){let M=h;return h=h>=Number.MAX_SAFE_INTEGER?1:h+1,T[M]=P,C.port2.postMessage(M),()=>{T[M]&&delete T[M]}}let g=setTimeout(P,0);return()=>clearTimeout(g)}})();function ue(h){return h!==null&&typeof h=="object"&&!Array.isArray(h)}Ue.isObject=ue;function Xe(h,T,C,P){function g(U,Y){let he=0,x=U.length,_e=!1;for(let me=0;me<U.length;me++)if(U[me].startsWith("m=video")&&(he=me),U[me].startsWith("a=mid:"+Y)&&(_e=!0),_e&&U[me].startsWith("m=")){x=me;break}return{start:he,end:x}}function M(U,Y,he,x,_e,me,ge){let ce="a=rid:"+x+" send";for(let Me=Y;Me<he;Me++)if(U[Me]===ce){let xt=ce+" max-width="+me+";max-height="+ge+";max-br="+_e;U[Me]=xt}}let G=T?.sender;if(G&&G.track&&T.mid){let U=h.split(n),{start:Y,end:he}=g(U,T.mid),x=G.getParameters();if(x.encodings)return x.encodings.forEach(_e=>{let me=_e.rid,ge=_e.maxBitrate,ce=_e.scaleResolutionDownBy;if(C&&P&&ce){let Me=""+Math.round(C/ce),ut=""+Math.round(P/ce);M(U,Y,he,me,ge,Me,ut)}}),U.join(r)}return h}Ue.patchSimulcastAnswerSdp=Xe})(yr||(yr={}));var S=yr;var Yn=1e3;function se(n,r,e=0){return r in n&&n[r]?n[r]:e}function Pr(...n){return r=>{for(let e of n)if(e(r))return!0;return!1}}function nt(n,r){return e=>e[n]===r}function Qn(n){return(r,e)=>e[n]-r[n]}function ri(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function Xn(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function br(n){return Object.keys(n).filter(r=>n[r]!==void 0).map(r=>[r,n[r]]).reduce((r,e)=>(r[e[0]]=S.isObject(e[1])?br(e[1]):e[1],r),{})}function Zn(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function eo(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(Zn).then(Xn)}function to(n){let r=n.filter(nt("type","candidate-pair")).sort(Qn("priority")).find(Pr(nt("nominated",!0),nt("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(nt("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(nt("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}}),br(e)}function Da(n,r,e=!1){let t=ri("id",n),i=e?n.filter(Pr(nt("type","remote-inbound-rtp"))):n.filter(Pr(nt("type","inbound-rtp"),nt("type","outbound-rtp")));return y.browserName()==="Firefox"&&(i=Object.values(i.reduce((a,o)=>{if(!a[o.ssrc])a[o.ssrc]=o;else{let s=Object.assign({},a[o.ssrc],o),l=a[o.ssrc].isRemote?o:a[o.ssrc];s.id=l.id,s.type=l.type,delete s.isRemote,delete s.remoteId,a[s.ssrc]=s}return a},{}))),i.map(a=>{let o=Number(a.ssrc),s=a.mediaType||a.kind,l=a.remoteId||a.trackId,p=a.type,u=a.codecId;if(!p||!o||!s)return null;let m={ssrc:o,type:p,kind:s,bytesReceived:se(a,"bytesReceived"),bytesSent:se(a,"bytesSent"),headerBytesReceived:se(a,"headerBytesReceived"),headerBytesSent:se(a,"headerBytesSent"),jitter:se(a,"jitter"),packetsLost:se(a,"packetsLost"),packetsReceived:se(a,"packetsReceived"),packetsSent:se(a,"packetsSent"),fractionLost:se(a,"fractionLost"),pliCount:se(a,"pliCount"),firCount:se(a,"firCount"),nackCount:se(a,"nackCount"),userId:r[o],freezeCount:se(a,"freezeCount",0),totalFreezesDuration:se(a,"totalFreezesDuration",0)},I="mid"in a&&typeof a.mid=="string"?a.mid:void 0,A="rid"in a&&typeof a.rid=="string"?a.rid:void 0;if(I&&(m.mid=I),A&&(m.rid=A),s==="video"){let w=se(a,"framesDecoded"),j=se(a,"totalInterFrameDelay"),q=se(a,"totalSquaredInterFrameDelay"),ie=se(a,"encoderImplementation"),fe=se(a,"decoderImplementation");ie&&(m.encoderImplementation=ie),fe&&(m.decoderImplementation=fe),m.interframeDelayVariance=(q-j*j/w)/w}if(s==="video"&&m.type==="outbound-rtp"&&(m.totalEncodeTime=se(a,"totalEncodeTime")??0),s==="audio"&&(m.totalSamplesReceived=se(a,"totalSamplesReceived"),m.concealedSamples=se(a,"concealedSamples"),m.insertedSamplesForDeceleration=se(a,"insertedSamplesForDeceleration"),m.removedSamplesForAcceleration=se(a,"removedSamplesForAcceleration"),m.silentConcealedSamples=se(a,"silentConcealedSamples"),m.concealmentEvents=se(a,"concealmentEvents"),m.totalAudioEnergy=se(a,"totalAudioEnergy")),u&&t[u]){let w=t[u];m.clockRate=w.clockRate,m.mimeType=w.mimeType,s==="audio"&&w.sdpFmtpLine&&(m.sdpFmtpLine=w.sdpFmtpLine)}if(l&&t[l]){let w=t[l];m.frameHeight=w.frameHeight,m.frameWidth=w.frameWidth,m.framesDecoded=w.framesDecoded,m.framesReceived=w.framesReceived,m.framesDropped=w.framesDropped}return br(m)}).filter(a=>!!a)}function io(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=ri("ssrc",n?.remoteRtps||[]),i=ri("ssrc",r?.remoteRtps||[]));let a=ri("ssrc",n.rtps),o=ri("ssrc",r.rtps),s=(n.timestamp-r.timestamp)/1e3;return!a||!o||Object.keys(a).forEach(l=>{let p=a[l],u=o[l];if(!(!p||!u)){if(p.bytesReceived&&p.bytesReceived>u.bytesReceived&&(p.bandwidth=Math.round((p.bytesReceived-u.bytesReceived)/s),p.bandwidth+=Math.round((p.headerBytesReceived-u.headerBytesReceived)/s)),p.bytesSent&&p.bytesSent>u.bytesSent&&(p.bandwidth=Math.round((p.bytesSent-u.bytesSent)/s),p.bandwidth+=Math.round((p.headerBytesSent-u.headerBytesSent)/s)),p.packetsReceived)if(p.packetsReceived>u.packetsReceived||p.packetsLost>u.packetsLost){let m=p.packetsLost-u.packetsLost,I=p.packetsReceived-u.packetsReceived;p.packetLoss=parseFloat((100*m/(m+I)).toFixed(2))}else p.packetLoss=0;if(p.freezeCount>u.freezeCount&&(p.freezeCountDelta=p.freezeCount-u.freezeCount),p.totalFreezesDuration>u.totalFreezesDuration){let m=p.totalFreezesDuration-u.totalFreezesDuration;p.totalFreezesDurationDelta=m}if(p.framesDropped&&u.framesDropped&&p.framesDropped>u.framesDropped&&(p.framesDroppedDelta=parseFloat(((p.framesDropped-u.framesDropped)/s).toFixed(0))),e&&p.type==="outbound-rtp"&&p.kind==="video"){let m=t?.[l],I=i?.[l],A=q=>q??0,w=Math.max(0,A(m?.packetsLost)-A(I?.packetsLost)),j=Math.max(1,p.packetsSent-u.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(w/j*100)}}}}),n}async function ai(n,r,e={},t=!1){let i=await eo(n),a={timestamp:Date.now(),transport:to(i),rtps:Da(i,e)};return t&&(a.remoteRtps=Da(i,e,!0)),r?io(a,r,t):(await S.delay(Yn),ai(n,a,e,t))}function Ve(n){performance.clearMarks(n),performance.mark(n)}function Mr(n){performance.clearMarks(n)}function Nt(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 Ut(n){return`${E.SCREENSHARE_FIRST_FRAME}_${ro(n)}`}function ro(n){return typeof n=="string"?n:JSON.stringify(n)}var je=class je{constructor(){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=Nt(r.name)),r.value!==null&&je._instance?._eventualLogs.add(r)}static destroy(){je._instance?._destroy(),je._instance=null}_destroy(){this._eventualLogs.clear()}};je._instance=null;var Ee=je;var Oi=class{constructor(r){this._firstFrameReceived=!1;this._participantId=r}measure(r,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=Ut(this._participantId),i=Nt(t);i!==null&&Ee.logEventualStat({name:E.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var no=65536,Bt=class n{constructor(r,e,t){this._chunks=[];this._participantId=r,this._onStream=e,this._onStat=t,this._statScreenShareFirstFrame=new Oi(r)}appendChunk(r){let e=this._chunks.length;if(r.start)this._measureFreezeDuration(!1),this._measureFreezeDuration(!0),e&&(c.warn("[FrameBuilder] Cleanup buffer",Array.prototype.slice.call(this._chunks)),this._chunks=[]);else if(!e||(this._chunks[e-1].sequence+1)%no!==r.sequence){c.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(){Mr(E.SCREENSHARE_FREEZE_DURATION),Mr(Ut(this._participantId)),this._chunks=[]}_processFrameData(){let r=this._chunks;this._chunks=[];let e=r.reduce((a,o)=>a+o.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 ao(r.buffer);t.bigEndian=!0,t.index+=2;let i=t.readBits(1),o=t.readBits(1)<<1|i;return o===3&&t.index++,t.readBits(1)===1||t.readBits(1)!==0||(t.index++,t.index++,t.index+=24,o>=2&&t.index++,t.readBits(3)!==7?(t.index++,(o===1||o===3)&&(t.index+=3)):(o===1||o===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){Ve(E.SCREENSHARE_FREEZE_DURATION);return}let e=Nt(E.SCREENSHARE_FREEZE_DURATION);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var gt=class{constructor(r){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 Ft=class extends gt{constructor(e){super(e);this._canvas=null;this._canvasContext=null;this._stream=null;this._track=null;c.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;e instanceof ImageBitmap?i=e:i=await createImageBitmap(e,0,0,e.width,e.height),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(),c.debug("CanvasRenderer destroyed")}static isBrowserSupported(){return("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)&&!(y.browserName()==="Safari"&&Number(y.browserVersion())===15)&&!(y.browserName()==="Firefox"&&Number(y.browserVersion())<60)}};var ft=class extends gt{constructor(r){super(r),c.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(r){await this._writer.write(r)}destroy(){this._writer.releaseLock(),this._generator.writable.close().then(()=>this._generator.stop()),c.debug("TrackGeneratorRenderer destroyed")}static isBrowserSupported(){return"VideoFrame"in window&&"MediaStreamTrackGenerator"in window&&qe.isBrowserSupported()}};var Vt=class extends Bt{constructor(e,t,i){super(e,t,i);this._decoderReady=!1;this._decoderBusy=!1;this._decoderQueue=[];c.debug(`StreamBuilder started for participant [${e}]`),ft.isBrowserSupported()?this._renderer=new ft(t):this._renderer=new Ft(t),qe.isBrowserSupported()?this._decoder=new qe:this._decoder=new ht;let a=async s=>{this._decoderBusy=!1,"VideoFrame"in window&&s instanceof VideoFrame?await this._renderer.drawFrame(s):await this._renderer.drawImage(s),this._fpsMeter.increment(),this._decodeQueue()},o=s=>{this._decoderBusy=!1,this._decodeQueue()};this._decoder.init(a,o).then(()=>{this._decoderReady=!0,this._decodeQueue()}),this._fpsMeter=new _t(s=>c.log(`[StreamBuilder][${e}] fps: ${s}`),2e4)}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_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(),c.debug(`StreamBuilder destroyed for participant ${this._participantId}`)}static isBrowserSupported(){return Ft.isBrowserSupported()||ft.isBrowserSupported()}};function wa(n,r,e,t,i,a,o){let s=0;r&&(s|=1),e&&(s|=2),t&&(s|=4),o||(s|=8);let l=new ArrayBuffer(11),p=new DataView(l);if(p.setUint8(0,1),p.setUint16(1,i),p.setUint32(3,n),p.setUint8(7,a?1:0),p.setUint16(8,0),p.setUint8(10,s),!o)return l;let u=new Uint8Array(l.byteLength+o.byteLength);return u.set(new Uint8Array(l),0),u.set(new Uint8Array(o),l.byteLength),u.buffer}function ka(n){let r=new DataView(n),e=r.getUint8(0),t=r.getUint16(1),i=r.getUint32(3),a=r.getUint8(7)===1,o=r.getUint16(8),s=r.getUint8(10),l=!!(s&1),p=!!(s&2),u=!!(s&4),m=!!(s&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:i,start:l,end:p,keyframe:u,sequence:t,isVP9:a,ssrc:o,eos:m,data:n.slice(11)}}function xa(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 Oa(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),o=r.getUint32(6);return{seq:a,ts2:o}}import*as k from"simple-ebml-builder";var oo=2**15-1,Ar=1,so=5,co=5;var Dr=class n{constructor(r){this._sourceBuffer=null;this._queue=[];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),c.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 k.build(r[0])}else return new Uint8Array;let e=r.reduce((a,o)=>a+o.countSize(),0),t=new Uint8Array(e),i=0;for(let a of r){let o=k.build(a);t.set(o,i),i+=o.byteLength}return t}_initBuffer(){this._sourceBuffer=this._mediaSource.addSourceBuffer(`video/webm; codecs="${this._codec}"`),this._sourceBuffer.mode="sequence",this._sourceBuffer.addEventListener("updateend",()=>this._handleQueue())}changeType(r){return this._codec=r,this._sourceBuffer?.changeType(r)}append(r,e=!1){this._queue.push(r),e&&this._handleQueue()}cleanup(){this._mediaSource?.readyState==="open"&&this._sourceBuffer?.abort();let r=this._sourceBuffer?.buffered,e=r?.length;if(!e)return;let t=r.start(0),i=Math.max(0,r.end(e-1)-so);i-t>co&&(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}},St=class n extends Bt{constructor(e,t,i){super(e,t,i);this._mediaBuffer=null;this._video=null;this._stream=null;this._earliestTimestamp=0;this._clusterStartTime=0;this._lastFrameTimestamp=0;c.debug(`[WebmBuilder] started for participant [${e}]`)}static _intToU16BE(e){return new Uint8Array([e>>8,e])}static _genWebmHeader(){return k.element(k.ID.EBML,[k.element(k.ID.EBMLVersion,k.number(1)),k.element(k.ID.EBMLReadVersion,k.number(1)),k.element(k.ID.EBMLMaxIDLength,k.number(4)),k.element(k.ID.EBMLMaxSizeLength,k.number(8)),k.element(k.ID.DocType,k.string("webm")),k.element(k.ID.DocTypeVersion,k.number(2)),k.element(k.ID.DocTypeReadVersion,k.number(2))])}static _genSegmentHeader(e,t,i){let a=k.element(k.ID.Info,[k.element(k.ID.TimecodeScale,k.number(1e6)),k.element(k.ID.MuxingApp,k.string("vk-webm-builder")),k.element(k.ID.WritingApp,k.string("vk-webm-builder"))]),o=[k.element(k.ID.PixelWidth,k.number(e)),k.element(k.ID.PixelHeight,k.number(t))],s=k.element(k.ID.Tracks,k.element(k.ID.TrackEntry,[k.element(k.ID.TrackNumber,k.number(Ar)),k.element(k.ID.TrackUID,k.number(Ar)),k.element(k.ID.TrackType,k.number(1)),k.element(k.ID.FlagLacing,k.number(0)),k.element(k.ID.DefaultDuration,k.number(1e9)),k.element(k.ID.CodecID,k.string(`V_${i.toUpperCase()}`)),k.element(k.ID.Video,o)]));return k.unknownSizeElement(k.ID.Segment,[a,s])}static _genClusterHeader(e){return k.unknownSizeElement(k.ID.Cluster,[k.element(k.ID.Timecode,k.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new Dr(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){c.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=()=>c.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,c.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(),c.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let s=n._genWebmHeader();this._mediaBuffer?.append(s);let l=n._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(l)}let a=Math.round(i-this._clusterStartTime);if(a>oo&&(this._clusterStartTime=i,a=0),a===0){c.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let s=n._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(s)}let o=k.element(k.ID.SimpleBlock,[k.vintEncodedNumber(Ar),k.bytes(n._intToU16BE(a)),k.number((e.keyframe?1:0)<<7),k.bytes(e.frameData)]);this._mediaBuffer?.append(o,!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),c.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 vt=class{constructor(r,e,t,i,a){this._participantIdRegistry=null;this._streamBuilders={};this._onStream=()=>{};this._onEos=()=>{};c.debug("ScreenCaptureReceiver started"),this._datachannel=r,this._participantIdRegistry=e,this._onStream=t,this._onEos=i,this._onStat=a,this._datachannel.onmessage=o=>this._onDataChannelMessage(o.data)}_onDataChannelMessage(r){let e=ka(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){c.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);d.screenShareWebmBuilder&&St.isBrowserSupported()?i=new St(t,a,this._onStat):i=new Vt(t,a,this._onStat),this._streamBuilders[t]=i}i.appendChunk(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,c.debug("ScreenCaptureReceiver destroyed")}static isBrowserSupported(){return(qe.isBrowserSupported()||ht.isBrowserSupported())&&(Vt.isBrowserSupported()||St.isBrowserSupported())}};var wr=class{constructor(r,e,t){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}},ni=class{constructor(){this._head=null;this._tail=null;this._length=0}get length(){return this._length}push(...r){for(let e of r)this._tail=new wr(e,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(r){this._tail&&(this._tail.next=r._head),this._head||(this._head=r._head),this._tail=r._tail,this._length+=r._length,r.clear()}shift(){if(!this._length||!this._head)return null;let r=this._head;return this._head=r.next,this._head&&(r.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),r.data}bisect(){if(this.length){let r=this.length>1?Math.floor(this.length/2):1;for(let e=0;e<r;e++)this.shift()}}head(){return this._head?.data||null}tail(){return this._tail?.data||null}clear(){this._head=null,this._tail=null,this._length=0}toString(){let r=[],e=this._head;for(;e!==null;)r.push(e.data),e=e.next;return r.length?JSON.stringify(r,(t,i)=>i instanceof Error?String(i):i):""}};import La from"@vkontakte/libvpx";var lo=1e3,jt=class extends Be{constructor(e,t,i,a){super();this._video=null;this._imageCapture=null;this._canvas=null;this._canvasCtx=null;this._frameReadTimeout=0;this._lastFrame=null;this._sourceTrack=e,this._onFrame=t,this._useCongestionControl=i,this._maxBitrate=a,this._useImageCapture="ImageCapture"in window&&ImageCapture.prototype.grabFrame!==void 0&&"ImageBitmap"in window,(e.readyState!=="live"||!e.enabled||e.muted)&&(this._useImageCapture=!1)}_createDom(){this._canvas||(this._canvas=document.createElement("canvas"),this._canvas.style.pointerEvents="none",this._canvas.style.visibility="hidden",this._canvas.style.position="absolute",this._canvas.style.width="160px",this._canvas.style.height="90px",this._canvas.style.bottom="0",this._canvas.style.right="160px",this._canvas.style.zIndex="5000",this._canvasCtx=this._canvas.getContext("2d"),document.body.appendChild(this._canvas)),!this._video&&!this._useImageCapture&&(this._video=document.createElement("video"),this._video.controls=!1,this._video.autoplay=!1,this._video.preload="auto",this._video.muted=!0,this._video.style.pointerEvents="none",this._video.style.visibility="hidden",this._video.style.position="absolute",this._video.style.width="160px",this._video.style.height="90px",this._video.style.bottom="0",this._video.style.right="0",this._video.style.zIndex="5000",document.body.appendChild(this._video))}_removeDom(){try{this._canvas&&document.body.removeChild(this._canvas),this._video&&document.body.removeChild(this._video)}catch{}this._canvasCtx=null,this._canvas=null,this._video=null}async _createStream(e){if(!this._canvas)throw new Error("Canvas not found");if(!this._video&&!this._useImageCapture)throw new Error("Video element not found");return new Promise((t,i)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let a=this._video;a.srcObject=new MediaStream([e]),a.onloadeddata=l=>t(),a.onerror=()=>i(new Error("Video element error"));let o=a.play(),s=()=>i(new Error("Autoplay is disabled"));o?o.catch(s):s()}})}_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;c.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})},[La,La.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:c.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)},lo),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(),c.debug("LibVPxEncoder destroyed")}static isBrowserSupported(){return"WebAssembly"in window&&"Worker"in window&&("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)}};var It=class extends Be{constructor(r,e,t,i,a,o){super(),this._sourceTrack=r,this._onFrame=e,this._useCongestionControl=t,this._maxBitrate=i,this._useCbr=a,this._frameRate=o,this._trackProcessor=new MediaStreamTrackProcessor(r)}async init(){let r=this._sourceTrack.getSettings().width,e=this._sourceTrack.getSettings().height,t=this._trackProcessor.readable;c.debug(`WebCodecsEncoder started ${r}x${e}, 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
- `,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})},[],{readable:t,width:r,height:e,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[t])}requestFrame(r=!1){this._sendToWorker("frame",{keyFrame:r})}setBitrate(r,e,t){this._sendToWorker("set_bitrate",{bitrate:r,useCbr:e,fps:t})}isVP9(){return!0}destroy(){this._removeWorker(),c.debug("WebCodecsEncoder destroyed")}static isBrowserSupported(){return"VideoEncoder"in window&&"Worker"in window&&"EncodedVideoChunk"in window&&"MediaStreamTrackProcessor"in window}};var po=2100,uo=600,mo=1.2,Na=.8,ho=2e3,_o=8e3,kr=8e3,go=16e3,fo=4,So=2e3,Li=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Li||{}),oi=class{constructor(r,e,t,i,a,o,s){this._upPenalty=0;this._delayAvgShort=-1;this._delayAvgLong=-1;this._minDelay=Number.MAX_VALUE;this._maxDelay=0;this._largeDelayDuration=0;this._frames=0;this._fps=0;this._onCongestion=r,this._ccEnabled=i,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=a,this._targetFps=s,o>0?this._highDelayThreshold=o:this._highDelayThreshold=po,a&&(this._highDelayThreshold=uo),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let l=Date.now();this._lastDown=0,this._lastUp=l,this._lastProbing=l,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(r,e,t){let i=Date.now();if(this._calcFps(i),this._calcDelay(e,i),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let a=0,o=this._delayAvgShort-this._delayAvgLong,s=Math.round(Math.abs(o)*100/this._delayAvgLong),l=o>40&&s>30&&this._delayAvgShort>this._trendDelayThreshold,p=this._delayAvgShort>this._highDelayThreshold;l||p?a=2:Math.abs(o)<40&&s<10&&!p&&(a=1);let u=Math.round(this._targetBitrate/1e3),m=t;r%20===0&&c.debug(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${o} percent=${s} -> ${Li[a]} tr=${u} br=${t}`);let I=i-this._lastDown;if(a===2&&I>ho){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,fo),this._probing=!1);let ie=Na*m*1e3;if(ie>=this._targetBitrate&&(ie=this._targetBitrate*Na),ie=Math.max(ie,this._minBitrate),ie<this._targetBitrate){let fe=Math.round(ie/1e3),we=Math.round(this._upPenalty*kr/1e3);c.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${o} percent=${s} -> ${Li[a]}`),c.log(`#${r}: cc: DOWN delay=${e} bitrate=${m} target=${u} -> newBitrate=${fe} penalty=${we}s`),this._setBitrate(ie,!0),this._targetBitrate=ie}this._lastDown=i}let A=i-this._lastUp,w=_o+this._upPenalty*kr;if(a===1&&A>w&&I>w){let ie=Math.min(this._targetBitrate*mo,this._maxBitrate);if(ie>this._targetBitrate){let fe=Math.round(ie/1e3),we=Math.round(this._targetBitrate/1e3),X=Math.round(this._upPenalty*kr/1e3);c.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${o} percent=${s} -> ${Li[a]}`),c.log(`#${r}: cc: UP bitrate=${m} target=${we} -> newBitrate=${fe} penalty=${X}s`),this._setBitrate(ie,!1),this._targetBitrate=ie,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let j=i-this._lastProbing;this._probing&&j>go&&(this._probing=!1);let q=i-this._lastDown;this._upPenalty>0&&q>3*w&&(c.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>So){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&&c.log(`cc: fps=${this._fps}`)}}};var si=class{constructor(r){this._size=0;this._head=0;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 o=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++,o}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,o=this._tail;for(let s=0;s<this._maxSize;s++){o>0?--o:o=this._maxSize-1;let l=this._buffer[o];if(!l||(a===-1&&(a=l.ts2,t=0),a>=0&&(t+=l.size),i=l.ts2,a-i>=r)||o===this._head)break}if(i>=0&&a>=0){let s=a-i;e=Math.round(s>0?t*8/s: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 o=0;o<this._maxSize;o++){a>0?--a:a=this._maxSize-1;let s=this._buffer[a];if(s){if(i===-1&&s.end&&!s.start&&(i=s.ts2,e=0),t===-1&&i>=0&&s.start&&!s.end&&(t=s.ts2),t>=0&&i>=0){let l=i-t;r=l>0?e*8/l:0;break}if(i>=0&&(e+=s.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 xr=65536,Io=50,Eo=400,To=1e6,Ro=3e5,Co=3e4,yo=2e3,Po=5,Ni=0,Et=class{constructor(r,e,t,i){this._destroyed=!1;this._needKeyframe=!0;this._frameNum=0;this._feedback=new si(1024);this._lastSentFrameSeq=0;this._lastDeliveredFrameSeq=0;this._lastFrameDelay=0;this._lastFramerateReduced=Date.now();this._lastSharingStat=Date.now();this._queue=new ni;c.debug("ScreenCaptureSender started"),this.DATA_SIZE=d.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=i,this._congestionControlEnabled=d.screenShareCongestionControl||this._fastSharing,this._width=r.getSettings().width,this._height=r.getSettings().height,this._maxFrameDelay=this._fastSharing?d.screenShareCongestionControlThreshold:d.screenShareCongestionControlThreshold*2;let a=d.getScreenFrameRate(this._fastSharing),{minBitrate:o,maxBitrate:s}=this._calcMinMaxBitrate(this._width,this._height),l=this._onCongestionCallback.bind(this);c.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(o/1e3)}k maxBitrate=${Math.round(s/1e3)}k delayThreshold=${d.screenShareCongestionControlThreshold}`),this._congestionControl=new oi(l,o,s,this._congestionControlEnabled,this._fastSharing,d.screenShareCongestionControlThreshold,a);let p=(u,m)=>{if(this._destroyed)return;if(!u){c.warn("requestFrame failed, keyFrame: "+this._needKeyframe,m),this._needKeyframe=!0,this._handleQueue();return}(u.width!==this._width||u.height!==this._height)&&(this._width=u.width,this._height=u.height,this._onResize(this._width,this._height));let I=this._sliceFrame(u);this._queue.merge(I),this._handleQueue(),this._sendSharingStat()};if(It.isBrowserSupported()){let u=this._fastSharing;this._encoder=new It(r,p,this._congestionControlEnabled,s,u,a)}else this._encoder=new jt(r,p,this._congestionControlEnabled,s);this._datachannel.onmessage=u=>{xa(u.data)&&(c.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let m=Oa(u.data);m!==null&&this._checkCcFeedback(m)},this._encoder.init().then(()=>this._handleQueue()).catch(u=>c.warn("ScreenCaptureSender init failed",u)),this._fpsMeter=new _t(u=>c.log(`[ScreenCaptureSender] fps: ${u}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+xr)%xr>Po&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>yo&&(this._lastFramerateReduced=i,c.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(r)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),S.setImmediate(()=>this._handleQueue());return}if(r.isLast){this._frameNum++,this._fpsMeter.increment(),r.isKey&&c.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 S.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 ni;for(let a=0;a<t;a+=this.DATA_SIZE){let o=r.data.slice(a,a+this.DATA_SIZE),s=a===0,l=t<=a+o.byteLength,p=this._wrapHeader(r.timestamp,s,l,e,o);i.push({data:p.data,sequence:p.sequence,frameSize:t,isFirst:s,isLast:l,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let o=wa(r,e,t,i,Ni,this._encoder.isVP9(),a),s={sequence:Ni,data:o};return Ni=(Ni+1)%xr,s}_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 c.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(),c.debug("ScreenCaptureSender destroyed")}static isBrowserSupported(){return It.isBrowserSupported()||jt.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),o=Math.round(i/1e3);c.log(`cc: resize to ${r}x${e}, minBitrate=${a} maxBitrate=${o}`),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(Ro,Math.min(To,Math.round(t*Io))),a=Math.round(t*Eo);return{minBitrate:i,maxBitrate:a}}_checkCcFeedback(r){let e=this._feedback.update(r.seq,r.ts2);if(e===null)c.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&&(c.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var Te=class n{static get sessionKey(){return n._sessionKey}static set sessionKey(r){n._sessionKey=r}static get sessionSecretKey(){return n._sessionSecretKey}static set sessionSecretKey(r){n._sessionSecretKey=r}static get accessToken(){return n._accessToken}static set accessToken(r){n._accessToken=r}static isEmpty(){return!n._sessionKey}};var _=class _{static set(r){r.hasOwnProperty("voiceParams")&&(Object.assign(_._params.voiceParams,r.voiceParams),delete r.voiceParams),r.hasOwnProperty("specListenerParams")&&(Object.assign(_._params.specListenerParams,r.specListenerParams),delete r.specListenerParams),r.hasOwnProperty("apiAuth")&&(Te.accessToken=r.apiAuth.accessToken,Te.sessionKey=r.apiAuth.sessionKey,Te.sessionSecretKey=r.apiAuth.sessionSecretKey),Object.assign(_._params,S.objectFilterOutValues(r,void 0))}static get(r){return _._params[r]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.6-dev.15af4b30.0"}static get debug(){return _._params.debug}static get protocolVersion(){return _._params.joinFromMultipleDevices?6:5}static get platform(){return _._params.platform}static set platform(r){_._params.platform=r}static get clientStatsPlatform(){return _._params.clientStatsPlatform}static set clientStatsPlatform(r){_._params.clientStatsPlatform=r}static get clientType(){return _._params.clientType}static set clientType(r){_._params.clientType=r}static get externalUserType(){return _._params.externalUserType}static set externalUserType(r){_._params.externalUserType=r}static get device(){return _._params.device}static get apiKey(){return _._params.apiKey}static get apiEnv(){return _._params.apiEnv}static get apiBaseUrl(){return _._params.apiBaseUrl}static set apiBaseUrl(r){_._params.apiBaseUrl=r}static apiEndpoint(r){switch(r??_.apiEnv){case"AUTO":case"PROD":return"https://api.mycdn.me";case"CALLS":return"https://calls.okcdn.ru";case"PROD_OK":return"https://api.ok.ru";case"TEST":return"https://apitest.ok.ru/api";case"VIDEOTEST":return"https://videotestapi.ok.ru/api";case"CALLSTEST":return"https://calls-test.okcdn.ru/api";default:return _._params.apiEnv}}static get authToken(){return _._params.authToken}static set authToken(r){_._params.authToken=r}static get anonymToken(){return _._params.anonymToken}static set anonymToken(r){_._params.anonymToken=r}static get domain(){return _._params.domain}static get externalDomain(){return _._params.externalDomain}static get iceServers(){return _._params.iceServers}static set iceServers(r){_._params.iceServers=r}static get wssBase(){return _._params.wssBase}static set wssBase(r){_._params.wssBase=r}static get wtsBase(){return _._params.wtsBase}static set wtsBase(r){_._params.wtsBase=r}static get wssToken(){return _._params.wssToken}static set wssToken(r){_._params.wssToken=r}static get signalingReconnectDelay(){return _._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return _._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return _._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return _._params.waitConnectionDelay}static get waitResponseDelay(){return _._params.waitResponseDelay}static get waitMessageDelay(){return _._params.waitMessageDelay}static get waitAnotherTabDelay(){return _._params.waitAnotherTabDelay}static get debugLog(){return _._params.debugLog}static get forceRelayPolicy(){return _._params.forceRelayPolicy}static set forceRelayPolicy(r){_._params.forceRelayPolicy=r}static get videoMinWidth(){return _._params.videoMinWidth}static get videoMaxWidth(){return _._params.videoMaxWidth}static set videoMaxWidth(r){_._params.videoMaxWidth=r}static get videoMinHeight(){return _._params.videoMinHeight}static get videoMaxHeight(){return _._params.videoMaxHeight}static set videoMaxHeight(r){_._params.videoMaxHeight=r}static get videoAspectRatio(){return _._params.videoAspectRatio}static get videoFrameRate(){return _._params.videoFrameRate}static get videoFacingMode(){return _._params.videoFacingMode||(y.isMobile()?"user":null)}static set videoFacingMode(r){_._params.videoFacingMode=r}static get displaySurface(){return _._params.displaySurface}static get audioEffects(){return _._params.audioEffects}static set audioEffects(r){_._params.audioEffects=r,_._params.audioEffects?.setLogger((e,...t)=>c.send(e,...t))}static get videoEffects(){return _._params.videoEffects}static set videoEffects(r){_._params.videoEffects=r,_._params.videoEffects?.setLogger((e,...t)=>c.send(e,...t))}static get videoEffectMaxWidth(){return _._params.videoEffectMaxWidth}static set videoEffectMaxWidth(r){_._params.videoEffectMaxWidth=r}static get videoEffectMaxHeight(){return _._params.videoEffectMaxHeight}static set videoEffectMaxHeight(r){_._params.videoEffectMaxHeight=r}static get vmoji(){return _._params.vmoji?.isBrowserSupported()?_._params.vmoji:null}static set vmoji(r){_._params.vmoji=r}static get vmojiOptions(){return _._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(r){_._params.vmojiOptions=r}static get voiceParams(){return _._params.voiceParams}static get specListenerParams(){return _._params.specListenerParams}static get iceRestartWaitTime(){return _._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return _._params.transportConnectionWaitTime}static get statisticsInterval(){return _._params.statisticsInterval}static set statisticsInterval(r){_._params.statisticsInterval=r}static get networkStatisticsInterval(){return _._params.networkStatisticsInterval}static get perfStatReportEnabled(){return _._params.perfStatReportEnabled}static get callStatReportEnabled(){return _._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return _._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return _._params.enableLogPerfStatReport}static get producerNotificationDataChannel(){return _._params.producerNotificationDataChannel}static get producerCommandDataChannel(){return _._params.producerCommandDataChannel}static get consumerScreenDataChannel(){return _._params.consumerScreenDataChannel&&Et.isBrowserSupported()}static get producerScreenDataChannel(){return _._params.producerScreenDataChannel&&_.producerNotificationDataChannel&&vt.isBrowserSupported()}static get asrDataChannel(){return _._params.asrDataChannel&&_.producerNotificationDataChannel}static get consumerScreenDataChannelPacketSize(){return _._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return _._params.screenShareWebmBuilder}static get noiseSuppression(){return _._params.noiseSuppression}static set noiseSuppression(r){_._params.noiseSuppression=r}static get preferH264(){return _._params.preferH264}static get preferVP9(){return _._params.preferVP9}static get audioNack(){return _._params.audioNack}static get consumerScreenTrack(){return _._params.consumerScreenTrack&&_.consumerScreenDataChannel}static get producerScreenTrack(){return _._params.producerScreenTrack}static get movieShare(){return _._params.movieShare&&_.videoTracksCount>0}static get videoTracksCount(){return _.producerNotificationDataChannel?Number(_._params.videoTracksCount):0}static get breakVideoPayloadTypes(){return _._params.breakVideoPayloadTypes}static get useCallsToContacts(){return _._params.useCallsToContacts}static get useParticipantListChunk(){return _._params.useParticipantListChunk&&_.videoTracksCount>0}static get useRooms(){return _._params.useRooms}static get useChatRooms(){return _._params.useChatRooms}static get participantListChunkInitIndex(){return _._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return _._params.participantListChunkInitCount??null}static get serverAudioRed(){return _._params.serverAudioRed}static get p2pAudioRed(){return _._params.p2pAudioRed}static get h264spsPpsIdrInKeyframe(){return _._params.h264spsPpsIdrInKeyframe}static get filterObservers(){return _._params.filterObservers}static get muteMode(){return _._params.muteMode}static get preserveAudioTracks(){return _._params.preserveAudioTracks}static get audioShare(){return y.isAudioShareSupported()&&_._params.audioShare}static get fastScreenShare(){return _._params.fastScreenShare}static get screenShareCongestionControl(){return _._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return _._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return _._params.fastScreenShareWidth}static get fastScreenShareHeight(){return _._params.fastScreenShareHeight}static get newMuteRules(){return _._params.newMuteRules}static get videoSuspend(){return _._params.videoSuspend}static get enumerateDevicesDelay(){return _._params.enumerateDevicesDelay}static getScreenFrameRate(r){return r?_._params.fastScreenShareFrameRate:_._params.screenFrameRate}static get switchVideoAtBadNetwork(){return _._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return _._params.enableVideoEffectsFpsDegradation}static get simulcast(){return _._params.simulcast}static set simulcast(r){_._params.simulcast=r}static get webtransport(){return _._params.webtransport}static set webtransport(r){_._params.webtransport=r}static get webtransportFF(){return _._params.webtransportFF}static set webtransportFF(r){_._params.webtransportFF=r}static toJSON(){return{apiKey:_._params.apiKey,apiEnv:_._params.apiEnv,audioShare:_._params.audioShare,useCallsToContacts:_._params.useCallsToContacts,useParticipantListChunk:_._params.useParticipantListChunk,useRooms:_._params.useRooms,useChatRooms:_._params.useChatRooms,fastScreenShare:_._params.fastScreenShare,participantListChunkInitCount:_._params.participantListChunkInitCount,screenShareCongestionControl:_._params.screenShareCongestionControl,screenShareCongestionControlThreshold:_._params.screenShareCongestionControlThreshold,videoTracksCount:_._params.videoTracksCount,asrDataChannel:_._params.asrDataChannel,videoMaxHeight:_._params.videoMaxHeight,videoMaxWidth:_._params.videoMaxWidth,videoEffectMaxHeight:_._params.videoEffectMaxHeight,videoEffectMaxWidth:_._params.videoEffectMaxWidth,videoSuspend:_._params.videoSuspend,debugLog:_._params.debugLog,callStatReportEnabled:_._params.callStatReportEnabled,joinFromMultipleDevices:_._params.joinFromMultipleDevices,movieShare:_._params.movieShare,newMuteRules:_._params.newMuteRules,clientType:_._params.clientType,clientStatsPlatform:_._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:_._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:_._params.switchVideoAtBadNetwork,simulcast:_._params.simulcast,webtransport:_._params.webtransport,webtransportFF:_._params.webtransportFF}}};_._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,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,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,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,newMuteRules:!1,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,webtransportFF:!1};var d=_;function Ua(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 Se(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var Ba=n=>n.stop(),ci=n=>n.getTracks().forEach(Ba),Fa=n=>n.getVideoTracks().forEach(Ba);async function Ui(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){c.warn("setVideoConstraints failed",e)}}var Bi=class extends re{constructor(){super(...arguments);this.FPS_LIMITS=[13,20,Math.max(d.videoFrameRate,25)];this.THRESHOLD=.8;this.HISTORY_LENGTH=10;this._fpsMeterUnsubscribe=null;this._fpsHistory={cursor:0,arr:[]};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){c.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,o)=>a+o,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 Fe=(i=>(i.audio="audio",i.video="video",i.screen="screen",i.audioshare="audioshare",i))(Fe||{});var Fi=class extends re{constructor(){super();this._stream=null;this._screenTrack=null;this._audioShareTrack=null;this._sendVideoTrack=null;this._cameraVideoTrack=null;this._micAudioTrack=null;this._audioEffectsTrack=null;this._mediaSettings=Se();this._videoStatusOnScreenCapturingEnabled=!1;this._effect=null;this._audioEffectParams=null;this._animojiEnabled=!1;this._initDeviceChangeListener(),d.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),d.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Bi,this._videoEffectsFpsLimiter.addEventListener("fps-limit",this.handleVideoEffectsLowFps.bind(this)))}async request(e=[oe.AUDIO],t=!0){if(this._stream)return;let i=e.includes(oe.VIDEO),a=e.includes(oe.AUDIO),o=e.includes(oe.ANIMOJI);if(!y.isBrowserSupported())throw new H(ae.UNSUPPORTED);try{this._stream=await y.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(s=>s.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=a&&this._stream.getAudioTracks().filter(s=>s.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=o&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=o,this._triggerEvent("SOURCE_READY")}catch(s){throw new H(s)}}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(),o=this.getSendAudioTrack(),s=this.getSendVideoTrack(i);if(!a||!o&&!s&&!t)throw new Error("No local stream found");o&&!t&&e.addTrack(o,a),s&&!t&&e.addTrack(s,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(ae.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Fa(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=y.getSavedMicrophone(),i=y.getSavedCamera(),a=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,o=this._mediaSettings.isVideoEnabled&&i?.groupId!==e.camera?.groupId;try{a&&await this._changeAudioInput(),o&&await this._changeVideoInput()}catch{}},y.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&y.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await y._getUserVideo(!!this._effect,this._frameRate);if(this._cameraVideoTrack?.stop(),this._cameraVideoTrack=i.getVideoTracks()[0],!this._stream)ci(i);else{d.consumerScreenTrack||await this._disableScreenCapture();let a=await this._setEffect(this._effect,this._cameraVideoTrack);R.log(E.DEVICE_CHANGED,t),c.log("Video stream changed"),await this._replaceLocalTrack(a),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw R.log(E.ERROR,"change_video"),c.warn("Camera change failed",t),t}}async setAudioStream(e){return this._changeAudioInput(e)}async _changeAudioInput(e=null){try{let t=e||await y.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)ci(t);else{let i=await this._applyAudioEffect();R.log(E.DEVICE_CHANGED,"audio"),c.log("Audio stream changed",i),await this._replaceLocalTrack(i),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw R.log(E.ERROR,"change_audio"),c.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await y.getScreenMedia(e,t),!this._stream)ci(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),d.consumerScreenTrack||this._stopEffect(),R.log(E.DEVICE_CHANGED,"screen"),c.log("Screen capturing started"),this._screenTrack=a,this._mediaSettings.isScreenSharingEnabled=!0,this._mediaSettings.isFastScreenSharingEnabled=e,d.consumerScreenTrack||(this._videoStatusOnScreenCapturingEnabled=this._mediaSettings.isVideoEnabled,this._mediaSettings.isVideoEnabled=!0,this._sendVideoTrack=d.consumerScreenDataChannel?y.getBlackMediaTrack(d.videoMinWidth,d.videoMinHeight):a,await this._replaceLocalTrack(a,this._sendVideoTrack)),i.getAudioTracks().length>0){let o=i.getAudioTracks()[0];o.contentHint="music",this._audioShareTrack=o,await this._replaceLocalTrack(o),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&c.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:a}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(a){throw R.log(E.ERROR,"screen"),c.warn("Screen capturing failed",a),a}}async _disableScreenCapture(){this._sendVideoTrack&&(this._sendVideoTrack.stop(),this._sendVideoTrack=null),this._screenTrack&&(this._screenTrack.stop(),this._screenTrack=null),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(!d.audioEffects||!this._audioEffectParams)return d.audioEffects?.pause(),this._micAudioTrack;d.audioEffects.isInitialized||await d.audioEffects.init(),d.audioEffects.resume(),d.audioEffects.setEffects(this._audioEffectParams.effects,this._audioEffectParams.isPreset),d.audioEffects.setSource(this._micAudioTrack);let e=d.audioEffects.outputStream.getAudioTracks()[0];return(!this._audioEffectsTrack||this._audioEffectsTrack.id!==e.id)&&(this._audioEffectsTrack=e),this._audioEffectsTrack}getSilentAudioShareTrack(){let e=y.getSilentMediaTrack();return e.contentHint="music",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(d.videoEffects),!d.videoEffects)return t;try{return d.videoEffects.setEffect(e,t)}catch(i){return c.warn("Video effect failed",i),t}}_stopEffect(){if(d.videoEffects)try{d.videoEffects.stopEffect()}catch(e){c.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),d.videoEffects&&(this._effect=null,d.videoEffects.destroy()),d.audioEffects&&d.audioEffects.destroy(),this._stream&&(ci(this._stream),this._stream=null),this._cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),y.getAudioContext()?.suspend().catch(t=>c.error(t)),this._videoEffectsFpsLimiter?.destroy()}async toggleScreenCapturing(e){if(e.captureScreen){await this._changeScreen(e.fastScreenSharing,e.captureAudio);return}return d.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;d.consumerScreenTrack||await this._disableScreenCapture(),this._cameraVideoTrack?.stop();let t;if(e){let i=await y._getUserVideo(!!this._effect,this._frameRate);this._cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this._cameraVideoTrack)}else t=y.getBlackMediaTrack(d.videoMinWidth,d.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;if(e){let i=await y.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t=await this._applyAudioEffect()}else d.audioEffects?.pause(),t=y.getSilentMediaTrack();await this._replaceLocalTrack(t),this._mediaSettings.isAudioEnabled=e,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}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(!d.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:d.noiseSuppression})}async videoEffect(e){if(!d.videoEffects)throw new Error("Video Effects library is not set");if(!d.consumerScreenTrack&&this._mediaSettings.isScreenSharingEnabled)throw new Error("Can't apply effect to screensharing");if(R.log(E.DEVICE_CHANGED,`effect_${e?.effect||"none"}`),!this._mediaSettings.isVideoEnabled){this._effect=e;return}if(this._stream&&e!==this._effect&&this._cameraVideoTrack){let t=this._effect;this._effect=e;try{let 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(),o=new MediaStream([a]);throw await this._changeVideoInput(o),i}}}async audioEffect(e){if(!d.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||!S.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(),o=new MediaStream([a]);throw await this._changeAudioInput(o),i}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this._cameraVideoTrack&&e<d.videoFrameRate&&this._applyVideoConstraints(this._cameraVideoTrack).catch(t=>{c.warn("MediaSource handleVideoEffectsLowFps error",t)})}get _frameRate(){let e=this._videoEffectsFpsLimiter?.fpsLimit??d.videoFrameRate;return this._effect?Math.min(e,d.videoFrameRate):void 0}async _applyVideoConstraints(e,t){await Ui(e,{width:this._effect?d.videoEffectMaxWidth:d.videoMaxWidth,height:this._effect?d.videoEffectMaxHeight:d.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}};var di=class{static isSupported(){return y.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){c.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 Lr=(l=>(l.WAITING_HALL="WAITING_HALL",l.WAITING="WAITING",l.CONNECTING="CONNECTING",l.CONNECTED="CONNECTED",l.RECONNECT="RECONNECT",l.ERROR="ERROR",l.HANGUP="HANGUP",l.PERMISSIONS="PERMISSIONS",l))(Lr||{});function F(n,...r){let e=d.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function le(n,r,...e){if(d.filterObservers){if(Array.isArray(r)){if(r=r.filter(t=>!t.observer),!r.length)return}else if(r.observer)return}F(n,r,...e)}function ve(n){return Object.assign({},n)}function Rt(n){return n.slice()}var Or;(ic=>{function n(f,b){F("onLocalStream",f,ve(b))}ic.onLocalStream=n;function r(f,b){F("onScreenStream",f,ve(b))}ic.onScreenStream=r;function e(f,b){F("onVmojiStream",f,ve(b))}ic.onVmojiStream=e;function t(f){F("onVmojiError",f)}ic.onVmojiError=t;function i(f,b){F("onLocalStreamUpdate",ve(f),b)}ic.onLocalStreamUpdate=i;function a(f){c.debug("Local status:",f),F("onLocalStatus",f)}ic.onLocalStatus=a;function o(f,b){le("onRemoteStream",f,b)}ic.onRemoteStream=o;function s(f,b){le("onRemoteLive",f,b)}ic.onRemoteLive=s;function l(f,b){le("onLocalLive",f,b)}ic.onLocalLive=l;function p(f,b){le("onRemoteLiveUpdate",f,b)}ic.onRemoteLiveUpdate=p;function u(f,b){le("onLocalLiveUpdate",f,b)}ic.onLocalLiveUpdate=u;function m(f,b){le("onRemoteScreenStream",f,b)}ic.onRemoteScreenStream=m;function I(f,b){le("onRemoteVmojiStream",f,b)}ic.onRemoteVmojiStream=I;function A(f,b,$){le("onRemoteStreamSuspended",f,b,$)}ic.onRemoteStreamSuspended=A;function w(f,b,$,ke,mt){le("onConversation",f,ve(b),ve($),ke,mt)}ic.onConversation=w;function j(f){f&&F("onConversationParticipantListChunk",f)}ic.onConversationParticipantListChunk=j;function q(f,b,$){le("onRemoteMediaSettings",f,ve(b),$)}ic.onRemoteMediaSettings=q;function ie(f,b){le("onLocalMediaSettings",f,ve(b))}ic.onLocalMediaSettings=ie;function fe(f,b,$){le("onRemoteSharedMovieInfo",f,ve(b),$)}ic.onRemoteSharedMovieInfo=fe;function we(f,b,$){le("onRemoteSharedMovieStoppedInfo",f,ve(b),$)}ic.onRemoteSharedMovieStoppedInfo=we;function X(f,b,$){le("onLocalSharedMovieInfo",f,ve(b),$)}ic.onLocalSharedMovieInfo=X;function ye(f,b,$){le("onLocalSharedMovieStoppedInfo",f,ve(b),$)}ic.onLocalSharedMovieStoppedInfo=ye;function Pe(f,b,$){le("onRemoteSharedUrl",f,b,$)}ic.onRemoteSharedUrl=Pe;function Qt(f,b){le("onParticipantAdded",f,b)}ic.onParticipantAdded=Qt;function na(f,b){le("onParticipantJoined",f,b)}ic.onParticipantJoined=na;function oa(f){F("onLocalParticipantState",ve(f))}ic.onLocalParticipantState=oa;function Z(f,b,$){le("onRemoteParticipantState",f,ve(b),$)}ic.onRemoteParticipantState=Z;function Xt(f,b){F("onRemoteParticipantsState",f,b)}ic.onRemoteParticipantsState=Xt;function sa(f,b,$=null){c.debug("Remote status:",b,f),le("onRemoteStatus",f,b,$)}ic.onRemoteStatus=sa;function ca(){F("onPermissionsRequested")}ic.onPermissionsRequested=ca;function da(f,b){F("onPermissionsError",f,b)}ic.onPermissionsError=da;function la(f,b){le("onRemoteRemoved",f,b)}ic.onRemoteRemoved=la;function pa(f,b,$){F("onCallState",f,b,ve($))}ic.onCallState=pa;function Ai(f,b){F("onDeviceSwitched",f,b)}ic.onDeviceSwitched=Ai;function Er(f,b,$,ke=!1,mt=!1,Rr=null,Cr=null,Wn,fa,$n=null){let Kn=fa?Rt(fa):void 0;F("onMuteStates",ve(f),Rt(b),Rt($),ke,mt,Rr,Cr,Wn,Kn,$n)}ic.onMuteStates=Er;function ua(f,b,$=!1){le("onRolesChanged",f,Rt(b),$)}ic.onRolesChanged=ua;function ma(f,b=!1){F("onLocalRolesChanged",Rt(f),b)}ic.onLocalRolesChanged=ma;function ha(f,b,$,ke){le("onPinnedParticipant",f,b,$,ke)}ic.onPinnedParticipant=ha;function Tr(f,b){F("onLocalPin",f,b)}ic.onLocalPin=Tr;function _a(f){F("onOptionsChanged",Rt(f))}ic.onOptionsChanged=_a;function W(){F("onCallAccepted")}ic.onCallAccepted=W;function pe(f){le("onAcceptedCall",f)}ic.onAcceptedCall=pe;function B(){F("onRateNeeded")}ic.onRateNeeded=B;function ee(f){le("onSpeakerChanged",f)}ic.onSpeakerChanged=ee;function ne(f){F("onVolumesDetected",Rt(f))}ic.onVolumesDetected=ne;function ue(f,b){F("onLocalVolume",f,b)}ic.onLocalVolume=ue;function Xe(f,b){F("onJoinStatus",f,b)}ic.onJoinStatus=Xe;function Ue(f,b){F("onHangup",f,b)}ic.onHangup=Ue;function h(f){F("onMultipartyChatCreated",ve(f))}ic.onMultipartyChatCreated=h;function T(){F("onDeviceChange")}ic.onDeviceChange=T;function C(f){F("onFingerprintChange",f)}ic.onFingerprintChange=C;function P(){F("onTokenExpired")}ic.onTokenExpired=P;function g(f,b,$=!1){F("onChatMessage",f,b,$)}ic.onChatMessage=g;function M(f,b,$=!1){F("onCustomData",f,b,$)}ic.onCustomData=M;function G(f,b,$,ke,mt,Rr,Cr=null){F("onRecordStarted",f,b,$,ke,mt,Rr,Cr)}ic.onRecordStarted=G;function U(f=null){F("onRecordStopped",f)}ic.onRecordStopped=U;function Y(f){F("onLocalNetworkStatusChanged",f)}ic.onLocalNetworkStatusChanged=Y;function he(f){F("onNetworkStatusChanged",f)}ic.onNetworkStatusChanged=he;function x(f,...b){F("onDebugMessage",f,...b)}ic.onDebugMessage=x;function _e(f,b){let $=Object.assign({},f,{memory:b});F("onStatistics",$)}ic.onStatistics=_e;function me(){F("onAutoplayError")}ic.onAutoplayError=me;function ge(f,b,$,ke,mt){F("onChatRoomUpdated",f,b,$,ke,mt)}ic.onChatRoomUpdated=ge;function ce(f){F("onPromoted",f)}ic.onPromoted=ce;function Me(f){F("onRemoteMixedAudioStream",f)}ic.onRemoteMixedAudioStream=Me;function ut(f){F("onJoinLinkChanged",f)}ic.onJoinLinkChanged=ut;function xt(f){F("onRoomsUpdated",f)}ic.onRoomsUpdated=xt;function Ke(f,b,$,ke){F("onRoomUpdated",f,b,$,ke)}ic.onRoomUpdated=Ke;function Zt(f){F("onRoomParticipantsUpdated",f)}ic.onRoomParticipantsUpdated=Zt;function ga(f){F("onRoomSwitched",f)}ic.onRoomSwitched=ga;function Gs(f){F("onRoomStart",f)}ic.onRoomStart=Gs;function Ws(f,b=null){F("onFeedback",f,b)}ic.onFeedback=Ws;function $s(f){F("onFeaturesPerRoleChanged",f)}ic.onFeaturesPerRoleChanged=$s;function Ks(f){F("onParticipantVmojiUpdate",f)}ic.onParticipantVmojiUpdate=Ks;function qs(f,b){F("onAsrSet",f,b)}ic.onAsrSet=qs;function zs(f,b,$){F("onAsrStarted",f,b,$)}ic.onAsrStarted=zs;function Js(f){F("onAsrStopped",f)}ic.onAsrStopped=Js;function Ys(f,b,$,ke){F("onAsrTranscription",f,b,$,ke)}ic.onAsrTranscription=Ys;function Qs(f,b){F("onParticipantIdChanged",f,b)}ic.onParticipantIdChanged=Qs;function Xs(f){F("onVideoSuspendSuggest",f)}ic.onVideoSuspendSuggest=Xs;function Zs(f){F("onSignalingMessage",typeof f=="string"?f:ve(f))}ic.onSignalingMessage=Zs;function ec(f){F("onPromotionApproved",f)}ic.onPromotionApproved=ec;function tc(){F("onPeerRegistered")}ic.onPeerRegistered=tc})(Or||(Or={}));var v=Or;var Ur="_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 bo(n){let r=Ht?Ht.getItem(Ur+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function Mo(n,r){try{Ht&&Ht.setItem(Ur+n,JSON.stringify(r))}catch{}}function Ao(n){Ht&&Ht.removeItem(Ur+n)}var Nr;(t=>{function n(i){return bo(i)||null}t.get=n;function r(i,a){Mo(i,a)}t.set=r;function e(i){Ao(i)}t.remove=e})(Nr||(Nr={}));var ot=Nr;var Ct=null,Vi=null,Ki=null,zi=[],Ji=[],qi=[],He=null,Ge=null,Yi=null,Qi=!1,Xi=!1,ji,Gt,Hi,Br=null,Fr="",Gi=[],Wi=null,Va=navigator.appVersion,Do=navigator.appName,xe=navigator.userAgent,Ze={},Tt=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(Tt||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(Tt||(Tt={}));var Pt=class{constructor(r,e=!1,t=d.videoMaxWidth,i=d.videoMaxHeight,a=d.videoFrameRate){this.isVideoRequested=()=>this.needVideo;this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let o=!1;if(r){o={noiseSuppression:d.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let l=Ie.getMicrophones(),p,u;if(Ge&&(u=Ge.groupId,p=Ge.deviceId),typeof r=="string")u=l.find(I=>I.deviceId===r)?.groupId,p=r;else if(!Ge&&Ie.os()==="MacOS"&&l.find(m=>m.label.includes("iPhone"))){let m=l.find(I=>!I.label.includes("Virtual")&&!I.label.includes("iPhone"));m&&(u=m.groupId,p=m.deviceId)}u&&this.supportedConstraints.groupId?o.groupId={exact:u}:p&&(o.deviceId={exact:p})}let s=!1;if(e){s={width:{min:d.videoMinWidth,max:t,ideal:t},height:{min:d.videoMinHeight,max:i,ideal:i},aspectRatio:{ideal:d.videoAspectRatio},frameRate:{ideal:a}};let l=Ie.getCameras(),p,u;if(He&&(u=He.groupId,p=He.deviceId),typeof e=="string")u=l.find(I=>I.deviceId===e)?.groupId,p=e;else if(!He&&Ie.os()==="MacOS"&&l.find(m=>m.label.includes("iPhone"))){let m=l.find(I=>!I.label.includes("Virtual")&&!I.label.includes("iPhone"));m&&(u=m.groupId,p=m.deviceId)}u&&this.supportedConstraints.groupId?s.groupId={exact:u}:p&&(s.deviceId={exact:p}),d.videoFacingMode&&(s.facingMode={ideal:d.videoFacingMode},delete s.deviceId,delete s.groupId)}this.audio=o,this.video=s,this.needVideo=!!s,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}},Vr=class extends Pt{constructor(r,e,t,i){if(super(!1,!0),this.captureController="CaptureController"in window?new CaptureController:null,typeof this.video=="object"?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode):this.video={},this.video.cursor="motion",this.video.width=r,this.video.height=e,this.video.frameRate=t,this.video.displaySurface=d.displaySurface,Ie.browserName()==="Safari"){let a=Number(Ie.browserVersion());a===16?(this.video.width={max:r},this.video.height={max:e}):a===17&&(delete this.video.width,delete this.video.height)}i&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:"exclude",controller:this.captureController})}},yt=class yt{constructor(){this._lockId=Math.round(Math.random()*99998)+1}busy(){if(yt._lockId)throw R.log(E.ERROR,"change_device"),c.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");yt._lockId=this._lockId}free(){yt._lockId===this._lockId&&(yt._lockId=0)}};yt._lockId=0;var Zi=yt;async function ja(){Xi=!1,Qi=!1,Ct=null;let n={camera:Ie.getSavedCamera(),microphone:Ie.getSavedMicrophone(),output:Ie.getSavedOutput()};await jr(),wo("devicechange",n),v.onDeviceChange()}function wo(n,...r){if(Ze[n])for(let e of Ze[n])e(...r)}async function jr(){return Ct||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!Vi&&navigator.mediaDevices.addEventListener&&(Vi=S.debounce(ja,d.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",Vi)),!Ki&&di.isSupported()&&(Ki=new di,await Ki.init((n,r)=>{switch(r){case"denied":case"prompt":Vi?.();break}})),Ct=navigator.mediaDevices.enumerateDevices().then(n=>{zi=n.filter(i=>i.kind==="videoinput"?(i.label&&(Qi=!0),!0):!1),Ji=n.filter(i=>i.kind==="audioinput"?(i.label?Xi=!0:Ie.isMobile()&&Ie.browserName()==="Firefox"&&(Xi=Qi),!0):!1),qi=n.filter(i=>i.kind==="audiooutput");let r=He?.deviceId??ot.get("videoinput"),e=Ge?.deviceId??ot.get("audioinput"),t=Yi?.deviceId??ot.get("audiooutput");return He=zi.find(i=>i.deviceId===r)||null,Ge=Ji.find(i=>i.deviceId===e)||null,Yi=qi.find(i=>i.deviceId===t)||qi[0]||null,Ct=Promise.resolve(n),n}).catch(()=>(Ct=null,[]))))}function ko(n){if(He&&Ge)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=>{!Ge&&e.kind==="audio"?Ge=r(Ie.getMicrophones(),e):!He&&e.kind==="video"&&(He=r(Ie.getCameras(),e))})}async function li(n,r){c.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative())));let e=(!n.isVideo()||Ie.hasCameraPermission())&&(!n.isAudio()||Ie.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new Zi;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await ja(),ko(i),i}catch(i){switch(t.free(),c.error("getUserMedia error",i),i.name){case"PermissionDeniedError":case"PermissionDismissedError":case"NotAllowedError":case"SecurityError":case"DOMException":case"NotFoundError":r=n.isVideoRequested()?ae.CAMERA_PERMISSION:ae.MIC_PERMISSION;break;case"OverconstrainedError":r=ae.OVERCONSTRAINED;break;case"TypeError":r=ae.UNKNOWN;break;case"AbortError":case"NotReadableError":r=n.isVideoRequested()?ae.CAMERA_ACCESS:ae.MIC_ACCESS;break;case"Error":if(i.message==="MediaSource is busy"){r=n.isVideoRequested()?ae.CAMERA_ACCESS:ae.MIC_ACCESS;break}}if(n.canSimplify())return li(n.simplify(),r);let a=r||ae.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function xo(n){c.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new Zi;try{r.busy();let e=await navigator.mediaDevices.getDisplayMedia(n.getNative()),t=e?.getVideoTracks()[0];if(t){let i=t.getSettings()?.displaySurface;if(c.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){c.warn("Failed to set focus behavior",a)}}return e}catch(e){switch(e.name){case"PermissionDeniedError":case"NotAllowedError":case"SecurityError":throw ae.SCREEN_PERMISSION;default:throw ae.SCREEN_ACCESS}}finally{r.free()}}function $i(){return Gi.length||(Gi=(()=>{let n,r=!1,e=0,t="0",i=xe.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(i[1]))return n=/\brv[ :]+(\d+)/g.exec(xe),["IE",n&&n[1]||"Unknown",r,e,t];if(i[1]==="Safari"){if(n=xe.match(/\bEdge\/(\d+)/),n)return["Edge",n[1]||"Unknown",r,e,t];if(n=xe.match(/\bCriOS\/(\d+)/),n)return["Chrome",n[1],!0,Number(n[1]),t];if(n=xe.match(/\bFxiOS\/(\d+)/),n)return["Firefox",n[1],!1,e,t];if(n=xe.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1],!1,e,t];if(n=xe.match(/\bOPT\/(\d+)/),n)return["Opera",n[1],!1,e,t]}if(i[1]==="Chrome"){if(r=!0,e=Number(i[2]),n=xe.match(/\bOPR\/(\d+)/),n)return["Opera",n[1]||"Unknown",r,e,t];if(n=xe.match(/\bYaBrowser\/(\d+)/),n)return["Yandex",n[1]||"Unknown",r,e,t];if(n=xe.match(/\bSferum\/((\d+)(?:\.\d+)*)/),n)return["Sferum",n[1]||"Unknown",r,e,t];if(n=xe.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=xe.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),n&&n[2]!==void 0&&(t=n[2]),[i[2]?i[1]:Do,n&&n[1]||i[2]||Va,r,e,t]})()),Gi}var Ie;(pe=>{async function n(){if(Ct)return;let B=()=>{pe.getSilentMediaTrack(),document.removeEventListener("click",B),document.removeEventListener("touchstart",B)};document.addEventListener("click",B),document.addEventListener("touchstart",B),await jr()}pe.init=n;function r(){return zi}pe.getCameras=r;function e(){return Ji}pe.getMicrophones=e;function t(){return qi}pe.getOutput=t;function i(){return zi.length>0}pe.hasCamera=i;function a(){return Ji.length>0}pe.hasMicrophone=a;function o(){return He}pe.getSavedCamera=o;function s(){return Ge}pe.getSavedMicrophone=s;function l(){return Yi}pe.getSavedOutput=l;function p(){return d.videoFacingMode}pe.getVideoFacingMode=p;function u(){return Qi}pe.hasCameraPermission=u;function m(){return Xi}pe.hasMicrophonePermission=m;function I(){return Ki?.getPermissionState("microphone")??null}pe.getMicrophonePermissionState=I;function A(B=!1){return m()?i()&&B?u():!0:!1}pe.hasPermissions=A;async function w(B=!1,ee=!0,ne=!0){let ue=a()&&ee,Xe=i()&&B,Ue;if(!ue&&!Xe)Ue=new MediaStream;else try{Ue=await li(new Pt(ue,Xe))}catch{Ue=new MediaStream}return!Ue.getVideoTracks().length&&ne&&Ue.addTrack(pe.getBlackMediaTrack()),!Ue.getAudioTracks().length&&ne&&Ue.addTrack(pe.getSilentMediaTrack()),Ue}pe.getUserMedia=w;async function j(B,ee){let ne=B?d.fastScreenShareWidth:window.screen.width,ue=B?d.fastScreenShareHeight:window.screen.height,Xe=d.getScreenFrameRate(B);return xo(new Vr(ne,ue,Xe,ee))}pe.getScreenMedia=j;async function q(B=!1,ee){let ne=B?d.videoEffectMaxWidth:d.videoMaxWidth,ue=B?d.videoEffectMaxHeight:d.videoMaxHeight;return li(new Pt(!1,!0,ne,ue,ee))}pe._getUserVideo=q;async function ie(B,ee){let ne=ee?.width||d.videoMaxWidth,ue=ee?.height||d.videoMaxHeight;return li(new Pt(!1,B||!0,ne,ue))}pe.getUserVideo=ie;async function fe(B){return li(new Pt(B||!0,!1))}pe.getUserAudio=fe;async function we(B,ee){let[ne]=B.getVideoTracks();if(!ne)throw new Error("Video track not found in stream");return Ui(ne,ee)}pe.setResolution=we;async function X(B,ee){let ue=(await jr()).find(Xe=>Xe.kind===B&&Xe.deviceId===ee);return ue?(B==="videoinput"?He=ue:B==="audioinput"?Ge=ue:B==="audiooutput"&&(Yi=ue),ot.set(B,ee),ue):null}pe._saveDeviceId=X;function ye(){if(!Hi||Hi.readyState==="ended"){let B=pe.getAudioContext(),ee=B.createMediaStreamDestination(),ne=B.createGain();ne.gain.value=1e-5,ne.connect(ee),ne.connect(B.destination);let ue=B.createOscillator();ue.type="sine",ue.frequency.value=0,ue.connect(ne),ue.start(),Hi=ee.stream.getAudioTracks()[0]}return Object.assign(Hi.clone(),{enabled:!1})}pe.getSilentMediaTrack=ye;function Pe(B=d.videoMinWidth,ee=d.videoMinHeight){Gt||(Gt=document.createElement("canvas")),Gt.width=B,Gt.height=ee;let ne=Gt.getContext("2d");return ne.rect(0,0,B,ee),ne.fillStyle="black",ne.fill(),(!ji||ji.readyState==="ended")&&(ji=Gt.captureStream(d.videoFrameRate).getVideoTracks()[0]),Object.assign(ji.clone(),{enabled:!1})}pe.getBlackMediaTrack=Pe;function Qt(){if(Ai()==="Edge"&&Number(Er())<70)return!1;try{let B=window;return"mediaDevices"in B.navigator&&"getUserMedia"in B.navigator.mediaDevices&&B.RTCPeerConnection&&B.RTCIceCandidate&&B.RTCSessionDescription&&B.HTMLCanvasElement&&B.HTMLCanvasElement.prototype.captureStream&&B.RTCRtpSender&&B.RTCRtpSender.prototype.replaceTrack&&B.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}pe.isBrowserSupported=Qt;function na(){return!!navigator.mediaDevices.getDisplayMedia}pe.isScreenCapturingSupported=na;function oa(){let B=pe.browserName()==="Safari"&&pe.browserVersion()==="15"&&pe.browserSubVersion()==="1",ee=pe.browserName()==="Opera",ne=pe.browserName()==="Yandex";return B||ee||ne}pe.isBrokenH264Decoder=oa;function Z(){return pe.browserName()==="Yandex"&&pe.os()==="Windows"||d.simulcast}pe.isBrokenVP9Encoder=Z;function Xt(){return pe.browserName()==="Safari"&&Number(pe.browserVersion())===17&&[4,5,6].includes(Number(pe.browserSubVersion()))}pe.isBrokenVP9Decoder=Xt;function sa(){return pe.browserName()==="Firefox"&&Number(pe.browserVersion())<60}pe.isOldDataChannelDescription=sa;function ca(){return!(pe.baseChromeVersion()&&pe.isMobile())}pe.canPreferH264=ca;function da(){return!(pe.browserName()==="Firefox"||pe.browserName()==="Safari")}pe.isSimulcastSupportedByBrowser=da;function la(){return Fr||(Fr=(()=>{let B={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let ee in B)if(B.hasOwnProperty(ee)&&B[ee].test(xe))return ee;return"Unknown"})()),Fr}pe.os=la;function pa(){return Br===null&&(Br=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(Va)),Br}pe.isMobile=pa;function Ai(){return $i()[0]}pe.browserName=Ai;function Er(){return $i()[1]}pe.browserVersion=Er;function ua(){return $i()[3]}pe.baseChromeVersion=ua;function ma(){return Wi||(Wi=new(window.AudioContext||window.webkitAudioContext)),Wi.resume().catch(()=>{c.warn("Failed to resume AudioContext")}),Wi}pe.getAudioContext=ma;function ha(){return $i()[4]}pe.browserSubVersion=ha;function Tr(){return pe.baseChromeVersion()>=105&&!pe.isMobile()}pe.isAudioShareSupported=Tr;function _a(B,ee){Ze[B]||(Ze[B]=[]),Ze[B].push(ee)}pe.addEventListener=_a;function W(B,ee){if(Ze[B])if(!ee)delete Ze[B];else{let ne=Ze[B].indexOf(ee);ne>-1&&Ze[B].splice(ne,1)}}pe.removeEventListener=W})(Ie||(Ie={}));var y=Ie;var Oe=class Oe{static get startTime(){return Oe._list[0]?.t||0}static get endTime(){let r=Oe._list;return r[r.length-1]?.t||0}static startSession(){Oe._list=[]}static get conversationId(){return Oe._conversationId}static set conversationId(r){Oe._conversationId=r}static add(r){Oe._list.push(r)}static _createContextLogs(){let r=[[`Calls SDK ${d.sdkVersion}`,d.toJSON()],["UserAgent:",navigator.userAgent],["Screen resolution:",`${window.screen.width}x${window.screen.height}`],["Permissions:",`Camera: ${y.hasCameraPermission()}, Mic: ${y.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=Oe._list;return r.length===0?[]:[...Oe._createContextLogs(),...r]}};Oe._list=[],Oe._conversationId=null;var Ae=Oe;var er=class{constructor(){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 Hr=2*1024*1024,Ha=512*1024,Wt=100*1024,Oo=5,Wr="_okcls_logs_session_",Lo=3e4,$r=class{constructor(){this._items=[];this._itemsSize=0;this._storageSize=Hr;try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(Wr)!==0)continue;let t=r.getItem(e);if(!t){Ga(e);continue}let i=$a(t);this.add(e,i)}}catch(r){console.error("Storage is blocked",r),this._storageSize=0}this._items.sort((r,e)=>r.date-e.date),this.cleanup(Wt)}get size(){return this._itemsSize}get length(){return this._items.length}get available(){return Math.max(this._storageSize-this._itemsSize,0)}get items(){return this._items}set storageSize(r){this._storageSize=Math.min(r,this._storageSize,Hr)}add(r,e){let t=parseInt(r.replace(Wr,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(Ga(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>Hr||this.length>Oo-1||this.size+r>this.available);)this.deleteOldestItem()}};function Wa(){return`${Wr}${Date.now()}`}function $a(n){return new Blob([n]).size}function Ga(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function tr(){let n=st.toString();if(!be.available||!n)return;let r=$a(n);if(r>Ha){st.bisect(),tr();return}be.cleanup(Wt+r);try{window.localStorage.setItem(ir,n)}catch(e){if(console.warn("Failed to write log to storage",e),be.storageSize=be.size+r,be.cleanup(Wt+r),be.available>=Wt+r){tr();return}if(r>Wt){st.bisect(),tr();return}be.storageSize=0;return}r>Ha&&(be.add(ir,r),ir=Wa(),st.clear(),be.cleanup(Wt))}function Kr(){!be.available||!st.length||tr()}function No(n=!1){let r=[];try{let i=window.localStorage;for(let o of be.items){let s=i.getItem(o.key);r.push(s)}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 Uo(e,t),t}function Uo(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 Ka(n,r){if(!be.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),Ae.add(t),Gr||(Gr=window.setTimeout(()=>{Gr=null,Kr()},Lo))}function qr(){be||(be=new $r,st=new er,ir=Wa(),window.addEventListener("beforeunload",Kr))}var be,st,ir,Gr=null;window.__VKCallsSDKLogs__=(n=!1)=>(be||qr(),Kr(),No(n));var qa=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(qa||{}),zr;(X=>{let n="📞",r=(ye,...Pe)=>{v.onDebugMessage(ye,...Pe)},e=!1,t=(ye,Pe)=>(...Qt)=>{ye(...Qt),Ka(Pe,Qt)},i=console.debug.bind(console,n),a=console.log.bind(console,n),o=console.warn.bind(console,n),s=console.error.bind(console,n),l=r.bind(null,"DEBUG"),p=r.bind(null,"LOG"),u=r.bind(null,"WARN"),m=r.bind(null,"ERROR");X.debug=l,X.log=p,X.warn=u,X.error=m;function q(){return e}X.enabled=q;function ie(ye){e=ye,d.debugLog&&qr(),ye?(X.debug=d.debugLog?t(i,"DEBUG"):i,X.log=d.debugLog?t(a,"LOG"):a,X.warn=d.debugLog?t(o,"WARN"):o,X.error=d.debugLog?t(s,"ERROR"):s):(X.debug=d.debugLog?t(l,"DEBUG"):l,X.log=d.debugLog?t(p,"LOG"):p,X.warn=d.debugLog?t(u,"WARN"):u,X.error=d.debugLog?t(m,"ERROR"):m)}X.toggle=ie;function fe(ye,...Pe){switch(ye){case"DEBUG":(0,X.debug)(...Pe);break;case"LOG":(0,X.log)(...Pe);break;case"WARN":(0,X.warn)(...Pe);break;case"ERROR":(0,X.error)(...Pe);break}}X.send=fe;function we(ye,...Pe){}X.test=we})(zr||(zr={}));var c=zr;var Fo="kf";function $t(n){return n.stopStream}function Jr(n){return n.keyFrameRequested}function za(n){if($t(n))return"ss";if(Jr(n))return Fo;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 pi=(o=>(o.CAMERA="CAMERA",o.SCREEN="SCREEN",o.STREAM="STREAM",o.MOVIE="MOVIE",o.ANIMOJI="ANIMOJI",o.SHARED_URL="SHARED_URL",o))(pi||{}),Ja="s",Ya="m";function ze(n){return n.participantId+(n.mediaType?Lt+Ja+n.mediaType:"")+(n.streamName?Lt+Ya+n.streamName:"")}function ui(n){let r=n.split(Lt),e=r.shift();if(!e)throw new Error("Illegal stream description: "+n);let t=null,i,a=0;for(let s of r)switch(s.charAt(0)){case Ja:t=Vo(s.slice(1));break;case Ya:i=s.slice(1);break;case xi:a=Number.parseInt(s.slice(1),10);break;default:throw new Error("Unexpected parameter type "+s.charAt(0)+" in stream description "+n)}return{participantId:S.compose(e,a),mediaType:t,streamName:i}}function Vo(n){for(let r of Object.keys(pi))if(r===n)return pi[r];return null}function Je(){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),jo(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,o=t%4294967296|0;i&&(o=~o+1|0,a=o===0?~a+1|0:~a),n.setUint32(r,a),n.setUint32(r+4,o),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 jo(n){return n.buffer!==void 0}function rr(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 Za=0,en=1,Go=2,Wo=3,$o=4,Ko=5,qo=6,zo=7,Jo=0,Yo=1,Qo=2,et=0,Xo=0,Zo=0,es=1,ar=class{constructor(){this.participantIdRegistry=null}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=Je();V.enc(t,Za),V.enc(t,et),V.enc(t,r),bt.enc(t,null);let i=[];for(let a in e)e.hasOwnProperty(a)&&this.writeLayout(e,a,i);return Qa.enc(t,i),bt.enc(t,null),t.ui8array()}writeLayout(r,e,t){let i=r[e],a=Je();if(this.writeStreamDesc(e,a),$t(i))V.enc(a,Yo);else if(Jr(i))V.enc(a,Qo);else if(V.enc(a,Jo),i.priority!==void 0?V.enc(a,i.priority):bt.enc(a,null),i.width!==void 0&&i.height!==void 0?(V.enc(a,Math.round(i.width)),V.enc(a,Math.round(i.height))):(bt.enc(a,null),bt.enc(a,null)),i.fit!==void 0)switch(i.fit){case"cv":V.enc(a,Zo);break;case"cn":V.enc(a,es);break;default:bt.enc(a,null)}else bt.enc(a,null);t.push(a.ui8array())}writeStreamDesc(r,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(r);if(t!==void 0){V.enc(e,t);return}}Xa.enc(e,r)}serializePerfStatReport(r,e){let t=Je();return V.enc(t,en),V.enc(t,et),V.enc(t,r),V.enc(t,e.framesDecoded),V.enc(t,e.framesReceived),t.ui8array()}serializeSharingStatReport(r,e){let t=Je();return V.enc(t,Go),V.enc(t,et),V.enc(t,r),V.enc(t,e.minDelay),V.enc(t,e.maxDelay),V.enc(t,e.avgDelay),V.enc(t,e.largeDelayDuration),t.ui8array()}serializeRequestAsr(r,e){let t=Je();return V.enc(t,Wo),V.enc(t,et),V.enc(t,r),Yr.enc(t,e.request),t.ui8array()}serializeNetworkStatReport(r,e){let t=Je();return V.enc(t,$o),V.enc(t,et),V.enc(t,r),V.enc(t,e.timestamp),V.enc(t,e.sendBitrate),t.ui8array()}serializeEnableVideoSuspend(r,e){let t=Je();return V.enc(t,Ko),V.enc(t,et),V.enc(t,r),Yr.enc(t,e.enabled),t.ui8array()}serializeEnableVideoSuspendSuggest(r,e){let t=Je();return V.enc(t,qo),V.enc(t,et),V.enc(t,r),Yr.enc(t,e.enabled),t.ui8array()}serializeChangeSimulcast(r,e){let t=Je();V.enc(t,zo),V.enc(t,et),V.enc(t,r);let i=e.simulcastInfo.streams.length;V.enc(t,e.mediaSource),V.enc(t,i);for(let a of e.simulcastInfo.streams)Xa.enc(t,a.rid),V.enc(t,a.width),V.enc(t,a.height),V.enc(t,a.fps),V.enc(t,a.bitrate/1e3);return t.ui8array()}async deserializeCommandResponse(r){let e;if(r instanceof Blob){let o="arrayBuffer"in Blob.prototype?await r.arrayBuffer():await Aa(r);e=rr(o)}else e=rr(r);let t=V.dec(e),i=V.dec(e);if(i!==et){c.warn("Unsupported version for command type: "+t+", version "+i);return}if(V.dec(e)!==Xo){c.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case Za:return this.deserializeUpdateDisplayLayoutResponse(e);case en:return this.deserializeReportPerfStatResponse(e);default:c.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(r){let e=V.dec(r),t=Qa.dec(r),i={};return t.forEach(a=>{let o=rr(a),s=Ho.dec(o);if(typeof s=="string")i[s]=V.dec(o);else{let l=s,p=ze(this.participantIdRegistry?.getStreamDescription(l));i[p]=V.dec(o)}}),{type:"response",sequence:e,response:O.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:i}}deserializeReportPerfStatResponse(r){let e=V.dec(r),t=V.dec(r);return{type:"response",sequence:e,response:O.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var tn=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(tn||{}),tt=tn;var rn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(rn||{}),Re=rn;var an=(g=>(g.TRANSMITTED_DATA="transmitted-data",g.ACCEPTED_CALL="accepted-call",g.HUNGUP="hungup",g.PARTICIPANT_ADDED="participant-added",g.PARTICIPANT_JOINED="participant-joined",g.CLOSED_CONVERSATION="closed-conversation",g.MEDIA_SETTINGS_CHANGED="media-settings-changed",g.PARTICIPANT_STATE_CHANGED="participant-state-changed",g.PARTICIPANTS_STATE_CHANGED="participants-state-changed",g.RATE_CALL_DATA="rate-call-data",g.FEATURE_SET_CHANGED="feature-set-changed",g.TOPOLOGY_CHANGED="topology-changed",g.PRODUCER_UPDATED="producer-updated",g.CONSUMER_ANSWERED="consumer-answered",g.MULTIPARTY_CHAT_CREATED="multiparty-chat-created",g.FORCE_MEDIA_SETTINGS_CHANGE="force-media-settings-change",g.SETTINGS_UPDATE="settings-update",g.VIDEO_QUALITY_UPDATE="video-quality-update",g.REGISTERED_PEER="registered-peer",g.SWITCH_MICRO="switch-micro",g.RECORD_STARTED="record-started",g.RECORD_STOPPED="record-stopped",g.REALLOC_CON="realloc-con",g.AUDIO_ACTIVITY="audio-activity",g.SPEAKER_CHANGED="speaker-changed",g.STALLED_ACTIVITY="stalled-activity",g.CHAT_MESSAGE="chat-message",g.CUSTOM_DATA="custom-data",g.ROLES_CHANGED="roles-changed",g.MUTE_PARTICIPANT="mute-participant",g.PIN_PARTICIPANT="pin-participant",g.OPTIONS_CHANGED="options-changed",g.NETWORK_STATUS="network-status",g.PARTICIPANT_SOURCES_UPDATE="participant-sources-update",g.PROMOTE_PARTICIPANT="promote-participant",g.CHAT_ROOM_UPDATED="chat-room-updated",g.PROMOTION_APPROVED="promotion-approved",g.JOIN_LINK_CHANGED="join-link-changed",g.FEEDBACK="feedback",g.MOVIE_UPDATE_NOTIFICATION="movie-update-notification",g.MOVIE_SHARE_STARTED="movie-share-started",g.MOVIE_SHARE_STOPPED="movie-share-stopped",g.URL_SHARING_INFO_UPDATED="url-sharing-info-updated",g.ROOM_UPDATED="room-updated",g.ROOMS_UPDATED="rooms-updated",g.ROOM_PARTICIPANTS_UPDATED="room-participants-updated",g.FEATURES_PER_ROLE_CHANGED="features-per-role-changed",g.PARTICIPANT_ANIMOJI_CHANGED="participant-animoji-changed",g.ASR_STARTED="asr-started",g.ASR_STOPPED="asr-stopped",g.DECORATIVE_PARTICIPANT_ID_CHANGED="decorative-participant-id-changed",g.VIDEO_SUSPEND_SUGGEST="video-suspend-suggest",g))(an||{}),N=an;import{WebTransportPolyfill as as}from"@fails-components/webtransport";import*as Le from"fflate";var ts=63n,is=16383n;var rs=4611686018427387903n,nr=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=ts)return new Uint8Array([Number(e)]);if(e<=is)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<=rs)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")}},or=class{decode(r){let e=this.getNumBytesForLengthInteger(r);if(e<0)throw new Error("Invalid length prefix");if(r.length<e)throw new Error("Not enough data to decode integer");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 sr=class{constructor(r){this.encoder=new TextEncoder,this.lengthEncoder=new nr,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 Le.gzipSync(r);case"deflate":return Le.zlibSync(r);case"deflate-raw":return Le.deflateSync(r);default:return r}}},cr=class{constructor(r){this.decoder=new TextDecoder,this.lengthDecoder=new or,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");return Number(this.lengthDecoder.decode(r.subarray(0,this.lengthPrefixLength)))}decompress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return Le.gunzipSync(r);case"deflate":return Le.unzlibSync(r);case"deflate-raw":return Le.inflateSync(r);default:return r}}};var mi=class{constructor(r,e={}){this.stream=null;this.writer=null;this.reader=null;this.onopen=null;this.onmessage=null;this.onerror=null;this.onclose=null;this.readyState=WebSocket.CONNECTING;this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new sr(this.compression),this.decoder=new cr(this.compression),this.connect()}getCompressionTypeFromUrl(r){try{let t=new URL(r).searchParams.get("compression");switch(t){case"gzip":case"deflate":case"deflate-raw":return t;default:return null}}catch(e){return c.log("Exception while parsing compression",e),null}}async connect(){Ve(E.WEBTRANSPORT_CONNECTED);try{this.webTransport=new as(this.url,{...this.options}),await this.webTransport.ready,c.debug("[WebTransport] WebTransport connected to "+this.url),Ee.logEventualStat({name:E.WEBTRANSPORT_CONNECTED}),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){c.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 readLoop(){if(this.reader)try{for(;;){let{done:r,value:e}=await this.reader.read();if(r){this.close(1e3,"Stream Closed");break}e&&this.decoder.decode(e).forEach(i=>{this.onmessage?.(new MessageEvent("message",{data:i}))})}}catch(r){c.error("[WebTransport] Stream read failed",r),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(r){if(!this.writer){c.warn("[WebTransport] Attempt to send data before stream is ready");return}await this.writer.ready;try{let e=this.encoder.encode(r);await this.writer.write(e)}catch(e){c.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(),this.writer=null,this.reader=null,this.stream=null;try{this.webTransport.close()}catch(t){c.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}))}}static isBrowserSupported(){return y.browserName()==="Firefox"?d.webtransportFF:(y.browserName()!=="Safari",!1)}};var nn="open",on=[()=>d.producerScreenTrack,()=>d.videoTracksCount>0,()=>!0,()=>!0,()=>d.consumerScreenTrack,()=>!0,()=>d.movieShare,()=>d.useParticipantListChunk,()=>d.useRooms,()=>!!d.vmoji,()=>d.useCallsToContacts,()=>d.useChatRooms],ns=10,os=["service-unavailable","conversation-ended","invalid-token"],Ce=class Ce extends ei{constructor(){super(...arguments);this.socket=null;this.sequence=1;this.lastStamp=0;this.websocketCommandsQueue=[];this.datachannelCommandsQueue=[];this.incomingCache=[];this.responseHandlers={};this.reconnectCount=0;this.wtEndpoint=null;this.conversationResolve=null;this.conversationReject=null;this.connected=!1;this.listenersReady=!1;this.postfix="&platform="+d.platform+"&appVersion="+d.appVersion+"&version="+d.protocolVersion+"&device="+d.device+"&capabilities="+Ce._getCapabilityFlags();this.peerId=null;this.conversationId=null;this.reconnectTimer=0;this.connectionMessageWaitTimer=0;this.doctorTimer=0;this.participantIdRegistry=null;this.producerNotificationDataChannel=null;this.producerCommandDataChannel=null;this.producerCommandDataChannelEnabled=!1;this.producerCommandSerializationService=new ar}static _getCapabilityFlags(){let e=0;for(let t=0;t<on.length;t++)on[t]()&&(e|=1<<t);return e.toString(16).toUpperCase()}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=>{c.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=${d.clientType}`,new Promise((t,i)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){R.log(E.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 o=S.decomposeParticipantId(t.participantId),s=S.decomposeId(o.compositeUserId);t=Object.assign({},t,{participantId:s.id,participantType:s.type}),o.deviceIdx&&(t.deviceIdx=o.deviceIdx)}return this._sendRaw(e,t,i,a)}async _sendRaw(e,t={},i=!0,a=0){let o=s=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(s),this.producerCommandDataChannel?.readyState===nn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){R.log(E.SOCKET_ACTION,"not_opened"),c.warn("[signaling] socket is not opened"),s.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(R.log(E.SOCKET_ACTION,"invalid_state"),c.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(s),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((s,l)=>{let p=(m,I=!1)=>{!a||I?l(m):(c.debug("[signaling] resending a signaling message",e,u.sequence),a--,o(u))},u={sequence:this.sequence++,name:e,params:t,responseTimer:0,needResponse:i,resolve:s,reject:p};o(u)})}_isDataChannelCommand(e){return this.producerCommandDataChannelEnabled?e===O.UPDATE_DISPLAY_LAYOUT||e===O.REPORT_PERF_STAT||e===O.REPORT_SHARING_STAT||e===O.REQUEST_ASR||e===O.ENABLE_VIDEO_SUSPEND||e===O.ENABLE_VIDEO_SUSPEND_SUGGEST||e===O.REPORT_NETWORK_STAT||e===O.CHANGE_SIMULCAST:!1}getNextCommandSequenceNumber(){return this.sequence}async hangup(e){return this._send(O.HANGUP,{reason:e}).catch(()=>{})}async sendCandidate(e,t){return this._send(O.TRANSMIT_DATA,{participantId:e,data:{candidate:t}},!1)}async requestTestMode(e,t){return this._send(O.REQUEST_TEST_MODE,{consumer:e,producer:t})}async sendSdp(e,t,i){let a=Object.assign({sdp:t},i);return this._send(O.TRANSMIT_DATA,{participantId:e,data:a})}async acceptCall(e){return this._send(O.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(O.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,ns)}async changeParticipantState(e,t){let i={participantState:{state:e}};return t&&(i.participantId=t),this._sendRaw(O.CHANGE_PARTICIPANT_STATE,i)}async putHandsDown(){return this._send(O.PUT_HANDS_DOWN)}async addParticipant(e,t){return this._send(O.ADD_PARTICIPANT,{externalIds:e,...t})}async addParticipantLegacy(e,t){return this._send(O.ADD_PARTICIPANT,{participantIds:e,...t})}async removeParticipant(e,t=!1){return this._send(O.REMOVE_PARTICIPANT,{participantId:e,ban:t})}async allocateConsumer(e,t){let i={capabilities:t};return e&&(i.description=e.sdp),this._send(O.ALLOCATE_CONSUMER,i)}async acceptProducer(e,t){let i={description:e.sdp};return t&&(i.ssrcs=t),this._send(O.ACCEPT_PRODUCER,i)}async changePriorities(e){return this._send(O.CHANGE_STREAM_PRIORITIES,{typedPriorities:e}).catch(()=>{})}async updateDisplayLayout(e){return this._send(O.UPDATE_DISPLAY_LAYOUT,e)}async addMovie(e){return this._send(O.ADD_MOVIE,e)}async updateMovie(e){return this._send(O.UPDATE_MOVIE,e)}async removeMovie(e){return this._send(O.REMOVE_MOVIE,e)}startUrlSharing(e){return this._send(O.START_URL_SHARING,{sharedUrl:e})}stopUrlSharing(){return this._send(O.STOP_URL_SHARING)}async updateRooms(e,t){return this._send(O.UPDATE_ROOMS,{rooms:e,assignRandomly:t})}async activateRooms(e,t){return this._send(O.ACTIVATE_ROOMS,{roomIds:e,deactivate:t})}async switchRoom(e,t){return this._sendRaw(O.SWITCH_ROOM,{toRoomId:e,participantId:t})}async getRooms(e){return this._sendRaw(O.GET_ROOMS,{withParticipants:e})}async removeRooms(e){return this._send(O.REMOVE_ROOMS,{roomIds:e})}async startStream(e){return this._send(O.RECORD_START,e)}async stopStream(e={roomId:null}){return this._send(O.RECORD_STOP,e)}async publishStream(e={roomId:null}){return this._send(O.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(O.RECORD_SET_CONF,t)}async getRecordStatus(){return this._send(O.RECORD_GET_STATUS)}async switchTopology(e,t=!1){return this._send(O.SWITCH_TOPOLOGY,{topology:e,force:t})}async requestRealloc(){return this._send(O.REQUEST_REALLOC)}async reportPerfStat(e){return this._send(O.REPORT_PERF_STAT,e)}async reportSharingStat(e){return this._send(O.REPORT_SHARING_STAT,e,!1)}async reportNetworkStat(e){return this._send(O.REPORT_NETWORK_STAT,e,!1)}async chatMessage(e,t=null){return this._send(O.CHAT_MESSAGE,{message:e,participantId:t})}async chatHistory(e){return this._send(O.CHAT_HISTORY,{count:e})}async customData(e,t){return this._send(O.CUSTOM_DATA,{data:e,participantId:t})}async grantRoles(e,t,i){let a={participantId:e,roles:t};return i&&(a.revoke=!0),this._sendRaw(O.GRANT_ROLES,a)}async muteParticipant(e,t,i,a=null){return this._sendRaw(O.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:i,roomId:a})}async enableFeatureForRoles(e,t){return this._sendRaw(O.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(O.PIN_PARTICIPANT,a)}async updateMediaModifiers(e){return this._send(O.UPDATE_MEDIA_MODIFIERS,{mediaModifiers:e})}async enableVideoSuspend(e){return this._send(O.ENABLE_VIDEO_SUSPEND,{enabled:e},!1)}async enableVideoSuspendSuggest(e){return this._send(O.ENABLE_VIDEO_SUSPEND_SUGGEST,{enabled:e},!1)}async changeSimulcast(e){return this._send(O.CHANGE_SIMULCAST,e,!1)}async changeOptions(e){return this._send(O.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(O.GET_WAITING_HALL,a)}async promoteParticipant(e,t=!1){let i={};return e&&(i.participantId=e),t&&(i.demote=t),this._sendRaw(O.PROMOTE_PARTICIPANT,i)}async requestPromotion(e=!1){let t={};return e&&(t.unrequest=e),this._send(O.REQUEST_PROMOTION,t)}async acceptPromotion(e=!1){let t={};return e&&(t.reject=e),this._send(O.ACCEPT_PROMOTION,t)}async feedback(e){return this._sendRaw(O.FEEDBACK,{key:e})}async getHandQueue(){return this._send(O.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(O.GET_PARTICIPANT_LIST_CHUNK,e)}async getParticipants(e){return this._send(O.GET_PARTICIPANTS,{externalIds:e})}getPeerId(){return this.peerId}async startAsr(e){return this._send(O.ASR_START,e)}async stopAsr(e){return this._send(O.ASR_STOP,e)}async requestAsr(e){return this._send(O.REQUEST_ASR,{request:e},!1)}_connect(e,t){if(this.socket&&this.socket.readyState<WebSocket.CLOSING)return;let i="";e&&(i+=`&tgt=${e}`),e===tt.RETRY&&this.lastStamp&&(i+=`&recoverTs=${this.lastStamp}`),i=a(i),t?(i+="&compression=deflate-raw",c.debug("[signaling] connecting to wt "+this.wtEndpoint+this.postfix+i),this.socket=new mi(this.wtEndpoint+this.postfix+i)):(c.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+i),this.socket=new WebSocket(this.endpoint+this.postfix+i)),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(o){if(!d.useParticipantListChunk)return o;let s=d.participantListChunkInitIndex;o+=`&partIdx=${s}`;let l=d.participantListChunkInitCount;return l!==null&&(o+=`&partCount=${l}`),o}}_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(){c.debug("[signaling] socket opened"),R.log(E.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor()}_onMessage(e){if(this._startDoctor(),e.data==="ping"){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(E.SOCKET_ACTION,"parse_error"),c.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(c.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._triggerEvent(Re.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Re.NOTIFICATION,{type:"notification",notification:N.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===N.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(Re.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:R.log(E.SOCKET_ACTION,"unknown_message"),c.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){R.log(E.SOCKET_ACTION,`error-${e.error}`);let t=e.error?os.includes(e.error):!1;switch(c.debug(`[signaling] error message [${e.sequence}]`,e),e.sequence&&this.responseHandlers[e.sequence]&&this._handleCommandResponse(!1,e),e.error){case"service-unavailable":this._reconnect();break;case"conversation-ended":this.conversationReject?this.conversationReject(new H(e.reason||ae.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(Re.NOTIFICATION,{notification:N.CLOSED_CONVERSATION,reason:e.reason});break;case"participant-not-found":case"invalid-token":this._throwError(new Error(`Signaling error: ${e.error}`));break;default:if(!t)break;this.connected?this._throwError(new Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new H(e.reason||ae.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(Re.FAILED,e)}_onError(e){R.log(E.SOCKET_ACTION,"error"),c.error("[signaling] signaling error",e)}_onClose(e){R.log(E.SOCKET_ACTION,"closed"),c.debug("[signaling] connection closed",{code:e.code,reason:e.reason}),this.connected=!1,this._stopDoctor(),this.socket&&this.reconnectCount++<Ce.RECONNECT_MAX_COUNT?this._reconnect():this.socket&&this._closeSocket(new Error("Connection closed"))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(new Error("Connection closed"),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(new Error("Connection closed")))}_reconnect(){let e=Math.min(Ce.RECONNECT_MAX_DELAY,Ce.RECONNECT_DELAY*Math.pow(2,this.reconnectCount-1));c.log(`[signaling] reconnect websocket after ${e}ms (${this.reconnectCount})`),R.log(E.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,tt.RETRY,!1),e)}_handleCommandResponse(e,t){if(!this.responseHandlers.hasOwnProperty(t.sequence))return;let i=this.responseHandlers[t.sequence];window.clearTimeout(i.responseTimer),c.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(E.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(E.SOCKET_ACTION,"response-timeout"),i.reject(new Error(t.error||`Response timeout [${i.name}]`))):i.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),Ce.WAIT_RESPONSE_DELAY)}_handleCommandsQueue(e){for(;e.length>0;){let t=e.shift();if(c.debug(`[signaling] command send [${t.sequence}]`,`'${t.name}'`,t.params),this._isDataChannelCommand(t.name)){if(this.producerCommandDataChannel?.readyState!==nn){t.reject(new Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let i=this._serializeBinary(t);i!==null&&this.producerCommandDataChannel.send(i)}else{if(!this.socket||this.socket.readyState!==WebSocket.OPEN){t.reject(new Error("Invalid state or socket already closed"));continue}this._startResponseTimer(t),this.socket.send(this._serializeJson(t))}}}_startResponseTimer(e){if(!e.needResponse){e.resolve({type:"response",sequence:e.sequence,response:e.name});return}e.responseTimer=window.setTimeout(()=>this._handleCommandResponse(!1,{response:e.name,sequence:e.sequence,type:"timeout"}),Ce.WAIT_RESPONSE_DELAY),this.responseHandlers[e.sequence]=e}_serializeBinary(e){switch(e.name){case O.UPDATE_DISPLAY_LAYOUT:return this.producerCommandSerializationService.serializeUpdateDisplayLayout(e.sequence,e.params);case O.REPORT_PERF_STAT:return this.producerCommandSerializationService.serializePerfStatReport(e.sequence,e.params);case O.REPORT_SHARING_STAT:return this.producerCommandSerializationService.serializeSharingStatReport(e.sequence,e.params);case O.REQUEST_ASR:return this.producerCommandSerializationService.serializeRequestAsr(e.sequence,e.params);case O.REPORT_NETWORK_STAT:return this.producerCommandSerializationService.serializeNetworkStatReport(e.sequence,e.params);case O.ENABLE_VIDEO_SUSPEND:return this.producerCommandSerializationService.serializeEnableVideoSuspend(e.sequence,e.params);case O.ENABLE_VIDEO_SUSPEND_SUGGEST:return this.producerCommandSerializationService.serializeEnableVideoSuspendSuggest(e.sequence,e.params);case O.CHANGE_SIMULCAST:return this.producerCommandSerializationService.serializeChangeSimulcast(e.sequence,e.params)}return c.warn("[signaling] cannot get binary data for data channel command: "+e.name),null}_serializeJson(e){let t;e.name===O.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)t.hasOwnProperty(a)&&(i[a]=za(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new H(ae.SIGNALING_FAILED,{message:"Unable to connect to the signaling: connection timeout",remote:!0}))},Ce.WAIT_CONNECTION_DELAY)}_stopWaitConnectionMessage(){window.clearTimeout(this.connectionMessageWaitTimer),this.connectionMessageWaitTimer=0}_startDoctor(){this._stopDoctor(),this.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?c.warn("[signaling] socket is dead. Fallback to WebSocket. Trying to connect"):c.warn("[signaling] socket is dead, trying to reconnect"),this._disconnect(4e3),this._connect(tt.RETRY,!1)},Ce.WAIT_MESSAGE_DELAY)}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return mi.isBrowserSupported()&&this.wtEndpoint!==null&&d.webtransport}};Ce.RECONNECT_DELAY=d.signalingReconnectDelay,Ce.RECONNECT_MAX_DELAY=d.signalingReconnectMaxDelay,Ce.RECONNECT_MAX_COUNT=d.signalingReconnectMaxCount,Ce.WAIT_CONNECTION_DELAY=d.waitConnectionDelay,Ce.WAIT_RESPONSE_DELAY=d.waitResponseDelay,Ce.WAIT_MESSAGE_DELAY=d.waitMessageDelay;var Kt=Ce;var sn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(sn||{}),De=sn;var cn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(cn||{}),it=cn;var dn=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(dn||{}),Qr=dn;var ln=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(ln||{}),Xr=ln;var pn=(o=>(o.REQUIRE_AUTH_TO_JOIN="REQUIRE_AUTH_TO_JOIN",o.AUDIENCE_MODE="AUDIENCE_MODE",o.WAITING_HALL="WAITING_HALL",o.ASR="ASR",o.FEEDBACK="FEEDBACK",o.RECURRING="RECURRING",o))(pn||{}),qt=pn;function un(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function mn(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 hn=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(hn||{}),Ne=hn;var _n=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(_n||{}),J=_n;var gn=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(gn||{}),hi=gn;var fn=(e=>(e.AUDIO_MIX="audio-mix",e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",e))(fn||{}),We=fn;var Sn=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(Sn||{}),vn=Sn;function In(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var En=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(En||{}),ct=En;function _i(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var Zr=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Zr||{}),K;(u=>{function n(m){return m.length?typeof m[0]=="object"?m:m.map(I=>r(I)):[]}u.fromIds=n;function r(m,I="USER",A=0){return{id:m,type:I,deviceIdx:A}}u.fromId=r;function e(m,I=!0){let A=I?m.decorativeExternalUserId:m.externalId,w=m.deviceIdx??0;if(A)return t(A,w)}u.fromSignalingParticipant=e;function t(m,I=0){return{id:m.id,type:m.type==="ANONYM"?"ANONYM":"USER",deviceIdx:I}}u.fromSignaling=t;function i(m){return m.id}u.toSignaling=i;function a(m){let I=m.deviceIdx||0;return`{"id":"${m.id}","type":"${m.type}","deviceIdx":${I}}`}u.toString=a;function o(m,I="USER",A=0){return a(r(m,I,A))}u.fromIdToString=o;function s(m){try{return JSON.parse(m)}catch{throw new Error(`Failed to parse ExternalId from string '${m}'`)}}u.fromString=s;function l(m,I){return m.id===I.id&&m.type===I.type&&m.deviceIdx===I.deviceIdx}u.compare=l;function p(m){return m?.deviceIdx||0}u.getDeviceIdx=p})(K||(K={}));var{isObject:Tn,isObjectsEquals:ss}=S;function ea(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||Tn(n.bitrates)&&Tn(r.bitrates)&&!ss(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function dr(n,r){return!(!ea(n.camera,r.camera)||!ea(n.screenSharing,r.screenSharing))}function ta(n,r){return{camera:Object.assign({},n.camera,r.camera),screenSharing:Object.assign({},n.screenSharing,r.screenSharing)}}function Rn(n){try{return btoa(JSON.stringify(n))}catch(r){c.warn("WaitingParticipant: failed convert to string",n,r)}return null}function Cn(n){try{return JSON.parse(atob(n))}catch(r){c.warn("WaitingParticipant: failed convert from string",n,r)}return null}function yn(n,r){let e=new Uint8Array(r),t=0,i=0;for(;t<n.length&&i<r;){let a=n[t++],o=a>>4,s=a&15;if(o===15){let u;do u=n[t++],o+=u;while(u===255)}for(let u=0;u<o&&!(i>=r);u++)e[i++]=n[t++];if(t>=n.length||i>=r)break;let l=n[t]|n[t+1]<<8;if(t+=2,s===15){let u;do u=n[t++],s+=u;while(u===255)}s+=4;let p=i-l;for(let u=0;u<s&&!(i>=r);u++)e[i++]=e[p+u]}return e}var lr=(n,r)=>S.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function Pn(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 cs(n,r){switch(n){case oe.AUDIO:return!!r.isAudioEnabled;case oe.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case oe.VIDEO:return!!r.isVideoEnabled;case oe.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function bn(n,r){return S.objectReduce(n,(e,t,i)=>{switch(t){case Ne.MUTE:case Ne.MUTE_PERMANENT:{cs(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function Mn(n){let{muteStates:r={},mediaSettings:e}=n;return bn(r,e)}function An(n,r){let e=n.conversation.participants.find(i=>S.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return bn(r,t)}var zt=class{constructor(r){this._fixNoPacketsApplied=!1;this._fixNoPacketsChecked=!1;this._fixTooManyPacketsApplied=!1;this._fixTooManyPacketsSucceeded=!1;this._fixTooManyPacketsFailed=!1;this._toggleAudioPromise=null;this._fixNoPacketsAppliedVideo=!1;this._mediaSource=r}_fixAudioDeviceNoPackets(r){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,R.log(E.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,R.log(E.ERROR,"audio_device_recover"),c.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(y.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?(c.log("[AudioFix] Failed to fix RV"),R.log(E.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(c.log("[AudioFix] Fixed RV"),R.log(E.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,R.log(E.ERROR,"audio_device_recover"),c.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 gi=class{constructor(r){this._output=null;this._volume=1;this._features={setSinkId:!!Audio.prototype.setSinkId};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(d.muteMode||!this._output?.audioTrack)return;let r=y.browserName()!=="Safari"||y.isMobile(),e=document.createElement(r?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{c.warn("[audio] Error on play audio"),v.onAutoplayError()},i=o=>{e.srcObject=new MediaStream([o]),e.load();let s=e.play();s&&s.catch(t)},a=()=>{c.debug("[audio] Recover audio playback");let o=this._output?.audioTrack;o?i(o):c.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=y.getSavedOutput();r&&await this._output.audioElement.setSinkId?.(r.deviceId)}catch(r){throw R.log(E.ERROR,"change_output"),c.error("[audio] Output change failed",r),r}}};var ds=90,ls=3,fi=class extends re{constructor(){super(...arguments);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>ds?c.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=ls)&&(c.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var ps=44100,Mt=class{constructor(r,e){this._analyser=null;this._gainNode=null;this._fftBins=null;this._mediaStreamSource=null;this._lastSmoothedLevel=0;this._trackId=r,this._track=e,this._stream=new MediaStream([e]);try{let t=y.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=ps/this._fftBins.length,e=Math.ceil(d.voiceParams.minFreq/r),t=Math.floor(d.voiceParams.maxFreq/r);return this._fftBins.subarray(e,t)}getLevel(){let r=this._getBins(),t=r.reduce((a,o)=>a+o,0)/r.length/255,i=this._lastSmoothedLevel*d.voiceParams.smoothing+t*(1-d.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 Si=class extends re{constructor(e){super();this._detector=null;this._interval=null;let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,d.voiceParams.interval)};this._interval=window.setTimeout(t,d.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 Mt("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 Dn=(o=>(o.producerNotification="producerNotification",o.producerCommand="producerCommand",o.consumerScreenShare="consumerScreenShare",o.producerScreenShare="producerScreenShare",o.asr="asr",o.animoji="animoji",o))(Dn||{}),rt=Dn;var dt=class dt{constructor(){this._codecUsages=new Map;this.getCurrentTransportTopology=()=>{}}static create(r){let e=new dt;e.getCurrentTransportTopology=r,dt._instance=e}static reportUsage(r){let e=dt._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let i=r.rtps.filter(a=>a.type==="outbound-rtp"&&!a.mid?.endsWith("s"));d.simulcast&&(i=i.reduce((a,o)=>{if(o.kind!=="video")return a.concat(o);let s=a.find(l=>l.kind==="video");return s?s.totalEncodeTime=(s.totalEncodeTime??0)+(o.totalEncodeTime??0):a.push(o),a},[])),i.forEach(a=>{let o=a.kind,s=a.mimeType;if((o==="audio"||o==="video")&&s){let l=a.encoderImplementation,p=[s,"encoder",l].filter(Boolean).join("/");e.saveUsage({kind:o,codecName:p,totalEncodeTime:(a.totalEncodeTime??0)*1e3,audioCodecParams:a.sdpFmtpLine,topology:t})}})}saveUsage({kind:r,codecName:e,totalEncodeTime:t,audioCodecParams:i,topology:a}){let o=this._codecUsages.get(r);if(o&&o.codecName!==e&&this.report(o),o&&o.codecName===e){this._codecUsages.set(r,{...o,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:E.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(){dt._instance?._destroy(),dt._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};dt._instance=null;var Ye=dt;var At=class extends re{constructor(e,t){super();this._state="IDLE";this._pc=null;this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var wn="videochat-epi",us=5e3,ms=500,lt=class extends re{constructor(e,t,i=!1){super();this._previousPerfStatReportTimestamp=0;this._previousNetworkStatReportTimestamp=Date.now();this._previousCallStatReportTimestamp=Date.now();this._previousCallStatReport=null;this._screenShareStats=[];this._handleScreenSharingStat=e=>{this._screenShareStats.push(e)};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(wn)||"",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&&d.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+us<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+ms<=t&&(await this.reportNetworkStats(e),this._previousNetworkStatReportTimestamp=t),d.callStatReportEnabled&&this._previousCallStatReportTimestamp+d.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(wn,i.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((i,a)=>i+(a.bandwidth??0)*8,0)};if(t.timestamp)try{await this._signaling.reportNetworkStat(t)}catch{}}_reportCallStats(e){let t={call_topology:this._directTopology?"D":"S",stat_time_delta:0,nack_received:0,pli_received:0,fir_received:0,frames_dropped:0,jitter_video:0,jitter_audio:0,interframe_delay_variance:0,nack_sent:0,pli_sent:0,fir_sent:0,total_audio_samples_received:0,concealed_audio_samples:0,silent_concealed_audio_samples:0,inserted_audio_samples_for_deceleration:0,removed_audio_samples_for_acceleration:0,audio_concealment_events:0,total_audio_energy:0,inbound_video_count:0,inbound_audio_count:0,packets_lost_video:0,packets_sent_video:0,packets_lost_audio:0,packets_sent_audio:0,freeze_count:0,total_freezes_duration:0,rtt:Math.round(e.inbound.transport.currentRoundTripTime*1e3),ss_freeze_count:0,ss_total_freezes_duration:0,local_address:xn(e.inbound.transport.local),local_connection_type:e.inbound.transport.local?.type,network_type:e.inbound.transport.local?.networkType,transport:e.inbound.transport.local?.protocol,remote_address:xn(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let i=!1,a=!1;for(e.inbound.rtps.reduce((p,u)=>(u.kind==="video"?(i=!0,u.framesReceived&&(p.jitter_video=p.jitter_video*p.inbound_video_count/(p.inbound_video_count+1)+u.jitter*1e3/(p.inbound_video_count+1),p.interframe_delay_variance=p.interframe_delay_variance*p.inbound_video_count/(p.inbound_video_count+1)+(u.interframeDelayVariance||0)*1e6/(p.inbound_video_count+1),p.inbound_video_count++),p.frames_dropped+=u.framesDropped||0,p.nack_sent+=u.nackCount,p.pli_sent+=u.pliCount,p.fir_sent+=u.firCount,p.freeze_count+=u.freezeCountDelta||0,p.total_freezes_duration+=u.totalFreezesDurationDelta||0):(a=!0,u.totalSamplesReceived&&(p.jitter_audio=p.jitter_audio*p.inbound_audio_count/(p.inbound_audio_count+1)+u.jitter*1e3/(p.inbound_audio_count+1),p.total_audio_energy=p.total_audio_energy*p.inbound_audio_count/(p.inbound_audio_count+1)+(u.totalAudioEnergy||0)/(p.inbound_audio_count+1),p.inbound_audio_count++),p.total_audio_samples_received+=u.totalSamplesReceived||0,p.inserted_audio_samples_for_deceleration+=u.insertedSamplesForDeceleration||0,p.removed_audio_samples_for_acceleration+=u.removedSamplesForAcceleration||0,p.concealed_audio_samples+=u.concealedSamples||0,p.silent_concealed_audio_samples+=u.silentConcealedSamples||0,p.audio_concealment_events+=u.concealmentEvents||0),p),t),e.outbound.rtps.reduce((p,u)=>(u.kind==="video"?(p.nack_received+=u.nackCount,p.pli_received+=u.pliCount,p.fir_received+=u.firCount,p.packets_sent_video+=u.packetsSent):p.packets_sent_audio+=u.packetsSent,p),t),e.remoteInbound.rtps.reduce((p,u)=>(u.kind==="video"?p.packets_lost_video+=u.packetsLost:p.packets_lost_audio+=u.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 o={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&&(o.cpu_hardware_concurrency=navigator.hardwareConcurrency),i&&!ur(t.jitter_video)&&(o.jitter_video=Math.round(t.jitter_video)),a&&!ur(t.jitter_audio)&&(o.jitter_audio=Math.round(t.jitter_audio)),i&&!ur(t.interframe_delay_variance)&&(o.interframe_delay_variance=t.interframe_delay_variance),t.freeze_count&&t.total_freezes_duration&&(o.freeze_count=t.freeze_count,o.total_freezes_duration=Math.round(t.total_freezes_duration*1e3)),t.ss_freeze_count&&t.ss_total_freezes_duration&&(o.ss_freeze_count=t.ss_freeze_count,o.ss_total_freezes_duration=t.ss_total_freezes_duration),a&&!ur(t.total_audio_samples_received)){let p=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),u=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),m=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),I=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),A=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),w=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);o.inserted_audio_samples_for_deceleration=Dt(u/p*1e3),o.removed_audio_samples_for_acceleration=Dt(m/p*1e3),o.concealed_audio_samples=Dt(I/p*1e3),o.concealed_silent_audio_samples=Dt(A/p*1e3),o.concealment_audio_avg_size=Dt(I/w),o.total_audio_energy=t.total_audio_energy}kn(t,"local_address","local_connection_type","network_type","transport")&&(o.local_address=t.local_address,o.local_connection_type=t.local_connection_type,o.network_type=t.network_type,o.transport=t.transport),kn(t,"remote_address","remote_connection_type")&&(o.remote_address=t.remote_address,o.remote_connection_type=t.remote_connection_type);let s=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),l=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(s>0){let p=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);o.video_loss=Dt(p/s*100)}if(l>0){let p=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);o.audio_loss=Dt(p/l*100)}Ee.logCallStat(o),d.enableLogPerfStatReport&&c.log("Sent call stats",o),this._previousCallStatReport=t}};function kn(n,...r){for(let e of r)if(!n.hasOwnProperty(e)||n[e]===void 0)return!1;return!0}function xn(n,r=!1){if(n?.address)return n.address+(r?`:${n.port}`:"")}function ur(n){return n===void 0}function Dt(n){return Number.isNaN(n)?0:n}var Ii=class{constructor(r,e=null){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,Ln=.35,hs=85,_s=.1,gs=1.5,fs=.1,Ss=1,vs=.6,Is=.3;var Ei=class extends re{constructor(e){super();this._networkLimits={badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}};this._lastStatSentTimestamp=0;this._currentState="good";this._signaling=e,this._localNetworkStat={rtt:new Ii(On,On),loss:new Ii(Ln,Ln),bitrate:0},this._remoteNetworkStat={rtt:0,loss:0,bitrate:0},this._lastNetworkStat={rtt:0,loss:0,date:0}}_calcRttRating(e){let t=typeof e=="number"?e:e.getValue(),i=1;if(isNaN(t))return i;let a=Math.round((t-this._networkLimits.goodNet.rtt)/hs);for(let o=0;o<a;o++)i*=1-_s;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)/gs);for(let o=0;o<a;o++)i*=1-fs;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*Ss;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>=vs?"good":e>=Is?"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((m,I)=>Math.max(m,I.packetLoss||0),0),o={rtt:this._localNetworkStat.rtt.update(i),loss:this._localNetworkStat.loss.update(a)};if(t){let m=e.outbound.rtps.reduce((I,A)=>I+(A.bandwidth??0)*8,0);o.bitrate=m,this._localNetworkStat.bitrate=m}let s=Date.now(),l=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),p=Math.max(Math.round(l*10)/10,.1),u=this._getNetworkState(p);(t||u!==this._currentState||s-this._lastStatSentTimestamp>d.networkStatisticsInterval)&&(this._lastStatSentTimestamp=s,this._signaling.customData({sdk:Object.assign({type:"bad-net"},o)},null).catch(m=>{c.warn("Unable to send [bad-net]",m)})),this._currentState=u,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 Es=30*1e3,Ti=class n extends At{constructor(e,t,i,a,o){super(i,a);this._remoteSDP={};this._remoteCandidates={};this._lastRemoteSDP=null;this._animojiDataChannel=null;this._animojiReceiver=null;this._animojiSender=null;this._remoteAnimojiVersion=1;this._isOpen=!1;this._remotePeerId=null;this._statInterval=null;this._settingsInterval=null;this._failedOnCreate=null;this._remoteStream=null;this._iceRestartTimeout=null;this._reconnectionTimeout=null;this._reconnectionPrevented=!1;this._fingerprint=null;this._neverConnected=!0;this._prevConsumerSettings={};this._networkLimitsForVideo={bad:{loss:4,rtt:1e3},good:{loss:2,rtt:700}};this._videoMaxDimensionsForNet={worst:320,bad:640,good:1280};this._lastVideoMaxDimension=this._videoMaxDimensionsForNet.good;this._lastBadConnection=0;if(this._participantId=e,this._isMaster=t,this._serverSettings=o,this._perfStatReporter=new lt(this,i,!0),this._directStatReporter=new Ei(i),this.subscribe(this._signaling,Re.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)),this._pc=new RTCPeerConnection({iceServers:d.iceServers,iceTransportPolicy:d.forceRelayPolicy?"relay":"all"},{optional:[{googSuspendBelowMinBitrate:!1}]}),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={},d.vmoji&&this._createDataChannel(this._pc,rt.animoji,s=>{this._animojiDataChannel=s,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(s){R.log(E.ERROR,"addTrack-direct"),c.error("Unable to add media source tracks",s,{participantId:this._participantId}),this._failedOnCreate=s;return}this._createOffer(!1).catch(s=>{this._state==="IDLE"?this._failedOnCreate=s:this.close(s)})}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){c.warn("DirectTransport: Already opened",{participantId:this._participantId});return}if(this._failedOnCreate){this.close(this._failedOnCreate);return}if(c.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(E.ERROR,"addTrack-direct"),c.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){dr(e,this._serverSettings)||(this._serverSettings=e,this._applySettings())}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}setAnimojiTransport(e,t){if(d.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?(c.error("DirectTransport: Closed",e,{participantId:this._participantId}),this._setState("FAILED")):(c.debug("DirectTransport: Closed",{participantId:this._participantId}),this._setState("CLOSED")),this._triggerEvent("PEER_CONNECTION_CLOSED"))}_setState(e){this._state!==e&&(c.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent("STATE_CHANGED",e))}_onSignalingNotification(e){switch(e.notification){case N.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case N.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case N.CUSTOM_DATA:e.data.hasOwnProperty("sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,i=S.getPeerIdString(e.peerId);S.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){c.debug("Add remote ice candidate",{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(i){throw R.log(E.ERROR,"addIceCandidate-direct"),c.error("Unable to add remote ice candidate",i,{participantId:this._participantId,candidate:t}),i}}else c.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]){c.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),c.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(E.ERROR,"setRemoteDescription-direct"),c.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,d.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){c.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&&(c.debug("Local ice candidate",{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){c.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:d.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(c.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(c.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),R.log(E.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),S.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(R.log(E.ICE_CONNECTION_TYPE,e.local.type),c.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||(c.log("Waiting for reconnection...",{participantId:this._participantId}),this._reconnectionTimeout=window.setTimeout(()=>{this._reconnectionTimeout=null,this._neverConnected?this._requestTopologySwitch():this._startIceRestart()},d.transportConnectionWaitTime))}_requestTopologySwitch(){this._isMaster&&this._signaling.ready&&(c.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(E.ICE_RESTART),c.log("Ice restart",{participantId:this._participantId}),this._createOffer(!0).catch(this.close.bind(this))):c.debug("Waiting for ice restart...",{participantId:this._participantId}),this._iceRestartTimeout=window.setTimeout(()=>{this._iceRestartTimeout=null,c.error("Ice restart failed",{participantId:this._participantId}),R.log(E.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},d.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};c.debug("Create offer",{participantId:this._participantId,options:t});let i;try{i=await this._pc?.createOffer(t),c.debug("Created offer",{participantId:this._participantId,offer:i}),i=n._patchLocalDescription(i)}catch(a){throw c.error("Unable to create offer",a,{participantId:this._participantId}),R.log(E.ERROR,"createOffer-direct"),a}try{return c.debug("Set local description",{participantId:this._participantId,offer:i}),this._calcFingerprint(i.sdp),await this._pc?.setLocalDescription(i),i}catch(a){throw c.error("Unable to set local description",a,{participantId:this._participantId}),R.log(E.ERROR,"setLocalDescription-direct"),a}}async _createAnswer(){c.debug("Create answer",{participantId:this._participantId});let e;try{e=await this._pc?.createAnswer(),c.debug("Created answer",{participantId:this._participantId,answer:e}),e=n._patchLocalDescription(e)}catch(t){throw c.error("Unable to create answer",t,{participantId:this._participantId}),R.log(E.ERROR,"createAnswer-direct"),t}try{return c.debug("Set local description",{participantId:this._participantId,answer:e}),this._calcFingerprint(e.sdp),await this._pc?.setLocalDescription(e),e}catch(t){throw c.error("Unable to set local description",t,{participantId:this._participantId}),R.log(E.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!y.baseChromeVersion();return e.sdp=S.patchLocalSDP(e.sdp,d.preferH264&&y.canPreferH264(),y.isBrokenH264Decoder(),d.preferVP9,d.h264spsPpsIdrInKeyframe,t&&d.audioNack,d.p2pAudioRed),e}static _patchRemoteDescription(e){return e.sdp=S.patchRemoteSDP(e.sdp,!1,!1,!1,d.preferVP9,y.isBrokenVP9Encoder(),y.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=>{c.error("DirectTransport: Unable to replace track",i,{participantId:this._participantId}),R.log(E.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}ai(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,Ye.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,d.statisticsInterval)})};this._statInterval=window.setTimeout(e,d.statisticsInterval)}async _isSVCSupported(e,t){let i=this._mediaSource.getSendVideoTrack(),a=e.outbound.rtps.find(l=>l.kind==="video");if(!a?.mimeType||!a?.bandwidth||!i)return!1;let o=i.getSettings();if(!o.width||!o.height||!o.frameRate)return!1;let s={type:y.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:o.width,height:o.height,bitrate:a.bandwidth,framerate:o.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(s)).supported||!1}catch(l){return c.warn("Failed to get encodingInfo",s,l),!1}}async _checkPPTNetwork(e){if(!d.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,o=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,s=this._videoMaxDimensionsForNet.good,l="L1T1";if(a?(this._lastBadConnection=Date.now(),o?(s=this._videoMaxDimensionsForNet.bad,l="L1T2"):(s=this._videoMaxDimensionsForNet.worst,l="L1T3")):i&&(s=this._videoMaxDimensionsForNet.good,l="L1T1"),!(s<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Es)||this._lastVideoMaxDimension===s)return;let u=this._serverSettings.camera;if(!u||!await this._isSVCSupported(e,l))return;c.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:l,averageNetStat:t,nextVideoMaxDimension:s}),this._lastVideoMaxDimension=s;let I={...this._serverSettings,camera:{...u,scalabilityMode:l,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(I)}_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=S.sdpFingerprint(e);if(t===null){c.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=S.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,i){c.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{negotiated:!0,id:1});a.onopen=()=>{let o=a.readyState;o==="open"?(c.debug(`[${t}] data channel opened`),a.onerror=s=>{c.error(`[${t}] data channel error`,s)},i(a)):c.error(`[${t}] data channel open failed, state [${o}]`)}}};var Ts=16,mr=class n{constructor(r,e,t){c.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),o=e.getUint32(4),s=e.getUint32(8),l=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:a,ssrc:o,timestamp:s,duration:l,data:r.slice(Ts)}}_onDataChannelMessage(r){let e=n.parse(r),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){c.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}};import{decode as pt}from"messagepack";var hr=class{constructor(){this.streamDescriptionByCompactId=new Map;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=pt(i);return Object.entries(a).forEach(([A,w])=>{let j=ui(A);this.streamDescriptionByCompactId.set(w,j),this.compactIdByStreamDescription.set(A,w)}),null;case 2:case 4:let o=pt(i),s=[];for(let A of o){let w=this.getStreamDescription(A);w&&s.push(w.participantId)}return t===2?{type:"notification",notification:N.AUDIO_ACTIVITY,activeParticipants:s}:{type:"notification",notification:N.STALLED_ACTIVITY,stalledParticipants:s};case 3:let l=pt(i);return{type:"notification",notification:N.SPEAKER_CHANGED,speaker:this.getStreamDescription(l)?.participantId};case 5:let p=pt(i);return{type:"notification",notification:N.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:p[0],maxDimension:p[1]}};case 6:let u=pt(i),m={};for(let[A,w]of Object.entries(u)){let j=this.getStreamDescription(Number(A))?.participantId;j&&(m[j]=w/100)}return{type:"notification",notification:N.NETWORK_STATUS,statuses:m};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let w=pt(i).map(j=>{let[q,ie,fe,we,X,ye,Pe]=j;return{participantId:this.getStreamDescription(q)?.participantId,gain:ie,pause:fe,offset:we,mute:X,liveStatus:ye,startTimeMs:Pe}});return{type:"notification",notification:N.MOVIE_UPDATE_NOTIFICATION,data:w}}case 9:let I=pt(i);return{type:"notification",notification:N.VIDEO_SUSPEND_SUGGEST,bandwidth:I};default:return c.debug("unsupported message type: "+t),null}}_createParticipantSourcesUpdateNotification(r){let e=pt(r),t=[];for(let[i,a]of Object.entries(e)){let o=a[0],s=a[1],l=a[2],p=!!a[3],u=a[4]!==null?!!a[4]:void 0,m;if(o!==null){if(m=this.getStreamDescription(o),!m){c.error(`could not uncompress participant ID ${o}`);continue}}else m=null;if(l===null){c.error("unexpected null sequenceNumber",i,a);continue}let I=We.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,A=s?s>>>0:null;t.push({participantStreamDescription:m,streamId:I,rtpTimestamp:A,sequenceNumber:l,fastScreenShare:p,suspend:u})}return{type:"notification",notification:N.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var Rs=90,Cs=4294967295,Ri=class n extends At{constructor(e,t,i){super(e,t);this._producerNotification=null;this._producerCommand=null;this._producerScreen=null;this._consumerScreen=null;this._asr=null;this._animojiDataChannel=null;this._animojiReceiver=null;this._animojiSender=null;this._isOpen=!1;this._observer=!1;this._reconnectionPrevented=!1;this._statInterval=null;this._settingsInterval=null;this._statBytes={};this._ssrcMap={};this._ssrcMapUpdated=!1;this._producerOfferIsProcessing=!1;this._producerNextOffer=null;this._lastStat=null;this._prevConsumerSettings={};this._asrTrack=null;this._captureSender=null;this._captureReceiver=null;this._participantIdRegistry=null;this._disabledSenders=new Set;this._rtpReceiversByStreamId={};this._producerSessionId="";this._newAudioShareTrack=null;this._simulcastInfo=null;this.subscribe(this._signaling,Re.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applyConsumerSettings.bind(this)),this.subscribe(this._mediaSource,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._createPerfStatsReporter(),this._serverSettings=i,c.debug("ServerTransport: Created")}updateStatisticsInterval(){this._stopStatInterval();let e=this.getState();e!=="IDLE"&&e!=="CLOSED"&&e!=="FAILED"&&this._startStatInterval()}open(e=!1){if(this._isOpen){c.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?(c.error("ServerTransport: Closed",e),this._setState("FAILED")):(c.debug("ServerTransport: Closed"),this._setState("CLOSED")))}removeParticipant(e){this._captureReceiver?.close(e)}preventRestart(){this._reconnectionPrevented=!0}allowRestart(){this._reconnectionPrevented=!1}updateSettings(e){dr(e,this._serverSettings)||(this._serverSettings=e,this._applyConsumerSettings())}setAnimojiTransport(e,t){if(d.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(){d.simulcast&&y.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new lt(this,this._signaling)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),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){c.debug(`[${t}] data channel opening`);let a=e.createDataChannel(t,{ordered:!0});a.onopen=()=>{let o=a.readyState;o==="open"?(c.debug(`[${t}] data channel opened`),i(a)):c.error(`[${t}] data channel open failed, state [${o}]`)},a.onerror=o=>{let s=o.error;c.error(`[${t}] data channel error`,s?.errorDetail,s?.message)}}_openConnection(e=!1){c.debug("ServerTransport: Open single connection"),this._pc=new RTCPeerConnection({},{optional:[{googSuspendBelowMinBitrate:!1}]}),this._pc.ontrack=this._onAddTrack.bind(this,this._pc),this._pc.onconnectionstatechange=S.debounce(t=>{this._pc&&this._onConnectionStateChange(this._pc,t)},500),this._pc.onsignalingstatechange=n._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new hr,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),d.producerNotificationDataChannel&&this._createDataChannel(this._pc,rt.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),d.producerCommandDataChannel&&(this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,rt.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)})),d.producerScreenDataChannel&&this._createDataChannel(this._pc,rt.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),d.asrDataChannel&&this._createDataChannel(this._pc,rt.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new mr(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),d.vmoji&&this._createDataChannel(this._pc,rt.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(d.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._applyConsumerSettings()}catch(t){c.error("ServerTransport: Unable to add media source tracks",t),R.log(E.ERROR,"addTrack-single"),this.close(t);return}d.consumerScreenDataChannel&&this._createDataChannel(this._pc,rt.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval()}_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)|(?:${We.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||!d.consumerScreenDataChannel||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Et(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){!d.producerScreenDataChannel||!this._producerScreen||(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new vt(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&&!d.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")return;let a=!this._disabledSenders.has(i),o=e.maxDimension!==0;if(a&&!o){c.log("Disabling video upload"),this._disabledSenders.add(i),i.replaceTrack(y.getBlackMediaTrack()).catch(l=>{c.error("Could not disable video upload",l)});return}let s=this._mediaSource.getSendVideoTrack();if(!a&&o&&s){c.log("Enabling video upload"),this._disabledSenders.delete(i);let l=i.track;l.enabled=s.enabled,i.replaceTrack(s).then(()=>l.stop()).catch(p=>{c.error("Could not enable video upload",p)})}S.applyVideoTrackSettings(e,i,s??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}}_onScreenSharingStatus(e){e.track?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),Ye.reportUsage(t)}).catch(()=>{}),this._statInterval=window.setTimeout(e,d.statisticsInterval)};this._statInterval=window.setTimeout(e,d.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 ai(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(s=>s.type==="inbound-rtp"&&s.kind==="audio"&&this._ssrcMap[s.ssrc]==="mix");if(!t)return;let i=We.AUDIO_MIX,a=this._statBytes[i],o=!1;if(a){let s=t.bytesReceived-a.bytesReceived;s>=0&&s<=5&&(o=!0),a.stalled!==o&&this._triggerEvent("AUDIO_MIX_STALL",o)}this._statBytes[i]={bytesReceived:t.bytesReceived,stalled:o}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:lt.getEstimatedPerformanceIndex(),audioMix:!0,consumerUpdate:!0,producerNotificationDataChannelVersion:d.producerNotificationDataChannel?8:0,producerCommandDataChannelVersion:d.producerCommandDataChannel?3:0,consumerScreenDataChannelVersion:d.consumerScreenDataChannel?1:0,producerScreenDataChannelVersion:d.producerScreenDataChannel?1:0,asrDataChannelVersion:d.asrDataChannel?1:0,animojiDataChannelVersion:d.vmoji?d.vmojiOptions.protocolVersion:1,animojiBackendRender:!d.vmojiOptions.renderingOptions.useFullClientRendering,onDemandTracks:!0,unifiedPlan:!0,singleSession:!0,videoTracksCount:d.videoTracksCount,red:d.serverAudioRed,audioShare:d.audioShare,fastScreenShare:d.fastScreenShare,videoSuspend:d.videoSuspend,simulcast:d.simulcast&&y.isSimulcastSupportedByBrowser()};!d.videoTracksCount&&!this._observer&&c.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=d.simulcast&&y.isSimulcastSupportedByBrowser(),i=t;try{await this._pc.setRemoteDescription(e)}catch(s){throw c.error("[single] unable to set remote offer",s),R.log(E.ERROR,"setRemoteDescription-single"),s}let a=this._findFirstSimTransceiver();if(t)if(a){c.log(`_processOffer: caps.simulcast=${d.simulcast} mid=${a.mid} dir=${a.direction}`);let s=this._mediaSource.getStream(),l=await this._setupSimulcastTransceiver(s,a);c.log("_processOffer: simulcastInfo",l),l||(c.log(`_processOffer: simulcast transceiver not found in server offer mid=${a.mid}, disable simulcast`),i=!1)}else c.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),i=!1;let o;try{if(await this._handleTracks(),c.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");o=await this._pc.createAnswer()}catch(s){throw c.error("[single] unable to create answer",s),R.log(E.ERROR,"createAnswer-single"),s}try{if(!this._pc)throw new Error("Interrupt allocation");o.sdp=S.patchLocalSDP(o.sdp,!1,y.isBrokenH264Decoder(),!1,d.h264spsPpsIdrInKeyframe),c.debug("[single] set local answer",{answer:o}),await this._pc.setLocalDescription(o)}catch(s){throw c.error("[single] unable to set local answer",s),R.log(E.ERROR,"setLocalDescription-single"),s}if(i&&a){o.sdp=S.patchSimulcastAnswerSdp(o.sdp,a,at.WIDTH,at.HEIGHT);for(let s of this._pc.getTransceivers())s.mid===null&&s.stop()}try{c.debug("[single] transmit local answer",{answer:o}),this._updateSSRCMap(e),await this._signaling.acceptProducer(o,Object.keys(this._ssrcMap)),c.debug("[single] remote offer has been processed")}catch(s){c.warn("[single] unable to send local answer",s),R.log(E.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 c.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(a.encodings)}`),null;let o=ii(at.WIDTH,at.HEIGHT,this._serverSettings.camera?.bitrates?.generic),s=0,l=1;for(let u of a.encodings)u.scalabilityMode=ti,u.active=!0,s>=o.streams.length?u.maxBitrate=0:u.maxBitrate=o.streams[s].bitrate,u.scaleResolutionDownBy=l,l=l*2,s++;await t.sender.setParameters(a);let p=i.getSettings();return c.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,c.debug("[single] wait until other remote offer is processed");return}this._producerOfferIsProcessing=!0;let t={type:"offer",sdp:S.patchRemoteSDP(e,y.isOldDataChannelDescription(),!1,!1,!1,y.isBrokenVP9Encoder(),y.isBrokenVP9Decoder())};if(c.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){c.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 _handleTracks(){if(!this._newAudioShareTrack||this._observer)return;let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s"));if(!e||!e.sender){c.warn("Cannot find audioshare transceiver");return}e.sender.track!==null&&c.warn("Unexpected track assigned to audioshare");try{e.direction="sendonly",await e.sender.replaceTrack(this._newAudioShareTrack),this._newAudioShareTrack=null}catch(t){c.error("ServerTransport: Unable to replace track",t),R.log(E.ERROR,"replaceTrack-single")}}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case N.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case N.REALLOC_CON:this._reconnect();break;case N.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case N.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case N.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case N.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(),d.breakVideoPayloadTypes&&(c.log("test mode enabled, video switched off"),this._signaling.requestTestMode("breakVideoPayloadTypes",null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description)}_onAddTrack(e,t){c.debug("[single] remote track (added)",{track:t.track});let i=t.streams[0];i?(i.onremovetrack||(i.onremovetrack=o=>{this._triggerEvent("REMOTE_TRACK_REMOVED",i.id,i,o.track)}),i.getTracks().find(o=>o.id===t.track.id)||i.addTrack(t.track),this._rtpReceiversByStreamId[i.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",i.id,i,t.track)):c.error("[single] unable to get media stream from track event")}static _onSignalingStateChange(e,t){c.debug("[single] signaling state changed",{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(c.debug("[single] connection state changed",{state:e.connectionState},t),R.log(E.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(R.logCustom(E.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"),S.getPeerConnectionHostInfo(e).then(a=>{a?.local&&(R.log(E.ICE_CONNECTION_TYPE,a.local.type),c.debug("Selected ICE candidates",a))}),R.logCustom(E.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){d.consumerScreenDataChannel&&t&&(e=t);let i=(a,o)=>{a.replaceTrack(o).catch(s=>{c.error("ServerTransport: Unable to replace track",s),R.log(E.ERROR,"replaceTrack-single")})};if(c.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),d.simulcast&&y.isSimulcastSupportedByBrowser()&&e.kind==="video"){let o=this._pc?.getTransceivers().find(s=>s.direction==="sendonly"&&s.sender?.track?.kind==="video")?.sender;o?.track?(i(o,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):c.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let a=this._pc?.getSenders().find(o=>o.track&&o.track.kind===e.kind&&!this._disabledSenders.has(o)&&o.track.contentHint===e.contentHint);a?.track?i(a,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return R.log(E.PAT_WAITING_TIME_ERROR,"noConnection"),c.error("Cannot get stream waiting time, peer connection is not initialized"),0;if(!RTCRtpReceiver.prototype.getSynchronizationSources)return R.log(E.PAT_WAITING_TIME_ERROR,"oldBrowser"),c.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let i=this._rtpReceiversByStreamId[e];if(!i)return R.log(E.PAT_WAITING_TIME_ERROR,"noReceiver"),c.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let a=i.getSynchronizationSources();if(!a||!a.length)return c.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let s=a[0].rtpTimestamp;if(!Number.isInteger(s))return R.log(E.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),c.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${s}`),0;let l=t-s&Cs,p=Math.ceil(l/Rs);return Math.min(100,Math.max(0,p))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!d.simulcast||!y.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let o=this._mediaSource.getStream();if(!o)return;let s=o.getVideoTracks()[0],l=s.getSettings().width,p=s.getSettings().height,u=ii(l,p,this._serverSettings.camera?.bitrates?.generic),m=t||!ba(this._simulcastInfo,u);if(!u.streams.length||!m)return;let I=a.sender.getParameters();if(I.encodings||(I.encodings=[{}]),!(I.encodings.length<=1)){if(c.log(`_changeSimulcastInfo: ${l}x${p} command: ${JSON.stringify(u)} `),e){let A=0;for(let w of I.encodings)w.scaleResolutionDownBy=wi(w.rid),w.scalabilityMode=ti,A>=u.streams.length?(w.maxBitrate=0,w.active=!1):(w.active=!0,w.maxBitrate=u.streams[A].bitrate),A++;await a.sender.setParameters?.(I).catch(w=>{c.error("Failed to set sender parameters",I,w)}),c.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(I.encodings)} `)}if(this._simulcastInfo=u,u.streams){let A={mediaSource:1,simulcastInfo:u};await this._signaling.changeSimulcast(A)}}}};var Qe=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(Qe||{}),_r=class extends re{constructor(e,t,i,a){super();this._allocated=[];this._opened=[];this._directTransport=null;this._serverTransport=null;this._dtListeners=[];this._stListeners=[];this._states={};this._localState="IDLE";this._animojiReceiver=null;this._animojiSender=null;this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,Re.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){c.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(c.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){c.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){c.log("Trying open participant",{participantIds:e});let o=a;for(let s of e){if(this._opened.indexOf(s)!==-1){c.warn(`The participant [${s}] has already had opened transport`);continue}if(this._allocated.indexOf(s)===-1){c.warn(`The participant [${s}] has no allocated transport`);continue}this._opened.push(s),o=!0}o&&(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())),c.debug("The transport has been opened",e))}close(e){let t=this._allocated.indexOf(e),i=this._opened.indexOf(e);t<0&&c.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(),d.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){d.vmoji&&t.isMe&&d.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===N.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(c.log(`Topology changed ${this._topology} -> ${e.topology}`),R.log(E.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||[],o=t.length&&i.length?S.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){c.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&c.warn("Topology changed to DIRECT, but the allocated participants count more then one");let s=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let l=o===s;this._directTransport=this._createDirectTransport(s,l)}this._opened.indexOf(s)>=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&&c.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 Ri(this._signaling,this._mediaSource,this._serverSettings);return this._stListeners.length>0&&c.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){d.noiseSuppression!==e&&(d.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(!d.vmoji)return;this._animojiReceiver=new d.vmoji.AnimojiReceiver((t,i)=>this._onAnimojiStream(t,i),t=>this._onAnimojiStream(t,null),t=>{this._triggerEvent("ANIMOJI_ERROR",t)},d.vmojiOptions.renderingOptions);let e=this._mediaSource.getStream();this._animojiSender=new d.vmoji.AnimojiSender(e,this._signaling.getPeerId(),d.vmojiOptions.protocolVersion,{requested:this._mediaSource.isAnimojiRequested,useAI:d.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(E.PAT_WAITING_TIME_ERROR,"wrongTopology"),c.error(`Cannot get stream waiting time, incorrect topology: ${this._topology}`),0):this._serverTransport?this._serverTransport.getStreamWaitingTimeMs(e,t):(R.log(E.PAT_WAITING_TIME_ERROR,"noTransport"),c.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var gr=class extends re{constructor(e){super();this._detector=null;this._interval=null;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 Mt(e,i),!this._interval)){let a=()=>{this._collectVolumes(),this._interval=window.setTimeout(a,d.voiceParams.interval)};this._interval=window.setTimeout(a,d.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===We.AUDIO_MIX){if(this._activeParticipants)for(let a of this._activeParticipants)e[a]=i}else e[t]=i;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null)}};var fr=class extends re{constructor(e,t,i){super();this._speakerId=null;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 o=e[a].smoothed;o>t&&o>d.voiceParams.threshold&&(t=o,i=a)}),i&&i!==this._speakerId){let a=this._speakerId&&e.hasOwnProperty(this._speakerId)?e[this._speakerId].smoothed:0;t>a*d.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 Ci=class extends re{constructor(e,t,i){super();this._volumes={};this._participants={};this._connectionTimeout=0;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),d.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),d.specListenerParams.volumeTimeout))),t==="FAILED"&&this._connectionTimeout&&(c.warn("Transport failed, send callSpecError"),R.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`))}_onVolumesDetected(e){Object.keys(e).forEach(t=>{this._volumes[t]=Math.max(e[t].real,this._volumes[t]||0)})}_onConnectionTimeout(){let e=i=>i!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(c.warn("There is not connected transport, send callSpecError"),R.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_CONNECTION_TIMEOUT`)),this._connectionTimeout=0}_onVolumeTimeout(){let e=[];Object.keys(this._volumes).forEach(t=>{if(this._volumes[t]>0)return;let i="UNKNOWN",a=this._participants[t];a&&a.platform&&(i=a.platform),e.indexOf(i)<0&&(e.push(i),R.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&c.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var Sr=class n{static correctHangupReason(r){switch(r){case D.HUNGUP:return"hangup";case D.CANCELED:return"canceled";case D.REJECTED:return"rejected";case D.BUSY:return"busy";case D.FAILED:return"failed";case D.MISSED:return"missed";case D.ANOTHER_DEVICE:return"another_device";case D.REMOVED:return"removed";case D.BANNED:return"banned";case D.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![D.HUNGUP,D.CANCELED,D.REJECTED,D.FAILED,D.BUSY,D.MISSED,D.ANOTHER_DEVICE,D.REMOVED,D.BANNED,D.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error.code;R.logClientStats({name:E.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var vr=class{constructor(){this._isCallMarked=!1;this._isFinished=!1;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,Ve(E.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Ee.logEventualStat({name:E.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var ys=1e3,Ps=1e4;var bs=15,z=class z extends re{constructor(e,t){super();this._mediaSource=null;this._conversation=null;this._myLastRequestedLayouts={};this._state="IDLE";this._participantState=J.CALLED;this._participants={};this._transport=null;this._debugInfo=null;this._volumesDetector=null;this._speakerDetector=null;this._localVolumeDetector=null;this._specListener=null;this._activeSpeakerId=null;this._lastSignalledActiveSpeakerId=null;this._isRealTimeAsrRequested=!1;this._serverSettings={camera:null,screenSharing:null};this._lastStalled={};this._audioMixStalled=!1;this._audioFix=null;this._streamByStreamId=new Map;this._streamIdByStreamDescription=new Map;this._streamWaitTimerByStreamDescription=new Map;this._sequenceNumberByStreamDescription=new Map;this._cooldownTimestampByStreamDescription=new Map;this._cooldownQueueCleanupTimer=null;this._changeMediaSettings=S.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(t){if(c.warn("changeMediaSettings failed with error",t),t.message==="chatRoom.maxShareCountExceeded")return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100);R.create(e,t),Ee.create(),Ye.create(()=>this._transport?.getTopology()),this._api=e,this._signaling=new Kt,this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id),d.clientEventsLoggingEnabled&&R.logClientEvent({event_type:E.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),R.destroy(),Ee.destroy(),Ye.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new vr,this._audioOutput=new gi(this._statFirstMediaReceived),d.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),ys))}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:o=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:l,externalIds:p,onFastStart:u}){if(z._activationMutex)throw R.log(E.ERROR,"startCall"),c.warn("Conversation: there is already running activation"),new H(D.FAILED);let m=Date.now();z._activationMutex=!0,Ae.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let I=this._mediaSource.getMediaSettings();t===it.CHAT||e&&e.length>1?this._logWithMediaSettings(E.OUTGOING_MULTIPARTY_CALL,I):this._logWithMediaSettings(E.OUTGOING_CALL,I);let A=await this._startConversation({opponentIds:e,opponentType:t,direction:De.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:o,requireAuthToJoin:s,onlyAdminCanShareMovie:l,externalIds:p,startedTime:m,onFastStart:u});if(!this._conversation)throw new H(D.UNKNOWN_ERROR);if(this._participantState=J.ACCEPTED,this._changeMediaSettings(I),await this._processConnection(A),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._signaling.readyToSend(),z._delayedHangup)throw new H(D.CANCELED);return c.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:i}),await this._processConnectionSharedMovieInfo(A),await this._processConversationUrlSharingInfo(A),v.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants()),this._onConversationParticipantListChunk(A),this._processPinnedParticipants(A),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),z._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(I){throw this._close(I,"Unable to start conversation"),I}finally{z._activationMutex=!1}}async onJoin(e){if(z._activationMutex)throw R.log(E.ERROR,"joinCall"),c.warn("Conversation: there is already running activation"),new H(D.FAILED);let t=Date.now();z._activationMutex=!0,this._state="PROCESSING",Ae.startSession();try{let i=!!e.observedIds?.length;if(i&&d.videoTracksCount>0)throw c.error("Observer mode: please set videoTracksCount=0"),new H(D.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.JOIN_CONVERSATION,a);let o=await this._joinConversation(e,t);if(!this._conversation)throw new H(D.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a),this._conversation.waitingHall?(c.log("In waiting hall"),z._current=this,z._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus("WAITING_HALL"),this._conversation):this._onJoinPart2(o)}catch(i){throw z._activationMutex=!1,this._close(i,"Unable to join conversation"),i}}async _onJoinPart2(e){c.debug("Join conversation part 2"),z._activationMutex=!0;try{if(this._participantState=J.ACCEPTED,!this._conversation||!this._mediaSource)throw new H(D.UNKNOWN_ERROR);if(this._statFirstMediaReceived.markOnJoin(this._conversation.topology),!this._conversation.observer&&!this._isAudienceModeListener()&&this._changeMediaSettings(this._mediaSource.getMediaSettings()),await this._processConnection(e),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._signaling.readyToSend(),this._state==="CLOSE")return this._conversation;if(z._delayedHangup)throw new H(D.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);return v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),t),this._onConversationParticipantListChunk(e),this._processPinnedParticipants(e),v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),z._current=this,this._openTransport(Object.values(this._participants),!1),this._conversation.audienceMode&&!this._conversation.restricted&&this._forceOpenTransportForAloneInCall(),this._conversation.recordsInfoByRoom.get(e?.rooms?.roomId??null)&&this._forceOpenTransportForAloneInCall(),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=te.USER,i,a){if(z._activationMutex)throw c.warn("Conversation: there is already running activation"),new H(D.REJECTED);z._activationMutex=!0;try{let o=Date.now(),s=await this._prepareConversation(e,t,i,a);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new H(D.UNKNOWN_ERROR);if(!s.conversation.participants.find(p=>p.state===J.CALLED&&p.id===this._conversation?.userId))throw c.log("Push rejected (there is an active call)"),R.log(E.PUSH,"rejected"),new H(D.REJECTED);if(Ae.startSession(),await this._processConnection(s),this._extractConnectionUrlSharingInfo(s),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._processPinnedParticipants(s),this._signaling.readyToSend(),this._logCallStartEvent(o,De.INCOMING),R.log(E.PUSH,"accepted"),z._current=this,z._delayedHangup)throw new H(D.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||[]).indexOf(qt.WAITING_HALL)<0?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(i=>S.comparePeerId(i.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(qt.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new H(D.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.ACCEPT_CONCURRENT,e),c.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=J.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}_getMainRoomParticipants(){return S.mapSharedParticipants(Object.values(this._participants).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,i]=e.split(":"),a=parseInt(t,10);if(isNaN(a))throw new Error("Invalid original length in prefix");let o=atob(i),s=new Uint8Array(o.length);for(let l=0;l<o.length;l++)s[l]=o.charCodeAt(l);try{let p=yn(s,a).reduce((ie,fe)=>(ie+=String.fromCharCode(fe),ie),""),{srcp:u,stne:m,tkn:I,trne:A,trnp:w,trnu:j,wse:q}=JSON.parse(p);return{token:I,endpoint:q,turn_server:{urls:A.split(","),username:j,credential:w},stun_server:{urls:m.split(",")},client_type:u}}catch(l){throw this._close(l,"Can't decompress conversation params"),l}}_logCallStartEvent(e,t){let i={[De.OUTGOING]:"outgoing",[De.INCOMING]:"incoming",[De.JOINING]:"join"};Ee.logEventualStat({name:E.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(E.ERROR,"acceptIncoming"),c.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 H(D.UNKNOWN_ERROR);this._state="PROCESSING",c.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.ACCEPT_INCOMING,t),this._changeMediaSettings(t),this._statFirstMediaReceived.markAcceptCall(this._transport.getTopology()),await this._signaling.acceptCall(t),this._participantState=J.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 o=await this._signaling.getRooms(this._isCallAdmin());o.rooms?.rooms&&o.rooms.rooms.forEach(l=>{l.participantIds?.forEach(p=>{this._participants[p]&&(this._participants[p].isInRoom=!0)})}),this._conversation.roomId=o.rooms?.roomId||null;let s=await this._extractExternalRoomsData(o.rooms?.rooms,o.rooms?.roomId);if(v.onCallAccepted(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),s),d.useParticipantListChunk){let l=await this._getInitialParticiapntListChunk();l?.participants?.forEach(p=>{let u=S.composeId(p),m=this._participants[u];m&&(m.movieShareInfos=p.movieShareInfos)}),this._onConversationParticipantListChunk({participants:l})}return v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!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(E.ERROR,"declineIncoming"),c.error("Unable to decline a call - invalid state"),new Error("Unable to decline a call - invalid state");this._state="PROCESSING",c.debug("Decline incoming call"),this._logWithMediaSettings(E.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=J.HUNGUP,this._signaling.ready&&await this._signaling.hangup(D.REJECTED),this._close(new H(D.REJECTED))}async hangup(){c.debug("Hangup");let e=this._state==="ACTIVE"?D.HUNGUP:D.CANCELED;R.log(E.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new H(e))):v.onHangup(new H(D.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new H(D.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map(K.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=D.UNKNOWN_ERROR);let o=i.participants;for(let s of o)await this._onAddParticipant(S.composeId(s),s,a)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new H(D.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=D.UNKNOWN_ERROR);let o=i.participants;for(let s of o)await this._onAddParticipant(S.composeId(s),s,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===J.CALLED||a.state===J.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===J.ACCEPTED&&i.push(a.id);i.length&&this._transport.open(i,null,!!this._conversation?.observer)}_close(e,t){t&&c.error(t,e),c.debug("Close conversation",e),Sr.sendHangupEvent(e,this._transport?.getTopology()),Ye.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(D.FAILED):R.log(E.ERROR,e.hangup),z._activationMutex=!1;let i=this._conversation&&this._conversation.id;if([D.CANCELED,D.NOT_FRIENDS,D.CALLEE_IS_OFFLINE,D.CALLER_IS_BLOCKED,D.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===D.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===D.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===D.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===D.SOCKET_CLOSED||e.hangup===D.NOT_FOUND)&&z._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===D.BUSY&&!e.remote){this._cleanupSignaling(),this._cleanupMediaSource();return}this._state="CLOSE",this._participantState=J.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),R.destroy(),Ee.destroy(),this._conversation=null,this._myLastRequestedLayouts={},z._current=null,z._delayedHangup=!1,v.onHangup(e||new H(D.UNKNOWN_ERROR),i)}destroy(){let e=this._conversation&&this._conversation.id;c.debug("Destroy conversation",{conversationId:e}),this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),this._state="CLOSE",this._participantState=J.HUNGUP,this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._cleanupListeners(),R.destroy(),Ee.destroy(),this._conversation=null,this._myLastRequestedLayouts={},z._current=null,z._delayedHangup=!1}async _getConversationParams(e){let t=await this._api.getConversationParams(e);c.debug("Api.getConversationParams",t);let i=[],{turn_server:a,stun_server:o}=t;if(o&&i.push(o),a&&a.urls){let s=a.urls.filter((l,p,u)=>u.indexOf(l)===p);s.push(`${s[s.length-1]}?transport=tcp`),i.push({urls:s,username:a.username,credential:a.credential})}return d.iceServers=i,d.wssBase=t.endpoint,t.wt_endpoint&&(d.wtsBase=t.wt_endpoint),d.wssToken=t.token,t.client_type&&(d.clientType=t.client_type),t.external_user_type&&(d.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:i,token:a,client_type:o}){let s=[];if(t&&s.push(t),e&&e.urls){let l=e.urls.filter((p,u,m)=>m.indexOf(p)===u);l.push(`${l[l.length-1]}?transport=tcp`),s.push({urls:l,username:e.username,credential:e.credential})}d.iceServers=s,d.wssBase=i,d.wssToken=a,o&&(d.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:o="",joiningAllowed:s=!1,requireAuthToJoin:l=!1,onlyAdminCanShareMovie:p,externalIds:u,startedTime:m,onFastStart:I}){Ve(E.SIGNALING_CONNECTED);let A=S.uuid();c.debug("Conversation: start",{conversationId:A,opponentIds:e,opponentType:t,direction:i});let w=a.includes(oe.VIDEO),j;if(I)try{let ie={deviceId:this._api.deviceId(),sdkVersion:d.sdkVersion,clientAppKey:d.apiKey,platform:d.platform,protocolVersion:d.protocolVersion,domainId:d.domain},fe=JSON.stringify(ie),we=await I({internalParams:fe,conversationId:A,externalIds:u,opponentType:t,mediaOptions:a,isVideo:w,joiningAllowed:s,requireAuthToJoin:l}),X=JSON.parse(we.internalCallerParams);j={endpoint:X.endpoint,wt_endpoint:X.wtEndpoint,id:A,is_concurrent:X.isConcurrent,client_type:X.clientType,rejected_participants:we.rejectedParticipants,stun_server:X.stun,turn_server:X.turn,token:new URL(X.endpoint).searchParams.get("token")??""},c.debug("FastStart",j)}catch{throw new H(D.UNKNOWN_ERROR,{message:"Cannot parse internal params"})}else j=await this._api.startConversation(A,e,t,w,o,s,l,{onlyAdminCanShareMovie:p},u),c.debug("Api.startConversation",j);this._setConversationParams(j);let q=await this._connectSignaling(tt.START,j);return await this._setConversation(j,q,i),this._logCallStartEvent(m,De.OUTGOING),q}async _joinConversation(e,t){Ve(E.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:o,joinLink:s,observedIds:l,payload:p}=e;c.debug("Conversation: join",{conversationId:i,joinLink:s,observedIds:l});let u=a.includes(oe.VIDEO),m;if(i)m=await this._api.joinConversation(i,u,o);else if(s)m=await this._api.joinConversationByLink(s,u,l,p);else throw new H(D.UNKNOWN_ERROR);c.debug("Api.joinConversation",m),this._setConversationParams(m);let I=await this._connectSignaling(tt.JOIN,m);return await this._setConversation(m,I,De.JOINING),this._logCallStartEvent(t,De.JOINING),I}async _prepareConversation(e,t=te.USER,i,a){Ve(E.SIGNALING_CONNECTED),c.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let o=this._api.getUserId();if(!o)throw new H(D.UNKNOWN_ERROR);let s=0,l="",p="",u={id:e,peerId:i,endpoint:l,wt_endpoint:p,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let I=this._decodeExternalConversationParams(a);this._setConversationParams(I),l=`${d.wssBase}?userId=${o}&entityType=${t}&deviceIdx=${s}&conversationId=${e}&token=${d.wssToken}`,d.wtsBase&&(p=`${d.wtsBase}?userId=${o}&entityType=${t}&deviceIdx=${s}&conversationId=${e}&token=${d.wssToken}`),u.token=I.token,u.endpoint=l,u.wt_endpoint=p}else{let I=await this._getConversationParams(e);s=I.device_idx||0,l=`${d.wssBase}?userId=${o}&entityType=${t}&deviceIdx=${s}&conversationId=${e}&token=${d.wssToken}`,l=this._addGeoParamsToEndpoint(l,I),d.wtsBase&&(p=`${d.wtsBase}?userId=${o}&entityType=${t}&deviceIdx=${s}&conversationId=${e}&token=${d.wssToken}`,p=this._addGeoParamsToEndpoint(p,I)),u.token=I.token,u.endpoint=l,u.wt_endpoint=p,u.device_idx=s}let m=await this._connectSignaling(tt.ACCEPT,u);return z._current&&(z._current._participantState===J.ACCEPTED||z._current._participantState===J.CALLED)?(c.log("Push rejected (busy)"),R.log(E.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(D.BUSY),Promise.reject(new H(D.BUSY))):(z._current&&(z._current.destroy(),z._current=null),await this._setConversation(u,m,De.INCOMING,t),m)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:Se(),participantState:{},state:J.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 H(D.NETWORK_ERROR),t),t}}async _setConversation(e,t,i,a=te.USER){let{participants:o}=t.conversation;o.forEach(u=>{let m=S.composeId(u),I=K.fromSignalingParticipant(u,!1);if(I){this._api.cacheExternalId(m,I);let A=S.composeDecorativeId(u),w=K.fromSignalingParticipant(u);A&&w&&(this._api.cacheExternalId(A,w),this._api.mapDecorativeId(u.decorativeUserId,u.id))}});let s=this._api.getUserId(),l=e.device_idx||0;if(!s){let u=(t.conversation.participants||[]).find(m=>S.comparePeerId(m.peerId,t.peerId));if(!u)throw new H(D.UNKNOWN_ERROR);s=Number(u.id),u.idType&&(a=u.idType),u.deviceIdx&&(l=u.deviceIdx),this._api.setUserId(s)}let p=S.composeParticipantId(s,a,l);this._conversation={userId:s,compositeUserId:p,externalId:await this._getExternalIdByParticipantId(p),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:[],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),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},Ae.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(d.forceRelayPolicy=e.p2p_forbidden),R.log(E.RELAY_POLICY,d.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new H(D.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}_createMediaSource(){let e=new Fi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new zt(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint??null),this.subscribe(this._signaling,Re.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._signaling,Re.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Re.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return Ee.logEventualStat({name:E.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(Qr.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}_onConversationParticipantListChunk(e){let t=e.participants;t&&v.onConversationParticipantListChunk(this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{...{participants:[],countBefore:0,countAfter:0,markerFound:!1},...e}}_participantListChunkToExternalChunk(e){let t=S.mapSharedParticipants(e.participants.reduce((i,a)=>{let o=S.composeId(a);return this._participants[o]&&i.push(this._participants[o]),i},[]));return{...e,participants:t}}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&&(d.externalUserType=i);for(let a of e){let o=S.composeId(a);if(c.test("Conversation:RegisterParticipant",o),this._isMe(o)){this._conversation.roles=a.roles||[],this._conversation.roles.length&&(c.debug(`Local roles changed: ${a.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(a);continue}if(a.state===J.HUNGUP||a.state===J.REJECTED){this._participants[a.id]&&this._removeParticipant(this._participants[a.id],D.HUNGUP);continue}let s=S.composeDecorativeId(a),l=await this._createParticipant({id:o,externalId:K.fromSignalingParticipant(a),mediaSettings:Se(a.mediaSettings),participantState:S.mapParticipantState(a),state:a.state,roles:a.roles||[],status:"WAITING",muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[],markers:this._denormalizeMarkers(o,a.markers),movieShareInfos:a.movieShareInfos,isInRoom:t},s);this._registerParticipantInCache(l),a.roles&&a.roles.length&&(c.debug(`Roles for participant [${o}] changed: ${a.roles}`),v.onRolesChanged(this._participants[o].externalId,a.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=lr(e,Ne.MUTE),o=lr(e,Ne.MUTE_PERMANENT);for(let s of[a,o])s.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:s,stateUpdated:!0})};S.setImmediate(()=>i().catch(a=>c.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 t=this._participants[e];if(t)return t;let i=this._api.getDecorativeIdByInitialId(S.decomposeId(e).id),a=i?S.composeUserId(i):void 0;return this._createParticipant({id:e},a)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(d.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;if(this._participants[e]?.externalId)return this._participants[e].externalId;{let t=await this._getParticipantId(e);return this._api.cacheExternalId(e,t),t}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(d.useParticipantListChunk){let i=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return i.markers=this._denormalizeMarkers(i.id,t),i}return this._participants[e]}_warnParticipantNotInConversation(e){c.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,[o,s])=>(a[o]={...i,...s,id:e},a),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let i=Pn(e);this._setMuteStatesForRoomId(i,null);for(let l of e.rooms?.rooms??[])this._setMuteStatesForRoomId(l.muteStates,l.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=An(e,a));let o=Object.keys(a),s=this._conversation?.roomId;o.length&&this._onMuteParticipant({muteStates:a,mediaOptions:o,muteAll:!0,stateUpdated:!0,roomId:s},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}_processPinnedParticipants(e){e.conversation.pinnedParticipantId?this._onPinParticipant(e.conversation.pinnedParticipantId):this._conversation?.pinnedParticipantIdByRoom.delete(null);for(let t of e.rooms?.rooms??[])t.pinnedParticipantId?this._onPinParticipant(t.pinnedParticipantId,!1,void 0,t.id):this._conversation?.pinnedParticipantIdByRoom.delete(t.id)}_allocateTransport(){if(!this._conversation||!this._mediaSource)return;this._transport=new _r(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new fi,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===De.OUTGOING&&!this._conversation.concurrent;for(let t of Object.values(this._participants))(t.state===J.ACCEPTED||t.state===J.CALLED)&&this._transport.allocate(t.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new gr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new fr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Si(this._mediaSource))}_createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new Ci(this._transport,this._volumesDetector,this._participants))}_logDevices(){let e=y.getCameras().length,t=y.getMicrophones().length;c.debug("Cameras: "+e+(y.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(y.hasMicrophonePermission()?"✔":"✖")),R.log(E.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){R.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}_removeParticipant(e,t){if(!(e.state===J.CALLED||e.state===J.ACCEPTED||this._state==="CLOSE")&&(e.id===this._lastSignalledActiveSpeakerId&&(this._lastSignalledActiveSpeakerId=null),!!this._participants[e.id])){t===D.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[i,a]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(i),this._sequenceNumberByStreamDescription.delete(i),this._cooldownTimestampByStreamDescription.delete(i),this._streamWaitTimerByStreamDescription.has(i)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(i)),this._streamWaitTimerByStreamDescription.delete(i)),this._sendUpdateDisplayLayout({[i]:{stopStream:!0}});this._api.unmapDecorativeId(e.id),delete this._participants[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)}_cleanupParticipants(){Object.values(this._participants).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(){c.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){c.debug(`Add new participant [${e}]`);let a=this._participants[e];if(a&&(a.state===J.ACCEPTED||a.state===J.CALLED)){c.warn(`Participant [${a.id}:${a.state}] is already in conversation`);return}if(!a){let o=S.composeDecorativeId(t);a=this._registerParticipantInCache(await this._createParticipant({id:e,externalId:K.fromSignalingParticipant(t,!!t.decorativeExternalUserId),mediaSettings:Se(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},o))}this._setParticipantsStatus([a],"WAITING"),i?(a.state=J.HUNGUP,this._removeParticipant(a,i)):this._transport&&(a.state=J.CALLED,this._transport.allocate(a.id,!0),R.log(E.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}_onRemoveParticipant(e){c.debug(`Remove participant [${e}]`);let t=[];for(let i=0;i<=bs;i++){let a=S.compose(e,i),o=this._participants[a];o&&t.push(o)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let i of t)this._transport.close(i.id);R.log(E.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(ae.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(ae.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(ae.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,i=null){if(!this._transport||!this._conversation)return;let a=!t,o=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let s=i??this._conversation.externalId.id;this._transport.setAnimojiSvg(o,{svg:e,userId:s,isMe:a});return}this._transport.setAnimojiSvg(o,{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(E.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return R.log(E.MEDIA_STATUS,e?"audio_1":"audio_0"),this._mediaSource.toggleAudio(e)}async changePriorities(e){if(e.length<2||!this._signaling.ready)return;let t={},i={};for(let a of e){let o=typeof a.uid=="object"?a.uid:K.fromId(a.uid),s=K.toString(o);i[s]=a.priority}for(let a of Object.values(this._participants)){let o=K.toString(a.externalId);i.hasOwnProperty(o)&&(t[a.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[ze(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||this._transport?.getTopology()!=="SERVER")return;c.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={};for(let a of e){let o=typeof a.uid=="object"?a.uid:K.fromId(a.uid),s=this._api.getCachedOkIdByExternalId(o);if(!s){let u=K.toString(o);c.log(`Unknown participant external ID ${u}`);continue}let l=ze({participantId:s,mediaType:a.mediaType,streamName:a.streamName}),p=this._participants[s];p?p.lastRequestedLayouts[l]=a:this._isMe(s)&&(this._myLastRequestedLayouts[l]=a),$t(a)?(this._isMe(s)&&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)&&d.videoTracksCount>0&&this._streamIdByStreamDescription.set(l,null),t[l]=a),a.mediaType==="SCREEN"&&!$t(a)&&Ve(Ut(s))}let i=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>d.videoTracksCount;){let a=i.next();if(a.done){c.error("Cannot accommodate all streaming requests: tracks available "+d.videoTracksCount+"; requested streams: "+Array.from(this._streamIdByStreamDescription.keys()));break}this._stopStreaming(a.value),t[a.value]={stopStream:!0}}await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,i){if(this._conversation)if(!d.clientEventsLoggingEnabled)this._api.sendUserFeedbackStats(this._conversation.id,e,t,i);else{let a={event_type:E.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)}_stopStreaming(e){if(this._cooldownTimestampByStreamDescription.delete(e),this._sequenceNumberByStreamDescription.set(e,this._signaling.getNextCommandSequenceNumber()),this._streamWaitTimerByStreamDescription.has(e)&&(c.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=ui(e),a=this._participants[i.participantId],o=this._conversation?.externalId,s=this._isMe(i.participantId);if(a||s){switch(i.mediaType){case"STREAM":case"MOVIE":{if(i.streamName){let l={stream:null,streamName:i.streamName,mediaType:i.mediaType};s?v.onLocalLive(o,l):v.onRemoteLive(a.externalId,l)}break}case"CAMERA":{v.onRemoteStream(a.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(a.externalId,null);break}}R.log(E.PAT_DEALLOCATED)}else c.log(`Cannot find participant to stop streaming: ${i.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e){if(Object.keys(e).length===0)return;c.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t=await this._signaling.updateDisplayLayout(e);if(!t)return;let i=[];for(let[a,o]of Object.entries(t.errorCodeByParticipantId||{})){let s=ui(a),l=this._participants[s.participantId];if(l){let p;typeof o!="number"?(c.warn(`Unexpected error code ${o} received for participant ${s.participantId}`),p=vn.UNKNOWN_ERROR):p=In(o),i.push({externalId:l.externalId,errorReason:p})}}if(i&&i.length)throw new ia("Could not allocate one or more participants",i)}_cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let i=t.next();if(i.done)break;let a=i.value;if(a[1]+Ps>Date.now())break;let s=a[0];this._stopStreaming(s),e[s]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e)}_onParticipantSourcesUpdate(e){if(this._conversation){let t=e.participantUpdateInfos;c.log("Received participant sources update notification",t);for(let i of t)this._waitForStreamIfNeeded(i)}}async _onParticipantPromoted(e){this._conversation&&this._conversation.audienceMode?(c.log("Promoted in audience mode",!e.demote),this._conversation.restricted=e.demote,this._processRecordInfos(e),!e.demote&&this._mediaSource&&this._changeMediaSettings(this._mediaSource.getMediaSettings())):(c.log("Promoted in waiting hall",!e.demote),e.demote?(c.log("Kicked from waiting hall"),this._close(new H(D.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),v.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,i=[],a,o){c.log(`Chat room updated: ${e}`);let s=[],l=[],p=[],u=[],m=[];if(i.length&&i.forEach(w=>{if(w.externalId){let j=K.fromSignaling(w.externalId);m.push(j),this._api.cacheExternalId(w.id.id,j)}else{let j=S.decomposeId(w.id.id).id;s.push(j),u.push(j)}}),a?.length&&a.forEach(w=>{let j=S.decomposeId(w).id;s.push(j),l.push(j)}),o?.length&&o.forEach(w=>{let j=S.decomposeId(w).id;s.push(j),p.push(j)}),!s.length){v.onChatRoomUpdated(e,t,m,[],[]);return}if(u.length){let w=await this._api.getExternalIdsByOkIds(u);m.push(...w)}let I=await this._api.getExternalIdsByOkIds(l),A=await this._api.getExternalIdsByOkIds(p);v.onChatRoomUpdated(e,t,m,I,A)}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 o=await this._getExternalIdByParticipantId(i.participantId);o&&v.onRemoteLiveUpdate(o,i)}}async _onSharedMovieInfoStarted(e){c.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 o=await this._getExternalIdByParticipantId(e.initiatorId);o&&v.onRemoteSharedMovieInfo(o,e,t)}this._forceOpenTransportForAloneInCall()}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(i=>this._isMe(S.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 o of e.rooms.rooms)o.asrInfo&&this._conversation?.asrInfoByRoom.set(o.id,o.asrInfo);let i=e?.rooms?.roomId??this._conversation?.roomId??null,a=this._conversation?.asrInfoByRoom.get(i);if(a){let o=await this._getExternalIdByParticipantId(a.initiatorId);o&&v.onAsrSet({externalId:o,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 o=await this._getExternalIdByParticipantId(a.initiatorId);o&&v.onRemoteSharedUrl(o,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){c.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:i,movieId:a,source:o,roomId:s=null}=e,l={initiatorId:i,movieId:a,source:o};if(this._isMe(i))v.onLocalSharedMovieStoppedInfo(t,l,s);else{let u=await this._getExternalIdByParticipantId(i);if(u){let m=this._participants[i];m?.movieShareInfos&&(m.movieShareInfos=m.movieShareInfos.filter(I=>I&&I.movieId!==a)),v.onRemoteSharedMovieStoppedInfo(u,l,s)}}}async _onUrlSharingInfoUpdated(e){if(c.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:i}=this._conversation,{initiatorId:a,sharedUrl:o,roomId:s=null}=e;if(o?t.set(s,{sharedUrl:o,initiatorId:a}):t.delete(s),!(!o&&s!==i&&t.has(i))&&(!o||!this._isMe(a))){let l=await this._getExternalIdByParticipantId(a);l&&v.onRemoteSharedUrl(l,o,s)}}_onFeaturesPerRoleChanged(e){c.log(`Features per role changed: ${e.notification}`),v.onFeaturesPerRoleChanged(e.featuresPerRole)}_waitForStreamIfNeeded(e){let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:i,participantId:a}=t;if(i==="ANIMOJI")return;let o=this._participants[a];if(d.producerScreenDataChannel&&i==="SCREEN"&&!e.fastScreenShare){c.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let s=ze(t),l=this._sequenceNumberByStreamDescription.get(s);if(l&&l>e.sequenceNumber){c.warn(`Participant ${a} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${l}`),R.log(E.PAT_OUTDATED_RESPONSE);return}o&&e.suspend!==void 0&&i&&(c.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(o.externalId,i,e.suspend));let p=e.streamId,u=e.rtpTimestamp?this._getWaitingTime(p,e.rtpTimestamp):0;if(u<=0){this._streamWaitTimerByStreamDescription.delete(s);let m=this._conversation?.externalId,I=this._isMe(a);if(!o&&!I){R.log(E.PAT_ERROR,"participantMissing"),c.error(`Could not find participant by ID: ${a}`);return}let A=I?m:o.externalId,w=this._streamByStreamId.get(p);if(!w){R.log(E.PAT_ERROR,"streamNotFound"),c.error(`Could not find stream by ID: ${p}`);return}R.log(E.PAT_ALLOCATED),this._streamIdByStreamDescription.set(s,p);let j=e.participantStreamDescription?.mediaType;if(j==="STREAM"||j==="MOVIE"){if(e.participantStreamDescription?.streamName){let q={streamName:e.participantStreamDescription.streamName,stream:w,mediaType:j};I?v.onLocalLive(A,q):v.onRemoteLive(A,q)}}else if(d.producerScreenTrack&&j==="SCREEN")v.onRemoteScreenStream(o.externalId,w);else if(!I){let q=(d.producerScreenTrack?null:o.secondStream)||w;v.onRemoteStream(o.externalId,q)}}else{c.debug(`Waiting for ${u} until stream ${p} for ${s} is switched`);let m=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),u);this._streamWaitTimerByStreamDescription.set(s,m)}}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(ze(e)))return e;let t=e.participantId;if(e.mediaType){let i={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(ze(i)))return i}else{let i={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(ze(i)))return i;let a={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(ze(a)))return a}return c.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?S.includesOneOf(this._conversation.roles,[ct.ADMIN,ct.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!S.includesOneOf(this._conversation.roles,[ct.ADMIN,ct.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===J.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,e&&this._forceOpenTransportForAloneInCall(),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=mn(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=Cn(e),a)){let u=this._api.getDecorativeIdByInitialId(a.id);a.id=u?S.composeUserId(u):a.id}let o=await this._signaling.getWaitingHall(a,t,i);if(o.error)return Promise.reject(o.message);let s=o.participants||[],{externalIds:l}=await this._resolveWaitingHallExternalIds(s),p=null;return s.length&&o.hasMore&&(p=Rn(s[s.length-1].id)),{participants:l,pageMarker:p,totalCount:o.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,i=[],a=[];if(e.length){let o=[];e.forEach(s=>{if(t.set(s.id.id,s.id.addedTs),s.externalId){let l=K.fromSignaling(s.externalId);i.push(s.id.addedTs),a.push(l),this._api.cacheExternalId(s.id.id,l)}else o.push(S.decomposeId(s.id.id).id)}),o.length&&!a.length&&(a=await this._api.getExternalIdsByOkIds(o),i=a.map(s=>{let l=this._api.getCachedOkIdByExternalId(s);return(l?t.get(l):void 0)||Date.now()}))}return{externalIds:a,timestamps:i}}async getAudienceModeHands(){if(!this._signaling.ready)throw new Error("Signaling is not ready");let e=await this._signaling.getHandQueue();if(e.error)return Promise.reject(e.message);let t=e.participants||[],{externalIds:i,timestamps:a}=await this._resolveWaitingHallExternalIds(t);return{timestamps:a,participants:i,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!S.includesOneOf(this._conversation.options,[qt.WAITING_HALL,qt.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 c.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 o={movieId:e,lang:a};(t||t===0)&&(o.gain=t),i&&(o.metadata=i);let s=await this._signaling.addMovie(o);if(s.error)throw new Error(s.error);return{movieId:s.movieId,streamType:s.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",o=null,s=null){let l={movieId:i,name:t,privacy:a,groupId:o,roomId:s,streamMovie:!e},p=await this._signaling.startStream(l);if(p.error)return Promise.reject(p.message)}async stopStream(e=null){if((await this._signaling.stopStream({roomId:e})).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 o=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:i,roomId:a});if(o.error)throw new Error(o.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<d.videoMinWidth||e.height<d.videoMinHeight)throw new Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<d.videoMinWidth||t.height<d.videoMinHeight)throw new Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");d.videoEffectMaxHeight=t.height,d.videoEffectMaxWidth=t.width}d.videoMaxWidth=e.width,d.videoMaxHeight=e.height,c.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:d.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,o=this._transport?.getState();return Promise.all(a.map(async s=>{let l=S.composeId(s);return this._createParticipant({id:l,externalId:K.fromSignalingParticipant(s),mediaSettings:Se(s.mediaSettings),participantState:S.mapParticipantState(s),state:s.state,roles:s.roles||[],status:this._getStatusByTransportState(o)??"WAITING",muteStates:s.muteStates||{},unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(l,s.markers)},s.decorativeUserId)})).then(S.mapSharedParticipants)}async getParticipantListChunk(e){c.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=i.participants.filter(s=>{let l=S.composeId(s);return!this._participants[l]});await this._registerParticipants(a);let o=this._transport?.getState();return i.participants.forEach(s=>{let l=S.composeId(s),p=this._participants[l];p.status=this._getStatusByTransportState(o)??"WAITING",p.movieShareInfos=s.movieShareInfos,Object.assign(p.mediaSettings,Se(s.mediaSettings)),Object.assign(p.muteStates,s.muteStates),p.unmuteOptions=s.unmuteOptions??p.unmuteOptions,this._openTransport([p],!0)}),this._participantListChunkToExternalChunk(i)}async _getInitialParticiapntListChunk(){let e=d.participantListChunkInitIndex,t=d.participantListChunkInitCount,a=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return c.debug("Get initial participant list chunk",a.chunk),a.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();c.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new zt(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(c.log("Screen sharing changed",e.track,t),d.consumerScreenTrack){let i=e.track?new MediaStream([e.track]):null;v.onScreenStream(i,t)}}_changeRemoteMediaSettings(e,t){c.debug(`Remote media settings changed [${e}]`,t);let i=this._conversation?.externalId;if(this._isMe(e)&&i){v.onLocalMediaSettings(i,t);return}let o=this._participants[e];if(!o){this._warnParticipantNotInConversation(e);return}o.mediaSettings=t,this._state==="ACTIVE"&&v.onRemoteMediaSettings(o.externalId,t,o.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_changeLocalParticipantState(e){c.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}_changeRemoteParticipantState(e,t){c.debug(`Remote participant state changed [${e}]`,t);let i=this._participants[e];if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}_changeMultipleParticipantState(e,t){c.debug("Multiple participants state changed",e);let i=[],a;e.forEach((o,s)=>{if(this._isMe(s))a=o;else{let l=this._participants[s];if(!l){this._warnParticipantNotInConversation(s);return}l.participantState=o,i.push({externalId:l.externalId,participantState:{...o},markers:l.markers})}}),this._state==="ACTIVE"&&(a&&v.onLocalParticipantState(a),i.length&&v.onRemoteParticipantsState(i,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(c.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),v.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case N.ACCEPTED_CALL:return this._onAcceptedCall(e);case N.HUNGUP:return this._onHungup(e);case N.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case N.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case N.CLOSED_CONVERSATION:return this._onClosedConversation(e);case N.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case N.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case N.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case N.RATE_CALL_DATA:return this._onNeedRate();case N.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case N.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case N.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case N.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case N.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case N.REGISTERED_PEER:return this._onPeerRegistered(e);case N.SWITCH_MICRO:return this._onMicSwitched(e);case N.CHAT_MESSAGE:return this._onChatMessage(e);case N.CUSTOM_DATA:return this._onCustomData(e);case N.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case N.RECORD_STOPPED:return this._onRecordInfo(null,e.roomId);case N.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case N.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case N.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case N.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case N.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case N.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case N.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case N.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case N.FEEDBACK:return this._onFeedback(e);case N.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case N.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case N.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case N.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case N.ROOMS_UPDATED:return this._onRoomsUpdated(e);case N.ROOM_UPDATED:return this._onRoomUpdated(e);case N.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case N.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case N.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case N.ASR_STARTED:return this._onAsrStart(e);case N.ASR_STOPPED:return this._onAsrStop(e);case N.PROMOTION_APPROVED:return this._onPromotionApproved(e);case N.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case N.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._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let o=Object.keys(this._participants),s=[];for(let l of e.conversation.participants){let p=S.composeId(l),u=l.roles||[];if(this._isMe(p)){_i(this._conversation.roles,u)||this._onRolesChanged(p,u),t=()=>{this._registerParticipantLocalMuteState({muteStates:Mn(l),unmuteOptions:l.unmuteOptions})};continue}s.push(p);let m=this._participants[p];if(!m)await this._onJoinedParticipant({participantId:l.id,participant:l,mediaSettings:l.mediaSettings});else{let I=Se(l.mediaSettings);Ua(I,m.mediaSettings)||this._changeRemoteMediaSettings(p,I);let A=S.mapParticipantState(l),w=m.participantState;S.isEqualParticipantState(A,w)||this._changeRemoteParticipantState(p,A),_i(u,m.roles)||this._onRolesChanged(m.id,u)}}for(let l of o)s.indexOf(l)<0&&this._removeParticipant(this._participants[l],D.HUNGUP)}let i=e.rooms?.roomId??null;this._conversation.roomId!==i?this._onRoomSwitched(i).then(t):(this._processMuteStates(e,!0),t?.()),this._processRecordInfos(e),this._onOptionsChanged(e.conversation.options)}_onSignalingFailed(e){c.error("Signaling failed",e),this._close(e)}async _onAcceptedCall(e){let t=S.composeMessageId(e),i=S.getPeerIdString(e.peerId);if(c.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new H(D.MISSED),"Call accepted on other device");return}let a=this._participants[t];if(!a){let s=this._api.getDecorativeIdByInitialId(t),l=s?S.composeUserId(s,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Se(e.mediaSettings)},l))}a.state=J.ACCEPTED,a.mediaSettings=Se(e.mediaSettings),this._logWithMediaSettings(E.ACCEPTED_OUTGOING,a.mediaSettings),this._conversation&&this._conversation.direction===De.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),this._state==="ACTIVE"&&this._transport&&this._transport.open([a.id],i),this._changeRemoteMediaSettings(t,a.mediaSettings),this._changeRemoteParticipantState(t);let o=Object.keys(a.muteStates);o.length&&this._onMuteParticipant({muteStates:a.muteStates,mediaOptions:o,stateUpdated:!0,participantId:t}),this._state==="ACTIVE"&&v.onAcceptedCall(a.externalId)}async _onHungup(e){c.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=S.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new H(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let i=this._participants[t];if(!i){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),i.state=e.reason===D.REJECTED?J.REJECTED:J.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,D.HUNGUP)}async _onAddedParticipant(e){c.debug(`Participant added [${e.participantId}]`);let t=S.composeMessageId(e),i=this._participants[t];if(i&&i.state!==J.HUNGUP&&i.state!==J.REJECTED){c.debug(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:a}=e,o=a.decorativeUserId,s=await this._createParticipant({id:t,externalId:K.fromSignalingParticipant(a),mediaSettings:Se(a.mediaSettings),state:a.state,participantState:S.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},o);i=this._registerParticipantInCache(s)}i.state=J.CALLED,i.mediaSettings=Se(e.participant?.mediaSettings),i.participantState=S.mapParticipantState(e.participant),i.roles=e.participant?.roles||[],this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(i.id,!0),v.onParticipantAdded(i.externalId,i.markers),this._changeRemoteMediaSettings(t,i.mediaSettings),this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i)}async _onJoinedParticipant(e){c.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=S.composeMessageId(e),i=this._participants[t];if(i&&i.state===J.ACCEPTED){c.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:o}=e,s=o.decorativeUserId,l=await this._createParticipant({id:t,externalId:K.fromSignalingParticipant(o),mediaSettings:Se(o.mediaSettings),state:o.state,participantState:S.mapParticipantState(o),roles:o.roles||[],muteStates:o.muteStates||{},movieShareInfos:o.movieShareInfos,unmuteOptions:o.unmuteOptions||[],observedIds:o.observedIds||[],markers:this._denormalizeMarkers(t,o.markers)},s);i=this._registerParticipantInCache(l)}this._conversation&&this._conversation.direction===De.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),i.state=J.ACCEPTED,i.mediaSettings=Se(e.mediaSettings),i.participantState=S.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers),this._changeRemoteMediaSettings(t,i.mediaSettings),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 H(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=S.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteMediaSettings(t,Se(e.mediaSettings))}async _onParticipantStateChanged(e){let t=S.composeMessageId(e),i=S.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(i):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteParticipantState(t,i))}async _onParticipantsStateChanged(e){let{participants:t,roomId:i}=e,a=t.map(({id:l,markers:p})=>this._registerParticipantAndSetMarkersIfChunkEnabled(l,p));await Promise.all(a);let o=new Map,s=t.map(({id:l,participantState:p})=>this._getExternalIdByParticipantId(l).then(u=>[l,u&&S.mapParticipantState({participantState:p})]));try{(await Promise.all(s)).forEach(([p,u])=>{u&&o.set(p,u)}),this._changeMultipleParticipantState(o,i)}catch(l){c.warn(`_onParticipantsStateChanged: Failed to get external ids. ${l}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._conversation.featuresPerRole=e.featuresPerRole,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=Se(e.mediaSettings);t.isAudioEnabled!==i.isAudioEnabled&&await this._mediaSource.toggleAudio(i.isAudioEnabled),t.isVideoEnabled!==i.isVideoEnabled&&await this._mediaSource.toggleVideo(i.isVideoEnabled),d.consumerScreenTrack&&t.isScreenSharingEnabled!==i.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:i.isScreenSharingEnabled,fastScreenSharing:i.isFastScreenSharingEnabled,captureAudio:i.isAudioSharingEnabled})}_onSettingsUpdate(e){c.debug("Got settings update notification",e);let t={camera:e.camera,screenSharing:e.screenSharing};this._serverSettings=ta(this._serverSettings,t),this._transport&&this._transport.updateSettings(this._serverSettings)}_onVideoQualityUpdate(e){c.debug("Got video quality update notification",e);let t=Math.round(e.quality.maxBitrate/1024),i=e.quality.maxDimension,a={camera:Object.assign({},this._serverSettings.camera,{maxBitrateK:t,maxDimension:i}),screenSharing:null};this._serverSettings=ta(this._serverSettings,a),this._transport&&this._transport.updateSettings(this._serverSettings)}_onPeerRegistered(e){let t=S.composeMessageId(e);this._participants[t]&&(this._participants[t].clientType=e.clientType,this._participants[t].platform=e.platform),v.onPeerRegistered()}async _onMicSwitched(e){v.onDeviceSwitched(oe.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=S.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onChatMessage(e.message,i,e.direct)}async _onCustomData(e){if(e.data.hasOwnProperty("sdk"))return;let t=S.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)return;let i=this._conversation.recordsInfoByRoom.get(t),a=!1;if(!i!=!e?a=!0:i&&e&&(a=i.recordMovieId!==e.recordMovieId||i.recordStartTime!==e.recordStartTime),a)if(this._conversation.recordsInfoByRoom.set(t,e),e){let o=await this._getExternalIdByParticipantId(e.initiator);o?v.onRecordStarted(o,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}else v.onRecordStopped(t);e&&this._forceOpenTransportForAloneInCall()}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)}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),this._forceOpenTransportForAloneInCall()}_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)}_onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!_i(this._conversation.roles,t)){c.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:lr(this._getMuteStatesForCurrentRoom(),Ne.MUTE_PERMANENT),stateUpdated:!0}),S.includesOneOf(t,[ct.ADMIN,ct.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=this._participants[e];i&&!_i(i.roles,t)&&(c.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:o=[],mediaOptions:s=[],roomId:l=null}=e,p=e.adminId?this._participants[e.adminId]:null;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){c.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let u=this._participants[e.participantId];u&&(c.debug(`Mute states for participant [${e.participantId}] changed`,a),v.onMuteStates(a,o,s,i,e.unmute,u.externalId,p?.externalId,e.stateUpdated,e.requestedMedia,e.roomId));return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,l):i||(this._conversation.muteStatesPersonal=a)),e.adminId&&this._isMe(e.adminId)){i&&v.onMuteStates(a,o,s,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:s,muteAll:i,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:o,muteStates:a})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let i=this._getMuteStatesForRoomId(t),a=this._getMuteStatesForRoomId(e),o=Object.keys(i),s=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...o,...s])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==J.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:o,requestedMedia:s,roomId:l=null,unmuteOptions:p=[]}=e,u=e.adminId?this._participants[e.adminId]:null,m=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(l)),I=this._mediaSource.getMediaSettings(),A=Object.entries(m);for(let[w,j]of A){let q=d.newMuteRules&&this._isCallAdmin()&&i;if(!(j!==Ne.MUTE&&j!==Ne.MUTE_PERMANENT||q)&&(this._isCallAdmin()&&j===Ne.MUTE_PERMANENT&&!i&&(m[w]=Ne.MUTE),!(!t.includes(w)||a)))switch(w){case oe.VIDEO:I.isVideoEnabled&&(v.onDeviceSwitched(oe.VIDEO,!1),await this.toggleLocalVideo(!1));break;case oe.AUDIO:I.isAudioEnabled&&(v.onDeviceSwitched(oe.AUDIO,!1),await this.toggleLocalAudio(!1));break;case oe.SCREEN_SHARING:I.isScreenSharingEnabled&&(v.onDeviceSwitched(oe.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case oe.AUDIO_SHARING:I.isAudioSharingEnabled&&(v.onDeviceSwitched(oe.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:I.isScreenSharingEnabled,fastScreenSharing:I.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(m,p,t,i,a,null,u?.externalId,o,s,l)}async _onPinParticipant(e,t=!1,i,a=null){if(!this._conversation)return;let o=this._conversation.pinnedParticipantIdByRoom.get(a);if(o&&o!==e)if(this._isMe(o))v.onLocalPin(!0,a);else{let s=await this._getExternalIdByParticipantId(o);s&&v.onPinnedParticipant(s,!0,this._denormalizeMarkers(e,i),a)}if(this._isMe(e))v.onLocalPin(t,a);else{let s=await this._getExternalIdByParticipantId(e);s&&v.onPinnedParticipant(s,t,this._denormalizeMarkers(e,i),a)}this._conversation.pinnedParticipantIdByRoom.set(a,t?null:e)}_onOptionsChanged(e){this._conversation&&!un(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e))}_onNetworkStatus(e){if(this._conversation){let t=[];for(let[i,a]of Object.entries(e)){let o;if(this._isMe(i)||i==="")o=this._conversation.networkRating;else if(this._participants[i])o=this._participants[i].networkRating;else continue;if(o!==a)if(this._isMe(i)||i==="")this._conversation.networkRating=a,v.onLocalNetworkStatusChanged(a);else{let s=this._participants[i];s.networkRating=a,t.push({uid:s.externalId,rating:a})}}if(t.length===0)return;c.log("Received network status update: ",e),v.onNetworkStatusChanged(t)}}_onRemoteStreamSecond(e,t){let i=this._participants[e];if(i){if(d.producerScreenTrack){v.onRemoteScreenStream(i.externalId,t);return}if(i.secondStream=t,d.videoTracksCount>0){let a=e;if(!this._streamIdByStreamDescription.has(a)){c.error("Received remote stream notification for a participant that has no track associated with it",a);return}let o=this._streamIdByStreamDescription.get(a);if(!o||this._streamWaitTimerByStreamDescription.has(a)){c.log("Delaying secondary stream start/stop until main stream becomes available",a);return}let s=this._streamByStreamId.get(o);if(!s){R.log(E.PAT_ERROR,"streamNotFound"),c.error(`Could not find stream by ID: ${o}`);return}v.onRemoteStream(i.externalId,i.secondStream||s)}else{let a=t||i.remoteStream;a&&v.onRemoteStream(i.externalId,a)}}}_onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){v.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let i=this._participants[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){c.warn("_onAnimojiError failed",t)}}_onPeerConnectionClosed(e){e==="SERVER"&&this._cleanupParticipantAgnosticStreams()}_changeFeatureSet(){if(this._conversation){let e=this._state==="ACTIVE",t=this._conversation.features.includes(Xr.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}_onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let o=this._participants[i];o&&o.externalId&&t.push({uid:o.externalId,volume:a.real})}v.onVolumesDetected(t)}_onSpeakerChanged(e){this._activeSpeakerId=e,this._participants[e]&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(this._participants[e].externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){c.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=e.reduce((o,s)=>{if(s in this._participants){let l=this._participants[s];o.push(l),t==="CONNECTED"&&(l.remoteStream||(l.mediaSettings&&this._changeRemoteMediaSettings(s,l.mediaSettings),this._changeRemoteParticipantState(s,l.participantState)),this._updateDisplayLayoutFromCache(s))}else this._warnParticipantNotInConversation(s);return o},[]);a.length&&this._setParticipantsStatus(a,i)}async _onTransportLocalStateChanged(e){if(c.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(D.FAILED),this._close(new H(D.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(We.AUDIO_MIX))c.debug("Remote audio mix track added"),this._audioOutput.add(i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(We.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))c.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{c.debug(`Remote track added on the participant [${e}]`,{kind:i.kind});let a=this._participants[e];if(!a){let o=this._api.getDecorativeIdByInitialId(e),s=o?S.composeUserId(o):void 0;c.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${s}]`),a=this._registerParticipantInCache(await this._createParticipant({id:e},s)),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),d.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(c.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}}_removeAudioTrack(e,t,i){if(e!==We.AUDIO_MIX){let a=this._participants[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._isRealTimeAsrRequested&&this._forceOpenTransportForAloneInCall())}_onAudioMixStall(e){this._audioMixStalled!==e&&(this._audioMixStalled=e,c.debug("Audio mix stalled:",e),v.onLocalStatus(e?"RECONNECT":"CONNECTED"))}_onRemoteSignalledStall(e){let t={},i=[],a=[];c.debug("Participants stalled:",e);for(let o of e){if(t[o]=!0,!this._lastStalled[o]){let s=this._participants[o];s&&i.push(s)}delete this._lastStalled[o]}for(let o of Object.keys(this._lastStalled)){let s=this._participants[o];s&&a.push(s)}i.length&&this._setParticipantsStatus(i,"RECONNECT"),a.length&&this._setParticipantsStatus(a,"CONNECTED"),this._lastStalled=t}_onRemoteDataStats(e){this._debugInfo&&this._debugInfo.onRemoteDataStats(e,this._participants),this._fixAudioDevice(e.outbound.rtps),this._fixVideoDevice(e.outbound.rtps)}_fixAudioDevice(e){!y.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!y.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&&(c.debug("Toggle join availability",{available:t,chatId:e}),v.onJoinStatus(t,e))}async _updateDisplayLayoutFromCache(e){if(this._transport?.getTopology()!=="SERVER")return;let t=this._participants[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((o,s)=>(s.status!==t&&(s.status=t,o.push(s.externalId)),o),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(hi)){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===hi.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(s=>this._getExternalIdByParticipantId(s))||[]),i=await Promise.all(e.addParticipantIds?.map(s=>this._getExternalIdByParticipantId(s))||[]),a=await Promise.all(e.removeParticipantIds?.map?.(s=>this._getExternalIdByParticipantId(s))||[]),o=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?this._participantListChunkToExternalChunk(e.participants):void 0,active:e.active,muteStates:e.muteStates,pinnedParticipantId:o,countdownSec:e.countdownSec,timeoutMs:e.timeoutMs}}async _onRoomParticipantsUpdated(e){let t=this._transport?.getState(),i=e.roomId??null,a=e.addedParticipantIds?.map(A=>S.decomposeId(A).id)||[],o=await this._api.getExternalIdsByOkIds(a),s=e.addedParticipants;if(o.length&&s?.length!==o.length&&!this._isCalledState()){let A=this._convertExternalIdsToServerExternalIds(o);s=(await this._signaling.getParticipants(A)).participants}let l=await Promise.all(s?.map(async A=>{let w=S.composeId(A);return this._createParticipant({id:w,externalId:K.fromSignalingParticipant(A),mediaSettings:Se(A.mediaSettings),participantState:S.mapParticipantState(A),state:A.state,roles:A.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:A.muteStates||{},unmuteOptions:A.unmuteOptions||[],observedIds:A.observedIds||[],markers:this._denormalizeMarkers(w,A.markers),isInRoom:i!==null},A.decorativeUserId)})||[]),p=!1;for(let A of l)A.id===this._conversation?.compositeUserId&&(p=!0),this._registerParticipantInCache(A);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(l,!0);let u=[],m=[];if(e?.removedParticipantMarkers){for(let A of e.removedParticipantMarkers)if(A.GRID?.id){let w=this._getExternalIdByParticipantId(A.GRID.id);m.push(w)}u=await Promise.all(m)}if(p&&await this._onRoomSwitched(i),u){let A=this._conversation?.pinnedParticipantIdByRoom.get(i);if(A){let w=await this._getExternalIdByParticipantId(A);if(w){for(let j of u)if(K.compare(w,j)){this._conversation?.pinnedParticipantIdByRoom.delete(i);break}}}}let I={roomId:i,participantCount:e.participantCount,addedParticipantIds:o,addedParticipants:S.mapSharedParticipants(l),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:u};this._isCalledState()||v.onRoomParticipantsUpdated(I)}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 o of i){let s=o.id??null;if(this._setMuteStatesForRoomId(o.muteStates,s),this._conversation?.recordsInfoByRoom.set(s,o.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(s,o.pinnedParticipantId??null),o.asrInfo&&this._conversation?.asrInfoByRoom.set(s,o.asrInfo),o.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(s,o.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(s),e){await this._registerParticipants(o?.participants?.participants?.filter(p=>!this._participants[S.composeId(p)])||[],!0);let l=await this._convertRoomToExternal(o);l&&a.push(l)}}a.length&&!this._isCalledState()&&v.onRoomsUpdated({[hi.UPDATE]:{rooms:a}})}async _onFeedback(e){let t=[];for(let i of e.feedback){let a={...i,items:[]};for(let o of i.items){let s=await this._getExternalIdByParticipantId(o.participantId);s?a.items.push({...o,participantId:s}):this._warnParticipantNotInConversation(o.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,o=this._isMe(t);c.debug(`Decorative participant id changed [${t}]`,e);let s=await this._getExternalIdByParticipantId(t);if(!s){this._warnParticipantNotInConversation(t);return}let l=K.fromSignaling(a,s.deviceIdx);v.onParticipantIdChanged(s,l),this._api.cacheExternalId(i,l),this._api.mapDecorativeId(i,t),o?this._conversation.externalId=l:this._participants[t].externalId=l}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(c.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)}};z._delayedHangup=!1;var L=z,ia=class n extends Error{constructor(r,e){super(r),Object.setPrototypeOf(this,n.prototype),this.participantErrors=e}};var kt=null,Jt=null;function Un(){kt=null,Jt=null}async function Ir(n=null,r){let e=n??d.apiBaseUrl;if(e)return e;if((r??d.apiEnv)!=="AUTO")return d.apiEndpoint(r);try{let t=atob("aHR0cHM6Ly9kbnMuZ29vZ2xlL3Jlc29sdmU/bmFtZT12aWRlby5fZW5kcG9pbnQub2sucnUmdHlwZT1UWFQ="),o=(await(await fetch(t,{method:"GET",mode:"cors",cache:"no-cache"})).json())?.Answer[0]?.data;if(!o)throw new Error("Wrong DNS response");return c.debug("Resolved API endpoint",o),o}catch(t){return c.warn("Failed to resolve API endpoint using DNS, default is used",t),d.apiEndpoint(r)}}async function Bn(){return kt||Jt||(Jt=Ir(),kt=await Jt,Jt=null,kt)}async function Yt(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Bn();let t=Vn(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${kt}/fb.do`,i)}async function yi(n,r={},e=!1,t){await Bn();let i=Vn(n,r,e);return Ms(i,t)}async function Ms(n,r){return new Promise((e,t)=>{let i=new XMLHttpRequest;i.open("POST",`${r??kt}/fb.do`,!0),i.setRequestHeader("Content-type","application/x-www-form-urlencoded"),i.onreadystatechange=()=>{if(i.readyState!==XMLHttpRequest.DONE)return;let a;try{a=JSON.parse(i.responseText)}catch{a={result:i.responseText}}i.status!==200||a.hasOwnProperty("error_msg")?t(a):e(a)},i.send(n)})}async function Fn(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();c.debug("Form data sent successfully",t)}catch(e){throw c.warn("Failed to send form data",e),e}}function Vn(n,r={},e=!1){r.method=n,r.format="JSON",r.application_key||(r.application_key=d.apiKey),e||(Te.sessionKey?r.session_key=Te.sessionKey:Te.accessToken&&(r.access_token=Te.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 Pi=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){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var Ds=10,ws=700,ks=3e3,bi=class extends Pi{constructor(){super(...arguments);this._userId=null;this._externalUidsCache=new Map;this._decorativeIdToInitialId=new Map;this._initialIdToDecorativeId=new Map}async _callUnsafe(e,t={},i=!1){let a=async o=>{try{return await yi(e,t,i)}catch(s){if(!s.hasOwnProperty("error_msg")&&(o++,c.debug(`${e} network error, attempt ${o}...`),o<Ds))return await S.delay(Math.min(o*ws,ks)),a(o);throw c.warn(e,"error",s),s}};return a(0)}async _call(e,t={},i=!1){try{return await this._callUnsafe(e,t,i)}catch(a){c.warn("Api call error",a);let o=ae.API;switch(a.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,i)}let s={message:a.error_msg,code:a.error_code};switch(a.custom_error&&(s.custom_error=a.custom_error),a.error_code){case 1101:o=D.SERVICE_DISABLED;break;case 300:o=D.NOT_FOUND;break;case 1102:o=D.CALLEE_IS_OFFLINE;break;case 1103:o=D.NOT_FRIENDS;break;case 1104:case 1106:o=D.EXTERNAL_API_ERROR;break;case 1113:o=D.CALLER_IS_REJECTED;break;case 1114:o=D.VCHAT_DETAILED_ERROR;break}throw new H(o,s)}}async userId(e){let t=S.extractOkId(e);if(Te.isEmpty())return K.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),K.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!d.apiKey)throw new H(ae.API,{message:"Required argument apiAppKey not passed"});let e={session_data:{version:2,device_id:this._uuid,client_version:d.appVersion,client_type:"SDK_JS"}};return d.authToken&&(e.session_data.auth_token=d.authToken,e.session_data.version=3),this._callUnsafe("auth.anonymLogin",e,!0).then(t=>{t.uid&&(this._userId=Number(t.uid)),Te.sessionKey=t.session_key,Te.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&v.onTokenExpired(),new H(ae.AUTH,{message:t.error_msg,code:t.error_code})})}log(e){let t={collector:"ok.mobile.apps.video",data:JSON.stringify({application:`${d.appName}:${d.sdkVersion}`,platform:d.platform,items:e})};Yt("log.externalLog",t)}logClientStats(e){let t={app_version:String(d.appVersion),sdk_type:"WEB",sdk_version:d.sdkVersion,version:1,items:e};d.clientStatsPlatform&&(t.platform=d.clientStatsPlatform);let i={data:JSON.stringify(t)};Yt("vchat.clientStats",i)}logClientEvents(e){let t={app_version:String(d.appVersion),sdk_type:"WEB",sdk_version:d.sdkVersion,version:1,items:e};d.clientStatsPlatform&&(t.platform=d.clientStatsPlatform);let i={data:JSON.stringify(t)};Yt("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let o={conversationId:e,webrtcPlatform:d.platform,startTime:t,endTime:i},s=await this._callUnsafe("vchat.getLogUploadUrl",o),l=new FormData,p=new Blob([a],{type:"application/json"});l.append("file",p,"log.json");let u=new URL(s.upload_url);return u.searchParams.append("size",p.size.toString()),Fn(u.toString(),l)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:d.protocolVersion};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:o,audioOnly:s}={},l){let p=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,audienceMode:o,audioOnly:s,speakerIds:l});return this._startConversation(p)}async startConversation(e,t,i,a=!1,o="",s=!1,l=!1,{onlyAdminCanShareMovie:p}={},u){let m=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:s,payload:o,requireAuthToJoin:l,onlyAdminCanShareMovie:p,externalIds:u});if(t&&t.length)switch(i){case it.USER:m.uids=t.join(",");break;case it.GROUP:m.gid=t[0];break;case it.CHAT:m.chatId=t[0];break}return this._startConversation(m)}_ensureUuid(){if(!this._uuid){let e=ot.get("uuid");e||(e=S.uuid(),ot.set("uuid",e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:i="",joiningAllowed:a=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:s,audienceMode:l=!1,audioOnly:p=!1,speakerIds:u=[],externalIds:m}){let I={conversationId:e,isVideo:t,protocolVersion:d.protocolVersion};if(a&&(I.createJoinLink=!0),i&&(I.payload=i),d.domain&&(I.domainId=d.domain),d.externalDomain&&(I.externalDomain=d.externalDomain),o&&(I.requireAuthToJoin=!0),s!==void 0&&(I.onlyAdminCanShareMovie=s),l&&(I.audienceMode=l),p&&(I.audioOnly=p),u.length){let A=u.map(w=>S.composeUserId(w));I.speakerIds=A.join(",")}return m&&(I.externalIds=m.map(K.toSignaling).join(",")),I}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 o={joinLink:e,isVideo:t,protocolVersion:d.protocolVersion};return i?.length&&(o.observedIds=i.join(",")),d.anonymToken&&(o.anonymToken=d.anonymToken),a&&(o.payload=a),this._call("vchat.joinConversationByLink",o)}async getOkIdsByExternalIds(e){let t=[],i=[],a=new Map,o=Array.from(this._externalUidsCache.keys()),s=Array.from(this._externalUidsCache.values());for(let p of e){let u=K.toString(p),m=s.indexOf(u);m>-1?t.push(this.replaceByInitialIdIdIfExists(o[m])):(a.set(String(p.id),u),i.push({id:p.id,ok_anonym:p.type==="ANONYM"}))}return i.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:i})).ids.forEach((p,u)=>{let m=Number(p.ok_user_id),I=String(p.external_user_id.id);a.has(I)&&(this.cacheExternalId(m,K.fromString(a.get(I))),t.push(m))}),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 o of e){let s=K.toString(o),l=a.indexOf(s);if(l>-1){let p=S.composeParticipantId(this.replaceByInitialIdIdIfExists(i[l]),te.USER,o.deviceIdx);t.set(o,p)}}return t}async getExternalIdsByOkIds(e){let t=[],i=[];for(let o of e)if(this._externalUidsCache.has(o)){let s=this.getDecorativeIdByInitialId(o),l=this._externalUidsCache.get(s??o);t.push(K.fromString(l))}else i.push(o);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=K.toString(e),o=i.indexOf(a);return o>-1?S.composeParticipantId(this.replaceByInitialIdIdIfExists(t[o]),te.USER,e.deviceIdx):o>-1?S.composeParticipantId(t[o],te.USER,e.deviceIdx):null}cacheExternalId(e,t){let i=S.extractOkId(e);this._externalUidsCache.set(i,K.toString(t))}mapDecorativeId(e,t){let i=S.extractOkId(e),a=S.extractOkId(t);this._decorativeIdToInitialId.set(i,a),this._initialIdToDecorativeId.set(a,i)}unmapDecorativeId(e){let t=S.extractOkId(e),i=this.getDecorativeIdByInitialId(t);i&&this._decorativeIdToInitialId.delete(i),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=S.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=S.extractOkId(e);return this._decorativeIdToInitialId.get(t)??t}async getConversationParams(e){let t={};return d.anonymToken&&(t.anonymToken=d.anonymToken),e&&(t.conversationId=e),this._call("vchat.getConversationParams",t)}getUserId(){return this._userId}setUserId(e){this._userId=e}hangupConversation(e){let t={conversationId:e,reason:D.HUNGUP};d.anonymToken&&(t.anonymToken=d.anonymToken),Yt("vchat.hangupConversation",t)}sendUserFeedbackStats(e,t,i,a){let o={collector:"app.vchat.events.product",data:JSON.stringify({application:`${d.appName}:${d.sdkVersion}`,platform:d.platform,items:[{type:1,operation:E.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};Yt("log.externalLog",o)}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=(o,s)=>{for(let[l,p]of Object.entries(o)){let u=Number(l),m=K.fromId(p,s);t.set(u,m),this.cacheExternalId(u,m)}};i.external_ids&&a(i.external_ids,"USER"),i.anonym_ids&&a(i.anonym_ids,"ANONYM");for(let o of e){let s=Number(o);if(!t.has(s)){let l=K.fromId(String(s));t.set(s,l),this.cacheExternalId(s,l)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};var jn=(e=>(e.KING="KING",e.PAWN="PAWN",e))(jn||{}),xs=jn;var Hn=(e=>(e.OFF="0",e.ON="1",e))(Hn||{});var ra=class{constructor(r){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 aa=class{constructor(r,e,t,i=null){this._uuid=S.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:d.appVersion,client_type:"SDK_JS",auth_token:this._callToken,version:3},application_key:this._apiKey},e=await Ir(this._baseApiUrl,this._apiEnv),t=await yi("auth.anonymLogin",r,!0,e);return S.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(r){let e={conversationId:r,reason:D.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Ir(this._baseApiUrl,this._apiEnv);await yi("vchat.hangupConversation",e,!0,t)}};var de,Mi=null,QS={getCameras:y.getCameras,getMicrophones:y.getMicrophones,getOutput:y.getOutput,getVideoFacingMode:y.getVideoFacingMode,hasCamera:y.hasCamera,hasMicrophone:y.hasMicrophone,getSavedCamera:y.getSavedCamera,getSavedMicrophone:y.getSavedMicrophone,getSavedOutput:y.getSavedOutput,hasCameraPermission:y.hasCameraPermission,hasMicrophonePermission:y.hasMicrophonePermission,hasPermissions:y.hasPermissions,getUserMedia:y.getUserMedia,getUserVideo:y.getUserVideo,getUserAudio:y.getUserAudio,setResolution:y.setResolution,isBrowserSupported:y.isBrowserSupported,isScreenCapturingSupported:y.isScreenCapturingSupported,os:y.os,isMobile:y.isMobile,browserName:y.browserName,browserVersion:y.browserVersion,baseChromeVersion:y.baseChromeVersion,getAudioContext:y.getAudioContext,isAudioShareSupported:y.isAudioShareSupported},XS={participantMarkerCompare:S.participantMarkerCompare};function ZS(n){Mi=n}function ev(n){d.videoEffects=n}function tv(n){d.audioEffects=n}function iv(n,r=null,e={},t=1){d.vmoji=n,d.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function rv(n){if(d.set(n),de||(de=new bi),Gn.disableLog(!d.debug),c.toggle(d.debug),c.log(`Calls SDK ${d.sdkVersion}`,n),await y.init(),!y.isBrowserSupported())throw new H(ae.UNSUPPORTED);c.log("UserAgent:",navigator.userAgent),c.log("Screen resolution:",`${window.screen.width}x${window.screen.height}`),c.log("Permissions:",`Camera: ${y.hasCameraPermission()}, Mic: ${y.hasMicrophonePermission()}`),c.log("Simulcast:",`${n.simulcast} => ${d.simulcast}`)}async function av(n,r=[oe.AUDIO],e="",t=!1,i=!1,a,o){let s=[];return Array.isArray(n)?s=n.length?n:[]:n&&(s=[n]),Os([],it.USER,r,e,t,i,a,s,o)}async function Os(n,r=it.USER,e,t="",i=!1,a=!1,o,s,l){if(L.current())throw c.error("There is already active call"),new H(D.FAILED);return new L(de,Mi).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:o,externalIds:s,onFastStart:l})}async function nv(n,r){return Ls(n,te.USER,void 0,r)}async function Ls(n,r=te.USER,e,t){if(n===L.id())throw new Error("Push has already been processed");return new L(de,Mi).onPush(n,r,e,t)}async function ov(n,r){return n&&(d.authToken=n),r!==void 0&&d.apiBaseUrl!==r&&(d.apiBaseUrl=r,Un()),de.authorize()}async function sv(n=[oe.AUDIO]){return $e().accept(n)}async function cv(){let n=L.current();if(n)return n.decline()}async function dv(n,r=[oe.AUDIO]){return Ns(n,r)}async function Ns(n,r,e){if(L.current())throw c.error("There is already active call"),new H(D.FAILED);return new L(de,Mi).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function lv(n,r=[oe.AUDIO],e,t,i){if(L.current())throw c.error("There is already active call"),new H(D.FAILED);return e&&(d.anonymToken=e),new L(de,Mi).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i})}async function pv(){let n=L.current();if(n)return n.hangup();L.hangupAfterInit()}async function uv(n,r){let e=Array.isArray(n)?n:[n],t=L.current();t&&await t.addParticipant(e,r)}async function mv(n,r){let e=L.current();if(e){let t=n.map(i=>S.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function hv(n,r=!1){let e=await de.getOkIdsByExternalIds([n]);return Us(e[0],r)}async function Us(n,r=!1){let e=L.current();if(e)try{await e.removeParticipant(S.composeUserId(n),r)}catch(t){c.warn(`Failed to remove participant ${n}. Perhaps he is no longer on the call. ${t}`)}}async function _v(n,r){let e=L.current();if(n==="videoinput"&&Tt.contains(r))return d.videoFacingMode=r,e?(y.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await y._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function gv(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&d.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=L.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function fv(n){let r=L.current();r&&r.toggleAnimojiCapturing(n)}async function Sv(n,r=!1){let e=L.current();e&&await e.setVideoStream(n,r)}async function vv(n){let r=L.current();r&&await r.toggleLocalVideo(n)}async function Iv(n){let r=L.current();r&&await r.toggleLocalAudio(n)}async function Ev(n){let r=L.current();if(r)return r.setLocalResolution(n)}async function Tv(n){let r=L.current();r&&await r.changePriorities(n)}async function Rv(n,r){let e=L.current();if(e){let t;if(r){let[i]=await de.getOkIdsByExternalIds([r]);t=S.composeParticipantId(i,te.USER,r.deviceIdx)}await e.changeParticipantState(n,t)}}async function Cv(){let n=L.current();n&&await n.putHandsDown()}async function yv(n){let r=L.current();r&&await r.updateDisplayLayout(n)}async function Pv(n,r,e=!1){let t=await de.getOkIdsByExternalIds([n]);return Bs(t[0],K.getDeviceIdx(n),r,e)}async function Bs(n,r,e,t=!1){let i=L.current();i&&await i.grantRoles(S.composeParticipantId(n,te.USER,r),e,t)}async function bv({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await de.getOkIdsByExternalIds([n]))[0]),Fs({uid:i,muteStates:r,requestedMedia:e,deviceIdx:K.getDeviceIdx(n),roomId:t})}async function Fs({uid:n=null,muteStates:r,requestedMedia:e=[],deviceIdx:t=0,roomId:i=null}){let a=L.current();if(a){let o=n?S.composeParticipantId(n,te.USER,t):null;await a.muteParticipant(o,r,e,i)}}async function Mv(n,r=!1,e=null){let t=await de.getOkIdsByExternalIds([n]);return Vs(t[0],r,K.getDeviceIdx(n),e)}async function Vs(n,r=!1,e=0,t=null){let i=L.current();i&&await i.pinParticipant(S.composeParticipantId(n,te.USER,e),r,t)}async function Av(n){let r=L.current();r&&await r.updateMediaModifiers(n)}async function Dv(n){let r=L.current();r&&await r.enableVideoSuspend(n)}async function wv(n){let r=L.current();r&&await r.enableVideoSuspendSuggest(n)}async function kv(n){let r=L.current();r&&await r.changeOptions(n)}async function xv(n,r=null){let e=null;return r&&(e=(await de.getOkIdsByExternalIds([r]))[0]),js(n,e)}async function js(n,r=null){let e=L.current();if(e){let t=r?S.composeUserId(r):null;await e.chatMessage(n,t)}}async function Ov(n=10){let r=L.current();if(r)return r.chatHistory(n)}async function Lv(n,r=null){let e=null;return r&&(e=(await de.getOkIdsByExternalIds([r]))[0]),Hs(n,e,K.getDeviceIdx(r))}async function Hs(n,r=null,e=0){let t=L.current();if(t){let i=r?S.composeParticipantId(r,te.USER,e):null;await t.customData(n,i)}}async function Nv(n="",r=!1,{onlyAdminCanShareMovie:e=!1}={}){return(await de.createConversation(S.uuid(),n,r,{onlyAdminCanShareMovie:e})).join_link}async function Uv(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=K.fromIds(i),o=await de.getOkIdsByExternalIds(a);return(await de.createConversation(S.uuid(),n,r,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},o)).join_link}async function Bv(){let n=L.current();return n?n.createJoinLink():Promise.reject()}async function Fv(){let n=L.current();return n?n.removeJoinLink():Promise.reject()}async function Vv(n,r){return de.getAnonymTokenByLink(n,r)}function jv(n){let r=L.current();r&&r.setVolume(n)}function Hv(n){d.forceRelayPolicy=n}async function Gv(n=!1,r=null,e=null,t="DIRECT_LINK",i=null,a=null){let o=L.current();return o?o.startStream(n,r,e,t,i,a):Promise.reject()}async function Wv(n=null){let r=L.current();return r?r.stopStream(n):Promise.reject()}async function $v(n=null){let r=L.current();return r?r.publishStream(n):Promise.reject()}async function Kv(n,r,e=!1,t=null){let i=L.current();if(!i)return Promise.reject();let a,o,s=[];if(r?.length&&s.push(...r),n&&s.push(n),s.length){let l=await de.getParticipantIdsByExternalIds(s);n&&(a=l.get(n),l.delete(n)),o=Array.from(l.values())}return i.recordSetConf(a,o,e,t)}async function qv(){let n=L.current();return n?n.getStreamInfo():Promise.reject()}async function zv(n){let r=L.current();return r?r.addMovie(n):Promise.reject()}async function Jv(n){let r=L.current();return r?r.updateMovie(n):Promise.reject()}async function Yv(n){let r=L.current();return r?r.removeMovie(n):Promise.reject()}async function Qv(n,r){let e=L.current();if(e){let t=[];for(let i of n){let a,o;i.addParticipantIds&&(a=(await de.getOkIdsByExternalIds(i.addParticipantIds)).map(s=>S.composeUserId(s))),i.removeParticipantIds&&(o=(await de.getOkIdsByExternalIds(i.removeParticipantIds)).map(s=>S.composeUserId(s))),t.push({id:i.id,name:i.name,participantCount:i.participantCount,addParticipantIds:a,removeParticipantIds:o,countdownSec:i.countdownSec})}return e.updateRooms(t,r)}return Promise.reject()}async function Xv(n,r){let e=L.current();return e?e.activateRooms(n,r):Promise.reject()}async function Zv(n=null,r=null){let e=L.current();if(!e)return Promise.reject();let t;if(r){let i=await de.getOkIdsByExternalIds([r]),a=K.getDeviceIdx(r);t=S.composeParticipantId(i[0],te.USER,a)}return e.switchRoom(n,t)}async function eI(n){let r=L.current();return r?r.removeRooms(n):Promise.reject()}function tI(n){d.statisticsInterval=n;let r=L.current();if(r)return r.updateStatisticsInterval()}function iI(n){Gn.disableLog(!n),c.toggle(n)}function rI(n,...r){d.debugLog&&c.send(n,"[external]",...r)}async function aI(){let n=Ae.conversationId;if(!n)throw c.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let r=Ae.collectLogs();if(r.length===0)throw c.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Ae.startTime,t=Ae.endTime;try{return de?.uploadDebugLogs(n,e,t,JSON.stringify(r))}catch(i){throw c.error("[uploadDebugLogs]","Error while uploading logs",i),new Error("Error while uploading logs",{cause:i})}}async function nI(n){let r=L.current();if(r)return r.videoEffect(n)}async function oI(n,r){let e=L.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function sI(n){let r=L.current();r&&await r.setAudioStream(n)}async function cI(n,r=null,e=null){let t=L.current();if(!t)return;let i=e??r?.id,a=null;if(r){let s=(await de.getOkIdsByExternalIds([r]))[0];if(!s)throw new Error("Could not get user id to set animoji svg");a=S.composeParticipantId(s,te.USER,K.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function dI(n){let r=L.current();r&&r.setAnimojiFill(n)}async function lI(n=null,r,e=!1){return $e().getWaitingHall(n,r,e)}async function pI(){return $e().getAudienceModeHands()}async function uI(n,r=!1){let e=$e(),t;if(n){let[i]=await de.getOkIdsByExternalIds([n]);t=S.composeUserId(i)}return e.promoteParticipant(t,r)}async function mI(n=!1){return $e().requestPromotion(n)}async function hI(n=!1){return $e().acceptPromotion(n)}async function _I(n){return $e().getParticipantListChunk(n)}async function gI(n){return $e().getParticipants(n)}async function fI(n){return $e().feedback(n)}function SI(n,r,e){return $e().userFeedbackStats(n,r,e)}function vI(n,r={},e=!1){let t=L.current();t&&t.sendClientEvent(n,r,e)}async function II(n,r){return $e().enableFeatureForRoles(n,r)}function $e(){let n=L.current();if(!n)throw new Error("Conversation not found");return n}async function EI(n){await de.removeHistoryRecords(n)}async function TI(n){let r=L.current();r&&await r.startAsr(n)}async function RI(n){let r=L.current();r&&await r.stopAsr(n)}async function CI(n){let r=L.current();r&&await r.requestAsr(n)}async function yI(n){let r=L.current();return r?r.startUrlSharing(n):Promise.reject()}async function PI(){let n=L.current();return n?n.stopUrlSharing():Promise.reject()}function bI(){return d.sdkVersion}export{bi as Api,aa as ApiExternal,ra as ArrayDequeue,Te as AuthData,Ot as BaseLogger,De as CallDirection,it as CallType,Qr as ChatRoomEventType,Xr as ConversationFeature,qt as ConversationOption,qa as DebugMessageType,Zr as ExternalIdType,Tt as FacingMode,ae as FatalError,H as HangupReason,D as HangupType,oe as MediaOption,Fe as MediaTrackKind,pi as MediaType,Ne as MuteState,J as ParticipantState,Hn as ParticipantStateDataValue,Lr as ParticipantStatus,xs as RecordRole,hi as RoomsEventType,Kt as Signaling,O as SignalingCommandType,tt as SignalingConnectionType,N as SignalingNotification,Qe as TransportTopology,ct as UserRole,te as UserType,Mt as VolumeDetector,sv as acceptCall,hI as acceptPromotion,Xv as activateRooms,zv as addMovie,uv as addParticipant,mv as addParticipantInternal,ov as authorize,QS as browser,Os as callInternal,av as callTo,gv as captureScreen,fv as captureVmoji,oI as changeAudioEffect,kv as changeConversationOptions,_v as changeDevice,Rv as changeParticipantState,Tv as changePriorities,nI as changeVideoEffect,Ov as chatHistory,xv as chatMessage,js as chatMessageInternal,Bv as createJoinLink,Lv as customData,Hs as customDataInternal,iI as debug,rI as debugMessage,cv as declineCall,II as enableFeatureForRoles,Dv as enableVideoSuspend,wv as enableVideoSuspendSuggest,fI as feedback,Hv as forceRelayPolicy,Vv as getAnonymTokenByLink,pI as getAudienceModeHands,_I as getParticipantListChunk,gI as getParticipants,qv as getStreamInfo,lI as getWaitingHall,Pv as grantRoles,Bs as grantRolesInternal,pv as hangup,rv as init,dv as joinCall,lv as joinCallByLink,Ns as joinCallInternal,vI as logClientEvent,bv as muteParticipant,Fs as muteParticipantInternal,Mv as pinParticipant,Vs as pinParticipantInternal,nv as processPush,Ls as processPushInternal,uI as promoteParticipant,$v as publishStream,Cv as putHandsDown,Kv as recordSetConf,EI as removeHistoryRecords,Fv as removeJoinLink,Yv as removeMovie,hv as removeParticipant,Us as removeParticipantInternal,eI as removeRooms,CI as requestAsr,mI as requestPromotion,tv as setAudioEffects,sI as setAudioStream,Ev as setLocalResolution,ZS as setLogger,Av as setMediaModifiers,tI as setStatisticsInterval,ev as setVideoEffects,Sv as setVideoStream,iv as setVmoji,dI as setVmojiFill,cI as setVmojiSvg,jv as setVolume,TI as startAsr,Uv as startAudienceConversation,Nv as startConversation,Gv as startStream,yI as startUrlSharing,RI as stopAsr,Wv as stopStream,PI as stopUrlSharing,Zv as switchRoom,Iv as toggleLocalAudio,vv as toggleLocalVideo,yv as updateDisplayLayout,Jv as updateMovie,Qv as updateRooms,aI as uploadDebugLogs,SI as userFeedbackStats,XS as utils,bI as version};
7
+ var ds=Object.defineProperty;var ls=(n,r,e)=>r in n?ds(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var o=(n,r,e)=>ls(n,typeof r!="symbol"?r+"":r,e);import ns from"webrtc-adapter";var Ht=class{log(r,e,t=!1){}destroy(){}};var ne=class{constructor(){o(this,"_handlers",{});o(this,"_listeners",[])}_triggerEvent(r,...e){if(Object.hasOwn(this._handlers,r))for(let t of this._handlers[r])t.apply(this,e)}addEventListener(r,e){if(typeof e!="function")throw new Error("Listener should be a function");return Object.hasOwn(this._handlers,r)||(this._handlers[r]=[]),this._handlers[r].push(e),{dispose:this.removeEventListener.bind(this,r,e)}}removeEventListener(r,e){if(!Object.hasOwn(this._handlers,r))return;e||delete this._handlers[r];let t=this._handlers[r].indexOf(e);t>=0&&this._handlers[r].splice(t,1)}subscribe(r,e,t){let i=r.addEventListener(e,t);this._listeners.push(i)}unsubscribe(){this._listeners.forEach(r=>{r.dispose()})}};var ci=class extends ne{get ready(){return!0}setParticipantIdRegistry(r){}requestRealloc(){}setEndpoint(r){}setWebTransportEndpoint(r){}setConversationId(r){}readyToSend(r=!0){}cleanup(){}requestTestMode(r,e){}getNextCommandSequenceNumber(){return 0}};var Aa=(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.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))(Aa||{}),k=Aa;var G=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(k).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 Ie=class Ie extends Ht{constructor(e,t){super();o(this,"_externalLogger");o(this,"_api");o(this,"_batchInterval",3e3);o(this,"_batchedLogItems",[]);o(this,"_batchedClientStats",[]);o(this,"_batchedClientEvents",[]);o(this,"_batchTimeout",null);o(this,"_serverTimeDelta",0);this._api=e,this._externalLogger=t,this._calculateServerTimeDelta()}static setConversationIdProvider(e){Ie._conversationIdProvider=e}static create(e,t){Ie._instance||(Ie._instance=new Ie(e,t))}static log(e,t,i=!1){Ie._instance&&Ie._instance.log(e,t,i)}static logCustom(e,t,i=!1){Ie._instance&&Ie._instance.logCustom(e,t,i)}static logClientStats(e,t=!1){Ie._instance&&Ie._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){Ie._instance&&Ie._instance.logClientEvent(e,t)}static destroy(){Ie._instance&&Ie._instance.destroy(),Ie._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(Ie._conversationIdProvider)try{return Ie._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(Ie,"_instance"),o(Ie,"_conversationIdProvider",null);var R=Ie;import{Any as no,Arr as hn,Int as H,Nil as xt,Str as gn,Bool as sa}from"messagepack";var Da=(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))(Da||{}),N=Da;var wa=(z=>(z.MIC_CAMERA_PERMISSION="mic_camera",z.CAMERA_PERMISSION="camera",z.MIC_PERMISSION="mic",z.CAMERA_ACCESS="cameralock",z.MIC_ACCESS="miclock",z.MIC_NOT_FOUND="nomic",z.SCREEN_PERMISSION="screenpermission",z.SCREEN_ACCESS="screenlock",z.CONNECTION="connection",z.NETWORK="network",z.UNKNOWN="unknown",z.UNSUPPORTED="unsupported",z.SIGNALING_FAILED="signalingfailed",z.API="api",z.AUTH="auth",z.OVERCONSTRAINED="overconstrained",z))(wa||{}),se=wa;var ka=(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))(ka||{}),de=ka;var Oa=(ie=>(ie.ACCEPT_CONCURRENT="callAcceptConcurrent",ie.ACCEPT_INCOMING="callAcceptIncoming",ie.ACCEPTED_OUTGOING="callAcceptedOutgoing",ie.ADD_PARTICIPANT="callAddParticipant",ie.CALL_SPEC_ERROR="callSpecError",ie.DECLINE_INCOMING="callDeclineIncoming",ie.DEVICE_CHANGED="callDeviceChanged",ie.DEVICES="callDevices",ie.ERROR="callError",ie.HANGUP="callHangup",ie.ICE_CONNECTION_STATE="callIceConnectionState",ie.ICE_CONNECTION_TYPE="callIceConnectionType",ie.ICE_RESTART="callIceRestart",ie.JOIN_CONVERSATION="callJoinConversation",ie.MEDIA_STATUS="callMediaStatus",ie.OUTGOING_CALL="callStart",ie.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",ie.PAT_ALLOCATED="patAllocate",ie.PAT_DEALLOCATED="patDeallocate",ie.PAT_ERROR="patError",ie.PAT_OUTDATED_RESPONSE="patOutdatedResponse",ie.PAT_WAITING_TIME_ERROR="patWaitingTimeError",ie.POOR_CONNECTION="callPoorConnection",ie.PUSH="callPush",ie.RECONNECT="callReconnect",ie.RELAY_POLICY="callForceRelay",ie.REMOVE_PARTICIPANT="callRemoveParticipant",ie.SOCKET_ACTION="callSocketAction",ie.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",ie))(Oa||{}),M=Oa;import xa from"@vkontakte/libvpx";var Ke=class{constructor(){o(this,"_worker",null)}async _createWorker(r,e,t=[],i={},a=[]){return new Promise((s,c)=>{let u=t.join(","),p=new Blob([r,`exports.default(${u});`],{type:"application/javascript; charset=utf-8"}),m=window.URL.createObjectURL(p);this._worker=new Worker(m),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":c(h.data.error);break;case"frame":e(h.data);break;case"debug":d.debug(h.data.message);break;case"log_error":R.log(M.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 Tt=class extends Ke{async init(r,e){d.debug("LibVPxDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var d=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var R=(o,t)=>{for(var e in t)d(o,e,{get:t[e],enumerable:!0})},h=(o,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of x(t))!E.call(o,s)&&s!==e&&d(o,s,{get:()=>t[s],enumerable:!(a=y(t,s))||a.enumerable});return o};var V=o=>h(d({},"__esModule",{value:!0}),o);var D={};R(D,{default:()=>M});var M=(o,t)=>{let e=null,a=null,s=!0;function c(){return o({locateFile:t}).then(r=>a=r)}function f(r,u,n,m){if(!a){self.postMessage({type:"log_error",message:"decoder-init-fail-libvpx"}),self.postMessage({type:"frame",error:"Fatal initialization error"});return}if(s!==n&&(s=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 a.VpxDecoder,e.debug(m),!e.init(n?a.VpxType.VP9:a.VpxType.VP8))){e=null,self.postMessage({type:"frame",error:"Decoder failed to create"});return}try{e.allocateBuffer(u.byteLength).set(new Uint8Array(u))}catch(i){self.postMessage({type:"debug",message:i}),e=null,self.postMessage({type:"frame",error:String(i)});return}if(!(e.decode()&&e.nextImage())){self.postMessage({type:"frame",error:"Decode failed"});return}let l=e.getImageBuffer();if(!l){self.postMessage({type:"frame",error:"No decoded data"});return}let b=e.getImageWidth(),g=e.getImageHeight();e.nextImage()&&(self.postMessage({type:"debug",message:"LibVPxDecoder dropped frame"}),self.postMessage({type:"log_error",message:"LibVPxDecoder-drop"}));let p=new Uint8ClampedArray(l.byteLength);p.set(l),self.postMessage({type:"frame",data:p.buffer,width:b,height:g},[p.buffer])}c().then(()=>{self.onmessage=r=>{switch(r.data.type){case"frame":f(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',t=>{if(t.error)d.warn("LibVPxDecoder",t.error),e(t.error);else{let i=new ImageData(new Uint8ClampedArray(t.data),t.width,t.height);r(i)}},[xa,xa.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 et=class extends Ke{async init(r,e){d.debug("WebCodecsDecoder started"),await this._createWorker('"use strict";var exports=(()=>{var i=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var C=(o,e)=>{for(var n in e)i(o,n,{get:e[n],enumerable:!0})},A=(o,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of R(e))!y.call(o,t)&&t!==n&&i(o,t,{get:()=>e[t],enumerable:!(a=D(e,t))||a.enumerable});return o};var V=o=>A(i({},"__esModule",{value:!0}),o);var F={};C(F,{default:()=>k});var k=o=>{let e=null,n=!0,a=null,t=!1,f=1e3/15*2;function p(){self.postMessage({type:"ready"})}function m(r,b,d,c=!1){if(!e||n!==d){if(!c){self.postMessage({type:"frame",error:"WebCodecsDecoder dropped frame - waiting for keyframe"});return}n=d,e?self.postMessage({type:"debug",message:`WebCodecsDecoder codec changed to ${d?"VP9":"VP8"}`}):(self.postMessage({type:"debug",message:`WebCodecsDecoder codec ${d?"VP9":"VP8"}`}),e=new VideoDecoder({output:s=>{l();let g=o?[s]:[];self.postMessage({type:"frame",data:s},g),s.close()},error:s=>{l(),e&&e.state!=="closed"&&e.close(),e=null,self.postMessage({type:"frame",error:"WebCodecsDecoder failed, reinitialize: "+String(s)})}})),e.configure(u(d))}if(t&&!c){self.postMessage({type:"frame",error:"WebCodecsDecoder dropped frame after reset - waiting for keyframe"});return}t=!1;let E=new EncodedVideoChunk({type:c?"key":"delta",timestamp:r,data:b});e.decode(E),a=setTimeout(()=>{t=!0,e?.reset(),e?.configure(u(d)),self.postMessage({type:"frame",error:"WebCodecsDecoder reset because of decode timeout"})},f)}self.onmessage=r=>{switch(r.data.type){case"init":p();break;case"frame":m(r.data.timestamp,r.data.data,r.data.isVP9,r.data.keyFrame);break}};function l(){a&&clearTimeout(a),a=null}function u(r){return{codec:r?"vp09.00.50.08":"vp8"}}};return V(F);})();\n',t=>{t.error?(d.warn("WebCodecsDecoder",t.error),e(t.error)):(r(t.data),t.data.close())},[y.baseChromeVersion()>=92||y.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&&!y.isBrokenVP9Decoder()&&y.browserName()!=="Firefox"}};var Rt=class{constructor(r=null,e=0){o(this,"_counter",0);o(this,"_interval",0);o(this,"_lastCalculationTime",Date.now());o(this,"_onCalculated",null);this._onCalculated=r,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(r=1){this._counter+=r}calculate(){let r=Date.now(),e=r-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=r,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};import{BitStream as Ts}from"bit-buffer";var Na=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Na||{}),ae=Na;var ut={HEIGHT:720,WIDTH:1280,BITRATE:1e6},di="L1T2",Ua=[{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}],ps={h:1,m:2,l:4};function Ba(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 La(n,r){for(let e of r)if(n<=e.dimension)return e.bitrate;return length>0?r[length-1].bitrate:Ua[0].bitrate}function li(n=ut.WIDTH,r=ut.HEIGHT,e=Ua){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=La(i,e)??ut.BITRATE;for(let p=0;p<a;p++){let m=t[p];s.streams.push({rid:m,width:n,height:r,fps:c,bitrate:u}),n=Math.round(n/2),r=Math.round(r/2),u=La(Math.max(n,r),e)??Math.round(u/2)}return s}function Bi(n){return n?ps[n]??1:1}var Fa=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 Va(n){return new Promise((r,e)=>{let t=new FileReader;t.onload=i=>{r(i.target?.result)},t.onerror=e,t.readAsArrayBuffer(n)})}var Gt=":",Vi="d",us=533,Fi="a=fmtp:",ms="sps-pps-idr-in-keyframe=1",xr;(We=>{let n=/[\r\n]+/,r=`\r
8
+ `;function e(g,T){let C=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),A,f=[];for(A=0;A<g.length;++A){let D=g[A].match(C);D&&D.length===3&&D[2]===T&&f.push(D[1])}return f}function t(g,T,C){let A=g.split(" "),f=A.slice(0,3),D;for(D=3;D<A.length;D++)C.includes(A[D])&&f.push(A[D]);for(D=3;D<A.length;D++)!C.includes(A[D])&&!T.includes(A[D])&&f.push(A[D]);return f.join(" ")}function i(g,T,C,A){let f,D="m="+T;for(f=0;f<g.length;++f)g[f].startsWith(D)&&(g[f]=t(g[f],C,A))}function a(g,T){let C=new RegExp(Fi+"(\\d+)");for(let A=0;A<g.length;++A){let f=g[A].match(C);if(f&&f.length===2&&T.includes(f[1])){let D=g[A].trim()===Fi+f[1]?" ":";";g[A]+=D+ms}}}function s(g,T){let C=e(g,T);if(!C.length)return;let A=C.slice(0),f=new RegExp(Fi+"(\\d+) apt=(\\d+)"),D;for(D=0;D<g.length;++D){let B=g[D].match(f);B&&B.length===3&&A.includes(B[2])&&A.push(B[1])}let W=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for(D=g.length;D--;){let B=g[D].match(W);B&&B.length===3&&A.includes(B[2])&&g.splice(D,1)}i(g,"video",A,[])}function c(g,T,C,A){let f=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),D,W=[];for(D=T;D<C;++D){let X=g[D].match(f);X&&X.length===3&&X[2]===A&&W.push(X[1])}if(!W.length)return W;let B=new RegExp(Fi+"(\\d+) apt=(\\d+)");for(D=T;D<C;++D){let X=g[D].match(B);X&&X.length===3&&W.includes(X[2])&&W.push(X[1])}return W}function u(g,T,C,A){let f=c(g,T,C,A);if(!f.length)return C+1;let D=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),W=0,B=C;for(;B>=T;){let X=g[B].match(D);X&&X.length===3&&f.includes(X[2])&&(g.splice(B,1),W++),B--}return g[T]=t(g[T],f,[]),C-W+1}function p(g,T,C,A){let f=-1,D=-1,W=!1;for(let B=0;B<g.length;++B)if(f>=0&&g[B].startsWith("m=")&&(D=B-1,W&&(B=u(g,f,D,T)),f=-1,D=-1,W=!1),g[B].startsWith("m=video")&&(f=B),f>=0){let X=C==="remote"&&A==="encoder"||C==="local"&&A==="decoder"?"recvonly":"sendonly";(g[B].startsWith(`a=${X}`)||g[B].startsWith("a=sendrecv"))&&(W=!0)}D=g.length-1,f>=0&&W&&u(g,f,D,T)}function m(g,T,C){let A=e(g,"H264");T&&i(g,"video",[],A),C&&a(g,A)}function h(g){let T=e(g,"VP9");i(g,"video",[],T)}function E(g,T,C,A,f,D=!1,W=!1){if(!T&&!C&&!A&&!W&&!D&&!f)return g;function B(x){let ve=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],fe="a=rtcp-fb:111",Ee=x.findIndex(me=>me.startsWith(fe));return~Ee&&(x[Ee]=x[Ee]+r+ve.join(r)),x}function X(x){let ve=e(x,"red");ve.length>0&&i(x,"audio",[],ve)}let Se=g.split(n);return C?p(Se,"H264","local","decoder"):(T||f)&&m(Se,T,f),A&&h(Se),W&&X(Se),D&&B(Se),Se.join(r)}We.patchLocalSDP=E;function P(g,T,C,A,f,D,W){T&&(g=g.replace("m=application 9 UDP/DTLS/SCTP webrtc-datachannel","m=application 9 DTLS/SCTP 5000").replace("a=sctp-port:5000","a=sctpmap:5000 webrtc-datachannel 256"));let B=g.split(n);return A?s(B,"H264"):C&&m(B,C,!1),D&&W?s(B,"VP9"):D?p(B,"VP9","remote","encoder"):W?p(B,"VP9","remote","decoder"):f&&h(B),B.join(r)}We.patchRemoteSDP=P;function w(g){return g?`${g.type||"WEB_SOCKET"}_${g.id}`:"_"}We.getPeerIdString=w;function V(g,T){return g&&g.id===T.id&&(g.type||"WEB_SOCKET")===(T.type||"WEB_SOCKET")}We.comparePeerId=V;async function z(g){let T={local:null,remote:null};if(!g||!g.getStats)return T;try{let C=await g.getStats(null),A=null;if(C.forEach(f=>{f.type==="transport"&&f.selectedCandidatePairId?A=C.get(f.selectedCandidatePairId):f.type==="candidate-pair"&&f.state==="succeeded"&&!A&&(!Object.hasOwn(f,"selected")||f.selected)&&(A=f)}),A?.localCandidateId){let f=C.get(A.localCandidateId);f&&(T.local={type:f.candidateType,ip:f.ip||f.ipAddress,port:f.port||f.portNumber})}if(A?.remoteCandidateId){let f=C.get(A.remoteCandidateId);f&&(T.remote={type:f.candidateType,ip:f.ip||f.ipAddress,port:f.port||f.portNumber})}return T}catch{return T}}We.getPeerConnectionHostInfo=z;let oe=/^[0-9]+$/,Te=/^([gu])([0-9]+)$/;function Ae(g,T=ae.USER){let C=String(g);return Te.test(C)?(d.warn(`Already composite id [${g}] type supplied [${T}]`),C):T===ae.GROUP?"g"+C:T===ae.USER?"u"+C:(d.warn(`Unknown type [${T}] for id [${g}]`),C.match(oe)?"u"+C:C)}We.composeUserId=Ae;function ee(g,T,C=0){let A=Ae(g,T);return De(A,C)}We.composeParticipantId=ee;function De(g,T){return T?g+Gt+Vi+T:g}We.compose=De;function J(g){return ee(g.id,g.idType||ae.USER,g.deviceIdx)}We.composeId=J;function ni(g){if(g.decorativeUserId)return ee(g.decorativeUserId,g.idType||ae.USER,g.deviceIdx)}We.composeDecorativeId=ni;function _a(g){return g.participant?J(g.participant):ee(g.participantId,g.participantType||ae.USER,g.deviceIdx)}We.composeMessageId=_a;function fa(g){return typeof g=="string"?si(te(g).compositeUserId).id:g}We.extractOkId=fa;function si(g){let T=String(g),C=T.match(Te);return C?{id:Number(C[2]),type:C[1]==="g"?ae.GROUP:ae.USER}:(d.warn(`Unsupported compositeId [${g}]`),{id:Number(T),type:ae.USER})}We.decomposeId=si;function te(g){let T=g.split(Gt+Vi);return{compositeUserId:T[0],deviceIdx:T.length>1?parseInt(T[1],10):0}}We.decomposeParticipantId=te;function Sa(){let g=window.crypto?.randomUUID?.();if(g)return g;let T="0123456789abcdefghijklmnopqrstuvwxyz".split(""),C=new Array(36),A=0,f,D;for(D=0;D<36;D++)D===8||D===13||D===18||D===23?C[D]="-":D===14?C[D]="4":(A<=2&&(A=33554432+Math.random()*16777216|0),f=A&15,A=A>>4,C[D]=T[D===19?f&3|8:f]);return C.join("")}We.uuid=Sa;function ie(g,T){let C;function A(...f){let D=this;C&&window.clearTimeout(C),C=window.setTimeout(()=>{g.apply(D,f)},T)}return A}We.debounce=ie;function va(g){if(!window.BigInt)return null;let T="",C=g.split(`
9
+ `);for(let D of C)if(D.startsWith("a=fingerprint")){let W=D.split(" ");if(W.length===2){T=W[1];break}}if(!T)return BigInt(-1);let A=T.split(":"),f=BigInt(0);for(let D=Math.min(7,A.length-1);D>=0;D--){let W=BigInt(parseInt(A[D],16));f<<=BigInt(8),f|=W}return BigInt.asIntN(64,f)}We.sdpFingerprint=va;async function Ia(g){return new Promise(T=>window.setTimeout(T,g))}We.delay=Ia;function Ea(g,T,C){let A=[];return g.getSenders().forEach(f=>Li(T,f,f.track,C,A)),A}We.applySettings=Ea;function Li(g,T,C,A,f){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!g||!C||C.kind!=="video")return;let D=C.getSettings();if(!D)return;let W=g.maxBitrateK?g.maxBitrateK*1024:null,B=D.width,X=D.height,Se=B&&X&&g.maxDimension?Math.max(1,Math.max(B,X)/g.maxDimension):null,x=g.maxFramerate||null;if(B&&X&&g.maxDimension&&g.maxDimension>Math.max(B,X)){let me=Math.round(B*X/256),ke=(Math.round(me*us/1e4)+1)*1e4;W=W===null?ke:Math.min(ke,W)}let ve=g.degradationPreference||"balanced",fe=A[C.id];if(fe&&fe.bitrate===W&&fe.scaleResolutionDownBy===Se&&fe.maxFramerate===x&&fe.degradationPreference===ve){f[C.id]=fe;return}f[C.id]={bitrate:W,scaleResolutionDownBy:Se,maxFramerate:x,degradationPreference:ve};let Ee=T.getParameters();if(Ee.encodings||(Ee.encodings=[{}]),Ee.encodings.length>1&&B&&X&&g.maxDimension){let me=Math.round(g.maxDimension*1.35),ke=Math.max(B,X),It=li(B,X,g?.bitrates?.generic),jt=It.streams.length;d.log(`applyVideoTrackSettings: maxDim=${g.maxDimension} targetDim=${me} track=${B}x${X} sim=${JSON.stringify(It)}`),Ee.encodings.forEach((Ze,oi)=>{Ze.scaleResolutionDownBy=Bi(Ze.rid);let ba=Math.round(ke/Ze.scaleResolutionDownBy);oi<jt-1?Ze.active=ba<me:oi>=jt?Ze.active=!1:Ze.active=!0,oi<jt?Ze.maxBitrate=It.streams[oi].bitrate:Ze.maxBitrate=0,Ze.scalabilityMode=di})}else Ee.encodings.forEach(me=>{g?.scalabilityMode&&(me.scalabilityMode=g.scalabilityMode),W?me.maxBitrate=W:delete me.maxBitrate,Se?me.scaleResolutionDownBy=Se:delete me.scaleResolutionDownBy,x?me.maxFramerate=x:delete me.maxFramerate});if(Ee.degradationPreference=ve,Ee.encodings.length>0){T.setParameters?.(Ee).catch(ke=>{d.error("Failed to set sender parameters",Ee,ke)});let me=T.getParameters();d.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(me.encodings)}`)}}We.applyVideoTrackSettings=Li;function Dr(g,T){Array.isArray(T)||(T=[T]);for(let C of T)if(g.includes(C))return!0;return!1}We.includesOneOf=Dr;function Ta(g){return Object.entries(g.participantState?.state||{}).reduce((T,[C,A])=>(g.participantState&&(T[C]={ts:g.participantState.stateUpdateTs[C],state:A}),T),{})}We.mapParticipantState=Ta;function Ra(g){let T=g.map(C=>({uid:C.externalId,mediaSettings:C.mediaSettings,status:C.status,muteStates:C.muteStates,unmuteOptions:C.unmuteOptions,participantState:C.participantState,markers:C.markers,movieShareInfos:C.movieShareInfos,roles:C.roles}));return l.filterObservers?T.filter(C=>!C.uid.observer):T}We.mapSharedParticipants=Ra;function Ca(g,T){let C=Object.keys(g),A=Object.keys(T);if(C.length!==A.length)return!1;for(let f of C)if(!Object.hasOwn(A,f)||g[f].state!==T[f].state||g[f].ts!==T[f].ts)return!1;return!0}We.isEqualParticipantState=Ca;function wr(g,T,C=!1){let A=Object.keys(g),f=Object.keys(T);if(A.length!==f.length)return!1;for(let D of A){if(!Object.hasOwn(T,D))return!1;let W=g[D],B=T[D];if(C&&ge(W)&&ge(B))return wr(W,B,C);if(W!==B)return!1}return!0}We.isObjectsEquals=wr;function Pa(g,T){if(g.length!==T.length)return!1;for(let C of g)if(T.indexOf(C)<0)return!1;return!0}We.isArraysEquals=Pa;function ya(g){return!Object.keys(g).length}We.isEmptyObject=ya;function _e(g,T){if(!g&&!T)return 0;if(!g||!T)return g?-1:1;return A(T.rank,g.rank)||A(g.ts,T.ts)||C(g,T);function C(f,D){let W={[ae.USER]:0,[ae.GROUP]:1},{compositeUserId:B,deviceIdx:X}=te(f.id),{compositeUserId:Se,deviceIdx:x}=te(D.id),{id:ve,type:fe}=si(B),{id:Ee,type:me}=si(Se);return A(W[fe],W[me])||A(ve,Ee)||A(X,x)}function A(f,D){return f<D?-1:f===D?0:1}}We.participantMarkerCompare=_e;function F(g,T){let C=Object.entries(g).filter(([,A])=>Array.isArray(T)?!T.includes(A):A!==T);return Fa(C)}We.objectFilterOutValues=F;function re(g,T,C){let A=C;for(let f in g)Object.hasOwn(g,f)&&(A=T(A,g[f],f));return A}We.objectReduce=re,We.setImmediate=(()=>{let g=1,T={},C=null;return typeof MessageChannel<"u"&&(C=new MessageChannel,C.port1.onmessage=A=>{let f=A.data;T[f]&&(T[f](),delete T[f])}),function(A){if(C&&document.visibilityState==="hidden"){let D=g;return g=g>=Number.MAX_SAFE_INTEGER?1:g+1,T[D]=A,C.port2.postMessage(D),()=>{T[D]&&delete T[D]}}let f=setTimeout(A,0);return()=>clearTimeout(f)}})();function ge(g){return g!==null&&typeof g=="object"&&!Array.isArray(g)}We.isObject=ge;function at(g,T,C,A){function f(B,X){let Se=0,x=B.length,ve=!1;for(let fe=0;fe<B.length;fe++)if(!ve&&B[fe].startsWith("m=video")&&(Se=fe),B[fe].startsWith("a=mid:"+X)&&(ve=!0),ve&&B[fe].startsWith("m=")){x=fe;break}return{start:Se,end:x}}function D(B,X,Se,x,ve,fe,Ee){let me="a=rid:"+x+" send";for(let ke=X;ke<Se;ke++)if(B[ke]===me){let jt=me+" max-width="+fe+";max-height="+Ee+";max-br="+ve;B[ke]=jt}}let W=T?.sender;if(W&&W.track&&T.mid){let B=g.split(n),{start:X,end:Se}=f(B,T.mid),x=W.getParameters();if(x.encodings)return x.encodings.forEach(ve=>{let fe=ve.rid,Ee=ve.maxBitrate,me=ve.scaleResolutionDownBy;if(C&&A&&me){let ke=""+Math.round(C/me),It=""+Math.round(A/me);D(B,X,Se,fe,Ee,ke,It)}}),B.join(r)}return g}We.patchSimulcastAnswerSdp=at})(xr||(xr={}));var I=xr;var ja=(J=>(J.CALL_FINISH="call_finish",J.CODEC_USAGE="codec_usage",J.SIGNALING_CONNECTED="signaling_connected",J.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",J.FIRST_MEDIA_RECEIVED="first_media_received",J.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",J.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",J.CALL_START="call_start",J.SIGNALING_PING_SUMMARY="signaling_ping_summary",J.SIGNALING_COMMAND_SUMMARY="signaling_command_summary",J.WEBSOCKET_CONNECTED="websocket_connected",J.WEBSOCKET_RECONNECTED="websocket_reconnected",J.WEBSOCKET_FAILED_PINGS="websocket_failed_pings",J.WEBSOCKET_FAILED_EXCEPTION="websocket_failed_exception",J.WEBSOCKET_TIMEOUT="websocket_timeout",J.WEBSOCKET_RESTART="websocket_restart",J.WEBTRANSPORT_CONNECTED="webtransport_connected",J.WEBTRANSPORT_RECONNECTED="webtransport_reconnected",J.WEBTRANSPORT_FAILED_PINGS="webtransport_failed_pings",J.WEBTRANSPORT_FAILED_EXCEPTION="webtransport_failed_exception",J.WEBTRANSPORT_TIMEOUT="webtransport_timeout",J.WEBTRANSPORT_RESTART="webtransport_restart",J))(ja||{}),Y=ja;var hs=1e3;function le(n,r,e=0){return r in n&&n[r]?n[r]:e}function Nr(...n){return r=>{for(let e of n)if(e(r))return!0;return!1}}function mt(n,r){return e=>e[n]===r}function gs(n){return(r,e)=>e[n]-r[n]}function pi(n,r){return r.reduce((e,t)=>(e[t[n]]=t,e),{})}function Ha(n){let r={},e=[];for(let t of n)r[t.id]||(r[t.id]=!0,e.push(t));return e}function Ur(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])?Ur(e[1]):e[1],r),{})}function Ga(n){let r=[];for(let e of n)e.forEach(t=>r.push(t));return r}async function _s(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(Ga).then(Ha)}function Wa(n){let r=n.filter(mt("type","candidate-pair")).sort(gs("priority")).find(Nr(mt("nominated",!0),mt("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(mt("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(mt("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}}),Ur(e)}function Lr(n,r,e=!1){let t=pi("id",n),i=e?n.filter(Nr(mt("type","remote-inbound-rtp"))):n.filter(Nr(mt("type","inbound-rtp"),mt("type","outbound-rtp")));return y.browserName()==="Firefox"&&(i=Object.values(i.reduce((a,s)=>{if(!a[s.ssrc])a[s.ssrc]=s;else{let c=Object.assign({},a[s.ssrc],s),u=a[s.ssrc].isRemote?s:a[s.ssrc];c.id=u.id,c.type=u.type,delete c.isRemote,delete c.remoteId,a[c.ssrc]=c}return a},{}))),i.map(a=>{let s=Number(a.ssrc),c=a.mediaType||a.kind,u=a.remoteId||a.trackId,p=a.type,m=a.codecId;if(!p||!s||!c)return null;let h={ssrc:s,type:p,kind:c,bytesReceived: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 w=le(a,"framesDecoded"),V=le(a,"totalInterFrameDelay"),z=le(a,"totalSquaredInterFrameDelay"),oe=le(a,"encoderImplementation"),Te=le(a,"decoderImplementation");oe&&(h.encoderImplementation=oe),Te&&(h.decoderImplementation=Te),h.interframeDelayVariance=(z-V*V/w)/w}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 w=t[m];h.clockRate=w.clockRate,h.mimeType=w.mimeType,c==="audio"&&w.sdpFmtpLine&&(h.sdpFmtpLine=w.sdpFmtpLine)}if(u&&t[u]){let w=t[u];h.frameHeight=w.frameHeight,h.frameWidth=w.frameWidth,h.framesDecoded=w.framesDecoded,h.framesReceived=w.framesReceived,h.framesDropped=w.framesDropped}return Ur(h)}).filter(a=>!!a)}function Ka(n,r,e=!1){if(!r||!r.rtps||!n.rtps)return n;let t,i;e&&(t=pi("ssrc",n?.remoteRtps||[]),i=pi("ssrc",r?.remoteRtps||[]));let a=pi("ssrc",n.rtps),s=pi("ssrc",r.rtps),c=(n.timestamp-r.timestamp)/1e3;return!a||!s||Object.keys(a).forEach(u=>{let p=a[u],m=s[u];if(!(!p||!m)){if(p.bytesReceived&&p.bytesReceived>m.bytesReceived&&(p.bandwidth=Math.round((p.bytesReceived-m.bytesReceived)/c),p.bandwidth+=Math.round((p.headerBytesReceived-m.headerBytesReceived)/c)),p.bytesSent&&p.bytesSent>m.bytesSent&&(p.bandwidth=Math.round((p.bytesSent-m.bytesSent)/c),p.bandwidth+=Math.round((p.headerBytesSent-m.headerBytesSent)/c)),p.packetsReceived)if(p.packetsReceived>m.packetsReceived||p.packetsLost>m.packetsLost){let h=p.packetsLost-m.packetsLost,E=p.packetsReceived-m.packetsReceived;p.packetLoss=parseFloat((100*h/(h+E)).toFixed(2))}else p.packetLoss=0;if(p.freezeCount>m.freezeCount&&(p.freezeCountDelta=p.freezeCount-m.freezeCount),p.totalFreezesDuration>m.totalFreezesDuration){let h=p.totalFreezesDuration-m.totalFreezesDuration;p.totalFreezesDurationDelta=h}if(p.framesDropped&&m.framesDropped&&p.framesDropped>m.framesDropped&&(p.framesDroppedDelta=parseFloat(((p.framesDropped-m.framesDropped)/c).toFixed(0))),e&&p.type==="outbound-rtp"&&p.kind==="video"){let h=t?.[u],E=i?.[u],P=z=>z??0,w=Math.max(0,P(h?.packetsLost)-P(E?.packetsLost)),V=Math.max(1,p.packetsSent-m.packetsSent);n.transport.averageNetStat={currentRoundTripTime:(n.transport.currentRoundTripTime+r.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(w/V*100)}}}}),n}async function qa(n,r,e={},t=!1){let i=await _s(n),a={timestamp:Date.now(),transport:Wa(i),rtps:Lr(i,e)};return t&&(a.remoteRtps=Lr(i,e,!0)),r?Ka(a,r,t):(await I.delay(hs),qa(n,a,e,t))}function fs(n){performance.clearMarks(n),performance.mark(n)}function Ss(n){performance.clearMarks(n)}function vs(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 Is(n){return`${Y.SCREENSHARE_FIRST_FRAME}_${Es(n)}`}function Es(n){return typeof n=="string"?n:JSON.stringify(n)}var pe={distinctById:Ha,rtcStatsToArray:Ga,extractTransport:Wa,extractRtps:Lr,delta:Ka,collectStats:qa,setMark:fs,clearMark:Ss,measureMark:vs,getMarkNameScreenshareFirstFrame:Is};var $e=class $e{constructor(){o(this,"_eventualLogs",new Set)}static create(){$e._instance=new $e}static logCallStat(r){if($e._instance?._eventualLogs.size){for(let e of $e._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);$e._instance._eventualLogs.clear()}R.logClientStats(r)}static logEventualStat(r){r.value===void 0&&(r.value=pe.measureMark(r.name)),r.value!==null&&$e._instance?._eventualLogs.add(r)}static destroy(){$e._instance?._destroy(),$e._instance=null}_destroy(){this._eventualLogs.clear()}};o($e,"_instance",null);var ye=$e;var ji=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&&ye.logEventualStat({name:Y.SCREENSHARE_FIRST_FRAME,value:i,width:r,height:e})}};var Rs=65536,Br="MARK_SCREENSHARE_FREEZE_DURATION",Wt=class n{constructor(r,e,t){o(this,"_participantId");o(this,"_onStream");o(this,"_onStat");o(this,"_statScreenShareFirstFrame");o(this,"_chunks",[]);this._participantId=r,this._onStream=e,this._onStat=t,this._statScreenShareFirstFrame=new ji(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)%Rs!==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(Br),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 Ts(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(Br);return}let e=pe.measureMark(Br);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Ct=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 Kt=class extends Ct{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;e instanceof ImageBitmap?i=e:i=await createImageBitmap(e,0,0,e.width,e.height),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)&&!(y.browserName()==="Safari"&&Number(y.browserVersion())===15)&&!(y.browserName()==="Firefox"&&Number(y.browserVersion())<60)}};var Pt=class extends Ct{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&&et.isBrowserSupported()}};var qt=class extends Wt{constructor(e,t,i){super(e,t,i);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}]`),Pt.isBrowserSupported()?this._renderer=new Pt(t):this._renderer=new Kt(t),et.isBrowserSupported()?this._decoder=new et:this._decoder=new Tt;let a=async c=>{this._decoderBusy=!1,"VideoFrame"in window&&c instanceof VideoFrame?await this._renderer.drawFrame(c):await this._renderer.drawImage(c),this._fpsMeter.increment(),this._decodeQueue()},s=c=>{this._decoderBusy=!1,this._decodeQueue()};this._decoder.init(a,s).then(()=>{this._decoderReady=!0,this._decodeQueue()}),this._fpsMeter=new Rt(c=>d.log(`[StreamBuilder][${e}] fps: ${c}`),2e4)}_processFrame(e){e.keyframe&&(this._decoderQueue=[]),this._decoderQueue.push(e),this._decodeQueue()}_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 Kt.isBrowserSupported()||Pt.isBrowserSupported()}};function $a(n,r,e,t,i,a,s){let c=0;r&&(c|=1),e&&(c|=2),t&&(c|=4),s||(c|=8);let u=new ArrayBuffer(11),p=new DataView(u);if(p.setUint8(0,1),p.setUint16(1,i),p.setUint32(3,n),p.setUint8(7,a?1:0),p.setUint16(8,0),p.setUint8(10,c),!s)return u;let m=new Uint8Array(u.byteLength+s.byteLength);return m.set(new Uint8Array(u),0),m.set(new Uint8Array(s),u.byteLength),m.buffer}function za(n){let r=new DataView(n),e=r.getUint8(0),t=r.getUint16(1),i=r.getUint32(3),a=r.getUint8(7)===1,s=r.getUint16(8),c=r.getUint8(10),u=!!(c&1),p=!!(c&2),m=!!(c&4),h=!!(c&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:i,start:u,end:p,keyframe:m,sequence:t,isVP9:a,ssrc:s,eos:h,data:n.slice(11)}}function Ja(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 Ya(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}}import*as O from"simple-ebml-builder";var Cs=2**15-1,Fr=1,Ps=5,ys=5;var Vr=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)-Ps);i-t>ys&&(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}},yt=class n extends Wt{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(Fr)),O.element(O.ID.TrackUID,O.number(Fr)),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 Vr(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>Cs&&(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(Fr),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 bt=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=za(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=s=>this._onStream(t,s);l.screenShareWebmBuilder&&yt.isBrowserSupported()?i=new yt(t,a,this._onStat):i=new qt(t,a,this._onStat),this._streamBuilders[t]=i}i.appendChunk(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(et.isBrowserSupported()||Tt.isBrowserSupported())&&(qt.isBrowserSupported()||yt.isBrowserSupported())}};var jr=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}},ui=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 jr(e,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(r){this._tail&&(this._tail.next=r._head),this._head||(this._head=r._head),this._tail=r._tail,this._length+=r._length,r.clear()}shift(){if(!this._length||!this._head)return null;let r=this._head;return this._head=r.next,this._head&&(r.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),r.data}bisect(){if(this.length){let r=this.length>1?Math.floor(this.length/2):1;for(let e=0;e<r;e++)this.shift()}}head(){return this._head?.data||null}tail(){return this._tail?.data||null}clear(){this._head=null,this._tail=null,this._length=0}toString(){let r=[],e=this._head;for(;e!==null;)r.push(e.data),e=e.next;return r.length?JSON.stringify(r,(t,i)=>i instanceof Error?String(i):i):""}};import Qa from"@vkontakte/libvpx";var bs=1e3,$t=class extends Ke{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})},[Qa,Qa.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)},bs),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")}static isBrowserSupported(){return"WebAssembly"in window&&"Worker"in window&&("CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window)}};var Mt=class extends Ke{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 Ms=2100,As=600,Ds=1.2,Xa=.8,ws=2e3,ks=8e3,Hr=8e3,Os=16e3,xs=4,Ns=2e3,Hi=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(Hi||{}),mi=class{constructor(r,e,t,i,a,s,c){o(this,"_onCongestion");o(this,"_ccEnabled");o(this,"_fastSharing");o(this,"_trendDelayThreshold");o(this,"_highDelayThreshold");o(this,"_targetFps");o(this,"_minBitrate");o(this,"_maxBitrate");o(this,"_targetBitrate");o(this,"_lastDown");o(this,"_lastUp");o(this,"_lastProbing");o(this,"_lastCheckDelay");o(this,"_upPenalty",0);o(this,"_probing");o(this,"_delayAvgShort",-1);o(this,"_delayAvgLong",-1);o(this,"_minDelay",Number.MAX_VALUE);o(this,"_maxDelay",0);o(this,"_largeDelayDuration",0);o(this,"_lastFpsCalcMs");o(this,"_frames",0);o(this,"_fps",0);this._onCongestion=r,this._ccEnabled=i,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=a,this._targetFps=c,s>0?this._highDelayThreshold=s:this._highDelayThreshold=Ms,a&&(this._highDelayThreshold=As),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let u=Date.now();this._lastDown=0,this._lastUp=u,this._lastProbing=u,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(r,e,t){let i=Date.now();if(this._calcFps(i),this._calcDelay(e,i),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let a=0,s=this._delayAvgShort-this._delayAvgLong,c=Math.round(Math.abs(s)*100/this._delayAvgLong),u=s>40&&c>30&&this._delayAvgShort>this._trendDelayThreshold,p=this._delayAvgShort>this._highDelayThreshold;u||p?a=2:Math.abs(s)<40&&c<10&&!p&&(a=1);let m=Math.round(this._targetBitrate/1e3),h=t;r%20===0&&d.debug(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Hi[a]} tr=${m} br=${t}`);let E=i-this._lastDown;if(a===2&&E>ws){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,xs),this._probing=!1);let oe=Xa*h*1e3;if(oe>=this._targetBitrate&&(oe=this._targetBitrate*Xa),oe=Math.max(oe,this._minBitrate),oe<this._targetBitrate){let Te=Math.round(oe/1e3),Ae=Math.round(this._upPenalty*Hr/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Hi[a]}`),d.log(`#${r}: cc: DOWN delay=${e} bitrate=${h} target=${m} -> newBitrate=${Te} penalty=${Ae}s`),this._setBitrate(oe,!0),this._targetBitrate=oe}this._lastDown=i}let P=i-this._lastUp,w=ks+this._upPenalty*Hr;if(a===1&&P>w&&E>w){let oe=Math.min(this._targetBitrate*Ds,this._maxBitrate);if(oe>this._targetBitrate){let Te=Math.round(oe/1e3),Ae=Math.round(this._targetBitrate/1e3),ee=Math.round(this._upPenalty*Hr/1e3);d.log(`#${r}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${c} -> ${Hi[a]}`),d.log(`#${r}: cc: UP bitrate=${h} target=${Ae} -> newBitrate=${Te} penalty=${ee}s`),this._setBitrate(oe,!1),this._targetBitrate=oe,this._probing=!0,this._lastProbing=i,this._lastUp=i}}let V=i-this._lastProbing;this._probing&&V>Os&&(this._probing=!1);let z=i-this._lastDown;this._upPenalty>0&&z>3*w&&(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>Ns){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 hi=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 Gr=65536,Us=50,Bs=400,Fs=1e6,Vs=3e5,js=3e4,Hs=2e3,Gs=5,Gi=0,At=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 hi(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 ui);o(this,"_fpsMeter");o(this,"_maxFrameDelay");d.debug("ScreenCaptureSender started"),this.DATA_SIZE=l.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=i,this._congestionControlEnabled=l.screenShareCongestionControl||this._fastSharing,this._width=r.getSettings().width,this._height=r.getSettings().height,this._maxFrameDelay=this._fastSharing?l.screenShareCongestionControlThreshold:l.screenShareCongestionControlThreshold*2;let a=l.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:c}=this._calcMinMaxBitrate(this._width,this._height),u=this._onCongestionCallback.bind(this);d.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(c/1e3)}k delayThreshold=${l.screenShareCongestionControlThreshold}`),this._congestionControl=new mi(u,s,c,this._congestionControlEnabled,this._fastSharing,l.screenShareCongestionControlThreshold,a);let p=(m,h)=>{if(this._destroyed)return;if(!m){d.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),this._needKeyframe=!0,this._handleQueue();return}(m.width!==this._width||m.height!==this._height)&&(this._width=m.width,this._height=m.height,this._onResize(this._width,this._height));let E=this._sliceFrame(m);this._queue.merge(E),this._handleQueue(),this._sendSharingStat()};if(Mt.isBrowserSupported()){let m=this._fastSharing;this._encoder=new Mt(r,p,this._congestionControlEnabled,c,m,a)}else this._encoder=new $t(r,p,this._congestionControlEnabled,c);this._datachannel.onmessage=m=>{Ja(m.data)&&(d.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Ya(m.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(m=>d.warn("ScreenCaptureSender init failed",m)),this._fpsMeter=new Rt(m=>d.log(`[ScreenCaptureSender] fps: ${m}`),5e3)}_handleQueue(){if(this._destroyed)return;let r=this._queue.shift();if(!r){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+Gr)%Gr>Gs&&this._lastFrameDelay>this._maxFrameDelay){let i=Date.now();i-this._lastFramerateReduced>Hs&&(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 ui;for(let a=0;a<t;a+=this.DATA_SIZE){let s=r.data.slice(a,a+this.DATA_SIZE),c=a===0,u=t<=a+s.byteLength,p=this._wrapHeader(r.timestamp,c,u,e,s);i.push({data:p.data,sequence:p.sequence,frameSize:t,isFirst:c,isLast:u,isKey:e,timestamp:r.timestamp})}return i}_wrapHeader(r,e,t,i,a){let s=$a(r,e,t,i,Gi,this._encoder.isVP9(),a),c={sequence:Gi,data:s};return Gi=(Gi+1)%Gr,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 Mt.isBrowserSupported()||$t.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(Vs,Math.min(Fs,Math.round(t*Us))),a=Math.round(t*Bs);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>js){let t=this._congestionControl.getStat();t!==null&&(d.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=r}}};var Fe=class Fe{static get sessionKey(){return Fe._sessionKey}static set sessionKey(r){Fe._sessionKey=r}static get sessionSecretKey(){return Fe._sessionSecretKey}static set sessionSecretKey(r){Fe._sessionSecretKey=r}static get accessToken(){return Fe._accessToken}static set accessToken(r){Fe._accessToken=r}static isEmpty(){return!Fe._sessionKey}};o(Fe,"_sessionKey"),o(Fe,"_sessionSecretKey"),o(Fe,"_accessToken");var be=Fe;var _=class _{static set(r){Object.hasOwn(r,"voiceParams")&&(Object.assign(_._params.voiceParams,r.voiceParams),delete r.voiceParams),Object.hasOwn(r,"specListenerParams")&&(Object.assign(_._params.specListenerParams,r.specListenerParams),delete r.specListenerParams),Object.hasOwn(r,"apiAuth")&&(be.accessToken=r.apiAuth.accessToken,be.sessionKey=r.apiAuth.sessionKey,be.sessionSecretKey=r.apiAuth.sessionSecretKey),Object.assign(_._params,I.objectFilterOutValues(r,void 0))}static get(r){return _._params[r]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.6-dev.164b8e60.0"}static get debug(){return _._params.debug}static get protocolVersion(){return _._params.joinFromMultipleDevices?6:5}static get platform(){return _._params.platform}static set platform(r){_._params.platform=r}static get clientStatsPlatform(){return _._params.clientStatsPlatform}static set clientStatsPlatform(r){_._params.clientStatsPlatform=r}static get clientType(){return _._params.clientType}static set clientType(r){_._params.clientType=r}static get externalUserType(){return _._params.externalUserType}static set externalUserType(r){_._params.externalUserType=r}static get device(){return _._params.device}static get apiKey(){return _._params.apiKey}static get apiEnv(){return _._params.apiEnv}static get apiBaseUrl(){return _._params.apiBaseUrl}static set apiBaseUrl(r){_._params.apiBaseUrl=r}static apiEndpoint(r){switch(r??_.apiEnv){case"AUTO":case"PROD":return"https://api.mycdn.me";case"CALLS":return"https://calls.okcdn.ru";case"PROD_OK":return"https://api.ok.ru";case"TEST":return"https://apitest.ok.ru/api";case"VIDEOTEST":return"https://videotestapi.ok.ru/api";case"CALLSTEST":return"https://calls-test.okcdn.ru/api";default:return _._params.apiEnv}}static get authToken(){return _._params.authToken}static set authToken(r){_._params.authToken=r}static get anonymToken(){return _._params.anonymToken}static set anonymToken(r){_._params.anonymToken=r}static get domain(){return _._params.domain}static get externalDomain(){return _._params.externalDomain}static get iceServers(){return _._params.iceServers}static set iceServers(r){_._params.iceServers=r}static get wssBase(){return _._params.wssBase}static set wssBase(r){_._params.wssBase=r}static get wtsBase(){return _._params.wtsBase}static set wtsBase(r){_._params.wtsBase=r}static get wssToken(){return _._params.wssToken}static set wssToken(r){_._params.wssToken=r}static get signalingReconnectDelay(){return _._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return _._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return _._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return _._params.waitConnectionDelay}static get waitResponseDelay(){return _._params.waitResponseDelay}static get waitMessageDelay(){return _._params.waitMessageDelay}static get waitAnotherTabDelay(){return _._params.waitAnotherTabDelay}static get debugLog(){return _._params.debugLog}static get forceRelayPolicy(){return _._params.forceRelayPolicy}static set forceRelayPolicy(r){_._params.forceRelayPolicy=r}static get videoMinWidth(){return _._params.videoMinWidth}static get videoMaxWidth(){return _._params.videoMaxWidth}static set videoMaxWidth(r){_._params.videoMaxWidth=r}static get videoMinHeight(){return _._params.videoMinHeight}static get videoMaxHeight(){return _._params.videoMaxHeight}static set videoMaxHeight(r){_._params.videoMaxHeight=r}static get videoAspectRatio(){return _._params.videoAspectRatio}static get videoFrameRate(){return _._params.videoFrameRate}static get videoFacingMode(){return _._params.videoFacingMode||(y.isMobile()?"user":null)}static set videoFacingMode(r){_._params.videoFacingMode=r}static get displaySurface(){return _._params.displaySurface}static get audioEffects(){return _._params.audioEffects}static set audioEffects(r){_._params.audioEffects=r,_._params.audioEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffects(){return _._params.videoEffects}static set videoEffects(r){_._params.videoEffects=r,_._params.videoEffects?.setLogger((e,...t)=>d.send(e,...t))}static get videoEffectMaxWidth(){return _._params.videoEffectMaxWidth}static set videoEffectMaxWidth(r){_._params.videoEffectMaxWidth=r}static get videoEffectMaxHeight(){return _._params.videoEffectMaxHeight}static set videoEffectMaxHeight(r){_._params.videoEffectMaxHeight=r}static get vmoji(){return _._params.vmoji?.isBrowserSupported()?_._params.vmoji:null}static set vmoji(r){_._params.vmoji=r}static get vmojiOptions(){return _._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(r){_._params.vmojiOptions=r}static get voiceParams(){return _._params.voiceParams}static get specListenerParams(){return _._params.specListenerParams}static get iceRestartWaitTime(){return _._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return _._params.transportConnectionWaitTime}static get statisticsInterval(){return _._params.statisticsInterval}static set statisticsInterval(r){_._params.statisticsInterval=r}static get networkStatisticsInterval(){return _._params.networkStatisticsInterval}static get perfStatReportEnabled(){return _._params.perfStatReportEnabled}static get callStatReportEnabled(){return _._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return _._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return _._params.enableLogPerfStatReport}static get producerNotificationDataChannel(){return _._params.producerNotificationDataChannel}static get producerCommandDataChannel(){return _._params.producerCommandDataChannel}static get consumerScreenDataChannel(){return _._params.consumerScreenDataChannel&&At.isBrowserSupported()}static get producerScreenDataChannel(){return _._params.producerScreenDataChannel&&_.producerNotificationDataChannel&&bt.isBrowserSupported()}static get asrDataChannel(){return _._params.asrDataChannel&&_.producerNotificationDataChannel}static get consumerScreenDataChannelPacketSize(){return _._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return _._params.screenShareWebmBuilder}static get noiseSuppression(){return _._params.noiseSuppression}static set noiseSuppression(r){_._params.noiseSuppression=r}static get preferH264(){return _._params.preferH264}static get preferVP9(){return _._params.preferVP9}static get audioNack(){return _._params.audioNack}static get consumerScreenTrack(){return _._params.consumerScreenTrack&&_.consumerScreenDataChannel}static get producerScreenTrack(){return _._params.producerScreenTrack}static get movieShare(){return _._params.movieShare&&_.videoTracksCount>0}static get videoTracksCount(){return _.producerNotificationDataChannel?Number(_._params.videoTracksCount):0}static get breakVideoPayloadTypes(){return _._params.breakVideoPayloadTypes}static get useCallsToContacts(){return _._params.useCallsToContacts}static get useParticipantListChunk(){return _._params.useParticipantListChunk&&_.videoTracksCount>0}static get useRooms(){return _._params.useRooms}static get useChatRooms(){return _._params.useChatRooms}static get addParticipant(){return _._params.addParticipant}static get participantListChunkInitIndex(){return _._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return _._params.participantListChunkInitCount??null}static get serverAudioRed(){return _._params.serverAudioRed}static get p2pAudioRed(){return _._params.p2pAudioRed}static get h264spsPpsIdrInKeyframe(){return _._params.h264spsPpsIdrInKeyframe}static get filterObservers(){return _._params.filterObservers}static get muteMode(){return _._params.muteMode}static get preserveAudioTracks(){return _._params.preserveAudioTracks}static get audioShare(){return y.isAudioShareSupported()&&_._params.audioShare}static get fastScreenShare(){return _._params.fastScreenShare}static get screenShareCongestionControl(){return _._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return _._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return _._params.fastScreenShareWidth}static get fastScreenShareHeight(){return _._params.fastScreenShareHeight}static get newMuteRules(){return _._params.newMuteRules}static get videoSuspend(){return _._params.videoSuspend}static get enumerateDevicesDelay(){return _._params.enumerateDevicesDelay}static getScreenFrameRate(r){return r?_._params.fastScreenShareFrameRate:_._params.screenFrameRate}static get switchVideoAtBadNetwork(){return _._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return _._params.enableVideoEffectsFpsDegradation}static get simulcast(){return _._params.simulcast}static set simulcast(r){_._params.simulcast=r}static get webtransport(){return _._params.webtransport}static set webtransport(r){_._params.webtransport=r}static get webtransportFF(){return _._params.webtransportFF}static set webtransportFF(r){_._params.webtransportFF=r}static toJSON(){return{apiKey:_._params.apiKey,apiEnv:_._params.apiEnv,audioShare:_._params.audioShare,useCallsToContacts:_._params.useCallsToContacts,useParticipantListChunk:_._params.useParticipantListChunk,useRooms:_._params.useRooms,useChatRooms:_._params.useChatRooms,addParticipant:_._params.addParticipant,fastScreenShare:_._params.fastScreenShare,participantListChunkInitCount:_._params.participantListChunkInitCount,screenShareCongestionControl:_._params.screenShareCongestionControl,screenShareCongestionControlThreshold:_._params.screenShareCongestionControlThreshold,videoTracksCount:_._params.videoTracksCount,asrDataChannel:_._params.asrDataChannel,videoMaxHeight:_._params.videoMaxHeight,videoMaxWidth:_._params.videoMaxWidth,videoEffectMaxHeight:_._params.videoEffectMaxHeight,videoEffectMaxWidth:_._params.videoEffectMaxWidth,videoSuspend:_._params.videoSuspend,debugLog:_._params.debugLog,callStatReportEnabled:_._params.callStatReportEnabled,joinFromMultipleDevices:_._params.joinFromMultipleDevices,movieShare:_._params.movieShare,newMuteRules:_._params.newMuteRules,clientType:_._params.clientType,clientStatsPlatform:_._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:_._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:_._params.switchVideoAtBadNetwork,simulcast:_._params.simulcast,webtransport:_._params.webtransport,webtransportFF:_._params.webtransportFF}}};o(_,"_params",{platform:"WEB",clientStatsPlatform:"",clientType:"PORTAL",externalUserType:"",device:"browser",apiKey:"",authToken:"",anonymToken:"",apiEnv:"AUTO",apiBaseUrl:null,domain:"",externalDomain:"",iceServers:[],wssBase:"",wtsBase:"",wssToken:"",signalingReconnectDelay:1e3,signalingReconnectMaxDelay:5e3,signalingReconnectMaxCount:10,waitConnectionDelay:1e4,waitResponseDelay:1e4,waitMessageDelay:15e3,waitAnotherTabDelay:200,debugLog:!1,debug:!1,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:!0,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,fastScreenShareFrameRate:24,fastScreenShareWidth:1280,fastScreenShareHeight:720,newMuteRules:!1,videoSuspend:!1,enumerateDevicesDelay:2e3,switchVideoAtBadNetwork:!1,enableVideoEffectsFpsDegradation:!1,simulcast:!1,webtransport:!1,webtransportFF:!1});var l=_;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 Re(n){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},n||{})}var en=n=>n.stop(),gi=n=>n.getTracks().forEach(en),tn=n=>n.getVideoTracks().forEach(en);async function Wi(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 Ki=class extends ne{constructor(){super(...arguments);o(this,"FPS_LIMITS",[13,20,Math.max(l.videoFrameRate,25)]);o(this,"THRESHOLD",.8);o(this,"HISTORY_LENGTH",10);o(this,"_fpsMeterUnsubscribe",null);o(this,"_fpsHistory",{cursor:0,arr:[]});o(this,"_fpsLimitCursor",this.FPS_LIMITS.length-1)}get fpsLimit(){return this.FPS_LIMITS[this._fpsLimitCursor]}watch(e){this._cleanup();try{e&&(this._assertsVideoEffect(e),this._fpsMeterUnsubscribe=e.addFpsMeterListener(this._handleFpsMeter.bind(this)))}catch(t){d.warn("VideoEffectsFpsLimiter error",t)}}_handleFpsMeter(e){if(this._fpsHistory.arr[this._fpsHistory.cursor]=e,this._fpsHistory.cursor=(this._fpsHistory.cursor+1)%this.HISTORY_LENGTH,this._fpsHistory.arr.length===this.HISTORY_LENGTH&&this._fpsLimitCursor){let t=this._fpsHistory.arr.reduce((a,s)=>a+s,0)/this.HISTORY_LENGTH,i=this.FPS_LIMITS[this._fpsLimitCursor];t<i*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),i!==this.fpsLimit&&this._triggerEvent("fps-limit",this.fpsLimit)}}_assertsVideoEffect(e){if(!("addFpsMeterListener"in e))throw new Error("Outdated VideoEffect version")}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}};var qe=(i=>(i.audio="audio",i.video="video",i.screen="screen",i.audioshare="audioshare",i))(qe||{});var qi=class extends ne{constructor(){super();o(this,"_stream",null);o(this,"_screenTrack",null);o(this,"_audioShareTrack",null);o(this,"_sendVideoTrack",null);o(this,"_cameraVideoTrack",null);o(this,"_micAudioTrack",null);o(this,"_audioEffectsTrack",null);o(this,"_mediaSettings",Re());o(this,"_videoStatusOnScreenCapturingEnabled",!1);o(this,"_effect",null);o(this,"_audioEffectParams",null);o(this,"_onDeviceChange");o(this,"_animojiEnabled",!1);o(this,"_videoEffectsFpsLimiter");o(this,"videoTrackMuteHandler",()=>{this._mediaSettings.isVideoEnabled&&this.toggleVideo(!0)});this._initDeviceChangeListener(),l.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),l.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new Ki,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)}async request(e=[de.AUDIO],t=!0){if(this._stream)return;let i=e.includes(de.VIDEO),a=e.includes(de.AUDIO),s=e.includes(de.ANIMOJI);if(!y.isBrowserSupported())throw new G(se.UNSUPPORTED);try{this._stream=await y.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 G(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&&tn(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=y.getSavedMicrophone(),i=y.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{}},y.addEventListener("devicechange",this._onDeviceChange))}_destroyDeviceChangeListener(){this._onDeviceChange&&y.removeEventListener("devicechange",this._onDeviceChange)}async _changeVideoInput(e){try{let t=e?"stream":"video",i=e||await y._getUserVideo(!!this._effect,this._frameRate);if(this.cameraVideoTrack?.stop(),this.cameraVideoTrack=i.getVideoTracks()[0],!this._stream)gi(i);else{l.consumerScreenTrack||await this._disableScreenCapture();let a=await this._setEffect(this._effect,this.cameraVideoTrack);R.log(M.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(M.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 y.getUserAudio();if(this._micAudioTrack?.stop(),this._micAudioTrack=t.getAudioTracks()[0],!this._stream)gi(t);else{let i=await this._applyAudioEffect();R.log(M.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(M.ERROR,"change_audio"),d.error("Microphone change failed",t),t}}async _changeScreen(e,t,i){try{if(i=i||await y.getScreenMedia(e,t),!this._stream)gi(i);else{let a=i.getVideoTracks()[0];if(a.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),l.consumerScreenTrack||this._stopEffect(),R.log(M.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?y.getBlackMediaTrack(l.videoMinWidth,l.videoMinHeight):a,await this._replaceLocalTrack(a,this._sendVideoTrack)),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(M.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),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=y.getSilentMediaTrack();return e.contentHint="music",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&&(gi(this._stream),this._stream=null),this.cameraVideoTrack?.stop(),this._micAudioTrack?.stop(),this._audioEffectsTrack?.stop(),this._disableScreenCapture(),y.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 y._getUserVideo(!!this._effect,this._frameRate);this.cameraVideoTrack=i.getVideoTracks()[0],t=await this._setEffect(this._effect,this.cameraVideoTrack)}else t=y.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 y.getUserAudio();this._micAudioTrack=i.getAudioTracks()[0],t(await this._applyAudioEffect(),!0)}catch(i){throw l.audioEffects?.pause(),t(y.getSilentMediaTrack(),!1),typeof i=="string"?new Error(i):i}else l.audioEffects?.pause(),t(y.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(M.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 Wi(e,{width:this._effect?l.videoEffectMaxWidth:l.videoMaxWidth,height:this._effect?l.videoEffectMaxHeight:l.videoMaxHeight,...this._frameRate&&{frameRate:{ideal:this._frameRate}},...t})}};var _i=class{constructor(){o(this,"_cameraPermissionStatus");o(this,"_microphonePermissionStatus");o(this,"_listener")}static isSupported(){return y.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 Kr=(u=>(u.WAITING_HALL="WAITING_HALL",u.WAITING="WAITING",u.CONNECTING="CONNECTING",u.CONNECTED="CONNECTED",u.RECONNECT="RECONNECT",u.ERROR="ERROR",u.HANGUP="HANGUP",u.PERMISSIONS="PERMISSIONS",u))(Kr||{});function j(n,...r){let e=l.get(n);typeof e=="function"&&setTimeout(e,0,...r)}function he(n,r,...e){if(l.filterObservers){if(Array.isArray(r)){if(r=r.filter(t=>!t.observer),!r.length)return}else if(r.observer)return}j(n,r,...e)}function Ce(n){return Object.assign({},n)}function wt(n){return n.slice()}var Wr;(Ec=>{function n(S,b){j("onLocalStream",S,Ce(b))}Ec.onLocalStream=n;function r(S,b){j("onScreenStream",S,Ce(b))}Ec.onScreenStream=r;function e(S,b){j("onVmojiStream",S,Ce(b))}Ec.onVmojiStream=e;function t(S){j("onVmojiError",S)}Ec.onVmojiError=t;function i(S,b){j("onLocalStreamUpdate",Ce(S),b)}Ec.onLocalStreamUpdate=i;function a(S){d.debug("Local status:",S),j("onLocalStatus",S)}Ec.onLocalStatus=a;function s(S,b){he("onRemoteStream",S,b)}Ec.onRemoteStream=s;function c(S,b){he("onRemoteLive",S,b)}Ec.onRemoteLive=c;function u(S,b){he("onLocalLive",S,b)}Ec.onLocalLive=u;function p(S,b){he("onRemoteLiveUpdate",S,b)}Ec.onRemoteLiveUpdate=p;function m(S,b){he("onLocalLiveUpdate",S,b)}Ec.onLocalLiveUpdate=m;function h(S,b){he("onRemoteScreenStream",S,b)}Ec.onRemoteScreenStream=h;function E(S,b){he("onRemoteVmojiStream",S,b)}Ec.onRemoteVmojiStream=E;function P(S,b,K){he("onRemoteStreamSuspended",S,b,K)}Ec.onRemoteStreamSuspended=P;function w(S,b,K,Le,Et){he("onConversation",S,Ce(b),Ce(K),Le,Et)}Ec.onConversation=w;function V(S){S&&j("onConversationParticipantListChunk",S)}Ec.onConversationParticipantListChunk=V;function z(S,b,K){he("onRemoteMediaSettings",S,Ce(b),K)}Ec.onRemoteMediaSettings=z;function oe(S,b){he("onLocalMediaSettings",S,Ce(b))}Ec.onLocalMediaSettings=oe;function Te(S,b,K){he("onRemoteSharedMovieInfo",S,Ce(b),K)}Ec.onRemoteSharedMovieInfo=Te;function Ae(S,b,K){he("onRemoteSharedMovieStoppedInfo",S,Ce(b),K)}Ec.onRemoteSharedMovieStoppedInfo=Ae;function ee(S,b,K){he("onLocalSharedMovieInfo",S,Ce(b),K)}Ec.onLocalSharedMovieInfo=ee;function De(S,b,K){he("onLocalSharedMovieStoppedInfo",S,Ce(b),K)}Ec.onLocalSharedMovieStoppedInfo=De;function J(S,b,K){he("onRemoteSharedUrl",S,b,K)}Ec.onRemoteSharedUrl=J;function ni(S,b){he("onParticipantAdded",S,b)}Ec.onParticipantAdded=ni;function _a(S,b,K){he("onParticipantJoined",S,b,K)}Ec.onParticipantJoined=_a;function fa(S,b=!1){j("onLocalParticipantState",Ce(S),b)}Ec.onLocalParticipantState=fa;function si(S,b,K){he("onRemoteParticipantState",S,Ce(b),K)}Ec.onRemoteParticipantState=si;function te(S,b){j("onRemoteParticipantsState",S,b)}Ec.onRemoteParticipantsState=te;function Sa(S,b,K=null){d.debug("Remote status:",b,S),he("onRemoteStatus",S,b,K)}Ec.onRemoteStatus=Sa;function ie(){j("onPermissionsRequested")}Ec.onPermissionsRequested=ie;function va(S,b){j("onPermissionsError",S,b)}Ec.onPermissionsError=va;function Ia(S,b){he("onRemoteRemoved",S,b)}Ec.onRemoteRemoved=Ia;function Ea(S,b,K){j("onCallState",S,b,Ce(K))}Ec.onCallState=Ea;function Li(S,b){j("onDeviceSwitched",S,b)}Ec.onDeviceSwitched=Li;function Dr(S,b,K,Le=!1,Et=!1,kr=null,Or=null,ss,Ma,os=null){let cs=Ma?wt(Ma):void 0;j("onMuteStates",Ce(S),wt(b),wt(K),Le,Et,kr,Or,ss,cs,os)}Ec.onMuteStates=Dr;function Ta(S,b,K=!1){he("onRolesChanged",S,wt(b),K)}Ec.onRolesChanged=Ta;function Ra(S,b=!1){j("onLocalRolesChanged",wt(S),b)}Ec.onLocalRolesChanged=Ra;function Ca(S,b,K,Le){he("onPinnedParticipant",S,b,K,Le)}Ec.onPinnedParticipant=Ca;function wr(S,b){j("onLocalPin",S,b)}Ec.onLocalPin=wr;function Pa(S){j("onOptionsChanged",wt(S))}Ec.onOptionsChanged=Pa;function ya(){j("onCallAccepted")}Ec.onCallAccepted=ya;function _e(S,b){he("onAcceptedCall",S,b)}Ec.onAcceptedCall=_e;function F(){j("onRateNeeded")}Ec.onRateNeeded=F;function re(S){he("onSpeakerChanged",S)}Ec.onSpeakerChanged=re;function ce(S){j("onVolumesDetected",wt(S))}Ec.onVolumesDetected=ce;function ge(S,b){j("onLocalVolume",S,b)}Ec.onLocalVolume=ge;function at(S,b){j("onJoinStatus",S,b)}Ec.onJoinStatus=at;function We(S,b){j("onHangup",S,b)}Ec.onHangup=We;function g(S){j("onMultipartyChatCreated",Ce(S))}Ec.onMultipartyChatCreated=g;function T(){j("onDeviceChange")}Ec.onDeviceChange=T;function C(S){j("onFingerprintChange",S)}Ec.onFingerprintChange=C;function A(){j("onTokenExpired")}Ec.onTokenExpired=A;function f(S,b,K=!1){j("onChatMessage",S,b,K)}Ec.onChatMessage=f;function D(S,b,K=!1){j("onCustomData",S,b,K)}Ec.onCustomData=D;function W(S,b,K,Le,Et,kr,Or=null){j("onRecordStarted",S,b,K,Le,Et,kr,Or)}Ec.onRecordStarted=W;function B(S=null,b){j("onRecordStopped",S,b)}Ec.onRecordStopped=B;function X(S){j("onLocalNetworkStatusChanged",S)}Ec.onLocalNetworkStatusChanged=X;function Se(S){j("onNetworkStatusChanged",S)}Ec.onNetworkStatusChanged=Se;function x(S,...b){j("onDebugMessage",S,...b)}Ec.onDebugMessage=x;function ve(S,b){let K=Object.assign({},S,{memory:b});j("onStatistics",K)}Ec.onStatistics=ve;function fe(){j("onAutoplayError")}Ec.onAutoplayError=fe;function Ee(S,b,K,Le,Et){j("onChatRoomUpdated",S,b,K,Le,Et)}Ec.onChatRoomUpdated=Ee;function me(S){j("onPromoted",S)}Ec.onPromoted=me;function ke(S){j("onRemoteMixedAudioStream",S)}Ec.onRemoteMixedAudioStream=ke;function It(S){j("onJoinLinkChanged",S)}Ec.onJoinLinkChanged=It;function jt(S){j("onRoomsUpdated",S)}Ec.onRoomsUpdated=jt;function Ze(S,b,K,Le){j("onRoomUpdated",S,b,K,Le)}Ec.onRoomUpdated=Ze;function oi(S){j("onRoomParticipantsUpdated",S)}Ec.onRoomParticipantsUpdated=oi;function ba(S){j("onRoomSwitched",S)}Ec.onRoomSwitched=ba;function cc(S){j("onRoomStart",S)}Ec.onRoomStart=cc;function dc(S,b=null){j("onFeedback",S,b)}Ec.onFeedback=dc;function lc(S){j("onFeaturesPerRoleChanged",S)}Ec.onFeaturesPerRoleChanged=lc;function pc(S){j("onParticipantVmojiUpdate",S)}Ec.onParticipantVmojiUpdate=pc;function uc(S,b){j("onAsrSet",S,b)}Ec.onAsrSet=uc;function mc(S,b,K){j("onAsrStarted",S,b,K)}Ec.onAsrStarted=mc;function hc(S){j("onAsrStopped",S)}Ec.onAsrStopped=hc;function gc(S,b,K,Le){j("onAsrTranscription",S,b,K,Le)}Ec.onAsrTranscription=gc;function _c(S,b){j("onParticipantIdChanged",S,b)}Ec.onParticipantIdChanged=_c;function fc(S){j("onVideoSuspendSuggest",S)}Ec.onVideoSuspendSuggest=fc;function Sc(S){j("onSignalingMessage",typeof S=="string"?S:Ce(S))}Ec.onSignalingMessage=Sc;function vc(S){j("onPromotionApproved",S)}Ec.onPromotionApproved=vc;function Ic(){j("onPeerRegistered")}Ec.onPeerRegistered=Ic})(Wr||(Wr={}));var v=Wr;var $r="_okcls_",zt=(()=>{try{let n=Date.now().toString(),r=window.localStorage,e=!1;return r.setItem(n,n),e=r.getItem(n)===n,r.removeItem(n),e?r:null}catch{return null}})();function Ws(n){let r=zt?zt.getItem($r+n):null;if(r===null)return null;try{return JSON.parse(r)}catch{return null}}function Ks(n,r){try{zt&&zt.setItem($r+n,JSON.stringify(r))}catch{}}function qs(n){zt&&zt.removeItem($r+n)}var qr;(t=>{function n(i){return Ws(i)||null}t.get=n;function r(i,a){Ks(i,a)}t.set=r;function e(i){qs(i)}t.remove=e})(qr||(qr={}));var ht=qr;var Yt=null,$i=null,Zi=null,tr=[],ir=[],er=[],ze=null,Je=null,rr=null,ar=!1,nr=!1,zi,Jt,Ji,zr=null,Jr="",Yi=[],Qi=null,rn=navigator.appVersion,$s=navigator.appName,Ue=navigator.userAgent,nt={},Dt=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(Dt||{});(r=>{function n(e){return Object.values(r).includes(e)}r.contains=n})(Dt||(Dt={}));var Ot=class{constructor(r,e=!1,t=l.videoMaxWidth,i=l.videoMaxHeight,a=l.videoFrameRate){o(this,"audio");o(this,"video");o(this,"needVideo");o(this,"lastSimplifyWasReached");o(this,"supportedConstraints");o(this,"isVideoRequested",()=>this.needVideo);this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(r){s={noiseSuppression:l.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let u=Pe.getMicrophones(),p,m;if(Je&&(m=Je.groupId,p=Je.deviceId),typeof r=="string")m=u.find(E=>E.deviceId===r)?.groupId,p=r;else if(!Je&&Pe.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,p=h.deviceId)}m&&this.supportedConstraints.groupId?s.groupId={exact:m}:p&&(s.deviceId={exact:p})}let c=!1;if(e){c={width:{min:l.videoMinWidth,max:t,ideal:t},height:{min:l.videoMinHeight,max:i,ideal:i},aspectRatio:{ideal:l.videoAspectRatio},frameRate:{ideal:a}};let u=Pe.getCameras(),p,m;if(ze&&(m=ze.groupId,p=ze.deviceId),typeof e=="string")m=u.find(E=>E.deviceId===e)?.groupId,p=e;else if(!ze&&Pe.os()==="MacOS"&&u.find(h=>h.label.includes("iPhone"))){let h=u.find(E=>!E.label.includes("Virtual")&&!E.label.includes("iPhone"));h&&(m=h.groupId,p=h.deviceId)}m&&this.supportedConstraints.groupId?c.groupId={exact:m}:p&&(c.deviceId={exact:p}),l.videoFacingMode&&(c.facingMode={ideal:l.videoFacingMode},delete c.deviceId,delete c.groupId)}this.audio=s,this.video=c,this.needVideo=!!c,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video=="object"&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio=="object"&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let r=typeof this.video=="object"&&(this.video.width||this.video.height||this.video.aspectRatio||this.video.frameRate||this.video.facingMode||this.video.deviceId||this.video.groupId)||this.video;return!!(typeof this.audio=="object"&&(this.audio.deviceId||this.audio.groupId||this.audio.noiseSuppression||this.audio.echoCancellation||this.audio.autoGainControl)||this.audio||r)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Yr=class extends Ot{constructor(e,t,i,a){super(!1,!0);o(this,"captureController");if(this.captureController="CaptureController"in window?new CaptureController:null,typeof this.video=="object"?(delete this.video.deviceId,delete this.video.groupId,delete this.video.aspectRatio,delete this.video.frameRate,delete this.video.facingMode):this.video={},this.video.cursor="motion",this.video.width=e,this.video.height=t,this.video.frameRate=i,this.video.displaySurface=l.displaySurface,Pe.browserName()==="Safari"){let s=Number(Pe.browserVersion());s===16?(this.video.width={max:e},this.video.height={max:t}):s===17&&(delete this.video.width,delete this.video.height)}a&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:"exclude",controller:this.captureController})}},kt=class kt{constructor(){o(this,"_lockId",Math.round(Math.random()*99998)+1)}busy(){if(kt._lockId)throw R.log(M.ERROR,"change_device"),d.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");kt._lockId=this._lockId}free(){kt._lockId===this._lockId&&(kt._lockId=0)}};o(kt,"_lockId",0);var sr=kt;async function an(){nr=!1,ar=!1,Yt=null;let n={camera:Pe.getSavedCamera(),microphone:Pe.getSavedMicrophone(),output:Pe.getSavedOutput()};await Qr(),zs("devicechange",n),v.onDeviceChange()}function zs(n,...r){if(nt[n])for(let e of nt[n])e(...r)}async function Qr(){return Yt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!$i&&navigator.mediaDevices.addEventListener&&($i=I.debounce(an,l.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",$i)),!Zi&&_i.isSupported()&&(Zi=new _i,await Zi.init((n,r)=>{switch(r){case"denied":case"prompt":$i?.();break}})),Yt=navigator.mediaDevices.enumerateDevices().then(n=>{tr=n.filter(i=>i.kind==="videoinput"?(i.label&&(ar=!0),!0):!1),ir=n.filter(i=>i.kind==="audioinput"?(i.label?nr=!0:Pe.isMobile()&&Pe.browserName()==="Firefox"&&(nr=ar),!0):!1),er=n.filter(i=>i.kind==="audiooutput");let r=ze?.deviceId??ht.get("videoinput"),e=Je?.deviceId??ht.get("audioinput"),t=rr?.deviceId??ht.get("audiooutput");return ze=tr.find(i=>i.deviceId===r)||null,Je=ir.find(i=>i.deviceId===e)||null,rr=er.find(i=>i.deviceId===t)||er[0]||null,Yt=Promise.resolve(n),n}).catch(()=>(Yt=null,[]))))}function Js(n){if(ze&&Je)return;let r=(e,t)=>{let i=t.getSettings()?.deviceId;return e.find(a=>a.deviceId===i||a.label===t.label)||null};n?.getTracks().forEach(e=>{!Je&&e.kind==="audio"?Je=r(Pe.getMicrophones(),e):!ze&&e.kind==="video"&&(ze=r(Pe.getCameras(),e))})}async function fi(n,r){d.debug("Try to get media",JSON.parse(JSON.stringify(n.getNative())));let e=(!n.isVideo()||Pe.hasCameraPermission())&&(!n.isAudio()||Pe.hasMicrophonePermission());!e&&!r&&v.onPermissionsRequested();let t=new sr;try{t.busy();let i=await navigator.mediaDevices.getUserMedia(n.getNative());return t.free(),e||await an(),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 fi(n.simplify(),r);let a=r||se.UNKNOWN;throw v.onPermissionsError(a,i),a}}async function Ys(n){d.debug("Try to get screen",JSON.parse(JSON.stringify(n.getNative())));let r=new sr;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 Xi(){return Yi.length||(Yi=(()=>{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]:$s,n&&n[1]||i[2]||rn,r,e,t]})()),Yi}var Pe;(_e=>{async function n(){await Qr()}_e.init=n;function r(){return tr}_e.getCameras=r;function e(){return ir}_e.getMicrophones=e;function t(){return er}_e.getOutput=t;function i(){return tr.length>0}_e.hasCamera=i;function a(){return ir.length>0}_e.hasMicrophone=a;function s(){return ze}_e.getSavedCamera=s;function c(){return Je}_e.getSavedMicrophone=c;function u(){return rr}_e.getSavedOutput=u;function p(){return l.videoFacingMode}_e.getVideoFacingMode=p;function m(){return ar}_e.hasCameraPermission=m;function h(){return nr}_e.hasMicrophonePermission=h;function E(){return Zi?.getPermissionState("microphone")??null}_e.getMicrophonePermissionState=E;function P(F=!1){return h()?i()&&F?m():!0:!1}_e.hasPermissions=P;async function w(F=!1,re=!0,ce=!0){let ge=a()&&re,at=i()&&F,We;if(!ge&&!at)We=new MediaStream;else try{We=await fi(new Ot(ge,at))}catch{We=new MediaStream}return!We.getVideoTracks().length&&ce&&We.addTrack(_e.getBlackMediaTrack()),!We.getAudioTracks().length&&ce&&We.addTrack(_e.getSilentMediaTrack()),We}_e.getUserMedia=w;async function V(F,re){let ce=F?l.fastScreenShareWidth:window.screen.width,ge=F?l.fastScreenShareHeight:window.screen.height,at=l.getScreenFrameRate(F);return Ys(new Yr(ce,ge,at,re))}_e.getScreenMedia=V;async function z(F=!1,re){let ce=F?l.videoEffectMaxWidth:l.videoMaxWidth,ge=F?l.videoEffectMaxHeight:l.videoMaxHeight;return fi(new Ot(!1,!0,ce,ge,re))}_e._getUserVideo=z;async function oe(F,re){let ce=re?.width||l.videoMaxWidth,ge=re?.height||l.videoMaxHeight;return fi(new Ot(!1,F||!0,ce,ge))}_e.getUserVideo=oe;async function Te(F){return fi(new Ot(F||!0,!1))}_e.getUserAudio=Te;async function Ae(F,re){let[ce]=F.getVideoTracks();if(!ce)throw new Error("Video track not found in stream");return Wi(ce,re)}_e.setResolution=Ae;async function ee(F,re){let ge=(await Qr()).find(at=>at.kind===F&&at.deviceId===re);return ge?(F==="videoinput"?ze=ge:F==="audioinput"?Je=ge:F==="audiooutput"&&(rr=ge),ht.set(F,re),ge):null}_e._saveDeviceId=ee;function De(){if(!Ji||Ji.readyState==="ended"){let F=_e.getAudioContext(),re=F.createMediaStreamDestination(),ce=F.createGain();ce.gain.value=1e-5,ce.connect(re),ce.connect(F.destination);let ge=F.createOscillator();ge.type="sine",ge.frequency.value=0,ge.connect(ce),ge.start(),Ji=re.stream.getAudioTracks()[0]}return Object.assign(Ji.clone(),{enabled:!1})}_e.getSilentMediaTrack=De;function J(F=l.videoMinWidth,re=l.videoMinHeight){Jt||(Jt=document.createElement("canvas")),Jt.width=F,Jt.height=re;let ce=Jt.getContext("2d");return ce.rect(0,0,F,re),ce.fillStyle="black",ce.fill(),(!zi||zi.readyState==="ended")&&(zi=Jt.captureStream(l.videoFrameRate).getVideoTracks()[0]),Object.assign(zi.clone(),{enabled:!1})}_e.getBlackMediaTrack=J;function ni(){if(Li()==="Edge"&&Number(Dr())<70)return!1;try{let F=window;return"mediaDevices"in F.navigator&&"getUserMedia"in F.navigator.mediaDevices&&F.RTCPeerConnection&&F.RTCIceCandidate&&F.RTCSessionDescription&&F.HTMLCanvasElement&&F.HTMLCanvasElement.prototype.captureStream&&F.RTCRtpSender&&F.RTCRtpSender.prototype.replaceTrack&&F.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}_e.isBrowserSupported=ni;function _a(){return!!navigator.mediaDevices.getDisplayMedia}_e.isScreenCapturingSupported=_a;function fa(){let F=_e.browserName()==="Safari"&&_e.browserVersion()==="15"&&_e.browserSubVersion()==="1",re=_e.browserName()==="Opera",ce=_e.browserName()==="Yandex";return F||re||ce}_e.isBrokenH264Decoder=fa;function si(){return _e.browserName()==="Yandex"&&_e.os()==="Windows"||l.simulcast}_e.isBrokenVP9Encoder=si;function te(){return _e.browserName()==="Safari"&&Number(_e.browserVersion())===17&&[4,5,6].includes(Number(_e.browserSubVersion()))}_e.isBrokenVP9Decoder=te;function Sa(){return _e.browserName()==="Firefox"&&Number(_e.browserVersion())<60}_e.isOldDataChannelDescription=Sa;function ie(){return!(_e.baseChromeVersion()&&_e.isMobile())}_e.canPreferH264=ie;function va(){return!(_e.browserName()==="Firefox"||_e.browserName()==="Safari")}_e.isSimulcastSupportedByBrowser=va;function Ia(){return Jr||(Jr=(()=>{let F={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let re in F)if(Object.hasOwn(F,re)&&F[re].test(Ue))return re;return"Unknown"})()),Jr}_e.os=Ia;function Ea(){return zr===null&&(zr=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(rn)),zr}_e.isMobile=Ea;function Li(){return Xi()[0]}_e.browserName=Li;function Dr(){return Xi()[1]}_e.browserVersion=Dr;function Ta(){return Xi()[3]}_e.baseChromeVersion=Ta;function Ra(){return Qi||(Qi=new(window.AudioContext||window.webkitAudioContext)),Qi.resume().catch(()=>{d.warn("Failed to resume AudioContext")}),Qi}_e.getAudioContext=Ra;function Ca(){return Xi()[4]}_e.browserSubVersion=Ca;function wr(){return _e.baseChromeVersion()>=105&&!_e.isMobile()}_e.isAudioShareSupported=wr;function Pa(F,re){nt[F]||(nt[F]=[]),nt[F].push(re)}_e.addEventListener=Pa;function ya(F,re){if(nt[F])if(!re)delete nt[F];else{let ce=nt[F].indexOf(re);ce>-1&&nt[F].splice(ce,1)}}_e.removeEventListener=ya})(Pe||(Pe={}));var y=Pe;var Ve=class Ve{static get startTime(){return Ve._list[0]?.t||0}static get endTime(){let r=Ve._list;return r[r.length-1]?.t||0}static startSession(){Ve._list=[]}static get conversationId(){return Ve._conversationId}static set conversationId(r){Ve._conversationId=r}static add(r){Ve._list.push(r)}static _createContextLogs(){let r=[[`Calls SDK ${l.sdkVersion}`,l.toJSON()],["UserAgent:",navigator.userAgent],["Screen resolution:",`${window.screen.width}x${window.screen.height}`],["Permissions:",`Camera: ${y.hasCameraPermission()}, Mic: ${y.hasMicrophonePermission()}`]],e=new Date,t=e.getTime(),i=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return r.map(a=>({h:i,t,l:"LOG",d:a}))}static collectLogs(){let r=Ve._list;return r.length===0?[]:[...Ve._createContextLogs(),...r]}};o(Ve,"_list",[]),o(Ve,"_conversationId",null);var Oe=Ve;var or=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 Xr=2*1024*1024,nn=512*1024,Qt=100*1024,Qs=5,ea="_okcls_logs_session_",Xs=3e4,ta=class{constructor(){o(this,"_items",[]);o(this,"_itemsSize",0);o(this,"_storageSize",Xr);try{let r=window.localStorage;for(let e of Object.keys(r)){if(e.indexOf(ea)!==0)continue;let t=r.getItem(e);if(!t){sn(e);continue}let i=cn(t);this.add(e,i)}}catch(r){console.error("Storage is blocked",r),this._storageSize=0}this._items.sort((r,e)=>r.date-e.date),this.cleanup(Qt)}get size(){return this._itemsSize}get length(){return this._items.length}get available(){return Math.max(this._storageSize-this._itemsSize,0)}get items(){return this._items}set storageSize(r){this._storageSize=Math.min(r,this._storageSize,Xr)}add(r,e){let t=parseInt(r.replace(ea,""),10);this._itemsSize+=e,this._items.push({key:r,size:e,date:t})}deleteOldestItem(){let r=this._items.shift();r&&(sn(r.key),this._itemsSize-=r.size)}cleanup(r){for(;this.length&&(this.size>Xr||this.length>Qs-1||this.size+r>this.available);)this.deleteOldestItem()}};function on(){return`${ea}${Date.now()}`}function cn(n){return new Blob([n]).size}function sn(n){try{window.localStorage.removeItem(n)}catch(r){console.error("Failed to remove log from storage",r)}}function cr(){let n=gt.toString();if(!we.available||!n)return;let r=cn(n);if(r>nn){gt.bisect(),cr();return}we.cleanup(Qt+r);try{window.localStorage.setItem(dr,n)}catch(e){if(console.warn("Failed to write log to storage",e),we.storageSize=we.size+r,we.cleanup(Qt+r),we.available>=Qt+r){cr();return}if(r>Qt){gt.bisect(),cr();return}we.storageSize=0;return}r>nn&&(we.add(dr,r),dr=on(),gt.clear(),we.cleanup(Qt))}function ia(){!we.available||!gt.length||cr()}function Zs(n=!1){let r=[];try{let i=window.localStorage;for(let s of we.items){let c=i.getItem(s.key);r.push(c)}let a=gt.toString();a&&r.push(a)}catch(i){console.error("Storage is blocked",i)}let e=`[${r.join(",")}]`;if(n)return e;let t=`logs_${Date.now()}.json`;return eo(e,t),t}function eo(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 dn(n,r){if(!we.available)return;let e=new Date,t={t:e.getTime(),l:n,d:r,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};gt.push(t),Oe.add(t),Zr||(Zr=window.setTimeout(()=>{Zr=null,ia()},Xs))}function ra(){we||(we=new ta,gt=new or,dr=on(),window.addEventListener("beforeunload",ia))}var we,gt,dr,Zr=null;window.__VKCallsSDKLogs__=(n=!1)=>(we||ra(),ia(),Zs(n));var ln=(i=>(i.DEBUG="DEBUG",i.LOG="LOG",i.WARN="WARN",i.ERROR="ERROR",i))(ln||{}),aa;(ee=>{let n="📞",r=(De,...J)=>{v.onDebugMessage(De,...J)},e=!1,t=(De,J)=>(...ni)=>{De(...ni),dn(J,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"),p=r.bind(null,"LOG"),m=r.bind(null,"WARN"),h=r.bind(null,"ERROR");ee.debug=u,ee.log=p,ee.warn=m,ee.error=h;function z(){return e}ee.enabled=z;function oe(De){e=De,l.debugLog&&ra(),De?(ee.debug=l.debugLog?t(i,"DEBUG"):i,ee.log=l.debugLog?t(a,"LOG"):a,ee.warn=l.debugLog?t(s,"WARN"):s,ee.error=l.debugLog?t(c,"ERROR"):c):(ee.debug=l.debugLog?t(u,"DEBUG"):u,ee.log=l.debugLog?t(p,"LOG"):p,ee.warn=l.debugLog?t(m,"WARN"):m,ee.error=l.debugLog?t(h,"ERROR"):h)}ee.toggle=oe;function Te(De,...J){switch(De){case"DEBUG":(0,ee.debug)(...J);break;case"LOG":(0,ee.log)(...J);break;case"WARN":(0,ee.warn)(...J);break;case"ERROR":(0,ee.error)(...J);break}}ee.send=Te;function Ae(De,...J){}ee.test=Ae})(aa||(aa={}));var d=aa;var io="kf";function Xt(n){return n.stopStream}function na(n){return n.keyFrameRequested}function pn(n){if(Xt(n))return"ss";if(na(n))return io;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 Si=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(Si||{}),un="s",mn="m";function tt(n){return n.participantId+(n.mediaType?Gt+un+n.mediaType:"")+(n.streamName?Gt+mn+n.streamName:"")}function vi(n){let r=n.split(Gt),e=r.shift();if(!e)throw new Error("Illegal stream description: "+n);let t=null,i,a=0;for(let c of r)switch(c.charAt(0)){case un:t=ro(c.slice(1));break;case mn:i=c.slice(1);break;case Vi:a=Number.parseInt(c.slice(1),10);break;default:throw new Error("Unexpected parameter type "+c.charAt(0)+" in stream description "+n)}return{participantId:I.compose(e,a),mediaType:t,streamName:i}}function ro(n){for(let r of Object.keys(Si))if(r===n)return Si[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),ao(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 ao(n){return n.buffer!==void 0}function lr(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 _n=0,fn=1,so=2,oo=3,co=4,lo=5,po=6,uo=7,mo=0,ho=1,go=2,st=0,_o=0,fo=0,So=1,pr=class{constructor(){o(this,"participantIdRegistry",null)}setParticipantIdRegistry(r){this.participantIdRegistry=r}serializeUpdateDisplayLayout(r,e){let t=it();H.enc(t,_n),H.enc(t,st),H.enc(t,r),xt.enc(t,null);let i=[];for(let a in e)Object.hasOwn(e,a)&&this.writeLayout(e,a,i);return hn.enc(t,i),xt.enc(t,null),t.ui8array().buffer}writeLayout(r,e,t){let i=r[e],a=it();if(this.writeStreamDesc(e,a),Xt(i))H.enc(a,ho);else if(na(i))H.enc(a,go);else if(H.enc(a,mo),i.priority!==void 0?H.enc(a,i.priority):xt.enc(a,null),i.width!==void 0&&i.height!==void 0?(H.enc(a,Math.round(i.width)),H.enc(a,Math.round(i.height))):(xt.enc(a,null),xt.enc(a,null)),i.fit!==void 0)switch(i.fit){case"cv":H.enc(a,fo);break;case"cn":H.enc(a,So);break;default:xt.enc(a,null)}else xt.enc(a,null);t.push(a.ui8array().buffer)}writeStreamDesc(r,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(r);if(t!==void 0){H.enc(e,t);return}}gn.enc(e,r)}serializePerfStatReport(r,e){let t=it();return H.enc(t,fn),H.enc(t,st),H.enc(t,r),H.enc(t,e.framesDecoded),H.enc(t,e.framesReceived),t.ui8array().buffer}serializeSharingStatReport(r,e){let t=it();return H.enc(t,so),H.enc(t,st),H.enc(t,r),H.enc(t,e.minDelay),H.enc(t,e.maxDelay),H.enc(t,e.avgDelay),H.enc(t,e.largeDelayDuration),t.ui8array().buffer}serializeRequestAsr(r,e){let t=it();return H.enc(t,oo),H.enc(t,st),H.enc(t,r),sa.enc(t,e.request),t.ui8array().buffer}serializeNetworkStatReport(r,e){let t=it();return H.enc(t,co),H.enc(t,st),H.enc(t,r),H.enc(t,e.timestamp),H.enc(t,e.sendBitrate),t.ui8array().buffer}serializeEnableVideoSuspend(r,e){let t=it();return H.enc(t,lo),H.enc(t,st),H.enc(t,r),sa.enc(t,e.enabled),t.ui8array().buffer}serializeEnableVideoSuspendSuggest(r,e){let t=it();return H.enc(t,po),H.enc(t,st),H.enc(t,r),sa.enc(t,e.enabled),t.ui8array().buffer}serializeChangeSimulcast(r,e){let t=it();H.enc(t,uo),H.enc(t,st),H.enc(t,r);let i=e.simulcastInfo.streams.length;H.enc(t,e.mediaSource),H.enc(t,i);for(let a of e.simulcastInfo.streams)gn.enc(t,a.rid),H.enc(t,a.width),H.enc(t,a.height),H.enc(t,a.fps),H.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 Va(r);e=lr(s)}else e=lr(r);let t=H.dec(e),i=H.dec(e);if(i!==st){d.warn("Unsupported version for command type: "+t+", version "+i);return}if(H.dec(e)!==_o){d.warn("Error code: "+t+"received for command type: "+t+", version "+i);return}switch(t){case _n:return this.deserializeUpdateDisplayLayoutResponse(e);case fn:return this.deserializeReportPerfStatResponse(e);default:d.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(r){let e=H.dec(r),t=hn.dec(r),i={};return t.forEach(a=>{let s=lr(a),c=no.dec(s);if(typeof c=="string")i[c]=H.dec(s);else{let u=c,p=tt(this.participantIdRegistry?.getStreamDescription(u));i[p]=H.dec(s)}}),{type:"response",sequence:e,response:N.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:i}}deserializeReportPerfStatResponse(r){let e=H.dec(r),t=H.dec(r);return{type:"response",sequence:e,response:N.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var oa={connected:{wt:Y.WEBTRANSPORT_CONNECTED,ws:Y.WEBSOCKET_CONNECTED},reconnected:{wt:Y.WEBTRANSPORT_RECONNECTED,ws:Y.WEBSOCKET_RECONNECTED},failed_pings:{wt:Y.WEBTRANSPORT_FAILED_PINGS,ws:Y.WEBSOCKET_FAILED_PINGS},failed_exception:{wt:Y.WEBTRANSPORT_FAILED_EXCEPTION,ws:Y.WEBSOCKET_FAILED_EXCEPTION},timeout:{wt:Y.WEBTRANSPORT_TIMEOUT,ws:Y.WEBSOCKET_TIMEOUT},restart:{wt:Y.WEBTRANSPORT_RESTART,ws:Y.WEBSOCKET_RESTART}};var Ii=class{constructor(r){o(this,"q");o(this,"inits",[]);o(this,"n",[1,2,3,4,5]);o(this,"np",[1,1,1,1,1]);o(this,"qv",[]);if(!(r>0&&r<1))throw new Error("q must be in (0,1)");this.q=r}add(r){if(this.inits.length<5){this.inits.push(r),this.inits.length===5&&this.bootstrap();return}let e=0;if(r<this.qv[0])this.qv[0]=r,e=0;else if(r>=this.qv[4])this.qv[4]=r,e=3;else for(;!(r<this.qv[e+1]);)e++;for(let t=0;t<5;t++)this.n[t]+=t<=e?0:1;this.np[0]=1,this.np[1]+=this.q/2,this.np[2]+=this.q,this.np[3]+=(1+this.q)/2,this.np[4]+=1;for(let t=1;t<=3;t++){let i=this.np[t]-this.n[t];if(i>=1&&this.n[t+1]-this.n[t]>1||i<=-1&&this.n[t]-this.n[t-1]>1){let a=Math.sign(i),s=this.qv[t]+a/(this.n[t+1]-this.n[t-1])*((this.n[t]-this.n[t-1]+a)*(this.qv[t+1]-this.qv[t])/(this.n[t+1]-this.n[t])+(this.n[t+1]-this.n[t]-a)*(this.qv[t]-this.qv[t-1])/(this.n[t]-this.n[t-1]));s>this.qv[t-1]&&s<this.qv[t+1]?this.qv[t]=s:this.qv[t]=this.qv[t]+a*(this.qv[t+a]-this.qv[t])/(this.n[t+a]-this.n[t]),this.n[t]+=a}}}value(){if(this.inits.length===0)return NaN;if(this.inits.length<5){let r=[...this.inits].sort((a,s)=>a-s),e=this.q*(r.length-1),t=Math.floor(e),i=e-t;return t+1<r.length?r[t]*(1-i)+r[t+1]*i:r[t]}return this.qv[2]}bootstrap(){this.inits.sort((r,e)=>r-e),this.qv=this.inits.slice(0,5),this.n=[1,2,3,4,5],this.np=[1,1+2*this.q,1+4*this.q,3+2*this.q,5]}};var ur=class{constructor(){o(this,"n",0);o(this,"mean",0)}add(r){this.n++;let e=r-this.mean;this.mean+=e/this.n}get avg(){return this.n?this.mean:NaN}};var ot=class{constructor(){o(this,"count",0);o(this,"minVal",1/0);o(this,"maxVal",-1/0);o(this,"mean",new ur);o(this,"p50",new Ii(.5));o(this,"p95",new Ii(.95))}add(r){r<this.minVal&&(this.minVal=r),r>this.maxVal&&(this.maxVal=r),this.mean.add(r),this.p50.add(r),this.p95.add(r),this.count++}snapshot(){return{min:this.minVal===1/0?NaN:this.minVal,max:this.maxVal===-1/0?NaN:this.maxVal,avg:+this.mean.avg.toFixed(),median:+this.p50.value().toFixed(),p95:+this.p95.value().toFixed(),count:this.count}}get hasData(){return this.count>0}};var Sn=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(Sn||{}),Me=Sn;var vn=(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))(vn||{}),L=vn;var In=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(In||{}),ct=In;var{isObject:En,isObjectsEquals:vo}=I;function ca(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||En(n.bitrates)&&En(r.bitrates)&&!vo(n.bitrates,r.bitrates,!0)?!1:n.bitrates===r.bitrates}function mr(n,r){return!(!ca(n.camera,r.camera)||!ca(n.screenSharing,r.screenSharing))}function da(n,r){return{camera:Object.assign({},n.camera,r.camera),screenSharing:Object.assign({},n.screenSharing,r.screenSharing)}}var _t=class _t{constructor(){o(this,"_codecUsages",new Map);o(this,"getCurrentTransportTopology",()=>{})}static create(r){let e=new _t;e.getCurrentTransportTopology=r,_t._instance=e}static reportUsage(r){let e=_t._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let i=r.rtps.filter(a=>a.type==="outbound-rtp"&&!a.mid?.endsWith("s"));l.simulcast&&(i=i.reduce((a,s)=>{if(s.kind!=="video")return a.concat(s);let c=a.find(u=>u.kind==="video");return c?c.totalEncodeTime=(c.totalEncodeTime??0)+(s.totalEncodeTime??0):a.push(s),a},[])),i.forEach(a=>{let s=a.kind,c=a.mimeType;if((s==="audio"||s==="video")&&c){let u=a.encoderImplementation,p=[c,"encoder",u].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:p,totalEncodeTime:(a.totalEncodeTime??0)*1e3,audioCodecParams:a.sdpFmtpLine,topology:t})}})}saveUsage({kind:r,codecName:e,totalEncodeTime:t,audioCodecParams:i,topology:a}){let s=this._codecUsages.get(r);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(r,{...s,totalEncodeTime:t,topology:a});return}this._codecUsages.set(r,{kind:r,codecName:e,audioCodecParams:i,totalEncodeTime:t,topology:a})}report(r){if(r.kind==="video"&&r.totalEncodeTime===0)return;let e={name:Y.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(){_t._instance?._destroy(),_t._instance=null}_destroy(){this._codecUsages.forEach(r=>{this.report(r)}),this._codecUsages.clear()}};o(_t,"_instance",null);var rt=_t;var Nt=class extends ne{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",Io=5e3,Eo=500,ft=class extends ne{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&&l.perfStatReportEnabled&&this._previousPerfStatReportTimestamp+Io<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let i=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&i&&this._previousNetworkStatReportTimestamp+Eo<=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(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((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&&!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 p=Math.max(0,t.total_audio_samples_received-this._previousCallStatReport.total_audio_samples_received),m=Math.max(0,t.inserted_audio_samples_for_deceleration-this._previousCallStatReport.inserted_audio_samples_for_deceleration),h=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),E=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),P=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),w=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=Lt(m/p*1e3),s.removed_audio_samples_for_acceleration=Lt(h/p*1e3),s.concealed_audio_samples=Lt(E/p*1e3),s.concealed_silent_audio_samples=Lt(P/p*1e3),s.concealment_audio_avg_size=Lt(E/w),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 p=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=Lt(p/c*100)}if(u>0){let p=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=Lt(p/u*100)}ye.logCallStat(s),l.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 Lt(n){return Number.isNaN(n)?0:n}var Ti=class{constructor(r,e=null){o(this,"weightUp");o(this,"weightDown");o(this,"value",NaN);this.weightUp=r,this.weightDown=e??r}set(r){this.value=r}update(r){return this.value=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,To=85,Ro=.1,Co=1.5,Po=.1,yo=1,bo=.6,Mo=.3;var Ri=class extends ne{constructor(e){super();o(this,"_signaling");o(this,"_localNetworkStat");o(this,"_remoteNetworkStat");o(this,"_lastNetworkStat");o(this,"_networkLimits",{badNet:{loss:3,rtt:1e3},goodNet:{loss:.5,rtt:600}});o(this,"_lastStatSentTimestamp",0);o(this,"_currentState","good");this._signaling=e,this._localNetworkStat={rtt:new Ti(Pn,Pn),loss:new Ti(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)/To);for(let s=0;s<a;s++)i*=1-Ro;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)/Co);for(let s=0;s<a;s++)i*=1-Po;return i}_calcBitrateRating(e,t){if(!e||!t)return 1;let a=1-(1-Math.min(e,t)/Math.max(e,t))*yo;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>=bo?"good":e>=Mo?"medium":"bad"}updateSettings(e){Object.assign(this._networkLimits.badNet,e?.badNet||{}),Object.assign(this._networkLimits.goodNet,e?.goodNet||{})}reportLocal(e){if(!this._signaling.ready)return;let t=e.outbound.transport.local?.protocol==="tcp",i=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),a=e.inbound.rtps.reduce((h,E)=>Math.max(h,E.packetLoss||0),0),s={rtt:this._localNetworkStat.rtt.update(i),loss:this._localNetworkStat.loss.update(a)};if(t){let h=e.outbound.rtps.reduce((E,P)=>E+(P.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let c=Date.now(),u=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),p=Math.max(Math.round(u*10)/10,.1),m=this._getNetworkState(p);(t||m!==this._currentState||c-this._lastStatSentTimestamp>l.networkStatisticsInterval)&&(this._lastStatSentTimestamp=c,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{d.warn("Unable to send [bad-net]",h)})),this._currentState=m,this._triggerEvent("NETWORK_STATUS",p)}reportRemote(e){let{rtt:t,loss:i,bitrate:a}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=i||0,this._remoteNetworkStat.bitrate=a||0}};var Ao=30*1e3,Ci=class n extends Nt{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");if(this._participantId=e,this._isMaster=t,this._serverSettings=s,this._perfStatReporter=new ft(this,i,!0),this._directStatReporter=new Ri(i),this.subscribe(this._signaling,Me.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applySettings.bind(this)),this.subscribe(this._directStatReporter,"NETWORK_STATUS",this._onNetworkStatus.bind(this)),this._pc=new RTCPeerConnection({iceServers:l.iceServers,iceTransportPolicy:l.forceRelayPolicy?"relay":"all"},{optional:[{googSuspendBelowMinBitrate:!1}]}),this._pc.onicecandidate=this._handleIceCandidate.bind(this),this._pc.ontrack=this._onAddTrack.bind(this),this._pc.oniceconnectionstatechange=this._onIceConnectionStateChange.bind(this),this._pc.onconnectionstatechange=this._onConnectionStateChange.bind(this),this._pc.onsignalingstatechange=this._onSignalingStateChange.bind(this),this._prevConsumerSettings={},l.vmoji&&this._createDataChannel(this._pc,ct.animoji,c=>{this._animojiDataChannel=c,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(c){R.log(M.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(M.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(l.vmoji&&(this._animojiReceiver=e,this._animojiSender=t,e.setParticipantId(this._participantId),this._animojiDataChannel)){e.setDataChannel(this._animojiDataChannel),t.setDataChannel(this._animojiDataChannel);return}}close(e){this._isOpen&&(this._isOpen=!1,this._stopReconnection(),this._remoteStream&&(this._remoteStream.getTracks().forEach(t=>{t.stop(),this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t)}),this._remoteStream=null),this._stopStatInterval(),this._stopSettingsInterval(),this._pc&&(this._animojiDataChannel&&(this._animojiDataChannel.onopen=null,this._animojiDataChannel.onmessage=null,this._animojiDataChannel.onerror=null,this._animojiDataChannel.close()),this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.oniceconnectionstatechange=null,this._pc.onconnectionstatechange=null,this._pc.onsignalingstatechange=null,this._pc.close(),this._pc=null),this._onNetworkStatus(1),this.unsubscribe(),e?(d.error("DirectTransport: Closed",e,{participantId:this._participantId}),this._setState("FAILED")):(d.debug("DirectTransport: Closed",{participantId:this._participantId}),this._setState("CLOSED")),this._triggerEvent("PEER_CONNECTION_CLOSED"))}_setState(e){this._state!==e&&(d.debug(`DirectTransport: State changed to ${e}`,{participantId:this._participantId}),this._state=e,this._triggerEvent("STATE_CHANGED",e))}_onSignalingNotification(e){switch(e.notification){case L.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case L.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case L.CUSTOM_DATA:Object.hasOwn(e.data,"sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,i=I.getPeerIdString(e.peerId);I.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(i,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(i,t.sdp).catch(this.close.bind(this))))}async _addIceCandidate(e,t){if(this._isOpen&&(!this._remotePeerId||this._remotePeerId===e)&&this._pc&&this._pc.remoteDescription){d.debug("Add remote ice candidate",{participantId:this._participantId,candidate:t});try{await this._pc.addIceCandidate(new RTCIceCandidate(t))}catch(i){throw R.log(M.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(M.ERROR,"setRemoteDescription-direct"),d.error("Unable to set remote description",i,{participantId:this._participantId,sdp:t}),i}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,l.vmojiOptions?.protocolVersion||1);this._animojiSender?.setProtocolVersion(t)}_onAddTrack(e){d.debug("Added remote track",{participantId:this._participantId,kind:e.track.kind}),this._remoteStream?this._remoteStream.addTrack(e.track):(this._remoteStream=new MediaStream([e.track]),this._remoteStream.onremovetrack=t=>{this._triggerEvent("REMOTE_TRACK_REMOVED",this._remoteStream,t.track)}),this._triggerEvent("REMOTE_TRACK_ADDED",this._remoteStream,e.track)}async _handleIceCandidate(e){e.candidate&&this._signaling.ready&&(d.debug("Local ice candidate",{participantId:this._participantId,candidate:e.candidate}),await this._signaling.sendCandidate(this._participantId,e.candidate))}_onSignalingStateChange(){d.debug(`DirectTransport: Signaling state changed to ${this._pc?.signalingState}`,{participantId:this._participantId});let e={animojiVersion:l.vmojiOptions.protocolVersion||1};switch(this._pc?.signalingState){case"have-local-offer":let t=this._pc.localDescription;t?this._signaling.sendSdp(this._participantId,t,e).catch(this.close.bind(this)):this.close(new Error);break;case"have-remote-offer":this._createAnswer().then(i=>this._signaling.sendSdp(this._participantId,i,e)).catch(this.close.bind(this));break}}_onIceConnectionStateChange(){switch(d.debug(`DirectTransport: Ice Connection state changed to ${this._pc?.iceConnectionState}`,{participantId:this._participantId}),this._pc?.iceConnectionState){case"checking":let e=this.getState();e==="IDLE"||e==="OPENED"?this._setState("CONNECTING"):this._setState("RECONNECTING");break}}_onConnectionStateChange(){switch(d.debug(`DirectTransport: Connection state changed to ${this._pc?.connectionState}`,{participantId:this._participantId}),R.log(M.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(M.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(M.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(M.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},l.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};d.debug("Create offer",{participantId:this._participantId,options:t});let i;try{i=await this._pc?.createOffer(t),d.debug("Created offer",{participantId:this._participantId,offer:i}),i=n._patchLocalDescription(i)}catch(a){throw d.error("Unable to create offer",a,{participantId:this._participantId}),R.log(M.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(M.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(M.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(M.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!y.baseChromeVersion();return e.sdp=I.patchLocalSDP(e.sdp,l.preferH264&&y.canPreferH264(),y.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,y.isBrokenVP9Encoder(),y.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(M.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,l.statisticsInterval)})};this._statInterval=window.setTimeout(e,l.statisticsInterval)}async _isSVCSupported(e,t){let i=this._mediaSource.getSendVideoTrack(),a=e.outbound.rtps.find(u=>u.kind==="video");if(!a?.mimeType||!a?.bandwidth||!i)return!1;let s=i.getSettings();if(!s.width||!s.height||!s.frameRate)return!1;let c={type:y.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:a.mimeType,width:s.width,height:s.height,bitrate:a.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(c)).supported||!1}catch(u){return d.warn("Failed to get encodingInfo",c,u),!1}}async _checkPPTNetwork(e){if(!l.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,i=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,a=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,s=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,c=this._videoMaxDimensionsForNet.good,u="L1T1";if(a?(this._lastBadConnection=Date.now(),s?(c=this._videoMaxDimensionsForNet.bad,u="L1T2"):(c=this._videoMaxDimensionsForNet.worst,u="L1T3")):i&&(c=this._videoMaxDimensionsForNet.good,u="L1T1"),!(c<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>Ao)||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||{}),Ye=bn;var Do=16,_r=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(Do)}}_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}};import{decode as St}from"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=St(i);return Object.entries(a).forEach(([P,w])=>{let V=vi(P);this.streamDescriptionByCompactId.set(w,V),this.compactIdByStreamDescription.set(P,w)}),null;case 2:case 4:let s=St(i),c=[];for(let P of s){let w=this.getStreamDescription(P);w&&c.push(w.participantId)}return t===2?{type:"notification",notification:L.AUDIO_ACTIVITY,activeParticipants:c}:{type:"notification",notification:L.STALLED_ACTIVITY,stalledParticipants:c};case 3:let u=St(i);return{type:"notification",notification:L.SPEAKER_CHANGED,speaker:this.getStreamDescription(u)?.participantId};case 5:let p=St(i);return{type:"notification",notification:L.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:p[0],maxDimension:p[1]}};case 6:let m=St(i),h={};for(let[P,w]of Object.entries(m)){let V=this.getStreamDescription(Number(P))?.participantId;V&&(h[V]=w/100)}return{type:"notification",notification:L.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(i);case 8:{let w=St(i).map(V=>{let[z,oe,Te,Ae,ee,De,J]=V;return{participantId:this.getStreamDescription(z)?.participantId,gain:oe,pause:Te,offset:Ae,mute:ee,liveStatus:De,startTimeMs:J}});return{type:"notification",notification:L.MOVIE_UPDATE_NOTIFICATION,data:w}}case 9:let E=St(i);return{type:"notification",notification:L.VIDEO_SUSPEND_SUGGEST,bandwidth:E};default:return d.debug("unsupported message type: "+t),null}}_createParticipantSourcesUpdateNotification(r){let e=St(r),t=[];for(let[i,a]of Object.entries(e)){let s=a[0],c=a[1],u=a[2],p=!!a[3],m=a[4]!==null?!!a[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){d.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(u===null){d.error("unexpected null sequenceNumber",i,a);continue}let E=Ye.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+i,P=c?c>>>0:null;t.push({participantStreamDescription:h,streamId:E,rtpTimestamp:P,sequenceNumber:u,fastScreenShare:p,suspend:m})}return{type:"notification",notification:L.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var wo=90,ko=4294967295,Pi=class n extends Nt{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,"_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,"_asrTrack",null);o(this,"_captureSender",null);o(this,"_captureReceiver",null);o(this,"_participantIdRegistry",null);o(this,"_disabledSenders",new Set);o(this,"_rtpReceiversByStreamId",{});o(this,"_producerSessionId","");o(this,"_newAudioShareTrack",null);o(this,"_simulcastInfo",null);this.subscribe(this._signaling,Me.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"TRACK_REPLACED",this._onReplacedTrack.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._applyConsumerSettings.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(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&&y.isSimulcastSupportedByBrowser()&&await this._changeSimulcastInfo(!0,!1)}_createPerfStatsReporter(){this._perfStatReporter?.destroy(),this._perfStatReporter=new ft(this,this._signaling)}_closeConnection(){this._stopStatInterval(),this._stopSettingsInterval(),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"),this._pc=new RTCPeerConnection({},{optional:[{googSuspendBelowMinBitrate:!1}]}),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),l.producerNotificationDataChannel&&this._createDataChannel(this._pc,ct.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),l.producerCommandDataChannel&&(this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,ct.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)})),l.producerScreenDataChannel&&this._createDataChannel(this._pc,ct.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),l.asrDataChannel&&this._createDataChannel(this._pc,ct.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new _r(t,this._participantIdRegistry,i=>{this._onAsrTranscription(i)})}),l.vmoji&&this._createDataChannel(this._pc,ct.animoji,t=>{this._animojiDataChannel=t,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(t),this._animojiReceiver?.setParticipantIdRegistry(this._participantIdRegistry),this._animojiSender?.setDataChannel(t),this._animojiSender?.setProtocolVersion(l.vmojiOptions.protocolVersion||1)}),this._newAudioShareTrack=this._mediaSource.getAudioShareTrack();try{this._mediaSource.addTrackToPeerConnection(this._pc,this._observer,!1),this._prevConsumerSettings={},this._applyConsumerSettings()}catch(t){d.error("ServerTransport: Unable to add media source tracks",t),R.log(M.ERROR,"addTrack-single"),this.close(t);return}l.consumerScreenDataChannel&&this._createDataChannel(this._pc,ct.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let i=this._mediaSource.getScreenTrack();i&&this._createCaptureSender(i)}),e||this._allocateConsumer(),this._setState("OPENED"),this._startStatInterval(),this._startSettingsInterval()}_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)|(?:${Ye.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 At(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 bt(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")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(y.getBlackMediaTrack()).catch(u=>{d.error("Could not disable video upload",u)});return}let c=this._mediaSource.getSendVideoTrack();if(!a&&s&&c){d.log("Enabling video upload"),this._disabledSenders.delete(i);let u=i.track;u.enabled=c.enabled,i.replaceTrack(c).then(()=>u.stop()).catch(p=>{d.error("Could not enable video upload",p)})}I.applyVideoTrackSettings(e,i,c??i.track,this._prevConsumerSettings,t)}),this._prevConsumerSettings=t}}_onScreenSharingStatus(e){e.track?this._createCaptureSender(e.track):this._removeCaptureSender()}_setState(e){this._state!==e&&(this._state=e,this._triggerEvent("STATE_CHANGED",e))}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(!this._pc){this._stopStatInterval();return}this._collectStat().then(t=>{this._reportStats(t),this._detectStaleTracks(t),rt.reportUsage(t)}).catch(()=>{}),this._statInterval=window.setTimeout(e,l.statisticsInterval)};this._statInterval=window.setTimeout(e,l.statisticsInterval)}_stopStatInterval(){this._statInterval&&(window.clearTimeout(this._statInterval),this._statInterval=null),this._statBytes={}}_startSettingsInterval(){if(this._settingsInterval)return;let t=()=>{if(!this._pc){this._stopSettingsInterval();return}this._applyConsumerSettings(),this._settingsInterval=window.setTimeout(t,2e3)};this._settingsInterval=window.setTimeout(t,2e3)}_stopSettingsInterval(){this._settingsInterval&&(window.clearTimeout(this._settingsInterval),this._settingsInterval=null)}async _collectStat(){if(!this._pc)return Promise.reject();this._ssrcMapUpdated&&(this._lastStat=null,this._ssrcMapUpdated=!1,this._createPerfStatsReporter());let e=await 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=Ye.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:ft.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&&y.isSimulcastSupportedByBrowser()};!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&&y.isSimulcastSupportedByBrowser(),i=t;try{await this._pc.setRemoteDescription(e)}catch(c){throw d.error("[single] unable to set remote offer",c),R.log(M.ERROR,"setRemoteDescription-single"),c}let a=this._findFirstSimTransceiver();if(t)if(a){d.log(`_processOffer: caps.simulcast=${l.simulcast} mid=${a.mid} dir=${a.direction}`);let c=this._mediaSource.getStream(),u=await this._setupSimulcastTransceiver(c,a);d.log("_processOffer: simulcastInfo",u),u||(d.log(`_processOffer: simulcast transceiver not found in server offer mid=${a.mid}, disable simulcast`),i=!1)}else d.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),i=!1;let s;try{if(await this._handleTracks(),d.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");s=await this._pc.createAnswer()}catch(c){throw d.error("[single] unable to create answer",c),R.log(M.ERROR,"createAnswer-single"),c}try{if(!this._pc)throw new Error("Interrupt allocation");s.sdp=I.patchLocalSDP(s.sdp,!1,y.isBrokenH264Decoder(),!1,l.h264spsPpsIdrInKeyframe),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(M.ERROR,"setLocalDescription-single"),c}if(i&&a){s.sdp=I.patchSimulcastAnswerSdp(s.sdp,a,ut.WIDTH,ut.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(M.ERROR,"acceptProducer")}i&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!=="video")continue;let i=e.sender.getParameters();if(!(!i.encodings||i.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let i=e.getVideoTracks()[0];await t.sender.replaceTrack(i),t.sender.setStreams(e);let a=t.sender.getParameters();if(!a.encodings||a.encodings.length<=1)return d.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(a.encodings)}`),null;let s=li(ut.WIDTH,ut.HEIGHT,this._serverSettings.camera?.bitrates?.generic),c=0,u=1;for(let m of a.encodings)m.scalabilityMode=di,m.active=!0,c>=s.streams.length?m.maxBitrate=0:m.maxBitrate=s.streams[c].bitrate,m.scaleResolutionDownBy=u,u=u*2,c++;await t.sender.setParameters(a);let 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,y.isOldDataChannelDescription(),!1,!1,!1,y.isBrokenVP9Encoder(),y.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 _handleTracks(){if(!this._newAudioShareTrack||this._observer)return;let e=this._pc?.getTransceivers().find(t=>t.mid?.endsWith("s"));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(M.ERROR,"replaceTrack-single")}}async _onSignalingNotification(e){if(this._isOpen)switch(e.notification){case L.PRODUCER_UPDATED:await this._onProducerUpdated(e);break;case L.REALLOC_CON:this._reconnect();break;case L.AUDIO_ACTIVITY:this._signalActiveParticipants(e.activeParticipants);break;case L.SPEAKER_CHANGED:this._signalSpeakerChanged(e.speaker);break;case L.STALLED_ACTIVITY:this._signalStalledParticipants(e.stalledParticipants);break;case L.NETWORK_STATUS:this._signalNetworkStatus(e.statuses);break}}_onAsrTranscription(e){this._triggerEvent("ASR_TRANSCRIPTION",e)}async _onProducerUpdated(e){this._producerSessionId&&this._producerSessionId!==e.sessionId&&this._reconnect(),l.breakVideoPayloadTypes&&(d.log("test mode enabled, video switched off"),this._signaling.requestTestMode("breakVideoPayloadTypes",null)),this._producerSessionId=e.sessionId,await this._acceptProducer(e.description)}_onAddTrack(e,t){d.debug("[single] remote track (added)",{track:t.track});let i=t.streams[0];i?(i.onremovetrack||(i.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",i.id,i,s.track)}),i.getTracks().find(s=>s.id===t.track.id)||i.addTrack(t.track),this._rtpReceiversByStreamId[i.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",i.id,i,t.track)):d.error("[single] unable to get media stream from track event")}static _onSignalingStateChange(e,t){d.debug("[single] signaling state changed",{state:e.signalingState},t)}_onConnectionStateChange(e,t){switch(d.debug("[single] connection state changed",{state:e.connectionState},t),R.log(M.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(R.logCustom(M.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(M.ICE_CONNECTION_TYPE,a.local.type),d.debug("Selected ICE candidates",a))}),R.logCustom(M.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){l.consumerScreenDataChannel&&t&&(e=t);let i=(a,s)=>{a.replaceTrack(s).catch(c=>{d.error("ServerTransport: Unable to replace track",c),R.log(M.ERROR,"replaceTrack-single")})};if(d.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),l.simulcast&&y.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(c=>c.direction==="sendonly"&&c.sender?.track?.kind==="video")?.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()}getStreamWaitingTimeMs(e,t){if(!this._pc)return R.log(M.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(M.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(M.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(M.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&ko,p=Math.ceil(u/wo);return Math.min(100,Math.max(0,p))}async _changeSimulcastInfo(e,t){let i=this._mediaSource.getMediaSettings().isVideoEnabled,a=this._findFirstSimTransceiver();if(!l.simulcast||!y.isSimulcastSupportedByBrowser()||!i||!a||!a.sender)return;let s=this._mediaSource.getStream();if(!s)return;let c=s.getVideoTracks()[0],u=c.getSettings().width,p=c.getSettings().height,m=li(u,p,this._serverSettings.camera?.bitrates?.generic),h=t||!Ba(this._simulcastInfo,m);if(!m.streams.length||!h)return;let E=a.sender.getParameters();if(E.encodings||(E.encodings=[{}]),!(E.encodings.length<=1)){if(d.log(`_changeSimulcastInfo: ${u}x${p} command: ${JSON.stringify(m)} `),e){let P=0;for(let w of E.encodings)w.scaleResolutionDownBy=Bi(w.rid),w.scalabilityMode=di,P>=m.streams.length?(w.maxBitrate=0,w.active=!1):(w.active=!0,w.maxBitrate=m.streams[P].bitrate),P++;await a.sender.setParameters?.(E).catch(w=>{d.error("Failed to set sender parameters",E,w)}),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)}}}};var je=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(je||{}),Sr=class extends ne{constructor(e,t,i,a){super();o(this,"_signaling");o(this,"_mediaSource");o(this,"_topology");o(this,"_allocated",[]);o(this,"_opened",[]);o(this,"_directTransport",null);o(this,"_serverTransport",null);o(this,"_serverSettings");o(this,"_dtListeners",[]);o(this,"_stListeners",[]);o(this,"_states",{});o(this,"_localState","IDLE");o(this,"_animojiReceiver",null);o(this,"_animojiSender",null);this._signaling=t,this._mediaSource=i,this._topology=e,this._serverSettings=a,this.subscribe(this._signaling,Me.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._mediaSource,"ANIMOJI_STATUS",this._onAnimojiStatus.bind(this)),this.subscribe(this._mediaSource,"SOURCE_CHANGED",this._onSourceChanged.bind(this)),this._createAnimojiTransport(),e==="SERVER"&&(this._serverTransport=this._createServerTransport())}updateSettings(e){d.log("Update transport settings",e),this._serverSettings=e,this._directTransport&&this._directTransport.updateSettings(e),this._serverTransport&&this._serverTransport.updateSettings(e)}updateStatisticsInterval(){this._directTransport&&this._directTransport.updateStatisticsInterval(),this._serverTransport&&this._serverTransport.updateStatisticsInterval()}allocate(e,t=!1){if(d.log(`Trying allocate participant [${e}]`),this._allocated.indexOf(e)!==-1){d.warn(`The participant [${e}] has already had allocated transport`);return}this._allocated.push(e),this._topology==="DIRECT"&&!this._directTransport&&(this._directTransport=this._createDirectTransport(e,t)),this._topology==="SERVER"&&!this._serverTransport&&(this._serverTransport=this._createServerTransport())}open(e,t=null,i=!1,a=!1){d.log("Trying open participant",{participantIds:e});let s=a;for(let c of e){if(this._opened.indexOf(c)!==-1){d.warn(`The participant [${c}] has already had opened transport`);continue}if(this._allocated.indexOf(c)===-1){d.warn(`The participant [${c}] has no allocated transport`);continue}this._opened.push(c),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(i),this._setStates(e,this._serverTransport.getState()),this._setLocalState(this._serverTransport.getState())),d.debug("The transport has been opened",e))}close(e){let t=this._allocated.indexOf(e),i=this._opened.indexOf(e);t<0&&d.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&i>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),i>=0&&this._opened.splice(i,1),t>=0&&this._allocated.splice(t,1),delete this._states[e]}destroy(){this.unsubscribe();for(let e of this._dtListeners)e.dispose();for(let e of this._stListeners)e.dispose();this._removeAnimojiTransport(),l.audioEffects?.destroy(),this._directTransport?.close(),this._directTransport=null,this._serverTransport?.close(),this._serverTransport=null,this._allocated=[],this._opened=[]}getTopology(){return this._topology}isAllocated(e){return this._allocated.indexOf(e)>=0}allocated(){return this._allocated.slice()}opened(){return this._opened.slice()}getState(){return this._topology==="SERVER"?this._serverTransport?.getState():this._directTransport?.getState()}getStates(){return this._states}setAnimojiSvg(e,t){l.vmoji&&t.isMe&&l.vmoji.AnimojiPreviewGenerator?.setSvgData(t),(!(t.svg instanceof ArrayBuffer)||t.svg.byteLength!==0)&&this._animojiReceiver?.setParticipantSvg(e,t)}setAnimojiFill(e){this._animojiSender?.setFill(e)}async onCameraResolutionChanged(){this._topology==="SERVER"&&this._serverTransport&&await this._serverTransport.onCameraResolutionChanged()}_setStates(e,t){let i=e.filter(a=>this._states[a]!==t?(this._states[a]=t,!0):!1);i.length&&this._triggerEvent("STATE_CHANGED",i,t)}_setLocalState(e){this._localState!==e&&(this._localState=e,this._triggerEvent("LOCAL_STATE_CHANGED",e))}_onSignalingNotification(e){if(e.notification===L.TOPOLOGY_CHANGED)return this._onTopologyChanged(e)}_onTopologyChanged(e){if(e.topology!==this._topology){if(d.log(`Topology changed ${this._topology} -> ${e.topology}`),R.log(M.TOPOLOGY_CHANGE_REQUESTED,e.topology),this._topology=e.topology,this._topology==="SERVER"&&(this._serverTransport?this._serverTransport.allowRestart():(this._serverTransport=this._createServerTransport(),this._opened.length>0&&(this._directTransport?.preventRestart(),this._serverTransport.open()))),this._topology==="DIRECT"){let t=e.offerTo||[],i=e.offerToTypes||[],a=e.offerToDeviceIdxs||[],s=t.length&&i.length?I.composeParticipantId(t[0],i[0],a[0]):null;if(this._serverTransport&&this._serverTransport.preventRestart(),!this._allocated||this._allocated.length===0){d.error("Topology changed to DIRECT, but the list of allocated participants is empty");return}this._allocated.length>1&&d.warn("Topology changed to DIRECT, but the allocated participants count more then one");let c=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let u=s===c;this._directTransport=this._createDirectTransport(c,u)}this._opened.indexOf(c)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let i=new Ci(e,t,this._signaling,this._mediaSource,this._serverSettings);return this._dtListeners.length>0&&d.warn(`The list of direct listeners for the participant [${e}] is not empty`),this._dtListeners=[],this._dtListeners.push(i.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this,e)),i.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this,e)),i.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),i.addEventListener("STATE_CHANGED",this._onDirectTransportChanged.bind(this)),i.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),i.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"DIRECT"))),this._animojiReceiver&&this._animojiSender&&i.setAnimojiTransport(this._animojiReceiver,this._animojiSender),i}_createServerTransport(){let e=new Pi(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(M.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(M.PAT_WAITING_TIME_ERROR,"noTransport"),d.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var xe=class xe{constructor(){o(this,"trackerByTransport",{ws:new ot,wt:new ot});o(this,"lastSeen",{})}static create(){xe._instance||(xe._instance=new xe)}static mark(r){if(!xe._instance)return;let e=Date.now(),t=xe._instance.lastSeen[r];if(typeof t=="number"){let i=e-t;i>=0&&xe._instance.trackerByTransport[r].add(i)}xe._instance.lastSeen[r]=e}static logMetrics(r){xe._instance&&["ws","wt"].forEach(e=>{if(!xe._instance.trackerByTransport[e].hasData)return;let t=xe._instance.trackerByTransport[e].snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:Y.SIGNALING_PING_SUMMARY,min_value:t.min,max_value:t.max,avg_value:t.avg,median_value:t.median,p95_value:t.p95,values_count:t.count,signaling_transport:e})})}static destroy(){xe._instance?._destroy()}_destroy(){this.trackerByTransport={ws:new ot,wt:new ot},this.lastSeen={}}};o(xe,"_instance");var dt=xe;var Be=class Be{constructor(){o(this,"trackerByCommand",new Map)}static create(){Be._instance||(Be._instance=new Be)}static mark(r,e,t){if(!Be._instance)return;let i=`${r}|${t}`,a;Be._instance.trackerByCommand.has(i)?a=Be._instance.trackerByCommand.get(i):(a=new ot,Be._instance.trackerByCommand.set(i,a)),a.add(e)}static logMetrics(r){if(Be._instance)for(let[e,t]of Be._instance.trackerByCommand.entries()){if(!t.hasData)continue;let[i,a]=e.split("|"),s=t.snapshot();R.logClientStats({call_topology:r==="DIRECT"?"D":"S",name:Y.SIGNALING_COMMAND_SUMMARY,api_method:i,min_value:s.min,max_value:s.max,avg_value:s.avg,median_value:s.median,p95_value:s.p95,values_count:s.count,signaling_transport:a})}}static destroy(){Be._instance?._destroy()}_destroy(){this.trackerByCommand.clear()}};o(Be,"_instance");var lt=Be;var Mn=(i=>(i.START="start",i.ACCEPT="accept",i.JOIN="join",i.RETRY="retry",i))(Mn||{}),Qe=Mn;var An={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,addParticipant:()=>l.addParticipant},Bt=class{static getFlags(){let r=Object.values(An),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(An).reduce((t,i,a)=>(t[i]=!!(e&1<<a),t),{})}};import*as He from"fflate";var xo=63n,No=16383n;var Lo=4611686018427387903n,vr=class{encode(r){let e=typeof r=="number"?BigInt(r):r;if(e<=xo)return new Uint8Array([Number(e)]);if(e<=No)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<=Lo)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")}},Ir=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 Er=class{constructor(r){o(this,"encoder");o(this,"compression");o(this,"lengthEncoder");this.encoder=new TextEncoder,this.lengthEncoder=new vr,this.compression=r??null}encode(r){let e=this.encoder.encode(r);e=this.compress(e);let t=this.lengthEncoder.encode(e.length),i=new Uint8Array(t.length+e.length);return i.set(t),i.set(e,t.length),i}compress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return He.gzipSync(r);case"deflate":return He.zlibSync(r);case"deflate-raw":return He.deflateSync(r);default:return r}}},Tr=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 Ir,this.compression=r??null,this.buffer=new Uint8Array(0),this.expectedLength=null,this.offset=0}decode(r){let e=[];for(this.buffer=new Uint8Array([...this.buffer,...r]);this.buffer.length>0;){if(this.expectedLength===null){if(this.expectedLength=this.readLength(this.buffer),this.expectedLength===null)return e;this.offset=this.lengthPrefixLength}if(this.buffer.length-this.offset<this.expectedLength)return e;let t=this.buffer.subarray(this.offset,this.offset+this.expectedLength);t=this.decompress(t),e.push(this.decoder.decode(t)),this.buffer=this.buffer.subarray(this.offset+this.expectedLength),this.expectedLength=null,this.offset=0}return e}readLength(r){if(r.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(r),this.lengthPrefixLength<0)throw new Error("Invalid length prefix");let e=this.lengthDecoder.decode(r.subarray(0,this.lengthPrefixLength));return e===null?null:Number(e)}decompress(r){if(!this.compression)return r;switch(this.compression){case"gzip":return He.gunzipSync(r);case"deflate":return He.unzlibSync(r);case"deflate-raw":return He.inflateSync(r);default:return r}}};var Zt=class{constructor(r,e={}){o(this,"webTransport");o(this,"stream",null);o(this,"writer",null);o(this,"reader",null);o(this,"url");o(this,"options");o(this,"compression");o(this,"encoder");o(this,"decoder");o(this,"onopen",null);o(this,"onmessage",null);o(this,"onerror",null);o(this,"onclose",null);o(this,"readyState",WebSocket.CONNECTING);this.url=r,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(r),this.encoder=new Er(this.compression),this.decoder=new Tr(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"?y.browserName()==="Firefox"?l.webtransportFF:y.browserName()!=="Safari":!1}};var Dn="open",Uo=10,Bo=["service-unavailable","conversation-ended","invalid-token"],ei=class n extends ci{constructor(){super(...arguments);o(this,"socket",null);o(this,"sequence",1);o(this,"lastStamp",0);o(this,"websocketCommandsQueue",[]);o(this,"datachannelCommandsQueue",[]);o(this,"incomingCache",[]);o(this,"responseHandlers",{});o(this,"connectionType");o(this,"reconnectCount",0);o(this,"endpoint");o(this,"wtEndpoint",null);o(this,"conversationResolve",null);o(this,"conversationReject",null);o(this,"connected",!1);o(this,"listenersReady",!1);o(this,"postfix","&platform="+l.platform+"&appVersion="+l.appVersion+"&version="+l.protocolVersion+"&device="+l.device+"&capabilities="+Bt.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 pr)}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(M.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===Dn&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){R.log(M.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(M.SOCKET_ACTION,"invalid_state"),d.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(c),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((c,u)=>{let p=(P,w=!1)=>{!a||w?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: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,Uo)}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===Qe.RETRY&&this.lastStamp&&(i+=`&recoverTs=${this.lastStamp}`),i=a(i),t?(i+="&compression=deflate-raw",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===Qe.RETRY?"reconnected":"connected"),this.socket.onopen=this._onOpen.bind(this),this.socket.onmessage=this._onMessage.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this._startDoctor();function a(s){if(!l.useParticipantListChunk)return s;let c=l.participantListChunkInitIndex;s+=`&partIdx=${c}`;let u=l.participantListChunkInitCount;return u!==null&&(s+=`&partCount=${u}`),s}}_disconnect(e){this.socket&&this.socket.readyState<WebSocket.CLOSING&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,this.socket.close(e),this.socket=null),this._stopWaitConnectionMessage(),this._stopDoctor(),clearTimeout(this.reconnectTimer)}_onOpen(){d.debug("[signaling] socket opened"),R.log(M.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor(),this._logTransportStat(this.connectionType===Qe.RETRY?"reconnected":"connected")}_onMessage(e){if(this._startDoctor(),e.data==="ping"){dt.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(M.SOCKET_ACTION,"parse_error"),d.error("[signaling] unable to parse message",t,e.data)}}_handleMessage(e){switch(e.type){case"notification":e.notification==="connection"?(d.debug("[signaling] signaling connected",e),this.connected=!0,this.reconnectCount=0,this.endpoint=e.endpoint,e.peerId&&this.peerId!==e.peerId.id&&(this.postfix+=`&peerId=${e.peerId.id}`,this.peerId=e.peerId.id),this._stopWaitConnectionMessage(),this.conversationResolve?this.conversationResolve(e):(this._logTransportStat("restart"),this._triggerEvent(Me.RECONNECT,e),e.conversation.topology&&this._triggerEvent(Me.NOTIFICATION,{type:"notification",notification:L.TOPOLOGY_CHANGED,topology:e.conversation.topology})),this.lastStamp&&this._handleCachedMessages(),e.recoverMessages?.forEach(t=>{t.notification===L.ACCEPTED_CALL&&t.peerId.id===this.peerId&&t.peerId.type==="WEB_TRANSPORT"||this._handleMessage(t)}),this._handleCommandsQueue(this.websocketCommandsQueue)):!this.connected||!this.listenersReady?this.incomingCache.push(e):this._triggerEvent(Me.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:R.log(M.SOCKET_ACTION,"unknown_message"),d.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){R.log(M.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Bo.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":this._reconnect();break;case"conversation-ended":this.conversationReject?this.conversationReject(new G(e.reason||se.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(Me.NOTIFICATION,{notification:L.CLOSED_CONVERSATION,reason:e.reason});break;case"participant-not-found":case"invalid-token":this._throwError(new Error(`Signaling error: ${e.error}`));break;default:if(!t)break;this.connected?this._throwError(new Error(`Signaling error: ${e.error}`)):e.sequence||(this.conversationReject?.(new G(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(Me.FAILED,e)}_onError(e){R.log(M.SOCKET_ACTION,"error"),d.error("[signaling] signaling error",e),this._logTransportStat("failed_exception",{string_value:JSON.stringify(e)})}_onClose(e){R.log(M.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 Error("Connection closed"))}_closeSocket(e=null){this.socket&&(this._disconnect(),Object.values(this.responseHandlers).forEach(t=>{window.clearTimeout(t.responseTimer),e&&t.reject(new Error("Connection closed"),!0)}),this.websocketCommandsQueue=[],this.responseHandlers={},this.lastStamp=0,e&&this._throwError(new G(k.SOCKET_CLOSED)))}_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(M.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,Qe.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&&lt.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(M.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(M.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!==Dn){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]=pn(t[a]));return{layouts:i}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new G(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.doctorTimer=window.setTimeout(()=>{this.isWebTransportAvailable()?d.warn("[signaling] socket is dead. Fallback to WebSocket. Trying to connect"):d.warn("[signaling] socket is dead, trying to reconnect"),this._logTransportStat("failed_pings"),this._disconnect(4e3),this._connect(Qe.RETRY,!1)},n.WAIT_MESSAGE_DELAY)}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return Zt.isBrowserSupported()&&this.wtEndpoint!==null&&l.webtransport}_getSocketType(){return this.socket instanceof Zt?"wt":"ws"}_markTransportStat(e){let t=this._getSocketType(),i=oa[e][t];pe.setMark(i)}_logTransportStat(e,t){let i=this._getSocketType(),a=oa[e][i];ye.logEventualStat({name:a,...t})}};var wn=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(wn||{}),Ne=wn;var kn=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(kn||{}),pt=kn;var On=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(On||{}),la=On;var xn=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(xn||{}),pa=xn;var Nn=(s=>(s.REQUIRE_AUTH_TO_JOIN="REQUIRE_AUTH_TO_JOIN",s.AUDIENCE_MODE="AUDIENCE_MODE",s.WAITING_HALL="WAITING_HALL",s.ASR="ASR",s.FEEDBACK="FEEDBACK",s.RECURRING="RECURRING",s))(Nn||{}),ti=Nn;function Ln(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function Un(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 Bn=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(Bn||{}),Ge=Bn;var Fn=(i=>(i.CALLED="CALLED",i.ACCEPTED="ACCEPTED",i.REJECTED="REJECTED",i.HUNGUP="HUNGUP",i))(Fn||{}),Q=Fn;var Vn=(i=>(i.UPDATE="UPDATE",i.REMOVE="REMOVE",i.ACTIVATE="ACTIVATE",i.TIMEOUT="TIMEOUT",i))(Vn||{}),yi=Vn;var jn=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(jn||{}),Hn=jn;function Gn(n){switch(n){case 1:return"no-available-tracks";default:return"unknown-error"}}var Wn=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(Wn||{}),vt=Wn;function bi(n,r){if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var ua=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(ua||{}),$;(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,w=h.deviceIdx??0;if(P)return t(P,w)}m.fromSignalingParticipant=e;function t(h,E=0){return{id:h.id,type:h.type==="ANONYM"?"ANONYM":"USER",deviceIdx:E}}m.fromSignaling=t;function i(h){return h.id}m.toSignaling=i;function a(h){let E=h.deviceIdx||0;return`{"id":"${h.id}","type":"${h.type}","deviceIdx":${E}}`}m.toString=a;function s(h,E="USER",P=0){return a(r(h,E,P))}m.fromIdToString=s;function c(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}m.fromString=c;function u(h,E){return h.id===E.id&&h.type===E.type&&h.deviceIdx===E.deviceIdx}m.compare=u;function p(h){return h?.deviceIdx||0}m.getDeviceIdx=p})($||($={}));function Kn(n){try{return btoa(JSON.stringify(n))}catch(r){d.warn("WaitingParticipant: failed convert to string",n,r)}return null}function qn(n){try{return JSON.parse(atob(n))}catch(r){d.warn("WaitingParticipant: failed convert from string",n,r)}return null}var Rr=(n,r)=>I.objectReduce(n,(e,t,i)=>(t===r&&e.push(i),e),[]);function $n(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 Fo(n,r){switch(n){case de.AUDIO:return!!r.isAudioEnabled;case de.AUDIO_SHARING:return!!r.isAudioSharingEnabled;case de.VIDEO:return!!r.isVideoEnabled;case de.SCREEN_SHARING:return!!r.isFastScreenSharingEnabled||!!r.isScreenSharingEnabled;default:return!1}}function zn(n,r){return I.objectReduce(n,(e,t,i)=>{switch(t){case Ge.MUTE:case Ge.MUTE_PERMANENT:{Fo(i,r)||(e[i]=t);break}default:e[i]=t;break}return e},{})}function Jn(n){let{muteStates:r={},mediaSettings:e}=n;return zn(r,e)}function Yn(n,r){let e=n.conversation.participants.find(i=>I.comparePeerId(i.peerId,n.peerId));if(!e)return r;let{mediaSettings:t}=e;return zn(r,t)}function Qn(n,r){let e=new Uint8Array(r),t=0,i=0;for(;t<n.length&&i<r;){let a=n[t++],s=a>>4,c=a&15;if(s===15){let m;do m=n[t++],s+=m;while(m===255)}for(let m=0;m<s&&!(i>=r);m++)e[i++]=n[t++];if(t>=n.length||i>=r)break;let u=n[t]|n[t+1]<<8;if(t+=2,c===15){let m;do m=n[t++],c+=m;while(m===255)}c+=4;let p=i-u;for(let m=0;m<c&&!(i>=r);m++)e[i++]=e[p+m]}return e}var ii=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(M.ERROR,`audio_device_recover_${r.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!r.bandwidth&&(this._fixNoPacketsApplied=!0,R.log(M.ERROR,"audio_device_recover"),d.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(y.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(M.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(d.log("[AudioFix] Fixed RV"),R.log(M.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):i>e&&(this._fixTooManyPacketsApplied=!0,R.log(M.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 Mi=class{constructor(r){o(this,"_output",null);o(this,"_volume",1);o(this,"_features",{setSinkId:!!Audio.prototype.setSinkId});o(this,"_statFirstMediaReceived");this._statFirstMediaReceived=r}add(r){this.destroy(),this._output={},this._output.audioTrack=r,this._initAudioElement()}remove(r){!this._output||this._output.audioTrack!==r||this.destroy()}get volume(){return this._volume}set volume(r){this._volume=Math.max(0,Math.min(1,r)),this._output&&this._output.audioElement&&(this._output.audioElement.volume=this._volume)}_initAudioElement(){if(l.muteMode||!this._output?.audioTrack)return;let r=y.browserName()!=="Safari"||y.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=y.getSavedOutput();r&&await this._output.audioElement.setSinkId?.(r.deviceId)}catch(r){throw R.log(M.ERROR,"change_output"),d.error("[audio] Output change failed",r),r}}};var Vo=90,jo=3,Ai=class extends ne{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>Vo?d.warn(`High memory usage: ${t}% (${i} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=jo)&&(d.debug(`Memory usage: ${t}% (${i} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var Ho=44100,Ft=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=y.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=Ho/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 Di=class extends ne{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);let t=()=>{this._detector&&v.onLocalVolume(this._detector.getLevel().real,e.getMediaSettings().isAudioEnabled),this._interval=window.setTimeout(t,l.voiceParams.interval)};this._interval=window.setTimeout(t,l.voiceParams.interval);let i=()=>{let a=e.getSendAudioTrack();a&&this.init(a)};this.subscribe(e,"SOURCE_CHANGED",a=>{a.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&i()}),this.subscribe(e,"SOURCE_READY",i),i()}init(e){this._stopDetector(),this._detector=new Ft("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 Cr=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 Pr=class extends ne{constructor(e){super();o(this,"_detector",null);o(this,"_interval",null);o(this,"_activeParticipants");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 Ft(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===Ye.AUDIO_MIX){if(this._activeParticipants)for(let a of this._activeParticipants)e[a]=i}else e[t]=i;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null)}};var yr=class extends ne{constructor(e,t,i){super();o(this,"_speakerId",null);o(this,"_serverSideSpeakerDetection",!1);this._serverSideSpeakerDetection=i==="SERVER",this.subscribe(e,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this.subscribe(t,"SIGNALLED_SPEAKER_CHANGED",this._onServerSpeakerChanged.bind(this)),this.subscribe(t,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this))}destroy(){this.unsubscribe()}_onVolumesDetected(e){if(this._serverSideSpeakerDetection)return;let t=0,i=null;if(Object.keys(e).forEach(a=>{let s=e[a].smoothed;s>t&&s>l.voiceParams.threshold&&(t=s,i=a)}),i&&i!==this._speakerId){let a=this._speakerId&&Object.hasOwn(e,this._speakerId)?e[this._speakerId].smoothed:0;t>a*l.voiceParams.speakerLevelMultiplier&&(this._speakerId=i,this._triggerEvent("SPEAKER_CHANGED",i))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent("SPEAKER_CHANGED",e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e==="SERVER"}};var wi=class extends ne{constructor(e,t,i){super();o(this,"_transport");o(this,"_volumes",{});o(this,"_participants",{});o(this,"_connectionTimeout",0);o(this,"_volumeTimeout",0);this._transport=e,this._participants=i,this.subscribe(e,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(t,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this))}destroy(){this.unsubscribe(),this._connectionTimeout&&window.clearTimeout(this._connectionTimeout),this._volumeTimeout&&window.clearTimeout(this._volumeTimeout)}onChangeRemoteMediaSettings(e,t){t.isAudioEnabled||(this._volumes[e]=1),t.isAudioEnabled&&(this._volumes[e]=0)}_onTransportStateChanged(e,t){t==="OPENED"&&(this._connectionTimeout||(this._connectionTimeout=window.setTimeout(this._onConnectionTimeout.bind(this),l.specListenerParams.connectionTimeout)),this._volumeTimeout||(this._volumeTimeout=window.setTimeout(this._onVolumeTimeout.bind(this),l.specListenerParams.volumeTimeout))),t==="FAILED"&&this._connectionTimeout&&(d.warn("Transport failed, send callSpecError"),R.log(M.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(M.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(M.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${i}`))}),e.length&&d.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var br=class n{static correctHangupReason(r){switch(r){case k.HUNGUP:return"hangup";case k.CANCELED:return"canceled";case k.REJECTED:return"rejected";case k.BUSY:return"busy";case k.FAILED:return"failed";case k.MISSED:return"missed";case k.ANOTHER_DEVICE:return"another_device";case k.REMOVED:return"removed";case k.BANNED:return"banned";case k.VCHAT_DETAILED_ERROR:return"error";default:return"hangup"}}static sendHangupEvent(r,e){if(![k.HUNGUP,k.CANCELED,k.REJECTED,k.FAILED,k.BUSY,k.MISSED,k.ANOTHER_DEVICE,k.REMOVED,k.BANNED,k.VCHAT_DETAILED_ERROR].includes(r.hangup))return;let i=r.custom_error?.vchat_detailed_api_error?.code;R.logClientStats({name:Y.CALL_FINISH,reason:n.correctHangupReason(r.hangup),call_topology:e==="DIRECT"?"D":"S",...i&&{string_value:i}})}};var Mr=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(Y.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&ye.logEventualStat({name:Y.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var Go=1e3,Wo=1e4;var Ko=15,q=class q extends ne{constructor(e,t){super();o(this,"_api");o(this,"_signaling");o(this,"_signalingActor");o(this,"_mediaSource",null);o(this,"_conversation",null);o(this,"_myLastRequestedLayouts",{});o(this,"_state","IDLE");o(this,"_participantState",Q.CALLED);o(this,"_participants",{});o(this,"_pendingParticipants",new Map);o(this,"_transport",null);o(this,"_debugInfo",null);o(this,"_volumesDetector",null);o(this,"_speakerDetector",null);o(this,"_localVolumeDetector",null);o(this,"_specListener",null);o(this,"_activeSpeakerId",null);o(this,"_lastSignalledActiveSpeakerId",null);o(this,"_isRealTimeAsrRequested",!1);o(this,"_serverSettings",{camera:null,screenSharing:null});o(this,"_onUnload");o(this,"_audioOutput");o(this,"_lastStalled",{});o(this,"_audioMixStalled",!1);o(this,"_audioFix",null);o(this,"_streamByStreamId",new Map);o(this,"_streamIdByStreamDescription",new Map);o(this,"_streamWaitTimerByStreamDescription",new Map);o(this,"_sequenceNumberByStreamDescription",new Map);o(this,"_cooldownTimestampByStreamDescription",new Map);o(this,"_cooldownQueueCleanupTimer",null);o(this,"_statFirstMediaReceived");o(this,"_changeMediaSettings",I.debounce(async e=>{if(this._signaling.ready)try{await this._signaling.changeMediaSettings(e)}catch(t){if(d.warn("changeMediaSettings failed with error",t),t.message==="chatRoom.maxShareCountExceeded")return this.toggleScreenCapturing({captureScreen:!1,fastScreenSharing:!1,captureAudio:!1})}},100));R.create(e,t),R.setConversationIdProvider(()=>this._conversation?.id||null),ye.create(),rt.create(()=>this._transport?.getTopology()),dt.create(),lt.create(),this._api=e,this._signaling=new ei,this._signalingActor=new Cr(this._onSignalingNotification.bind(this)),this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id),l.clientEventsLoggingEnabled&&R.logClientEvent({event_type:Y.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),R.destroy(),ye.destroy(),rt.destroy(),dt.destroy(),lt.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new Mr,this._audioOutput=new Mi(this._statFirstMediaReceived),l.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),Go))}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:p,onFastStart:m}){if(q._activationMutex)throw R.log(M.ERROR,"startCall"),d.warn("Conversation: there is already running activation"),new G(k.FAILED);let h=Date.now();q._activationMutex=!0,Oe.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(i);let E=this._mediaSource.getMediaSettings();t===pt.CHAT||e&&e.length>1?this._logWithMediaSettings(M.OUTGOING_MULTIPARTY_CALL,E):this._logWithMediaSettings(M.OUTGOING_CALL,E);let P=await this._startConversation({opponentIds:e,opponentType:t,direction:Ne.OUTGOING,mediaOptions:i,payload:a,joiningAllowed:s,requireAuthToJoin:c,onlyAdminCanShareMovie:u,externalIds:p,startedTime:h,onFastStart:m});if(!this._conversation)throw new G(k.UNKNOWN_ERROR);if(this._participantState=Q.ACCEPTED,this._changeMediaSettings(E),await this._processConnection(P),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),this._signaling.readyToSend(),q._delayedHangup)throw new G(k.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(M.ERROR,"joinCall"),d.warn("Conversation: there is already running activation"),new G(k.FAILED);let t=Date.now();q._activationMutex=!0,this._state="PROCESSING",Oe.startSession();try{let i=!!e.observedIds?.length;if(i&&l.videoTracksCount>0)throw d.error("Observer mode: please set videoTracksCount=0"),new G(k.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!i);let a=this._mediaSource.getMediaSettings();this._logWithMediaSettings(M.JOIN_CONVERSATION,a);let s=await this._joinConversation(e,t);if(!this._conversation)throw new G(k.UNKNOWN_ERROR);return this._conversation.observer=i,v.onLocalStream(this._mediaSource.getStream(),a),this._conversation.waitingHall?(d.log("In waiting hall"),q._current=this,q._activationMutex=!1,this._signaling.readyToSend(),v.onLocalStatus("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=Q.ACCEPTED,!this._conversation||!this._mediaSource)throw new G(k.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 G(k.CANCELED);await this._processConnectionSharedMovieInfo(e),await this._processConversationUrlSharingInfo(e),await this._processConnectionAsrInfo(e);let t=await this._extractExternalRoomsData(e.rooms?.rooms,e.rooms?.roomId);return 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,this._openTransport(Object.values(await this._getParticipants()),!1),this._conversation.audienceMode&&!this._conversation.restricted&&this._forceOpenTransportForAloneInCall(),this._conversation.recordsInfoByRoom.get(e?.rooms?.roomId??null)&&this._forceOpenTransportForAloneInCall(),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 G(k.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 G(k.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(M.PUSH,"rejected"),new G(k.REJECTED);if(Oe.startSession(),await this._processConnection(u),this._extractConnectionUrlSharingInfo(u),await this._allocateTransport(),this._createSpeakerDetector(),await this._createSpecListener(),await this._processPinnedParticipants(u),this._signaling.readyToSend(),this._logCallStartEvent(c,Ne.INCOMING),R.log(M.PUSH,"accepted"),q._current=this,q._delayedHangup)throw new G(k.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||[]).indexOf(ti.WAITING_HALL)<0?!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(ti.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new G(k.UNKNOWN_ERROR);this._state="PROCESSING";let e=this._mediaSource.getMediaSettings();this._logWithMediaSettings(M.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),c=new Uint8Array(s.length);for(let u=0;u<s.length;u++)c[u]=s.charCodeAt(u);try{let p=Qn(c,a).reduce((Te,Ae)=>(Te+=String.fromCharCode(Ae),Te),""),{srcp:m,stne:h,tkn:E,trne:P,trnp:w,trnu:V,wse:z,wte:oe}=JSON.parse(p);return{token:E,endpoint:z,wt_endpoint:oe,turn_server:{urls:P.split(","),username:V,credential:w},stun_server:{urls:h.split(",")},client_type:m}}catch(u){throw this._close(u,"Can't decompress conversation params"),u}}_logCallStartEvent(e,t){let i={[Ne.OUTGOING]:"outgoing",[Ne.INCOMING]:"incoming",[Ne.JOINING]:"join"};ye.logEventualStat({name:Y.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(M.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 G(k.UNKNOWN_ERROR);this._state="PROCESSING",d.debug("Accept incoming call",e);try{await this._mediaSource.request(e);let t=this._mediaSource.getMediaSettings();this._logWithMediaSettings(M.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 c=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(v.onCallAccepted(),v.onLocalStream(this._mediaSource.getStream(),t),v.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),await this._getMainRoomParticipants(),c),l.useParticipantListChunk){let u=await this._getInitialParticiapntListChunk(),p=await this._getParticipants();u?.participants?.forEach(m=>{let h=I.composeId(m),E=p[h];E&&(E.movieShareInfos=m.movieShareInfos)}),await this._onConversationParticipantListChunk({participants:u})}return v.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeNeedRate(),this._state="ACTIVE",this._changeFeatureSet(),this._openTransport(Object.values(await this._getParticipants()),!0),await this._processConversationUrlSharingInfo(),await this._processConnectionAsrInfo(),this._conversation}catch(t){throw this._close(t,"Unable to accept call"),t}}async decline(){if(this._state!=="IDLE")throw R.log(M.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(M.DECLINE_INCOMING,this._mediaSource?.getMediaSettings()),this._participantState=Q.HUNGUP,this._signaling.ready&&await this._signaling.hangup(k.REJECTED),this._close(new G(k.REJECTED))}async hangup(){d.debug("Hangup");let e=this._state==="ACTIVE"?k.HUNGUP:k.CANCELED;R.log(M.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new G(e))):v.onHangup(new G(k.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new G(k.UNKNOWN_ERROR),"Unable to add participant");return}let i=await this._signaling.addParticipant(e.map($.toSignaling),t),a=null;i.type==="error"&&(i.error==="call-unfeasible"?a=i.status:a=k.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 G(k.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=k.UNKNOWN_ERROR);let s=i.participants;for(let c of s)await this._onAddParticipant(I.composeId(c),c,a)}async removeParticipant(e,t=!1){this._signaling.ready&&(await this._signaling.removeParticipant(e,t),this._onRemoveParticipant(e))}setVolume(e){this._audioOutput.volume=e}updateStatisticsInterval(){this._transport&&this._transport.updateStatisticsInterval()}_openTransport(e,t){if(!this._transport)return;let i=[];for(let a of e)(a.state===Q.CALLED||a.state===Q.ACCEPTED)&&(this._transport.isAllocated(a.id)||this._transport.allocate(a.id,t)),a.state===Q.ACCEPTED&&i.push(a.id);i.length&&this._transport.open(i,null,!!this._conversation?.observer)}async _close(e,t){t&&d.error(t,e),d.debug("Close conversation",e),br.sendHangupEvent(e,this._transport?.getTopology()),rt.destroy(),dt.logMetrics(this._transport?.getTopology()),dt.destroy(),lt.logMetrics(this._transport?.getTopology()),lt.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(k.FAILED):R.log(M.ERROR,e.hangup),q._activationMutex=!1;let i=this._conversation&&this._conversation.id;if([k.CANCELED,k.NOT_FRIENDS,k.CALLEE_IS_OFFLINE,k.CALLER_IS_BLOCKED,k.CALLER_IS_REJECTED].indexOf(e.hangup)!==-1||e.hangup===k.REJECTED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(e.hangup===k.HUNGUP&&(!e.remote||this._isCalledState())){v.onHangup(e,i),this.destroy();return}if(e.hangup===k.MISSED&&!e.remote){v.onHangup(e,i),this.destroy();return}if(this._cooldownQueueCleanupTimer!==null&&(window.clearInterval(this._cooldownQueueCleanupTimer),this._cooldownQueueCleanupTimer=null),(e.hangup===k.SOCKET_CLOSED||e.hangup===k.NOT_FOUND)&&q._current&&!this._conversation){this._cleanupSignaling(),this._cleanupMediaSource();return}if(e.hangup===k.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(),ye.destroy(),this._conversation=null,this._myLastRequestedLayouts={},q._current=null,q._delayedHangup=!1,v.onHangup(e||new G(k.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(),ye.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,p,m)=>m.indexOf(u)===p);c.push(`${c[c.length-1]}?transport=tcp`),i.push({urls:c,username:a.username,credential:a.credential})}return l.iceServers=i,l.wssBase=t.endpoint,t.wt_endpoint&&(l.wtsBase=t.wt_endpoint),l.wssToken=t.token,t.client_type&&(l.clientType=t.client_type),t.external_user_type&&(l.externalUserType=t.external_user_type),t}_setConversationParams({turn_server:e,stun_server:t,endpoint:i,wt_endpoint:a,token:s,client_type:c}){let u=[];if(t&&u.push(t),e&&e.urls){let p=e.urls.filter((m,h,E)=>E.indexOf(m)===h);p.push(`${p[p.length-1]}?transport=tcp`),u.push({urls:p,username:e.username,credential:e.credential})}l.iceServers=u,l.wssBase=i,l.wssToken=s,a&&(l.wtsBase=a),c&&(l.clientType=c)}_addGeoParamsToEndpoint(e,t){return t.isp_as_no&&(e+=`&ispAsNo=${t.isp_as_no}`),t.isp_as_org&&(e+=`&ispAsOrg=${t.isp_as_org}`),t.loc_cc&&(e+=`&locCc=${t.loc_cc}`),t.loc_reg&&(e+=`&locReg=${t.loc_reg}`),e}async _startConversation({opponentIds:e,opponentType:t,direction:i,mediaOptions:a,payload:s="",joiningAllowed:c=!1,requireAuthToJoin:u=!1,onlyAdminCanShareMovie:p,externalIds:m,startedTime:h,onFastStart:E}){pe.setMark(Y.SIGNALING_CONNECTED);let P=I.uuid();d.debug("Conversation: start",{conversationId:P,opponentIds:e,opponentType:t,direction:i});let w=a.includes(de.VIDEO),V;if(E)try{let oe={deviceId:this._api.deviceId(),sdkVersion:l.sdkVersion,clientAppKey:l.apiKey,platform:l.platform,protocolVersion:l.protocolVersion,domainId:l.domain},Te=JSON.stringify(oe),Ae=await E({internalParams:Te,conversationId:P,externalIds:m,opponentType:t,mediaOptions:a,isVideo:w,joiningAllowed:c,requireAuthToJoin:u}),ee=JSON.parse(Ae.internalCallerParams);V={endpoint:ee.endpoint,wt_endpoint:ee.wtEndpoint,id:P,is_concurrent:ee.isConcurrent,client_type:ee.clientType,rejected_participants:Ae.rejectedParticipants,stun_server:ee.stun,turn_server:ee.turn,token:new URL(ee.endpoint).searchParams.get("token")??""},d.debug("FastStart",V)}catch{throw new G(k.UNKNOWN_ERROR,{message:"Cannot parse internal params"})}else V=await this._api.startConversation(P,e,t,w,s,c,u,{onlyAdminCanShareMovie:p},m),d.debug("Api.startConversation",V);this._setConversationParams(V);let z=await this._connectSignaling(Qe.START,V);return await this._setConversation(V,z,i),this._logCallStartEvent(h,Ne.OUTGOING),z}async _joinConversation(e,t){pe.setMark(Y.SIGNALING_CONNECTED);let{conversationId:i,mediaOptions:a,chatId:s,joinLink:c,observedIds:u,payload:p}=e;d.debug("Conversation: join",{conversationId:i,joinLink:c,observedIds:u});let m=a.includes(de.VIDEO),h;if(i)h=await this._api.joinConversation(i,m,s);else if(c)h=await this._api.joinConversationByLink(c,m,u,p);else throw new G(k.UNKNOWN_ERROR);d.debug("Api.joinConversation",h),this._setConversationParams(h);let E=await this._connectSignaling(Qe.JOIN,h);return await this._setConversation(h,E,Ne.JOINING),this._logCallStartEvent(t,Ne.JOINING),E}async _prepareConversation(e,t=ae.USER,i,a,s){pe.setMark(Y.SIGNALING_CONNECTED),d.debug("Conversation: push",{conversationId:e,type:t,peerId:i});let c=this._api.getUserId();if(!c)throw new G(k.UNKNOWN_ERROR);let u=0,p="",m="",h={id:e,peerId:i,endpoint:p,wt_endpoint:m,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(a){let P=this._decodeExternalConversationParams(a);this._setConversationParams(P),p=s??`${l.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,h.token=P.token,h.endpoint=p,l.wtsBase&&(m=`${l.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,h.wt_endpoint=m)}else{let P=await this._getConversationParams(e);u=P.device_idx||0,p=s??`${l.wssBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,p=this._addGeoParamsToEndpoint(p,P),h.token=P.token,h.endpoint=p,h.device_idx=u,l.wtsBase&&(m=`${l.wtsBase}?userId=${c}&entityType=${t}&deviceIdx=${u}&conversationId=${e}&token=${l.wssToken}`,m=this._addGeoParamsToEndpoint(m,P),h.wt_endpoint=m)}let E=await this._connectSignaling(Qe.ACCEPT,h);return q._current&&(q._current._participantState===Q.ACCEPTED||q._current._participantState===Q.CALLED)?(d.log("Push rejected (busy)"),R.log(M.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(k.BUSY),Promise.reject(new G(k.BUSY))):(q._current&&(q._current.destroy(),q._current=null),await this._setConversation(h,E,Ne.INCOMING,t),E)}async _createParticipant(e,t){let i=Object.assign({id:null,externalId:null,mediaSettings:Re(),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 G(k.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=$.fromSignalingParticipant(h,!1);if(P){this._api.cacheExternalId(E,P);let w=I.composeDecorativeId(h),V=$.fromSignalingParticipant(h);w&&V&&(this._api.cacheExternalId(w,V),this._api.mapDecorativeId(h.decorativeUserId,h.id))}});let c=this._api.getUserId(),u=(t.conversation.participants||[]).find(h=>h.id===c||I.comparePeerId(h.peerId,t.peerId)),p=e.device_idx||0;if(!c){if(!u)throw new G(k.UNKNOWN_ERROR);c=Number(u.id),u.idType&&(a=u.idType),u.deviceIdx&&(p=u.deviceIdx),this._api.setUserId(c)}let m=I.composeParticipantId(c,a,p);this._conversation={userId:c,compositeUserId:m,externalId:await this._getExternalIdByParticipantId(m),acceptTime:t.conversation.acceptTime,features:t.conversation.features||[],featuresPerRole:t.conversation.featuresPerRole,id:t.conversation.id||e.id,participantsLimit:t.conversation.participantsLimit||30,topology:t.conversation.topology||"DIRECT",direction:i,concurrent:t.isConcurrent||e.is_concurrent||!1,needRate:!1,chatId:t.conversation.multichatId,roles:u?.roles??[],recordsInfoByRoom:new Map,asrInfoByRoom:new Map,muteStates:new Map,muteStatesPersonal:{},joinLink:e.join_link??t.conversation.joinLink,pinnedParticipantIdByRoom:new Map,mediaModifiers:t.mediaModifiers,options:[],networkRating:1,waitingHall:this._isInWaitingHall(t),observer:!1,asrInfo:t.conversation.asrInfo||null,roomId:t.rooms?.roomId||null,audienceMode:this._isAudienceMode(t),restricted:this._isRestricted(t),urlSharingInfoByRoom:new Map},Oe.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(l.forceRelayPolicy=e.p2p_forbidden),R.log(M.RELAY_POLICY,l.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._changeFeaturesPerRole(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new G(k.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}_createMediaSource(){let e=new qi;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new ii(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint??null),this.subscribe(this._signaling,Me.NOTIFICATION,a=>this._signalingActor.add(a)),this.subscribe(this._signaling,Me.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,Me.RECONNECT,this._onSignalingReconnect.bind(this));let i=await this._signaling.connect(e,t);return ye.logEventualStat({name:Y.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(la.ATTENDEE,e.chatRoom.totalCount,e.chatRoom.firstParticipants,null,null)}async _onConversationParticipantListChunk(e){let t=e.participants;t&&v.onConversationParticipantListChunk(await this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{...{participants:[],countBefore:0,countAfter:0,markerFound:!1},...e}}async _participantListChunkToExternalChunk(e){let t=await this._getParticipants(),i=I.mapSharedParticipants(e.participants.reduce((a,s)=>{let c=I.composeId(s);return t[c]&&a.push(t[c]),a},[]));return{...e,participants:i}}async _registerConnectionParticipants(e){await this._registerParticipants(e.conversation.participants),e.participants?.participants&&await this._registerParticipants(e.participants?.participants);let t=e?.rooms?.rooms??[];for(let i of t)await this._registerParticipants(i?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let i=e[0]?.externalId?.type;i&&(l.externalUserType=i);let a=await this._getParticipants();for(let s of e){let c=I.composeId(s);if(d.test("Conversation:RegisterParticipant",c),this._isMe(c)){this._conversation.roles=s.roles||[],this._conversation.roles.length&&(d.debug(`Local roles changed: ${s.roles}`),v.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(s);continue}if(s.state===Q.HUNGUP||s.state===Q.REJECTED){a[s.id]&&await this._removeParticipant(a[s.id],k.HUNGUP);continue}let u=I.composeDecorativeId(s);this._registerParticipant({id:c,externalId:$.fromSignalingParticipant(s),mediaSettings:Re(s.mediaSettings),participantState:I.mapParticipantState(s),state:s.state,roles:s.roles||[],status:"WAITING",muteStates:s.muteStates||{},unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(c,s.markers),movieShareInfos:s.movieShareInfos,isInRoom:t},u);let p=await this._getParticipant(c);p&&s.roles&&s.roles.length&&(d.debug(`Roles for participant [${c}] changed: ${s.roles}`),v.onRolesChanged(p.externalId,s.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let i=async()=>{let a=Rr(e,Ge.MUTE),s=Rr(e,Ge.MUTE_PERMANENT);for(let c of[a,s])c.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:c,stateUpdated:!0})};I.setImmediate(()=>i().catch(a=>d.error(a)))}_getStatusByTransportState(e){let t=null;return e==="CONNECTED"?t="CONNECTED":e==="CONNECTING"||e==="OPENED"?t="CONNECTING":e==="RECONNECTING"&&(t="RECONNECT"),t}_registerParticipantInCache(e){return this._participants[e.id]=e,e}async _getExistedParticipantByIdOrCreate(e){let i=(await this._getParticipants())[e];if(i)return i;let a=this._api.getDecorativeIdByInitialId(I.decomposeId(e).id),s=a?I.composeUserId(a):void 0;return this._createParticipant({id:e},s)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(l.useParticipantListChunk)return(await this._getExistedParticipantByIdOrCreate(e)).externalId;let t=await this._getParticipants();if(t[e]?.externalId)return t[e].externalId;{let i=await this._getParticipantId(e);return this._api.cacheExternalId(e,i),i}}async _registerParticipantAndSetMarkersIfChunkEnabled(e,t){if(l.useParticipantListChunk){let a=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return a.markers=this._denormalizeMarkers(a.id,t),a}return(await this._getParticipants())[e]}_warnParticipantNotInConversation(e){d.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let i=Object.values(t).find(a=>"ts"in a&&"rank"in a);return Object.entries(t).reduce((a,[s,c])=>(a[s]={...i,...c,id:e},a),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let i=$n(e);this._setMuteStatesForRoomId(i,null);for(let u of e.rooms?.rooms??[])this._setMuteStatesForRoomId(u.muteStates,u.id);let a=this._getMuteStatesForCurrentRoom();t&&(a=Yn(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 Sr(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new Ai,this.subscribe(this._transport,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,"LOCAL_STATE_CHANGED",this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,"AUDIO_MIX_STALL",this._onAudioMixStall.bind(this)),this.subscribe(this._transport,"REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,"SIGNALLED_STALLED_PARTICIPANTS",this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this)),this.subscribe(this._transport,"NETWORK_STATUS",this._onNetworkStatus.bind(this)),this.subscribe(this._transport,"REMOTE_STREAM_SECOND",this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,"PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,"ASR_TRANSCRIPTION",this._onAsrTranscription.bind(this)),this.subscribe(this._transport,"ANIMOJI_STREAM",this._onAnimojiStream.bind(this)),this.subscribe(this._transport,"ANIMOJI_ERROR",this._onAnimojiError.bind(this));let e=this._conversation.direction===Ne.OUTGOING&&!this._conversation.concurrent,t=await this._getParticipants();for(let i of Object.values(t))(i.state===Q.ACCEPTED||i.state===Q.CALLED)&&this._transport.allocate(i.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new Pr(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new yr(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Di(this._mediaSource))}async _createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new wi(this._transport,this._volumesDetector,await this._getParticipants()))}_logDevices(){let e=y.getCameras().length,t=y.getMicrophones().length;d.debug("Cameras: "+e+(y.hasCameraPermission()?"✔":"✖")+", Microphones: "+t+(y.hasMicrophonePermission()?"✔":"✖")),R.log(M.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===k.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}});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:$.fromSignalingParticipant(t),mediaSettings:Re(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s),a=await this._getParticipant(e)}this._setParticipantsStatus([a],"WAITING"),i?(a.state=Q.HUNGUP,await this._removeParticipant(a,i)):this._transport&&(a.state=Q.CALLED,this._transport.allocate(a.id,!0),R.log(M.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(a))}async _onRemoveParticipant(e){d.debug(`Remove participant [${e}]`);let t=[],i=await this._getParticipants();for(let a=0;a<=Ko;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(M.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(M.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return R.log(M.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:$.fromId(s.uid),u=$.toString(c);i[u]=s.priority}let a=await this._getParticipants();for(let s of Object.values(a)){let c=$.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||this._transport?.getTopology()!=="SERVER")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:$.fromId(s.uid),u=this._api.getCachedOkIdByExternalId(c);if(!u){let h=$.toString(c);d.log(`Unknown participant external ID ${h}`);continue}let p=tt({participantId:u,mediaType:s.mediaType,streamName:s.streamName}),m=i[u];m?m.lastRequestedLayouts[p]=s:this._isMe(u)&&(this._myLastRequestedLayouts[p]=s),Xt(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"&&!Xt(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}}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:Y.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=vi(e),s=i[a.participantId],c=this._conversation?.externalId,u=this._isMe(a.participantId);if(s||u){switch(a.mediaType){case"STREAM":case"MOVIE":{if(a.streamName){let p={stream:null,streamName:a.streamName,mediaType:a.mediaType};u?v.onLocalLive(c,p):v.onRemoteLive(s.externalId,p)}break}case"CAMERA":{v.onRemoteStream(s.externalId,null);break}case"SCREEN":{v.onRemoteScreenStream(s.externalId,null);break}}R.log(M.PAT_DEALLOCATED)}else d.log(`Cannot find participant to stop streaming: ${a.participantId}`)}this._streamIdByStreamDescription.delete(e)}async _sendUpdateDisplayLayout(e){if(Object.keys(e).length===0)return;d.log(`Update display layout send [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t=await this._signaling.updateDisplayLayout(e);if(!t)return;let i=[],a=await this._getParticipants();for(let[s,c]of Object.entries(t.errorCodeByParticipantId||{})){let u=vi(s),p=a[u.participantId];if(p){let m;typeof c!="number"?(d.warn(`Unexpected error code ${c} received for participant ${u.participantId}`),m=Hn.UNKNOWN_ERROR):m=Gn(c),i.push({externalId:p.externalId,errorReason:m})}}if(i&&i.length)throw new ma("Could not allocate one or more participants",i)}async _cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let i=t.next();if(i.done)break;let a=i.value;if(a[1]+Wo>Date.now())break;let c=a[0];await this._stopStreaming(c),e[c]={stopStream:!0}}while(!0);this._sendUpdateDisplayLayout(e)}_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 G(k.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),v.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,i=[],a,s){d.log(`Chat room updated: ${e}`);let c=[],u=[],p=[],m=[],h=[];if(i.length&&i.forEach(w=>{if(w.externalId){let V=$.fromSignaling(w.externalId);h.push(V),this._api.cacheExternalId(w.id.id,V)}else{let V=I.decomposeId(w.id.id).id;c.push(V),m.push(V)}}),a?.length&&a.forEach(w=>{let V=I.decomposeId(w).id;c.push(V),u.push(V)}),s?.length&&s.forEach(w=>{let V=I.decomposeId(w).id;c.push(V),p.push(V)}),!c.length){v.onChatRoomUpdated(e,t,h,[],[]);return}if(m.length){let w=await this._api.getExternalIdsByOkIds(m);h.push(...w)}let E=await this._api.getExternalIdsByOkIds(u),P=await this._api.getExternalIdsByOkIds(p);v.onChatRoomUpdated(e,t,h,E,P)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let i of e.data)if(this._isMe(i.participantId))v.onLocalLiveUpdate(t,i);else{let s=await this._getExternalIdByParticipantId(i.participantId);s&&v.onRemoteLiveUpdate(s,i)}}async _onSharedMovieInfoStarted(e){d.log(`Shared movie started data received: ${e.notification}`),await this._processSharedMovieInfo(e.movieShareInfo,e.roomId)}async _processSharedMovieInfos(e,t=null){e&&await Promise.all(e.map(i=>this._processSharedMovieInfo(i,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let i=this._conversation?.externalId;if(this._isMe(e.initiatorId))v.onLocalSharedMovieInfo(i,e,t);else{let s=await this._getExternalIdByParticipantId(e.initiatorId);s&&v.onRemoteSharedMovieInfo(s,e,t)}this._forceOpenTransportForAloneInCall()}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){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 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(M.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&i&&(d.debug(`participant-sources-update: mediaType=${i}, suspend=${e.suspend}`),v.onRemoteStreamSuspended(s.externalId,i,e.suspend));let p=e.streamId,m=e.rtpTimestamp?this._getWaitingTime(p,e.rtpTimestamp):0;if(m<=0){this._streamWaitTimerByStreamDescription.delete(c);let h=this._conversation?.externalId,E=this._isMe(a);if(!s&&!E){R.log(M.PAT_ERROR,"participantMissing"),d.error(`Could not find participant by ID: ${a}`);return}let P=E?h:s.externalId,w=this._streamByStreamId.get(p);if(!w){R.log(M.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${p}`);return}R.log(M.PAT_ALLOCATED),this._streamIdByStreamDescription.set(c,p);let V=e.participantStreamDescription?.mediaType;if(V==="STREAM"||V==="MOVIE"){if(e.participantStreamDescription?.streamName){let z={streamName:e.participantStreamDescription.streamName,stream:w,mediaType:V};E?v.onLocalLive(P,z):v.onRemoteLive(P,z)}}else if(l.producerScreenTrack&&V==="SCREEN")v.onRemoteScreenStream(s.externalId,w);else if(!E){let z=(l.producerScreenTrack?null:s.secondStream)||w;v.onRemoteStream(s.externalId,z)}}else{d.debug(`Waiting for ${m} until stream ${p} for ${c} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),m);this._streamWaitTimerByStreamDescription.set(c,h)}}_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,[vt.ADMIN,vt.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!I.includesOneOf(this._conversation.roles,[vt.ADMIN,vt.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,e&&this._forceOpenTransportForAloneInCall(),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=Un(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,i){if(!this._signaling)return Promise.reject();let a=null;if(e&&(a=qn(e),a)){let m=this._api.getDecorativeIdByInitialId(a.id);a.id=m?I.composeUserId(m):a.id}let s=await this._signaling.getWaitingHall(a,t,i);if(s.error)return Promise.reject(s.message);let c=s.participants||[],{externalIds:u}=await this._resolveWaitingHallExternalIds(c),p=null;return c.length&&s.hasMore&&(p=Kn(c[c.length-1].id)),{participants:u,pageMarker:p,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,i=[],a=[];if(e.length){let s=[];e.forEach(c=>{if(t.set(c.id.id,c.id.addedTs),c.externalId){let u=$.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,[ti.WAITING_HALL,ti.AUDIENCE_MODE]))throw new Error("Unable to promote a participant in the conversation with current options");if(this._checkAdminRole(),!e&&t)throw new Error("participantId is required");await this._signaling.promoteParticipant(e,t)}catch(i){throw d.warn(`Failed to promote participant ${e}. ${i}`),i}}async requestPromotion(e=!1){this._signaling.ready&&await this._signaling.requestPromotion(e)}async acceptPromotion(e=!1){this._signaling.ready&&await this._signaling.acceptPromotion(e)}async chatMessage(e,t=null){this._signaling.ready&&await this._signaling.chatMessage(e,t)}async chatHistory(e){if(this._signaling.ready){let t=await this._signaling.chatHistory(e);for(let i=t.messages.length-1;i>=0;i--){let a=t.messages[i];await this._onChatMessage(a)}}}async customData(e,t=null){this._signaling.ready&&await this._signaling.customData(e,t)}async createJoinLink(){if(this._conversation){let t=(await this._api.createJoinLink(this._conversation.id)).join_link;if(t)return this._conversation.joinLink=t,t}return Promise.reject()}async removeJoinLink(){if(this._conversation&&(await this._api.removeJoinLink(this._conversation.id)).success){delete this._conversation.joinLink;return}return Promise.reject()}async addMovie({movieId:e,gain:t,metadata:i,lang:a}){let s={movieId:e,lang:a};(t||t===0)&&(s.gain=t),i&&(s.metadata=i);let c=await this._signaling.addMovie(s);if(c.error)throw new Error(c.error);return{movieId:c.movieId,streamType:c.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw new Error(t.error)}async removeMovie(e){let t={movieId:e},i=await this._signaling.removeMovie(t);if(i.error)throw new Error(i.error)}async startUrlSharing(e){let t=await this._signaling.startUrlSharing(e);if(t.error)throw new Error(t.error)}async stopUrlSharing(){let e=await this._signaling.stopUrlSharing();if(e.error)throw new Error(e.error)}async updateRooms(e,t){let i=await this._signaling.updateRooms(e,t);if(i.error)throw new Error(i.error)}async activateRooms(e,t){let i=await this._signaling.activateRooms(e,t);if(i.error)throw new Error(i.error)}async switchRoom(e,t){let i=await this._signaling.switchRoom(e,t);if(i.error)throw new Error(i.error)}async removeRooms(e){let t=await this._signaling.removeRooms(e);if(t.error)throw new Error(t.error)}async startStream(e=!1,t=null,i=null,a="DIRECT_LINK",s=null,c=null){let u={movieId:i,name:t,privacy:a,groupId:s,roomId:c,streamMovie:!e},p=await this._signaling.startStream(u);if(p.error)return Promise.reject(p.message)}async stopStream(e=null,t){if((await this._signaling.stopStream({roomId:e,...t&&{remove:t}})).error)return Promise.reject()}async publishStream(e=null){if((await this._signaling.publishStream({roomId:e})).error)return Promise.reject()}async recordSetConf(e,t,i=!1,a=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:i,roomId:a});if(s.error)throw new Error(s.error)}async getStreamInfo(){let e=await this._signaling.getRecordStatus();return{movieId:e.recordMovieId,preview:e.recordMoviePreviewUrl}}async setLocalResolution({video:e,effect:t}){if(e.width<l.videoMinWidth||e.height<l.videoMinHeight)throw new Error("Sizes received are less than the `videoMinWidth` or `videoMinHeight`");if(t){if(t.width<l.videoMinWidth||t.height<l.videoMinHeight)throw new Error("Sizes of effect received are less than the `videoMinWidth` or `videoMinHeight`");l.videoEffectMaxHeight=t.height,l.videoEffectMaxWidth=t.width}l.videoMaxWidth=e.width,l.videoMaxHeight=e.height,d.debug("Set local video resolution:",`video ${e.width}x${e.height}`+(t?`, effect ${t.width}x${t.height}`:"")),this._mediaSource&&(await this._mediaSource.setResolution({video:e,effect:t}),this._transport&&await this._transport.onCameraResolutionChanged())}async videoEffect(e){return this._mediaSource?.videoEffect(e)}async audioEffect(e,t){return this._mediaSource?.audioEffect(e?{effects:e,isPreset:t}:null)}_convertExternalIdsToServerExternalIds(e){return e.map(t=>({id:t.id,type:l.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),i=await this._signaling.getParticipants(t);if(i.error)throw new Error(i.error);let a=i.participants,s=this._transport?.getState();return Promise.all(a.map(async c=>{let u=I.composeId(c);return this._createParticipant({id:u,externalId:$.fromSignalingParticipant(c),mediaSettings:Re(c.mediaSettings),participantState:I.mapParticipantState(c),state:c.state,roles:c.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:c.muteStates||{},unmuteOptions:c.unmuteOptions||[],observedIds:c.observedIds||[],markers:this._denormalizeMarkers(u,c.markers)},c.decorativeUserId)})).then(I.mapSharedParticipants)}async getParticipantListChunk(e){d.log("Request participant list chunk",e);let t=await this._signaling.getParticipantListChunk(e);if(t.error)throw new Error(t.error);let i=this._createParticipantListChunk(t.chunk),a=await this._getParticipants(),s=i.participants.filter(u=>{let p=I.composeId(u);return!a[p]});await this._registerParticipants(s);let c=this._transport?.getState();return i.participants.forEach(u=>{let p=I.composeId(u),m=a[p];m.status=this._getStatusByTransportState(c)??"WAITING",m.movieShareInfos=u.movieShareInfos,Object.assign(m.mediaSettings,Re(u.mediaSettings)),Object.assign(m.muteStates,u.muteStates),m.unmuteOptions=u.unmuteOptions??m.unmuteOptions,this._openTransport([m],!0)}),this._participantListChunkToExternalChunk(i)}async _getInitialParticiapntListChunk(){let e=l.participantListChunkInitIndex,t=l.participantListChunkInitCount,a=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return d.debug("Get initial participant list chunk",a.chunk),a.chunk}_onLocalMediaStreamChanged(e){if(!this._conversation||!this._mediaSource)return;let t=this._mediaSource.getMediaSettings();d.debug("Local media stream changed",t),e.kind==="audio"&&this._mediaSource&&(this._audioFix=new ii(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)}_changeLocalParticipantState(e){d.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&v.onLocalParticipantState(e)}async _changeRemoteParticipantState(e,t){d.debug(`Remote participant state changed [${e}]`,t);let i=await this._getParticipant(e);if(!i){this._warnParticipantNotInConversation(e);return}i.participantState=t||{},this._state==="ACTIVE"&&v.onRemoteParticipantState(i.externalId,i.participantState,i.markers)}async _changeMultipleParticipantState(e,t){d.debug("Multiple participants state changed",e);let i=[],a,s=await this._getParticipants();e.forEach((c,u)=>{if(this._isMe(u))a=c;else{let p=s[u];if(!p){this._warnParticipantNotInConversation(u);return}p.participantState=c,i.push({externalId:p.externalId,participantState:{...c},markers:p.markers})}}),this._state==="ACTIVE"&&(a&&v.onLocalParticipantState(a,!0),i.length&&v.onRemoteParticipantsState(i,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(d.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),v.onRolesChanged(e.externalId,e.roles,!0))}_onSignalingNotification(e){switch(e.notification){case L.ACCEPTED_CALL:return this._onAcceptedCall(e);case L.HUNGUP:return this._onHungup(e);case L.PARTICIPANT_ADDED:return this._onAddedParticipant(e);case L.PARTICIPANT_JOINED:return this._onJoinedParticipant(e);case L.CLOSED_CONVERSATION:return this._onClosedConversation(e);case L.MEDIA_SETTINGS_CHANGED:return this._onMediaSettingsChanged(e);case L.PARTICIPANT_STATE_CHANGED:return this._onParticipantStateChanged(e);case L.PARTICIPANTS_STATE_CHANGED:return this._onParticipantsStateChanged(e);case L.RATE_CALL_DATA:return this._onNeedRate();case L.FEATURE_SET_CHANGED:return this._onFeatureSetChanged(e);case L.MULTIPARTY_CHAT_CREATED:return this._onMultipartyChatCreated(e);case L.FORCE_MEDIA_SETTINGS_CHANGE:return this._onForceMediaSettingsChange(e);case L.SETTINGS_UPDATE:return this._onSettingsUpdate(e);case L.VIDEO_QUALITY_UPDATE:return this._onVideoQualityUpdate(e);case L.REGISTERED_PEER:return this._onPeerRegistered(e);case L.SWITCH_MICRO:return this._onMicSwitched(e);case L.CHAT_MESSAGE:return this._onChatMessage(e);case L.CUSTOM_DATA:return this._onCustomData(e);case L.RECORD_STARTED:return this._onRecordInfo(e.recordInfo,e.roomId);case L.RECORD_STOPPED:return this._onStopRecordInfo(e,e.roomId);case L.ROLES_CHANGED:return this._onRolesChanged(e.participantId,e.roles||[]);case L.MUTE_PARTICIPANT:return this._onMuteParticipant(e);case L.PIN_PARTICIPANT:return this._onPinParticipant(e.participantId,e.unpin,e.markers,e.roomId);case L.OPTIONS_CHANGED:return this._onOptionsChanged(e.options||[]);case L.PARTICIPANT_SOURCES_UPDATE:return this._onParticipantSourcesUpdate(e);case L.PROMOTE_PARTICIPANT:return this._onParticipantPromoted(e);case L.CHAT_ROOM_UPDATED:return this._onChatRoomUpdated(e.eventType,e.totalCount,e.firstParticipants,e.addedParticipantIds,e.removedParticipantIds);case L.JOIN_LINK_CHANGED:return this._onJoinLinkChanged(e);case L.FEEDBACK:return this._onFeedback(e);case L.MOVIE_UPDATE_NOTIFICATION:return this._onSharedMovieUpdate(e);case L.MOVIE_SHARE_STARTED:return this._onSharedMovieInfoStarted(e);case L.MOVIE_SHARE_STOPPED:return this._onSharedMovieInfoStopped(e);case L.URL_SHARING_INFO_UPDATED:return this._onUrlSharingInfoUpdated(e);case L.ROOMS_UPDATED:return this._onRoomsUpdated(e);case L.ROOM_UPDATED:return this._onRoomUpdated(e);case L.ROOM_PARTICIPANTS_UPDATED:return this._onRoomParticipantsUpdated(e);case L.FEATURES_PER_ROLE_CHANGED:return this._onFeaturesPerRoleChanged(e);case L.PARTICIPANT_ANIMOJI_CHANGED:return this._onParticipantAnimojiChanged(e);case L.ASR_STARTED:return this._onAsrStart(e);case L.ASR_STOPPED:return this._onAsrStop(e);case L.PROMOTION_APPROVED:return this._onPromotionApproved(e);case L.DECORATIVE_PARTICIPANT_ID_CHANGED:return this._onDecorativeParticipantIdChanged(e);case L.VIDEO_SUSPEND_SUGGEST:return this._onVideoSuspendSuggest(e)}}async _onPromotionApproved(e){let t=await this._getExternalIdByParticipantId(e.adminId);if(!t){this._warnParticipantNotInConversation(e.adminId);return}v.onPromotionApproved(t)}async _onSignalingReconnect(e){if(!this._conversation)return;e.conversation.acceptTime&&(this._conversation.acceptTime=e.conversation.acceptTime),e.conversation.participantsLimit&&(this._conversation.participantsLimit=e.conversation.participantsLimit),e.conversation.features&&(this._conversation.features=e.conversation.features,this._conversation.featuresPerRole=e.conversation.featuresPerRole,this._changeFeatureSet(),this._changeFeaturesPerRole()),await this._processPinnedParticipants(e),e.conversation.state;let t=null;if(e.conversation.participants){let s=Object.keys(await this._getParticipants()),c=[];for(let p of e.conversation.participants){let m=I.composeId(p),h=p.roles||[];if(this._isMe(m)){bi(this._conversation.roles,h)||this._onRolesChanged(m,h),t=()=>{this._registerParticipantLocalMuteState({muteStates:Jn(p),unmuteOptions:p.unmuteOptions})};continue}c.push(m);let E=await this._getParticipant(m);if(!E)await this._onJoinedParticipant({participantId:p.id,participant:p,mediaSettings:p.mediaSettings});else{let P=Re(p.mediaSettings);Za(P,E.mediaSettings)||await this._changeRemoteMediaSettings(m,P);let w=I.mapParticipantState(p),V=E.participantState;I.isEqualParticipantState(w,V)||await this._changeRemoteParticipantState(m,w),bi(h,E.roles)||this._onRolesChanged(E.id,h)}}let u=await this._getParticipants();for(let p of s)c.indexOf(p)<0&&this._removeParticipant(u[p],k.HUNGUP)}let i=e.rooms?.roomId??null;this._conversation.roomId!==i?this._onRoomSwitched(i).then(t):(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 G(k.MISSED),"Call accepted on other device");return}let a=await this._getParticipant(t);if(!a){let c=this._api.getDecorativeIdByInitialId(t),u=c?I.composeUserId(c,e.participantType):void 0;a=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Re(e.mediaSettings)},u))}a.state=Q.ACCEPTED,a.mediaSettings=Re(e.mediaSettings),this._logWithMediaSettings(M.ACCEPTED_OUTGOING,a.mediaSettings),this._conversation&&this._conversation.direction===Ne.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),this._state==="ACTIVE"&&this._transport&&this._transport.open([a.id],i),await this._changeRemoteMediaSettings(t,a.mediaSettings),await this._changeRemoteParticipantState(t);let s=Object.keys(a.muteStates);s.length&&this._onMuteParticipant({muteStates:a.muteStates,mediaOptions:s,stateUpdated:!0,participantId:t}),this._state==="ACTIVE"&&v.onAcceptedCall(a.externalId,Bt.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 G(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===k.REJECTED?Q.REJECTED:Q.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(i,k.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:$.fromSignalingParticipant(a),mediaSettings:Re(a.mediaSettings),state:a.state,participantState:I.mapParticipantState(a),roles:a.roles||[],muteStates:a.muteStates||{},unmuteOptions:a.unmuteOptions||[],observedIds:a.observedIds||[]},s),i=await this._getParticipant(t)}i.state=Q.CALLED,i.mediaSettings=Re(e.participant?.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant?.roles||[],this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(i.id,!0),v.onParticipantAdded(i.externalId,i.markers),await this._changeRemoteMediaSettings(t,i.mediaSettings),await this._changeRemoteParticipantState(t,i.participantState),this._invokeRolesChangedCallbackIfNeeded(i)}async _onJoinedParticipant(e){d.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=I.composeMessageId(e),i=await this._getParticipant(t);if(i&&i.state===Q.ACCEPTED){d.warn(`Participant [${t}] is already in conversation and is active`);return}if(!i){let{participant:s}=e,c=s.decorativeUserId;this._registerParticipant({id:t,externalId:$.fromSignalingParticipant(s),mediaSettings:Re(s.mediaSettings),state:s.state,participantState:I.mapParticipantState(s),roles:s.roles||[],muteStates:s.muteStates||{},movieShareInfos:s.movieShareInfos,unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(t,s.markers)},c),i=await this._getParticipant(t)}this._conversation&&this._conversation.direction===Ne.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),i.state=Q.ACCEPTED,i.mediaSettings=Re(e.mediaSettings),i.participantState=I.mapParticipantState(e.participant),i.roles=e.participant.roles||[],this._transport?.isAllocated(i.id)?this._setParticipantsStatus([i],"CONNECTED"):this._setParticipantsStatus([i],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(i.id)||this._transport.allocate(i.id,!0),this._transport.open([i.id],null,!!this._conversation?.observer)),v.onParticipantJoined(i.externalId,i.markers,Bt.parseCapabilities(e.capabilities)),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 G(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=I.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteMediaSettings(t,Re(e.mediaSettings))}async _onParticipantStateChanged(e){let t=I.composeMessageId(e),i=I.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(i):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),await this._changeRemoteParticipantState(t,i))}async _onParticipantsStateChanged(e){let{participants:t,roomId:i}=e,a=t.map(({id:u,markers:p})=>this._registerParticipantAndSetMarkersIfChunkEnabled(u,p));await Promise.all(a);let s=new Map,c=t.map(({id:u,participantState:p})=>this._getExternalIdByParticipantId(u).then(m=>[u,m&&I.mapParticipantState({participantState:p})]));try{(await Promise.all(c)).forEach(([p,m])=>{m&&s.set(p,m)}),await this._changeMultipleParticipantState(s,i)}catch(u){d.warn(`_onParticipantsStateChanged: Failed to get external ids. ${u}`)}}_onNeedRate(){this._conversation&&(this._conversation.needRate=!0,this._changeNeedRate())}_onFeatureSetChanged(e){this._conversation&&(this._conversation.features=e.features,this._changeFeatureSet())}_onMultipartyChatCreated(e){this._conversation&&(this._conversation.chatId=e.chatId,this._toggleJoinAvailability(),v.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),i=Re(e.mediaSettings);t.isAudioEnabled!==i.isAudioEnabled&&await this._mediaSource.toggleAudio(i.isAudioEnabled),t.isVideoEnabled!==i.isVideoEnabled&&await this._mediaSource.toggleVideo(i.isVideoEnabled),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};this._serverSettings=da(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={camera:Object.assign({},this._serverSettings.camera,{maxBitrateK:t,maxDimension:i}),screenSharing:null};this._serverSettings=da(this._serverSettings,a),this._transport&&this._transport.updateSettings(this._serverSettings)}async _onPeerRegistered(e){let t=I.composeMessageId(e),i=await this._getParticipant(t);i&&(i.clientType=e.clientType,i.platform=e.platform),v.onPeerRegistered()}async _onMicSwitched(e){v.onDeviceSwitched(de.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onChatMessage(e.message,i,e.direct)}async _onCustomData(e){if(Object.hasOwn(e.data,"sdk"))return;let t=I.composeMessageId(e),i=await this._getExternalIdByParticipantId(t);if(!i){this._warnParticipantNotInConversation(t);return}v.onCustomData(e.data,i,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation||!e)return;let i=this._conversation.recordsInfoByRoom.get(t);if(i?.recordMovieId!==e?.recordMovieId||i?.recordStartTime!==e?.recordStartTime){this._conversation.recordsInfoByRoom.set(t,e);let s=await this._getExternalIdByParticipantId(e.initiator);s?v.onRecordStarted(s,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}this._forceOpenTransportForAloneInCall()}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),this._forceOpenTransportForAloneInCall()}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),v.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}v.onAsrTranscription(t,e.text,e.timestamp,e.duration)}async _onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!bi(this._conversation.roles,t)){d.debug(`Local roles changed: ${t}`),this._conversation.roles=t,v.onLocalRolesChanged(t),this._processMuteState({mediaOptions:Rr(this._getMuteStatesForCurrentRoom(),Ge.MUTE_PERMANENT),stateUpdated:!0}),I.includesOneOf(t,[vt.ADMIN,vt.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let i=await this._getParticipant(e);i&&!bi(i.roles,t)&&(d.debug(`Roles for participant [${e}] changed: ${t}`),i.roles=t,v.onRolesChanged(i.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:i,muteStates:a={},unmuteOptions:s=[],mediaOptions:c=[],roomId:u=null}=e;if(e.participantId&&!this._isMe(e.participantId)){if(!this._isCallAdmin()){d.warn(`Not admin got mute states for participant [${e.participantId}]`);return}let p=await this._getParticipant(e.participantId);if(p){d.debug(`Mute states for participant [${e.participantId}] changed`,a);let m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null;v.onMuteStates(a,s,c,i,e.unmute,p.externalId,m,e.stateUpdated,e.requestedMedia,e.roomId)}return}if(e.requestedMedia?.length||(i&&!t?this._setMuteStatesForRoomId(a,u):i||(this._conversation.muteStatesPersonal=a)),e.adminId&&this._isMe(e.adminId)){i&&v.onMuteStates(a,s,c,i,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:c,muteAll:i,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:a})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let i=this._getMuteStatesForRoomId(t),a=this._getMuteStatesForRoomId(e),s=Object.keys(i),c=Object.keys(a);this._processMuteState({mediaOptions:Array.from(new Set([...s,...c])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Q.ACCEPTED)return;let{mediaOptions:t=[],muteAll:i,unmute:a,stateUpdated:s,requestedMedia:c,roomId:u=null,unmuteOptions:p=[]}=e,m=e.adminId?await this._getExternalIdByParticipantId(e.adminId):null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(u)),E=this._mediaSource.getMediaSettings(),P=Object.entries(h);for(let[w,V]of P){let z=l.newMuteRules&&this._isCallAdmin()&&i;if(!(V!==Ge.MUTE&&V!==Ge.MUTE_PERMANENT||z)&&(this._isCallAdmin()&&V===Ge.MUTE_PERMANENT&&!i&&(h[w]=Ge.MUTE),!(!t.includes(w)||a)))switch(w){case de.VIDEO:E.isVideoEnabled&&(v.onDeviceSwitched(de.VIDEO,!1),await this.toggleLocalVideo(!1));break;case de.AUDIO:E.isAudioEnabled&&(v.onDeviceSwitched(de.AUDIO,!1),await this.toggleLocalAudio(!1));break;case de.SCREEN_SHARING:E.isScreenSharingEnabled&&(v.onDeviceSwitched(de.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case de.AUDIO_SHARING:E.isAudioSharingEnabled&&(v.onDeviceSwitched(de.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:E.isScreenSharingEnabled,fastScreenSharing:E.isFastScreenSharingEnabled,captureAudio:!1}));break}}v.onMuteStates(h,p,t,i,a,null,m,s,c,u)}async _onPinParticipant(e,t=!1,i,a=null){if(!this._conversation)return;let s=this._conversation.pinnedParticipantIdByRoom.get(a);if(s&&s!==e)if(this._isMe(s))v.onLocalPin(!0,a);else{let c=await this._getExternalIdByParticipantId(s);c&&v.onPinnedParticipant(c,!0,this._denormalizeMarkers(e,i),a)}if(this._isMe(e))v.onLocalPin(t,a);else{let c=await this._getExternalIdByParticipantId(e);c&&v.onPinnedParticipant(c,t,this._denormalizeMarkers(e,i),a)}this._conversation.pinnedParticipantIdByRoom.set(a,t?null:e)}_onOptionsChanged(e){this._conversation&&!Ln(this._conversation.options,e)&&(this._conversation.options=e,v.onOptionsChanged(e))}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,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 c=this._streamByStreamId.get(s);if(!c){R.log(M.PAT_ERROR,"streamNotFound"),d.error(`Could not find stream by ID: ${s}`);return}v.onRemoteStream(i.externalId,i.secondStream||c)}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(pa.ADD_PARTICIPANT);v.onCallState(e,t,this._conversation)}}_changeFeaturesPerRole(){this._conversation&&v.onFeaturesPerRoleChanged(this._conversation.featuresPerRole??{})}_changeNeedRate(){this._conversation&&this._conversation.needRate&&v.onRateNeeded()}async _onVolumesDetected(e){let t=[];for(let[i,a]of Object.entries(e)){let s=await this._getParticipant(i);s&&s.externalId&&t.push({uid:s.externalId,volume:a.real})}v.onVolumesDetected(t)}async _onSpeakerChanged(e){this._activeSpeakerId=e;let t=await this._getParticipant(e);t&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(t.externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){d.debug(`Transport state has changed: ${t}`,e);let i=this._getStatusByTransportState(t);if(!i)return;let a=await this._getParticipants(),s=e.reduce((c,u)=>{if(u in a){let p=a[u];c.push(p),t==="CONNECTED"&&(p.remoteStream||(p.mediaSettings&&this._changeRemoteMediaSettings(u,p.mediaSettings),this._changeRemoteParticipantState(u,p.participantState)),this._updateDisplayLayoutFromCache(u))}else this._warnParticipantNotInConversation(u);return c},[]);s.length&&this._setParticipantsStatus(s,i)}async _onTransportLocalStateChanged(e){if(d.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(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(k.FAILED),this._close(new G(k.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,i){if(e.endsWith(Ye.AUDIO_MIX))d.debug("Remote audio mix track added"),this._audioOutput.add(i),v.onRemoteMixedAudioStream(t);else if(e.startsWith(Ye.PARTICIPANT_AGNOSTIC_TRACK_PREFIX))d.debug(`Participant-agnostic track added: ${e}`),this._streamByStreamId.set(e,t);else{d.debug(`Remote track added on the participant [${e}]`,{kind:i.kind});let a=await this._getParticipant(e);if(!a){let s=this._api.getDecorativeIdByInitialId(e),c=s?I.composeUserId(s):void 0;d.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${c}]`),this._registerParticipant({id:e},c),a=await this._getParticipant(e),this._setParticipantsStatus([a],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(v.onSpeakerChanged(a.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(a.id)&&this._transport.allocate(a.id,!1),i.kind==="audio"&&(this._audioOutput.add(i),l.preserveAudioTracks||(a.remoteAudioTrack=i,t.removeTrack(i))),a.remoteStream!==t&&t.getTracks().length){if(a.remoteStream=t,a.secondStream)return;v.onRemoteStream(a.externalId,t)}a.mediaSettings&&this._changeRemoteMediaSettings(e,a.mediaSettings)}}_onRemoteTrackRemoved(e,t,i){switch(d.debug(`[${e}] remote track (removed)`,{track:i}),i.kind){case"audio":this._removeAudioTrack(e,t,i);break;case"video":case"screen":this._removeVideoTrack(e,t,i);break}}async _removeAudioTrack(e,t,i){if(e!==Ye.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._isRealTimeAsrRequested&&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){!y.hasMicrophone()||!this._audioFix||!this._mediaSource?.getMediaSettings().isAudioEnabled||this._audioFix.fix(e)}_fixVideoDevice(e){!y.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,c)=>(c.status!==t&&(c.status=t,s.push(c.externalId)),s),[]);a.length&&v.onRemoteStatus(a,t,i)}_onJoinLinkChanged(e){v.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let i of Object.keys(yi)){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===yi.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 w=I.composeId(P);return this._createParticipant({id:w,externalId:$.fromSignalingParticipant(P),mediaSettings:Re(P.mediaSettings),participantState:I.mapParticipantState(P),state:P.state,roles:P.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:P.muteStates||{},unmuteOptions:P.unmuteOptions||[],observedIds:P.observedIds||[],markers:this._denormalizeMarkers(w,P.markers),isInRoom:i!==null},P.decorativeUserId)})||[]),p=!1;for(let P of u)P.id===this._conversation?.compositeUserId&&(p=!0),this._registerParticipantInCache(P);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(u,!0);let m=[],h=[];if(e?.removedParticipantMarkers){for(let P of e.removedParticipantMarkers)if(P.GRID?.id){let w=this._getExternalIdByParticipantId(P.GRID.id);h.push(w)}m=await Promise.all(h)}if(p&&await this._onRoomSwitched(i),m){let P=this._conversation?.pinnedParticipantIdByRoom.get(i);if(P){let w=await this._getExternalIdByParticipantId(P);if(w){for(let V of m)if($.compare(w,V)){this._conversation?.pinnedParticipantIdByRoom.delete(i);break}}}}let E={roomId:i,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:I.mapSharedParticipants(u),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:m};this._isCalledState()||v.onRoomParticipantsUpdated(E)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let i=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){v.onRoomStart(e);return}this._isCalledState()||v.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,i),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let i=t?.rooms?.rooms??[],a=[];for(let s of i){let c=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,c),this._conversation?.recordsInfoByRoom.set(c,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(c,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(c,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(c,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(c),e){let u=await this._getParticipants();await this._registerParticipants(s?.participants?.participants?.filter(m=>!u[I.composeId(m)])||[],!0);let p=await this._convertRoomToExternal(s);p&&a.push(p)}}a.length&&!this._isCalledState()&&v.onRoomsUpdated({[yi.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=$.fromSignaling(a,c.deviceIdx);if(v.onParticipantIdChanged(c,u),this._api.cacheExternalId(i,u),this._api.mapDecorativeId(i,t),s)this._conversation.externalId=u;else{let p=await this._getParticipants();p[t].externalId=u}}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(d.debug("Video suspend suggested",e),v.onVideoSuspendSuggest(e.bandwidth))}_isMe(e){return e===this._conversation?.compositeUserId}_getMuteStatesForRoomId(e=null){return this._conversation?.muteStates.get(e)??{}}_getMuteStatesForCurrentRoom(){return this._getMuteStatesForRoomId(this._conversation?.roomId)}_setMuteStatesForRoomId(e={},t=null){this._conversation?.muteStates.set(t,e)}_forceOpenTransportForAloneInCall(){this._transport?.getTopology()==="SERVER"&&this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._transport.open(this._transport.allocated(),null,!!this._conversation?.observer,!0)}_registerParticipant(e,t){this._pendingParticipants.set(e.id,this._createParticipant(e,t))}async _getParticipants(){if(this._pendingParticipants.size)for(let e of this._pendingParticipants.values()){let t=await e;this._pendingParticipants.delete(t.id),this._participants[t.id]=t}return this._participants}async _getParticipant(e){return(await this._getParticipants())[e]}};o(q,"_current"),o(q,"_activationMutex"),o(q,"_delayedHangup",!1);var U=q,ma=class n extends Error{constructor(e,t){super(e);o(this,"participantErrors");Object.setPrototypeOf(this,n.prototype),this.participantErrors=t}};var Vt=null,ri=null;function Zn(){Vt=null,ri=null}function qo(n){return n?.endsWith("/")?n.slice(0,-1):n}async function Ar(n=null,r){let e=qo(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 es(){return Vt||ri||(ri=Ar(),Vt=await ri,ri=null,Vt)}async function ai(n,r={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await es();let t=is(n,r,e),i=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${Vt}/fb.do`,i)}async function ki(n,r={},e=!1,t){await es();let i=is(n,r,e);return $o(i,t)}async function $o(n,r){let e=`${r??Vt}/fb.do`,t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n}),i=await t.text(),a;try{a=JSON.parse(i)}catch{a={result:i}}if(!t.ok||Object.hasOwn(a,"error_msg"))throw a;return a}async function ts(n,r){try{let e=await fetch(n,{method:"POST",body:r});if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);let t=await e.text();d.debug("Form data sent successfully",t)}catch(e){throw d.warn("Failed to send form data",e),e}}function is(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 Oi=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){}sendUserFeedbackStats(r,e,t,i){}async removeHistoryRecords(r){}async getServerTime(){return Date.now()}cleanup(){}};var Jo=10,Yo=700,Qo=3e3,xi=class extends Oi{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 ki(e,t,i)}catch(c){if(!Object.hasOwn(c,"error_msg")&&(s++,d.debug(`${e} network error, attempt ${s}...`),s<Jo))return await I.delay(Math.min(s*Yo,Qo)),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};switch(a.custom_error&&(c.custom_error=a.custom_error),a.error_code){case 1101:s=k.SERVICE_DISABLED;break;case 300:s=k.NOT_FOUND;break;case 1102:s=k.CALLEE_IS_OFFLINE;break;case 1103:s=k.NOT_FRIENDS;break;case 1104:case 1106:s=k.EXTERNAL_API_ERROR;break;case 1113:s=k.CALLER_IS_REJECTED;break;case 1114:s=k.VCHAT_DETAILED_ERROR;break}throw new G(s,c)}}async userId(e){let t=I.extractOkId(e);if(be.isEmpty())return $.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let i=this.getDecorativeIdByInitialId(t);return i&&(t=i),$.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!l.apiKey)throw new G(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 G(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})};ai("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)};ai("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)};ai("vchat.clientEvents",i)}async uploadDebugLogs(e,t,i,a){let s={conversationId:e,webrtcPlatform:l.platform,startTime:t,endTime:i},c=await this._callUnsafe("vchat.getLogUploadUrl",s),u=new FormData,p=new Blob([a],{type:"application/json"});u.append("file",p,"log.json");let m=new URL(c.upload_url);return m.searchParams.append("size",p.size.toString()),ts(m.toString(),u)}async joinConversation(e,t=!1,i){let a={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};return i&&(a.chatId=i),this._call("vchat.joinConversation",a)}async createConversation(e,t="",i=!1,{onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:c}={},u){let p=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:i,onlyAdminCanShareMovie:a,audienceMode:s,audioOnly:c,speakerIds:u});return this._startConversation(p)}async startConversation(e,t,i,a=!1,s="",c=!1,u=!1,{onlyAdminCanShareMovie:p}={},m){let h=this._preareStartConversationData({conversationId:e,isVideo:a,joiningAllowed:c,payload:s,requireAuthToJoin:u,onlyAdminCanShareMovie:p,externalIds:m});if(t&&t.length)switch(i){case pt.USER:h.uids=t.join(",");break;case pt.GROUP:h.gid=t[0];break;case pt.CHAT:h.chatId=t[0];break}return this._startConversation(h)}_ensureUuid(){if(!this._uuid){let e=ht.get("uuid");e||(e=I.uuid(),ht.set("uuid",e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:i="",joiningAllowed:a=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:c,audienceMode:u=!1,audioOnly:p=!1,speakerIds:m=[],externalIds:h}){let E={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};if(a&&(E.createJoinLink=!0),i&&(E.payload=i),l.domain&&(E.domainId=l.domain),l.externalDomain&&(E.externalDomain=l.externalDomain),s&&(E.requireAuthToJoin=!0),c!==void 0&&(E.onlyAdminCanShareMovie=c),u&&(E.audienceMode=u),p&&(E.audioOnly=p),m.length){let P=m.map(w=>I.composeUserId(w));E.speakerIds=P.join(",")}return h&&(E.externalIds=h.map($.toSignaling).join(",")),E}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};return i?.length&&(s.observedIds=i.join(",")),l.anonymToken&&(s.anonymToken=l.anonymToken),a&&(s.payload=a),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],i=[],a=new Map,s=Array.from(this._externalUidsCache.keys()),c=Array.from(this._externalUidsCache.values());for(let p of e){let m=$.toString(p),h=c.indexOf(m);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(a.set(String(p.id),m),i.push({id:p.id,ok_anonym:p.type==="ANONYM"}))}return i.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:i})).ids.forEach((p,m)=>{let h=Number(p.ok_user_id),E=String(p.external_user_id.id);a.has(E)&&(this.cacheExternalId(h,$.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=$.toString(s),u=a.indexOf(c);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 c=this.getDecorativeIdByInitialId(s),u=this._externalUidsCache.get(c??s);t.push($.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=$.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,$.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){let t={conversationId:e,reason:k.HUNGUP};l.anonymToken&&(t.anonymToken=l.anonymToken),ai("vchat.hangupConversation",t)}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:Y.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:i,group_call_users_count:a}}]})};ai("log.externalLog",s)}async removeHistoryRecords(e){await this._call("vchat.removeHistoryRecords",{recordIds:e.join(",")})}cleanup(){this._decorativeIdToInitialId=new Map,this._initialIdToDecorativeId=new Map}async _getExternalIdsByOkIds(e){let t=new Map;e=e.map(i=>this.getDecorativeIdByInitialId(i)??i);try{let i=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),a=(s,c)=>{for(let[u,p]of Object.entries(s)){let m=Number(u),h=$.fromId(p,c);t.set(m,h),this.cacheExternalId(m,h)}};i.external_ids&&a(i.external_ids,"USER"),i.anonym_ids&&a(i.anonym_ids,"ANONYM");for(let s of e){let c=Number(s);if(!t.has(c)){let u=$.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}};var rs=(e=>(e.KING="KING",e.PAWN="PAWN",e))(rs||{}),Xo=rs;var as=(e=>(e.OFF="0",e.ON="1",e))(as||{});var ha=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 ga=class{constructor(r,e,t,i=null){o(this,"_uuid");o(this,"_apiKey");o(this,"_callToken");o(this,"_apiEnv");o(this,"_baseApiUrl");o(this,"_sessionKey");this._uuid=I.uuid(),this._apiKey=e,this._callToken=t,this._apiEnv=r,this._baseApiUrl=i}async authorize(){let r={session_data:{device_id:this._uuid,client_version:l.appVersion,client_type:"SDK_JS",auth_token:this._callToken,version:3},application_key:this._apiKey},e=await Ar(this._baseApiUrl,this._apiEnv),t=await ki("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:k.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await Ar(this._baseApiUrl,this._apiEnv);await ki("vchat.hangupConversation",e,!0,t)}};var ue,Ni=null,tE={getCameras:y.getCameras,getMicrophones:y.getMicrophones,getOutput:y.getOutput,getVideoFacingMode:y.getVideoFacingMode,hasCamera:y.hasCamera,hasMicrophone:y.hasMicrophone,getSavedCamera:y.getSavedCamera,getSavedMicrophone:y.getSavedMicrophone,getSavedOutput:y.getSavedOutput,hasCameraPermission:y.hasCameraPermission,hasMicrophonePermission:y.hasMicrophonePermission,hasPermissions:y.hasPermissions,getUserMedia:y.getUserMedia,getUserVideo:y.getUserVideo,getUserAudio:y.getUserAudio,setResolution:y.setResolution,isBrowserSupported:y.isBrowserSupported,isScreenCapturingSupported:y.isScreenCapturingSupported,os:y.os,isMobile:y.isMobile,browserName:y.browserName,browserVersion:y.browserVersion,baseChromeVersion:y.baseChromeVersion,getAudioContext:y.getAudioContext,isAudioShareSupported:y.isAudioShareSupported},iE={participantMarkerCompare:I.participantMarkerCompare};function rE(n){Ni=n}function aE(n){l.videoEffects=n}function nE(n){l.audioEffects=n}function sE(n,r=null,e={},t=1){l.vmoji=n,l.vmojiOptions={protocolVersion:t,renderingOptions:e},r&&n.setSDK(r)}async function oE(n){if(l.set(n),ue||(ue=new xi),ns.disableLog(!l.debug),d.toggle(l.debug),d.log(`Calls SDK ${l.sdkVersion}`,n),await y.init(),!y.isBrowserSupported())throw new G(se.UNSUPPORTED);d.log("UserAgent:",navigator.userAgent),d.log("Screen resolution:",`${window.screen.width}x${window.screen.height}`),d.log("Permissions:",`Camera: ${y.hasCameraPermission()}, Mic: ${y.hasMicrophonePermission()}`),d.log("Simulcast:",`${n.simulcast} => ${l.simulcast}`)}async function cE(n,r=[de.AUDIO],e="",t=!1,i=!1,a,s){let c=[];return Array.isArray(n)?c=n.length?n:[]:n&&(c=[n]),Zo([],pt.USER,r,e,t,i,a,c,s)}async function Zo(n,r=pt.USER,e,t="",i=!1,a=!1,s,c,u){if(U.current())throw d.error("There is already active call"),new G(k.FAILED);return new U(ue,Ni).onStart({opponentIds:n,opponentType:r,mediaOptions:e,payload:t,joiningAllowed:i,requireAuthToJoin:a,onlyAdminCanShareMovie:s,externalIds:c,onFastStart:u})}async function dE(n,r){return ec(n,ae.USER,void 0,r)}async function ec(n,r=ae.USER,e,t,i,a){if(n===U.id())throw new Error("Push has already been processed");return a&&ue.setUserId(a),new U(ue,Ni).onPush(n,r,e,t,i)}async function lE(n,r){return n&&(l.authToken=n),r!==void 0&&l.apiBaseUrl!==r&&(l.apiBaseUrl=r,Zn()),ue.authorize()}async function pE(n=[de.AUDIO]){return Xe().accept(n)}async function uE(){let n=U.current();if(n)return n.decline()}async function mE(n,r=[de.AUDIO]){return tc(n,r)}async function tc(n,r,e){if(U.current())throw d.error("There is already active call"),new G(k.FAILED);return new U(ue,Ni).onJoin({conversationId:n,mediaOptions:r,chatId:e})}async function hE(n,r=[de.AUDIO],e,t,i){if(U.current())throw d.error("There is already active call"),new G(k.FAILED);return e&&(l.anonymToken=e),new U(ue,Ni).onJoin({joinLink:n,mediaOptions:r,observedIds:t,payload:i})}async function gE(){let n=U.current();if(n)return n.hangup();U.hangupAfterInit()}async function _E(n,r){let e=Array.isArray(n)?n:[n],t=U.current();t&&await t.addParticipant(e,r)}async function fE(n,r){let e=U.current();if(e){let t=n.map(i=>I.composeUserId(i));await e.addParticipantLegacy(t,r)}}async function SE(n,r=!1){let e=await ue.getOkIdsByExternalIds([n]);return ic(e[0],r)}async function ic(n,r=!1){let e=U.current();if(e)try{await e.removeParticipant(I.composeUserId(n),r)}catch(t){d.warn(`Failed to remove participant ${n}. Perhaps he is no longer on the call. ${t}`)}}async function vE(n,r){let e=U.current();if(n==="videoinput"&&Dt.contains(r))return l.videoFacingMode=r,e?(y.isMobile()&&e.stopVideoTrack(),e.changeDevice(n)):void 0;if(!await y._saveDeviceId(n,r))throw new Error(`Device not found: ${r}`);if(e)return e.changeDevice(n)}async function IE(n){let r=typeof n=="object"?{...n,fastScreenSharing:n.captureScreen&&n.fastScreenSharing,captureAudio:n.captureScreen&&n.captureAudio&&l.audioShare}:{captureScreen:n,fastScreenSharing:!1,captureAudio:!1},e=U.current();return e?e.toggleScreenCapturing(r):Promise.reject()}function EE(n){let r=U.current();r&&r.toggleAnimojiCapturing(n)}async function TE(n,r=!1){let e=U.current();e&&await e.setVideoStream(n,r)}async function RE(n){let r=U.current();r&&await r.toggleLocalVideo(n)}async function CE(n){let r=U.current();r&&await r.toggleLocalAudio(n)}async function PE(n){let r=U.current();if(r)return r.setLocalResolution(n)}async function yE(n){let r=U.current();r&&await r.changePriorities(n)}async function bE(n,r){let e=U.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 ME(){let n=U.current();n&&await n.putHandsDown()}async function AE(n){let r=U.current();r&&await r.updateDisplayLayout(n)}async function DE(n,r,e=!1){let t=await ue.getOkIdsByExternalIds([n]);return rc(t[0],$.getDeviceIdx(n),r,e)}async function rc(n,r,e,t=!1){let i=U.current();i&&await i.grantRoles(I.composeParticipantId(n,ae.USER,r),e,t)}async function wE({externalId:n=null,muteStates:r,requestedMedia:e=[],roomId:t=null}){let i=null;return n&&(i=(await ue.getOkIdsByExternalIds([n]))[0]),ac({uid:i,muteStates:r,requestedMedia:e,deviceIdx:$.getDeviceIdx(n),roomId:t})}async function ac({uid:n=null,muteStates:r,requestedMedia:e=[],deviceIdx:t=0,roomId:i=null}){let a=U.current();if(a){let s=n?I.composeParticipantId(n,ae.USER,t):null;await a.muteParticipant(s,r,e,i)}}async function kE(n,r=!1,e=null){let t=await ue.getOkIdsByExternalIds([n]);return nc(t[0],r,$.getDeviceIdx(n),e)}async function nc(n,r=!1,e=0,t=null){let i=U.current();i&&await i.pinParticipant(I.composeParticipantId(n,ae.USER,e),r,t)}async function OE(n){let r=U.current();r&&await r.updateMediaModifiers(n)}async function xE(n){let r=U.current();r&&await r.enableVideoSuspend(n)}async function NE(n){let r=U.current();r&&await r.enableVideoSuspendSuggest(n)}async function LE(n){let r=U.current();r&&await r.changeOptions(n)}async function UE(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),sc(n,e)}async function sc(n,r=null){let e=U.current();if(e){let t=r?I.composeUserId(r):null;await e.chatMessage(n,t)}}async function BE(n=10){let r=U.current();if(r)return r.chatHistory(n)}async function FE(n,r=null){let e=null;return r&&(e=(await ue.getOkIdsByExternalIds([r]))[0]),oc(n,e,$.getDeviceIdx(r))}async function oc(n,r=null,e=0){let t=U.current();if(t){let i=r?I.composeParticipantId(r,ae.USER,e):null;await t.customData(n,i)}}async function VE(n="",r=!1,{onlyAdminCanShareMovie:e=!1}={}){return(await ue.createConversation(I.uuid(),n,r,{onlyAdminCanShareMovie:e})).join_link}async function jE(n="",r=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},i){let a=$.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 HE(){let n=U.current();return n?n.createJoinLink():Promise.reject()}async function GE(){let n=U.current();return n?n.removeJoinLink():Promise.reject()}async function WE(n,r){return ue.getAnonymTokenByLink(n,r)}function KE(n){let r=U.current();r&&r.setVolume(n)}function qE(n){l.forceRelayPolicy=n}async function $E(n=!1,r=null,e=null,t="DIRECT_LINK",i=null,a=null){let s=U.current();return s?s.startStream(n,r,e,t,i,a):Promise.reject()}async function zE(n=null,r){let e=U.current();return e?e.stopStream(n,r):Promise.reject()}async function JE(n=null){let r=U.current();return r?r.publishStream(n):Promise.reject()}async function YE(n,r,e=!1,t=null){let i=U.current();if(!i)return Promise.reject();let a,s,c=[];if(r?.length&&c.push(...r),n&&c.push(n),c.length){let u=await 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 QE(){let n=U.current();return n?n.getStreamInfo():Promise.reject()}async function XE(n){let r=U.current();return r?r.addMovie(n):Promise.reject()}async function ZE(n){let r=U.current();return r?r.updateMovie(n):Promise.reject()}async function eT(n){let r=U.current();return r?r.removeMovie(n):Promise.reject()}async function tT(n,r){let e=U.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 iT(n,r){let e=U.current();return e?e.activateRooms(n,r):Promise.reject()}async function rT(n=null,r=null){let e=U.current();if(!e)return Promise.reject();let t;if(r){let i=await ue.getOkIdsByExternalIds([r]),a=$.getDeviceIdx(r);t=I.composeParticipantId(i[0],ae.USER,a)}return e.switchRoom(n,t)}async function aT(n){let r=U.current();return r?r.removeRooms(n):Promise.reject()}function nT(n){l.statisticsInterval=n;let r=U.current();if(r)return r.updateStatisticsInterval()}function sT(n){ns.disableLog(!n),d.toggle(n)}function oT(n,...r){l.debugLog&&d.send(n,"[external]",...r)}async function cT(){let n=Oe.conversationId;if(!n)throw d.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let r=Oe.collectLogs();if(r.length===0)throw d.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Oe.startTime,t=Oe.endTime;try{return ue?.uploadDebugLogs(n,e,t,JSON.stringify(r))}catch(i){throw d.error("[uploadDebugLogs]","Error while uploading logs",i),new Error("Error while uploading logs",{cause:i})}}async function dT(n){let r=U.current();if(r)return r.videoEffect(n)}async function lT(n,r){let e=U.current();if(e)return e.audioEffect(n.length>0?n:null,r)}async function pT(n){let r=U.current();r&&await r.setAudioStream(n)}async function uT(n,r=null,e=null){let t=U.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,$.getDeviceIdx(r))}t.setAnimojiSvg(n,a,i)}function mT(n){let r=U.current();r&&r.setAnimojiFill(n)}async function hT(n=null,r,e=!1){return Xe().getWaitingHall(n,r,e)}async function gT(){return Xe().getAudienceModeHands()}async function _T(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 fT(n=!1){return Xe().requestPromotion(n)}async function ST(n=!1){return Xe().acceptPromotion(n)}async function vT(n){return Xe().getParticipantListChunk(n)}async function IT(n){return Xe().getParticipants(n)}async function ET(n){return Xe().feedback(n)}function TT(n,r,e){return Xe().userFeedbackStats(n,r,e)}function RT(n,r={},e=!1){let t=U.current();t&&t.sendClientEvent(n,r,e)}async function CT(n,r){return Xe().enableFeatureForRoles(n,r)}function Xe(){let n=U.current();if(!n)throw new Error("Conversation not found");return n}async function PT(n){await ue.removeHistoryRecords(n)}async function yT(n){let r=U.current();r&&await r.startAsr(n)}async function bT(n){let r=U.current();r&&await r.stopAsr(n)}async function MT(n){let r=U.current();r&&await r.requestAsr(n)}async function AT(n){let r=U.current();return r?r.startUrlSharing(n):Promise.reject()}async function DT(){let n=U.current();return n?n.stopUrlSharing():Promise.reject()}function wT(){return l.sdkVersion}export{xi as Api,ga as ApiExternal,ha as ArrayDequeue,be as AuthData,Ht as BaseLogger,Ne as CallDirection,pt as CallType,la as ChatRoomEventType,pa as ConversationFeature,ti as ConversationOption,ln as DebugMessageType,ua as ExternalIdType,Dt as FacingMode,se as FatalError,G as HangupReason,k as HangupType,de as MediaOption,qe as MediaTrackKind,Si as MediaType,Ge as MuteState,Q as ParticipantState,as as ParticipantStateDataValue,Kr as ParticipantStatus,Xo as RecordRole,yi as RoomsEventType,ei as Signaling,N as SignalingCommandType,Qe as SignalingConnectionType,L as SignalingNotification,je as TransportTopology,vt as UserRole,ae as UserType,Ft as VolumeDetector,pE as acceptCall,ST as acceptPromotion,iT as activateRooms,XE as addMovie,_E as addParticipant,fE as addParticipantInternal,lE as authorize,tE as browser,Zo as callInternal,cE as callTo,IE as captureScreen,EE as captureVmoji,lT as changeAudioEffect,LE as changeConversationOptions,vE as changeDevice,bE as changeParticipantState,yE as changePriorities,dT as changeVideoEffect,BE as chatHistory,UE as chatMessage,sc as chatMessageInternal,HE as createJoinLink,FE as customData,oc as customDataInternal,sT as debug,oT as debugMessage,uE as declineCall,CT as enableFeatureForRoles,xE as enableVideoSuspend,NE as enableVideoSuspendSuggest,ET as feedback,qE as forceRelayPolicy,WE as getAnonymTokenByLink,gT as getAudienceModeHands,vT as getParticipantListChunk,IT as getParticipants,QE as getStreamInfo,hT as getWaitingHall,DE as grantRoles,rc as grantRolesInternal,gE as hangup,oE as init,mE as joinCall,hE as joinCallByLink,tc as joinCallInternal,RT as logClientEvent,wE as muteParticipant,ac as muteParticipantInternal,kE as pinParticipant,nc as pinParticipantInternal,dE as processPush,ec as processPushInternal,_T as promoteParticipant,JE as publishStream,ME as putHandsDown,YE as recordSetConf,PT as removeHistoryRecords,GE as removeJoinLink,eT as removeMovie,SE as removeParticipant,ic as removeParticipantInternal,aT as removeRooms,MT as requestAsr,fT as requestPromotion,nE as setAudioEffects,pT as setAudioStream,PE as setLocalResolution,rE as setLogger,OE as setMediaModifiers,nT as setStatisticsInterval,aE as setVideoEffects,TE as setVideoStream,sE as setVmoji,mT as setVmojiFill,uT as setVmojiSvg,KE as setVolume,yT as startAsr,jE as startAudienceConversation,VE as startConversation,$E as startStream,AT as startUrlSharing,bT as stopAsr,zE as stopStream,DT as stopUrlSharing,rT as switchRoom,CE as toggleLocalAudio,RE as toggleLocalVideo,AE as updateDisplayLayout,ZE as updateMovie,tT as updateRooms,cT as uploadDebugLogs,TT as userFeedbackStats,iE as utils,wT as version};