@telnyx/webrtc 2.25.19 → 2.25.20

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/lib/bundle.js CHANGED
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).TelnyxWebRTC={})}(this,(function(e){"use strict";function t(e,t){var i={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(i[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(n=Object.getOwnPropertySymbols(e);s<n.length;s++)t.indexOf(n[s])<0&&Object.prototype.propertyIsEnumerable.call(e,n[s])&&(i[n[s]]=e[n[s]])}return i}function i(e,t,i,n){return new(i||(i=Promise))((function(s,o){function r(e){try{c(n.next(e))}catch(e){o(e)}}function a(e){try{c(n.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(r,a)}c((n=n.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;var n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),s=new Uint8Array(16);function o(){if(!n)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(s)}for(var r=[],a=0;a<256;++a)r[a]=(a+256).toString(16).substr(1);function c(e,t,i){var n=t&&i||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var s=(e=e||{}).random||(e.rng||o)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t)for(var a=0;a<16;++a)t[n+a]=s[a];return t||function(e,t){var i=t||0,n=r;return[n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]]].join("")}(s)}const d="wss://rtc.telnyx.com",l=1006,u={urls:"stun:stun.l.google.com:19302"},h=[{urls:"stun:stun.telnyx.com:3478"},u,{urls:"turn:turn.telnyx.com:3478?transport=udp",username:"testuser",credential:"testpassword"},{urls:"turn:turn.telnyx.com:3478?transport=tcp",username:"testuser",credential:"testpassword"}],p=[{urls:"stun:stundev.telnyx.com:3478"},u,{urls:"turn:turndev.telnyx.com:3478?transport=udp",username:"testuser",credential:"testpassword"},{urls:"turn:turndev.telnyx.com:3478?transport=tcp",username:"testuser",credential:"testpassword"}];var g;(g=e.SwEvent||(e.SwEvent={})).SocketOpen="telnyx.socket.open",g.SocketClose="telnyx.socket.close",g.SocketError="telnyx.socket.error",g.SocketMessage="telnyx.socket.message",g.SpeedTest="telnyx.internal.speedtest",g.Ready="telnyx.ready",g.Error="telnyx.error",g.Notification="telnyx.notification",g.StatsFrame="telnyx.stats.frame",g.StatsReport="telnyx.stats.report",g.Messages="telnyx.messages",g.Calls="telnyx.calls",g.MediaError="telnyx.rtc.mediaError",g.PeerConnectionFailureError="telnyx.rtc.peerConnectionFailureError",g.PeerConnectionSignalingStateClosed="telnyx.rtc.peerConnectionSignalingStateClosed";var v="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function f(e,t){return e(t={exports:{}},t.exports),t.exports}var m=f((function(e){var t,i;t=v,i=function(){var e=function(){},t="undefined",i=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"];function s(e,t){var i=e[t];if("function"==typeof i.bind)return i.bind(e);try{return Function.prototype.bind.call(i,e)}catch(t){return function(){return Function.prototype.apply.apply(i,[e,arguments])}}}function o(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function r(t,i){for(var s=0;s<n.length;s++){var o=n[s];this[o]=s<t?e:this.methodFactory(o,t,i)}this.log=this.debug}function a(e,i,n){return function(){typeof console!==t&&(r.call(this,i,n),this[e].apply(this,arguments))}}function c(n,r,c){return function(n){return"debug"===n&&(n="log"),typeof console!==t&&("trace"===n&&i?o:void 0!==console[n]?s(console,n):void 0!==console.log?s(console,"log"):e)}(n)||a.apply(this,arguments)}function d(e,i,s){var o,a=this;i=null==i?"WARN":i;var d="loglevel";function l(){var e;if(typeof window!==t&&d){try{e=window.localStorage[d]}catch(e){}if(typeof e===t)try{var i=window.document.cookie,n=i.indexOf(encodeURIComponent(d)+"=");-1!==n&&(e=/^([^;]+)/.exec(i.slice(n))[1])}catch(e){}return void 0===a.levels[e]&&(e=void 0),e}}"string"==typeof e?d+=":"+e:"symbol"==typeof e&&(d=void 0),a.name=e,a.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},a.methodFactory=s||c,a.getLevel=function(){return o},a.setLevel=function(i,s){if("string"==typeof i&&void 0!==a.levels[i.toUpperCase()]&&(i=a.levels[i.toUpperCase()]),!("number"==typeof i&&i>=0&&i<=a.levels.SILENT))throw"log.setLevel() called with invalid level: "+i;if(o=i,!1!==s&&function(e){var i=(n[e]||"silent").toUpperCase();if(typeof window!==t&&d){try{return void(window.localStorage[d]=i)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"="+i+";"}catch(e){}}}(i),r.call(a,i,e),typeof console===t&&i<a.levels.SILENT)return"No console available for logging"},a.setDefaultLevel=function(e){i=e,l()||a.setLevel(e,!1)},a.resetLevel=function(){a.setLevel(i,!1),function(){if(typeof window!==t&&d){try{return void window.localStorage.removeItem(d)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch(e){}}}()},a.enableAll=function(e){a.setLevel(a.levels.TRACE,e)},a.disableAll=function(e){a.setLevel(a.levels.SILENT,e)};var u=l();null==u&&(u=i),a.setLevel(u,!1)}var l=new d,u={};l.getLogger=function(e){if("symbol"!=typeof e&&"string"!=typeof e||""===e)throw new TypeError("You must supply a name when creating a logger.");var t=u[e];return t||(t=u[e]=new d(e,l.getLevel(),l.methodFactory)),t};var h=typeof window!==t?window.log:void 0;return l.noConflict=function(){return typeof window!==t&&window.log===l&&(window.log=h),l},l.getLoggers=function(){return u},l.default=l,l},e.exports?e.exports=i():t.log=i()}));const b={debug:0,info:1,warn:2,error:3};class y{constructor(e={}){var t,i,n;this.buffer=[],this.isCapturing=!1,this.options={enabled:null!==(t=e.enabled)&&void 0!==t&&t,level:null!==(i=e.level)&&void 0!==i?i:"debug",maxEntries:null!==(n=e.maxEntries)&&void 0!==n?n:1e3}}start(){this.options.enabled&&(this.isCapturing=!0,this.buffer=[])}stop(){this.isCapturing=!1}addEntry(e,t,i){if(!this.isCapturing||!this.options.enabled)return;if(b[e]<b[this.options.level])return;const n=Object.assign({timestamp:(new Date).toISOString(),level:e,message:t},i&&Object.keys(i).length>0?{context:i}:{});this.buffer.push(n),this.buffer.length>this.options.maxEntries&&this.buffer.shift()}getLogs(){return[...this.buffer]}getLogCount(){return this.buffer.length}drain(){const e=this.buffer;return this.buffer=[],e}clear(){this.buffer=[]}isActive(){return this.isCapturing}isEnabled(){return this.options.enabled}}let _=null;function S(){return _}function w(e){_=e}const C=m.getLogger("telnyx"),I={trace:0,debug:1,info:2,warn:3,error:4};let k=I.info;const E=C.methodFactory;C.methodFactory=(e,t,i)=>{const n=E(e,t,i);return function(...t){if(I[e]>=k){const e=[(new Date).toISOString().replace("T"," ").replace("Z",""),"-"];for(const i of t)e.push(i);n(...e)}const i=S();if(null==i?void 0:i.isActive()){const[n,...s]=t,o="string"==typeof n?n:JSON.stringify(n);let r;s.length>0&&(r=1===s.length&&"object"==typeof s[0]&&null!==s[0]?s[0]:{args:s}),i.addEntry(e,o,r)}}},C.setLevel("debug",!1);const T=e=>{const[t,i,n,s,o,r]=e;let a={};try{a=JSON.parse(o.replace(/ID"/g,'Id"'))}catch(e){C.warn("Verto LA invalid media JSON string:",o)}return{participantId:Number(t),participantNumber:i,participantName:n,codec:s,media:a,participantData:r}},R=e=>{if("string"!=typeof e)return e;try{return JSON.parse(e)}catch(t){return e}},x=e=>e instanceof Function||"function"==typeof e,O=e=>"object"==typeof document&&"getElementById"in document?"string"==typeof e?document.getElementById(e)||null:"function"==typeof e?e():e instanceof HTMLMediaElement?e:null:null,A=/^(ws|wss):\/\//,L=(e,t=null)=>{const{result:i={},error:n}=e;if(n)return{error:n};const{result:s=null}=i;if(null===s)return null!==t&&(i.node_id=t),{result:i};const{code:o=null,node_id:r=null,result:a=null}=s;return o&&"200"!==o?{error:s}:a?L(a,r):{result:s}},P=(e,t)=>Math.floor(Math.random()*(t-e+1)+e),N=({login:e,passwd:t,password:i,login_token:n})=>Boolean(e&&(t||i)||n),D=({anonymous_login:e})=>Boolean(e)&&Boolean(e.target_id)&&Boolean(e.target_type),M=e=>{var t,i,n,s,o,r;let a="",c="";(null===(i=null===(t=null==e?void 0:e.result)||void 0===t?void 0:t.params)||void 0===i?void 0:i.state)&&(a=null===(s=null===(n=null==e?void 0:e.result)||void 0===n?void 0:n.params)||void 0===s?void 0:s.state),(null===(o=null==e?void 0:e.params)||void 0===o?void 0:o.state)&&(c=null===(r=null==e?void 0:e.params)||void 0===r?void 0:r.state);return a||c};function j({debounceTime:e}){let t,i;return{promise:new Promise(((n,s)=>{t=e?U(n,e):n,i=s})),resolve:t,reject:i}}const U=(e,t)=>{let i;return(...n)=>{clearTimeout(i),i=window.setTimeout((()=>{e(...n)}),t)}},$="telnyx-voice-sdk-id";function F(){return sessionStorage.getItem($)}var B,G,V;"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{sessionStorage.removeItem($)})),function(e){e.Offer="offer",e.Answer="answer"}(B||(B={})),function(e){e.Inbound="inbound",e.Outbound="outbound"}(G||(G={})),function(e){e.Invite="telnyx_rtc.invite",e.Attach="telnyx_rtc.attach",e.Answer="telnyx_rtc.answer",e.Info="telnyx_rtc.info",e.Candidate="telnyx_rtc.candidate",e.EndOfCandidates="telnyx_rtc.endOfCandidates",e.Display="telnyx_rtc.display",e.Media="telnyx_rtc.media",e.Event="telnyx_rtc.event",e.Bye="telnyx_rtc.bye",e.Punt="telnyx_rtc.punt",e.Broadcast="telnyx_rtc.broadcast",e.Subscribe="telnyx_rtc.subscribe",e.Unsubscribe="telnyx_rtc.unsubscribe",e.ClientReady="telnyx_rtc.clientReady",e.Modify="telnyx_rtc.modify",e.Ringing="telnyx_rtc.ringing",e.GatewayState="telnyx_rtc.gatewayState",e.Ping="telnyx_rtc.ping",e.Pong="telnyx_rtc.pong"}(V||(V={}));const H={generic:"event",[V.Display]:"participantData",[V.Attach]:"participantData",conferenceUpdate:"conferenceUpdate",callUpdate:"callUpdate",vertoClientReady:"vertoClientReady",userMediaError:"userMediaError",peerConnectionFailureError:"peerConnectionFailureError",signalingStateClosed:"signalingStateClosed"},q={invalidCredentialsOptions:"InvalidCredentialsOptions"},W={destinationNumber:"",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:!0,useStereo:!1,debug:!1,debugOutput:"socket",attach:!1,screenShare:!1,userVariables:{},mediaSettings:{useSdpASBandwidthKbps:!1,sdpASBandwidthKbps:0},mutedMicOnStart:!1,prefetchIceCandidates:!0};var J,K,z,Y,Q;!function(e){e[e.New=0]="New",e[e.Requesting=1]="Requesting",e[e.Trying=2]="Trying",e[e.Recovering=3]="Recovering",e[e.Ringing=4]="Ringing",e[e.Answering=5]="Answering",e[e.Early=6]="Early",e[e.Active=7]="Active",e[e.Held=8]="Held",e[e.Hangup=9]="Hangup",e[e.Destroy=10]="Destroy",e[e.Purge=11]="Purge"}(J||(J={})),function(e){e.Participant="participant",e.Moderator="moderator"}(K||(K={})),function(e){e.Join="join",e.Leave="leave",e.Bootstrap="bootstrap",e.Add="add",e.Modify="modify",e.Delete="delete",e.Clear="clear",e.ChatMessage="chatMessage",e.LayerInfo="layerInfo",e.LogoInfo="logoInfo",e.LayoutInfo="layoutInfo",e.LayoutList="layoutList",e.ModCmdResponse="modCommandResponse"}(z||(z={})),function(e){e.Video="videoinput",e.AudioIn="audioinput",e.AudioOut="audiooutput"}(Y||(Y={})),function(e){e.REGED="REGED",e.UNREGED="UNREGED",e.NOREG="NOREG",e.FAILED="FAILED",e.FAIL_WAIT="FAIL_WAIT",e.REGISTER="REGISTER",e.TRYING="TRYING",e.EXPIRED="EXPIRED",e.UNREGISTER="UNREGISTER"}(Q||(Q={}));const X="GLOBAL",Z={},ee=(e,t)=>`${e}|${t}`,te=(e,t=X)=>ee(e,t)in Z,ie=(e,t,i=X)=>{const n=ee(e,i);n in Z||(Z[n]=[]),Z[n].push(t)},ne=(e,t,i=X)=>{const n=function(s){se(e,n,i),t(s)};return n.prototype.targetRef=t,ie(e,n,i)},se=(e,t,i=X)=>{if(!te(e,i))return!1;const n=ee(e,i);if(x(t)){for(let e=Z[n].length-1;e>=0;e--){const i=Z[n][e];(t===i||i.prototype&&t===i.prototype.targetRef)&&Z[n].splice(e,1)}}else Z[n]=[];return 0===Z[n].length&&delete Z[n],!0},oe=(e,t,i=X,n=!0)=>{const s=n&&i!==X;if(!te(e,i))return s&&oe(e,t),!1;const o=ee(e,i),r=Z[o].length;if(!r)return s&&oe(e,t),!1;for(let e=r-1;e>=0;e--)Z[o][e](t);return s&&oe(e,t),!0},re=e=>{const t=ee(e,"");Object.keys(Z).filter((e=>0===e.indexOf(t))).forEach((e=>delete Z[e]))};let ae="undefined"!=typeof WebSocket?WebSocket:null;const ce=0,de=1,le=2,ue=3;class he{constructor(e){this.session=e,this.previousGatewayState="",this._wsClient=null,this._host=d,this._timers={},this._useCanaryRtcServer=!1,this._hasCanaryBeenUsed=!1,this._safetyTimeoutId=null,this.upDur=null,this.downDur=null;const{host:t,env:i,region:n,useCanaryRtcServer:s}=e.options;i&&(this._host="development"===i?"wss://rtcdev.telnyx.com":d),t&&(this._host=(e=>`${A.test(e)?"":"wss://"}${e}`)(t)),n&&(this._host=this._host.replace(/rtc(dev)?/,`${n}.rtc$1`)),s&&(this._useCanaryRtcServer=!0)}get connected(){return!!this._wsClient&&this._wsClient.readyState===de}get connecting(){return!!this._wsClient&&this._wsClient.readyState===ce}get closing(){return!!this._wsClient&&this._wsClient.readyState===le}get closed(){return!!this._wsClient&&this._wsClient.readyState===ue}get isAlive(){return this.connecting||this.connected}get isDead(){return this.closing||this.closed}get host(){return this._host}connect(){const t=new URL(this._host);let i=F();this.session.options.rtcIp&&this.session.options.rtcPort&&(i=null,this._useCanaryRtcServer=!1,t.searchParams.set("rtc_ip",this.session.options.rtcIp),t.searchParams.set("rtc_port",this.session.options.rtcPort.toString())),i&&t.searchParams.set("voice_sdk_id",i),this._useCanaryRtcServer&&(t.searchParams.set("canary","true"),i&&!this._hasCanaryBeenUsed&&(t.searchParams.delete("voice_sdk_id"),C.debug("first canary connection. Refreshing voice_sdk_id")),this._hasCanaryBeenUsed=!0);try{this._wsClient=new ae(t.toString()),this._registerSocketEvents(this._wsClient)}catch(t){const i=t instanceof Error?t:new Error(`Failed to create WebSocket: ${String(t)}`);oe(e.SwEvent.Error,{error:i},this.session.uuid),C.error("WebSocket connection failed:",i)}}sendRawText(e){var t;null===(t=this._wsClient)||void 0===t||t.send(e)}send(e){var t;const{request:i}=e,n=new Promise(((e,t)=>{if(i.hasOwnProperty("result"))return e();ne(i.id,(i=>{const{result:n,error:s}=L(i);return s?t(s):e(n)}))}));return C.debug("SEND: \n",JSON.stringify(i,null,2),"\n"),null===(t=this._wsClient)||void 0===t||t.send(JSON.stringify(i)),n}close(){if(!this._wsClient||this.closing)return;const e=this._wsClient;x(this._wsClient._beginClose)?this._wsClient._beginClose():this._wsClient.close(),this._safetyTimeoutId||(this._safetyTimeoutId=setTimeout((()=>this._handleCloseTimeout(e)),5e3))}_registerSocketEvents(t){t.onopen=t=>oe(e.SwEvent.SocketOpen,t,this.session.uuid),t.onclose=i=>(this._clearSafetyTimeout(),this._safetyCleanupSocket(t,"close"),oe(e.SwEvent.SocketClose,i,this.session.uuid)),t.onerror=i=>(this._clearSafetyTimeout(),this._safetyCleanupSocket(t,"error"),oe(e.SwEvent.SocketError,{error:i,sessionId:this.session.sessionid},this.session.uuid)),t.onmessage=t=>{var i,n;const s=R(t.data);var o;if("string"!=typeof s){if(s.voice_sdk_id&&(o=s.voice_sdk_id,sessionStorage.setItem($,o)),this._unsetTimer(s.id),C.debug("RECV: \n",JSON.stringify(s,null,2),"\n"),Q[`${null===(n=null===(i=null==s?void 0:s.result)||void 0===i?void 0:i.params)||void 0===n?void 0:n.state}`]||!oe(s.id,s)){const t=M(s);oe(e.SwEvent.SocketMessage,s,this.session.uuid),Boolean(t)&&(this.previousGatewayState=t)}}else this._handleStringResponse(s)}}_deregisterSocketEvents(e){e.onopen=null,e.onclose=null,e.onerror=null,e.onmessage=null}_handleCloseTimeout(t){this._safetyTimeoutId=null,t&&t.readyState!==ue?(C.warn("Socket stuck in CLOSING after 5s — forcefully cleaning up"),this._deregisterSocketEvents(t),this._safetyCleanupSocket(t,"timeout"),this._wsClient&&this._wsClient!==t||oe(e.SwEvent.SocketClose,{code:l,reason:"STUCK_WS_TIMEOUT: Socket got stuck in CLOSING state and was forcefully cleaned up by safety timeout",wasClean:!1},this.session.uuid)):C.warn("Safety timeout fired but socket is already closed or cleaned up")}_clearSafetyTimeout(){this._safetyTimeoutId&&(C.debug("Clearing safety timeout"),clearTimeout(this._safetyTimeoutId),this._safetyTimeoutId=null)}_safetyCleanupSocket(e,t){this._wsClient===e?(C.debug(`Nulling socket reference (reason: ${t})`),this._wsClient=null):C.debug(`Skipping socket cleanup - old socket already replaced (reason: ${t})`)}_unsetTimer(e){clearTimeout(this._timers[e]),delete this._timers[e]}_handleStringResponse(t){if(/^#SP/.test(t))switch(t[3]){case"U":this.upDur=parseInt(t.substring(4));break;case"D":this.downDur=parseInt(t.substring(4)),oe(e.SwEvent.SpeedTest,{upDur:this.upDur,downDur:this.downDur},this.session.uuid)}else C.warn("Unknown message from socket",t)}}class pe{buildRequest(e){this.request=Object.assign({jsonrpc:"2.0",id:c()},e)}}const ge={id:"callID",destinationNumber:"destination_number",remoteCallerName:"remote_caller_id_name",remoteCallerNumber:"remote_caller_id_number",callerName:"caller_id_name",callerNumber:"caller_id_number",customHeaders:"custom_headers"};class ve extends pe{constructor(e={}){if(super(),e.hasOwnProperty("dialogParams")){const i=t(e.dialogParams,["remoteSdp","localStream","remoteStream","localElement","remoteElement","onNotification","camId","micId","speakerId"]);for(const e in ge)e&&i.hasOwnProperty(e)&&(i[ge[e]]=i[e],delete i[e]);e.dialogParams=i}this.buildRequest({method:this.toString(),params:e})}}class fe extends ve{constructor(e){super(),this.method=V.GatewayState;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}class me{constructor(e){this.pendingRequestId=null,this.onSocketMessage=e=>i(this,void 0,void 0,(function*(){e.id===this.pendingRequestId&&this.gatewayStateTask.resolve(M(e))})),this.getIsRegistered=()=>i(this,void 0,void 0,(function*(){const e=new fe(F());this.pendingRequestId=e.request.id,this.gatewayStateTask=j({}),this.session.execute(e);const t=yield this.gatewayStateTask.promise;return!!t&&[Q.REGISTER,Q.REGED].includes(t)})),this.session=e,this.gatewayStateTask=j({}),this.session.on("telnyx.socket.message",this.onSocketMessage)}}class be extends ve{constructor(e){super(),this.method=V.Ping;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}var ye="2.25.19",_e=ye;class Se extends ve{constructor(e,t,i,n,s={},o){super(),this.method="login";const r={login:e,passwd:t,login_token:i,userVariables:s,reconnection:o,loginParams:{},"User-Agent":{sdkVersion:_e,data:navigator.userAgent}};n&&(r.sessid=n),this.buildRequest({method:this.method,params:r})}}class we extends ve{constructor(e,t){super(),this.buildRequest({id:e,result:{method:t}})}}class Ce extends ve{toString(){return V.Invite}}class Ie extends ve{toString(){return V.Answer}}class ke extends ve{toString(){return V.Attach}}class Ee extends ve{toString(){return V.Bye}}class Te extends ve{toString(){return V.Candidate}}class Re extends ve{toString(){return V.EndOfCandidates}}class xe extends ve{toString(){return V.Modify}}class Oe extends ve{toString(){return V.Info}}class Ae extends ve{toString(){return V.Broadcast}}class Le extends ve{toString(){return V.Subscribe}}class Pe extends ve{toString(){return V.Unsubscribe}}class Ne extends ve{constructor(e){super(),this.method="anonymous_login";const{target_type:t,target_id:i,target_version_id:n,userVariables:s,sessionId:o,reconnection:r}=e,a={target_type:t,target_id:i,userVariables:s,reconnection:r,"User-Agent":{sdkVersion:_e,data:navigator.userAgent}};o&&(a.sessid=o),n&&(a.target_version_id=n),this.buildRequest({method:this.method,params:a})}}class De{constructor(e){if(this.options=e,this.uuid=c(),this.sessionid="",this.subscriptions={},this.signature=null,this.relayProtocol=null,this.contexts=[],this.timeoutErrorCode=-32e3,this.invalidMethodErrorCode=-32601,this.authenticationRequiredErrorCode=-32e3,this.callReportId=null,this.connection=null,this._jwtAuth=!1,this._autoReconnect=!0,this._idle=!1,this._executeQueue=[],!this.validateOptions())throw new Error("Invalid init options");var t,i;t=e.debug?"debug":"info",k=null!==(i=I[t])&&void 0!==i?i:I.info,this._onSocketOpen=this._onSocketOpen.bind(this),this.onNetworkClose=this.onNetworkClose.bind(this),this._onSocketMessage=this._onSocketMessage.bind(this),this._handleLoginError=this._handleLoginError.bind(this),this._attachListeners(),this.connection=new he(this),this.registerAgent=new me(this)}get __logger(){return C}get connected(){return this.connection&&this.connection.connected}getIsRegistered(){return i(this,void 0,void 0,(function*(){return this.registerAgent.getIsRegistered()}))}get reconnectDelay(){return 1e3*P(2,6)}execute(e){return this._idle?new Promise((t=>this._executeQueue.push({resolve:t,msg:e}))):this.connected?this.connection.send(e):new Promise((t=>{this._executeQueue.push({resolve:t,msg:e}),C.debug("Calling connect from execute since not currently connected."),this.connect()}))}executeRaw(e){this._idle?this._executeQueue.push({msg:e}):this.connection.sendRawText(e)}validateOptions(){return N(this.options)||D(this.options)}broadcast(e){}disconnect(){return i(this,void 0,void 0,(function*(){clearTimeout(this._reconnectTimeout),this.subscriptions={},this._autoReconnect=!1,this.relayProtocol=null,this._closeConnection(),yield sessionStorage.removeItem(this.signature),this._executeQueue=[],this._detachListeners(),C.debug("Session disconnected. Cleaned up all listeners and subscriptions, closed connection, disabled auto-reconnect.")}))}on(e,t){return ie(e,t,this.uuid),this}off(e,t){return se(e,t,this.uuid),this}connect(){return i(this,void 0,void 0,(function*(){this.connection||(C.debug("No existing connection found, creating a new one."),this.connection=new he(this)),this._attachListeners(),this._autoReconnect=!0,this.connection.isAlive||(C.debug("Initiating connection to the server..."),this.connection.connect()),C.debug("Connect method called. Connection initiated.")}))}_handleLoginError(t){oe(e.SwEvent.Error,{error:t,sessionId:this.sessionid},this.uuid)}login({creds:t,onSuccess:n,onError:s}={}){return i(this,void 0,void 0,(function*(){if(this.connection&&this.connection.isAlive){if(t&&(void 0!==t.login&&(this.options.login=t.login),void 0!==t.password&&(this.options.password=t.password),void 0!==t.passwd&&(this.options.passwd=t.passwd),void 0!==t.login_token&&(this.options.login_token=t.login_token),void 0!==t.userVariables&&(this.options.userVariables=t.userVariables),void 0!==t.anonymous_login&&(this.options.anonymous_login=t.anonymous_login)),N(this.options))return this._login({type:"login",onSuccess:n,onError:s});if(D(this.options))return this._login({type:"anonymous_login",onSuccess:n,onError:s});{const t="Invalid login options provided for authentication.";return C.error(t),void oe(e.SwEvent.Error,{error:new Error(t),type:q.invalidCredentialsOptions,sessionId:this.sessionid},this.uuid)}}}))}_login({type:e,onSuccess:t,onError:n}){return i(this,void 0,void 0,(function*(){let i;i="login"===e?new Se(this.options.login,this.options.password||this.options.passwd,this.options.login_token,this.sessionid,this.options.userVariables,!!F()):new Ne({target_id:this.options.anonymous_login.target_id,target_type:this.options.anonymous_login.target_type,target_version_id:this.options.anonymous_login.target_version_id,sessionId:this.sessionid,userVariables:this.options.userVariables,reconnection:!!F()});const s=yield this.execute(i).catch((e=>{this._handleLoginError(e),n&&n(e)}));s&&(this.sessionid=s.sessid,t&&t())}))}_onSocketOpen(){return i(this,void 0,void 0,(function*(){}))}onNetworkClose(){this.relayProtocol&&re(this.relayProtocol);for(const e in this.subscriptions)re(e);this.subscriptions={},this.contexts=[],clearTimeout(this._keepAliveTimeout),clearTimeout(this._reconnectTimeout),this.connection&&(this.connection.previousGatewayState=""),this._autoReconnect&&(this._reconnectTimeout=setTimeout((()=>{C.debug("Calling connect due to network close and auto-reconnect enabled."),this.connect()}),this.reconnectDelay))}_onSocketMessage(e){}_removeSubscription(e,t){this._existsSubscription(e,t)&&(t?(delete this.subscriptions[e][t],se(e,null,t)):(delete this.subscriptions[e],re(e)))}_addSubscription(e,t=null,i){this._existsSubscription(e,i)||(this._existsSubscription(e)||(this.subscriptions[e]={}),this.subscriptions[e][i]={},x(t)&&ie(e,t,i))}_existsSubscription(e,t){return!(!this.subscriptions.hasOwnProperty(e)||!(!t||t&&this.subscriptions[e].hasOwnProperty(t)))}_attachListeners(){this._detachListeners(),this.on(e.SwEvent.SocketOpen,this._onSocketOpen),this.on(e.SwEvent.SocketClose,this.onNetworkClose),this.on(e.SwEvent.SocketError,this.onNetworkClose),this.on(e.SwEvent.SocketMessage,this._onSocketMessage)}_detachListeners(){this.off(e.SwEvent.SocketOpen,this._onSocketOpen),this.off(e.SwEvent.SocketClose,this.onNetworkClose),this.off(e.SwEvent.SocketError,this.onNetworkClose),this.off(e.SwEvent.SocketMessage,this._onSocketMessage)}_emptyExecuteQueues(){this._executeQueue.forEach((({resolve:e,msg:t})=>{"string"==typeof t?this.executeRaw(t):e(this.execute(t))}))}_closeConnection(){this._idle=!0,clearTimeout(this._keepAliveTimeout),this.connection&&this.connection.close()}_resetKeepAlive(){!1===this._pong&&(C.warn("No ping/pong received, forcing PING ACK to keep alive"),this.execute(new be(F()))),clearTimeout(this._keepAliveTimeout),this._triggerKeepAliveTimeoutCheck()}_triggerKeepAliveTimeoutCheck(){this._pong=!1,this._keepAliveTimeout=setTimeout((()=>this._resetKeepAlive()),35e3)}setPingReceived(){C.debug("Ping received"),this._pong=!0}static on(e,t){ie(e,t)}static off(e){se(e)}static uuid(){return c()}clearConnection(){this.connection=null}hasAutoReconnect(){return this._autoReconnect}}const Me=e=>navigator.mediaDevices.getUserMedia(e),je=e=>e&&e instanceof MediaStream,Ue=(e,t)=>{const i=O(e);null!==i&&(i.getAttribute("autoplay")||i.setAttribute("autoplay","autoplay"),i.getAttribute("playsinline")||i.setAttribute("playsinline","playsinline"),i.srcObject=t)},$e=(e,t)=>i(void 0,void 0,void 0,(function*(){const i=O(e);if(null===i)return C.info("No HTMLMediaElement to attach the speakerId"),!1;if("string"!=typeof t)return C.info(`Invalid speaker deviceId: '${t}'`),!1;try{return yield i.setSinkId(t),!0}catch(e){return!1}})),Fe=e=>{e&&"live"===e.readyState&&e.stop()},Be=e=>{je(e)&&e.getTracks().forEach(Fe),e=null},Ge=e=>i(void 0,void 0,void 0,(function*(){C.info("RTCService.getUserMedia",e);const{audio:i,video:n}=e;if(!i&&!n)return null;try{return yield Me(e)}catch(i){if(C.error("getUserMedia error: ",i),(e=>"NotReadableError"===e.name||"NotFoundError"===e.name||"OverconstrainedError"===e.name)(i)){const n=(e=>{const{audio:i,video:n}=e;let s=!1,o=i,r=n;if("object"==typeof i&&null!==i&&"deviceId"in i){s=!0;const e=t(i,["deviceId"]);o=0===Object.keys(e).length||e}if("object"==typeof n&&null!==n&&"deviceId"in n){s=!0;const e=t(n,["deviceId"]);r=0===Object.keys(e).length||e}return s?{audio:o,video:r}:null})(e);if(n){C.warn("Device not found or not readable, falling back to default device");try{return yield Me(n)}catch(e){throw C.error("Fallback getUserMedia also failed: ",e),i}}}throw i}})),Ve=(e=null,t=!1)=>i(void 0,void 0,void 0,(function*(){let i=[];const n=yield navigator.mediaDevices.getUserMedia(((e=null)=>({audio:!e||e===Y.AudioIn||e===Y.AudioOut,video:!e||e===Y.Video}))(e)).catch((e=>(C.error(e),null)));if(n){if(Be(n),i=yield navigator.mediaDevices.enumerateDevices(),e&&(i=i.filter((t=>t.kind===e))),!0===t)return i;const s=[];i=i.filter((e=>{if(!e.groupId)return!0;const t=`${e.kind}-${e.groupId}`;return!s.includes(t)&&(s.push(t),!0)}))}return i})),He=[[320,240],[640,360],[640,480],[1280,720],[1920,1080]],qe=(e,t,n)=>i(void 0,void 0,void 0,(function*(){const i=yield Ve(n,!0);for(let n=0;n<i.length;n++){const{deviceId:s,label:o}=i[n];if(e===s||t===o)return s}return null})),We=e=>{const t=navigator.mediaDevices.getSupportedConstraints();Object.keys(e).map((i=>{t.hasOwnProperty(i)&&null!==e[i]&&void 0!==e[i]||delete e[i]}))},Je=(e,t)=>{if(!e)return!1;const{subscribed:i,alreadySubscribed:n}=Ke(e);return i.includes(t)||n.includes(t)},Ke=e=>{const t={subscribed:[],alreadySubscribed:[],unauthorized:[],unsubscribed:[],notSubscribed:[]};return Object.keys(t).forEach((i=>{t[i]=e[`${i}Channels`]||[]})),t},ze=(e,t=null,i=null)=>{if(!je(e))return null;let n=[];switch(t){case"audio":n=e.getAudioTracks();break;case"video":n=e.getVideoTracks();break;default:n=e.getTracks()}n.forEach((e=>{switch(i){case"on":case!0:e.enabled=!0;break;case"off":case!1:e.enabled=!1;break;default:e.enabled=!e.enabled}}))},Ye=e=>{ze(e,"audio",!0)},Qe=e=>{ze(e,"audio",!1)},Xe=e=>{ze(e,"audio",null)},Ze=e=>((e,t=null)=>{if(!je(e))return null;let i=[];switch(t){case"audio":i=e.getAudioTracks();break;case"video":i=e.getVideoTracks();break;default:i=e.getTracks()}return i.some((e=>e.enabled))})(e,"audio");function et(){try{const{browserInfo:e,name:t,version:i,supportAudio:n,supportVideo:s}=function(){if(!window||!window.navigator||!window.navigator.userAgent)throw new Error("You should use @telnyx/webrtc in a web browser such as Chrome|Firefox|Safari");if(navigator.userAgent.match(/chrom(e|ium)/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)&&!navigator.userAgent.match(/edg/gim)){const e=navigator.userAgent.match(/chrom(e|ium)\/[0-9]+\./gim)[0].split("/"),t=e[0],i=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:i,supportAudio:!0,supportVideo:!0}}if(navigator.userAgent.match(/firefox/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)&&!navigator.userAgent.match(/edg/gim)){const e=navigator.userAgent.match(/firefox\/[0-9]+\./gim)[0].split("/"),t=e[0],i=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:i,supportAudio:!0,supportVideo:!1}}if(navigator.userAgent.match(/safari/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)&&!navigator.userAgent.match(/edg/gim)){const e=navigator.userAgent.match(/safari/gim)[0],t=navigator.userAgent.match(/version\/[0-9]+\./gim)[0].split("/"),i=parseInt(t[1],10);return{browserInfo:navigator.userAgent,name:e,version:i,supportAudio:!0,supportVideo:!0}}if(navigator.userAgent.match(/edg/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)){const e=navigator.userAgent.match(/edg\/[0-9]+\./gim)[0].split("/"),t=e[0],i=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:i,supportAudio:!0,supportVideo:!0}}throw new Error("This browser does not support @telnyx/webrtc. To see browser support list: `TelnyxRTC.webRTCSupportedBrowserList()`")}(),o=window.RTCPeerConnection,r=window.RTCSessionDescription,a=window.RTCIceCandidate,c=window.navigator&&window.navigator.mediaDevices,d=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.msGetUserMedia||navigator.mozGetUserMedia;return{browserInfo:e,browserName:t,browserVersion:i,supportWebRTC:!!(o&&r&&a&&c&&d),supportWebRTCAudio:n,supportWebRTCVideo:s,supportRTCPeerConnection:!!o,supportSessionDescription:!!r,supportIceCandidate:!!a,supportMediaDevices:!!c,supportGetUserMedia:!!Ge}}catch(e){return e.message}}var tt;function it(e,t){const i=document.getElementById(t);if(i)return i;if(e&&t){const i=document.createElement("audio");return i.id=t,i.loop=!0,i.src=e,i.preload="auto",i.load(),document.body.appendChild(i),i}return null}function nt(e){e&&(e._playFulfilled=!1,e._promise=e.play(),e._promise.then((()=>{e._playFulfilled=!0})).catch((t=>{C.error("playAudio",t),e._playFulfilled=!0})))}function st(e){e&&(e._playFulfilled?(e.pause(),e.currentTime=0):e._promise&&e._promise.then?e._promise.then((()=>{e.pause(),e.currentTime=0})):setTimeout((()=>{e.pause(),e.currentTime=0}),1e3))}!function(e){e.not_supported="not supported",e.full="full",e.partial="partial"}(tt||(tt={}));class ot extends pe{constructor(e,t){super(),this.method="ai_conversation",this.buildRequest({method:this.method,params:{type:"conversation.item.create",previous_item_id:null,item:{id:c(),type:"message",role:"user",content:[{type:"input_text",text:e},...null==t?void 0:t.map((e=>({type:"image_url",image_url:{url:e}})))]}}})}}class rt{constructor(e,t){this.peerConnection=null,this.intervalId=null,this.statsBuffer=[],this.intervalStartTime=null,this.callEndTime=null,this.logCollector=null,this.intervalAudioLevels={outbound:[],inbound:[]},this.intervalJitters=[],this.intervalRTTs=[],this.intervalBitrates={outbound:[],inbound:[]},this.previousStats={},this.MAX_BUFFER_SIZE=360,this.onFlushNeeded=null,this._segmentIndex=0,this._flushing=!1,this.options=e,this.logCollectorOptions=t||{enabled:!1,level:"debug",maxEntries:1e3},this.callStartTime=new Date,this.logCollectorOptions.enabled&&(this.logCollector=function(e){return new y(e)}(this.logCollectorOptions),this.logCollector.start(),w(this.logCollector))}start(e){var t,i;this.options.enabled&&(this.peerConnection=e,this.intervalStartTime=new Date,C.info("CallReportCollector: Starting stats collection",{interval:this.options.interval,logCollectorActive:null!==(i=null===(t=this.logCollector)||void 0===t?void 0:t.isActive())&&void 0!==i&&i}),this.intervalId=setInterval((()=>{this._collectStats()}),this.options.interval))}stop(){var e,t;this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),this.callEndTime=new Date,this.peerConnection&&this.intervalStartTime&&this._collectStats();const i=null!==(t=null===(e=this.logCollector)||void 0===e?void 0:e.getLogCount())&&void 0!==t?t:0;this.logCollector&&this.logCollector.stop(),C.info("CallReportCollector: Stopped stats collection",{totalIntervals:this.statsBuffer.length,totalLogs:i,duration:this.callEndTime.getTime()-this.callStartTime.getTime()})}flush(e){var t,i;if(this._flushing||0===this.statsBuffer.length)return null;this._flushing=!0;try{const n=this._segmentIndex++,s=this.statsBuffer;this.statsBuffer=[];const o=null!==(i=null===(t=this.logCollector)||void 0===t?void 0:t.drain())&&void 0!==i?i:[],r=new Date,a=Object.assign(Object.assign({summary:Object.assign(Object.assign({},e),{durationSeconds:(r.getTime()-this.callStartTime.getTime())/1e3,startTimestamp:this.callStartTime.toISOString(),endTimestamp:r.toISOString()}),stats:s},o.length>0?{logs:o}:{}),{segment:n});return C.info("CallReportCollector: Flushed intermediate segment",{segment:n,intervals:s.length,logEntries:o.length,callId:e.callId}),a}finally{this._flushing=!1}}postReport(e,t,n,s){var o,r;return i(this,void 0,void 0,(function*(){if(!this.options.enabled||0===this.statsBuffer.length)return;const i=null===(o=this.logCollector)||void 0===o?void 0:o.getLogs(),a=this._segmentIndex>0,c=this._segmentIndex,d=Object.assign(Object.assign({summary:Object.assign(Object.assign({},e),{durationSeconds:this.callEndTime&&this.callStartTime?(this.callEndTime.getTime()-this.callStartTime.getTime())/1e3:void 0,startTimestamp:this.callStartTime.toISOString(),endTimestamp:null===(r=this.callEndTime)||void 0===r?void 0:r.toISOString()}),stats:this.statsBuffer},i&&i.length>0?{logs:i}:{}),a?{segment:c}:{});yield this._sendPayload(d,t,n,s)}))}sendPayload(e,t,n,s){return i(this,void 0,void 0,(function*(){yield this._sendPayload(e,t,n,s)}))}_sendPayload(e,t,n,s){var o,r;return i(this,void 0,void 0,(function*(){try{const i=new URL(n),a=`${i.protocol.replace(/^ws/,"http")}//${i.host}/call_report`,c=void 0!==e.segment&&!e.summary.endTimestamp?`intermediate segment ${e.segment}`:"final report";C.info(`CallReportCollector: Posting ${c}`,{endpoint:a,intervals:e.stats.length,logEntries:null!==(r=null===(o=e.logs)||void 0===o?void 0:o.length)&&void 0!==r?r:0,callId:e.summary.callId,segment:e.segment});const d={"Content-Type":"application/json","x-call-report-id":t,"x-call-id":e.summary.callId};s&&(d["x-voice-sdk-id"]=s);const l=yield fetch(a,{method:"POST",headers:d,body:JSON.stringify(e)});if(l.ok)C.info(`CallReportCollector: Successfully posted ${c}`);else{const e=yield l.text();C.error(`CallReportCollector: Failed to post ${c}`,{status:l.status,error:e})}}catch(e){C.error("CallReportCollector: Error posting report",{error:e})}}))}getStatsBuffer(){return this.statsBuffer}getLogs(){var e,t;return null!==(t=null===(e=this.logCollector)||void 0===e?void 0:e.getLogs())&&void 0!==t?t:[]}cleanup(){this.logCollector&&(this.logCollector.clear(),S()===this.logCollector&&w(null),this.logCollector=null)}_collectStats(){var e,t;return i(this,void 0,void 0,(function*(){if(this.peerConnection&&this.intervalStartTime)try{const i=yield this.peerConnection.getStats(),n=new Date;let s=null,o=null,r=null;if(i.forEach((e=>{switch(e.type){case"outbound-rtp":"audio"===e.kind&&"audio"===e.mediaType&&(s=e);break;case"inbound-rtp":"audio"===e.kind&&"audio"===e.mediaType&&(o=e);break;case"candidate-pair":(e.nominated||"succeeded"===e.state)&&(r=e)}})),s){const e=this._getTrackAudioLevel(i,s.trackId);if(null!==e&&this.intervalAudioLevels.outbound.push(e),void 0!==this.previousStats.outboundBytes&&void 0!==this.previousStats.timestamp){const e=(s.bytesSent||0)-this.previousStats.outboundBytes,t=(s.timestamp||n.getTime())-this.previousStats.timestamp;if(t>0){const i=8*e*1e3/t;this.intervalBitrates.outbound.push(i)}}this.previousStats.outboundBytes=s.bytesSent}if(o){const e=this._getTrackAudioLevel(i,o.trackId);if(null!==e&&this.intervalAudioLevels.inbound.push(e),void 0!==o.jitter&&this.intervalJitters.push(1e3*o.jitter),void 0!==this.previousStats.inboundBytes&&void 0!==this.previousStats.timestamp){const e=(o.bytesReceived||0)-this.previousStats.inboundBytes,t=(o.timestamp||n.getTime())-this.previousStats.timestamp;if(t>0){const i=8*e*1e3/t;this.intervalBitrates.inbound.push(i)}}this.previousStats.inboundBytes=o.bytesReceived}r&&void 0!==r.currentRoundTripTime&&this.intervalRTTs.push(r.currentRoundTripTime),this.previousStats.timestamp=n.getTime();if(n.getTime()-this.intervalStartTime.getTime()>=this.options.interval){const i=this._createStatsEntry(this.intervalStartTime,n,s,o,r);if(this.statsBuffer.push(i),this.statsBuffer.length>this.MAX_BUFFER_SIZE&&(this.statsBuffer.shift(),C.warn("CallReportCollector: Buffer size limit reached, removing oldest entry")),this.onFlushNeeded&&!this._flushing){const i=this.statsBuffer.length,n=null!==(t=null===(e=this.logCollector)||void 0===e?void 0:e.getLogCount())&&void 0!==t?t:0;if(i>=rt.STATS_FLUSH_THRESHOLD||n>=rt.LOGS_FLUSH_THRESHOLD){C.info("CallReportCollector: Approaching buffer limits, requesting flush",{statsIntervals:i,logEntries:n});try{this.onFlushNeeded()}catch(e){C.error("CallReportCollector: onFlushNeeded callback error",{error:e})}}}this.intervalStartTime=n,this._resetIntervalAccumulators()}}catch(e){C.error("CallReportCollector: Error collecting stats",{error:e})}}))}_createStatsEntry(e,t,i,n,s){const o={intervalStartUtc:e.toISOString(),intervalEndUtc:t.toISOString(),audio:{}};return i&&(o.audio.outbound={packetsSent:i.packetsSent,bytesSent:i.bytesSent,audioLevelAvg:this._average(this.intervalAudioLevels.outbound),bitrateAvg:this._average(this.intervalBitrates.outbound)}),n&&(o.audio.inbound={packetsReceived:n.packetsReceived,bytesReceived:n.bytesReceived,packetsLost:n.packetsLost,packetsDiscarded:n.packetsDiscarded,jitterBufferDelay:n.jitterBufferDelay,jitterBufferEmittedCount:n.jitterBufferEmittedCount,totalSamplesReceived:n.totalSamplesReceived,concealedSamples:n.concealedSamples,concealmentEvents:n.concealmentEvents,audioLevelAvg:this._average(this.intervalAudioLevels.inbound),jitterAvg:this._average(this.intervalJitters),bitrateAvg:this._average(this.intervalBitrates.inbound)}),s&&(o.connection={roundTripTimeAvg:this._average(this.intervalRTTs),packetsSent:s.packetsSent,packetsReceived:s.packetsReceived,bytesSent:s.bytesSent,bytesReceived:s.bytesReceived}),o}_getTrackAudioLevel(e,t){if(!t)return null;const i=e.get(t);return i&&i.audioLevel||null}_average(e){if(0===e.length)return;const t=e.reduce(((e,t)=>e+t),0);return parseFloat((t/e.length).toFixed(4))}_resetIntervalAccumulators(){this.intervalAudioLevels={outbound:[],inbound:[]},this.intervalJitters=[],this.intervalRTTs=[],this.intervalBitrates={outbound:[],inbound:[]}}}rt.STATS_FLUSH_THRESHOLD=300,rt.LOGS_FLUSH_THRESHOLD=800;var at,ct=f((function(e,t){var i;function n(){}function s(){s.init.call(this)}function o(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function r(e,t,i,s){var r,a,c;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((a=e._events)?(a.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),a=e._events),c=a[t]):(a=e._events=new n,e._eventsCount=0),c){if("function"==typeof c?c=a[t]=s?[i,c]:[c,i]:s?c.unshift(i):c.push(i),!c.warned&&((r=o(e))&&0<r&&c.length>r)){c.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+c.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=c.length,function(e){"function"==typeof console.warn?console.warn(e):console.log(e)}(d)}}else c=a[t]=i,++e._eventsCount;return e}function a(e,t,i){function n(){e.removeListener(t,n),s||(s=!0,i.apply(e,arguments))}var s=!1;return n.listener=i,n}function c(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function d(e,t){for(var i=Array(t);t--;)i[t]=e[t];return i}Object.defineProperty(t,"__esModule",{value:!0}),n.prototype=Object.create(null),s.EventEmitter=s,s.usingDomains=!1,s.prototype.domain=void 0,s.prototype._events=void 0,s.prototype._maxListeners=void 0,s.defaultMaxListeners=10,s.init=function(){this.domain=null,s.usingDomains&&i.active&&!(this instanceof i.Domain)&&(this.domain=i.active),this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new n,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},s.prototype.setMaxListeners=function(e){if("number"!=typeof e||0>e||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},s.prototype.getMaxListeners=function(){return o(this)},s.prototype.emit=function(e){var t,i,n,s,o,r,a,c="error"===e;if(r=this._events)c=c&&null==r.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var l=new Error('Uncaught, unspecified "error" event. ('+t+")");throw l.context=t,l}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=r[e]))return!1;var u="function"==typeof i;switch(n=arguments.length){case 1:!function(e,t,i){if(t)e.call(i);else for(var n=e.length,s=d(e,n),o=0;o<n;++o)s[o].call(i)}(i,u,this);break;case 2:!function(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,o=d(e,s),r=0;r<s;++r)o[r].call(i,n)}(i,u,this,arguments[1]);break;case 3:!function(e,t,i,n,s){if(t)e.call(i,n,s);else for(var o=e.length,r=d(e,o),a=0;a<o;++a)r[a].call(i,n,s)}(i,u,this,arguments[1],arguments[2]);break;case 4:!function(e,t,i,n,s,o){if(t)e.call(i,n,s,o);else for(var r=e.length,a=d(e,r),c=0;c<r;++c)a[c].call(i,n,s,o)}(i,u,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=Array(n-1),o=1;o<n;o++)s[o-1]=arguments[o];!function(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,o=d(e,s),r=0;r<s;++r)o[r].apply(i,n)}(i,u,this,s)}return!0},s.prototype.addListener=function(e,t){return r(this,e,t,!1)},s.prototype.on=s.prototype.addListener,s.prototype.prependListener=function(e,t){return r(this,e,t,!0)},s.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,a(this,e,t)),this},s.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,a(this,e,t)),this},s.prototype.removeListener=function(e,t){var i,s,o,r,a;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(s=this._events))return this;if(!(i=s[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new n:(delete s[e],s.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(o=-1,r=i.length;0<r--;)if(i[r]===t||i[r].listener&&i[r].listener===t){a=i[r].listener,o=r;break}if(0>o)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new n,this;delete s[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,o);s.removeListener&&this.emit("removeListener",e,a||t)}return this},s.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new n,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new n:delete i[e]),this;if(0===arguments.length){for(var s,o=Object.keys(i),r=0;r<o.length;++r)"removeListener"!==(s=o[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=new n,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},s.prototype.listeners=function(e){var t,i,n=this._events;return n?i=(t=n[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]:i=[],i},s.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):c.call(e,t)},s.prototype.listenerCount=c,s.prototype.eventNames=function(){return 0<this._eventsCount?Reflect.ownKeys(this._events):[]};var l,u=new Uint8Array(16);function h(){if(!l&&!(l="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return l(u)}var p=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;for(var g=[],v=0;256>v;++v)g.push((v+256).toString(16).substr(1));function f(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,i=(g[e[t+0]]+g[e[t+1]]+g[e[t+2]]+g[e[t+3]]+"-"+g[e[t+4]]+g[e[t+5]]+"-"+g[e[t+6]]+g[e[t+7]]+"-"+g[e[t+8]]+g[e[t+9]]+"-"+g[e[t+10]]+g[e[t+11]]+g[e[t+12]]+g[e[t+13]]+g[e[t+14]]+g[e[t+15]]).toLowerCase();if(!function(e){return"string"==typeof e&&p.test(e)}(i))throw TypeError("Stringified UUID is invalid");return i}function m(e,t,i){var n=(e=e||{}).random||(e.rng||h)();if(n[6]=64|15&n[6],n[8]=128|63&n[8],t){i=i||0;for(var s=0;16>s;++s)t[i+s]=n[s];return t}return f(n)}function b(e,t){if(!e||!t)return{};const i={...e};if(i.localCandidateId){const e=t.get(i.localCandidateId);i.local={...e}}if(i.remoteCandidateId){const e=t.get(i.remoteCandidateId);i.remote={...e}}return i}function y(e,t,i){return 8*function(e,t,i){const n=e[i],s=t?t[i]:null;return null===n||null===s?null:(n-s)/(e.timestamp-t.timestamp)*1e3}(e,t,i)}function _(e){if(!e.entries)return e;const t={};return e.forEach((function(e,i){t[i]=e})),t}function S(e,t,i={}){if(!e)return null;let n={audio:{inbound:[],outbound:[]},video:{inbound:[],outbound:[]},connection:{inbound:[],outbound:[]}};i.remote&&(n.remote={audio:{inbound:[],outbound:[]},video:{inbound:[],outbound:[]}});for(const t of e.values())switch(t.type){case"outbound-rtp":{const i=t.mediaType||t.kind,s={};let o={};if(!["audio","video"].includes(i))continue;if(t.codecId){const i=e.get(t.codecId);i&&(s.clockRate=i.clockRate,s.mimeType=i.mimeType,s.payloadType=i.payloadType)}o=e.get(t.mediaSourceId)||e.get(t.trackId)||{},n[i].outbound.push({...t,...s,track:{...o}});break}case"inbound-rtp":{let i=t.mediaType||t.kind,s={};const o={};if(!["audio","video"].includes(i))if(t.id.includes("Video"))i="video";else{if(!t.id.includes("Audio"))continue;i="audio"}if(t.codecId){const i=e.get(t.codecId);i&&(o.clockRate=i.clockRate,o.mimeType=i.mimeType,o.payloadType=i.payloadType)}if(!n.connection.id&&t.transportId){const i=e.get(t.transportId);if(i&&i.selectedCandidatePairId){const t=e.get(i.selectedCandidatePairId);n.connection=b(t,e)}}s=e.get(t.mediaSourceId)||e.get(t.trackId)||{},n[i].inbound.push({...t,...o,track:{...s}});break}case"peer-connection":n.connection.dataChannelsClosed=t.dataChannelsClosed,n.connection.dataChannelsOpened=t.dataChannelsOpened;break;case"remote-inbound-rtp":{if(!i.remote)break;let s=t.mediaType||t.kind;const o={};if(!["audio","video"].includes(s))if(t.id.includes("Video"))s="video";else{if(!t.id.includes("Audio"))continue;s="audio"}if(t.codecId){const i=e.get(t.codecId);i&&(o.clockRate=i.clockRate,o.mimeType=i.mimeType,o.payloadType=i.payloadType)}if(!n.connection.id&&t.transportId){const i=e.get(t.transportId);if(i&&i.selectedCandidatePairId){const t=e.get(i.selectedCandidatePairId);n.connection=b(t,e)}}n.remote[s].inbound.push({...t,...o});break}case"remote-outbound-rtp":{if(!i.remote)break;const s=t.mediaType||t.kind,o={};if(!["audio","video"].includes(s))continue;if(t.codecId){const i=e.get(t.codecId);i&&(o.clockRate=i.clockRate,o.mimeType=i.mimeType,o.payloadType=i.payloadType)}n.remote[s].outbound.push({...t,...o});break}}if(!n.connection.id)for(const t of e.values())"candidate-pair"===t.type&&t.nominated&&"succeeded"===t.state&&(n.connection=b(t,e));return n=function(e,t){return t?(e.audio.inbound.map((e=>{let i=t.audio.inbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesReceived"),e.packetRate=y(e,i,"packetsReceived")})),e.audio.outbound.map((e=>{let i=t.audio.outbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesSent"),e.packetRate=y(e,i,"packetsSent")})),e.video.inbound.map((e=>{let i=t.video.inbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesReceived"),e.packetRate=y(e,i,"packetsReceived")})),e.video.outbound.map((e=>{let i=t.video.outbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesSent"),e.packetRate=y(e,i,"packetsSent")})),e):e}(n,t),n}let w,C={},I=[];t.WebRTCStats=class extends s{constructor(e){if(super(),this.monitoringSetInterval=0,this.connectionMonitoringSetInterval=0,this.connectionMonitoringInterval=1e3,this.remote=!0,this.peersToMonitor={},this.timeline=[],this.statsToMonitor=["inbound-rtp","outbound-rtp","remote-inbound-rtp","remote-outbound-rtp","peer-connection","data-channel","stream","track","sender","receiver","transport","candidate-pair","local-candidate","remote-candidate"],"undefined"==typeof window)throw new Error("WebRTCStats only works in browser");const t={...e};this.isEdge=!!window.RTCIceGatherer,this.getStatsInterval=t.getStatsInterval||1e3,this.rawStats=!!t.rawStats,this.statsObject=!!t.statsObject,this.filteredStats=!!t.filteredStats,this.shouldWrapGetUserMedia=!!t.wrapGetUserMedia,"boolean"==typeof t.remote&&(this.remote=t.remote),this.debug=!!t.debug,this.logLevel=t.logLevel||"none",this.shouldWrapGetUserMedia&&this.wrapGetUserMedia()}async addPeer(e,t){return console.warn("The addPeer() method has been deprecated, please use addConnection()"),this.addConnection({peerId:e,pc:t})}async addConnection(e){const{pc:t,peerId:i}=e;let{connectionId:n,remote:s}=e;if(s="boolean"==typeof s?s:this.remote,!(t&&t instanceof RTCPeerConnection))throw new Error("Missing argument 'pc' or is not of instance RTCPeerConnection");if(!i)throw new Error("Missing argument peerId");if(this.isEdge)throw new Error("Can't monitor peers in Edge at this time.");if(this.peersToMonitor[i]){if(n&&n in this.peersToMonitor[i])throw new Error(`We are already monitoring connection with id ${n}.`);for(let e in this.peersToMonitor[i]){const n=this.peersToMonitor[i][e];if(n.pc===t)throw new Error(`We are already monitoring peer with id ${i}.`);"closed"===n.pc.connectionState&&this.removeConnection({pc:n.pc})}}const o=t.getConfiguration();return o.iceServers&&o.iceServers.forEach((function(e){delete e.credential})),n||(n=m()),this.emitEvent({event:"addConnection",tag:"peer",peerId:i,connectionId:n,data:{options:e,peerConfiguration:o}}),this.monitorPeer({peerId:i,connectionId:n,pc:t,remote:s}),{connectionId:n}}getTimeline(e){return this.timeline=this.timeline.sort(((e,t)=>e.timestamp.getTime()-t.timestamp.getTime())),e?this.timeline.filter((t=>t.tag===e)):this.timeline}get logger(){const e=e=>{const t=["none","error","warn","info","debug"];return t.slice(0,t.indexOf(this.logLevel)+1).indexOf(e)>-1};return{error(...t){this.debug&&e("error")&&console.error("[webrtc-stats][error] ",...t)},warn(...t){this.debug&&e("warn")&&console.warn("[webrtc-stats][warn] ",...t)},info(...t){this.debug&&e("info")&&console.log("[webrtc-stats][info] ",...t)},debug(...t){this.debug&&e("debug")&&console.debug("[webrtc-stats][debug] ",...t)}}}removeConnection(e){let t,{connectionId:i,pc:n}=e;if(!n&&!i)throw new Error("Missing arguments. You need to either send pc or a connectionId.");if(i){if("string"!=typeof i)throw new Error("connectionId must be a string.");for(let e in this.peersToMonitor)i in this.peersToMonitor[e]&&(n=this.peersToMonitor[e][i].pc,t=e)}else if(n){if(!(n instanceof RTCPeerConnection))throw new Error("pc must be an instance of RTCPeerConnection.");for(let e in this.peersToMonitor)for(let s in this.peersToMonitor[e])this.peersToMonitor[e][s].pc===n&&(i=s,t=e)}if(!n||!i)throw new Error("Could not find the desired connection.");return this.removePeerConnectionEventListeners(i,n),delete this.peersToMonitor[t][i],0===Object.values(this.peersToMonitor[t]).length&&delete this.peersToMonitor[t],{connectionId:i}}removeAllPeers(){for(let e in this.peersToMonitor)this.removePeer(e)}removePeer(e){if(this.logger.info(`Removing PeerConnection with id ${e}.`),this.peersToMonitor[e]){for(let t in this.peersToMonitor[e]){let i=this.peersToMonitor[e][t].pc;this.removePeerConnectionEventListeners(t,i)}delete this.peersToMonitor[e]}}destroy(){this.removeAllPeers(),I.forEach((e=>{this.removeTrackEventListeners(e)})),I=[],this.shouldWrapGetUserMedia&&w&&(navigator.mediaDevices.getUserMedia=w)}monitorPeer(e){let{peerId:t,connectionId:i,pc:n,remote:s}=e;if(!n)return void this.logger.warn("Did not receive pc argument when calling monitorPeer()");const o={pc:n,connectionId:i,stream:null,stats:{parsed:null,raw:null},options:{remote:s}};if(this.peersToMonitor[t]){if(i in this.peersToMonitor[t])return void this.logger.warn(`Already watching connection with ID ${i}`);this.peersToMonitor[t][i]=o}else this.peersToMonitor[t]={[i]:o};this.addPeerConnectionEventListeners(t,i,n),1===this.numberOfMonitoredPeers&&(this.startStatsMonitoring(),this.startConnectionStateMonitoring())}startStatsMonitoring(){this.monitoringSetInterval||(this.monitoringSetInterval=window.setInterval((()=>{this.numberOfMonitoredPeers||this.stopStatsMonitoring(),this.getStats().then((e=>{e.forEach((e=>{this.emitEvent(e)}))}))}),this._getStatsInterval))}stopStatsMonitoring(){this.monitoringSetInterval&&(window.clearInterval(this.monitoringSetInterval),this.monitoringSetInterval=0)}async getStats(e=null){this.logger.info(e?`Getting stats from peer ${e}`:"Getting stats from all peers");let t={};if(e){if(!this.peersToMonitor[e])throw new Error(`Cannot get stats. Peer with id ${e} does not exist`);t[e]=this.peersToMonitor[e]}else t=this.peersToMonitor;let i=[];for(const e in t)for(const n in t[e]){const s=t[e][n],o=s.pc;if(o&&!this.checkIfConnectionIsClosed(e,n,o))try{const t=this.getTimestamp(),r=o.getStats(null);if(r){const o=await r,a=this.getTimestamp(),c=_(o),d={remote:s.options.remote},l=S(o,s.stats.parsed,d),u={event:"stats",tag:"stats",peerId:e,connectionId:n,timeTaken:a-t,data:l};!0===this.rawStats&&(u.rawStats=o),!0===this.statsObject&&(u.statsObject=c),!0===this.filteredStats&&(u.filteredStats=this.filteroutStats(c)),i.push(u),s.stats.parsed=l}else this.logger.error(`PeerConnection from peer ${e} did not return any stats data`)}catch(e){this.logger.error(e)}}return i}startConnectionStateMonitoring(){this.connectionMonitoringSetInterval=window.setInterval((()=>{this.numberOfMonitoredPeers||this.stopConnectionStateMonitoring();for(const e in this.peersToMonitor)for(const t in this.peersToMonitor[e]){const i=this.peersToMonitor[e][t].pc;this.checkIfConnectionIsClosed(e,t,i)}}),this.connectionMonitoringInterval)}checkIfConnectionIsClosed(e,t,i){const n=this.isConnectionClosed(i);if(n){this.removeConnection({pc:i});let n="closed"===i.connectionState?"onconnectionstatechange":"oniceconnectionstatechange";this.emitEvent({event:n,peerId:e,connectionId:t,tag:"connection",data:"closed"})}return n}isConnectionClosed(e){return"closed"===e.connectionState||"closed"===e.iceConnectionState}stopConnectionStateMonitoring(){this.connectionMonitoringSetInterval&&(window.clearInterval(this.connectionMonitoringSetInterval),this.connectionMonitoringSetInterval=0)}wrapGetUserMedia(){if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia)return void this.logger.warn("'navigator.mediaDevices.getUserMedia' is not available in browser. Will not wrap getUserMedia.");this.logger.info("Wrapping getUsermedia functions."),w=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);const e=this.parseGetUserMedia.bind(this);navigator.mediaDevices.getUserMedia=function(){return e({constraints:arguments[0]}),w.apply(navigator.mediaDevices,arguments).then((t=>(e({stream:t}),t)),(t=>(e({error:t}),Promise.reject(t))))}.bind(navigator.mediaDevices)}filteroutStats(e={}){const t={...e};for(const e in t){var i=t[e];this.statsToMonitor.includes(i.type)||delete t[e]}return t}get peerConnectionListeners(){return{icecandidate:(e,t,i,n)=>{this.logger.debug("[pc-event] icecandidate | peerId: ${peerId}",n),this.emitEvent({event:"onicecandidate",tag:"connection",peerId:e,connectionId:t,data:n.candidate})},track:(e,t,i,n)=>{this.logger.debug(`[pc-event] track | peerId: ${e}`,n);const s=n.track,o=n.streams[0];e in this.peersToMonitor&&t in this.peersToMonitor[e]&&(this.peersToMonitor[e][t].stream=o),this.addTrackEventListeners(s,t),this.emitEvent({event:"ontrack",tag:"track",peerId:e,connectionId:t,data:{stream:o?this.getStreamDetails(o):null,track:s?this.getMediaTrackDetails(s):null,title:n.track.kind+":"+n.track.id+" "+n.streams.map((function(e){return"stream:"+e.id}))}})},signalingstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] signalingstatechange | peerId: ${e}`),this.emitEvent({event:"onsignalingstatechange",tag:"connection",peerId:e,connectionId:t,data:{signalingState:i.signalingState,localDescription:i.localDescription,remoteDescription:i.remoteDescription}})},iceconnectionstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] iceconnectionstatechange | peerId: ${e}`),this.emitEvent({event:"oniceconnectionstatechange",tag:"connection",peerId:e,connectionId:t,data:i.iceConnectionState})},icegatheringstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] icegatheringstatechange | peerId: ${e}`),this.emitEvent({event:"onicegatheringstatechange",tag:"connection",peerId:e,connectionId:t,data:i.iceGatheringState})},icecandidateerror:(e,t,i,n)=>{this.logger.debug(`[pc-event] icecandidateerror | peerId: ${e}`),this.emitEvent({event:"onicecandidateerror",tag:"connection",peerId:e,connectionId:t,error:{errorCode:n.errorCode}})},connectionstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] connectionstatechange | peerId: ${e}`),this.emitEvent({event:"onconnectionstatechange",tag:"connection",peerId:e,connectionId:t,data:i.connectionState})},negotiationneeded:(e,t,i)=>{this.logger.debug(`[pc-event] negotiationneeded | peerId: ${e}`),this.emitEvent({event:"onnegotiationneeded",tag:"connection",peerId:e,connectionId:t})},datachannel:(e,t,i,n)=>{this.logger.debug(`[pc-event] datachannel | peerId: ${e}`,n),this.emitEvent({event:"ondatachannel",tag:"datachannel",peerId:e,connectionId:t,data:n.channel})}}}addPeerConnectionEventListeners(e,t,i){this.logger.debug(`Adding event listeners for peer ${e} and connection ${t}.`),C[t]={},Object.keys(this.peerConnectionListeners).forEach((n=>{C[t][n]=this.peerConnectionListeners[n].bind(this,e,t,i),i.addEventListener(n,C[t][n],!1)}))}parseGetUserMedia(e){try{const t={event:"getUserMedia",tag:"getUserMedia",data:{...e}};e.stream&&(t.data.details=this.parseStream(e.stream),e.stream.getTracks().map((e=>{this.addTrackEventListeners(e),I.push(e)}))),this.emitEvent(t)}catch(e){}}parseStream(e){const t={audio:[],video:[]};return e.getTracks().forEach((e=>{t[e.kind].push(this.getMediaTrackDetails(e))})),t}getMediaTrackDetails(e){return{enabled:e.enabled,id:e.id,contentHint:e.contentHint,kind:e.kind,label:e.label,muted:e.muted,readyState:e.readyState,constructorName:e.constructor.name,capabilities:e.getCapabilities?e.getCapabilities():{},constraints:e.getConstraints?e.getConstraints():{},settings:e.getSettings?e.getSettings():{},_track:e}}getStreamDetails(e){return{active:e.active,id:e.id,_stream:e}}getTrackEventObject(e){return{mute:t=>{this.emitEvent({event:"mute",tag:"track",connectionId:e,data:{event:t}})},unmute:t=>{this.emitEvent({event:"unmute",tag:"track",connectionId:e,data:{event:t}})},overconstrained:t=>{this.emitEvent({event:"overconstrained",tag:"track",connectionId:e,data:{event:t}})},ended:t=>{this.emitEvent({event:"ended",tag:"track",connectionId:e,data:{event:t}}),this.removeTrackEventListeners(t.target)}}}addTrackEventListeners(e,t){C[e.id]={};const i=this.getTrackEventObject(t);Object.keys(i).forEach((t=>{C[e.id][t]=i[t].bind(this),e.addEventListener(t,C[e.id][t])})),C[e.id].readyState=setInterval((()=>{if("ended"===e.readyState){let t=new CustomEvent("ended",{detail:{check:"readyState"}});e.dispatchEvent(t)}}),1e3)}removeTrackEventListeners(e){if(e.id in C){const t=this.getTrackEventObject();Object.keys(t).forEach((t=>{e.removeEventListener(t,C[e.id][t])})),clearInterval(C[e.id].readyState),delete C[e.id]}}addToTimeline(e){this.timeline.push(e),this.emit("timeline",e)}emitEvent(e){const t={...e,timestamp:new Date};this.addToTimeline(t),t.tag&&this.emit(t.tag,t)}set getStatsInterval(e){if(!Number.isInteger(e))throw new Error(`getStatsInterval should be an integer, got: ${e}`);this._getStatsInterval=e,this.monitoringSetInterval&&(this.stopStatsMonitoring(),this.startStatsMonitoring())}get numberOfMonitoredPeers(){return Object.keys(this.peersToMonitor).length}removePeerConnectionEventListeners(e,t){e in C&&(Object.keys(this.peerConnectionListeners).forEach((i=>{t.removeEventListener(i,C[e][i],!1)})),delete C[e]),t.getSenders().forEach((e=>{e.track&&this.removeTrackEventListeners(e.track)})),t.getReceivers().forEach((e=>{e.track&&this.removeTrackEventListeners(e.track)}))}getTimestamp(){return Date.now()}wrapGetDisplayMedia(){const e=this;if(navigator.mediaDevices&&navigator.mediaDevices.getDisplayMedia){const t=navigator.mediaDevices.getDisplayMedia.bind(navigator.mediaDevices),i=function(){return e.debug("navigator.mediaDevices.getDisplayMedia",null,arguments[0]),t.apply(navigator.mediaDevices,arguments).then((function(e){return e}),(function(t){return e.debug("navigator.mediaDevices.getDisplayMediaOnFailure",null,t.name),Promise.reject(t)}))};navigator.mediaDevices.getDisplayMedia=i.bind(navigator.mediaDevices)}}}}));(at=ct)&&at.__esModule&&Object.prototype.hasOwnProperty.call(at,"default")&&at.default;var dt=ct.WebRTCStats;function lt(e){const{packetsLost:t,packetsReceived:i,jitter:n,rtt:s}=e,o=function(e){const{jitter:t,rtt:i}=e,n=t+i/2;return.024*n+.11*(n-177.3)*(n>177.3?1:0)}({rtt:s,jitter:n}),r=function(e){const{packetsLost:t,packetsReceived:i}=e,n=t/(i+t)*100;return 20*Math.log(1+n)}({packetsLost:t,packetsReceived:i}),a=93.2-o-r+0,c=1+.035*a+7e-6*a*(a-60)*(100-a);return Math.min(Math.max(c,1),5)}function ut(e){return isNaN(e)?null:e>4.2?"excellent":e>=4.1&&e<=4.2?"good":e>=3.7&&e<=4?"fair":e>=3.1&&e<=3.6?"poor":"bad"}class ht extends pe{constructor(e,t){super(),this.buildRequest({type:"debug_report_start",debug_report_id:e,debug_report_version:1,call_id:t})}}class pt extends pe{constructor(e,t){super(),this.buildRequest({type:"debug_report_stop",debug_report_id:e,debug_report_version:1,call_id:t})}}class gt extends pe{constructor(e,t){super(),this.buildRequest({type:"debug_report_data",debug_report_id:e,debug_report_version:1,debug_report_data:t})}}function vt(e,t){var i,n;return{errorCode:e.errorCode,errorText:e.errorText,url:e.url,address:e.address,port:e.port,connectionState:t.connectionState,iceConnectionState:t.iceConnectionState,iceGatheringState:t.iceGatheringState,signalingState:t.signalingState,localDescriptionType:null===(i=t.localDescription)||void 0===i?void 0:i.type,remoteDescriptionType:null===(n=t.remoteDescription)||void 0===n?void 0:n.type}}function ft(t,n){const s=c();let o=!1;const r=new dt({getStatsInterval:1e3,rawStats:!1,statsObject:!0,filteredStats:!1,remote:!0,debug:!1,logLevel:"warn"}),a=n=>i(this,void 0,void 0,(function*(){"stats"===n.event&&oe(e.SwEvent.StatsFrame,function({data:e}){var t,i,n,s,o,r,a,c;const{audio:d,remote:l}=e,{audio:u}=l,h=null!==(i=null===(t=u.inbound[0])||void 0===t?void 0:t.jitter)&&void 0!==i?i:1/0,p=null!==(s=null===(n=u.inbound[0])||void 0===n?void 0:n.roundTripTime)&&void 0!==s?s:1/0,g=null!==(r=null===(o=d.inbound[0])||void 0===o?void 0:o.packetsReceived)&&void 0!==r?r:-1,v=null!==(c=null===(a=d.inbound[0])||void 0===a?void 0:a.packetsLost)&&void 0!==c?c:-1,f=lt({jitter:1e3*h,rtt:1e3*p,packetsLost:v,packetsReceived:g});return{jitter:h,rtt:p,mos:f,quality:ut(f),inboundAudio:d.inbound[0],outboundAudio:d.outbound[0],remoteInboundAudio:u.inbound[0],remoteOutboundAudio:u.outbound[0]}}(n),t.uuid),yield t.execute(new gt(s,n))}));return{get isRunning(){return o},start:(e,c,d)=>i(this,void 0,void 0,(function*(){if(o)C.debug(`[${n}] Stats reporter already running, skipping start`);else{yield t.execute(new ht(s,n)),r.on("timeline",a);try{yield r.addConnection({pc:e,peerId:c,connectionId:d}),o=!0}catch(e){C.error(`[${n}] Failed to start stats reporter:`,e),r.removeAllPeers(),r.destroy()}}})),stop:a=>i(this,void 0,void 0,(function*(){const i=r.getTimeline();if(oe(e.SwEvent.StatsReport,i,t.uuid),"file"===a){!function(e,t){const i=new Blob([JSON.stringify(e)],{type:"application/json"}),n=URL.createObjectURL(i),s=document.createElement("a");s.href=n,s.download=`${t}.json`,s.click(),URL.revokeObjectURL(n)}(i,`webrtc-stats-${s}-${Date.now()}`)}yield t.execute(new pt(s,n)),r.removeAllPeers(),r.destroy(),o=!1})),reportConnectionStateChange:e=>{const t={event:"connectionstatechange-detailed",tag:"connection",timestamp:(new Date).toISOString(),data:e};a(t)},reportIceCandidateError:e=>{const t={event:"icecandidateerror-detailed",tag:"connection",timestamp:(new Date).toISOString(),data:e};a(t)}}}const mt=(t,i)=>{const{contentType:n,canvasType:s,callID:o,canvasInfo:r=null,currentLayerIdx:a=-1}=i;r&&"mcu-personal-canvas"!==s&&delete r.memberID;const c={type:H.conferenceUpdate,call:t.calls[o],canvasInfo:bt(r),currentLayerIdx:a};switch(n){case"layer-info":{const i=Object.assign({action:z.LayerInfo},c);oe(e.SwEvent.Notification,i,t.uuid);break}case"layout-info":{const i=Object.assign({action:z.LayoutInfo},c);oe(e.SwEvent.Notification,i,t.uuid);break}}},bt=e=>{const t=JSON.stringify(e).replace(/memberID/g,"participantId").replace(/ID"/g,'Id"').replace(/POS"/g,'Pos"');return R(t)};class yt{constructor(t,n,s,o,r){this.type=t,this.options=n,this.onSdpReadyTwice=null,this.statsReporter=null,this._negotiating=!1,this._prevConnectionState=null,this._restartedIceOnConnectionStateFailed=!1,this._sleepWakeupIntervalId=null,this.handleConnectionStateChange=()=>i(this,void 0,void 0,(function*(){const{connectionState:t}=this.instance;if(C.info(`[${(new Date).toISOString()}] Connection State changed: ${this._prevConnectionState} -> ${t}`),"failed"===t||"disconnected"===t){const e=()=>i(this,void 0,void 0,(function*(){if(this.isDebugEnabled&&this.statsReporter){const e=yield function(e,t){return i(this,void 0,void 0,(function*(){const i={connectionState:e.connectionState,previousConnectionState:t,iceConnectionState:e.iceConnectionState,iceGatheringState:e.iceGatheringState,signalingState:e.signalingState},n=e.getTransceivers();if(n.length>0){const e=n[0].sender,t=null==e?void 0:e.transport;t&&(i.dtlsState=t.state)}e.sctp&&(i.sctpState=e.sctp.state);try{const t=yield e.getStats();t.forEach((e=>{"candidate-pair"===e.type&&"succeeded"===e.state&&(i.candidatePairState=e.state,t.forEach((t=>{"local-candidate"===t.type&&t.id===e.localCandidateId&&(i.localCandidateType=t.candidateType,i.selectedCandidatePair=i.selectedCandidatePair||{local:{},remote:{}},i.selectedCandidatePair.local={address:t.address,port:t.port,protocol:t.protocol,candidateType:t.candidateType}),"remote-candidate"===t.type&&t.id===e.remoteCandidateId&&(i.remoteCandidateType=t.candidateType,i.selectedCandidatePair=i.selectedCandidatePair||{local:{},remote:{}},i.selectedCandidatePair.remote={address:t.address,port:t.port,protocol:t.protocol,candidateType:t.candidateType})}))),"transport"===e.type&&(i.dtlsCipher=e.dtlsCipher,i.srtpCipher=e.srtpCipher,i.tlsVersion=e.tlsVersion,e.dtlsState&&(i.dtlsState=e.dtlsState))}))}catch(e){C.error("Error gathering connection state details:",e)}return i}))}(this.instance,this._prevConnectionState);this.statsReporter.reportConnectionStateChange(e)}window.removeEventListener("online",e)}));navigator.onLine?e():window.addEventListener("online",e)}"failed"===t&&oe(e.SwEvent.PeerConnectionFailureError,{error:new Error(`Peer Connection failed. previous state: ${this._prevConnectionState}, current state: ${t}`),sessionId:this._session.sessionid},this.options.id),this._prevConnectionState=t,this._isTrickleIce()&&("connecting"===t&&performance.mark("peer-connection-connecting"),"connected"===t&&(performance.mark("peer-connection-connected"),console.group("Performance Metrics"),console.table(this.trickleIcePerformanceMetrics),console.groupEnd(),performance.clearMarks()))})),this._handleIceConnectionStateChange=()=>{C.debug(`[${(new Date).toISOString()}] ICE Connection State`,this.instance.iceConnectionState)},this._handleIceGatheringStateChange=()=>{C.debug(`[${(new Date).toISOString()}] ICE Gathering State`,this.instance.iceGatheringState)},this._setCodecs=(e,t)=>{if(e.setCodecPreferences)return e.setCodecPreferences(t)},C.debug("New Peer with type:",this.type,"Options:",this.options),this._constraints={offerToReceiveAudio:!0,offerToReceiveVideo:!!n.video},this._sdpReady=this._sdpReady.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this._session=s,this._trickleIceSdpFn=o,this._registerPeerEvents=r}get isOffer(){return this.type===B.Offer}get isAnswer(){return this.type===B.Answer}get isDebugEnabled(){return this.options.debug||this._session.options.debug}get debugOutput(){return this.options.debugOutput||this._session.options.debugOutput}get restartedIceOnConnectionStateFailed(){return this._restartedIceOnConnectionStateFailed}isConnectionHealthy(){return"connected"===this.instance.connectionState&&"connected"===this.instance.iceConnectionState&&"closed"!==this.instance.signalingState}startNegotiation(){performance.mark("ice-gathering-start"),this._negotiating=!0,this._isOffer()?this._createOffer():this._createAnswer()}startTrickleIceNegotiation(){return i(this,void 0,void 0,(function*(){performance.mark("ice-gathering-start"),this._negotiating=!0,this._isOffer()?yield this._createOffer().then(this._trickleIceSdpFn.bind(this)):yield this._createAnswer().then(this._trickleIceSdpFn.bind(this))}))}_logTransceivers(){C.info("Number of transceivers:",this.instance.getTransceivers().length),this.instance.getTransceivers().forEach(((e,t)=>{C.info(`>> Transceiver [${t}]:`,e.mid,e.direction,e.stopped),C.info(`>> Sender Params [${t}]:`,JSON.stringify(e.sender.getParameters(),null,2))}))}get trickleIcePerformanceMetrics(){const e=performance.measure("new-call","new-call-start","new-call-end"),t=performance.measure("peer-creation","peer-creation-start","peer-creation-end"),i=performance.measure("ice-gathering","ice-gathering-start","ice-gathering-end"),n=performance.measure("sdp-send","sdp-send-start","sdp-send-end"),s=performance.measure("invite-send","new-call-start","sdp-send-start"),o=performance.measure("total-duration","peer-creation-start","sdp-send-end"),r=e=>`${e.toFixed(2)}ms`;return{"New Call":{duration:r(e.duration)},"Peer Creation":{duration:r(t.duration)},"ICE Gathering":{duration:r(i.duration)},[this._isOffer()?"Invite Send":"Answer Send"]:{duration:r(s.duration)},"SDP Send":{duration:r(n.duration)},"Total Duration":{duration:r(o.duration)}}}handleSignalingStateChangeEvent(){switch(C.info("signalingState:",this.instance.signalingState),this.instance.signalingState){case"stable":this._negotiating=!1;break;case"closed":oe(e.SwEvent.PeerConnectionSignalingStateClosed,{sessionId:this._session.sessionid},this.options.id),this.instance&&(C.debug(`[${this.options.id}] Closing peer due to signalingState closed`),this.close());break;default:this._negotiating=!0}}handleNegotiationNeededEvent(){C.info("Negotiation needed event"),"stable"!==this.instance.signalingState||this._negotiating?C.debug("Skipping negotiation, state:",this.instance.signalingState,"negotiating:",this._negotiating):this._isTrickleIce()?this.startTrickleIceNegotiation():this.startNegotiation()}handleTrackEvent(e){const{streams:[t]}=e,{remoteElement:i,screenShare:n}=this.options;this.options.remoteStream=t,!1===n&&Ue(i,this.options.remoteStream)}createPeerConnection(){return i(this,void 0,void 0,(function*(){var t;this.instance=(t=this._config(),new window.RTCPeerConnection(t)),this.instance.onsignalingstatechange=this.handleSignalingStateChangeEvent,this.instance.onnegotiationneeded=this.handleNegotiationNeededEvent,this.instance.ontrack=this.handleTrackEvent,this.instance.addEventListener("connectionstatechange",this.handleConnectionStateChange),this.instance.addEventListener("iceconnectionstatechange",this._handleIceConnectionStateChange),this.instance.addEventListener("icegatheringstatechange",this._handleIceGatheringStateChange),this.instance.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),this._registerPeerEvents(this.instance),this._prevConnectionState=this.instance.connectionState,this.isAnswer&&(yield this._setRemoteDescription({sdp:this.options.remoteSdp,type:B.Offer})),this.options.localStream=yield this._retrieveLocalStream().catch((t=>(oe(e.SwEvent.MediaError,t,this.options.id),null))),this.options.mutedMicOnStart&&je(this.options.localStream)&&(C.info("Muting local audio tracks on start"),Qe(this.options.localStream)),performance.mark("peer-creation-end")}))}init(){var e;return i(this,void 0,void 0,(function*(){yield this.createPeerConnection(),this.isDebugEnabled&&(this.statsReporter=ft(this._session,this.options.id),yield null===(e=this.statsReporter)||void 0===e?void 0:e.start(this.instance,this._session.sessionid,this._session.sessionid));const{localElement:t,localStream:i=null,screenShare:n=!1}=this.options;if(je(i)){const e=i.getAudioTracks();let s=[...e];if(C.info("Local audio tracks: ",e),"object"==typeof this.options.audio&&e.forEach((e=>{C.info("Local audio tracks constraints: ",e.getConstraints())})),this.options.video){const t=i.getVideoTracks();s=[...e,...t],C.info("Local video tracks: ",t),"object"==typeof this.options.video&&t.forEach((e=>{C.info("Local video tracks constraints: ",e.getConstraints())}))}const{audioCodecs:o,videoCodecs:r}=(e=>{const t=[],i=[];return e&&0!==e.length?(e.forEach((e=>{const n=e.mimeType.toLocaleLowerCase();n.startsWith("audio/")?t.push(e):n.startsWith("video/")&&i.push(e)})),{audioCodecs:t,videoCodecs:i}):{audioCodecs:t,videoCodecs:i}})(this.options.preferred_codecs);if(this.isOffer&&"function"==typeof this.instance.addTransceiver){const e={direction:"sendrecv",streams:[i]};s.forEach((t=>{"audio"===t.kind&&(this.options.userVariables.microphoneLabel=t.label),"video"===t.kind&&(this.options.userVariables.cameraLabel=t.label);const i=this.instance.addTransceiver(t,e);"audio"===t.kind&&o.length>0&&this._setCodecs(i,o),"video"===t.kind&&r.length>0&&this._setCodecs(i,r)}))}else"function"==typeof this.instance.addTrack?(s.forEach((e=>{"audio"===e.kind&&(this.options.userVariables.microphoneLabel=e.label),"video"===e.kind&&(this.options.userVariables.cameraLabel=e.label),this.instance.addTrack(e,i)})),this.instance.getTransceivers().forEach((e=>{"audio"===e.receiver.track.kind&&o.length>0&&this._setCodecs(e,o),"video"===e.receiver.track.kind&&r.length>0&&this._setCodecs(e,r)}))):this.instance.addStream(i);!1===n&&Ue(t,i)}this.isOffer?(this.options.negotiateAudio&&this._checkMediaToNegotiate("audio"),this.options.negotiateVideo&&this._checkMediaToNegotiate("video")):this._isTrickleIce()||this.startNegotiation(),this._isTrickleIce()&&this.startTrickleIceNegotiation(),this._logTransceivers()}))}_getSenderByKind(e){return this.instance.getSenders().find((({track:t})=>t&&t.kind===e))}_checkMediaToNegotiate(e){if(!this._getSenderByKind(e)){const t=this.instance.addTransceiver(e);C.info("Add transceiver",e,t)}}_createOffer(){return i(this,void 0,void 0,(function*(){if(this._isOffer()){this._constraints.offerToReceiveAudio=!1!==this.options.audio,this._constraints.offerToReceiveVideo=Boolean(this.options.video),C.info("_createOffer - this._constraints",this._constraints);try{const e=yield this.instance.createOffer(this._constraints);return yield this._setLocalDescription(e),this._isTrickleIce()||this._sdpReady(),e}catch(e){C.error("Peer _createOffer error:",e)}}}))}_setRemoteDescription(e){return i(this,void 0,void 0,(function*(){C.debug("Setting remote description",e),yield this.instance.setRemoteDescription(e)}))}_createAnswer(){return i(this,void 0,void 0,(function*(){if(this._isAnswer()){if("stable"!==this.instance.signalingState&&"have-remote-offer"!==this.instance.signalingState)return C.debug("Skipping negotiation, state:",this.instance.signalingState),C.debug(" - But the signaling state isn't stable, so triggering rollback"),void(yield Promise.all([this.instance.setLocalDescription({type:"rollback"}),this.instance.setRemoteDescription({sdp:this.options.remoteSdp,type:B.Offer})]));this._logTransceivers();try{const e=yield this.instance.createAnswer();return yield this._setLocalDescription(e),e}catch(e){C.error("Peer _createAnswer error:",e)}}}))}_setLocalDescription(e){return i(this,void 0,void 0,(function*(){yield this.instance.setLocalDescription(e)}))}_sdpReady(){x(this.onSdpReadyTwice)&&this.onSdpReadyTwice(this.instance.localDescription)}_retrieveLocalStream(){return i(this,void 0,void 0,(function*(){if(je(this.options.localStream))return this.options.localStream;const e=yield(t=this.options,i(void 0,void 0,void 0,(function*(){let{audio:e=!0,micId:i,video:n=!1,camId:s}=t;const{micLabel:o="",camLabel:r=""}=t;return i&&(i=yield qe(i,o,Y.AudioIn).catch((e=>null)),i&&("boolean"==typeof e&&(e={}),e.deviceId={exact:i})),s&&(s=yield qe(s,r,Y.Video).catch((e=>null)),s&&("boolean"==typeof n&&(n={}),n.deviceId={exact:s})),{audio:e,video:n}})));var t;return Ge(e)}))}_isOffer(){return this.type===B.Offer}_isAnswer(){return this.type===B.Answer}_isTrickleIce(){return!0===this.options.trickleIce}_config(){const{prefetchIceCandidates:e,forceRelayCandidate:t,iceServers:i}=this.options,n={bundlePolicy:"balanced",iceCandidatePoolSize:e?10:0,iceServers:i,iceTransportPolicy:t?"relay":"all"};return C.info("RTC config",n),n}restartStatsReporter(){return i(this,void 0,void 0,(function*(){this.isDebugEnabled&&this.statsReporter&&(this.instance?this.statsReporter.isRunning?C.debug(`[${this.options.id}] Stats reporter already running, skipping restart`):(C.debug(`[${this.options.id}] Restarting stats reporter after reconnect`),yield this.statsReporter.start(this.instance,this._session.sessionid,this._session.sessionid)):C.debug(`[${this.options.id}] Cannot restart stats reporter - no peer connection instance`))}))}close(){return i(this,void 0,void 0,(function*(){null!==this._sleepWakeupIntervalId&&(clearInterval(this._sleepWakeupIntervalId),this._sleepWakeupIntervalId=null),this.isDebugEnabled&&this.statsReporter&&(yield this.statsReporter.stop(this.debugOutput)),this.instance&&(this.instance.close(),this.instance=null)}))}}const _t=_e;class St{constructor(e,t,i=!1){this.session=e,this._isRecovering=i,this._callReportCollector=null,this.id="",this.state=J[J.New],this.prevState="",this.channels=[],this.role=K.Participant,this.extension=null,this._state=J.New,this._prevState=J.New,this.gotAnswer=!1,this.gotEarly=!1,this._lastSerno=0,this._targetNodeId=null,this._iceTimeout=null,this._iceDone=!1,this._statsBindings=[],this._statsIntervalId=null,this._pendingIceCandidates=[],this._isRemoteDescriptionSet=!1,this._signalingStateClosed=!1,this._creatingPeer=!1,this._checkConferenceSerno=e=>{const t=e<0||!this._lastSerno||this._lastSerno&&e===this._lastSerno+1;return t&&e>=0&&(this._lastSerno=e),t},this._doStats=()=>{this.peer&&this.peer.instance&&0!==this._statsBindings.length&&this.peer.instance.getStats().then((e=>{e.forEach((e=>{this._statsBindings.forEach((t=>{if(t.callback){if(t.constraints)for(const i in t.constraints)if(t.constraints.hasOwnProperty(i)&&t.constraints[i]!==e[i])return;t.callback(e)}}))}))}))};const{iceServers:n,speaker:s,micId:o,micLabel:r,camId:a,camLabel:c,localElement:d,remoteElement:l,options:u,mediaConstraints:{audio:h,video:p},ringtoneFile:g,ringbackFile:v}=e;this.options=Object.assign({},W,{audio:h,video:p,iceServers:(null==t?void 0:t.iceServers)&&Array.isArray(t.iceServers)?t.iceServers:n,localElement:d,remoteElement:l,micId:o,micLabel:r,camId:a,camLabel:c,speakerId:s,ringtoneFile:g,ringbackFile:v,debug:u.debug,debugOutput:u.debugOutput,trickleIce:u.trickleIce,prefetchIceCandidates:u.prefetchIceCandidates,forceRelayCandidate:u.forceRelayCandidate,keepConnectionAliveOnSocketClose:u.keepConnectionAliveOnSocketClose,mutedMicOnStart:u.mutedMicOnStart},t),this._onMediaError=this._onMediaError.bind(this),this._onPeerConnectionFailureError=this._onPeerConnectionFailureError.bind(this),this._onPeerConnectionSignalingStateClosed=this._onPeerConnectionSignalingStateClosed.bind(this),this._onTrickleIceSdp=this._onTrickleIceSdp.bind(this),this._registerPeerEvents=this._registerPeerEvents.bind(this),this._registerTrickleIcePeerEvents=this._registerTrickleIcePeerEvents.bind(this),this._init(),this.options&&(this._ringtone=it(this.options.ringtoneFile,"_ringtone"),this._ringback=it(this.options.ringbackFile,"_ringback"))}get creatingPeer(){return this._creatingPeer}get signalingStateClosed(){return this._signalingStateClosed}get performanceMetrics(){const e=performance.measure("peer-creation","peer-creation-start","peer-creation-end"),t=performance.measure("ice-gathering","ice-gathering-start","ice-gathering-end"),i=performance.measure("sdp-send","sdp-send-start","sdp-send-end"),n=performance.measure("total-duration","peer-creation-start","sdp-send-end"),s=e=>`${e.toFixed(2)}ms`;return{"Peer Creation":{duration:s(e.duration)},"ICE Gathering":{duration:s(t.duration)},"SDP Send":{duration:s(i.duration)},"Total Duration":{duration:s(n.duration)}}}get nodeId(){return this._targetNodeId}set nodeId(e){this._targetNodeId=e}get isVideoCall(){return!!this.options.video}get telnyxIDs(){return{telnyxCallControlId:this.options.telnyxCallControlId,telnyxSessionId:this.options.telnyxSessionId,telnyxLegId:this.options.telnyxLegId}}get localStream(){return this.options.localStream}get remoteStream(){return this.options.remoteStream}get memberChannel(){return`conference-member.${this.id}`}get isAudioMuted(){return!Ze(this.options.localStream)}invite(){return i(this,void 0,void 0,(function*(){this._creatingPeer=!0,this.direction=G.Outbound,this.options.trickleIce&&this._resetTrickleIceCandidateState(),performance.mark("peer-creation-start"),this.peer=new yt(B.Offer,this.options,this.session,this._onTrickleIceSdp,this.options.trickleIce?this._registerTrickleIcePeerEvents:this._registerPeerEvents),yield this.peer.init(),this._creatingPeer=!1}))}answer(e={}){var t;return i(this,void 0,void 0,(function*(){this._creatingPeer=!0,performance.mark("new-call-start"),this.stopRingtone(),this.direction=G.Inbound,(null===(t=null==e?void 0:e.customHeaders)||void 0===t?void 0:t.length)>0&&(this.options=Object.assign(Object.assign({},this.options),{customHeaders:e.customHeaders})),this.options.trickleIce&&this._resetTrickleIceCandidateState(),performance.mark("peer-creation-start"),this.peer=new yt(B.Answer,this.options,this.session,this._onTrickleIceSdp,this.options.trickleIce?this._registerTrickleIcePeerEvents:this._registerPeerEvents),yield this.peer.init(),performance.mark("new-call-end"),this._creatingPeer=!1}))}playRingtone(){nt(this._ringtone)}stopRingtone(){st(this._ringtone)}playRingback(){nt(this._ringback)}stopRingback(){st(this._ringback)}hangup(t,i){var n,s,o;const r=t||{},a=!1!==i;if(this.cause=r.cause||"NORMAL_CLEARING",this.causeCode=r.causeCode||16,this.sipCode=r.sipCode||null,this.sipReason=r.sipReason||null,this.sipCallId=r.sip_call_id||null,this.options.customHeaders=[...null!==(n=this.options.customHeaders)&&void 0!==n?n:[],...null!==(o=null===(s=null==r?void 0:r.dialogParams)||void 0===s?void 0:s.customHeaders)&&void 0!==o?o:[]],r.isRecovering)return this._isRecovering=!0,this.setState(J.Recovering),void this._finalize();this.setState(J.Hangup);const c=()=>{var e;C.debug(`[${this.id}] Closing peer from hangup`),null===(e=this.peer)||void 0===e||e.close(),this.setState(J.Destroy)};if(this.stopRingtone(),this.stopRingback(),a){const t=new Ee({sipCode:this.sipCode,sip_call_id:this.sipCallId,sessid:this.session.sessionid,dialogParams:this.options,cause:this.cause,causeCode:this.causeCode});this._execute(t).catch((t=>{C.error("telnyx_rtc.bye failed!",t),oe(e.SwEvent.Error,{error:t,sessionId:this.session.sessionid},this.session.uuid)})).then(c.bind(this))}else c()}hold(){const e=new xe({sessid:this.session.sessionid,action:"hold",dialogParams:this.options});return this._execute(e).then(this._handleChangeHoldStateSuccess.bind(this)).catch(this._handleChangeHoldStateError.bind(this))}unhold(){const e=new xe({sessid:this.session.sessionid,action:"unhold",dialogParams:this.options});return this._execute(e).then(this._handleChangeHoldStateSuccess.bind(this)).catch(this._handleChangeHoldStateError.bind(this))}toggleHold(){const e=new xe({sessid:this.session.sessionid,action:"toggleHold",dialogParams:this.options});return this._execute(e).then(this._handleChangeHoldStateSuccess.bind(this)).catch(this._handleChangeHoldStateError.bind(this))}dtmf(e){const t=new Oe({sessid:this.session.sessionid,dtmf:e,dialogParams:this.options});this._execute(t)}message(e,t){const i={from:this.session.options.login,to:e,body:t},n=new Oe({sessid:this.session.sessionid,msg:i,dialogParams:this.options});this._execute(n)}muteAudio(){Qe(this.options.localStream)}unmuteAudio(){Ye(this.options.localStream)}toggleAudioMute(){Xe(this.options.localStream)}setAudioInDevice(e,t=this.options.mutedMicOnStart){return i(this,void 0,void 0,(function*(){const{instance:i}=this.peer,n=i.getSenders().find((({track:{kind:e}})=>"audio"===e));if(n){const i=yield Me({audio:{deviceId:{exact:e}}}),s=i.getAudioTracks()[0];s.enabled=!t,n.replaceTrack(s),this.options.micId=e;const{localStream:o}=this.options;o.getAudioTracks().forEach((e=>e.stop())),o.getVideoTracks().forEach((e=>i.addTrack(e))),this.options.localStream=i}}))}muteVideo(){var e;e=this.options.localStream,ze(e,"video",!1)}unmuteVideo(){var e;e=this.options.localStream,ze(e,"video",!0)}toggleVideoMute(){var e;e=this.options.localStream,ze(e,"video",null)}setVideoDevice(e){return i(this,void 0,void 0,(function*(){const{instance:t}=this.peer,i=t.getSenders().find((({track:{kind:e}})=>"video"===e));if(i){const t=yield Me({video:{deviceId:{exact:e}}}),n=t.getVideoTracks()[0];i.replaceTrack(n);const{localElement:s,localStream:o}=this.options;Ue(s,t),this.options.camId=e,o.getAudioTracks().forEach((e=>t.addTrack(e))),o.getVideoTracks().forEach((e=>e.stop())),this.options.localStream=t}}))}deaf(){Qe(this.options.remoteStream)}undeaf(){Ye(this.options.remoteStream)}toggleDeaf(){Xe(this.options.remoteStream)}setBandwidthEncodingsMaxBps(e,t){return i(this,void 0,void 0,(function*(){if(!this||!this.peer)return void C.error("Could not set bandwidth (reason: no peer connection). Dynamic bandwidth can only be set when there is a call running - is there any call running?)");const{instance:i}=this.peer,n=i.getSenders();if(!n)return void C.error("Could not set bandwidth (reason: no senders). Dynamic bandwidth can only be set when there is a call running - is there any call running?)");const s=n.find((({track:{kind:e}})=>e===t));if(s){const i=s.getParameters();i.encodings||(i.encodings=[{rid:"h"}]),C.info("Parameters: ",i),C.info("Setting max ","audio"===t?"audio":"video"," bandwidth to: ",e," [bps]"),i.encodings[0].maxBitrate=e,yield s.setParameters(i).then((()=>{C.info("audio"===t?"New audio":"New video"," bandwidth settings in use: ",s.getParameters())})).catch((e=>C.error(e)))}else C.error("Could not set bandwidth (reason: no "+t+" sender). Dynamic bandwidth can only be set when there is a call running - is there any call running?)")}))}setAudioBandwidthEncodingsMaxBps(e){this.setBandwidthEncodingsMaxBps(e,"audio")}setVideoBandwidthEncodingsMaxBps(e){this.setBandwidthEncodingsMaxBps(e,"video")}getStats(e,t){if(!e)return;const i={callback:e,constraints:t};if(this._statsBindings.push(i),!this._statsIntervalId){const e=2e3;this._startStats(e)}}setState(e){var t;switch(this._prevState=this._state,this._state=e,this.state=J[this._state].toLowerCase(),this.prevState=J[this._prevState].toLowerCase(),C.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this._dispatchNotification({type:H.callUpdate,call:this}),e){case J.Purge:C.debug(`Call ${this.id} hangup call due to purge state`),this.hangup({cause:"PURGE",causeCode:1},!1);break;case J.Active:this._isRecovering&&(this._isRecovering=!1,C.debug(`[${this.id}] Recovery complete, call is active`)),setTimeout((()=>{const{remoteElement:e,speakerId:t}=this.options;e&&t&&$e(e,t)}),0),this._callReportCollector&&(null===(t=this.peer)||void 0===t?void 0:t.instance)&&this.session.callReportId&&this._callReportCollector.start(this.peer.instance);break;case J.Destroy:this._finalize()}}handleMessage(t){const{method:i,params:n}=t;switch(i){case V.Answer:if(this.gotAnswer=!0,this._state>=J.Active)return;this._state>=J.Early&&this.setState(J.Active),this.gotEarly||this._onRemoteSdp(n.sdp),this.stopRingback(),this.stopRingtone();break;case V.Media:if(this._state>=J.Early)return;this.gotEarly=!0,this._onRemoteSdp(n.sdp);break;case V.Display:{const{display_name:t,display_number:s,display_direction:o}=n;this.extension=s;const r=o===G.Inbound?G.Outbound:G.Inbound,a={type:H[i],call:this,displayName:t,displayNumber:s,displayDirection:r};oe(e.SwEvent.Notification,a,this.id)||oe(e.SwEvent.Notification,a,this.session.uuid);break}case V.Candidate:this._addIceCandidate(n);break;case V.Info:case V.Event:{const t=Object.assign(Object.assign({},n),{type:H.generic,call:this});oe(e.SwEvent.Notification,t,this.id)||oe(e.SwEvent.Notification,t,this.session.uuid);break}case V.Ringing:this.playRingback(),n.telnyx_call_control_id&&(this.options.telnyxCallControlId=n.telnyx_call_control_id),n.telnyx_session_id&&(this.options.telnyxSessionId=n.telnyx_session_id),n.telnyx_leg_id&&(this.options.telnyxLegId=n.telnyx_leg_id);break;case V.Bye:const t=n.client_state||n.clientState;t&&(this.options.clientState=t),this.stopRingback(),this.stopRingtone(),this.hangup(n,!1)}}handleConferenceUpdate(e,t){return i(this,void 0,void 0,(function*(){if(!this._checkConferenceSerno(e.wireSerno)&&e.name!==t.laName)return C.error("ConferenceUpdate invalid wireSerno or packet name:",e),"INVALID_PACKET";const{action:i,data:n,hashKey:s=String(this._lastSerno),arrIndex:o}=e;switch(i){case"bootObj":{this._lastSerno=0;const{chatChannel:e,infoChannel:i,modChannel:s,laName:o,conferenceMemberID:r,role:a}=t;this._dispatchConferenceUpdate({action:z.Join,conferenceName:o,participantId:Number(r),role:a}),e&&(yield this._subscribeConferenceChat(e)),i&&(yield this._subscribeConferenceInfo(i));const c=[];for(const e in n)c.push(Object.assign({callId:n[e][0],index:Number(e)},T(n[e][1])));this._dispatchConferenceUpdate({action:z.Bootstrap,participants:c});break}case"add":this._dispatchConferenceUpdate(Object.assign({action:z.Add,callId:s,index:o},T(n)));break;case"modify":this._dispatchConferenceUpdate(Object.assign({action:z.Modify,callId:s,index:o},T(n)));break;case"del":this._dispatchConferenceUpdate(Object.assign({action:z.Delete,callId:s,index:o},T(n)));break;case"clear":this._dispatchConferenceUpdate({action:z.Clear});break;default:this._dispatchConferenceUpdate({action:i,data:n,callId:s,index:o})}}))}_addChannel(e){this.channels.includes(e)||this.channels.push(e);const t=this.session.relayProtocol;this.session._existsSubscription(t,e)&&(this.session.subscriptions[t][e]=Object.assign(Object.assign({},this.session.subscriptions[t][e]),{callId:this.id}))}_subscribeConferenceChat(e){return i(this,void 0,void 0,(function*(){const t={nodeId:this.nodeId,channels:[e],handler:e=>{const{direction:t,from:i,fromDisplay:n,message:s,type:o}=e.data;this._dispatchConferenceUpdate({action:z.ChatMessage,direction:t,participantNumber:i,participantName:n,messageText:s,messageType:o,messageId:e.eventSerno})}},i=yield this.session.vertoSubscribe(t).catch((e=>{C.error("ConfChat subscription error:",e)}));Je(i,e)&&(this._addChannel(e),Object.defineProperties(this,{sendChatMessage:{configurable:!0,value:(t,i)=>{this.session.vertoBroadcast({nodeId:this.nodeId,channel:e,data:{action:"send",message:t,type:i}})}}}))}))}_subscribeConferenceInfo(e){return i(this,void 0,void 0,(function*(){const t={nodeId:this.nodeId,channels:[e],handler:e=>{const{eventData:t}=e;if("layout-info"===t.contentType)t.callID=this.id,mt(this.session,t);else C.error("Conference-Info unknown contentType",e)}},i=yield this.session.vertoSubscribe(t).catch((e=>{C.error("ConfInfo subscription error:",e)}));Je(i,e)&&this._addChannel(e)}))}_confControl(e,t={}){const i=Object.assign({application:"conf-control",callID:this.id,value:null},t);this.session.vertoBroadcast({nodeId:this.nodeId,channel:e,data:i})}_handleChangeHoldStateSuccess(e){return"active"===e.holdState?this.setState(J.Active):this.setState(J.Held),!0}_handleChangeHoldStateError(e){return C.error(`Failed to ${e.action} on call ${this.id}`),!1}_onRemoteSdp(e){return i(this,void 0,void 0,(function*(){const t=new RTCSessionDescription({sdp:e,type:B.Answer});yield this.peer.instance.setRemoteDescription(t).then((()=>{this.options.trickleIce&&(this._isRemoteDescriptionSet=!0,this._flushPendingTrickleIceCandidates()),this.gotEarly&&this.setState(J.Early),this.gotAnswer&&this.setState(J.Active)})).catch((e=>{C.error("Call setRemoteDescription Error: ",e),this.hangup({cause:"USER_BUSY",causeCode:17},!0)}))}))}_requestAnotherLocalDescription(){x(this.peer.onSdpReadyTwice)?oe(e.SwEvent.Error,{error:new Error("SDP without candidates for the second time!"),sessionId:this.session.sessionid},this.session.uuid):(Object.defineProperty(this.peer,"onSdpReadyTwice",{value:this._onIceSdp.bind(this)}),this._iceDone=!1,this.peer.startNegotiation())}_onIceSdp(e){var t,i;this._iceTimeout&&clearTimeout(this._iceTimeout),this._iceTimeout=null,this._iceDone=!0;const{sdp:n,type:s}=e;if(-1===n.indexOf("candidate"))return C.info("No candidate - retry \n"),void this._requestAnotherLocalDescription();null===(i=null===(t=this.peer)||void 0===t?void 0:t.instance)||void 0===i||i.removeEventListener("icecandidate",this._onIce),performance.mark("ice-gathering-end");let o=null;const r={sessid:this.session.sessionid,sdp:n,dialogParams:this.options,"User-Agent":`Web-${_t}`};switch(s){case B.Offer:this.setState(J.Requesting),o=new Ce(r);break;case B.Answer:this._isRecovering||this.setState(J.Answering),o=!0===this.options.attach?new ke(r):new Ie(r);break;default:return C.error(`${this.id} - Unknown local SDP type:`,e),this.hangup({},!1)}performance.mark("sdp-send-start"),this._execute(o).then((e=>{const{node_id:t=null}=e;this._targetNodeId=t,s===B.Offer?this.setState(J.Trying):this.setState(J.Active)})).catch((e=>{C.error(`${this.id} - Sending ${s} error:`,e),this.hangup({cause:"USER_BUSY",causeCode:17},!0)})).finally((()=>{performance.mark("sdp-send-end"),console.group("Performance Metrics"),console.table(this.performanceMetrics),console.groupEnd(),performance.clearMarks()}))}_onTrickleIceSdp(e){if(!e)return C.error("No SDP data provided"),this.hangup({},!1);const{sdp:t,type:i}=e;let n=null;const s={sessid:this.session.sessionid,sdp:t,dialogParams:this.options,trickle:!0,"User-Agent":`Web-${_t}`};switch(i){case B.Offer:this.setState(J.Requesting),n=new Ce(s);break;case B.Answer:this._isRecovering||this.setState(J.Answering),n=!0===this.options.attach?new ke(s):new Ie(s);break;default:return C.error(`${this.id} - Unknown local SDP type:`,e),this.hangup({},!1)}performance.mark("sdp-send-start"),this._execute(n).then((e=>{const{node_id:t=null}=e;this._targetNodeId=t,i===B.Offer?this.setState(J.Trying):this.setState(J.Active)})).catch((e=>{C.error(`${this.id} - Sending ${i} error:`,e),this.hangup({cause:"USER_BUSY",causeCode:17},!0)})).finally((()=>{performance.mark("sdp-send-end")}))}_onIce(e){const{instance:t}=this.peer;null===this._iceTimeout&&(this._iceTimeout=setTimeout((()=>this._onIceSdp(t.localDescription)),1e3)),e.candidate?C.debug("RTCPeer Candidate:",e.candidate):this._onIceSdp(t.localDescription)}_onTrickleIce(e){e.candidate&&e.candidate.candidate?(C.debug("RTCPeer Candidate:",e.candidate),this._sendIceCandidate(e.candidate)):this._sendEndOfCandidates()}_sendIceCandidate(e){const t=new Te({sessid:this.session.sessionid,candidate:e.candidate,sdpMLineIndex:e.sdpMLineIndex,sdpMid:e.sdpMid,dialogParams:this.options});this._execute(t)}_addIceCandidate(e){if(!this._isRemoteDescriptionSet)return C.debug("Remote description not set. Queued ICE candidate.",e),void this._pendingIceCandidates.push(e);this._addIceCandidateToPeer(e)}_addIceCandidateToPeer(e){const t=this.peer.instance.addIceCandidate(e);Promise.resolve(t).then((()=>{C.debug("Successfully added ICE candidate:",e)})).catch((t=>{C.error("Failed to add ICE candidate:",t,e)}))}_sendEndOfCandidates(){const e=new Re({sessid:this.session.sessionid,endOfCandidates:!0,dialogParams:this.options});this._execute(e),performance.mark("ice-gathering-end")}_resetTrickleIceCandidateState(){this._pendingIceCandidates=[],this._isRemoteDescriptionSet=!1}_flushPendingTrickleIceCandidates(){if(!this._pendingIceCandidates.length)return;const e=[...this._pendingIceCandidates];this._pendingIceCandidates=[],e.forEach((e=>{this._addIceCandidateToPeer(e)}))}_registerPeerEvents(e){this._iceDone=!1,e.onicecandidate=e=>{this._iceDone||this._onIce(e)},e.onicecandidateerror=t=>{var i;if(C.debug("ICE candidate error:",t),null===(i=this.peer)||void 0===i?void 0:i.statsReporter){const i=vt(t,e);this.peer.statsReporter.reportIceCandidateError(i)}},e.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),e.addEventListener("track",(e=>{this.options.remoteStream=e.streams[0];const{remoteElement:t,remoteStream:i,screenShare:n}=this.options;!1===n&&Ue(t,i)}))}_registerTrickleIcePeerEvents(e){e.onicecandidate=e=>{this._onTrickleIce(e)},e.onicegatheringstatechange=t=>{C.debug("ICE gathering state changed:",e.iceGatheringState),"complete"===e.iceGatheringState&&C.debug("Finished gathering candidates")},e.onicecandidateerror=t=>{var i;if(C.debug("ICE candidate error:",t),null===(i=this.peer)||void 0===i?void 0:i.statsReporter){const i=vt(t,e);this.peer.statsReporter.reportIceCandidateError(i)}},e.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),e.addEventListener("track",(e=>{this.options.remoteStream=e.streams[0];const{remoteElement:t,remoteStream:i,screenShare:n}=this.options;!1===n&&Ue(t,i)}))}_onMediaError(e){this._dispatchNotification({type:H.userMediaError,error:e}),C.error("Media error, hanging up call",e),this.hangup({},!1)}_onPeerConnectionFailureError(e){this._dispatchNotification({type:H.peerConnectionFailureError,error:e}),C.error("Peer connection failure error")}_onPeerConnectionSignalingStateClosed(e){this._signalingStateClosed=!0,this._dispatchNotification(Object.assign({type:H.signalingStateClosed},e)),C.debug("Peer connection signaling state closed, call is not recoverable")}_dispatchConferenceUpdate(e){this._dispatchNotification(Object.assign({type:H.conferenceUpdate,call:this},e))}_dispatchNotification(t){!0!==this.options.screenShare&&(oe(e.SwEvent.Notification,t,this.id,!1)||oe(e.SwEvent.Notification,t,this.session.uuid))}_execute(e){return this.nodeId&&(e.targetNodeId=this.nodeId),this.session.execute(e)}_init(){const{id:t,userVariables:i,remoteCallerNumber:n,onNotification:s}=this.options;var o;this.options.id=t?t.toString():c(),this.id=this.options.id,i&&(o=i,0!==Object.keys(o).length)||(this.options.userVariables=this.session.options.userVariables||{}),n||(this.options.remoteCallerNumber=this.options.destinationNumber),this.session.calls[this.id]=this,ie(e.SwEvent.MediaError,this._onMediaError,this.id),ie(e.SwEvent.PeerConnectionFailureError,this._onPeerConnectionFailureError,this.id),ie(e.SwEvent.PeerConnectionSignalingStateClosed,this._onPeerConnectionSignalingStateClosed,this.id),x(s)&&ie(e.SwEvent.Notification,s.bind(this),this.id);const r=!1!==this.session.options.enableCallReports,a=this.session.options.callReportInterval||5e3,d=this.session.options.debugLogLevel||"debug",l=this.session.options.debugLogMaxEntries||1e3;r&&(this._callReportCollector=new rt({enabled:!0,interval:a},{enabled:!0,level:d,maxEntries:l}),this._callReportCollector.onFlushNeeded=()=>{this._flushIntermediateReport()}),this._isRecovering?this.setState(J.Recovering):this.setState(J.New),C.info("New Call with Options:",this.options)}_finalize(){var t;this._stopStats(),C.debug(`[${this.id}] Closing peer from _finalize`),null===(t=this.peer)||void 0===t||t.close();const{remoteStream:i,localStream:n}=this.options;Be(i),Be(n),se(e.SwEvent.MediaError,null,this.id),se(e.SwEvent.PeerConnectionFailureError,null,this.id),se(e.SwEvent.PeerConnectionSignalingStateClosed,null,this.id),this.session.calls[this.id]=null,delete this.session.calls[this.id],this._postCallReport()}_flushIntermediateReport(){var e;if(!this._callReportCollector)return;const t=this.session.callReportId;if(!t)return void C.debug("Cannot flush intermediate report: call_report_id not available");const i=null===(e=this.session.connection)||void 0===e?void 0:e.host;if(!i)return void C.debug("Cannot flush intermediate report: connection host not available");const n={callId:this.id,destinationNumber:this.options.destinationNumber,callerNumber:this.options.callerNumber,direction:this.direction===G.Inbound?"inbound":"outbound",state:this.state,telnyxSessionId:this.options.telnyxSessionId,telnyxLegId:this.options.telnyxLegId,sdkVersion:_t},s=this._callReportCollector.flush(n);if(!s)return;const o=F()||void 0;this._callReportCollector.sendPayload(s,t,i,o).catch((e=>{C.error("Failed to post intermediate call report segment",{error:e})}))}_postCallReport(){var e;if(!this._callReportCollector)return void C.warn("Call report collector not initialized");this._callReportCollector.stop();const t=this.session.callReportId;if(!t)return C.debug("Cannot post call report: call_report_id not available"),void this._callReportCollector.cleanup();const i={callId:this.id,destinationNumber:this.options.destinationNumber,callerNumber:this.options.callerNumber,direction:this.direction===G.Inbound?"inbound":"outbound",state:this.state,telnyxSessionId:this.options.telnyxSessionId,telnyxLegId:this.options.telnyxLegId,sdkVersion:_t},n=null===(e=this.session.connection)||void 0===e?void 0:e.host;if(!n)return void C.error("Cannot post call report: connection host not available");const s=F()||void 0;this._callReportCollector.postReport(i,t,n,s).catch((e=>{C.error("Failed to post call report",{error:e})})).finally((()=>{var e;null===(e=this._callReportCollector)||void 0===e||e.cleanup()}))}_startStats(e){this._statsIntervalId=setInterval(this._doStats,e),C.info("Stats started")}_stopStats(){this._statsIntervalId&&(clearInterval(this._statsIntervalId),this._statsIntervalId=null),C.debug("Stats stopped")}}St.setStateTelnyx=e=>{if(e){switch(e._state){case J.Recovering:e.state="recovering";break;case J.Requesting:case J.Trying:case J.Early:e.state="connecting";break;case J.Active:e.state="active";break;case J.Held:e.state="held";break;case J.Hangup:case J.Destroy:e.state="done";break;case J.Answering:e.state="ringing";break;case J.New:e.state="new"}return e}};class wt extends St{constructor(){super(...arguments),this._statsInterval=null,this.sendConversationMessage=(e,t)=>this.session.execute(new ot(e,t))}hangup(e={},t=!0){this.screenShare instanceof wt&&this.screenShare.hangup(e,t),super.hangup(e,t)}startScreenShare(e){return i(this,void 0,void 0,(function*(){const t=yield(i={video:!0},navigator.mediaDevices.getDisplayMedia(i));var i;t.getTracks().forEach((e=>{e.addEventListener("ended",(()=>{this.screenShare&&this.screenShare.hangup()}))}));const{remoteCallerName:n,remoteCallerNumber:s,callerName:o,callerNumber:r}=this.options,a=Object.assign({screenShare:!0,localStream:t,destinationNumber:`${this.extension}-screen`,remoteCallerName:n,remoteCallerNumber:`${s}-screen`,callerName:`${o} (Screen)`,callerNumber:`${r} (Screen)`},e);return this.screenShare=new wt(this.session,a),this.screenShare.invite(),this.screenShare}))}stopScreenShare(){this.screenShare instanceof wt&&this.screenShare.hangup()}setAudioOutDevice(e){return i(this,void 0,void 0,(function*(){this.options.speakerId=e;const{remoteElement:t,speakerId:i}=this.options;return!(!t||!i)&&$e(t,i)}))}_finalize(){this._stats(!1),super._finalize()}_stats(e=!0){if(!1===e)return clearInterval(this._statsInterval);this._statsInterval=window.setInterval((()=>i(this,void 0,void 0,(function*(){const e=yield this.peer.instance.getStats(null);let t="";const i=["certificate","codec","peer-connection","stream","local-candidate","remote-candidate"],n=["id","type","timestamp"];e.forEach((e=>{i.includes(e.type)||(t+=`\n${e.type}\n`,Object.keys(e).forEach((i=>{n.includes(i)||(t+=`\t${i}: ${e[i]}\n`)})))})),C.info(t)}))),2e3)}}class Ct extends De{constructor(e){super(e),this.calls={},this.autoRecoverCalls=!0,this._iceServers=[],this._localElement=null,this._remoteElement=null,this._jwtAuth=!0,this._audioConstraints=!0,this._previousAudioConstraints=!0,this._videoConstraints=!1,this._speaker=null,this._onlineHandler=null,this._offlineHandler=null,this._wasOffline=!1,this._videoConstraints=e.video||!1,this.iceServers=e.iceServers,this.ringtoneFile=e.ringtoneFile,this.ringbackFile=e.ringbackFile,this._setupNetworkListeners()}get reconnectDelay(){return 1e3}getIsRegistered(){const e=Object.create(null,{getIsRegistered:{get:()=>super.getIsRegistered}});return i(this,void 0,void 0,(function*(){return e.getIsRegistered.call(this)}))}connect(){const e=Object.create(null,{connect:{get:()=>super.connect}});return i(this,void 0,void 0,(function*(){e.connect.call(this)}))}checkPermissions(e=!0,t=!0){return i(this,void 0,void 0,(function*(){try{const i=yield Ge({audio:e,video:t});return Be(i),!0}catch(e){return!1}}))}logout(){this.disconnect()}disconnect(){const e=Object.create(null,{disconnect:{get:()=>super.disconnect}});return i(this,void 0,void 0,(function*(){Object.keys(this.calls).forEach((e=>this.calls[e].setState(J.Purge))),this.calls={},this._cleanupNetworkListeners(),yield e.disconnect.call(this)}))}socketDisconnect(){this._closeConnection()}handleLoginError(e){super._handleLoginError(e)}speedTest(t){return new Promise(((i,n)=>{if(ne(e.SwEvent.SpeedTest,(e=>{const{upDur:n,downDur:s}=e,o=s?8*t/(s/1e3)/1024:0;i({upDur:n,downDur:s,upKps:(n?8*t/(n/1e3)/1024:0).toFixed(0),downKps:o.toFixed(0)})}),this.uuid),!(t=Number(t)))return n(`Invalid parameter 'bytes': ${t}`);this.executeRaw(`#SPU ${t}`);let s=t/1024;t%1024&&s++;const o=".".repeat(1024);for(let e=0;e<s;e++)this.executeRaw(`#SPB ${o}`);this.executeRaw("#SPE")}))}getDevices(){return Ve().catch((t=>(oe(e.SwEvent.MediaError,t,this.uuid),[])))}getVideoDevices(){return Ve(Y.Video).catch((t=>(oe(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioInDevices(){return Ve(Y.AudioIn).catch((t=>(oe(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioOutDevices(){return Ve(Y.AudioOut).catch((t=>(C.error("getAudioOutDevices",t),oe(e.SwEvent.MediaError,t,this.uuid),[])))}validateDeviceId(e,t,i){return qe(e,t,i)}getDeviceResolutions(e){return i(this,void 0,void 0,(function*(){try{return yield(e=>i(void 0,void 0,void 0,(function*(){const t=[],i=yield Ge({video:{deviceId:{exact:e}}}),n=i.getVideoTracks()[0];for(let e=0;e<He.length;e++){const[i,s]=He[e];(yield n.applyConstraints({width:{exact:i},height:{exact:s}}).then((()=>!0)).catch((()=>!1)))&&t.push({resolution:`${i}x${s}`,width:i,height:s})}return Be(i),t})))(e)}catch(e){throw e}}))}get mediaConstraints(){return{audio:this._audioConstraints,video:this._videoConstraints}}setAudioSettings(e){return i(this,void 0,void 0,(function*(){if(!e)throw new Error("You need to provide the settings object");const{micId:n,micLabel:s}=e,o=t(e,["micId","micLabel"]);return We(o),this._audioConstraints=yield((e,t,n,s)=>i(void 0,void 0,void 0,(function*(){const{deviceId:i}=s;if(void 0===i&&(e||t)){const i=yield qe(e,t,n).catch((e=>null));i&&(s.deviceId={exact:i})}return s})))(n,s,"audioinput",o),this.micId=n,this.micLabel=s,this._audioConstraints}))}disableMicrophone(){this._previousAudioConstraints=this._audioConstraints,this._audioConstraints=!1}enableMicrophone(){this._audioConstraints=this._previousAudioConstraints||!0}set iceServers(e){if(e&&Array.isArray(e))this._iceServers=e;else{const e="development"===this.options.env;this._iceServers=e?p:h}}get iceServers(){return this._iceServers}set speaker(e){this._speaker=e}get speaker(){return this._speaker}set localElement(e){this._localElement=O(e)}get localElement(){return this._localElement}set remoteElement(e){this._remoteElement=O(e)}get remoteElement(){return this._remoteElement}vertoBroadcast({nodeId:e,channel:t="",data:i}){if(!t)throw new Error(`Invalid channel for broadcast: ${t}`);const n=new Ae({sessid:this.sessionid,eventChannel:t,data:i});e&&(n.targetNodeId=e),this.execute(n).catch((e=>e))}vertoSubscribe({nodeId:e,channels:t=[],handler:n}){return i(this,void 0,void 0,(function*(){if(!(t=t.filter((e=>e&&!this._existsSubscription(this.relayProtocol,e)))).length)return{};const i=new Le({sessid:this.sessionid,eventChannel:t});e&&(i.targetNodeId=e);const s=yield this.execute(i),{unauthorized:o=[],subscribed:r=[]}=Ke(s);return o.length&&o.forEach((e=>this._removeSubscription(this.relayProtocol,e))),r.forEach((e=>this._addSubscription(this.relayProtocol,n,e))),s}))}vertoUnsubscribe({nodeId:e,channels:t=[]}){return i(this,void 0,void 0,(function*(){if(!(t=t.filter((e=>e&&this._existsSubscription(this.relayProtocol,e)))).length)return{};const i=new Pe({sessid:this.sessionid,eventChannel:t});e&&(i.targetNodeId=e);const n=yield this.execute(i),{unsubscribed:s=[],notSubscribed:o=[]}=Ke(n);return s.forEach((e=>this._removeSubscription(this.relayProtocol,e))),o.forEach((e=>this._removeSubscription(this.relayProtocol,e))),n}))}_setupNetworkListeners(){"undefined"!=typeof window&&(this._onlineHandler=()=>{this._wasOffline&&(C.debug(`Network connectivity restored for session ${this.sessionid}. Reconnecting...`),this._wasOffline=!1,this._autoReconnect=!0,this.socketDisconnect())},this._offlineHandler=()=>{this._wasOffline=!0,C.debug(`Network connectivity lost for session ${this.sessionid}`)},window.addEventListener("online",this._onlineHandler),window.addEventListener("offline",this._offlineHandler))}_cleanupNetworkListeners(){"undefined"!=typeof window&&this._onlineHandler&&this._offlineHandler&&(window.removeEventListener("online",this._onlineHandler),window.removeEventListener("offline",this._offlineHandler),this._onlineHandler=null,this._offlineHandler=null)}static telnyxStateCall(e){return wt.setStateTelnyx(e)}}class It{constructor(e,t){this.code=t,this.message=e}}class kt{constructor(e){this.session=e,this.retriedConnect=0,this.retriedRegister=0,this.receivedAuthenticationRequired=0}_ack(e,t){const i=new we(e,t);this.nodeId&&(i.targetNodeId=this.nodeId),this.session.execute(i)}reconnectDelay(){return 1e3*P(2,6)}handleMessage(t){var n,s,o;const{session:r}=this,{id:a,method:c,params:d={},voice_sdk_id:l}=t,u=null==d?void 0:d.callID,h=null==d?void 0:d.eventChannel,p=null==d?void 0:d.eventType,g=r.calls[u],v=null===(n=null==g?void 0:g.peer)||void 0===n?void 0:n.isConnectionHealthy();if("channelPvtData"===p)return this._handlePvtEvent(d.pvtData);const f=(e=!1)=>{var t,i,n,s,o,a;const l={audio:!0,video:r.options.video,remoteSdp:d.sdp,destinationNumber:d.callee_id_number,remoteCallerName:d.caller_id_name,remoteCallerNumber:d.caller_id_number,callerName:d.callee_id_name,callerNumber:d.callee_id_number,attach:c===V.Attach,mediaSettings:d.mediaSettings,debug:null!==(t=r.options.debug)&&void 0!==t&&t,debugOutput:null!==(i=r.options.debugOutput)&&void 0!==i?i:"socket",trickleIce:null!==(n=r.options.trickleIce)&&void 0!==n&&n,prefetchIceCandidates:null===(s=r.options.prefetchIceCandidates)||void 0===s||s,forceRelayCandidate:null!==(o=r.options.forceRelayCandidate)&&void 0!==o&&o,keepConnectionAliveOnSocketClose:null!==(a=r.options.keepConnectionAliveOnSocketClose)&&void 0!==a&&a};u&&(l.id=u),d.telnyx_call_control_id&&(l.telnyxCallControlId=d.telnyx_call_control_id),d.telnyx_session_id&&(l.telnyxSessionId=d.telnyx_session_id),d.telnyx_leg_id&&(l.telnyxLegId=d.telnyx_leg_id),d.client_state&&(l.clientState=d.client_state),d.dialogParams&&d.dialogParams.custom_headers&&d.dialogParams.custom_headers.length&&(l.customHeaders=d.dialogParams.custom_headers);const h=new wt(r,l,e);return h.nodeId=this.nodeId,h},m=new fe(l),b=new be(l);switch(c){case V.Answer:case V.Display:case V.Candidate:case V.Ringing:case V.Bye:case V.Media:if(!u||!g)return void C.error(`Received ${c} for non existing call:`,d);g.handleMessage(t),this._ack(a,c);break;case V.Ping:this.session.setPingReceived(),this.session.execute(b).then((()=>{this.receivedAuthenticationRequired=0})).catch((e=>i(this,void 0,void 0,(function*(){e.code===this.session.authenticationRequiredErrorCode&&this.receivedAuthenticationRequired>=0&&(this.receivedAuthenticationRequired+=1,this.receivedAuthenticationRequired>1&&this.session.hasAutoReconnect()&&(C.warn("Ping failed twice with Authentication Required. Re-logging in..."),this.session.login(),this.receivedAuthenticationRequired=-1))}))));break;case V.Punt:r.options.keepConnectionAliveOnSocketClose&&v?(C.info(`[${(new Date).toISOString()}][${u}] keeping session calls alive due to PUNT and keepConnectionAliveOnSocketClose. Disconnecting base session...`),r.socketDisconnect(),this._ack(a,c)):r.disconnect();break;case V.Invite:{const e=f();e.playRingtone(),e.setState(J.Ringing),e.direction=G.Inbound,this._ack(a,c);break}case V.Attach:{if(!g){return f().answer(),void this._ack(a,c)}const e=!!g;C.info(`[${(new Date).toISOString()}][${u}] closing existing call on ATTACH.`),g.hangup({isRecovering:e},!1),C.info(`[${(new Date).toISOString()}][${u}] Attach: Creating new call for recovery`);f(e).answer(),this._ack(a,c);break}case V.Event:case"webrtc.event":if(!h)return void C.error("Verto received an unknown event:",d);const n=r.relayProtocol,l=h.split(".")[0];r._existsSubscription(n,h)?oe(n,d,h):h===r.sessionid?this._handleSessionEvent(d.eventData):r._existsSubscription(n,l)?oe(n,d,l):r.calls.hasOwnProperty(h)?r.calls[h].handleMessage(t):oe(e.SwEvent.Notification,d,r.uuid);break;case V.Info:d.type=H.generic,oe(e.SwEvent.Notification,d,r.uuid);break;case V.ClientReady:this.session.execute(m);break;default:{const i=M(t);if(i){switch(i){case Q.REGISTER:case Q.REGED:if(r.connection.previousGatewayState!==Q.REGED&&r.connection.previousGatewayState!==Q.REGISTER){this.session._triggerKeepAliveTimeoutCheck(),this.retriedRegister=0;const i=null===(o=null===(s=null==t?void 0:t.result)||void 0===s?void 0:s.params)||void 0===o?void 0:o.call_report_id;i&&(r.callReportId=i,C.debug("Captured call_report_id from REGED:",i)),d.type=H.vertoClientReady,oe(e.SwEvent.Ready,d,r.uuid)}break;case Q.UNREGED:case Q.NOREG:if(this.retriedRegister+=1,5===this.retriedRegister){this.retriedRegister=0,oe(e.SwEvent.Error,{error:new It("Fail to register the user, the server tried 5 times","UNREGED|NOREG"),sessionId:r.sessionid},r.uuid);break}setTimeout((()=>{this.session.execute(m)}),this.reconnectDelay());break;case Q.FAILED:case Q.FAIL_WAIT:if(r.connection.previousGatewayState!==Q.FAILED&&r.connection.previousGatewayState!==Q.FAIL_WAIT){if(!this.session.hasAutoReconnect()){this.retriedConnect=0,oe(e.SwEvent.Error,{error:new It("Fail to connect the server, the server tried 5 times","FAILED|FAIL_WAIT"),sessionId:r.sessionid},r.uuid);break}if(this.retriedConnect+=1,5===this.retriedConnect){this.retriedConnect=0,oe(e.SwEvent.Error,{error:new Error("Connection Retry Failed"),sessionId:r.sessionid},r.uuid);break}setTimeout((()=>{if(C.debug(`Reconnecting... Retry ${this.retriedConnect} of 5`),this.session.options.keepConnectionAliveOnSocketClose){const e=Object.values(r.calls).some((e=>{var t;return(null===(t=e.peer)||void 0===t?void 0:t.instance)&&!e.signalingStateClosed}));if(e)return C.debug("Reconnecting by keeping the existing session due to keepConnectionAliveOnSocketClose option being set."),void this.session.socketDisconnect();C.debug("keepConnectionAliveOnSocketClose is set but all peer connections have signalingState closed, doing full reconnect")}this.session.disconnect().then((()=>{this.session.clearConnection(),this.session.connect()}))}),this.reconnectDelay())}break;default:C.warn("GatewayState message unknown method:",t)}break}C.debug("Verto message unknown method:",t);break}}}_retrieveCallId(e,t){const i=Object.keys(this.session.calls);if("bootObj"!==e.action)return i.find((e=>this.session.calls[e].channels.includes(t)));{const t=e.data.find((e=>i.includes(e[0])));if(t instanceof Array)return t[0]}}_handlePvtEvent(t){return i(this,void 0,void 0,(function*(){const{session:i}=this,n=i.relayProtocol,{action:s,laChannel:o,laName:r,chatChannel:a,infoChannel:c,modChannel:d,conferenceMemberID:l,role:u,callID:h}=t;switch(s){case"conference-liveArray-join":{const e=()=>{i.vertoBroadcast({nodeId:this.nodeId,channel:o,data:{liveArray:{command:"bootstrap",context:o,name:r}}})},n={nodeId:this.nodeId,channels:[o],handler:({data:n})=>{const s=h||this._retrieveCallId(n,o);if(s&&i.calls.hasOwnProperty(s)){const a=i.calls[s];a._addChannel(o),a.extension=r,a.handleConferenceUpdate(n,t).then((t=>{"INVALID_PACKET"===t&&e()}))}}},s=yield i.vertoSubscribe(n).catch((e=>{C.error("liveArray subscription error:",e)}));Je(s,o)&&e();break}case"conference-liveArray-part":{let t=null;if(o&&i._existsSubscription(n,o)){const{callId:s=null}=i.subscriptions[n][o];if(t=i.calls[s]||null,null!==s){const n={type:H.conferenceUpdate,action:z.Leave,conferenceName:r,participantId:Number(l),role:u};oe(e.SwEvent.Notification,n,s,!1)||oe(e.SwEvent.Notification,n,i.uuid),null===t&&se(e.SwEvent.Notification,null,s)}}const s=[o,a,c,d];i.vertoUnsubscribe({nodeId:this.nodeId,channels:s}).then((({unsubscribedChannels:e=[]})=>{t&&(t.channels=t.channels.filter((t=>!e.includes(t))))})).catch((e=>{C.error("liveArray unsubscribe error:",e)}));break}}}))}_handleSessionEvent(t){switch(t.contentType){case"layout-info":case"layer-info":mt(this.session,t);break;case"logo-info":{const i={type:H.conferenceUpdate,action:z.LogoInfo,logo:t.logoURL};oe(e.SwEvent.Notification,i,this.session.uuid);break}}}}class Et extends Ct{constructor(e){super(e),this.relayProtocol="verto-protocol",this.timeoutErrorCode=-329990,this.handleLoginOnSocketOpen=()=>i(this,void 0,void 0,(function*(){this._idle=!1;const{autoReconnect:e=!0}=this.options;yield this.login({onSuccess:()=>{this._autoReconnect=e}})})),this.handleAnonymousLoginOnSocketOpen=()=>i(this,void 0,void 0,(function*(){this._idle=!1,yield this.login()})),this._vertoHandler=new kt(this),window.addEventListener("beforeunload",(e=>{this.calls&&Object.keys(this.calls).forEach((e=>{this.calls[e]&&(C.info(`Hanging up call due to window unload: ${e}`),this.calls[e].hangup({},!0))}))}))}validateOptions(){return N(this.options)||D(this.options)}newCall(e){if(!this.validateCallOptions(e))throw new Error("Verto.newCall() error: destinationNumber is required.");performance.mark("new-call-start");const t=new wt(this,e);return t.invite(),performance.mark("new-call-end"),t}broadcast(e){return this.vertoBroadcast(e)}subscribe(e){return this.vertoSubscribe(e)}unsubscribe(e){return this.vertoUnsubscribe(e)}validateCallOptions(e){return!!D(this.options)||Boolean(e.destinationNumber)}_onSocketOpen(){return i(this,void 0,void 0,(function*(){return N(this.options)?this.handleLoginOnSocketOpen():D(this.options)?this.handleAnonymousLoginOnSocketOpen():void 0}))}_onSocketMessage(e){this._vertoHandler.handleMessage(e)}}class Tt extends Et{constructor(e){super(e),C.info(`SDK version: ${ye}`)}newCall(e){return super.newCall(e)}static webRTCInfo(){return et()}static webRTCSupportedBrowserList(){return[{operationSystem:"Android",supported:[{browserName:"Chrome",features:["audio"],supported:tt.full},{browserName:"Firefox",features:["audio"],supported:tt.partial},{browserName:"Safari",supported:tt.not_supported},{browserName:"Edge",supported:tt.not_supported}]},{operationSystem:"iOS",supported:[{browserName:"Chrome",supported:tt.not_supported},{browserName:"Firefox",supported:tt.not_supported},{browserName:"Safari",features:["video","audio"],supported:tt.full},{browserName:"Edge",supported:tt.not_supported}]},{operationSystem:"Linux",supported:[{browserName:"Chrome",features:["video","audio"],supported:tt.full},{browserName:"Firefox",features:["audio"],supported:tt.partial},{browserName:"Safari",supported:tt.not_supported},{browserName:"Edge",supported:tt.not_supported}]},{operationSystem:"MacOS",supported:[{browserName:"Chrome",features:["video","audio"],supported:tt.full},{browserName:"Firefox",features:["audio"],supported:tt.partial},{browserName:"Safari",features:["video","audio"],supported:tt.full},{browserName:"Edge",features:["audio"],supported:tt.partial}]},{operationSystem:"Windows",supported:[{browserName:"Chrome",features:["video","audio"],supported:tt.full},{browserName:"Firefox",features:["audio"],supported:tt.partial},{browserName:"Safari",supported:tt.not_supported},{browserName:"Edge",features:["audio"],supported:tt.partial}]}]}}class Rt{static run(t){return i(this,void 0,void 0,(function*(){const i=j({}),n=j({}),s=new Tt(t.credentials);yield s.connect(),s.on(e.SwEvent.Ready,i.resolve),s.on(e.SwEvent.Error,i.reject),s.on(e.SwEvent.MediaError,i.reject),s.on(e.SwEvent.MediaError,i.reject),s.on(e.SwEvent.Notification,(e=>{e.call&&e.call.sipCode>=400&&n.reject(new Error(e.call.sipReason))})),ie(e.SwEvent.StatsReport,(e=>{n.resolve(Rt.mapReport(e))})),yield i.promise,yield s.newCall({destinationNumber:t.texMLApplicationNumber,debug:!0});const o=yield n.promise;return yield s.disconnect(),o}))}static mapReport(e){var t,i,n,s,o,r,a,c,d,l,u,h,p;const g=[],v=[];for(const t of e)switch(t.event){case"onicecandidate":t.data&&g.push(t.data);break;case"stats":v.push(t.data)}let f=0,m=1/0,b=-1/0,y=0,_=1/0,S=-1/0,w=0;v.forEach((e=>{var t,i,n;if(!(null===(t=e.remote.audio.inbound)||void 0===t?void 0:t[0]))return;f+=1;const s=null!==(i=e.remote.audio.inbound[0].jitter)&&void 0!==i?i:0,o=null!==(n=e.remote.audio.inbound[0].roundTripTime)&&void 0!==n?n:0;y+=s,w+=o,b=Math.max(b,s),m=Math.min(m,s),S=Math.max(S,o),_=Math.min(_,o)}));const C=w/f,I=y/f,k=v[v.length-1],E=lt({jitter:1e3*I,rtt:1e3*C,packetsReceived:null!==(n=null===(i=null===(t=k.audio.inbound)||void 0===t?void 0:t[0])||void 0===i?void 0:i.packetsReceived)&&void 0!==n?n:0,packetsLost:null!==(r=null===(o=null===(s=k.audio.inbound)||void 0===s?void 0:s[0])||void 0===o?void 0:o.packetsLost)&&void 0!==r?r:0});return{iceCandidatePairStats:v[v.length-1].connection,summaryStats:{mos:E,jitter:{average:I,max:b,min:m},rtt:{average:C,max:S,min:_},quality:ut(E)},sessionStats:{packetsSent:null!==(a=k.connection.packetsSent)&&void 0!==a?a:0,bytesSent:null!==(c=k.connection.bytesSent)&&void 0!==c?c:0,bytesReceived:null!==(d=k.connection.bytesReceived)&&void 0!==d?d:0,packetsLost:null!==(h=null===(u=null===(l=k.remote.audio.inbound)||void 0===l?void 0:l[0])||void 0===u?void 0:u.packetsLost)&&void 0!==h?h:0,packetsReceived:null!==(p=k.connection.packetsReceived)&&void 0!==p?p:0},iceCandidateStats:g}}getTelnyxIds(){return{telnyxCallControlId:"",telnyxSessionId:"",telnyxLegId:""}}}e.Call=wt,e.ERROR_TYPE=q,e.NOTIFICATION_TYPE=H,e.PreCallDiagnosis=Rt,e.TelnyxRTC=Tt,Object.defineProperty(e,"__esModule",{value:!0})}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).TelnyxWebRTC={})}(this,(function(e){"use strict";function t(e,t){var i={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(i[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(n=Object.getOwnPropertySymbols(e);s<n.length;s++)t.indexOf(n[s])<0&&Object.prototype.propertyIsEnumerable.call(e,n[s])&&(i[n[s]]=e[n[s]])}return i}function i(e,t,i,n){return new(i||(i=Promise))((function(s,o){function r(e){try{c(n.next(e))}catch(e){o(e)}}function a(e){try{c(n.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(r,a)}c((n=n.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;var n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),s=new Uint8Array(16);function o(){if(!n)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(s)}for(var r=[],a=0;a<256;++a)r[a]=(a+256).toString(16).substr(1);function c(e,t,i){var n=t&&i||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var s=(e=e||{}).random||(e.rng||o)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t)for(var a=0;a<16;++a)t[n+a]=s[a];return t||function(e,t){var i=t||0,n=r;return[n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],"-",n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]],n[e[i++]]].join("")}(s)}const d="wss://rtc.telnyx.com",l=1006,u={urls:"stun:stun.l.google.com:19302"},h=[{urls:"stun:stun.telnyx.com:3478"},u,{urls:"turn:turn.telnyx.com:3478?transport=udp",username:"testuser",credential:"testpassword"},{urls:"turn:turn.telnyx.com:3478?transport=tcp",username:"testuser",credential:"testpassword"}],p=[{urls:"stun:stundev.telnyx.com:3478"},u,{urls:"turn:turndev.telnyx.com:3478?transport=udp",username:"testuser",credential:"testpassword"},{urls:"turn:turndev.telnyx.com:3478?transport=tcp",username:"testuser",credential:"testpassword"}];var g;(g=e.SwEvent||(e.SwEvent={})).SocketOpen="telnyx.socket.open",g.SocketClose="telnyx.socket.close",g.SocketError="telnyx.socket.error",g.SocketMessage="telnyx.socket.message",g.SpeedTest="telnyx.internal.speedtest",g.Ready="telnyx.ready",g.Error="telnyx.error",g.Notification="telnyx.notification",g.StatsFrame="telnyx.stats.frame",g.StatsReport="telnyx.stats.report",g.Messages="telnyx.messages",g.Calls="telnyx.calls",g.MediaError="telnyx.rtc.mediaError",g.PeerConnectionFailureError="telnyx.rtc.peerConnectionFailureError",g.PeerConnectionSignalingStateClosed="telnyx.rtc.peerConnectionSignalingStateClosed";var v="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function f(e,t){return e(t={exports:{}},t.exports),t.exports}var m=f((function(e){var t,i;t=v,i=function(){var e=function(){},t="undefined",i=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"];function s(e,t){var i=e[t];if("function"==typeof i.bind)return i.bind(e);try{return Function.prototype.bind.call(i,e)}catch(t){return function(){return Function.prototype.apply.apply(i,[e,arguments])}}}function o(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function r(t,i){for(var s=0;s<n.length;s++){var o=n[s];this[o]=s<t?e:this.methodFactory(o,t,i)}this.log=this.debug}function a(e,i,n){return function(){typeof console!==t&&(r.call(this,i,n),this[e].apply(this,arguments))}}function c(n,r,c){return function(n){return"debug"===n&&(n="log"),typeof console!==t&&("trace"===n&&i?o:void 0!==console[n]?s(console,n):void 0!==console.log?s(console,"log"):e)}(n)||a.apply(this,arguments)}function d(e,i,s){var o,a=this;i=null==i?"WARN":i;var d="loglevel";function l(){var e;if(typeof window!==t&&d){try{e=window.localStorage[d]}catch(e){}if(typeof e===t)try{var i=window.document.cookie,n=i.indexOf(encodeURIComponent(d)+"=");-1!==n&&(e=/^([^;]+)/.exec(i.slice(n))[1])}catch(e){}return void 0===a.levels[e]&&(e=void 0),e}}"string"==typeof e?d+=":"+e:"symbol"==typeof e&&(d=void 0),a.name=e,a.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},a.methodFactory=s||c,a.getLevel=function(){return o},a.setLevel=function(i,s){if("string"==typeof i&&void 0!==a.levels[i.toUpperCase()]&&(i=a.levels[i.toUpperCase()]),!("number"==typeof i&&i>=0&&i<=a.levels.SILENT))throw"log.setLevel() called with invalid level: "+i;if(o=i,!1!==s&&function(e){var i=(n[e]||"silent").toUpperCase();if(typeof window!==t&&d){try{return void(window.localStorage[d]=i)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"="+i+";"}catch(e){}}}(i),r.call(a,i,e),typeof console===t&&i<a.levels.SILENT)return"No console available for logging"},a.setDefaultLevel=function(e){i=e,l()||a.setLevel(e,!1)},a.resetLevel=function(){a.setLevel(i,!1),function(){if(typeof window!==t&&d){try{return void window.localStorage.removeItem(d)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch(e){}}}()},a.enableAll=function(e){a.setLevel(a.levels.TRACE,e)},a.disableAll=function(e){a.setLevel(a.levels.SILENT,e)};var u=l();null==u&&(u=i),a.setLevel(u,!1)}var l=new d,u={};l.getLogger=function(e){if("symbol"!=typeof e&&"string"!=typeof e||""===e)throw new TypeError("You must supply a name when creating a logger.");var t=u[e];return t||(t=u[e]=new d(e,l.getLevel(),l.methodFactory)),t};var h=typeof window!==t?window.log:void 0;return l.noConflict=function(){return typeof window!==t&&window.log===l&&(window.log=h),l},l.getLoggers=function(){return u},l.default=l,l},e.exports?e.exports=i():t.log=i()}));const b={debug:0,info:1,warn:2,error:3};class y{constructor(e={}){var t,i,n;this.buffer=[],this.isCapturing=!1,this.options={enabled:null!==(t=e.enabled)&&void 0!==t&&t,level:null!==(i=e.level)&&void 0!==i?i:"debug",maxEntries:null!==(n=e.maxEntries)&&void 0!==n?n:1e3}}start(){this.options.enabled&&(this.isCapturing=!0,this.buffer=[])}stop(){this.isCapturing=!1}addEntry(e,t,i){if(!this.isCapturing||!this.options.enabled)return;if(b[e]<b[this.options.level])return;const n=Object.assign({timestamp:(new Date).toISOString(),level:e,message:t},i&&Object.keys(i).length>0?{context:i}:{});this.buffer.push(n),this.buffer.length>this.options.maxEntries&&this.buffer.shift()}getLogs(){return[...this.buffer]}getLogCount(){return this.buffer.length}drain(){const e=this.buffer;return this.buffer=[],e}clear(){this.buffer=[]}isActive(){return this.isCapturing}isEnabled(){return this.options.enabled}}let _=null;function S(){return _}function w(e){_=e}const C=m.getLogger("telnyx"),I={trace:0,debug:1,info:2,warn:3,error:4};let k=I.info;function E(e){if(null==e)return e;if("object"!=typeof e)return e;try{const t=JSON.stringify(e),i=JSON.parse(t);if("object"==typeof i&&null!==i&&Object.keys(i).length>1)return i}catch(e){}const t={};for(const i in e)try{const n=e[i];if("function"==typeof n)continue;if("object"==typeof n&&null!==n)try{t[i]=JSON.parse(JSON.stringify(n))}catch(e){t[i]=String(n)}else t[i]=n}catch(e){}return Object.keys(t).length>0?t:{value:String(e)}}const T=C.methodFactory;C.methodFactory=(e,t,i)=>{const n=T(e,t,i);return function(...t){if(I[e]>=k){const e=[(new Date).toISOString().replace("T"," ").replace("Z",""),"-"];for(const i of t)e.push(i);n(...e)}const i=S();if(null==i?void 0:i.isActive()){const[n,...s]=t,o="string"==typeof n?n:JSON.stringify(n);let r;s.length>0&&(r=1===s.length&&"object"==typeof s[0]&&null!==s[0]?E(s[0]):{args:s.map(E)}),i.addEntry(e,o,r)}}},C.setLevel("debug",!1);const R=e=>{const[t,i,n,s,o,r]=e;let a={};try{a=JSON.parse(o.replace(/ID"/g,'Id"'))}catch(e){C.warn("Verto LA invalid media JSON string:",o)}return{participantId:Number(t),participantNumber:i,participantName:n,codec:s,media:a,participantData:r}},x=e=>{if("string"!=typeof e)return e;try{return JSON.parse(e)}catch(t){return e}},O=e=>e instanceof Function||"function"==typeof e,A=e=>"object"==typeof document&&"getElementById"in document?"string"==typeof e?document.getElementById(e)||null:"function"==typeof e?e():e instanceof HTMLMediaElement?e:null:null,L=/^(ws|wss):\/\//,P=(e,t=null)=>{const{result:i={},error:n}=e;if(n)return{error:n};const{result:s=null}=i;if(null===s)return null!==t&&(i.node_id=t),{result:i};const{code:o=null,node_id:r=null,result:a=null}=s;return o&&"200"!==o?{error:s}:a?P(a,r):{result:s}},N=(e,t)=>Math.floor(Math.random()*(t-e+1)+e),D=({login:e,passwd:t,password:i,login_token:n})=>Boolean(e&&(t||i)||n),M=({anonymous_login:e})=>Boolean(e)&&Boolean(e.target_id)&&Boolean(e.target_type),j=e=>{var t,i,n,s,o,r;let a="",c="";(null===(i=null===(t=null==e?void 0:e.result)||void 0===t?void 0:t.params)||void 0===i?void 0:i.state)&&(a=null===(s=null===(n=null==e?void 0:e.result)||void 0===n?void 0:n.params)||void 0===s?void 0:s.state),(null===(o=null==e?void 0:e.params)||void 0===o?void 0:o.state)&&(c=null===(r=null==e?void 0:e.params)||void 0===r?void 0:r.state);return a||c};function U({debounceTime:e}){let t,i;return{promise:new Promise(((n,s)=>{t=e?$(n,e):n,i=s})),resolve:t,reject:i}}const $=(e,t)=>{let i;return(...n)=>{clearTimeout(i),i=window.setTimeout((()=>{e(...n)}),t)}},F="telnyx-voice-sdk-id";function B(){return sessionStorage.getItem(F)}var G,V,H;"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{sessionStorage.removeItem(F)})),function(e){e.Offer="offer",e.Answer="answer"}(G||(G={})),function(e){e.Inbound="inbound",e.Outbound="outbound"}(V||(V={})),function(e){e.Invite="telnyx_rtc.invite",e.Attach="telnyx_rtc.attach",e.Answer="telnyx_rtc.answer",e.Info="telnyx_rtc.info",e.Candidate="telnyx_rtc.candidate",e.EndOfCandidates="telnyx_rtc.endOfCandidates",e.Display="telnyx_rtc.display",e.Media="telnyx_rtc.media",e.Event="telnyx_rtc.event",e.Bye="telnyx_rtc.bye",e.Punt="telnyx_rtc.punt",e.Broadcast="telnyx_rtc.broadcast",e.Subscribe="telnyx_rtc.subscribe",e.Unsubscribe="telnyx_rtc.unsubscribe",e.ClientReady="telnyx_rtc.clientReady",e.Modify="telnyx_rtc.modify",e.Ringing="telnyx_rtc.ringing",e.GatewayState="telnyx_rtc.gatewayState",e.Ping="telnyx_rtc.ping",e.Pong="telnyx_rtc.pong"}(H||(H={}));const q={generic:"event",[H.Display]:"participantData",[H.Attach]:"participantData",conferenceUpdate:"conferenceUpdate",callUpdate:"callUpdate",vertoClientReady:"vertoClientReady",userMediaError:"userMediaError",peerConnectionFailureError:"peerConnectionFailureError",signalingStateClosed:"signalingStateClosed"},W={invalidCredentialsOptions:"InvalidCredentialsOptions"},J={destinationNumber:"",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:!0,useStereo:!1,debug:!1,debugOutput:"socket",attach:!1,screenShare:!1,userVariables:{},mediaSettings:{useSdpASBandwidthKbps:!1,sdpASBandwidthKbps:0},mutedMicOnStart:!1,prefetchIceCandidates:!0};var K,z,Y,Q,X;!function(e){e[e.New=0]="New",e[e.Requesting=1]="Requesting",e[e.Trying=2]="Trying",e[e.Recovering=3]="Recovering",e[e.Ringing=4]="Ringing",e[e.Answering=5]="Answering",e[e.Early=6]="Early",e[e.Active=7]="Active",e[e.Held=8]="Held",e[e.Hangup=9]="Hangup",e[e.Destroy=10]="Destroy",e[e.Purge=11]="Purge"}(K||(K={})),function(e){e.Participant="participant",e.Moderator="moderator"}(z||(z={})),function(e){e.Join="join",e.Leave="leave",e.Bootstrap="bootstrap",e.Add="add",e.Modify="modify",e.Delete="delete",e.Clear="clear",e.ChatMessage="chatMessage",e.LayerInfo="layerInfo",e.LogoInfo="logoInfo",e.LayoutInfo="layoutInfo",e.LayoutList="layoutList",e.ModCmdResponse="modCommandResponse"}(Y||(Y={})),function(e){e.Video="videoinput",e.AudioIn="audioinput",e.AudioOut="audiooutput"}(Q||(Q={})),function(e){e.REGED="REGED",e.UNREGED="UNREGED",e.NOREG="NOREG",e.FAILED="FAILED",e.FAIL_WAIT="FAIL_WAIT",e.REGISTER="REGISTER",e.TRYING="TRYING",e.EXPIRED="EXPIRED",e.UNREGISTER="UNREGISTER"}(X||(X={}));const Z="GLOBAL",ee={},te=(e,t)=>`${e}|${t}`,ie=(e,t=Z)=>te(e,t)in ee,ne=(e,t,i=Z)=>{const n=te(e,i);n in ee||(ee[n]=[]),ee[n].push(t)},se=(e,t,i=Z)=>{const n=function(s){oe(e,n,i),t(s)};return n.prototype.targetRef=t,ne(e,n,i)},oe=(e,t,i=Z)=>{if(!ie(e,i))return!1;const n=te(e,i);if(O(t)){for(let e=ee[n].length-1;e>=0;e--){const i=ee[n][e];(t===i||i.prototype&&t===i.prototype.targetRef)&&ee[n].splice(e,1)}}else ee[n]=[];return 0===ee[n].length&&delete ee[n],!0},re=(e,t,i=Z,n=!0)=>{const s=n&&i!==Z;if(!ie(e,i))return s&&re(e,t),!1;const o=te(e,i),r=ee[o].length;if(!r)return s&&re(e,t),!1;for(let e=r-1;e>=0;e--)ee[o][e](t);return s&&re(e,t),!0},ae=e=>{const t=te(e,"");Object.keys(ee).filter((e=>0===e.indexOf(t))).forEach((e=>delete ee[e]))};let ce="undefined"!=typeof WebSocket?WebSocket:null;const de=0,le=1,ue=2,he=3;class pe{constructor(e){this.session=e,this.previousGatewayState="",this._wsClient=null,this._host=d,this._timers={},this._useCanaryRtcServer=!1,this._hasCanaryBeenUsed=!1,this._safetyTimeoutId=null,this.upDur=null,this.downDur=null;const{host:t,env:i,region:n,useCanaryRtcServer:s}=e.options;i&&(this._host="development"===i?"wss://rtcdev.telnyx.com":d),t&&(this._host=(e=>`${L.test(e)?"":"wss://"}${e}`)(t)),n&&(this._host=this._host.replace(/rtc(dev)?/,`${n}.rtc$1`)),s&&(this._useCanaryRtcServer=!0)}get connected(){return!!this._wsClient&&this._wsClient.readyState===le}get connecting(){return!!this._wsClient&&this._wsClient.readyState===de}get closing(){return!!this._wsClient&&this._wsClient.readyState===ue}get closed(){return!!this._wsClient&&this._wsClient.readyState===he}get isAlive(){return this.connecting||this.connected}get isDead(){return this.closing||this.closed}get host(){return this._host}connect(){const t=new URL(this._host);let i=B();this.session.options.rtcIp&&this.session.options.rtcPort&&(i=null,this._useCanaryRtcServer=!1,t.searchParams.set("rtc_ip",this.session.options.rtcIp),t.searchParams.set("rtc_port",this.session.options.rtcPort.toString())),i&&t.searchParams.set("voice_sdk_id",i),this._useCanaryRtcServer&&(t.searchParams.set("canary","true"),i&&!this._hasCanaryBeenUsed&&(t.searchParams.delete("voice_sdk_id"),C.debug("first canary connection. Refreshing voice_sdk_id")),this._hasCanaryBeenUsed=!0);try{this._wsClient=new ce(t.toString()),this._registerSocketEvents(this._wsClient)}catch(t){const i=t instanceof Error?t:new Error(`Failed to create WebSocket: ${String(t)}`);re(e.SwEvent.Error,{error:i},this.session.uuid),C.error("WebSocket connection failed:",i)}}sendRawText(e){var t;null===(t=this._wsClient)||void 0===t||t.send(e)}send(e){var t;const{request:i}=e,n=new Promise(((e,t)=>{if(i.hasOwnProperty("result"))return e();se(i.id,(i=>{const{result:n,error:s}=P(i);return s?t(s):e(n)}))}));return C.debug("SEND: \n",JSON.stringify(i,null,2),"\n"),null===(t=this._wsClient)||void 0===t||t.send(JSON.stringify(i)),n}close(){if(!this._wsClient||this.closing)return;const e=this._wsClient;O(this._wsClient._beginClose)?this._wsClient._beginClose():this._wsClient.close(),this._safetyTimeoutId||(this._safetyTimeoutId=setTimeout((()=>this._handleCloseTimeout(e)),5e3))}_registerSocketEvents(t){t.onopen=t=>re(e.SwEvent.SocketOpen,t,this.session.uuid),t.onclose=i=>(this._clearSafetyTimeout(),this._safetyCleanupSocket(t,"close"),re(e.SwEvent.SocketClose,i,this.session.uuid)),t.onerror=i=>(this._clearSafetyTimeout(),this._safetyCleanupSocket(t,"error"),re(e.SwEvent.SocketError,{error:i,sessionId:this.session.sessionid},this.session.uuid)),t.onmessage=t=>{var i,n;const s=x(t.data);var o;if("string"!=typeof s){if(s.voice_sdk_id&&(o=s.voice_sdk_id,sessionStorage.setItem(F,o)),this._unsetTimer(s.id),C.debug("RECV: \n",JSON.stringify(s,null,2),"\n"),X[`${null===(n=null===(i=null==s?void 0:s.result)||void 0===i?void 0:i.params)||void 0===n?void 0:n.state}`]||!re(s.id,s)){const t=j(s);re(e.SwEvent.SocketMessage,s,this.session.uuid),Boolean(t)&&(this.previousGatewayState=t)}}else this._handleStringResponse(s)}}_deregisterSocketEvents(e){e.onopen=null,e.onclose=null,e.onerror=null,e.onmessage=null}_handleCloseTimeout(t){this._safetyTimeoutId=null,t&&t.readyState!==he?(C.warn("Socket stuck in CLOSING after 5s — forcefully cleaning up"),this._deregisterSocketEvents(t),this._safetyCleanupSocket(t,"timeout"),this._wsClient&&this._wsClient!==t||re(e.SwEvent.SocketClose,{code:l,reason:"STUCK_WS_TIMEOUT: Socket got stuck in CLOSING state and was forcefully cleaned up by safety timeout",wasClean:!1},this.session.uuid)):C.warn("Safety timeout fired but socket is already closed or cleaned up")}_clearSafetyTimeout(){this._safetyTimeoutId&&(C.debug("Clearing safety timeout"),clearTimeout(this._safetyTimeoutId),this._safetyTimeoutId=null)}_safetyCleanupSocket(e,t){this._wsClient===e?(C.debug(`Nulling socket reference (reason: ${t})`),this._wsClient=null):C.debug(`Skipping socket cleanup - old socket already replaced (reason: ${t})`)}_unsetTimer(e){clearTimeout(this._timers[e]),delete this._timers[e]}_handleStringResponse(t){if(/^#SP/.test(t))switch(t[3]){case"U":this.upDur=parseInt(t.substring(4));break;case"D":this.downDur=parseInt(t.substring(4)),re(e.SwEvent.SpeedTest,{upDur:this.upDur,downDur:this.downDur},this.session.uuid)}else C.warn("Unknown message from socket",t)}}class ge{buildRequest(e){this.request=Object.assign({jsonrpc:"2.0",id:c()},e)}}const ve={id:"callID",destinationNumber:"destination_number",remoteCallerName:"remote_caller_id_name",remoteCallerNumber:"remote_caller_id_number",callerName:"caller_id_name",callerNumber:"caller_id_number",customHeaders:"custom_headers"};class fe extends ge{constructor(e={}){if(super(),e.hasOwnProperty("dialogParams")){const i=t(e.dialogParams,["remoteSdp","localStream","remoteStream","localElement","remoteElement","onNotification","camId","micId","speakerId"]);for(const e in ve)e&&i.hasOwnProperty(e)&&(i[ve[e]]=i[e],delete i[e]);e.dialogParams=i}this.buildRequest({method:this.toString(),params:e})}}class me extends fe{constructor(e){super(),this.method=H.GatewayState;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}class be{constructor(e){this.pendingRequestId=null,this.onSocketMessage=e=>i(this,void 0,void 0,(function*(){e.id===this.pendingRequestId&&this.gatewayStateTask.resolve(j(e))})),this.getIsRegistered=()=>i(this,void 0,void 0,(function*(){const e=new me(B());this.pendingRequestId=e.request.id,this.gatewayStateTask=U({}),this.session.execute(e);const t=yield this.gatewayStateTask.promise;return!!t&&[X.REGISTER,X.REGED].includes(t)})),this.session=e,this.gatewayStateTask=U({}),this.session.on("telnyx.socket.message",this.onSocketMessage)}}class ye extends fe{constructor(e){super(),this.method=H.Ping;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}var _e="2.25.20",Se=_e;class we extends fe{constructor(e,t,i,n,s={},o){super(),this.method="login";const r={login:e,passwd:t,login_token:i,userVariables:s,reconnection:o,loginParams:{},"User-Agent":{sdkVersion:Se,data:navigator.userAgent}};n&&(r.sessid=n),this.buildRequest({method:this.method,params:r})}}class Ce extends fe{constructor(e,t){super(),this.buildRequest({id:e,result:{method:t}})}}class Ie extends fe{toString(){return H.Invite}}class ke extends fe{toString(){return H.Answer}}class Ee extends fe{toString(){return H.Attach}}class Te extends fe{toString(){return H.Bye}}class Re extends fe{toString(){return H.Candidate}}class xe extends fe{toString(){return H.EndOfCandidates}}class Oe extends fe{toString(){return H.Modify}}class Ae extends fe{toString(){return H.Info}}class Le extends fe{toString(){return H.Broadcast}}class Pe extends fe{toString(){return H.Subscribe}}class Ne extends fe{toString(){return H.Unsubscribe}}class De extends fe{constructor(e){super(),this.method="anonymous_login";const{target_type:t,target_id:i,target_version_id:n,userVariables:s,sessionId:o,reconnection:r}=e,a={target_type:t,target_id:i,userVariables:s,reconnection:r,"User-Agent":{sdkVersion:Se,data:navigator.userAgent}};o&&(a.sessid=o),n&&(a.target_version_id=n),this.buildRequest({method:this.method,params:a})}}class Me{constructor(e){if(this.options=e,this.uuid=c(),this.sessionid="",this.subscriptions={},this.signature=null,this.relayProtocol=null,this.contexts=[],this.timeoutErrorCode=-32e3,this.invalidMethodErrorCode=-32601,this.authenticationRequiredErrorCode=-32e3,this.callReportId=null,this.connection=null,this._jwtAuth=!1,this._autoReconnect=!0,this._idle=!1,this._executeQueue=[],!this.validateOptions())throw new Error("Invalid init options");var t,i;t=e.debug?"debug":"info",k=null!==(i=I[t])&&void 0!==i?i:I.info,this._onSocketOpen=this._onSocketOpen.bind(this),this.onNetworkClose=this.onNetworkClose.bind(this),this._onSocketMessage=this._onSocketMessage.bind(this),this._handleLoginError=this._handleLoginError.bind(this),this._attachListeners(),this.connection=new pe(this),this.registerAgent=new be(this)}get __logger(){return C}get connected(){return this.connection&&this.connection.connected}getIsRegistered(){return i(this,void 0,void 0,(function*(){return this.registerAgent.getIsRegistered()}))}get reconnectDelay(){return 1e3*N(2,6)}execute(e){return this._idle?new Promise((t=>this._executeQueue.push({resolve:t,msg:e}))):this.connected?this.connection.send(e):new Promise((t=>{this._executeQueue.push({resolve:t,msg:e}),C.debug("Calling connect from execute since not currently connected."),this.connect()}))}executeRaw(e){this._idle?this._executeQueue.push({msg:e}):this.connection.sendRawText(e)}validateOptions(){return D(this.options)||M(this.options)}broadcast(e){}disconnect(){return i(this,void 0,void 0,(function*(){clearTimeout(this._reconnectTimeout),this.subscriptions={},this._autoReconnect=!1,this.relayProtocol=null,this._closeConnection(),yield sessionStorage.removeItem(this.signature),this._executeQueue=[],this._detachListeners(),C.debug("Session disconnected. Cleaned up all listeners and subscriptions, closed connection, disabled auto-reconnect.")}))}on(e,t){return ne(e,t,this.uuid),this}off(e,t){return oe(e,t,this.uuid),this}connect(){return i(this,void 0,void 0,(function*(){this.connection||(C.debug("No existing connection found, creating a new one."),this.connection=new pe(this)),this._attachListeners(),this._autoReconnect=!0,this.connection.isAlive||(C.debug("Initiating connection to the server..."),this.connection.connect()),C.debug("Connect method called. Connection initiated.")}))}_handleLoginError(t){re(e.SwEvent.Error,{error:t,sessionId:this.sessionid},this.uuid)}login({creds:t,onSuccess:n,onError:s}={}){return i(this,void 0,void 0,(function*(){if(this.connection&&this.connection.isAlive){if(t&&(void 0!==t.login&&(this.options.login=t.login),void 0!==t.password&&(this.options.password=t.password),void 0!==t.passwd&&(this.options.passwd=t.passwd),void 0!==t.login_token&&(this.options.login_token=t.login_token),void 0!==t.userVariables&&(this.options.userVariables=t.userVariables),void 0!==t.anonymous_login&&(this.options.anonymous_login=t.anonymous_login)),D(this.options))return this._login({type:"login",onSuccess:n,onError:s});if(M(this.options))return this._login({type:"anonymous_login",onSuccess:n,onError:s});{const t="Invalid login options provided for authentication.";return C.error(t),void re(e.SwEvent.Error,{error:new Error(t),type:W.invalidCredentialsOptions,sessionId:this.sessionid},this.uuid)}}}))}_login({type:e,onSuccess:t,onError:n}){return i(this,void 0,void 0,(function*(){let i;i="login"===e?new we(this.options.login,this.options.password||this.options.passwd,this.options.login_token,this.sessionid,this.options.userVariables,!!B()):new De({target_id:this.options.anonymous_login.target_id,target_type:this.options.anonymous_login.target_type,target_version_id:this.options.anonymous_login.target_version_id,sessionId:this.sessionid,userVariables:this.options.userVariables,reconnection:!!B()});const s=yield this.execute(i).catch((e=>{this._handleLoginError(e),n&&n(e)}));s&&(this.sessionid=s.sessid,t&&t())}))}_onSocketOpen(){return i(this,void 0,void 0,(function*(){}))}onNetworkClose(){this.relayProtocol&&ae(this.relayProtocol);for(const e in this.subscriptions)ae(e);this.subscriptions={},this.contexts=[],clearTimeout(this._keepAliveTimeout),clearTimeout(this._reconnectTimeout),this.connection&&(this.connection.previousGatewayState=""),this._autoReconnect&&(this._reconnectTimeout=setTimeout((()=>{C.debug("Calling connect due to network close and auto-reconnect enabled."),this.connect()}),this.reconnectDelay))}_onSocketMessage(e){}_removeSubscription(e,t){this._existsSubscription(e,t)&&(t?(delete this.subscriptions[e][t],oe(e,null,t)):(delete this.subscriptions[e],ae(e)))}_addSubscription(e,t=null,i){this._existsSubscription(e,i)||(this._existsSubscription(e)||(this.subscriptions[e]={}),this.subscriptions[e][i]={},O(t)&&ne(e,t,i))}_existsSubscription(e,t){return!(!this.subscriptions.hasOwnProperty(e)||!(!t||t&&this.subscriptions[e].hasOwnProperty(t)))}_attachListeners(){this._detachListeners(),this.on(e.SwEvent.SocketOpen,this._onSocketOpen),this.on(e.SwEvent.SocketClose,this.onNetworkClose),this.on(e.SwEvent.SocketError,this.onNetworkClose),this.on(e.SwEvent.SocketMessage,this._onSocketMessage)}_detachListeners(){this.off(e.SwEvent.SocketOpen,this._onSocketOpen),this.off(e.SwEvent.SocketClose,this.onNetworkClose),this.off(e.SwEvent.SocketError,this.onNetworkClose),this.off(e.SwEvent.SocketMessage,this._onSocketMessage)}_emptyExecuteQueues(){this._executeQueue.forEach((({resolve:e,msg:t})=>{"string"==typeof t?this.executeRaw(t):e(this.execute(t))}))}_closeConnection(){this._idle=!0,clearTimeout(this._keepAliveTimeout),this.connection&&this.connection.close()}_resetKeepAlive(){!1===this._pong&&(C.warn("No ping/pong received, forcing PING ACK to keep alive"),this.execute(new ye(B()))),clearTimeout(this._keepAliveTimeout),this._triggerKeepAliveTimeoutCheck()}_triggerKeepAliveTimeoutCheck(){this._pong=!1,this._keepAliveTimeout=setTimeout((()=>this._resetKeepAlive()),35e3)}setPingReceived(){C.debug("Ping received"),this._pong=!0}static on(e,t){ne(e,t)}static off(e){oe(e)}static uuid(){return c()}clearConnection(){this.connection=null}hasAutoReconnect(){return this._autoReconnect}}const je=e=>navigator.mediaDevices.getUserMedia(e),Ue=e=>e&&e instanceof MediaStream,$e=(e,t)=>{const i=A(e);null!==i&&(i.getAttribute("autoplay")||i.setAttribute("autoplay","autoplay"),i.getAttribute("playsinline")||i.setAttribute("playsinline","playsinline"),i.srcObject=t)},Fe=(e,t)=>i(void 0,void 0,void 0,(function*(){const i=A(e);if(null===i)return C.info("No HTMLMediaElement to attach the speakerId"),!1;if("string"!=typeof t)return C.info(`Invalid speaker deviceId: '${t}'`),!1;try{return yield i.setSinkId(t),!0}catch(e){return!1}})),Be=e=>{e&&"live"===e.readyState&&e.stop()},Ge=e=>{Ue(e)&&e.getTracks().forEach(Be),e=null},Ve=e=>i(void 0,void 0,void 0,(function*(){C.info("RTCService.getUserMedia",e);const{audio:i,video:n}=e;if(!i&&!n)return null;try{return yield je(e)}catch(i){if(C.error("getUserMedia error: ",i),(e=>"NotReadableError"===e.name||"NotFoundError"===e.name||"OverconstrainedError"===e.name)(i)){const n=(e=>{const{audio:i,video:n}=e;let s=!1,o=i,r=n;if("object"==typeof i&&null!==i&&"deviceId"in i){s=!0;const e=t(i,["deviceId"]);o=0===Object.keys(e).length||e}if("object"==typeof n&&null!==n&&"deviceId"in n){s=!0;const e=t(n,["deviceId"]);r=0===Object.keys(e).length||e}return s?{audio:o,video:r}:null})(e);if(n){C.warn("Device not found or not readable, falling back to default device");try{return yield je(n)}catch(e){throw C.error("Fallback getUserMedia also failed: ",e),i}}}throw i}})),He=(e=null,t=!1)=>i(void 0,void 0,void 0,(function*(){let i=[];const n=yield navigator.mediaDevices.getUserMedia(((e=null)=>({audio:!e||e===Q.AudioIn||e===Q.AudioOut,video:!e||e===Q.Video}))(e)).catch((e=>(C.error(e),null)));if(n){if(Ge(n),i=yield navigator.mediaDevices.enumerateDevices(),e&&(i=i.filter((t=>t.kind===e))),!0===t)return i;const s=[];i=i.filter((e=>{if(!e.groupId)return!0;const t=`${e.kind}-${e.groupId}`;return!s.includes(t)&&(s.push(t),!0)}))}return i})),qe=[[320,240],[640,360],[640,480],[1280,720],[1920,1080]],We=(e,t,n)=>i(void 0,void 0,void 0,(function*(){const i=yield He(n,!0);for(let n=0;n<i.length;n++){const{deviceId:s,label:o}=i[n];if(e===s||t===o)return s}return null})),Je=e=>{const t=navigator.mediaDevices.getSupportedConstraints();Object.keys(e).map((i=>{t.hasOwnProperty(i)&&null!==e[i]&&void 0!==e[i]||delete e[i]}))},Ke=(e,t)=>{if(!e)return!1;const{subscribed:i,alreadySubscribed:n}=ze(e);return i.includes(t)||n.includes(t)},ze=e=>{const t={subscribed:[],alreadySubscribed:[],unauthorized:[],unsubscribed:[],notSubscribed:[]};return Object.keys(t).forEach((i=>{t[i]=e[`${i}Channels`]||[]})),t},Ye=(e,t=null,i=null)=>{if(!Ue(e))return null;let n=[];switch(t){case"audio":n=e.getAudioTracks();break;case"video":n=e.getVideoTracks();break;default:n=e.getTracks()}n.forEach((e=>{switch(i){case"on":case!0:e.enabled=!0;break;case"off":case!1:e.enabled=!1;break;default:e.enabled=!e.enabled}}))},Qe=e=>{Ye(e,"audio",!0)},Xe=e=>{Ye(e,"audio",!1)},Ze=e=>{Ye(e,"audio",null)},et=e=>((e,t=null)=>{if(!Ue(e))return null;let i=[];switch(t){case"audio":i=e.getAudioTracks();break;case"video":i=e.getVideoTracks();break;default:i=e.getTracks()}return i.some((e=>e.enabled))})(e,"audio");function tt(){try{const{browserInfo:e,name:t,version:i,supportAudio:n,supportVideo:s}=function(){if(!window||!window.navigator||!window.navigator.userAgent)throw new Error("You should use @telnyx/webrtc in a web browser such as Chrome|Firefox|Safari");if(navigator.userAgent.match(/chrom(e|ium)/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)&&!navigator.userAgent.match(/edg/gim)){const e=navigator.userAgent.match(/chrom(e|ium)\/[0-9]+\./gim)[0].split("/"),t=e[0],i=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:i,supportAudio:!0,supportVideo:!0}}if(navigator.userAgent.match(/firefox/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)&&!navigator.userAgent.match(/edg/gim)){const e=navigator.userAgent.match(/firefox\/[0-9]+\./gim)[0].split("/"),t=e[0],i=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:i,supportAudio:!0,supportVideo:!1}}if(navigator.userAgent.match(/safari/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)&&!navigator.userAgent.match(/edg/gim)){const e=navigator.userAgent.match(/safari/gim)[0],t=navigator.userAgent.match(/version\/[0-9]+\./gim)[0].split("/"),i=parseInt(t[1],10);return{browserInfo:navigator.userAgent,name:e,version:i,supportAudio:!0,supportVideo:!0}}if(navigator.userAgent.match(/edg/gim)&&!navigator.userAgent.match(/OPR\/[0-9]{2}/gi)){const e=navigator.userAgent.match(/edg\/[0-9]+\./gim)[0].split("/"),t=e[0],i=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:i,supportAudio:!0,supportVideo:!0}}throw new Error("This browser does not support @telnyx/webrtc. To see browser support list: `TelnyxRTC.webRTCSupportedBrowserList()`")}(),o=window.RTCPeerConnection,r=window.RTCSessionDescription,a=window.RTCIceCandidate,c=window.navigator&&window.navigator.mediaDevices,d=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.msGetUserMedia||navigator.mozGetUserMedia;return{browserInfo:e,browserName:t,browserVersion:i,supportWebRTC:!!(o&&r&&a&&c&&d),supportWebRTCAudio:n,supportWebRTCVideo:s,supportRTCPeerConnection:!!o,supportSessionDescription:!!r,supportIceCandidate:!!a,supportMediaDevices:!!c,supportGetUserMedia:!!Ve}}catch(e){return e.message}}var it;function nt(e,t){const i=document.getElementById(t);if(i)return i;if(e&&t){const i=document.createElement("audio");return i.id=t,i.loop=!0,i.src=e,i.preload="auto",i.load(),document.body.appendChild(i),i}return null}function st(e){e&&(e._playFulfilled=!1,e._promise=e.play(),e._promise.then((()=>{e._playFulfilled=!0})).catch((t=>{C.error("playAudio",t),e._playFulfilled=!0})))}function ot(e){e&&(e._playFulfilled?(e.pause(),e.currentTime=0):e._promise&&e._promise.then?e._promise.then((()=>{e.pause(),e.currentTime=0})):setTimeout((()=>{e.pause(),e.currentTime=0}),1e3))}!function(e){e.not_supported="not supported",e.full="full",e.partial="partial"}(it||(it={}));class rt extends ge{constructor(e,t){super(),this.method="ai_conversation",this.buildRequest({method:this.method,params:{type:"conversation.item.create",previous_item_id:null,item:{id:c(),type:"message",role:"user",content:[{type:"input_text",text:e},...null==t?void 0:t.map((e=>({type:"image_url",image_url:{url:e}})))]}}})}}class at{constructor(e,t){this.peerConnection=null,this.intervalId=null,this.statsBuffer=[],this.intervalStartTime=null,this.callEndTime=null,this.logCollector=null,this.intervalAudioLevels={outbound:[],inbound:[]},this.intervalJitters=[],this.intervalRTTs=[],this.intervalBitrates={outbound:[],inbound:[]},this.previousStats={},this.MAX_BUFFER_SIZE=360,this.onFlushNeeded=null,this._segmentIndex=0,this._flushing=!1,this.options=e,this.logCollectorOptions=t||{enabled:!1,level:"debug",maxEntries:1e3},this.callStartTime=new Date,this.logCollectorOptions.enabled&&(this.logCollector=function(e){return new y(e)}(this.logCollectorOptions),this.logCollector.start(),w(this.logCollector))}start(e){var t,i;this.options.enabled&&(this.peerConnection=e,this.intervalStartTime=new Date,C.info("CallReportCollector: Starting stats collection",{interval:this.options.interval,logCollectorActive:null!==(i=null===(t=this.logCollector)||void 0===t?void 0:t.isActive())&&void 0!==i&&i}),this.intervalId=setInterval((()=>{this._collectStats()}),this.options.interval))}stop(){var e,t;this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),this.callEndTime=new Date,this.peerConnection&&this.intervalStartTime&&this._collectStats();const i=null!==(t=null===(e=this.logCollector)||void 0===e?void 0:e.getLogCount())&&void 0!==t?t:0;this.logCollector&&this.logCollector.stop(),C.info("CallReportCollector: Stopped stats collection",{totalIntervals:this.statsBuffer.length,totalLogs:i,duration:this.callEndTime.getTime()-this.callStartTime.getTime()})}flush(e){var t,i;if(this._flushing||0===this.statsBuffer.length)return null;this._flushing=!0;try{const n=this._segmentIndex++,s=this.statsBuffer;this.statsBuffer=[];const o=null!==(i=null===(t=this.logCollector)||void 0===t?void 0:t.drain())&&void 0!==i?i:[],r=new Date,a=Object.assign(Object.assign({summary:Object.assign(Object.assign({},e),{durationSeconds:(r.getTime()-this.callStartTime.getTime())/1e3,startTimestamp:this.callStartTime.toISOString(),endTimestamp:r.toISOString()}),stats:s},o.length>0?{logs:o}:{}),{segment:n});return C.info("CallReportCollector: Flushed intermediate segment",{segment:n,intervals:s.length,logEntries:o.length,callId:e.callId}),a}finally{this._flushing=!1}}postReport(e,t,n,s){var o,r;return i(this,void 0,void 0,(function*(){if(!this.options.enabled||0===this.statsBuffer.length)return;const i=null===(o=this.logCollector)||void 0===o?void 0:o.getLogs(),a=this._segmentIndex>0,c=this._segmentIndex,d=Object.assign(Object.assign({summary:Object.assign(Object.assign({},e),{durationSeconds:this.callEndTime&&this.callStartTime?(this.callEndTime.getTime()-this.callStartTime.getTime())/1e3:void 0,startTimestamp:this.callStartTime.toISOString(),endTimestamp:null===(r=this.callEndTime)||void 0===r?void 0:r.toISOString()}),stats:this.statsBuffer},i&&i.length>0?{logs:i}:{}),a?{segment:c}:{});yield this._sendPayload(d,t,n,s)}))}sendPayload(e,t,n,s){return i(this,void 0,void 0,(function*(){yield this._sendPayload(e,t,n,s)}))}_sendPayload(e,t,n,s){var o,r;return i(this,void 0,void 0,(function*(){try{const i=new URL(n),a=`${i.protocol.replace(/^ws/,"http")}//${i.host}/call_report`,c=void 0!==e.segment&&!e.summary.endTimestamp?`intermediate segment ${e.segment}`:"final report";C.info(`CallReportCollector: Posting ${c}`,{endpoint:a,intervals:e.stats.length,logEntries:null!==(r=null===(o=e.logs)||void 0===o?void 0:o.length)&&void 0!==r?r:0,callId:e.summary.callId,segment:e.segment});const d={"Content-Type":"application/json","x-call-report-id":t,"x-call-id":e.summary.callId};s&&(d["x-voice-sdk-id"]=s);const l=yield fetch(a,{method:"POST",headers:d,body:JSON.stringify(e)});if(l.ok)C.info(`CallReportCollector: Successfully posted ${c}`);else{const e=yield l.text();C.error(`CallReportCollector: Failed to post ${c}`,{status:l.status,error:e})}}catch(e){C.error("CallReportCollector: Error posting report",{error:e})}}))}getStatsBuffer(){return this.statsBuffer}getLogs(){var e,t;return null!==(t=null===(e=this.logCollector)||void 0===e?void 0:e.getLogs())&&void 0!==t?t:[]}cleanup(){this.logCollector&&(this.logCollector.clear(),S()===this.logCollector&&w(null),this.logCollector=null)}_collectStats(){var e,t;return i(this,void 0,void 0,(function*(){if(this.peerConnection&&this.intervalStartTime)try{const i=yield this.peerConnection.getStats(),n=new Date;let s=null,o=null,r=null;if(i.forEach((e=>{switch(e.type){case"outbound-rtp":"audio"===e.kind&&"audio"===e.mediaType&&(s=e);break;case"inbound-rtp":"audio"===e.kind&&"audio"===e.mediaType&&(o=e);break;case"candidate-pair":(e.nominated||"succeeded"===e.state)&&(r=e)}})),s){const e=this._getTrackAudioLevel(i,s.trackId);if(null!==e&&this.intervalAudioLevels.outbound.push(e),void 0!==this.previousStats.outboundBytes&&void 0!==this.previousStats.timestamp){const e=(s.bytesSent||0)-this.previousStats.outboundBytes,t=(s.timestamp||n.getTime())-this.previousStats.timestamp;if(t>0){const i=8*e*1e3/t;this.intervalBitrates.outbound.push(i)}}this.previousStats.outboundBytes=s.bytesSent}if(o){const e=this._getTrackAudioLevel(i,o.trackId);if(null!==e&&this.intervalAudioLevels.inbound.push(e),void 0!==o.jitter&&this.intervalJitters.push(1e3*o.jitter),void 0!==this.previousStats.inboundBytes&&void 0!==this.previousStats.timestamp){const e=(o.bytesReceived||0)-this.previousStats.inboundBytes,t=(o.timestamp||n.getTime())-this.previousStats.timestamp;if(t>0){const i=8*e*1e3/t;this.intervalBitrates.inbound.push(i)}}this.previousStats.inboundBytes=o.bytesReceived}r&&void 0!==r.currentRoundTripTime&&this.intervalRTTs.push(r.currentRoundTripTime),this.previousStats.timestamp=n.getTime();if(n.getTime()-this.intervalStartTime.getTime()>=this.options.interval){const i=this._createStatsEntry(this.intervalStartTime,n,s,o,r);if(this.statsBuffer.push(i),this.statsBuffer.length>this.MAX_BUFFER_SIZE&&(this.statsBuffer.shift(),C.warn("CallReportCollector: Buffer size limit reached, removing oldest entry")),this.onFlushNeeded&&!this._flushing){const i=this.statsBuffer.length,n=null!==(t=null===(e=this.logCollector)||void 0===e?void 0:e.getLogCount())&&void 0!==t?t:0;if(i>=at.STATS_FLUSH_THRESHOLD||n>=at.LOGS_FLUSH_THRESHOLD){C.info("CallReportCollector: Approaching buffer limits, requesting flush",{statsIntervals:i,logEntries:n});try{this.onFlushNeeded()}catch(e){C.error("CallReportCollector: onFlushNeeded callback error",{error:e})}}}this.intervalStartTime=n,this._resetIntervalAccumulators()}}catch(e){C.error("CallReportCollector: Error collecting stats",{error:e})}}))}_createStatsEntry(e,t,i,n,s){const o={intervalStartUtc:e.toISOString(),intervalEndUtc:t.toISOString(),audio:{}};return i&&(o.audio.outbound={packetsSent:i.packetsSent,bytesSent:i.bytesSent,audioLevelAvg:this._average(this.intervalAudioLevels.outbound),bitrateAvg:this._average(this.intervalBitrates.outbound)}),n&&(o.audio.inbound={packetsReceived:n.packetsReceived,bytesReceived:n.bytesReceived,packetsLost:n.packetsLost,packetsDiscarded:n.packetsDiscarded,jitterBufferDelay:n.jitterBufferDelay,jitterBufferEmittedCount:n.jitterBufferEmittedCount,totalSamplesReceived:n.totalSamplesReceived,concealedSamples:n.concealedSamples,concealmentEvents:n.concealmentEvents,audioLevelAvg:this._average(this.intervalAudioLevels.inbound),jitterAvg:this._average(this.intervalJitters),bitrateAvg:this._average(this.intervalBitrates.inbound)}),s&&(o.connection={roundTripTimeAvg:this._average(this.intervalRTTs),packetsSent:s.packetsSent,packetsReceived:s.packetsReceived,bytesSent:s.bytesSent,bytesReceived:s.bytesReceived}),o}_getTrackAudioLevel(e,t){if(!t)return null;const i=e.get(t);return i&&i.audioLevel||null}_average(e){if(0===e.length)return;const t=e.reduce(((e,t)=>e+t),0);return parseFloat((t/e.length).toFixed(4))}_resetIntervalAccumulators(){this.intervalAudioLevels={outbound:[],inbound:[]},this.intervalJitters=[],this.intervalRTTs=[],this.intervalBitrates={outbound:[],inbound:[]}}}at.STATS_FLUSH_THRESHOLD=300,at.LOGS_FLUSH_THRESHOLD=800;var ct,dt=f((function(e,t){var i;function n(){}function s(){s.init.call(this)}function o(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function r(e,t,i,s){var r,a,c;if("function"!=typeof i)throw new TypeError('"listener" argument must be a function');if((a=e._events)?(a.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),a=e._events),c=a[t]):(a=e._events=new n,e._eventsCount=0),c){if("function"==typeof c?c=a[t]=s?[i,c]:[c,i]:s?c.unshift(i):c.push(i),!c.warned&&((r=o(e))&&0<r&&c.length>r)){c.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+c.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=c.length,function(e){"function"==typeof console.warn?console.warn(e):console.log(e)}(d)}}else c=a[t]=i,++e._eventsCount;return e}function a(e,t,i){function n(){e.removeListener(t,n),s||(s=!0,i.apply(e,arguments))}var s=!1;return n.listener=i,n}function c(e){var t=this._events;if(t){var i=t[e];if("function"==typeof i)return 1;if(i)return i.length}return 0}function d(e,t){for(var i=Array(t);t--;)i[t]=e[t];return i}Object.defineProperty(t,"__esModule",{value:!0}),n.prototype=Object.create(null),s.EventEmitter=s,s.usingDomains=!1,s.prototype.domain=void 0,s.prototype._events=void 0,s.prototype._maxListeners=void 0,s.defaultMaxListeners=10,s.init=function(){this.domain=null,s.usingDomains&&i.active&&!(this instanceof i.Domain)&&(this.domain=i.active),this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new n,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},s.prototype.setMaxListeners=function(e){if("number"!=typeof e||0>e||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},s.prototype.getMaxListeners=function(){return o(this)},s.prototype.emit=function(e){var t,i,n,s,o,r,a,c="error"===e;if(r=this._events)c=c&&null==r.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var l=new Error('Uncaught, unspecified "error" event. ('+t+")");throw l.context=t,l}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(i=r[e]))return!1;var u="function"==typeof i;switch(n=arguments.length){case 1:!function(e,t,i){if(t)e.call(i);else for(var n=e.length,s=d(e,n),o=0;o<n;++o)s[o].call(i)}(i,u,this);break;case 2:!function(e,t,i,n){if(t)e.call(i,n);else for(var s=e.length,o=d(e,s),r=0;r<s;++r)o[r].call(i,n)}(i,u,this,arguments[1]);break;case 3:!function(e,t,i,n,s){if(t)e.call(i,n,s);else for(var o=e.length,r=d(e,o),a=0;a<o;++a)r[a].call(i,n,s)}(i,u,this,arguments[1],arguments[2]);break;case 4:!function(e,t,i,n,s,o){if(t)e.call(i,n,s,o);else for(var r=e.length,a=d(e,r),c=0;c<r;++c)a[c].call(i,n,s,o)}(i,u,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=Array(n-1),o=1;o<n;o++)s[o-1]=arguments[o];!function(e,t,i,n){if(t)e.apply(i,n);else for(var s=e.length,o=d(e,s),r=0;r<s;++r)o[r].apply(i,n)}(i,u,this,s)}return!0},s.prototype.addListener=function(e,t){return r(this,e,t,!1)},s.prototype.on=s.prototype.addListener,s.prototype.prependListener=function(e,t){return r(this,e,t,!0)},s.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,a(this,e,t)),this},s.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,a(this,e,t)),this},s.prototype.removeListener=function(e,t){var i,s,o,r,a;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(s=this._events))return this;if(!(i=s[e]))return this;if(i===t||i.listener&&i.listener===t)0==--this._eventsCount?this._events=new n:(delete s[e],s.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(o=-1,r=i.length;0<r--;)if(i[r]===t||i[r].listener&&i[r].listener===t){a=i[r].listener,o=r;break}if(0>o)return this;if(1===i.length){if(i[0]=void 0,0==--this._eventsCount)return this._events=new n,this;delete s[e]}else!function(e,t){for(var i=t,n=i+1,s=e.length;n<s;i+=1,n+=1)e[i]=e[n];e.pop()}(i,o);s.removeListener&&this.emit("removeListener",e,a||t)}return this},s.prototype.removeAllListeners=function(e){var t,i;if(!(i=this._events))return this;if(!i.removeListener)return 0===arguments.length?(this._events=new n,this._eventsCount=0):i[e]&&(0==--this._eventsCount?this._events=new n:delete i[e]),this;if(0===arguments.length){for(var s,o=Object.keys(i),r=0;r<o.length;++r)"removeListener"!==(s=o[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=new n,this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},s.prototype.listeners=function(e){var t,i,n=this._events;return n?i=(t=n[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(t):[]:i=[],i},s.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):c.call(e,t)},s.prototype.listenerCount=c,s.prototype.eventNames=function(){return 0<this._eventsCount?Reflect.ownKeys(this._events):[]};var l,u=new Uint8Array(16);function h(){if(!l&&!(l="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return l(u)}var p=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;for(var g=[],v=0;256>v;++v)g.push((v+256).toString(16).substr(1));function f(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,i=(g[e[t+0]]+g[e[t+1]]+g[e[t+2]]+g[e[t+3]]+"-"+g[e[t+4]]+g[e[t+5]]+"-"+g[e[t+6]]+g[e[t+7]]+"-"+g[e[t+8]]+g[e[t+9]]+"-"+g[e[t+10]]+g[e[t+11]]+g[e[t+12]]+g[e[t+13]]+g[e[t+14]]+g[e[t+15]]).toLowerCase();if(!function(e){return"string"==typeof e&&p.test(e)}(i))throw TypeError("Stringified UUID is invalid");return i}function m(e,t,i){var n=(e=e||{}).random||(e.rng||h)();if(n[6]=64|15&n[6],n[8]=128|63&n[8],t){i=i||0;for(var s=0;16>s;++s)t[i+s]=n[s];return t}return f(n)}function b(e,t){if(!e||!t)return{};const i={...e};if(i.localCandidateId){const e=t.get(i.localCandidateId);i.local={...e}}if(i.remoteCandidateId){const e=t.get(i.remoteCandidateId);i.remote={...e}}return i}function y(e,t,i){return 8*function(e,t,i){const n=e[i],s=t?t[i]:null;return null===n||null===s?null:(n-s)/(e.timestamp-t.timestamp)*1e3}(e,t,i)}function _(e){if(!e.entries)return e;const t={};return e.forEach((function(e,i){t[i]=e})),t}function S(e,t,i={}){if(!e)return null;let n={audio:{inbound:[],outbound:[]},video:{inbound:[],outbound:[]},connection:{inbound:[],outbound:[]}};i.remote&&(n.remote={audio:{inbound:[],outbound:[]},video:{inbound:[],outbound:[]}});for(const t of e.values())switch(t.type){case"outbound-rtp":{const i=t.mediaType||t.kind,s={};let o={};if(!["audio","video"].includes(i))continue;if(t.codecId){const i=e.get(t.codecId);i&&(s.clockRate=i.clockRate,s.mimeType=i.mimeType,s.payloadType=i.payloadType)}o=e.get(t.mediaSourceId)||e.get(t.trackId)||{},n[i].outbound.push({...t,...s,track:{...o}});break}case"inbound-rtp":{let i=t.mediaType||t.kind,s={};const o={};if(!["audio","video"].includes(i))if(t.id.includes("Video"))i="video";else{if(!t.id.includes("Audio"))continue;i="audio"}if(t.codecId){const i=e.get(t.codecId);i&&(o.clockRate=i.clockRate,o.mimeType=i.mimeType,o.payloadType=i.payloadType)}if(!n.connection.id&&t.transportId){const i=e.get(t.transportId);if(i&&i.selectedCandidatePairId){const t=e.get(i.selectedCandidatePairId);n.connection=b(t,e)}}s=e.get(t.mediaSourceId)||e.get(t.trackId)||{},n[i].inbound.push({...t,...o,track:{...s}});break}case"peer-connection":n.connection.dataChannelsClosed=t.dataChannelsClosed,n.connection.dataChannelsOpened=t.dataChannelsOpened;break;case"remote-inbound-rtp":{if(!i.remote)break;let s=t.mediaType||t.kind;const o={};if(!["audio","video"].includes(s))if(t.id.includes("Video"))s="video";else{if(!t.id.includes("Audio"))continue;s="audio"}if(t.codecId){const i=e.get(t.codecId);i&&(o.clockRate=i.clockRate,o.mimeType=i.mimeType,o.payloadType=i.payloadType)}if(!n.connection.id&&t.transportId){const i=e.get(t.transportId);if(i&&i.selectedCandidatePairId){const t=e.get(i.selectedCandidatePairId);n.connection=b(t,e)}}n.remote[s].inbound.push({...t,...o});break}case"remote-outbound-rtp":{if(!i.remote)break;const s=t.mediaType||t.kind,o={};if(!["audio","video"].includes(s))continue;if(t.codecId){const i=e.get(t.codecId);i&&(o.clockRate=i.clockRate,o.mimeType=i.mimeType,o.payloadType=i.payloadType)}n.remote[s].outbound.push({...t,...o});break}}if(!n.connection.id)for(const t of e.values())"candidate-pair"===t.type&&t.nominated&&"succeeded"===t.state&&(n.connection=b(t,e));return n=function(e,t){return t?(e.audio.inbound.map((e=>{let i=t.audio.inbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesReceived"),e.packetRate=y(e,i,"packetsReceived")})),e.audio.outbound.map((e=>{let i=t.audio.outbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesSent"),e.packetRate=y(e,i,"packetsSent")})),e.video.inbound.map((e=>{let i=t.video.inbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesReceived"),e.packetRate=y(e,i,"packetsReceived")})),e.video.outbound.map((e=>{let i=t.video.outbound.find((t=>t.id===e.id));e.bitrate=y(e,i,"bytesSent"),e.packetRate=y(e,i,"packetsSent")})),e):e}(n,t),n}let w,C={},I=[];t.WebRTCStats=class extends s{constructor(e){if(super(),this.monitoringSetInterval=0,this.connectionMonitoringSetInterval=0,this.connectionMonitoringInterval=1e3,this.remote=!0,this.peersToMonitor={},this.timeline=[],this.statsToMonitor=["inbound-rtp","outbound-rtp","remote-inbound-rtp","remote-outbound-rtp","peer-connection","data-channel","stream","track","sender","receiver","transport","candidate-pair","local-candidate","remote-candidate"],"undefined"==typeof window)throw new Error("WebRTCStats only works in browser");const t={...e};this.isEdge=!!window.RTCIceGatherer,this.getStatsInterval=t.getStatsInterval||1e3,this.rawStats=!!t.rawStats,this.statsObject=!!t.statsObject,this.filteredStats=!!t.filteredStats,this.shouldWrapGetUserMedia=!!t.wrapGetUserMedia,"boolean"==typeof t.remote&&(this.remote=t.remote),this.debug=!!t.debug,this.logLevel=t.logLevel||"none",this.shouldWrapGetUserMedia&&this.wrapGetUserMedia()}async addPeer(e,t){return console.warn("The addPeer() method has been deprecated, please use addConnection()"),this.addConnection({peerId:e,pc:t})}async addConnection(e){const{pc:t,peerId:i}=e;let{connectionId:n,remote:s}=e;if(s="boolean"==typeof s?s:this.remote,!(t&&t instanceof RTCPeerConnection))throw new Error("Missing argument 'pc' or is not of instance RTCPeerConnection");if(!i)throw new Error("Missing argument peerId");if(this.isEdge)throw new Error("Can't monitor peers in Edge at this time.");if(this.peersToMonitor[i]){if(n&&n in this.peersToMonitor[i])throw new Error(`We are already monitoring connection with id ${n}.`);for(let e in this.peersToMonitor[i]){const n=this.peersToMonitor[i][e];if(n.pc===t)throw new Error(`We are already monitoring peer with id ${i}.`);"closed"===n.pc.connectionState&&this.removeConnection({pc:n.pc})}}const o=t.getConfiguration();return o.iceServers&&o.iceServers.forEach((function(e){delete e.credential})),n||(n=m()),this.emitEvent({event:"addConnection",tag:"peer",peerId:i,connectionId:n,data:{options:e,peerConfiguration:o}}),this.monitorPeer({peerId:i,connectionId:n,pc:t,remote:s}),{connectionId:n}}getTimeline(e){return this.timeline=this.timeline.sort(((e,t)=>e.timestamp.getTime()-t.timestamp.getTime())),e?this.timeline.filter((t=>t.tag===e)):this.timeline}get logger(){const e=e=>{const t=["none","error","warn","info","debug"];return t.slice(0,t.indexOf(this.logLevel)+1).indexOf(e)>-1};return{error(...t){this.debug&&e("error")&&console.error("[webrtc-stats][error] ",...t)},warn(...t){this.debug&&e("warn")&&console.warn("[webrtc-stats][warn] ",...t)},info(...t){this.debug&&e("info")&&console.log("[webrtc-stats][info] ",...t)},debug(...t){this.debug&&e("debug")&&console.debug("[webrtc-stats][debug] ",...t)}}}removeConnection(e){let t,{connectionId:i,pc:n}=e;if(!n&&!i)throw new Error("Missing arguments. You need to either send pc or a connectionId.");if(i){if("string"!=typeof i)throw new Error("connectionId must be a string.");for(let e in this.peersToMonitor)i in this.peersToMonitor[e]&&(n=this.peersToMonitor[e][i].pc,t=e)}else if(n){if(!(n instanceof RTCPeerConnection))throw new Error("pc must be an instance of RTCPeerConnection.");for(let e in this.peersToMonitor)for(let s in this.peersToMonitor[e])this.peersToMonitor[e][s].pc===n&&(i=s,t=e)}if(!n||!i)throw new Error("Could not find the desired connection.");return this.removePeerConnectionEventListeners(i,n),delete this.peersToMonitor[t][i],0===Object.values(this.peersToMonitor[t]).length&&delete this.peersToMonitor[t],{connectionId:i}}removeAllPeers(){for(let e in this.peersToMonitor)this.removePeer(e)}removePeer(e){if(this.logger.info(`Removing PeerConnection with id ${e}.`),this.peersToMonitor[e]){for(let t in this.peersToMonitor[e]){let i=this.peersToMonitor[e][t].pc;this.removePeerConnectionEventListeners(t,i)}delete this.peersToMonitor[e]}}destroy(){this.removeAllPeers(),I.forEach((e=>{this.removeTrackEventListeners(e)})),I=[],this.shouldWrapGetUserMedia&&w&&(navigator.mediaDevices.getUserMedia=w)}monitorPeer(e){let{peerId:t,connectionId:i,pc:n,remote:s}=e;if(!n)return void this.logger.warn("Did not receive pc argument when calling monitorPeer()");const o={pc:n,connectionId:i,stream:null,stats:{parsed:null,raw:null},options:{remote:s}};if(this.peersToMonitor[t]){if(i in this.peersToMonitor[t])return void this.logger.warn(`Already watching connection with ID ${i}`);this.peersToMonitor[t][i]=o}else this.peersToMonitor[t]={[i]:o};this.addPeerConnectionEventListeners(t,i,n),1===this.numberOfMonitoredPeers&&(this.startStatsMonitoring(),this.startConnectionStateMonitoring())}startStatsMonitoring(){this.monitoringSetInterval||(this.monitoringSetInterval=window.setInterval((()=>{this.numberOfMonitoredPeers||this.stopStatsMonitoring(),this.getStats().then((e=>{e.forEach((e=>{this.emitEvent(e)}))}))}),this._getStatsInterval))}stopStatsMonitoring(){this.monitoringSetInterval&&(window.clearInterval(this.monitoringSetInterval),this.monitoringSetInterval=0)}async getStats(e=null){this.logger.info(e?`Getting stats from peer ${e}`:"Getting stats from all peers");let t={};if(e){if(!this.peersToMonitor[e])throw new Error(`Cannot get stats. Peer with id ${e} does not exist`);t[e]=this.peersToMonitor[e]}else t=this.peersToMonitor;let i=[];for(const e in t)for(const n in t[e]){const s=t[e][n],o=s.pc;if(o&&!this.checkIfConnectionIsClosed(e,n,o))try{const t=this.getTimestamp(),r=o.getStats(null);if(r){const o=await r,a=this.getTimestamp(),c=_(o),d={remote:s.options.remote},l=S(o,s.stats.parsed,d),u={event:"stats",tag:"stats",peerId:e,connectionId:n,timeTaken:a-t,data:l};!0===this.rawStats&&(u.rawStats=o),!0===this.statsObject&&(u.statsObject=c),!0===this.filteredStats&&(u.filteredStats=this.filteroutStats(c)),i.push(u),s.stats.parsed=l}else this.logger.error(`PeerConnection from peer ${e} did not return any stats data`)}catch(e){this.logger.error(e)}}return i}startConnectionStateMonitoring(){this.connectionMonitoringSetInterval=window.setInterval((()=>{this.numberOfMonitoredPeers||this.stopConnectionStateMonitoring();for(const e in this.peersToMonitor)for(const t in this.peersToMonitor[e]){const i=this.peersToMonitor[e][t].pc;this.checkIfConnectionIsClosed(e,t,i)}}),this.connectionMonitoringInterval)}checkIfConnectionIsClosed(e,t,i){const n=this.isConnectionClosed(i);if(n){this.removeConnection({pc:i});let n="closed"===i.connectionState?"onconnectionstatechange":"oniceconnectionstatechange";this.emitEvent({event:n,peerId:e,connectionId:t,tag:"connection",data:"closed"})}return n}isConnectionClosed(e){return"closed"===e.connectionState||"closed"===e.iceConnectionState}stopConnectionStateMonitoring(){this.connectionMonitoringSetInterval&&(window.clearInterval(this.connectionMonitoringSetInterval),this.connectionMonitoringSetInterval=0)}wrapGetUserMedia(){if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia)return void this.logger.warn("'navigator.mediaDevices.getUserMedia' is not available in browser. Will not wrap getUserMedia.");this.logger.info("Wrapping getUsermedia functions."),w=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);const e=this.parseGetUserMedia.bind(this);navigator.mediaDevices.getUserMedia=function(){return e({constraints:arguments[0]}),w.apply(navigator.mediaDevices,arguments).then((t=>(e({stream:t}),t)),(t=>(e({error:t}),Promise.reject(t))))}.bind(navigator.mediaDevices)}filteroutStats(e={}){const t={...e};for(const e in t){var i=t[e];this.statsToMonitor.includes(i.type)||delete t[e]}return t}get peerConnectionListeners(){return{icecandidate:(e,t,i,n)=>{this.logger.debug("[pc-event] icecandidate | peerId: ${peerId}",n),this.emitEvent({event:"onicecandidate",tag:"connection",peerId:e,connectionId:t,data:n.candidate})},track:(e,t,i,n)=>{this.logger.debug(`[pc-event] track | peerId: ${e}`,n);const s=n.track,o=n.streams[0];e in this.peersToMonitor&&t in this.peersToMonitor[e]&&(this.peersToMonitor[e][t].stream=o),this.addTrackEventListeners(s,t),this.emitEvent({event:"ontrack",tag:"track",peerId:e,connectionId:t,data:{stream:o?this.getStreamDetails(o):null,track:s?this.getMediaTrackDetails(s):null,title:n.track.kind+":"+n.track.id+" "+n.streams.map((function(e){return"stream:"+e.id}))}})},signalingstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] signalingstatechange | peerId: ${e}`),this.emitEvent({event:"onsignalingstatechange",tag:"connection",peerId:e,connectionId:t,data:{signalingState:i.signalingState,localDescription:i.localDescription,remoteDescription:i.remoteDescription}})},iceconnectionstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] iceconnectionstatechange | peerId: ${e}`),this.emitEvent({event:"oniceconnectionstatechange",tag:"connection",peerId:e,connectionId:t,data:i.iceConnectionState})},icegatheringstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] icegatheringstatechange | peerId: ${e}`),this.emitEvent({event:"onicegatheringstatechange",tag:"connection",peerId:e,connectionId:t,data:i.iceGatheringState})},icecandidateerror:(e,t,i,n)=>{this.logger.debug(`[pc-event] icecandidateerror | peerId: ${e}`),this.emitEvent({event:"onicecandidateerror",tag:"connection",peerId:e,connectionId:t,error:{errorCode:n.errorCode}})},connectionstatechange:(e,t,i)=>{this.logger.debug(`[pc-event] connectionstatechange | peerId: ${e}`),this.emitEvent({event:"onconnectionstatechange",tag:"connection",peerId:e,connectionId:t,data:i.connectionState})},negotiationneeded:(e,t,i)=>{this.logger.debug(`[pc-event] negotiationneeded | peerId: ${e}`),this.emitEvent({event:"onnegotiationneeded",tag:"connection",peerId:e,connectionId:t})},datachannel:(e,t,i,n)=>{this.logger.debug(`[pc-event] datachannel | peerId: ${e}`,n),this.emitEvent({event:"ondatachannel",tag:"datachannel",peerId:e,connectionId:t,data:n.channel})}}}addPeerConnectionEventListeners(e,t,i){this.logger.debug(`Adding event listeners for peer ${e} and connection ${t}.`),C[t]={},Object.keys(this.peerConnectionListeners).forEach((n=>{C[t][n]=this.peerConnectionListeners[n].bind(this,e,t,i),i.addEventListener(n,C[t][n],!1)}))}parseGetUserMedia(e){try{const t={event:"getUserMedia",tag:"getUserMedia",data:{...e}};e.stream&&(t.data.details=this.parseStream(e.stream),e.stream.getTracks().map((e=>{this.addTrackEventListeners(e),I.push(e)}))),this.emitEvent(t)}catch(e){}}parseStream(e){const t={audio:[],video:[]};return e.getTracks().forEach((e=>{t[e.kind].push(this.getMediaTrackDetails(e))})),t}getMediaTrackDetails(e){return{enabled:e.enabled,id:e.id,contentHint:e.contentHint,kind:e.kind,label:e.label,muted:e.muted,readyState:e.readyState,constructorName:e.constructor.name,capabilities:e.getCapabilities?e.getCapabilities():{},constraints:e.getConstraints?e.getConstraints():{},settings:e.getSettings?e.getSettings():{},_track:e}}getStreamDetails(e){return{active:e.active,id:e.id,_stream:e}}getTrackEventObject(e){return{mute:t=>{this.emitEvent({event:"mute",tag:"track",connectionId:e,data:{event:t}})},unmute:t=>{this.emitEvent({event:"unmute",tag:"track",connectionId:e,data:{event:t}})},overconstrained:t=>{this.emitEvent({event:"overconstrained",tag:"track",connectionId:e,data:{event:t}})},ended:t=>{this.emitEvent({event:"ended",tag:"track",connectionId:e,data:{event:t}}),this.removeTrackEventListeners(t.target)}}}addTrackEventListeners(e,t){C[e.id]={};const i=this.getTrackEventObject(t);Object.keys(i).forEach((t=>{C[e.id][t]=i[t].bind(this),e.addEventListener(t,C[e.id][t])})),C[e.id].readyState=setInterval((()=>{if("ended"===e.readyState){let t=new CustomEvent("ended",{detail:{check:"readyState"}});e.dispatchEvent(t)}}),1e3)}removeTrackEventListeners(e){if(e.id in C){const t=this.getTrackEventObject();Object.keys(t).forEach((t=>{e.removeEventListener(t,C[e.id][t])})),clearInterval(C[e.id].readyState),delete C[e.id]}}addToTimeline(e){this.timeline.push(e),this.emit("timeline",e)}emitEvent(e){const t={...e,timestamp:new Date};this.addToTimeline(t),t.tag&&this.emit(t.tag,t)}set getStatsInterval(e){if(!Number.isInteger(e))throw new Error(`getStatsInterval should be an integer, got: ${e}`);this._getStatsInterval=e,this.monitoringSetInterval&&(this.stopStatsMonitoring(),this.startStatsMonitoring())}get numberOfMonitoredPeers(){return Object.keys(this.peersToMonitor).length}removePeerConnectionEventListeners(e,t){e in C&&(Object.keys(this.peerConnectionListeners).forEach((i=>{t.removeEventListener(i,C[e][i],!1)})),delete C[e]),t.getSenders().forEach((e=>{e.track&&this.removeTrackEventListeners(e.track)})),t.getReceivers().forEach((e=>{e.track&&this.removeTrackEventListeners(e.track)}))}getTimestamp(){return Date.now()}wrapGetDisplayMedia(){const e=this;if(navigator.mediaDevices&&navigator.mediaDevices.getDisplayMedia){const t=navigator.mediaDevices.getDisplayMedia.bind(navigator.mediaDevices),i=function(){return e.debug("navigator.mediaDevices.getDisplayMedia",null,arguments[0]),t.apply(navigator.mediaDevices,arguments).then((function(e){return e}),(function(t){return e.debug("navigator.mediaDevices.getDisplayMediaOnFailure",null,t.name),Promise.reject(t)}))};navigator.mediaDevices.getDisplayMedia=i.bind(navigator.mediaDevices)}}}}));(ct=dt)&&ct.__esModule&&Object.prototype.hasOwnProperty.call(ct,"default")&&ct.default;var lt=dt.WebRTCStats;function ut(e){const{packetsLost:t,packetsReceived:i,jitter:n,rtt:s}=e,o=function(e){const{jitter:t,rtt:i}=e,n=t+i/2;return.024*n+.11*(n-177.3)*(n>177.3?1:0)}({rtt:s,jitter:n}),r=function(e){const{packetsLost:t,packetsReceived:i}=e,n=t/(i+t)*100;return 20*Math.log(1+n)}({packetsLost:t,packetsReceived:i}),a=93.2-o-r+0,c=1+.035*a+7e-6*a*(a-60)*(100-a);return Math.min(Math.max(c,1),5)}function ht(e){return isNaN(e)?null:e>4.2?"excellent":e>=4.1&&e<=4.2?"good":e>=3.7&&e<=4?"fair":e>=3.1&&e<=3.6?"poor":"bad"}class pt extends ge{constructor(e,t){super(),this.buildRequest({type:"debug_report_start",debug_report_id:e,debug_report_version:1,call_id:t})}}class gt extends ge{constructor(e,t){super(),this.buildRequest({type:"debug_report_stop",debug_report_id:e,debug_report_version:1,call_id:t})}}class vt extends ge{constructor(e,t){super(),this.buildRequest({type:"debug_report_data",debug_report_id:e,debug_report_version:1,debug_report_data:t})}}function ft(e,t){var i,n;return{errorCode:e.errorCode,errorText:e.errorText,url:e.url,address:e.address,port:e.port,connectionState:t.connectionState,iceConnectionState:t.iceConnectionState,iceGatheringState:t.iceGatheringState,signalingState:t.signalingState,localDescriptionType:null===(i=t.localDescription)||void 0===i?void 0:i.type,remoteDescriptionType:null===(n=t.remoteDescription)||void 0===n?void 0:n.type}}function mt(t,n){const s=c();let o=!1;const r=new lt({getStatsInterval:1e3,rawStats:!1,statsObject:!0,filteredStats:!1,remote:!0,debug:!1,logLevel:"warn"}),a=n=>i(this,void 0,void 0,(function*(){"stats"===n.event&&re(e.SwEvent.StatsFrame,function({data:e}){var t,i,n,s,o,r,a,c;const{audio:d,remote:l}=e,{audio:u}=l,h=null!==(i=null===(t=u.inbound[0])||void 0===t?void 0:t.jitter)&&void 0!==i?i:1/0,p=null!==(s=null===(n=u.inbound[0])||void 0===n?void 0:n.roundTripTime)&&void 0!==s?s:1/0,g=null!==(r=null===(o=d.inbound[0])||void 0===o?void 0:o.packetsReceived)&&void 0!==r?r:-1,v=null!==(c=null===(a=d.inbound[0])||void 0===a?void 0:a.packetsLost)&&void 0!==c?c:-1,f=ut({jitter:1e3*h,rtt:1e3*p,packetsLost:v,packetsReceived:g});return{jitter:h,rtt:p,mos:f,quality:ht(f),inboundAudio:d.inbound[0],outboundAudio:d.outbound[0],remoteInboundAudio:u.inbound[0],remoteOutboundAudio:u.outbound[0]}}(n),t.uuid),yield t.execute(new vt(s,n))}));return{get isRunning(){return o},start:(e,c,d)=>i(this,void 0,void 0,(function*(){if(o)C.debug(`[${n}] Stats reporter already running, skipping start`);else{yield t.execute(new pt(s,n)),r.on("timeline",a);try{yield r.addConnection({pc:e,peerId:c,connectionId:d}),o=!0}catch(e){C.error(`[${n}] Failed to start stats reporter:`,e),r.removeAllPeers(),r.destroy()}}})),stop:a=>i(this,void 0,void 0,(function*(){const i=r.getTimeline();if(re(e.SwEvent.StatsReport,i,t.uuid),"file"===a){!function(e,t){const i=new Blob([JSON.stringify(e)],{type:"application/json"}),n=URL.createObjectURL(i),s=document.createElement("a");s.href=n,s.download=`${t}.json`,s.click(),URL.revokeObjectURL(n)}(i,`webrtc-stats-${s}-${Date.now()}`)}yield t.execute(new gt(s,n)),r.removeAllPeers(),r.destroy(),o=!1})),reportConnectionStateChange:e=>{const t={event:"connectionstatechange-detailed",tag:"connection",timestamp:(new Date).toISOString(),data:e};a(t)},reportIceCandidateError:e=>{const t={event:"icecandidateerror-detailed",tag:"connection",timestamp:(new Date).toISOString(),data:e};a(t)}}}const bt=(t,i)=>{const{contentType:n,canvasType:s,callID:o,canvasInfo:r=null,currentLayerIdx:a=-1}=i;r&&"mcu-personal-canvas"!==s&&delete r.memberID;const c={type:q.conferenceUpdate,call:t.calls[o],canvasInfo:yt(r),currentLayerIdx:a};switch(n){case"layer-info":{const i=Object.assign({action:Y.LayerInfo},c);re(e.SwEvent.Notification,i,t.uuid);break}case"layout-info":{const i=Object.assign({action:Y.LayoutInfo},c);re(e.SwEvent.Notification,i,t.uuid);break}}},yt=e=>{const t=JSON.stringify(e).replace(/memberID/g,"participantId").replace(/ID"/g,'Id"').replace(/POS"/g,'Pos"');return x(t)};class _t{constructor(t,n,s,o,r){this.type=t,this.options=n,this.onSdpReadyTwice=null,this.statsReporter=null,this._negotiating=!1,this._prevConnectionState=null,this._restartedIceOnConnectionStateFailed=!1,this._sleepWakeupIntervalId=null,this.handleConnectionStateChange=()=>i(this,void 0,void 0,(function*(){const{connectionState:t}=this.instance;if(C.info(`[${(new Date).toISOString()}] Connection State changed: ${this._prevConnectionState} -> ${t}`),"failed"===t||"disconnected"===t){const e=()=>i(this,void 0,void 0,(function*(){if(this.isDebugEnabled&&this.statsReporter){const e=yield function(e,t){return i(this,void 0,void 0,(function*(){const i={connectionState:e.connectionState,previousConnectionState:t,iceConnectionState:e.iceConnectionState,iceGatheringState:e.iceGatheringState,signalingState:e.signalingState},n=e.getTransceivers();if(n.length>0){const e=n[0].sender,t=null==e?void 0:e.transport;t&&(i.dtlsState=t.state)}e.sctp&&(i.sctpState=e.sctp.state);try{const t=yield e.getStats();t.forEach((e=>{"candidate-pair"===e.type&&"succeeded"===e.state&&(i.candidatePairState=e.state,t.forEach((t=>{"local-candidate"===t.type&&t.id===e.localCandidateId&&(i.localCandidateType=t.candidateType,i.selectedCandidatePair=i.selectedCandidatePair||{local:{},remote:{}},i.selectedCandidatePair.local={address:t.address,port:t.port,protocol:t.protocol,candidateType:t.candidateType}),"remote-candidate"===t.type&&t.id===e.remoteCandidateId&&(i.remoteCandidateType=t.candidateType,i.selectedCandidatePair=i.selectedCandidatePair||{local:{},remote:{}},i.selectedCandidatePair.remote={address:t.address,port:t.port,protocol:t.protocol,candidateType:t.candidateType})}))),"transport"===e.type&&(i.dtlsCipher=e.dtlsCipher,i.srtpCipher=e.srtpCipher,i.tlsVersion=e.tlsVersion,e.dtlsState&&(i.dtlsState=e.dtlsState))}))}catch(e){C.error("Error gathering connection state details:",e)}return i}))}(this.instance,this._prevConnectionState);this.statsReporter.reportConnectionStateChange(e)}window.removeEventListener("online",e)}));navigator.onLine?e():window.addEventListener("online",e)}"failed"===t&&re(e.SwEvent.PeerConnectionFailureError,{error:new Error(`Peer Connection failed. previous state: ${this._prevConnectionState}, current state: ${t}`),sessionId:this._session.sessionid},this.options.id),this._prevConnectionState=t,this._isTrickleIce()&&("connecting"===t&&performance.mark("peer-connection-connecting"),"connected"===t&&(performance.mark("peer-connection-connected"),console.group("Performance Metrics"),console.table(this.trickleIcePerformanceMetrics),console.groupEnd(),performance.clearMarks()))})),this._handleIceConnectionStateChange=()=>{C.debug(`[${(new Date).toISOString()}] ICE Connection State`,this.instance.iceConnectionState)},this._handleIceGatheringStateChange=()=>{C.debug(`[${(new Date).toISOString()}] ICE Gathering State`,this.instance.iceGatheringState)},this._setCodecs=(e,t)=>{if(e.setCodecPreferences)return e.setCodecPreferences(t)},C.debug("New Peer with type:",this.type,"Options:",this.options),this._constraints={offerToReceiveAudio:!0,offerToReceiveVideo:!!n.video},this._sdpReady=this._sdpReady.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this._session=s,this._trickleIceSdpFn=o,this._registerPeerEvents=r}get isOffer(){return this.type===G.Offer}get isAnswer(){return this.type===G.Answer}get isDebugEnabled(){return this.options.debug||this._session.options.debug}get debugOutput(){return this.options.debugOutput||this._session.options.debugOutput}get restartedIceOnConnectionStateFailed(){return this._restartedIceOnConnectionStateFailed}isConnectionHealthy(){return"connected"===this.instance.connectionState&&"connected"===this.instance.iceConnectionState&&"closed"!==this.instance.signalingState}startNegotiation(){performance.mark("ice-gathering-start"),this._negotiating=!0,this._isOffer()?this._createOffer():this._createAnswer()}startTrickleIceNegotiation(){return i(this,void 0,void 0,(function*(){performance.mark("ice-gathering-start"),this._negotiating=!0,this._isOffer()?yield this._createOffer().then(this._trickleIceSdpFn.bind(this)):yield this._createAnswer().then(this._trickleIceSdpFn.bind(this))}))}_logTransceivers(){C.info("Number of transceivers:",this.instance.getTransceivers().length),this.instance.getTransceivers().forEach(((e,t)=>{C.info(`>> Transceiver [${t}]:`,e.mid,e.direction,e.stopped),C.info(`>> Sender Params [${t}]:`,JSON.stringify(e.sender.getParameters(),null,2))}))}get trickleIcePerformanceMetrics(){const e=performance.measure("new-call","new-call-start","new-call-end"),t=performance.measure("peer-creation","peer-creation-start","peer-creation-end"),i=performance.measure("ice-gathering","ice-gathering-start","ice-gathering-end"),n=performance.measure("sdp-send","sdp-send-start","sdp-send-end"),s=performance.measure("invite-send","new-call-start","sdp-send-start"),o=performance.measure("total-duration","peer-creation-start","sdp-send-end"),r=e=>`${e.toFixed(2)}ms`;return{"New Call":{duration:r(e.duration)},"Peer Creation":{duration:r(t.duration)},"ICE Gathering":{duration:r(i.duration)},[this._isOffer()?"Invite Send":"Answer Send"]:{duration:r(s.duration)},"SDP Send":{duration:r(n.duration)},"Total Duration":{duration:r(o.duration)}}}handleSignalingStateChangeEvent(){switch(C.info("signalingState:",this.instance.signalingState),this.instance.signalingState){case"stable":this._negotiating=!1;break;case"closed":re(e.SwEvent.PeerConnectionSignalingStateClosed,{sessionId:this._session.sessionid},this.options.id),this.instance&&(C.debug(`[${this.options.id}] Closing peer due to signalingState closed`),this.close());break;default:this._negotiating=!0}}handleNegotiationNeededEvent(){C.info("Negotiation needed event"),"stable"!==this.instance.signalingState||this._negotiating?C.debug("Skipping negotiation, state:",this.instance.signalingState,"negotiating:",this._negotiating):this._isTrickleIce()?this.startTrickleIceNegotiation():this.startNegotiation()}handleTrackEvent(e){const{streams:[t]}=e,{remoteElement:i,screenShare:n}=this.options;this.options.remoteStream=t,!1===n&&$e(i,this.options.remoteStream)}createPeerConnection(){return i(this,void 0,void 0,(function*(){var t;this.instance=(t=this._config(),new window.RTCPeerConnection(t)),this.instance.onsignalingstatechange=this.handleSignalingStateChangeEvent,this.instance.onnegotiationneeded=this.handleNegotiationNeededEvent,this.instance.ontrack=this.handleTrackEvent,this.instance.addEventListener("connectionstatechange",this.handleConnectionStateChange),this.instance.addEventListener("iceconnectionstatechange",this._handleIceConnectionStateChange),this.instance.addEventListener("icegatheringstatechange",this._handleIceGatheringStateChange),this.instance.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),this._registerPeerEvents(this.instance),this._prevConnectionState=this.instance.connectionState,this.isAnswer&&(yield this._setRemoteDescription({sdp:this.options.remoteSdp,type:G.Offer})),this.options.localStream=yield this._retrieveLocalStream().catch((t=>(re(e.SwEvent.MediaError,t,this.options.id),null))),this.options.mutedMicOnStart&&Ue(this.options.localStream)&&(C.info("Muting local audio tracks on start"),Xe(this.options.localStream)),performance.mark("peer-creation-end")}))}init(){var e;return i(this,void 0,void 0,(function*(){yield this.createPeerConnection(),this.isDebugEnabled&&(this.statsReporter=mt(this._session,this.options.id),yield null===(e=this.statsReporter)||void 0===e?void 0:e.start(this.instance,this._session.sessionid,this._session.sessionid));const{localElement:t,localStream:i=null,screenShare:n=!1}=this.options;if(Ue(i)){const e=i.getAudioTracks();let s=[...e];if(C.info("Local audio tracks: ",e),"object"==typeof this.options.audio&&e.forEach((e=>{C.info("Local audio tracks constraints: ",e.getConstraints())})),this.options.video){const t=i.getVideoTracks();s=[...e,...t],C.info("Local video tracks: ",t),"object"==typeof this.options.video&&t.forEach((e=>{C.info("Local video tracks constraints: ",e.getConstraints())}))}const{audioCodecs:o,videoCodecs:r}=(e=>{const t=[],i=[];return e&&0!==e.length?(e.forEach((e=>{const n=e.mimeType.toLocaleLowerCase();n.startsWith("audio/")?t.push(e):n.startsWith("video/")&&i.push(e)})),{audioCodecs:t,videoCodecs:i}):{audioCodecs:t,videoCodecs:i}})(this.options.preferred_codecs);if(this.isOffer&&"function"==typeof this.instance.addTransceiver){const e={direction:"sendrecv",streams:[i]};s.forEach((t=>{"audio"===t.kind&&(this.options.userVariables.microphoneLabel=t.label),"video"===t.kind&&(this.options.userVariables.cameraLabel=t.label);const i=this.instance.addTransceiver(t,e);"audio"===t.kind&&o.length>0&&this._setCodecs(i,o),"video"===t.kind&&r.length>0&&this._setCodecs(i,r)}))}else"function"==typeof this.instance.addTrack?(s.forEach((e=>{"audio"===e.kind&&(this.options.userVariables.microphoneLabel=e.label),"video"===e.kind&&(this.options.userVariables.cameraLabel=e.label),this.instance.addTrack(e,i)})),this.instance.getTransceivers().forEach((e=>{"audio"===e.receiver.track.kind&&o.length>0&&this._setCodecs(e,o),"video"===e.receiver.track.kind&&r.length>0&&this._setCodecs(e,r)}))):this.instance.addStream(i);!1===n&&$e(t,i)}this.isOffer?(this.options.negotiateAudio&&this._checkMediaToNegotiate("audio"),this.options.negotiateVideo&&this._checkMediaToNegotiate("video")):this._isTrickleIce()||this.startNegotiation(),this._isTrickleIce()&&this.startTrickleIceNegotiation(),this._logTransceivers()}))}_getSenderByKind(e){return this.instance.getSenders().find((({track:t})=>t&&t.kind===e))}_checkMediaToNegotiate(e){if(!this._getSenderByKind(e)){const t=this.instance.addTransceiver(e);C.info("Add transceiver",e,t)}}_createOffer(){return i(this,void 0,void 0,(function*(){if(this._isOffer()){this._constraints.offerToReceiveAudio=!1!==this.options.audio,this._constraints.offerToReceiveVideo=Boolean(this.options.video),C.info("_createOffer - this._constraints",this._constraints);try{const e=yield this.instance.createOffer(this._constraints);return yield this._setLocalDescription(e),this._isTrickleIce()||this._sdpReady(),e}catch(e){C.error("Peer _createOffer error:",e)}}}))}_setRemoteDescription(e){return i(this,void 0,void 0,(function*(){C.debug("Setting remote description",e),yield this.instance.setRemoteDescription(e)}))}_createAnswer(){return i(this,void 0,void 0,(function*(){if(this._isAnswer()){if("stable"!==this.instance.signalingState&&"have-remote-offer"!==this.instance.signalingState)return C.debug("Skipping negotiation, state:",this.instance.signalingState),C.debug(" - But the signaling state isn't stable, so triggering rollback"),void(yield Promise.all([this.instance.setLocalDescription({type:"rollback"}),this.instance.setRemoteDescription({sdp:this.options.remoteSdp,type:G.Offer})]));this._logTransceivers();try{const e=yield this.instance.createAnswer();return yield this._setLocalDescription(e),e}catch(e){C.error("Peer _createAnswer error:",e)}}}))}_setLocalDescription(e){return i(this,void 0,void 0,(function*(){yield this.instance.setLocalDescription(e)}))}_sdpReady(){O(this.onSdpReadyTwice)&&this.onSdpReadyTwice(this.instance.localDescription)}_retrieveLocalStream(){return i(this,void 0,void 0,(function*(){if(Ue(this.options.localStream))return this.options.localStream;const e=yield(t=this.options,i(void 0,void 0,void 0,(function*(){let{audio:e=!0,micId:i,video:n=!1,camId:s}=t;const{micLabel:o="",camLabel:r=""}=t;return i&&(i=yield We(i,o,Q.AudioIn).catch((e=>null)),i&&("boolean"==typeof e&&(e={}),e.deviceId={exact:i})),s&&(s=yield We(s,r,Q.Video).catch((e=>null)),s&&("boolean"==typeof n&&(n={}),n.deviceId={exact:s})),{audio:e,video:n}})));var t;return Ve(e)}))}_isOffer(){return this.type===G.Offer}_isAnswer(){return this.type===G.Answer}_isTrickleIce(){return!0===this.options.trickleIce}_config(){const{prefetchIceCandidates:e,forceRelayCandidate:t,iceServers:i}=this.options,n={bundlePolicy:"balanced",iceCandidatePoolSize:e?10:0,iceServers:i,iceTransportPolicy:t?"relay":"all"};return C.info("RTC config",n),n}restartStatsReporter(){return i(this,void 0,void 0,(function*(){this.isDebugEnabled&&this.statsReporter&&(this.instance?this.statsReporter.isRunning?C.debug(`[${this.options.id}] Stats reporter already running, skipping restart`):(C.debug(`[${this.options.id}] Restarting stats reporter after reconnect`),yield this.statsReporter.start(this.instance,this._session.sessionid,this._session.sessionid)):C.debug(`[${this.options.id}] Cannot restart stats reporter - no peer connection instance`))}))}close(){return i(this,void 0,void 0,(function*(){null!==this._sleepWakeupIntervalId&&(clearInterval(this._sleepWakeupIntervalId),this._sleepWakeupIntervalId=null),this.isDebugEnabled&&this.statsReporter&&(yield this.statsReporter.stop(this.debugOutput)),this.instance&&(this.instance.close(),this.instance=null)}))}}const St=Se;class wt{constructor(e,t,i=!1){this.session=e,this._isRecovering=i,this._callReportCollector=null,this.id="",this.state=K[K.New],this.prevState="",this.channels=[],this.role=z.Participant,this.extension=null,this._state=K.New,this._prevState=K.New,this.gotAnswer=!1,this.gotEarly=!1,this._lastSerno=0,this._targetNodeId=null,this._iceTimeout=null,this._iceDone=!1,this._statsBindings=[],this._statsIntervalId=null,this._pendingIceCandidates=[],this._isRemoteDescriptionSet=!1,this._signalingStateClosed=!1,this._creatingPeer=!1,this._checkConferenceSerno=e=>{const t=e<0||!this._lastSerno||this._lastSerno&&e===this._lastSerno+1;return t&&e>=0&&(this._lastSerno=e),t},this._doStats=()=>{this.peer&&this.peer.instance&&0!==this._statsBindings.length&&this.peer.instance.getStats().then((e=>{e.forEach((e=>{this._statsBindings.forEach((t=>{if(t.callback){if(t.constraints)for(const i in t.constraints)if(t.constraints.hasOwnProperty(i)&&t.constraints[i]!==e[i])return;t.callback(e)}}))}))}))};const{iceServers:n,speaker:s,micId:o,micLabel:r,camId:a,camLabel:c,localElement:d,remoteElement:l,options:u,mediaConstraints:{audio:h,video:p},ringtoneFile:g,ringbackFile:v}=e;this.options=Object.assign({},J,{audio:h,video:p,iceServers:(null==t?void 0:t.iceServers)&&Array.isArray(t.iceServers)?t.iceServers:n,localElement:d,remoteElement:l,micId:o,micLabel:r,camId:a,camLabel:c,speakerId:s,ringtoneFile:g,ringbackFile:v,debug:u.debug,debugOutput:u.debugOutput,trickleIce:u.trickleIce,prefetchIceCandidates:u.prefetchIceCandidates,forceRelayCandidate:u.forceRelayCandidate,keepConnectionAliveOnSocketClose:u.keepConnectionAliveOnSocketClose,mutedMicOnStart:u.mutedMicOnStart},t),this._onMediaError=this._onMediaError.bind(this),this._onPeerConnectionFailureError=this._onPeerConnectionFailureError.bind(this),this._onPeerConnectionSignalingStateClosed=this._onPeerConnectionSignalingStateClosed.bind(this),this._onTrickleIceSdp=this._onTrickleIceSdp.bind(this),this._registerPeerEvents=this._registerPeerEvents.bind(this),this._registerTrickleIcePeerEvents=this._registerTrickleIcePeerEvents.bind(this),this._init(),this.options&&(this._ringtone=nt(this.options.ringtoneFile,"_ringtone"),this._ringback=nt(this.options.ringbackFile,"_ringback"))}get creatingPeer(){return this._creatingPeer}get signalingStateClosed(){return this._signalingStateClosed}get performanceMetrics(){const e=performance.measure("peer-creation","peer-creation-start","peer-creation-end"),t=performance.measure("ice-gathering","ice-gathering-start","ice-gathering-end"),i=performance.measure("sdp-send","sdp-send-start","sdp-send-end"),n=performance.measure("total-duration","peer-creation-start","sdp-send-end"),s=e=>`${e.toFixed(2)}ms`;return{"Peer Creation":{duration:s(e.duration)},"ICE Gathering":{duration:s(t.duration)},"SDP Send":{duration:s(i.duration)},"Total Duration":{duration:s(n.duration)}}}get nodeId(){return this._targetNodeId}set nodeId(e){this._targetNodeId=e}get isVideoCall(){return!!this.options.video}get telnyxIDs(){return{telnyxCallControlId:this.options.telnyxCallControlId,telnyxSessionId:this.options.telnyxSessionId,telnyxLegId:this.options.telnyxLegId}}get localStream(){return this.options.localStream}get remoteStream(){return this.options.remoteStream}get memberChannel(){return`conference-member.${this.id}`}get isAudioMuted(){return!et(this.options.localStream)}invite(){return i(this,void 0,void 0,(function*(){this._creatingPeer=!0,this.direction=V.Outbound,this.options.trickleIce&&this._resetTrickleIceCandidateState(),performance.mark("peer-creation-start"),this.peer=new _t(G.Offer,this.options,this.session,this._onTrickleIceSdp,this.options.trickleIce?this._registerTrickleIcePeerEvents:this._registerPeerEvents),yield this.peer.init(),this._creatingPeer=!1}))}answer(e={}){var t;return i(this,void 0,void 0,(function*(){this._creatingPeer=!0,performance.mark("new-call-start"),this.stopRingtone(),this.direction=V.Inbound,(null===(t=null==e?void 0:e.customHeaders)||void 0===t?void 0:t.length)>0&&(this.options=Object.assign(Object.assign({},this.options),{customHeaders:e.customHeaders})),this.options.trickleIce&&this._resetTrickleIceCandidateState(),performance.mark("peer-creation-start"),this.peer=new _t(G.Answer,this.options,this.session,this._onTrickleIceSdp,this.options.trickleIce?this._registerTrickleIcePeerEvents:this._registerPeerEvents),yield this.peer.init(),performance.mark("new-call-end"),this._creatingPeer=!1}))}playRingtone(){st(this._ringtone)}stopRingtone(){ot(this._ringtone)}playRingback(){st(this._ringback)}stopRingback(){ot(this._ringback)}hangup(t,i){var n,s,o;const r=t||{},a=!1!==i,c=this._state<K.Active?{cause:"USER_BUSY",causeCode:17}:{cause:"NORMAL_CLEARING",causeCode:16};if(this.cause=r.cause||c.cause,this.causeCode=r.causeCode||c.causeCode,this.sipCode=r.sipCode||null,this.sipReason=r.sipReason||null,this.sipCallId=r.sip_call_id||null,this.options.customHeaders=[...null!==(n=this.options.customHeaders)&&void 0!==n?n:[],...null!==(o=null===(s=null==r?void 0:r.dialogParams)||void 0===s?void 0:s.customHeaders)&&void 0!==o?o:[]],r.isRecovering)return this._isRecovering=!0,this.setState(K.Recovering),void this._finalize();this.setState(K.Hangup);const d=()=>{var e;C.debug(`[${this.id}] Closing peer from hangup`),null===(e=this.peer)||void 0===e||e.close(),this.setState(K.Destroy)};if(this.stopRingtone(),this.stopRingback(),a){const t=new Te({sipCode:this.sipCode,sip_call_id:this.sipCallId,sessid:this.session.sessionid,dialogParams:this.options,cause:this.cause,causeCode:this.causeCode});this._execute(t).catch((t=>{C.error("telnyx_rtc.bye failed!",t),re(e.SwEvent.Error,{error:t,sessionId:this.session.sessionid},this.session.uuid)})).then(d.bind(this))}else d()}hold(){const e=new Oe({sessid:this.session.sessionid,action:"hold",dialogParams:this.options});return this._execute(e).then(this._handleChangeHoldStateSuccess.bind(this)).catch(this._handleChangeHoldStateError.bind(this))}unhold(){const e=new Oe({sessid:this.session.sessionid,action:"unhold",dialogParams:this.options});return this._execute(e).then(this._handleChangeHoldStateSuccess.bind(this)).catch(this._handleChangeHoldStateError.bind(this))}toggleHold(){const e=new Oe({sessid:this.session.sessionid,action:"toggleHold",dialogParams:this.options});return this._execute(e).then(this._handleChangeHoldStateSuccess.bind(this)).catch(this._handleChangeHoldStateError.bind(this))}dtmf(e){const t=new Ae({sessid:this.session.sessionid,dtmf:e,dialogParams:this.options});this._execute(t)}message(e,t){const i={from:this.session.options.login,to:e,body:t},n=new Ae({sessid:this.session.sessionid,msg:i,dialogParams:this.options});this._execute(n)}muteAudio(){Xe(this.options.localStream)}unmuteAudio(){Qe(this.options.localStream)}toggleAudioMute(){Ze(this.options.localStream)}setAudioInDevice(e,t=this.options.mutedMicOnStart){return i(this,void 0,void 0,(function*(){const{instance:i}=this.peer,n=i.getSenders().find((({track:{kind:e}})=>"audio"===e));if(n){const i=yield je({audio:{deviceId:{exact:e}}}),s=i.getAudioTracks()[0];s.enabled=!t,n.replaceTrack(s),this.options.micId=e;const{localStream:o}=this.options;o.getAudioTracks().forEach((e=>e.stop())),o.getVideoTracks().forEach((e=>i.addTrack(e))),this.options.localStream=i}}))}muteVideo(){var e;e=this.options.localStream,Ye(e,"video",!1)}unmuteVideo(){var e;e=this.options.localStream,Ye(e,"video",!0)}toggleVideoMute(){var e;e=this.options.localStream,Ye(e,"video",null)}setVideoDevice(e){return i(this,void 0,void 0,(function*(){const{instance:t}=this.peer,i=t.getSenders().find((({track:{kind:e}})=>"video"===e));if(i){const t=yield je({video:{deviceId:{exact:e}}}),n=t.getVideoTracks()[0];i.replaceTrack(n);const{localElement:s,localStream:o}=this.options;$e(s,t),this.options.camId=e,o.getAudioTracks().forEach((e=>t.addTrack(e))),o.getVideoTracks().forEach((e=>e.stop())),this.options.localStream=t}}))}deaf(){Xe(this.options.remoteStream)}undeaf(){Qe(this.options.remoteStream)}toggleDeaf(){Ze(this.options.remoteStream)}setBandwidthEncodingsMaxBps(e,t){return i(this,void 0,void 0,(function*(){if(!this||!this.peer)return void C.error("Could not set bandwidth (reason: no peer connection). Dynamic bandwidth can only be set when there is a call running - is there any call running?)");const{instance:i}=this.peer,n=i.getSenders();if(!n)return void C.error("Could not set bandwidth (reason: no senders). Dynamic bandwidth can only be set when there is a call running - is there any call running?)");const s=n.find((({track:{kind:e}})=>e===t));if(s){const i=s.getParameters();i.encodings||(i.encodings=[{rid:"h"}]),C.info("Parameters: ",i),C.info("Setting max ","audio"===t?"audio":"video"," bandwidth to: ",e," [bps]"),i.encodings[0].maxBitrate=e,yield s.setParameters(i).then((()=>{C.info("audio"===t?"New audio":"New video"," bandwidth settings in use: ",s.getParameters())})).catch((e=>C.error(e)))}else C.error("Could not set bandwidth (reason: no "+t+" sender). Dynamic bandwidth can only be set when there is a call running - is there any call running?)")}))}setAudioBandwidthEncodingsMaxBps(e){this.setBandwidthEncodingsMaxBps(e,"audio")}setVideoBandwidthEncodingsMaxBps(e){this.setBandwidthEncodingsMaxBps(e,"video")}getStats(e,t){if(!e)return;const i={callback:e,constraints:t};if(this._statsBindings.push(i),!this._statsIntervalId){const e=2e3;this._startStats(e)}}setState(e){var t;switch(this._prevState=this._state,this._state=e,this.state=K[this._state].toLowerCase(),this.prevState=K[this._prevState].toLowerCase(),C.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this._dispatchNotification({type:q.callUpdate,call:this}),e){case K.Purge:C.debug(`Call ${this.id} hangup call due to purge state`),this.hangup({cause:"PURGE",causeCode:1},!1);break;case K.Active:this._isRecovering&&(this._isRecovering=!1,C.debug(`[${this.id}] Recovery complete, call is active`)),setTimeout((()=>{const{remoteElement:e,speakerId:t}=this.options;e&&t&&Fe(e,t)}),0),this._callReportCollector&&(null===(t=this.peer)||void 0===t?void 0:t.instance)&&this.session.callReportId&&this._callReportCollector.start(this.peer.instance);break;case K.Destroy:this._finalize()}}handleMessage(t){const{method:i,params:n}=t;switch(i){case H.Answer:if(this.gotAnswer=!0,this._state>=K.Active)return;this._state>=K.Early&&this.setState(K.Active),this.gotEarly||this._onRemoteSdp(n.sdp),this.stopRingback(),this.stopRingtone();break;case H.Media:if(this._state>=K.Early)return;this.gotEarly=!0,this._onRemoteSdp(n.sdp);break;case H.Display:{const{display_name:t,display_number:s,display_direction:o}=n;this.extension=s;const r=o===V.Inbound?V.Outbound:V.Inbound,a={type:q[i],call:this,displayName:t,displayNumber:s,displayDirection:r};re(e.SwEvent.Notification,a,this.id)||re(e.SwEvent.Notification,a,this.session.uuid);break}case H.Candidate:this._addIceCandidate(n);break;case H.Info:case H.Event:{const t=Object.assign(Object.assign({},n),{type:q.generic,call:this});re(e.SwEvent.Notification,t,this.id)||re(e.SwEvent.Notification,t,this.session.uuid);break}case H.Ringing:this.playRingback(),n.telnyx_call_control_id&&(this.options.telnyxCallControlId=n.telnyx_call_control_id),n.telnyx_session_id&&(this.options.telnyxSessionId=n.telnyx_session_id),n.telnyx_leg_id&&(this.options.telnyxLegId=n.telnyx_leg_id);break;case H.Bye:const t=n.client_state||n.clientState;t&&(this.options.clientState=t),this.stopRingback(),this.stopRingtone(),this.hangup(n,!1)}}handleConferenceUpdate(e,t){return i(this,void 0,void 0,(function*(){if(!this._checkConferenceSerno(e.wireSerno)&&e.name!==t.laName)return C.error("ConferenceUpdate invalid wireSerno or packet name:",e),"INVALID_PACKET";const{action:i,data:n,hashKey:s=String(this._lastSerno),arrIndex:o}=e;switch(i){case"bootObj":{this._lastSerno=0;const{chatChannel:e,infoChannel:i,modChannel:s,laName:o,conferenceMemberID:r,role:a}=t;this._dispatchConferenceUpdate({action:Y.Join,conferenceName:o,participantId:Number(r),role:a}),e&&(yield this._subscribeConferenceChat(e)),i&&(yield this._subscribeConferenceInfo(i));const c=[];for(const e in n)c.push(Object.assign({callId:n[e][0],index:Number(e)},R(n[e][1])));this._dispatchConferenceUpdate({action:Y.Bootstrap,participants:c});break}case"add":this._dispatchConferenceUpdate(Object.assign({action:Y.Add,callId:s,index:o},R(n)));break;case"modify":this._dispatchConferenceUpdate(Object.assign({action:Y.Modify,callId:s,index:o},R(n)));break;case"del":this._dispatchConferenceUpdate(Object.assign({action:Y.Delete,callId:s,index:o},R(n)));break;case"clear":this._dispatchConferenceUpdate({action:Y.Clear});break;default:this._dispatchConferenceUpdate({action:i,data:n,callId:s,index:o})}}))}_addChannel(e){this.channels.includes(e)||this.channels.push(e);const t=this.session.relayProtocol;this.session._existsSubscription(t,e)&&(this.session.subscriptions[t][e]=Object.assign(Object.assign({},this.session.subscriptions[t][e]),{callId:this.id}))}_subscribeConferenceChat(e){return i(this,void 0,void 0,(function*(){const t={nodeId:this.nodeId,channels:[e],handler:e=>{const{direction:t,from:i,fromDisplay:n,message:s,type:o}=e.data;this._dispatchConferenceUpdate({action:Y.ChatMessage,direction:t,participantNumber:i,participantName:n,messageText:s,messageType:o,messageId:e.eventSerno})}},i=yield this.session.vertoSubscribe(t).catch((e=>{C.error("ConfChat subscription error:",e)}));Ke(i,e)&&(this._addChannel(e),Object.defineProperties(this,{sendChatMessage:{configurable:!0,value:(t,i)=>{this.session.vertoBroadcast({nodeId:this.nodeId,channel:e,data:{action:"send",message:t,type:i}})}}}))}))}_subscribeConferenceInfo(e){return i(this,void 0,void 0,(function*(){const t={nodeId:this.nodeId,channels:[e],handler:e=>{const{eventData:t}=e;if("layout-info"===t.contentType)t.callID=this.id,bt(this.session,t);else C.error("Conference-Info unknown contentType",e)}},i=yield this.session.vertoSubscribe(t).catch((e=>{C.error("ConfInfo subscription error:",e)}));Ke(i,e)&&this._addChannel(e)}))}_confControl(e,t={}){const i=Object.assign({application:"conf-control",callID:this.id,value:null},t);this.session.vertoBroadcast({nodeId:this.nodeId,channel:e,data:i})}_handleChangeHoldStateSuccess(e){return"active"===e.holdState?this.setState(K.Active):this.setState(K.Held),!0}_handleChangeHoldStateError(e){return C.error(`Failed to ${e.action} on call ${this.id}`),!1}_onRemoteSdp(e){return i(this,void 0,void 0,(function*(){const t=new RTCSessionDescription({sdp:e,type:G.Answer});yield this.peer.instance.setRemoteDescription(t).then((()=>{this.options.trickleIce&&(this._isRemoteDescriptionSet=!0,this._flushPendingTrickleIceCandidates()),this.gotEarly&&this.setState(K.Early),this.gotAnswer&&this.setState(K.Active)})).catch((e=>{C.error("Call setRemoteDescription Error: ",e),this.hangup({cause:"USER_BUSY",causeCode:17},!0)}))}))}_requestAnotherLocalDescription(){O(this.peer.onSdpReadyTwice)?re(e.SwEvent.Error,{error:new Error("SDP without candidates for the second time!"),sessionId:this.session.sessionid},this.session.uuid):(Object.defineProperty(this.peer,"onSdpReadyTwice",{value:this._onIceSdp.bind(this)}),this._iceDone=!1,this.peer.startNegotiation())}_onIceSdp(e){var t,i;this._iceTimeout&&clearTimeout(this._iceTimeout),this._iceTimeout=null,this._iceDone=!0;const{sdp:n,type:s}=e;if(-1===n.indexOf("candidate"))return C.info("No candidate - retry \n"),void this._requestAnotherLocalDescription();null===(i=null===(t=this.peer)||void 0===t?void 0:t.instance)||void 0===i||i.removeEventListener("icecandidate",this._onIce),performance.mark("ice-gathering-end");let o=null;const r={sessid:this.session.sessionid,sdp:n,dialogParams:this.options,"User-Agent":`Web-${St}`};switch(s){case G.Offer:this.setState(K.Requesting),o=new Ie(r);break;case G.Answer:this._isRecovering||this.setState(K.Answering),o=!0===this.options.attach?new Ee(r):new ke(r);break;default:return C.error(`${this.id} - Unknown local SDP type:`,e),this.hangup({},!1)}performance.mark("sdp-send-start"),this._execute(o).then((e=>{const{node_id:t=null}=e;this._targetNodeId=t,s===G.Offer?this.setState(K.Trying):this.setState(K.Active)})).catch((e=>{C.error(`${this.id} - Sending ${s} error:`,e),this.hangup({cause:"USER_BUSY",causeCode:17},!0)})).finally((()=>{performance.mark("sdp-send-end"),console.group("Performance Metrics"),console.table(this.performanceMetrics),console.groupEnd(),performance.clearMarks()}))}_onTrickleIceSdp(e){if(!e)return C.error("No SDP data provided"),this.hangup({},!1);const{sdp:t,type:i}=e;let n=null;const s={sessid:this.session.sessionid,sdp:t,dialogParams:this.options,trickle:!0,"User-Agent":`Web-${St}`};switch(i){case G.Offer:this.setState(K.Requesting),n=new Ie(s);break;case G.Answer:this._isRecovering||this.setState(K.Answering),n=!0===this.options.attach?new Ee(s):new ke(s);break;default:return C.error(`${this.id} - Unknown local SDP type:`,e),this.hangup({},!1)}performance.mark("sdp-send-start"),this._execute(n).then((e=>{const{node_id:t=null}=e;this._targetNodeId=t,i===G.Offer?this.setState(K.Trying):this.setState(K.Active)})).catch((e=>{C.error(`${this.id} - Sending ${i} error:`,e),this.hangup({cause:"USER_BUSY",causeCode:17},!0)})).finally((()=>{performance.mark("sdp-send-end")}))}_onIce(e){const{instance:t}=this.peer;null===this._iceTimeout&&(this._iceTimeout=setTimeout((()=>this._onIceSdp(t.localDescription)),1e3)),e.candidate?C.debug("RTCPeer Candidate:",e.candidate):this._onIceSdp(t.localDescription)}_onTrickleIce(e){e.candidate&&e.candidate.candidate?(C.debug("RTCPeer Candidate:",e.candidate),this._sendIceCandidate(e.candidate)):this._sendEndOfCandidates()}_sendIceCandidate(e){const t=new Re({sessid:this.session.sessionid,candidate:e.candidate,sdpMLineIndex:e.sdpMLineIndex,sdpMid:e.sdpMid,dialogParams:this.options});this._execute(t)}_addIceCandidate(e){if(!this._isRemoteDescriptionSet)return C.debug("Remote description not set. Queued ICE candidate.",e),void this._pendingIceCandidates.push(e);this._addIceCandidateToPeer(e)}_addIceCandidateToPeer(e){const t=this.peer.instance.addIceCandidate(e);Promise.resolve(t).then((()=>{C.debug("Successfully added ICE candidate:",e)})).catch((t=>{C.error("Failed to add ICE candidate:",t,e)}))}_sendEndOfCandidates(){const e=new xe({sessid:this.session.sessionid,endOfCandidates:!0,dialogParams:this.options});this._execute(e),performance.mark("ice-gathering-end")}_resetTrickleIceCandidateState(){this._pendingIceCandidates=[],this._isRemoteDescriptionSet=!1}_flushPendingTrickleIceCandidates(){if(!this._pendingIceCandidates.length)return;const e=[...this._pendingIceCandidates];this._pendingIceCandidates=[],e.forEach((e=>{this._addIceCandidateToPeer(e)}))}_registerPeerEvents(e){this._iceDone=!1,e.onicecandidate=e=>{this._iceDone||this._onIce(e)},e.onicecandidateerror=t=>{var i;if(C.debug("ICE candidate error:",t),null===(i=this.peer)||void 0===i?void 0:i.statsReporter){const i=ft(t,e);this.peer.statsReporter.reportIceCandidateError(i)}},e.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),e.addEventListener("track",(e=>{this.options.remoteStream=e.streams[0];const{remoteElement:t,remoteStream:i,screenShare:n}=this.options;!1===n&&$e(t,i)}))}_registerTrickleIcePeerEvents(e){e.onicecandidate=e=>{this._onTrickleIce(e)},e.onicegatheringstatechange=t=>{C.debug("ICE gathering state changed:",e.iceGatheringState),"complete"===e.iceGatheringState&&C.debug("Finished gathering candidates")},e.onicecandidateerror=t=>{var i;if(C.debug("ICE candidate error:",t),null===(i=this.peer)||void 0===i?void 0:i.statsReporter){const i=ft(t,e);this.peer.statsReporter.reportIceCandidateError(i)}},e.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),e.addEventListener("track",(e=>{this.options.remoteStream=e.streams[0];const{remoteElement:t,remoteStream:i,screenShare:n}=this.options;!1===n&&$e(t,i)}))}_onMediaError(e){this._dispatchNotification({type:q.userMediaError,error:e}),C.error("Media error, hanging up call",e),this.hangup({},!1)}_onPeerConnectionFailureError(e){this._dispatchNotification({type:q.peerConnectionFailureError,error:e}),C.error("Peer connection failure error")}_onPeerConnectionSignalingStateClosed(e){this._signalingStateClosed=!0,this._dispatchNotification(Object.assign({type:q.signalingStateClosed},e)),C.debug("Peer connection signaling state closed, call is not recoverable")}_dispatchConferenceUpdate(e){this._dispatchNotification(Object.assign({type:q.conferenceUpdate,call:this},e))}_dispatchNotification(t){!0!==this.options.screenShare&&(re(e.SwEvent.Notification,t,this.id,!1)||re(e.SwEvent.Notification,t,this.session.uuid))}_execute(e){return this.nodeId&&(e.targetNodeId=this.nodeId),this.session.execute(e)}_init(){const{id:t,userVariables:i,remoteCallerNumber:n,onNotification:s}=this.options;var o;this.options.id=t?t.toString():c(),this.id=this.options.id,i&&(o=i,0!==Object.keys(o).length)||(this.options.userVariables=this.session.options.userVariables||{}),n||(this.options.remoteCallerNumber=this.options.destinationNumber),this.session.calls[this.id]=this,ne(e.SwEvent.MediaError,this._onMediaError,this.id),ne(e.SwEvent.PeerConnectionFailureError,this._onPeerConnectionFailureError,this.id),ne(e.SwEvent.PeerConnectionSignalingStateClosed,this._onPeerConnectionSignalingStateClosed,this.id),O(s)&&ne(e.SwEvent.Notification,s.bind(this),this.id);const r=!1!==this.session.options.enableCallReports,a=this.session.options.callReportInterval||5e3,d=this.session.options.debugLogLevel||"debug",l=this.session.options.debugLogMaxEntries||1e3;r&&(this._callReportCollector=new at({enabled:!0,interval:a},{enabled:!0,level:d,maxEntries:l}),this._callReportCollector.onFlushNeeded=()=>{this._flushIntermediateReport()}),this._isRecovering?this.setState(K.Recovering):this.setState(K.New),C.info("New Call with Options:",this.options)}_finalize(){var t;this._stopStats(),C.debug(`[${this.id}] Closing peer from _finalize`),null===(t=this.peer)||void 0===t||t.close();const{remoteStream:i,localStream:n}=this.options;Ge(i),Ge(n),oe(e.SwEvent.MediaError,null,this.id),oe(e.SwEvent.PeerConnectionFailureError,null,this.id),oe(e.SwEvent.PeerConnectionSignalingStateClosed,null,this.id),this.session.calls[this.id]=null,delete this.session.calls[this.id],this._postCallReport()}_flushIntermediateReport(){var e;if(!this._callReportCollector)return;const t=this.session.callReportId;if(!t)return void C.debug("Cannot flush intermediate report: call_report_id not available");const i=null===(e=this.session.connection)||void 0===e?void 0:e.host;if(!i)return void C.debug("Cannot flush intermediate report: connection host not available");const n={callId:this.id,destinationNumber:this.options.destinationNumber,callerNumber:this.options.callerNumber,direction:this.direction===V.Inbound?"inbound":"outbound",state:this.state,telnyxSessionId:this.options.telnyxSessionId,telnyxLegId:this.options.telnyxLegId,sdkVersion:St},s=this._callReportCollector.flush(n);if(!s)return;const o=B()||void 0;this._callReportCollector.sendPayload(s,t,i,o).catch((e=>{C.error("Failed to post intermediate call report segment",{error:e})}))}_postCallReport(){var e;if(!this._callReportCollector)return void C.warn("Call report collector not initialized");this._callReportCollector.stop();const t=this.session.callReportId;if(!t)return C.debug("Cannot post call report: call_report_id not available"),void this._callReportCollector.cleanup();const i={callId:this.id,destinationNumber:this.options.destinationNumber,callerNumber:this.options.callerNumber,direction:this.direction===V.Inbound?"inbound":"outbound",state:this.state,telnyxSessionId:this.options.telnyxSessionId,telnyxLegId:this.options.telnyxLegId,sdkVersion:St},n=null===(e=this.session.connection)||void 0===e?void 0:e.host;if(!n)return void C.error("Cannot post call report: connection host not available");const s=B()||void 0;this._callReportCollector.postReport(i,t,n,s).catch((e=>{C.error("Failed to post call report",{error:e})})).finally((()=>{var e;null===(e=this._callReportCollector)||void 0===e||e.cleanup()}))}_startStats(e){this._statsIntervalId=setInterval(this._doStats,e),C.info("Stats started")}_stopStats(){this._statsIntervalId&&(clearInterval(this._statsIntervalId),this._statsIntervalId=null),C.debug("Stats stopped")}}wt.setStateTelnyx=e=>{if(e){switch(e._state){case K.Recovering:e.state="recovering";break;case K.Requesting:case K.Trying:case K.Early:e.state="connecting";break;case K.Active:e.state="active";break;case K.Held:e.state="held";break;case K.Hangup:case K.Destroy:e.state="done";break;case K.Answering:e.state="ringing";break;case K.New:e.state="new"}return e}};class Ct extends wt{constructor(){super(...arguments),this._statsInterval=null,this.sendConversationMessage=(e,t)=>this.session.execute(new rt(e,t))}hangup(e={},t=!0){this.screenShare instanceof Ct&&this.screenShare.hangup(e,t),super.hangup(e,t)}startScreenShare(e){return i(this,void 0,void 0,(function*(){const t=yield(i={video:!0},navigator.mediaDevices.getDisplayMedia(i));var i;t.getTracks().forEach((e=>{e.addEventListener("ended",(()=>{this.screenShare&&this.screenShare.hangup()}))}));const{remoteCallerName:n,remoteCallerNumber:s,callerName:o,callerNumber:r}=this.options,a=Object.assign({screenShare:!0,localStream:t,destinationNumber:`${this.extension}-screen`,remoteCallerName:n,remoteCallerNumber:`${s}-screen`,callerName:`${o} (Screen)`,callerNumber:`${r} (Screen)`},e);return this.screenShare=new Ct(this.session,a),this.screenShare.invite(),this.screenShare}))}stopScreenShare(){this.screenShare instanceof Ct&&this.screenShare.hangup()}setAudioOutDevice(e){return i(this,void 0,void 0,(function*(){this.options.speakerId=e;const{remoteElement:t,speakerId:i}=this.options;return!(!t||!i)&&Fe(t,i)}))}_finalize(){this._stats(!1),super._finalize()}_stats(e=!0){if(!1===e)return clearInterval(this._statsInterval);this._statsInterval=window.setInterval((()=>i(this,void 0,void 0,(function*(){const e=yield this.peer.instance.getStats(null);let t="";const i=["certificate","codec","peer-connection","stream","local-candidate","remote-candidate"],n=["id","type","timestamp"];e.forEach((e=>{i.includes(e.type)||(t+=`\n${e.type}\n`,Object.keys(e).forEach((i=>{n.includes(i)||(t+=`\t${i}: ${e[i]}\n`)})))})),C.info(t)}))),2e3)}}class It extends Me{constructor(e){super(e),this.calls={},this.autoRecoverCalls=!0,this._iceServers=[],this._localElement=null,this._remoteElement=null,this._jwtAuth=!0,this._audioConstraints=!0,this._previousAudioConstraints=!0,this._videoConstraints=!1,this._speaker=null,this._onlineHandler=null,this._offlineHandler=null,this._wasOffline=!1,this._videoConstraints=e.video||!1,this.iceServers=e.iceServers,this.ringtoneFile=e.ringtoneFile,this.ringbackFile=e.ringbackFile,this._setupNetworkListeners()}get reconnectDelay(){return 1e3}getIsRegistered(){const e=Object.create(null,{getIsRegistered:{get:()=>super.getIsRegistered}});return i(this,void 0,void 0,(function*(){return e.getIsRegistered.call(this)}))}connect(){const e=Object.create(null,{connect:{get:()=>super.connect}});return i(this,void 0,void 0,(function*(){e.connect.call(this)}))}checkPermissions(e=!0,t=!0){return i(this,void 0,void 0,(function*(){try{const i=yield Ve({audio:e,video:t});return Ge(i),!0}catch(e){return!1}}))}logout(){this.disconnect()}disconnect(){const e=Object.create(null,{disconnect:{get:()=>super.disconnect}});return i(this,void 0,void 0,(function*(){Object.keys(this.calls).forEach((e=>this.calls[e].setState(K.Purge))),this.calls={},this._cleanupNetworkListeners(),yield e.disconnect.call(this)}))}socketDisconnect(){this._closeConnection()}handleLoginError(e){super._handleLoginError(e)}speedTest(t){return new Promise(((i,n)=>{if(se(e.SwEvent.SpeedTest,(e=>{const{upDur:n,downDur:s}=e,o=s?8*t/(s/1e3)/1024:0;i({upDur:n,downDur:s,upKps:(n?8*t/(n/1e3)/1024:0).toFixed(0),downKps:o.toFixed(0)})}),this.uuid),!(t=Number(t)))return n(`Invalid parameter 'bytes': ${t}`);this.executeRaw(`#SPU ${t}`);let s=t/1024;t%1024&&s++;const o=".".repeat(1024);for(let e=0;e<s;e++)this.executeRaw(`#SPB ${o}`);this.executeRaw("#SPE")}))}getDevices(){return He().catch((t=>(re(e.SwEvent.MediaError,t,this.uuid),[])))}getVideoDevices(){return He(Q.Video).catch((t=>(re(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioInDevices(){return He(Q.AudioIn).catch((t=>(re(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioOutDevices(){return He(Q.AudioOut).catch((t=>(C.error("getAudioOutDevices",t),re(e.SwEvent.MediaError,t,this.uuid),[])))}validateDeviceId(e,t,i){return We(e,t,i)}getDeviceResolutions(e){return i(this,void 0,void 0,(function*(){try{return yield(e=>i(void 0,void 0,void 0,(function*(){const t=[],i=yield Ve({video:{deviceId:{exact:e}}}),n=i.getVideoTracks()[0];for(let e=0;e<qe.length;e++){const[i,s]=qe[e];(yield n.applyConstraints({width:{exact:i},height:{exact:s}}).then((()=>!0)).catch((()=>!1)))&&t.push({resolution:`${i}x${s}`,width:i,height:s})}return Ge(i),t})))(e)}catch(e){throw e}}))}get mediaConstraints(){return{audio:this._audioConstraints,video:this._videoConstraints}}setAudioSettings(e){return i(this,void 0,void 0,(function*(){if(!e)throw new Error("You need to provide the settings object");const{micId:n,micLabel:s}=e,o=t(e,["micId","micLabel"]);return Je(o),this._audioConstraints=yield((e,t,n,s)=>i(void 0,void 0,void 0,(function*(){const{deviceId:i}=s;if(void 0===i&&(e||t)){const i=yield We(e,t,n).catch((e=>null));i&&(s.deviceId={exact:i})}return s})))(n,s,"audioinput",o),this.micId=n,this.micLabel=s,this._audioConstraints}))}disableMicrophone(){this._previousAudioConstraints=this._audioConstraints,this._audioConstraints=!1}enableMicrophone(){this._audioConstraints=this._previousAudioConstraints||!0}set iceServers(e){if(e&&Array.isArray(e))this._iceServers=e;else{const e="development"===this.options.env;this._iceServers=e?p:h}}get iceServers(){return this._iceServers}set speaker(e){this._speaker=e}get speaker(){return this._speaker}set localElement(e){this._localElement=A(e)}get localElement(){return this._localElement}set remoteElement(e){this._remoteElement=A(e)}get remoteElement(){return this._remoteElement}vertoBroadcast({nodeId:e,channel:t="",data:i}){if(!t)throw new Error(`Invalid channel for broadcast: ${t}`);const n=new Le({sessid:this.sessionid,eventChannel:t,data:i});e&&(n.targetNodeId=e),this.execute(n).catch((e=>e))}vertoSubscribe({nodeId:e,channels:t=[],handler:n}){return i(this,void 0,void 0,(function*(){if(!(t=t.filter((e=>e&&!this._existsSubscription(this.relayProtocol,e)))).length)return{};const i=new Pe({sessid:this.sessionid,eventChannel:t});e&&(i.targetNodeId=e);const s=yield this.execute(i),{unauthorized:o=[],subscribed:r=[]}=ze(s);return o.length&&o.forEach((e=>this._removeSubscription(this.relayProtocol,e))),r.forEach((e=>this._addSubscription(this.relayProtocol,n,e))),s}))}vertoUnsubscribe({nodeId:e,channels:t=[]}){return i(this,void 0,void 0,(function*(){if(!(t=t.filter((e=>e&&this._existsSubscription(this.relayProtocol,e)))).length)return{};const i=new Ne({sessid:this.sessionid,eventChannel:t});e&&(i.targetNodeId=e);const n=yield this.execute(i),{unsubscribed:s=[],notSubscribed:o=[]}=ze(n);return s.forEach((e=>this._removeSubscription(this.relayProtocol,e))),o.forEach((e=>this._removeSubscription(this.relayProtocol,e))),n}))}_setupNetworkListeners(){"undefined"!=typeof window&&(this._onlineHandler=()=>{this._wasOffline&&(C.debug(`Network connectivity restored for session ${this.sessionid}. Reconnecting...`),this._wasOffline=!1,this._autoReconnect=!0,this.socketDisconnect())},this._offlineHandler=()=>{this._wasOffline=!0,C.debug(`Network connectivity lost for session ${this.sessionid}`)},window.addEventListener("online",this._onlineHandler),window.addEventListener("offline",this._offlineHandler))}_cleanupNetworkListeners(){"undefined"!=typeof window&&this._onlineHandler&&this._offlineHandler&&(window.removeEventListener("online",this._onlineHandler),window.removeEventListener("offline",this._offlineHandler),this._onlineHandler=null,this._offlineHandler=null)}static telnyxStateCall(e){return Ct.setStateTelnyx(e)}}class kt{constructor(e,t){this.code=t,this.message=e}}class Et{constructor(e){this.session=e,this.retriedConnect=0,this.retriedRegister=0,this.receivedAuthenticationRequired=0}_ack(e,t){const i=new Ce(e,t);this.nodeId&&(i.targetNodeId=this.nodeId),this.session.execute(i)}reconnectDelay(){return 1e3*N(2,6)}handleMessage(t){var n,s,o;const{session:r}=this,{id:a,method:c,params:d={},voice_sdk_id:l}=t,u=null==d?void 0:d.callID,h=null==d?void 0:d.eventChannel,p=null==d?void 0:d.eventType,g=r.calls[u],v=null===(n=null==g?void 0:g.peer)||void 0===n?void 0:n.isConnectionHealthy();if("channelPvtData"===p)return this._handlePvtEvent(d.pvtData);const f=(e=!1)=>{var t,i,n,s,o,a;const l={audio:!0,video:r.options.video,remoteSdp:d.sdp,destinationNumber:d.callee_id_number,remoteCallerName:d.caller_id_name,remoteCallerNumber:d.caller_id_number,callerName:d.callee_id_name,callerNumber:d.callee_id_number,attach:c===H.Attach,mediaSettings:d.mediaSettings,debug:null!==(t=r.options.debug)&&void 0!==t&&t,debugOutput:null!==(i=r.options.debugOutput)&&void 0!==i?i:"socket",trickleIce:null!==(n=r.options.trickleIce)&&void 0!==n&&n,prefetchIceCandidates:null===(s=r.options.prefetchIceCandidates)||void 0===s||s,forceRelayCandidate:null!==(o=r.options.forceRelayCandidate)&&void 0!==o&&o,keepConnectionAliveOnSocketClose:null!==(a=r.options.keepConnectionAliveOnSocketClose)&&void 0!==a&&a};u&&(l.id=u),d.telnyx_call_control_id&&(l.telnyxCallControlId=d.telnyx_call_control_id),d.telnyx_session_id&&(l.telnyxSessionId=d.telnyx_session_id),d.telnyx_leg_id&&(l.telnyxLegId=d.telnyx_leg_id),d.client_state&&(l.clientState=d.client_state),d.dialogParams&&d.dialogParams.custom_headers&&d.dialogParams.custom_headers.length&&(l.customHeaders=d.dialogParams.custom_headers);const h=new Ct(r,l,e);return h.nodeId=this.nodeId,h},m=new me(l),b=new ye(l);switch(c){case H.Answer:case H.Display:case H.Candidate:case H.Ringing:case H.Bye:case H.Media:if(!u||!g)return void C.error(`Received ${c} for non existing call:`,d);g.handleMessage(t),this._ack(a,c);break;case H.Ping:this.session.setPingReceived(),this.session.execute(b).then((()=>{this.receivedAuthenticationRequired=0})).catch((e=>i(this,void 0,void 0,(function*(){e.code===this.session.authenticationRequiredErrorCode&&this.receivedAuthenticationRequired>=0&&(this.receivedAuthenticationRequired+=1,this.receivedAuthenticationRequired>1&&this.session.hasAutoReconnect()&&(C.warn("Ping failed twice with Authentication Required. Re-logging in..."),this.session.login(),this.receivedAuthenticationRequired=-1))}))));break;case H.Punt:r.options.keepConnectionAliveOnSocketClose&&v?(C.info(`[${(new Date).toISOString()}][${u}] keeping session calls alive due to PUNT and keepConnectionAliveOnSocketClose. Disconnecting base session...`),r.socketDisconnect(),this._ack(a,c)):r.disconnect();break;case H.Invite:{const e=f();e.direction=V.Inbound,e.playRingtone(),e.setState(K.Ringing),this._ack(a,c);break}case H.Attach:{if(!g){return f().answer(),void this._ack(a,c)}const e=!!g;C.info(`[${(new Date).toISOString()}][${u}] closing existing call on ATTACH.`),g.hangup({isRecovering:e},!1),C.info(`[${(new Date).toISOString()}][${u}] Attach: Creating new call for recovery`);f(e).answer(),this._ack(a,c);break}case H.Event:case"webrtc.event":if(!h)return void C.error("Verto received an unknown event:",d);const n=r.relayProtocol,l=h.split(".")[0];r._existsSubscription(n,h)?re(n,d,h):h===r.sessionid?this._handleSessionEvent(d.eventData):r._existsSubscription(n,l)?re(n,d,l):r.calls.hasOwnProperty(h)?r.calls[h].handleMessage(t):re(e.SwEvent.Notification,d,r.uuid);break;case H.Info:d.type=q.generic,re(e.SwEvent.Notification,d,r.uuid);break;case H.ClientReady:this.session.execute(m);break;default:{const i=j(t);if(i){switch(i){case X.REGISTER:case X.REGED:if(r.connection.previousGatewayState!==X.REGED&&r.connection.previousGatewayState!==X.REGISTER){this.session._triggerKeepAliveTimeoutCheck(),this.retriedRegister=0;const i=null===(o=null===(s=null==t?void 0:t.result)||void 0===s?void 0:s.params)||void 0===o?void 0:o.call_report_id;i&&(r.callReportId=i,C.debug("Captured call_report_id from REGED:",i)),d.type=q.vertoClientReady,re(e.SwEvent.Ready,d,r.uuid)}break;case X.UNREGED:case X.NOREG:if(this.retriedRegister+=1,5===this.retriedRegister){this.retriedRegister=0,re(e.SwEvent.Error,{error:new kt("Fail to register the user, the server tried 5 times","UNREGED|NOREG"),sessionId:r.sessionid},r.uuid);break}setTimeout((()=>{this.session.execute(m)}),this.reconnectDelay());break;case X.FAILED:case X.FAIL_WAIT:if(r.connection.previousGatewayState!==X.FAILED&&r.connection.previousGatewayState!==X.FAIL_WAIT){if(!this.session.hasAutoReconnect()){this.retriedConnect=0,re(e.SwEvent.Error,{error:new kt("Fail to connect the server, the server tried 5 times","FAILED|FAIL_WAIT"),sessionId:r.sessionid},r.uuid);break}if(this.retriedConnect+=1,5===this.retriedConnect){this.retriedConnect=0,re(e.SwEvent.Error,{error:new Error("Connection Retry Failed"),sessionId:r.sessionid},r.uuid);break}setTimeout((()=>{if(C.debug(`Reconnecting... Retry ${this.retriedConnect} of 5`),this.session.options.keepConnectionAliveOnSocketClose){const e=Object.values(r.calls).some((e=>{var t;return(null===(t=e.peer)||void 0===t?void 0:t.instance)&&!e.signalingStateClosed}));if(e)return C.debug("Reconnecting by keeping the existing session due to keepConnectionAliveOnSocketClose option being set."),void this.session.socketDisconnect();C.debug("keepConnectionAliveOnSocketClose is set but all peer connections have signalingState closed, doing full reconnect")}this.session.disconnect().then((()=>{this.session.clearConnection(),this.session.connect()}))}),this.reconnectDelay())}break;default:C.warn("GatewayState message unknown method:",t)}break}C.debug("Verto message unknown method:",t);break}}}_retrieveCallId(e,t){const i=Object.keys(this.session.calls);if("bootObj"!==e.action)return i.find((e=>this.session.calls[e].channels.includes(t)));{const t=e.data.find((e=>i.includes(e[0])));if(t instanceof Array)return t[0]}}_handlePvtEvent(t){return i(this,void 0,void 0,(function*(){const{session:i}=this,n=i.relayProtocol,{action:s,laChannel:o,laName:r,chatChannel:a,infoChannel:c,modChannel:d,conferenceMemberID:l,role:u,callID:h}=t;switch(s){case"conference-liveArray-join":{const e=()=>{i.vertoBroadcast({nodeId:this.nodeId,channel:o,data:{liveArray:{command:"bootstrap",context:o,name:r}}})},n={nodeId:this.nodeId,channels:[o],handler:({data:n})=>{const s=h||this._retrieveCallId(n,o);if(s&&i.calls.hasOwnProperty(s)){const a=i.calls[s];a._addChannel(o),a.extension=r,a.handleConferenceUpdate(n,t).then((t=>{"INVALID_PACKET"===t&&e()}))}}},s=yield i.vertoSubscribe(n).catch((e=>{C.error("liveArray subscription error:",e)}));Ke(s,o)&&e();break}case"conference-liveArray-part":{let t=null;if(o&&i._existsSubscription(n,o)){const{callId:s=null}=i.subscriptions[n][o];if(t=i.calls[s]||null,null!==s){const n={type:q.conferenceUpdate,action:Y.Leave,conferenceName:r,participantId:Number(l),role:u};re(e.SwEvent.Notification,n,s,!1)||re(e.SwEvent.Notification,n,i.uuid),null===t&&oe(e.SwEvent.Notification,null,s)}}const s=[o,a,c,d];i.vertoUnsubscribe({nodeId:this.nodeId,channels:s}).then((({unsubscribedChannels:e=[]})=>{t&&(t.channels=t.channels.filter((t=>!e.includes(t))))})).catch((e=>{C.error("liveArray unsubscribe error:",e)}));break}}}))}_handleSessionEvent(t){switch(t.contentType){case"layout-info":case"layer-info":bt(this.session,t);break;case"logo-info":{const i={type:q.conferenceUpdate,action:Y.LogoInfo,logo:t.logoURL};re(e.SwEvent.Notification,i,this.session.uuid);break}}}}class Tt extends It{constructor(e){super(e),this.relayProtocol="verto-protocol",this.timeoutErrorCode=-329990,this.handleLoginOnSocketOpen=()=>i(this,void 0,void 0,(function*(){this._idle=!1;const{autoReconnect:e=!0}=this.options;yield this.login({onSuccess:()=>{this._autoReconnect=e}})})),this.handleAnonymousLoginOnSocketOpen=()=>i(this,void 0,void 0,(function*(){this._idle=!1,yield this.login()})),this._vertoHandler=new Et(this),window.addEventListener("beforeunload",(e=>{this.calls&&Object.keys(this.calls).forEach((e=>{this.calls[e]&&(C.info(`Hanging up call due to window unload: ${e}`),this.calls[e].hangup({},!0))}))}))}validateOptions(){return D(this.options)||M(this.options)}newCall(e){if(!this.validateCallOptions(e))throw new Error("Verto.newCall() error: destinationNumber is required.");performance.mark("new-call-start");const t=new Ct(this,e);return t.invite(),performance.mark("new-call-end"),t}broadcast(e){return this.vertoBroadcast(e)}subscribe(e){return this.vertoSubscribe(e)}unsubscribe(e){return this.vertoUnsubscribe(e)}validateCallOptions(e){return!!M(this.options)||Boolean(e.destinationNumber)}_onSocketOpen(){return i(this,void 0,void 0,(function*(){return D(this.options)?this.handleLoginOnSocketOpen():M(this.options)?this.handleAnonymousLoginOnSocketOpen():void 0}))}_onSocketMessage(e){this._vertoHandler.handleMessage(e)}}class Rt extends Tt{constructor(e){super(e),C.info(`SDK version: ${_e}`)}newCall(e){return super.newCall(e)}static webRTCInfo(){return tt()}static webRTCSupportedBrowserList(){return[{operationSystem:"Android",supported:[{browserName:"Chrome",features:["audio"],supported:it.full},{browserName:"Firefox",features:["audio"],supported:it.partial},{browserName:"Safari",supported:it.not_supported},{browserName:"Edge",supported:it.not_supported}]},{operationSystem:"iOS",supported:[{browserName:"Chrome",supported:it.not_supported},{browserName:"Firefox",supported:it.not_supported},{browserName:"Safari",features:["video","audio"],supported:it.full},{browserName:"Edge",supported:it.not_supported}]},{operationSystem:"Linux",supported:[{browserName:"Chrome",features:["video","audio"],supported:it.full},{browserName:"Firefox",features:["audio"],supported:it.partial},{browserName:"Safari",supported:it.not_supported},{browserName:"Edge",supported:it.not_supported}]},{operationSystem:"MacOS",supported:[{browserName:"Chrome",features:["video","audio"],supported:it.full},{browserName:"Firefox",features:["audio"],supported:it.partial},{browserName:"Safari",features:["video","audio"],supported:it.full},{browserName:"Edge",features:["audio"],supported:it.partial}]},{operationSystem:"Windows",supported:[{browserName:"Chrome",features:["video","audio"],supported:it.full},{browserName:"Firefox",features:["audio"],supported:it.partial},{browserName:"Safari",supported:it.not_supported},{browserName:"Edge",features:["audio"],supported:it.partial}]}]}}class xt{static run(t){return i(this,void 0,void 0,(function*(){const i=U({}),n=U({}),s=new Rt(t.credentials);yield s.connect(),s.on(e.SwEvent.Ready,i.resolve),s.on(e.SwEvent.Error,i.reject),s.on(e.SwEvent.MediaError,i.reject),s.on(e.SwEvent.MediaError,i.reject),s.on(e.SwEvent.Notification,(e=>{e.call&&e.call.sipCode>=400&&n.reject(new Error(e.call.sipReason))})),ne(e.SwEvent.StatsReport,(e=>{n.resolve(xt.mapReport(e))})),yield i.promise,yield s.newCall({destinationNumber:t.texMLApplicationNumber,debug:!0});const o=yield n.promise;return yield s.disconnect(),o}))}static mapReport(e){var t,i,n,s,o,r,a,c,d,l,u,h,p;const g=[],v=[];for(const t of e)switch(t.event){case"onicecandidate":t.data&&g.push(t.data);break;case"stats":v.push(t.data)}let f=0,m=1/0,b=-1/0,y=0,_=1/0,S=-1/0,w=0;v.forEach((e=>{var t,i,n;if(!(null===(t=e.remote.audio.inbound)||void 0===t?void 0:t[0]))return;f+=1;const s=null!==(i=e.remote.audio.inbound[0].jitter)&&void 0!==i?i:0,o=null!==(n=e.remote.audio.inbound[0].roundTripTime)&&void 0!==n?n:0;y+=s,w+=o,b=Math.max(b,s),m=Math.min(m,s),S=Math.max(S,o),_=Math.min(_,o)}));const C=w/f,I=y/f,k=v[v.length-1],E=ut({jitter:1e3*I,rtt:1e3*C,packetsReceived:null!==(n=null===(i=null===(t=k.audio.inbound)||void 0===t?void 0:t[0])||void 0===i?void 0:i.packetsReceived)&&void 0!==n?n:0,packetsLost:null!==(r=null===(o=null===(s=k.audio.inbound)||void 0===s?void 0:s[0])||void 0===o?void 0:o.packetsLost)&&void 0!==r?r:0});return{iceCandidatePairStats:v[v.length-1].connection,summaryStats:{mos:E,jitter:{average:I,max:b,min:m},rtt:{average:C,max:S,min:_},quality:ht(E)},sessionStats:{packetsSent:null!==(a=k.connection.packetsSent)&&void 0!==a?a:0,bytesSent:null!==(c=k.connection.bytesSent)&&void 0!==c?c:0,bytesReceived:null!==(d=k.connection.bytesReceived)&&void 0!==d?d:0,packetsLost:null!==(h=null===(u=null===(l=k.remote.audio.inbound)||void 0===l?void 0:l[0])||void 0===u?void 0:u.packetsLost)&&void 0!==h?h:0,packetsReceived:null!==(p=k.connection.packetsReceived)&&void 0!==p?p:0},iceCandidateStats:g}}getTelnyxIds(){return{telnyxCallControlId:"",telnyxSessionId:"",telnyxLegId:""}}}e.Call=Ct,e.ERROR_TYPE=W,e.NOTIFICATION_TYPE=q,e.PreCallDiagnosis=xt,e.TelnyxRTC=Rt,Object.defineProperty(e,"__esModule",{value:!0})}));