@vkontakte/calls-sdk 2.8.6-dev.b0a4fa9e.0 → 2.8.6-dev.b2f70eb6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/calls-sdk.cjs.js CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
- * @vkontakte/calls-sdk v2.8.6-dev.b0a4fa9e.0
3
- * Wed, 18 Jun 2025 15:41:30 GMT
2
+ * @vkontakte/calls-sdk v2.8.6-dev.b2f70eb6.0
3
+ * Wed, 18 Jun 2025 10:01:12 GMT
4
4
  * https://st.mycdn.me/static/callssdk/2-8-6/doc/
5
5
  */
6
6
 
7
- "use strict";var lo=Object.create;var Ei=Object.defineProperty;var po=Object.getOwnPropertyDescriptor;var uo=Object.getOwnPropertyNames;var ho=Object.getPrototypeOf,mo=Object.prototype.hasOwnProperty;var fo=(a,i,e)=>i in a?Ei(a,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[i]=e;var vn=(a,i)=>()=>(i||a((i={exports:{}}).exports,i),i.exports),go=(a,i)=>{for(var e in i)Ei(a,e,{get:i[e],enumerable:!0})},ma=(a,i,e,t)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of uo(i))!mo.call(a,r)&&r!==e&&Ei(a,r,{get:()=>i[r],enumerable:!(t=po(i,r))||t.enumerable});return a};var Jt=(a,i,e)=>(e=a!=null?lo(ho(a)):{},ma(i||!a||!a.__esModule?Ei(e,"default",{value:a,enumerable:!0}):e,a)),_o=a=>ma(Ei({},"__esModule",{value:!0}),a);var le=(a,i,e)=>fo(a,typeof i!="symbol"?i+"":i,e);var Xa=vn((df,Qa)=>{var di=1e3,li=di*60,pi=li*60,jt=pi*24,Cc=jt*7,Tc=jt*365.25;Qa.exports=function(a,i){i=i||{};var e=typeof a;if(e==="string"&&a.length>0)return Rc(a);if(e==="number"&&isFinite(a))return i.long?Pc(a):yc(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))};function Rc(a){if(a=String(a),!(a.length>100)){var i=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(a);if(i){var e=parseFloat(i[1]),t=(i[2]||"ms").toLowerCase();switch(t){case"years":case"year":case"yrs":case"yr":case"y":return e*Tc;case"weeks":case"week":case"w":return e*Cc;case"days":case"day":case"d":return e*jt;case"hours":case"hour":case"hrs":case"hr":case"h":return e*pi;case"minutes":case"minute":case"mins":case"min":case"m":return e*li;case"seconds":case"second":case"secs":case"sec":case"s":return e*di;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return e;default:return}}}}function yc(a){var i=Math.abs(a);return i>=jt?Math.round(a/jt)+"d":i>=pi?Math.round(a/pi)+"h":i>=li?Math.round(a/li)+"m":i>=di?Math.round(a/di)+"s":a+"ms"}function Pc(a){var i=Math.abs(a);return i>=jt?kr(a,i,jt,"day"):i>=pi?kr(a,i,pi,"hour"):i>=li?kr(a,i,li,"minute"):i>=di?kr(a,i,di,"second"):a+" ms"}function kr(a,i,e,t){var r=i>=e*1.5;return Math.round(a/e)+" "+t+(r?"s":"")}});var es=vn((lf,Za)=>{function wc(a){e.debug=e,e.default=e,e.coerce=d,e.disable=s,e.enable=r,e.enabled=o,e.humanize=Xa(),e.destroy=p,Object.keys(a).forEach(u=>{e[u]=a[u]}),e.names=[],e.skips=[],e.formatters={};function i(u){let h=0;for(let _=0;_<u.length;_++)h=(h<<5)-h+u.charCodeAt(_),h|=0;return e.colors[Math.abs(h)%e.colors.length]}e.selectColor=i;function e(u){let h,_=null,C,P;function B(...W){if(!B.enabled)return;let X=B,fe=Number(new Date),Oe=fe-(h||fe);X.diff=Oe,X.prev=h,X.curr=fe,h=fe,W[0]=e.coerce(W[0]),typeof W[0]!="string"&&W.unshift("%O");let J=0;W[0]=W[0].replace(/%([a-zA-Z%])/g,(be,Rt)=>{if(be==="%%")return"%";J++;let Si=e.formatters[Rt];if(typeof Si=="function"){let Xi=W[J];be=Si.call(X,Xi),W.splice(J,1),J--}return be}),e.formatArgs.call(X,W),(X.log||e.log).apply(X,W)}return B.namespace=u,B.useColors=e.useColors(),B.color=e.selectColor(u),B.extend=t,B.destroy=e.destroy,Object.defineProperty(B,"enabled",{enumerable:!0,configurable:!1,get:()=>_!==null?_:(C!==e.namespaces&&(C=e.namespaces,P=e.enabled(u)),P),set:W=>{_=W}}),typeof e.init=="function"&&e.init(B),B}function t(u,h){let _=e(this.namespace+(typeof h>"u"?":":h)+u);return _.log=this.log,_}function r(u){e.save(u),e.namespaces=u,e.names=[],e.skips=[];let h=(typeof u=="string"?u:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let _ of h)_[0]==="-"?e.skips.push(_.slice(1)):e.names.push(_)}function n(u,h){let _=0,C=0,P=-1,B=0;for(;_<u.length;)if(C<h.length&&(h[C]===u[_]||h[C]==="*"))h[C]==="*"?(P=C,B=_,C++):(_++,C++);else if(P!==-1)C=P+1,B++,_=B;else return!1;for(;C<h.length&&h[C]==="*";)C++;return C===h.length}function s(){let u=[...e.names,...e.skips.map(h=>"-"+h)].join(",");return e.enable(""),u}function o(u){for(let h of e.skips)if(n(u,h))return!1;for(let h of e.names)if(n(u,h))return!0;return!1}function d(u){return u instanceof Error?u.stack||u.message:u}function p(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return e.enable(e.load()),e}Za.exports=wc});var ts=vn((Fe,xr)=>{Fe.formatArgs=Ac;Fe.save=Dc;Fe.load=kc;Fe.useColors=Mc;Fe.storage=xc();Fe.destroy=(()=>{let a=!1;return()=>{a||(a=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();Fe.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Mc(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let a;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(a=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(a[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function Ac(a){if(a[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+a[0]+(this.useColors?"%c ":" ")+"+"+xr.exports.humanize(this.diff),!this.useColors)return;let i="color: "+this.color;a.splice(1,0,i,"color: inherit");let e=0,t=0;a[0].replace(/%[a-zA-Z%]/g,r=>{r!=="%%"&&(e++,r==="%c"&&(t=e))}),a.splice(t,0,i)}Fe.log=console.debug||console.log||(()=>{});function Dc(a){try{a?Fe.storage.setItem("debug",a):Fe.storage.removeItem("debug")}catch{}}function kc(){let a;try{a=Fe.storage.getItem("debug")||Fe.storage.getItem("DEBUG")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=void 0),a}function xc(){try{return localStorage}catch{}}xr.exports=es()(Fe);var{formatters:Oc}=xr.exports;Oc.j=function(a){try{return JSON.stringify(a)}catch(i){return"[UnexpectedJSONParseError]: "+i.message}}});var tp={};go(tp,{Api:()=>_i,ApiExternal:()=>mn,ArrayDequeue:()=>hn,AuthData:()=>Te,BaseLogger:()=>wt,CallDirection:()=>Le,CallType:()=>dt,ChatRoomEventType:()=>Qr,ConversationFeature:()=>Xr,ConversationOption:()=>Gt,DebugMessageType:()=>qn,ExternalIdType:()=>Zr,FacingMode:()=>vt,FatalError:()=>ne,HangupReason:()=>G,HangupType:()=>D,MediaOption:()=>oe,MediaTrackKind:()=>He,MediaType:()=>oi,MuteState:()=>Ge,ParticipantState:()=>Q,ParticipantStateDataValue:()=>ta,ParticipantStatus:()=>lr,RecordRole:()=>Ys,RoomsEventType:()=>hi,Signaling:()=>Wt,SignalingCommandType:()=>O,SignalingConnectionType:()=>ot,SignalingNotification:()=>L,TransportTopology:()=>tt,UserRole:()=>mt,UserType:()=>re,VolumeDetector:()=>bt,acceptCall:()=>Od,acceptPromotion:()=>jl,activateRooms:()=>Rl,addMovie:()=>El,addParticipant:()=>Fd,addParticipantInternal:()=>Vd,authorize:()=>xd,browser:()=>Td,callInternal:()=>Qs,callTo:()=>Dd,captureScreen:()=>Gd,captureVmoji:()=>Hd,changeAudioEffect:()=>xl,changeConversationOptions:()=>al,changeDevice:()=>Wd,changeParticipantState:()=>Yd,changePriorities:()=>Jd,changeVideoEffect:()=>kl,chatHistory:()=>ol,chatMessage:()=>sl,chatMessageInternal:()=>no,createJoinLink:()=>pl,customData:()=>cl,customDataInternal:()=>ao,debug:()=>Ml,debugMessage:()=>Al,declineCall:()=>Nd,enableFeatureForRoles:()=>$l,enableVideoSuspend:()=>rl,enableVideoSuspendSuggest:()=>nl,feedback:()=>Hl,forceRelayPolicy:()=>fl,getAnonymTokenByLink:()=>hl,getAudienceModeHands:()=>Bl,getParticipantListChunk:()=>Wl,getParticipants:()=>Gl,getStreamInfo:()=>Il,getWaitingHall:()=>Ul,grantRoles:()=>Zd,grantRolesInternal:()=>to,hangup:()=>Bd,init:()=>Ad,joinCall:()=>Ld,joinCallByLink:()=>Ud,joinCallInternal:()=>Zs,logClientEvent:()=>Kl,muteParticipant:()=>el,muteParticipantInternal:()=>io,pinParticipant:()=>tl,pinParticipantInternal:()=>ro,processPush:()=>kd,processPushInternal:()=>Xs,promoteParticipant:()=>Fl,publishStream:()=>Sl,putHandsDown:()=>Qd,recordSetConf:()=>vl,removeHistoryRecords:()=>zl,removeJoinLink:()=>ul,removeMovie:()=>Cl,removeParticipant:()=>jd,removeParticipantInternal:()=>eo,removeRooms:()=>Pl,requestAsr:()=>Ql,requestPromotion:()=>Vl,setAudioEffects:()=>wd,setAudioStream:()=>Ol,setLocalResolution:()=>zd,setLogger:()=>yd,setMediaModifiers:()=>il,setStatisticsInterval:()=>wl,setVideoEffects:()=>Pd,setVideoStream:()=>qd,setVmoji:()=>Md,setVmojiFill:()=>Ll,setVmojiSvg:()=>Nl,setVolume:()=>ml,startAsr:()=>Jl,startAudienceConversation:()=>ll,startConversation:()=>dl,startStream:()=>gl,startUrlSharing:()=>Xl,stopAsr:()=>Yl,stopStream:()=>_l,stopUrlSharing:()=>Zl,switchRoom:()=>yl,toggleLocalAudio:()=>$d,toggleLocalVideo:()=>Kd,updateDisplayLayout:()=>Xd,updateMovie:()=>bl,updateRooms:()=>Tl,uploadDebugLogs:()=>Dl,userFeedbackStats:()=>ql,utils:()=>Rd,version:()=>ep});module.exports=_o(tp);var ia=Jt(require("webrtc-adapter"));var wt=class{log(i,e,t=!1){}destroy(){}};var ae=class{constructor(){this._handlers={};this._listeners=[]}_triggerEvent(i,...e){if(this._handlers.hasOwnProperty(i))for(let t of this._handlers[i])t.apply(this,e)}addEventListener(i,e){if(typeof e!="function")throw new Error("Listener should be a function");return this._handlers.hasOwnProperty(i)||(this._handlers[i]=[]),this._handlers[i].push(e),{dispose:this.removeEventListener.bind(this,i,e)}}removeEventListener(i,e){if(!this._handlers.hasOwnProperty(i))return;e||delete this._handlers[i];let t=this._handlers[i].indexOf(e);t>=0&&this._handlers[i].splice(t,1)}subscribe(i,e,t){let r=i.addEventListener(e,t);this._listeners.push(r)}unsubscribe(){this._listeners.forEach(i=>{i.dispose()})}};var bi=class extends ae{get ready(){return!0}setParticipantIdRegistry(i){}requestRealloc(){}setEndpoint(i){}setWebTransportEndpoint(i){}setConversationId(i){}readyToSend(i=!0){}cleanup(){}requestTestMode(i,e){}getNextCommandSequenceNumber(){return 0}};var fa=(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))(fa||{}),D=fa;var G=class a extends Error{constructor(i,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(i)>-1?this.hangup=i:this.error=i;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=i+(t.length?` (${t.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,a)}};var T=class a extends wt{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,r=!1){let n={};typeof t<"u"&&(n.param=t),this._logInternal(e,n,r),this._externalLogger&&this._externalLogger.log(e,t,r)}logCustom(e,t,r=!1){this._logInternal(e,t,r)}logClientStats(e,t=!1){let r=Object.assign(e,{vcid:U.id(),timestamp:this._now()});Object.keys(r).forEach(n=>{r[n]===void 0&&delete r[n]}),this._batchedClientStats.push(r),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let r=Object.assign(e,{vcid:U.id(),timestamp:this._now()});this._batchedClientEvents.push(r),(t||!this._batchTimeout)&&this._sendBatch()}_logInternal(e,t,r){let n={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:U.id()}),uid:this._api.getUserId()};this._batchedLogItems.push(n),(r||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}static create(e,t){a._instance||(a._instance=new a(e,t))}static log(e,t,r=!1){a._instance&&a._instance.log(e,t,r)}static logCustom(e,t,r=!1){a._instance&&a._instance.logCustom(e,t,r)}static logClientStats(e,t=!1){a._instance&&a._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){a._instance&&a._instance.logClientEvent(e,t)}static destroy(){a._instance&&a._instance.destroy(),a._instance=null}};var N=require("messagepack");var ga=(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))(ga||{}),O=ga;var _a=(W=>(W.MIC_CAMERA_PERMISSION="mic_camera",W.CAMERA_PERMISSION="camera",W.MIC_PERMISSION="mic",W.CAMERA_ACCESS="cameralock",W.MIC_ACCESS="miclock",W.MIC_NOT_FOUND="nomic",W.SCREEN_PERMISSION="screenpermission",W.SCREEN_ACCESS="screenlock",W.CONNECTION="connection",W.NETWORK="network",W.UNKNOWN="unknown",W.UNSUPPORTED="unsupported",W.SIGNALING_FAILED="signalingfailed",W.API="api",W.AUTH="auth",W.OVERCONSTRAINED="overconstrained",W))(_a||{}),ne=_a;var Sa=(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))(Sa||{}),oe=Sa;var va=(q=>(q.ERROR="callError",q.DEVICES="callDevices",q.CALL_SPEC_ERROR="callSpecError",q.ICE_CONNECTION_STATE="callIceConnectionState",q.ICE_CONNECTION_TYPE="callIceConnectionType",q.ICE_RESTART="callIceRestart",q.PUSH="callPush",q.OUTGOING_CALL="callStart",q.CALL_FINISH="call_finish",q.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",q.JOIN_CONVERSATION="callJoinConversation",q.ACCEPTED_OUTGOING="callAcceptedOutgoing",q.ACCEPT_INCOMING="callAcceptIncoming",q.DECLINE_INCOMING="callDeclineIncoming",q.ACCEPT_CONCURRENT="callAcceptConcurrent",q.HANGUP="callHangup",q.CODEC_USAGE="codec_usage",q.MEDIA_STATUS="callMediaStatus",q.DEVICE_CHANGED="callDeviceChanged",q.SOCKET_ACTION="callSocketAction",q.ADD_PARTICIPANT="callAddParticipant",q.REMOVE_PARTICIPANT="callRemoveParticipant",q.POOR_CONNECTION="callPoorConnection",q.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",q.RELAY_POLICY="callForceRelay",q.PAT_ALLOCATED="patAllocate",q.PAT_DEALLOCATED="patDeallocate",q.PAT_ERROR="patError",q.PAT_WAITING_TIME_ERROR="patWaitingTimeError",q.PAT_OUTDATED_RESPONSE="patOutdatedResponse",q.SIGNALING_CONNECTED="signaling_connected",q.RECONNECT="callReconnect",q.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",q.SCREENSHARE_FREEZE_DURATION="callScreenshareFreezeDuration",q.FIRST_MEDIA_RECEIVED="first_media_received",q.CALL_EVENTUAL_STAT="callEventualStat",q.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",q.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",q.CALL_START="call_start",q.WEBTRANSPORT_CONNECTED="webtransport_connected",q))(va||{}),E=va;var In=Jt(require("@vkontakte/libvpx"));var ze=class{constructor(){this._worker=null}async _createWorker(i,e,t=[],r={},n=[]){return new Promise((s,o)=>{let d=t.join(","),p=new Blob([i,`exports.default(${d});`],{type:"application/javascript; charset=utf-8"}),u=window.URL.createObjectURL(p);this._worker=new Worker(u),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":o(h.data.error);break;case"frame":e(h.data);break;case"debug":c.debug(h.data.message);break;case"log_error":T.log(E.ERROR,h.data.message);break}},this._sendToWorker("init",r,n)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(i,e={},t=[]){this._worker?.postMessage(Object.assign({type:i},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var Mt=class extends ze{async init(i,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 r=new ImageData(new Uint8ClampedArray(t.data),t.width,t.height);i(r)}},[In.default,In.default.getUrl])}decodeFrame(i,e,t,r){this._sendToWorker("frame",{timestamp:i,data:e.buffer,isVP9:t,keyFrame:r,debug:c.enabled()},[e.buffer])}destroy(){this._removeWorker(),c.debug("LibVPxDecoder destroyed")}static isBrowserSupported(){return"WebAssembly"in window&&"Worker"in window}};var nt=class extends ze{async init(i,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)):(i(t.data),t.data.close())},[y.baseChromeVersion()>=92||y.browserName()==="Safari"])}decodeFrame(i,e,t,r=!1){this._sendToWorker("frame",{timestamp:i,data:e.buffer,isVP9:t,keyFrame:r},[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 At=class{constructor(i=null,e=0){this._counter=0;this._interval=0;this._lastCalculationTime=Date.now();this._onCalculated=null;this._onCalculated=i,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(i=1){this._counter+=i}calculate(){let i=Date.now(),e=i-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=i,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};var Pa=require("bit-buffer");var Ia=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Ia||{}),re=Ia;var _t={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Ci="L1T2",ba=[{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}],So={h:1,m:2,l:4};function Ca(a,i){return!a||!i?a===i:a.streams.length===i.streams.length?a.streams.every((e,t)=>v.isObjectsEquals(e,i.streams[t])):!1}function Ea(a,i){for(let e of i)if(a<=e.dimension)return e.bitrate;return length>0?i[length-1].bitrate:ba[0].bitrate}function Ti(a=_t.WIDTH,i=_t.HEIGHT,e=ba){let t=["h","m","l"],r=Math.max(a,i),n=1;r>=960?n=3:r>=480&&(n=2);let s={streams:[]},o=30,d=Ea(r,e)??_t.BITRATE;for(let p=0;p<n;p++){let u=t[p];s.streams.push({rid:u,width:a,height:i,fps:o,bitrate:d}),a=Math.round(a/2),i=Math.round(i/2),d=Ea(Math.max(a,i),e)??Math.round(d/2)}return s}function tr(a){return So[a]??1}var Ta=typeof Object.fromEntries=="function"?Object.fromEntries:function(a){if(!a||!a[Symbol.iterator])throw new Error("Object.fromEntries() requires a single iterable argument");let i={};for(let[e,t]of a)i[e]=t;return i};async function Ra(a){return new Promise((i,e)=>{let t=new FileReader;t.onload=r=>{i(r.target?.result)},t.onerror=e,t.readAsArrayBuffer(a)})}var Yt=":",rr="d",vo=533,ir="a=fmtp:",Io="sps-pps-idr-in-keyframe=1",En;($e=>{let a=/[\r\n]+/,i=`\r
8
- `;function e(m,b){let R=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),w,g=[];for(w=0;w<m.length;++w){let A=m[w].match(R);A&&A.length===3&&A[2]===b&&g.push(A[1])}return g}function t(m,b,R){let w=m.split(" "),g=w.slice(0,3),A;for(A=3;A<w.length;A++)R.includes(w[A])&&g.push(w[A]);for(A=3;A<w.length;A++)!R.includes(w[A])&&!b.includes(w[A])&&g.push(w[A]);return g.join(" ")}function r(m,b,R,w){let g,A="m="+b;for(g=0;g<m.length;++g)m[g].startsWith(A)&&(m[g]=t(m[g],R,w))}function n(m,b){let R=new RegExp(ir+"(\\d+)");for(let w=0;w<m.length;++w){let g=m[w].match(R);if(g&&g.length===2&&b.includes(g[1])){let A=m[w].trim()===ir+g[1]?" ":";";m[w]+=A+Io}}}function s(m,b){let R=e(m,b);if(!R.length)return;let w=R.slice(0),g=new RegExp(ir+"(\\d+) apt=(\\d+)"),A;for(A=0;A<m.length;++A){let F=m[A].match(g);F&&F.length===3&&w.includes(F[2])&&w.push(F[1])}let H=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for(A=m.length;A--;){let F=m[A].match(H);F&&F.length===3&&w.includes(F[2])&&m.splice(A,1)}r(m,"video",w,[])}function o(m,b,R,w){let g=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),A,H=[];for(A=b;A<R;++A){let Z=m[A].match(g);Z&&Z.length===3&&Z[2]===w&&H.push(Z[1])}if(!H.length)return H;let F=new RegExp(ir+"(\\d+) apt=(\\d+)");for(A=b;A<R;++A){let Z=m[A].match(F);Z&&Z.length===3&&H.includes(Z[2])&&H.push(Z[1])}return H}function d(m,b,R,w){let g=o(m,b,R,w);if(!g.length)return R+1;let A=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),H=0,F=R;for(;F>=b;){let Z=m[F].match(A);Z&&Z.length===3&&g.includes(Z[2])&&(m.splice(F,1),H++),F--}return m[b]=t(m[b],g,[]),R-H+1}function p(m,b,R,w){let g=-1,A=-1,H=!1;for(let F=0;F<m.length;++F)if(g>=0&&m[F].startsWith("m=")&&(A=F-1,H&&(F=d(m,g,A,b)),g=-1,A=-1,H=!1),m[F].startsWith("m=video")&&(g=F),g>=0){let Z=R==="remote"&&w==="encoder"||R==="local"&&w==="decoder"?"recvonly":"sendonly";(m[F].startsWith(`a=${Z}`)||m[F].startsWith("a=sendrecv"))&&(H=!0)}A=m.length-1,g>=0&&H&&d(m,g,A,b)}function u(m,b,R){let w=e(m,"H264");b&&r(m,"video",[],w),R&&n(m,w)}function h(m){let b=e(m,"VP9");r(m,"video",[],b)}function _(m,b,R,w,g,A=!1,H=!1){if(!b&&!R&&!w&&!H&&!A&&!g)return m;function F(x){let Ie=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],ge="a=rtcp-fb:111",Ee=x.findIndex(de=>de.startsWith(ge));return~Ee&&(x[Ee]=x[Ee]+i+Ie.join(i)),x}function Z(x){let Ie=e(x,"red");Ie.length>0&&r(x,"audio",[],Ie)}let Se=m.split(a);return R?p(Se,"H264","local","decoder"):(b||g)&&u(Se,b,g),w&&h(Se),H&&Z(Se),A&&F(Se),Se.join(i)}$e.patchLocalSDP=_;function C(m,b,R,w,g,A,H){b&&(m=m.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 F=m.split(a);return w?s(F,"H264"):R&&u(F,R,!1),A&&H?s(F,"VP9"):A?p(F,"VP9","remote","encoder"):H?p(F,"VP9","remote","decoder"):g&&h(F),F.join(i)}$e.patchRemoteSDP=C;function P(m){return m?`${m.type||"WEB_SOCKET"}_${m.id}`:"_"}$e.getPeerIdString=P;function B(m,b){return m&&m.id===b.id&&(m.type||"WEB_SOCKET")===(b.type||"WEB_SOCKET")}$e.comparePeerId=B;async function W(m){let b={local:null,remote:null};if(!m||!m.getStats)return b;try{let R=await m.getStats(null),w=null;if(R.forEach(g=>{g.type==="transport"&&g.selectedCandidatePairId?w=R.get(g.selectedCandidatePairId):g.type==="candidate-pair"&&g.state==="succeeded"&&!w&&(!g.hasOwnProperty("selected")||g.selected)&&(w=g)}),w?.localCandidateId){let g=R.get(w.localCandidateId);g&&(b.local={type:g.candidateType,ip:g.ip||g.ipAddress,port:g.port||g.portNumber})}if(w?.remoteCandidateId){let g=R.get(w.remoteCandidateId);g&&(b.remote={type:g.candidateType,ip:g.ip||g.ipAddress,port:g.port||g.portNumber})}return b}catch{return b}}$e.getPeerConnectionHostInfo=W;let X=/^[0-9]+$/,fe=/^([gu])([0-9]+)$/;function Oe(m,b=re.USER){let R=String(m);return fe.test(R)?(c.warn(`Already composite id [${m}] type supplied [${b}]`),R):b===re.GROUP?"g"+R:b===re.USER?"u"+R:(c.warn(`Unknown type [${b}] for id [${m}]`),R.match(X)?"u"+R:R)}$e.composeUserId=Oe;function J(m,b,R=0){let w=Oe(m,b);return Ae(w,R)}$e.composeParticipantId=J;function Ae(m,b){return b?m+Yt+rr+b:m}$e.compose=Ae;function be(m){return J(m.id,m.idType||re.USER,m.deviceIdx)}$e.composeId=be;function Rt(m){if(m.decorativeUserId)return J(m.decorativeUserId,m.idType||re.USER,m.deviceIdx)}$e.composeDecorativeId=Rt;function Si(m){return m.participant?be(m.participant):J(m.participantId,m.participantType||re.USER,m.deviceIdx)}$e.composeMessageId=Si;function Xi(m){return typeof m=="string"?te(vi(m).compositeUserId).id:m}$e.extractOkId=Xi;function te(m){let b=String(m),R=b.match(fe);return R?{id:Number(R[2]),type:R[1]==="g"?re.GROUP:re.USER}:(c.warn(`Unsupported compositeId [${m}]`),{id:Number(b),type:re.USER})}$e.decomposeId=te;function vi(m){let b=m.split(Yt+rr);return{compositeUserId:b[0],deviceIdx:b.length>1?parseInt(b[1],10):0}}$e.decomposeParticipantId=vi;function ra(){let m=window.crypto?.randomUUID?.();if(m)return m;let b="0123456789abcdefghijklmnopqrstuvwxyz".split(""),R=new Array(36),w=0,g,A;for(A=0;A<36;A++)A===8||A===13||A===18||A===23?R[A]="-":A===14?R[A]="4":(w<=2&&(w=33554432+Math.random()*16777216|0),g=w&15,w=w>>4,R[A]=b[A===19?g&3|8:g]);return R.join("")}$e.uuid=ra;function na(m,b){let R;function w(...g){let A=this;R&&window.clearTimeout(R),R=window.setTimeout(()=>{m.apply(A,g)},b)}return w}$e.debounce=na;function aa(m){if(!window.BigInt)return null;let b="",R=m.split(`
9
- `);for(let A of R)if(A.startsWith("a=fingerprint")){let H=A.split(" ");if(H.length===2){b=H[1];break}}if(!b)return BigInt(-1);let w=b.split(":"),g=BigInt(0);for(let A=Math.min(7,w.length-1);A>=0;A--){let H=BigInt(parseInt(w[A],16));g<<=BigInt(8),g|=H}return BigInt.asIntN(64,g)}$e.sdpFingerprint=aa;async function sa(m){return new Promise(b=>window.setTimeout(b,m))}$e.delay=sa;function oa(m,b,R){let w=[];return m.getSenders().forEach(g=>Zi(b,g,g.track,R,w)),w}$e.applySettings=oa;function Zi(m,b,R,w,g){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!m||!R||R.kind!=="video")return;let A=R.getSettings();if(!A)return;let H=m.maxBitrateK?m.maxBitrateK*1024:null,F=A.width,Z=A.height,Se=F&&Z&&m.maxDimension?Math.max(1,Math.max(F,Z)/m.maxDimension):null,x=m.maxFramerate||null;if(F&&Z&&m.maxDimension&&m.maxDimension>Math.max(F,Z)){let de=Math.round(F*Z/256),Ue=(Math.round(de*vo/1e4)+1)*1e4;H=H===null?Ue:Math.min(Ue,H)}let Ie=m.degradationPreference||"balanced",ge=w[R.id];if(ge&&ge.bitrate===H&&ge.scaleResolutionDownBy===Se&&ge.maxFramerate===x&&ge.degradationPreference===Ie){g[R.id]=ge;return}g[R.id]={bitrate:H,scaleResolutionDownBy:Se,maxFramerate:x,degradationPreference:Ie};let Ee=b.getParameters();if(Ee.encodings||(Ee.encodings=[{}]),Ee.encodings.length>1&&F&&Z&&m.maxDimension){let de=Math.round(m.maxDimension*1.35),Ue=Math.max(F,Z),yt=Ti(F,Z,m?.bitrates?.generic),zt=yt.streams.length;c.log(`applyVideoTrackSettings: maxDim=${m.maxDimension} targetDim=${de} track=${F}x${Z} sim=${JSON.stringify(yt)}`),Ee.encodings.forEach((rt,Ii)=>{rt.scaleResolutionDownBy=tr(rt.rid);let ua=Math.round(Ue/rt.scaleResolutionDownBy);Ii<zt-1?rt.active=ua<de:Ii>=zt?rt.active=!1:rt.active=!0,Ii<zt?rt.maxBitrate=yt.streams[Ii].bitrate:rt.maxBitrate=0,rt.scalabilityMode=Ci})}else Ee.encodings.forEach(de=>{m?.scalabilityMode&&(de.scalabilityMode=m.scalabilityMode),H?de.maxBitrate=H:delete de.maxBitrate,Se?de.scaleResolutionDownBy=Se:delete de.scaleResolutionDownBy,x?de.maxFramerate=x:delete de.maxFramerate});if(Ee.degradationPreference=Ie,Ee.encodings.length>0){b.setParameters?.(Ee).catch(Ue=>{c.error("Failed to set sender parameters",Ee,Ue)});let de=b.getParameters();c.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(de.encodings)}`)}}$e.applyVideoTrackSettings=Zi;function fn(m,b){Array.isArray(b)||(b=[b]);for(let R of b)if(m.includes(R))return!0;return!1}$e.includesOneOf=fn;function ca(m){return Object.entries(m.participantState?.state||{}).reduce((b,[R,w])=>(m.participantState&&(b[R]={ts:m.participantState.stateUpdateTs[R],state:w}),b),{})}$e.mapParticipantState=ca;function da(m){let b=m.map(R=>({uid:R.externalId,mediaSettings:R.mediaSettings,status:R.status,muteStates:R.muteStates,unmuteOptions:R.unmuteOptions,participantState:R.participantState,markers:R.markers,movieShareInfos:R.movieShareInfos}));return l.filterObservers?b.filter(R=>!R.uid.observer):b}$e.mapSharedParticipants=da;function la(m,b){let R=Object.keys(m),w=Object.keys(b);if(R.length!==w.length)return!1;for(let g of R)if(!w.hasOwnProperty(g)||m[g].state!==b[g].state||m[g].ts!==b[g].ts)return!1;return!0}$e.isEqualParticipantState=la;function gn(m,b,R=!1){let w=Object.keys(m),g=Object.keys(b);if(w.length!==g.length)return!1;for(let A of w){if(!b.hasOwnProperty(A))return!1;let H=m[A],F=b[A];if(R&&me(H)&&me(F))return gn(H,F,R);if(H!==F)return!1}return!0}$e.isObjectsEquals=gn;function pa(m,b){if(m.length!==b.length)return!1;for(let R of m)if(b.indexOf(R)<0)return!1;return!0}$e.isArraysEquals=pa;function q(m){return!Object.keys(m).length}$e.isEmptyObject=q;function he(m,b){if(!m&&!b)return 0;if(!m||!b)return m?-1:1;return w(b.rank,m.rank)||w(m.ts,b.ts)||R(m,b);function R(g,A){let H={[re.USER]:0,[re.GROUP]:1},{compositeUserId:F,deviceIdx:Z}=vi(g.id),{compositeUserId:Se,deviceIdx:x}=vi(A.id),{id:Ie,type:ge}=te(F),{id:Ee,type:de}=te(Se);return w(H[ge],H[de])||w(Ie,Ee)||w(Z,x)}function w(g,A){return g<A?-1:g===A?0:1}}$e.participantMarkerCompare=he;function V(m,b){let R=Object.entries(m).filter(([,w])=>Array.isArray(b)?!b.includes(w):w!==b);return Ta(R)}$e.objectFilterOutValues=V;function ie(m,b,R){let w=R;for(let g in m)m.hasOwnProperty(g)&&(w=b(w,m[g],g));return w}$e.objectReduce=ie,$e.setImmediate=(()=>{let m=1,b={},R=null;return typeof MessageChannel<"u"&&(R=new MessageChannel,R.port1.onmessage=w=>{let g=w.data;b[g]&&(b[g](),delete b[g])}),function(w){if(R&&document.visibilityState==="hidden"){let A=m;return m=m>=Number.MAX_SAFE_INTEGER?1:m+1,b[A]=w,R.port2.postMessage(A),()=>{b[A]&&delete b[A]}}let g=setTimeout(w,0);return()=>clearTimeout(g)}})();function me(m){return m!==null&&typeof m=="object"&&!Array.isArray(m)}$e.isObject=me;function pt(m,b,R,w){function g(F,Z){let Se=0,x=F.length,Ie=!1;for(let ge=0;ge<F.length;ge++)if(F[ge].startsWith("m=video")&&(Se=ge),F[ge].startsWith("a=mid:"+Z)&&(Ie=!0),Ie&&F[ge].startsWith("m=")){x=ge;break}return{start:Se,end:x}}function A(F,Z,Se,x,Ie,ge,Ee){let de="a=rid:"+x+" send";for(let Ue=Z;Ue<Se;Ue++)if(F[Ue]===de){let zt=de+" max-width="+ge+";max-height="+Ee+";max-br="+Ie;F[Ue]=zt}}let H=b?.sender;if(H&&H.track&&b.mid){let F=m.split(a),{start:Z,end:Se}=g(F,b.mid),x=H.getParameters();if(x.encodings)return x.encodings.forEach(Ie=>{let ge=Ie.rid,Ee=Ie.maxBitrate,de=Ie.scaleResolutionDownBy;if(R&&w&&de){let Ue=""+Math.round(R/de),yt=""+Math.round(w/de);A(F,Z,Se,ge,Ee,Ue,yt)}}),F.join(i)}return m}$e.patchSimulcastAnswerSdp=pt})(En||(En={}));var v=En;var Eo=1e3;function ce(a,i,e=0){return i in a&&a[i]?a[i]:e}function bn(...a){return i=>{for(let e of a)if(e(i))return!0;return!1}}function St(a,i){return e=>e[a]===i}function bo(a){return(i,e)=>e[a]-i[a]}function Ri(a,i){return i.reduce((e,t)=>(e[t[a]]=t,e),{})}function Co(a){let i={},e=[];for(let t of a)i[t.id]||(i[t.id]=!0,e.push(t));return e}function Cn(a){return Object.keys(a).filter(i=>a[i]!==void 0).map(i=>[i,a[i]]).reduce((i,e)=>(i[e[0]]=v.isObject(e[1])?Cn(e[1]):e[1],i),{})}function To(a){let i=[];for(let e of a)e.forEach(t=>i.push(t));return i}async function Ro(a){let i=[];return RTCRtpReceiver.prototype.getStats?(i.push(...a.getReceivers().map(e=>e.getStats())),i.push(...a.getSenders().map(e=>e.getStats()))):i.push(a.getStats()),Promise.all(i).then(To).then(Co)}function yo(a){let i=a.filter(St("type","candidate-pair")).sort(bo("priority")).find(bn(St("nominated",!0),St("selected",!0)));if(!i)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let e={timestamp:i.timestamp,availableOutgoingBitrate:i.availableOutgoingBitrate||0,totalRoundTripTime:i.totalRoundTripTime||0,currentRoundTripTime:i.currentRoundTripTime||0,bytesSent:i.bytesSent||0,bytesReceived:i.bytesReceived||0},t=a.find(St("id",i.remoteCandidateId));t&&Object.assign(e,{remote:{type:t.candidateType,address:t.ip||t.address,port:t.port,protocol:t.protocol}});let r=a.find(St("id",i.localCandidateId));return r&&Object.assign(e,{local:{type:r.candidateType,address:r.ip||r.address,port:r.port,protocol:r.protocol,relayProtocol:r.relayProtocol,networkType:r.networkType}}),Cn(e)}function ya(a,i,e=!1){let t=Ri("id",a),r=e?a.filter(bn(St("type","remote-inbound-rtp"))):a.filter(bn(St("type","inbound-rtp"),St("type","outbound-rtp")));return y.browserName()==="Firefox"&&(r=Object.values(r.reduce((n,s)=>{if(!n[s.ssrc])n[s.ssrc]=s;else{let o=Object.assign({},n[s.ssrc],s),d=n[s.ssrc].isRemote?s:n[s.ssrc];o.id=d.id,o.type=d.type,delete o.isRemote,delete o.remoteId,n[o.ssrc]=o}return n},{}))),r.map(n=>{let s=Number(n.ssrc),o=n.mediaType||n.kind,d=n.remoteId||n.trackId,p=n.type,u=n.codecId;if(!p||!s||!o)return null;let h={ssrc:s,type:p,kind:o,bytesReceived:ce(n,"bytesReceived"),bytesSent:ce(n,"bytesSent"),headerBytesReceived:ce(n,"headerBytesReceived"),headerBytesSent:ce(n,"headerBytesSent"),jitter:ce(n,"jitter"),packetsLost:ce(n,"packetsLost"),packetsReceived:ce(n,"packetsReceived"),packetsSent:ce(n,"packetsSent"),fractionLost:ce(n,"fractionLost"),pliCount:ce(n,"pliCount"),firCount:ce(n,"firCount"),nackCount:ce(n,"nackCount"),userId:i[s],freezeCount:ce(n,"freezeCount",0),totalFreezesDuration:ce(n,"totalFreezesDuration",0)},_="mid"in n&&typeof n.mid=="string"?n.mid:void 0,C="rid"in n&&typeof n.rid=="string"?n.rid:void 0;if(_&&(h.mid=_),C&&(h.rid=C),o==="video"){let P=ce(n,"framesDecoded"),B=ce(n,"totalInterFrameDelay"),W=ce(n,"totalSquaredInterFrameDelay"),X=ce(n,"encoderImplementation"),fe=ce(n,"decoderImplementation");X&&(h.encoderImplementation=X),fe&&(h.decoderImplementation=fe),h.interframeDelayVariance=(W-B*B/P)/P}if(o==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=ce(n,"totalEncodeTime")??0),o==="audio"&&(h.totalSamplesReceived=ce(n,"totalSamplesReceived"),h.concealedSamples=ce(n,"concealedSamples"),h.insertedSamplesForDeceleration=ce(n,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=ce(n,"removedSamplesForAcceleration"),h.silentConcealedSamples=ce(n,"silentConcealedSamples"),h.concealmentEvents=ce(n,"concealmentEvents"),h.totalAudioEnergy=ce(n,"totalAudioEnergy")),u&&t[u]){let P=t[u];h.clockRate=P.clockRate,h.mimeType=P.mimeType,o==="audio"&&P.sdpFmtpLine&&(h.sdpFmtpLine=P.sdpFmtpLine)}if(d&&t[d]){let P=t[d];h.frameHeight=P.frameHeight,h.frameWidth=P.frameWidth,h.framesDecoded=P.framesDecoded,h.framesReceived=P.framesReceived,h.framesDropped=P.framesDropped}return Cn(h)}).filter(n=>!!n)}function Po(a,i,e=!1){if(!i||!i.rtps||!a.rtps)return a;let t,r;e&&(t=Ri("ssrc",a?.remoteRtps||[]),r=Ri("ssrc",i?.remoteRtps||[]));let n=Ri("ssrc",a.rtps),s=Ri("ssrc",i.rtps),o=(a.timestamp-i.timestamp)/1e3;return!n||!s||Object.keys(n).forEach(d=>{let p=n[d],u=s[d];if(!(!p||!u)){if(p.bytesReceived&&p.bytesReceived>u.bytesReceived&&(p.bandwidth=Math.round((p.bytesReceived-u.bytesReceived)/o),p.bandwidth+=Math.round((p.headerBytesReceived-u.headerBytesReceived)/o)),p.bytesSent&&p.bytesSent>u.bytesSent&&(p.bandwidth=Math.round((p.bytesSent-u.bytesSent)/o),p.bandwidth+=Math.round((p.headerBytesSent-u.headerBytesSent)/o)),p.packetsReceived)if(p.packetsReceived>u.packetsReceived||p.packetsLost>u.packetsLost){let h=p.packetsLost-u.packetsLost,_=p.packetsReceived-u.packetsReceived;p.packetLoss=parseFloat((100*h/(h+_)).toFixed(2))}else p.packetLoss=0;if(p.freezeCount>u.freezeCount&&(p.freezeCountDelta=p.freezeCount-u.freezeCount),p.totalFreezesDuration>u.totalFreezesDuration){let h=p.totalFreezesDuration-u.totalFreezesDuration;p.totalFreezesDurationDelta=h}if(p.framesDropped&&u.framesDropped&&p.framesDropped>u.framesDropped&&(p.framesDroppedDelta=parseFloat(((p.framesDropped-u.framesDropped)/o).toFixed(0))),e&&p.type==="outbound-rtp"&&p.kind==="video"){let h=t?.[d],_=r?.[d],C=W=>W??0,P=Math.max(0,C(h?.packetsLost)-C(_?.packetsLost)),B=Math.max(1,p.packetsSent-u.packetsSent);a.transport.averageNetStat={currentRoundTripTime:(a.transport.currentRoundTripTime+i.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(P/B*100)}}}}),a}async function yi(a,i,e={},t=!1){let r=await Ro(a),n={timestamp:Date.now(),transport:yo(r),rtps:ya(r,e)};return t&&(n.remoteRtps=ya(r,e,!0)),i?Po(n,i,t):(await v.delay(Eo),yi(a,n,e,t))}function Je(a){performance.clearMarks(a),performance.mark(a)}function Tn(a){performance.clearMarks(a)}function Qt(a){let i=performance.getEntriesByName(a)[0];if(typeof i>"u")return null;let e=Math.round(performance.now()-i.startTime);return performance.clearMarks(a),e}function Xt(a){return`${E.SCREENSHARE_FIRST_FRAME}_${wo(a)}`}function wo(a){return typeof a=="string"?a:JSON.stringify(a)}var Ye=class Ye{constructor(){this._eventualLogs=new Set}static create(){Ye._instance=new Ye}static logCallStat(i){if(Ye._instance?._eventualLogs.size){for(let e of Ye._instance._eventualLogs)Object.assign(e,{call_topology:i.call_topology,local_address:i.local_address,local_connection_type:i.local_connection_type,network_type:i.network_type,remote_address:i.remote_address,remote_connection_type:i.remote_connection_type,transport:i.transport}),T.logClientStats(e);Ye._instance._eventualLogs.clear()}T.logClientStats(i)}static logEventualStat(i){i.value===void 0&&(i.value=Qt(i.name)),i.value!==null&&Ye._instance?._eventualLogs.add(i)}static destroy(){Ye._instance?._destroy(),Ye._instance=null}_destroy(){this._eventualLogs.clear()}};Ye._instance=null;var Me=Ye;var nr=class{constructor(i){this._firstFrameReceived=!1;this._participantId=i}measure(i,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=Xt(this._participantId),r=Qt(t);r!==null&&Me.logEventualStat({name:E.SCREENSHARE_FIRST_FRAME,value:r,width:i,height:e})}};var Mo=65536,Zt=class a{constructor(i,e,t){this._chunks=[];this._participantId=i,this._onStream=e,this._onStat=t,this._statScreenShareFirstFrame=new nr(i)}appendChunk(i){let e=this._chunks.length;if(i.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)%Mo!==i.sequence){c.warn("[FrameBuilder] Got incorrect chunk");return}if(this._chunks.push(i),i.end){let t=this._processFrameData(),{width:r,height:n}=a.getFrameSize(t);this._processFrame({timestamp:i.timestamp,frameData:t,isVP9:i.isVP9,keyframe:i.keyframe,width:r,height:n}),this._statScreenShareFirstFrame.measure(r,n)}}destroy(){Tn(E.SCREENSHARE_FREEZE_DURATION),Tn(Xt(this._participantId)),this._chunks=[]}_processFrameData(){let i=this._chunks;this._chunks=[];let e=i.reduce((n,s)=>n+s.data.byteLength,0),t=new Uint8Array(e),r=0;for(let n of i)t.set(new Uint8Array(n.data),r),r+=n.data.byteLength;return t}static getFrameSize(i){let e={width:0,height:0},t=new Pa.BitStream(i.buffer);t.bigEndian=!0,t.index+=2;let r=t.readBits(1),s=t.readBits(1)<<1|r;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(i){if(i){Je(E.SCREENSHARE_FREEZE_DURATION);return}let e=Qt(E.SCREENSHARE_FREEZE_DURATION);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Dt=class{constructor(i){this._onStream=i}async drawFrame(i){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(i){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var ei=class extends Dt{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 r;e instanceof ImageBitmap?r=e:r=await createImageBitmap(e,0,0,e.width,e.height),this._canvasContext.transferFromImageBitmap(r),r.close()}else{let r=this._canvasContext;r.clearRect(0,0,t.width,t.height),r.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 kt=class extends Dt{constructor(i){super(i),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(i){await this._writer.write(i)}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&&nt.isBrowserSupported()}};var ti=class extends Zt{constructor(e,t,r){super(e,t,r);this._decoderReady=!1;this._decoderBusy=!1;this._decoderQueue=[];c.debug(`StreamBuilder started for participant [${e}]`),kt.isBrowserSupported()?this._renderer=new kt(t):this._renderer=new ei(t),nt.isBrowserSupported()?this._decoder=new nt:this._decoder=new Mt;let n=async o=>{this._decoderBusy=!1,"VideoFrame"in window&&o instanceof VideoFrame?await this._renderer.drawFrame(o):await this._renderer.drawImage(o),this._fpsMeter.increment(),this._decodeQueue()},s=o=>{this._decoderBusy=!1,this._decodeQueue()};this._decoder.init(n,s).then(()=>{this._decoderReady=!0,this._decodeQueue()}),this._fpsMeter=new At(o=>c.log(`[StreamBuilder][${e}] fps: ${o}`),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 ei.isBrowserSupported()||kt.isBrowserSupported()}};function wa(a,i,e,t,r,n,s){let o=0;i&&(o|=1),e&&(o|=2),t&&(o|=4),s||(o|=8);let d=new ArrayBuffer(11),p=new DataView(d);if(p.setUint8(0,1),p.setUint16(1,r),p.setUint32(3,a),p.setUint8(7,n?1:0),p.setUint16(8,0),p.setUint8(10,o),!s)return d;let u=new Uint8Array(d.byteLength+s.byteLength);return u.set(new Uint8Array(d),0),u.set(new Uint8Array(s),d.byteLength),u.buffer}function Ma(a){let i=new DataView(a),e=i.getUint8(0),t=i.getUint16(1),r=i.getUint32(3),n=i.getUint8(7)===1,s=i.getUint16(8),o=i.getUint8(10),d=!!(o&1),p=!!(o&2),u=!!(o&4),h=!!(o&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:r,start:d,end:p,keyframe:u,sequence:t,isVP9:n,ssrc:s,eos:h,data:a.slice(11)}}function Aa(a){if(!a||!a.byteLength||a.byteLength!==4)return!1;let i=new DataView(a);return!(i.getUint8(0)!==1||i.getUint8(1)!==1||i.getUint16(2)!==0)}function Da(a){if(!a||!a.byteLength||a.byteLength!==10)return null;let i=new DataView(a);if(i.getUint8(0)!==1||i.getUint8(1)!==2||i.getUint16(2)!==0)return null;let n=i.getUint16(4),s=i.getUint32(6);return{seq:n,ts2:s}}var k=Jt(require("simple-ebml-builder"));var Ao=2**15-1,Rn=1,Do=5,ko=5;var yn=class a{constructor(i){this._sourceBuffer=null;this._queue=[];this._clearBufferTill=0;this._mediaSource=new MediaSource,this._codec=i;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 i=this._queue;this._queue=[];let e=a._buildQueue(i);this._sourceBuffer.appendBuffer(e)}static _buildQueue(i){if(i.length){if(i.length===1)return k.build(i[0])}else return new Uint8Array;let e=i.reduce((n,s)=>n+s.countSize(),0),t=new Uint8Array(e),r=0;for(let n of i){let s=k.build(n);t.set(s,r),r+=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(i){return this._codec=i,this._sourceBuffer?.changeType(i)}append(i,e=!1){this._queue.push(i),e&&this._handleQueue()}cleanup(){this._mediaSource?.readyState==="open"&&this._sourceBuffer?.abort();let i=this._sourceBuffer?.buffered,e=i?.length;if(!e)return;let t=i.start(0),r=Math.max(0,i.end(e-1)-Do);r-t>ko&&(this._clearBufferTill=r)}destroy(){this._queue=[],this._mediaSource.readyState==="open"&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},xt=class a extends Zt{constructor(e,t,r){super(e,t,r);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,r){let n=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"))]),s=[k.element(k.ID.PixelWidth,k.number(e)),k.element(k.ID.PixelHeight,k.number(t))],o=k.element(k.ID.Tracks,k.element(k.ID.TrackEntry,[k.element(k.ID.TrackNumber,k.number(Rn)),k.element(k.ID.TrackUID,k.number(Rn)),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_${r.toUpperCase()}`)),k.element(k.ID.Video,s)]));return k.unknownSizeElement(k.ID.Segment,[n,o])}static _genClusterHeader(e){return k.unknownSizeElement(k.ID.Cluster,[k.element(k.ID.Timecode,k.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new yn(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 r=this._video.seekable;r.length&&(this._video.currentTime=r.end(r.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 r=e.timestamp;if(r<=this._lastFrameTimestamp&&(r=this._lastFrameTimestamp+10,c.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=r,this._earliestTimestamp)r-=this._earliestTimestamp;else{if(!e.keyframe)return;this._earliestTimestamp=r,r=0}if(e.keyframe){this._clusterStartTime=r,this._mediaBuffer?.cleanup(),c.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let o=a._genWebmHeader();this._mediaBuffer?.append(o);let d=a._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(d)}let n=Math.round(r-this._clusterStartTime);if(n>Ao&&(this._clusterStartTime=r,n=0),n===0){c.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let o=a._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(o)}let s=k.element(k.ID.SimpleBlock,[k.vintEncodedNumber(Rn),k.bytes(a._intToU16BE(n)),k.number((e.keyframe?1:0)<<7),k.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),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 Ot=class{constructor(i,e,t,r,n){this._participantIdRegistry=null;this._streamBuilders={};this._onStream=()=>{};this._onEos=()=>{};c.debug("ScreenCaptureReceiver started"),this._datachannel=i,this._participantIdRegistry=e,this._onStream=t,this._onEos=r,this._onStat=n,this._datachannel.onmessage=s=>this._onDataChannelMessage(s.data)}_onDataChannelMessage(i){let e=Ma(i),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 r=this._streamBuilders[t];if(!r){let n=s=>this._onStream(t,s);l.screenShareWebmBuilder&&xt.isBrowserSupported()?r=new xt(t,n,this._onStat):r=new ti(t,n,this._onStat),this._streamBuilders[t]=r}r.appendChunk(e)}close(i){let e=this._streamBuilders[i];e&&(e.destroy(),delete this._streamBuilders[i])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(i=>i.destroy()),this._streamBuilders={},this._participantIdRegistry=null,c.debug("ScreenCaptureReceiver destroyed")}static isBrowserSupported(){return(nt.isBrowserSupported()||Mt.isBrowserSupported())&&(ti.isBrowserSupported()||xt.isBrowserSupported())}};var Pn=class{constructor(i,e,t){this._next=t,t&&(t.prev=this),this._prev=e,e&&(e.next=this),this._data=i}get prev(){return this._prev}set prev(i){this._prev=i}get next(){return this._next}set next(i){this._next=i}get data(){return this._data}},Pi=class{constructor(){this._head=null;this._tail=null;this._length=0}get length(){return this._length}push(...i){for(let e of i)this._tail=new Pn(e,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(i){this._tail&&(this._tail.next=i._head),this._head||(this._head=i._head),this._tail=i._tail,this._length+=i._length,i.clear()}shift(){if(!this._length||!this._head)return null;let i=this._head;return this._head=i.next,this._head&&(i.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),i.data}bisect(){if(this.length){let i=this.length>1?Math.floor(this.length/2):1;for(let e=0;e<i;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 i=[],e=this._head;for(;e!==null;)i.push(e.data),e=e.next;return i.length?JSON.stringify(i,(t,r)=>r instanceof Error?String(r):r):""}};var wn=Jt(require("@vkontakte/libvpx"));var xo=1e3,ii=class extends ze{constructor(e,t,r,n){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=r,this._maxBitrate=n,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,r)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let n=this._video;n.srcObject=new MediaStream([e]),n.onloadeddata=d=>t(),n.onerror=()=>r(new Error("Video element error"));let s=n.play(),o=()=>r(new Error("Autoplay is disabled"));s?s.catch(o):o()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw new Error("Fatal error");this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw new Error("Destroyed");return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw new Error("Destroyed");let t=e.width,r=e.height;return this._canvas.width=t,this._canvas.height=r,this._canvasCtx.clearRect(0,0,t,r),this._canvasCtx.drawImage(e,0,0,t,r),this._canvasCtx?.getImageData(0,0,t,r)}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);})();
7
+ "use strict";var lo=Object.create;var Ei=Object.defineProperty;var po=Object.getOwnPropertyDescriptor;var uo=Object.getOwnPropertyNames;var ho=Object.getPrototypeOf,mo=Object.prototype.hasOwnProperty;var fo=(a,i,e)=>i in a?Ei(a,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[i]=e;var vn=(a,i)=>()=>(i||a((i={exports:{}}).exports,i),i.exports),go=(a,i)=>{for(var e in i)Ei(a,e,{get:i[e],enumerable:!0})},ma=(a,i,e,t)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of uo(i))!mo.call(a,r)&&r!==e&&Ei(a,r,{get:()=>i[r],enumerable:!(t=po(i,r))||t.enumerable});return a};var Jt=(a,i,e)=>(e=a!=null?lo(ho(a)):{},ma(i||!a||!a.__esModule?Ei(e,"default",{value:a,enumerable:!0}):e,a)),_o=a=>ma(Ei({},"__esModule",{value:!0}),a);var le=(a,i,e)=>fo(a,typeof i!="symbol"?i+"":i,e);var Xa=vn((df,Qa)=>{var di=1e3,li=di*60,pi=li*60,jt=pi*24,Cc=jt*7,Tc=jt*365.25;Qa.exports=function(a,i){i=i||{};var e=typeof a;if(e==="string"&&a.length>0)return Rc(a);if(e==="number"&&isFinite(a))return i.long?Pc(a):yc(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))};function Rc(a){if(a=String(a),!(a.length>100)){var i=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(a);if(i){var e=parseFloat(i[1]),t=(i[2]||"ms").toLowerCase();switch(t){case"years":case"year":case"yrs":case"yr":case"y":return e*Tc;case"weeks":case"week":case"w":return e*Cc;case"days":case"day":case"d":return e*jt;case"hours":case"hour":case"hrs":case"hr":case"h":return e*pi;case"minutes":case"minute":case"mins":case"min":case"m":return e*li;case"seconds":case"second":case"secs":case"sec":case"s":return e*di;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return e;default:return}}}}function yc(a){var i=Math.abs(a);return i>=jt?Math.round(a/jt)+"d":i>=pi?Math.round(a/pi)+"h":i>=li?Math.round(a/li)+"m":i>=di?Math.round(a/di)+"s":a+"ms"}function Pc(a){var i=Math.abs(a);return i>=jt?kr(a,i,jt,"day"):i>=pi?kr(a,i,pi,"hour"):i>=li?kr(a,i,li,"minute"):i>=di?kr(a,i,di,"second"):a+" ms"}function kr(a,i,e,t){var r=i>=e*1.5;return Math.round(a/e)+" "+t+(r?"s":"")}});var es=vn((lf,Za)=>{function wc(a){e.debug=e,e.default=e,e.coerce=d,e.disable=n,e.enable=r,e.enabled=s,e.humanize=Xa(),e.destroy=p,Object.keys(a).forEach(u=>{e[u]=a[u]}),e.names=[],e.skips=[],e.formatters={};function i(u){let h=0;for(let S=0;S<u.length;S++)h=(h<<5)-h+u.charCodeAt(S),h|=0;return e.colors[Math.abs(h)%e.colors.length]}e.selectColor=i;function e(u){let h,S=null,R,M;function F(...W){if(!F.enabled)return;let X=F,fe=Number(new Date),Oe=fe-(h||fe);X.diff=Oe,X.prev=h,X.curr=fe,h=fe,W[0]=e.coerce(W[0]),typeof W[0]!="string"&&W.unshift("%O");let J=0;W[0]=W[0].replace(/%([a-zA-Z%])/g,(be,Rt)=>{if(be==="%%")return"%";J++;let Si=e.formatters[Rt];if(typeof Si=="function"){let Xi=W[J];be=Si.call(X,Xi),W.splice(J,1),J--}return be}),e.formatArgs.call(X,W),(X.log||e.log).apply(X,W)}return F.namespace=u,F.useColors=e.useColors(),F.color=e.selectColor(u),F.extend=t,F.destroy=e.destroy,Object.defineProperty(F,"enabled",{enumerable:!0,configurable:!1,get:()=>S!==null?S:(R!==e.namespaces&&(R=e.namespaces,M=e.enabled(u)),M),set:W=>{S=W}}),typeof e.init=="function"&&e.init(F),F}function t(u,h){let S=e(this.namespace+(typeof h>"u"?":":h)+u);return S.log=this.log,S}function r(u){e.save(u),e.namespaces=u,e.names=[],e.skips=[];let h,S=(typeof u=="string"?u:"").split(/[\s,]+/),R=S.length;for(h=0;h<R;h++)S[h]&&(u=S[h].replace(/\*/g,".*?"),u[0]==="-"?e.skips.push(new RegExp("^"+u.slice(1)+"$")):e.names.push(new RegExp("^"+u+"$")))}function n(){let u=[...e.names.map(o),...e.skips.map(o).map(h=>"-"+h)].join(",");return e.enable(""),u}function s(u){if(u[u.length-1]==="*")return!0;let h,S;for(h=0,S=e.skips.length;h<S;h++)if(e.skips[h].test(u))return!1;for(h=0,S=e.names.length;h<S;h++)if(e.names[h].test(u))return!0;return!1}function o(u){return u.toString().substring(2,u.toString().length-2).replace(/\.\*\?$/,"*")}function d(u){return u instanceof Error?u.stack||u.message:u}function p(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return e.enable(e.load()),e}Za.exports=wc});var ts=vn((We,xr)=>{We.formatArgs=Ac;We.save=Dc;We.load=kc;We.useColors=Mc;We.storage=xc();We.destroy=(()=>{let a=!1;return()=>{a||(a=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();We.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Mc(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function Ac(a){if(a[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+a[0]+(this.useColors?"%c ":" ")+"+"+xr.exports.humanize(this.diff),!this.useColors)return;let i="color: "+this.color;a.splice(1,0,i,"color: inherit");let e=0,t=0;a[0].replace(/%[a-zA-Z%]/g,r=>{r!=="%%"&&(e++,r==="%c"&&(t=e))}),a.splice(t,0,i)}We.log=console.debug||console.log||(()=>{});function Dc(a){try{a?We.storage.setItem("debug",a):We.storage.removeItem("debug")}catch{}}function kc(){let a;try{a=We.storage.getItem("debug")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=void 0),a}function xc(){try{return localStorage}catch{}}xr.exports=es()(We);var{formatters:Oc}=xr.exports;Oc.j=function(a){try{return JSON.stringify(a)}catch(i){return"[UnexpectedJSONParseError]: "+i.message}}});var tp={};go(tp,{Api:()=>_i,ApiExternal:()=>mn,ArrayDequeue:()=>hn,AuthData:()=>Te,BaseLogger:()=>wt,CallDirection:()=>Le,CallType:()=>dt,ChatRoomEventType:()=>Qr,ConversationFeature:()=>Xr,ConversationOption:()=>Gt,DebugMessageType:()=>qn,ExternalIdType:()=>Zr,FacingMode:()=>vt,FatalError:()=>ne,HangupReason:()=>G,HangupType:()=>D,MediaOption:()=>oe,MediaTrackKind:()=>He,MediaType:()=>oi,MuteState:()=>Ge,ParticipantState:()=>Q,ParticipantStateDataValue:()=>ta,ParticipantStatus:()=>lr,RecordRole:()=>Ys,RoomsEventType:()=>hi,Signaling:()=>Wt,SignalingCommandType:()=>O,SignalingConnectionType:()=>ot,SignalingNotification:()=>L,TransportTopology:()=>tt,UserRole:()=>mt,UserType:()=>re,VolumeDetector:()=>bt,acceptCall:()=>Od,acceptPromotion:()=>jl,activateRooms:()=>Rl,addMovie:()=>El,addParticipant:()=>Fd,addParticipantInternal:()=>Vd,authorize:()=>xd,browser:()=>Td,callInternal:()=>Qs,callTo:()=>Dd,captureScreen:()=>Gd,captureVmoji:()=>Hd,changeAudioEffect:()=>xl,changeConversationOptions:()=>al,changeDevice:()=>Wd,changeParticipantState:()=>Yd,changePriorities:()=>Jd,changeVideoEffect:()=>kl,chatHistory:()=>ol,chatMessage:()=>sl,chatMessageInternal:()=>no,createJoinLink:()=>pl,customData:()=>cl,customDataInternal:()=>ao,debug:()=>Ml,debugMessage:()=>Al,declineCall:()=>Nd,enableFeatureForRoles:()=>$l,enableVideoSuspend:()=>rl,enableVideoSuspendSuggest:()=>nl,feedback:()=>Hl,forceRelayPolicy:()=>fl,getAnonymTokenByLink:()=>hl,getAudienceModeHands:()=>Bl,getParticipantListChunk:()=>Wl,getParticipants:()=>Gl,getStreamInfo:()=>Il,getWaitingHall:()=>Ul,grantRoles:()=>Zd,grantRolesInternal:()=>to,hangup:()=>Bd,init:()=>Ad,joinCall:()=>Ld,joinCallByLink:()=>Ud,joinCallInternal:()=>Zs,logClientEvent:()=>Kl,muteParticipant:()=>el,muteParticipantInternal:()=>io,pinParticipant:()=>tl,pinParticipantInternal:()=>ro,processPush:()=>kd,processPushInternal:()=>Xs,promoteParticipant:()=>Fl,publishStream:()=>Sl,putHandsDown:()=>Qd,recordSetConf:()=>vl,removeHistoryRecords:()=>zl,removeJoinLink:()=>ul,removeMovie:()=>Cl,removeParticipant:()=>jd,removeParticipantInternal:()=>eo,removeRooms:()=>Pl,requestAsr:()=>Ql,requestPromotion:()=>Vl,setAudioEffects:()=>wd,setAudioStream:()=>Ol,setLocalResolution:()=>zd,setLogger:()=>yd,setMediaModifiers:()=>il,setStatisticsInterval:()=>wl,setVideoEffects:()=>Pd,setVideoStream:()=>qd,setVmoji:()=>Md,setVmojiFill:()=>Ll,setVmojiSvg:()=>Nl,setVolume:()=>ml,startAsr:()=>Jl,startAudienceConversation:()=>ll,startConversation:()=>dl,startStream:()=>gl,startUrlSharing:()=>Xl,stopAsr:()=>Yl,stopStream:()=>_l,stopUrlSharing:()=>Zl,switchRoom:()=>yl,toggleLocalAudio:()=>$d,toggleLocalVideo:()=>Kd,updateDisplayLayout:()=>Xd,updateMovie:()=>bl,updateRooms:()=>Tl,uploadDebugLogs:()=>Dl,userFeedbackStats:()=>ql,utils:()=>Rd,version:()=>ep});module.exports=_o(tp);var ia=Jt(require("webrtc-adapter"));var wt=class{log(i,e,t=!1){}destroy(){}};var ae=class{constructor(){this._handlers={};this._listeners=[]}_triggerEvent(i,...e){if(this._handlers.hasOwnProperty(i))for(let t of this._handlers[i])t.apply(this,e)}addEventListener(i,e){if(typeof e!="function")throw new Error("Listener should be a function");return this._handlers.hasOwnProperty(i)||(this._handlers[i]=[]),this._handlers[i].push(e),{dispose:this.removeEventListener.bind(this,i,e)}}removeEventListener(i,e){if(!this._handlers.hasOwnProperty(i))return;e||delete this._handlers[i];let t=this._handlers[i].indexOf(e);t>=0&&this._handlers[i].splice(t,1)}subscribe(i,e,t){let r=i.addEventListener(e,t);this._listeners.push(r)}unsubscribe(){this._listeners.forEach(i=>{i.dispose()})}};var bi=class extends ae{get ready(){return!0}setParticipantIdRegistry(i){}requestRealloc(){}setEndpoint(i){}setWebTransportEndpoint(i){}setConversationId(i){}readyToSend(i=!0){}cleanup(){}requestTestMode(i,e){}getNextCommandSequenceNumber(){return 0}};var fa=(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))(fa||{}),D=fa;var G=class a extends Error{constructor(i,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(i)>-1?this.hangup=i:this.error=i;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=i+(t.length?` (${t.join(", ")})`:""),Error.captureStackTrace&&Error.captureStackTrace(this,a)}};var C=class a extends wt{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,r=!1){let n={};typeof t<"u"&&(n.param=t),this._logInternal(e,n,r),this._externalLogger&&this._externalLogger.log(e,t,r)}logCustom(e,t,r=!1){this._logInternal(e,t,r)}logClientStats(e,t=!1){let r=Object.assign(e,{vcid:U.id(),timestamp:this._now()});Object.keys(r).forEach(n=>{r[n]===void 0&&delete r[n]}),this._batchedClientStats.push(r),(t||!this._batchTimeout)&&this._sendBatch()}logClientEvent(e,t=!1){let r=Object.assign(e,{vcid:U.id(),timestamp:this._now()});this._batchedClientEvents.push(r),(t||!this._batchTimeout)&&this._sendBatch()}_logInternal(e,t,r){let n={type:1,time:0,operation:e,timestamp:this._now(),custom:Object.assign(t,{vcid:U.id()}),uid:this._api.getUserId()};this._batchedLogItems.push(n),(r||!this._batchTimeout)&&this._sendBatch()}destroy(){this._sendBatch(),this._stopTimeout(),this._externalLogger&&this._externalLogger.destroy()}static create(e,t){a._instance||(a._instance=new a(e,t))}static log(e,t,r=!1){a._instance&&a._instance.log(e,t,r)}static logCustom(e,t,r=!1){a._instance&&a._instance.logCustom(e,t,r)}static logClientStats(e,t=!1){a._instance&&a._instance.logClientStats(e,t)}static logClientEvent(e,t=!1){a._instance&&a._instance.logClientEvent(e,t)}static destroy(){a._instance&&a._instance.destroy(),a._instance=null}};var N=require("messagepack");var ga=(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))(ga||{}),O=ga;var _a=(W=>(W.MIC_CAMERA_PERMISSION="mic_camera",W.CAMERA_PERMISSION="camera",W.MIC_PERMISSION="mic",W.CAMERA_ACCESS="cameralock",W.MIC_ACCESS="miclock",W.MIC_NOT_FOUND="nomic",W.SCREEN_PERMISSION="screenpermission",W.SCREEN_ACCESS="screenlock",W.CONNECTION="connection",W.NETWORK="network",W.UNKNOWN="unknown",W.UNSUPPORTED="unsupported",W.SIGNALING_FAILED="signalingfailed",W.API="api",W.AUTH="auth",W.OVERCONSTRAINED="overconstrained",W))(_a||{}),ne=_a;var Sa=(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))(Sa||{}),oe=Sa;var va=(q=>(q.ERROR="callError",q.DEVICES="callDevices",q.CALL_SPEC_ERROR="callSpecError",q.ICE_CONNECTION_STATE="callIceConnectionState",q.ICE_CONNECTION_TYPE="callIceConnectionType",q.ICE_RESTART="callIceRestart",q.PUSH="callPush",q.OUTGOING_CALL="callStart",q.CALL_FINISH="call_finish",q.OUTGOING_MULTIPARTY_CALL="callStartMultiparty",q.JOIN_CONVERSATION="callJoinConversation",q.ACCEPTED_OUTGOING="callAcceptedOutgoing",q.ACCEPT_INCOMING="callAcceptIncoming",q.DECLINE_INCOMING="callDeclineIncoming",q.ACCEPT_CONCURRENT="callAcceptConcurrent",q.HANGUP="callHangup",q.CODEC_USAGE="codec_usage",q.MEDIA_STATUS="callMediaStatus",q.DEVICE_CHANGED="callDeviceChanged",q.SOCKET_ACTION="callSocketAction",q.ADD_PARTICIPANT="callAddParticipant",q.REMOVE_PARTICIPANT="callRemoveParticipant",q.POOR_CONNECTION="callPoorConnection",q.TOPOLOGY_CHANGE_REQUESTED="callTopologyChangeRequested",q.RELAY_POLICY="callForceRelay",q.PAT_ALLOCATED="patAllocate",q.PAT_DEALLOCATED="patDeallocate",q.PAT_ERROR="patError",q.PAT_WAITING_TIME_ERROR="patWaitingTimeError",q.PAT_OUTDATED_RESPONSE="patOutdatedResponse",q.SIGNALING_CONNECTED="signaling_connected",q.RECONNECT="callReconnect",q.SCREENSHARE_FIRST_FRAME="screen_share_first_frame",q.SCREENSHARE_FREEZE_DURATION="callScreenshareFreezeDuration",q.FIRST_MEDIA_RECEIVED="first_media_received",q.CALL_EVENTUAL_STAT="callEventualStat",q.CALL_DECLINED_OR_HANGED_LOCALLY="CallDeclinedOrHangedLocally",q.USER_FEEDBACK_RECEIVED="UserFeedbackReceived",q.CALL_START="call_start",q.WEBTRANSPORT_CONNECTED="webtransport_connected",q))(va||{}),E=va;var In=Jt(require("@vkontakte/libvpx"));var ze=class{constructor(){this._worker=null}async _createWorker(i,e,t=[],r={},n=[]){return new Promise((s,o)=>{let d=t.join(","),p=new Blob([i,`exports.default(${d});`],{type:"application/javascript; charset=utf-8"}),u=window.URL.createObjectURL(p);this._worker=new Worker(u),this._worker.onmessage=h=>{switch(h.data.type){case"ready":s();break;case"error":o(h.data.error);break;case"frame":e(h.data);break;case"debug":c.debug(h.data.message);break;case"log_error":C.log(E.ERROR,h.data.message);break}},this._sendToWorker("init",r,n)})}_removeWorker(){this._worker?.terminate(),this._worker=null}_sendToWorker(i,e={},t=[]){this._worker?.postMessage(Object.assign({type:i},e),t)}static isBrowserSupported(){throw new Error("Not implemented")}};var Mt=class extends ze{async init(i,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 r=new ImageData(new Uint8ClampedArray(t.data),t.width,t.height);i(r)}},[In.default,In.default.getUrl])}decodeFrame(i,e,t,r){this._sendToWorker("frame",{timestamp:i,data:e.buffer,isVP9:t,keyFrame:r,debug:c.enabled()},[e.buffer])}destroy(){this._removeWorker(),c.debug("LibVPxDecoder destroyed")}static isBrowserSupported(){return"WebAssembly"in window&&"Worker"in window}};var nt=class extends ze{async init(i,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)):(i(t.data),t.data.close())},[y.baseChromeVersion()>=92||y.browserName()==="Safari"])}decodeFrame(i,e,t,r=!1){this._sendToWorker("frame",{timestamp:i,data:e.buffer,isVP9:t,keyFrame:r},[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 At=class{constructor(i=null,e=0){this._counter=0;this._interval=0;this._lastCalculationTime=Date.now();this._onCalculated=null;this._onCalculated=i,e&&(this._interval=window.setInterval(()=>this.calculate(),e))}increment(i=1){this._counter+=i}calculate(){let i=Date.now(),e=i-this._lastCalculationTime,t=Math.round(this._counter*1e3/e);return this._counter=0,this._lastCalculationTime=i,this._onCalculated?.(t),t}destroy(){window.clearInterval(this._interval),this._interval=0}};var Pa=require("bit-buffer");var Ia=(e=>(e.USER="USER",e.GROUP="GROUP",e))(Ia||{}),re=Ia;var _t={HEIGHT:720,WIDTH:1280,BITRATE:1e6},Ci="L1T2",ba=[{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}],So={h:1,m:2,l:4};function Ca(a,i){return!a||!i?a===i:a.streams.length===i.streams.length?a.streams.every((e,t)=>v.isObjectsEquals(e,i.streams[t])):!1}function Ea(a,i){for(let e of i)if(a<=e.dimension)return e.bitrate;return length>0?i[length-1].bitrate:ba[0].bitrate}function Ti(a=_t.WIDTH,i=_t.HEIGHT,e=ba){let t=["h","m","l"],r=Math.max(a,i),n=1;r>=960?n=3:r>=480&&(n=2);let s={streams:[]},o=30,d=Ea(r,e)??_t.BITRATE;for(let p=0;p<n;p++){let u=t[p];s.streams.push({rid:u,width:a,height:i,fps:o,bitrate:d}),a=Math.round(a/2),i=Math.round(i/2),d=Ea(Math.max(a,i),e)??Math.round(d/2)}return s}function tr(a){return So[a]??1}var Ta=typeof Object.fromEntries=="function"?Object.fromEntries:function(a){if(!a||!a[Symbol.iterator])throw new Error("Object.fromEntries() requires a single iterable argument");let i={};for(let[e,t]of a)i[e]=t;return i};async function Ra(a){return new Promise((i,e)=>{let t=new FileReader;t.onload=r=>{i(r.target?.result)},t.onerror=e,t.readAsArrayBuffer(a)})}var Yt=":",rr="d",vo=533,ir="a=fmtp:",Io="sps-pps-idr-in-keyframe=1",En;($e=>{let a=/[\r\n]+/,i=`\r
8
+ `;function e(m,b){let T=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),P,g=[];for(P=0;P<m.length;++P){let A=m[P].match(T);A&&A.length===3&&A[2]===b&&g.push(A[1])}return g}function t(m,b,T){let P=m.split(" "),g=P.slice(0,3),A;for(A=3;A<P.length;A++)T.includes(P[A])&&g.push(P[A]);for(A=3;A<P.length;A++)!T.includes(P[A])&&!b.includes(P[A])&&g.push(P[A]);return g.join(" ")}function r(m,b,T,P){let g,A="m="+b;for(g=0;g<m.length;++g)m[g].startsWith(A)&&(m[g]=t(m[g],T,P))}function n(m,b){let T=new RegExp(ir+"(\\d+)");for(let P=0;P<m.length;++P){let g=m[P].match(T);if(g&&g.length===2&&b.includes(g[1])){let A=m[P].trim()===ir+g[1]?" ":";";m[P]+=A+Io}}}function s(m,b){let T=e(m,b);if(!T.length)return;let P=T.slice(0),g=new RegExp(ir+"(\\d+) apt=(\\d+)"),A;for(A=0;A<m.length;++A){let B=m[A].match(g);B&&B.length===3&&P.includes(B[2])&&P.push(B[1])}let H=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*");for(A=m.length;A--;){let B=m[A].match(H);B&&B.length===3&&P.includes(B[2])&&m.splice(A,1)}r(m,"video",P,[])}function o(m,b,T,P){let g=new RegExp("a=rtpmap:(\\d+) ([a-zA-Z0-9-]+)\\/\\d+"),A,H=[];for(A=b;A<T;++A){let Z=m[A].match(g);Z&&Z.length===3&&Z[2]===P&&H.push(Z[1])}if(!H.length)return H;let B=new RegExp(ir+"(\\d+) apt=(\\d+)");for(A=b;A<T;++A){let Z=m[A].match(B);Z&&Z.length===3&&H.includes(Z[2])&&H.push(Z[1])}return H}function d(m,b,T,P){let g=o(m,b,T,P);if(!g.length)return T+1;let A=new RegExp("a=(rtpmap|rtcp-fb|fmtp):(\\d+) .*"),H=0,B=T;for(;B>=b;){let Z=m[B].match(A);Z&&Z.length===3&&g.includes(Z[2])&&(m.splice(B,1),H++),B--}return m[b]=t(m[b],g,[]),T-H+1}function p(m,b,T,P){let g=-1,A=-1,H=!1;for(let B=0;B<m.length;++B)if(g>=0&&m[B].startsWith("m=")&&(A=B-1,H&&(B=d(m,g,A,b)),g=-1,A=-1,H=!1),m[B].startsWith("m=video")&&(g=B),g>=0){let Z=T==="remote"&&P==="encoder"||T==="local"&&P==="decoder"?"recvonly":"sendonly";(m[B].startsWith(`a=${Z}`)||m[B].startsWith("a=sendrecv"))&&(H=!0)}A=m.length-1,g>=0&&H&&d(m,g,A,b)}function u(m,b,T){let P=e(m,"H264");b&&r(m,"video",[],P),T&&n(m,P)}function h(m){let b=e(m,"VP9");r(m,"video",[],b)}function S(m,b,T,P,g,A=!1,H=!1){if(!b&&!T&&!P&&!H&&!A&&!g)return m;function B(x){let Ie=["a=rtcp-fb:111 nack","a=rtcp-fb:111 nack pli"],ge="a=rtcp-fb:111",Ee=x.findIndex(de=>de.startsWith(ge));return~Ee&&(x[Ee]=x[Ee]+i+Ie.join(i)),x}function Z(x){let Ie=e(x,"red");Ie.length>0&&r(x,"audio",[],Ie)}let Se=m.split(a);return T?p(Se,"H264","local","decoder"):(b||g)&&u(Se,b,g),P&&h(Se),H&&Z(Se),A&&B(Se),Se.join(i)}$e.patchLocalSDP=S;function R(m,b,T,P,g,A,H){b&&(m=m.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=m.split(a);return P?s(B,"H264"):T&&u(B,T,!1),A&&H?s(B,"VP9"):A?p(B,"VP9","remote","encoder"):H?p(B,"VP9","remote","decoder"):g&&h(B),B.join(i)}$e.patchRemoteSDP=R;function M(m){return m?`${m.type||"WEB_SOCKET"}_${m.id}`:"_"}$e.getPeerIdString=M;function F(m,b){return m&&m.id===b.id&&(m.type||"WEB_SOCKET")===(b.type||"WEB_SOCKET")}$e.comparePeerId=F;async function W(m){let b={local:null,remote:null};if(!m||!m.getStats)return b;try{let T=await m.getStats(null),P=null;if(T.forEach(g=>{g.type==="transport"&&g.selectedCandidatePairId?P=T.get(g.selectedCandidatePairId):g.type==="candidate-pair"&&g.state==="succeeded"&&!P&&(!g.hasOwnProperty("selected")||g.selected)&&(P=g)}),P?.localCandidateId){let g=T.get(P.localCandidateId);g&&(b.local={type:g.candidateType,ip:g.ip||g.ipAddress,port:g.port||g.portNumber})}if(P?.remoteCandidateId){let g=T.get(P.remoteCandidateId);g&&(b.remote={type:g.candidateType,ip:g.ip||g.ipAddress,port:g.port||g.portNumber})}return b}catch{return b}}$e.getPeerConnectionHostInfo=W;let X=/^[0-9]+$/,fe=/^([gu])([0-9]+)$/;function Oe(m,b=re.USER){let T=String(m);return fe.test(T)?(c.warn(`Already composite id [${m}] type supplied [${b}]`),T):b===re.GROUP?"g"+T:b===re.USER?"u"+T:(c.warn(`Unknown type [${b}] for id [${m}]`),T.match(X)?"u"+T:T)}$e.composeUserId=Oe;function J(m,b,T=0){let P=Oe(m,b);return Ae(P,T)}$e.composeParticipantId=J;function Ae(m,b){return b?m+Yt+rr+b:m}$e.compose=Ae;function be(m){return J(m.id,m.idType||re.USER,m.deviceIdx)}$e.composeId=be;function Rt(m){if(m.decorativeUserId)return J(m.decorativeUserId,m.idType||re.USER,m.deviceIdx)}$e.composeDecorativeId=Rt;function Si(m){return m.participant?be(m.participant):J(m.participantId,m.participantType||re.USER,m.deviceIdx)}$e.composeMessageId=Si;function Xi(m){return typeof m=="string"?te(vi(m).compositeUserId).id:m}$e.extractOkId=Xi;function te(m){let b=String(m),T=b.match(fe);return T?{id:Number(T[2]),type:T[1]==="g"?re.GROUP:re.USER}:(c.warn(`Unsupported compositeId [${m}]`),{id:Number(b),type:re.USER})}$e.decomposeId=te;function vi(m){let b=m.split(Yt+rr);return{compositeUserId:b[0],deviceIdx:b.length>1?parseInt(b[1],10):0}}$e.decomposeParticipantId=vi;function ra(){let m=window.crypto?.randomUUID?.();if(m)return m;let b="0123456789abcdefghijklmnopqrstuvwxyz".split(""),T=new Array(36),P=0,g,A;for(A=0;A<36;A++)A===8||A===13||A===18||A===23?T[A]="-":A===14?T[A]="4":(P<=2&&(P=33554432+Math.random()*16777216|0),g=P&15,P=P>>4,T[A]=b[A===19?g&3|8:g]);return T.join("")}$e.uuid=ra;function na(m,b){let T;function P(...g){let A=this;T&&window.clearTimeout(T),T=window.setTimeout(()=>{m.apply(A,g)},b)}return P}$e.debounce=na;function aa(m){if(!window.BigInt)return null;let b="",T=m.split(`
9
+ `);for(let A of T)if(A.startsWith("a=fingerprint")){let H=A.split(" ");if(H.length===2){b=H[1];break}}if(!b)return BigInt(-1);let P=b.split(":"),g=BigInt(0);for(let A=Math.min(7,P.length-1);A>=0;A--){let H=BigInt(parseInt(P[A],16));g<<=BigInt(8),g|=H}return BigInt.asIntN(64,g)}$e.sdpFingerprint=aa;async function sa(m){return new Promise(b=>window.setTimeout(b,m))}$e.delay=sa;function oa(m,b,T){let P=[];return m.getSenders().forEach(g=>Zi(b,g,g.track,T,P)),P}$e.applySettings=oa;function Zi(m,b,T,P,g){if(!RTCRtpSender.prototype.getParameters||!RTCRtpSender.prototype.setParameters||!m||!T||T.kind!=="video")return;let A=T.getSettings();if(!A)return;let H=m.maxBitrateK?m.maxBitrateK*1024:null,B=A.width,Z=A.height,Se=B&&Z&&m.maxDimension?Math.max(1,Math.max(B,Z)/m.maxDimension):null,x=m.maxFramerate||null;if(B&&Z&&m.maxDimension&&m.maxDimension>Math.max(B,Z)){let de=Math.round(B*Z/256),Ue=(Math.round(de*vo/1e4)+1)*1e4;H=H===null?Ue:Math.min(Ue,H)}let Ie=m.degradationPreference||"balanced",ge=P[T.id];if(ge&&ge.bitrate===H&&ge.scaleResolutionDownBy===Se&&ge.maxFramerate===x&&ge.degradationPreference===Ie){g[T.id]=ge;return}g[T.id]={bitrate:H,scaleResolutionDownBy:Se,maxFramerate:x,degradationPreference:Ie};let Ee=b.getParameters();if(Ee.encodings||(Ee.encodings=[{}]),Ee.encodings.length>1&&B&&Z&&m.maxDimension){let de=Math.round(m.maxDimension*1.35),Ue=Math.max(B,Z),yt=Ti(B,Z,m?.bitrates?.generic),zt=yt.streams.length;c.log(`applyVideoTrackSettings: maxDim=${m.maxDimension} targetDim=${de} track=${B}x${Z} sim=${JSON.stringify(yt)}`),Ee.encodings.forEach((rt,Ii)=>{rt.scaleResolutionDownBy=tr(rt.rid);let ua=Math.round(Ue/rt.scaleResolutionDownBy);Ii<zt-1?rt.active=ua<de:Ii>=zt?rt.active=!1:rt.active=!0,Ii<zt?rt.maxBitrate=yt.streams[Ii].bitrate:rt.maxBitrate=0,rt.scalabilityMode=Ci})}else Ee.encodings.forEach(de=>{m?.scalabilityMode&&(de.scalabilityMode=m.scalabilityMode),H?de.maxBitrate=H:delete de.maxBitrate,Se?de.scaleResolutionDownBy=Se:delete de.scaleResolutionDownBy,x?de.maxFramerate=x:delete de.maxFramerate});if(Ee.degradationPreference=Ie,Ee.encodings.length>0){b.setParameters?.(Ee).catch(Ue=>{c.error("Failed to set sender parameters",Ee,Ue)});let de=b.getParameters();c.log(`applyVideoTrackSettings: actual encodings= ${JSON.stringify(de.encodings)}`)}}$e.applyVideoTrackSettings=Zi;function fn(m,b){Array.isArray(b)||(b=[b]);for(let T of b)if(m.includes(T))return!0;return!1}$e.includesOneOf=fn;function ca(m){return Object.entries(m.participantState?.state||{}).reduce((b,[T,P])=>(m.participantState&&(b[T]={ts:m.participantState.stateUpdateTs[T],state:P}),b),{})}$e.mapParticipantState=ca;function da(m){let b=m.map(T=>({uid:T.externalId,mediaSettings:T.mediaSettings,status:T.status,muteStates:T.muteStates,unmuteOptions:T.unmuteOptions,participantState:T.participantState,markers:T.markers,movieShareInfos:T.movieShareInfos}));return l.filterObservers?b.filter(T=>!T.uid.observer):b}$e.mapSharedParticipants=da;function la(m,b){let T=Object.keys(m),P=Object.keys(b);if(T.length!==P.length)return!1;for(let g of T)if(!P.hasOwnProperty(g)||m[g].state!==b[g].state||m[g].ts!==b[g].ts)return!1;return!0}$e.isEqualParticipantState=la;function gn(m,b,T=!1){let P=Object.keys(m),g=Object.keys(b);if(P.length!==g.length)return!1;for(let A of P){if(!b.hasOwnProperty(A))return!1;let H=m[A],B=b[A];if(T&&me(H)&&me(B))return gn(H,B,T);if(H!==B)return!1}return!0}$e.isObjectsEquals=gn;function pa(m,b){if(m.length!==b.length)return!1;for(let T of m)if(b.indexOf(T)<0)return!1;return!0}$e.isArraysEquals=pa;function q(m){return!Object.keys(m).length}$e.isEmptyObject=q;function he(m,b){if(!m&&!b)return 0;if(!m||!b)return m?-1:1;return P(b.rank,m.rank)||P(m.ts,b.ts)||T(m,b);function T(g,A){let H={[re.USER]:0,[re.GROUP]:1},{compositeUserId:B,deviceIdx:Z}=vi(g.id),{compositeUserId:Se,deviceIdx:x}=vi(A.id),{id:Ie,type:ge}=te(B),{id:Ee,type:de}=te(Se);return P(H[ge],H[de])||P(Ie,Ee)||P(Z,x)}function P(g,A){return g<A?-1:g===A?0:1}}$e.participantMarkerCompare=he;function V(m,b){let T=Object.entries(m).filter(([,P])=>Array.isArray(b)?!b.includes(P):P!==b);return Ta(T)}$e.objectFilterOutValues=V;function ie(m,b,T){let P=T;for(let g in m)m.hasOwnProperty(g)&&(P=b(P,m[g],g));return P}$e.objectReduce=ie,$e.setImmediate=(()=>{let m=1,b={},T=null;return typeof MessageChannel<"u"&&(T=new MessageChannel,T.port1.onmessage=P=>{let g=P.data;b[g]&&(b[g](),delete b[g])}),function(P){if(T&&document.visibilityState==="hidden"){let A=m;return m=m>=Number.MAX_SAFE_INTEGER?1:m+1,b[A]=P,T.port2.postMessage(A),()=>{b[A]&&delete b[A]}}let g=setTimeout(P,0);return()=>clearTimeout(g)}})();function me(m){return m!==null&&typeof m=="object"&&!Array.isArray(m)}$e.isObject=me;function pt(m,b,T,P){function g(B,Z){let Se=0,x=B.length,Ie=!1;for(let ge=0;ge<B.length;ge++)if(B[ge].startsWith("m=video")&&(Se=ge),B[ge].startsWith("a=mid:"+Z)&&(Ie=!0),Ie&&B[ge].startsWith("m=")){x=ge;break}return{start:Se,end:x}}function A(B,Z,Se,x,Ie,ge,Ee){let de="a=rid:"+x+" send";for(let Ue=Z;Ue<Se;Ue++)if(B[Ue]===de){let zt=de+" max-width="+ge+";max-height="+Ee+";max-br="+Ie;B[Ue]=zt}}let H=b?.sender;if(H&&H.track&&b.mid){let B=m.split(a),{start:Z,end:Se}=g(B,b.mid),x=H.getParameters();if(x.encodings)return x.encodings.forEach(Ie=>{let ge=Ie.rid,Ee=Ie.maxBitrate,de=Ie.scaleResolutionDownBy;if(T&&P&&de){let Ue=""+Math.round(T/de),yt=""+Math.round(P/de);A(B,Z,Se,ge,Ee,Ue,yt)}}),B.join(i)}return m}$e.patchSimulcastAnswerSdp=pt})(En||(En={}));var v=En;var Eo=1e3;function ce(a,i,e=0){return i in a&&a[i]?a[i]:e}function bn(...a){return i=>{for(let e of a)if(e(i))return!0;return!1}}function St(a,i){return e=>e[a]===i}function bo(a){return(i,e)=>e[a]-i[a]}function Ri(a,i){return i.reduce((e,t)=>(e[t[a]]=t,e),{})}function Co(a){let i={},e=[];for(let t of a)i[t.id]||(i[t.id]=!0,e.push(t));return e}function Cn(a){return Object.keys(a).filter(i=>a[i]!==void 0).map(i=>[i,a[i]]).reduce((i,e)=>(i[e[0]]=v.isObject(e[1])?Cn(e[1]):e[1],i),{})}function To(a){let i=[];for(let e of a)e.forEach(t=>i.push(t));return i}async function Ro(a){let i=[];return RTCRtpReceiver.prototype.getStats?(i.push(...a.getReceivers().map(e=>e.getStats())),i.push(...a.getSenders().map(e=>e.getStats()))):i.push(a.getStats()),Promise.all(i).then(To).then(Co)}function yo(a){let i=a.filter(St("type","candidate-pair")).sort(bo("priority")).find(bn(St("nominated",!0),St("selected",!0)));if(!i)return{timestamp:0,availableOutgoingBitrate:0,totalRoundTripTime:0,currentRoundTripTime:0,bytesSent:0,bytesReceived:0};let e={timestamp:i.timestamp,availableOutgoingBitrate:i.availableOutgoingBitrate||0,totalRoundTripTime:i.totalRoundTripTime||0,currentRoundTripTime:i.currentRoundTripTime||0,bytesSent:i.bytesSent||0,bytesReceived:i.bytesReceived||0},t=a.find(St("id",i.remoteCandidateId));t&&Object.assign(e,{remote:{type:t.candidateType,address:t.ip||t.address,port:t.port,protocol:t.protocol}});let r=a.find(St("id",i.localCandidateId));return r&&Object.assign(e,{local:{type:r.candidateType,address:r.ip||r.address,port:r.port,protocol:r.protocol,relayProtocol:r.relayProtocol,networkType:r.networkType}}),Cn(e)}function ya(a,i,e=!1){let t=Ri("id",a),r=e?a.filter(bn(St("type","remote-inbound-rtp"))):a.filter(bn(St("type","inbound-rtp"),St("type","outbound-rtp")));return y.browserName()==="Firefox"&&(r=Object.values(r.reduce((n,s)=>{if(!n[s.ssrc])n[s.ssrc]=s;else{let o=Object.assign({},n[s.ssrc],s),d=n[s.ssrc].isRemote?s:n[s.ssrc];o.id=d.id,o.type=d.type,delete o.isRemote,delete o.remoteId,n[o.ssrc]=o}return n},{}))),r.map(n=>{let s=Number(n.ssrc),o=n.mediaType||n.kind,d=n.remoteId||n.trackId,p=n.type,u=n.codecId;if(!p||!s||!o)return null;let h={ssrc:s,type:p,kind:o,bytesReceived:ce(n,"bytesReceived"),bytesSent:ce(n,"bytesSent"),headerBytesReceived:ce(n,"headerBytesReceived"),headerBytesSent:ce(n,"headerBytesSent"),jitter:ce(n,"jitter"),packetsLost:ce(n,"packetsLost"),packetsReceived:ce(n,"packetsReceived"),packetsSent:ce(n,"packetsSent"),fractionLost:ce(n,"fractionLost"),pliCount:ce(n,"pliCount"),firCount:ce(n,"firCount"),nackCount:ce(n,"nackCount"),userId:i[s],freezeCount:ce(n,"freezeCount",0),totalFreezesDuration:ce(n,"totalFreezesDuration",0)},S="mid"in n&&typeof n.mid=="string"?n.mid:void 0,R="rid"in n&&typeof n.rid=="string"?n.rid:void 0;if(S&&(h.mid=S),R&&(h.rid=R),o==="video"){let M=ce(n,"framesDecoded"),F=ce(n,"totalInterFrameDelay"),W=ce(n,"totalSquaredInterFrameDelay"),X=ce(n,"encoderImplementation"),fe=ce(n,"decoderImplementation");X&&(h.encoderImplementation=X),fe&&(h.decoderImplementation=fe),h.interframeDelayVariance=(W-F*F/M)/M}if(o==="video"&&h.type==="outbound-rtp"&&(h.totalEncodeTime=ce(n,"totalEncodeTime")??0),o==="audio"&&(h.totalSamplesReceived=ce(n,"totalSamplesReceived"),h.concealedSamples=ce(n,"concealedSamples"),h.insertedSamplesForDeceleration=ce(n,"insertedSamplesForDeceleration"),h.removedSamplesForAcceleration=ce(n,"removedSamplesForAcceleration"),h.silentConcealedSamples=ce(n,"silentConcealedSamples"),h.concealmentEvents=ce(n,"concealmentEvents"),h.totalAudioEnergy=ce(n,"totalAudioEnergy")),u&&t[u]){let M=t[u];h.clockRate=M.clockRate,h.mimeType=M.mimeType,o==="audio"&&M.sdpFmtpLine&&(h.sdpFmtpLine=M.sdpFmtpLine)}if(d&&t[d]){let M=t[d];h.frameHeight=M.frameHeight,h.frameWidth=M.frameWidth,h.framesDecoded=M.framesDecoded,h.framesReceived=M.framesReceived,h.framesDropped=M.framesDropped}return Cn(h)}).filter(n=>!!n)}function Po(a,i,e=!1){if(!i||!i.rtps||!a.rtps)return a;let t,r;e&&(t=Ri("ssrc",a?.remoteRtps||[]),r=Ri("ssrc",i?.remoteRtps||[]));let n=Ri("ssrc",a.rtps),s=Ri("ssrc",i.rtps),o=(a.timestamp-i.timestamp)/1e3;return!n||!s||Object.keys(n).forEach(d=>{let p=n[d],u=s[d];if(!(!p||!u)){if(p.bytesReceived&&p.bytesReceived>u.bytesReceived&&(p.bandwidth=Math.round((p.bytesReceived-u.bytesReceived)/o),p.bandwidth+=Math.round((p.headerBytesReceived-u.headerBytesReceived)/o)),p.bytesSent&&p.bytesSent>u.bytesSent&&(p.bandwidth=Math.round((p.bytesSent-u.bytesSent)/o),p.bandwidth+=Math.round((p.headerBytesSent-u.headerBytesSent)/o)),p.packetsReceived)if(p.packetsReceived>u.packetsReceived||p.packetsLost>u.packetsLost){let h=p.packetsLost-u.packetsLost,S=p.packetsReceived-u.packetsReceived;p.packetLoss=parseFloat((100*h/(h+S)).toFixed(2))}else p.packetLoss=0;if(p.freezeCount>u.freezeCount&&(p.freezeCountDelta=p.freezeCount-u.freezeCount),p.totalFreezesDuration>u.totalFreezesDuration){let h=p.totalFreezesDuration-u.totalFreezesDuration;p.totalFreezesDurationDelta=h}if(p.framesDropped&&u.framesDropped&&p.framesDropped>u.framesDropped&&(p.framesDroppedDelta=parseFloat(((p.framesDropped-u.framesDropped)/o).toFixed(0))),e&&p.type==="outbound-rtp"&&p.kind==="video"){let h=t?.[d],S=r?.[d],R=W=>W??0,M=Math.max(0,R(h?.packetsLost)-R(S?.packetsLost)),F=Math.max(1,p.packetsSent-u.packetsSent);a.transport.averageNetStat={currentRoundTripTime:(a.transport.currentRoundTripTime+i.transport.currentRoundTripTime)/2*1e3,lostPercent:Math.round(M/F*100)}}}}),a}async function yi(a,i,e={},t=!1){let r=await Ro(a),n={timestamp:Date.now(),transport:yo(r),rtps:ya(r,e)};return t&&(n.remoteRtps=ya(r,e,!0)),i?Po(n,i,t):(await v.delay(Eo),yi(a,n,e,t))}function Je(a){performance.clearMarks(a),performance.mark(a)}function Tn(a){performance.clearMarks(a)}function Qt(a){let i=performance.getEntriesByName(a)[0];if(typeof i>"u")return null;let e=Math.round(performance.now()-i.startTime);return performance.clearMarks(a),e}function Xt(a){return`${E.SCREENSHARE_FIRST_FRAME}_${wo(a)}`}function wo(a){return typeof a=="string"?a:JSON.stringify(a)}var Ye=class Ye{constructor(){this._eventualLogs=new Set}static create(){Ye._instance=new Ye}static logCallStat(i){if(Ye._instance?._eventualLogs.size){for(let e of Ye._instance._eventualLogs)Object.assign(e,{call_topology:i.call_topology,local_address:i.local_address,local_connection_type:i.local_connection_type,network_type:i.network_type,remote_address:i.remote_address,remote_connection_type:i.remote_connection_type,transport:i.transport}),C.logClientStats(e);Ye._instance._eventualLogs.clear()}C.logClientStats(i)}static logEventualStat(i){i.value===void 0&&(i.value=Qt(i.name)),i.value!==null&&Ye._instance?._eventualLogs.add(i)}static destroy(){Ye._instance?._destroy(),Ye._instance=null}_destroy(){this._eventualLogs.clear()}};Ye._instance=null;var Me=Ye;var nr=class{constructor(i){this._firstFrameReceived=!1;this._participantId=i}measure(i,e){if(this._firstFrameReceived)return;this._firstFrameReceived=!0;let t=Xt(this._participantId),r=Qt(t);r!==null&&Me.logEventualStat({name:E.SCREENSHARE_FIRST_FRAME,value:r,width:i,height:e})}};var Mo=65536,Zt=class a{constructor(i,e,t){this._chunks=[];this._participantId=i,this._onStream=e,this._onStat=t,this._statScreenShareFirstFrame=new nr(i)}appendChunk(i){let e=this._chunks.length;if(i.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)%Mo!==i.sequence){c.warn("[FrameBuilder] Got incorrect chunk");return}if(this._chunks.push(i),i.end){let t=this._processFrameData(),{width:r,height:n}=a.getFrameSize(t);this._processFrame({timestamp:i.timestamp,frameData:t,isVP9:i.isVP9,keyframe:i.keyframe,width:r,height:n}),this._statScreenShareFirstFrame.measure(r,n)}}destroy(){Tn(E.SCREENSHARE_FREEZE_DURATION),Tn(Xt(this._participantId)),this._chunks=[]}_processFrameData(){let i=this._chunks;this._chunks=[];let e=i.reduce((n,s)=>n+s.data.byteLength,0),t=new Uint8Array(e),r=0;for(let n of i)t.set(new Uint8Array(n.data),r),r+=n.data.byteLength;return t}static getFrameSize(i){let e={width:0,height:0},t=new Pa.BitStream(i.buffer);t.bigEndian=!0,t.index+=2;let r=t.readBits(1),s=t.readBits(1)<<1|r;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(i){if(i){Je(E.SCREENSHARE_FREEZE_DURATION);return}let e=Qt(E.SCREENSHARE_FREEZE_DURATION);e!==null&&e>1e3&&this._onStat({freeze_duration:e})}};var Dt=class{constructor(i){this._onStream=i}async drawFrame(i){throw new Error("Method `drawFrame` is not supported by this implementation")}async drawImage(i){throw new Error("Method `drawImage` is not supported by this implementation")}static isBrowserSupported(){throw new Error("Method `isBrowserSupported` is not implemented")}};var ei=class extends Dt{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 r;e instanceof ImageBitmap?r=e:r=await createImageBitmap(e,0,0,e.width,e.height),this._canvasContext.transferFromImageBitmap(r),r.close()}else{let r=this._canvasContext;r.clearRect(0,0,t.width,t.height),r.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 kt=class extends Dt{constructor(i){super(i),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(i){await this._writer.write(i)}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&&nt.isBrowserSupported()}};var ti=class extends Zt{constructor(e,t,r){super(e,t,r);this._decoderReady=!1;this._decoderBusy=!1;this._decoderQueue=[];c.debug(`StreamBuilder started for participant [${e}]`),kt.isBrowserSupported()?this._renderer=new kt(t):this._renderer=new ei(t),nt.isBrowserSupported()?this._decoder=new nt:this._decoder=new Mt;let n=async o=>{this._decoderBusy=!1,"VideoFrame"in window&&o instanceof VideoFrame?await this._renderer.drawFrame(o):await this._renderer.drawImage(o),this._fpsMeter.increment(),this._decodeQueue()},s=o=>{this._decoderBusy=!1,this._decodeQueue()};this._decoder.init(n,s).then(()=>{this._decoderReady=!0,this._decodeQueue()}),this._fpsMeter=new At(o=>c.log(`[StreamBuilder][${e}] fps: ${o}`),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 ei.isBrowserSupported()||kt.isBrowserSupported()}};function wa(a,i,e,t,r,n,s){let o=0;i&&(o|=1),e&&(o|=2),t&&(o|=4),s||(o|=8);let d=new ArrayBuffer(11),p=new DataView(d);if(p.setUint8(0,1),p.setUint16(1,r),p.setUint32(3,a),p.setUint8(7,n?1:0),p.setUint16(8,0),p.setUint8(10,o),!s)return d;let u=new Uint8Array(d.byteLength+s.byteLength);return u.set(new Uint8Array(d),0),u.set(new Uint8Array(s),d.byteLength),u.buffer}function Ma(a){let i=new DataView(a),e=i.getUint8(0),t=i.getUint16(1),r=i.getUint32(3),n=i.getUint8(7)===1,s=i.getUint16(8),o=i.getUint8(10),d=!!(o&1),p=!!(o&2),u=!!(o&4),h=!!(o&8);if(e!==1)throw new Error(`Unexpected protocol version. Got ${e}, expected 1`);return{timestamp:r,start:d,end:p,keyframe:u,sequence:t,isVP9:n,ssrc:s,eos:h,data:a.slice(11)}}function Aa(a){if(!a||!a.byteLength||a.byteLength!==4)return!1;let i=new DataView(a);return!(i.getUint8(0)!==1||i.getUint8(1)!==1||i.getUint16(2)!==0)}function Da(a){if(!a||!a.byteLength||a.byteLength!==10)return null;let i=new DataView(a);if(i.getUint8(0)!==1||i.getUint8(1)!==2||i.getUint16(2)!==0)return null;let n=i.getUint16(4),s=i.getUint32(6);return{seq:n,ts2:s}}var k=Jt(require("simple-ebml-builder"));var Ao=2**15-1,Rn=1,Do=5,ko=5;var yn=class a{constructor(i){this._sourceBuffer=null;this._queue=[];this._clearBufferTill=0;this._mediaSource=new MediaSource,this._codec=i;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 i=this._queue;this._queue=[];let e=a._buildQueue(i);this._sourceBuffer.appendBuffer(e)}static _buildQueue(i){if(i.length){if(i.length===1)return k.build(i[0])}else return new Uint8Array;let e=i.reduce((n,s)=>n+s.countSize(),0),t=new Uint8Array(e),r=0;for(let n of i){let s=k.build(n);t.set(s,r),r+=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(i){return this._codec=i,this._sourceBuffer?.changeType(i)}append(i,e=!1){this._queue.push(i),e&&this._handleQueue()}cleanup(){this._mediaSource?.readyState==="open"&&this._sourceBuffer?.abort();let i=this._sourceBuffer?.buffered,e=i?.length;if(!e)return;let t=i.start(0),r=Math.max(0,i.end(e-1)-Do);r-t>ko&&(this._clearBufferTill=r)}destroy(){this._queue=[],this._mediaSource.readyState==="open"&&(this._sourceBuffer?.abort(),this._mediaSource.endOfStream()),this._sourceBuffer=null,this._clearBufferTill=0}get codec(){return this._codec}get mediaSource(){return this._mediaSource}get buffered(){return this._sourceBuffer?.buffered}},xt=class a extends Zt{constructor(e,t,r){super(e,t,r);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,r){let n=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"))]),s=[k.element(k.ID.PixelWidth,k.number(e)),k.element(k.ID.PixelHeight,k.number(t))],o=k.element(k.ID.Tracks,k.element(k.ID.TrackEntry,[k.element(k.ID.TrackNumber,k.number(Rn)),k.element(k.ID.TrackUID,k.number(Rn)),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_${r.toUpperCase()}`)),k.element(k.ID.Video,s)]));return k.unknownSizeElement(k.ID.Segment,[n,o])}static _genClusterHeader(e){return k.unknownSizeElement(k.ID.Cluster,[k.element(k.ID.Timecode,k.number(Math.round(e)))])}_createVideo(e){this._mediaBuffer=new yn(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 r=this._video.seekable;r.length&&(this._video.currentTime=r.end(r.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 r=e.timestamp;if(r<=this._lastFrameTimestamp&&(r=this._lastFrameTimestamp+10,c.debug(`[WebmBuilder] Fixup timestamp for participant [${this._participantId}]`)),this._lastFrameTimestamp=r,this._earliestTimestamp)r-=this._earliestTimestamp;else{if(!e.keyframe)return;this._earliestTimestamp=r,r=0}if(e.keyframe){this._clusterStartTime=r,this._mediaBuffer?.cleanup(),c.debug(`[WebmBuilder] Segment header for participant [${this._participantId}]`);let o=a._genWebmHeader();this._mediaBuffer?.append(o);let d=a._genSegmentHeader(e.width,e.height,t);this._mediaBuffer?.append(d)}let n=Math.round(r-this._clusterStartTime);if(n>Ao&&(this._clusterStartTime=r,n=0),n===0){c.debug(`[WebmBuilder] Cluster header for participant [${this._participantId}]`);let o=a._genClusterHeader(this._clusterStartTime);this._mediaBuffer?.append(o)}let s=k.element(k.ID.SimpleBlock,[k.vintEncodedNumber(Rn),k.bytes(a._intToU16BE(n)),k.number((e.keyframe?1:0)<<7),k.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),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 Ot=class{constructor(i,e,t,r,n){this._participantIdRegistry=null;this._streamBuilders={};this._onStream=()=>{};this._onEos=()=>{};c.debug("ScreenCaptureReceiver started"),this._datachannel=i,this._participantIdRegistry=e,this._onStream=t,this._onEos=r,this._onStat=n,this._datachannel.onmessage=s=>this._onDataChannelMessage(s.data)}_onDataChannelMessage(i){let e=Ma(i),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 r=this._streamBuilders[t];if(!r){let n=s=>this._onStream(t,s);l.screenShareWebmBuilder&&xt.isBrowserSupported()?r=new xt(t,n,this._onStat):r=new ti(t,n,this._onStat),this._streamBuilders[t]=r}r.appendChunk(e)}close(i){let e=this._streamBuilders[i];e&&(e.destroy(),delete this._streamBuilders[i])}destroy(){this._datachannel.onbufferedamountlow=null,this._datachannel.onmessage=null,this._onStream=()=>{},Object.values(this._streamBuilders).forEach(i=>i.destroy()),this._streamBuilders={},this._participantIdRegistry=null,c.debug("ScreenCaptureReceiver destroyed")}static isBrowserSupported(){return(nt.isBrowserSupported()||Mt.isBrowserSupported())&&(ti.isBrowserSupported()||xt.isBrowserSupported())}};var Pn=class{constructor(i,e,t){this._next=t,t&&(t.prev=this),this._prev=e,e&&(e.next=this),this._data=i}get prev(){return this._prev}set prev(i){this._prev=i}get next(){return this._next}set next(i){this._next=i}get data(){return this._data}},Pi=class{constructor(){this._head=null;this._tail=null;this._length=0}get length(){return this._length}push(...i){for(let e of i)this._tail=new Pn(e,this._tail,null),this._head||(this._head=this._tail),this._length++}merge(i){this._tail&&(this._tail.next=i._head),this._head||(this._head=i._head),this._tail=i._tail,this._length+=i._length,i.clear()}shift(){if(!this._length||!this._head)return null;let i=this._head;return this._head=i.next,this._head&&(i.next=null,this._head.prev=null),this._length--,this.length===1?this._tail=this._head:this.length||(this._head=this._tail=null),i.data}bisect(){if(this.length){let i=this.length>1?Math.floor(this.length/2):1;for(let e=0;e<i;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 i=[],e=this._head;for(;e!==null;)i.push(e.data),e=e.next;return i.length?JSON.stringify(i,(t,r)=>r instanceof Error?String(r):r):""}};var wn=Jt(require("@vkontakte/libvpx"));var xo=1e3,ii=class extends ze{constructor(e,t,r,n){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=r,this._maxBitrate=n,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,r)=>{if(this._useImageCapture)this._imageCapture=new ImageCapture(e),t();else{let n=this._video;n.srcObject=new MediaStream([e]),n.onloadeddata=d=>t(),n.onerror=()=>r(new Error("Video element error"));let s=n.play(),o=()=>r(new Error("Autoplay is disabled"));s?s.catch(o):o()}})}_removeStream(){window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._video&&(this._video.pause(),this._video.srcObject=null),this._imageCapture&&(this._imageCapture=null)}_drawFrameVideo(){if(!this._canvas||!this._canvasCtx||!this._video)throw new Error("Fatal error");this._video.paused&&this._video.play();let e=this._video.videoWidth,t=this._video.videoHeight;return this._canvas.width=this._video.width=e,this._canvas.height=this._video.height=t,this._canvasCtx.clearRect(0,0,e,t),this._canvasCtx.drawImage(this._video,0,0,e,t),this._canvasCtx.getImageData(0,0,e,t)}async _getFrameBitmap(){if(!this._imageCapture)throw new Error("Destroyed");return this._imageCapture.grabFrame()}_drawFrameData(e){if(!this._canvas||!this._canvasCtx)throw new Error("Destroyed");let t=e.width,r=e.height;return this._canvas.width=t,this._canvas.height=r,this._canvasCtx.clearRect(0,0,t,r),this._canvasCtx.drawImage(e,0,0,t,r),this._canvasCtx?.getImageData(0,0,t,r)}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
10
  `,r=>{r.error?this._onFrame(null,r.error):this._onFrame({type:r.frameType,timestamp:r.timestamp,duration:r.duration,data:r.data,byteLength:r.data?.byteLength,width:r.width,height:r.height})},[wn.default,wn.default.getUrl,this._useCongestionControl,this._maxBitrate],{isVP9:this.isVP9(),debug:c.enabled()})}_encode(e,t){let r=e.data.buffer;this._sendToWorker("frame",{width:e.width,height:e.height,imageData:r,keyFrame:t},[r])}_requestFrameVideo(e){let t=this._drawFrameVideo();this._encode(t,e)}_requestFrameBitmap(e){window.clearTimeout(this._frameReadTimeout),this._frameReadTimeout=window.setTimeout(()=>{if(this._lastFrame){let t=this._drawFrameData(this._lastFrame);this._encode(t,e)}else this._onFrame(null)},xo),this._getFrameBitmap().then(t=>{window.clearTimeout(this._frameReadTimeout),this._lastFrame?.close(),this._lastFrame=t;let r=this._drawFrameData(t);this._encode(r,e)}).catch(()=>{})}requestFrame(e=!1){this._useImageCapture?this._requestFrameBitmap(e):this._requestFrameVideo(e)}setBitrate(e,t,r){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 Nt=class extends ze{constructor(i,e,t,r,n,s){super(),this._sourceTrack=i,this._onFrame=e,this._useCongestionControl=t,this._maxBitrate=r,this._useCbr=n,this._frameRate=s,this._trackProcessor=new MediaStreamTrackProcessor(i)}async init(){let i=this._sourceTrack.getSettings().width,e=this._sourceTrack.getSettings().height,t=this._trackProcessor.readable;c.debug(`WebCodecsEncoder started ${i}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
- `,r=>{r.error?this._onFrame(null,r.error):this._onFrame({type:r.frameType,timestamp:r.timestamp,duration:r.duration,data:r.data,byteLength:r.data?.byteLength,width:r.width,height:r.height})},[],{readable:t,width:i,height:e,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[t])}requestFrame(i=!1){this._sendToWorker("frame",{keyFrame:i})}setBitrate(i,e,t){this._sendToWorker("set_bitrate",{bitrate:i,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 Oo=2100,No=600,Lo=1.2,ka=.8,Uo=2e3,Bo=8e3,Mn=8e3,Fo=16e3,Vo=4,jo=2e3,ar=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(ar||{}),wi=class{constructor(i,e,t,r,n,s,o){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=i,this._ccEnabled=r,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=n,this._targetFps=o,s>0?this._highDelayThreshold=s:this._highDelayThreshold=Oo,n&&(this._highDelayThreshold=No),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let d=Date.now();this._lastDown=0,this._lastUp=d,this._lastProbing=d,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(i,e,t){let r=Date.now();if(this._calcFps(r),this._calcDelay(e,r),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let n=0,s=this._delayAvgShort-this._delayAvgLong,o=Math.round(Math.abs(s)*100/this._delayAvgLong),d=s>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,p=this._delayAvgShort>this._highDelayThreshold;d||p?n=2:Math.abs(s)<40&&o<10&&!p&&(n=1);let u=Math.round(this._targetBitrate/1e3),h=t;i%20===0&&c.debug(`#${i}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${ar[n]} tr=${u} br=${t}`);let _=r-this._lastDown;if(n===2&&_>Uo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Vo),this._probing=!1);let X=ka*h*1e3;if(X>=this._targetBitrate&&(X=this._targetBitrate*ka),X=Math.max(X,this._minBitrate),X<this._targetBitrate){let fe=Math.round(X/1e3),Oe=Math.round(this._upPenalty*Mn/1e3);c.log(`#${i}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${ar[n]}`),c.log(`#${i}: cc: DOWN delay=${e} bitrate=${h} target=${u} -> newBitrate=${fe} penalty=${Oe}s`),this._setBitrate(X,!0),this._targetBitrate=X}this._lastDown=r}let C=r-this._lastUp,P=Bo+this._upPenalty*Mn;if(n===1&&C>P&&_>P){let X=Math.min(this._targetBitrate*Lo,this._maxBitrate);if(X>this._targetBitrate){let fe=Math.round(X/1e3),Oe=Math.round(this._targetBitrate/1e3),J=Math.round(this._upPenalty*Mn/1e3);c.log(`#${i}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${ar[n]}`),c.log(`#${i}: cc: UP bitrate=${h} target=${Oe} -> newBitrate=${fe} penalty=${J}s`),this._setBitrate(X,!1),this._targetBitrate=X,this._probing=!0,this._lastProbing=r,this._lastUp=r}}let B=r-this._lastProbing;this._probing&&B>Fo&&(this._probing=!1);let W=r-this._lastDown;this._upPenalty>0&&W>3*P&&(c.log(`#${i}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(i,e){this._fastSharing&&(e=!0);let t=this._targetFps;this._fps>0&&(t=this._fps),this._onCongestion(i,e,t)}_calcDelay(i,e){if(!(i<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=i,this._delayAvgLong=i),this._delayAvgShort=Math.round((this._delayAvgShort*3+i)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+i)/24),i>0&&i<this._minDelay?this._minDelay=i:i>this._maxDelay&&(this._maxDelay=i),this._lastCheckDelay===0&&(this._lastCheckDelay=e),i>jo){let t=e-this._lastCheckDelay;this._largeDelayDuration+=t}this._lastCheckDelay=e}}reconfigure(i,e){this._minBitrate=i,this._maxBitrate=e}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let i={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,i}_calcFps(i){this._frames++;let e=i-this._lastFpsCalcMs;if(e>5e3){this._lastFpsCalcMs=i;let t=this._fps,r=this._frames*1e3/e;this._fps===0?this._fps=Math.round(r):this._fps=Math.round((this._fps*3+r)/4),this._frames=0,this._fps!==t&&c.log(`cc: fps=${this._fps}`)}}};var Mi=class{constructor(i){this._size=0;this._head=0;this._tail=0;this._maxSize=i,this._buffer=new Array(i)}add(i,e,t,r,n){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let s=this._tail;return this._buffer[this._tail]={seq:i,ts:e,size:t,sent:Date.now(),start:r,end:n,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,s}update(i,e){let t=this.get(i);return t===null?null:(t.ts2=e,t.recv=Date.now(),t)}get(i){let e=this._head;for(let t=0;t<this._maxSize;t++){let r=this._buffer[e];if(i===r?.seq)return r;if(e=++e%this._maxSize,e===this._tail)break}return null}getServerBitrateK(i){let e=0,t=0,r=-1,n=-1,s=this._tail;for(let o=0;o<this._maxSize;o++){s>0?--s:s=this._maxSize-1;let d=this._buffer[s];if(!d||(n===-1&&(n=d.ts2,t=0),n>=0&&(t+=d.size),r=d.ts2,n-r>=i)||s===this._head)break}if(r>=0&&n>=0){let o=n-r;e=Math.round(o>0?t*8/o:0)}return e}getCurrentDelay(){let i=this._tail;for(let e=0;e<this._maxSize;e++){i>0?--i:i=this._maxSize-1;let t=this._buffer[i];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(i===this._head)break}return 0}getMaxBandwidth(){let i=0,e=0,t=-1,r=-1,n=this._tail;for(let s=0;s<this._maxSize;s++){n>0?--n:n=this._maxSize-1;let o=this._buffer[n];if(o){if(r===-1&&o.end&&!o.start&&(r=o.ts2,e=0),t===-1&&r>=0&&o.start&&!o.end&&(t=o.ts2),t>=0&&r>=0){let d=r-t;i=d>0?e*8/d:0;break}if(r>=0&&(e+=o.size),n===this._head)break}}return Math.round(i)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}};var An=65536,Go=50,Ho=400,qo=1e6,Ko=3e5,$o=3e4,zo=2e3,Jo=5,sr=0,Lt=class{constructor(i,e,t,r){this._destroyed=!1;this._needKeyframe=!0;this._frameNum=0;this._feedback=new Mi(1024);this._lastSentFrameSeq=0;this._lastDeliveredFrameSeq=0;this._lastFrameDelay=0;this._lastFramerateReduced=Date.now();this._lastSharingStat=Date.now();this._queue=new Pi;c.debug("ScreenCaptureSender started"),this.DATA_SIZE=l.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=r,this._congestionControlEnabled=l.screenShareCongestionControl||this._fastSharing,this._width=i.getSettings().width,this._height=i.getSettings().height,this._maxFrameDelay=this._fastSharing?l.screenShareCongestionControlThreshold:l.screenShareCongestionControlThreshold*2;let n=l.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:o}=this._calcMinMaxBitrate(this._width,this._height),d=this._onCongestionCallback.bind(this);c.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(o/1e3)}k delayThreshold=${l.screenShareCongestionControlThreshold}`),this._congestionControl=new wi(d,s,o,this._congestionControlEnabled,this._fastSharing,l.screenShareCongestionControlThreshold,n);let p=(u,h)=>{if(this._destroyed)return;if(!u){c.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),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 _=this._sliceFrame(u);this._queue.merge(_),this._handleQueue(),this._sendSharingStat()};if(Nt.isBrowserSupported()){let u=this._fastSharing;this._encoder=new Nt(i,p,this._congestionControlEnabled,o,u,n)}else this._encoder=new ii(i,p,this._congestionControlEnabled,o);this._datachannel.onmessage=u=>{Aa(u.data)&&(c.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Da(u.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(u=>c.warn("ScreenCaptureSender init failed",u)),this._fpsMeter=new At(u=>c.log(`[ScreenCaptureSender] fps: ${u}`),5e3)}_handleQueue(){if(this._destroyed)return;let i=this._queue.shift();if(!i){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+An)%An>Jo&&this._lastFrameDelay>this._maxFrameDelay){let r=Date.now();r-this._lastFramerateReduced>zo&&(this._lastFramerateReduced=r,c.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(i)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),v.setImmediate(()=>this._handleQueue());return}if(i.isLast){this._frameNum++,this._fpsMeter.increment(),i.isKey&&c.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(i.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),r=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,r)}else v.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let i=this._queue.head();for(;i;){if(i.isFirst&&i.isKey)return!0;this._queue.shift(),i=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(i){let e=i.type==="key",t=i.data.byteLength,r=new Pi;for(let n=0;n<t;n+=this.DATA_SIZE){let s=i.data.slice(n,n+this.DATA_SIZE),o=n===0,d=t<=n+s.byteLength,p=this._wrapHeader(i.timestamp,o,d,e,s);r.push({data:p.data,sequence:p.sequence,frameSize:t,isFirst:o,isLast:d,isKey:e,timestamp:i.timestamp})}return r}_wrapHeader(i,e,t,r,n){let s=wa(i,e,t,r,sr,this._encoder.isVP9(),n),o={sequence:sr,data:s};return sr=(sr+1)%An,o}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(i){if(!this._datachannel||this._datachannel.readyState!=="open")return!1;try{return this._datachannel.send(i.data),this._feedback.add(i.sequence,i.timestamp,i.data.byteLength,i.isFirst,i.isLast),i.isLast&&(this._lastSentFrameSeq=i.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 Nt.isBrowserSupported()||ii.isBrowserSupported()}_onCongestionCallback(i,e,t){this._encoder.setBitrate(i,e,t)}_onResize(i,e){let{minBitrate:t,maxBitrate:r}=this._calcMinMaxBitrate(i,e),n=Math.round(t/1e3),s=Math.round(r/1e3);c.log(`cc: resize to ${i}x${e}, minBitrate=${n} maxBitrate=${s}`),this._congestionControl.reconfigure(t,r)}_calcMinMaxBitrate(i,e){(i===void 0||i<640)&&(i=640),(e===void 0||e<360)&&(e=360);let t=i*e/256,r=Math.max(Ko,Math.min(qo,Math.round(t*Go))),n=Math.round(t*Ho);return{minBitrate:r,maxBitrate:n}}_checkCcFeedback(i){let e=this._feedback.update(i.seq,i.ts2);if(e===null)c.debug(`cc: update failed, seq=${i.seq}`);else if(e.end){this._lastDeliveredFrameSeq=e.seq;let t=e.recv-e.sent;t>0&&(this._lastFrameDelay=t),this._handleQueue()}}_sendSharingStat(){let i=Date.now();if(i-this._lastSharingStat>$o){let t=this._congestionControl.getStat();t!==null&&(c.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=i}}};var Te=class a{static get sessionKey(){return a._sessionKey}static set sessionKey(i){a._sessionKey=i}static get sessionSecretKey(){return a._sessionSecretKey}static set sessionSecretKey(i){a._sessionSecretKey=i}static get accessToken(){return a._accessToken}static set accessToken(i){a._accessToken=i}static isEmpty(){return!a._sessionKey}};var f=class f{static set(i){i.hasOwnProperty("voiceParams")&&(Object.assign(f._params.voiceParams,i.voiceParams),delete i.voiceParams),i.hasOwnProperty("specListenerParams")&&(Object.assign(f._params.specListenerParams,i.specListenerParams),delete i.specListenerParams),i.hasOwnProperty("apiAuth")&&(Te.accessToken=i.apiAuth.accessToken,Te.sessionKey=i.apiAuth.sessionKey,Te.sessionSecretKey=i.apiAuth.sessionSecretKey),Object.assign(f._params,v.objectFilterOutValues(i,void 0))}static get(i){return f._params[i]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.6-dev.b0a4fa9e.0"}static get debug(){return f._params.debug}static get protocolVersion(){return f._params.joinFromMultipleDevices?6:5}static get platform(){return f._params.platform}static set platform(i){f._params.platform=i}static get clientStatsPlatform(){return f._params.clientStatsPlatform}static set clientStatsPlatform(i){f._params.clientStatsPlatform=i}static get clientType(){return f._params.clientType}static set clientType(i){f._params.clientType=i}static get externalUserType(){return f._params.externalUserType}static set externalUserType(i){f._params.externalUserType=i}static get device(){return f._params.device}static get apiKey(){return f._params.apiKey}static get apiEnv(){return f._params.apiEnv}static get apiBaseUrl(){return f._params.apiBaseUrl}static set apiBaseUrl(i){f._params.apiBaseUrl=i}static apiEndpoint(i){switch(i??f.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 f._params.apiEnv}}static get authToken(){return f._params.authToken}static set authToken(i){f._params.authToken=i}static get anonymToken(){return f._params.anonymToken}static set anonymToken(i){f._params.anonymToken=i}static get domain(){return f._params.domain}static get externalDomain(){return f._params.externalDomain}static get iceServers(){return f._params.iceServers}static set iceServers(i){f._params.iceServers=i}static get wssBase(){return f._params.wssBase}static set wssBase(i){f._params.wssBase=i}static get wtsBase(){return f._params.wtsBase}static set wtsBase(i){f._params.wtsBase=i}static get wssToken(){return f._params.wssToken}static set wssToken(i){f._params.wssToken=i}static get signalingReconnectDelay(){return f._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return f._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return f._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return f._params.waitConnectionDelay}static get waitResponseDelay(){return f._params.waitResponseDelay}static get waitMessageDelay(){return f._params.waitMessageDelay}static get waitAnotherTabDelay(){return f._params.waitAnotherTabDelay}static get debugLog(){return f._params.debugLog}static get forceRelayPolicy(){return f._params.forceRelayPolicy}static set forceRelayPolicy(i){f._params.forceRelayPolicy=i}static get videoMinWidth(){return f._params.videoMinWidth}static get videoMaxWidth(){return f._params.videoMaxWidth}static set videoMaxWidth(i){f._params.videoMaxWidth=i}static get videoMinHeight(){return f._params.videoMinHeight}static get videoMaxHeight(){return f._params.videoMaxHeight}static set videoMaxHeight(i){f._params.videoMaxHeight=i}static get videoAspectRatio(){return f._params.videoAspectRatio}static get videoFrameRate(){return f._params.videoFrameRate}static get videoFacingMode(){return f._params.videoFacingMode||(y.isMobile()?"user":null)}static set videoFacingMode(i){f._params.videoFacingMode=i}static get displaySurface(){return f._params.displaySurface}static get audioEffects(){return f._params.audioEffects}static set audioEffects(i){f._params.audioEffects=i,f._params.audioEffects?.setLogger((e,...t)=>c.send(e,...t))}static get videoEffects(){return f._params.videoEffects}static set videoEffects(i){f._params.videoEffects=i,f._params.videoEffects?.setLogger((e,...t)=>c.send(e,...t))}static get videoEffectMaxWidth(){return f._params.videoEffectMaxWidth}static set videoEffectMaxWidth(i){f._params.videoEffectMaxWidth=i}static get videoEffectMaxHeight(){return f._params.videoEffectMaxHeight}static set videoEffectMaxHeight(i){f._params.videoEffectMaxHeight=i}static get vmoji(){return f._params.vmoji?.isBrowserSupported()?f._params.vmoji:null}static set vmoji(i){f._params.vmoji=i}static get vmojiOptions(){return f._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(i){f._params.vmojiOptions=i}static get voiceParams(){return f._params.voiceParams}static get specListenerParams(){return f._params.specListenerParams}static get iceRestartWaitTime(){return f._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return f._params.transportConnectionWaitTime}static get statisticsInterval(){return f._params.statisticsInterval}static set statisticsInterval(i){f._params.statisticsInterval=i}static get networkStatisticsInterval(){return f._params.networkStatisticsInterval}static get perfStatReportEnabled(){return f._params.perfStatReportEnabled}static get callStatReportEnabled(){return f._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return f._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return f._params.enableLogPerfStatReport}static get producerNotificationDataChannel(){return f._params.producerNotificationDataChannel}static get producerCommandDataChannel(){return f._params.producerCommandDataChannel}static get consumerScreenDataChannel(){return f._params.consumerScreenDataChannel&&Lt.isBrowserSupported()}static get producerScreenDataChannel(){return f._params.producerScreenDataChannel&&f.producerNotificationDataChannel&&Ot.isBrowserSupported()}static get asrDataChannel(){return f._params.asrDataChannel&&f.producerNotificationDataChannel}static get consumerScreenDataChannelPacketSize(){return f._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return f._params.screenShareWebmBuilder}static get noiseSuppression(){return f._params.noiseSuppression}static set noiseSuppression(i){f._params.noiseSuppression=i}static get preferH264(){return f._params.preferH264}static get preferVP9(){return f._params.preferVP9}static get audioNack(){return f._params.audioNack}static get consumerScreenTrack(){return f._params.consumerScreenTrack&&f.consumerScreenDataChannel}static get producerScreenTrack(){return f._params.producerScreenTrack}static get movieShare(){return f._params.movieShare&&f.videoTracksCount>0}static get videoTracksCount(){return f.producerNotificationDataChannel?Number(f._params.videoTracksCount):0}static get breakVideoPayloadTypes(){return f._params.breakVideoPayloadTypes}static get useCallsToContacts(){return f._params.useCallsToContacts}static get useParticipantListChunk(){return f._params.useParticipantListChunk&&f.videoTracksCount>0}static get useRooms(){return f._params.useRooms}static get useChatRooms(){return f._params.useChatRooms}static get participantListChunkInitIndex(){return f._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return f._params.participantListChunkInitCount??null}static get serverAudioRed(){return f._params.serverAudioRed}static get p2pAudioRed(){return f._params.p2pAudioRed}static get h264spsPpsIdrInKeyframe(){return f._params.h264spsPpsIdrInKeyframe}static get filterObservers(){return f._params.filterObservers}static get muteMode(){return f._params.muteMode}static get preserveAudioTracks(){return f._params.preserveAudioTracks}static get audioShare(){return y.isAudioShareSupported()&&f._params.audioShare}static get fastScreenShare(){return f._params.fastScreenShare}static get screenShareCongestionControl(){return f._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return f._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return f._params.fastScreenShareWidth}static get fastScreenShareHeight(){return f._params.fastScreenShareHeight}static get newMuteRules(){return f._params.newMuteRules}static get videoSuspend(){return f._params.videoSuspend}static get enumerateDevicesDelay(){return f._params.enumerateDevicesDelay}static getScreenFrameRate(i){return i?f._params.fastScreenShareFrameRate:f._params.screenFrameRate}static get switchVideoAtBadNetwork(){return f._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return f._params.enableVideoEffectsFpsDegradation}static get simulcast(){return f._params.simulcast}static set simulcast(i){f._params.simulcast=i}static get webtransport(){return f._params.webtransport}static set webtransport(i){f._params.webtransport=i}static get webtransportFF(){return f._params.webtransportFF}static set webtransportFF(i){f._params.webtransportFF=i}static toJSON(){return{apiKey:f._params.apiKey,apiEnv:f._params.apiEnv,audioShare:f._params.audioShare,useCallsToContacts:f._params.useCallsToContacts,useParticipantListChunk:f._params.useParticipantListChunk,useRooms:f._params.useRooms,useChatRooms:f._params.useChatRooms,fastScreenShare:f._params.fastScreenShare,participantListChunkInitCount:f._params.participantListChunkInitCount,screenShareCongestionControl:f._params.screenShareCongestionControl,screenShareCongestionControlThreshold:f._params.screenShareCongestionControlThreshold,videoTracksCount:f._params.videoTracksCount,asrDataChannel:f._params.asrDataChannel,videoMaxHeight:f._params.videoMaxHeight,videoMaxWidth:f._params.videoMaxWidth,videoEffectMaxHeight:f._params.videoEffectMaxHeight,videoEffectMaxWidth:f._params.videoEffectMaxWidth,videoSuspend:f._params.videoSuspend,debugLog:f._params.debugLog,callStatReportEnabled:f._params.callStatReportEnabled,joinFromMultipleDevices:f._params.joinFromMultipleDevices,movieShare:f._params.movieShare,newMuteRules:f._params.newMuteRules,clientType:f._params.clientType,clientStatsPlatform:f._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:f._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:f._params.switchVideoAtBadNetwork,simulcast:f._params.simulcast,webtransport:f._params.webtransport,webtransportFF:f._params.webtransportFF}}};f._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 l=f;function xa(a,i){return!(a.isAudioEnabled!==i.isAudioEnabled||a.isVideoEnabled!==i.isVideoEnabled||a.isScreenSharingEnabled!==i.isScreenSharingEnabled||a.isFastScreenSharingEnabled!==i.isFastScreenSharingEnabled||a.isAudioSharingEnabled!==i.isAudioSharingEnabled||a.isAnimojiEnabled!==i.isAnimojiEnabled)}function Re(a){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},a||{})}var Oa=a=>a.stop(),Ai=a=>a.getTracks().forEach(Oa),Na=a=>a.getVideoTracks().forEach(Oa);async function or(a,i){try{let e=typeof i.width=="number"?i.width:void 0,t=typeof i.height=="number"?i.height:void 0;await a.applyConstraints({...i,...e&&{width:{max:e,ideal:e}},...t&&{height:{max:t,ideal:t}}})}catch(e){c.warn("setVideoConstraints failed",e)}}var cr=class extends ae{constructor(){super(...arguments);this.FPS_LIMITS=[13,20,Math.max(l.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((n,s)=>n+s,0)/this.HISTORY_LENGTH,r=this.FPS_LIMITS[this._fpsLimitCursor];t<r*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),r!==this.fpsLimit&&this._triggerEvent("fps-limit",this.fpsLimit)}}_assertsVideoEffect(e){if(!("addFpsMeterListener"in e))throw new Error("Outdated VideoEffect version")}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}};var He=(r=>(r.audio="audio",r.video="video",r.screen="screen",r.audioshare="audioshare",r))(He||{});var dr=class extends ae{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=Re();this._videoStatusOnScreenCapturingEnabled=!1;this._effect=null;this._audioEffectParams=null;this._animojiEnabled=!1;this._initDeviceChangeListener(),l.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),l.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new cr,this._videoEffectsFpsLimiter.addEventListener("fps-limit",this.handleVideoEffectsLowFps.bind(this)))}async request(e=[oe.AUDIO],t=!0){if(this._stream)return;let r=e.includes(oe.VIDEO),n=e.includes(oe.AUDIO),s=e.includes(oe.ANIMOJI);if(!y.isBrowserSupported())throw new G(ne.UNSUPPORTED);try{this._stream=await y.getUserMedia(r,n,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=r&&this._stream.getVideoTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=n&&this._stream.getAudioTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(o){throw new G(o)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,r){let n=this.getStream(),s=this.getSendAudioTrack(),o=this.getSendVideoTrack(r);if(!n||!s&&!o&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,n),o&&!t&&e.addTrack(o,n)}getMediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case"videoinput":if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case"audioinput":if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(ne.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Na(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(),r=y.getSavedCamera(),n=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,s=this._mediaSettings.isVideoEnabled&&r?.groupId!==e.camera?.groupId;try{n&&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",r=e||await y._getUserVideo(!!this._effect,this._frameRate);if(this._cameraVideoTrack?.stop(),this._cameraVideoTrack=r.getVideoTracks()[0],!this._stream)Ai(r);else{l.consumerScreenTrack||await this._disableScreenCapture();let n=await this._setEffect(this._effect,this._cameraVideoTrack);T.log(E.DEVICE_CHANGED,t),c.log("Video stream changed"),await this._replaceLocalTrack(n),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw T.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)Ai(t);else{let r=await this._applyAudioEffect();T.log(E.DEVICE_CHANGED,"audio"),c.log("Audio stream changed",r),await this._replaceLocalTrack(r),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw T.log(E.ERROR,"change_audio"),c.error("Microphone change failed",t),t}}async _changeScreen(e,t,r){try{if(r=r||await y.getScreenMedia(e,t),!this._stream)Ai(r);else{let n=r.getVideoTracks()[0];if(n.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),l.consumerScreenTrack||this._stopEffect(),T.log(E.DEVICE_CHANGED,"screen"),c.log("Screen capturing started"),this._screenTrack=n,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):n,await this._replaceLocalTrack(n,this._sendVideoTrack)),r.getAudioTracks().length>0){let s=r.getAudioTracks()[0];s.contentHint="music",this._audioShareTrack=s,await this._replaceLocalTrack(s),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&c.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:n}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(n){throw T.log(E.ERROR,"screen"),c.warn("Screen capturing failed",n),n}}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 r=this._stream.getTracks().find(n=>n.kind===e.kind&&n.contentHint===e.contentHint);r?.id!==e.id&&(r?(r!==this._audioEffectsTrack&&r.stop(),this._stream?.removeTrack(r),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(r){return c.warn("Video effect failed",r),t}}_stopEffect(){if(l.videoEffects)try{l.videoEffects.stopEffect()}catch(e){c.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),l.videoEffects&&(this._effect=null,l.videoEffects.destroy()),l.audioEffects&&l.audioEffects.destroy(),this._stream&&(Ai(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 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 r=await y._getUserVideo(!!this._effect,this._frameRate);this._cameraVideoTrack=r.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;if(e){let r=await y.getUserAudio();this._micAudioTrack=r.getAudioTracks()[0],t=await this._applyAudioEffect()}else l.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(!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 r=this._effect&&t||e;await this._applyVideoConstraints(this._cameraVideoTrack,r)}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(T.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 r=this._cameraVideoTrack.clone(),n=new MediaStream([r]);await this._applyVideoConstraints(r),await this._changeVideoInput(n)}catch(r){this._effect=t;let n=this._cameraVideoTrack.clone(),s=new MediaStream([n]);throw await this._changeVideoInput(s),r}}}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||!v.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let r=this._micAudioTrack.clone(),n=new MediaStream([r]);await this._changeAudioInput(n)}catch(r){this._audioEffectParams=t;let n=this._micAudioTrack.clone(),s=new MediaStream([n]);throw await this._changeAudioInput(s),r}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this._cameraVideoTrack&&e<l.videoFrameRate&&this._applyVideoConstraints(this._cameraVideoTrack).catch(t=>{c.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 or(e,{width:this._effect?l.videoEffectMaxWidth:l.videoMaxWidth,height:this._effect?l.videoEffectMaxHeight:l.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(i){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=i,this._cameraPermissionStatus.onchange=r=>this.handlePermissionChange(r),this._microphonePermissionStatus.onchange=r=>this.handlePermissionChange(r)}catch(e){c.warn("NavigatorPermissions init error",e)}}handlePermissionChange(i){let e=i.target;if(e instanceof PermissionStatus){let{name:t,state:r}=e;switch(t){case"audio_capture":this._listener("microphone",r);break;case"video_capture":this._listener("camera",r);break}}}getPermissionState(i){let e=null;switch(i){case"camera":e=this._cameraPermissionStatus.state;break;case"microphone":e=this._microphonePermissionStatus.state;break}return e}};var lr=(d=>(d.WAITING_HALL="WAITING_HALL",d.WAITING="WAITING",d.CONNECTING="CONNECTING",d.CONNECTED="CONNECTED",d.RECONNECT="RECONNECT",d.ERROR="ERROR",d.HANGUP="HANGUP",d.PERMISSIONS="PERMISSIONS",d))(lr||{});function j(a,...i){let e=l.get(a);typeof e=="function"&&setTimeout(e,0,...i)}function ue(a,i,...e){if(l.filterObservers){if(Array.isArray(i)){if(i=i.filter(t=>!t.observer),!i.length)return}else if(i.observer)return}j(a,i,...e)}function ye(a){return Object.assign({},a)}function Ut(a){return a.slice()}var Dn;(fp=>{function a(S,M){j("onLocalStream",S,ye(M))}fp.onLocalStream=a;function i(S,M){j("onScreenStream",S,ye(M))}fp.onScreenStream=i;function e(S,M){j("onVmojiStream",S,ye(M))}fp.onVmojiStream=e;function t(S){j("onVmojiError",S)}fp.onVmojiError=t;function r(S,M){j("onLocalStreamUpdate",ye(S),M)}fp.onLocalStreamUpdate=r;function n(S){c.debug("Local status:",S),j("onLocalStatus",S)}fp.onLocalStatus=n;function s(S,M){ue("onRemoteStream",S,M)}fp.onRemoteStream=s;function o(S,M){ue("onRemoteLive",S,M)}fp.onRemoteLive=o;function d(S,M){ue("onLocalLive",S,M)}fp.onLocalLive=d;function p(S,M){ue("onRemoteLiveUpdate",S,M)}fp.onRemoteLiveUpdate=p;function u(S,M){ue("onLocalLiveUpdate",S,M)}fp.onLocalLiveUpdate=u;function h(S,M){ue("onRemoteScreenStream",S,M)}fp.onRemoteScreenStream=h;function _(S,M){ue("onRemoteVmojiStream",S,M)}fp.onRemoteVmojiStream=_;function C(S,M,K){ue("onRemoteStreamSuspended",S,M,K)}fp.onRemoteStreamSuspended=C;function P(S,M,K,je,Pt){ue("onConversation",S,ye(M),ye(K),je,Pt)}fp.onConversation=P;function B(S){S&&j("onConversationParticipantListChunk",S)}fp.onConversationParticipantListChunk=B;function W(S,M,K){ue("onRemoteMediaSettings",S,ye(M),K)}fp.onRemoteMediaSettings=W;function X(S,M){ue("onLocalMediaSettings",S,ye(M))}fp.onLocalMediaSettings=X;function fe(S,M,K){ue("onRemoteSharedMovieInfo",S,ye(M),K)}fp.onRemoteSharedMovieInfo=fe;function Oe(S,M,K){ue("onRemoteSharedMovieStoppedInfo",S,ye(M),K)}fp.onRemoteSharedMovieStoppedInfo=Oe;function J(S,M,K){ue("onLocalSharedMovieInfo",S,ye(M),K)}fp.onLocalSharedMovieInfo=J;function Ae(S,M,K){ue("onLocalSharedMovieStoppedInfo",S,ye(M),K)}fp.onLocalSharedMovieStoppedInfo=Ae;function be(S,M,K){ue("onRemoteSharedUrl",S,M,K)}fp.onRemoteSharedUrl=be;function Rt(S,M){ue("onParticipantAdded",S,M)}fp.onParticipantAdded=Rt;function Si(S,M){ue("onParticipantJoined",S,M)}fp.onParticipantJoined=Si;function Xi(S){j("onLocalParticipantState",ye(S))}fp.onLocalParticipantState=Xi;function te(S,M,K){ue("onRemoteParticipantState",S,ye(M),K)}fp.onRemoteParticipantState=te;function vi(S,M){j("onRemoteParticipantsState",S,M)}fp.onRemoteParticipantsState=vi;function ra(S,M,K=null){c.debug("Remote status:",M,S),ue("onRemoteStatus",S,M,K)}fp.onRemoteStatus=ra;function na(){j("onPermissionsRequested")}fp.onPermissionsRequested=na;function aa(S,M){j("onPermissionsError",S,M)}fp.onPermissionsError=aa;function sa(S,M){ue("onRemoteRemoved",S,M)}fp.onRemoteRemoved=sa;function oa(S,M,K){j("onCallState",S,M,ye(K))}fp.onCallState=oa;function Zi(S,M){j("onDeviceSwitched",S,M)}fp.onDeviceSwitched=Zi;function fn(S,M,K,je=!1,Pt=!1,_n=null,Sn=null,so,ha,oo=null){let co=ha?Ut(ha):void 0;j("onMuteStates",ye(S),Ut(M),Ut(K),je,Pt,_n,Sn,so,co,oo)}fp.onMuteStates=fn;function ca(S,M,K=!1){ue("onRolesChanged",S,Ut(M),K)}fp.onRolesChanged=ca;function da(S,M=!1){j("onLocalRolesChanged",Ut(S),M)}fp.onLocalRolesChanged=da;function la(S,M,K,je){ue("onPinnedParticipant",S,M,K,je)}fp.onPinnedParticipant=la;function gn(S,M){j("onLocalPin",S,M)}fp.onLocalPin=gn;function pa(S){j("onOptionsChanged",Ut(S))}fp.onOptionsChanged=pa;function q(){j("onCallAccepted")}fp.onCallAccepted=q;function he(S){ue("onAcceptedCall",S)}fp.onAcceptedCall=he;function V(){j("onRateNeeded")}fp.onRateNeeded=V;function ie(S){ue("onSpeakerChanged",S)}fp.onSpeakerChanged=ie;function se(S){j("onVolumesDetected",Ut(S))}fp.onVolumesDetected=se;function me(S,M){j("onLocalVolume",S,M)}fp.onLocalVolume=me;function pt(S,M){j("onJoinStatus",S,M)}fp.onJoinStatus=pt;function $e(S,M){j("onHangup",S,M)}fp.onHangup=$e;function m(S){j("onMultipartyChatCreated",ye(S))}fp.onMultipartyChatCreated=m;function b(){j("onDeviceChange")}fp.onDeviceChange=b;function R(S){j("onFingerprintChange",S)}fp.onFingerprintChange=R;function w(){j("onTokenExpired")}fp.onTokenExpired=w;function g(S,M,K=!1){j("onChatMessage",S,M,K)}fp.onChatMessage=g;function A(S,M,K=!1){j("onCustomData",S,M,K)}fp.onCustomData=A;function H(S,M,K,je,Pt,_n,Sn=null){j("onRecordStarted",S,M,K,je,Pt,_n,Sn)}fp.onRecordStarted=H;function F(S=null){j("onRecordStopped",S)}fp.onRecordStopped=F;function Z(S){j("onLocalNetworkStatusChanged",S)}fp.onLocalNetworkStatusChanged=Z;function Se(S){j("onNetworkStatusChanged",S)}fp.onNetworkStatusChanged=Se;function x(S,...M){j("onDebugMessage",S,...M)}fp.onDebugMessage=x;function Ie(S,M){let K=Object.assign({},S,{memory:M});j("onStatistics",K)}fp.onStatistics=Ie;function ge(){j("onAutoplayError")}fp.onAutoplayError=ge;function Ee(S,M,K,je,Pt){j("onChatRoomUpdated",S,M,K,je,Pt)}fp.onChatRoomUpdated=Ee;function de(S){j("onPromoted",S)}fp.onPromoted=de;function Ue(S){j("onRemoteMixedAudioStream",S)}fp.onRemoteMixedAudioStream=Ue;function yt(S){j("onJoinLinkChanged",S)}fp.onJoinLinkChanged=yt;function zt(S){j("onRoomsUpdated",S)}fp.onRoomsUpdated=zt;function rt(S,M,K,je){j("onRoomUpdated",S,M,K,je)}fp.onRoomUpdated=rt;function Ii(S){j("onRoomParticipantsUpdated",S)}fp.onRoomParticipantsUpdated=Ii;function ua(S){j("onRoomSwitched",S)}fp.onRoomSwitched=ua;function ip(S){j("onRoomStart",S)}fp.onRoomStart=ip;function rp(S,M=null){j("onFeedback",S,M)}fp.onFeedback=rp;function np(S){j("onFeaturesPerRoleChanged",S)}fp.onFeaturesPerRoleChanged=np;function ap(S){j("onParticipantVmojiUpdate",S)}fp.onParticipantVmojiUpdate=ap;function sp(S,M){j("onAsrSet",S,M)}fp.onAsrSet=sp;function op(S,M,K){j("onAsrStarted",S,M,K)}fp.onAsrStarted=op;function cp(S){j("onAsrStopped",S)}fp.onAsrStopped=cp;function dp(S,M,K,je){j("onAsrTranscription",S,M,K,je)}fp.onAsrTranscription=dp;function lp(S,M){j("onParticipantIdChanged",S,M)}fp.onParticipantIdChanged=lp;function pp(S){j("onVideoSuspendSuggest",S)}fp.onVideoSuspendSuggest=pp;function up(S){j("onSignalingMessage",typeof S=="string"?S:ye(S))}fp.onSignalingMessage=up;function hp(S){j("onPromotionApproved",S)}fp.onPromotionApproved=hp;function mp(){j("onPeerRegistered")}fp.onPeerRegistered=mp})(Dn||(Dn={}));var I=Dn;var xn="_okcls_",ri=(()=>{try{let a=Date.now().toString(),i=window.localStorage,e=!1;return i.setItem(a,a),e=i.getItem(a)===a,i.removeItem(a),e?i:null}catch{return null}})();function Yo(a){let i=ri?ri.getItem(xn+a):null;if(i===null)return null;try{return JSON.parse(i)}catch{return null}}function Qo(a,i){try{ri&&ri.setItem(xn+a,JSON.stringify(i))}catch{}}function Xo(a){ri&&ri.removeItem(xn+a)}var kn;(t=>{function a(r){return Yo(r)||null}t.get=a;function i(r,n){Qo(r,n)}t.set=i;function e(r){Xo(r)}t.remove=e})(kn||(kn={}));var It=kn;var Bt=null,pr=null,_r=null,vr=[],Ir=[],Sr=[],Qe=null,Xe=null,Er=null,br=!1,Cr=!1,ur,ni,hr,On=null,Nn="",mr=[],fr=null,La=navigator.appVersion,Zo=navigator.appName,We=navigator.userAgent,ut={},vt=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(vt||{});(i=>{function a(e){return Object.values(i).includes(e)}i.contains=a})(vt||(vt={}));var Vt=class{constructor(i,e=!1,t=l.videoMaxWidth,r=l.videoMaxHeight,n=l.videoFrameRate){this.isVideoRequested=()=>this.needVideo;this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(i){s={noiseSuppression:l.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let d=Pe.getMicrophones(),p,u;if(Xe&&(u=Xe.groupId,p=Xe.deviceId),typeof i=="string")u=d.find(_=>_.deviceId===i)?.groupId,p=i;else if(!Xe&&Pe.os()==="MacOS"&&d.find(h=>h.label.includes("iPhone"))){let h=d.find(_=>!_.label.includes("Virtual")&&!_.label.includes("iPhone"));h&&(u=h.groupId,p=h.deviceId)}u&&this.supportedConstraints.groupId?s.groupId={exact:u}:p&&(s.deviceId={exact:p})}let o=!1;if(e){o={width:{min:l.videoMinWidth,max:t,ideal:t},height:{min:l.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:l.videoAspectRatio},frameRate:{ideal:n}};let d=Pe.getCameras(),p,u;if(Qe&&(u=Qe.groupId,p=Qe.deviceId),typeof e=="string")u=d.find(_=>_.deviceId===e)?.groupId,p=e;else if(!Qe&&Pe.os()==="MacOS"&&d.find(h=>h.label.includes("iPhone"))){let h=d.find(_=>!_.label.includes("Virtual")&&!_.label.includes("iPhone"));h&&(u=h.groupId,p=h.deviceId)}u&&this.supportedConstraints.groupId?o.groupId={exact:u}:p&&(o.deviceId={exact:p}),l.videoFacingMode&&(o.facingMode={ideal:l.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=s,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video=="object"&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio=="object"&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let i=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||i)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Ln=class extends Vt{constructor(i,e,t,r){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=i,this.video.height=e,this.video.frameRate=t,this.video.displaySurface=l.displaySurface,Pe.browserName()==="Safari"){let n=Number(Pe.browserVersion());n===16?(this.video.width={max:i},this.video.height={max:e}):n===17&&(delete this.video.width,delete this.video.height)}r&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:"exclude",controller:this.captureController})}},Ft=class Ft{constructor(){this._lockId=Math.round(Math.random()*99998)+1}busy(){if(Ft._lockId)throw T.log(E.ERROR,"change_device"),c.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");Ft._lockId=this._lockId}free(){Ft._lockId===this._lockId&&(Ft._lockId=0)}};Ft._lockId=0;var Tr=Ft;async function Ua(){Cr=!1,br=!1,Bt=null;let a={camera:Pe.getSavedCamera(),microphone:Pe.getSavedMicrophone(),output:Pe.getSavedOutput()};await Un(),ec("devicechange",a),I.onDeviceChange()}function ec(a,...i){if(ut[a])for(let e of ut[a])e(...i)}async function Un(){return Bt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!pr&&navigator.mediaDevices.addEventListener&&(pr=v.debounce(Ua,l.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",pr)),!_r&&Di.isSupported()&&(_r=new Di,await _r.init((a,i)=>{switch(i){case"denied":case"prompt":pr?.();break}})),Bt=navigator.mediaDevices.enumerateDevices().then(a=>{vr=a.filter(r=>r.kind==="videoinput"?(r.label&&(br=!0),!0):!1),Ir=a.filter(r=>r.kind==="audioinput"?(r.label?Cr=!0:Pe.isMobile()&&Pe.browserName()==="Firefox"&&(Cr=br),!0):!1),Sr=a.filter(r=>r.kind==="audiooutput");let i=Qe?.deviceId??It.get("videoinput"),e=Xe?.deviceId??It.get("audioinput"),t=Er?.deviceId??It.get("audiooutput");return Qe=vr.find(r=>r.deviceId===i)||null,Xe=Ir.find(r=>r.deviceId===e)||null,Er=Sr.find(r=>r.deviceId===t)||Sr[0]||null,Bt=Promise.resolve(a),a}).catch(()=>(Bt=null,[]))))}function tc(a){if(Qe&&Xe)return;let i=(e,t)=>{let r=t.getSettings()?.deviceId;return e.find(n=>n.deviceId===r||n.label===t.label)||null};a?.getTracks().forEach(e=>{!Xe&&e.kind==="audio"?Xe=i(Pe.getMicrophones(),e):!Qe&&e.kind==="video"&&(Qe=i(Pe.getCameras(),e))})}async function ki(a,i){c.debug("Try to get media",JSON.parse(JSON.stringify(a.getNative())));let e=(!a.isVideo()||Pe.hasCameraPermission())&&(!a.isAudio()||Pe.hasMicrophonePermission());!e&&!i&&I.onPermissionsRequested();let t=new Tr;try{t.busy();let r=await navigator.mediaDevices.getUserMedia(a.getNative());return t.free(),e||await Ua(),tc(r),r}catch(r){switch(t.free(),c.error("getUserMedia error",r),r.name){case"PermissionDeniedError":case"PermissionDismissedError":case"NotAllowedError":case"SecurityError":case"DOMException":case"NotFoundError":i=a.isVideoRequested()?ne.CAMERA_PERMISSION:ne.MIC_PERMISSION;break;case"OverconstrainedError":i=ne.OVERCONSTRAINED;break;case"TypeError":i=ne.UNKNOWN;break;case"AbortError":case"NotReadableError":i=a.isVideoRequested()?ne.CAMERA_ACCESS:ne.MIC_ACCESS;break;case"Error":if(r.message==="MediaSource is busy"){i=a.isVideoRequested()?ne.CAMERA_ACCESS:ne.MIC_ACCESS;break}}if(a.canSimplify())return ki(a.simplify(),i);let n=i||ne.UNKNOWN;throw I.onPermissionsError(n,r),n}}async function ic(a){c.debug("Try to get screen",JSON.parse(JSON.stringify(a.getNative())));let i=new Tr;try{i.busy();let e=await navigator.mediaDevices.getDisplayMedia(a.getNative()),t=e?.getVideoTracks()[0];if(t){let r=t.getSettings()?.displaySurface;if(c.debug(`Got display media track: ${t.id} (${r})`),t.contentHint="text",a.captureController&&(r==="browser"||r==="window"))try{a.captureController.setFocusBehavior("no-focus-change")}catch(n){c.warn("Failed to set focus behavior",n)}}return e}catch(e){switch(e.name){case"PermissionDeniedError":case"NotAllowedError":case"SecurityError":throw ne.SCREEN_PERMISSION;default:throw ne.SCREEN_ACCESS}}finally{i.free()}}function gr(){return mr.length||(mr=(()=>{let a,i=!1,e=0,t="0",r=We.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(r[1]))return a=/\brv[ :]+(\d+)/g.exec(We),["IE",a&&a[1]||"Unknown",i,e,t];if(r[1]==="Safari"){if(a=We.match(/\bEdge\/(\d+)/),a)return["Edge",a[1]||"Unknown",i,e,t];if(a=We.match(/\bCriOS\/(\d+)/),a)return["Chrome",a[1],!0,Number(a[1]),t];if(a=We.match(/\bFxiOS\/(\d+)/),a)return["Firefox",a[1],!1,e,t];if(a=We.match(/\bYaBrowser\/(\d+)/),a)return["Yandex",a[1],!1,e,t];if(a=We.match(/\bOPT\/(\d+)/),a)return["Opera",a[1],!1,e,t]}if(r[1]==="Chrome"){if(i=!0,e=Number(r[2]),a=We.match(/\bOPR\/(\d+)/),a)return["Opera",a[1]||"Unknown",i,e,t];if(a=We.match(/\bYaBrowser\/(\d+)/),a)return["Yandex",a[1]||"Unknown",i,e,t];if(a=We.match(/\bSferum\/((\d+)(?:\.\d+)*)/),a)return["Sferum",a[1]||"Unknown",i,e,t];if(a=We.match(/\bEdge?\/(\d+)/),a)return["Edge",a[1]||"Unknown",i,e,t];if(typeof window.opr<"u"&&/^(.+\.)?ok.ru$/.test(window.location.host))return["Opera","Hidden",i,e,t]}return a=We.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),a&&a[2]!==void 0&&(t=a[2]),[r[2]?r[1]:Zo,a&&a[1]||r[2]||La,i,e,t]})()),mr}var Pe;(he=>{async function a(){if(Bt)return;let V=()=>{he.getSilentMediaTrack(),document.removeEventListener("click",V),document.removeEventListener("touchstart",V)};document.addEventListener("click",V),document.addEventListener("touchstart",V),await Un()}he.init=a;function i(){return vr}he.getCameras=i;function e(){return Ir}he.getMicrophones=e;function t(){return Sr}he.getOutput=t;function r(){return vr.length>0}he.hasCamera=r;function n(){return Ir.length>0}he.hasMicrophone=n;function s(){return Qe}he.getSavedCamera=s;function o(){return Xe}he.getSavedMicrophone=o;function d(){return Er}he.getSavedOutput=d;function p(){return l.videoFacingMode}he.getVideoFacingMode=p;function u(){return br}he.hasCameraPermission=u;function h(){return Cr}he.hasMicrophonePermission=h;function _(){return _r?.getPermissionState("microphone")??null}he.getMicrophonePermissionState=_;function C(V=!1){return h()?r()&&V?u():!0:!1}he.hasPermissions=C;async function P(V=!1,ie=!0,se=!0){let me=n()&&ie,pt=r()&&V,$e;if(!me&&!pt)$e=new MediaStream;else try{$e=await ki(new Vt(me,pt))}catch{$e=new MediaStream}return!$e.getVideoTracks().length&&se&&$e.addTrack(he.getBlackMediaTrack()),!$e.getAudioTracks().length&&se&&$e.addTrack(he.getSilentMediaTrack()),$e}he.getUserMedia=P;async function B(V,ie){let se=V?l.fastScreenShareWidth:window.screen.width,me=V?l.fastScreenShareHeight:window.screen.height,pt=l.getScreenFrameRate(V);return ic(new Ln(se,me,pt,ie))}he.getScreenMedia=B;async function W(V=!1,ie){let se=V?l.videoEffectMaxWidth:l.videoMaxWidth,me=V?l.videoEffectMaxHeight:l.videoMaxHeight;return ki(new Vt(!1,!0,se,me,ie))}he._getUserVideo=W;async function X(V,ie){let se=ie?.width||l.videoMaxWidth,me=ie?.height||l.videoMaxHeight;return ki(new Vt(!1,V||!0,se,me))}he.getUserVideo=X;async function fe(V){return ki(new Vt(V||!0,!1))}he.getUserAudio=fe;async function Oe(V,ie){let[se]=V.getVideoTracks();if(!se)throw new Error("Video track not found in stream");return or(se,ie)}he.setResolution=Oe;async function J(V,ie){let me=(await Un()).find(pt=>pt.kind===V&&pt.deviceId===ie);return me?(V==="videoinput"?Qe=me:V==="audioinput"?Xe=me:V==="audiooutput"&&(Er=me),It.set(V,ie),me):null}he._saveDeviceId=J;function Ae(){if(!hr||hr.readyState==="ended"){let V=he.getAudioContext(),ie=V.createMediaStreamDestination(),se=V.createGain();se.gain.value=1e-5,se.connect(ie),se.connect(V.destination);let me=V.createOscillator();me.type="sine",me.frequency.value=0,me.connect(se),me.start(),hr=ie.stream.getAudioTracks()[0]}return Object.assign(hr.clone(),{enabled:!1})}he.getSilentMediaTrack=Ae;function be(V=l.videoMinWidth,ie=l.videoMinHeight){ni||(ni=document.createElement("canvas")),ni.width=V,ni.height=ie;let se=ni.getContext("2d");return se.rect(0,0,V,ie),se.fillStyle="black",se.fill(),(!ur||ur.readyState==="ended")&&(ur=ni.captureStream(l.videoFrameRate).getVideoTracks()[0]),Object.assign(ur.clone(),{enabled:!1})}he.getBlackMediaTrack=be;function Rt(){if(Zi()==="Edge"&&Number(fn())<70)return!1;try{let V=window;return"mediaDevices"in V.navigator&&"getUserMedia"in V.navigator.mediaDevices&&V.RTCPeerConnection&&V.RTCIceCandidate&&V.RTCSessionDescription&&V.HTMLCanvasElement&&V.HTMLCanvasElement.prototype.captureStream&&V.RTCRtpSender&&V.RTCRtpSender.prototype.replaceTrack&&V.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}he.isBrowserSupported=Rt;function Si(){return!!navigator.mediaDevices.getDisplayMedia}he.isScreenCapturingSupported=Si;function Xi(){let V=he.browserName()==="Safari"&&he.browserVersion()==="15"&&he.browserSubVersion()==="1",ie=he.browserName()==="Opera",se=he.browserName()==="Yandex";return V||ie||se}he.isBrokenH264Decoder=Xi;function te(){return he.browserName()==="Yandex"&&he.os()==="Windows"||l.simulcast}he.isBrokenVP9Encoder=te;function vi(){return he.browserName()==="Safari"&&Number(he.browserVersion())===17&&[4,5,6].includes(Number(he.browserSubVersion()))}he.isBrokenVP9Decoder=vi;function ra(){return he.browserName()==="Firefox"&&Number(he.browserVersion())<60}he.isOldDataChannelDescription=ra;function na(){return!(he.baseChromeVersion()&&he.isMobile())}he.canPreferH264=na;function aa(){return!(he.browserName()==="Firefox"||he.browserName()==="Safari")}he.isSimulcastSupportedByBrowser=aa;function sa(){return Nn||(Nn=(()=>{let V={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let ie in V)if(V.hasOwnProperty(ie)&&V[ie].test(We))return ie;return"Unknown"})()),Nn}he.os=sa;function oa(){return On===null&&(On=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(La)),On}he.isMobile=oa;function Zi(){return gr()[0]}he.browserName=Zi;function fn(){return gr()[1]}he.browserVersion=fn;function ca(){return gr()[3]}he.baseChromeVersion=ca;function da(){return fr||(fr=new(window.AudioContext||window.webkitAudioContext)),fr.resume().catch(()=>{c.warn("Failed to resume AudioContext")}),fr}he.getAudioContext=da;function la(){return gr()[4]}he.browserSubVersion=la;function gn(){return he.baseChromeVersion()>=105&&!he.isMobile()}he.isAudioShareSupported=gn;function pa(V,ie){ut[V]||(ut[V]=[]),ut[V].push(ie)}he.addEventListener=pa;function q(V,ie){if(ut[V])if(!ie)delete ut[V];else{let se=ut[V].indexOf(ie);se>-1&&ut[V].splice(se,1)}}he.removeEventListener=q})(Pe||(Pe={}));var y=Pe;var qe=class qe{static get startTime(){return qe._list[0]?.t||0}static get endTime(){let i=qe._list;return i[i.length-1]?.t||0}static startSession(){qe._list=[]}static get conversationId(){return qe._conversationId}static set conversationId(i){qe._conversationId=i}static add(i){qe._list.push(i)}static _createContextLogs(){let i=[[`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(),r=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return i.map(n=>({h:r,t,l:"LOG",d:n}))}static collectLogs(){let i=qe._list;return i.length===0?[]:[...qe._createContextLogs(),...i]}};qe._list=[],qe._conversationId=null;var Be=qe;var Rr=class{constructor(){this._items=[]}get length(){return this._items.length}push(...i){this._items.push(...i)}merge(i){this._items.push(...i._items)}shift(){return this._items.shift()||null}bisect(){let i=this.length>1?Math.floor(this.length/2):1;this._items=this._items.slice(i)}head(){return this._items[0]||null}tail(){let i=this._items.length;return i?this._items[i-1]:null}clear(){this._items=[]}toString(){return this._items.length?JSON.stringify(this._items,(i,e)=>e instanceof Error?String(e):e):""}};var Bn=2*1024*1024,Ba=512*1024,ai=100*1024,rc=5,Vn="_okcls_logs_session_",nc=3e4,jn=class{constructor(){this._items=[];this._itemsSize=0;this._storageSize=Bn;try{let i=window.localStorage;for(let e of Object.keys(i)){if(e.indexOf(Vn)!==0)continue;let t=i.getItem(e);if(!t){Fa(e);continue}let r=ja(t);this.add(e,r)}}catch(i){console.error("Storage is blocked",i),this._storageSize=0}this._items.sort((i,e)=>i.date-e.date),this.cleanup(ai)}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(i){this._storageSize=Math.min(i,this._storageSize,Bn)}add(i,e){let t=parseInt(i.replace(Vn,""),10);this._itemsSize+=e,this._items.push({key:i,size:e,date:t})}deleteOldestItem(){let i=this._items.shift();i&&(Fa(i.key),this._itemsSize-=i.size)}cleanup(i){for(;this.length&&(this.size>Bn||this.length>rc-1||this.size+i>this.available);)this.deleteOldestItem()}};function Va(){return`${Vn}${Date.now()}`}function ja(a){return new Blob([a]).size}function Fa(a){try{window.localStorage.removeItem(a)}catch(i){console.error("Failed to remove log from storage",i)}}function yr(){let a=Et.toString();if(!Ne.available||!a)return;let i=ja(a);if(i>Ba){Et.bisect(),yr();return}Ne.cleanup(ai+i);try{window.localStorage.setItem(Pr,a)}catch(e){if(console.warn("Failed to write log to storage",e),Ne.storageSize=Ne.size+i,Ne.cleanup(ai+i),Ne.available>=ai+i){yr();return}if(i>ai){Et.bisect(),yr();return}Ne.storageSize=0;return}i>Ba&&(Ne.add(Pr,i),Pr=Va(),Et.clear(),Ne.cleanup(ai))}function Wn(){!Ne.available||!Et.length||yr()}function ac(a=!1){let i=[];try{let r=window.localStorage;for(let s of Ne.items){let o=r.getItem(s.key);i.push(o)}let n=Et.toString();n&&i.push(n)}catch(r){console.error("Storage is blocked",r)}let e=`[${i.join(",")}]`;if(a)return e;let t=`logs_${Date.now()}.json`;return sc(e,t),t}function sc(a,i){let e=document.createElement("a"),t=new Blob([a],{type:"text/json"});e.href=URL.createObjectURL(t),e.download=i,e.click()}function Wa(a,i){if(!Ne.available)return;let e=new Date,t={t:e.getTime(),l:a,d:i,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};Et.push(t),Be.add(t),Fn||(Fn=window.setTimeout(()=>{Fn=null,Wn()},nc))}function Gn(){Ne||(Ne=new jn,Et=new Rr,Pr=Va(),window.addEventListener("beforeunload",Wn))}var Ne,Et,Pr,Fn=null;window.__VKCallsSDKLogs__=(a=!1)=>(Ne||Gn(),Wn(),ac(a));var qn=(r=>(r.DEBUG="DEBUG",r.LOG="LOG",r.WARN="WARN",r.ERROR="ERROR",r))(qn||{}),Hn;(J=>{let a="📞",i=(Ae,...be)=>{I.onDebugMessage(Ae,...be)},e=!1,t=(Ae,be)=>(...Rt)=>{Ae(...Rt),Wa(be,Rt)},r=console.debug.bind(console,a),n=console.log.bind(console,a),s=console.warn.bind(console,a),o=console.error.bind(console,a),d=i.bind(null,"DEBUG"),p=i.bind(null,"LOG"),u=i.bind(null,"WARN"),h=i.bind(null,"ERROR");J.debug=d,J.log=p,J.warn=u,J.error=h;function W(){return e}J.enabled=W;function X(Ae){e=Ae,l.debugLog&&Gn(),Ae?(J.debug=l.debugLog?t(r,"DEBUG"):r,J.log=l.debugLog?t(n,"LOG"):n,J.warn=l.debugLog?t(s,"WARN"):s,J.error=l.debugLog?t(o,"ERROR"):o):(J.debug=l.debugLog?t(d,"DEBUG"):d,J.log=l.debugLog?t(p,"LOG"):p,J.warn=l.debugLog?t(u,"WARN"):u,J.error=l.debugLog?t(h,"ERROR"):h)}J.toggle=X;function fe(Ae,...be){switch(Ae){case"DEBUG":(0,J.debug)(...be);break;case"LOG":(0,J.log)(...be);break;case"WARN":(0,J.warn)(...be);break;case"ERROR":(0,J.error)(...be);break}}J.send=fe;function Oe(Ae,...be){}J.test=Oe})(Hn||(Hn={}));var c=Hn;var cc="kf";function si(a){return a.stopStream}function Kn(a){return a.keyFrameRequested}function Ga(a){if(si(a))return"ss";if(Kn(a))return cc;let i="";return a.priority!==void 0&&(i+="p="+a.priority),a.width!==void 0&&a.height!==void 0&&(i!==""&&(i+=":"),i+="sz="+Math.round(a.width)+"x"+Math.round(a.height)),a.fit!==void 0&&(i!==""&&(i+=":"),i+="fit="+a.fit),i}var oi=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(oi||{}),Ha="s",qa="m";function at(a){return a.participantId+(a.mediaType?Yt+Ha+a.mediaType:"")+(a.streamName?Yt+qa+a.streamName:"")}function xi(a){let i=a.split(Yt),e=i.shift();if(!e)throw new Error("Illegal stream description: "+a);let t=null,r,n=0;for(let o of i)switch(o.charAt(0)){case Ha:t=dc(o.slice(1));break;case qa:r=o.slice(1);break;case rr:n=Number.parseInt(o.slice(1),10);break;default:throw new Error("Unexpected parameter type "+o.charAt(0)+" in stream description "+a)}return{participantId:v.compose(e,n),mediaType:t,streamName:r}}function dc(a){for(let i of Object.keys(oi))if(i===a)return oi[i];return null}function st(){let a=new DataView(new ArrayBuffer(64)),i=0;function e(t){if(i+t>a.byteLength){let r=new Uint8Array(Math.max(i+t,a.byteLength+64));r.set(new Uint8Array(a.buffer.slice(0,i))),a=new DataView(r.buffer)}}return{put(t){if(e(t.byteLength),lc(t)){let r=t.buffer;new Uint8Array(a.buffer).set(new Uint8Array(r),i)}else new Uint8Array(a.buffer).set(new Uint8Array(t),i);i+=t.byteLength},putI8(t){e(1),a.setInt8(i,t),++i},putI16(t){e(2),a.setInt16(i,t),i+=2},putI32(t){e(4),a.setInt32(i,t),i+=4},putI64(t){e(8);let r=t<0;r&&(t=-t);let n=t/4294967296|0,s=t%4294967296|0;r&&(s=~s+1|0,n=s===0?~n+1|0:~n),a.setUint32(i,n),a.setUint32(i+4,s),i+=8},putUi8(t){e(1),a.setUint8(i,t),++i},putUi16(t){e(2),a.setUint16(i,t),i+=2},putUi32(t){e(4),a.setUint32(i,t),i+=4},putUi64(t){e(8),a.setUint32(i,t/4294967296|0),a.setUint32(i+4,t%4294967296),i+=8},putF(t){e(8),a.setFloat64(i,t),i+=8},ui8array(){return new Uint8Array(a.buffer.slice(0,i))}}}function lc(a){return a.buffer!==void 0}function wr(a){let i=ArrayBuffer.isView(a)?new DataView(a.buffer,a.byteOffset,a.byteLength):new DataView(a),e=0;return{peek(){return i.getUint8(e)},get(t){e+=t;let r=i.byteOffset;return i.buffer.slice(r+e-t,r+e)},getI8(){return i.getInt8(e++)},getI16(){return e+=2,i.getInt16(e-2)},getI32(){return e+=4,i.getInt32(e-4)},getI64(){e+=8;let t=i.getInt32(e-8),r=i.getUint32(e-4);return t*4294967296+r},getUi8(){return i.getUint8(e++)},getUi16(){return e+=2,i.getUint16(e-2)},getUi32(){return e+=4,i.getUint32(e-4)},getUi64(){e+=8;let t=i.getUint32(e-8),r=i.getUint32(e-4);return t*4294967296+r},getF32(){return e+=4,i.getFloat32(e-4)},getF64(){return e+=8,i.getFloat64(e-8)}}}var Ka=0,$a=1,pc=2,uc=3,hc=4,mc=5,fc=6,gc=7,_c=0,Sc=1,vc=2,ht=0,Ic=0,Ec=0,bc=1,Mr=class{constructor(){this.participantIdRegistry=null}setParticipantIdRegistry(i){this.participantIdRegistry=i}serializeUpdateDisplayLayout(i,e){let t=st();N.Int.enc(t,Ka),N.Int.enc(t,ht),N.Int.enc(t,i),N.Nil.enc(t,null);let r=[];for(let n in e)e.hasOwnProperty(n)&&this.writeLayout(e,n,r);return N.Arr.enc(t,r),N.Nil.enc(t,null),t.ui8array()}writeLayout(i,e,t){let r=i[e],n=st();if(this.writeStreamDesc(e,n),si(r))N.Int.enc(n,Sc);else if(Kn(r))N.Int.enc(n,vc);else if(N.Int.enc(n,_c),r.priority!==void 0?N.Int.enc(n,r.priority):N.Nil.enc(n,null),r.width!==void 0&&r.height!==void 0?(N.Int.enc(n,Math.round(r.width)),N.Int.enc(n,Math.round(r.height))):(N.Nil.enc(n,null),N.Nil.enc(n,null)),r.fit!==void 0)switch(r.fit){case"cv":N.Int.enc(n,Ec);break;case"cn":N.Int.enc(n,bc);break;default:N.Nil.enc(n,null)}else N.Nil.enc(n,null);t.push(n.ui8array())}writeStreamDesc(i,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(i);if(t!==void 0){N.Int.enc(e,t);return}}N.Str.enc(e,i)}serializePerfStatReport(i,e){let t=st();return N.Int.enc(t,$a),N.Int.enc(t,ht),N.Int.enc(t,i),N.Int.enc(t,e.framesDecoded),N.Int.enc(t,e.framesReceived),t.ui8array()}serializeSharingStatReport(i,e){let t=st();return N.Int.enc(t,pc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Int.enc(t,e.minDelay),N.Int.enc(t,e.maxDelay),N.Int.enc(t,e.avgDelay),N.Int.enc(t,e.largeDelayDuration),t.ui8array()}serializeRequestAsr(i,e){let t=st();return N.Int.enc(t,uc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Bool.enc(t,e.request),t.ui8array()}serializeNetworkStatReport(i,e){let t=st();return N.Int.enc(t,hc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Int.enc(t,e.timestamp),N.Int.enc(t,e.sendBitrate),t.ui8array()}serializeEnableVideoSuspend(i,e){let t=st();return N.Int.enc(t,mc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Bool.enc(t,e.enabled),t.ui8array()}serializeEnableVideoSuspendSuggest(i,e){let t=st();return N.Int.enc(t,fc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Bool.enc(t,e.enabled),t.ui8array()}serializeChangeSimulcast(i,e){let t=st();N.Int.enc(t,gc),N.Int.enc(t,ht),N.Int.enc(t,i);let r=e.simulcastInfo.streams.length;N.Int.enc(t,e.mediaSource),N.Int.enc(t,r);for(let n of e.simulcastInfo.streams)N.Str.enc(t,n.rid),N.Int.enc(t,n.width),N.Int.enc(t,n.height),N.Int.enc(t,n.fps),N.Int.enc(t,n.bitrate/1e3);return t.ui8array()}async deserializeCommandResponse(i){let e;if(i instanceof Blob){let s="arrayBuffer"in Blob.prototype?await i.arrayBuffer():await Ra(i);e=wr(s)}else e=wr(i);let t=N.Int.dec(e),r=N.Int.dec(e);if(r!==ht){c.warn("Unsupported version for command type: "+t+", version "+r);return}if(N.Int.dec(e)!==Ic){c.warn("Error code: "+t+"received for command type: "+t+", version "+r);return}switch(t){case Ka:return this.deserializeUpdateDisplayLayoutResponse(e);case $a:return this.deserializeReportPerfStatResponse(e);default:c.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(i){let e=N.Int.dec(i),t=N.Arr.dec(i),r={};return t.forEach(n=>{let s=wr(n),o=N.Any.dec(s);if(typeof o=="string")r[o]=N.Int.dec(s);else{let d=o,p=at(this.participantIdRegistry?.getStreamDescription(d));r[p]=N.Int.dec(s)}}),{type:"response",sequence:e,response:O.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:r}}deserializeReportPerfStatResponse(i){let e=N.Int.dec(i),t=N.Int.dec(i);return{type:"response",sequence:e,response:O.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var za=(r=>(r.START="start",r.ACCEPT="accept",r.JOIN="join",r.RETRY="retry",r))(za||{}),ot=za;var Ja=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(Ja||{}),De=Ja;var Ya=(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))(Ya||{}),L=Ya;var Ar=class{constructor(i,e){if(!i)throw new Error("no URL supplied");let t=new URL(i);if(t.protocol!=="https:")throw new Error("URL is not supported for webtransport");let r=t.hostname,n=t.port;n===""&&(n="443");let{sessionint:s,client:o}=this.createClient({host:r,port:n,...e});this.ready=s.ready,this.closed=s.closed,this.draining=s.draining,this.datagrams=s.datagrams,this.incomingBidirectionalStreams=s.incomingBidirectionalStreams,this.incomingUnidirectionalStreams=s.incomingUnidirectionalStreams,this.sessionint=s,this.startUpConnection({client:o,sessionint:s,ourl:t})}createClient(i){throw new Error("Implement createClient")}startUpConnection({client:i,sessionint:e,ourl:t}){throw new Error("Implement startUpConnection")}get reliability(){let i=this.sessionint;if(!i)throw new Error("Http3WTSession was undefined");return i.reliability}get congestionControl(){let i=this.sessionint;if(!i)throw new Error("Http3WTSession was undefined");return i.congestionControl}get supportsReliableOnly(){throw new Error("Implement supportsReliableOnly")}getStats(){let i=this.sessionint;if(!i)throw new Error("Http3WTSession was undefined");return i.getStats()}close(i){let e=this.sessionint;if(!e)throw new Error("Http3WTSession was undefined");return e.close(i)}createBidirectionalStream(i){let e=this.sessionint;if(!e)throw new Error("Http3WTSession was undefined");return e.createBidirectionalStream(i)}createUnidirectionalStream(i){let e=this.sessionint;if(!e)throw new Error("Http3WTSession was undefined");return e.createUnidirectionalStream(i)}get protocol(){let i=this.sessionint;if(i)return i.protocol}};var ci=globalThis.ReadableStream,Dr=globalThis.WritableStream;var Or=Jt(ts(),1);function _e(a){let i=!!(typeof process>"u"||process.env.DEBUG_TRACE);return Object.assign((0,Or.default)(a),{error:(0,Or.default)(`${a}:error`),trace:i?(0,Or.default)(`${a}:trace`):()=>{}})}var ve=class extends Error{constructor(i){super(i),this.name=this[Symbol.toStringTag]="WebTransportError"}};var is=!0;try{let a=new ReadableStream({start:i=>{},type:"bytes"})}catch{is=!1}var Nr=is;var Nc=typeof process<"u"?process.pid:0,Ze=_e(`webtransport:http3wtstream(${Nc})`),Lr=class{constructor(i){if(this.objint=i.object,this.objint.jsobj=this,this.parentobj=i.parentobj,this.transport=i.transport,this.bidirectional=i.bidirectional,this.incoming=i.incoming,this.closed=!1,this._sendGroup=i.sendGroup,this._sendOrder=i.sendOrder,this.objint.sendInitialParameters&&this.objint.sendInitialParameters(),this.pendingoperation=null,this.pendingres=null,this.readable,this.writable,this.pendingoperationRead=null,this.pendingresRead=null,this.bidirectional||this.incoming){let e={start:t=>{this.readableController=t,this.objint.startReading()},pull:async t=>{if(this.readableclosed)return Promise.resolve();this.pendingoperationRead=new Promise((r,n)=>{this.pendingresRead=r}),this.objint.startReading(),await this.pendingoperationRead},cancel:t=>{let r=new Promise((s,o)=>{this.cancelres=s}),n=0;return t&&t.code&&(t.code<0?n=0:t.code>255?n=255:n=t.code),this.readableclosed=!0,this.objint.stopSending(n),r},type:"bytes",autoAllocateChunkSize:4096};Nr||delete e.type,this.readable=new ci(e),this.readable.getStats=()=>Promise.resolve({timestamp:0,bytesReceived:0n,bytesRead:0n}),this.parentobj.addReceiveStream(this.readable,this.readableController)}(this.bidirectional||!this.incoming)&&(this.writable=new Dr({start:e=>{this.writableController=e},write:(e,t)=>{if(this.writableclosed)return Promise.resolve();let r=e;if(r instanceof ArrayBuffer&&(r=new Uint8Array(r)),r instanceof Uint8Array)return r.byteLength===0?void 0:(this.pendingoperation=new Promise((n,s)=>{this.pendingres=n}),this.objint.writeChunk(r),this.pendingoperation);throw Ze.trace("chunk info:",e),new Error("chunk is not of instanceof Uint8Array or Arraybuffer")},close:()=>this.writableclosed?Promise.resolve():(this.objint.streamFinal(),this.pendingoperation=new Promise((e,t)=>{this.pendingres=e}),this.pendingoperation),abort:e=>{if(this.writableclosed)return new Promise((n,s)=>{n()});let t=0;e&&e.code&&(e.code<0?t=0:e.code>255?t=255:t=e.code);let r=new Promise((n,s)=>{this.abortres=n});return this.objint.resetStream(t),r}},{highWaterMark:4}),this.writable.getStats=()=>Promise.resolve({timestamp:0,bytesWritten:0n,bytesSent:0n,bytesAcknowledged:0n}),Object.defineProperties(this.writable,{sendOrder:{get:()=>this._sendOrder,set:e=>{e!==this._sendOrder&&(this._sendOrder=i.sendOrder,this.updateSendOrderAndGroup())}},sendGroup:{get:()=>this._sendGroup,set:e=>{e!==this._sendGroup&&(this._sendGroup=e,this.updateSendOrderAndGroup())}}}),this.parentobj.addSendStream(this.writable,this.writableController)),this.cancelres=null,this.pendingres=null,this.abortres=null,this.finaldrain_=!1}getReadBuffer({byteSize:i}){let e=this.readableController.byobRequest;if(e){let t=e?.view;if(!(t instanceof Uint8Array))throw new Error("byob view is not a Uint8Array");return{buffer:t,byob:e,readBytes:0,fin:!1}}else return{buffer:new Uint8Array(i),byob:void 0,readBytes:0,fin:!1}}commitReadBuffer({buffer:i,byob:e,drained:t,readBytes:r,fin:n}){this.readableclosed||(e&&r!==void 0?e.respond(r):i&&this.readableController.enqueue(i));let s={};if(r!==void 0&&r>0&&!this.readableclosed&&(Ze.trace("commitReadbuffer",r),this.pendingoperationRead&&t)){this.readableController.desiredSize!=null&&!this.finaldrain_&&this.readableController.desiredSize<0&&(s.stopReading=!0);let o=this.pendingresRead;this.pendingoperationRead=null,this.pendingresRead=null,o&&o()}if(n){if(this.cancelres){let o=this.cancelres;this.cancelres=null,o()}this.readableclosed||(this.readableController.close(),this.readableclosed=!0)}return s}updateSendOrderAndGroup(){this.objint.updateSendOrderAndGroup({sendOrder:this._sendOrder,sendGroupId:this._sendGroup._sendGroupId})}onStreamRecvSignal(i){Ze("callback",i?.nettask),Ze.trace("onStreamRecvSignal",i);let e=!0,t=this.parentobj.state;switch((t==="closed"||t==="failed")&&(Ze("no parent cleanup as parent was closed or failed"),e=!1),i.nettask){case"resetStream":this.readable?(this.finalDrain(),e&&this.parentobj.removeReceiveStream(this.readable,this.readableController),this.readableclosed=!0,this.readableController.error(new ve("Resetstream with code:"+(i.code||0)))):Ze.error("resetStream without readable");break;case"stopSending":this.writable?(e&&this.parentobj.removeSendStream(this.writable,this.writableController),this.writableclosed=!0,this.writableController.error(new ve("StopSending with code:"+(i.code||0)))):Ze.error("stopSending without writable");break;default:Ze.error("unhandled onStreamRecvSignal")}if(this.pendingoperation){let r=this.pendingres;this.pendingoperation=null,this.pendingres=null,r?.()}if(this.pendingoperationRead){let r=this.pendingresRead;this.pendingoperationRead=null,this.pendingresRead=null,r?.()}}finalDrain(){this.finaldrain_=!0,this.objint.drainReads()}onStreamWrite(i){if(this.pendingoperation){let e=this.pendingres;this.pendingoperation=null,this.pendingres=null,e?.()}}onStreamNetworkFinish(i){switch(Ze("callback",i?.nettask),Ze.trace("networkfinish args",i),i.nettask){case"stopSending":if(this.cancelres){let e=this.cancelres;this.cancelres=null,e()}this.stopSendingRecv=!0;break;case"resetStream":if(this.abortres){let e=this.abortres;this.abortres=null,e(),this.readable&&this.parentobj.removeReceiveStream(this.readable,this.readableController),this.writable&&this.parentobj.removeSendStream(this.writable,this.writableController),this.readableclosed=!0,this.parentobj.removeStreamObj(this)}break;case"streamFinal":if(this.pendingoperation){let e=this.pendingres;this.pendingoperation=null,this.pendingres=null,e?.()}break;default:Ze.error("onStreamNetworkFinish unknown task",i.nettask)}}};var rs=typeof process<"u"?process.pid:0,Oi=_e(`webtransport:httpwtsession(${rs})`),Ur=class{constructor(i){i.object&&(this.objint=i.object,this.objint.jsobj=this,this.objint.sendInitialParameters&&this.objint.sendInitialParameters()),this.parentobj=i.parentobj,this.state="connecting",this.readyResolve=null,this.closeHook=null,this.header=i.header,this.userData=i.userData,this.peerAddress_=i.peerAddress,this.ready=new Promise((t,r)=>{this.readyResolve=t,this.readyReject=r}),this.reliability="pending",this.congestionControl="default",this.closed=new Promise((t,r)=>{this.closedResolve=t,this.closedReject=r}),this.draining=new Promise((t,r)=>{this.drainingResolve=t,this.drainingReject=r}),this.incomingBidirectionalStreams=new ci({start:t=>{this.incomBiDiController=t}}),this.incomingUnidirectionalStreams=new ci({start:t=>{this.incomUniDiController=t}});let e={start:t=>{this.incomDatagramController=t},type:"bytes"};Nr||delete e.type,this._lastGetMaxDatagramSize=0,this.datagrams={readable:new ci(e),createWritable:t=>{let r=t?.sendOrder??0n,n=t?.sendGroup,s=new Dr({start:o=>{this.outgoDatagramController=o},write:(o,d)=>{if(this.state==="closed")throw new Error("Session is closed");if(o instanceof Uint8Array){if(this.objint==null)throw new Error("this.objint is not set");let{code:p,message:u}=this.objint.writeDatagram(o);if(p!=="success"&&p!=="blocked"&&p!=="tooBig")throw new ve(p+":"+u)}else throw new Error("chunk is not of type Uint8Array")},close:()=>{}});return Object.defineProperties(s,{sendOrder:{get:()=>r,set:o=>{r=o}},sendGroup:{get:()=>n,set:o=>{o!==n&&(n=o)}}}),s},get writable(){return this.datagramwritablepolyfilled_||console.warn("datagrams.writable is deprecated"),this.datagramwritablepolyfilled_||(this.datagramwritablepolyfilled_=this.createWritable())},get maxDatagramSize(){return this._getMaxDatagramSize()},_getMaxDatagramSize:()=>(this.objint&&(this._lastGetMaxDatagramSize=this.objint.getMaxDatagramSize()),this._lastGetMaxDatagramSize)},this.resolveBiDi=[],this.resolveUniDi=[],this.rejectBiDi=[],this.rejectUniDi=[],this.resolveSessionStats=[],this.rejectSessionStats=[],this.resolveDatagramStats=[],this.rejectDatagramStats=[],this.sendStreams=new Set,this.receiveStreams=new Set,this.streamObjs=new Set,this.sendStreamsController=new Set,this.receiveStreamsController=new Set,this._sendGroupNum=1n,this._sendGroupIndex=new Map,this._selectedProtocol=void 0}setSessionObj(i,e){i&&(this.objint=i,this.objint.jsobj=this,this.reliable=!!e,this.objint.sendInitialParameters&&this.objint.sendInitialParameters())}get protocol(){return this._selectedProtocol}getStats(){if(this.objint==null)throw new Error("this.objint not set");let i=new Promise((e,t)=>{this.resolveSessionStats.push(e),this.rejectSessionStats.push(t)});return this.objint.orderSessionStats(),i}onSessionStats({timestamp:i,expiredOutgoing:e=BigInt(0),lostOutgoing:t=BigInt(0),minRtt:r=0,smoothedRtt:n=0,rttVariation:s=0,estimatedSendRateBps:o}){let d=this.resolveSessionStats.pop();this.rejectSessionStats.pop(),d&&d({timestamp:i,bytesSent:BigInt(0),packetsSent:BigInt(0),packetsLost:BigInt(0),numOutgoingStreamsCreated:0,numIncomingStreamsCreated:0,bytesReceived:BigInt(0),packetsReceived:BigInt(0),smoothedRtt:n,rttVariation:s,minRtt:r,estimatedSendRate:o,datagrams:{timestamp:i,expiredOutgoing:e,droppedIncoming:BigInt(0),lostOutgoing:t}})}onDatagramStats({timestamp:i,expiredOutgoing:e=BigInt(0),lostOutgoing:t=BigInt(0)}){let r=this.resolveDatagramStats.pop();this.rejectDatagramStats.pop(),r&&r({timestamp:i,expiredOutgoing:e,droppedIncoming:BigInt(0),lostOutgoing:t})}notifySessionDraining(){if(this.objint==null)throw new Error("this.objint not set");this.objint.notifySessionDraining()}addStreamObj(i){this.streamObjs.add(i)}removeStreamObj(i){this.streamObjs.delete(i)}addSendStream(i,e){this.sendStreams.add(i),this.sendStreamsController.add(e)}removeSendStream(i,e){this.sendStreams.delete(i),this.sendStreamsController.delete(e)}addReceiveStream(i,e){this.receiveStreams.add(i),this.receiveStreamsController.add(e)}removeReceiveStream(i,e){this.receiveStreams.delete(i),this.receiveStreamsController.delete(e)}createBidirectionalStream(i){if(this.objint==null)throw new Error("this.objint not set");let e=new Promise((r,n)=>{this.resolveBiDi.push(r),this.rejectBiDi.push(n)});if(!this.objint.orderBidiStream({sendGroup:i?.sendGroup||null,sendOrder:BigInt(i?.sendOrder||0n),waitUntilAvailable:i?.waitUntilAvailable||!1})){let r=this.rejectBiDi.pop();this.resolveBiDi.pop(),r&&r(new DOMException("No streams available","QuotaExceededError"))}return e}createUnidirectionalStream(i){if(this.objint==null)throw new Error("this.objint not set");let e=new Promise((r,n)=>{this.resolveUniDi.push(r),this.rejectUniDi.push(n)});if(!this.objint.orderUnidiStream({sendGroup:i?.sendGroup||null,sendOrder:i?.sendOrder||0n,waitUntilAvailable:i?.waitUntilAvailable||!1})){let r=this.rejectUniDi.pop();this.resolveUniDi.pop(),r&&r(new DOMException("No streams available","QuotaExceededError"))}return e}close(i){Oi("closeinfo",i),!(this.state==="closed"||this.state==="failed")&&this.objint&&this.objint.close({code:i?.closeCode??0,reason:i?.reason.substring(0,1023)??""})}createSendGroup(){if(this.state==="closed"||this.state==="failed")throw new Error("InvalidState");let i=this._sendGroupNum++,e={_sendGroupId:i,getStats:async()=>({bytesWritten:0n,bytesSent:0n,bytesAcknowledged:0n})};return this._sendGroupIndex.set(i,e),e}onReady({protocol:i}){i&&(this._selectedProtocol=i),this.state="connected",this.reliable?this.reliability="reliable-only":this.reliability="supports-unreliable",this.readyResolve&&this.readyResolve(),delete this.readyResolve}onClose(i){if(delete this.objint,this.state!=="connected"){Oi.error('session was closed before state was "connected" - it was "%s"',this.state),this.state="failed",this.closeHook&&(this.closeHook(),delete this.closeHook);let r=new ve("Opening handshake failed.");this.readyReject(r),this.closedReject(r);return}Oi("onClose"),this.streamObjs.forEach(r=>r.finalDrain());let e=new ve("Session closed");for(let r of this.rejectBiDi)r(e);for(let r of this.rejectUniDi)r(e);for(let r of this.rejectSessionStats)r(e);for(let r of this.rejectDatagramStats)r(e);this.resolveBiDi=[],this.resolveUniDi=[],this.rejectBiDi=[],this.rejectUniDi=[],this.resolveSessionStats=[],this.rejectSessionStats=[],this.resolveDatagramStats=[],this.rejectDatagramStats=[],this.incomBiDiController.close(),this.incomUniDiController.close(),this.incomDatagramController.close(),this.state="closed";let t=new ve(`Session closed (on process ${rs}) with code `+i.errorcode+" and reason"+i.error);this.sendStreamsController.forEach(r=>r.error(t)),this.receiveStreamsController.forEach(r=>r.error(t)),this.streamObjs.forEach(r=>r.readableclosed=!0),this.sendStreams.clear(),this.receiveStreams.clear(),this.sendStreamsController.clear(),this.receiveStreamsController.clear(),this.streamObjs.clear(),this.closedResolve&&this.closedResolve({closeCode:i.errorcode,reason:i.error?i.error:""}),this.closeHook&&(this.closeHook(),delete this.closeHook)}onStream(i){let e=new Lr({object:i.stream,parentobj:this,transport:this.parentobj,bidirectional:i.bidirectional,incoming:i.incoming,sendGroup:this._sendGroupIndex.get(i.sendGroupId||0n),sendOrder:i.sendOrder});if(this.addStreamObj(e),i.incoming)i.bidirectional?this.incomBiDiController.enqueue(e):this.incomUniDiController.enqueue(e.readable);else if(i.bidirectional){if(this.resolveBiDi.length===0)throw new Error("Got bidirectional stream without asking for it");this.rejectBiDi.shift();let t=this.resolveBiDi.shift();t!=null&&e.readable!=null&&e.writable!=null&&t({readable:e.readable,writable:e.writable})}else{if(this.resolveUniDi.length===0)throw new Error("Got unidirectional stream without asking for it");this.rejectUniDi.shift();let t=this.resolveUniDi.shift();t!=null&&e.writable!=null&&t(e.writable)}}onDatagramReceived(i){if(Oi.trace("datagram received",i.datagram),i.datagram.byteLength===0){Oi.trace("zerolength datagram dropped");return}if(this.incomDatagramController.byobRequest){let e=this.incomDatagramController.byobRequest,t=e?.view;if(!(t instanceof Uint8Array))throw new Error("byob view is not a Uint8Array");if(t.byteLength<i.datagram.byteLength)throw new Error("supplied view is not large enough.");new Uint8Array(t.buffer,0+t.byteOffset,i.datagram.byteLength).set(i.datagram),e.respond(i.datagram.byteLength)}else this.incomDatagramController.enqueue(new Uint8Array(i.datagram))}onGoAwayReceived(i){this.drainingResolve&&this.drainingResolve(void 0),this.state="draining"}get peerAddress(){return this.peerAddress_}};var Lc=typeof process<"u"?process.pid:0,ns=_e(`webtransport:httpclient(${Lc})`),Br=class{constructor(i){this.args=i,this.sessionProm=null,this.sessionobj=new Promise((e,t)=>{this.sessionProm={resolve:e,reject:t}}).catch(()=>{}),this.sessionobjint=null,this.closeHookSession=this.closeHookSession.bind(this),this.webtransportProm=null,this.quicconnectedProm=null,this._quicConnectTimeout=i.quicConnectTimeout??8e3,this._webTransportConnectTimeout=i.webTransportConnectTimeout??2e3}async handleConnection({createTransport:i,path:e}){i&&this.createTransportInt({path:e}),this.quicconnected=new Promise((r,n)=>{this.quicconnectedProm={resolve:r,reject:n}}),this.webtransport=new Promise((r,n)=>{this.webtransportProm={resolve:r,reject:n}});let t=setTimeout(()=>{this.quicconnectedProm&&(ns.error("quic connection timeout"),this.quicconnectedProm.reject(new ve("Opening handshake failed.")),delete this.quicconnectedProm)},this._quicConnectTimeout);try{await this.quicconnected}finally{clearTimeout(t)}}async createWTSession(i,e){let t=setTimeout(()=>{this.webtransportProm&&(ns.error("webtransport connection timeout"),this.webtransportProm.reject(new ve("Opening handshake failed.")),delete this.webtransportProm)},this._webTransportConnectTimeout);await this.webtransport,clearTimeout(t),this.sessionobjint=i,this.transportInt.openWTSession(e);let r=await this.sessionobj;return delete this.sessionobj,r}closeHookSession(){this.transportInt!=null&&this.transportInt.closeClient(),this.stopped=!0}onClientError(i){this.sessionobjint!=null&&this.sessionobjint.onClose(i)}onClientConnected(i){if(this.transportIntSwitchToReliable=void 0,this.quicconnectedProm)i.success?this.quicconnectedProm.resolve():this.quicconnectedProm.reject(new ve("Opening handshake failed.")),delete this.quicconnectedProm;else if(i.success)throw new ve("Client connected with no pending promise")}onClientWebTransportSupport(i){this.webtransportProm&&(this.webtransportProm.resolve(),delete this.webtransportProm)}onHttpWTSessionVisitor(i){if(i.session&&this.sessionProm&&this.sessionobjint)this.sessionobjint.setSessionObj(i.session,!!i.reliable),i.session.jsobj.closeHook=this.closeHookSession,delete this.sessionobjint,this.sessionProm.resolve(i.session),delete this.sessionProm;else throw new ve("Http3WTSessionVisitor no object session or nor sessionprom")}createTransportInt(i){let e=i?.path;if(this.transportInt==null){try{if(this.args?.forceReliable||!this.args.createUnreliableClient)this.transportInt=this.args.createReliableClient(this);else if(this.transportInt=this.args.createUnreliableClient(this),!this.args?.requireUnreliable){let t=this.args;this.transportIntSwitchToReliable=()=>{this.transportInt!=null&&this.transportInt.closeClient(),this.transportInt=t.createReliableClient(this),this.transportInt.jsobj=this,this.transportInt.createTransport&&this.transportInt.createTransport({path:e}),this.transportIntSwitchToReliable=void 0}}}catch(t){let r=new ve("Opening handshake failed.");throw r.stack=t.stack,r}delete this.args,this.transportInt.jsobj=this,this.transportInt.createTransport&&this.transportInt.createTransport({path:e})}}};var Uc=typeof process<"u"?process.pid:0,ke=_e(`webtransport:flowcontroller(${Uc})`),Fr=class Fr{constructor({tocontrol:i,sendWindowOffset:e,receiveWindowOffset:t,receiveWindowSizeLimit:r,shouldAutoTuneReceiveWindow:n,sessionFlowController:s}){this.tocontrol=i,this.bytesSent=0n,this.sendWindowOffset=BigInt(e),this.bytesConsumed=0n,this.highestReceivedByteOffset=0n,this.receiveWindowOffset=BigInt(t),this.receiveWindowSize=BigInt(t),this.receiveWindowSizeLimit=BigInt(r),this.autoTuneReceiveWindow=n,this.sessionFlowController=s,this.lastBlockedSendWindowOffset=0n,this.prevWindowUpdateTime=void 0,ke("Created flow controller , setting initial receive window offset to: "+this.receiveWindowOffset+", max receive window to: "+this.receiveWindowSize+", max receive window limit to: "+this.receiveWindowSizeLimit+", setting send window offset to: "+this.sendWindowOffset)}addBytesConsumed(i){this.bytesConsumed+=BigInt(i),ke(" consumed "+i+" bytes."),this.maybeSendWindowUpdate()}updateHighestReceivedOffset(i){return ke(" highest byte offset increased from "+this.highestReceivedByteOffset," to ",this.highestReceivedByteOffset+BigInt(i)),this.highestReceivedByteOffset+=BigInt(i),!0}addBytesSent(i){let e=BigInt(i);if(this.bytesSent+e>this.sendWindowOffset){ke(" Trying to send an extra "+e+" bytes, when bytes_sent = "+this.bytesSent+", and send_window_offset_ = "+this.sendWindowOffset),this.bytesSent=this.sendWindowOffset,this.tocontrol.closeConnection({code:63,reason:this.sendWindowOffset-(this.bytesSent+e)+"bytes over send window offset"});return}this.bytesSent+=e,ke(" sent "+e+" bytes.")}flowControlViolation(){return this.highestReceivedByteOffset>this.receiveWindowOffset?(ke("Flow control violation on , receive window offset: "+this.receiveWindowOffset+", highest received byte offset: "+this.highestReceivedByteOffset),!0):!1}maybeIncreaseMaxWindowSize(){let i=Date.now(),e=this.prevWindowUpdateTime;if(this.prevWindowUpdateTime=i,!e){ke("first window update for ");return}if(!this.autoTuneReceiveWindow)return;let t=this.tocontrol.smoothedRtt();if(t===0){ke("rtt zero for ");return}let r=i-e,n=2*t;if(r>=n)return;let s=this.receiveWindowSize;this.increaseWindowSize(),this.receiveWindowSize>s?(ke("New max window increase for "+ +" after "+r+" us, and RTT is "+t+"us. max wndw: "+this.receiveWindowSize),this.sessionFlowController!==void 0&&this.sessionFlowController.ensureWindowAtLeast(BigInt(Fr.kSessionFlowControlMultiplier*Number(this.receiveWindowSize)))):ke("Max window at limit for after "+r+" us, and RTT is "+t+"us. Limit size: "+this.receiveWindowSize)}increaseWindowSize(){this.receiveWindowSize*=2n,this.receiveWindowSize=this.receiveWindowSize>this.receiveWindowSizeLimit?this.receiveWindowSizeLimit:this.receiveWindowSize}windowUpdateThreshold(){return this.receiveWindowSize/2n}maybeSendWindowUpdate(){if(!this.tocontrol.connected())return;let i=this.receiveWindowOffset-this.bytesConsumed,e=this.windowUpdateThreshold();if(this.prevWindowUpdateTime||(this.prevWindowUpdateTime=Date.now()),i>=e){ke("Not sending WindowUpdate for , available window: "+i+" >= threshold: "+e);return}this.maybeIncreaseMaxWindowSize(),this.updateReceiveWindowOffsetAndSendWindowUpdate(i)}updateReceiveWindowOffsetAndSendWindowUpdate(i){this.receiveWindowOffset+=this.receiveWindowSize-i,ke("Sending WindowUpdate frame for , consumed bytes: "+this.bytesConsumed+", available window: "+i+", and threshold: "+this.windowUpdateThreshold()+", and receive window size: "+this.receiveWindowSize+". New receive window offset is: "+this.receiveWindowOffset),this.sendWindowUpdate()}maybeSendBlocked(){this.sendWindowSize()!==0n||this.lastBlockedSendWindowOffset>=this.sendWindowOffset||(ke(" is flow control blocked. Send window: "+this.sendWindowSize()+", bytes sent: "+this.bytesSent+", send limit: "+this.sendWindowOffset),this.lastBlockedSendWindowOffset=this.sendWindowOffset,this.tocontrol.sendBlocked(this.lastBlockedSendWindowOffset))}updateSendWindowOffset(i){if(i<=this.sendWindowOffset)return!1;ke("UpdateSendWindowOffset for with new offset "+i+" current offset: "+this.sendWindowOffset+" bytes_sent: "+this.bytesSent);let e=this.isBlocked();return this.sendWindowOffset=i,e}ensureWindowAtLeast(i){if(this.receiveWindowSizeLimit>=i)return;let e=this.receiveWindowOffset-this.bytesConsumed;this.increaseWindowSize(),this.updateReceiveWindowOffsetAndSendWindowUpdate(e)}isBlocked(){return this.sendWindowSize()===0n}sendWindowSize(){return this.bytesSent>this.sendWindowOffset?0n:this.sendWindowOffset-this.bytesSent}updateReceiveWindowSize(i){if(ke("UpdateReceiveWindowSize for : "+i),this.receiveWindowSize!==this.receiveWindowOffset){ke("receive_window_size_:"+this.receiveWindowSize+" != receive_window_offset:"+this.receiveWindowOffset);return}this.receiveWindowSize=i,this.receiveWindowOffset=i}sendWindowUpdate(){this.tocontrol.sendWindowUpdate(this.receiveWindowOffset)}};le(Fr,"kSessionFlowControlMultiplier",1.5);var ui=Fr;var Bc=typeof process<"u"?process.pid:0,as=_e(`webtransport:http2webtransportstream(${Bc})`),Vr=a=>setTimeout(a,0);typeof process<"u"&&(Vr=process.nextTick);var jr=class{constructor({streamid:i,unidirectional:e,incoming:t,capsuleParser:r,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d,sessionFlowController:p,streamIdManager:u}){this.jsobj=void 0,this.streamid=i,this.incomdata=[],this.capsuleParser=r,this.outgochunks=[],this.flowController=new ui({tocontrol:this,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d,sessionFlowController:p}),this.sessionFlowController=p,this.streamIdManager=u,this.final=!1,this.finalmessagesend=!1,this.stopReading_=!0,this.drainReads_=!0,this.recvBytes=0,this.outgoingClosed_=!1,this.incomingClosed_=!1,e&&(t?this.outgoingClosed_=!0:this.incomingClosed_=!0)}sendInitialParameters(){this.flowController.sendWindowUpdate()}recvData({data:i,fin:e}){if(this.incomdata.push({data:i,fin:e}),i&&i?.byteLength>0){let t=this.flowController.updateHighestReceivedOffset(i?.byteLength);if(this.sessionFlowController.updateHighestReceivedOffset(i?.byteLength)&&t&&(this.flowController.flowControlViolation()||this.sessionFlowController.flowControlViolation())){this.closeConnection({code:63,reason:"Flow control violation after increasing offset"});return}}this.processRead(),this.incomdata.length>0&&(this.stopReading_||this.processRead())}processRead(){if(!this.jsobj)return;let i,e=0;for(;this.incomdata.length>0&&(!this.stopReading_||this.drainReads_);){i||this.incomdata.reduce((n,s)=>n+(s&&s.data?.byteLength||0),0)>0&&(i=this.jsobj.getReadBuffer({byteSize:this.incomdata.reduce((n,s)=>n+(s&&s.data?.byteLength||0),0)}),i.readBytes=0,e=0);let t=this.incomdata.shift();if(t?.data&&t.data.byteLength>0&&i&&i.buffer){let r=Math.min(i.buffer.byteLength-e,t.data.byteLength),n=new Uint8Array(t.data.buffer,t.data.byteOffset,r);if(new Uint8Array(i.buffer.buffer,e,r).set(n),e+=r,i.readBytes+=r,i.drained=!0,t.data.byteLength!==r?(i.drained=!1,this.incomdata.unshift({data:new Uint8Array(t.data.buffer,t.data.byteOffset+r,t.data.byteLength-r),fin:t.fin}),i.fin=!1):i.fin||(i.fin=t.fin),this.incomdata.length>0&&(i.drained=!1),e===i.buffer.byteLength||this.incomdata.length===0){this.flowController.addBytesConsumed(i.readBytes||0),this.sessionFlowController.addBytesConsumed(i.readBytes||0);let{stopReading:o}=this.jsobj.commitReadBuffer(i);o&&(this.stopReading_=!0),i=void 0,e=0}this.recvBytes+=r}else t?.fin&&this.jsobj.commitReadBuffer({fin:!0})}}startReading(){this.stopReading_=!1,this.processRead()}drainReads(){this.drainReads_=!0,this.stopReading_=!1,this.processRead()}stopReading(){this.stopReading_=!0}onStreamSignal(i){switch(i){case"resetStream":this.closeIncoming();break;case"stopSending":this.closeOutgoing();break}}closeIncoming(){this.incomingClosed_=!0,this.outgoingClosed_&&this.onClose()}closeOutgoing(){this.outgoingClosed_=!0,this.incomingClosed_&&this.onClose()}onClose(){this.streamIdManager.onStreamClosed(this.streamid)}stopSending(i){this.closeIncoming(),this.capsuleParser.writeCapsule({type:Y.WT_STOP_SENDING,headerVints:[this.streamid,i],payload:void 0}),Vr(()=>this.jsobj.onStreamNetworkFinish({nettask:"stopSending"}))}onFin(){this.closeIncoming()}resetStream(i){this.closeOutgoing(),this.capsuleParser.writeCapsule({type:Y.WT_RESET_STREAM,headerVints:[this.streamid,i],payload:void 0}),Vr(()=>this.jsobj.onStreamNetworkFinish({nettask:"resetStream"}))}writeChunk(i){this.outgochunks.push({buf:i,fin:!1}),this.capsuleParser.scheduler.Schedule(this.streamid),this.capsuleParser.scheduleDrainWrites()}hasPendingData(){return this.outgochunks.length>0}drainWrites(){let i=!1;for(;this.outgochunks.length>0&&(!this.capsuleParser.blocked||this.final||!this.capsuleParser.shouldYieldStream(this.streamid))&&this.flowController.sendWindowSize()>0n&&this.sessionFlowController.sendWindowSize()>0n;){let e=this.outgochunks.shift(),t=!0;if(e){let r=e.buf;if(r){if(r.byteLength===0&&!e.fin)throw new ve("Trying to send zero length capsule without a fin");let n=this.sessionFlowController.sendWindowSize(),s=this.flowController.sendWindowSize();if(r?.byteLength>s||r?.byteLength>n){let o=n>s?Number(s):Number(n);{let d=new Uint8Array(r.buffer,r.byteOffset+o,r.byteLength-o),p=new Uint8Array(r.byteLength-o);p.set(d),this.outgochunks.unshift({fin:e.fin,buf:p}),t=!1}e.fin=!1,r=e.buf=new Uint8Array(r.buffer,r.byteOffset,o)}}this.capsuleParser.writeCapsule({type:e?.fin?Y.WT_STREAM_WFIN:Y.WT_STREAM_WOFIN,headerVints:[this.streamid],payload:r}),i||(i=!!e?.fin),r&&(this.flowController.addBytesSent(r?.byteLength),this.sessionFlowController.addBytesSent(r?.byteLength))}t&&this.jsobj.onStreamWrite({success:!0})}if(i){this.capsuleParser.removeStream(this.streamid);return}!(!this.capsuleParser.blocked||this.final||!this.capsuleParser.shouldYieldStream(this.streamid))&&this.outgochunks.length>0&&this.capsuleParser.scheduleDrainWriteStream(this.streamid),this.final&&this.outgochunks.length===0&&!this.finalmessagesend&&(Vr(()=>{this.jsobj.onStreamNetworkFinish({nettask:"streamFinal"})}),this.finalmessagesend=!0)}streamFinal(){this.final=!0,this.outgochunks.push({fin:!0}),this.capsuleParser.scheduleDrainWriteStream(this.streamid),this.capsuleParser.scheduleDrainWrites()}updateSendOrderAndGroup({sendOrder:i,sendGroupId:e}){this.capsuleParser.streamUpdateSendOrderAndGroup(this.streamid,{sendOrder:i,sendGroupId:e})}sendWindowUpdate(i){as("sendwindow offset stream:",i),this.capsuleParser.writeCapsule({type:Y.WT_MAX_STREAM_DATA,headerVints:[this.streamid,i],payload:void 0})}sendBlocked(i){this.capsuleParser.writeCapsule({type:Y.WT_STREAM_DATA_BLOCKED,headerVints:[this.streamid,i],payload:void 0})}reportBlocked(i){as("Stream id: ",this.streamid," was blocked at:",i)}connected(){return this.jsobj.parentobj.state==="connected"}closeConnection({code:i,reason:e}){this.jsobj.parentobj?.objint&&this.jsobj.parentobj.objint.closeConnection({code:i,reason:e})}smoothedRtt(){if(this.jsobj.parentobj?.objint)return this.jsobj.parentobj.objint.smoothedRtt()}};function Ni(a){return a.toString()}function we(a){return a.toString()}var $n=class{constructor(i){this.priority=i,this.currentSequenceNumber=void 0}scheduled(){return typeof this.currentSequenceNumber<"u"}};function Fc(a,i){return a.priority>i.priority?-1:a.priority===i.priority?a.sequenceNumber>i.sequenceNumber?-1:a.sequenceNumber===i.sequenceNumber?0:1:1}function ss(a,i){return Fc(a.scheduleKey,i.scheduleKey)}var Wr=class a{constructor(){this.streams_={},this.schedule_=[],this.currentWriteSequenceNumber_=0}HasRegistered(){return Object.keys(this.streams_).length!==0}HasScheduled(){return Object.keys(this.schedule_).length!==0}NumScheduled(){return Object.keys(this.schedule_).length}NumRegistered(){return Object.keys(this.streams_).length}NumScheduledInPriorityRange(i,e){let t=typeof e<"u"?this.schedule_.findIndex(n=>n.scheduleKey.priority<=e):0;return(typeof i<"u"?this.schedule_.findIndex(n=>n.scheduleKey.priority>=i):this.schedule_.length)-t}ShouldYield(i){let e=this.streams_[we(i)];if(!e)throw new Error("ID not registered");if(this.schedule_.length===0)return!1;let t=this.schedule_[0];return a.StreamId(t)==i?!1:t.scheduleKey.priority>=e.priority}GetPriorityFor(i){let e=this.streams_[we(i)];if(e)return e.priority}PopFront(){if(this.schedule_.length===0)return;let i=this.schedule_[0];i.fullStreamEntry.streamEntry.currentSequenceNumber=void 0;let e=a.StreamId(i);return this.schedule_.shift(),e}Register(i,e){if(this.streams_[we(i)])throw new Error("ID already registered");this.streams_[we(i)]=new $n(e.sendOrder)}Unregister(i){let e=this.streams_[we(i)];if(!e)throw new Error("Stream not registered");e.scheduled()&&this.DescheduleStream(e),delete this.streams_[we(i)]}UpdatePriority(i,e){let t=this.streams_[we(i)];if(!t)return new Error("ID not registered");let r;t.scheduled()&&(r=this.DescheduleStream(t).scheduleKey.sequenceNumber),t.priority=e,r&&(this.schedule_.push({scheduleKey:{priority:t.priority,sequenceNumber:r},fullStreamEntry:{iD:i,streamEntry:t}}),this.schedule_.sort(ss))}Schedule(i){let e=this.streams_[we(i)];if(!e)return new Error("ID not registered");if(e.scheduled())return;let t={scheduleKey:{priority:e.priority,sequenceNumber:--this.currentWriteSequenceNumber_},fullStreamEntry:{iD:i,streamEntry:e}};this.schedule_.push(t),this.schedule_.sort(ss),e.currentSequenceNumber=t.scheduleKey.sequenceNumber}Deschedule(i){let e=this.streams_[we(i)];if(!e)throw new Error("Stream not registered");if(!e.scheduled())throw new Error("Stream not scheduled");this.DescheduleStream(e),e.currentSequenceNumber=void 0}IsScheduled(i){let e=this.streams_[we(i)];return e?e.scheduled():!1}static StreamId(i){return i.fullStreamEntry.iD}DescheduleStream(i){let e=this.schedule_.findIndex(r=>i.priority===r.scheduleKey.priority&&i.currentSequenceNumber===r.fullStreamEntry.streamEntry.currentSequenceNumber);if(e===-1)throw new Error("Calling DescheduleStream() on an entry that is not in the schedule at the expected key.");let t=this.schedule_[e];return this.schedule_.splice(e,1),t}},Gr=class{constructor(){this.activeGroups_=new Wr,this.perGroupSchedulers_={},this.streamToGroupMap_={}}HasRegistered(){return this.activeGroups_.HasRegistered()}HasScheduled(){return this.activeGroups_.HasScheduled()}NumScheduled(){let i=0;for(let[,e]of Object.entries(this.perGroupSchedulers_))i+=e.NumScheduled();return i}Register(i,e){if(this.streamToGroupMap_[we(i)])throw new Error("Provided stream ID already registered");this.perGroupSchedulers_[Ni(e.sendGroupId)]||(this.perGroupSchedulers_[Ni(e.sendGroupId)]=new Wr,this.activeGroups_.Register(e.sendGroupId,e));let t=this.perGroupSchedulers_[Ni(e.sendGroupId)];this.streamToGroupMap_[we(i)]={sendGroupId:e.sendGroupId,perGroupScheduler:t},t.Register(i,e)}Unregister(i){let e=this.streamToGroupMap_[we(i)];if(!e)throw new Error("Stream ID not registered");let t=e.sendGroupId,r=e.perGroupScheduler;delete this.streamToGroupMap_[we(i)],r.Unregister(i),r.HasRegistered()||(delete this.perGroupSchedulers_[Ni(t)],this.activeGroups_.Unregister(t))}UpdateSendOrder(i,e){let t=this.SchedulerForStream(i);if(!t)throw new Error("Stream ID not registered");return t.UpdatePriority(i,e)}UpdateSendGroup(i,e){let t=this.SchedulerForStream(i);if(!t)throw new Error("Stream ID not registered");let r=t.IsScheduled(i),n=t.GetPriorityFor(i);if(!n)throw new Error("Stream registered at the top level scheduler, but not at the per-group one");this.Unregister(i),this.Register(i,{sendGroupId:e,sendOrder:n}),r&&this.Schedule(i)}ShouldYield(i){let e=this.streamToGroupMap_[we(i)];if(!e)throw new Error("Stream ID not registered");let{sendGroupId:t,perGroupScheduler:r}=e;return this.activeGroups_.ShouldYield(t)?!0:r.ShouldYield(i)}GetPriorityFor(i){let e=this.streamToGroupMap_[we(i)];if(!e)return null;let{sendGroupId:t,perGroupScheduler:r}=e,n=r.GetPriorityFor(i);return n?{sendGroupId:t,sendOrder:n}:null}PopFront(){let i=this.activeGroups_.PopFront();if(typeof i>"u")return;let e=this.perGroupSchedulers_[Ni(i)];if(!e)throw new Error("Scheduled a group with no per-group scheduler attached");let t=e.PopFront();if(!(typeof t>"u"))return e.HasScheduled()&&this.activeGroups_.Schedule(i),t}Schedule(i){let e=this.streamToGroupMap_[we(i)];if(!e)return new Error("Stream ID not registered");let{sendGroupId:t,perGroupScheduler:r}=e;return this.activeGroups_.Schedule(t),r.Schedule(i)}IsScheduled(i){let e=this.SchedulerForStream(i);return e?e.IsScheduled(i):!1}SchedulerForStream(i){let e=this.streamToGroupMap_[we(i)];if(e)return e.perGroupScheduler}};var Vc=typeof process<"u"?process.pid:0,zn=_e(`webtransport:parserbase(${Vc})`);function Jn(a){return BigInt(a)<64n?1:BigInt(a)<16384n?2:BigInt(a)<1073741824n?4:8}var Ce=class Ce{constructor({nativesession:i,isclient:e,initialStreamSendWindowOffsetBidi:t,initialStreamSendWindowOffsetUnidi:r,initialStreamReceiveWindowOffset:n,streamShouldAutoTuneReceiveWindow:s,streamReceiveWindowSizeLimit:o}){this.session=i,this.isclient=e,this.blocked=!1,this.initialStreamSendWindowOffsetUnidi=r,this.initialStreamSendWindowOffsetBidi=t,this.initialStreamReceiveWindowOffset=n,this.streamShouldAutoTuneReceiveWindow=s,this.streamReceiveWindowSizeLimit=o,this.wtstreams=new Map,this.scheduler=new Gr}parseData(i){throw new Error("Implement parseData in derived Class")}writeCapsule({type:i,headerVints:e,payload:t,end:r}){throw new Error("Implement writeCapsule in derived Class")}initialParametersMandatory(){throw new Error("Implement initialParametersMandatory in derived Class")}sendClose({code:i,reason:e}){let r=new TextEncoder().encode("AAAA"+e);r[0]=i>>24&255,r[1]=i>>16&255,r[2]=i>>8&255,r[3]=i&255,this.writeCapsule({type:Ce.CLOSE_WEBTRANSPORT_SESSION,headerVints:[],payload:r,end:()=>{this.closeHttp2Stream(i)}})}newStream(i,e){let t=this.isclient?!(i&0x1n):!!(i&0x1n),r=i&0x2n?this.session.streamIdMngrUni:this.session.streamIdMngrBi;if(t){let o=r.maybeIncreaseLargestPeerStreamId(i);if(o.error){this.session.closeConnection({code:20,reason:o.error});return}}let n=!!(i&0x2n),s=new jr({streamid:i,unidirectional:n,incoming:t,capsuleParser:this,sendWindowOffset:n?this.initialStreamSendWindowOffsetUnidi:this.initialStreamSendWindowOffsetBidi,receiveWindowOffset:this.initialStreamReceiveWindowOffset,shouldAutoTuneReceiveWindow:this.streamShouldAutoTuneReceiveWindow,receiveWindowSizeLimit:this.streamReceiveWindowSizeLimit,sessionFlowController:this.session.flowController,streamIdManager:r});return this.wtstreams.set(i,s),this.scheduler.Register(i,e),this.session.jsobj.onStream({bidirectional:!(i&0x2n),incoming:t,stream:s,sendGroupId:e.sendGroupId,sendOrder:e.sendOrder}),s}scheduleDrainWrites(){if(this._scheduledDrainWriteCall)return;let i=Promise.resolve();this._scheduledDrainWriteCall=i,i.then(()=>{delete this._scheduledDrainWriteCall,this.drainWrites()}).catch(e=>zn("Error in drainWrites",e))}drainWrites(){for(this.blocked||this.session.drainWrites();!this.blocked;){let i=this.scheduler.PopFront();if(typeof i>"u")break;let e=this.wtstreams.get(i);if(!e)break;e.drainWrites()}}onMaxData(i){if(i&&this.session.flowController.updateSendWindowOffset(i)){let e=!1;this.wtstreams.forEach((t,r)=>{t.hasPendingData()&&(e=!0,this.scheduleDrainWriteStream(r))}),e&&this.drainWrites()}}onMaxStreamData(i,e){let t=this.wtstreams.get(i);t&&e&&t.flowController.updateSendWindowOffset(e)&&(this.scheduleDrainWriteStream(i),this.drainWrites())}onMaxStreamUniDi(i){typeof i>"u"||(this.session.streamIdMngrUni.maybeAllowNewOutgoingStreams(i),this.session.trySendingUnidirectionalStreams())}onMaxStreamBiDi(i){typeof i>"u"||(this.session.streamIdMngrBi.maybeAllowNewOutgoingStreams(i),this.session.trySendingBidirectionalStreams())}onDataBlocked(i){zn("Session received blocked frame "+i)}onStreamDataBlocked(i,e){zn("Stream "+i+" received blocked frame "+e)}onStreamsBlockedBidi(i){if(typeof i>"u")return;let e=this.session.streamIdMngrBi.onStreamsBlockedFrame(i);e.error&&this.session.closeConnection({code:105,reason:e.error})}onStreamsBlockedUnidi(i){if(typeof i>"u")return;let e=this.session.streamIdMngrUni.onStreamsBlockedFrame(i);e.error&&this.session.closeConnection({code:105,reason:e.error})}onCloseWebTransportSession({code:i,reason:e}){this.session.jsobj.onClose({errorcode:i,error:e}),this.closeHttp2Stream(i)}onDrain(){this.session.jsobj.onGoAwayReceived()}shouldYieldStream(i){return this.scheduler.ShouldYield(i)}scheduleDrainWriteStream(i){this.scheduler.Schedule(i)}removeStream(i){this.scheduler.Unregister(i)}streamUpdateSendOrderAndGroup(i,{sendOrder:e,sendGroupId:t}){this.scheduler.UpdateSendGroup(i,t),this.scheduler.UpdateSendOrder(i,e)}closeHttp2Stream(i){throw new Error("Implement closeHttp2Stream in derived Class")}};le(Ce,"PADDING",420171064),le(Ce,"WT_RESET_STREAM",420171065),le(Ce,"WT_STOP_SENDING",420171066),le(Ce,"WT_STREAM_WOFIN",420171067),le(Ce,"WT_STREAM_WFIN",420171068),le(Ce,"WT_MAX_DATA",420171069),le(Ce,"WT_MAX_STREAM_DATA",420171070),le(Ce,"WT_MAX_STREAMS_BIDI",420171071),le(Ce,"WT_MAX_STREAMS_UNIDI",420171072),le(Ce,"WT_DATA_BLOCKED",420171073),le(Ce,"WT_STREAM_DATA_BLOCKED",420171074),le(Ce,"WT_STREAMS_BLOCKED_UNIDI",420171075),le(Ce,"WT_STREAMS_BLOCKED_BIDI",420171076),le(Ce,"CLOSE_WEBTRANSPORT_SESSION",10307),le(Ce,"DRAIN_WEBTRANSPORT_SESSION",30894),le(Ce,"DATAGRAM",0);var Y=Ce;function os(){return(0xffffffffn>>2n)+1n}var jc=typeof process<"u"?process.pid:0,cs=_e(`webtransport:streamidmanager(${jc})`),Li=class{constructor({delegate:i,unidirectional:e,isclient:t,maxAllowedOutgoingStreams:r,maxAllowedIncomingStreams:n}){this.delegate=i,this.unidirectional=e,this.isclient=t,this.outgoingMaxStreams=BigInt(r),this.nextOutgoingStreamId=this.getFirstOutgoingStreamId(),this.outgoingStreamCount=0n,this.incomingActualMaxStreams=BigInt(n),this.incomingAdvertisedMaxStreams=BigInt(n),this.incomingInitialMaxOpenStreams=BigInt(n),this.incomingStreamCount=0n,this.availableStreams=new Set,this.largestPeerCreatedStreamId=BigInt(Number.MAX_SAFE_INTEGER),this.stopIncreasingIncomingMaxStreams=!1}onStreamsBlockedFrame(i){return i>this.incomingAdvertisedMaxStreams?{error:"StreamsBlockedFrame's stream count "+i+" exceeds incoming max stream "+this.incomingAdvertisedMaxStreams}:this.incomingAdvertisedMaxStreams===this.incomingActualMaxStreams?{success:!0}:(i<this.incomingActualMaxStreams&&this.delegate.canSendMaxStreams()&&this.sendMaxStreamsFrame(),{success:!0})}maybeAllowNewOutgoingStreams(i){if(i<=this.outgoingMaxStreams)return!1;let e=os();return i<e?this.outgoingMaxStreams=i:this.outgoingMaxStreams=e,!0}setMaxOpenIncomingStreams(i){if(this.incomingStreamCount>0)throw new Error("non-zero incoming stream count "+this.incomingStreamCount+ +" when setting max incoming stream to "+i);this.incomingInitialMaxOpenStreams!==i&&cs(this.unidirectional?"unidirectional ":"bidirectional: ","incoming stream limit changed from ",this.incomingInitialMaxOpenStreams," to ",i),this.incomingActualMaxStreams=i,this.incomingAdvertisedMaxStreams=i,this.incomingInitialMaxOpenStreams=i}maybeSendMaxStreamsFrame(){let i=2n;i>0n&&this.incomingAdvertisedMaxStreams-this.incomingStreamCount>this.incomingInitialMaxOpenStreams/i||this.delegate.canSendMaxStreams()&&this.incomingAdvertisedMaxStreams<this.incomingActualMaxStreams&&this.sendMaxStreamsFrame()}sendMaxStreamsFrame(){if(this.incomingAdvertisedMaxStreams>=this.incomingActualMaxStreams)throw new Error("this.incomingAdvertisedMaxStreams >= this.incomingActualMaxStreams"+this.incomingAdvertisedMaxStreams+"vs."+this.incomingActualMaxStreams);this.incomingAdvertisedMaxStreams=this.incomingActualMaxStreams,this.delegate.sendMaxStreams(this.incomingAdvertisedMaxStreams,this.unidirectional)}sendMaxStreamsFrameInitial(){this.delegate.sendMaxStreams(this.incomingAdvertisedMaxStreams,this.unidirectional)}onStreamClosed(i){this.isclient&&i&0x1n||!this.isclient&&!(i&0x1n)||this.incomingActualMaxStreams!==os()&&(this.stopIncreasingIncomingMaxStreams||(this.incomingActualMaxStreams++,this.maybeSendMaxStreamsFrame()))}getNextOutgoingStreamId(){if(this.outgoingStreamCount>=this.outgoingMaxStreams)throw new Error("Attempt to allocate a new outgoing stream that would exceed the limit ("+ +Number(this.outgoingMaxStreams)+")");let i=this.nextOutgoingStreamId;return this.nextOutgoingStreamId+=1n<<2n,this.outgoingStreamCount++,i}canOpenNextOutgoingStream(){return this.outgoingStreamCount<this.outgoingMaxStreams}isMaxStreamSet(){return this.outgoingMaxStreams>0n}maybeIncreaseLargestPeerStreamId(i){if(this.availableStreams.has(i))return this.availableStreams.delete(i),!0;let e=1n<<2n,t=this.largestPeerCreatedStreamId===BigInt(Number.MAX_SAFE_INTEGER)?this.getFirstIncomingStreamId():this.largestPeerCreatedStreamId+e,r=(i-t)/e+1n;if(this.incomingStreamCount+r>this.incomingAdvertisedMaxStreams)return cs("Failed to create a new incoming stream with id:"+i+", reaching MAX_STREAMS limit: "+this.incomingAdvertisedMaxStreams+"."),{error:"Stream id "+i+" would exceed stream count limit "+this.incomingAdvertisedMaxStreams};for(let n=t;n<i;n+=e)this.availableStreams.add(n);return this.incomingStreamCount+=r,this.largestPeerCreatedStreamId=i,!0}isAvailableStream(i){return this.isclient&&i&1||!this.isclient&&!(i&1)?i>=this.nextOutgoingStreamId:this.largestPeerCreatedStreamId===BigInt(Number.MAX_SAFE_INTEGER)||i>this.largestPeerCreatedStreamId||this.availableStreams.has(i)}getFirstOutgoingStreamId(){let i=0n;return this.isclient&&(i|=0x1n),this.unidirectional&&(i|=0x2n),i}getFirstIncomingStreamId(){let i=0n;return this.isclient||(i|=0x1n),this.unidirectional&&(i|=0x2n),i}get availableIncomingStreams(){return this.incomingAdvertisedMaxStreams-this.incomingStreamCount}};var Wc=typeof process<"u"?process.pid:0,Gc=_e(`webtransport:http2webtransportsession(${Wc})`),Yn=a=>setTimeout(a,0);typeof process<"u"&&(Yn=process.nextTick);var Hr=class{constructor({stream:i,ws:e,isclient:t,createParser:r,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d,initialBidirectionalSendStreams:p,initialBidirectionalReceiveStreams:u,initialUnidirectionalSendStreams:h,initialUnidirectionalReceiveStreams:_}){if(this.jsobj=void 0,i)this.stream=i;else if(e)this.ws=e;else throw new Error("Neither stream or websocket supplied");this.capsParser=r(this),this.isclient=t,this.flowController=new ui({tocontrol:this,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d}),this.streamIdMngrUni=new Li({delegate:this,unidirectional:!0,isclient:t,maxAllowedIncomingStreams:_,maxAllowedOutgoingStreams:h}),this.streamIdMngrBi=new Li({delegate:this,unidirectional:!1,isclient:t,maxAllowedIncomingStreams:u,maxAllowedOutgoingStreams:p}),this.datagramsWaiting_=[],this.orderUniStreams=[],this.orderBiStreams=[],i&&(t?i.on("response",C=>{Yn(()=>{if(C[":status"]===200){let P={};i&&C["wt-protocol"]&&(P.protocol=C["wt-protocol"]),this.jsobj.onReady(P)}else this.jsobj.onClose({errorcode:C[":status"],error:"Session stream errored"})})}):Yn(()=>{this.jsobj.onReady({})}))}sendInitialParameters(){let i=!1;process&&process.version&&parseInt(process.version.split(".")[0].substring(1))>=20&&(i=!0),(!i||this.capsParser.initialParametersMandatory())&&(this.flowController.sendWindowUpdate(),this.streamIdMngrBi.sendMaxStreamsFrameInitial(),this.streamIdMngrUni.sendMaxStreamsFrameInitial())}drainWrites(){for(;!this.capsParser.blocked&&this.datagramsWaiting_.length>0;){let i=this.datagramsWaiting_.shift();this.capsParser.writeCapsule({type:Y.DATAGRAM,headerVints:[],payload:i})}this.datagramsWaiting_.length>0&&this.capsParser.scheduleDrainWrites()}writeDatagram(i){return i.byteLength>this.getMaxDatagramSize()?{code:"tooBig"}:this.capsParser.blocked?(this.datagramsWaiting_.push(i),this.capsParser.scheduleDrainWrites(),{code:"blocked"}):(this.capsParser.writeCapsule({type:Y.DATAGRAM,headerVints:[],payload:i}),{code:"success"})}trySendingUnidirectionalStreams(){for(;this.orderUniStreams.length>0&&this.streamIdMngrUni.canOpenNextOutgoingStream();){let i=this.streamIdMngrUni.getNextOutgoingStreamId(),e=this.orderUniStreams.pop();this.capsParser.writeCapsule({type:Y.WT_STREAM_WOFIN,headerVints:[i],payload:void 0}),this.capsParser.newStream(i,e||{sendGroupId:0n,sendOrder:0n})}}orderUnidiStream({sendGroup:i,sendOrder:e,waitUntilAvailable:t}){let r=this.streamIdMngrUni.canOpenNextOutgoingStream(),n=this.streamIdMngrUni.isMaxStreamSet();return r||t||!n?(this.orderUniStreams.push({sendGroupId:i?._sendGroupId||0n,sendOrder:e??0n}),this.trySendingUnidirectionalStreams(),!0):!1}trySendingBidirectionalStreams(){for(;this.orderBiStreams.length>0&&this.streamIdMngrBi.canOpenNextOutgoingStream();){let i=this.streamIdMngrBi.getNextOutgoingStreamId(),e=this.orderBiStreams.pop();this.capsParser.writeCapsule({type:Y.WT_STREAM_WOFIN,headerVints:[i],payload:void 0}),this.capsParser.newStream(i,e||{sendGroupId:0n,sendOrder:0n})}}orderBidiStream({sendGroup:i,sendOrder:e,waitUntilAvailable:t}){let r=this.streamIdMngrBi.canOpenNextOutgoingStream(),n=this.streamIdMngrBi.isMaxStreamSet();return r||t||!n?(this.orderBiStreams.push({sendGroupId:i?._sendGroupId||0n,sendOrder:e??0n}),this.trySendingBidirectionalStreams(),!0):!1}orderSessionStats(){this.jsobj.onSessionStats({timestamp:0,expiredOutgoing:0n,lostOutgoing:0n,minRtt:0,smoothedRtt:0,rttVariation:0,estimatedSendRateBps:0n})}orderDatagramStats(){this.jsobj.onDatagramStats({timestamp:0,expiredOutgoing:0n,lostOutgoing:0n})}getMaxDatagramSize(){return 16384}notifySessionDraining(){}close({code:i,reason:e}){this.capsParser.sendClose({code:i,reason:e})}sendWindowUpdate(i){this.capsParser.writeCapsule({type:Y.WT_MAX_DATA,headerVints:[i],payload:void 0})}reportBlocked(i){Gc("Session was blocked at:",i)}sendBlocked(i){this.capsParser.writeCapsule({type:Y.WT_DATA_BLOCKED,headerVints:[i],payload:void 0})}connected(){return this.jsobj.state==="connected"}closeConnection({code:i,reason:e}){this.jsobj.onClose({errorcode:i,error:e}),this.close({code:i,reason:e})}smoothedRtt(){let i;return this.stream?i=this.stream.session?.WTrtt||25:this.ws&&(i=navigator?.connection?.rtt||25),i=Math.ceil(i/25)*25,i}canSendMaxStreams(){return!0}sendMaxStreams(i,e){this.capsParser.writeCapsule({type:e?Y.WT_MAX_STREAMS_UNIDI:Y.WT_MAX_STREAMS_BIDI,headerVints:[i],payload:void 0})}};var Hc=_e("webtransport:http2:browserparser");function Ve(a){if(a.offset+1>a.size)return;let i=BigInt(a.buffer[a.offset]);a.offset++;let t=1<<(Number(i)>>>6);if(!(a.offset+t-1>a.size)){i=i&0x3fn;for(let r=0;r<t-1;r++)i=i<<8n|BigInt(a.buffer[a.offset]),a.offset++;return i}}function qc(a){if(a.offset+4>a.size)return;let i=a.buffer[a.offset];return a.offset++,i=i<<8|a.buffer[a.offset],a.offset++,i=i<<8|a.buffer[a.offset],a.offset++,i=i<<8|a.buffer[a.offset],a.offset++,i}function ds(a,i){let e=8n,t=0xc0n,r=BigInt(i);r<64n?(e=1n,t=0x0n):r<16384n?(e=2n,t=0x40n):r<1073741824n&&(e=4n,t=0x80n),a.buffer[a.offset]=Number(t|r>>(e-1n)*8n&0xffn),a.offset++;for(let n=e-2n;n>=0n;n--)a.buffer[a.offset]=Number(r>>n*8n&0xffn),a.offset++}var ct=class extends Y{constructor({ws:i,nativesession:e,isclient:t,initialStreamSendWindowOffsetUnidi:r,initialStreamSendWindowOffsetBidi:n,initialStreamReceiveWindowOffset:s,streamShouldAutoTuneReceiveWindow:o,streamReceiveWindowSizeLimit:d}){super({nativesession:e,isclient:t,initialStreamSendWindowOffsetUnidi:r,initialStreamSendWindowOffsetBidi:n,initialStreamReceiveWindowOffset:s,streamShouldAutoTuneReceiveWindow:o,streamReceiveWindowSizeLimit:d}),this.ws=i,this.saveddata=void 0,this.rtype=void 0,this.closesend=!1,this.ws.addEventListener("message",p=>{p.data instanceof ArrayBuffer?this.parseData(new Uint8Array(p.data,0,p.data.byteLength)):Hc("Illegal text frame",p.data)})}parseData(i){let e={offset:0,size:i.byteLength,buffer:i},t=e.size,r=Ve(e);if(typeof r>"u")return;let n=Number(r);switch(n){case Y.PADDING:break;case Y.WT_RESET_STREAM:case Y.WT_STOP_SENDING:{let s=Ve(e);if(typeof s<"u"){let o=this.wtstreams.get(s),d=Ve(e);o&&typeof d<"u"&&(o.onStreamSignal(n===Y.WT_RESET_STREAM?"resetStream":"stopSending"),o.jsobj.onStreamRecvSignal({code:Number(d),nettask:n===Y.WT_RESET_STREAM?"resetStream":"stopSending"}))}}break;case Y.WT_STREAM_WOFIN:case Y.WT_STREAM_WFIN:{let s=Ve(e);if(typeof s<"u"){let o=this.wtstreams.get(s);if(!o&&(o=this.newStream(s,{sendOrder:0n,sendGroupId:0n}),!o))return;if(t-e.offset>=0){let d=n===Y.WT_STREAM_WFIN;d&&o.onFin(),o.recvData({data:new Uint8Array(e.buffer.buffer,e.buffer.byteOffset+e.offset,t-e.offset),fin:d})}}}break;case Y.WT_MAX_DATA:this.onMaxData(Ve(e));break;case Y.WT_MAX_STREAM_DATA:{let s=Ve(e),o=Ve(e);typeof s<"u"&&typeof o<"u"&&this.onMaxStreamData(s,o)}break;case Y.WT_MAX_STREAMS_BIDI:this.onMaxStreamBiDi(Ve(e));break;case Y.WT_MAX_STREAMS_UNIDI:this.onMaxStreamUniDi(Ve(e));break;case Y.WT_DATA_BLOCKED:this.onDataBlocked(Ve(e));break;case Y.WT_STREAM_DATA_BLOCKED:{let s=Ve(e),o=Ve(e);typeof s<"u"&&typeof o<"u"&&this.onStreamDataBlocked(s,o)}break;case Y.WT_STREAMS_BLOCKED_UNIDI:this.onStreamsBlockedUnidi(Ve(e));break;case Y.WT_STREAMS_BLOCKED_BIDI:this.onStreamsBlockedBidi(Ve(e));break;case Y.CLOSE_WEBTRANSPORT_SESSION:{let s=qc(e)||0,d=new TextDecoder().decode(new Uint8Array(e.buffer.buffer,e.buffer.byteOffset+e.offset,t-e.offset));this.onCloseWebTransportSession({code:s,reason:d})}break;case Y.DRAIN_WEBTRANSPORT_SESSION:this.onDrain();break;case Y.DATAGRAM:this.session.jsobj.onDatagramReceived({datagram:new Uint8Array(e.buffer.buffer,e.buffer.byteOffset+e.offset,t-e.offset)});break;default:}e.offset=t}writeCapsule({type:i,headerVints:e,payload:t,end:r}){let n=0;for(let u in e)n+=Jn(e[u]);n+=Jn(i);let s=n;t&&(n+=t.byteLength);let o=new Uint8Array(n),d={offset:0,size:o.length,buffer:o};ds(d,i);for(let u in e)ds(d,e[u]);let p=new Uint8Array(o.buffer,o.byteOffset+s);return t&&p.set(t),this.ws.send(o),r&&r(),!1}closeHttp2Stream(i){this.ws.close(1e3)}initialParametersMandatory(){return!0}};le(ct,"WS_CONTINUE",0),le(ct,"WS_TEXT",1),le(ct,"WS_BINARY",2),le(ct,"WS_CLOSE",8),le(ct,"WS_PING",9),le(ct,"WS_PONG",10);var Qn=["kDraft1","kDraft2"];var ls=_e("webtransport:http2:browser"),qr=class{constructor(i){this.port=i?.port||443,this.hostname=i?.host||"localhost",this.protocols=i?.protocols||[],this.initialStreamFlowControlWindow=i?.initialStreamFlowControlWindow||16*1024,this.initialSessionFlowControlWindow=i?.initialSessionFlowControlWindow||16*1024,this.initialBidirectionalStreams=i?.initialBidirectionalSendStreams||100,this.initialUnidirectionalStreams=i?.initialUnidirectionalSendStreams||100,this.streamShouldAutoTuneReceiveWindow=i.streamShouldAutoTuneReceiveWindow||!0,this.streamFlowControlWindowSizeLimit=i?.streamFlowControlWindowSizeLimit||6*1024*1024,this.sessionShouldAutoTuneReceiveWindow=i.sessionShouldAutoTuneReceiveWindow||!0,this.sessionFlowControlWindowSizeLimit=i?.sessionFlowControlWindowSizeLimit||15*1024*1024,this.jsobj=void 0,this.clientInt=void 0,this._webtransportProtocol=void 0}createTransport({path:i}){try{let e="wss://"+this.hostname+":"+this.port;i&&(e=e+"/"+i);let t=Qn.map(r=>"webtransport_"+r);this.protocols.length>0&&(t=t.filter(r=>r!=="kDraft1").map(r=>this.protocols.map(n=>r+"_"+n)).flat(1)),this.clientInt=new WebSocket(e,t)}catch(e){ls("Failed on WebTransport/Websocket:",e),this.jsobj.onClientConnected({success:!1});return}this.clientInt.binaryType="arraybuffer",this.clientInt.addEventListener("open",e=>{let t=this.clientInt?.protocol;t||(this.clientInt&&this.clientInt.close(),this.jsobj.onClientConnected({success:!1}));let r=t.split("_");!(r.length===2||r.length>=3)||r[0]!=="webtransport"||!Qn.includes(r[1])?(this.clientInt&&this.clientInt.close(),this.jsobj.onClientConnected({success:!1})):(this._webtransportProtocol=r.length>=3?r.slice(2).join("_"):void 0,this.jsobj.onClientWebTransportSupport(r.length>=3?{selectedProtocol:r.slice(2).join("_")}:{}),this.jsobj.onClientConnected({success:!0}))}),this.clientInt.addEventListener("error",e=>{ls("Failed on WebTransport/Websocket:",e),!this.jsobj?.sessionobjint||this.jsobj?.sessionobjint?.state==="connecting"?this.jsobj.onClientConnected({success:!1}):this?.jsobj?.sessionobjint?.objint&&this.jsobj.sessionobjint.close({closeCode:0,reason:e.toString()})})}openWTSession(i){if(!this.clientInt)throw new Error("clientInt not present");let e,t={session:new Hr({ws:this.clientInt,isclient:!0,createParser:r=>{e=r;let n=new ct({ws:this.clientInt,nativesession:r,isclient:!0,initialStreamSendWindowOffsetBidi:0,initialStreamSendWindowOffsetUnidi:0,initialStreamReceiveWindowOffset:this.initialStreamFlowControlWindow,streamShouldAutoTuneReceiveWindow:this.streamShouldAutoTuneReceiveWindow,streamReceiveWindowSizeLimit:this.streamFlowControlWindowSizeLimit});return this.clientInt&&this.clientInt.addEventListener("close",s=>{let o=s.code,d="Session WebSocket closed";if(s.reason){let p=s.reason.split(":");p.length>1&&(o=parseInt(p[0]),p=p.slice(1)),d=p.join(":")}else switch(o){case 1001:d="Going Away";break;case 1002:d="Protocol error";break;case 1003:d="Unsupported data";break;case 1004:d="Reserved";break;case 1005:d="No Status Rcvd";break;case 1006:d="Abnormal Closure";break;case 1007:d="Invalid frame payload data";break;case 1008:d="Policy Violation";break;case 1009:d="Message Too Big";break;case 1010:d="Mandatory Ext.";break;case 1011:d="Internal error";break;case 1012:d="Service Restart";break;case 1013:d="Try Again Later";break;case 1014:d="Bad Gateway";break;case 1015:d="TLS handshake";break;case 1e3:default:d="";break}r.jsobj.onClose({errorcode:o,error:d})}),n},sendWindowOffset:0,receiveWindowOffset:this.initialSessionFlowControlWindow,shouldAutoTuneReceiveWindow:this.sessionShouldAutoTuneReceiveWindow,receiveWindowSizeLimit:this.sessionFlowControlWindowSizeLimit,initialBidirectionalSendStreams:this.initialBidirectionalStreams,initialBidirectionalReceiveStreams:this.initialBidirectionalStreams,initialUnidirectionalSendStreams:this.initialUnidirectionalStreams,initialUnidirectionalReceiveStreams:this.initialUnidirectionalStreams}),reliable:!0};this.jsobj.onHttpWTSessionVisitor(t),e.jsobj.onReady(this._webtransportProtocol?{protocol:this._webtransportProtocol}:{})}closeClient(){this.clientInt&&this.clientInt.readyState===1&&this.clientInt.close()}};var Kc=_e("webtransport:browser()"),ps=!1,us=!1;if(globalThis.WebTransport){us=!0;try{let a=new WebTransport("https://127.0.0.1:23333/test",{serverCertificateHashes:[]});a.ready.then(()=>{try{a.close()}catch{}}).catch(()=>{})}catch(a){a?.name==="NotSupportedError"&&(Kc("serverCertificateHashesNotSupported"),ps=!0)}}var Kr=class extends Ar{startUpConnection({client:i,sessionint:e,ourl:t}){let r=t.pathname+(t.search??"");i.handleConnection({createTransport:!0,path:r}).then(()=>i.createWTSession(e,r)).catch(n=>{i.closeHookSession(),e.readyReject(n),e.closedReject(n)})}get supportsReliableOnly(){return!0}createClient(i){this.curtype="websocket";let e=new Br({createReliableClient:r=>new qr({...i}),...i}),t=new Ur({parentobj:e});return{client:e,sessionint:t}}},Ui=class{constructor(i,e){this.curtype="native",this.closeset=!1,this.allowFallback=!0,this.initiatedFallback=!1,this.args=e,this.closed=new Promise((r,n)=>{this.closeRes=r,this.closeRej=n}),this.ready=new Promise((r,n)=>{this.readyRes=r,this.readyRej=n}),this.draining=new Promise((r,n)=>{this.drainingRes=r,this.drainingRej=n});let t=()=>{this.initiatedFallback=!0,this.curtype="websocket",this.curtransport=new Kr(i,e),this.curtransport.ready.then(r=>this.readyRes(r)).catch(r=>this.readyRej(r)),this.curtransport.closed.then(r=>this.closeRes(r)).catch(r=>this.closeRej(r)),this.curtransport.draining.then(r=>this.drainingRes(r)).catch(r=>this.drainingRej(r))};us&&(!e?.serverCertificateHashes||!ps)?(this.curtransport=new WebTransport(i,e),setTimeout(()=>{if(this.allowFallback&&!this.closeset&&!this.initiatedFallback&&!this.curtransport?.supportsReliableOnly){let r=this.curtransport;r&&r.ready.then(async()=>{r.close()}).catch(()=>{}),t()}},2e3),this.curtransport.ready.then(r=>{this.allowFallback=!1,this.readyRes(r)}).catch(r=>{this.allowFallback&&!this.closeset?!this.initiatedFallback&&!this.curtransport?.supportsReliableOnly&&t():this.readyRej(r)}),this.curtransport.closed.then(r=>{this.curtype==="native"&&this.closeRes(r)}).catch(r=>{this.allowFallback&&!this.closeset?!this.initiatedFallback&&!this.curtransport?.supportsReliableOnly&&t():this.closeRej(r)}),this.curtransport.draining&&this.curtransport.draining.then(r=>{this.curtype==="native"&&this.drainingRes(r)}).catch(r=>{this.curtype==="native"&&this.drainingRej(r)})):t(),this.datagrams={get writable(){return this.datagramwritablepolyfilled_||console.warn("datagrams.writable is deprecated"),this.datagramwritablepolyfilled_||(this.datagramwritablepolyfilled_=this.createWritable())}},Object.defineProperties(this.datagrams,{maxDatagramSize:{get:()=>this.curtransport.datagrams.maxDatagramSize}}),this.datagrams.readable=new ReadableStream({start:async r=>{await this.ready,this.datagramsReader=this.curtransport.datagrams.readable.getReader()},pull:async r=>{let{value:n,done:s}=await this.datagramsReader.read();n&&r.enqueue(n),s&&r.close()},cancel:async r=>{await this.datagramsReader.cancel(r)}}),this.datagrams.createWritable=r=>{if(this.curtransport.datagrams.createWritable)return this.curtransport.datagrams.createWritable(r);if(!this.curtransport.datagrams.writable)throw new ve("No way to send out datagrams");let n=r?.sendOrder,s=r?.sendGroup,o=new WritableStream({start:async d=>{await this.ready,this.datagramsWriter||(this.datagramsWriter=this.curtransport.datagrams.writable.getWriter())},write:async(d,p)=>{await this.datagramsWriter.write(d)},abort:async d=>{await this.datagramsWriter.abort(d)},close:async()=>{await this.datagramsWriter.close()}});return Object.defineProperties(o,{sendOrder:{get:()=>n,set:d=>{n=d}},sendGroup:{get:()=>s,set:d=>{d!==s&&(s=d)}}}),o},this.incomingBidirectionalStreams=new ReadableStream({start:async r=>{await this.ready,this.incomingBidirectionalStreamsReader=this.curtransport.incomingBidirectionalStreams.getReader()},pull:async r=>{let{value:n,done:s}=await this.incomingBidirectionalStreamsReader.read();n&&r.enqueue(n),s&&r.close()},cancel:async r=>{await this.incomingBidirectionalStreamsReader.cancel(r)}}),this.incomingUnidirectionalStreams=new ReadableStream({start:async r=>{await this.ready,this.incomingUnidirectionalStreamsReader=this.curtransport.incomingUnidirectionalStreams.getReader()},pull:async r=>{let{value:n,done:s}=await this.incomingUnidirectionalStreamsReader.read();n&&r.enqueue(n),s&&r.close()},cancel:async r=>{await this.incomingUnidirectionalStreamsReader.cancel(r)}})}get congestionControl(){return this.curtransport?.congestionControl||void 0}get reliability(){return this.curtransport?.reliability||void 0}get supportsReliableOnly(){return!0}get protocol(){return this.curtransport?.protocol||void 0}getStats(){return this.curtransport.getStats()}close(i){this.closeset=!0,this.curtransport.close(i)}async createBidirectionalStream(i){return await this.ready,await this.curtransport.createBidirectionalStream(i)}async createUnidirectionalStream(i){return await this.ready,await this.curtransport.createUnidirectionalStream(i)}};var Ke=Jt(require("fflate"));var $c=63n,zc=16383n;var Jc=4611686018427387903n,$r=class{encode(i){let e=typeof i=="number"?BigInt(i):i;if(e<=$c)return new Uint8Array([Number(e)]);if(e<=zc)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<=Jc)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")}},zr=class{decode(i){let e=this.getNumBytesForLengthInteger(i);if(e<0)throw new Error("Invalid length prefix");if(i.length<e)throw new Error("Not enough data to decode integer");let t=BigInt(0);switch(e){case 1:t=BigInt(i[0]&63);break;case 2:t=BigInt(i[0]&63)<<8n|BigInt(i[1]);break;case 4:t=BigInt(i[0]&63)<<24n|BigInt(i[1])<<16n|BigInt(i[2])<<8n|BigInt(i[3]);break;case 8:t=BigInt(i[0]&63)<<56n|BigInt(i[1])<<48n|BigInt(i[2])<<40n|BigInt(i[3])<<32n|BigInt(i[4])<<24n|BigInt(i[5])<<16n|BigInt(i[6])<<8n|BigInt(i[7]);break}return t}getNumBytesForLengthInteger(i){let e=i[0]&192;return e===0?1:e===64?2:e===128?4:e===192?8:-1}};var Jr=class{constructor(i){this.encoder=new TextEncoder,this.lengthEncoder=new $r,this.compression=i??null}encode(i){let e=this.encoder.encode(i);e=this.compress(e);let t=this.lengthEncoder.encode(e.length),r=new Uint8Array(t.length+e.length);return r.set(t),r.set(e,t.length),r}compress(i){if(!this.compression)return i;switch(this.compression){case"gzip":return Ke.gzipSync(i);case"deflate":return Ke.zlibSync(i);case"deflate-raw":return Ke.deflateSync(i);default:return i}}},Yr=class{constructor(i){this.decoder=new TextDecoder,this.lengthDecoder=new zr,this.compression=i??null,this.buffer=new Uint8Array(0),this.expectedLength=null,this.offset=0}decode(i){let e=[];for(this.buffer=new Uint8Array([...this.buffer,...i]);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(i){if(i.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(i),this.lengthPrefixLength<0)throw new Error("Invalid length prefix");return Number(this.lengthDecoder.decode(i.subarray(0,this.lengthPrefixLength)))}decompress(i){if(!this.compression)return i;switch(this.compression){case"gzip":return Ke.gunzipSync(i);case"deflate":return Ke.unzlibSync(i);case"deflate-raw":return Ke.inflateSync(i);default:return i}}};var Bi=class{constructor(i,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=i,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(i),this.encoder=new Jr(this.compression),this.decoder=new Yr(this.compression),this.connect()}getCompressionTypeFromUrl(i){try{let t=new URL(i).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(){Je(E.WEBTRANSPORT_CONNECTED);try{this.webTransport=new Ui(this.url,{...this.options}),await this.webTransport.ready,c.debug("[WebTransport] WebTransport connected to "+this.url),Me.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(i){c.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",i),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:i,value:e}=await this.reader.read();if(i){this.close(1e3,"Stream Closed");break}e&&this.decoder.decode(e).forEach(r=>{this.onmessage?.(new MessageEvent("message",{data:r}))})}}catch(i){c.error("[WebTransport] Stream read failed",i),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(i){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(i);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(i=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:i,reason:e}))}}static isBrowserSupported(){return y.browserName()==="Firefox"?l.webtransportFF:(y.browserName()!=="Safari",!1)}};var hs="open",ms=[()=>l.producerScreenTrack,()=>l.videoTracksCount>0,()=>!0,()=>!0,()=>l.consumerScreenTrack,()=>!0,()=>l.movieShare,()=>l.useParticipantListChunk,()=>l.useRooms,()=>!!l.vmoji,()=>l.useCallsToContacts,()=>l.useChatRooms],Yc=10,Qc=["service-unavailable","conversation-ended","invalid-token"],xe=class xe extends bi{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="+l.platform+"&appVersion="+l.appVersion+"&version="+l.protocolVersion+"&device="+l.device+"&capabilities="+xe._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 Mr}static _getCapabilityFlags(){let e=0;for(let t=0;t<ms.length;t++)ms[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 r=this.participantIdRegistry?.handleMessage(t.data);r&&this._handleMessage(r)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(r=>{r&&this._handleMessage(r)}).catch(r=>{c.warn("[signaling] cannot parse message at producerCommandDataChannel",r)})},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,r)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){T.log(E.SOCKET_ACTION,"already_opened"),r(Error("Socket already opened"));return}this.conversationResolve=n=>{t(n),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=n=>{r(n),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},r=!0,n=0){if(t.participantId){let s=v.decomposeParticipantId(t.participantId),o=v.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:o.id,participantType:o.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,r,n)}async _sendRaw(e,t={},r=!0,n=0){let s=o=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(o),this.producerCommandDataChannel?.readyState===hs&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){T.log(E.SOCKET_ACTION,"not_opened"),c.warn("[signaling] socket is not opened"),o.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(T.log(E.SOCKET_ACTION,"invalid_state"),c.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(o),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((o,d)=>{let p=(h,_=!1)=>{!n||_?d(h):(c.debug("[signaling] resending a signaling message",e,u.sequence),n--,s(u))},u={sequence:this.sequence++,name:e,params:t,responseTimer:0,needResponse:r,resolve:o,reject:p};s(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,r){let n=Object.assign({sdp:t},r);return this._send(O.TRANSMIT_DATA,{participantId:e,data:n})}async acceptCall(e){return this._send(O.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(O.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Yc)}async changeParticipantState(e,t){let r={participantState:{state:e}};return t&&(r.participantId=t),this._sendRaw(O.CHANGE_PARTICIPANT_STATE,r)}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 r={capabilities:t};return e&&(r.description=e.sdp),this._send(O.ALLOCATE_CONSUMER,r)}async acceptProducer(e,t){let r={description:e.sdp};return t&&(r.ssrcs=t),this._send(O.ACCEPT_PRODUCER,r)}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,r){let n={participantId:e,roles:t};return r&&(n.revoke=!0),this._sendRaw(O.GRANT_ROLES,n)}async muteParticipant(e,t,r,n=null){return this._sendRaw(O.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:r,roomId:n})}async enableFeatureForRoles(e,t){return this._sendRaw(O.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,r){let n={participantId:e,roomId:r};return t&&(n.unpin=!0),this._sendRaw(O.PIN_PARTICIPANT,n)}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,r=!1){let n={};return e&&(n.fromId=e),t&&(n.count=t),r&&(n.backward=r),this._send(O.GET_WAITING_HALL,n)}async promoteParticipant(e,t=!1){let r={};return e&&(r.participantId=e),t&&(r.demote=t),this._sendRaw(O.PROMOTE_PARTICIPANT,r)}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 r="";e&&(r+=`&tgt=${e}`),e===ot.RETRY&&this.lastStamp&&(r+=`&recoverTs=${this.lastStamp}`),r=n(r),t?(r+="&compression=deflate-raw",c.debug("[signaling] connecting to wt "+this.wtEndpoint+this.postfix+r),this.socket=new Bi(this.wtEndpoint+this.postfix+r)):(c.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+r),this.socket=new WebSocket(this.endpoint+this.postfix+r)),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 n(s){if(!l.useParticipantListChunk)return s;let o=l.participantListChunkInitIndex;s+=`&partIdx=${o}`;let d=l.participantListChunkInitCount;return d!==null&&(s+=`&partCount=${d}`),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(){c.debug("[signaling] socket opened"),T.log(E.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor()}_onMessage(e){if(this._startDoctor(),e.data==="ping"){I.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send("pong");return}try{let t=JSON.parse(e.data);I.onSignalingMessage(t),this._handleMessage(t)}catch(t){T.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(De.RECONNECT,e),e.conversation.topology&&this._triggerEvent(De.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(De.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:T.log(E.SOCKET_ACTION,"unknown_message"),c.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){T.log(E.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Qc.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 G(e.reason||ne.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(De.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||ne.SIGNALING_FAILED,{message:`Unable to connect to the signaling: ${e.error}`,remote:!0})),this._closeSocket())}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(De.FAILED,e)}_onError(e){T.log(E.SOCKET_ACTION,"error"),c.error("[signaling] signaling error",e)}_onClose(e){T.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++<xe.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(xe.RECONNECT_MAX_DELAY,xe.RECONNECT_DELAY*Math.pow(2,this.reconnectCount-1));c.log(`[signaling] reconnect websocket after ${e}ms (${this.reconnectCount})`),T.log(E.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,ot.RETRY,!1),e)}_handleCommandResponse(e,t){if(!this.responseHandlers.hasOwnProperty(t.sequence))return;let r=this.responseHandlers[t.sequence];window.clearTimeout(r.responseTimer),c.debug(`[signaling] command response [${t.sequence}]`,t),e?(delete this.responseHandlers[t.sequence],r.resolve(t)):t.type==="error"?(delete this.responseHandlers[t.sequence],T.log(E.SOCKET_ACTION,"response-error"),r.reject(new Error(t.error||`Response error [${r.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],T.log(E.SOCKET_ACTION,"response-timeout"),r.reject(new Error(t.error||`Response timeout [${r.name}]`))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),xe.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!==hs){t.reject(new Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let r=this._serializeBinary(t);r!==null&&this.producerCommandDataChannel.send(r)}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"}),xe.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 r=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(r)}_convertDisplayLayout(e){let t=e,r={};for(let n in t)t.hasOwnProperty(n)&&(r[n]=Ga(t[n]));return{layouts:r}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new G(ne.SIGNALING_FAILED,{message:"Unable to connect to the signaling: connection timeout",remote:!0}))},xe.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(ot.RETRY,!1)},xe.WAIT_MESSAGE_DELAY)}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return Bi.isBrowserSupported()&&this.wtEndpoint!==null&&l.webtransport}};xe.RECONNECT_DELAY=l.signalingReconnectDelay,xe.RECONNECT_MAX_DELAY=l.signalingReconnectMaxDelay,xe.RECONNECT_MAX_COUNT=l.signalingReconnectMaxCount,xe.WAIT_CONNECTION_DELAY=l.waitConnectionDelay,xe.WAIT_RESPONSE_DELAY=l.waitResponseDelay,xe.WAIT_MESSAGE_DELAY=l.waitMessageDelay;var Wt=xe;var fs=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(fs||{}),Le=fs;var gs=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(gs||{}),dt=gs;var _s=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(_s||{}),Qr=_s;var Ss=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(Ss||{}),Xr=Ss;var vs=(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))(vs||{}),Gt=vs;function Is(a,i){if(a.length!==i.length)return!1;for(let e of a)if(!i.includes(e))return!1;return!0}function Es(a,i){let e=new Set(a);for(let[t,r]of Object.entries(i))r?e.add(t):e.delete(t);return Array.from(e)}var bs=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(bs||{}),Ge=bs;var Cs=(r=>(r.CALLED="CALLED",r.ACCEPTED="ACCEPTED",r.REJECTED="REJECTED",r.HUNGUP="HUNGUP",r))(Cs||{}),Q=Cs;var Ts=(r=>(r.UPDATE="UPDATE",r.REMOVE="REMOVE",r.ACTIVATE="ACTIVATE",r.TIMEOUT="TIMEOUT",r))(Ts||{}),hi=Ts;var Rs=(e=>(e.AUDIO_MIX="audio-mix",e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",e))(Rs||{}),et=Rs;var ys=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(ys||{}),Ps=ys;function ws(a){switch(a){case 1:return"no-available-tracks";default:return"unknown-error"}}var Ms=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(Ms||{}),mt=Ms;function Fi(a,i){if(a.length!==i.length)return!1;for(let e of a)if(!i.includes(e))return!1;return!0}var Zr=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Zr||{}),$;(u=>{function a(h){return h.length?typeof h[0]=="object"?h:h.map(_=>i(_)):[]}u.fromIds=a;function i(h,_="USER",C=0){return{id:h,type:_,deviceIdx:C}}u.fromId=i;function e(h,_=!0){let C=_?h.decorativeExternalUserId:h.externalId,P=h.deviceIdx??0;if(C)return t(C,P)}u.fromSignalingParticipant=e;function t(h,_=0){return{id:h.id,type:h.type==="ANONYM"?"ANONYM":"USER",deviceIdx:_}}u.fromSignaling=t;function r(h){return h.id}u.toSignaling=r;function n(h){let _=h.deviceIdx||0;return`{"id":"${h.id}","type":"${h.type}","deviceIdx":${_}}`}u.toString=n;function s(h,_="USER",C=0){return n(i(h,_,C))}u.fromIdToString=s;function o(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}u.fromString=o;function d(h,_){return h.id===_.id&&h.type===_.type&&h.deviceIdx===_.deviceIdx}u.compare=d;function p(h){return h?.deviceIdx||0}u.getDeviceIdx=p})($||($={}));var{isObject:As,isObjectsEquals:Xc}=v;function Xn(a,i){return a===null||i===null?a===null&&i===null:a.maxDimension!==i.maxDimension||a.maxBitrateK!==i.maxBitrateK||a.maxFramerate!==i.maxFramerate||a.degradationPreference!==i.degradationPreference||a.scalabilityMode!==i.scalabilityMode||As(a.bitrates)&&As(i.bitrates)&&!Xc(a.bitrates,i.bitrates,!0)?!1:a.bitrates===i.bitrates}function en(a,i){return!(!Xn(a.camera,i.camera)||!Xn(a.screenSharing,i.screenSharing))}function Zn(a,i){return{camera:Object.assign({},a.camera,i.camera),screenSharing:Object.assign({},a.screenSharing,i.screenSharing)}}function Ds(a){try{return btoa(JSON.stringify(a))}catch(i){c.warn("WaitingParticipant: failed convert to string",a,i)}return null}function ks(a){try{return JSON.parse(atob(a))}catch(i){c.warn("WaitingParticipant: failed convert from string",a,i)}return null}function xs(a,i){let e=new Uint8Array(i),t=0,r=0;for(;t<a.length&&r<i;){let n=a[t++],s=n>>4,o=n&15;if(s===15){let u;do u=a[t++],s+=u;while(u===255)}for(let u=0;u<s&&!(r>=i);u++)e[r++]=a[t++];if(t>=a.length||r>=i)break;let d=a[t]|a[t+1]<<8;if(t+=2,o===15){let u;do u=a[t++],o+=u;while(u===255)}o+=4;let p=r-d;for(let u=0;u<o&&!(r>=i);u++)e[r++]=e[p+u]}return e}var tn=(a,i)=>v.objectReduce(a,(e,t,r)=>(t===i&&e.push(r),e),[]);function Os(a){if(a.conversation?.muteStates)return a.conversation.muteStates;if(a.muteState&&a.muteOptions)return a.muteOptions.reduce((i,e)=>(i[e]=a.muteState,i),{})}function Zc(a,i){switch(a){case oe.AUDIO:return!!i.isAudioEnabled;case oe.AUDIO_SHARING:return!!i.isAudioSharingEnabled;case oe.VIDEO:return!!i.isVideoEnabled;case oe.SCREEN_SHARING:return!!i.isFastScreenSharingEnabled||!!i.isScreenSharingEnabled;default:return!1}}function Ns(a,i){return v.objectReduce(a,(e,t,r)=>{switch(t){case Ge.MUTE:case Ge.MUTE_PERMANENT:{Zc(r,i)||(e[r]=t);break}default:e[r]=t;break}return e},{})}function Ls(a){let{muteStates:i={},mediaSettings:e}=a;return Ns(i,e)}function Us(a,i){let e=a.conversation.participants.find(r=>v.comparePeerId(r.peerId,a.peerId));if(!e)return i;let{mediaSettings:t}=e;return Ns(i,t)}var mi=class{constructor(i){this._fixNoPacketsApplied=!1;this._fixNoPacketsChecked=!1;this._fixTooManyPacketsApplied=!1;this._fixTooManyPacketsSucceeded=!1;this._fixTooManyPacketsFailed=!1;this._toggleAudioPromise=null;this._fixNoPacketsAppliedVideo=!1;this._mediaSource=i}_fixAudioDeviceNoPackets(i){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,T.log(E.ERROR,`audio_device_recover_${i.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!i.bandwidth&&(this._fixNoPacketsApplied=!0,T.log(E.ERROR,"audio_device_recover"),c.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(y.getMicrophonePermissionState()!=="denied"))}}_fixAudioDeviceTooManyPackets(i){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let e=75,t=Date.now();if(!this._lastPacketsSentTime)i.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=i.packetsSent);else if(t-this._lastPacketsSentTime>500){let r=(i.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=i.packetsSent,this._fixTooManyPacketsApplied?r>e?(c.log("[AudioFix] Failed to fix RV"),T.log(E.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(c.log("[AudioFix] Fixed RV"),T.log(E.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):r>e&&(this._fixTooManyPacketsApplied=!0,T.log(E.ERROR,"audio_device_recover"),c.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0),this._fixTooManyPacketsTime=t)}}fix(i){if(!this._mediaSource)return;let e=i.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(i){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=i.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{this._mediaSource.getMediaSettings().isVideoEnabled&&this._mediaSource.toggleVideo(!0)}))}};var Vi=class{constructor(i){this._output=null;this._volume=1;this._features={setSinkId:!!Audio.prototype.setSinkId};this._statFirstMediaReceived=i}add(i){this.destroy(),this._output={},this._output.audioTrack=i,this._initAudioElement()}remove(i){!this._output||this._output.audioTrack!==i||this.destroy()}get volume(){return this._volume}set volume(i){this._volume=Math.max(0,Math.min(1,i)),this._output&&this._output.audioElement&&(this._output.audioElement.volume=this._volume)}_initAudioElement(){if(l.muteMode||!this._output?.audioTrack)return;let i=y.browserName()!=="Safari"||y.isMobile(),e=document.createElement(i?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{c.warn("[audio] Error on play audio"),I.onAutoplayError()},r=s=>{e.srcObject=new MediaStream([s]),e.load();let o=e.play();o&&o.catch(t)},n=()=>{c.debug("[audio] Recover audio playback");let s=this._output?.audioTrack;s?r(s):c.warn("[audio] Broken audio track")};e.onpause=n,e.onstalled=n,e.onerror=n,e.onloadeddata=()=>{this._statFirstMediaReceived.measure()},r(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 i=y.getSavedOutput();i&&await this._output.audioElement.setSinkId?.(i.deviceId)}catch(i){throw T.log(E.ERROR,"change_output"),c.error("[audio] Output change failed",i),i}}};var ed=90,td=3,ji=class extends ae{constructor(){super(...arguments);this._lastMemoryStat={percent:0,bytes:0}}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(r=>{let n=typeof r.userId=="string"&&t[r.userId]||null;r.userId=n?.externalId}),I.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)),r=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>ed?c.warn(`High memory usage: ${t}% (${r} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=td)&&(c.debug(`Memory usage: ${t}% (${r} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var id=44100,bt=class{constructor(i,e){this._analyser=null;this._gainNode=null;this._fftBins=null;this._mediaStreamSource=null;this._lastSmoothedLevel=0;this._trackId=i,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 i=id/this._fftBins.length,e=Math.ceil(l.voiceParams.minFreq/i),t=Math.floor(l.voiceParams.maxFreq/i);return this._fftBins.subarray(e,t)}getLevel(){let i=this._getBins(),t=i.reduce((n,s)=>n+s,0)/i.length/255,r=this._lastSmoothedLevel*l.voiceParams.smoothing+t*(1-l.voiceParams.smoothing);return this._lastSmoothedLevel=r,{real:t,smoothed:r}}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 Wi=class extends ae{constructor(e){super();this._detector=null;this._interval=null;let t=()=>{this._detector&&I.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 r=()=>{let n=e.getSendAudioTrack();n&&this.init(n)};this.subscribe(e,"SOURCE_CHANGED",n=>{n.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&r()}),this.subscribe(e,"SOURCE_READY",r),r()}init(e){this._stopDetector(),this._detector=new bt("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 Bs=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(Bs||{}),ft=Bs;var Ct=class Ct{constructor(){this._codecUsages=new Map;this.getCurrentTransportTopology=()=>{}}static create(i){let e=new Ct;e.getCurrentTransportTopology=i,Ct._instance=e}static reportUsage(i){let e=Ct._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let r=i.rtps.filter(n=>n.type==="outbound-rtp"&&!n.mid?.endsWith("s"));l.simulcast&&(r=r.reduce((n,s)=>{if(s.kind!=="video")return n.concat(s);let o=n.find(d=>d.kind==="video");return o?o.totalEncodeTime=(o.totalEncodeTime??0)+(s.totalEncodeTime??0):n.push(s),n},[])),r.forEach(n=>{let s=n.kind,o=n.mimeType;if((s==="audio"||s==="video")&&o){let d=n.encoderImplementation,p=[o,"encoder",d].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:p,totalEncodeTime:(n.totalEncodeTime??0)*1e3,audioCodecParams:n.sdpFmtpLine,topology:t})}})}saveUsage({kind:i,codecName:e,totalEncodeTime:t,audioCodecParams:r,topology:n}){let s=this._codecUsages.get(i);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(i,{...s,totalEncodeTime:t,topology:n});return}this._codecUsages.set(i,{kind:i,codecName:e,audioCodecParams:r,totalEncodeTime:t,topology:n})}report(i){if(i.kind==="video"&&i.totalEncodeTime===0)return;let e={name:E.CODEC_USAGE,codec_implementation:i.codecName,value:i.totalEncodeTime,call_topology:i.topology==="DIRECT"?"D":"S"};i.audioCodecParams&&(e.string_value=i.audioCodecParams),T.logClientStats(e)}static destroy(){Ct._instance?._destroy(),Ct._instance=null}_destroy(){this._codecUsages.forEach(i=>{this.report(i)}),this._codecUsages.clear()}};Ct._instance=null;var lt=Ct;var Ht=class extends ae{constructor(e,t){super();this._state="IDLE";this._pc=null;this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var Fs="videochat-epi",rd=5e3,nd=500,Tt=class extends ae{constructor(e,t,r=!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=r,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(Fs)||"",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+rd<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let r=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&r&&this._previousNetworkStatReportTimestamp+nd<=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((r,n)=>(n.kind==="video"&&(r.framesDecoded+=n.framesDecoded||0,r.framesReceived+=n.framesReceived||0),r),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let r=await this._signaling.reportPerfStat(t);localStorage.setItem(Fs,r.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((r,n)=>r+(n.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:js(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:js(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let r=!1,n=!1;for(e.inbound.rtps.reduce((p,u)=>(u.kind==="video"?(r=!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):(n=!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 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),r&&!nn(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),n&&!nn(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),r&&!nn(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),n&&!nn(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),h=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),_=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),C=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),P=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=qt(u/p*1e3),s.removed_audio_samples_for_acceleration=qt(h/p*1e3),s.concealed_audio_samples=qt(_/p*1e3),s.concealed_silent_audio_samples=qt(C/p*1e3),s.concealment_audio_avg_size=qt(_/P),s.total_audio_energy=t.total_audio_energy}Vs(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),Vs(t,"remote_address","remote_connection_type")&&(s.remote_address=t.remote_address,s.remote_connection_type=t.remote_connection_type);let o=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),d=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(o>0){let p=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=qt(p/o*100)}if(d>0){let p=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=qt(p/d*100)}Me.logCallStat(s),l.enableLogPerfStatReport&&c.log("Sent call stats",s),this._previousCallStatReport=t}};function Vs(a,...i){for(let e of i)if(!a.hasOwnProperty(e)||a[e]===void 0)return!1;return!0}function js(a,i=!1){if(a?.address)return a.address+(i?`:${a.port}`:"")}function nn(a){return a===void 0}function qt(a){return Number.isNaN(a)?0:a}var Hi=class{constructor(i,e=null){this.value=NaN;this.weightUp=i,this.weightDown=e??i}set(i){this.value=i}update(i){return this.value=this.getNext(i),this.value}getNext(i){if(isNaN(this.value))return i;let e=i<this.value?this.weightDown:this.weightUp;return this.value*(1-e)+i*e}getValue(){return this.value}};var Ws=.25,Gs=.35,ad=85,sd=.1,od=1.5,cd=.1,dd=1,ld=.6,pd=.3;var qi=class extends ae{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 Hi(Ws,Ws),loss:new Hi(Gs,Gs),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(),r=1;if(isNaN(t))return r;let n=Math.round((t-this._networkLimits.goodNet.rtt)/ad);for(let s=0;s<n;s++)r*=1-sd;return r}_calcLossRating(e){let t=typeof e=="number"?e:e.getValue(),r=1;if(isNaN(t))return r;let n=Math.round((t-this._networkLimits.goodNet.loss)/od);for(let s=0;s<n;s++)r*=1-cd;return r}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*dd;return Math.min(n,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,r){return r?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=ld?"good":e>=pd?"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",r=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),n=e.inbound.rtps.reduce((h,_)=>Math.max(h,_.packetLoss||0),0),s={rtt:this._localNetworkStat.rtt.update(r),loss:this._localNetworkStat.loss.update(n)};if(t){let h=e.outbound.rtps.reduce((_,C)=>_+(C.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let o=Date.now(),d=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),p=Math.max(Math.round(d*10)/10,.1),u=this._getNetworkState(p);(t||u!==this._currentState||o-this._lastStatSentTimestamp>l.networkStatisticsInterval)&&(this._lastStatSentTimestamp=o,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{c.warn("Unable to send [bad-net]",h)})),this._currentState=u,this._triggerEvent("NETWORK_STATUS",p)}reportRemote(e){let{rtt:t,loss:r,bitrate:n}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=r||0,this._remoteNetworkStat.bitrate=n||0}};var ud=30*1e3,Ki=class a extends Ht{constructor(e,t,r,n,s){super(r,n);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=s,this._perfStatReporter=new Tt(this,r,!0),this._directStatReporter=new qi(r),this.subscribe(this._signaling,De.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,ft.animoji,o=>{this._animojiDataChannel=o,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(o){T.log(E.ERROR,"addTrack-direct"),c.error("Unable to add media source tracks",o,{participantId:this._participantId}),this._failedOnCreate=o;return}this._createOffer(!1).catch(o=>{this._state==="IDLE"?this._failedOnCreate=o:this.close(o)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return["IDLE","CLOSED","FAILED"].includes(this.getState())}async open(e=null){if(this._isOpen){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(r){T.log(E.ERROR,"addTrack-direct"),c.error("DirectTransport: Unable to add media source tracks",r,{participantId:this._participantId}),this.close(r);return}this._setState("OPENED");let t=e;if(!e){let r=Object.keys(this._remoteSDP);t=r[r.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){en(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?(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 L.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case L.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case L.CUSTOM_DATA:e.data.hasOwnProperty("sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,r=v.getPeerIdString(e.peerId);v.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(r,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(r,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(r){throw T.log(E.ERROR,"addIceCandidate-direct"),c.error("Unable to add remote ice candidate",r,{participantId:this._participantId,candidate:t}),r}}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 r of t)try{await this._addIceCandidate(e,r)}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=a._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(r){throw T.log(E.ERROR,"setRemoteDescription-direct"),c.error("Unable to set remote description",r,{participantId:this._participantId,sdp:t}),r}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,l.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: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(r=>this._signaling.sendSdp(this._participantId,r,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}),T.log(E.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),v.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(T.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()},l.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?(T.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}),T.log(E.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},l.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};c.debug("Create offer",{participantId:this._participantId,options:t});let r;try{r=await this._pc?.createOffer(t),c.debug("Created offer",{participantId:this._participantId,offer:r}),r=a._patchLocalDescription(r)}catch(n){throw c.error("Unable to create offer",n,{participantId:this._participantId}),T.log(E.ERROR,"createOffer-direct"),n}try{return c.debug("Set local description",{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(n){throw c.error("Unable to set local description",n,{participantId:this._participantId}),T.log(E.ERROR,"setLocalDescription-direct"),n}}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=a._patchLocalDescription(e)}catch(t){throw c.error("Unable to create answer",t,{participantId:this._participantId}),T.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}),T.log(E.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!y.baseChromeVersion();return e.sdp=v.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=v.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(r=>{c.error("DirectTransport: Unable to replace track",r,{participantId:this._participantId}),T.log(E.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}yi(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,lt.reportUsage(t);let r={inbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(n=>n.type==="inbound-rtp"?(n.userId=this._participantId,!0):!1)},outbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(n=>n.type==="outbound-rtp")},remoteInbound:{topology:"DIRECT",transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(r),this._directStatReporter.reportLocal(r),this._triggerEvent("REMOTE_DATA_STATS",r),this._statInterval=window.setTimeout(e,l.statisticsInterval)})};this._statInterval=window.setTimeout(e,l.statisticsInterval)}async _isSVCSupported(e,t){let r=this._mediaSource.getSendVideoTrack(),n=e.outbound.rtps.find(d=>d.kind==="video");if(!n?.mimeType||!n?.bandwidth||!r)return!1;let s=r.getSettings();if(!s.width||!s.height||!s.frameRate)return!1;let o={type:y.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:n.mimeType,width:s.width,height:s.height,bitrate:n.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(o)).supported||!1}catch(d){return c.warn("Failed to get encodingInfo",o,d),!1}}async _checkPPTNetwork(e){if(!l.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,r=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,n=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,s=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,o=this._videoMaxDimensionsForNet.good,d="L1T1";if(n?(this._lastBadConnection=Date.now(),s?(o=this._videoMaxDimensionsForNet.bad,d="L1T2"):(o=this._videoMaxDimensionsForNet.worst,d="L1T3")):r&&(o=this._videoMaxDimensionsForNet.good,d="L1T1"),!(o<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>ud)||this._lastVideoMaxDimension===o)return;let u=this._serverSettings.camera;if(!u||!await this._isSVCSupported(e,d))return;c.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:d,averageNetStat:t,nextVideoMaxDimension:o}),this._lastVideoMaxDimension=o;let _={...this._serverSettings,camera:{...u,scalabilityMode:d,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(_)}_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=v.sdpFingerprint(e);if(t===null){c.warn("Fingerprint calculation is unsupported");return}this._fingerprint===null?this._fingerprint=t:(I.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=v.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,r){c.debug(`[${t}] data channel opening`);let n=e.createDataChannel(t,{negotiated:!0,id:1});n.onopen=()=>{let s=n.readyState;s==="open"?(c.debug(`[${t}] data channel opened`),n.onerror=o=>{c.error(`[${t}] data channel error`,o)},r(n)):c.error(`[${t}] data channel open failed, state [${s}]`)}}};var hd=16,an=class a{constructor(i,e,t){c.debug("AsrReceiver started"),this._datachannel=i,this._participantIdRegistry=e,this._asrCallback=t,this._textDecoder=new TextDecoder,this._datachannel.onmessage=r=>this._onDataChannelMessage(r.data)}static parse(i){let e=new DataView(i),t=e.getUint8(0),r=e.getUint8(1);if(r!==0)throw new Error(`Unsupported message type. Message type: ${r}`);let n=e.getUint16(2),s=e.getUint32(4),o=e.getUint32(8),d=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:n,ssrc:s,timestamp:o,duration:d,data:i.slice(hd)}}_onDataChannelMessage(i){let e=a.parse(i),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){c.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}let r={participantId:t,text:this._textDecoder.decode(e.data),timestamp:e.timestamp,duration:e.duration};this._asrCallback(r)}destroy(){this._datachannel.onmessage=null}};var gt=require("messagepack");var sn=class{constructor(){this.streamDescriptionByCompactId=new Map;this.compactIdByStreamDescription=new Map}getStreamDescription(i){return this.streamDescriptionByCompactId.get(i)}getCompactId(i){return this.compactIdByStreamDescription.get(i)}handleMessage(i){let e=new Uint8Array(i),t=e[0],r=e.subarray(1);switch(t){case 1:let n=(0,gt.decode)(r);return Object.entries(n).forEach(([C,P])=>{let B=xi(C);this.streamDescriptionByCompactId.set(P,B),this.compactIdByStreamDescription.set(C,P)}),null;case 2:case 4:let s=(0,gt.decode)(r),o=[];for(let C of s){let P=this.getStreamDescription(C);P&&o.push(P.participantId)}return t===2?{type:"notification",notification:L.AUDIO_ACTIVITY,activeParticipants:o}:{type:"notification",notification:L.STALLED_ACTIVITY,stalledParticipants:o};case 3:let d=(0,gt.decode)(r);return{type:"notification",notification:L.SPEAKER_CHANGED,speaker:this.getStreamDescription(d)?.participantId};case 5:let p=(0,gt.decode)(r);return{type:"notification",notification:L.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:p[0],maxDimension:p[1]}};case 6:let u=(0,gt.decode)(r),h={};for(let[C,P]of Object.entries(u)){let B=this.getStreamDescription(Number(C))?.participantId;B&&(h[B]=P/100)}return{type:"notification",notification:L.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(r);case 8:{let P=(0,gt.decode)(r).map(B=>{let[W,X,fe,Oe,J,Ae,be]=B;return{participantId:this.getStreamDescription(W)?.participantId,gain:X,pause:fe,offset:Oe,mute:J,liveStatus:Ae,startTimeMs:be}});return{type:"notification",notification:L.MOVIE_UPDATE_NOTIFICATION,data:P}}case 9:let _=(0,gt.decode)(r);return{type:"notification",notification:L.VIDEO_SUSPEND_SUGGEST,bandwidth:_};default:return c.debug("unsupported message type: "+t),null}}_createParticipantSourcesUpdateNotification(i){let e=(0,gt.decode)(i),t=[];for(let[r,n]of Object.entries(e)){let s=n[0],o=n[1],d=n[2],p=!!n[3],u=n[4]!==null?!!n[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){c.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(d===null){c.error("unexpected null sequenceNumber",r,n);continue}let _=et.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+r,C=o?o>>>0:null;t.push({participantStreamDescription:h,streamId:_,rtpTimestamp:C,sequenceNumber:d,fastScreenShare:p,suspend:u})}return{type:"notification",notification:L.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var md=90,fd=4294967295,$i=class a extends Ht{constructor(e,t,r){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,De.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=r,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){en(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 Tt(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,a._closeDataChannel(this._producerNotification),a._closeDataChannel(this._producerCommand),a._closeDataChannel(this._producerScreen),a._closeDataChannel(this._consumerScreen),a._closeDataChannel(this._asr),a._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,r){c.debug(`[${t}] data channel opening`);let n=e.createDataChannel(t,{ordered:!0});n.onopen=()=>{let s=n.readyState;s==="open"?(c.debug(`[${t}] data channel opened`),r(n)):c.error(`[${t}] data channel open failed, state [${s}]`)},n.onerror=s=>{let o=s.error;c.error(`[${t}] data channel error`,o?.errorDetail,o?.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=v.debounce(t=>{this._pc&&this._onConnectionStateChange(this._pc,t)},500),this._pc.onsignalingstatechange=a._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new sn,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),l.producerNotificationDataChannel&&this._createDataChannel(this._pc,ft.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),l.producerCommandDataChannel&&(this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,ft.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)})),l.producerScreenDataChannel&&this._createDataChannel(this._pc,ft.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),l.asrDataChannel&&this._createDataChannel(this._pc,ft.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new an(t,this._participantIdRegistry,r=>{this._onAsrTranscription(r)})}),l.vmoji&&this._createDataChannel(this._pc,ft.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){c.error("ServerTransport: Unable to add media source tracks",t),T.log(E.ERROR,"addTrack-single"),this.close(t);return}l.consumerScreenDataChannel&&this._createDataChannel(this._pc,ft.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let r=this._mediaSource.getScreenTrack();r&&this._createCaptureSender(r)}),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 r=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${et.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(r).exec(t);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!l.consumerScreenDataChannel||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Lt(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){!l.producerScreenDataChannel||!this._producerScreen||(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Ot(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(r=>{if(!r.track||r.track.kind!=="video")return;let n=!this._disabledSenders.has(r),s=e.maxDimension!==0;if(n&&!s){c.log("Disabling video upload"),this._disabledSenders.add(r),r.replaceTrack(y.getBlackMediaTrack()).catch(d=>{c.error("Could not disable video upload",d)});return}let o=this._mediaSource.getSendVideoTrack();if(!n&&s&&o){c.log("Enabling video upload"),this._disabledSenders.delete(r);let d=r.track;d.enabled=o.enabled,r.replaceTrack(o).then(()=>d.stop()).catch(p=>{c.error("Could not enable video upload",p)})}v.applyVideoTrackSettings(e,r,o??r.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),lt.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 yi(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent("REMOTE_DATA_STATS",{inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(o=>o.type==="inbound-rtp"&&o.kind==="audio"&&this._ssrcMap[o.ssrc]==="mix");if(!t)return;let r=et.AUDIO_MIX,n=this._statBytes[r],s=!1;if(n){let o=t.bytesReceived-n.bytesReceived;o>=0&&o<=5&&(s=!0),n.stalled!==s&&this._triggerEvent("AUDIO_MIX_STALL",s)}this._statBytes[r]={bytesReceived:t.bytesReceived,stalled:s}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:Tt.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&&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=l.simulcast&&y.isSimulcastSupportedByBrowser(),r=t;try{await this._pc.setRemoteDescription(e)}catch(o){throw c.error("[single] unable to set remote offer",o),T.log(E.ERROR,"setRemoteDescription-single"),o}let n=this._findFirstSimTransceiver();if(t)if(n){c.log(`_processOffer: caps.simulcast=${l.simulcast} mid=${n.mid} dir=${n.direction}`);let o=this._mediaSource.getStream(),d=await this._setupSimulcastTransceiver(o,n);c.log("_processOffer: simulcastInfo",d),d||(c.log(`_processOffer: simulcast transceiver not found in server offer mid=${n.mid}, disable simulcast`),r=!1)}else c.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),r=!1;let s;try{if(await this._handleTracks(),c.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");s=await this._pc.createAnswer()}catch(o){throw c.error("[single] unable to create answer",o),T.log(E.ERROR,"createAnswer-single"),o}try{if(!this._pc)throw new Error("Interrupt allocation");s.sdp=v.patchLocalSDP(s.sdp,!1,y.isBrokenH264Decoder(),!1,l.h264spsPpsIdrInKeyframe),c.debug("[single] set local answer",{answer:s}),await this._pc.setLocalDescription(s)}catch(o){throw c.error("[single] unable to set local answer",o),T.log(E.ERROR,"setLocalDescription-single"),o}if(r&&n){s.sdp=v.patchSimulcastAnswerSdp(s.sdp,n,_t.WIDTH,_t.HEIGHT);for(let o of this._pc.getTransceivers())o.mid===null&&o.stop()}try{c.debug("[single] transmit local answer",{answer:s}),this._updateSSRCMap(e),await this._signaling.acceptProducer(s,Object.keys(this._ssrcMap)),c.debug("[single] remote offer has been processed")}catch(o){c.warn("[single] unable to send local answer",o),T.log(E.ERROR,"acceptProducer")}r&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!=="video")continue;let r=e.sender.getParameters();if(!(!r.encodings||r.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let r=e.getVideoTracks()[0];await t.sender.replaceTrack(r),t.sender.setStreams(e);let n=t.sender.getParameters();if(!n.encodings||n.encodings.length<=1)return c.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(n.encodings)}`),null;let s=Ti(_t.WIDTH,_t.HEIGHT,this._serverSettings.camera?.bitrates?.generic),o=0,d=1;for(let u of n.encodings)u.scalabilityMode=Ci,u.active=!0,o>=s.streams.length?u.maxBitrate=0:u.maxBitrate=s.streams[o].bitrate,u.scaleResolutionDownBy=d,d=d*2,o++;await t.sender.setParameters(n);let p=r.getSettings();return c.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${p.width}x${p.height} encodings=${JSON.stringify(n.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:v.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 r=this._producerNextOffer;this._producerNextOffer=null,await this._acceptProducer(r)}}catch(r){this.close(r)}}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),T.log(E.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&&(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 r=t.streams[0];r?(r.onremovetrack||(r.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",r.id,r,s.track)}),r.getTracks().find(s=>s.id===t.track.id)||r.addTrack(t.track),this._rtpReceiversByStreamId[r.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",r.id,r,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),T.log(E.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(T.logCustom(E.RECONNECT,{param:1}),this._reconnect());break;case"connecting":let r=this.getState();r==="IDLE"||r==="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"),v.getPeerConnectionHostInfo(e).then(n=>{n?.local&&(T.log(E.ICE_CONNECTION_TYPE,n.local.type),c.debug("Selected ICE candidates",n))}),T.logCustom(E.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){l.consumerScreenDataChannel&&t&&(e=t);let r=(n,s)=>{n.replaceTrack(s).catch(o=>{c.error("ServerTransport: Unable to replace track",o),T.log(E.ERROR,"replaceTrack-single")})};if(c.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),l.simulcast&&y.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(o=>o.direction==="sendonly"&&o.sender?.track?.kind==="video")?.sender;s?.track?(r(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):c.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let n=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);n?.track?r(n,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return T.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 T.log(E.PAT_WAITING_TIME_ERROR,"oldBrowser"),c.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let r=this._rtpReceiversByStreamId[e];if(!r)return T.log(E.PAT_WAITING_TIME_ERROR,"noReceiver"),c.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let n=r.getSynchronizationSources();if(!n||!n.length)return c.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let o=n[0].rtpTimestamp;if(!Number.isInteger(o))return T.log(E.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),c.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${o}`),0;let d=t-o&fd,p=Math.ceil(d/md);return Math.min(100,Math.max(0,p))}async _changeSimulcastInfo(e,t){let r=this._mediaSource.getMediaSettings().isVideoEnabled,n=this._findFirstSimTransceiver();if(!l.simulcast||!y.isSimulcastSupportedByBrowser()||!r||!n||!n.sender)return;let s=this._mediaSource.getStream();if(!s)return;let o=s.getVideoTracks()[0],d=o.getSettings().width,p=o.getSettings().height,u=Ti(d,p,this._serverSettings.camera?.bitrates?.generic),h=t||!Ca(this._simulcastInfo,u);if(!u.streams.length||!h)return;let _=n.sender.getParameters();if(_.encodings||(_.encodings=[{}]),!(_.encodings.length<=1)){if(c.log(`_changeSimulcastInfo: ${d}x${p} command: ${JSON.stringify(u)} `),e){let C=0;for(let P of _.encodings)P.scaleResolutionDownBy=tr(P.rid),P.scalabilityMode=Ci,C>=u.streams.length?(P.maxBitrate=0,P.active=!1):(P.active=!0,P.maxBitrate=u.streams[C].bitrate),C++;await n.sender.setParameters?.(_).catch(P=>{c.error("Failed to set sender parameters",_,P)}),c.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(_.encodings)} `)}if(this._simulcastInfo=u,u.streams){let C={mediaSource:1,simulcastInfo:u};await this._signaling.changeSimulcast(C)}}}};var tt=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(tt||{}),on=class extends ae{constructor(e,t,r,n){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=r,this._topology=e,this._serverSettings=n,this.subscribe(this._signaling,De.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,r=!1,n=!1){c.log("Trying open participant",{participantIds:e});let s=n;for(let o of e){if(this._opened.indexOf(o)!==-1){c.warn(`The participant [${o}] has already had opened transport`);continue}if(this._allocated.indexOf(o)===-1){c.warn(`The participant [${o}] has no allocated transport`);continue}this._opened.push(o),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(r),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),r=this._opened.indexOf(e);t<0&&c.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&r>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),r>=0&&this._opened.splice(r,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 r=e.filter(n=>this._states[n]!==t?(this._states[n]=t,!0):!1);r.length&&this._triggerEvent("STATE_CHANGED",r,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(c.log(`Topology changed ${this._topology} -> ${e.topology}`),T.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||[],r=e.offerToTypes||[],n=e.offerToDeviceIdxs||[],s=t.length&&r.length?v.composeParticipantId(t[0],r[0],n[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 o=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let d=s===o;this._directTransport=this._createDirectTransport(o,d)}this._opened.indexOf(o)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let r=new Ki(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(r.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this,e)),r.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this,e)),r.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),r.addEventListener("STATE_CHANGED",this._onDirectTransportChanged.bind(this)),r.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),r.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"DIRECT"))),this._animojiReceiver&&this._animojiSender&&r.setAnimojiTransport(this._animojiReceiver,this._animojiSender),r}_createServerTransport(){let e=new $i(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){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 r=this._opened.indexOf(t);r>=0&&this._opened.splice(r,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology==="DIRECT"&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e==="CONNECTED"&&this._topology==="SERVER"&&this._releaseDirectTransport(),(e==="CLOSED"||e==="FAILED")&&(this._releaseServerTransport(),this._topology==="SERVER"&&(this._allocated=[],this._opened=[])),this._topology==="SERVER"&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_onTransportStalledParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_onTransportSpeakerChanged(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_onTransportNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_onRemoteStreamSecond(e,t){this._triggerEvent("REMOTE_STREAM_SECOND",e,t)}_onPeerConnectionClosed(e){this._triggerEvent("PEER_CONNECTION_CLOSED",e)}_onServerAudioMixStall(e){this._topology==="SERVER"&&this._triggerEvent("AUDIO_MIX_STALL",e)}_onRemoteDataStats(e){this._triggerEvent("REMOTE_DATA_STATS",e)}_onRemoteTrackAdded(e,t,r){this._triggerEvent("REMOTE_TRACK_ADDED",e,t,r)}_onRemoteTrackRemoved(e,t,r){this._triggerEvent("REMOTE_TRACK_REMOVED",e,t,r)}_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,r)=>this._onAnimojiStream(t,r),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"?(T.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):(T.log(E.PAT_WAITING_TIME_ERROR,"noTransport"),c.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var cn=class extends ae{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,r){if(r.kind==="audio"&&(this._detector?.destroy(),this._detector=new bt(e,r),!this._interval)){let n=()=>{this._collectVolumes(),this._interval=window.setTimeout(n,l.voiceParams.interval)};this._interval=window.setTimeout(n,l.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,r){r.kind==="audio"&&(!this._detector||this._detector.track!==r||(this._detector.destroy(),this._detector=null))}_collectVolumes(){if(!this._detector)return;let e={},t=this._detector.trackId,r=this._detector.getLevel();if(t===et.AUDIO_MIX){if(this._activeParticipants)for(let n of this._activeParticipants)e[n]=r}else e[t]=r;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null)}};var dn=class extends ae{constructor(e,t,r){super();this._speakerId=null;this._serverSideSpeakerDetection=!1;this._serverSideSpeakerDetection=r==="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,r=null;if(Object.keys(e).forEach(n=>{let s=e[n].smoothed;s>t&&s>l.voiceParams.threshold&&(t=s,r=n)}),r&&r!==this._speakerId){let n=this._speakerId&&e.hasOwnProperty(this._speakerId)?e[this._speakerId].smoothed:0;t>n*l.voiceParams.speakerLevelMultiplier&&(this._speakerId=r,this._triggerEvent("SPEAKER_CHANGED",r))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent("SPEAKER_CHANGED",e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e==="SERVER"}};var zi=class extends ae{constructor(e,t,r){super();this._volumes={};this._participants={};this._connectionTimeout=0;this._volumeTimeout=0;this._transport=e,this._participants=r,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&&(c.warn("Transport failed, send callSpecError"),T.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=r=>r!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(c.warn("There is not connected transport, send callSpecError"),T.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 r="UNKNOWN",n=this._participants[t];n&&n.platform&&(r=n.platform),e.indexOf(r)<0&&(e.push(r),T.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${r}`))}),e.length&&c.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var ln=class a{static correctHangupReason(i){switch(i){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(i,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(i.hangup))return;let r=i.custom_error?.vchat_detailed_api_error.code;T.logClientStats({name:E.CALL_FINISH,reason:a.correctHangupReason(i.hangup),call_topology:e==="DIRECT"?"D":"S",...r&&{string_value:r}})}};var pn=class{constructor(){this._isCallMarked=!1;this._isFinished=!1;this._callType=null}markAcceptCall(i){this.mark(i==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(i){i==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(i){i==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(i){i==="SERVER"&&this.mark("server_join_server")}mark(i){this._isCallMarked||(this._isCallMarked=!0,this._callType=i,Je(E.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Me.logEventualStat({name:E.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var gd=1e3,_d=1e4;var Sd=15,z=class z extends ae{constructor(e,t){super();this._mediaSource=null;this._conversation=null;this._myLastRequestedLayouts={};this._state="IDLE";this._participantState=Q.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=v.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);T.create(e,t),Me.create(),lt.create(()=>this._transport?.getTopology()),this._api=e,this._signaling=new Wt,this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id),l.clientEventsLoggingEnabled&&T.logClientEvent({event_type:E.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),T.destroy(),Me.destroy(),lt.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new pn,this._audioOutput=new Vi(this._statFirstMediaReceived),l.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),gd))}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:r,payload:n="",joiningAllowed:s=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:d,externalIds:p,onFastStart:u}){if(z._activationMutex)throw T.log(E.ERROR,"startCall"),c.warn("Conversation: there is already running activation"),new G(D.FAILED);let h=Date.now();z._activationMutex=!0,Be.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(r);let _=this._mediaSource.getMediaSettings();t===dt.CHAT||e&&e.length>1?this._logWithMediaSettings(E.OUTGOING_MULTIPARTY_CALL,_):this._logWithMediaSettings(E.OUTGOING_CALL,_);let C=await this._startConversation({opponentIds:e,opponentType:t,direction:Le.OUTGOING,mediaOptions:r,payload:n,joiningAllowed:s,requireAuthToJoin:o,onlyAdminCanShareMovie:d,externalIds:p,startedTime:h,onFastStart:u});if(!this._conversation)throw new G(D.UNKNOWN_ERROR);if(this._participantState=Q.ACCEPTED,this._changeMediaSettings(_),await this._processConnection(C),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._signaling.readyToSend(),z._delayedHangup)throw new G(D.CANCELED);return c.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:r}),await this._processConnectionSharedMovieInfo(C),await this._processConversationUrlSharingInfo(C),I.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),I.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants()),this._onConversationParticipantListChunk(C),this._processPinnedParticipants(C),I.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),z._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(_){throw this._close(_,"Unable to start conversation"),_}finally{z._activationMutex=!1}}async onJoin(e){if(z._activationMutex)throw T.log(E.ERROR,"joinCall"),c.warn("Conversation: there is already running activation"),new G(D.FAILED);let t=Date.now();z._activationMutex=!0,this._state="PROCESSING",Be.startSession();try{let r=!!e.observedIds?.length;if(r&&l.videoTracksCount>0)throw c.error("Observer mode: please set videoTracksCount=0"),new G(D.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!r);let n=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.JOIN_CONVERSATION,n);let s=await this._joinConversation(e,t);if(!this._conversation)throw new G(D.UNKNOWN_ERROR);return this._conversation.observer=r,I.onLocalStream(this._mediaSource.getStream(),n),this._conversation.waitingHall?(c.log("In waiting hall"),z._current=this,z._activationMutex=!1,this._signaling.readyToSend(),I.onLocalStatus("WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(r){throw z._activationMutex=!1,this._close(r,"Unable to join conversation"),r}}async _onJoinPart2(e){c.debug("Join conversation part 2"),z._activationMutex=!0;try{if(this._participantState=Q.ACCEPTED,!this._conversation||!this._mediaSource)throw new G(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 G(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 I.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),t),this._onConversationParticipantListChunk(e),this._processPinnedParticipants(e),I.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(n=>!!n)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let r={rooms:await this._extractExternalRooms(e)};return t&&(r.roomId=t),r}async onPush(e,t=re.USER,r,n){if(z._activationMutex)throw c.warn("Conversation: there is already running activation"),new G(D.REJECTED);z._activationMutex=!0;try{let s=Date.now(),o=await this._prepareConversation(e,t,r,n);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new G(D.UNKNOWN_ERROR);if(!o.conversation.participants.find(p=>p.state===Q.CALLED&&p.id===this._conversation?.userId))throw c.log("Push rejected (there is an active call)"),T.log(E.PUSH,"rejected"),new G(D.REJECTED);if(Be.startSession(),await this._processConnection(o),this._extractConnectionUrlSharingInfo(o),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._processPinnedParticipants(o),this._signaling.readyToSend(),this._logCallStartEvent(s,Le.INCOMING),T.log(E.PUSH,"accepted"),z._current=this,z._delayedHangup)throw new G(D.CANCELED);z._activationMutex=!1}catch(s){throw z._activationMutex=!1,this._close(s,"Unable to handle inbound call push"),s}}_isInWaitingHall(e){return!e.conversation||(e.conversation.options||[]).indexOf(Gt.WAITING_HALL)<0?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(r=>v.comparePeerId(r.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(Gt.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new G(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()),I.onCallAccepted(),this._state="ACTIVE",this._participantState=Q.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}_getMainRoomParticipants(){return v.mapSharedParticipants(Object.values(this._participants).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,r]=e.split(":"),n=parseInt(t,10);if(isNaN(n))throw new Error("Invalid original length in prefix");let s=atob(r),o=new Uint8Array(s.length);for(let d=0;d<s.length;d++)o[d]=s.charCodeAt(d);try{let p=xs(o,n).reduce((X,fe)=>(X+=String.fromCharCode(fe),X),""),{srcp:u,stne:h,tkn:_,trne:C,trnp:P,trnu:B,wse:W}=JSON.parse(p);return{token:_,endpoint:W,turn_server:{urls:C.split(","),username:B,credential:P},stun_server:{urls:h.split(",")},client_type:u}}catch(d){throw this._close(d,"Can't decompress conversation params"),d}}_logCallStartEvent(e,t){let r={[Le.OUTGOING]:"outgoing",[Le.INCOMING]:"incoming",[Le.JOINING]:"join"};Me.logEventualStat({name:E.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[r[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw T.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 G(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=Q.ACCEPTED;let r=this._getMuteStatesForCurrentRoom(),n=Object.keys(r);n.length&&this._onMuteParticipant({muteStates:r,mediaOptions:n,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());s.rooms?.rooms&&s.rooms.rooms.forEach(d=>{d.participantIds?.forEach(p=>{this._participants[p]&&(this._participants[p].isInRoom=!0)})}),this._conversation.roomId=s.rooms?.roomId||null;let o=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(I.onCallAccepted(),I.onLocalStream(this._mediaSource.getStream(),t),I.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),o),l.useParticipantListChunk){let d=await this._getInitialParticiapntListChunk();d?.participants?.forEach(p=>{let u=v.composeId(p),h=this._participants[u];h&&(h.movieShareInfos=p.movieShareInfos)}),this._onConversationParticipantListChunk({participants:d})}return I.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 T.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=Q.HUNGUP,this._signaling.ready&&await this._signaling.hangup(D.REJECTED),this._close(new G(D.REJECTED))}async hangup(){c.debug("Hangup");let e=this._state==="ACTIVE"?D.HUNGUP:D.CANCELED;T.log(E.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new G(e))):I.onHangup(new G(D.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new G(D.UNKNOWN_ERROR),"Unable to add participant");return}let r=await this._signaling.addParticipant(e.map($.toSignaling),t),n=null;r.type==="error"&&(r.error==="call-unfeasible"?n=r.status:n=D.UNKNOWN_ERROR);let s=r.participants;for(let o of s)await this._onAddParticipant(v.composeId(o),o,n)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new G(D.UNKNOWN_ERROR),"Unable to add participant");return}let r=await this._signaling.addParticipantLegacy(e,t),n=null;r.type==="error"&&(r.error==="call-unfeasible"?n=r.status:n=D.UNKNOWN_ERROR);let s=r.participants;for(let o of s)await this._onAddParticipant(v.composeId(o),o,n)}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 r=[];for(let n of e)(n.state===Q.CALLED||n.state===Q.ACCEPTED)&&(this._transport.isAllocated(n.id)||this._transport.allocate(n.id,t)),n.state===Q.ACCEPTED&&r.push(n.id);r.length&&this._transport.open(r,null,!!this._conversation?.observer)}_close(e,t){t&&c.error(t,e),c.debug("Close conversation",e),ln.sendHangupEvent(e,this._transport?.getTopology()),lt.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(D.FAILED):T.log(E.ERROR,e.hangup),z._activationMutex=!1;let r=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){I.onHangup(e,r),this.destroy();return}if(e.hangup===D.HUNGUP&&(!e.remote||this._isCalledState())){I.onHangup(e,r),this.destroy();return}if(e.hangup===D.MISSED&&!e.remote){I.onHangup(e,r),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=Q.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),T.destroy(),Me.destroy(),this._conversation=null,this._myLastRequestedLayouts={},z._current=null,z._delayedHangup=!1,I.onHangup(e||new G(D.UNKNOWN_ERROR),r)}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=Q.HUNGUP,this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._cleanupListeners(),T.destroy(),Me.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 r=[],{turn_server:n,stun_server:s}=t;if(s&&r.push(s),n&&n.urls){let o=n.urls.filter((d,p,u)=>u.indexOf(d)===p);o.push(`${o[o.length-1]}?transport=tcp`),r.push({urls:o,username:n.username,credential:n.credential})}return l.iceServers=r,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:r,token:n,client_type:s}){let o=[];if(t&&o.push(t),e&&e.urls){let d=e.urls.filter((p,u,h)=>h.indexOf(p)===u);d.push(`${d[d.length-1]}?transport=tcp`),o.push({urls:d,username:e.username,credential:e.credential})}l.iceServers=o,l.wssBase=r,l.wssToken=n,s&&(l.clientType=s)}_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:r,mediaOptions:n,payload:s="",joiningAllowed:o=!1,requireAuthToJoin:d=!1,onlyAdminCanShareMovie:p,externalIds:u,startedTime:h,onFastStart:_}){Je(E.SIGNALING_CONNECTED);let C=v.uuid();c.debug("Conversation: start",{conversationId:C,opponentIds:e,opponentType:t,direction:r});let P=n.includes(oe.VIDEO),B;if(_)try{let X={deviceId:this._api.deviceId(),sdkVersion:l.sdkVersion,clientAppKey:l.apiKey,platform:l.platform,protocolVersion:l.protocolVersion,domainId:l.domain},fe=JSON.stringify(X),Oe=await _({internalParams:fe,conversationId:C,externalIds:u,opponentType:t,mediaOptions:n,isVideo:P,joiningAllowed:o,requireAuthToJoin:d}),J=JSON.parse(Oe.internalCallerParams);B={endpoint:J.endpoint,wt_endpoint:J.wtEndpoint,id:C,is_concurrent:J.isConcurrent,client_type:J.clientType,rejected_participants:Oe.rejectedParticipants,stun_server:J.stun,turn_server:J.turn,token:new URL(J.endpoint).searchParams.get("token")??""},c.debug("FastStart",B)}catch{throw new G(D.UNKNOWN_ERROR,{message:"Cannot parse internal params"})}else B=await this._api.startConversation(C,e,t,P,s,o,d,{onlyAdminCanShareMovie:p},u),c.debug("Api.startConversation",B);this._setConversationParams(B);let W=await this._connectSignaling(ot.START,B);return await this._setConversation(B,W,r),this._logCallStartEvent(h,Le.OUTGOING),W}async _joinConversation(e,t){Je(E.SIGNALING_CONNECTED);let{conversationId:r,mediaOptions:n,chatId:s,joinLink:o,observedIds:d,payload:p}=e;c.debug("Conversation: join",{conversationId:r,joinLink:o,observedIds:d});let u=n.includes(oe.VIDEO),h;if(r)h=await this._api.joinConversation(r,u,s);else if(o)h=await this._api.joinConversationByLink(o,u,d,p);else throw new G(D.UNKNOWN_ERROR);c.debug("Api.joinConversation",h),this._setConversationParams(h);let _=await this._connectSignaling(ot.JOIN,h);return await this._setConversation(h,_,Le.JOINING),this._logCallStartEvent(t,Le.JOINING),_}async _prepareConversation(e,t=re.USER,r,n){Je(E.SIGNALING_CONNECTED),c.debug("Conversation: push",{conversationId:e,type:t,peerId:r});let s=this._api.getUserId();if(!s)throw new G(D.UNKNOWN_ERROR);let o=0,d="",p="",u={id:e,peerId:r,endpoint:d,wt_endpoint:p,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(n){let _=this._decodeExternalConversationParams(n);this._setConversationParams(_),d=`${l.wssBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`,l.wtsBase&&(p=`${l.wtsBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`),u.token=_.token,u.endpoint=d,u.wt_endpoint=p}else{let _=await this._getConversationParams(e);o=_.device_idx||0,d=`${l.wssBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`,d=this._addGeoParamsToEndpoint(d,_),l.wtsBase&&(p=`${l.wtsBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`,p=this._addGeoParamsToEndpoint(p,_)),u.token=_.token,u.endpoint=d,u.wt_endpoint=p,u.device_idx=o}let h=await this._connectSignaling(ot.ACCEPT,u);return z._current&&(z._current._participantState===Q.ACCEPTED||z._current._participantState===Q.CALLED)?(c.log("Push rejected (busy)"),T.log(E.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(D.BUSY),Promise.reject(new G(D.BUSY))):(z._current&&(z._current.destroy(),z._current=null),await this._setConversation(u,h,Le.INCOMING,t),h)}async _createParticipant(e,t){let r=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 r.externalId||(r.externalId=await this._getParticipantId(t??r.id)),this._api.cacheExternalId(t??r.id,r.externalId),t&&this._api.mapDecorativeId(t,r.id),r.observedIds?.length&&(r.externalId.observer=!0),e.markers&&(r.markers=this._denormalizeMarkers(r.id,e.markers)),r}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new G(D.NETWORK_ERROR),t),t}}async _setConversation(e,t,r,n=re.USER){let{participants:s}=t.conversation;s.forEach(u=>{let h=v.composeId(u),_=$.fromSignalingParticipant(u,!1);if(_){this._api.cacheExternalId(h,_);let C=v.composeDecorativeId(u),P=$.fromSignalingParticipant(u);C&&P&&(this._api.cacheExternalId(C,P),this._api.mapDecorativeId(u.decorativeUserId,u.id))}});let o=this._api.getUserId(),d=e.device_idx||0;if(!o){let u=(t.conversation.participants||[]).find(h=>v.comparePeerId(h.peerId,t.peerId));if(!u)throw new G(D.UNKNOWN_ERROR);o=Number(u.id),u.idType&&(n=u.idType),u.deviceIdx&&(d=u.deviceIdx),this._api.setUserId(o)}let p=v.composeParticipantId(o,n,d);this._conversation={userId:o,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:r,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},Be.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(l.forceRelayPolicy=e.p2p_forbidden),T.log(E.RELAY_POLICY,l.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new G(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 dr;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new mi(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint??null),this.subscribe(this._signaling,De.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._signaling,De.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,De.RECONNECT,this._onSignalingReconnect.bind(this));let r=await this._signaling.connect(e,t);return Me.logEventualStat({name:E.SIGNALING_CONNECTED}),r}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&&I.onConversationParticipantListChunk(this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{...{participants:[],countBefore:0,countAfter:0,markerFound:!1},...e}}_participantListChunkToExternalChunk(e){let t=v.mapSharedParticipants(e.participants.reduce((r,n)=>{let s=v.composeId(n);return this._participants[s]&&r.push(this._participants[s]),r},[]));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 r of t)await this._registerParticipants(r?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let r=e[0]?.externalId?.type;r&&(l.externalUserType=r);for(let n of e){let s=v.composeId(n);if(c.test("Conversation:RegisterParticipant",s),this._isMe(s)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(c.debug(`Local roles changed: ${n.roles}`),I.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(n);continue}if(n.state===Q.HUNGUP||n.state===Q.REJECTED){this._participants[n.id]&&this._removeParticipant(this._participants[n.id],D.HUNGUP);continue}let o=v.composeDecorativeId(n),d=await this._createParticipant({id:s,externalId:$.fromSignalingParticipant(n),mediaSettings:Re(n.mediaSettings),participantState:v.mapParticipantState(n),state:n.state,roles:n.roles||[],status:"WAITING",muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(s,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},o);this._registerParticipantInCache(d),n.roles&&n.roles.length&&(c.debug(`Roles for participant [${s}] changed: ${n.roles}`),I.onRolesChanged(this._participants[s].externalId,n.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let r=async()=>{let n=tn(e,Ge.MUTE),s=tn(e,Ge.MUTE_PERMANENT);for(let o of[n,s])o.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:o,stateUpdated:!0})};v.setImmediate(()=>r().catch(n=>c.error(n)))}_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 r=this._api.getDecorativeIdByInitialId(v.decomposeId(e).id),n=r?v.composeUserId(r):void 0;return this._createParticipant({id:e},n)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(l.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(l.useParticipantListChunk){let r=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return r.markers=this._denormalizeMarkers(r.id,t),r}return this._participants[e]}_warnParticipantNotInConversation(e){c.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let r=Object.values(t).find(n=>"ts"in n&&"rank"in n);return Object.entries(t).reduce((n,[s,o])=>(n[s]={...r,...o,id:e},n),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let r=Os(e);this._setMuteStatesForRoomId(r,null);for(let d of e.rooms?.rooms??[])this._setMuteStatesForRoomId(d.muteStates,d.id);let n=this._getMuteStatesForCurrentRoom();t&&(n=Us(e,n));let s=Object.keys(n),o=this._conversation?.roomId;s.length&&this._onMuteParticipant({muteStates:n,mediaOptions:s,muteAll:!0,stateUpdated:!0,roomId:o},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}_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 on(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new ji,this.subscribe(this._transport,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,"LOCAL_STATE_CHANGED",this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,"AUDIO_MIX_STALL",this._onAudioMixStall.bind(this)),this.subscribe(this._transport,"REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,"SIGNALLED_STALLED_PARTICIPANTS",this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this)),this.subscribe(this._transport,"NETWORK_STATUS",this._onNetworkStatus.bind(this)),this.subscribe(this._transport,"REMOTE_STREAM_SECOND",this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,"PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,"ASR_TRANSCRIPTION",this._onAsrTranscription.bind(this)),this.subscribe(this._transport,"ANIMOJI_STREAM",this._onAnimojiStream.bind(this)),this.subscribe(this._transport,"ANIMOJI_ERROR",this._onAnimojiError.bind(this));let e=this._conversation.direction===Le.OUTGOING&&!this._conversation.concurrent;for(let t of Object.values(this._participants))(t.state===Q.ACCEPTED||t.state===Q.CALLED)&&this._transport.allocate(t.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new cn(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new dn(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Wi(this._mediaSource))}_createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new zi(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()?"✔":"✖")),T.log(E.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){T.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}_removeParticipant(e,t){if(!(e.state===Q.CALLED||e.state===Q.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[r,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(r),this._sequenceNumberByStreamDescription.delete(r),this._cooldownTimestampByStreamDescription.delete(r),this._streamWaitTimerByStreamDescription.has(r)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(r)),this._streamWaitTimerByStreamDescription.delete(r)),this._sendUpdateDisplayLayout({[r]:{stopStream:!0}});this._api.unmapDecorativeId(e.id),delete this._participants[e.id],I.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,r){c.debug(`Add new participant [${e}]`);let n=this._participants[e];if(n&&(n.state===Q.ACCEPTED||n.state===Q.CALLED)){c.warn(`Participant [${n.id}:${n.state}] is already in conversation`);return}if(!n){let s=v.composeDecorativeId(t);n=this._registerParticipantInCache(await this._createParticipant({id:e,externalId:$.fromSignalingParticipant(t,!!t.decorativeExternalUserId),mediaSettings:Re(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s))}this._setParticipantsStatus([n],"WAITING"),r?(n.state=Q.HUNGUP,this._removeParticipant(n,r)):this._transport&&(n.state=Q.CALLED,this._transport.allocate(n.id,!0),T.log(E.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(n))}_onRemoveParticipant(e){c.debug(`Remove participant [${e}]`);let t=[];for(let r=0;r<=Sd;r++){let n=v.compose(e,r),s=this._participants[n];s&&t.push(s)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let r of t)this._transport.close(r.id);T.log(E.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(ne.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(ne.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(ne.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,r=null){if(!this._transport||!this._conversation)return;let n=!t,s=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let o=r??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:o,isMe:n});return}this._transport.setAnimojiSvg(s,{svg:e,isMe:n})}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 T.log(E.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return T.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={},r={};for(let n of e){let s=typeof n.uid=="object"?n.uid:$.fromId(n.uid),o=$.toString(s);r[o]=n.priority}for(let n of Object.values(this._participants)){let s=$.toString(n.externalId);r.hasOwnProperty(s)&&(t[n.id]=r[s])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[r,n]of Object.entries(e))if(r.length>5||n.length>5)throw new Error("key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded");t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[at(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready||this._transport?.getTopology()!=="SERVER")return;c.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={};for(let n of e){let s=typeof n.uid=="object"?n.uid:$.fromId(n.uid),o=this._api.getCachedOkIdByExternalId(s);if(!o){let u=$.toString(s);c.log(`Unknown participant external ID ${u}`);continue}let d=at({participantId:o,mediaType:n.mediaType,streamName:n.streamName}),p=this._participants[o];p?p.lastRequestedLayouts[d]=n:this._isMe(o)&&(this._myLastRequestedLayouts[d]=n),si(n)?(this._isMe(o)&&delete this._myLastRequestedLayouts[d],this._streamIdByStreamDescription.has(d)&&!this._cooldownTimestampByStreamDescription.has(d)&&this._cooldownTimestampByStreamDescription.set(d,Date.now())):(this._cooldownTimestampByStreamDescription.delete(d),!this._streamIdByStreamDescription.has(d)&&l.videoTracksCount>0&&this._streamIdByStreamDescription.set(d,null),t[d]=n),n.mediaType==="SCREEN"&&!si(n)&&Je(Xt(o))}let r=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>l.videoTracksCount;){let n=r.next();if(n.done){c.error("Cannot accommodate all streaming requests: tracks available "+l.videoTracksCount+"; requested streams: "+Array.from(this._streamIdByStreamDescription.keys()));break}this._stopStreaming(n.value),t[n.value]={stopStream:!0}}await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,r){if(this._conversation)if(!l.clientEventsLoggingEnabled)this._api.sendUserFeedbackStats(this._conversation.id,e,t,r);else{let n={event_type:E.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(n.reason=t),r!==void 0&&(n.group_call_users_count=r),T.logClientEvent(n,!0)}}sendClientEvent(e,t={},r=!1){let n={event_type:e,...t};T.logClientEvent(n,r)}_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 r=xi(e),n=this._participants[r.participantId],s=this._conversation?.externalId,o=this._isMe(r.participantId);if(n||o){switch(r.mediaType){case"STREAM":case"MOVIE":{if(r.streamName){let d={stream:null,streamName:r.streamName,mediaType:r.mediaType};o?I.onLocalLive(s,d):I.onRemoteLive(n.externalId,d)}break}case"CAMERA":{I.onRemoteStream(n.externalId,null);break}case"SCREEN":{I.onRemoteScreenStream(n.externalId,null);break}}T.log(E.PAT_DEALLOCATED)}else c.log(`Cannot find participant to stop streaming: ${r.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 r=[];for(let[n,s]of Object.entries(t.errorCodeByParticipantId||{})){let o=xi(n),d=this._participants[o.participantId];if(d){let p;typeof s!="number"?(c.warn(`Unexpected error code ${s} received for participant ${o.participantId}`),p=Ps.UNKNOWN_ERROR):p=ws(s),r.push({externalId:d.externalId,errorReason:p})}}if(r&&r.length)throw new ea("Could not allocate one or more participants",r)}_cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let r=t.next();if(r.done)break;let n=r.value;if(n[1]+_d>Date.now())break;let o=n[0];this._stopStreaming(o),e[o]={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 r of t)this._waitForStreamIfNeeded(r)}}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 G(D.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),I.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,r=[],n,s){c.log(`Chat room updated: ${e}`);let o=[],d=[],p=[],u=[],h=[];if(r.length&&r.forEach(P=>{if(P.externalId){let B=$.fromSignaling(P.externalId);h.push(B),this._api.cacheExternalId(P.id.id,B)}else{let B=v.decomposeId(P.id.id).id;o.push(B),u.push(B)}}),n?.length&&n.forEach(P=>{let B=v.decomposeId(P).id;o.push(B),d.push(B)}),s?.length&&s.forEach(P=>{let B=v.decomposeId(P).id;o.push(B),p.push(B)}),!o.length){I.onChatRoomUpdated(e,t,h,[],[]);return}if(u.length){let P=await this._api.getExternalIdsByOkIds(u);h.push(...P)}let _=await this._api.getExternalIdsByOkIds(d),C=await this._api.getExternalIdsByOkIds(p);I.onChatRoomUpdated(e,t,h,_,C)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let r of e.data)if(this._isMe(r.participantId))I.onLocalLiveUpdate(t,r);else{let s=await this._getExternalIdByParticipantId(r.participantId);s&&I.onRemoteLiveUpdate(s,r)}}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(r=>this._processSharedMovieInfo(r,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let r=this._conversation?.externalId;if(this._isMe(e.initiatorId))I.onLocalSharedMovieInfo(r,e,t);else{let s=await this._getExternalIdByParticipantId(e.initiatorId);s&&I.onRemoteSharedMovieInfo(s,e,t)}this._forceOpenTransportForAloneInCall()}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(r=>this._isMe(v.composeId(r)));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 r=e?.rooms?.roomId??this._conversation?.roomId??null,n=this._conversation?.asrInfoByRoom.get(r);if(n){let s=await this._getExternalIdByParticipantId(n.initiatorId);s&&I.onAsrSet({externalId:s,movieId:n.movieId},r)}else r&&I.onAsrSet(null,r)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,r=this._conversation.roomId,n=t.get(r);if(n&&!this._isMe(n.initiatorId)){let s=await this._getExternalIdByParticipantId(n.initiatorId);s&&I.onRemoteSharedUrl(s,n.sharedUrl,r)}}_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 r of e.rooms.rooms)r.urlSharingInfo?t.set(r.id,r.urlSharingInfo):t.delete(r.id)}async _onSharedMovieInfoStopped(e){c.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:r,movieId:n,source:s,roomId:o=null}=e,d={initiatorId:r,movieId:n,source:s};if(this._isMe(r))I.onLocalSharedMovieStoppedInfo(t,d,o);else{let u=await this._getExternalIdByParticipantId(r);if(u){let h=this._participants[r];h?.movieShareInfos&&(h.movieShareInfos=h.movieShareInfos.filter(_=>_&&_.movieId!==n)),I.onRemoteSharedMovieStoppedInfo(u,d,o)}}}async _onUrlSharingInfoUpdated(e){if(c.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:r}=this._conversation,{initiatorId:n,sharedUrl:s,roomId:o=null}=e;if(s?t.set(o,{sharedUrl:s,initiatorId:n}):t.delete(o),!(!s&&o!==r&&t.has(r))&&(!s||!this._isMe(n))){let d=await this._getExternalIdByParticipantId(n);d&&I.onRemoteSharedUrl(d,s,o)}}_onFeaturesPerRoleChanged(e){c.log(`Features per role changed: ${e.notification}`),I.onFeaturesPerRoleChanged(e.featuresPerRole)}_waitForStreamIfNeeded(e){let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:r,participantId:n}=t;if(r==="ANIMOJI")return;let s=this._participants[n];if(l.producerScreenDataChannel&&r==="SCREEN"&&!e.fastScreenShare){c.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let o=at(t),d=this._sequenceNumberByStreamDescription.get(o);if(d&&d>e.sequenceNumber){c.warn(`Participant ${n} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${d}`),T.log(E.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&r&&(c.debug(`participant-sources-update: mediaType=${r}, suspend=${e.suspend}`),I.onRemoteStreamSuspended(s.externalId,r,e.suspend));let p=e.streamId,u=e.rtpTimestamp?this._getWaitingTime(p,e.rtpTimestamp):0;if(u<=0){this._streamWaitTimerByStreamDescription.delete(o);let h=this._conversation?.externalId,_=this._isMe(n);if(!s&&!_){T.log(E.PAT_ERROR,"participantMissing"),c.error(`Could not find participant by ID: ${n}`);return}let C=_?h:s.externalId,P=this._streamByStreamId.get(p);if(!P){T.log(E.PAT_ERROR,"streamNotFound"),c.error(`Could not find stream by ID: ${p}`);return}T.log(E.PAT_ALLOCATED),this._streamIdByStreamDescription.set(o,p);let B=e.participantStreamDescription?.mediaType;if(B==="STREAM"||B==="MOVIE"){if(e.participantStreamDescription?.streamName){let W={streamName:e.participantStreamDescription.streamName,stream:P,mediaType:B};_?I.onLocalLive(C,W):I.onRemoteLive(C,W)}}else if(l.producerScreenTrack&&B==="SCREEN")I.onRemoteScreenStream(s.externalId,P);else if(!_){let W=(l.producerScreenTrack?null:s.secondStream)||P;I.onRemoteStream(s.externalId,W)}}else{c.debug(`Waiting for ${u} until stream ${p} for ${o} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),u);this._streamWaitTimerByStreamDescription.set(o,h)}}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(at(e)))return e;let t=e.participantId;if(e.mediaType){let r={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(at(r)))return r}else{let r={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(at(r)))return r;let n={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(at(n)))return n}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?v.includesOneOf(this._conversation.roles,[mt.ADMIN,mt.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!v.includesOneOf(this._conversation.roles,[mt.ADMIN,mt.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===Q.CALLED}async grantRoles(e,t,r){this._checkAdminRole(),await this._signaling.grantRoles(e,t,r)}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,r=[],n=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,r,n)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,r=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,r),this._conversation?.pinnedParticipantIdByRoom.set(r,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=Es(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,r){if(!this._signaling)return Promise.reject();let n=null;if(e&&(n=ks(e),n)){let u=this._api.getDecorativeIdByInitialId(n.id);n.id=u?v.composeUserId(u):n.id}let s=await this._signaling.getWaitingHall(n,t,r);if(s.error)return Promise.reject(s.message);let o=s.participants||[],{externalIds:d}=await this._resolveWaitingHallExternalIds(o),p=null;return o.length&&s.hasMore&&(p=Ds(o[o.length-1].id)),{participants:d,pageMarker:p,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,r=[],n=[];if(e.length){let s=[];e.forEach(o=>{if(t.set(o.id.id,o.id.addedTs),o.externalId){let d=$.fromSignaling(o.externalId);r.push(o.id.addedTs),n.push(d),this._api.cacheExternalId(o.id.id,d)}else s.push(v.decomposeId(o.id.id).id)}),s.length&&!n.length&&(n=await this._api.getExternalIdsByOkIds(s),r=n.map(o=>{let d=this._api.getCachedOkIdByExternalId(o);return(d?t.get(d):void 0)||Date.now()}))}return{externalIds:n,timestamps:r}}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:r,timestamps:n}=await this._resolveWaitingHallExternalIds(t);return{timestamps:n,participants:r,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!v.includesOneOf(this._conversation.options,[Gt.WAITING_HALL,Gt.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(r){throw c.warn(`Failed to promote participant ${e}. ${r}`),r}}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 r=t.messages.length-1;r>=0;r--){let n=t.messages[r];await this._onChatMessage(n)}}}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:r,lang:n}){let s={movieId:e,lang:n};(t||t===0)&&(s.gain=t),r&&(s.metadata=r);let o=await this._signaling.addMovie(s);if(o.error)throw new Error(o.error);return{movieId:o.movieId,streamType:o.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw new Error(t.error)}async removeMovie(e){let t={movieId:e},r=await this._signaling.removeMovie(t);if(r.error)throw new Error(r.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 r=await this._signaling.updateRooms(e,t);if(r.error)throw new Error(r.error)}async activateRooms(e,t){let r=await this._signaling.activateRooms(e,t);if(r.error)throw new Error(r.error)}async switchRoom(e,t){let r=await this._signaling.switchRoom(e,t);if(r.error)throw new Error(r.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,r=null,n="DIRECT_LINK",s=null,o=null){let d={movieId:r,name:t,privacy:n,groupId:s,roomId:o,streamMovie:!e},p=await this._signaling.startStream(d);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,r=!1,n=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:r,roomId:n});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,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:l.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),r=await this._signaling.getParticipants(t);if(r.error)throw new Error(r.error);let n=r.participants,s=this._transport?.getState();return Promise.all(n.map(async o=>{let d=v.composeId(o);return this._createParticipant({id:d,externalId:$.fromSignalingParticipant(o),mediaSettings:Re(o.mediaSettings),participantState:v.mapParticipantState(o),state:o.state,roles:o.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:o.muteStates||{},unmuteOptions:o.unmuteOptions||[],observedIds:o.observedIds||[],markers:this._denormalizeMarkers(d,o.markers)},o.decorativeUserId)})).then(v.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 r=this._createParticipantListChunk(t.chunk),n=r.participants.filter(o=>{let d=v.composeId(o);return!this._participants[d]});await this._registerParticipants(n);let s=this._transport?.getState();return r.participants.forEach(o=>{let d=v.composeId(o),p=this._participants[d];p.status=this._getStatusByTransportState(s)??"WAITING",p.movieShareInfos=o.movieShareInfos,Object.assign(p.mediaSettings,Re(o.mediaSettings)),Object.assign(p.muteStates,o.muteStates),p.unmuteOptions=o.unmuteOptions??p.unmuteOptions,this._openTransport([p],!0)}),this._participantListChunkToExternalChunk(r)}async _getInitialParticiapntListChunk(){let e=l.participantListChunkInitIndex,t=l.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return c.debug("Get initial participant list chunk",n.chunk),n.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 mi(this._mediaSource)),I.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),l.consumerScreenTrack){let r=e.track?new MediaStream([e.track]):null;I.onScreenStream(r,t)}}_changeRemoteMediaSettings(e,t){c.debug(`Remote media settings changed [${e}]`,t);let r=this._conversation?.externalId;if(this._isMe(e)&&r){I.onLocalMediaSettings(r,t);return}let s=this._participants[e];if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&I.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_changeLocalParticipantState(e){c.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&I.onLocalParticipantState(e)}_changeRemoteParticipantState(e,t){c.debug(`Remote participant state changed [${e}]`,t);let r=this._participants[e];if(!r){this._warnParticipantNotInConversation(e);return}r.participantState=t||{},this._state==="ACTIVE"&&I.onRemoteParticipantState(r.externalId,r.participantState,r.markers)}_changeMultipleParticipantState(e,t){c.debug("Multiple participants state changed",e);let r=[],n;e.forEach((s,o)=>{if(this._isMe(o))n=s;else{let d=this._participants[o];if(!d){this._warnParticipantNotInConversation(o);return}d.participantState=s,r.push({externalId:d.externalId,participantState:{...s},markers:d.markers})}}),this._state==="ACTIVE"&&(n&&I.onLocalParticipantState(n),r.length&&I.onRemoteParticipantsState(r,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(c.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),I.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._onRecordInfo(null,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}I.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 s=Object.keys(this._participants),o=[];for(let d of e.conversation.participants){let p=v.composeId(d),u=d.roles||[];if(this._isMe(p)){Fi(this._conversation.roles,u)||this._onRolesChanged(p,u),t=()=>{this._registerParticipantLocalMuteState({muteStates:Ls(d),unmuteOptions:d.unmuteOptions})};continue}o.push(p);let h=this._participants[p];if(!h)await this._onJoinedParticipant({participantId:d.id,participant:d,mediaSettings:d.mediaSettings});else{let _=Re(d.mediaSettings);xa(_,h.mediaSettings)||this._changeRemoteMediaSettings(p,_);let C=v.mapParticipantState(d),P=h.participantState;v.isEqualParticipantState(C,P)||this._changeRemoteParticipantState(p,C),Fi(u,h.roles)||this._onRolesChanged(h.id,u)}}for(let d of s)o.indexOf(d)<0&&this._removeParticipant(this._participants[d],D.HUNGUP)}let r=e.rooms?.roomId??null;this._conversation.roomId!==r?this._onRoomSwitched(r).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=v.composeMessageId(e),r=v.getPeerIdString(e.peerId);if(c.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new G(D.MISSED),"Call accepted on other device");return}let n=this._participants[t];if(!n){let o=this._api.getDecorativeIdByInitialId(t),d=o?v.composeUserId(o,e.participantType):void 0;n=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Re(e.mediaSettings)},d))}n.state=Q.ACCEPTED,n.mediaSettings=Re(e.mediaSettings),this._logWithMediaSettings(E.ACCEPTED_OUTGOING,n.mediaSettings),this._conversation&&this._conversation.direction===Le.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),this._state==="ACTIVE"&&this._transport&&this._transport.open([n.id],r),this._changeRemoteMediaSettings(t,n.mediaSettings),this._changeRemoteParticipantState(t);let s=Object.keys(n.muteStates);s.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:s,stateUpdated:!0,participantId:t}),this._state==="ACTIVE"&&I.onAcceptedCall(n.externalId)}async _onHungup(e){c.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=v.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new G(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let r=this._participants[t];if(!r){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),r.state=e.reason===D.REJECTED?Q.REJECTED:Q.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(r,D.HUNGUP)}async _onAddedParticipant(e){c.debug(`Participant added [${e.participantId}]`);let t=v.composeMessageId(e),r=this._participants[t];if(r&&r.state!==Q.HUNGUP&&r.state!==Q.REJECTED){c.debug(`Participant [${t}] is already in conversation and is active`);return}if(!r){let{participant:n}=e,s=n.decorativeUserId,o=await this._createParticipant({id:t,externalId:$.fromSignalingParticipant(n),mediaSettings:Re(n.mediaSettings),state:n.state,participantState:v.mapParticipantState(n),roles:n.roles||[],muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[]},s);r=this._registerParticipantInCache(o)}r.state=Q.CALLED,r.mediaSettings=Re(e.participant?.mediaSettings),r.participantState=v.mapParticipantState(e.participant),r.roles=e.participant?.roles||[],this._setParticipantsStatus([r],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(r.id,!0),I.onParticipantAdded(r.externalId,r.markers),this._changeRemoteMediaSettings(t,r.mediaSettings),this._changeRemoteParticipantState(t,r.participantState),this._invokeRolesChangedCallbackIfNeeded(r)}async _onJoinedParticipant(e){c.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=v.composeMessageId(e),r=this._participants[t];if(r&&r.state===Q.ACCEPTED){c.warn(`Participant [${t}] is already in conversation and is active`);return}if(!r){let{participant:s}=e,o=s.decorativeUserId,d=await this._createParticipant({id:t,externalId:$.fromSignalingParticipant(s),mediaSettings:Re(s.mediaSettings),state:s.state,participantState:v.mapParticipantState(s),roles:s.roles||[],muteStates:s.muteStates||{},movieShareInfos:s.movieShareInfos,unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(t,s.markers)},o);r=this._registerParticipantInCache(d)}this._conversation&&this._conversation.direction===Le.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),r.state=Q.ACCEPTED,r.mediaSettings=Re(e.mediaSettings),r.participantState=v.mapParticipantState(e.participant),r.roles=e.participant.roles||[],this._transport?.isAllocated(r.id)?this._setParticipantsStatus([r],"CONNECTED"):this._setParticipantsStatus([r],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(r.id)||this._transport.allocate(r.id,!0),this._transport.open([r.id],null,!!this._conversation?.observer)),I.onParticipantJoined(r.externalId,r.markers),this._changeRemoteMediaSettings(t,r.mediaSettings),this._changeRemoteParticipantState(t,r.participantState),this._invokeRolesChangedCallbackIfNeeded(r);let n=Object.keys(r.muteStates);n.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:n,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(r.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new G(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=v.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteMediaSettings(t,Re(e.mediaSettings))}async _onParticipantStateChanged(e){let t=v.composeMessageId(e),r=v.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(r):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteParticipantState(t,r))}async _onParticipantsStateChanged(e){let{participants:t,roomId:r}=e,n=t.map(({id:d,markers:p})=>this._registerParticipantAndSetMarkersIfChunkEnabled(d,p));await Promise.all(n);let s=new Map,o=t.map(({id:d,participantState:p})=>this._getExternalIdByParticipantId(d).then(u=>[d,u&&v.mapParticipantState({participantState:p})]));try{(await Promise.all(o)).forEach(([p,u])=>{u&&s.set(p,u)}),this._changeMultipleParticipantState(s,r)}catch(d){c.warn(`_onParticipantsStateChanged: Failed to get external ids. ${d}`)}}_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(),I.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),r=Re(e.mediaSettings);t.isAudioEnabled!==r.isAudioEnabled&&await this._mediaSource.toggleAudio(r.isAudioEnabled),t.isVideoEnabled!==r.isVideoEnabled&&await this._mediaSource.toggleVideo(r.isVideoEnabled),l.consumerScreenTrack&&t.isScreenSharingEnabled!==r.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:r.isScreenSharingEnabled,fastScreenSharing:r.isFastScreenSharingEnabled,captureAudio:r.isAudioSharingEnabled})}_onSettingsUpdate(e){c.debug("Got settings update notification",e);let t={camera:e.camera,screenSharing:e.screenSharing};this._serverSettings=Zn(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),r=e.quality.maxDimension,n={camera:Object.assign({},this._serverSettings.camera,{maxBitrateK:t,maxDimension:r}),screenSharing:null};this._serverSettings=Zn(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}_onPeerRegistered(e){let t=v.composeMessageId(e);this._participants[t]&&(this._participants[t].clientType=e.clientType,this._participants[t].platform=e.platform),I.onPeerRegistered()}async _onMicSwitched(e){I.onDeviceSwitched(oe.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=v.composeMessageId(e),r=await this._getExternalIdByParticipantId(t);if(!r){this._warnParticipantNotInConversation(t);return}I.onChatMessage(e.message,r,e.direct)}async _onCustomData(e){if(e.data.hasOwnProperty("sdk"))return;let t=v.composeMessageId(e),r=await this._getExternalIdByParticipantId(t);if(!r){this._warnParticipantNotInConversation(t);return}I.onCustomData(e.data,r,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(t),n=!1;if(!r!=!e?n=!0:r&&e&&(n=r.recordMovieId!==e.recordMovieId||r.recordStartTime!==e.recordStartTime),n)if(this._conversation.recordsInfoByRoom.set(t,e),e){let s=await this._getExternalIdByParticipantId(e.initiator);s?I.onRecordStarted(s,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}else I.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 r=await this._getExternalIdByParticipantId(t);r&&I.onPinnedParticipant(r,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let r=await this._getExternalIdByParticipantId(t.initiator);r?I.onRecordStarted(r,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else I.onRecordStopped(e)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let r=await this._getExternalIdByParticipantId(t.initiatorId);r&&I.onAsrSet({externalId:r,movieId:t.movieId},e)}else I.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,r=t.get(e);if(r){let n=await this._getExternalIdByParticipantId(r.initiatorId);n&&I.onRemoteSharedUrl(n,r.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}I.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,r=e.roomId||null;this._conversation.asrInfoByRoom.set(r,t);let n=await this._getExternalIdByParticipantId(t.initiatorId);if(!n){this._warnParticipantNotInConversation(t.initiatorId);return}I.onAsrStarted(n,t.movieId,r),this._forceOpenTransportForAloneInCall()}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),I.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}I.onAsrTranscription(t,e.text,e.timestamp,e.duration)}_onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!Fi(this._conversation.roles,t)){c.debug(`Local roles changed: ${t}`),this._conversation.roles=t,I.onLocalRolesChanged(t),this._processMuteState({mediaOptions:tn(this._getMuteStatesForCurrentRoom(),Ge.MUTE_PERMANENT),stateUpdated:!0}),v.includesOneOf(t,[mt.ADMIN,mt.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let r=this._participants[e];r&&!Fi(r.roles,t)&&(c.debug(`Roles for participant [${e}] changed: ${t}`),r.roles=t,I.onRolesChanged(r.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:r,muteStates:n={},unmuteOptions:s=[],mediaOptions:o=[],roomId:d=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`,n),I.onMuteStates(n,s,o,r,e.unmute,u.externalId,p?.externalId,e.stateUpdated,e.requestedMedia,e.roomId));return}if(e.requestedMedia?.length||(r&&!t?this._setMuteStatesForRoomId(n,d):r||(this._conversation.muteStatesPersonal=n)),e.adminId&&this._isMe(e.adminId)){r&&I.onMuteStates(n,s,o,r,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:o,muteAll:r,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:n})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let r=this._getMuteStatesForRoomId(t),n=this._getMuteStatesForRoomId(e),s=Object.keys(r),o=Object.keys(n);this._processMuteState({mediaOptions:Array.from(new Set([...s,...o])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Q.ACCEPTED)return;let{mediaOptions:t=[],muteAll:r,unmute:n,stateUpdated:s,requestedMedia:o,roomId:d=null,unmuteOptions:p=[]}=e,u=e.adminId?this._participants[e.adminId]:null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(d)),_=this._mediaSource.getMediaSettings(),C=Object.entries(h);for(let[P,B]of C){let W=l.newMuteRules&&this._isCallAdmin()&&r;if(!(B!==Ge.MUTE&&B!==Ge.MUTE_PERMANENT||W)&&(this._isCallAdmin()&&B===Ge.MUTE_PERMANENT&&!r&&(h[P]=Ge.MUTE),!(!t.includes(P)||n)))switch(P){case oe.VIDEO:_.isVideoEnabled&&(I.onDeviceSwitched(oe.VIDEO,!1),await this.toggleLocalVideo(!1));break;case oe.AUDIO:_.isAudioEnabled&&(I.onDeviceSwitched(oe.AUDIO,!1),await this.toggleLocalAudio(!1));break;case oe.SCREEN_SHARING:_.isScreenSharingEnabled&&(I.onDeviceSwitched(oe.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case oe.AUDIO_SHARING:_.isAudioSharingEnabled&&(I.onDeviceSwitched(oe.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:_.isScreenSharingEnabled,fastScreenSharing:_.isFastScreenSharingEnabled,captureAudio:!1}));break}}I.onMuteStates(h,p,t,r,n,null,u?.externalId,s,o,d)}async _onPinParticipant(e,t=!1,r,n=null){if(!this._conversation)return;let s=this._conversation.pinnedParticipantIdByRoom.get(n);if(s&&s!==e)if(this._isMe(s))I.onLocalPin(!0,n);else{let o=await this._getExternalIdByParticipantId(s);o&&I.onPinnedParticipant(o,!0,this._denormalizeMarkers(e,r),n)}if(this._isMe(e))I.onLocalPin(t,n);else{let o=await this._getExternalIdByParticipantId(e);o&&I.onPinnedParticipant(o,t,this._denormalizeMarkers(e,r),n)}this._conversation.pinnedParticipantIdByRoom.set(n,t?null:e)}_onOptionsChanged(e){this._conversation&&!Is(this._conversation.options,e)&&(this._conversation.options=e,I.onOptionsChanged(e))}_onNetworkStatus(e){if(this._conversation){let t=[];for(let[r,n]of Object.entries(e)){let s;if(this._isMe(r)||r==="")s=this._conversation.networkRating;else if(this._participants[r])s=this._participants[r].networkRating;else continue;if(s!==n)if(this._isMe(r)||r==="")this._conversation.networkRating=n,I.onLocalNetworkStatusChanged(n);else{let o=this._participants[r];o.networkRating=n,t.push({uid:o.externalId,rating:n})}}if(t.length===0)return;c.log("Received network status update: ",e),I.onNetworkStatusChanged(t)}}_onRemoteStreamSecond(e,t){let r=this._participants[e];if(r){if(l.producerScreenTrack){I.onRemoteScreenStream(r.externalId,t);return}if(r.secondStream=t,l.videoTracksCount>0){let n=e;if(!this._streamIdByStreamDescription.has(n)){c.error("Received remote stream notification for a participant that has no track associated with it",n);return}let s=this._streamIdByStreamDescription.get(n);if(!s||this._streamWaitTimerByStreamDescription.has(n)){c.log("Delaying secondary stream start/stop until main stream becomes available",n);return}let o=this._streamByStreamId.get(s);if(!o){T.log(E.PAT_ERROR,"streamNotFound"),c.error(`Could not find stream by ID: ${s}`);return}I.onRemoteStream(r.externalId,r.secondStream||o)}else{let n=t||r.remoteStream;n&&I.onRemoteStream(r.externalId,n)}}}_onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){I.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let r=this._participants[e];r&&I.onRemoteVmojiStream(r.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,I.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);I.onCallState(e,t,this._conversation)}}_changeNeedRate(){this._conversation&&this._conversation.needRate&&I.onRateNeeded()}_onVolumesDetected(e){let t=[];for(let[r,n]of Object.entries(e)){let s=this._participants[r];s&&s.externalId&&t.push({uid:s.externalId,volume:n.real})}I.onVolumesDetected(t)}_onSpeakerChanged(e){this._activeSpeakerId=e,this._participants[e]&&this._lastSignalledActiveSpeakerId!==e&&(I.onSpeakerChanged(this._participants[e].externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){c.debug(`Transport state has changed: ${t}`,e);let r=this._getStatusByTransportState(t);if(!r)return;let n=e.reduce((s,o)=>{if(o in this._participants){let d=this._participants[o];s.push(d),t==="CONNECTED"&&(d.remoteStream||(d.mediaSettings&&this._changeRemoteMediaSettings(o,d.mediaSettings),this._changeRemoteParticipantState(o,d.participantState)),this._updateDisplayLayoutFromCache(o))}else this._warnParticipantNotInConversation(o);return s},[]);n.length&&this._setParticipantsStatus(n,r)}async _onTransportLocalStateChanged(e){if(c.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(I.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&I.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&I.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(D.FAILED),this._close(new G(D.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,r){if(e.endsWith(et.AUDIO_MIX))c.debug("Remote audio mix track added"),this._audioOutput.add(r),I.onRemoteMixedAudioStream(t);else if(e.startsWith(et.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:r.kind});let n=this._participants[e];if(!n){let s=this._api.getDecorativeIdByInitialId(e),o=s?v.composeUserId(s):void 0;c.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${o}]`),n=this._registerParticipantInCache(await this._createParticipant({id:e},o)),this._setParticipantsStatus([n],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(I.onSpeakerChanged(n.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(n.id)&&this._transport.allocate(n.id,!1),r.kind==="audio"&&(this._audioOutput.add(r),l.preserveAudioTracks||(n.remoteAudioTrack=r,t.removeTrack(r))),n.remoteStream!==t&&t.getTracks().length){if(n.remoteStream=t,n.secondStream)return;I.onRemoteStream(n.externalId,t)}n.mediaSettings&&this._changeRemoteMediaSettings(e,n.mediaSettings)}}_onRemoteTrackRemoved(e,t,r){switch(c.debug(`[${e}] remote track (removed)`,{track:r}),r.kind){case"audio":this._removeAudioTrack(e,t,r);break;case"video":case"screen":this._removeVideoTrack(e,t,r);break}}_removeAudioTrack(e,t,r){if(e!==et.AUDIO_MIX){let n=this._participants[e];if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(r)}_removeVideoTrack(e,t,r){}_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),I.onLocalStatus(e?"RECONNECT":"CONNECTED"))}_onRemoteSignalledStall(e){let t={},r=[],n=[];c.debug("Participants stalled:",e);for(let s of e){if(t[s]=!0,!this._lastStalled[s]){let o=this._participants[s];o&&r.push(o)}delete this._lastStalled[s]}for(let s of Object.keys(this._lastStalled)){let o=this._participants[s];o&&n.push(o)}r.length&&this._setParticipantsStatus(r,"RECONNECT"),n.length&&this._setParticipantsStatus(n,"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}),I.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,r=null){if(!e.length)return;let n=e.reduce((s,o)=>(o.status!==t&&(o.status=t,s.push(o.externalId)),s),[]);n.length&&I.onRemoteStatus(n,t,r)}_onJoinLinkChanged(e){I.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let r of Object.keys(hi)){let n=e.updates[r];n&&(t[r]={rooms:await Promise.all(n?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:n?.roomIds,deactivated:n?.deactivated})}I.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(r=>r===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()||I.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(o=>this._getExternalIdByParticipantId(o))||[]),r=await Promise.all(e.addParticipantIds?.map(o=>this._getExternalIdByParticipantId(o))||[]),n=await Promise.all(e.removeParticipantIds?.map?.(o=>this._getExternalIdByParticipantId(o))||[]),s=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:r,removeParticipantIds:n,participants:e.participants?.participants?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(),r=e.roomId??null,n=e.addedParticipantIds?.map(C=>v.decomposeId(C).id)||[],s=await this._api.getExternalIdsByOkIds(n),o=e.addedParticipants;if(s.length&&o?.length!==s.length&&!this._isCalledState()){let C=this._convertExternalIdsToServerExternalIds(s);o=(await this._signaling.getParticipants(C)).participants}let d=await Promise.all(o?.map(async C=>{let P=v.composeId(C);return this._createParticipant({id:P,externalId:$.fromSignalingParticipant(C),mediaSettings:Re(C.mediaSettings),participantState:v.mapParticipantState(C),state:C.state,roles:C.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:C.muteStates||{},unmuteOptions:C.unmuteOptions||[],observedIds:C.observedIds||[],markers:this._denormalizeMarkers(P,C.markers),isInRoom:r!==null},C.decorativeUserId)})||[]),p=!1;for(let C of d)C.id===this._conversation?.compositeUserId&&(p=!0),this._registerParticipantInCache(C);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(d,!0);let u=[],h=[];if(e?.removedParticipantMarkers){for(let C of e.removedParticipantMarkers)if(C.GRID?.id){let P=this._getExternalIdByParticipantId(C.GRID.id);h.push(P)}u=await Promise.all(h)}if(p&&await this._onRoomSwitched(r),u){let C=this._conversation?.pinnedParticipantIdByRoom.get(r);if(C){let P=await this._getExternalIdByParticipantId(C);if(P){for(let B of u)if($.compare(P,B)){this._conversation?.pinnedParticipantIdByRoom.delete(r);break}}}}let _={roomId:r,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:v.mapSharedParticipants(d),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:u};this._isCalledState()||I.onRoomParticipantsUpdated(_)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let r=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){I.onRoomStart(e);return}this._isCalledState()||I.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,r),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let r=t?.rooms?.rooms??[],n=[];for(let s of r){let o=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,o),this._conversation?.recordsInfoByRoom.set(o,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(o,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(o,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(o,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(o),e){await this._registerParticipants(s?.participants?.participants?.filter(p=>!this._participants[v.composeId(p)])||[],!0);let d=await this._convertRoomToExternal(s);d&&n.push(d)}}n.length&&!this._isCalledState()&&I.onRoomsUpdated({[hi.UPDATE]:{rooms:n}})}async _onFeedback(e){let t=[];for(let r of e.feedback){let n={...r,items:[]};for(let s of r.items){let o=await this._getExternalIdByParticipantId(s.participantId);o?n.items.push({...s,participantId:o}):this._warnParticipantNotInConversation(s.participantId)}t.push(n)}I.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:r,decorativeExternalParticipantId:n}=e,s=this._isMe(t);c.debug(`Decorative participant id changed [${t}]`,e);let o=await this._getExternalIdByParticipantId(t);if(!o){this._warnParticipantNotInConversation(t);return}let d=$.fromSignaling(n,o.deviceIdx);I.onParticipantIdChanged(o,d),this._api.cacheExternalId(r,d),this._api.mapDecorativeId(r,t),s?this._conversation.externalId=d:this._participants[t].externalId=d}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(c.debug("Video suspend suggested",e),I.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 U=z,ea=class a extends Error{constructor(i,e){super(i),Object.setPrototypeOf(this,a.prototype),this.participantErrors=e}};var $t=null,fi=null;function qs(){$t=null,fi=null}async function un(a=null,i){let e=a??l.apiBaseUrl;if(e)return e;if((i??l.apiEnv)!=="AUTO")return l.apiEndpoint(i);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 c.debug("Resolved API endpoint",s),s}catch(t){return c.warn("Failed to resolve API endpoint using DNS, default is used",t),l.apiEndpoint(i)}}async function Ks(){return $t||fi||(fi=un(),$t=await fi,fi=null,$t)}async function gi(a,i={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Ks();let t=zs(a,i,e),r=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${$t}/fb.do`,r)}async function Ji(a,i={},e=!1,t){await Ks();let r=zs(a,i,e);return vd(r,t)}async function vd(a,i){return new Promise((e,t)=>{let r=new XMLHttpRequest;r.open("POST",`${i??$t}/fb.do`,!0),r.setRequestHeader("Content-type","application/x-www-form-urlencoded"),r.onreadystatechange=()=>{if(r.readyState!==XMLHttpRequest.DONE)return;let n;try{n=JSON.parse(r.responseText)}catch{n={result:r.responseText}}r.status!==200||n.hasOwnProperty("error_msg")?t(n):e(n)},r.send(a)})}async function $s(a,i){try{let e=await fetch(a,{method:"POST",body:i});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 zs(a,i={},e=!1){i.method=a,i.format="JSON",i.application_key||(i.application_key=l.apiKey),e||(Te.sessionKey?i.session_key=Te.sessionKey:Te.accessToken&&(i.access_token=Te.accessToken));for(let[r,n]of Object.entries(i))typeof n=="object"&&(i[r]=JSON.stringify(n));let t="";for(let[r,n]of Object.entries(i))t&&(t+="&"),t+=`${r}=${encodeURIComponent(n)}`;return t}var Yi=class{async createJoinLink(i){return{join_link:"nop"}}async removeJoinLink(i){return{success:!0}}async getAnonymTokenByLink(i,e){return""}log(i){}logClientStats(i){}logClientEvents(i){}getCachedOkIdByExternalId(i){return null}cacheExternalId(i,e){}mapDecorativeId(i,e){}unmapDecorativeId(i){}getDecorativeIdByInitialId(i){}replaceByInitialIdIdIfExists(i){return typeof i=="string"?parseInt(i,10):i}hangupConversation(i){}sendUserFeedbackStats(i,e,t,r){}async removeHistoryRecords(i){}async getServerTime(){return Date.now()}cleanup(){}};var Ed=10,bd=700,Cd=3e3,_i=class extends Yi{constructor(){super(...arguments);this._userId=null;this._externalUidsCache=new Map;this._decorativeIdToInitialId=new Map;this._initialIdToDecorativeId=new Map}async _callUnsafe(e,t={},r=!1){let n=async s=>{try{return await Ji(e,t,r)}catch(o){if(!o.hasOwnProperty("error_msg")&&(s++,c.debug(`${e} network error, attempt ${s}...`),s<Ed))return await v.delay(Math.min(s*bd,Cd)),n(s);throw c.warn(e,"error",o),o}};return n(0)}async _call(e,t={},r=!1){try{return await this._callUnsafe(e,t,r)}catch(n){c.warn("Api call error",n);let s=ne.API;switch(n.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,r)}let o={message:n.error_msg,code:n.error_code};switch(n.custom_error&&(o.custom_error=n.custom_error),n.error_code){case 1101:s=D.SERVICE_DISABLED;break;case 300:s=D.NOT_FOUND;break;case 1102:s=D.CALLEE_IS_OFFLINE;break;case 1103:s=D.NOT_FRIENDS;break;case 1104:case 1106:s=D.EXTERNAL_API_ERROR;break;case 1113:s=D.CALLER_IS_REJECTED;break;case 1114:s=D.VCHAT_DETAILED_ERROR;break}throw new G(s,o)}}async userId(e){let t=v.extractOkId(e);if(Te.isEmpty())return $.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let r=this.getDecorativeIdByInitialId(t);return r&&(t=r),$.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!l.apiKey)throw new G(ne.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)),Te.sessionKey=t.session_key,Te.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&I.onTokenExpired(),new G(ne.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})};gi("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 r={data:JSON.stringify(t)};gi("vchat.clientStats",r)}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 r={data:JSON.stringify(t)};gi("vchat.clientEvents",r)}async uploadDebugLogs(e,t,r,n){let s={conversationId:e,webrtcPlatform:l.platform,startTime:t,endTime:r},o=await this._callUnsafe("vchat.getLogUploadUrl",s),d=new FormData,p=new Blob([n],{type:"application/json"});d.append("file",p,"log.json");let u=new URL(o.upload_url);return u.searchParams.append("size",p.size.toString()),$s(u.toString(),d)}async joinConversation(e,t=!1,r){let n={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};return r&&(n.chatId=r),this._call("vchat.joinConversation",n)}async createConversation(e,t="",r=!1,{onlyAdminCanShareMovie:n,audienceMode:s,audioOnly:o}={},d){let p=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:r,onlyAdminCanShareMovie:n,audienceMode:s,audioOnly:o,speakerIds:d});return this._startConversation(p)}async startConversation(e,t,r,n=!1,s="",o=!1,d=!1,{onlyAdminCanShareMovie:p}={},u){let h=this._preareStartConversationData({conversationId:e,isVideo:n,joiningAllowed:o,payload:s,requireAuthToJoin:d,onlyAdminCanShareMovie:p,externalIds:u});if(t&&t.length)switch(r){case dt.USER:h.uids=t.join(",");break;case dt.GROUP:h.gid=t[0];break;case dt.CHAT:h.chatId=t[0];break}return this._startConversation(h)}_ensureUuid(){if(!this._uuid){let e=It.get("uuid");e||(e=v.uuid(),It.set("uuid",e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:r="",joiningAllowed:n=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:o,audienceMode:d=!1,audioOnly:p=!1,speakerIds:u=[],externalIds:h}){let _={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};if(n&&(_.createJoinLink=!0),r&&(_.payload=r),l.domain&&(_.domainId=l.domain),l.externalDomain&&(_.externalDomain=l.externalDomain),s&&(_.requireAuthToJoin=!0),o!==void 0&&(_.onlyAdminCanShareMovie=o),d&&(_.audienceMode=d),p&&(_.audioOnly=p),u.length){let C=u.map(P=>v.composeUserId(P));_.speakerIds=C.join(",")}return h&&(_.externalIds=h.map($.toSignaling).join(",")),_}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 r={joinLink:e};t&&(r.anonymName=t);let n=await this._call("vchat.getAnonymTokenByLink",r);return this._userId=Number(n.uid),n.token}async joinConversationByLink(e,t=!1,r,n){let s={joinLink:e,isVideo:t,protocolVersion:l.protocolVersion};return r?.length&&(s.observedIds=r.join(",")),l.anonymToken&&(s.anonymToken=l.anonymToken),n&&(s.payload=n),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],r=[],n=new Map,s=Array.from(this._externalUidsCache.keys()),o=Array.from(this._externalUidsCache.values());for(let p of e){let u=$.toString(p),h=o.indexOf(u);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(n.set(String(p.id),u),r.push({id:p.id,ok_anonym:p.type==="ANONYM"}))}return r.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:r})).ids.forEach((p,u)=>{let h=Number(p.ok_user_id),_=String(p.external_user_id.id);n.has(_)&&(this.cacheExternalId(h,$.fromString(n.get(_))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,r=Array.from(this._externalUidsCache.keys()),n=Array.from(this._externalUidsCache.values());for(let s of e){let o=$.toString(s),d=n.indexOf(o);if(d>-1){let p=v.composeParticipantId(this.replaceByInitialIdIdIfExists(r[d]),re.USER,s.deviceIdx);t.set(s,p)}}return t}async getExternalIdsByOkIds(e){let t=[],r=[];for(let s of e)if(this._externalUidsCache.has(s)){let o=this.getDecorativeIdByInitialId(s),d=this._externalUidsCache.get(o??s);t.push($.fromString(d))}else r.push(s);if(!r.length)return t;let n=await this._getExternalIdsByOkIds(r);return Array.from(n.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),r=Array.from(this._externalUidsCache.values()),n=$.toString(e),s=r.indexOf(n);return s>-1?v.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),re.USER,e.deviceIdx):s>-1?v.composeParticipantId(t[s],re.USER,e.deviceIdx):null}cacheExternalId(e,t){let r=v.extractOkId(e);this._externalUidsCache.set(r,$.toString(t))}mapDecorativeId(e,t){let r=v.extractOkId(e),n=v.extractOkId(t);this._decorativeIdToInitialId.set(r,n),this._initialIdToDecorativeId.set(n,r)}unmapDecorativeId(e){let t=v.extractOkId(e),r=this.getDecorativeIdByInitialId(t);r&&this._decorativeIdToInitialId.delete(r),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=v.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=v.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:D.HUNGUP};l.anonymToken&&(t.anonymToken=l.anonymToken),gi("vchat.hangupConversation",t)}sendUserFeedbackStats(e,t,r,n){let s={collector:"app.vchat.events.product",data:JSON.stringify({application:`${l.appName}:${l.sdkVersion}`,platform:l.platform,items:[{type:1,operation:E.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:r,group_call_users_count:n}}]})};gi("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(r=>this.getDecorativeIdByInitialId(r)??r);try{let r=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),n=(s,o)=>{for(let[d,p]of Object.entries(s)){let u=Number(d),h=$.fromId(p,o);t.set(u,h),this.cacheExternalId(u,h)}};r.external_ids&&n(r.external_ids,"USER"),r.anonym_ids&&n(r.anonym_ids,"ANONYM");for(let s of e){let o=Number(s);if(!t.has(o)){let d=$.fromId(String(o));t.set(o,d),this.cacheExternalId(o,d)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};var Js=(e=>(e.KING="KING",e.PAWN="PAWN",e))(Js||{}),Ys=Js;var ta=(e=>(e.OFF="0",e.ON="1",e))(ta||{});var hn=class{constructor(i){this._queue=new Array(i).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(i){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=i,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(i){return(i+1)%this._queue.length}next(){let i=this._queue[this._readCursor];return i&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),this._left-=1),i}};var mn=class{constructor(i,e,t,r=null){this._uuid=v.uuid(),this._apiKey=e,this._callToken=t,this._apiEnv=i,this._baseApiUrl=r}async authorize(){let i={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 un(this._baseApiUrl,this._apiEnv),t=await Ji("auth.anonymLogin",i,!0,e);return v.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(i){let e={conversationId:i,reason:D.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await un(this._baseApiUrl,this._apiEnv);await Ji("vchat.hangupConversation",e,!0,t)}};var pe,Qi=null,Td={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},Rd={participantMarkerCompare:v.participantMarkerCompare};function yd(a){Qi=a}function Pd(a){l.videoEffects=a}function wd(a){l.audioEffects=a}function Md(a,i=null,e={},t=1){l.vmoji=a,l.vmojiOptions={protocolVersion:t,renderingOptions:e},i&&a.setSDK(i)}async function Ad(a){if(l.set(a),pe||(pe=new _i),ia.default.disableLog(!l.debug),c.toggle(l.debug),c.log(`Calls SDK ${l.sdkVersion}`,a),await y.init(),!y.isBrowserSupported())throw new G(ne.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:",`${a.simulcast} => ${l.simulcast}`)}async function Dd(a,i=[oe.AUDIO],e="",t=!1,r=!1,n,s){let o=[];return Array.isArray(a)?o=a.length?a:[]:a&&(o=[a]),Qs([],dt.USER,i,e,t,r,n,o,s)}async function Qs(a,i=dt.USER,e,t="",r=!1,n=!1,s,o,d){if(U.current())throw c.error("There is already active call"),new G(D.FAILED);return new U(pe,Qi).onStart({opponentIds:a,opponentType:i,mediaOptions:e,payload:t,joiningAllowed:r,requireAuthToJoin:n,onlyAdminCanShareMovie:s,externalIds:o,onFastStart:d})}async function kd(a,i){return Xs(a,re.USER,void 0,i)}async function Xs(a,i=re.USER,e,t){if(a===U.id())throw new Error("Push has already been processed");return new U(pe,Qi).onPush(a,i,e,t)}async function xd(a,i){return a&&(l.authToken=a),i!==void 0&&l.apiBaseUrl!==i&&(l.apiBaseUrl=i,qs()),pe.authorize()}async function Od(a=[oe.AUDIO]){return it().accept(a)}async function Nd(){let a=U.current();if(a)return a.decline()}async function Ld(a,i=[oe.AUDIO]){return Zs(a,i)}async function Zs(a,i,e){if(U.current())throw c.error("There is already active call"),new G(D.FAILED);return new U(pe,Qi).onJoin({conversationId:a,mediaOptions:i,chatId:e})}async function Ud(a,i=[oe.AUDIO],e,t,r){if(U.current())throw c.error("There is already active call"),new G(D.FAILED);return e&&(l.anonymToken=e),new U(pe,Qi).onJoin({joinLink:a,mediaOptions:i,observedIds:t,payload:r})}async function Bd(){let a=U.current();if(a)return a.hangup();U.hangupAfterInit()}async function Fd(a,i){let e=Array.isArray(a)?a:[a],t=U.current();t&&await t.addParticipant(e,i)}async function Vd(a,i){let e=U.current();if(e){let t=a.map(r=>v.composeUserId(r));await e.addParticipantLegacy(t,i)}}async function jd(a,i=!1){let e=await pe.getOkIdsByExternalIds([a]);return eo(e[0],i)}async function eo(a,i=!1){let e=U.current();if(e)try{await e.removeParticipant(v.composeUserId(a),i)}catch(t){c.warn(`Failed to remove participant ${a}. Perhaps he is no longer on the call. ${t}`)}}async function Wd(a,i){let e=U.current();if(a==="videoinput"&&vt.contains(i))return l.videoFacingMode=i,e?(y.isMobile()&&e.stopVideoTrack(),e.changeDevice(a)):void 0;if(!await y._saveDeviceId(a,i))throw new Error(`Device not found: ${i}`);if(e)return e.changeDevice(a)}async function Gd(a){let i=typeof a=="object"?{...a,fastScreenSharing:a.captureScreen&&a.fastScreenSharing,captureAudio:a.captureScreen&&a.captureAudio&&l.audioShare}:{captureScreen:a,fastScreenSharing:!1,captureAudio:!1},e=U.current();return e?e.toggleScreenCapturing(i):Promise.reject()}function Hd(a){let i=U.current();i&&i.toggleAnimojiCapturing(a)}async function qd(a,i=!1){let e=U.current();e&&await e.setVideoStream(a,i)}async function Kd(a){let i=U.current();i&&await i.toggleLocalVideo(a)}async function $d(a){let i=U.current();i&&await i.toggleLocalAudio(a)}async function zd(a){let i=U.current();if(i)return i.setLocalResolution(a)}async function Jd(a){let i=U.current();i&&await i.changePriorities(a)}async function Yd(a,i){let e=U.current();if(e){let t;if(i){let[r]=await pe.getOkIdsByExternalIds([i]);t=v.composeParticipantId(r,re.USER,i.deviceIdx)}await e.changeParticipantState(a,t)}}async function Qd(){let a=U.current();a&&await a.putHandsDown()}async function Xd(a){let i=U.current();i&&await i.updateDisplayLayout(a)}async function Zd(a,i,e=!1){let t=await pe.getOkIdsByExternalIds([a]);return to(t[0],$.getDeviceIdx(a),i,e)}async function to(a,i,e,t=!1){let r=U.current();r&&await r.grantRoles(v.composeParticipantId(a,re.USER,i),e,t)}async function el({externalId:a=null,muteStates:i,requestedMedia:e=[],roomId:t=null}){let r=null;return a&&(r=(await pe.getOkIdsByExternalIds([a]))[0]),io({uid:r,muteStates:i,requestedMedia:e,deviceIdx:$.getDeviceIdx(a),roomId:t})}async function io({uid:a=null,muteStates:i,requestedMedia:e=[],deviceIdx:t=0,roomId:r=null}){let n=U.current();if(n){let s=a?v.composeParticipantId(a,re.USER,t):null;await n.muteParticipant(s,i,e,r)}}async function tl(a,i=!1,e=null){let t=await pe.getOkIdsByExternalIds([a]);return ro(t[0],i,$.getDeviceIdx(a),e)}async function ro(a,i=!1,e=0,t=null){let r=U.current();r&&await r.pinParticipant(v.composeParticipantId(a,re.USER,e),i,t)}async function il(a){let i=U.current();i&&await i.updateMediaModifiers(a)}async function rl(a){let i=U.current();i&&await i.enableVideoSuspend(a)}async function nl(a){let i=U.current();i&&await i.enableVideoSuspendSuggest(a)}async function al(a){let i=U.current();i&&await i.changeOptions(a)}async function sl(a,i=null){let e=null;return i&&(e=(await pe.getOkIdsByExternalIds([i]))[0]),no(a,e)}async function no(a,i=null){let e=U.current();if(e){let t=i?v.composeUserId(i):null;await e.chatMessage(a,t)}}async function ol(a=10){let i=U.current();if(i)return i.chatHistory(a)}async function cl(a,i=null){let e=null;return i&&(e=(await pe.getOkIdsByExternalIds([i]))[0]),ao(a,e,$.getDeviceIdx(i))}async function ao(a,i=null,e=0){let t=U.current();if(t){let r=i?v.composeParticipantId(i,re.USER,e):null;await t.customData(a,r)}}async function dl(a="",i=!1,{onlyAdminCanShareMovie:e=!1}={}){return(await pe.createConversation(v.uuid(),a,i,{onlyAdminCanShareMovie:e})).join_link}async function ll(a="",i=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},r){let n=$.fromIds(r),s=await pe.getOkIdsByExternalIds(n);return(await pe.createConversation(v.uuid(),a,i,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},s)).join_link}async function pl(){let a=U.current();return a?a.createJoinLink():Promise.reject()}async function ul(){let a=U.current();return a?a.removeJoinLink():Promise.reject()}async function hl(a,i){return pe.getAnonymTokenByLink(a,i)}function ml(a){let i=U.current();i&&i.setVolume(a)}function fl(a){l.forceRelayPolicy=a}async function gl(a=!1,i=null,e=null,t="DIRECT_LINK",r=null,n=null){let s=U.current();return s?s.startStream(a,i,e,t,r,n):Promise.reject()}async function _l(a=null){let i=U.current();return i?i.stopStream(a):Promise.reject()}async function Sl(a=null){let i=U.current();return i?i.publishStream(a):Promise.reject()}async function vl(a,i,e=!1,t=null){let r=U.current();if(!r)return Promise.reject();let n,s,o=[];if(i?.length&&o.push(...i),a&&o.push(a),o.length){let d=await pe.getParticipantIdsByExternalIds(o);a&&(n=d.get(a),d.delete(a)),s=Array.from(d.values())}return r.recordSetConf(n,s,e,t)}async function Il(){let a=U.current();return a?a.getStreamInfo():Promise.reject()}async function El(a){let i=U.current();return i?i.addMovie(a):Promise.reject()}async function bl(a){let i=U.current();return i?i.updateMovie(a):Promise.reject()}async function Cl(a){let i=U.current();return i?i.removeMovie(a):Promise.reject()}async function Tl(a,i){let e=U.current();if(e){let t=[];for(let r of a){let n,s;r.addParticipantIds&&(n=(await pe.getOkIdsByExternalIds(r.addParticipantIds)).map(o=>v.composeUserId(o))),r.removeParticipantIds&&(s=(await pe.getOkIdsByExternalIds(r.removeParticipantIds)).map(o=>v.composeUserId(o))),t.push({id:r.id,name:r.name,participantCount:r.participantCount,addParticipantIds:n,removeParticipantIds:s,countdownSec:r.countdownSec})}return e.updateRooms(t,i)}return Promise.reject()}async function Rl(a,i){let e=U.current();return e?e.activateRooms(a,i):Promise.reject()}async function yl(a=null,i=null){let e=U.current();if(!e)return Promise.reject();let t;if(i){let r=await pe.getOkIdsByExternalIds([i]),n=$.getDeviceIdx(i);t=v.composeParticipantId(r[0],re.USER,n)}return e.switchRoom(a,t)}async function Pl(a){let i=U.current();return i?i.removeRooms(a):Promise.reject()}function wl(a){l.statisticsInterval=a;let i=U.current();if(i)return i.updateStatisticsInterval()}function Ml(a){ia.default.disableLog(!a),c.toggle(a)}function Al(a,...i){l.debugLog&&c.send(a,"[external]",...i)}async function Dl(){let a=Be.conversationId;if(!a)throw c.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let i=Be.collectLogs();if(i.length===0)throw c.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Be.startTime,t=Be.endTime;try{return pe?.uploadDebugLogs(a,e,t,JSON.stringify(i))}catch(r){throw c.error("[uploadDebugLogs]","Error while uploading logs",r),new Error("Error while uploading logs",{cause:r})}}async function kl(a){let i=U.current();if(i)return i.videoEffect(a)}async function xl(a,i){let e=U.current();if(e)return e.audioEffect(a.length>0?a:null,i)}async function Ol(a){let i=U.current();i&&await i.setAudioStream(a)}async function Nl(a,i=null,e=null){let t=U.current();if(!t)return;let r=e??i?.id,n=null;if(i){let o=(await pe.getOkIdsByExternalIds([i]))[0];if(!o)throw new Error("Could not get user id to set animoji svg");n=v.composeParticipantId(o,re.USER,$.getDeviceIdx(i))}t.setAnimojiSvg(a,n,r)}function Ll(a){let i=U.current();i&&i.setAnimojiFill(a)}async function Ul(a=null,i,e=!1){return it().getWaitingHall(a,i,e)}async function Bl(){return it().getAudienceModeHands()}async function Fl(a,i=!1){let e=it(),t;if(a){let[r]=await pe.getOkIdsByExternalIds([a]);t=v.composeUserId(r)}return e.promoteParticipant(t,i)}async function Vl(a=!1){return it().requestPromotion(a)}async function jl(a=!1){return it().acceptPromotion(a)}async function Wl(a){return it().getParticipantListChunk(a)}async function Gl(a){return it().getParticipants(a)}async function Hl(a){return it().feedback(a)}function ql(a,i,e){return it().userFeedbackStats(a,i,e)}function Kl(a,i={},e=!1){let t=U.current();t&&t.sendClientEvent(a,i,e)}async function $l(a,i){return it().enableFeatureForRoles(a,i)}function it(){let a=U.current();if(!a)throw new Error("Conversation not found");return a}async function zl(a){await pe.removeHistoryRecords(a)}async function Jl(a){let i=U.current();i&&await i.startAsr(a)}async function Yl(a){let i=U.current();i&&await i.stopAsr(a)}async function Ql(a){let i=U.current();i&&await i.requestAsr(a)}async function Xl(a){let i=U.current();return i?i.startUrlSharing(a):Promise.reject()}async function Zl(){let a=U.current();return a?a.stopUrlSharing():Promise.reject()}function ep(){return l.sdkVersion}
11
+ `,r=>{r.error?this._onFrame(null,r.error):this._onFrame({type:r.frameType,timestamp:r.timestamp,duration:r.duration,data:r.data,byteLength:r.data?.byteLength,width:r.width,height:r.height})},[],{readable:t,width:i,height:e,isVP9:this.isVP9(),framerate:this._frameRate,useCongestionControl:this._useCongestionControl,maxBitrate:this._maxBitrate,useCbr:this._useCbr},[t])}requestFrame(i=!1){this._sendToWorker("frame",{keyFrame:i})}setBitrate(i,e,t){this._sendToWorker("set_bitrate",{bitrate:i,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 Oo=2100,No=600,Lo=1.2,ka=.8,Uo=2e3,Bo=8e3,Mn=8e3,Fo=16e3,Vo=4,jo=2e3,ar=(t=>(t[t.NONE=0]="NONE",t[t.UP=1]="UP",t[t.DOWN=2]="DOWN",t))(ar||{}),wi=class{constructor(i,e,t,r,n,s,o){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=i,this._ccEnabled=r,this._minBitrate=e,this._maxBitrate=t,this._fastSharing=n,this._targetFps=o,s>0?this._highDelayThreshold=s:this._highDelayThreshold=Oo,n&&(this._highDelayThreshold=No),this._trendDelayThreshold=Math.round(this._highDelayThreshold/3),this._targetBitrate=this._maxBitrate,this._probing=!1;let d=Date.now();this._lastDown=0,this._lastUp=d,this._lastProbing=d,this._lastCheckDelay=0,this._lastFpsCalcMs=0}checkDelay(i,e,t){let r=Date.now();if(this._calcFps(r),this._calcDelay(e,r),this._delayAvgShort<=0||this._delayAvgLong<=0||!this._ccEnabled)return;let n=0,s=this._delayAvgShort-this._delayAvgLong,o=Math.round(Math.abs(s)*100/this._delayAvgLong),d=s>40&&o>30&&this._delayAvgShort>this._trendDelayThreshold,p=this._delayAvgShort>this._highDelayThreshold;d||p?n=2:Math.abs(s)<40&&o<10&&!p&&(n=1);let u=Math.round(this._targetBitrate/1e3),h=t;i%20===0&&c.debug(`#${i}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${ar[n]} tr=${u} br=${t}`);let S=r-this._lastDown;if(n===2&&S>Uo){this._probing&&(this._upPenalty=Math.min(++this._upPenalty,Vo),this._probing=!1);let X=ka*h*1e3;if(X>=this._targetBitrate&&(X=this._targetBitrate*ka),X=Math.max(X,this._minBitrate),X<this._targetBitrate){let fe=Math.round(X/1e3),Oe=Math.round(this._upPenalty*Mn/1e3);c.log(`#${i}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${ar[n]}`),c.log(`#${i}: cc: DOWN delay=${e} bitrate=${h} target=${u} -> newBitrate=${fe} penalty=${Oe}s`),this._setBitrate(X,!0),this._targetBitrate=X}this._lastDown=r}let R=r-this._lastUp,M=Bo+this._upPenalty*Mn;if(n===1&&R>M&&S>M){let X=Math.min(this._targetBitrate*Lo,this._maxBitrate);if(X>this._targetBitrate){let fe=Math.round(X/1e3),Oe=Math.round(this._targetBitrate/1e3),J=Math.round(this._upPenalty*Mn/1e3);c.log(`#${i}: cc: delay=${e} short=${this._delayAvgShort} long=${this._delayAvgLong} delta=${s} percent=${o} -> ${ar[n]}`),c.log(`#${i}: cc: UP bitrate=${h} target=${Oe} -> newBitrate=${fe} penalty=${J}s`),this._setBitrate(X,!1),this._targetBitrate=X,this._probing=!0,this._lastProbing=r,this._lastUp=r}}let F=r-this._lastProbing;this._probing&&F>Fo&&(this._probing=!1);let W=r-this._lastDown;this._upPenalty>0&&W>3*M&&(c.log(`#${i}: cc: UP reset penalty: oldPenalty=${this._upPenalty}`),this._upPenalty=0)}_setBitrate(i,e){this._fastSharing&&(e=!0);let t=this._targetFps;this._fps>0&&(t=this._fps),this._onCongestion(i,e,t)}_calcDelay(i,e){if(!(i<=0)){if(this._delayAvgShort===-1&&(this._delayAvgShort=i,this._delayAvgLong=i),this._delayAvgShort=Math.round((this._delayAvgShort*3+i)/4),this._delayAvgLong=Math.round((this._delayAvgLong*23+i)/24),i>0&&i<this._minDelay?this._minDelay=i:i>this._maxDelay&&(this._maxDelay=i),this._lastCheckDelay===0&&(this._lastCheckDelay=e),i>jo){let t=e-this._lastCheckDelay;this._largeDelayDuration+=t}this._lastCheckDelay=e}}reconfigure(i,e){this._minBitrate=i,this._maxBitrate=e}getStat(){if(this._minDelay===Number.MAX_VALUE||this._maxDelay===0||this._delayAvgLong<=0)return null;let i={minDelay:this._minDelay,maxDelay:this._maxDelay,avgDelay:this._delayAvgLong,largeDelayDuration:this._largeDelayDuration};return this._minDelay=Number.MAX_VALUE,this._maxDelay=0,this._largeDelayDuration=0,i}_calcFps(i){this._frames++;let e=i-this._lastFpsCalcMs;if(e>5e3){this._lastFpsCalcMs=i;let t=this._fps,r=this._frames*1e3/e;this._fps===0?this._fps=Math.round(r):this._fps=Math.round((this._fps*3+r)/4),this._frames=0,this._fps!==t&&c.log(`cc: fps=${this._fps}`)}}};var Mi=class{constructor(i){this._size=0;this._head=0;this._tail=0;this._maxSize=i,this._buffer=new Array(i)}add(i,e,t,r,n){this._tail===this._head&&this._size>0&&(this._head=++this._head%this._maxSize);let s=this._tail;return this._buffer[this._tail]={seq:i,ts:e,size:t,sent:Date.now(),start:r,end:n,ts2:-1,recv:-1},this._tail=++this._tail%this._maxSize,this._size++,s}update(i,e){let t=this.get(i);return t===null?null:(t.ts2=e,t.recv=Date.now(),t)}get(i){let e=this._head;for(let t=0;t<this._maxSize;t++){let r=this._buffer[e];if(i===r?.seq)return r;if(e=++e%this._maxSize,e===this._tail)break}return null}getServerBitrateK(i){let e=0,t=0,r=-1,n=-1,s=this._tail;for(let o=0;o<this._maxSize;o++){s>0?--s:s=this._maxSize-1;let d=this._buffer[s];if(!d||(n===-1&&(n=d.ts2,t=0),n>=0&&(t+=d.size),r=d.ts2,n-r>=i)||s===this._head)break}if(r>=0&&n>=0){let o=n-r;e=Math.round(o>0?t*8/o:0)}return e}getCurrentDelay(){let i=this._tail;for(let e=0;e<this._maxSize;e++){i>0?--i:i=this._maxSize-1;let t=this._buffer[i];if(!t)break;if(t.recv>=0&&t.sent>=0)return t.recv-t.sent;if(i===this._head)break}return 0}getMaxBandwidth(){let i=0,e=0,t=-1,r=-1,n=this._tail;for(let s=0;s<this._maxSize;s++){n>0?--n:n=this._maxSize-1;let o=this._buffer[n];if(o){if(r===-1&&o.end&&!o.start&&(r=o.ts2,e=0),t===-1&&r>=0&&o.start&&!o.end&&(t=o.ts2),t>=0&&r>=0){let d=r-t;i=d>0?e*8/d:0;break}if(r>=0&&(e+=o.size),n===this._head)break}}return Math.round(i)}clear(){this._buffer.fill(void 0),this._size=0,this._head=0,this._tail=0}};var An=65536,Go=50,Ho=400,qo=1e6,Ko=3e5,$o=3e4,zo=2e3,Jo=5,sr=0,Lt=class{constructor(i,e,t,r){this._destroyed=!1;this._needKeyframe=!0;this._frameNum=0;this._feedback=new Mi(1024);this._lastSentFrameSeq=0;this._lastDeliveredFrameSeq=0;this._lastFrameDelay=0;this._lastFramerateReduced=Date.now();this._lastSharingStat=Date.now();this._queue=new Pi;c.debug("ScreenCaptureSender started"),this.DATA_SIZE=l.consumerScreenDataChannelPacketSize-11,this._datachannel=e,this._signaling=t,this._fastSharing=r,this._congestionControlEnabled=l.screenShareCongestionControl||this._fastSharing,this._width=i.getSettings().width,this._height=i.getSettings().height,this._maxFrameDelay=this._fastSharing?l.screenShareCongestionControlThreshold:l.screenShareCongestionControlThreshold*2;let n=l.getScreenFrameRate(this._fastSharing),{minBitrate:s,maxBitrate:o}=this._calcMinMaxBitrate(this._width,this._height),d=this._onCongestionCallback.bind(this);c.log(`ScreenCaptureSender: CongestionControl: enabled=${this._congestionControlEnabled} minBitrate=${Math.round(s/1e3)}k maxBitrate=${Math.round(o/1e3)}k delayThreshold=${l.screenShareCongestionControlThreshold}`),this._congestionControl=new wi(d,s,o,this._congestionControlEnabled,this._fastSharing,l.screenShareCongestionControlThreshold,n);let p=(u,h)=>{if(this._destroyed)return;if(!u){c.warn("requestFrame failed, keyFrame: "+this._needKeyframe,h),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 S=this._sliceFrame(u);this._queue.merge(S),this._handleQueue(),this._sendSharingStat()};if(Nt.isBrowserSupported()){let u=this._fastSharing;this._encoder=new Nt(i,p,this._congestionControlEnabled,o,u,n)}else this._encoder=new ii(i,p,this._congestionControlEnabled,o);this._datachannel.onmessage=u=>{Aa(u.data)&&(c.debug(`[${this._datachannel.label}] Requested keyframe`),this._needKeyframe=!0);let h=Da(u.data);h!==null&&this._checkCcFeedback(h)},this._encoder.init().then(()=>this._handleQueue()).catch(u=>c.warn("ScreenCaptureSender init failed",u)),this._fpsMeter=new At(u=>c.log(`[ScreenCaptureSender] fps: ${u}`),5e3)}_handleQueue(){if(this._destroyed)return;let i=this._queue.shift();if(!i){if((this._lastSentFrameSeq-this._lastDeliveredFrameSeq+An)%An>Jo&&this._lastFrameDelay>this._maxFrameDelay){let r=Date.now();r-this._lastFramerateReduced>zo&&(this._lastFramerateReduced=r,c.debug(`[ScreenCaptureSender] reduce framerate: delay=${this._lastFrameDelay} maxDelay=${this._maxFrameDelay}`))}else this._requestFrame();return}if(!this._sendFrameChunk(i)){this._needKeyframe=this._needKeyframe||!this._cleanupQueue(),v.setImmediate(()=>this._handleQueue());return}if(i.isLast){this._frameNum++,this._fpsMeter.increment(),i.isKey&&c.debug(`#${this._frameNum}: sharing: send keyframe size=${Math.round(i.frameSize/1e3)}k`);let t=this._feedback.getCurrentDelay(),r=this._feedback.getServerBitrateK(2e3);t>0&&this._congestionControl.checkDelay(this._frameNum,t,r)}else v.setImmediate(()=>this._handleQueue())}_cleanupQueue(){let i=this._queue.head();for(;i;){if(i.isFirst&&i.isKey)return!0;this._queue.shift(),i=this._queue.head()}return!1}_requestFrame(){this._destroyed||(this._encoder.requestFrame(this._needKeyframe),this._needKeyframe=!1)}_sliceFrame(i){let e=i.type==="key",t=i.data.byteLength,r=new Pi;for(let n=0;n<t;n+=this.DATA_SIZE){let s=i.data.slice(n,n+this.DATA_SIZE),o=n===0,d=t<=n+s.byteLength,p=this._wrapHeader(i.timestamp,o,d,e,s);r.push({data:p.data,sequence:p.sequence,frameSize:t,isFirst:o,isLast:d,isKey:e,timestamp:i.timestamp})}return r}_wrapHeader(i,e,t,r,n){let s=wa(i,e,t,r,sr,this._encoder.isVP9(),n),o={sequence:sr,data:s};return sr=(sr+1)%An,o}_stopPacket(){return this._wrapHeader(Date.now(),!1,!1,!1,null).data}_sendFrameChunk(i){if(!this._datachannel||this._datachannel.readyState!=="open")return!1;try{return this._datachannel.send(i.data),this._feedback.add(i.sequence,i.timestamp,i.data.byteLength,i.isFirst,i.isLast),i.isLast&&(this._lastSentFrameSeq=i.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 Nt.isBrowserSupported()||ii.isBrowserSupported()}_onCongestionCallback(i,e,t){this._encoder.setBitrate(i,e,t)}_onResize(i,e){let{minBitrate:t,maxBitrate:r}=this._calcMinMaxBitrate(i,e),n=Math.round(t/1e3),s=Math.round(r/1e3);c.log(`cc: resize to ${i}x${e}, minBitrate=${n} maxBitrate=${s}`),this._congestionControl.reconfigure(t,r)}_calcMinMaxBitrate(i,e){(i===void 0||i<640)&&(i=640),(e===void 0||e<360)&&(e=360);let t=i*e/256,r=Math.max(Ko,Math.min(qo,Math.round(t*Go))),n=Math.round(t*Ho);return{minBitrate:r,maxBitrate:n}}_checkCcFeedback(i){let e=this._feedback.update(i.seq,i.ts2);if(e===null)c.debug(`cc: update failed, seq=${i.seq}`);else if(e.end){this._lastDeliveredFrameSeq=e.seq;let t=e.recv-e.sent;t>0&&(this._lastFrameDelay=t),this._handleQueue()}}_sendSharingStat(){let i=Date.now();if(i-this._lastSharingStat>$o){let t=this._congestionControl.getStat();t!==null&&(c.debug(`cc: send stats: ${JSON.stringify(t)}`),this._signaling.reportSharingStat(t)),this._lastSharingStat=i}}};var Te=class a{static get sessionKey(){return a._sessionKey}static set sessionKey(i){a._sessionKey=i}static get sessionSecretKey(){return a._sessionSecretKey}static set sessionSecretKey(i){a._sessionSecretKey=i}static get accessToken(){return a._accessToken}static set accessToken(i){a._accessToken=i}static isEmpty(){return!a._sessionKey}};var f=class f{static set(i){i.hasOwnProperty("voiceParams")&&(Object.assign(f._params.voiceParams,i.voiceParams),delete i.voiceParams),i.hasOwnProperty("specListenerParams")&&(Object.assign(f._params.specListenerParams,i.specListenerParams),delete i.specListenerParams),i.hasOwnProperty("apiAuth")&&(Te.accessToken=i.apiAuth.accessToken,Te.sessionKey=i.apiAuth.sessionKey,Te.sessionSecretKey=i.apiAuth.sessionSecretKey),Object.assign(f._params,v.objectFilterOutValues(i,void 0))}static get(i){return f._params[i]}static get appName(){return"ok.calls.sdk.js"}static get appVersion(){return 1.1}static get sdkVersion(){return"2.8.6-dev.b2f70eb6.0"}static get debug(){return f._params.debug}static get protocolVersion(){return f._params.joinFromMultipleDevices?6:5}static get platform(){return f._params.platform}static set platform(i){f._params.platform=i}static get clientStatsPlatform(){return f._params.clientStatsPlatform}static set clientStatsPlatform(i){f._params.clientStatsPlatform=i}static get clientType(){return f._params.clientType}static set clientType(i){f._params.clientType=i}static get externalUserType(){return f._params.externalUserType}static set externalUserType(i){f._params.externalUserType=i}static get device(){return f._params.device}static get apiKey(){return f._params.apiKey}static get apiEnv(){return f._params.apiEnv}static get apiBaseUrl(){return f._params.apiBaseUrl}static set apiBaseUrl(i){f._params.apiBaseUrl=i}static apiEndpoint(i){switch(i??f.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 f._params.apiEnv}}static get authToken(){return f._params.authToken}static set authToken(i){f._params.authToken=i}static get anonymToken(){return f._params.anonymToken}static set anonymToken(i){f._params.anonymToken=i}static get domain(){return f._params.domain}static get externalDomain(){return f._params.externalDomain}static get iceServers(){return f._params.iceServers}static set iceServers(i){f._params.iceServers=i}static get wssBase(){return f._params.wssBase}static set wssBase(i){f._params.wssBase=i}static get wtsBase(){return f._params.wtsBase}static set wtsBase(i){f._params.wtsBase=i}static get wssToken(){return f._params.wssToken}static set wssToken(i){f._params.wssToken=i}static get signalingReconnectDelay(){return f._params.signalingReconnectDelay}static get signalingReconnectMaxDelay(){return f._params.signalingReconnectMaxDelay}static get signalingReconnectMaxCount(){return f._params.signalingReconnectMaxCount}static get waitConnectionDelay(){return f._params.waitConnectionDelay}static get waitResponseDelay(){return f._params.waitResponseDelay}static get waitMessageDelay(){return f._params.waitMessageDelay}static get waitAnotherTabDelay(){return f._params.waitAnotherTabDelay}static get debugLog(){return f._params.debugLog}static get forceRelayPolicy(){return f._params.forceRelayPolicy}static set forceRelayPolicy(i){f._params.forceRelayPolicy=i}static get videoMinWidth(){return f._params.videoMinWidth}static get videoMaxWidth(){return f._params.videoMaxWidth}static set videoMaxWidth(i){f._params.videoMaxWidth=i}static get videoMinHeight(){return f._params.videoMinHeight}static get videoMaxHeight(){return f._params.videoMaxHeight}static set videoMaxHeight(i){f._params.videoMaxHeight=i}static get videoAspectRatio(){return f._params.videoAspectRatio}static get videoFrameRate(){return f._params.videoFrameRate}static get videoFacingMode(){return f._params.videoFacingMode||(y.isMobile()?"user":null)}static set videoFacingMode(i){f._params.videoFacingMode=i}static get displaySurface(){return f._params.displaySurface}static get audioEffects(){return f._params.audioEffects}static set audioEffects(i){f._params.audioEffects=i,f._params.audioEffects?.setLogger((e,...t)=>c.send(e,...t))}static get videoEffects(){return f._params.videoEffects}static set videoEffects(i){f._params.videoEffects=i,f._params.videoEffects?.setLogger((e,...t)=>c.send(e,...t))}static get videoEffectMaxWidth(){return f._params.videoEffectMaxWidth}static set videoEffectMaxWidth(i){f._params.videoEffectMaxWidth=i}static get videoEffectMaxHeight(){return f._params.videoEffectMaxHeight}static set videoEffectMaxHeight(i){f._params.videoEffectMaxHeight=i}static get vmoji(){return f._params.vmoji?.isBrowserSupported()?f._params.vmoji:null}static set vmoji(i){f._params.vmoji=i}static get vmojiOptions(){return f._params.vmojiOptions||{protocolVersion:1,renderingOptions:{}}}static set vmojiOptions(i){f._params.vmojiOptions=i}static get voiceParams(){return f._params.voiceParams}static get specListenerParams(){return f._params.specListenerParams}static get iceRestartWaitTime(){return f._params.iceRestartWaitTime}static get transportConnectionWaitTime(){return f._params.transportConnectionWaitTime}static get statisticsInterval(){return f._params.statisticsInterval}static set statisticsInterval(i){f._params.statisticsInterval=i}static get networkStatisticsInterval(){return f._params.networkStatisticsInterval}static get perfStatReportEnabled(){return f._params.perfStatReportEnabled}static get callStatReportEnabled(){return f._params.callStatReportEnabled}static get clientEventsLoggingEnabled(){return f._params.clientEventsLoggingEnabled}static get enableLogPerfStatReport(){return f._params.enableLogPerfStatReport}static get producerNotificationDataChannel(){return f._params.producerNotificationDataChannel}static get producerCommandDataChannel(){return f._params.producerCommandDataChannel}static get consumerScreenDataChannel(){return f._params.consumerScreenDataChannel&&Lt.isBrowserSupported()}static get producerScreenDataChannel(){return f._params.producerScreenDataChannel&&f.producerNotificationDataChannel&&Ot.isBrowserSupported()}static get asrDataChannel(){return f._params.asrDataChannel&&f.producerNotificationDataChannel}static get consumerScreenDataChannelPacketSize(){return f._params.consumerScreenDataChannelPacketSize}static get screenShareWebmBuilder(){return f._params.screenShareWebmBuilder}static get noiseSuppression(){return f._params.noiseSuppression}static set noiseSuppression(i){f._params.noiseSuppression=i}static get preferH264(){return f._params.preferH264}static get preferVP9(){return f._params.preferVP9}static get audioNack(){return f._params.audioNack}static get consumerScreenTrack(){return f._params.consumerScreenTrack&&f.consumerScreenDataChannel}static get producerScreenTrack(){return f._params.producerScreenTrack}static get movieShare(){return f._params.movieShare&&f.videoTracksCount>0}static get videoTracksCount(){return f.producerNotificationDataChannel?Number(f._params.videoTracksCount):0}static get breakVideoPayloadTypes(){return f._params.breakVideoPayloadTypes}static get useCallsToContacts(){return f._params.useCallsToContacts}static get useParticipantListChunk(){return f._params.useParticipantListChunk&&f.videoTracksCount>0}static get useRooms(){return f._params.useRooms}static get useChatRooms(){return f._params.useChatRooms}static get participantListChunkInitIndex(){return f._params.participantListChunkInitIndex??0}static get participantListChunkInitCount(){return f._params.participantListChunkInitCount??null}static get serverAudioRed(){return f._params.serverAudioRed}static get p2pAudioRed(){return f._params.p2pAudioRed}static get h264spsPpsIdrInKeyframe(){return f._params.h264spsPpsIdrInKeyframe}static get filterObservers(){return f._params.filterObservers}static get muteMode(){return f._params.muteMode}static get preserveAudioTracks(){return f._params.preserveAudioTracks}static get audioShare(){return y.isAudioShareSupported()&&f._params.audioShare}static get fastScreenShare(){return f._params.fastScreenShare}static get screenShareCongestionControl(){return f._params.screenShareCongestionControl}static get screenShareCongestionControlThreshold(){return f._params.screenShareCongestionControlThreshold}static get fastScreenShareWidth(){return f._params.fastScreenShareWidth}static get fastScreenShareHeight(){return f._params.fastScreenShareHeight}static get newMuteRules(){return f._params.newMuteRules}static get videoSuspend(){return f._params.videoSuspend}static get enumerateDevicesDelay(){return f._params.enumerateDevicesDelay}static getScreenFrameRate(i){return i?f._params.fastScreenShareFrameRate:f._params.screenFrameRate}static get switchVideoAtBadNetwork(){return f._params.switchVideoAtBadNetwork}static get enableVideoEffectsFpsDegradation(){return f._params.enableVideoEffectsFpsDegradation}static get simulcast(){return f._params.simulcast}static set simulcast(i){f._params.simulcast=i}static get webtransport(){return f._params.webtransport}static set webtransport(i){f._params.webtransport=i}static toJSON(){return{apiKey:f._params.apiKey,apiEnv:f._params.apiEnv,audioShare:f._params.audioShare,useCallsToContacts:f._params.useCallsToContacts,useParticipantListChunk:f._params.useParticipantListChunk,useRooms:f._params.useRooms,useChatRooms:f._params.useChatRooms,fastScreenShare:f._params.fastScreenShare,participantListChunkInitCount:f._params.participantListChunkInitCount,screenShareCongestionControl:f._params.screenShareCongestionControl,screenShareCongestionControlThreshold:f._params.screenShareCongestionControlThreshold,videoTracksCount:f._params.videoTracksCount,asrDataChannel:f._params.asrDataChannel,videoMaxHeight:f._params.videoMaxHeight,videoMaxWidth:f._params.videoMaxWidth,videoEffectMaxHeight:f._params.videoEffectMaxHeight,videoEffectMaxWidth:f._params.videoEffectMaxWidth,videoSuspend:f._params.videoSuspend,debugLog:f._params.debugLog,callStatReportEnabled:f._params.callStatReportEnabled,joinFromMultipleDevices:f._params.joinFromMultipleDevices,movieShare:f._params.movieShare,newMuteRules:f._params.newMuteRules,clientType:f._params.clientType,clientStatsPlatform:f._params.clientStatsPlatform,consumerScreenDataChannelPacketSize:f._params.consumerScreenDataChannelPacketSize,switchVideoAtBadNetwork:f._params.switchVideoAtBadNetwork,simulcast:f._params.simulcast,webtransport:f._params.webtransport}}};f._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};var l=f;function xa(a,i){return!(a.isAudioEnabled!==i.isAudioEnabled||a.isVideoEnabled!==i.isVideoEnabled||a.isScreenSharingEnabled!==i.isScreenSharingEnabled||a.isFastScreenSharingEnabled!==i.isFastScreenSharingEnabled||a.isAudioSharingEnabled!==i.isAudioSharingEnabled||a.isAnimojiEnabled!==i.isAnimojiEnabled)}function Re(a){return Object.assign({isAudioEnabled:!1,isVideoEnabled:!1,isScreenSharingEnabled:!1,isFastScreenSharingEnabled:!1,isAudioSharingEnabled:!1,isAnimojiEnabled:!1},a||{})}var Oa=a=>a.stop(),Ai=a=>a.getTracks().forEach(Oa),Na=a=>a.getVideoTracks().forEach(Oa);async function or(a,i){try{let e=typeof i.width=="number"?i.width:void 0,t=typeof i.height=="number"?i.height:void 0;await a.applyConstraints({...i,...e&&{width:{max:e,ideal:e}},...t&&{height:{max:t,ideal:t}}})}catch(e){c.warn("setVideoConstraints failed",e)}}var cr=class extends ae{constructor(){super(...arguments);this.FPS_LIMITS=[13,20,Math.max(l.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((n,s)=>n+s,0)/this.HISTORY_LENGTH,r=this.FPS_LIMITS[this._fpsLimitCursor];t<r*this.THRESHOLD&&(this._fpsLimitCursor=Math.max(0,this._fpsLimitCursor-1)),r!==this.fpsLimit&&this._triggerEvent("fps-limit",this.fpsLimit)}}_assertsVideoEffect(e){if(!("addFpsMeterListener"in e))throw new Error("Outdated VideoEffect version")}addEventListener(e,t){return super.addEventListener(e,t)}_cleanup(){this._fpsMeterUnsubscribe?.(),this._fpsMeterUnsubscribe=null}destroy(){this._cleanup(),super.unsubscribe()}};var He=(r=>(r.audio="audio",r.video="video",r.screen="screen",r.audioshare="audioshare",r))(He||{});var dr=class extends ae{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=Re();this._videoStatusOnScreenCapturingEnabled=!1;this._effect=null;this._audioEffectParams=null;this._animojiEnabled=!1;this._initDeviceChangeListener(),l.audioShare&&(this._audioShareTrack=this.getSilentAudioShareTrack()),l.enableVideoEffectsFpsDegradation&&(this._videoEffectsFpsLimiter=new cr,this._videoEffectsFpsLimiter.addEventListener("fps-limit",this.handleVideoEffectsLowFps.bind(this)))}async request(e=[oe.AUDIO],t=!0){if(this._stream)return;let r=e.includes(oe.VIDEO),n=e.includes(oe.AUDIO),s=e.includes(oe.ANIMOJI);if(!y.isBrowserSupported())throw new G(ne.UNSUPPORTED);try{this._stream=await y.getUserMedia(r,n,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=r&&this._stream.getVideoTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAudioEnabled=n&&this._stream.getAudioTracks().filter(o=>o.enabled).length>0||!1,this._mediaSettings.isAnimojiEnabled=s&&!this._mediaSettings.isVideoEnabled||!1,this._animojiEnabled=s,this._triggerEvent("SOURCE_READY")}catch(o){throw new G(o)}}getStream(){return this._stream}getScreenTrack(){return this._screenTrack}getSendVideoTrack(e=!1){return this._sendVideoTrack&&!e?this._sendVideoTrack:this._stream?this._stream.getVideoTracks()[0]:null}getSendAudioTrack(){return this._stream?.getAudioTracks().find(t=>!t.contentHint)||null}get isAnimojiRequested(){return this._animojiEnabled&&!this._mediaSettings.isVideoEnabled}addTrackToPeerConnection(e,t,r){let n=this.getStream(),s=this.getSendAudioTrack(),o=this.getSendVideoTrack(r);if(!n||!s&&!o&&!t)throw new Error("No local stream found");s&&!t&&e.addTrack(s,n),o&&!t&&e.addTrack(o,n)}getMediaSettings(){return this._mediaSettings}async changeDevice(e){switch(e){case"videoinput":if(this._mediaSettings.isVideoEnabled)return this._changeVideoInput();break;case"audioinput":if(this._mediaSettings.isAudioEnabled)return this._changeAudioInput();break;default:return Promise.reject(ne.UNKNOWN)}}stopVideoTrack(){this._mediaSettings.isVideoEnabled&&(this._stopEffect(),this._stream&&Na(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(),r=y.getSavedCamera(),n=this._mediaSettings.isAudioEnabled&&t?.groupId!==e.microphone?.groupId,s=this._mediaSettings.isVideoEnabled&&r?.groupId!==e.camera?.groupId;try{n&&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",r=e||await y._getUserVideo(!!this._effect,this._frameRate);if(this._cameraVideoTrack?.stop(),this._cameraVideoTrack=r.getVideoTracks()[0],!this._stream)Ai(r);else{l.consumerScreenTrack||await this._disableScreenCapture();let n=await this._setEffect(this._effect,this._cameraVideoTrack);C.log(E.DEVICE_CHANGED,t),c.log("Video stream changed"),await this._replaceLocalTrack(n),this._mediaSettings.isVideoEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"video"})}}catch(t){throw C.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)Ai(t);else{let r=await this._applyAudioEffect();C.log(E.DEVICE_CHANGED,"audio"),c.log("Audio stream changed",r),await this._replaceLocalTrack(r),this._mediaSettings.isAudioEnabled=!0,this._triggerEvent("SOURCE_CHANGED",{kind:"audio"})}}catch(t){throw C.log(E.ERROR,"change_audio"),c.error("Microphone change failed",t),t}}async _changeScreen(e,t,r){try{if(r=r||await y.getScreenMedia(e,t),!this._stream)Ai(r);else{let n=r.getVideoTracks()[0];if(n.addEventListener("ended",()=>{this._mediaSettings.isScreenSharingEnabled&&this.disableScreenCapturing()},!1),l.consumerScreenTrack||this._stopEffect(),C.log(E.DEVICE_CHANGED,"screen"),c.log("Screen capturing started"),this._screenTrack=n,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):n,await this._replaceLocalTrack(n,this._sendVideoTrack)),r.getAudioTracks().length>0){let s=r.getAudioTracks()[0];s.contentHint="music",this._audioShareTrack=s,await this._replaceLocalTrack(s),this._mediaSettings.isAudioSharingEnabled=!0}t&&!this._mediaSettings.isAudioSharingEnabled&&c.debug("Audio share requested but not captured"),this._triggerEvent("SCREEN_STATUS",{track:n}),this._triggerEvent("SOURCE_CHANGED",{kind:"screen"})}}catch(n){throw C.log(E.ERROR,"screen"),c.warn("Screen capturing failed",n),n}}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 r=this._stream.getTracks().find(n=>n.kind===e.kind&&n.contentHint===e.contentHint);r?.id!==e.id&&(r?(r!==this._audioEffectsTrack&&r.stop(),this._stream?.removeTrack(r),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(r){return c.warn("Video effect failed",r),t}}_stopEffect(){if(l.videoEffects)try{l.videoEffects.stopEffect()}catch(e){c.warn("Video effect failed",e)}}destroy(){this._destroyDeviceChangeListener(),l.videoEffects&&(this._effect=null,l.videoEffects.destroy()),l.audioEffects&&l.audioEffects.destroy(),this._stream&&(Ai(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 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 r=await y._getUserVideo(!!this._effect,this._frameRate);this._cameraVideoTrack=r.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;if(e){let r=await y.getUserAudio();this._micAudioTrack=r.getAudioTracks()[0],t=await this._applyAudioEffect()}else l.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(!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 r=this._effect&&t||e;await this._applyVideoConstraints(this._cameraVideoTrack,r)}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(C.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 r=this._cameraVideoTrack.clone(),n=new MediaStream([r]);await this._applyVideoConstraints(r),await this._changeVideoInput(n)}catch(r){this._effect=t;let n=this._cameraVideoTrack.clone(),s=new MediaStream([n]);throw await this._changeVideoInput(s),r}}}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||!v.isArraysEquals(e?.effects||[],this._audioEffectParams?.effects||[]))&&this._micAudioTrack){let t=this._audioEffectParams;this._audioEffectParams=e;try{let r=this._micAudioTrack.clone(),n=new MediaStream([r]);await this._changeAudioInput(n)}catch(r){this._audioEffectParams=t;let n=this._micAudioTrack.clone(),s=new MediaStream([n]);throw await this._changeAudioInput(s),r}}}getAudioShareTrack(){return this._audioShareTrack}handleVideoEffectsLowFps(e){this._mediaSettings.isVideoEnabled&&this._cameraVideoTrack&&e<l.videoFrameRate&&this._applyVideoConstraints(this._cameraVideoTrack).catch(t=>{c.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 or(e,{width:this._effect?l.videoEffectMaxWidth:l.videoMaxWidth,height:this._effect?l.videoEffectMaxHeight:l.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(i){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=i,this._cameraPermissionStatus.onchange=r=>this.handlePermissionChange(r),this._microphonePermissionStatus.onchange=r=>this.handlePermissionChange(r)}catch(e){c.warn("NavigatorPermissions init error",e)}}handlePermissionChange(i){let e=i.target;if(e instanceof PermissionStatus){let{name:t,state:r}=e;switch(t){case"audio_capture":this._listener("microphone",r);break;case"video_capture":this._listener("camera",r);break}}}getPermissionState(i){let e=null;switch(i){case"camera":e=this._cameraPermissionStatus.state;break;case"microphone":e=this._microphonePermissionStatus.state;break}return e}};var lr=(d=>(d.WAITING_HALL="WAITING_HALL",d.WAITING="WAITING",d.CONNECTING="CONNECTING",d.CONNECTED="CONNECTED",d.RECONNECT="RECONNECT",d.ERROR="ERROR",d.HANGUP="HANGUP",d.PERMISSIONS="PERMISSIONS",d))(lr||{});function j(a,...i){let e=l.get(a);typeof e=="function"&&setTimeout(e,0,...i)}function ue(a,i,...e){if(l.filterObservers){if(Array.isArray(i)){if(i=i.filter(t=>!t.observer),!i.length)return}else if(i.observer)return}j(a,i,...e)}function ye(a){return Object.assign({},a)}function Ut(a){return a.slice()}var Dn;(fp=>{function a(_,w){j("onLocalStream",_,ye(w))}fp.onLocalStream=a;function i(_,w){j("onScreenStream",_,ye(w))}fp.onScreenStream=i;function e(_,w){j("onVmojiStream",_,ye(w))}fp.onVmojiStream=e;function t(_){j("onVmojiError",_)}fp.onVmojiError=t;function r(_,w){j("onLocalStreamUpdate",ye(_),w)}fp.onLocalStreamUpdate=r;function n(_){c.debug("Local status:",_),j("onLocalStatus",_)}fp.onLocalStatus=n;function s(_,w){ue("onRemoteStream",_,w)}fp.onRemoteStream=s;function o(_,w){ue("onRemoteLive",_,w)}fp.onRemoteLive=o;function d(_,w){ue("onLocalLive",_,w)}fp.onLocalLive=d;function p(_,w){ue("onRemoteLiveUpdate",_,w)}fp.onRemoteLiveUpdate=p;function u(_,w){ue("onLocalLiveUpdate",_,w)}fp.onLocalLiveUpdate=u;function h(_,w){ue("onRemoteScreenStream",_,w)}fp.onRemoteScreenStream=h;function S(_,w){ue("onRemoteVmojiStream",_,w)}fp.onRemoteVmojiStream=S;function R(_,w,K){ue("onRemoteStreamSuspended",_,w,K)}fp.onRemoteStreamSuspended=R;function M(_,w,K,Ve,Pt){ue("onConversation",_,ye(w),ye(K),Ve,Pt)}fp.onConversation=M;function F(_){_&&j("onConversationParticipantListChunk",_)}fp.onConversationParticipantListChunk=F;function W(_,w,K){ue("onRemoteMediaSettings",_,ye(w),K)}fp.onRemoteMediaSettings=W;function X(_,w){ue("onLocalMediaSettings",_,ye(w))}fp.onLocalMediaSettings=X;function fe(_,w,K){ue("onRemoteSharedMovieInfo",_,ye(w),K)}fp.onRemoteSharedMovieInfo=fe;function Oe(_,w,K){ue("onRemoteSharedMovieStoppedInfo",_,ye(w),K)}fp.onRemoteSharedMovieStoppedInfo=Oe;function J(_,w,K){ue("onLocalSharedMovieInfo",_,ye(w),K)}fp.onLocalSharedMovieInfo=J;function Ae(_,w,K){ue("onLocalSharedMovieStoppedInfo",_,ye(w),K)}fp.onLocalSharedMovieStoppedInfo=Ae;function be(_,w,K){ue("onRemoteSharedUrl",_,w,K)}fp.onRemoteSharedUrl=be;function Rt(_,w){ue("onParticipantAdded",_,w)}fp.onParticipantAdded=Rt;function Si(_,w){ue("onParticipantJoined",_,w)}fp.onParticipantJoined=Si;function Xi(_){j("onLocalParticipantState",ye(_))}fp.onLocalParticipantState=Xi;function te(_,w,K){ue("onRemoteParticipantState",_,ye(w),K)}fp.onRemoteParticipantState=te;function vi(_,w){j("onRemoteParticipantsState",_,w)}fp.onRemoteParticipantsState=vi;function ra(_,w,K=null){c.debug("Remote status:",w,_),ue("onRemoteStatus",_,w,K)}fp.onRemoteStatus=ra;function na(){j("onPermissionsRequested")}fp.onPermissionsRequested=na;function aa(_,w){j("onPermissionsError",_,w)}fp.onPermissionsError=aa;function sa(_,w){ue("onRemoteRemoved",_,w)}fp.onRemoteRemoved=sa;function oa(_,w,K){j("onCallState",_,w,ye(K))}fp.onCallState=oa;function Zi(_,w){j("onDeviceSwitched",_,w)}fp.onDeviceSwitched=Zi;function fn(_,w,K,Ve=!1,Pt=!1,_n=null,Sn=null,so,ha,oo=null){let co=ha?Ut(ha):void 0;j("onMuteStates",ye(_),Ut(w),Ut(K),Ve,Pt,_n,Sn,so,co,oo)}fp.onMuteStates=fn;function ca(_,w,K=!1){ue("onRolesChanged",_,Ut(w),K)}fp.onRolesChanged=ca;function da(_,w=!1){j("onLocalRolesChanged",Ut(_),w)}fp.onLocalRolesChanged=da;function la(_,w,K,Ve){ue("onPinnedParticipant",_,w,K,Ve)}fp.onPinnedParticipant=la;function gn(_,w){j("onLocalPin",_,w)}fp.onLocalPin=gn;function pa(_){j("onOptionsChanged",Ut(_))}fp.onOptionsChanged=pa;function q(){j("onCallAccepted")}fp.onCallAccepted=q;function he(_){ue("onAcceptedCall",_)}fp.onAcceptedCall=he;function V(){j("onRateNeeded")}fp.onRateNeeded=V;function ie(_){ue("onSpeakerChanged",_)}fp.onSpeakerChanged=ie;function se(_){j("onVolumesDetected",Ut(_))}fp.onVolumesDetected=se;function me(_,w){j("onLocalVolume",_,w)}fp.onLocalVolume=me;function pt(_,w){j("onJoinStatus",_,w)}fp.onJoinStatus=pt;function $e(_,w){j("onHangup",_,w)}fp.onHangup=$e;function m(_){j("onMultipartyChatCreated",ye(_))}fp.onMultipartyChatCreated=m;function b(){j("onDeviceChange")}fp.onDeviceChange=b;function T(_){j("onFingerprintChange",_)}fp.onFingerprintChange=T;function P(){j("onTokenExpired")}fp.onTokenExpired=P;function g(_,w,K=!1){j("onChatMessage",_,w,K)}fp.onChatMessage=g;function A(_,w,K=!1){j("onCustomData",_,w,K)}fp.onCustomData=A;function H(_,w,K,Ve,Pt,_n,Sn=null){j("onRecordStarted",_,w,K,Ve,Pt,_n,Sn)}fp.onRecordStarted=H;function B(_=null){j("onRecordStopped",_)}fp.onRecordStopped=B;function Z(_){j("onLocalNetworkStatusChanged",_)}fp.onLocalNetworkStatusChanged=Z;function Se(_){j("onNetworkStatusChanged",_)}fp.onNetworkStatusChanged=Se;function x(_,...w){j("onDebugMessage",_,...w)}fp.onDebugMessage=x;function Ie(_,w){let K=Object.assign({},_,{memory:w});j("onStatistics",K)}fp.onStatistics=Ie;function ge(){j("onAutoplayError")}fp.onAutoplayError=ge;function Ee(_,w,K,Ve,Pt){j("onChatRoomUpdated",_,w,K,Ve,Pt)}fp.onChatRoomUpdated=Ee;function de(_){j("onPromoted",_)}fp.onPromoted=de;function Ue(_){j("onRemoteMixedAudioStream",_)}fp.onRemoteMixedAudioStream=Ue;function yt(_){j("onJoinLinkChanged",_)}fp.onJoinLinkChanged=yt;function zt(_){j("onRoomsUpdated",_)}fp.onRoomsUpdated=zt;function rt(_,w,K,Ve){j("onRoomUpdated",_,w,K,Ve)}fp.onRoomUpdated=rt;function Ii(_){j("onRoomParticipantsUpdated",_)}fp.onRoomParticipantsUpdated=Ii;function ua(_){j("onRoomSwitched",_)}fp.onRoomSwitched=ua;function ip(_){j("onRoomStart",_)}fp.onRoomStart=ip;function rp(_,w=null){j("onFeedback",_,w)}fp.onFeedback=rp;function np(_){j("onFeaturesPerRoleChanged",_)}fp.onFeaturesPerRoleChanged=np;function ap(_){j("onParticipantVmojiUpdate",_)}fp.onParticipantVmojiUpdate=ap;function sp(_,w){j("onAsrSet",_,w)}fp.onAsrSet=sp;function op(_,w,K){j("onAsrStarted",_,w,K)}fp.onAsrStarted=op;function cp(_){j("onAsrStopped",_)}fp.onAsrStopped=cp;function dp(_,w,K,Ve){j("onAsrTranscription",_,w,K,Ve)}fp.onAsrTranscription=dp;function lp(_,w){j("onParticipantIdChanged",_,w)}fp.onParticipantIdChanged=lp;function pp(_){j("onVideoSuspendSuggest",_)}fp.onVideoSuspendSuggest=pp;function up(_){j("onSignalingMessage",typeof _=="string"?_:ye(_))}fp.onSignalingMessage=up;function hp(_){j("onPromotionApproved",_)}fp.onPromotionApproved=hp;function mp(){j("onPeerRegistered")}fp.onPeerRegistered=mp})(Dn||(Dn={}));var I=Dn;var xn="_okcls_",ri=(()=>{try{let a=Date.now().toString(),i=window.localStorage,e=!1;return i.setItem(a,a),e=i.getItem(a)===a,i.removeItem(a),e?i:null}catch{return null}})();function Yo(a){let i=ri?ri.getItem(xn+a):null;if(i===null)return null;try{return JSON.parse(i)}catch{return null}}function Qo(a,i){try{ri&&ri.setItem(xn+a,JSON.stringify(i))}catch{}}function Xo(a){ri&&ri.removeItem(xn+a)}var kn;(t=>{function a(r){return Yo(r)||null}t.get=a;function i(r,n){Qo(r,n)}t.set=i;function e(r){Xo(r)}t.remove=e})(kn||(kn={}));var It=kn;var Bt=null,pr=null,_r=null,vr=[],Ir=[],Sr=[],Qe=null,Xe=null,Er=null,br=!1,Cr=!1,ur,ni,hr,On=null,Nn="",mr=[],fr=null,La=navigator.appVersion,Zo=navigator.appName,je=navigator.userAgent,ut={},vt=(e=>(e.USER="user",e.ENVIRONMENT="environment",e))(vt||{});(i=>{function a(e){return Object.values(i).includes(e)}i.contains=a})(vt||(vt={}));var Vt=class{constructor(i,e=!1,t=l.videoMaxWidth,r=l.videoMaxHeight,n=l.videoFrameRate){this.isVideoRequested=()=>this.needVideo;this.supportedConstraints=navigator.mediaDevices.getSupportedConstraints();let s=!1;if(i){s={noiseSuppression:l.noiseSuppression,echoCancellation:!0,autoGainControl:!0};let d=Pe.getMicrophones(),p,u;if(Xe&&(u=Xe.groupId,p=Xe.deviceId),typeof i=="string")u=d.find(S=>S.deviceId===i)?.groupId,p=i;else if(!Xe&&Pe.os()==="MacOS"&&d.find(h=>h.label.includes("iPhone"))){let h=d.find(S=>!S.label.includes("Virtual")&&!S.label.includes("iPhone"));h&&(u=h.groupId,p=h.deviceId)}u&&this.supportedConstraints.groupId?s.groupId={exact:u}:p&&(s.deviceId={exact:p})}let o=!1;if(e){o={width:{min:l.videoMinWidth,max:t,ideal:t},height:{min:l.videoMinHeight,max:r,ideal:r},aspectRatio:{ideal:l.videoAspectRatio},frameRate:{ideal:n}};let d=Pe.getCameras(),p,u;if(Qe&&(u=Qe.groupId,p=Qe.deviceId),typeof e=="string")u=d.find(S=>S.deviceId===e)?.groupId,p=e;else if(!Qe&&Pe.os()==="MacOS"&&d.find(h=>h.label.includes("iPhone"))){let h=d.find(S=>!S.label.includes("Virtual")&&!S.label.includes("iPhone"));h&&(u=h.groupId,p=h.deviceId)}u&&this.supportedConstraints.groupId?o.groupId={exact:u}:p&&(o.deviceId={exact:p}),l.videoFacingMode&&(o.facingMode={ideal:l.videoFacingMode},delete o.deviceId,delete o.groupId)}this.audio=s,this.video=o,this.needVideo=!!o,this.lastSimplifyWasReached=!1}getNative(){return Object.assign({},{audio:this.audio,video:this.video})}simplify(){return typeof this.video=="object"&&(this.video.width||this.video.height?(delete this.video.width,delete this.video.height):this.video.aspectRatio?delete this.video.aspectRatio:this.video.frameRate?delete this.video.frameRate:(this.video.deviceId||this.video.groupId||this.video.facingMode)&&(delete this.video.deviceId,delete this.video.groupId,delete this.video.facingMode)),typeof this.audio=="object"&&(this.audio.echoCancellation||this.audio.autoGainControl||this.audio.noiseSuppression?(delete this.audio.echoCancellation,delete this.audio.autoGainControl,delete this.audio.noiseSuppression):(this.audio.deviceId||this.audio.groupId)&&(delete this.audio.deviceId,delete this.audio.groupId)),this.video===!0&&this.audio===!0?this.video=!1:this.video===!1&&this.audio===!0?(this.audio=!1,this.video=this.needVideo):this.video===!0&&this.audio===!1&&(this.video=!1),this.video&&!Object.keys(this.video).length&&(this.video=!0),this.audio&&!Object.keys(this.audio).length&&(this.audio=!0),!this.audio&&!this.video&&(this.lastSimplifyWasReached=!0,this.audio=!this.isVideoRequested(),this.video=this.isVideoRequested()),this}canSimplify(){let i=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||i)&&!this.lastSimplifyWasReached}isVideo(){return!!this.video}isAudio(){return!!this.audio}},Ln=class extends Vt{constructor(i,e,t,r){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=i,this.video.height=e,this.video.frameRate=t,this.video.displaySurface=l.displaySurface,Pe.browserName()==="Safari"){let n=Number(Pe.browserVersion());n===16?(this.video.width={max:i},this.video.height={max:e}):n===17&&(delete this.video.width,delete this.video.height)}r&&(this.audio={noiseSuppression:!1,echoCancellation:!1,autoGainControl:!1})}getNative(){return Object.assign(super.getNative(),{systemAudio:"exclude",controller:this.captureController})}},Ft=class Ft{constructor(){this._lockId=Math.round(Math.random()*99998)+1}busy(){if(Ft._lockId)throw C.log(E.ERROR,"change_device"),c.warn("Device change failed: MediaSource is busy"),new Error("MediaSource is busy");Ft._lockId=this._lockId}free(){Ft._lockId===this._lockId&&(Ft._lockId=0)}};Ft._lockId=0;var Tr=Ft;async function Ua(){Cr=!1,br=!1,Bt=null;let a={camera:Pe.getSavedCamera(),microphone:Pe.getSavedMicrophone(),output:Pe.getSavedOutput()};await Un(),ec("devicechange",a),I.onDeviceChange()}function ec(a,...i){if(ut[a])for(let e of ut[a])e(...i)}async function Un(){return Bt||(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(!pr&&navigator.mediaDevices.addEventListener&&(pr=v.debounce(Ua,l.enumerateDevicesDelay),navigator.mediaDevices.addEventListener("devicechange",pr)),!_r&&Di.isSupported()&&(_r=new Di,await _r.init((a,i)=>{switch(i){case"denied":case"prompt":pr?.();break}})),Bt=navigator.mediaDevices.enumerateDevices().then(a=>{vr=a.filter(r=>r.kind==="videoinput"?(r.label&&(br=!0),!0):!1),Ir=a.filter(r=>r.kind==="audioinput"?(r.label?Cr=!0:Pe.isMobile()&&Pe.browserName()==="Firefox"&&(Cr=br),!0):!1),Sr=a.filter(r=>r.kind==="audiooutput");let i=Qe?.deviceId??It.get("videoinput"),e=Xe?.deviceId??It.get("audioinput"),t=Er?.deviceId??It.get("audiooutput");return Qe=vr.find(r=>r.deviceId===i)||null,Xe=Ir.find(r=>r.deviceId===e)||null,Er=Sr.find(r=>r.deviceId===t)||Sr[0]||null,Bt=Promise.resolve(a),a}).catch(()=>(Bt=null,[]))))}function tc(a){if(Qe&&Xe)return;let i=(e,t)=>{let r=t.getSettings()?.deviceId;return e.find(n=>n.deviceId===r||n.label===t.label)||null};a?.getTracks().forEach(e=>{!Xe&&e.kind==="audio"?Xe=i(Pe.getMicrophones(),e):!Qe&&e.kind==="video"&&(Qe=i(Pe.getCameras(),e))})}async function ki(a,i){c.debug("Try to get media",JSON.parse(JSON.stringify(a.getNative())));let e=(!a.isVideo()||Pe.hasCameraPermission())&&(!a.isAudio()||Pe.hasMicrophonePermission());!e&&!i&&I.onPermissionsRequested();let t=new Tr;try{t.busy();let r=await navigator.mediaDevices.getUserMedia(a.getNative());return t.free(),e||await Ua(),tc(r),r}catch(r){switch(t.free(),c.error("getUserMedia error",r),r.name){case"PermissionDeniedError":case"PermissionDismissedError":case"NotAllowedError":case"SecurityError":case"DOMException":case"NotFoundError":i=a.isVideoRequested()?ne.CAMERA_PERMISSION:ne.MIC_PERMISSION;break;case"OverconstrainedError":i=ne.OVERCONSTRAINED;break;case"TypeError":i=ne.UNKNOWN;break;case"AbortError":case"NotReadableError":i=a.isVideoRequested()?ne.CAMERA_ACCESS:ne.MIC_ACCESS;break;case"Error":if(r.message==="MediaSource is busy"){i=a.isVideoRequested()?ne.CAMERA_ACCESS:ne.MIC_ACCESS;break}}if(a.canSimplify())return ki(a.simplify(),i);let n=i||ne.UNKNOWN;throw I.onPermissionsError(n,r),n}}async function ic(a){c.debug("Try to get screen",JSON.parse(JSON.stringify(a.getNative())));let i=new Tr;try{i.busy();let e=await navigator.mediaDevices.getDisplayMedia(a.getNative()),t=e?.getVideoTracks()[0];if(t){let r=t.getSettings()?.displaySurface;if(c.debug(`Got display media track: ${t.id} (${r})`),t.contentHint="text",a.captureController&&(r==="browser"||r==="window"))try{a.captureController.setFocusBehavior("no-focus-change")}catch(n){c.warn("Failed to set focus behavior",n)}}return e}catch(e){switch(e.name){case"PermissionDeniedError":case"NotAllowedError":case"SecurityError":throw ne.SCREEN_PERMISSION;default:throw ne.SCREEN_ACCESS}}finally{i.free()}}function gr(){return mr.length||(mr=(()=>{let a,i=!1,e=0,t="0",r=je.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(r[1]))return a=/\brv[ :]+(\d+)/g.exec(je),["IE",a&&a[1]||"Unknown",i,e,t];if(r[1]==="Safari"){if(a=je.match(/\bEdge\/(\d+)/),a)return["Edge",a[1]||"Unknown",i,e,t];if(a=je.match(/\bCriOS\/(\d+)/),a)return["Chrome",a[1],!0,Number(a[1]),t];if(a=je.match(/\bFxiOS\/(\d+)/),a)return["Firefox",a[1],!1,e,t];if(a=je.match(/\bYaBrowser\/(\d+)/),a)return["Yandex",a[1],!1,e,t];if(a=je.match(/\bOPT\/(\d+)/),a)return["Opera",a[1],!1,e,t]}if(r[1]==="Chrome"){if(i=!0,e=Number(r[2]),a=je.match(/\bOPR\/(\d+)/),a)return["Opera",a[1]||"Unknown",i,e,t];if(a=je.match(/\bYaBrowser\/(\d+)/),a)return["Yandex",a[1]||"Unknown",i,e,t];if(a=je.match(/\bSferum\/((\d+)(?:\.\d+)*)/),a)return["Sferum",a[1]||"Unknown",i,e,t];if(a=je.match(/\bEdge?\/(\d+)/),a)return["Edge",a[1]||"Unknown",i,e,t];if(typeof window.opr<"u"&&/^(.+\.)?ok.ru$/.test(window.location.host))return["Opera","Hidden",i,e,t]}return a=je.match(/version\/(\d+)(?:(?:\.)(\d+))?/i),a&&a[2]!==void 0&&(t=a[2]),[r[2]?r[1]:Zo,a&&a[1]||r[2]||La,i,e,t]})()),mr}var Pe;(he=>{async function a(){if(Bt)return;let V=()=>{he.getSilentMediaTrack(),document.removeEventListener("click",V),document.removeEventListener("touchstart",V)};document.addEventListener("click",V),document.addEventListener("touchstart",V),await Un()}he.init=a;function i(){return vr}he.getCameras=i;function e(){return Ir}he.getMicrophones=e;function t(){return Sr}he.getOutput=t;function r(){return vr.length>0}he.hasCamera=r;function n(){return Ir.length>0}he.hasMicrophone=n;function s(){return Qe}he.getSavedCamera=s;function o(){return Xe}he.getSavedMicrophone=o;function d(){return Er}he.getSavedOutput=d;function p(){return l.videoFacingMode}he.getVideoFacingMode=p;function u(){return br}he.hasCameraPermission=u;function h(){return Cr}he.hasMicrophonePermission=h;function S(){return _r?.getPermissionState("microphone")??null}he.getMicrophonePermissionState=S;function R(V=!1){return h()?r()&&V?u():!0:!1}he.hasPermissions=R;async function M(V=!1,ie=!0,se=!0){let me=n()&&ie,pt=r()&&V,$e;if(!me&&!pt)$e=new MediaStream;else try{$e=await ki(new Vt(me,pt))}catch{$e=new MediaStream}return!$e.getVideoTracks().length&&se&&$e.addTrack(he.getBlackMediaTrack()),!$e.getAudioTracks().length&&se&&$e.addTrack(he.getSilentMediaTrack()),$e}he.getUserMedia=M;async function F(V,ie){let se=V?l.fastScreenShareWidth:window.screen.width,me=V?l.fastScreenShareHeight:window.screen.height,pt=l.getScreenFrameRate(V);return ic(new Ln(se,me,pt,ie))}he.getScreenMedia=F;async function W(V=!1,ie){let se=V?l.videoEffectMaxWidth:l.videoMaxWidth,me=V?l.videoEffectMaxHeight:l.videoMaxHeight;return ki(new Vt(!1,!0,se,me,ie))}he._getUserVideo=W;async function X(V,ie){let se=ie?.width||l.videoMaxWidth,me=ie?.height||l.videoMaxHeight;return ki(new Vt(!1,V||!0,se,me))}he.getUserVideo=X;async function fe(V){return ki(new Vt(V||!0,!1))}he.getUserAudio=fe;async function Oe(V,ie){let[se]=V.getVideoTracks();if(!se)throw new Error("Video track not found in stream");return or(se,ie)}he.setResolution=Oe;async function J(V,ie){let me=(await Un()).find(pt=>pt.kind===V&&pt.deviceId===ie);return me?(V==="videoinput"?Qe=me:V==="audioinput"?Xe=me:V==="audiooutput"&&(Er=me),It.set(V,ie),me):null}he._saveDeviceId=J;function Ae(){if(!hr||hr.readyState==="ended"){let V=he.getAudioContext(),ie=V.createMediaStreamDestination(),se=V.createGain();se.gain.value=1e-5,se.connect(ie),se.connect(V.destination);let me=V.createOscillator();me.type="sine",me.frequency.value=0,me.connect(se),me.start(),hr=ie.stream.getAudioTracks()[0]}return Object.assign(hr.clone(),{enabled:!1})}he.getSilentMediaTrack=Ae;function be(V=l.videoMinWidth,ie=l.videoMinHeight){ni||(ni=document.createElement("canvas")),ni.width=V,ni.height=ie;let se=ni.getContext("2d");return se.rect(0,0,V,ie),se.fillStyle="black",se.fill(),(!ur||ur.readyState==="ended")&&(ur=ni.captureStream(l.videoFrameRate).getVideoTracks()[0]),Object.assign(ur.clone(),{enabled:!1})}he.getBlackMediaTrack=be;function Rt(){if(Zi()==="Edge"&&Number(fn())<70)return!1;try{let V=window;return"mediaDevices"in V.navigator&&"getUserMedia"in V.navigator.mediaDevices&&V.RTCPeerConnection&&V.RTCIceCandidate&&V.RTCSessionDescription&&V.HTMLCanvasElement&&V.HTMLCanvasElement.prototype.captureStream&&V.RTCRtpSender&&V.RTCRtpSender.prototype.replaceTrack&&V.RTCRtpSender.prototype.getParameters&&"sendBeacon"in navigator&&!0||!1}catch{return!1}}he.isBrowserSupported=Rt;function Si(){return!!navigator.mediaDevices.getDisplayMedia}he.isScreenCapturingSupported=Si;function Xi(){let V=he.browserName()==="Safari"&&he.browserVersion()==="15"&&he.browserSubVersion()==="1",ie=he.browserName()==="Opera",se=he.browserName()==="Yandex";return V||ie||se}he.isBrokenH264Decoder=Xi;function te(){return he.browserName()==="Yandex"&&he.os()==="Windows"||l.simulcast}he.isBrokenVP9Encoder=te;function vi(){return he.browserName()==="Safari"&&Number(he.browserVersion())===17&&[4,5,6].includes(Number(he.browserSubVersion()))}he.isBrokenVP9Decoder=vi;function ra(){return he.browserName()==="Firefox"&&Number(he.browserVersion())<60}he.isOldDataChannelDescription=ra;function na(){return!(he.baseChromeVersion()&&he.isMobile())}he.canPreferH264=na;function aa(){return!(he.browserName()==="Firefox"||he.browserName()==="Safari")}he.isSimulcastSupportedByBrowser=aa;function sa(){return Nn||(Nn=(()=>{let V={Windows:/Win/,Android:/Android/,OpenBSD:/OpenBSD/,SunOS:/SunOS/,Linux:/(Linux|X11)/,iPad:/(iPad)/,iPhone:/(iPhone)/,iPod:/(iPod)/,MacOS:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh|Mac OS X)/,QNX:/QNX/,UNIX:/UNIX/,BeOS:/BeOS/,OS2:/OS\/2/,Bot:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/};for(let ie in V)if(V.hasOwnProperty(ie)&&V[ie].test(je))return ie;return"Unknown"})()),Nn}he.os=sa;function oa(){return On===null&&(On=/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(La)),On}he.isMobile=oa;function Zi(){return gr()[0]}he.browserName=Zi;function fn(){return gr()[1]}he.browserVersion=fn;function ca(){return gr()[3]}he.baseChromeVersion=ca;function da(){return fr||(fr=new(window.AudioContext||window.webkitAudioContext)),fr.resume().catch(()=>{c.warn("Failed to resume AudioContext")}),fr}he.getAudioContext=da;function la(){return gr()[4]}he.browserSubVersion=la;function gn(){return he.baseChromeVersion()>=105&&!he.isMobile()}he.isAudioShareSupported=gn;function pa(V,ie){ut[V]||(ut[V]=[]),ut[V].push(ie)}he.addEventListener=pa;function q(V,ie){if(ut[V])if(!ie)delete ut[V];else{let se=ut[V].indexOf(ie);se>-1&&ut[V].splice(se,1)}}he.removeEventListener=q})(Pe||(Pe={}));var y=Pe;var qe=class qe{static get startTime(){return qe._list[0]?.t||0}static get endTime(){let i=qe._list;return i[i.length-1]?.t||0}static startSession(){qe._list=[]}static get conversationId(){return qe._conversationId}static set conversationId(i){qe._conversationId=i}static add(i){qe._list.push(i)}static _createContextLogs(){let i=[[`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(),r=e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"});return i.map(n=>({h:r,t,l:"LOG",d:n}))}static collectLogs(){let i=qe._list;return i.length===0?[]:[...qe._createContextLogs(),...i]}};qe._list=[],qe._conversationId=null;var Be=qe;var Rr=class{constructor(){this._items=[]}get length(){return this._items.length}push(...i){this._items.push(...i)}merge(i){this._items.push(...i._items)}shift(){return this._items.shift()||null}bisect(){let i=this.length>1?Math.floor(this.length/2):1;this._items=this._items.slice(i)}head(){return this._items[0]||null}tail(){let i=this._items.length;return i?this._items[i-1]:null}clear(){this._items=[]}toString(){return this._items.length?JSON.stringify(this._items,(i,e)=>e instanceof Error?String(e):e):""}};var Bn=2*1024*1024,Ba=512*1024,ai=100*1024,rc=5,Vn="_okcls_logs_session_",nc=3e4,jn=class{constructor(){this._items=[];this._itemsSize=0;this._storageSize=Bn;try{let i=window.localStorage;for(let e of Object.keys(i)){if(e.indexOf(Vn)!==0)continue;let t=i.getItem(e);if(!t){Fa(e);continue}let r=ja(t);this.add(e,r)}}catch(i){console.error("Storage is blocked",i),this._storageSize=0}this._items.sort((i,e)=>i.date-e.date),this.cleanup(ai)}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(i){this._storageSize=Math.min(i,this._storageSize,Bn)}add(i,e){let t=parseInt(i.replace(Vn,""),10);this._itemsSize+=e,this._items.push({key:i,size:e,date:t})}deleteOldestItem(){let i=this._items.shift();i&&(Fa(i.key),this._itemsSize-=i.size)}cleanup(i){for(;this.length&&(this.size>Bn||this.length>rc-1||this.size+i>this.available);)this.deleteOldestItem()}};function Va(){return`${Vn}${Date.now()}`}function ja(a){return new Blob([a]).size}function Fa(a){try{window.localStorage.removeItem(a)}catch(i){console.error("Failed to remove log from storage",i)}}function yr(){let a=Et.toString();if(!Ne.available||!a)return;let i=ja(a);if(i>Ba){Et.bisect(),yr();return}Ne.cleanup(ai+i);try{window.localStorage.setItem(Pr,a)}catch(e){if(console.warn("Failed to write log to storage",e),Ne.storageSize=Ne.size+i,Ne.cleanup(ai+i),Ne.available>=ai+i){yr();return}if(i>ai){Et.bisect(),yr();return}Ne.storageSize=0;return}i>Ba&&(Ne.add(Pr,i),Pr=Va(),Et.clear(),Ne.cleanup(ai))}function Wn(){!Ne.available||!Et.length||yr()}function ac(a=!1){let i=[];try{let r=window.localStorage;for(let s of Ne.items){let o=r.getItem(s.key);i.push(o)}let n=Et.toString();n&&i.push(n)}catch(r){console.error("Storage is blocked",r)}let e=`[${i.join(",")}]`;if(a)return e;let t=`logs_${Date.now()}.json`;return sc(e,t),t}function sc(a,i){let e=document.createElement("a"),t=new Blob([a],{type:"text/json"});e.href=URL.createObjectURL(t),e.download=i,e.click()}function Wa(a,i){if(!Ne.available)return;let e=new Date,t={t:e.getTime(),l:a,d:i,h:e.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"long"})};Et.push(t),Be.add(t),Fn||(Fn=window.setTimeout(()=>{Fn=null,Wn()},nc))}function Gn(){Ne||(Ne=new jn,Et=new Rr,Pr=Va(),window.addEventListener("beforeunload",Wn))}var Ne,Et,Pr,Fn=null;window.__VKCallsSDKLogs__=(a=!1)=>(Ne||Gn(),Wn(),ac(a));var qn=(r=>(r.DEBUG="DEBUG",r.LOG="LOG",r.WARN="WARN",r.ERROR="ERROR",r))(qn||{}),Hn;(J=>{let a="📞",i=(Ae,...be)=>{I.onDebugMessage(Ae,...be)},e=!1,t=(Ae,be)=>(...Rt)=>{Ae(...Rt),Wa(be,Rt)},r=console.debug.bind(console,a),n=console.log.bind(console,a),s=console.warn.bind(console,a),o=console.error.bind(console,a),d=i.bind(null,"DEBUG"),p=i.bind(null,"LOG"),u=i.bind(null,"WARN"),h=i.bind(null,"ERROR");J.debug=d,J.log=p,J.warn=u,J.error=h;function W(){return e}J.enabled=W;function X(Ae){e=Ae,l.debugLog&&Gn(),Ae?(J.debug=l.debugLog?t(r,"DEBUG"):r,J.log=l.debugLog?t(n,"LOG"):n,J.warn=l.debugLog?t(s,"WARN"):s,J.error=l.debugLog?t(o,"ERROR"):o):(J.debug=l.debugLog?t(d,"DEBUG"):d,J.log=l.debugLog?t(p,"LOG"):p,J.warn=l.debugLog?t(u,"WARN"):u,J.error=l.debugLog?t(h,"ERROR"):h)}J.toggle=X;function fe(Ae,...be){switch(Ae){case"DEBUG":(0,J.debug)(...be);break;case"LOG":(0,J.log)(...be);break;case"WARN":(0,J.warn)(...be);break;case"ERROR":(0,J.error)(...be);break}}J.send=fe;function Oe(Ae,...be){}J.test=Oe})(Hn||(Hn={}));var c=Hn;var cc="kf";function si(a){return a.stopStream}function Kn(a){return a.keyFrameRequested}function Ga(a){if(si(a))return"ss";if(Kn(a))return cc;let i="";return a.priority!==void 0&&(i+="p="+a.priority),a.width!==void 0&&a.height!==void 0&&(i!==""&&(i+=":"),i+="sz="+Math.round(a.width)+"x"+Math.round(a.height)),a.fit!==void 0&&(i!==""&&(i+=":"),i+="fit="+a.fit),i}var oi=(s=>(s.CAMERA="CAMERA",s.SCREEN="SCREEN",s.STREAM="STREAM",s.MOVIE="MOVIE",s.ANIMOJI="ANIMOJI",s.SHARED_URL="SHARED_URL",s))(oi||{}),Ha="s",qa="m";function at(a){return a.participantId+(a.mediaType?Yt+Ha+a.mediaType:"")+(a.streamName?Yt+qa+a.streamName:"")}function xi(a){let i=a.split(Yt),e=i.shift();if(!e)throw new Error("Illegal stream description: "+a);let t=null,r,n=0;for(let o of i)switch(o.charAt(0)){case Ha:t=dc(o.slice(1));break;case qa:r=o.slice(1);break;case rr:n=Number.parseInt(o.slice(1),10);break;default:throw new Error("Unexpected parameter type "+o.charAt(0)+" in stream description "+a)}return{participantId:v.compose(e,n),mediaType:t,streamName:r}}function dc(a){for(let i of Object.keys(oi))if(i===a)return oi[i];return null}function st(){let a=new DataView(new ArrayBuffer(64)),i=0;function e(t){if(i+t>a.byteLength){let r=new Uint8Array(Math.max(i+t,a.byteLength+64));r.set(new Uint8Array(a.buffer.slice(0,i))),a=new DataView(r.buffer)}}return{put(t){if(e(t.byteLength),lc(t)){let r=t.buffer;new Uint8Array(a.buffer).set(new Uint8Array(r),i)}else new Uint8Array(a.buffer).set(new Uint8Array(t),i);i+=t.byteLength},putI8(t){e(1),a.setInt8(i,t),++i},putI16(t){e(2),a.setInt16(i,t),i+=2},putI32(t){e(4),a.setInt32(i,t),i+=4},putI64(t){e(8);let r=t<0;r&&(t=-t);let n=t/4294967296|0,s=t%4294967296|0;r&&(s=~s+1|0,n=s===0?~n+1|0:~n),a.setUint32(i,n),a.setUint32(i+4,s),i+=8},putUi8(t){e(1),a.setUint8(i,t),++i},putUi16(t){e(2),a.setUint16(i,t),i+=2},putUi32(t){e(4),a.setUint32(i,t),i+=4},putUi64(t){e(8),a.setUint32(i,t/4294967296|0),a.setUint32(i+4,t%4294967296),i+=8},putF(t){e(8),a.setFloat64(i,t),i+=8},ui8array(){return new Uint8Array(a.buffer.slice(0,i))}}}function lc(a){return a.buffer!==void 0}function wr(a){let i=ArrayBuffer.isView(a)?new DataView(a.buffer,a.byteOffset,a.byteLength):new DataView(a),e=0;return{peek(){return i.getUint8(e)},get(t){e+=t;let r=i.byteOffset;return i.buffer.slice(r+e-t,r+e)},getI8(){return i.getInt8(e++)},getI16(){return e+=2,i.getInt16(e-2)},getI32(){return e+=4,i.getInt32(e-4)},getI64(){e+=8;let t=i.getInt32(e-8),r=i.getUint32(e-4);return t*4294967296+r},getUi8(){return i.getUint8(e++)},getUi16(){return e+=2,i.getUint16(e-2)},getUi32(){return e+=4,i.getUint32(e-4)},getUi64(){e+=8;let t=i.getUint32(e-8),r=i.getUint32(e-4);return t*4294967296+r},getF32(){return e+=4,i.getFloat32(e-4)},getF64(){return e+=8,i.getFloat64(e-8)}}}var Ka=0,$a=1,pc=2,uc=3,hc=4,mc=5,fc=6,gc=7,_c=0,Sc=1,vc=2,ht=0,Ic=0,Ec=0,bc=1,Mr=class{constructor(){this.participantIdRegistry=null}setParticipantIdRegistry(i){this.participantIdRegistry=i}serializeUpdateDisplayLayout(i,e){let t=st();N.Int.enc(t,Ka),N.Int.enc(t,ht),N.Int.enc(t,i),N.Nil.enc(t,null);let r=[];for(let n in e)e.hasOwnProperty(n)&&this.writeLayout(e,n,r);return N.Arr.enc(t,r),N.Nil.enc(t,null),t.ui8array()}writeLayout(i,e,t){let r=i[e],n=st();if(this.writeStreamDesc(e,n),si(r))N.Int.enc(n,Sc);else if(Kn(r))N.Int.enc(n,vc);else if(N.Int.enc(n,_c),r.priority!==void 0?N.Int.enc(n,r.priority):N.Nil.enc(n,null),r.width!==void 0&&r.height!==void 0?(N.Int.enc(n,Math.round(r.width)),N.Int.enc(n,Math.round(r.height))):(N.Nil.enc(n,null),N.Nil.enc(n,null)),r.fit!==void 0)switch(r.fit){case"cv":N.Int.enc(n,Ec);break;case"cn":N.Int.enc(n,bc);break;default:N.Nil.enc(n,null)}else N.Nil.enc(n,null);t.push(n.ui8array())}writeStreamDesc(i,e){if(this.participantIdRegistry){let t=this.participantIdRegistry.getCompactId(i);if(t!==void 0){N.Int.enc(e,t);return}}N.Str.enc(e,i)}serializePerfStatReport(i,e){let t=st();return N.Int.enc(t,$a),N.Int.enc(t,ht),N.Int.enc(t,i),N.Int.enc(t,e.framesDecoded),N.Int.enc(t,e.framesReceived),t.ui8array()}serializeSharingStatReport(i,e){let t=st();return N.Int.enc(t,pc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Int.enc(t,e.minDelay),N.Int.enc(t,e.maxDelay),N.Int.enc(t,e.avgDelay),N.Int.enc(t,e.largeDelayDuration),t.ui8array()}serializeRequestAsr(i,e){let t=st();return N.Int.enc(t,uc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Bool.enc(t,e.request),t.ui8array()}serializeNetworkStatReport(i,e){let t=st();return N.Int.enc(t,hc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Int.enc(t,e.timestamp),N.Int.enc(t,e.sendBitrate),t.ui8array()}serializeEnableVideoSuspend(i,e){let t=st();return N.Int.enc(t,mc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Bool.enc(t,e.enabled),t.ui8array()}serializeEnableVideoSuspendSuggest(i,e){let t=st();return N.Int.enc(t,fc),N.Int.enc(t,ht),N.Int.enc(t,i),N.Bool.enc(t,e.enabled),t.ui8array()}serializeChangeSimulcast(i,e){let t=st();N.Int.enc(t,gc),N.Int.enc(t,ht),N.Int.enc(t,i);let r=e.simulcastInfo.streams.length;N.Int.enc(t,e.mediaSource),N.Int.enc(t,r);for(let n of e.simulcastInfo.streams)N.Str.enc(t,n.rid),N.Int.enc(t,n.width),N.Int.enc(t,n.height),N.Int.enc(t,n.fps),N.Int.enc(t,n.bitrate/1e3);return t.ui8array()}async deserializeCommandResponse(i){let e;if(i instanceof Blob){let s="arrayBuffer"in Blob.prototype?await i.arrayBuffer():await Ra(i);e=wr(s)}else e=wr(i);let t=N.Int.dec(e),r=N.Int.dec(e);if(r!==ht){c.warn("Unsupported version for command type: "+t+", version "+r);return}if(N.Int.dec(e)!==Ic){c.warn("Error code: "+t+"received for command type: "+t+", version "+r);return}switch(t){case Ka:return this.deserializeUpdateDisplayLayoutResponse(e);case $a:return this.deserializeReportPerfStatResponse(e);default:c.warn("unsupported command response commandType: "+t);return}}deserializeUpdateDisplayLayoutResponse(i){let e=N.Int.dec(i),t=N.Arr.dec(i),r={};return t.forEach(n=>{let s=wr(n),o=N.Any.dec(s);if(typeof o=="string")r[o]=N.Int.dec(s);else{let d=o,p=at(this.participantIdRegistry?.getStreamDescription(d));r[p]=N.Int.dec(s)}}),{type:"response",sequence:e,response:O.UPDATE_DISPLAY_LAYOUT.toString(),errorCodeByParticipantId:r}}deserializeReportPerfStatResponse(i){let e=N.Int.dec(i),t=N.Int.dec(i);return{type:"response",sequence:e,response:O.REPORT_PERF_STAT.toString(),estimatedPerformanceIndex:t}}};var za=(r=>(r.START="start",r.ACCEPT="accept",r.JOIN="join",r.RETRY="retry",r))(za||{}),ot=za;var Ja=(t=>(t.NOTIFICATION="NOTIFICATION",t.FAILED="FAILED",t.RECONNECT="RECONNECT",t))(Ja||{}),De=Ja;var Ya=(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))(Ya||{}),L=Ya;var Ar=class{constructor(i,e){if(!i)throw new Error("no URL supplied");let t=new URL(i);if(t.protocol!=="https:")throw new Error("URL is not supported for webtransport");let r=t.hostname,n=t.port;n===""&&(n="443");let{sessionint:s,client:o}=this.createClient({host:r,port:n,...e});this.ready=s.ready,this.closed=s.closed,this.draining=s.draining,this.datagrams=s.datagrams,this.incomingBidirectionalStreams=s.incomingBidirectionalStreams,this.incomingUnidirectionalStreams=s.incomingUnidirectionalStreams,this.sessionint=s,this.startUpConnection({client:o,sessionint:s,ourl:t})}createClient(i){throw new Error("Implement createClient")}startUpConnection({client:i,sessionint:e,ourl:t}){throw new Error("Implement startUpConnection")}get reliability(){let i=this.sessionint;if(!i)throw new Error("Http3WTSession was undefined");return i.reliability}get congestionControl(){let i=this.sessionint;if(!i)throw new Error("Http3WTSession was undefined");return i.congestionControl}get supportsReliableOnly(){throw new Error("Implement supportsReliableOnly")}getStats(){let i=this.sessionint;if(!i)throw new Error("Http3WTSession was undefined");return i.getStats()}close(i){let e=this.sessionint;if(!e)throw new Error("Http3WTSession was undefined");return e.close(i)}createBidirectionalStream(i){let e=this.sessionint;if(!e)throw new Error("Http3WTSession was undefined");return e.createBidirectionalStream(i)}createUnidirectionalStream(i){let e=this.sessionint;if(!e)throw new Error("Http3WTSession was undefined");return e.createUnidirectionalStream(i)}get protocol(){let i=this.sessionint;if(i)return i.protocol}};var ci=globalThis.ReadableStream,Dr=globalThis.WritableStream;var Or=Jt(ts(),1);function _e(a){let i=!!(typeof process>"u"||process.env.DEBUG_TRACE);return Object.assign((0,Or.default)(a),{error:(0,Or.default)(`${a}:error`),trace:i?(0,Or.default)(`${a}:trace`):()=>{}})}var ve=class extends Error{constructor(i){super(i),this.name=this[Symbol.toStringTag]="WebTransportError"}};var is=!0;try{let a=new ReadableStream({start:i=>{},type:"bytes"})}catch{is=!1}var Nr=is;var Nc=typeof process<"u"?process.pid:0,Ze=_e(`webtransport:http3wtstream(${Nc})`),Lr=class{constructor(i){if(this.objint=i.object,this.objint.jsobj=this,this.parentobj=i.parentobj,this.transport=i.transport,this.bidirectional=i.bidirectional,this.incoming=i.incoming,this.closed=!1,this._sendGroup=i.sendGroup,this._sendOrder=i.sendOrder,this.objint.sendInitialParameters&&this.objint.sendInitialParameters(),this.pendingoperation=null,this.pendingres=null,this.readable,this.writable,this.pendingoperationRead=null,this.pendingresRead=null,this.bidirectional||this.incoming){let e={start:t=>{this.readableController=t,this.objint.startReading()},pull:async t=>{if(this.readableclosed)return Promise.resolve();this.pendingoperationRead=new Promise((r,n)=>{this.pendingresRead=r}),this.objint.startReading(),await this.pendingoperationRead},cancel:t=>{let r=new Promise((s,o)=>{this.cancelres=s}),n=0;return t&&t.code&&(t.code<0?n=0:t.code>255?n=255:n=t.code),this.readableclosed=!0,this.objint.stopSending(n),r},type:"bytes",autoAllocateChunkSize:4096};Nr||delete e.type,this.readable=new ci(e),this.readable.getStats=()=>Promise.resolve({timestamp:0,bytesReceived:0n,bytesRead:0n}),this.parentobj.addReceiveStream(this.readable,this.readableController)}(this.bidirectional||!this.incoming)&&(this.writable=new Dr({start:e=>{this.writableController=e},write:(e,t)=>{if(this.writableclosed)return Promise.resolve();let r=e;if(r instanceof ArrayBuffer&&(r=new Uint8Array(r)),r instanceof Uint8Array)return r.byteLength===0?void 0:(this.pendingoperation=new Promise((n,s)=>{this.pendingres=n}),this.objint.writeChunk(r),this.pendingoperation);throw Ze.trace("chunk info:",e),new Error("chunk is not of instanceof Uint8Array or Arraybuffer")},close:()=>this.writableclosed?Promise.resolve():(this.objint.streamFinal(),this.pendingoperation=new Promise((e,t)=>{this.pendingres=e}),this.pendingoperation),abort:e=>{if(this.writableclosed)return new Promise((n,s)=>{n()});let t=0;e&&e.code&&(e.code<0?t=0:e.code>255?t=255:t=e.code);let r=new Promise((n,s)=>{this.abortres=n});return this.objint.resetStream(t),r}},{highWaterMark:4}),this.writable.getStats=()=>Promise.resolve({timestamp:0,bytesWritten:0n,bytesSent:0n,bytesAcknowledged:0n}),Object.defineProperties(this.writable,{sendOrder:{get:()=>this._sendOrder,set:e=>{e!==this._sendOrder&&(this._sendOrder=i.sendOrder,this.updateSendOrderAndGroup())}},sendGroup:{get:()=>this._sendGroup,set:e=>{e!==this._sendGroup&&(this._sendGroup=e,this.updateSendOrderAndGroup())}}}),this.parentobj.addSendStream(this.writable,this.writableController)),this.cancelres=null,this.pendingres=null,this.abortres=null,this.finaldrain_=!1}getReadBuffer({byteSize:i}){let e=this.readableController.byobRequest;if(e){let t=e?.view;if(!(t instanceof Uint8Array))throw new Error("byob view is not a Uint8Array");return{buffer:t,byob:e,readBytes:0,fin:!1}}else return{buffer:new Uint8Array(i),byob:void 0,readBytes:0,fin:!1}}commitReadBuffer({buffer:i,byob:e,drained:t,readBytes:r,fin:n}){this.readableclosed||(e&&r!==void 0?e.respond(r):i&&this.readableController.enqueue(i));let s={};if(r!==void 0&&r>0&&!this.readableclosed&&(Ze.trace("commitReadbuffer",r),this.pendingoperationRead&&t)){this.readableController.desiredSize!=null&&!this.finaldrain_&&this.readableController.desiredSize<0&&(s.stopReading=!0);let o=this.pendingresRead;this.pendingoperationRead=null,this.pendingresRead=null,o&&o()}if(n){if(this.cancelres){let o=this.cancelres;this.cancelres=null,o()}this.readableclosed||(this.readableController.close(),this.readableclosed=!0)}return s}updateSendOrderAndGroup(){this.objint.updateSendOrderAndGroup({sendOrder:this._sendOrder,sendGroupId:this._sendGroup._sendGroupId})}onStreamRecvSignal(i){Ze("callback",i?.nettask),Ze.trace("onStreamRecvSignal",i);let e=!0,t=this.parentobj.state;switch((t==="closed"||t==="failed")&&(Ze("no parent cleanup as parent was closed or failed"),e=!1),i.nettask){case"resetStream":this.readable?(this.finalDrain(),e&&this.parentobj.removeReceiveStream(this.readable,this.readableController),this.readableclosed=!0,this.readableController.error(new ve("Resetstream with code:"+(i.code||0)))):Ze.error("resetStream without readable");break;case"stopSending":this.writable?(e&&this.parentobj.removeSendStream(this.writable,this.writableController),this.writableclosed=!0,this.writableController.error(new ve("StopSending with code:"+(i.code||0)))):Ze.error("stopSending without writable");break;default:Ze.error("unhandled onStreamRecvSignal")}if(this.pendingoperation){let r=this.pendingres;this.pendingoperation=null,this.pendingres=null,r?.()}if(this.pendingoperationRead){let r=this.pendingresRead;this.pendingoperationRead=null,this.pendingresRead=null,r?.()}}finalDrain(){this.finaldrain_=!0,this.objint.drainReads()}onStreamWrite(i){if(this.pendingoperation){let e=this.pendingres;this.pendingoperation=null,this.pendingres=null,e?.()}}onStreamNetworkFinish(i){switch(Ze("callback",i?.nettask),Ze.trace("networkfinish args",i),i.nettask){case"stopSending":if(this.cancelres){let e=this.cancelres;this.cancelres=null,e()}this.stopSendingRecv=!0;break;case"resetStream":if(this.abortres){let e=this.abortres;this.abortres=null,e(),this.readable&&this.parentobj.removeReceiveStream(this.readable,this.readableController),this.writable&&this.parentobj.removeSendStream(this.writable,this.writableController),this.readableclosed=!0,this.parentobj.removeStreamObj(this)}break;case"streamFinal":if(this.pendingoperation){let e=this.pendingres;this.pendingoperation=null,this.pendingres=null,e?.()}break;default:Ze.error("onStreamNetworkFinish unknown task",i.nettask)}}};var rs=typeof process<"u"?process.pid:0,Oi=_e(`webtransport:httpwtsession(${rs})`),Ur=class{constructor(i){i.object&&(this.objint=i.object,this.objint.jsobj=this,this.objint.sendInitialParameters&&this.objint.sendInitialParameters()),this.parentobj=i.parentobj,this.state="connecting",this.readyResolve=null,this.closeHook=null,this.header=i.header,this.userData=i.userData,this.peerAddress_=i.peerAddress,this.ready=new Promise((t,r)=>{this.readyResolve=t,this.readyReject=r}),this.reliability="pending",this.congestionControl="default",this.closed=new Promise((t,r)=>{this.closedResolve=t,this.closedReject=r}),this.draining=new Promise((t,r)=>{this.drainingResolve=t,this.drainingReject=r}),this.incomingBidirectionalStreams=new ci({start:t=>{this.incomBiDiController=t}}),this.incomingUnidirectionalStreams=new ci({start:t=>{this.incomUniDiController=t}});let e={start:t=>{this.incomDatagramController=t},type:"bytes"};Nr||delete e.type,this._lastGetMaxDatagramSize=0,this.datagrams={readable:new ci(e),createWritable:t=>{let r=t?.sendOrder??0n,n=t?.sendGroup,s=new Dr({start:o=>{this.outgoDatagramController=o},write:(o,d)=>{if(this.state==="closed")throw new Error("Session is closed");if(o instanceof Uint8Array){if(this.objint==null)throw new Error("this.objint is not set");let{code:p,message:u}=this.objint.writeDatagram(o);if(p!=="success"&&p!=="blocked"&&p!=="tooBig")throw new ve(p+":"+u)}else throw new Error("chunk is not of type Uint8Array")},close:()=>{}});return Object.defineProperties(s,{sendOrder:{get:()=>r,set:o=>{r=o}},sendGroup:{get:()=>n,set:o=>{o!==n&&(n=o)}}}),s},get writable(){return this.datagramwritablepolyfilled_||console.warn("datagrams.writable is deprecated"),this.datagramwritablepolyfilled_||(this.datagramwritablepolyfilled_=this.createWritable())},get maxDatagramSize(){return this._getMaxDatagramSize()},_getMaxDatagramSize:()=>(this.objint&&(this._lastGetMaxDatagramSize=this.objint.getMaxDatagramSize()),this._lastGetMaxDatagramSize)},this.resolveBiDi=[],this.resolveUniDi=[],this.rejectBiDi=[],this.rejectUniDi=[],this.resolveSessionStats=[],this.rejectSessionStats=[],this.resolveDatagramStats=[],this.rejectDatagramStats=[],this.sendStreams=new Set,this.receiveStreams=new Set,this.streamObjs=new Set,this.sendStreamsController=new Set,this.receiveStreamsController=new Set,this._sendGroupNum=1n,this._sendGroupIndex=new Map,this._selectedProtocol=void 0}setSessionObj(i,e){i&&(this.objint=i,this.objint.jsobj=this,this.reliable=!!e,this.objint.sendInitialParameters&&this.objint.sendInitialParameters())}get protocol(){return this._selectedProtocol}getStats(){if(this.objint==null)throw new Error("this.objint not set");let i=new Promise((e,t)=>{this.resolveSessionStats.push(e),this.rejectSessionStats.push(t)});return this.objint.orderSessionStats(),i}onSessionStats({timestamp:i,expiredOutgoing:e=BigInt(0),lostOutgoing:t=BigInt(0),minRtt:r=0,smoothedRtt:n=0,rttVariation:s=0,estimatedSendRateBps:o}){let d=this.resolveSessionStats.pop();this.rejectSessionStats.pop(),d&&d({timestamp:i,bytesSent:BigInt(0),packetsSent:BigInt(0),packetsLost:BigInt(0),numOutgoingStreamsCreated:0,numIncomingStreamsCreated:0,bytesReceived:BigInt(0),packetsReceived:BigInt(0),smoothedRtt:n,rttVariation:s,minRtt:r,estimatedSendRate:o,datagrams:{timestamp:i,expiredOutgoing:e,droppedIncoming:BigInt(0),lostOutgoing:t}})}onDatagramStats({timestamp:i,expiredOutgoing:e=BigInt(0),lostOutgoing:t=BigInt(0)}){let r=this.resolveDatagramStats.pop();this.rejectDatagramStats.pop(),r&&r({timestamp:i,expiredOutgoing:e,droppedIncoming:BigInt(0),lostOutgoing:t})}notifySessionDraining(){if(this.objint==null)throw new Error("this.objint not set");this.objint.notifySessionDraining()}addStreamObj(i){this.streamObjs.add(i)}removeStreamObj(i){this.streamObjs.delete(i)}addSendStream(i,e){this.sendStreams.add(i),this.sendStreamsController.add(e)}removeSendStream(i,e){this.sendStreams.delete(i),this.sendStreamsController.delete(e)}addReceiveStream(i,e){this.receiveStreams.add(i),this.receiveStreamsController.add(e)}removeReceiveStream(i,e){this.receiveStreams.delete(i),this.receiveStreamsController.delete(e)}createBidirectionalStream(i){if(this.objint==null)throw new Error("this.objint not set");let e=new Promise((r,n)=>{this.resolveBiDi.push(r),this.rejectBiDi.push(n)});if(!this.objint.orderBidiStream({sendGroup:i?.sendGroup||null,sendOrder:BigInt(i?.sendOrder||0n),waitUntilAvailable:i?.waitUntilAvailable||!1})){let r=this.rejectBiDi.pop();this.resolveBiDi.pop(),r&&r(new DOMException("No streams available","QuotaExceededError"))}return e}createUnidirectionalStream(i){if(this.objint==null)throw new Error("this.objint not set");let e=new Promise((r,n)=>{this.resolveUniDi.push(r),this.rejectUniDi.push(n)});if(!this.objint.orderUnidiStream({sendGroup:i?.sendGroup||null,sendOrder:i?.sendOrder||0n,waitUntilAvailable:i?.waitUntilAvailable||!1})){let r=this.rejectUniDi.pop();this.resolveUniDi.pop(),r&&r(new DOMException("No streams available","QuotaExceededError"))}return e}close(i){Oi("closeinfo",i),!(this.state==="closed"||this.state==="failed")&&this.objint&&this.objint.close({code:i?.closeCode??0,reason:i?.reason.substring(0,1023)??""})}createSendGroup(){if(this.state==="closed"||this.state==="failed")throw new Error("InvalidState");let i=this._sendGroupNum++,e={_sendGroupId:i,getStats:async()=>({bytesWritten:0n,bytesSent:0n,bytesAcknowledged:0n})};return this._sendGroupIndex.set(i,e),e}onReady({protocol:i}){i&&(this._selectedProtocol=i),this.state="connected",this.reliable?this.reliability="reliable-only":this.reliability="supports-unreliable",this.readyResolve&&this.readyResolve(),delete this.readyResolve}onClose(i){if(delete this.objint,this.state!=="connected"){Oi.error('session was closed before state was "connected" - it was "%s"',this.state),this.state="failed",this.closeHook&&(this.closeHook(),delete this.closeHook);let r=new ve("Opening handshake failed.");this.readyReject(r),this.closedReject(r);return}Oi("onClose"),this.streamObjs.forEach(r=>r.finalDrain());let e=new ve("Session closed");for(let r of this.rejectBiDi)r(e);for(let r of this.rejectUniDi)r(e);for(let r of this.rejectSessionStats)r(e);for(let r of this.rejectDatagramStats)r(e);this.resolveBiDi=[],this.resolveUniDi=[],this.rejectBiDi=[],this.rejectUniDi=[],this.resolveSessionStats=[],this.rejectSessionStats=[],this.resolveDatagramStats=[],this.rejectDatagramStats=[],this.incomBiDiController.close(),this.incomUniDiController.close(),this.incomDatagramController.close(),this.state="closed";let t=new ve(`Session closed (on process ${rs}) with code `+i.errorcode+" and reason"+i.error);this.sendStreamsController.forEach(r=>r.error(t)),this.receiveStreamsController.forEach(r=>r.error(t)),this.streamObjs.forEach(r=>r.readableclosed=!0),this.sendStreams.clear(),this.receiveStreams.clear(),this.sendStreamsController.clear(),this.receiveStreamsController.clear(),this.streamObjs.clear(),this.closedResolve&&this.closedResolve({closeCode:i.errorcode,reason:i.error?i.error:""}),this.closeHook&&(this.closeHook(),delete this.closeHook)}onStream(i){let e=new Lr({object:i.stream,parentobj:this,transport:this.parentobj,bidirectional:i.bidirectional,incoming:i.incoming,sendGroup:this._sendGroupIndex.get(i.sendGroupId||0n),sendOrder:i.sendOrder});if(this.addStreamObj(e),i.incoming)i.bidirectional?this.incomBiDiController.enqueue(e):this.incomUniDiController.enqueue(e.readable);else if(i.bidirectional){if(this.resolveBiDi.length===0)throw new Error("Got bidirectional stream without asking for it");this.rejectBiDi.shift();let t=this.resolveBiDi.shift();t!=null&&e.readable!=null&&e.writable!=null&&t({readable:e.readable,writable:e.writable})}else{if(this.resolveUniDi.length===0)throw new Error("Got unidirectional stream without asking for it");this.rejectUniDi.shift();let t=this.resolveUniDi.shift();t!=null&&e.writable!=null&&t(e.writable)}}onDatagramReceived(i){if(Oi.trace("datagram received",i.datagram),i.datagram.byteLength===0){Oi.trace("zerolength datagram dropped");return}if(this.incomDatagramController.byobRequest){let e=this.incomDatagramController.byobRequest,t=e?.view;if(!(t instanceof Uint8Array))throw new Error("byob view is not a Uint8Array");if(t.byteLength<i.datagram.byteLength)throw new Error("supplied view is not large enough.");new Uint8Array(t.buffer,0+t.byteOffset,i.datagram.byteLength).set(i.datagram),e.respond(i.datagram.byteLength)}else this.incomDatagramController.enqueue(new Uint8Array(i.datagram))}onGoAwayReceived(i){this.drainingResolve&&this.drainingResolve(void 0),this.state="draining"}get peerAddress(){return this.peerAddress_}};var Lc=typeof process<"u"?process.pid:0,ns=_e(`webtransport:httpclient(${Lc})`),Br=class{constructor(i){this.args=i,this.sessionProm=null,this.sessionobj=new Promise((e,t)=>{this.sessionProm={resolve:e,reject:t}}).catch(()=>{}),this.sessionobjint=null,this.closeHookSession=this.closeHookSession.bind(this),this.webtransportProm=null,this.quicconnectedProm=null,this._quicConnectTimeout=i.quicConnectTimeout??8e3,this._webTransportConnectTimeout=i.webTransportConnectTimeout??2e3}async handleConnection({createTransport:i,path:e}){i&&this.createTransportInt({path:e}),this.quicconnected=new Promise((r,n)=>{this.quicconnectedProm={resolve:r,reject:n}}),this.webtransport=new Promise((r,n)=>{this.webtransportProm={resolve:r,reject:n}});let t=setTimeout(()=>{this.quicconnectedProm&&(ns.error("quic connection timeout"),this.quicconnectedProm.reject(new ve("Opening handshake failed.")),delete this.quicconnectedProm)},this._quicConnectTimeout);try{await this.quicconnected}finally{clearTimeout(t)}}async createWTSession(i,e){let t=setTimeout(()=>{this.webtransportProm&&(ns.error("webtransport connection timeout"),this.webtransportProm.reject(new ve("Opening handshake failed.")),delete this.webtransportProm)},this._webTransportConnectTimeout);await this.webtransport,clearTimeout(t),this.sessionobjint=i,this.transportInt.openWTSession(e);let r=await this.sessionobj;return delete this.sessionobj,r}closeHookSession(){this.transportInt!=null&&this.transportInt.closeClient(),this.stopped=!0}onClientError(i){this.sessionobjint!=null&&this.sessionobjint.onClose(i)}onClientConnected(i){if(this.transportIntSwitchToReliable=void 0,this.quicconnectedProm)i.success?this.quicconnectedProm.resolve():this.quicconnectedProm.reject(new ve("Opening handshake failed.")),delete this.quicconnectedProm;else if(i.success)throw new ve("Client connected with no pending promise")}onClientWebTransportSupport(i){this.webtransportProm&&(this.webtransportProm.resolve(),delete this.webtransportProm)}onHttpWTSessionVisitor(i){if(i.session&&this.sessionProm&&this.sessionobjint)this.sessionobjint.setSessionObj(i.session,!!i.reliable),i.session.jsobj.closeHook=this.closeHookSession,delete this.sessionobjint,this.sessionProm.resolve(i.session),delete this.sessionProm;else throw new ve("Http3WTSessionVisitor no object session or nor sessionprom")}createTransportInt(i){let e=i?.path;if(this.transportInt==null){try{if(this.args?.forceReliable||!this.args.createUnreliableClient)this.transportInt=this.args.createReliableClient(this);else if(this.transportInt=this.args.createUnreliableClient(this),!this.args?.requireUnreliable){let t=this.args;this.transportIntSwitchToReliable=()=>{this.transportInt!=null&&this.transportInt.closeClient(),this.transportInt=t.createReliableClient(this),this.transportInt.jsobj=this,this.transportInt.createTransport&&this.transportInt.createTransport({path:e}),this.transportIntSwitchToReliable=void 0}}}catch(t){let r=new ve("Opening handshake failed.");throw r.stack=t.stack,r}delete this.args,this.transportInt.jsobj=this,this.transportInt.createTransport&&this.transportInt.createTransport({path:e})}}};var Uc=typeof process<"u"?process.pid:0,ke=_e(`webtransport:flowcontroller(${Uc})`),Fr=class Fr{constructor({tocontrol:i,sendWindowOffset:e,receiveWindowOffset:t,receiveWindowSizeLimit:r,shouldAutoTuneReceiveWindow:n,sessionFlowController:s}){this.tocontrol=i,this.bytesSent=0n,this.sendWindowOffset=BigInt(e),this.bytesConsumed=0n,this.highestReceivedByteOffset=0n,this.receiveWindowOffset=BigInt(t),this.receiveWindowSize=BigInt(t),this.receiveWindowSizeLimit=BigInt(r),this.autoTuneReceiveWindow=n,this.sessionFlowController=s,this.lastBlockedSendWindowOffset=0n,this.prevWindowUpdateTime=void 0,ke("Created flow controller , setting initial receive window offset to: "+this.receiveWindowOffset+", max receive window to: "+this.receiveWindowSize+", max receive window limit to: "+this.receiveWindowSizeLimit+", setting send window offset to: "+this.sendWindowOffset)}addBytesConsumed(i){this.bytesConsumed+=BigInt(i),ke(" consumed "+i+" bytes."),this.maybeSendWindowUpdate()}updateHighestReceivedOffset(i){return ke(" highest byte offset increased from "+this.highestReceivedByteOffset," to ",this.highestReceivedByteOffset+BigInt(i)),this.highestReceivedByteOffset+=BigInt(i),!0}addBytesSent(i){let e=BigInt(i);if(this.bytesSent+e>this.sendWindowOffset){ke(" Trying to send an extra "+e+" bytes, when bytes_sent = "+this.bytesSent+", and send_window_offset_ = "+this.sendWindowOffset),this.bytesSent=this.sendWindowOffset,this.tocontrol.closeConnection({code:63,reason:this.sendWindowOffset-(this.bytesSent+e)+"bytes over send window offset"});return}this.bytesSent+=e,ke(" sent "+e+" bytes.")}flowControlViolation(){return this.highestReceivedByteOffset>this.receiveWindowOffset?(ke("Flow control violation on , receive window offset: "+this.receiveWindowOffset+", highest received byte offset: "+this.highestReceivedByteOffset),!0):!1}maybeIncreaseMaxWindowSize(){let i=Date.now(),e=this.prevWindowUpdateTime;if(this.prevWindowUpdateTime=i,!e){ke("first window update for ");return}if(!this.autoTuneReceiveWindow)return;let t=this.tocontrol.smoothedRtt();if(t===0){ke("rtt zero for ");return}let r=i-e,n=2*t;if(r>=n)return;let s=this.receiveWindowSize;this.increaseWindowSize(),this.receiveWindowSize>s?(ke("New max window increase for "+ +" after "+r+" us, and RTT is "+t+"us. max wndw: "+this.receiveWindowSize),this.sessionFlowController!==void 0&&this.sessionFlowController.ensureWindowAtLeast(BigInt(Fr.kSessionFlowControlMultiplier*Number(this.receiveWindowSize)))):ke("Max window at limit for after "+r+" us, and RTT is "+t+"us. Limit size: "+this.receiveWindowSize)}increaseWindowSize(){this.receiveWindowSize*=2n,this.receiveWindowSize=this.receiveWindowSize>this.receiveWindowSizeLimit?this.receiveWindowSizeLimit:this.receiveWindowSize}windowUpdateThreshold(){return this.receiveWindowSize/2n}maybeSendWindowUpdate(){if(!this.tocontrol.connected())return;let i=this.receiveWindowOffset-this.bytesConsumed,e=this.windowUpdateThreshold();if(this.prevWindowUpdateTime||(this.prevWindowUpdateTime=Date.now()),i>=e){ke("Not sending WindowUpdate for , available window: "+i+" >= threshold: "+e);return}this.maybeIncreaseMaxWindowSize(),this.updateReceiveWindowOffsetAndSendWindowUpdate(i)}updateReceiveWindowOffsetAndSendWindowUpdate(i){this.receiveWindowOffset+=this.receiveWindowSize-i,ke("Sending WindowUpdate frame for , consumed bytes: "+this.bytesConsumed+", available window: "+i+", and threshold: "+this.windowUpdateThreshold()+", and receive window size: "+this.receiveWindowSize+". New receive window offset is: "+this.receiveWindowOffset),this.sendWindowUpdate()}maybeSendBlocked(){this.sendWindowSize()!==0n||this.lastBlockedSendWindowOffset>=this.sendWindowOffset||(ke(" is flow control blocked. Send window: "+this.sendWindowSize()+", bytes sent: "+this.bytesSent+", send limit: "+this.sendWindowOffset),this.lastBlockedSendWindowOffset=this.sendWindowOffset,this.tocontrol.sendBlocked(this.lastBlockedSendWindowOffset))}updateSendWindowOffset(i){if(i<=this.sendWindowOffset)return!1;ke("UpdateSendWindowOffset for with new offset "+i+" current offset: "+this.sendWindowOffset+" bytes_sent: "+this.bytesSent);let e=this.isBlocked();return this.sendWindowOffset=i,e}ensureWindowAtLeast(i){if(this.receiveWindowSizeLimit>=i)return;let e=this.receiveWindowOffset-this.bytesConsumed;this.increaseWindowSize(),this.updateReceiveWindowOffsetAndSendWindowUpdate(e)}isBlocked(){return this.sendWindowSize()===0n}sendWindowSize(){return this.bytesSent>this.sendWindowOffset?0n:this.sendWindowOffset-this.bytesSent}updateReceiveWindowSize(i){if(ke("UpdateReceiveWindowSize for : "+i),this.receiveWindowSize!==this.receiveWindowOffset){ke("receive_window_size_:"+this.receiveWindowSize+" != receive_window_offset:"+this.receiveWindowOffset);return}this.receiveWindowSize=i,this.receiveWindowOffset=i}sendWindowUpdate(){this.tocontrol.sendWindowUpdate(this.receiveWindowOffset)}};le(Fr,"kSessionFlowControlMultiplier",1.5);var ui=Fr;var Bc=typeof process<"u"?process.pid:0,as=_e(`webtransport:http2webtransportstream(${Bc})`),Vr=a=>setTimeout(a,0);typeof process<"u"&&(Vr=process.nextTick);var jr=class{constructor({streamid:i,unidirectional:e,incoming:t,capsuleParser:r,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d,sessionFlowController:p,streamIdManager:u}){this.jsobj=void 0,this.streamid=i,this.incomdata=[],this.capsuleParser=r,this.outgochunks=[],this.flowController=new ui({tocontrol:this,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d,sessionFlowController:p}),this.sessionFlowController=p,this.streamIdManager=u,this.final=!1,this.finalmessagesend=!1,this.stopReading_=!0,this.drainReads_=!0,this.recvBytes=0,this.outgoingClosed_=!1,this.incomingClosed_=!1,e&&(t?this.outgoingClosed_=!0:this.incomingClosed_=!0)}sendInitialParameters(){this.flowController.sendWindowUpdate()}recvData({data:i,fin:e}){if(this.incomdata.push({data:i,fin:e}),i&&i?.byteLength>0){let t=this.flowController.updateHighestReceivedOffset(i?.byteLength);if(this.sessionFlowController.updateHighestReceivedOffset(i?.byteLength)&&t&&(this.flowController.flowControlViolation()||this.sessionFlowController.flowControlViolation())){this.closeConnection({code:63,reason:"Flow control violation after increasing offset"});return}}this.processRead(),this.incomdata.length>0&&(this.stopReading_||this.processRead())}processRead(){if(!this.jsobj)return;let i,e=0;for(;this.incomdata.length>0&&(!this.stopReading_||this.drainReads_);){i||this.incomdata.reduce((n,s)=>n+(s&&s.data?.byteLength||0),0)>0&&(i=this.jsobj.getReadBuffer({byteSize:this.incomdata.reduce((n,s)=>n+(s&&s.data?.byteLength||0),0)}),i.readBytes=0,e=0);let t=this.incomdata.shift();if(t?.data&&t.data.byteLength>0&&i&&i.buffer){let r=Math.min(i.buffer.byteLength-e,t.data.byteLength),n=new Uint8Array(t.data.buffer,t.data.byteOffset,r);if(new Uint8Array(i.buffer.buffer,e,r).set(n),e+=r,i.readBytes+=r,i.drained=!0,t.data.byteLength!==r?(i.drained=!1,this.incomdata.unshift({data:new Uint8Array(t.data.buffer,t.data.byteOffset+r,t.data.byteLength-r),fin:t.fin}),i.fin=!1):i.fin||(i.fin=t.fin),this.incomdata.length>0&&(i.drained=!1),e===i.buffer.byteLength||this.incomdata.length===0){this.flowController.addBytesConsumed(i.readBytes||0),this.sessionFlowController.addBytesConsumed(i.readBytes||0);let{stopReading:o}=this.jsobj.commitReadBuffer(i);o&&(this.stopReading_=!0),i=void 0,e=0}this.recvBytes+=r}else t?.fin&&this.jsobj.commitReadBuffer({fin:!0})}}startReading(){this.stopReading_=!1,this.processRead()}drainReads(){this.drainReads_=!0,this.stopReading_=!1,this.processRead()}stopReading(){this.stopReading_=!0}onStreamSignal(i){switch(i){case"resetStream":this.closeIncoming();break;case"stopSending":this.closeOutgoing();break}}closeIncoming(){this.incomingClosed_=!0,this.outgoingClosed_&&this.onClose()}closeOutgoing(){this.outgoingClosed_=!0,this.incomingClosed_&&this.onClose()}onClose(){this.streamIdManager.onStreamClosed(this.streamid)}stopSending(i){this.closeIncoming(),this.capsuleParser.writeCapsule({type:Y.WT_STOP_SENDING,headerVints:[this.streamid,i],payload:void 0}),Vr(()=>this.jsobj.onStreamNetworkFinish({nettask:"stopSending"}))}onFin(){this.closeIncoming()}resetStream(i){this.closeOutgoing(),this.capsuleParser.writeCapsule({type:Y.WT_RESET_STREAM,headerVints:[this.streamid,i],payload:void 0}),Vr(()=>this.jsobj.onStreamNetworkFinish({nettask:"resetStream"}))}writeChunk(i){this.outgochunks.push({buf:i,fin:!1}),this.capsuleParser.scheduler.Schedule(this.streamid),this.capsuleParser.scheduleDrainWrites()}hasPendingData(){return this.outgochunks.length>0}drainWrites(){let i=!1;for(;this.outgochunks.length>0&&(!this.capsuleParser.blocked||this.final||!this.capsuleParser.shouldYieldStream(this.streamid))&&this.flowController.sendWindowSize()>0n&&this.sessionFlowController.sendWindowSize()>0n;){let e=this.outgochunks.shift(),t=!0;if(e){let r=e.buf;if(r){if(r.byteLength===0&&!e.fin)throw new ve("Trying to send zero length capsule without a fin");let n=this.sessionFlowController.sendWindowSize(),s=this.flowController.sendWindowSize();if(r?.byteLength>s||r?.byteLength>n){let o=n>s?Number(s):Number(n);{let d=new Uint8Array(r.buffer,r.byteOffset+o,r.byteLength-o),p=new Uint8Array(r.byteLength-o);p.set(d),this.outgochunks.unshift({fin:e.fin,buf:p}),t=!1}e.fin=!1,r=e.buf=new Uint8Array(r.buffer,r.byteOffset,o)}}this.capsuleParser.writeCapsule({type:e?.fin?Y.WT_STREAM_WFIN:Y.WT_STREAM_WOFIN,headerVints:[this.streamid],payload:r}),i||(i=!!e?.fin),r&&(this.flowController.addBytesSent(r?.byteLength),this.sessionFlowController.addBytesSent(r?.byteLength))}t&&this.jsobj.onStreamWrite({success:!0})}if(i){this.capsuleParser.removeStream(this.streamid);return}!(!this.capsuleParser.blocked||this.final||!this.capsuleParser.shouldYieldStream(this.streamid))&&this.outgochunks.length>0&&this.capsuleParser.scheduleDrainWriteStream(this.streamid),this.final&&this.outgochunks.length===0&&!this.finalmessagesend&&(Vr(()=>{this.jsobj.onStreamNetworkFinish({nettask:"streamFinal"})}),this.finalmessagesend=!0)}streamFinal(){this.final=!0,this.outgochunks.push({fin:!0}),this.capsuleParser.scheduleDrainWriteStream(this.streamid),this.capsuleParser.scheduleDrainWrites()}updateSendOrderAndGroup({sendOrder:i,sendGroupId:e}){this.capsuleParser.streamUpdateSendOrderAndGroup(this.streamid,{sendOrder:i,sendGroupId:e})}sendWindowUpdate(i){as("sendwindow offset stream:",i),this.capsuleParser.writeCapsule({type:Y.WT_MAX_STREAM_DATA,headerVints:[this.streamid,i],payload:void 0})}sendBlocked(i){this.capsuleParser.writeCapsule({type:Y.WT_STREAM_DATA_BLOCKED,headerVints:[this.streamid,i],payload:void 0})}reportBlocked(i){as("Stream id: ",this.streamid," was blocked at:",i)}connected(){return this.jsobj.parentobj.state==="connected"}closeConnection({code:i,reason:e}){this.jsobj.parentobj?.objint&&this.jsobj.parentobj.objint.closeConnection({code:i,reason:e})}smoothedRtt(){if(this.jsobj.parentobj?.objint)return this.jsobj.parentobj.objint.smoothedRtt()}};function Ni(a){return a.toString()}function we(a){return a.toString()}var $n=class{constructor(i){this.priority=i,this.currentSequenceNumber=void 0}scheduled(){return typeof this.currentSequenceNumber<"u"}};function Fc(a,i){return a.priority>i.priority?-1:a.priority===i.priority?a.sequenceNumber>i.sequenceNumber?-1:a.sequenceNumber===i.sequenceNumber?0:1:1}function ss(a,i){return Fc(a.scheduleKey,i.scheduleKey)}var Wr=class a{constructor(){this.streams_={},this.schedule_=[],this.currentWriteSequenceNumber_=0}HasRegistered(){return Object.keys(this.streams_).length!==0}HasScheduled(){return Object.keys(this.schedule_).length!==0}NumScheduled(){return Object.keys(this.schedule_).length}NumRegistered(){return Object.keys(this.streams_).length}NumScheduledInPriorityRange(i,e){let t=typeof e<"u"?this.schedule_.findIndex(n=>n.scheduleKey.priority<=e):0;return(typeof i<"u"?this.schedule_.findIndex(n=>n.scheduleKey.priority>=i):this.schedule_.length)-t}ShouldYield(i){let e=this.streams_[we(i)];if(!e)throw new Error("ID not registered");if(this.schedule_.length===0)return!1;let t=this.schedule_[0];return a.StreamId(t)==i?!1:t.scheduleKey.priority>=e.priority}GetPriorityFor(i){let e=this.streams_[we(i)];if(e)return e.priority}PopFront(){if(this.schedule_.length===0)return;let i=this.schedule_[0];i.fullStreamEntry.streamEntry.currentSequenceNumber=void 0;let e=a.StreamId(i);return this.schedule_.shift(),e}Register(i,e){if(this.streams_[we(i)])throw new Error("ID already registered");this.streams_[we(i)]=new $n(e.sendOrder)}Unregister(i){let e=this.streams_[we(i)];if(!e)throw new Error("Stream not registered");e.scheduled()&&this.DescheduleStream(e),delete this.streams_[we(i)]}UpdatePriority(i,e){let t=this.streams_[we(i)];if(!t)return new Error("ID not registered");let r;t.scheduled()&&(r=this.DescheduleStream(t).scheduleKey.sequenceNumber),t.priority=e,r&&(this.schedule_.push({scheduleKey:{priority:t.priority,sequenceNumber:r},fullStreamEntry:{iD:i,streamEntry:t}}),this.schedule_.sort(ss))}Schedule(i){let e=this.streams_[we(i)];if(!e)return new Error("ID not registered");if(e.scheduled())return;let t={scheduleKey:{priority:e.priority,sequenceNumber:--this.currentWriteSequenceNumber_},fullStreamEntry:{iD:i,streamEntry:e}};this.schedule_.push(t),this.schedule_.sort(ss),e.currentSequenceNumber=t.scheduleKey.sequenceNumber}Deschedule(i){let e=this.streams_[we(i)];if(!e)throw new Error("Stream not registered");if(!e.scheduled())throw new Error("Stream not scheduled");this.DescheduleStream(e),e.currentSequenceNumber=void 0}IsScheduled(i){let e=this.streams_[we(i)];return e?e.scheduled():!1}static StreamId(i){return i.fullStreamEntry.iD}DescheduleStream(i){let e=this.schedule_.findIndex(r=>i.priority===r.scheduleKey.priority&&i.currentSequenceNumber===r.fullStreamEntry.streamEntry.currentSequenceNumber);if(e===-1)throw new Error("Calling DescheduleStream() on an entry that is not in the schedule at the expected key.");let t=this.schedule_[e];return this.schedule_.splice(e,1),t}},Gr=class{constructor(){this.activeGroups_=new Wr,this.perGroupSchedulers_={},this.streamToGroupMap_={}}HasRegistered(){return this.activeGroups_.HasRegistered()}HasScheduled(){return this.activeGroups_.HasScheduled()}NumScheduled(){let i=0;for(let[,e]of Object.entries(this.perGroupSchedulers_))i+=e.NumScheduled();return i}Register(i,e){if(this.streamToGroupMap_[we(i)])throw new Error("Provided stream ID already registered");this.perGroupSchedulers_[Ni(e.sendGroupId)]||(this.perGroupSchedulers_[Ni(e.sendGroupId)]=new Wr,this.activeGroups_.Register(e.sendGroupId,e));let t=this.perGroupSchedulers_[Ni(e.sendGroupId)];this.streamToGroupMap_[we(i)]={sendGroupId:e.sendGroupId,perGroupScheduler:t},t.Register(i,e)}Unregister(i){let e=this.streamToGroupMap_[we(i)];if(!e)throw new Error("Stream ID not registered");let t=e.sendGroupId,r=e.perGroupScheduler;delete this.streamToGroupMap_[we(i)],r.Unregister(i),r.HasRegistered()||(delete this.perGroupSchedulers_[Ni(t)],this.activeGroups_.Unregister(t))}UpdateSendOrder(i,e){let t=this.SchedulerForStream(i);if(!t)throw new Error("Stream ID not registered");return t.UpdatePriority(i,e)}UpdateSendGroup(i,e){let t=this.SchedulerForStream(i);if(!t)throw new Error("Stream ID not registered");let r=t.IsScheduled(i),n=t.GetPriorityFor(i);if(!n)throw new Error("Stream registered at the top level scheduler, but not at the per-group one");this.Unregister(i),this.Register(i,{sendGroupId:e,sendOrder:n}),r&&this.Schedule(i)}ShouldYield(i){let e=this.streamToGroupMap_[we(i)];if(!e)throw new Error("Stream ID not registered");let{sendGroupId:t,perGroupScheduler:r}=e;return this.activeGroups_.ShouldYield(t)?!0:r.ShouldYield(i)}GetPriorityFor(i){let e=this.streamToGroupMap_[we(i)];if(!e)return null;let{sendGroupId:t,perGroupScheduler:r}=e,n=r.GetPriorityFor(i);return n?{sendGroupId:t,sendOrder:n}:null}PopFront(){let i=this.activeGroups_.PopFront();if(typeof i>"u")return;let e=this.perGroupSchedulers_[Ni(i)];if(!e)throw new Error("Scheduled a group with no per-group scheduler attached");let t=e.PopFront();if(!(typeof t>"u"))return e.HasScheduled()&&this.activeGroups_.Schedule(i),t}Schedule(i){let e=this.streamToGroupMap_[we(i)];if(!e)return new Error("Stream ID not registered");let{sendGroupId:t,perGroupScheduler:r}=e;return this.activeGroups_.Schedule(t),r.Schedule(i)}IsScheduled(i){let e=this.SchedulerForStream(i);return e?e.IsScheduled(i):!1}SchedulerForStream(i){let e=this.streamToGroupMap_[we(i)];if(e)return e.perGroupScheduler}};var Vc=typeof process<"u"?process.pid:0,zn=_e(`webtransport:parserbase(${Vc})`);function Jn(a){return BigInt(a)<64n?1:BigInt(a)<16384n?2:BigInt(a)<1073741824n?4:8}var Ce=class Ce{constructor({nativesession:i,isclient:e,initialStreamSendWindowOffsetBidi:t,initialStreamSendWindowOffsetUnidi:r,initialStreamReceiveWindowOffset:n,streamShouldAutoTuneReceiveWindow:s,streamReceiveWindowSizeLimit:o}){this.session=i,this.isclient=e,this.blocked=!1,this.initialStreamSendWindowOffsetUnidi=r,this.initialStreamSendWindowOffsetBidi=t,this.initialStreamReceiveWindowOffset=n,this.streamShouldAutoTuneReceiveWindow=s,this.streamReceiveWindowSizeLimit=o,this.wtstreams=new Map,this.scheduler=new Gr}parseData(i){throw new Error("Implement parseData in derived Class")}writeCapsule({type:i,headerVints:e,payload:t,end:r}){throw new Error("Implement writeCapsule in derived Class")}initialParametersMandatory(){throw new Error("Implement initialParametersMandatory in derived Class")}sendClose({code:i,reason:e}){let r=new TextEncoder().encode("AAAA"+e);r[0]=i>>24&255,r[1]=i>>16&255,r[2]=i>>8&255,r[3]=i&255,this.writeCapsule({type:Ce.CLOSE_WEBTRANSPORT_SESSION,headerVints:[],payload:r,end:()=>{this.closeHttp2Stream(i)}})}newStream(i,e){let t=this.isclient?!(i&0x1n):!!(i&0x1n),r=i&0x2n?this.session.streamIdMngrUni:this.session.streamIdMngrBi;if(t){let o=r.maybeIncreaseLargestPeerStreamId(i);if(o.error){this.session.closeConnection({code:20,reason:o.error});return}}let n=!!(i&0x2n),s=new jr({streamid:i,unidirectional:n,incoming:t,capsuleParser:this,sendWindowOffset:n?this.initialStreamSendWindowOffsetUnidi:this.initialStreamSendWindowOffsetBidi,receiveWindowOffset:this.initialStreamReceiveWindowOffset,shouldAutoTuneReceiveWindow:this.streamShouldAutoTuneReceiveWindow,receiveWindowSizeLimit:this.streamReceiveWindowSizeLimit,sessionFlowController:this.session.flowController,streamIdManager:r});return this.wtstreams.set(i,s),this.scheduler.Register(i,e),this.session.jsobj.onStream({bidirectional:!(i&0x2n),incoming:t,stream:s,sendGroupId:e.sendGroupId,sendOrder:e.sendOrder}),s}scheduleDrainWrites(){if(this._scheduledDrainWriteCall)return;let i=Promise.resolve();this._scheduledDrainWriteCall=i,i.then(()=>{delete this._scheduledDrainWriteCall,this.drainWrites()}).catch(e=>zn("Error in drainWrites",e))}drainWrites(){for(this.blocked||this.session.drainWrites();!this.blocked;){let i=this.scheduler.PopFront();if(typeof i>"u")break;let e=this.wtstreams.get(i);if(!e)break;e.drainWrites()}}onMaxData(i){if(i&&this.session.flowController.updateSendWindowOffset(i)){let e=!1;this.wtstreams.forEach((t,r)=>{t.hasPendingData()&&(e=!0,this.scheduleDrainWriteStream(r))}),e&&this.drainWrites()}}onMaxStreamData(i,e){let t=this.wtstreams.get(i);t&&e&&t.flowController.updateSendWindowOffset(e)&&(this.scheduleDrainWriteStream(i),this.drainWrites())}onMaxStreamUniDi(i){typeof i>"u"||(this.session.streamIdMngrUni.maybeAllowNewOutgoingStreams(i),this.session.trySendingUnidirectionalStreams())}onMaxStreamBiDi(i){typeof i>"u"||(this.session.streamIdMngrBi.maybeAllowNewOutgoingStreams(i),this.session.trySendingBidirectionalStreams())}onDataBlocked(i){zn("Session received blocked frame "+i)}onStreamDataBlocked(i,e){zn("Stream "+i+" received blocked frame "+e)}onStreamsBlockedBidi(i){if(typeof i>"u")return;let e=this.session.streamIdMngrBi.onStreamsBlockedFrame(i);e.error&&this.session.closeConnection({code:105,reason:e.error})}onStreamsBlockedUnidi(i){if(typeof i>"u")return;let e=this.session.streamIdMngrUni.onStreamsBlockedFrame(i);e.error&&this.session.closeConnection({code:105,reason:e.error})}onCloseWebTransportSession({code:i,reason:e}){this.session.jsobj.onClose({errorcode:i,error:e}),this.closeHttp2Stream(i)}onDrain(){this.session.jsobj.onGoAwayReceived()}shouldYieldStream(i){return this.scheduler.ShouldYield(i)}scheduleDrainWriteStream(i){this.scheduler.Schedule(i)}removeStream(i){this.scheduler.Unregister(i)}streamUpdateSendOrderAndGroup(i,{sendOrder:e,sendGroupId:t}){this.scheduler.UpdateSendGroup(i,t),this.scheduler.UpdateSendOrder(i,e)}closeHttp2Stream(i){throw new Error("Implement closeHttp2Stream in derived Class")}};le(Ce,"PADDING",420171064),le(Ce,"WT_RESET_STREAM",420171065),le(Ce,"WT_STOP_SENDING",420171066),le(Ce,"WT_STREAM_WOFIN",420171067),le(Ce,"WT_STREAM_WFIN",420171068),le(Ce,"WT_MAX_DATA",420171069),le(Ce,"WT_MAX_STREAM_DATA",420171070),le(Ce,"WT_MAX_STREAMS_BIDI",420171071),le(Ce,"WT_MAX_STREAMS_UNIDI",420171072),le(Ce,"WT_DATA_BLOCKED",420171073),le(Ce,"WT_STREAM_DATA_BLOCKED",420171074),le(Ce,"WT_STREAMS_BLOCKED_UNIDI",420171075),le(Ce,"WT_STREAMS_BLOCKED_BIDI",420171076),le(Ce,"CLOSE_WEBTRANSPORT_SESSION",10307),le(Ce,"DRAIN_WEBTRANSPORT_SESSION",30894),le(Ce,"DATAGRAM",0);var Y=Ce;function os(){return(0xffffffffn>>2n)+1n}var jc=typeof process<"u"?process.pid:0,cs=_e(`webtransport:streamidmanager(${jc})`),Li=class{constructor({delegate:i,unidirectional:e,isclient:t,maxAllowedOutgoingStreams:r,maxAllowedIncomingStreams:n}){this.delegate=i,this.unidirectional=e,this.isclient=t,this.outgoingMaxStreams=BigInt(r),this.nextOutgoingStreamId=this.getFirstOutgoingStreamId(),this.outgoingStreamCount=0n,this.incomingActualMaxStreams=BigInt(n),this.incomingAdvertisedMaxStreams=BigInt(n),this.incomingInitialMaxOpenStreams=BigInt(n),this.incomingStreamCount=0n,this.availableStreams=new Set,this.largestPeerCreatedStreamId=BigInt(Number.MAX_SAFE_INTEGER),this.stopIncreasingIncomingMaxStreams=!1}onStreamsBlockedFrame(i){return i>this.incomingAdvertisedMaxStreams?{error:"StreamsBlockedFrame's stream count "+i+" exceeds incoming max stream "+this.incomingAdvertisedMaxStreams}:this.incomingAdvertisedMaxStreams===this.incomingActualMaxStreams?{success:!0}:(i<this.incomingActualMaxStreams&&this.delegate.canSendMaxStreams()&&this.sendMaxStreamsFrame(),{success:!0})}maybeAllowNewOutgoingStreams(i){if(i<=this.outgoingMaxStreams)return!1;let e=os();return i<e?this.outgoingMaxStreams=i:this.outgoingMaxStreams=e,!0}setMaxOpenIncomingStreams(i){if(this.incomingStreamCount>0)throw new Error("non-zero incoming stream count "+this.incomingStreamCount+ +" when setting max incoming stream to "+i);this.incomingInitialMaxOpenStreams!==i&&cs(this.unidirectional?"unidirectional ":"bidirectional: ","incoming stream limit changed from ",this.incomingInitialMaxOpenStreams," to ",i),this.incomingActualMaxStreams=i,this.incomingAdvertisedMaxStreams=i,this.incomingInitialMaxOpenStreams=i}maybeSendMaxStreamsFrame(){let i=2n;i>0n&&this.incomingAdvertisedMaxStreams-this.incomingStreamCount>this.incomingInitialMaxOpenStreams/i||this.delegate.canSendMaxStreams()&&this.incomingAdvertisedMaxStreams<this.incomingActualMaxStreams&&this.sendMaxStreamsFrame()}sendMaxStreamsFrame(){if(this.incomingAdvertisedMaxStreams>=this.incomingActualMaxStreams)throw new Error("this.incomingAdvertisedMaxStreams >= this.incomingActualMaxStreams"+this.incomingAdvertisedMaxStreams+"vs."+this.incomingActualMaxStreams);this.incomingAdvertisedMaxStreams=this.incomingActualMaxStreams,this.delegate.sendMaxStreams(this.incomingAdvertisedMaxStreams,this.unidirectional)}sendMaxStreamsFrameInitial(){this.delegate.sendMaxStreams(this.incomingAdvertisedMaxStreams,this.unidirectional)}onStreamClosed(i){this.isclient&&i&0x1n||!this.isclient&&!(i&0x1n)||this.incomingActualMaxStreams!==os()&&(this.stopIncreasingIncomingMaxStreams||(this.incomingActualMaxStreams++,this.maybeSendMaxStreamsFrame()))}getNextOutgoingStreamId(){if(this.outgoingStreamCount>=this.outgoingMaxStreams)throw new Error("Attempt to allocate a new outgoing stream that would exceed the limit ("+ +Number(this.outgoingMaxStreams)+")");let i=this.nextOutgoingStreamId;return this.nextOutgoingStreamId+=1n<<2n,this.outgoingStreamCount++,i}canOpenNextOutgoingStream(){return this.outgoingStreamCount<this.outgoingMaxStreams}isMaxStreamSet(){return this.outgoingMaxStreams>0n}maybeIncreaseLargestPeerStreamId(i){if(this.availableStreams.has(i))return this.availableStreams.delete(i),!0;let e=1n<<2n,t=this.largestPeerCreatedStreamId===BigInt(Number.MAX_SAFE_INTEGER)?this.getFirstIncomingStreamId():this.largestPeerCreatedStreamId+e,r=(i-t)/e+1n;if(this.incomingStreamCount+r>this.incomingAdvertisedMaxStreams)return cs("Failed to create a new incoming stream with id:"+i+", reaching MAX_STREAMS limit: "+this.incomingAdvertisedMaxStreams+"."),{error:"Stream id "+i+" would exceed stream count limit "+this.incomingAdvertisedMaxStreams};for(let n=t;n<i;n+=e)this.availableStreams.add(n);return this.incomingStreamCount+=r,this.largestPeerCreatedStreamId=i,!0}isAvailableStream(i){return this.isclient&&i&1||!this.isclient&&!(i&1)?i>=this.nextOutgoingStreamId:this.largestPeerCreatedStreamId===BigInt(Number.MAX_SAFE_INTEGER)||i>this.largestPeerCreatedStreamId||this.availableStreams.has(i)}getFirstOutgoingStreamId(){let i=0n;return this.isclient&&(i|=0x1n),this.unidirectional&&(i|=0x2n),i}getFirstIncomingStreamId(){let i=0n;return this.isclient||(i|=0x1n),this.unidirectional&&(i|=0x2n),i}get availableIncomingStreams(){return this.incomingAdvertisedMaxStreams-this.incomingStreamCount}};var Wc=typeof process<"u"?process.pid:0,Gc=_e(`webtransport:http2webtransportsession(${Wc})`),Yn=a=>setTimeout(a,0);typeof process<"u"&&(Yn=process.nextTick);var Hr=class{constructor({stream:i,ws:e,isclient:t,createParser:r,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d,initialBidirectionalSendStreams:p,initialBidirectionalReceiveStreams:u,initialUnidirectionalSendStreams:h,initialUnidirectionalReceiveStreams:S}){if(this.jsobj=void 0,i)this.stream=i;else if(e)this.ws=e;else throw new Error("Neither stream or websocket supplied");this.capsParser=r(this),this.isclient=t,this.flowController=new ui({tocontrol:this,sendWindowOffset:n,receiveWindowOffset:s,shouldAutoTuneReceiveWindow:o,receiveWindowSizeLimit:d}),this.streamIdMngrUni=new Li({delegate:this,unidirectional:!0,isclient:t,maxAllowedIncomingStreams:S,maxAllowedOutgoingStreams:h}),this.streamIdMngrBi=new Li({delegate:this,unidirectional:!1,isclient:t,maxAllowedIncomingStreams:u,maxAllowedOutgoingStreams:p}),this.datagramsWaiting_=[],this.orderUniStreams=[],this.orderBiStreams=[],i&&(t?i.on("response",R=>{Yn(()=>{if(R[":status"]===200){let M={};i&&R["wt-protocol"]&&(M.protocol=R["wt-protocol"]),this.jsobj.onReady(M)}else this.jsobj.onClose({errorcode:R[":status"],error:"Session stream errored"})})}):Yn(()=>{this.jsobj.onReady({})}))}sendInitialParameters(){let i=!1;process&&process.version&&parseInt(process.version.split(".")[0].substring(1))>=20&&(i=!0),(!i||this.capsParser.initialParametersMandatory())&&(this.flowController.sendWindowUpdate(),this.streamIdMngrBi.sendMaxStreamsFrameInitial(),this.streamIdMngrUni.sendMaxStreamsFrameInitial())}drainWrites(){for(;!this.capsParser.blocked&&this.datagramsWaiting_.length>0;){let i=this.datagramsWaiting_.shift();this.capsParser.writeCapsule({type:Y.DATAGRAM,headerVints:[],payload:i})}this.datagramsWaiting_.length>0&&this.capsParser.scheduleDrainWrites()}writeDatagram(i){return i.byteLength>this.getMaxDatagramSize()?{code:"tooBig"}:this.capsParser.blocked?(this.datagramsWaiting_.push(i),this.capsParser.scheduleDrainWrites(),{code:"blocked"}):(this.capsParser.writeCapsule({type:Y.DATAGRAM,headerVints:[],payload:i}),{code:"success"})}trySendingUnidirectionalStreams(){for(;this.orderUniStreams.length>0&&this.streamIdMngrUni.canOpenNextOutgoingStream();){let i=this.streamIdMngrUni.getNextOutgoingStreamId(),e=this.orderUniStreams.pop();this.capsParser.writeCapsule({type:Y.WT_STREAM_WOFIN,headerVints:[i],payload:void 0}),this.capsParser.newStream(i,e||{sendGroupId:0n,sendOrder:0n})}}orderUnidiStream({sendGroup:i,sendOrder:e,waitUntilAvailable:t}){let r=this.streamIdMngrUni.canOpenNextOutgoingStream(),n=this.streamIdMngrUni.isMaxStreamSet();return r||t||!n?(this.orderUniStreams.push({sendGroupId:i?._sendGroupId||0n,sendOrder:e??0n}),this.trySendingUnidirectionalStreams(),!0):!1}trySendingBidirectionalStreams(){for(;this.orderBiStreams.length>0&&this.streamIdMngrBi.canOpenNextOutgoingStream();){let i=this.streamIdMngrBi.getNextOutgoingStreamId(),e=this.orderBiStreams.pop();this.capsParser.writeCapsule({type:Y.WT_STREAM_WOFIN,headerVints:[i],payload:void 0}),this.capsParser.newStream(i,e||{sendGroupId:0n,sendOrder:0n})}}orderBidiStream({sendGroup:i,sendOrder:e,waitUntilAvailable:t}){let r=this.streamIdMngrBi.canOpenNextOutgoingStream(),n=this.streamIdMngrBi.isMaxStreamSet();return r||t||!n?(this.orderBiStreams.push({sendGroupId:i?._sendGroupId||0n,sendOrder:e??0n}),this.trySendingBidirectionalStreams(),!0):!1}orderSessionStats(){this.jsobj.onSessionStats({timestamp:0,expiredOutgoing:0n,lostOutgoing:0n,minRtt:0,smoothedRtt:0,rttVariation:0,estimatedSendRateBps:0n})}orderDatagramStats(){this.jsobj.onDatagramStats({timestamp:0,expiredOutgoing:0n,lostOutgoing:0n})}getMaxDatagramSize(){return 16384}notifySessionDraining(){}close({code:i,reason:e}){this.capsParser.sendClose({code:i,reason:e})}sendWindowUpdate(i){this.capsParser.writeCapsule({type:Y.WT_MAX_DATA,headerVints:[i],payload:void 0})}reportBlocked(i){Gc("Session was blocked at:",i)}sendBlocked(i){this.capsParser.writeCapsule({type:Y.WT_DATA_BLOCKED,headerVints:[i],payload:void 0})}connected(){return this.jsobj.state==="connected"}closeConnection({code:i,reason:e}){this.jsobj.onClose({errorcode:i,error:e}),this.close({code:i,reason:e})}smoothedRtt(){let i;return this.stream?i=this.stream.session?.WTrtt||25:this.ws&&(i=navigator?.connection?.rtt||25),i=Math.ceil(i/25)*25,i}canSendMaxStreams(){return!0}sendMaxStreams(i,e){this.capsParser.writeCapsule({type:e?Y.WT_MAX_STREAMS_UNIDI:Y.WT_MAX_STREAMS_BIDI,headerVints:[i],payload:void 0})}};var Hc=_e("webtransport:http2:browserparser");function Fe(a){if(a.offset+1>a.size)return;let i=BigInt(a.buffer[a.offset]);a.offset++;let t=1<<(Number(i)>>>6);if(!(a.offset+t-1>a.size)){i=i&0x3fn;for(let r=0;r<t-1;r++)i=i<<8n|BigInt(a.buffer[a.offset]),a.offset++;return i}}function qc(a){if(a.offset+4>a.size)return;let i=a.buffer[a.offset];return a.offset++,i=i<<8|a.buffer[a.offset],a.offset++,i=i<<8|a.buffer[a.offset],a.offset++,i=i<<8|a.buffer[a.offset],a.offset++,i}function ds(a,i){let e=8n,t=0xc0n,r=BigInt(i);r<64n?(e=1n,t=0x0n):r<16384n?(e=2n,t=0x40n):r<1073741824n&&(e=4n,t=0x80n),a.buffer[a.offset]=Number(t|r>>(e-1n)*8n&0xffn),a.offset++;for(let n=e-2n;n>=0n;n--)a.buffer[a.offset]=Number(r>>n*8n&0xffn),a.offset++}var ct=class extends Y{constructor({ws:i,nativesession:e,isclient:t,initialStreamSendWindowOffsetUnidi:r,initialStreamSendWindowOffsetBidi:n,initialStreamReceiveWindowOffset:s,streamShouldAutoTuneReceiveWindow:o,streamReceiveWindowSizeLimit:d}){super({nativesession:e,isclient:t,initialStreamSendWindowOffsetUnidi:r,initialStreamSendWindowOffsetBidi:n,initialStreamReceiveWindowOffset:s,streamShouldAutoTuneReceiveWindow:o,streamReceiveWindowSizeLimit:d}),this.ws=i,this.saveddata=void 0,this.rtype=void 0,this.closesend=!1,this.ws.addEventListener("message",p=>{p.data instanceof ArrayBuffer?this.parseData(new Uint8Array(p.data,0,p.data.byteLength)):Hc("Illegal text frame",p.data)})}parseData(i){let e={offset:0,size:i.byteLength,buffer:i},t=e.size,r=Fe(e);if(typeof r>"u")return;let n=Number(r);switch(n){case Y.PADDING:break;case Y.WT_RESET_STREAM:case Y.WT_STOP_SENDING:{let s=Fe(e);if(typeof s<"u"){let o=this.wtstreams.get(s),d=Fe(e);o&&typeof d<"u"&&(o.onStreamSignal(n===Y.WT_RESET_STREAM?"resetStream":"stopSending"),o.jsobj.onStreamRecvSignal({code:Number(d),nettask:n===Y.WT_RESET_STREAM?"resetStream":"stopSending"}))}}break;case Y.WT_STREAM_WOFIN:case Y.WT_STREAM_WFIN:{let s=Fe(e);if(typeof s<"u"){let o=this.wtstreams.get(s);if(!o&&(o=this.newStream(s,{sendOrder:0n,sendGroupId:0n}),!o))return;if(t-e.offset>=0){let d=n===Y.WT_STREAM_WFIN;d&&o.onFin(),o.recvData({data:new Uint8Array(e.buffer.buffer,e.buffer.byteOffset+e.offset,t-e.offset),fin:d})}}}break;case Y.WT_MAX_DATA:this.onMaxData(Fe(e));break;case Y.WT_MAX_STREAM_DATA:{let s=Fe(e),o=Fe(e);typeof s<"u"&&typeof o<"u"&&this.onMaxStreamData(s,o)}break;case Y.WT_MAX_STREAMS_BIDI:this.onMaxStreamBiDi(Fe(e));break;case Y.WT_MAX_STREAMS_UNIDI:this.onMaxStreamUniDi(Fe(e));break;case Y.WT_DATA_BLOCKED:this.onDataBlocked(Fe(e));break;case Y.WT_STREAM_DATA_BLOCKED:{let s=Fe(e),o=Fe(e);typeof s<"u"&&typeof o<"u"&&this.onStreamDataBlocked(s,o)}break;case Y.WT_STREAMS_BLOCKED_UNIDI:this.onStreamsBlockedUnidi(Fe(e));break;case Y.WT_STREAMS_BLOCKED_BIDI:this.onStreamsBlockedBidi(Fe(e));break;case Y.CLOSE_WEBTRANSPORT_SESSION:{let s=qc(e)||0,d=new TextDecoder().decode(new Uint8Array(e.buffer.buffer,e.buffer.byteOffset+e.offset,t-e.offset));this.onCloseWebTransportSession({code:s,reason:d})}break;case Y.DRAIN_WEBTRANSPORT_SESSION:this.onDrain();break;case Y.DATAGRAM:this.session.jsobj.onDatagramReceived({datagram:new Uint8Array(e.buffer.buffer,e.buffer.byteOffset+e.offset,t-e.offset)});break;default:}e.offset=t}writeCapsule({type:i,headerVints:e,payload:t,end:r}){let n=0;for(let u in e)n+=Jn(e[u]);n+=Jn(i);let s=n;t&&(n+=t.byteLength);let o=new Uint8Array(n),d={offset:0,size:o.length,buffer:o};ds(d,i);for(let u in e)ds(d,e[u]);let p=new Uint8Array(o.buffer,o.byteOffset+s);return t&&p.set(t),this.ws.send(o),r&&r(),!1}closeHttp2Stream(i){this.ws.close(1e3)}initialParametersMandatory(){return!0}};le(ct,"WS_CONTINUE",0),le(ct,"WS_TEXT",1),le(ct,"WS_BINARY",2),le(ct,"WS_CLOSE",8),le(ct,"WS_PING",9),le(ct,"WS_PONG",10);var Qn=["kDraft1","kDraft2"];var ls=_e("webtransport:http2:browser"),qr=class{constructor(i){this.port=i?.port||443,this.hostname=i?.host||"localhost",this.protocols=i?.protocols||[],this.initialStreamFlowControlWindow=i?.initialStreamFlowControlWindow||16*1024,this.initialSessionFlowControlWindow=i?.initialSessionFlowControlWindow||16*1024,this.initialBidirectionalStreams=i?.initialBidirectionalSendStreams||100,this.initialUnidirectionalStreams=i?.initialUnidirectionalSendStreams||100,this.streamShouldAutoTuneReceiveWindow=i.streamShouldAutoTuneReceiveWindow||!0,this.streamFlowControlWindowSizeLimit=i?.streamFlowControlWindowSizeLimit||6*1024*1024,this.sessionShouldAutoTuneReceiveWindow=i.sessionShouldAutoTuneReceiveWindow||!0,this.sessionFlowControlWindowSizeLimit=i?.sessionFlowControlWindowSizeLimit||15*1024*1024,this.jsobj=void 0,this.clientInt=void 0,this._webtransportProtocol=void 0}createTransport({path:i}){try{let e="wss://"+this.hostname+":"+this.port;i&&(e=e+"/"+i);let t=Qn.map(r=>"webtransport_"+r);this.protocols.length>0&&(t=t.filter(r=>r!=="kDraft1").map(r=>this.protocols.map(n=>r+"_"+n)).flat(1)),this.clientInt=new WebSocket(e,t)}catch(e){ls("Failed on WebTransport/Websocket:",e),this.jsobj.onClientConnected({success:!1});return}this.clientInt.binaryType="arraybuffer",this.clientInt.addEventListener("open",e=>{let t=this.clientInt?.protocol;t||(this.clientInt&&this.clientInt.close(),this.jsobj.onClientConnected({success:!1}));let r=t.split("_");!(r.length===2||r.length>=3)||r[0]!=="webtransport"||!Qn.includes(r[1])?(this.clientInt&&this.clientInt.close(),this.jsobj.onClientConnected({success:!1})):(this._webtransportProtocol=r.length>=3?r.slice(2).join("_"):void 0,this.jsobj.onClientWebTransportSupport(r.length>=3?{selectedProtocol:r.slice(2).join("_")}:{}),this.jsobj.onClientConnected({success:!0}))}),this.clientInt.addEventListener("error",e=>{ls("Failed on WebTransport/Websocket:",e),!this.jsobj?.sessionobjint||this.jsobj?.sessionobjint?.state==="connecting"?this.jsobj.onClientConnected({success:!1}):this?.jsobj?.sessionobjint?.objint&&this.jsobj.sessionobjint.close({closeCode:0,reason:e.toString()})})}openWTSession(i){if(!this.clientInt)throw new Error("clientInt not present");let e,t={session:new Hr({ws:this.clientInt,isclient:!0,createParser:r=>{e=r;let n=new ct({ws:this.clientInt,nativesession:r,isclient:!0,initialStreamSendWindowOffsetBidi:0,initialStreamSendWindowOffsetUnidi:0,initialStreamReceiveWindowOffset:this.initialStreamFlowControlWindow,streamShouldAutoTuneReceiveWindow:this.streamShouldAutoTuneReceiveWindow,streamReceiveWindowSizeLimit:this.streamFlowControlWindowSizeLimit});return this.clientInt&&this.clientInt.addEventListener("close",s=>{let o=s.code,d="Session WebSocket closed";if(s.reason){let p=s.reason.split(":");p.length>1&&(o=parseInt(p[0]),p=p.slice(1)),d=p.join(":")}else switch(o){case 1001:d="Going Away";break;case 1002:d="Protocol error";break;case 1003:d="Unsupported data";break;case 1004:d="Reserved";break;case 1005:d="No Status Rcvd";break;case 1006:d="Abnormal Closure";break;case 1007:d="Invalid frame payload data";break;case 1008:d="Policy Violation";break;case 1009:d="Message Too Big";break;case 1010:d="Mandatory Ext.";break;case 1011:d="Internal error";break;case 1012:d="Service Restart";break;case 1013:d="Try Again Later";break;case 1014:d="Bad Gateway";break;case 1015:d="TLS handshake";break;case 1e3:default:d="";break}r.jsobj.onClose({errorcode:o,error:d})}),n},sendWindowOffset:0,receiveWindowOffset:this.initialSessionFlowControlWindow,shouldAutoTuneReceiveWindow:this.sessionShouldAutoTuneReceiveWindow,receiveWindowSizeLimit:this.sessionFlowControlWindowSizeLimit,initialBidirectionalSendStreams:this.initialBidirectionalStreams,initialBidirectionalReceiveStreams:this.initialBidirectionalStreams,initialUnidirectionalSendStreams:this.initialUnidirectionalStreams,initialUnidirectionalReceiveStreams:this.initialUnidirectionalStreams}),reliable:!0};this.jsobj.onHttpWTSessionVisitor(t),e.jsobj.onReady(this._webtransportProtocol?{protocol:this._webtransportProtocol}:{})}closeClient(){this.clientInt&&this.clientInt.readyState===1&&this.clientInt.close()}};var Kc=_e("webtransport:browser()"),ps=!1,us=!1;if(globalThis.WebTransport){us=!0;try{let a=new WebTransport("https://127.0.0.1:23333/test",{serverCertificateHashes:[]});a.ready.then(()=>{try{a.close()}catch{}}).catch(()=>{})}catch(a){a?.name==="NotSupportedError"&&(Kc("serverCertificateHashesNotSupported"),ps=!0)}}var Kr=class extends Ar{startUpConnection({client:i,sessionint:e,ourl:t}){let r=t.pathname+(t.search??"");i.handleConnection({createTransport:!0,path:r}).then(()=>i.createWTSession(e,r)).catch(n=>{i.closeHookSession(),e.readyReject(n),e.closedReject(n)})}get supportsReliableOnly(){return!0}createClient(i){this.curtype="websocket";let e=new Br({createReliableClient:r=>new qr({...i}),...i}),t=new Ur({parentobj:e});return{client:e,sessionint:t}}},Ui=class{constructor(i,e){this.curtype="native",this.closeset=!1,this.allowFallback=!0,this.initiatedFallback=!1,this.args=e,this.closed=new Promise((r,n)=>{this.closeRes=r,this.closeRej=n}),this.ready=new Promise((r,n)=>{this.readyRes=r,this.readyRej=n}),this.draining=new Promise((r,n)=>{this.drainingRes=r,this.drainingRej=n});let t=()=>{this.initiatedFallback=!0,this.curtype="websocket",this.curtransport=new Kr(i,e),this.curtransport.ready.then(r=>this.readyRes(r)).catch(r=>this.readyRej(r)),this.curtransport.closed.then(r=>this.closeRes(r)).catch(r=>this.closeRej(r)),this.curtransport.draining.then(r=>this.drainingRes(r)).catch(r=>this.drainingRej(r))};us&&(!e?.serverCertificateHashes||!ps)?(this.curtransport=new WebTransport(i,e),setTimeout(()=>{if(this.allowFallback&&!this.closeset&&!this.initiatedFallback&&!this.curtransport?.supportsReliableOnly){let r=this.curtransport;r&&r.ready.then(async()=>{r.close()}).catch(()=>{}),t()}},2e3),this.curtransport.ready.then(r=>{this.allowFallback=!1,this.readyRes(r)}).catch(r=>{this.allowFallback&&!this.closeset?!this.initiatedFallback&&!this.curtransport?.supportsReliableOnly&&t():this.readyRej(r)}),this.curtransport.closed.then(r=>{this.curtype==="native"&&this.closeRes(r)}).catch(r=>{this.allowFallback&&!this.closeset?!this.initiatedFallback&&!this.curtransport?.supportsReliableOnly&&t():this.closeRej(r)}),this.curtransport.draining&&this.curtransport.draining.then(r=>{this.curtype==="native"&&this.drainingRes(r)}).catch(r=>{this.curtype==="native"&&this.drainingRej(r)})):t(),this.datagrams={get writable(){return this.datagramwritablepolyfilled_||console.warn("datagrams.writable is deprecated"),this.datagramwritablepolyfilled_||(this.datagramwritablepolyfilled_=this.createWritable())}},Object.defineProperties(this.datagrams,{maxDatagramSize:{get:()=>this.curtransport.datagrams.maxDatagramSize}}),this.datagrams.readable=new ReadableStream({start:async r=>{await this.ready,this.datagramsReader=this.curtransport.datagrams.readable.getReader()},pull:async r=>{let{value:n,done:s}=await this.datagramsReader.read();n&&r.enqueue(n),s&&r.close()},cancel:async r=>{await this.datagramsReader.cancel(r)}}),this.datagrams.createWritable=r=>{if(this.curtransport.datagrams.createWritable)return this.curtransport.datagrams.createWritable(r);if(!this.curtransport.datagrams.writable)throw new ve("No way to send out datagrams");let n=r?.sendOrder,s=r?.sendGroup,o=new WritableStream({start:async d=>{await this.ready,this.datagramsWriter||(this.datagramsWriter=this.curtransport.datagrams.writable.getWriter())},write:async(d,p)=>{await this.datagramsWriter.write(d)},abort:async d=>{await this.datagramsWriter.abort(d)},close:async()=>{await this.datagramsWriter.close()}});return Object.defineProperties(o,{sendOrder:{get:()=>n,set:d=>{n=d}},sendGroup:{get:()=>s,set:d=>{d!==s&&(s=d)}}}),o},this.incomingBidirectionalStreams=new ReadableStream({start:async r=>{await this.ready,this.incomingBidirectionalStreamsReader=this.curtransport.incomingBidirectionalStreams.getReader()},pull:async r=>{let{value:n,done:s}=await this.incomingBidirectionalStreamsReader.read();n&&r.enqueue(n),s&&r.close()},cancel:async r=>{await this.incomingBidirectionalStreamsReader.cancel(r)}}),this.incomingUnidirectionalStreams=new ReadableStream({start:async r=>{await this.ready,this.incomingUnidirectionalStreamsReader=this.curtransport.incomingUnidirectionalStreams.getReader()},pull:async r=>{let{value:n,done:s}=await this.incomingUnidirectionalStreamsReader.read();n&&r.enqueue(n),s&&r.close()},cancel:async r=>{await this.incomingUnidirectionalStreamsReader.cancel(r)}})}get congestionControl(){return this.curtransport?.congestionControl||void 0}get reliability(){return this.curtransport?.reliability||void 0}get supportsReliableOnly(){return!0}get protocol(){return this.curtransport?.protocol||void 0}getStats(){return this.curtransport.getStats()}close(i){this.closeset=!0,this.curtransport.close(i)}async createBidirectionalStream(i){return await this.ready,await this.curtransport.createBidirectionalStream(i)}async createUnidirectionalStream(i){return await this.ready,await this.curtransport.createUnidirectionalStream(i)}};var Ke=Jt(require("fflate"));var $c=63n,zc=16383n;var Jc=4611686018427387903n,$r=class{encode(i){let e=typeof i=="number"?BigInt(i):i;if(e<=$c)return new Uint8Array([Number(e)]);if(e<=zc)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<=Jc)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")}},zr=class{decode(i){let e=this.getNumBytesForLengthInteger(i);if(e<0)throw new Error("Invalid length prefix");if(i.length<e)throw new Error("Not enough data to decode integer");let t=BigInt(0);switch(e){case 1:t=BigInt(i[0]&63);break;case 2:t=BigInt(i[0]&63)<<8n|BigInt(i[1]);break;case 4:t=BigInt(i[0]&63)<<24n|BigInt(i[1])<<16n|BigInt(i[2])<<8n|BigInt(i[3]);break;case 8:t=BigInt(i[0]&63)<<56n|BigInt(i[1])<<48n|BigInt(i[2])<<40n|BigInt(i[3])<<32n|BigInt(i[4])<<24n|BigInt(i[5])<<16n|BigInt(i[6])<<8n|BigInt(i[7]);break}return t}getNumBytesForLengthInteger(i){let e=i[0]&192;return e===0?1:e===64?2:e===128?4:e===192?8:-1}};var Jr=class{constructor(i){this.encoder=new TextEncoder,this.lengthEncoder=new $r,this.compression=i??null}encode(i){let e=this.encoder.encode(i);e=this.compress(e);let t=this.lengthEncoder.encode(e.length),r=new Uint8Array(t.length+e.length);return r.set(t),r.set(e,t.length),r}compress(i){if(!this.compression)return i;switch(this.compression){case"gzip":return Ke.gzipSync(i);case"deflate":return Ke.zlibSync(i);case"deflate-raw":return Ke.deflateSync(i);default:return i}}},Yr=class{constructor(i){this.decoder=new TextDecoder,this.lengthDecoder=new zr,this.compression=i??null,this.buffer=new Uint8Array(0),this.expectedLength=null,this.offset=0}decode(i){let e=[];for(this.buffer=new Uint8Array([...this.buffer,...i]);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(i){if(i.length===0)return 0;if(this.lengthPrefixLength=this.lengthDecoder.getNumBytesForLengthInteger(i),this.lengthPrefixLength<0)throw new Error("Invalid length prefix");return Number(this.lengthDecoder.decode(i.subarray(0,this.lengthPrefixLength)))}decompress(i){if(!this.compression)return i;switch(this.compression){case"gzip":return Ke.gunzipSync(i);case"deflate":return Ke.unzlibSync(i);case"deflate-raw":return Ke.inflateSync(i);default:return i}}};var Bi=class{constructor(i,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=i,this.options=e,this.readyState=WebSocket.CONNECTING,this.compression=this.getCompressionTypeFromUrl(i),this.encoder=new Jr(this.compression),this.decoder=new Yr(this.compression),this.connect()}getCompressionTypeFromUrl(i){try{let t=new URL(i).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(){Je(E.WEBTRANSPORT_CONNECTED);try{this.webTransport=new Ui(this.url,{...this.options}),await this.webTransport.ready,c.debug("[WebTransport] WebTransport connected to "+this.url),Me.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(i){c.error("[WebTransport] WebTransport connection failed. This will cause fallback to WebSocket",i),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:i,value:e}=await this.reader.read();if(i){this.close(1e3,"Stream Closed");break}e&&this.decoder.decode(e).forEach(r=>{this.onmessage?.(new MessageEvent("message",{data:r}))})}}catch(i){c.error("[WebTransport] Stream read failed",i),this.readyState=WebSocket.CLOSED,this.onerror?.(new Event("error"))}}async send(i){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(i);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(i=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:i,reason:e}))}}static isBrowserSupported(){return y.browserName()!=="Safari"}};var hs="open",ms=[()=>l.producerScreenTrack,()=>l.videoTracksCount>0,()=>!0,()=>!0,()=>l.consumerScreenTrack,()=>!0,()=>l.movieShare,()=>l.useParticipantListChunk,()=>l.useRooms,()=>!!l.vmoji,()=>l.useCallsToContacts,()=>l.useChatRooms],Yc=10,Qc=["service-unavailable","conversation-ended","invalid-token"],xe=class xe extends bi{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="+l.platform+"&appVersion="+l.appVersion+"&version="+l.protocolVersion+"&device="+l.device+"&capabilities="+xe._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 Mr}static _getCapabilityFlags(){let e=0;for(let t=0;t<ms.length;t++)ms[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 r=this.participantIdRegistry?.handleMessage(t.data);r&&this._handleMessage(r)}}setProducerCommandDataChannel(e){this.producerCommandDataChannel=e,this.producerCommandDataChannel.onmessage=t=>{this.producerCommandSerializationService.deserializeCommandResponse(t.data).then(r=>{r&&this._handleMessage(r)}).catch(r=>{c.warn("[signaling] cannot parse message at producerCommandDataChannel",r)})},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,r)=>{if(this.socket&&this.socket.readyState<WebSocket.CLOSING){C.log(E.SOCKET_ACTION,"already_opened"),r(Error("Socket already opened"));return}this.conversationResolve=n=>{t(n),this.conversationResolve=null,this.conversationReject=null},this.conversationReject=n=>{r(n),this.conversationResolve=null,this.conversationReject=null},this._connect(e,this.isWebTransportAvailable())})}async _send(e,t={},r=!0,n=0){if(t.participantId){let s=v.decomposeParticipantId(t.participantId),o=v.decomposeId(s.compositeUserId);t=Object.assign({},t,{participantId:o.id,participantType:o.type}),s.deviceIdx&&(t.deviceIdx=s.deviceIdx)}return this._sendRaw(e,t,r,n)}async _sendRaw(e,t={},r=!0,n=0){let s=o=>{if(this._isDataChannelCommand(e))this.datachannelCommandsQueue.push(o),this.producerCommandDataChannel?.readyState===hs&&this._handleCommandsQueue(this.datachannelCommandsQueue);else{if(!this.socket){C.log(E.SOCKET_ACTION,"not_opened"),c.warn("[signaling] socket is not opened"),o.reject(new Error(`Socket not opened [${e}]`),!0);return}this.socket.readyState>WebSocket.OPEN&&(C.log(E.SOCKET_ACTION,"invalid_state"),c.warn(`[signaling] socket is not opened, state ${this.socket.readyState}`)),this.websocketCommandsQueue.push(o),this.socket&&this.socket.readyState===WebSocket.OPEN&&this._handleCommandsQueue(this.websocketCommandsQueue)}};return new Promise((o,d)=>{let p=(h,S=!1)=>{!n||S?d(h):(c.debug("[signaling] resending a signaling message",e,u.sequence),n--,s(u))},u={sequence:this.sequence++,name:e,params:t,responseTimer:0,needResponse:r,resolve:o,reject:p};s(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,r){let n=Object.assign({sdp:t},r);return this._send(O.TRANSMIT_DATA,{participantId:e,data:n})}async acceptCall(e){return this._send(O.ACCEPT_CALL,{mediaSettings:e})}async changeMediaSettings(e){return this._send(O.CHANGE_MEDIA_SETTINGS,{mediaSettings:e},!0,Yc)}async changeParticipantState(e,t){let r={participantState:{state:e}};return t&&(r.participantId=t),this._sendRaw(O.CHANGE_PARTICIPANT_STATE,r)}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 r={capabilities:t};return e&&(r.description=e.sdp),this._send(O.ALLOCATE_CONSUMER,r)}async acceptProducer(e,t){let r={description:e.sdp};return t&&(r.ssrcs=t),this._send(O.ACCEPT_PRODUCER,r)}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,r){let n={participantId:e,roles:t};return r&&(n.revoke=!0),this._sendRaw(O.GRANT_ROLES,n)}async muteParticipant(e,t,r,n=null){return this._sendRaw(O.MUTE_PARTICIPANT,{participantId:e,muteStates:t,requestedMedia:r,roomId:n})}async enableFeatureForRoles(e,t){return this._sendRaw(O.ENABLE_FEATURE_FOR_ROLES,{feature:e,roles:t})}async pinParticipant(e,t,r){let n={participantId:e,roomId:r};return t&&(n.unpin=!0),this._sendRaw(O.PIN_PARTICIPANT,n)}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,r=!1){let n={};return e&&(n.fromId=e),t&&(n.count=t),r&&(n.backward=r),this._send(O.GET_WAITING_HALL,n)}async promoteParticipant(e,t=!1){let r={};return e&&(r.participantId=e),t&&(r.demote=t),this._sendRaw(O.PROMOTE_PARTICIPANT,r)}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 r="";e&&(r+=`&tgt=${e}`),e===ot.RETRY&&this.lastStamp&&(r+=`&recoverTs=${this.lastStamp}`),r=n(r),t?(r+="&compression=deflate-raw",c.debug("[signaling] connecting to wt "+this.wtEndpoint+this.postfix+r),this.socket=new Bi(this.wtEndpoint+this.postfix+r)):(c.debug("[signaling] connecting to ws "+this.endpoint+this.postfix+r),this.socket=new WebSocket(this.endpoint+this.postfix+r)),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 n(s){if(!l.useParticipantListChunk)return s;let o=l.participantListChunkInitIndex;s+=`&partIdx=${o}`;let d=l.participantListChunkInitCount;return d!==null&&(s+=`&partCount=${d}`),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(){c.debug("[signaling] socket opened"),C.log(E.SOCKET_ACTION,"opened"),this._waitConnectionMessage(),this._startDoctor()}_onMessage(e){if(this._startDoctor(),e.data==="ping"){I.onSignalingMessage(e.data),this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send("pong");return}try{let t=JSON.parse(e.data);I.onSignalingMessage(t),this._handleMessage(t)}catch(t){C.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(De.RECONNECT,e),e.conversation.topology&&this._triggerEvent(De.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(De.NOTIFICATION,e);break;case"response":this._handleCommandResponse(!0,e);break;case"error":this._handleErrorMessage(e);break;default:C.log(E.SOCKET_ACTION,"unknown_message"),c.warn("[signaling] unhandled message",e)}this.lastStamp=e.stamp||this.lastStamp}_handleErrorMessage(e){C.log(E.SOCKET_ACTION,`error-${e.error}`);let t=e.error?Qc.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 G(e.reason||ne.SIGNALING_FAILED,{message:`Conversation ended: ${e.error}`,remote:!0})):this._triggerEvent(De.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||ne.SIGNALING_FAILED,{message:`Unable to connect to the signaling: ${e.error}`,remote:!0})),this._closeSocket())}}_handleCachedMessages(){let e=[...this.incomingCache];for(this.incomingCache=[];e.length>0;){let t=e.shift();this._handleMessage(t)}}_throwError(e){this._triggerEvent(De.FAILED,e)}_onError(e){C.log(E.SOCKET_ACTION,"error"),c.error("[signaling] signaling error",e)}_onClose(e){C.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++<xe.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(xe.RECONNECT_MAX_DELAY,xe.RECONNECT_DELAY*Math.pow(2,this.reconnectCount-1));c.log(`[signaling] reconnect websocket after ${e}ms (${this.reconnectCount})`),C.log(E.SOCKET_ACTION,"reconnect"),this.reconnectTimer=window.setTimeout(this._connect.bind(this,ot.RETRY,!1),e)}_handleCommandResponse(e,t){if(!this.responseHandlers.hasOwnProperty(t.sequence))return;let r=this.responseHandlers[t.sequence];window.clearTimeout(r.responseTimer),c.debug(`[signaling] command response [${t.sequence}]`,t),e?(delete this.responseHandlers[t.sequence],r.resolve(t)):t.type==="error"?(delete this.responseHandlers[t.sequence],C.log(E.SOCKET_ACTION,"response-error"),r.reject(new Error(t.error||`Response error [${r.name}]`),!0)):this.socket?.readyState===WebSocket.OPEN?(delete this.responseHandlers[t.sequence],C.log(E.SOCKET_ACTION,"response-timeout"),r.reject(new Error(t.error||`Response timeout [${r.name}]`))):r.responseTimer=window.setTimeout(()=>this._handleCommandResponse(e,t),xe.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!==hs){t.reject(new Error(`Invalid data channel state: ${this.producerCommandDataChannel?.readyState}`));return}this._startResponseTimer(t);let r=this._serializeBinary(t);r!==null&&this.producerCommandDataChannel.send(r)}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"}),xe.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 r=Object.assign({command:e.name,sequence:e.sequence},t);return JSON.stringify(r)}_convertDisplayLayout(e){let t=e,r={};for(let n in t)t.hasOwnProperty(n)&&(r[n]=Ga(t[n]));return{layouts:r}}_waitConnectionMessage(){this.connectionMessageWaitTimer=window.setTimeout(()=>{this.conversationReject&&this.conversationReject(new G(ne.SIGNALING_FAILED,{message:"Unable to connect to the signaling: connection timeout",remote:!0}))},xe.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(ot.RETRY,!1)},xe.WAIT_MESSAGE_DELAY)}_stopDoctor(){window.clearTimeout(this.doctorTimer),this.doctorTimer=0}isWebTransportAvailable(){return Bi.isBrowserSupported()&&this.wtEndpoint!==null&&l.webtransport}};xe.RECONNECT_DELAY=l.signalingReconnectDelay,xe.RECONNECT_MAX_DELAY=l.signalingReconnectMaxDelay,xe.RECONNECT_MAX_COUNT=l.signalingReconnectMaxCount,xe.WAIT_CONNECTION_DELAY=l.waitConnectionDelay,xe.WAIT_RESPONSE_DELAY=l.waitResponseDelay,xe.WAIT_MESSAGE_DELAY=l.waitMessageDelay;var Wt=xe;var fs=(t=>(t.INCOMING="INCOMING",t.OUTGOING="OUTGOING",t.JOINING="JOINING",t))(fs||{}),Le=fs;var gs=(t=>(t.USER="USER",t.GROUP="GROUP",t.CHAT="CHAT",t))(gs||{}),dt=gs;var _s=(e=>(e.ATTENDEE="ATTENDEE",e.HAND_UP="HAND_UP",e))(_s||{}),Qr=_s;var Ss=(t=>(t.ADD_PARTICIPANT="ADD_PARTICIPANT",t.RECORD="RECORD",t.MOVIE_SHARE="MOVIE_SHARE",t))(Ss||{}),Xr=Ss;var vs=(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))(vs||{}),Gt=vs;function Is(a,i){if(a.length!==i.length)return!1;for(let e of a)if(!i.includes(e))return!1;return!0}function Es(a,i){let e=new Set(a);for(let[t,r]of Object.entries(i))r?e.add(t):e.delete(t);return Array.from(e)}var bs=(t=>(t.UNMUTE="UNMUTE",t.MUTE="MUTE",t.MUTE_PERMANENT="MUTE_PERMANENT",t))(bs||{}),Ge=bs;var Cs=(r=>(r.CALLED="CALLED",r.ACCEPTED="ACCEPTED",r.REJECTED="REJECTED",r.HUNGUP="HUNGUP",r))(Cs||{}),Q=Cs;var Ts=(r=>(r.UPDATE="UPDATE",r.REMOVE="REMOVE",r.ACTIVATE="ACTIVATE",r.TIMEOUT="TIMEOUT",r))(Ts||{}),hi=Ts;var Rs=(e=>(e.AUDIO_MIX="audio-mix",e.PARTICIPANT_AGNOSTIC_TRACK_PREFIX="pat",e))(Rs||{}),et=Rs;var ys=(e=>(e.NO_AVAILABLE_TRACKS="no-available-tracks",e.UNKNOWN_ERROR="unknown-error",e))(ys||{}),Ps=ys;function ws(a){switch(a){case 1:return"no-available-tracks";default:return"unknown-error"}}var Ms=(e=>(e.CREATOR="CREATOR",e.ADMIN="ADMIN",e))(Ms||{}),mt=Ms;function Fi(a,i){if(a.length!==i.length)return!1;for(let e of a)if(!i.includes(e))return!1;return!0}var Zr=(t=>(t.USER="USER",t.ANONYM="ANONYM",t.GROUP="GROUP",t))(Zr||{}),$;(u=>{function a(h){return h.length?typeof h[0]=="object"?h:h.map(S=>i(S)):[]}u.fromIds=a;function i(h,S="USER",R=0){return{id:h,type:S,deviceIdx:R}}u.fromId=i;function e(h,S=!0){let R=S?h.decorativeExternalUserId:h.externalId,M=h.deviceIdx??0;if(R)return t(R,M)}u.fromSignalingParticipant=e;function t(h,S=0){return{id:h.id,type:h.type==="ANONYM"?"ANONYM":"USER",deviceIdx:S}}u.fromSignaling=t;function r(h){return h.id}u.toSignaling=r;function n(h){let S=h.deviceIdx||0;return`{"id":"${h.id}","type":"${h.type}","deviceIdx":${S}}`}u.toString=n;function s(h,S="USER",R=0){return n(i(h,S,R))}u.fromIdToString=s;function o(h){try{return JSON.parse(h)}catch{throw new Error(`Failed to parse ExternalId from string '${h}'`)}}u.fromString=o;function d(h,S){return h.id===S.id&&h.type===S.type&&h.deviceIdx===S.deviceIdx}u.compare=d;function p(h){return h?.deviceIdx||0}u.getDeviceIdx=p})($||($={}));var{isObject:As,isObjectsEquals:Xc}=v;function Xn(a,i){return a===null||i===null?a===null&&i===null:a.maxDimension!==i.maxDimension||a.maxBitrateK!==i.maxBitrateK||a.maxFramerate!==i.maxFramerate||a.degradationPreference!==i.degradationPreference||a.scalabilityMode!==i.scalabilityMode||As(a.bitrates)&&As(i.bitrates)&&!Xc(a.bitrates,i.bitrates,!0)?!1:a.bitrates===i.bitrates}function en(a,i){return!(!Xn(a.camera,i.camera)||!Xn(a.screenSharing,i.screenSharing))}function Zn(a,i){return{camera:Object.assign({},a.camera,i.camera),screenSharing:Object.assign({},a.screenSharing,i.screenSharing)}}function Ds(a){try{return btoa(JSON.stringify(a))}catch(i){c.warn("WaitingParticipant: failed convert to string",a,i)}return null}function ks(a){try{return JSON.parse(atob(a))}catch(i){c.warn("WaitingParticipant: failed convert from string",a,i)}return null}function xs(a,i){let e=new Uint8Array(i),t=0,r=0;for(;t<a.length&&r<i;){let n=a[t++],s=n>>4,o=n&15;if(s===15){let u;do u=a[t++],s+=u;while(u===255)}for(let u=0;u<s&&!(r>=i);u++)e[r++]=a[t++];if(t>=a.length||r>=i)break;let d=a[t]|a[t+1]<<8;if(t+=2,o===15){let u;do u=a[t++],o+=u;while(u===255)}o+=4;let p=r-d;for(let u=0;u<o&&!(r>=i);u++)e[r++]=e[p+u]}return e}var tn=(a,i)=>v.objectReduce(a,(e,t,r)=>(t===i&&e.push(r),e),[]);function Os(a){if(a.conversation?.muteStates)return a.conversation.muteStates;if(a.muteState&&a.muteOptions)return a.muteOptions.reduce((i,e)=>(i[e]=a.muteState,i),{})}function Zc(a,i){switch(a){case oe.AUDIO:return!!i.isAudioEnabled;case oe.AUDIO_SHARING:return!!i.isAudioSharingEnabled;case oe.VIDEO:return!!i.isVideoEnabled;case oe.SCREEN_SHARING:return!!i.isFastScreenSharingEnabled||!!i.isScreenSharingEnabled;default:return!1}}function Ns(a,i){return v.objectReduce(a,(e,t,r)=>{switch(t){case Ge.MUTE:case Ge.MUTE_PERMANENT:{Zc(r,i)||(e[r]=t);break}default:e[r]=t;break}return e},{})}function Ls(a){let{muteStates:i={},mediaSettings:e}=a;return Ns(i,e)}function Us(a,i){let e=a.conversation.participants.find(r=>v.comparePeerId(r.peerId,a.peerId));if(!e)return i;let{mediaSettings:t}=e;return Ns(i,t)}var mi=class{constructor(i){this._fixNoPacketsApplied=!1;this._fixNoPacketsChecked=!1;this._fixTooManyPacketsApplied=!1;this._fixTooManyPacketsSucceeded=!1;this._fixTooManyPacketsFailed=!1;this._toggleAudioPromise=null;this._fixNoPacketsAppliedVideo=!1;this._mediaSource=i}_fixAudioDeviceNoPackets(i){if(!(this._fixNoPacketsApplied&&this._fixNoPacketsChecked)){if(this._fixNoPacketsApplied&&!this._fixNoPacketsChecked){this._fixNoPacketsChecked=!0,C.log(E.ERROR,`audio_device_recover_${i.bandwidth?"success":"fail"}`);return}!this._fixNoPacketsApplied&&!i.bandwidth&&(this._fixNoPacketsApplied=!0,C.log(E.ERROR,"audio_device_recover"),c.log("[AudioFix] Trying to fix RV (no packets)"),this._toggleAudioPromise=this._mediaSource.toggleAudio(y.getMicrophonePermissionState()!=="denied"))}}_fixAudioDeviceTooManyPackets(i){if(this._fixTooManyPacketsSucceeded||this._fixTooManyPacketsFailed)return;let e=75,t=Date.now();if(!this._lastPacketsSentTime)i.packetsSent>0&&(this._lastPacketsSentTime=t,this._lastPacketsSent=i.packetsSent);else if(t-this._lastPacketsSentTime>500){let r=(i.packetsSent-this._lastPacketsSent)*1e3/(t-this._lastPacketsSentTime);this._lastPacketsSentTime=t,this._lastPacketsSent=i.packetsSent,this._fixTooManyPacketsApplied?r>e?(c.log("[AudioFix] Failed to fix RV"),C.log(E.ERROR,"audio_device_recover_rv_fail"),this._fixTooManyPacketsFailed=!0):t-this._fixTooManyPacketsTime>6e4&&(c.log("[AudioFix] Fixed RV"),C.log(E.ERROR,"audio_device_recover_rv_success"),this._fixTooManyPacketsSucceeded=!0):r>e&&(this._fixTooManyPacketsApplied=!0,C.log(E.ERROR,"audio_device_recover"),c.log("[AudioFix] Trying to fix RV (too many packets)"),this._mediaSource.toggleAudio(!0),this._fixTooManyPacketsTime=t)}}fix(i){if(!this._mediaSource)return;let e=i.find(t=>t.kind==="audio");e&&(this._fixAudioDeviceNoPackets(e),this._fixAudioDeviceTooManyPackets(e))}fixVideo(i){if(!this._mediaSource||this._fixNoPacketsAppliedVideo||!this._toggleAudioPromise)return;let e=i.find(t=>t.kind==="video");e&&!e.bandwidth&&(this._fixNoPacketsAppliedVideo=!0,this._toggleAudioPromise.then(()=>{this._mediaSource.getMediaSettings().isVideoEnabled&&this._mediaSource.toggleVideo(!0)}))}};var Vi=class{constructor(i){this._output=null;this._volume=1;this._features={setSinkId:!!Audio.prototype.setSinkId};this._statFirstMediaReceived=i}add(i){this.destroy(),this._output={},this._output.audioTrack=i,this._initAudioElement()}remove(i){!this._output||this._output.audioTrack!==i||this.destroy()}get volume(){return this._volume}set volume(i){this._volume=Math.max(0,Math.min(1,i)),this._output&&this._output.audioElement&&(this._output.audioElement.volume=this._volume)}_initAudioElement(){if(l.muteMode||!this._output?.audioTrack)return;let i=y.browserName()!=="Safari"||y.isMobile(),e=document.createElement(i?"audio":"video");e.muted=!1,e.volume=this._volume,e.preload="auto";let t=()=>{c.warn("[audio] Error on play audio"),I.onAutoplayError()},r=s=>{e.srcObject=new MediaStream([s]),e.load();let o=e.play();o&&o.catch(t)},n=()=>{c.debug("[audio] Recover audio playback");let s=this._output?.audioTrack;s?r(s):c.warn("[audio] Broken audio track")};e.onpause=n,e.onstalled=n,e.onerror=n,e.onloadeddata=()=>{this._statFirstMediaReceived.measure()},r(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 i=y.getSavedOutput();i&&await this._output.audioElement.setSinkId?.(i.deviceId)}catch(i){throw C.log(E.ERROR,"change_output"),c.error("[audio] Output change failed",i),i}}};var ed=90,td=3,ji=class extends ae{constructor(){super(...arguments);this._lastMemoryStat={percent:0,bytes:0}}onRemoteDataStats(e,t){this._calcMemory(),e.inbound.rtps.map(r=>{let n=typeof r.userId=="string"&&t[r.userId]||null;r.userId=n?.externalId}),I.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)),r=Number((e.usedJSHeapSize/1024/1024).toFixed(1));t>ed?c.warn(`High memory usage: ${t}% (${r} MiB)`):(!this._lastMemoryStat.percent||Math.abs(t-this._lastMemoryStat.percent)>=td)&&(c.debug(`Memory usage: ${t}% (${r} MiB)`),this._lastMemoryStat.percent=t,this._lastMemoryStat.bytes=e.usedJSHeapSize)}};var id=44100,bt=class{constructor(i,e){this._analyser=null;this._gainNode=null;this._fftBins=null;this._mediaStreamSource=null;this._lastSmoothedLevel=0;this._trackId=i,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 i=id/this._fftBins.length,e=Math.ceil(l.voiceParams.minFreq/i),t=Math.floor(l.voiceParams.maxFreq/i);return this._fftBins.subarray(e,t)}getLevel(){let i=this._getBins(),t=i.reduce((n,s)=>n+s,0)/i.length/255,r=this._lastSmoothedLevel*l.voiceParams.smoothing+t*(1-l.voiceParams.smoothing);return this._lastSmoothedLevel=r,{real:t,smoothed:r}}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 Wi=class extends ae{constructor(e){super();this._detector=null;this._interval=null;let t=()=>{this._detector&&I.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 r=()=>{let n=e.getSendAudioTrack();n&&this.init(n)};this.subscribe(e,"SOURCE_CHANGED",n=>{n.kind==="audio"&&e.getMediaSettings().isAudioEnabled&&r()}),this.subscribe(e,"SOURCE_READY",r),r()}init(e){this._stopDetector(),this._detector=new bt("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 Bs=(s=>(s.producerNotification="producerNotification",s.producerCommand="producerCommand",s.consumerScreenShare="consumerScreenShare",s.producerScreenShare="producerScreenShare",s.asr="asr",s.animoji="animoji",s))(Bs||{}),ft=Bs;var Ct=class Ct{constructor(){this._codecUsages=new Map;this.getCurrentTransportTopology=()=>{}}static create(i){let e=new Ct;e.getCurrentTransportTopology=i,Ct._instance=e}static reportUsage(i){let e=Ct._instance,t=e?.getCurrentTransportTopology();if(!e||!t)return;let r=i.rtps.filter(n=>n.type==="outbound-rtp"&&!n.mid?.endsWith("s"));l.simulcast&&(r=r.reduce((n,s)=>{if(s.kind!=="video")return n.concat(s);let o=n.find(d=>d.kind==="video");return o?o.totalEncodeTime=(o.totalEncodeTime??0)+(s.totalEncodeTime??0):n.push(s),n},[])),r.forEach(n=>{let s=n.kind,o=n.mimeType;if((s==="audio"||s==="video")&&o){let d=n.encoderImplementation,p=[o,"encoder",d].filter(Boolean).join("/");e.saveUsage({kind:s,codecName:p,totalEncodeTime:(n.totalEncodeTime??0)*1e3,audioCodecParams:n.sdpFmtpLine,topology:t})}})}saveUsage({kind:i,codecName:e,totalEncodeTime:t,audioCodecParams:r,topology:n}){let s=this._codecUsages.get(i);if(s&&s.codecName!==e&&this.report(s),s&&s.codecName===e){this._codecUsages.set(i,{...s,totalEncodeTime:t,topology:n});return}this._codecUsages.set(i,{kind:i,codecName:e,audioCodecParams:r,totalEncodeTime:t,topology:n})}report(i){if(i.kind==="video"&&i.totalEncodeTime===0)return;let e={name:E.CODEC_USAGE,codec_implementation:i.codecName,value:i.totalEncodeTime,call_topology:i.topology==="DIRECT"?"D":"S"};i.audioCodecParams&&(e.string_value=i.audioCodecParams),C.logClientStats(e)}static destroy(){Ct._instance?._destroy(),Ct._instance=null}_destroy(){this._codecUsages.forEach(i=>{this.report(i)}),this._codecUsages.clear()}};Ct._instance=null;var lt=Ct;var Ht=class extends ae{constructor(e,t){super();this._state="IDLE";this._pc=null;this._signaling=e,this._mediaSource=t}getState(){return this._state||"IDLE"}};var Fs="videochat-epi",rd=5e3,nd=500,Tt=class extends ae{constructor(e,t,r=!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=r,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(Fs)||"",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+rd<=t&&(await this.reportPerfStats(e),this._previousPerfStatReportTimestamp=t);let r=e.outbound.transport.local?.protocol==="tcp";!this._directTopology&&r&&this._previousNetworkStatReportTimestamp+nd<=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((r,n)=>(n.kind==="video"&&(r.framesDecoded+=n.framesDecoded||0,r.framesReceived+=n.framesReceived||0),r),{framesDecoded:0,framesReceived:0});if(t.framesDecoded)try{let r=await this._signaling.reportPerfStat(t);localStorage.setItem(Fs,r.estimatedPerformanceIndex)}catch{}}async reportNetworkStats(e){let t={timestamp:e.outbound.transport.timestamp,sendBitrate:e.outbound.rtps.reduce((r,n)=>r+(n.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:js(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:js(e.inbound.transport.remote),remote_connection_type:e.inbound.transport.remote?.type};this._previousCallStatReport||(this._previousCallStatReport=Object.assign({},t));let r=!1,n=!1;for(e.inbound.rtps.reduce((p,u)=>(u.kind==="video"?(r=!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):(n=!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 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),r&&!nn(t.jitter_video)&&(s.jitter_video=Math.round(t.jitter_video)),n&&!nn(t.jitter_audio)&&(s.jitter_audio=Math.round(t.jitter_audio)),r&&!nn(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),n&&!nn(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),h=Math.max(0,t.removed_audio_samples_for_acceleration-this._previousCallStatReport.removed_audio_samples_for_acceleration),S=Math.max(0,t.concealed_audio_samples-this._previousCallStatReport.concealed_audio_samples),R=Math.max(0,t.silent_concealed_audio_samples-this._previousCallStatReport.silent_concealed_audio_samples),M=Math.max(0,t.audio_concealment_events-this._previousCallStatReport.audio_concealment_events);s.inserted_audio_samples_for_deceleration=qt(u/p*1e3),s.removed_audio_samples_for_acceleration=qt(h/p*1e3),s.concealed_audio_samples=qt(S/p*1e3),s.concealed_silent_audio_samples=qt(R/p*1e3),s.concealment_audio_avg_size=qt(S/M),s.total_audio_energy=t.total_audio_energy}Vs(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),Vs(t,"remote_address","remote_connection_type")&&(s.remote_address=t.remote_address,s.remote_connection_type=t.remote_connection_type);let o=Math.max(0,t.packets_sent_video-this._previousCallStatReport.packets_sent_video),d=Math.max(0,t.packets_sent_audio-this._previousCallStatReport.packets_sent_audio);if(o>0){let p=Math.max(0,t.packets_lost_video-this._previousCallStatReport.packets_lost_video);s.video_loss=qt(p/o*100)}if(d>0){let p=Math.max(0,t.packets_lost_audio-this._previousCallStatReport.packets_lost_audio);s.audio_loss=qt(p/d*100)}Me.logCallStat(s),l.enableLogPerfStatReport&&c.log("Sent call stats",s),this._previousCallStatReport=t}};function Vs(a,...i){for(let e of i)if(!a.hasOwnProperty(e)||a[e]===void 0)return!1;return!0}function js(a,i=!1){if(a?.address)return a.address+(i?`:${a.port}`:"")}function nn(a){return a===void 0}function qt(a){return Number.isNaN(a)?0:a}var Hi=class{constructor(i,e=null){this.value=NaN;this.weightUp=i,this.weightDown=e??i}set(i){this.value=i}update(i){return this.value=this.getNext(i),this.value}getNext(i){if(isNaN(this.value))return i;let e=i<this.value?this.weightDown:this.weightUp;return this.value*(1-e)+i*e}getValue(){return this.value}};var Ws=.25,Gs=.35,ad=85,sd=.1,od=1.5,cd=.1,dd=1,ld=.6,pd=.3;var qi=class extends ae{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 Hi(Ws,Ws),loss:new Hi(Gs,Gs),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(),r=1;if(isNaN(t))return r;let n=Math.round((t-this._networkLimits.goodNet.rtt)/ad);for(let s=0;s<n;s++)r*=1-sd;return r}_calcLossRating(e){let t=typeof e=="number"?e:e.getValue(),r=1;if(isNaN(t))return r;let n=Math.round((t-this._networkLimits.goodNet.loss)/od);for(let s=0;s<n;s++)r*=1-cd;return r}_calcBitrateRating(e,t){if(!e||!t)return 1;let n=1-(1-Math.min(e,t)/Math.max(e,t))*dd;return Math.min(n,1)}_calcUDPRating({rtt:e,loss:t}){return this._calcRttRating(e)*this._calcLossRating(t)}_calcRating(e,t,r){return r?this._calcBitrateRating(e.bitrate,t.bitrate):this._calcUDPRating(e)*this._calcUDPRating(t)}_getNetworkState(e){return isNaN(e)||e>=ld?"good":e>=pd?"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",r=Math.max(0,Math.round(e.outbound.transport.currentRoundTripTime*1e3)||0),n=e.inbound.rtps.reduce((h,S)=>Math.max(h,S.packetLoss||0),0),s={rtt:this._localNetworkStat.rtt.update(r),loss:this._localNetworkStat.loss.update(n)};if(t){let h=e.outbound.rtps.reduce((S,R)=>S+(R.bandwidth??0)*8,0);s.bitrate=h,this._localNetworkStat.bitrate=h}let o=Date.now(),d=this._calcRating(this._localNetworkStat,this._remoteNetworkStat,t),p=Math.max(Math.round(d*10)/10,.1),u=this._getNetworkState(p);(t||u!==this._currentState||o-this._lastStatSentTimestamp>l.networkStatisticsInterval)&&(this._lastStatSentTimestamp=o,this._signaling.customData({sdk:Object.assign({type:"bad-net"},s)},null).catch(h=>{c.warn("Unable to send [bad-net]",h)})),this._currentState=u,this._triggerEvent("NETWORK_STATUS",p)}reportRemote(e){let{rtt:t,loss:r,bitrate:n}=e||{};this._remoteNetworkStat.rtt=t||0,this._remoteNetworkStat.loss=r||0,this._remoteNetworkStat.bitrate=n||0}};var ud=30*1e3,Ki=class a extends Ht{constructor(e,t,r,n,s){super(r,n);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=s,this._perfStatReporter=new Tt(this,r,!0),this._directStatReporter=new qi(r),this.subscribe(this._signaling,De.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,ft.animoji,o=>{this._animojiDataChannel=o,this._animojiDataChannel.binaryType="arraybuffer",this._animojiReceiver?.setDataChannel(this._animojiDataChannel),this._animojiSender?.setDataChannel(this._animojiDataChannel)}),this._isMaster){try{this._mediaSource.addTrackToPeerConnection(this._pc,!1,!0),this._applySettings()}catch(o){C.log(E.ERROR,"addTrack-direct"),c.error("Unable to add media source tracks",o,{participantId:this._participantId}),this._failedOnCreate=o;return}this._createOffer(!1).catch(o=>{this._state==="IDLE"?this._failedOnCreate=o:this.close(o)})}this._startSettingsInterval()}get participantId(){return this._participantId}updateStatisticsInterval(){this._stopStatInterval(),this._isDeadConnection()||this._startStatInterval()}_isDeadConnection(){return["IDLE","CLOSED","FAILED"].includes(this.getState())}async open(e=null){if(this._isOpen){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(r){C.log(E.ERROR,"addTrack-direct"),c.error("DirectTransport: Unable to add media source tracks",r,{participantId:this._participantId}),this.close(r);return}this._setState("OPENED");let t=e;if(!e){let r=Object.keys(this._remoteSDP);t=r[r.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){en(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?(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 L.TRANSMITTED_DATA:this._handleTransmittedData(e);break;case L.SETTINGS_UPDATE:this._directStatReporter.updateSettings(e.settings);break;case L.CUSTOM_DATA:e.data.hasOwnProperty("sdk")&&this._directStatReporter.reportRemote(e.data?.sdk);break}}_handleTransmittedData(e){let t=e.data,r=v.getPeerIdString(e.peerId);v.composeMessageId(e)===this._participantId&&(t.candidate&&t.candidate.candidate?this._addIceCandidate(r,t.candidate).catch(this.close.bind(this)):t.sdp&&(this._remoteAnimojiVersion=t.animojiVersion||1,this._setRemoteDescription(r,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(r){throw C.log(E.ERROR,"addIceCandidate-direct"),c.error("Unable to add remote ice candidate",r,{participantId:this._participantId,candidate:t}),r}}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 r of t)try{await this._addIceCandidate(e,r)}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=a._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(r){throw C.log(E.ERROR,"setRemoteDescription-direct"),c.error("Unable to set remote description",r,{participantId:this._participantId,sdp:t}),r}}else this._remoteSDP[e]=t}_processAnimojiProtocolVersion(e){let t=Math.min(e,l.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: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(r=>this._signaling.sendSdp(this._participantId,r,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}),C.log(E.ICE_CONNECTION_STATE,this._pc?.connectionState),this._pc?.connectionState){case"connected":this._neverConnected=!1,this._setState("CONNECTED"),this._stopReconnection(),v.getPeerConnectionHostInfo(this._pc).then(e=>{e?.local&&(C.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()},l.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?(C.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}),C.log(E.ERROR,"iceRestart-direct"),this._requestTopologySwitch()},l.iceRestartWaitTime)}async _createOffer(e){let t={iceRestart:e,offerToReceiveAudio:!0,offerToReceiveVideo:!0};c.debug("Create offer",{participantId:this._participantId,options:t});let r;try{r=await this._pc?.createOffer(t),c.debug("Created offer",{participantId:this._participantId,offer:r}),r=a._patchLocalDescription(r)}catch(n){throw c.error("Unable to create offer",n,{participantId:this._participantId}),C.log(E.ERROR,"createOffer-direct"),n}try{return c.debug("Set local description",{participantId:this._participantId,offer:r}),this._calcFingerprint(r.sdp),await this._pc?.setLocalDescription(r),r}catch(n){throw c.error("Unable to set local description",n,{participantId:this._participantId}),C.log(E.ERROR,"setLocalDescription-direct"),n}}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=a._patchLocalDescription(e)}catch(t){throw c.error("Unable to create answer",t,{participantId:this._participantId}),C.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}),C.log(E.ERROR,"setLocalDescription-direct"),t}}static _patchLocalDescription(e){let t=!!y.baseChromeVersion();return e.sdp=v.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=v.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(r=>{c.error("DirectTransport: Unable to replace track",r,{participantId:this._participantId}),C.log(E.ERROR,"replaceTrack-direct")})}),this._applySettings())}_startStatInterval(){if(this._statInterval)return;let e=()=>{if(this._isDeadConnection()){this._stopStatInterval();return}yi(this._pc,this._lastStat,void 0,!0).then(t=>{this._lastStat=t,lt.reportUsage(t);let r={inbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(n=>n.type==="inbound-rtp"?(n.userId=this._participantId,!0):!1)},outbound:{topology:"DIRECT",transport:t.transport,rtps:t.rtps.filter(n=>n.type==="outbound-rtp")},remoteInbound:{topology:"DIRECT",transport:t.transport,rtps:t.remoteRtps??[]}};this._checkPPTNetwork(r),this._directStatReporter.reportLocal(r),this._triggerEvent("REMOTE_DATA_STATS",r),this._statInterval=window.setTimeout(e,l.statisticsInterval)})};this._statInterval=window.setTimeout(e,l.statisticsInterval)}async _isSVCSupported(e,t){let r=this._mediaSource.getSendVideoTrack(),n=e.outbound.rtps.find(d=>d.kind==="video");if(!n?.mimeType||!n?.bandwidth||!r)return!1;let s=r.getSettings();if(!s.width||!s.height||!s.frameRate)return!1;let o={type:y.browserName()==="Firefox"?"transmission":"webrtc",video:{contentType:n.mimeType,width:s.width,height:s.height,bitrate:n.bandwidth,framerate:s.frameRate,scalabilityMode:t}};try{return(await navigator.mediaCapabilities.encodingInfo(o)).supported||!1}catch(d){return c.warn("Failed to get encodingInfo",o,d),!1}}async _checkPPTNetwork(e){if(!l.switchVideoAtBadNetwork||!e.inbound.transport.averageNetStat)return;let{averageNetStat:t}=e.inbound.transport,r=t.currentRoundTripTime<=this._networkLimitsForVideo.good.rtt&&t.lostPercent<=this._networkLimitsForVideo.good.loss,n=t.currentRoundTripTime>=this._networkLimitsForVideo.bad.rtt||t.lostPercent>=this._networkLimitsForVideo.bad.loss,s=t.currentRoundTripTime<this._networkLimitsForVideo.bad.rtt,o=this._videoMaxDimensionsForNet.good,d="L1T1";if(n?(this._lastBadConnection=Date.now(),s?(o=this._videoMaxDimensionsForNet.bad,d="L1T2"):(o=this._videoMaxDimensionsForNet.worst,d="L1T3")):r&&(o=this._videoMaxDimensionsForNet.good,d="L1T1"),!(o<this._lastVideoMaxDimension||Date.now()-this._lastBadConnection>ud)||this._lastVideoMaxDimension===o)return;let u=this._serverSettings.camera;if(!u||!await this._isSVCSupported(e,d))return;c.debug("Switch outbound video frame size and scalabilityMode",{scalabilityMode:d,averageNetStat:t,nextVideoMaxDimension:o}),this._lastVideoMaxDimension=o;let S={...this._serverSettings,camera:{...u,scalabilityMode:d,maxDimension:this._lastVideoMaxDimension}};this.updateSettings(S)}_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=v.sdpFingerprint(e);if(t===null){c.warn("Fingerprint calculation is unsupported");return}this._fingerprint===null?this._fingerprint=t:(I.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=v.applySettings(this._pc,e,this._prevConsumerSettings))}_createDataChannel(e,t,r){c.debug(`[${t}] data channel opening`);let n=e.createDataChannel(t,{negotiated:!0,id:1});n.onopen=()=>{let s=n.readyState;s==="open"?(c.debug(`[${t}] data channel opened`),n.onerror=o=>{c.error(`[${t}] data channel error`,o)},r(n)):c.error(`[${t}] data channel open failed, state [${s}]`)}}};var hd=16,an=class a{constructor(i,e,t){c.debug("AsrReceiver started"),this._datachannel=i,this._participantIdRegistry=e,this._asrCallback=t,this._textDecoder=new TextDecoder,this._datachannel.onmessage=r=>this._onDataChannelMessage(r.data)}static parse(i){let e=new DataView(i),t=e.getUint8(0),r=e.getUint8(1);if(r!==0)throw new Error(`Unsupported message type. Message type: ${r}`);let n=e.getUint16(2),s=e.getUint32(4),o=e.getUint32(8),d=e.getUint32(12);if(t!==1)throw new Error(`Unexpected protocol version. Got ${t}, expected 1`);return{sequence:n,ssrc:s,timestamp:o,duration:d,data:i.slice(hd)}}_onDataChannelMessage(i){let e=a.parse(i),t=this._participantIdRegistry?.getStreamDescription(e.ssrc)?.participantId;if(!t){c.warn(`Participant id for ssrc ${e.ssrc} not found in registry`);return}let r={participantId:t,text:this._textDecoder.decode(e.data),timestamp:e.timestamp,duration:e.duration};this._asrCallback(r)}destroy(){this._datachannel.onmessage=null}};var gt=require("messagepack");var sn=class{constructor(){this.streamDescriptionByCompactId=new Map;this.compactIdByStreamDescription=new Map}getStreamDescription(i){return this.streamDescriptionByCompactId.get(i)}getCompactId(i){return this.compactIdByStreamDescription.get(i)}handleMessage(i){let e=new Uint8Array(i),t=e[0],r=e.subarray(1);switch(t){case 1:let n=(0,gt.decode)(r);return Object.entries(n).forEach(([R,M])=>{let F=xi(R);this.streamDescriptionByCompactId.set(M,F),this.compactIdByStreamDescription.set(R,M)}),null;case 2:case 4:let s=(0,gt.decode)(r),o=[];for(let R of s){let M=this.getStreamDescription(R);M&&o.push(M.participantId)}return t===2?{type:"notification",notification:L.AUDIO_ACTIVITY,activeParticipants:o}:{type:"notification",notification:L.STALLED_ACTIVITY,stalledParticipants:o};case 3:let d=(0,gt.decode)(r);return{type:"notification",notification:L.SPEAKER_CHANGED,speaker:this.getStreamDescription(d)?.participantId};case 5:let p=(0,gt.decode)(r);return{type:"notification",notification:L.VIDEO_QUALITY_UPDATE,quality:{maxBitrate:p[0],maxDimension:p[1]}};case 6:let u=(0,gt.decode)(r),h={};for(let[R,M]of Object.entries(u)){let F=this.getStreamDescription(Number(R))?.participantId;F&&(h[F]=M/100)}return{type:"notification",notification:L.NETWORK_STATUS,statuses:h};case 7:return this._createParticipantSourcesUpdateNotification(r);case 8:{let M=(0,gt.decode)(r).map(F=>{let[W,X,fe,Oe,J,Ae,be]=F;return{participantId:this.getStreamDescription(W)?.participantId,gain:X,pause:fe,offset:Oe,mute:J,liveStatus:Ae,startTimeMs:be}});return{type:"notification",notification:L.MOVIE_UPDATE_NOTIFICATION,data:M}}case 9:let S=(0,gt.decode)(r);return{type:"notification",notification:L.VIDEO_SUSPEND_SUGGEST,bandwidth:S};default:return c.debug("unsupported message type: "+t),null}}_createParticipantSourcesUpdateNotification(i){let e=(0,gt.decode)(i),t=[];for(let[r,n]of Object.entries(e)){let s=n[0],o=n[1],d=n[2],p=!!n[3],u=n[4]!==null?!!n[4]:void 0,h;if(s!==null){if(h=this.getStreamDescription(s),!h){c.error(`could not uncompress participant ID ${s}`);continue}}else h=null;if(d===null){c.error("unexpected null sequenceNumber",r,n);continue}let S=et.PARTICIPANT_AGNOSTIC_TRACK_PREFIX+"-"+r,R=o?o>>>0:null;t.push({participantStreamDescription:h,streamId:S,rtpTimestamp:R,sequenceNumber:d,fastScreenShare:p,suspend:u})}return{type:"notification",notification:L.PARTICIPANT_SOURCES_UPDATE,participantUpdateInfos:t}}};var md=90,fd=4294967295,$i=class a extends Ht{constructor(e,t,r){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,De.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=r,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){en(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 Tt(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,a._closeDataChannel(this._producerNotification),a._closeDataChannel(this._producerCommand),a._closeDataChannel(this._producerScreen),a._closeDataChannel(this._consumerScreen),a._closeDataChannel(this._asr),a._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,r){c.debug(`[${t}] data channel opening`);let n=e.createDataChannel(t,{ordered:!0});n.onopen=()=>{let s=n.readyState;s==="open"?(c.debug(`[${t}] data channel opened`),r(n)):c.error(`[${t}] data channel open failed, state [${s}]`)},n.onerror=s=>{let o=s.error;c.error(`[${t}] data channel error`,o?.errorDetail,o?.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=v.debounce(t=>{this._pc&&this._onConnectionStateChange(this._pc,t)},500),this._pc.onsignalingstatechange=a._onSignalingStateChange.bind(this,this._pc),this._participantIdRegistry=new sn,this._signaling.setParticipantIdRegistry(this._participantIdRegistry),l.producerNotificationDataChannel&&this._createDataChannel(this._pc,ft.producerNotification,t=>{this._producerNotification=t,this._producerNotification.binaryType="arraybuffer",this._signaling.setProducerNotificationDataChannel(t)}),l.producerCommandDataChannel&&(this._signaling.useCommandDataChannel(!0),this._createDataChannel(this._pc,ft.producerCommand,t=>{this._producerCommand=t,this._signaling.setProducerCommandDataChannel(t)})),l.producerScreenDataChannel&&this._createDataChannel(this._pc,ft.producerScreenShare,t=>{this._producerScreen=t,this._producerScreen.binaryType="arraybuffer",this._createCaptureReceiver()}),l.asrDataChannel&&this._createDataChannel(this._pc,ft.asr,t=>{this._asr=t,this._asr.binaryType="arraybuffer",this._removeAsrTrack(),this._asrTrack=new an(t,this._participantIdRegistry,r=>{this._onAsrTranscription(r)})}),l.vmoji&&this._createDataChannel(this._pc,ft.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){c.error("ServerTransport: Unable to add media source tracks",t),C.log(E.ERROR,"addTrack-single"),this.close(t);return}l.consumerScreenDataChannel&&this._createDataChannel(this._pc,ft.consumerScreenShare,t=>{this._consumerScreen=t,this._consumerScreen.binaryType="arraybuffer";let r=this._mediaSource.getScreenTrack();r&&this._createCaptureSender(r)}),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 r=`a=ssrc:([0-9]+) label:(audio|video)-((?:[ug]?[\\d]+)|(?:mix)|(?:${et.PARTICIPANT_AGNOSTIC_TRACK_PREFIX}-[0-9]+))`,n=new RegExp(r).exec(t);n&&(this._ssrcMap[n[1]]=n[3],this._ssrcMapUpdated=!0)})}_createCaptureSender(e){let t=this._mediaSource.getMediaSettings();!e||!l.consumerScreenDataChannel||!this._consumerScreen||!t.isScreenSharingEnabled||(this._captureSender&&this._removeCaptureSender(),this._captureSender=new Lt(e,this._consumerScreen,this._signaling,t.isFastScreenSharingEnabled))}_removeCaptureSender(){this._captureSender?.destroy(),this._captureSender=null}_createCaptureReceiver(){!l.producerScreenDataChannel||!this._producerScreen||(this._captureReceiver&&this._removeCaptureReceiver(),this._captureReceiver=new Ot(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(r=>{if(!r.track||r.track.kind!=="video")return;let n=!this._disabledSenders.has(r),s=e.maxDimension!==0;if(n&&!s){c.log("Disabling video upload"),this._disabledSenders.add(r),r.replaceTrack(y.getBlackMediaTrack()).catch(d=>{c.error("Could not disable video upload",d)});return}let o=this._mediaSource.getSendVideoTrack();if(!n&&s&&o){c.log("Enabling video upload"),this._disabledSenders.delete(r);let d=r.track;d.enabled=o.enabled,r.replaceTrack(o).then(()=>d.stop()).catch(p=>{c.error("Could not enable video upload",p)})}v.applyVideoTrackSettings(e,r,o??r.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),lt.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 yi(this._pc,this._lastStat,this._ssrcMap,!0);return this._lastStat=e,e}_reportStats(e){this._triggerEvent("REMOTE_DATA_STATS",{inbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="inbound-rtp")},outbound:{topology:"SERVER",transport:e.transport,rtps:e.rtps.filter(t=>t.type==="outbound-rtp")},remoteInbound:{topology:"SERVER",transport:e.transport,rtps:e.remoteRtps??[]}})}_detectStaleTracks(e){let t=e.rtps.find(o=>o.type==="inbound-rtp"&&o.kind==="audio"&&this._ssrcMap[o.ssrc]==="mix");if(!t)return;let r=et.AUDIO_MIX,n=this._statBytes[r],s=!1;if(n){let o=t.bytesReceived-n.bytesReceived;o>=0&&o<=5&&(s=!0),n.stalled!==s&&this._triggerEvent("AUDIO_MIX_STALL",s)}this._statBytes[r]={bytesReceived:t.bytesReceived,stalled:s}}_allocateConsumer(){if(!this._signaling.ready)return;let e={estimatedPerformanceIndex:Tt.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&&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=l.simulcast&&y.isSimulcastSupportedByBrowser(),r=t;try{await this._pc.setRemoteDescription(e)}catch(o){throw c.error("[single] unable to set remote offer",o),C.log(E.ERROR,"setRemoteDescription-single"),o}let n=this._findFirstSimTransceiver();if(t)if(n){c.log(`_processOffer: caps.simulcast=${l.simulcast} mid=${n.mid} dir=${n.direction}`);let o=this._mediaSource.getStream(),d=await this._setupSimulcastTransceiver(o,n);c.log("_processOffer: simulcastInfo",d),d||(c.log(`_processOffer: simulcast transceiver not found in server offer mid=${n.mid}, disable simulcast`),r=!1)}else c.log("_processOffer: simulcast transceiver not found in server offer, disable simulcast"),r=!1;let s;try{if(await this._handleTracks(),c.debug("[single] create local answer"),!this._pc)throw new Error("Interrupt allocation");s=await this._pc.createAnswer()}catch(o){throw c.error("[single] unable to create answer",o),C.log(E.ERROR,"createAnswer-single"),o}try{if(!this._pc)throw new Error("Interrupt allocation");s.sdp=v.patchLocalSDP(s.sdp,!1,y.isBrokenH264Decoder(),!1,l.h264spsPpsIdrInKeyframe),c.debug("[single] set local answer",{answer:s}),await this._pc.setLocalDescription(s)}catch(o){throw c.error("[single] unable to set local answer",o),C.log(E.ERROR,"setLocalDescription-single"),o}if(r&&n){s.sdp=v.patchSimulcastAnswerSdp(s.sdp,n,_t.WIDTH,_t.HEIGHT);for(let o of this._pc.getTransceivers())o.mid===null&&o.stop()}try{c.debug("[single] transmit local answer",{answer:s}),this._updateSSRCMap(e),await this._signaling.acceptProducer(s,Object.keys(this._ssrcMap)),c.debug("[single] remote offer has been processed")}catch(o){c.warn("[single] unable to send local answer",o),C.log(E.ERROR,"acceptProducer")}r&&await this._changeSimulcastInfo(!0,!0)}_findFirstSimTransceiver(){if(!this._pc)return null;for(let e of this._pc.getTransceivers()){let t=e.sender?.track?e.sender.track?.kind:e.receiver?.track?.kind;if(!e.sender||t!=="video")continue;let r=e.sender.getParameters();if(!(!r.encodings||r.encodings.length<=1))return e}return null}async _setupSimulcastTransceiver(e,t){if(!t?.sender||!e)return null;t.direction="sendonly";let r=e.getVideoTracks()[0];await t.sender.replaceTrack(r),t.sender.setStreams(e);let n=t.sender.getParameters();if(!n.encodings||n.encodings.length<=1)return c.log(`_setup:sim: mid=${t.mid} dir=${t.direction}: wrong encodings:${JSON.stringify(n.encodings)}`),null;let s=Ti(_t.WIDTH,_t.HEIGHT,this._serverSettings.camera?.bitrates?.generic),o=0,d=1;for(let u of n.encodings)u.scalabilityMode=Ci,u.active=!0,o>=s.streams.length?u.maxBitrate=0:u.maxBitrate=s.streams[o].bitrate,u.scaleResolutionDownBy=d,d=d*2,o++;await t.sender.setParameters(n);let p=r.getSettings();return c.log(`_setup:sim: mid=${t.mid} dir=${t.direction} track=${p.width}x${p.height} encodings=${JSON.stringify(n.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:v.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 r=this._producerNextOffer;this._producerNextOffer=null,await this._acceptProducer(r)}}catch(r){this.close(r)}}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),C.log(E.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&&(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 r=t.streams[0];r?(r.onremovetrack||(r.onremovetrack=s=>{this._triggerEvent("REMOTE_TRACK_REMOVED",r.id,r,s.track)}),r.getTracks().find(s=>s.id===t.track.id)||r.addTrack(t.track),this._rtpReceiversByStreamId[r.id]=t.receiver,this._triggerEvent("REMOTE_TRACK_ADDED",r.id,r,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),C.log(E.ICE_CONNECTION_STATE,e.connectionState),e.connectionState){case"failed":this._reconnectionPrevented?this.close(new Error("Ice connection failed")):(C.logCustom(E.RECONNECT,{param:1}),this._reconnect());break;case"connecting":let r=this.getState();r==="IDLE"||r==="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"),v.getPeerConnectionHostInfo(e).then(n=>{n?.local&&(C.log(E.ICE_CONNECTION_TYPE,n.local.type),c.debug("Selected ICE candidates",n))}),C.logCustom(E.RECONNECT,{param:0});break}}_onReplacedTrack(e,t){if(this._pc){l.consumerScreenDataChannel&&t&&(e=t);let r=(n,s)=>{n.replaceTrack(s).catch(o=>{c.error("ServerTransport: Unable to replace track",o),C.log(E.ERROR,"replaceTrack-single")})};if(c.log(`_onReplacedTrack: newTrack=${e.getSettings().width}x${e.getSettings().height}`),l.simulcast&&y.isSimulcastSupportedByBrowser()&&e.kind==="video"){let s=this._pc?.getTransceivers().find(o=>o.direction==="sendonly"&&o.sender?.track?.kind==="video")?.sender;s?.track?(r(s,e),e.getSettings().width&&e.getSettings().height&&this._changeSimulcastInfo(!1,!1)):c.warn("_onReplacedTrack: simulcast video transceiver not found")}else{let n=this._pc?.getSenders().find(s=>s.track&&s.track.kind===e.kind&&!this._disabledSenders.has(s)&&s.track.contentHint===e.contentHint);n?.track?r(n,e):e.kind==="audio"&&e.contentHint==="music"&&(this._newAudioShareTrack=e)}}this._applyConsumerSettings()}getStreamWaitingTimeMs(e,t){if(!this._pc)return C.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 C.log(E.PAT_WAITING_TIME_ERROR,"oldBrowser"),c.error("Cannot get stream waiting time, RTCRtpReceiver.getSynchronizationSources is not supported"),0;let r=this._rtpReceiversByStreamId[e];if(!r)return C.log(E.PAT_WAITING_TIME_ERROR,"noReceiver"),c.error(`Cannot get stream waiting time, cannot find RTP receiver by stream ID: ${e}`),0;let n=r.getSynchronizationSources();if(!n||!n.length)return c.log(`Cannot get stream waiting time, ${e} receiver has no synchronization sources`),0;let o=n[0].rtpTimestamp;if(!Number.isInteger(o))return C.log(E.PAT_WAITING_TIME_ERROR,"timestampNotInteger"),c.error(`Cannot get stream waiting time, ${e} receiver's RTP timestamp is not an integer: ${o}`),0;let d=t-o&fd,p=Math.ceil(d/md);return Math.min(100,Math.max(0,p))}async _changeSimulcastInfo(e,t){let r=this._mediaSource.getMediaSettings().isVideoEnabled,n=this._findFirstSimTransceiver();if(!l.simulcast||!y.isSimulcastSupportedByBrowser()||!r||!n||!n.sender)return;let s=this._mediaSource.getStream();if(!s)return;let o=s.getVideoTracks()[0],d=o.getSettings().width,p=o.getSettings().height,u=Ti(d,p,this._serverSettings.camera?.bitrates?.generic),h=t||!Ca(this._simulcastInfo,u);if(!u.streams.length||!h)return;let S=n.sender.getParameters();if(S.encodings||(S.encodings=[{}]),!(S.encodings.length<=1)){if(c.log(`_changeSimulcastInfo: ${d}x${p} command: ${JSON.stringify(u)} `),e){let R=0;for(let M of S.encodings)M.scaleResolutionDownBy=tr(M.rid),M.scalabilityMode=Ci,R>=u.streams.length?(M.maxBitrate=0,M.active=!1):(M.active=!0,M.maxBitrate=u.streams[R].bitrate),R++;await n.sender.setParameters?.(S).catch(M=>{c.error("Failed to set sender parameters",S,M)}),c.log(`_changeSimulcastInfo: actual encodings: ${JSON.stringify(S.encodings)} `)}if(this._simulcastInfo=u,u.streams){let R={mediaSource:1,simulcastInfo:u};await this._signaling.changeSimulcast(R)}}}};var tt=(e=>(e.DIRECT="DIRECT",e.SERVER="SERVER",e))(tt||{}),on=class extends ae{constructor(e,t,r,n){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=r,this._topology=e,this._serverSettings=n,this.subscribe(this._signaling,De.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,r=!1,n=!1){c.log("Trying open participant",{participantIds:e});let s=n;for(let o of e){if(this._opened.indexOf(o)!==-1){c.warn(`The participant [${o}] has already had opened transport`);continue}if(this._allocated.indexOf(o)===-1){c.warn(`The participant [${o}] has no allocated transport`);continue}this._opened.push(o),s=!0}s&&(this._topology==="DIRECT"&&this._directTransport&&this._directTransport.open(t),this._topology==="SERVER"&&this._serverTransport&&(this._serverTransport.open(r),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),r=this._opened.indexOf(e);t<0&&c.warn(`The participant [${e}] transport has already deallocated`),this._topology==="DIRECT"&&this._directTransport&&r>=0&&this._releaseDirectTransport(),this._topology==="SERVER"&&(this._serverTransport?.removeParticipant(e),this._setStates([e],"CLOSED")),r>=0&&this._opened.splice(r,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 r=e.filter(n=>this._states[n]!==t?(this._states[n]=t,!0):!1);r.length&&this._triggerEvent("STATE_CHANGED",r,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(c.log(`Topology changed ${this._topology} -> ${e.topology}`),C.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||[],r=e.offerToTypes||[],n=e.offerToDeviceIdxs||[],s=t.length&&r.length?v.composeParticipantId(t[0],r[0],n[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 o=this._allocated[0];if(this._directTransport)this._directTransport.allowRestart();else{let d=s===o;this._directTransport=this._createDirectTransport(o,d)}this._opened.indexOf(o)>=0&&this._directTransport.open()}this._triggerEvent("TOPOLOGY_CHANGED",this._topology)}}_createDirectTransport(e,t=!1){let r=new Ki(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(r.addEventListener("REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this,e)),r.addEventListener("REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this,e)),r.addEventListener("REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),r.addEventListener("STATE_CHANGED",this._onDirectTransportChanged.bind(this)),r.addEventListener("NETWORK_STATUS",this._onTransportNetworkStatus.bind(this)),r.addEventListener("PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this,"DIRECT"))),this._animojiReceiver&&this._animojiSender&&r.setAnimojiTransport(this._animojiReceiver,this._animojiSender),r}_createServerTransport(){let e=new $i(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){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 r=this._opened.indexOf(t);r>=0&&this._opened.splice(r,1);let n=this._allocated.indexOf(t);n>=0&&this._allocated.splice(n,1)}this._topology==="DIRECT"&&t&&(this._setStates([t],e),this._setLocalState(e))}_onServerTransportChanged(e){let t=this._opened.slice();e==="CONNECTED"&&this._topology==="SERVER"&&this._releaseDirectTransport(),(e==="CLOSED"||e==="FAILED")&&(this._releaseServerTransport(),this._topology==="SERVER"&&(this._allocated=[],this._opened=[])),this._topology==="SERVER"&&(this._setStates(t,e),this._setLocalState(e))}_onTransportActiveParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_ACTIVE_PARTICIPANTS",e)}_onTransportStalledParticipants(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_STALLED_PARTICIPANTS",e)}_onTransportSpeakerChanged(e){this._topology==="SERVER"&&this._triggerEvent("SIGNALLED_SPEAKER_CHANGED",e)}_onTransportNetworkStatus(e){this._triggerEvent("NETWORK_STATUS",e)}_onRemoteStreamSecond(e,t){this._triggerEvent("REMOTE_STREAM_SECOND",e,t)}_onPeerConnectionClosed(e){this._triggerEvent("PEER_CONNECTION_CLOSED",e)}_onServerAudioMixStall(e){this._topology==="SERVER"&&this._triggerEvent("AUDIO_MIX_STALL",e)}_onRemoteDataStats(e){this._triggerEvent("REMOTE_DATA_STATS",e)}_onRemoteTrackAdded(e,t,r){this._triggerEvent("REMOTE_TRACK_ADDED",e,t,r)}_onRemoteTrackRemoved(e,t,r){this._triggerEvent("REMOTE_TRACK_REMOVED",e,t,r)}_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,r)=>this._onAnimojiStream(t,r),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"?(C.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):(C.log(E.PAT_WAITING_TIME_ERROR,"noTransport"),c.error("Cannot get stream waiting time, server transport is not initialized"),0)}};var cn=class extends ae{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,r){if(r.kind==="audio"&&(this._detector?.destroy(),this._detector=new bt(e,r),!this._interval)){let n=()=>{this._collectVolumes(),this._interval=window.setTimeout(n,l.voiceParams.interval)};this._interval=window.setTimeout(n,l.voiceParams.interval)}}_onRemoteTrackRemoved(e,t,r){r.kind==="audio"&&(!this._detector||this._detector.track!==r||(this._detector.destroy(),this._detector=null))}_collectVolumes(){if(!this._detector)return;let e={},t=this._detector.trackId,r=this._detector.getLevel();if(t===et.AUDIO_MIX){if(this._activeParticipants)for(let n of this._activeParticipants)e[n]=r}else e[t]=r;this._triggerEvent("VOLUMES_DETECTED",e)}_onSignalledActiveParticipants(e){this._activeParticipants=e}_onTopologyChanged(e){e==="DIRECT"&&(this._activeParticipants=null)}};var dn=class extends ae{constructor(e,t,r){super();this._speakerId=null;this._serverSideSpeakerDetection=!1;this._serverSideSpeakerDetection=r==="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,r=null;if(Object.keys(e).forEach(n=>{let s=e[n].smoothed;s>t&&s>l.voiceParams.threshold&&(t=s,r=n)}),r&&r!==this._speakerId){let n=this._speakerId&&e.hasOwnProperty(this._speakerId)?e[this._speakerId].smoothed:0;t>n*l.voiceParams.speakerLevelMultiplier&&(this._speakerId=r,this._triggerEvent("SPEAKER_CHANGED",r))}}_onServerSpeakerChanged(e){this._serverSideSpeakerDetection&&this._triggerEvent("SPEAKER_CHANGED",e)}_onTopologyChanged(e){this._serverSideSpeakerDetection=e==="SERVER"}};var zi=class extends ae{constructor(e,t,r){super();this._volumes={};this._participants={};this._connectionTimeout=0;this._volumeTimeout=0;this._transport=e,this._participants=r,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&&(c.warn("Transport failed, send callSpecError"),C.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=r=>r!=="CONNECTED";Object.values(this._transport.getStates()).filter(e).length>0&&(c.warn("There is not connected transport, send callSpecError"),C.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 r="UNKNOWN",n=this._participants[t];n&&n.platform&&(r=n.platform),e.indexOf(r)<0&&(e.push(r),C.log(E.CALL_SPEC_ERROR,`${this._transport.getTopology()}_VOLUME_TIMEOUT_${r}`))}),e.length&&c.warn("There is silent participant, send callSpecError"),this._volumeTimeout=0}};var ln=class a{static correctHangupReason(i){switch(i){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(i,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(i.hangup))return;let r=i.custom_error?.vchat_detailed_api_error.code;C.logClientStats({name:E.CALL_FINISH,reason:a.correctHangupReason(i.hangup),call_topology:e==="DIRECT"?"D":"S",...r&&{string_value:r}})}};var pn=class{constructor(){this._isCallMarked=!1;this._isFinished=!1;this._callType=null}markAcceptCall(i){this.mark(i==="DIRECT"?"direct_incoming":"server_incoming")}markAcceptedCall(i){i==="DIRECT"&&this.mark("direct_outgoing")}markParticipantJoined(i){i==="DIRECT"&&this.mark("server_change_topology")}markOnJoin(i){i==="SERVER"&&this.mark("server_join_server")}mark(i){this._isCallMarked||(this._isCallMarked=!0,this._callType=i,Je(E.FIRST_MEDIA_RECEIVED))}measure(){this._isFinished||(this._isFinished=!0,this._callType&&Me.logEventualStat({name:E.FIRST_MEDIA_RECEIVED,call_type:this._callType}))}};var gd=1e3,_d=1e4;var Sd=15,z=class z extends ae{constructor(e,t){super();this._mediaSource=null;this._conversation=null;this._myLastRequestedLayouts={};this._state="IDLE";this._participantState=Q.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=v.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);C.create(e,t),Me.create(),lt.create(()=>this._transport?.getTopology()),this._api=e,this._signaling=new Wt,this._onUnload=()=>{this._conversation&&this._api&&(this._api.hangupConversation(this._conversation.id),l.clientEventsLoggingEnabled&&C.logClientEvent({event_type:E.CALL_DECLINED_OR_HANGED_LOCALLY,reason:"none"},!0)),C.destroy(),Me.destroy(),lt.destroy()},window.addEventListener("unload",this._onUnload),this._statFirstMediaReceived=new pn,this._audioOutput=new Vi(this._statFirstMediaReceived),l.videoTracksCount>0&&(this._cooldownQueueCleanupTimer=window.setInterval(this._cleanupCooldownQueue.bind(this),gd))}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:r,payload:n="",joiningAllowed:s=!1,requireAuthToJoin:o=!1,onlyAdminCanShareMovie:d,externalIds:p,onFastStart:u}){if(z._activationMutex)throw C.log(E.ERROR,"startCall"),c.warn("Conversation: there is already running activation"),new G(D.FAILED);let h=Date.now();z._activationMutex=!0,Be.startSession();try{this._mediaSource=this._createMediaSource(),await this._mediaSource.request(r);let S=this._mediaSource.getMediaSettings();t===dt.CHAT||e&&e.length>1?this._logWithMediaSettings(E.OUTGOING_MULTIPARTY_CALL,S):this._logWithMediaSettings(E.OUTGOING_CALL,S);let R=await this._startConversation({opponentIds:e,opponentType:t,direction:Le.OUTGOING,mediaOptions:r,payload:n,joiningAllowed:s,requireAuthToJoin:o,onlyAdminCanShareMovie:d,externalIds:p,startedTime:h,onFastStart:u});if(!this._conversation)throw new G(D.UNKNOWN_ERROR);if(this._participantState=Q.ACCEPTED,this._changeMediaSettings(S),await this._processConnection(R),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._signaling.readyToSend(),z._delayedHangup)throw new G(D.CANCELED);return c.debug("Outgoing call",{opponentIds:e,opponentType:t,mediaOptions:r}),await this._processConnectionSharedMovieInfo(R),await this._processConversationUrlSharingInfo(R),I.onLocalStream(this._mediaSource.getStream(),this._mediaSource.getMediaSettings()),I.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants()),this._onConversationParticipantListChunk(R),this._processPinnedParticipants(R),I.onLocalStatus("WAITING"),this._toggleJoinAvailability(),this._changeFeatureSet(),this._changeNeedRate(),z._current=this,this._conversation.concurrent&&await this._acceptConcurrent(),this._conversation}catch(S){throw this._close(S,"Unable to start conversation"),S}finally{z._activationMutex=!1}}async onJoin(e){if(z._activationMutex)throw C.log(E.ERROR,"joinCall"),c.warn("Conversation: there is already running activation"),new G(D.FAILED);let t=Date.now();z._activationMutex=!0,this._state="PROCESSING",Be.startSession();try{let r=!!e.observedIds?.length;if(r&&l.videoTracksCount>0)throw c.error("Observer mode: please set videoTracksCount=0"),new G(D.UNSUPPORTED);this._mediaSource=this._createMediaSource(),await this._mediaSource.request(e.mediaOptions,!r);let n=this._mediaSource.getMediaSettings();this._logWithMediaSettings(E.JOIN_CONVERSATION,n);let s=await this._joinConversation(e,t);if(!this._conversation)throw new G(D.UNKNOWN_ERROR);return this._conversation.observer=r,I.onLocalStream(this._mediaSource.getStream(),n),this._conversation.waitingHall?(c.log("In waiting hall"),z._current=this,z._activationMutex=!1,this._signaling.readyToSend(),I.onLocalStatus("WAITING_HALL"),this._conversation):this._onJoinPart2(s)}catch(r){throw z._activationMutex=!1,this._close(r,"Unable to join conversation"),r}}async _onJoinPart2(e){c.debug("Join conversation part 2"),z._activationMutex=!0;try{if(this._participantState=Q.ACCEPTED,!this._conversation||!this._mediaSource)throw new G(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 G(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 I.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),t),this._onConversationParticipantListChunk(e),this._processPinnedParticipants(e),I.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(n=>!!n)}async _extractExternalRoomsData(e,t){if(!e||!e.length)return;let r={rooms:await this._extractExternalRooms(e)};return t&&(r.roomId=t),r}async onPush(e,t=re.USER,r,n){if(z._activationMutex)throw c.warn("Conversation: there is already running activation"),new G(D.REJECTED);z._activationMutex=!0;try{let s=Date.now(),o=await this._prepareConversation(e,t,r,n);if(this._mediaSource=this._createMediaSource(),!this._conversation)throw new G(D.UNKNOWN_ERROR);if(!o.conversation.participants.find(p=>p.state===Q.CALLED&&p.id===this._conversation?.userId))throw c.log("Push rejected (there is an active call)"),C.log(E.PUSH,"rejected"),new G(D.REJECTED);if(Be.startSession(),await this._processConnection(o),this._extractConnectionUrlSharingInfo(o),this._allocateTransport(),this._createSpeakerDetector(),this._createSpecListener(),this._processPinnedParticipants(o),this._signaling.readyToSend(),this._logCallStartEvent(s,Le.INCOMING),C.log(E.PUSH,"accepted"),z._current=this,z._delayedHangup)throw new G(D.CANCELED);z._activationMutex=!1}catch(s){throw z._activationMutex=!1,this._close(s,"Unable to handle inbound call push"),s}}_isInWaitingHall(e){return!e.conversation||(e.conversation.options||[]).indexOf(Gt.WAITING_HALL)<0?!1:this._isRestricted(e)}_isRestricted(e){let t=(e.conversation.participants||[]).find(r=>v.comparePeerId(r.peerId,e.peerId));return t&&t.restricted||!1}_isAudienceMode(e){return e.conversation?.options?.includes(Gt.AUDIENCE_MODE)||!1}_isAudienceModeListener(){return this._conversation?.audienceMode&&this._conversation?.restricted}async _acceptConcurrent(){if(!this._mediaSource||!this._conversation||!this._transport)throw new G(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()),I.onCallAccepted(),this._state="ACTIVE",this._participantState=Q.ACCEPTED,this._changeFeatureSet(),this._openTransport(Object.values(this._participants),!0)}catch(t){this._close(t,"Unable to accept concurrent call")}}_getMainRoomParticipants(){return v.mapSharedParticipants(Object.values(this._participants).filter(e=>!e.isInRoom))}_decodeExternalConversationParams(e){let[t,r]=e.split(":"),n=parseInt(t,10);if(isNaN(n))throw new Error("Invalid original length in prefix");let s=atob(r),o=new Uint8Array(s.length);for(let d=0;d<s.length;d++)o[d]=s.charCodeAt(d);try{let p=xs(o,n).reduce((X,fe)=>(X+=String.fromCharCode(fe),X),""),{srcp:u,stne:h,tkn:S,trne:R,trnp:M,trnu:F,wse:W}=JSON.parse(p);return{token:S,endpoint:W,turn_server:{urls:R.split(","),username:F,credential:M},stun_server:{urls:h.split(",")},client_type:u}}catch(d){throw this._close(d,"Can't decompress conversation params"),d}}_logCallStartEvent(e,t){let r={[Le.OUTGOING]:"outgoing",[Le.INCOMING]:"incoming",[Le.JOINING]:"join"};Me.logEventualStat({name:E.CALL_START,value:Date.now()-e,string_value:JSON.stringify({labels:[r[t],"warmup_start"]})})}async accept(e){if(this._state!=="IDLE")throw C.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 G(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=Q.ACCEPTED;let r=this._getMuteStatesForCurrentRoom(),n=Object.keys(r);n.length&&this._onMuteParticipant({muteStates:r,mediaOptions:n,muteAll:!0,stateUpdated:!0}),this._registerParticipantLocalMuteState({muteStates:this._conversation.muteStatesPersonal});let s=await this._signaling.getRooms(this._isCallAdmin());s.rooms?.rooms&&s.rooms.rooms.forEach(d=>{d.participantIds?.forEach(p=>{this._participants[p]&&(this._participants[p].isInRoom=!0)})}),this._conversation.roomId=s.rooms?.roomId||null;let o=await this._extractExternalRoomsData(s.rooms?.rooms,s.rooms?.roomId);if(I.onCallAccepted(),I.onLocalStream(this._mediaSource.getStream(),t),I.onConversation(this._conversation.externalId,this._conversation.mediaModifiers,this._getMuteStatesForCurrentRoom(),this._getMainRoomParticipants(),o),l.useParticipantListChunk){let d=await this._getInitialParticiapntListChunk();d?.participants?.forEach(p=>{let u=v.composeId(p),h=this._participants[u];h&&(h.movieShareInfos=p.movieShareInfos)}),this._onConversationParticipantListChunk({participants:d})}return I.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 C.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=Q.HUNGUP,this._signaling.ready&&await this._signaling.hangup(D.REJECTED),this._close(new G(D.REJECTED))}async hangup(){c.debug("Hangup");let e=this._state==="ACTIVE"?D.HUNGUP:D.CANCELED;C.log(E.HANGUP,e),this._signaling.ready?(await this._signaling.hangup(e),this._close(new G(e))):I.onHangup(new G(D.HUNGUP),this._conversation&&this._conversation.id)}async addParticipant(e,t){if(!this._signaling.ready){this._close(new G(D.UNKNOWN_ERROR),"Unable to add participant");return}let r=await this._signaling.addParticipant(e.map($.toSignaling),t),n=null;r.type==="error"&&(r.error==="call-unfeasible"?n=r.status:n=D.UNKNOWN_ERROR);let s=r.participants;for(let o of s)await this._onAddParticipant(v.composeId(o),o,n)}async addParticipantLegacy(e,t){if(!this._signaling.ready){this._close(new G(D.UNKNOWN_ERROR),"Unable to add participant");return}let r=await this._signaling.addParticipantLegacy(e,t),n=null;r.type==="error"&&(r.error==="call-unfeasible"?n=r.status:n=D.UNKNOWN_ERROR);let s=r.participants;for(let o of s)await this._onAddParticipant(v.composeId(o),o,n)}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 r=[];for(let n of e)(n.state===Q.CALLED||n.state===Q.ACCEPTED)&&(this._transport.isAllocated(n.id)||this._transport.allocate(n.id,t)),n.state===Q.ACCEPTED&&r.push(n.id);r.length&&this._transport.open(r,null,!!this._conversation?.observer)}_close(e,t){t&&c.error(t,e),c.debug("Close conversation",e),ln.sendHangupEvent(e,this._transport?.getTopology()),lt.destroy(),this._signaling.readyToSend(!1),e.error?this._signaling.ready&&this._signaling.hangup(D.FAILED):C.log(E.ERROR,e.hangup),z._activationMutex=!1;let r=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){I.onHangup(e,r),this.destroy();return}if(e.hangup===D.HUNGUP&&(!e.remote||this._isCalledState())){I.onHangup(e,r),this.destroy();return}if(e.hangup===D.MISSED&&!e.remote){I.onHangup(e,r),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=Q.HUNGUP,this._changeFeatureSet(),this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),C.destroy(),Me.destroy(),this._conversation=null,this._myLastRequestedLayouts={},z._current=null,z._delayedHangup=!1,I.onHangup(e||new G(D.UNKNOWN_ERROR),r)}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=Q.HUNGUP,this._cleanupMediaSource(),this._cleanupParticipants(),this._cleanupParticipantAgnosticStreams(),this._cleanupTransport(),this._cleanupSpeakerDetector(),this._cleanupSpecListener(),this._cleanupSignaling(),this._api.cleanup(),this._cleanupListeners(),C.destroy(),Me.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 r=[],{turn_server:n,stun_server:s}=t;if(s&&r.push(s),n&&n.urls){let o=n.urls.filter((d,p,u)=>u.indexOf(d)===p);o.push(`${o[o.length-1]}?transport=tcp`),r.push({urls:o,username:n.username,credential:n.credential})}return l.iceServers=r,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:r,token:n,client_type:s}){let o=[];if(t&&o.push(t),e&&e.urls){let d=e.urls.filter((p,u,h)=>h.indexOf(p)===u);d.push(`${d[d.length-1]}?transport=tcp`),o.push({urls:d,username:e.username,credential:e.credential})}l.iceServers=o,l.wssBase=r,l.wssToken=n,s&&(l.clientType=s)}_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:r,mediaOptions:n,payload:s="",joiningAllowed:o=!1,requireAuthToJoin:d=!1,onlyAdminCanShareMovie:p,externalIds:u,startedTime:h,onFastStart:S}){Je(E.SIGNALING_CONNECTED);let R=v.uuid();c.debug("Conversation: start",{conversationId:R,opponentIds:e,opponentType:t,direction:r});let M=n.includes(oe.VIDEO),F;if(S)try{let X={deviceId:this._api.deviceId(),sdkVersion:l.sdkVersion,clientAppKey:l.apiKey,platform:l.platform,protocolVersion:l.protocolVersion,domainId:l.domain},fe=JSON.stringify(X),Oe=await S({internalParams:fe,conversationId:R,externalIds:u,opponentType:t,mediaOptions:n,isVideo:M,joiningAllowed:o,requireAuthToJoin:d}),J=JSON.parse(Oe.internalCallerParams);F={endpoint:J.endpoint,wt_endpoint:J.wtEndpoint,id:R,is_concurrent:J.isConcurrent,client_type:J.clientType,rejected_participants:Oe.rejectedParticipants,stun_server:J.stun,turn_server:J.turn,token:new URL(J.endpoint).searchParams.get("token")??""},c.debug("FastStart",F)}catch{throw new G(D.UNKNOWN_ERROR,{message:"Cannot parse internal params"})}else F=await this._api.startConversation(R,e,t,M,s,o,d,{onlyAdminCanShareMovie:p},u),c.debug("Api.startConversation",F);this._setConversationParams(F);let W=await this._connectSignaling(ot.START,F);return await this._setConversation(F,W,r),this._logCallStartEvent(h,Le.OUTGOING),W}async _joinConversation(e,t){Je(E.SIGNALING_CONNECTED);let{conversationId:r,mediaOptions:n,chatId:s,joinLink:o,observedIds:d,payload:p}=e;c.debug("Conversation: join",{conversationId:r,joinLink:o,observedIds:d});let u=n.includes(oe.VIDEO),h;if(r)h=await this._api.joinConversation(r,u,s);else if(o)h=await this._api.joinConversationByLink(o,u,d,p);else throw new G(D.UNKNOWN_ERROR);c.debug("Api.joinConversation",h),this._setConversationParams(h);let S=await this._connectSignaling(ot.JOIN,h);return await this._setConversation(h,S,Le.JOINING),this._logCallStartEvent(t,Le.JOINING),S}async _prepareConversation(e,t=re.USER,r,n){Je(E.SIGNALING_CONNECTED),c.debug("Conversation: push",{conversationId:e,type:t,peerId:r});let s=this._api.getUserId();if(!s)throw new G(D.UNKNOWN_ERROR);let o=0,d="",p="",u={id:e,peerId:r,endpoint:d,wt_endpoint:p,is_concurrent:!1,p2p_forbidden:!1,device_idx:0,token:""};if(n){let S=this._decodeExternalConversationParams(n);this._setConversationParams(S),d=`${l.wssBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`,l.wtsBase&&(p=`${l.wtsBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`),u.token=S.token,u.endpoint=d,u.wt_endpoint=p}else{let S=await this._getConversationParams(e);o=S.device_idx||0,d=`${l.wssBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`,d=this._addGeoParamsToEndpoint(d,S),l.wtsBase&&(p=`${l.wtsBase}?userId=${s}&entityType=${t}&deviceIdx=${o}&conversationId=${e}&token=${l.wssToken}`,p=this._addGeoParamsToEndpoint(p,S)),u.token=S.token,u.endpoint=d,u.wt_endpoint=p,u.device_idx=o}let h=await this._connectSignaling(ot.ACCEPT,u);return z._current&&(z._current._participantState===Q.ACCEPTED||z._current._participantState===Q.CALLED)?(c.log("Push rejected (busy)"),C.log(E.PUSH,"busy"),this._signaling.ready&&this._signaling.hangup(D.BUSY),Promise.reject(new G(D.BUSY))):(z._current&&(z._current.destroy(),z._current=null),await this._setConversation(u,h,Le.INCOMING,t),h)}async _createParticipant(e,t){let r=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 r.externalId||(r.externalId=await this._getParticipantId(t??r.id)),this._api.cacheExternalId(t??r.id,r.externalId),t&&this._api.mapDecorativeId(t,r.id),r.observedIds?.length&&(r.externalId.observer=!0),e.markers&&(r.markers=this._denormalizeMarkers(r.id,e.markers)),r}async _getParticipantId(e){try{return await this._api.userId(e)}catch(t){throw this._close(new G(D.NETWORK_ERROR),t),t}}async _setConversation(e,t,r,n=re.USER){let{participants:s}=t.conversation;s.forEach(u=>{let h=v.composeId(u),S=$.fromSignalingParticipant(u,!1);if(S){this._api.cacheExternalId(h,S);let R=v.composeDecorativeId(u),M=$.fromSignalingParticipant(u);R&&M&&(this._api.cacheExternalId(R,M),this._api.mapDecorativeId(u.decorativeUserId,u.id))}});let o=this._api.getUserId(),d=e.device_idx||0;if(!o){let u=(t.conversation.participants||[]).find(h=>v.comparePeerId(h.peerId,t.peerId));if(!u)throw new G(D.UNKNOWN_ERROR);o=Number(u.id),u.idType&&(n=u.idType),u.deviceIdx&&(d=u.deviceIdx),this._api.setUserId(o)}let p=v.composeParticipantId(o,n,d);this._conversation={userId:o,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:r,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},Be.conversationId=t.conversation.id||e.id,this._signaling.setConversationId(this._conversation.id),e.p2p_forbidden&&(l.forceRelayPolicy=e.p2p_forbidden),C.log(E.RELAY_POLICY,l.forceRelayPolicy?"1":"0"),this._changeFeatureSet(),this._logDevices()}_updateConversation(e){if(!this._conversation)throw new G(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 dr;return this.subscribe(e,"SOURCE_CHANGED",this._onLocalMediaStreamChanged.bind(this)),this.subscribe(e,"SCREEN_STATUS",this._onScreenSharingStatus.bind(this)),this._audioFix=new mi(e),e}async _connectSignaling(e,t){this._signaling.setEndpoint(t.endpoint),this._signaling.setWebTransportEndpoint(t.wt_endpoint??null),this.subscribe(this._signaling,De.NOTIFICATION,this._onSignalingNotification.bind(this)),this.subscribe(this._signaling,De.FAILED,this._onSignalingFailed.bind(this)),this.subscribe(this._signaling,De.RECONNECT,this._onSignalingReconnect.bind(this));let r=await this._signaling.connect(e,t);return Me.logEventualStat({name:E.SIGNALING_CONNECTED}),r}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&&I.onConversationParticipantListChunk(this._participantListChunkToExternalChunk(this._createParticipantListChunk(t)))}_createParticipantListChunk(e){return{...{participants:[],countBefore:0,countAfter:0,markerFound:!1},...e}}_participantListChunkToExternalChunk(e){let t=v.mapSharedParticipants(e.participants.reduce((r,n)=>{let s=v.composeId(n);return this._participants[s]&&r.push(this._participants[s]),r},[]));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 r of t)await this._registerParticipants(r?.participants?.participants??[],!0)}async _registerParticipants(e,t=!1){if(!this._conversation)return;let r=e[0]?.externalId?.type;r&&(l.externalUserType=r);for(let n of e){let s=v.composeId(n);if(c.test("Conversation:RegisterParticipant",s),this._isMe(s)){this._conversation.roles=n.roles||[],this._conversation.roles.length&&(c.debug(`Local roles changed: ${n.roles}`),I.onLocalRolesChanged(this._conversation.roles,!0)),this._registerParticipantLocalMuteState(n);continue}if(n.state===Q.HUNGUP||n.state===Q.REJECTED){this._participants[n.id]&&this._removeParticipant(this._participants[n.id],D.HUNGUP);continue}let o=v.composeDecorativeId(n),d=await this._createParticipant({id:s,externalId:$.fromSignalingParticipant(n),mediaSettings:Re(n.mediaSettings),participantState:v.mapParticipantState(n),state:n.state,roles:n.roles||[],status:"WAITING",muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[],markers:this._denormalizeMarkers(s,n.markers),movieShareInfos:n.movieShareInfos,isInRoom:t},o);this._registerParticipantInCache(d),n.roles&&n.roles.length&&(c.debug(`Roles for participant [${s}] changed: ${n.roles}`),I.onRolesChanged(this._participants[s].externalId,n.roles,!0))}}_registerParticipantLocalMuteState({muteStates:e,unmuteOptions:t}){if(!e)return;let r=async()=>{let n=tn(e,Ge.MUTE),s=tn(e,Ge.MUTE_PERMANENT);for(let o of[n,s])o.length&&await this._onMuteParticipant({muteStates:e,unmuteOptions:t,mediaOptions:o,stateUpdated:!0})};v.setImmediate(()=>r().catch(n=>c.error(n)))}_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 r=this._api.getDecorativeIdByInitialId(v.decomposeId(e).id),n=r?v.composeUserId(r):void 0;return this._createParticipant({id:e},n)}async _getExternalIdByParticipantId(e){if(this._isMe(e))return this._conversation?.externalId;if(l.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(l.useParticipantListChunk){let r=this._registerParticipantInCache(await this._getExistedParticipantByIdOrCreate(e));return r.markers=this._denormalizeMarkers(r.id,t),r}return this._participants[e]}_warnParticipantNotInConversation(e){c.warn(`Participant [${e}] isn't in conversation`)}_denormalizeMarkers(e,t){if(!t)return null;let r=Object.values(t).find(n=>"ts"in n&&"rank"in n);return Object.entries(t).reduce((n,[s,o])=>(n[s]={...r,...o,id:e},n),{})}_processRooms(e){let t=e.rooms?.roomId??null;this._onRoomSwitched(t,!0)}_processMuteStates(e,t=!1){let r=Os(e);this._setMuteStatesForRoomId(r,null);for(let d of e.rooms?.rooms??[])this._setMuteStatesForRoomId(d.muteStates,d.id);let n=this._getMuteStatesForCurrentRoom();t&&(n=Us(e,n));let s=Object.keys(n),o=this._conversation?.roomId;s.length&&this._onMuteParticipant({muteStates:n,mediaOptions:s,muteAll:!0,stateUpdated:!0,roomId:o},t)}_processRecordInfos(e){this._onRecordInfo(e.conversation?.recordInfo??null);for(let t of e.rooms?.rooms??[])this._onRecordInfo(t.recordInfo??null,t.id)}_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 on(this._conversation.topology,this._signaling,this._mediaSource,this._serverSettings),this._debugInfo=new ji,this.subscribe(this._transport,"STATE_CHANGED",this._onTransportStateChanged.bind(this)),this.subscribe(this._transport,"LOCAL_STATE_CHANGED",this._onTransportLocalStateChanged.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_ADDED",this._onRemoteTrackAdded.bind(this)),this.subscribe(this._transport,"REMOTE_TRACK_REMOVED",this._onRemoteTrackRemoved.bind(this)),this.subscribe(this._transport,"AUDIO_MIX_STALL",this._onAudioMixStall.bind(this)),this.subscribe(this._transport,"REMOTE_DATA_STATS",this._onRemoteDataStats.bind(this)),this.subscribe(this._transport,"SIGNALLED_STALLED_PARTICIPANTS",this._onRemoteSignalledStall.bind(this)),this.subscribe(this._transport,"TOPOLOGY_CHANGED",this._onTopologyChanged.bind(this)),this.subscribe(this._transport,"NETWORK_STATUS",this._onNetworkStatus.bind(this)),this.subscribe(this._transport,"REMOTE_STREAM_SECOND",this._onRemoteStreamSecond.bind(this)),this.subscribe(this._transport,"PEER_CONNECTION_CLOSED",this._onPeerConnectionClosed.bind(this)),this.subscribe(this._transport,"ASR_TRANSCRIPTION",this._onAsrTranscription.bind(this)),this.subscribe(this._transport,"ANIMOJI_STREAM",this._onAnimojiStream.bind(this)),this.subscribe(this._transport,"ANIMOJI_ERROR",this._onAnimojiError.bind(this));let e=this._conversation.direction===Le.OUTGOING&&!this._conversation.concurrent;for(let t of Object.values(this._participants))(t.state===Q.ACCEPTED||t.state===Q.CALLED)&&this._transport.allocate(t.id,e)}_createSpeakerDetector(){this._transport&&this._conversation&&(this._volumesDetector=new cn(this._transport),this.subscribe(this._volumesDetector,"VOLUMES_DETECTED",this._onVolumesDetected.bind(this)),this._speakerDetector=new dn(this._volumesDetector,this._transport,this._conversation.topology),this.subscribe(this._speakerDetector,"SPEAKER_CHANGED",this._onSpeakerChanged.bind(this)),this._localVolumeDetector=new Wi(this._mediaSource))}_createSpecListener(){this._transport&&this._volumesDetector&&(this._specListener=new zi(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()?"✔":"✖")),C.log(E.DEVICES,`${e}_${t}`)}_logWithMediaSettings(e,t){C.log(e,[t?.isAudioEnabled&&"audio",t?.isVideoEnabled&&"video"].filter(Boolean).join("_"))}_removeParticipant(e,t){if(!(e.state===Q.CALLED||e.state===Q.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[r,n]of Object.entries(e.lastRequestedLayouts))this._streamIdByStreamDescription.delete(r),this._sequenceNumberByStreamDescription.delete(r),this._cooldownTimestampByStreamDescription.delete(r),this._streamWaitTimerByStreamDescription.has(r)&&(window.clearTimeout(this._streamWaitTimerByStreamDescription.get(r)),this._streamWaitTimerByStreamDescription.delete(r)),this._sendUpdateDisplayLayout({[r]:{stopStream:!0}});this._api.unmapDecorativeId(e.id),delete this._participants[e.id],I.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,r){c.debug(`Add new participant [${e}]`);let n=this._participants[e];if(n&&(n.state===Q.ACCEPTED||n.state===Q.CALLED)){c.warn(`Participant [${n.id}:${n.state}] is already in conversation`);return}if(!n){let s=v.composeDecorativeId(t);n=this._registerParticipantInCache(await this._createParticipant({id:e,externalId:$.fromSignalingParticipant(t,!!t.decorativeExternalUserId),mediaSettings:Re(t.mediaSettings),state:t.state,roles:t.roles||[],muteStates:t.muteStates||{},unmuteOptions:t.unmuteOptions||[],observedIds:t.observedIds||[]},s))}this._setParticipantsStatus([n],"WAITING"),r?(n.state=Q.HUNGUP,this._removeParticipant(n,r)):this._transport&&(n.state=Q.CALLED,this._transport.allocate(n.id,!0),C.log(E.ADD_PARTICIPANT),this._invokeRolesChangedCallbackIfNeeded(n))}_onRemoveParticipant(e){c.debug(`Remove participant [${e}]`);let t=[];for(let r=0;r<=Sd;r++){let n=v.compose(e,r),s=this._participants[n];s&&t.push(s)}if(!t.length){this._warnParticipantNotInConversation(e);return}if(this._transport)for(let r of t)this._transport.close(r.id);C.log(E.REMOVE_PARTICIPANT)}async changeDevice(e){return e==="audiooutput"?this._audioOutput.changeOutput():this._mediaSource?this._mediaSource.changeDevice(e):Promise.reject(ne.UNKNOWN)}stopVideoTrack(){return this._mediaSource?.stopVideoTrack()}async toggleScreenCapturing(e){return this._mediaSource?this._mediaSource.toggleScreenCapturing(e):Promise.reject(ne.UNKNOWN)}async disableScreenCapturing(){return this._mediaSource?this._mediaSource.disableScreenCapturing():Promise.reject(ne.UNKNOWN)}toggleAnimojiCapturing(e){this._mediaSource&&this._mediaSource.toggleAnimojiCapturing(e)}setAnimojiSvg(e,t=null,r=null){if(!this._transport||!this._conversation)return;let n=!t,s=t??this._conversation.compositeUserId;if(e instanceof ArrayBuffer){let o=r??this._conversation.externalId.id;this._transport.setAnimojiSvg(s,{svg:e,userId:o,isMe:n});return}this._transport.setAnimojiSvg(s,{svg:e,isMe:n})}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 C.log(E.MEDIA_STATUS,e?"video_1":"video_0"),this._mediaSource.toggleVideo(e)}async toggleLocalAudio(e){if(this._mediaSource)return C.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={},r={};for(let n of e){let s=typeof n.uid=="object"?n.uid:$.fromId(n.uid),o=$.toString(s);r[o]=n.priority}for(let n of Object.values(this._participants)){let s=$.toString(n.externalId);r.hasOwnProperty(s)&&(t[n.id]=r[s])}await this._signaling.changePriorities(t)}async changeParticipantState(e,t){for(let[r,n]of Object.entries(e))if(r.length>5||n.length>5)throw new Error("key/value max length is 5 chars, mappings with empty values (null or empty string) are discarded");t&&!this._isCallAdmin()&&(t=void 0),await this._signaling.changeParticipantState(e,t)}async putHandsDown(){this._checkAdminRole(),await this._signaling.putHandsDown()}async requestKeyFrame(e){let t={};return t[at(e)]={keyFrameRequested:!0},this._signaling.updateDisplayLayout(t)}async requestTestMode(e,t){return this._signaling.requestTestMode(e,t)}async updateDisplayLayout(e){if(e.length<1||!this._signaling.ready||this._transport?.getTopology()!=="SERVER")return;c.log(`Update display layout request [${this._signaling.getNextCommandSequenceNumber()}]`,e);let t={};for(let n of e){let s=typeof n.uid=="object"?n.uid:$.fromId(n.uid),o=this._api.getCachedOkIdByExternalId(s);if(!o){let u=$.toString(s);c.log(`Unknown participant external ID ${u}`);continue}let d=at({participantId:o,mediaType:n.mediaType,streamName:n.streamName}),p=this._participants[o];p?p.lastRequestedLayouts[d]=n:this._isMe(o)&&(this._myLastRequestedLayouts[d]=n),si(n)?(this._isMe(o)&&delete this._myLastRequestedLayouts[d],this._streamIdByStreamDescription.has(d)&&!this._cooldownTimestampByStreamDescription.has(d)&&this._cooldownTimestampByStreamDescription.set(d,Date.now())):(this._cooldownTimestampByStreamDescription.delete(d),!this._streamIdByStreamDescription.has(d)&&l.videoTracksCount>0&&this._streamIdByStreamDescription.set(d,null),t[d]=n),n.mediaType==="SCREEN"&&!si(n)&&Je(Xt(o))}let r=this._cooldownTimestampByStreamDescription.keys();for(;this._streamIdByStreamDescription.size>l.videoTracksCount;){let n=r.next();if(n.done){c.error("Cannot accommodate all streaming requests: tracks available "+l.videoTracksCount+"; requested streams: "+Array.from(this._streamIdByStreamDescription.keys()));break}this._stopStreaming(n.value),t[n.value]={stopStream:!0}}await this._sendUpdateDisplayLayout(t)}async feedback(e){return this._signaling.feedback(e)}userFeedbackStats(e,t,r){if(this._conversation)if(!l.clientEventsLoggingEnabled)this._api.sendUserFeedbackStats(this._conversation.id,e,t,r);else{let n={event_type:E.USER_FEEDBACK_RECEIVED,user_response:e};t!==void 0&&(n.reason=t),r!==void 0&&(n.group_call_users_count=r),C.logClientEvent(n,!0)}}sendClientEvent(e,t={},r=!1){let n={event_type:e,...t};C.logClientEvent(n,r)}_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 r=xi(e),n=this._participants[r.participantId],s=this._conversation?.externalId,o=this._isMe(r.participantId);if(n||o){switch(r.mediaType){case"STREAM":case"MOVIE":{if(r.streamName){let d={stream:null,streamName:r.streamName,mediaType:r.mediaType};o?I.onLocalLive(s,d):I.onRemoteLive(n.externalId,d)}break}case"CAMERA":{I.onRemoteStream(n.externalId,null);break}case"SCREEN":{I.onRemoteScreenStream(n.externalId,null);break}}C.log(E.PAT_DEALLOCATED)}else c.log(`Cannot find participant to stop streaming: ${r.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 r=[];for(let[n,s]of Object.entries(t.errorCodeByParticipantId||{})){let o=xi(n),d=this._participants[o.participantId];if(d){let p;typeof s!="number"?(c.warn(`Unexpected error code ${s} received for participant ${o.participantId}`),p=Ps.UNKNOWN_ERROR):p=ws(s),r.push({externalId:d.externalId,errorReason:p})}}if(r&&r.length)throw new ea("Could not allocate one or more participants",r)}_cleanupCooldownQueue(){let e={},t=this._cooldownTimestampByStreamDescription.entries();do{let r=t.next();if(r.done)break;let n=r.value;if(n[1]+_d>Date.now())break;let o=n[0];this._stopStreaming(o),e[o]={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 r of t)this._waitForStreamIfNeeded(r)}}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 G(D.REMOVED))):(this._updateConversation(e),await this._onJoinPart2(e))),I.onPromoted(e.demote)}async _onChatRoomUpdated(e,t=0,r=[],n,s){c.log(`Chat room updated: ${e}`);let o=[],d=[],p=[],u=[],h=[];if(r.length&&r.forEach(M=>{if(M.externalId){let F=$.fromSignaling(M.externalId);h.push(F),this._api.cacheExternalId(M.id.id,F)}else{let F=v.decomposeId(M.id.id).id;o.push(F),u.push(F)}}),n?.length&&n.forEach(M=>{let F=v.decomposeId(M).id;o.push(F),d.push(F)}),s?.length&&s.forEach(M=>{let F=v.decomposeId(M).id;o.push(F),p.push(F)}),!o.length){I.onChatRoomUpdated(e,t,h,[],[]);return}if(u.length){let M=await this._api.getExternalIdsByOkIds(u);h.push(...M)}let S=await this._api.getExternalIdsByOkIds(d),R=await this._api.getExternalIdsByOkIds(p);I.onChatRoomUpdated(e,t,h,S,R)}async _onSharedMovieUpdate(e){let t=this._conversation?.externalId;for(let r of e.data)if(this._isMe(r.participantId))I.onLocalLiveUpdate(t,r);else{let s=await this._getExternalIdByParticipantId(r.participantId);s&&I.onRemoteLiveUpdate(s,r)}}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(r=>this._processSharedMovieInfo(r,t)))}async _processSharedMovieInfo(e,t=null){if(!e)return;let r=this._conversation?.externalId;if(this._isMe(e.initiatorId))I.onLocalSharedMovieInfo(r,e,t);else{let s=await this._getExternalIdByParticipantId(e.initiatorId);s&&I.onRemoteSharedMovieInfo(s,e,t)}this._forceOpenTransportForAloneInCall()}async _processConnectionSharedMovieInfo(e){let t=e.conversation.participants.find(r=>this._isMe(v.composeId(r)));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 r=e?.rooms?.roomId??this._conversation?.roomId??null,n=this._conversation?.asrInfoByRoom.get(r);if(n){let s=await this._getExternalIdByParticipantId(n.initiatorId);s&&I.onAsrSet({externalId:s,movieId:n.movieId},r)}else r&&I.onAsrSet(null,r)}async _processConversationUrlSharingInfo(e){if(!this._conversation)return;e&&this._extractConnectionUrlSharingInfo(e);let{urlSharingInfoByRoom:t}=this._conversation,r=this._conversation.roomId,n=t.get(r);if(n&&!this._isMe(n.initiatorId)){let s=await this._getExternalIdByParticipantId(n.initiatorId);s&&I.onRemoteSharedUrl(s,n.sharedUrl,r)}}_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 r of e.rooms.rooms)r.urlSharingInfo?t.set(r.id,r.urlSharingInfo):t.delete(r.id)}async _onSharedMovieInfoStopped(e){c.log(`Shared movie stopped data received: ${e.notification}`);let t=this._conversation?.externalId,{initiatorId:r,movieId:n,source:s,roomId:o=null}=e,d={initiatorId:r,movieId:n,source:s};if(this._isMe(r))I.onLocalSharedMovieStoppedInfo(t,d,o);else{let u=await this._getExternalIdByParticipantId(r);if(u){let h=this._participants[r];h?.movieShareInfos&&(h.movieShareInfos=h.movieShareInfos.filter(S=>S&&S.movieId!==n)),I.onRemoteSharedMovieStoppedInfo(u,d,o)}}}async _onUrlSharingInfoUpdated(e){if(c.log(`Shared URL data received: ${e.notification}`),!this._conversation)return;let{urlSharingInfoByRoom:t,roomId:r}=this._conversation,{initiatorId:n,sharedUrl:s,roomId:o=null}=e;if(s?t.set(o,{sharedUrl:s,initiatorId:n}):t.delete(o),!(!s&&o!==r&&t.has(r))&&(!s||!this._isMe(n))){let d=await this._getExternalIdByParticipantId(n);d&&I.onRemoteSharedUrl(d,s,o)}}_onFeaturesPerRoleChanged(e){c.log(`Features per role changed: ${e.notification}`),I.onFeaturesPerRoleChanged(e.featuresPerRole)}_waitForStreamIfNeeded(e){let t=this._matchStreamDescription(e.participantStreamDescription);if(!t)return;let{mediaType:r,participantId:n}=t;if(r==="ANIMOJI")return;let s=this._participants[n];if(l.producerScreenDataChannel&&r==="SCREEN"&&!e.fastScreenShare){c.log("skipping participant-sources-update notification since screenshare will be received over datachannel");return}let o=at(t),d=this._sequenceNumberByStreamDescription.get(o);if(d&&d>e.sequenceNumber){c.warn(`Participant ${n} received outdated PAT response: sequence number ${e.sequenceNumber}; last sent sequence number for given participant is ${d}`),C.log(E.PAT_OUTDATED_RESPONSE);return}s&&e.suspend!==void 0&&r&&(c.debug(`participant-sources-update: mediaType=${r}, suspend=${e.suspend}`),I.onRemoteStreamSuspended(s.externalId,r,e.suspend));let p=e.streamId,u=e.rtpTimestamp?this._getWaitingTime(p,e.rtpTimestamp):0;if(u<=0){this._streamWaitTimerByStreamDescription.delete(o);let h=this._conversation?.externalId,S=this._isMe(n);if(!s&&!S){C.log(E.PAT_ERROR,"participantMissing"),c.error(`Could not find participant by ID: ${n}`);return}let R=S?h:s.externalId,M=this._streamByStreamId.get(p);if(!M){C.log(E.PAT_ERROR,"streamNotFound"),c.error(`Could not find stream by ID: ${p}`);return}C.log(E.PAT_ALLOCATED),this._streamIdByStreamDescription.set(o,p);let F=e.participantStreamDescription?.mediaType;if(F==="STREAM"||F==="MOVIE"){if(e.participantStreamDescription?.streamName){let W={streamName:e.participantStreamDescription.streamName,stream:M,mediaType:F};S?I.onLocalLive(R,W):I.onRemoteLive(R,W)}}else if(l.producerScreenTrack&&F==="SCREEN")I.onRemoteScreenStream(s.externalId,M);else if(!S){let W=(l.producerScreenTrack?null:s.secondStream)||M;I.onRemoteStream(s.externalId,W)}}else{c.debug(`Waiting for ${u} until stream ${p} for ${o} is switched`);let h=window.setTimeout(this._waitForStreamIfNeeded.bind(this,e),u);this._streamWaitTimerByStreamDescription.set(o,h)}}_matchStreamDescription(e){if(!e)return null;if(this._streamIdByStreamDescription.has(at(e)))return e;let t=e.participantId;if(e.mediaType){let r={participantId:t,mediaType:null};if(this._streamIdByStreamDescription.has(at(r)))return r}else{let r={participantId:t,mediaType:"CAMERA"};if(this._streamIdByStreamDescription.has(at(r)))return r;let n={participantId:t,mediaType:"SCREEN"};if(this._streamIdByStreamDescription.has(at(n)))return n}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?v.includesOneOf(this._conversation.roles,[mt.ADMIN,mt.CREATOR]):!1}_checkAdminRole(){if(this._conversation&&!v.includesOneOf(this._conversation.roles,[mt.ADMIN,mt.CREATOR]))throw new Error("You don't have the required permission")}_isCalledState(){return this._participantState===Q.CALLED}async grantRoles(e,t,r){this._checkAdminRole(),await this._signaling.grantRoles(e,t,r)}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,r=[],n=null){this._checkAdminRole(),await this._signaling.muteParticipant(e,t,r,n)}async enableFeatureForRoles(e,t){await this._signaling.enableFeatureForRoles(e,t)}async pinParticipant(e,t,r=null){this._checkAdminRole(),await this._signaling.pinParticipant(e,t,r),this._conversation?.pinnedParticipantIdByRoom.set(r,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=Es(this._conversation.options,e);this._onOptionsChanged(t)}}async getWaitingHall(e,t,r){if(!this._signaling)return Promise.reject();let n=null;if(e&&(n=ks(e),n)){let u=this._api.getDecorativeIdByInitialId(n.id);n.id=u?v.composeUserId(u):n.id}let s=await this._signaling.getWaitingHall(n,t,r);if(s.error)return Promise.reject(s.message);let o=s.participants||[],{externalIds:d}=await this._resolveWaitingHallExternalIds(o),p=null;return o.length&&s.hasMore&&(p=Ds(o[o.length-1].id)),{participants:d,pageMarker:p,totalCount:s.totalCount||0}}async _resolveWaitingHallExternalIds(e){let t=new Map,r=[],n=[];if(e.length){let s=[];e.forEach(o=>{if(t.set(o.id.id,o.id.addedTs),o.externalId){let d=$.fromSignaling(o.externalId);r.push(o.id.addedTs),n.push(d),this._api.cacheExternalId(o.id.id,d)}else s.push(v.decomposeId(o.id.id).id)}),s.length&&!n.length&&(n=await this._api.getExternalIdsByOkIds(s),r=n.map(o=>{let d=this._api.getCachedOkIdByExternalId(o);return(d?t.get(d):void 0)||Date.now()}))}return{externalIds:n,timestamps:r}}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:r,timestamps:n}=await this._resolveWaitingHallExternalIds(t);return{timestamps:n,participants:r,totalCount:e.totalCount||0}}async promoteParticipant(e,t){if(this._signaling&&this._conversation)try{if(!v.includesOneOf(this._conversation.options,[Gt.WAITING_HALL,Gt.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(r){throw c.warn(`Failed to promote participant ${e}. ${r}`),r}}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 r=t.messages.length-1;r>=0;r--){let n=t.messages[r];await this._onChatMessage(n)}}}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:r,lang:n}){let s={movieId:e,lang:n};(t||t===0)&&(s.gain=t),r&&(s.metadata=r);let o=await this._signaling.addMovie(s);if(o.error)throw new Error(o.error);return{movieId:o.movieId,streamType:o.streamType}}async updateMovie(e){let t=await this._signaling.updateMovie(e);if(t.error)throw new Error(t.error)}async removeMovie(e){let t={movieId:e},r=await this._signaling.removeMovie(t);if(r.error)throw new Error(r.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 r=await this._signaling.updateRooms(e,t);if(r.error)throw new Error(r.error)}async activateRooms(e,t){let r=await this._signaling.activateRooms(e,t);if(r.error)throw new Error(r.error)}async switchRoom(e,t){let r=await this._signaling.switchRoom(e,t);if(r.error)throw new Error(r.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,r=null,n="DIRECT_LINK",s=null,o=null){let d={movieId:r,name:t,privacy:n,groupId:s,roomId:o,streamMovie:!e},p=await this._signaling.startStream(d);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,r=!1,n=null){let s=await this._signaling.recordSetConf({king:e,pawns:t,hideParticipantCount:r,roomId:n});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,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:l.externalUserType}))}async getParticipants(e){let t=this._convertExternalIdsToServerExternalIds(e.externalIds),r=await this._signaling.getParticipants(t);if(r.error)throw new Error(r.error);let n=r.participants,s=this._transport?.getState();return Promise.all(n.map(async o=>{let d=v.composeId(o);return this._createParticipant({id:d,externalId:$.fromSignalingParticipant(o),mediaSettings:Re(o.mediaSettings),participantState:v.mapParticipantState(o),state:o.state,roles:o.roles||[],status:this._getStatusByTransportState(s)??"WAITING",muteStates:o.muteStates||{},unmuteOptions:o.unmuteOptions||[],observedIds:o.observedIds||[],markers:this._denormalizeMarkers(d,o.markers)},o.decorativeUserId)})).then(v.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 r=this._createParticipantListChunk(t.chunk),n=r.participants.filter(o=>{let d=v.composeId(o);return!this._participants[d]});await this._registerParticipants(n);let s=this._transport?.getState();return r.participants.forEach(o=>{let d=v.composeId(o),p=this._participants[d];p.status=this._getStatusByTransportState(s)??"WAITING",p.movieShareInfos=o.movieShareInfos,Object.assign(p.mediaSettings,Re(o.mediaSettings)),Object.assign(p.muteStates,o.muteStates),p.unmuteOptions=o.unmuteOptions??p.unmuteOptions,this._openTransport([p],!0)}),this._participantListChunkToExternalChunk(r)}async _getInitialParticiapntListChunk(){let e=l.participantListChunkInitIndex,t=l.participantListChunkInitCount,n=await this._signaling.getParticipantListChunk({listType:"GRID",fromIdx:e,count:t});return c.debug("Get initial participant list chunk",n.chunk),n.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 mi(this._mediaSource)),I.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),l.consumerScreenTrack){let r=e.track?new MediaStream([e.track]):null;I.onScreenStream(r,t)}}_changeRemoteMediaSettings(e,t){c.debug(`Remote media settings changed [${e}]`,t);let r=this._conversation?.externalId;if(this._isMe(e)&&r){I.onLocalMediaSettings(r,t);return}let s=this._participants[e];if(!s){this._warnParticipantNotInConversation(e);return}s.mediaSettings=t,this._state==="ACTIVE"&&I.onRemoteMediaSettings(s.externalId,t,s.markers),this._specListener&&this._specListener.onChangeRemoteMediaSettings(e,t)}_changeLocalParticipantState(e){c.debug("Local participant state force changed by admin",e),this._state==="ACTIVE"&&I.onLocalParticipantState(e)}_changeRemoteParticipantState(e,t){c.debug(`Remote participant state changed [${e}]`,t);let r=this._participants[e];if(!r){this._warnParticipantNotInConversation(e);return}r.participantState=t||{},this._state==="ACTIVE"&&I.onRemoteParticipantState(r.externalId,r.participantState,r.markers)}_changeMultipleParticipantState(e,t){c.debug("Multiple participants state changed",e);let r=[],n;e.forEach((s,o)=>{if(this._isMe(o))n=s;else{let d=this._participants[o];if(!d){this._warnParticipantNotInConversation(o);return}d.participantState=s,r.push({externalId:d.externalId,participantState:{...s},markers:d.markers})}}),this._state==="ACTIVE"&&(n&&I.onLocalParticipantState(n),r.length&&I.onRemoteParticipantsState(r,t))}_invokeRolesChangedCallbackIfNeeded(e){this._state==="ACTIVE"&&e.roles&&e.roles.length&&(c.debug(`Roles for participant [${e.id}] changed: ${e.roles}`),I.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._onRecordInfo(null,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}I.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 s=Object.keys(this._participants),o=[];for(let d of e.conversation.participants){let p=v.composeId(d),u=d.roles||[];if(this._isMe(p)){Fi(this._conversation.roles,u)||this._onRolesChanged(p,u),t=()=>{this._registerParticipantLocalMuteState({muteStates:Ls(d),unmuteOptions:d.unmuteOptions})};continue}o.push(p);let h=this._participants[p];if(!h)await this._onJoinedParticipant({participantId:d.id,participant:d,mediaSettings:d.mediaSettings});else{let S=Re(d.mediaSettings);xa(S,h.mediaSettings)||this._changeRemoteMediaSettings(p,S);let R=v.mapParticipantState(d),M=h.participantState;v.isEqualParticipantState(R,M)||this._changeRemoteParticipantState(p,R),Fi(u,h.roles)||this._onRolesChanged(h.id,u)}}for(let d of s)o.indexOf(d)<0&&this._removeParticipant(this._participants[d],D.HUNGUP)}let r=e.rooms?.roomId??null;this._conversation.roomId!==r?this._onRoomSwitched(r).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=v.composeMessageId(e),r=v.getPeerIdString(e.peerId);if(c.debug(`Participant accepted call [${t}]`),this._statFirstMediaReceived.markAcceptedCall(this._transport?.getTopology()),this._conversation&&this._isMe(t)){this._close(new G(D.MISSED),"Call accepted on other device");return}let n=this._participants[t];if(!n){let o=this._api.getDecorativeIdByInitialId(t),d=o?v.composeUserId(o,e.participantType):void 0;n=this._registerParticipantInCache(await this._createParticipant({id:t,mediaSettings:Re(e.mediaSettings)},d))}n.state=Q.ACCEPTED,n.mediaSettings=Re(e.mediaSettings),this._logWithMediaSettings(E.ACCEPTED_OUTGOING,n.mediaSettings),this._conversation&&this._conversation.direction===Le.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),this._state==="ACTIVE"&&this._transport&&this._transport.open([n.id],r),this._changeRemoteMediaSettings(t,n.mediaSettings),this._changeRemoteParticipantState(t);let s=Object.keys(n.muteStates);s.length&&this._onMuteParticipant({muteStates:n.muteStates,mediaOptions:s,stateUpdated:!0,participantId:t}),this._state==="ACTIVE"&&I.onAcceptedCall(n.externalId)}async _onHungup(e){c.debug(`Participant hungup [${e.participantId}]`,{reason:e.reason});let t=v.composeMessageId(e);if(this._conversation&&this._isMe(t)){this._close(new G(e.reason,{remote:!0}));return}await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers);let r=this._participants[t];if(!r){this._warnParticipantNotInConversation(t);return}this._transport&&this._transport.close(t),r.state=e.reason===D.REJECTED?Q.REJECTED:Q.HUNGUP,this._state!=="CLOSE"&&this._removeParticipant(r,D.HUNGUP)}async _onAddedParticipant(e){c.debug(`Participant added [${e.participantId}]`);let t=v.composeMessageId(e),r=this._participants[t];if(r&&r.state!==Q.HUNGUP&&r.state!==Q.REJECTED){c.debug(`Participant [${t}] is already in conversation and is active`);return}if(!r){let{participant:n}=e,s=n.decorativeUserId,o=await this._createParticipant({id:t,externalId:$.fromSignalingParticipant(n),mediaSettings:Re(n.mediaSettings),state:n.state,participantState:v.mapParticipantState(n),roles:n.roles||[],muteStates:n.muteStates||{},unmuteOptions:n.unmuteOptions||[],observedIds:n.observedIds||[]},s);r=this._registerParticipantInCache(o)}r.state=Q.CALLED,r.mediaSettings=Re(e.participant?.mediaSettings),r.participantState=v.mapParticipantState(e.participant),r.roles=e.participant?.roles||[],this._setParticipantsStatus([r],"WAITING"),this._state!=="IDLE"&&this._transport&&this._transport.allocate(r.id,!0),I.onParticipantAdded(r.externalId,r.markers),this._changeRemoteMediaSettings(t,r.mediaSettings),this._changeRemoteParticipantState(t,r.participantState),this._invokeRolesChangedCallbackIfNeeded(r)}async _onJoinedParticipant(e){c.debug(`Participant joined [${e.participantId}]`),this._statFirstMediaReceived.markParticipantJoined(this._transport?.getTopology());let t=v.composeMessageId(e),r=this._participants[t];if(r&&r.state===Q.ACCEPTED){c.warn(`Participant [${t}] is already in conversation and is active`);return}if(!r){let{participant:s}=e,o=s.decorativeUserId,d=await this._createParticipant({id:t,externalId:$.fromSignalingParticipant(s),mediaSettings:Re(s.mediaSettings),state:s.state,participantState:v.mapParticipantState(s),roles:s.roles||[],muteStates:s.muteStates||{},movieShareInfos:s.movieShareInfos,unmuteOptions:s.unmuteOptions||[],observedIds:s.observedIds||[],markers:this._denormalizeMarkers(t,s.markers)},o);r=this._registerParticipantInCache(d)}this._conversation&&this._conversation.direction===Le.OUTGOING&&(this._state==="IDLE"||this._state==="PROCESSING")&&(this._state="ACTIVE",this._changeFeatureSet()),r.state=Q.ACCEPTED,r.mediaSettings=Re(e.mediaSettings),r.participantState=v.mapParticipantState(e.participant),r.roles=e.participant.roles||[],this._transport?.isAllocated(r.id)?this._setParticipantsStatus([r],"CONNECTED"):this._setParticipantsStatus([r],"WAITING"),this._state!=="IDLE"&&this._transport&&(this._transport.isAllocated(r.id)||this._transport.allocate(r.id,!0),this._transport.open([r.id],null,!!this._conversation?.observer)),I.onParticipantJoined(r.externalId,r.markers),this._changeRemoteMediaSettings(t,r.mediaSettings),this._changeRemoteParticipantState(t,r.participantState),this._invokeRolesChangedCallbackIfNeeded(r);let n=Object.keys(r.muteStates);n.length&&this._onMuteParticipant({muteStates:r.muteStates,mediaOptions:n,stateUpdated:!0,participantId:t}),await this._processSharedMovieInfos(r.movieShareInfos)}_onClosedConversation(e){this._toggleJoinAvailability(),this._close(new G(e.reason,{remote:!0}))}async _onMediaSettingsChanged(e){let t=v.composeMessageId(e);await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteMediaSettings(t,Re(e.mediaSettings))}async _onParticipantStateChanged(e){let t=v.composeMessageId(e),r=v.mapParticipantState(e);this._isMe(t)?this._changeLocalParticipantState(r):(await this._registerParticipantAndSetMarkersIfChunkEnabled(t,e.markers),this._changeRemoteParticipantState(t,r))}async _onParticipantsStateChanged(e){let{participants:t,roomId:r}=e,n=t.map(({id:d,markers:p})=>this._registerParticipantAndSetMarkersIfChunkEnabled(d,p));await Promise.all(n);let s=new Map,o=t.map(({id:d,participantState:p})=>this._getExternalIdByParticipantId(d).then(u=>[d,u&&v.mapParticipantState({participantState:p})]));try{(await Promise.all(o)).forEach(([p,u])=>{u&&s.set(p,u)}),this._changeMultipleParticipantState(s,r)}catch(d){c.warn(`_onParticipantsStateChanged: Failed to get external ids. ${d}`)}}_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(),I.onMultipartyChatCreated(this._conversation))}async _onForceMediaSettingsChange(e){if(!this._mediaSource)return;let t=this._mediaSource.getMediaSettings(),r=Re(e.mediaSettings);t.isAudioEnabled!==r.isAudioEnabled&&await this._mediaSource.toggleAudio(r.isAudioEnabled),t.isVideoEnabled!==r.isVideoEnabled&&await this._mediaSource.toggleVideo(r.isVideoEnabled),l.consumerScreenTrack&&t.isScreenSharingEnabled!==r.isScreenSharingEnabled&&await this._mediaSource.toggleScreenCapturing({captureScreen:r.isScreenSharingEnabled,fastScreenSharing:r.isFastScreenSharingEnabled,captureAudio:r.isAudioSharingEnabled})}_onSettingsUpdate(e){c.debug("Got settings update notification",e);let t={camera:e.camera,screenSharing:e.screenSharing};this._serverSettings=Zn(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),r=e.quality.maxDimension,n={camera:Object.assign({},this._serverSettings.camera,{maxBitrateK:t,maxDimension:r}),screenSharing:null};this._serverSettings=Zn(this._serverSettings,n),this._transport&&this._transport.updateSettings(this._serverSettings)}_onPeerRegistered(e){let t=v.composeMessageId(e);this._participants[t]&&(this._participants[t].clientType=e.clientType,this._participants[t].platform=e.platform),I.onPeerRegistered()}async _onMicSwitched(e){I.onDeviceSwitched(oe.AUDIO,!e.mute),await this.toggleLocalAudio(!e.mute)}async _onChatMessage(e){let t=v.composeMessageId(e),r=await this._getExternalIdByParticipantId(t);if(!r){this._warnParticipantNotInConversation(t);return}I.onChatMessage(e.message,r,e.direct)}async _onCustomData(e){if(e.data.hasOwnProperty("sdk"))return;let t=v.composeMessageId(e),r=await this._getExternalIdByParticipantId(t);if(!r){this._warnParticipantNotInConversation(t);return}I.onCustomData(e.data,r,e.direct)}async _onRecordInfo(e,t=null){if(!this._conversation)return;let r=this._conversation.recordsInfoByRoom.get(t),n=!1;if(!r!=!e?n=!0:r&&e&&(n=r.recordMovieId!==e.recordMovieId||r.recordStartTime!==e.recordStartTime),n)if(this._conversation.recordsInfoByRoom.set(t,e),e){let s=await this._getExternalIdByParticipantId(e.initiator);s?I.onRecordStarted(s,e.recordMovieId,e.recordStartTime,e.recordType,e.recordExternalMovieId,e.recordExternalOwnerId,t):this._warnParticipantNotInConversation(e.initiator)}else I.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 r=await this._getExternalIdByParticipantId(t);r&&I.onPinnedParticipant(r,!1,null,e)}}async _changeRecordInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.recordsInfoByRoom.get(e);if(t){let r=await this._getExternalIdByParticipantId(t.initiator);r?I.onRecordStarted(r,t.recordMovieId,t.recordStartTime,t.recordType,t.recordExternalMovieId,t.recordExternalOwnerId,e):this._warnParticipantNotInConversation(t.initiator)}else I.onRecordStopped(e)}async _changeAsrInfoForRoom(){if(!this._conversation)return;let e=this._conversation.roomId,t=this._conversation.asrInfoByRoom.get(e);if(t){let r=await this._getExternalIdByParticipantId(t.initiatorId);r&&I.onAsrSet({externalId:r,movieId:t.movieId},e)}else I.onAsrSet(null,e)}async _changeUrlSharingInfoForRoom(){if(!this._conversation)return;let{roomId:e}=this._conversation,{urlSharingInfoByRoom:t}=this._conversation,r=t.get(e);if(r){let n=await this._getExternalIdByParticipantId(r.initiatorId);n&&I.onRemoteSharedUrl(n,r.sharedUrl,e)}}async _onParticipantAnimojiChanged(e){if(this._conversation){let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}I.onParticipantVmojiUpdate(t)}}async _onAsrStart(e){if(!this._conversation)return;let t=e.asrInfo,r=e.roomId||null;this._conversation.asrInfoByRoom.set(r,t);let n=await this._getExternalIdByParticipantId(t.initiatorId);if(!n){this._warnParticipantNotInConversation(t.initiatorId);return}I.onAsrStarted(n,t.movieId,r),this._forceOpenTransportForAloneInCall()}_onAsrStop(e){if(!this._conversation)return;let t=e.roomId||null;t===null&&(this._conversation.asrInfo=null),this._conversation.asrInfoByRoom.delete(t),I.onAsrStopped(t)}async _onAsrTranscription(e){if(!this._conversation)return;let t=await this._getExternalIdByParticipantId(e.participantId);if(!t){this._warnParticipantNotInConversation(e.participantId);return}I.onAsrTranscription(t,e.text,e.timestamp,e.duration)}_onRolesChanged(e,t){if(this._conversation&&this._isMe(e)&&!Fi(this._conversation.roles,t)){c.debug(`Local roles changed: ${t}`),this._conversation.roles=t,I.onLocalRolesChanged(t),this._processMuteState({mediaOptions:tn(this._getMuteStatesForCurrentRoom(),Ge.MUTE_PERMANENT),stateUpdated:!0}),v.includesOneOf(t,[mt.ADMIN,mt.CREATOR])?this._refreshRooms(!0):t.length||this._onRoomSwitched(null);return}let r=this._participants[e];r&&!Fi(r.roles,t)&&(c.debug(`Roles for participant [${e}] changed: ${t}`),r.roles=t,I.onRolesChanged(r.externalId,t))}async _onMuteParticipant(e,t=!1){if(!this._conversation)return;let{muteAll:r,muteStates:n={},unmuteOptions:s=[],mediaOptions:o=[],roomId:d=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`,n),I.onMuteStates(n,s,o,r,e.unmute,u.externalId,p?.externalId,e.stateUpdated,e.requestedMedia,e.roomId));return}if(e.requestedMedia?.length||(r&&!t?this._setMuteStatesForRoomId(n,d):r||(this._conversation.muteStatesPersonal=n)),e.adminId&&this._isMe(e.adminId)){r&&I.onMuteStates(n,s,o,r,e.unmute,null,this._conversation.externalId,e.stateUpdated,e.requestedMedia,e.roomId);return}await this._processMuteState({mediaOptions:o,muteAll:r,unmute:e.unmute,adminId:e.adminId,stateUpdated:e.stateUpdated,requestedMedia:e.requestedMedia,roomId:e.roomId,unmuteOptions:s,muteStates:n})}_changeMuteStatesForRoom(e,t){if(!this._conversation)return;let r=this._getMuteStatesForRoomId(t),n=this._getMuteStatesForRoomId(e),s=Object.keys(r),o=Object.keys(n);this._processMuteState({mediaOptions:Array.from(new Set([...s,...o])),roomId:e,muteAll:!0,stateUpdated:!0})}async _processMuteState(e){if(!this._conversation||!this._mediaSource||this._participantState!==Q.ACCEPTED)return;let{mediaOptions:t=[],muteAll:r,unmute:n,stateUpdated:s,requestedMedia:o,roomId:d=null,unmuteOptions:p=[]}=e,u=e.adminId?this._participants[e.adminId]:null,h=Object.assign({},e.muteStates??this._getMuteStatesForRoomId(d)),S=this._mediaSource.getMediaSettings(),R=Object.entries(h);for(let[M,F]of R){let W=l.newMuteRules&&this._isCallAdmin()&&r;if(!(F!==Ge.MUTE&&F!==Ge.MUTE_PERMANENT||W)&&(this._isCallAdmin()&&F===Ge.MUTE_PERMANENT&&!r&&(h[M]=Ge.MUTE),!(!t.includes(M)||n)))switch(M){case oe.VIDEO:S.isVideoEnabled&&(I.onDeviceSwitched(oe.VIDEO,!1),await this.toggleLocalVideo(!1));break;case oe.AUDIO:S.isAudioEnabled&&(I.onDeviceSwitched(oe.AUDIO,!1),await this.toggleLocalAudio(!1));break;case oe.SCREEN_SHARING:S.isScreenSharingEnabled&&(I.onDeviceSwitched(oe.SCREEN_SHARING,!1),await this.disableScreenCapturing());break;case oe.AUDIO_SHARING:S.isAudioSharingEnabled&&(I.onDeviceSwitched(oe.AUDIO_SHARING,!1),await this.toggleScreenCapturing({captureScreen:S.isScreenSharingEnabled,fastScreenSharing:S.isFastScreenSharingEnabled,captureAudio:!1}));break}}I.onMuteStates(h,p,t,r,n,null,u?.externalId,s,o,d)}async _onPinParticipant(e,t=!1,r,n=null){if(!this._conversation)return;let s=this._conversation.pinnedParticipantIdByRoom.get(n);if(s&&s!==e)if(this._isMe(s))I.onLocalPin(!0,n);else{let o=await this._getExternalIdByParticipantId(s);o&&I.onPinnedParticipant(o,!0,this._denormalizeMarkers(e,r),n)}if(this._isMe(e))I.onLocalPin(t,n);else{let o=await this._getExternalIdByParticipantId(e);o&&I.onPinnedParticipant(o,t,this._denormalizeMarkers(e,r),n)}this._conversation.pinnedParticipantIdByRoom.set(n,t?null:e)}_onOptionsChanged(e){this._conversation&&!Is(this._conversation.options,e)&&(this._conversation.options=e,I.onOptionsChanged(e))}_onNetworkStatus(e){if(this._conversation){let t=[];for(let[r,n]of Object.entries(e)){let s;if(this._isMe(r)||r==="")s=this._conversation.networkRating;else if(this._participants[r])s=this._participants[r].networkRating;else continue;if(s!==n)if(this._isMe(r)||r==="")this._conversation.networkRating=n,I.onLocalNetworkStatusChanged(n);else{let o=this._participants[r];o.networkRating=n,t.push({uid:o.externalId,rating:n})}}if(t.length===0)return;c.log("Received network status update: ",e),I.onNetworkStatusChanged(t)}}_onRemoteStreamSecond(e,t){let r=this._participants[e];if(r){if(l.producerScreenTrack){I.onRemoteScreenStream(r.externalId,t);return}if(r.secondStream=t,l.videoTracksCount>0){let n=e;if(!this._streamIdByStreamDescription.has(n)){c.error("Received remote stream notification for a participant that has no track associated with it",n);return}let s=this._streamIdByStreamDescription.get(n);if(!s||this._streamWaitTimerByStreamDescription.has(n)){c.log("Delaying secondary stream start/stop until main stream becomes available",n);return}let o=this._streamByStreamId.get(s);if(!o){C.log(E.PAT_ERROR,"streamNotFound"),c.error(`Could not find stream by ID: ${s}`);return}I.onRemoteStream(r.externalId,r.secondStream||o)}else{let n=t||r.remoteStream;n&&I.onRemoteStream(r.externalId,n)}}}_onAnimojiStream(e,t){if(this._isMe(e)&&this._mediaSource){I.onVmojiStream(t,this._mediaSource.getMediaSettings());return}let r=this._participants[e];r&&I.onRemoteVmojiStream(r.externalId,t)}async _onAnimojiError(e){try{let t=await this._getExternalIdByParticipantId(e.participantId);t&&(delete e.participantId,I.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);I.onCallState(e,t,this._conversation)}}_changeNeedRate(){this._conversation&&this._conversation.needRate&&I.onRateNeeded()}_onVolumesDetected(e){let t=[];for(let[r,n]of Object.entries(e)){let s=this._participants[r];s&&s.externalId&&t.push({uid:s.externalId,volume:n.real})}I.onVolumesDetected(t)}_onSpeakerChanged(e){this._activeSpeakerId=e,this._participants[e]&&this._lastSignalledActiveSpeakerId!==e&&(I.onSpeakerChanged(this._participants[e].externalId),this._lastSignalledActiveSpeakerId=e)}async _onTransportStateChanged(e,t){c.debug(`Transport state has changed: ${t}`,e);let r=this._getStatusByTransportState(t);if(!r)return;let n=e.reduce((s,o)=>{if(o in this._participants){let d=this._participants[o];s.push(d),t==="CONNECTED"&&(d.remoteStream||(d.mediaSettings&&this._changeRemoteMediaSettings(o,d.mediaSettings),this._changeRemoteParticipantState(o,d.participantState)),this._updateDisplayLayoutFromCache(o))}else this._warnParticipantNotInConversation(o);return s},[]);n.length&&this._setParticipantsStatus(n,r)}async _onTransportLocalStateChanged(e){if(c.debug(`Local transport state has changed: ${e}`),e==="CONNECTED"&&(I.onLocalStatus("CONNECTED"),this._transport?.getTopology()==="SERVER")){let t=Object.values(this._myLastRequestedLayouts);await this.updateDisplayLayout(t)}e==="CONNECTING"&&I.onLocalStatus("CONNECTING"),e==="RECONNECTING"&&I.onLocalStatus("RECONNECT"),e==="FAILED"&&this._transport&&this._transport.allocated().length===0&&(this._signaling.ready&&await this._signaling.hangup(D.FAILED),this._close(new G(D.FAILED),"Transport failed"))}async _onRemoteTrackAdded(e,t,r){if(e.endsWith(et.AUDIO_MIX))c.debug("Remote audio mix track added"),this._audioOutput.add(r),I.onRemoteMixedAudioStream(t);else if(e.startsWith(et.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:r.kind});let n=this._participants[e];if(!n){let s=this._api.getDecorativeIdByInitialId(e),o=s?v.composeUserId(s):void 0;c.warn(`Conversation: track added before participant [id: ${e}, decorativeId: ${o}]`),n=this._registerParticipantInCache(await this._createParticipant({id:e},o)),this._setParticipantsStatus([n],"WAITING"),this._activeSpeakerId===e&&this._lastSignalledActiveSpeakerId!==e&&(I.onSpeakerChanged(n.externalId),this._lastSignalledActiveSpeakerId=e)}if(this._transport&&!this._transport.isAllocated(n.id)&&this._transport.allocate(n.id,!1),r.kind==="audio"&&(this._audioOutput.add(r),l.preserveAudioTracks||(n.remoteAudioTrack=r,t.removeTrack(r))),n.remoteStream!==t&&t.getTracks().length){if(n.remoteStream=t,n.secondStream)return;I.onRemoteStream(n.externalId,t)}n.mediaSettings&&this._changeRemoteMediaSettings(e,n.mediaSettings)}}_onRemoteTrackRemoved(e,t,r){switch(c.debug(`[${e}] remote track (removed)`,{track:r}),r.kind){case"audio":this._removeAudioTrack(e,t,r);break;case"video":case"screen":this._removeVideoTrack(e,t,r);break}}_removeAudioTrack(e,t,r){if(e!==et.AUDIO_MIX){let n=this._participants[e];if(!n||n.remoteStream&&n.remoteStream!==t)return}this._audioOutput.remove(r)}_removeVideoTrack(e,t,r){}_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),I.onLocalStatus(e?"RECONNECT":"CONNECTED"))}_onRemoteSignalledStall(e){let t={},r=[],n=[];c.debug("Participants stalled:",e);for(let s of e){if(t[s]=!0,!this._lastStalled[s]){let o=this._participants[s];o&&r.push(o)}delete this._lastStalled[s]}for(let s of Object.keys(this._lastStalled)){let o=this._participants[s];o&&n.push(o)}r.length&&this._setParticipantsStatus(r,"RECONNECT"),n.length&&this._setParticipantsStatus(n,"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}),I.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,r=null){if(!e.length)return;let n=e.reduce((s,o)=>(o.status!==t&&(o.status=t,s.push(o.externalId)),s),[]);n.length&&I.onRemoteStatus(n,t,r)}_onJoinLinkChanged(e){I.onJoinLinkChanged(e.joinLink)}async _onRoomsUpdated(e){if(this._isCalledState())return;let t={};for(let r of Object.keys(hi)){let n=e.updates[r];n&&(t[r]={rooms:await Promise.all(n?.rooms?.map(this._convertRoomToExternal.bind(this))||[]),roomIds:n?.roomIds,deactivated:n?.deactivated})}I.onRoomsUpdated(t)}async _onRoomUpdated(e){let t=await this._convertRoomToExternal(e.room||null);e.events.some(r=>r===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()||I.onRoomUpdated(e.events,e.roomId,t,e.deactivate||null)}async _convertRoomToExternal(e){if(!e)return null;let t=await Promise.all(e.participantIds?.map(o=>this._getExternalIdByParticipantId(o))||[]),r=await Promise.all(e.addParticipantIds?.map(o=>this._getExternalIdByParticipantId(o))||[]),n=await Promise.all(e.removeParticipantIds?.map?.(o=>this._getExternalIdByParticipantId(o))||[]),s=e.pinnedParticipantId?await this._getExternalIdByParticipantId(e.pinnedParticipantId):void 0;return{id:e.id,name:e.name,participantCount:e.participantCount,participantIds:t,addParticipantIds:r,removeParticipantIds:n,participants:e.participants?.participants?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(),r=e.roomId??null,n=e.addedParticipantIds?.map(R=>v.decomposeId(R).id)||[],s=await this._api.getExternalIdsByOkIds(n),o=e.addedParticipants;if(s.length&&o?.length!==s.length&&!this._isCalledState()){let R=this._convertExternalIdsToServerExternalIds(s);o=(await this._signaling.getParticipants(R)).participants}let d=await Promise.all(o?.map(async R=>{let M=v.composeId(R);return this._createParticipant({id:M,externalId:$.fromSignalingParticipant(R),mediaSettings:Re(R.mediaSettings),participantState:v.mapParticipantState(R),state:R.state,roles:R.roles||[],status:this._getStatusByTransportState(t)??"WAITING",muteStates:R.muteStates||{},unmuteOptions:R.unmuteOptions||[],observedIds:R.observedIds||[],markers:this._denormalizeMarkers(M,R.markers),isInRoom:r!==null},R.decorativeUserId)})||[]),p=!1;for(let R of d)R.id===this._conversation?.compositeUserId&&(p=!0),this._registerParticipantInCache(R);this._transport?.getState()==="IDLE"&&!this._isCalledState()&&this._openTransport(d,!0);let u=[],h=[];if(e?.removedParticipantMarkers){for(let R of e.removedParticipantMarkers)if(R.GRID?.id){let M=this._getExternalIdByParticipantId(R.GRID.id);h.push(M)}u=await Promise.all(h)}if(p&&await this._onRoomSwitched(r),u){let R=this._conversation?.pinnedParticipantIdByRoom.get(r);if(R){let M=await this._getExternalIdByParticipantId(R);if(M){for(let F of u)if($.compare(M,F)){this._conversation?.pinnedParticipantIdByRoom.delete(r);break}}}}let S={roomId:r,participantCount:e.participantCount,addedParticipantIds:s,addedParticipants:v.mapSharedParticipants(d),removedParticipantMarkers:e?.removedParticipantMarkers,removedParticipantIds:u};this._isCalledState()||I.onRoomParticipantsUpdated(S)}async _onRoomSwitched(e,t=!1){if(!this._conversation||this._conversation.roomId===e)return;let r=this._conversation.roomId;if(this._conversation.roomId=e,t&&!this._isCalledState()){I.onRoomStart(e);return}this._isCalledState()||I.onRoomSwitched(e),e!==null&&!this._isCallAdmin()&&await this._refreshRooms(!1),this._changePinnedParticipantForRoom(),this._changeRecordInfoForRoom(),this._changeMuteStatesForRoom(e,r),await this._changeAsrInfoForRoom(),await this._changeUrlSharingInfoForRoom()}async _refreshRooms(e){let t;this._isCalledState()||(t=await this._signaling.getRooms(e));let r=t?.rooms?.rooms??[],n=[];for(let s of r){let o=s.id??null;if(this._setMuteStatesForRoomId(s.muteStates,o),this._conversation?.recordsInfoByRoom.set(o,s.recordInfo??null),this._conversation?.pinnedParticipantIdByRoom.set(o,s.pinnedParticipantId??null),s.asrInfo&&this._conversation?.asrInfoByRoom.set(o,s.asrInfo),s.urlSharingInfo?this._conversation?.urlSharingInfoByRoom.set(o,s.urlSharingInfo):this._conversation?.urlSharingInfoByRoom.delete(o),e){await this._registerParticipants(s?.participants?.participants?.filter(p=>!this._participants[v.composeId(p)])||[],!0);let d=await this._convertRoomToExternal(s);d&&n.push(d)}}n.length&&!this._isCalledState()&&I.onRoomsUpdated({[hi.UPDATE]:{rooms:n}})}async _onFeedback(e){let t=[];for(let r of e.feedback){let n={...r,items:[]};for(let s of r.items){let o=await this._getExternalIdByParticipantId(s.participantId);o?n.items.push({...s,participantId:o}):this._warnParticipantNotInConversation(s.participantId)}t.push(n)}I.onFeedback(t,e.roomId)}async _onDecorativeParticipantIdChanged(e){if(!this._conversation||!e.decorativeParticipantId||!e.decorativeExternalParticipantId)return;let{participantId:t,decorativeParticipantId:r,decorativeExternalParticipantId:n}=e,s=this._isMe(t);c.debug(`Decorative participant id changed [${t}]`,e);let o=await this._getExternalIdByParticipantId(t);if(!o){this._warnParticipantNotInConversation(t);return}let d=$.fromSignaling(n,o.deviceIdx);I.onParticipantIdChanged(o,d),this._api.cacheExternalId(r,d),this._api.mapDecorativeId(r,t),s?this._conversation.externalId=d:this._participants[t].externalId=d}_onVideoSuspendSuggest(e){!this._conversation||this._conversation.topology!=="SERVER"||(c.debug("Video suspend suggested",e),I.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 U=z,ea=class a extends Error{constructor(i,e){super(i),Object.setPrototypeOf(this,a.prototype),this.participantErrors=e}};var $t=null,fi=null;function qs(){$t=null,fi=null}async function un(a=null,i){let e=a??l.apiBaseUrl;if(e)return e;if((i??l.apiEnv)!=="AUTO")return l.apiEndpoint(i);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 c.debug("Resolved API endpoint",s),s}catch(t){return c.warn("Failed to resolve API endpoint using DNS, default is used",t),l.apiEndpoint(i)}}async function Ks(){return $t||fi||(fi=un(),$t=await fi,fi=null,$t)}async function gi(a,i={},e=!1){if(!window.Blob||!window.navigator.sendBeacon)return;await Ks();let t=zs(a,i,e),r=new window.Blob([t],{type:"application/x-www-form-urlencoded"});window.navigator.sendBeacon(`${$t}/fb.do`,r)}async function Ji(a,i={},e=!1,t){await Ks();let r=zs(a,i,e);return vd(r,t)}async function vd(a,i){return new Promise((e,t)=>{let r=new XMLHttpRequest;r.open("POST",`${i??$t}/fb.do`,!0),r.setRequestHeader("Content-type","application/x-www-form-urlencoded"),r.onreadystatechange=()=>{if(r.readyState!==XMLHttpRequest.DONE)return;let n;try{n=JSON.parse(r.responseText)}catch{n={result:r.responseText}}r.status!==200||n.hasOwnProperty("error_msg")?t(n):e(n)},r.send(a)})}async function $s(a,i){try{let e=await fetch(a,{method:"POST",body:i});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 zs(a,i={},e=!1){i.method=a,i.format="JSON",i.application_key||(i.application_key=l.apiKey),e||(Te.sessionKey?i.session_key=Te.sessionKey:Te.accessToken&&(i.access_token=Te.accessToken));for(let[r,n]of Object.entries(i))typeof n=="object"&&(i[r]=JSON.stringify(n));let t="";for(let[r,n]of Object.entries(i))t&&(t+="&"),t+=`${r}=${encodeURIComponent(n)}`;return t}var Yi=class{async createJoinLink(i){return{join_link:"nop"}}async removeJoinLink(i){return{success:!0}}async getAnonymTokenByLink(i,e){return""}log(i){}logClientStats(i){}logClientEvents(i){}getCachedOkIdByExternalId(i){return null}cacheExternalId(i,e){}mapDecorativeId(i,e){}unmapDecorativeId(i){}getDecorativeIdByInitialId(i){}replaceByInitialIdIdIfExists(i){return typeof i=="string"?parseInt(i,10):i}hangupConversation(i){}sendUserFeedbackStats(i,e,t,r){}async removeHistoryRecords(i){}async getServerTime(){return Date.now()}cleanup(){}};var Ed=10,bd=700,Cd=3e3,_i=class extends Yi{constructor(){super(...arguments);this._userId=null;this._externalUidsCache=new Map;this._decorativeIdToInitialId=new Map;this._initialIdToDecorativeId=new Map}async _callUnsafe(e,t={},r=!1){let n=async s=>{try{return await Ji(e,t,r)}catch(o){if(!o.hasOwnProperty("error_msg")&&(s++,c.debug(`${e} network error, attempt ${s}...`),s<Ed))return await v.delay(Math.min(s*bd,Cd)),n(s);throw c.warn(e,"error",o),o}};return n(0)}async _call(e,t={},r=!1){try{return await this._callUnsafe(e,t,r)}catch(n){c.warn("Api call error",n);let s=ne.API;switch(n.error_code){case 102:case 103:case 104:return await this.authorize(),this._callUnsafe(e,t,r)}let o={message:n.error_msg,code:n.error_code};switch(n.custom_error&&(o.custom_error=n.custom_error),n.error_code){case 1101:s=D.SERVICE_DISABLED;break;case 300:s=D.NOT_FOUND;break;case 1102:s=D.CALLEE_IS_OFFLINE;break;case 1103:s=D.NOT_FRIENDS;break;case 1104:case 1106:s=D.EXTERNAL_API_ERROR;break;case 1113:s=D.CALLER_IS_REJECTED;break;case 1114:s=D.VCHAT_DETAILED_ERROR;break}throw new G(s,o)}}async userId(e){let t=v.extractOkId(e);if(Te.isEmpty())return $.fromId(String(t));this._externalUidsCache.has(t)||await this._getExternalIdsByOkIds([t]);let r=this.getDecorativeIdByInitialId(t);return r&&(t=r),$.fromString(this._externalUidsCache.get(t))}async authorize(){if(this._ensureUuid(),!l.apiKey)throw new G(ne.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)),Te.sessionKey=t.session_key,Te.sessionSecretKey=t.session_secret_key}).catch(t=>{throw t.error_code===401&&I.onTokenExpired(),new G(ne.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})};gi("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 r={data:JSON.stringify(t)};gi("vchat.clientStats",r)}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 r={data:JSON.stringify(t)};gi("vchat.clientEvents",r)}async uploadDebugLogs(e,t,r,n){let s={conversationId:e,webrtcPlatform:l.platform,startTime:t,endTime:r},o=await this._callUnsafe("vchat.getLogUploadUrl",s),d=new FormData,p=new Blob([n],{type:"application/json"});d.append("file",p,"log.json");let u=new URL(o.upload_url);return u.searchParams.append("size",p.size.toString()),$s(u.toString(),d)}async joinConversation(e,t=!1,r){let n={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};return r&&(n.chatId=r),this._call("vchat.joinConversation",n)}async createConversation(e,t="",r=!1,{onlyAdminCanShareMovie:n,audienceMode:s,audioOnly:o}={},d){let p=this._preareStartConversationData({conversationId:e,isVideo:!1,joiningAllowed:!0,payload:t,requireAuthToJoin:r,onlyAdminCanShareMovie:n,audienceMode:s,audioOnly:o,speakerIds:d});return this._startConversation(p)}async startConversation(e,t,r,n=!1,s="",o=!1,d=!1,{onlyAdminCanShareMovie:p}={},u){let h=this._preareStartConversationData({conversationId:e,isVideo:n,joiningAllowed:o,payload:s,requireAuthToJoin:d,onlyAdminCanShareMovie:p,externalIds:u});if(t&&t.length)switch(r){case dt.USER:h.uids=t.join(",");break;case dt.GROUP:h.gid=t[0];break;case dt.CHAT:h.chatId=t[0];break}return this._startConversation(h)}_ensureUuid(){if(!this._uuid){let e=It.get("uuid");e||(e=v.uuid(),It.set("uuid",e)),this._uuid=String(e)}}deviceId(){return this._ensureUuid(),this._uuid}_preareStartConversationData({conversationId:e,isVideo:t,payload:r="",joiningAllowed:n=!1,requireAuthToJoin:s=!1,onlyAdminCanShareMovie:o,audienceMode:d=!1,audioOnly:p=!1,speakerIds:u=[],externalIds:h}){let S={conversationId:e,isVideo:t,protocolVersion:l.protocolVersion};if(n&&(S.createJoinLink=!0),r&&(S.payload=r),l.domain&&(S.domainId=l.domain),l.externalDomain&&(S.externalDomain=l.externalDomain),s&&(S.requireAuthToJoin=!0),o!==void 0&&(S.onlyAdminCanShareMovie=o),d&&(S.audienceMode=d),p&&(S.audioOnly=p),u.length){let R=u.map(M=>v.composeUserId(M));S.speakerIds=R.join(",")}return h&&(S.externalIds=h.map($.toSignaling).join(",")),S}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 r={joinLink:e};t&&(r.anonymName=t);let n=await this._call("vchat.getAnonymTokenByLink",r);return this._userId=Number(n.uid),n.token}async joinConversationByLink(e,t=!1,r,n){let s={joinLink:e,isVideo:t,protocolVersion:l.protocolVersion};return r?.length&&(s.observedIds=r.join(",")),l.anonymToken&&(s.anonymToken=l.anonymToken),n&&(s.payload=n),this._call("vchat.joinConversationByLink",s)}async getOkIdsByExternalIds(e){let t=[],r=[],n=new Map,s=Array.from(this._externalUidsCache.keys()),o=Array.from(this._externalUidsCache.values());for(let p of e){let u=$.toString(p),h=o.indexOf(u);h>-1?t.push(this.replaceByInitialIdIdIfExists(s[h])):(n.set(String(p.id),u),r.push({id:p.id,ok_anonym:p.type==="ANONYM"}))}return r.length&&(await this._call("vchat.getOkIdsByExternalIds",{externalIds:r})).ids.forEach((p,u)=>{let h=Number(p.ok_user_id),S=String(p.external_user_id.id);n.has(S)&&(this.cacheExternalId(h,$.fromString(n.get(S))),t.push(h))}),t}async getParticipantIdsByExternalIds(e){await this.getOkIdsByExternalIds(e);let t=new Map,r=Array.from(this._externalUidsCache.keys()),n=Array.from(this._externalUidsCache.values());for(let s of e){let o=$.toString(s),d=n.indexOf(o);if(d>-1){let p=v.composeParticipantId(this.replaceByInitialIdIdIfExists(r[d]),re.USER,s.deviceIdx);t.set(s,p)}}return t}async getExternalIdsByOkIds(e){let t=[],r=[];for(let s of e)if(this._externalUidsCache.has(s)){let o=this.getDecorativeIdByInitialId(s),d=this._externalUidsCache.get(o??s);t.push($.fromString(d))}else r.push(s);if(!r.length)return t;let n=await this._getExternalIdsByOkIds(r);return Array.from(n.values())}getCachedOkIdByExternalId(e){let t=Array.from(this._externalUidsCache.keys()),r=Array.from(this._externalUidsCache.values()),n=$.toString(e),s=r.indexOf(n);return s>-1?v.composeParticipantId(this.replaceByInitialIdIdIfExists(t[s]),re.USER,e.deviceIdx):s>-1?v.composeParticipantId(t[s],re.USER,e.deviceIdx):null}cacheExternalId(e,t){let r=v.extractOkId(e);this._externalUidsCache.set(r,$.toString(t))}mapDecorativeId(e,t){let r=v.extractOkId(e),n=v.extractOkId(t);this._decorativeIdToInitialId.set(r,n),this._initialIdToDecorativeId.set(n,r)}unmapDecorativeId(e){let t=v.extractOkId(e),r=this.getDecorativeIdByInitialId(t);r&&this._decorativeIdToInitialId.delete(r),this._initialIdToDecorativeId.delete(t)}getDecorativeIdByInitialId(e){let t=v.extractOkId(e);return this._initialIdToDecorativeId.get(t)}replaceByInitialIdIdIfExists(e){let t=v.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:D.HUNGUP};l.anonymToken&&(t.anonymToken=l.anonymToken),gi("vchat.hangupConversation",t)}sendUserFeedbackStats(e,t,r,n){let s={collector:"app.vchat.events.product",data:JSON.stringify({application:`${l.appName}:${l.sdkVersion}`,platform:l.platform,items:[{type:1,operation:E.USER_FEEDBACK_RECEIVED,timestamp:Date.now(),custom:{vcid:e,user_response:t,reason:r,group_call_users_count:n}}]})};gi("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(r=>this.getDecorativeIdByInitialId(r)??r);try{let r=await this._call("vchat.getExternalIdsByOkIds",{uids:e.join(",")}),n=(s,o)=>{for(let[d,p]of Object.entries(s)){let u=Number(d),h=$.fromId(p,o);t.set(u,h),this.cacheExternalId(u,h)}};r.external_ids&&n(r.external_ids,"USER"),r.anonym_ids&&n(r.anonym_ids,"ANONYM");for(let s of e){let o=Number(s);if(!t.has(o)){let d=$.fromId(String(o));t.set(o,d),this.cacheExternalId(o,d)}}return t}catch{return t}}async getServerTime(){return(await this._call("system.getInfo")).serverTime}};var Js=(e=>(e.KING="KING",e.PAWN="PAWN",e))(Js||{}),Ys=Js;var ta=(e=>(e.OFF="0",e.ON="1",e))(ta||{});var hn=class{constructor(i){this._queue=new Array(i).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(i){this._moveReadCursor&&(this._readCursor=this.nextCursor(this._readCursor)),this._queue[this._writeCursor]===null&&(this._left+=1),this._queue[this._writeCursor]=i,this._writeCursor=this.nextCursor(this._writeCursor),this._moveReadCursor=this._writeCursor===this._readCursor}nextCursor(i){return(i+1)%this._queue.length}next(){let i=this._queue[this._readCursor];return i&&(this._moveReadCursor=!1,this._queue[this._readCursor]=null,this._readCursor=this.nextCursor(this._readCursor),this._left-=1),i}};var mn=class{constructor(i,e,t,r=null){this._uuid=v.uuid(),this._apiKey=e,this._callToken=t,this._apiEnv=i,this._baseApiUrl=r}async authorize(){let i={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 un(this._baseApiUrl,this._apiEnv),t=await Ji("auth.anonymLogin",i,!0,e);return v.isObject(t)&&!("error_msg"in t)?(this._sessionKey=t.session_key,!0):!1}async hangupConversation(i){let e={conversationId:i,reason:D.HUNGUP,application_key:this._apiKey,session_key:this._sessionKey},t=await un(this._baseApiUrl,this._apiEnv);await Ji("vchat.hangupConversation",e,!0,t)}};var pe,Qi=null,Td={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},Rd={participantMarkerCompare:v.participantMarkerCompare};function yd(a){Qi=a}function Pd(a){l.videoEffects=a}function wd(a){l.audioEffects=a}function Md(a,i=null,e={},t=1){l.vmoji=a,l.vmojiOptions={protocolVersion:t,renderingOptions:e},i&&a.setSDK(i)}async function Ad(a){if(l.set(a),pe||(pe=new _i),ia.default.disableLog(!l.debug),c.toggle(l.debug),c.log(`Calls SDK ${l.sdkVersion}`,a),await y.init(),!y.isBrowserSupported())throw new G(ne.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:",`${a.simulcast} => ${l.simulcast}`)}async function Dd(a,i=[oe.AUDIO],e="",t=!1,r=!1,n,s){let o=[];return Array.isArray(a)?o=a.length?a:[]:a&&(o=[a]),Qs([],dt.USER,i,e,t,r,n,o,s)}async function Qs(a,i=dt.USER,e,t="",r=!1,n=!1,s,o,d){if(U.current())throw c.error("There is already active call"),new G(D.FAILED);return new U(pe,Qi).onStart({opponentIds:a,opponentType:i,mediaOptions:e,payload:t,joiningAllowed:r,requireAuthToJoin:n,onlyAdminCanShareMovie:s,externalIds:o,onFastStart:d})}async function kd(a,i){return Xs(a,re.USER,void 0,i)}async function Xs(a,i=re.USER,e,t){if(a===U.id())throw new Error("Push has already been processed");return new U(pe,Qi).onPush(a,i,e,t)}async function xd(a,i){return a&&(l.authToken=a),i!==void 0&&l.apiBaseUrl!==i&&(l.apiBaseUrl=i,qs()),pe.authorize()}async function Od(a=[oe.AUDIO]){return it().accept(a)}async function Nd(){let a=U.current();if(a)return a.decline()}async function Ld(a,i=[oe.AUDIO]){return Zs(a,i)}async function Zs(a,i,e){if(U.current())throw c.error("There is already active call"),new G(D.FAILED);return new U(pe,Qi).onJoin({conversationId:a,mediaOptions:i,chatId:e})}async function Ud(a,i=[oe.AUDIO],e,t,r){if(U.current())throw c.error("There is already active call"),new G(D.FAILED);return e&&(l.anonymToken=e),new U(pe,Qi).onJoin({joinLink:a,mediaOptions:i,observedIds:t,payload:r})}async function Bd(){let a=U.current();if(a)return a.hangup();U.hangupAfterInit()}async function Fd(a,i){let e=Array.isArray(a)?a:[a],t=U.current();t&&await t.addParticipant(e,i)}async function Vd(a,i){let e=U.current();if(e){let t=a.map(r=>v.composeUserId(r));await e.addParticipantLegacy(t,i)}}async function jd(a,i=!1){let e=await pe.getOkIdsByExternalIds([a]);return eo(e[0],i)}async function eo(a,i=!1){let e=U.current();if(e)try{await e.removeParticipant(v.composeUserId(a),i)}catch(t){c.warn(`Failed to remove participant ${a}. Perhaps he is no longer on the call. ${t}`)}}async function Wd(a,i){let e=U.current();if(a==="videoinput"&&vt.contains(i))return l.videoFacingMode=i,e?(y.isMobile()&&e.stopVideoTrack(),e.changeDevice(a)):void 0;if(!await y._saveDeviceId(a,i))throw new Error(`Device not found: ${i}`);if(e)return e.changeDevice(a)}async function Gd(a){let i=typeof a=="object"?{...a,fastScreenSharing:a.captureScreen&&a.fastScreenSharing,captureAudio:a.captureScreen&&a.captureAudio&&l.audioShare}:{captureScreen:a,fastScreenSharing:!1,captureAudio:!1},e=U.current();return e?e.toggleScreenCapturing(i):Promise.reject()}function Hd(a){let i=U.current();i&&i.toggleAnimojiCapturing(a)}async function qd(a,i=!1){let e=U.current();e&&await e.setVideoStream(a,i)}async function Kd(a){let i=U.current();i&&await i.toggleLocalVideo(a)}async function $d(a){let i=U.current();i&&await i.toggleLocalAudio(a)}async function zd(a){let i=U.current();if(i)return i.setLocalResolution(a)}async function Jd(a){let i=U.current();i&&await i.changePriorities(a)}async function Yd(a,i){let e=U.current();if(e){let t;if(i){let[r]=await pe.getOkIdsByExternalIds([i]);t=v.composeParticipantId(r,re.USER,i.deviceIdx)}await e.changeParticipantState(a,t)}}async function Qd(){let a=U.current();a&&await a.putHandsDown()}async function Xd(a){let i=U.current();i&&await i.updateDisplayLayout(a)}async function Zd(a,i,e=!1){let t=await pe.getOkIdsByExternalIds([a]);return to(t[0],$.getDeviceIdx(a),i,e)}async function to(a,i,e,t=!1){let r=U.current();r&&await r.grantRoles(v.composeParticipantId(a,re.USER,i),e,t)}async function el({externalId:a=null,muteStates:i,requestedMedia:e=[],roomId:t=null}){let r=null;return a&&(r=(await pe.getOkIdsByExternalIds([a]))[0]),io({uid:r,muteStates:i,requestedMedia:e,deviceIdx:$.getDeviceIdx(a),roomId:t})}async function io({uid:a=null,muteStates:i,requestedMedia:e=[],deviceIdx:t=0,roomId:r=null}){let n=U.current();if(n){let s=a?v.composeParticipantId(a,re.USER,t):null;await n.muteParticipant(s,i,e,r)}}async function tl(a,i=!1,e=null){let t=await pe.getOkIdsByExternalIds([a]);return ro(t[0],i,$.getDeviceIdx(a),e)}async function ro(a,i=!1,e=0,t=null){let r=U.current();r&&await r.pinParticipant(v.composeParticipantId(a,re.USER,e),i,t)}async function il(a){let i=U.current();i&&await i.updateMediaModifiers(a)}async function rl(a){let i=U.current();i&&await i.enableVideoSuspend(a)}async function nl(a){let i=U.current();i&&await i.enableVideoSuspendSuggest(a)}async function al(a){let i=U.current();i&&await i.changeOptions(a)}async function sl(a,i=null){let e=null;return i&&(e=(await pe.getOkIdsByExternalIds([i]))[0]),no(a,e)}async function no(a,i=null){let e=U.current();if(e){let t=i?v.composeUserId(i):null;await e.chatMessage(a,t)}}async function ol(a=10){let i=U.current();if(i)return i.chatHistory(a)}async function cl(a,i=null){let e=null;return i&&(e=(await pe.getOkIdsByExternalIds([i]))[0]),ao(a,e,$.getDeviceIdx(i))}async function ao(a,i=null,e=0){let t=U.current();if(t){let r=i?v.composeParticipantId(i,re.USER,e):null;await t.customData(a,r)}}async function dl(a="",i=!1,{onlyAdminCanShareMovie:e=!1}={}){return(await pe.createConversation(v.uuid(),a,i,{onlyAdminCanShareMovie:e})).join_link}async function ll(a="",i=!1,{onlyAdminCanShareMovie:e=!1,audioOnly:t=!1}={},r){let n=$.fromIds(r),s=await pe.getOkIdsByExternalIds(n);return(await pe.createConversation(v.uuid(),a,i,{onlyAdminCanShareMovie:e,audienceMode:!0,audioOnly:t},s)).join_link}async function pl(){let a=U.current();return a?a.createJoinLink():Promise.reject()}async function ul(){let a=U.current();return a?a.removeJoinLink():Promise.reject()}async function hl(a,i){return pe.getAnonymTokenByLink(a,i)}function ml(a){let i=U.current();i&&i.setVolume(a)}function fl(a){l.forceRelayPolicy=a}async function gl(a=!1,i=null,e=null,t="DIRECT_LINK",r=null,n=null){let s=U.current();return s?s.startStream(a,i,e,t,r,n):Promise.reject()}async function _l(a=null){let i=U.current();return i?i.stopStream(a):Promise.reject()}async function Sl(a=null){let i=U.current();return i?i.publishStream(a):Promise.reject()}async function vl(a,i,e=!1,t=null){let r=U.current();if(!r)return Promise.reject();let n,s,o=[];if(i?.length&&o.push(...i),a&&o.push(a),o.length){let d=await pe.getParticipantIdsByExternalIds(o);a&&(n=d.get(a),d.delete(a)),s=Array.from(d.values())}return r.recordSetConf(n,s,e,t)}async function Il(){let a=U.current();return a?a.getStreamInfo():Promise.reject()}async function El(a){let i=U.current();return i?i.addMovie(a):Promise.reject()}async function bl(a){let i=U.current();return i?i.updateMovie(a):Promise.reject()}async function Cl(a){let i=U.current();return i?i.removeMovie(a):Promise.reject()}async function Tl(a,i){let e=U.current();if(e){let t=[];for(let r of a){let n,s;r.addParticipantIds&&(n=(await pe.getOkIdsByExternalIds(r.addParticipantIds)).map(o=>v.composeUserId(o))),r.removeParticipantIds&&(s=(await pe.getOkIdsByExternalIds(r.removeParticipantIds)).map(o=>v.composeUserId(o))),t.push({id:r.id,name:r.name,participantCount:r.participantCount,addParticipantIds:n,removeParticipantIds:s,countdownSec:r.countdownSec})}return e.updateRooms(t,i)}return Promise.reject()}async function Rl(a,i){let e=U.current();return e?e.activateRooms(a,i):Promise.reject()}async function yl(a=null,i=null){let e=U.current();if(!e)return Promise.reject();let t;if(i){let r=await pe.getOkIdsByExternalIds([i]),n=$.getDeviceIdx(i);t=v.composeParticipantId(r[0],re.USER,n)}return e.switchRoom(a,t)}async function Pl(a){let i=U.current();return i?i.removeRooms(a):Promise.reject()}function wl(a){l.statisticsInterval=a;let i=U.current();if(i)return i.updateStatisticsInterval()}function Ml(a){ia.default.disableLog(!a),c.toggle(a)}function Al(a,...i){l.debugLog&&c.send(a,"[external]",...i)}async function Dl(){let a=Be.conversationId;if(!a)throw c.error("[uploadDebugLogs]","No conversation id found"),new Error("No conversation id found");let i=Be.collectLogs();if(i.length===0)throw c.error("[uploadDebugLogs]","No logs found"),new Error("No logs found");let e=Be.startTime,t=Be.endTime;try{return pe?.uploadDebugLogs(a,e,t,JSON.stringify(i))}catch(r){throw c.error("[uploadDebugLogs]","Error while uploading logs",r),new Error("Error while uploading logs",{cause:r})}}async function kl(a){let i=U.current();if(i)return i.videoEffect(a)}async function xl(a,i){let e=U.current();if(e)return e.audioEffect(a.length>0?a:null,i)}async function Ol(a){let i=U.current();i&&await i.setAudioStream(a)}async function Nl(a,i=null,e=null){let t=U.current();if(!t)return;let r=e??i?.id,n=null;if(i){let o=(await pe.getOkIdsByExternalIds([i]))[0];if(!o)throw new Error("Could not get user id to set animoji svg");n=v.composeParticipantId(o,re.USER,$.getDeviceIdx(i))}t.setAnimojiSvg(a,n,r)}function Ll(a){let i=U.current();i&&i.setAnimojiFill(a)}async function Ul(a=null,i,e=!1){return it().getWaitingHall(a,i,e)}async function Bl(){return it().getAudienceModeHands()}async function Fl(a,i=!1){let e=it(),t;if(a){let[r]=await pe.getOkIdsByExternalIds([a]);t=v.composeUserId(r)}return e.promoteParticipant(t,i)}async function Vl(a=!1){return it().requestPromotion(a)}async function jl(a=!1){return it().acceptPromotion(a)}async function Wl(a){return it().getParticipantListChunk(a)}async function Gl(a){return it().getParticipants(a)}async function Hl(a){return it().feedback(a)}function ql(a,i,e){return it().userFeedbackStats(a,i,e)}function Kl(a,i={},e=!1){let t=U.current();t&&t.sendClientEvent(a,i,e)}async function $l(a,i){return it().enableFeatureForRoles(a,i)}function it(){let a=U.current();if(!a)throw new Error("Conversation not found");return a}async function zl(a){await pe.removeHistoryRecords(a)}async function Jl(a){let i=U.current();i&&await i.startAsr(a)}async function Yl(a){let i=U.current();i&&await i.stopAsr(a)}async function Ql(a){let i=U.current();i&&await i.requestAsr(a)}async function Xl(a){let i=U.current();return i?i.startUrlSharing(a):Promise.reject()}async function Zl(){let a=U.current();return a?a.stopUrlSharing():Promise.reject()}function ep(){return l.sdkVersion}