@telnyx/webrtc 2.25.17-beta.2 → 2.25.18
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 +1 -1
- package/lib/bundle.mjs +1 -1
- package/lib/packages/js/src/Modules/Verto/BaseSession.d.ts +7 -2
- package/lib/packages/js/src/Modules/Verto/messages/verto/AnonymousLogin.d.ts +1 -1
- package/lib/packages/js/src/Modules/Verto/messages/verto/Login.d.ts +1 -1
- package/lib/packages/js/src/Modules/Verto/services/Connection.d.ts +0 -1
- package/lib/packages/js/src/Modules/Verto/util/constants/index.d.ts +2 -2
- package/lib/packages/js/src/Modules/Verto/util/interfaces.d.ts +13 -5
- package/lib/packages/js/src/Modules/Verto/webrtc/BaseCall.d.ts +4 -5
- package/lib/packages/js/src/Modules/Verto/webrtc/Peer.d.ts +2 -2
- package/lib/packages/js/src/Modules/Verto/webrtc/VertoHandler.d.ts +0 -2
- package/lib/packages/js/src/Modules/Verto/webrtc/constants.d.ts +3 -0
- package/lib/packages/js/src/Modules/Verto/webrtc/interfaces.d.ts +20 -5
- package/lib/packages/js/src/index.d.ts +2 -1
- package/lib/packages/js/src/utils/interfaces.d.ts +0 -2
- package/package.json +2 -2
- package/lib/packages/js/src/Modules/Verto/util/LogCollector.d.ts +0 -29
- package/lib/packages/js/src/Modules/Verto/webrtc/CallReportCollector.d.ts +0 -91
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={urls:"stun:stun.l.google.com:19302"},u=[{urls:"stun:stun.telnyx.com:3478"},l,{urls:"turn:turn.telnyx.com:3478?transport=tcp",username:"testuser",credential:"testpassword"}],h=[{urls:"stun:stundev.telnyx.com:3478"},l,{urls:"turn:turndev.telnyx.com:3478?transport=tcp",username:"testuser",credential:"testpassword"}];var p;(p=e.SwEvent||(e.SwEvent={})).SocketOpen="telnyx.socket.open",p.SocketClose="telnyx.socket.close",p.SocketError="telnyx.socket.error",p.SocketMessage="telnyx.socket.message",p.SpeedTest="telnyx.internal.speedtest",p.Ready="telnyx.ready",p.Error="telnyx.error",p.Notification="telnyx.notification",p.StatsFrame="telnyx.stats.frame",p.StatsReport="telnyx.stats.report",p.Messages="telnyx.messages",p.Calls="telnyx.calls",p.MediaError="telnyx.rtc.mediaError",p.PeerConnectionFailureError="telnyx.rtc.peerConnectionFailureError",p.PeerConnectionSignalingStateClosed="telnyx.rtc.peerConnectionSignalingStateClosed";var g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function v(e,t){return e(t={exports:{}},t.exports),t.exports}var f=v((function(e){var t,i;t=g,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 m={debug:0,info:1,warn:2,error:3};class b{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(m[e]<m[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}clear(){this.buffer=[]}isActive(){return this.isCapturing}isEnabled(){return this.options.enabled}}let S=null;function y(){return S}function _(e){S=e}const w=f.getLogger("telnyx"),C={trace:0,debug:1,info:2,warn:3,error:4},I=C.info,k=w.methodFactory;w.methodFactory=(e,t,i)=>{const n=k(e,t,i);return function(...t){if(C[e]>=I){const e=[(new Date).toISOString().replace("T"," ").replace("Z",""),"-"];for(const i of t)e.push(i);n(...e)}const i=y();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)}}},w.setLevel("debug");const E=e=>{const[t,i,n,s,o,r]=e;let a={};try{a=JSON.parse(o.replace(/ID"/g,'Id"'))}catch(e){w.warn("Verto LA invalid media JSON string:",o)}return{participantId:Number(t),participantNumber:i,participantName:n,codec:s,media:a,participantData:r}},T=e=>{if("string"!=typeof e)return e;try{return JSON.parse(e)}catch(t){return e}},R=e=>e instanceof Function||"function"==typeof e,x=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):\/\//,O=(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?O(a,r):{result:s}},L=(e,t)=>Math.floor(Math.random()*(t-e+1)+e),P=({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 N({debounceTime:e}){let t,i;return{promise:new Promise(((n,s)=>{t=e?j(n,e):n,i=s})),resolve:t,reject:i}}const j=(e,t)=>{let i;return(...n)=>{clearTimeout(i),i=window.setTimeout((()=>{e(...n)}),t)}},$="telnyx-voice-sdk-id";function U(){return sessionStorage.getItem($)}var F,B,V;"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{sessionStorage.removeItem($)})),function(e){e.Offer="offer",e.Answer="answer"}(F||(F={})),function(e){e.Inbound="inbound",e.Outbound="outbound"}(B||(B={})),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 G={generic:"event",[V.Display]:"participantData",[V.Attach]:"participantData",conferenceUpdate:"conferenceUpdate",callUpdate:"callUpdate",vertoClientReady:"vertoClientReady",userMediaError:"userMediaError",peerConnectionFailureError:"peerConnectionFailureError",signalingStateClosed:"signalingStateClosed"},H={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};var q,W,J,K,z;!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"}(q||(q={})),function(e){e.Participant="participant",e.Moderator="moderator"}(W||(W={})),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"}(J||(J={})),function(e){e.Video="videoinput",e.AudioIn="audioinput",e.AudioOut="audiooutput"}(K||(K={})),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"}(z||(z={}));const Q="GLOBAL",Y={},X=(e,t)=>`${e}|${t}`,Z=(e,t=Q)=>X(e,t)in Y,ee=(e,t,i=Q)=>{const n=X(e,i);n in Y||(Y[n]=[]),Y[n].push(t)},te=(e,t,i=Q)=>{const n=function(s){ie(e,n,i),t(s)};return n.prototype.targetRef=t,ee(e,n,i)},ie=(e,t,i=Q)=>{if(!Z(e,i))return!1;const n=X(e,i);if(R(t)){for(let e=Y[n].length-1;e>=0;e--){const i=Y[n][e];(t===i||i.prototype&&t===i.prototype.targetRef)&&Y[n].splice(e,1)}}else Y[n]=[];return 0===Y[n].length&&delete Y[n],!0},ne=(e,t,i=Q,n=!0)=>{const s=n&&i!==Q;if(!Z(e,i))return s&&ne(e,t),!1;const o=X(e,i),r=Y[o].length;if(!r)return s&&ne(e,t),!1;for(let e=r-1;e>=0;e--)Y[o][e](t);return s&&ne(e,t),!0},se=e=>{const t=X(e,"");Object.keys(Y).filter((e=>0===e.indexOf(t))).forEach((e=>delete Y[e]))};let oe="undefined"!=typeof WebSocket?WebSocket:null;const re=0,ae=1,ce=2,de=3;class le{constructor(e){this.session=e,this.previousGatewayState="",this._wsClient=null,this._host=d,this._timers={},this._useCanaryRtcServer=!1,this._hasCanaryBeenUsed=!1,this.upDur=null,this.downDur=null;const{host:t,env:i,region:n,trickleIce:s,useCanaryRtcServer:o}=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||o)&&(this._useCanaryRtcServer=!0)}get connected(){return this._wsClient&&this._wsClient.readyState===ae}get connecting(){return this._wsClient&&this._wsClient.readyState===re}get closing(){return this._wsClient&&this._wsClient.readyState===ce}get closed(){return this._wsClient&&this._wsClient.readyState===de}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=U();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"),w.debug("first canary connection. Refreshing voice_sdk_id")),this._hasCanaryBeenUsed=!0),this._wsClient=new oe(t.toString()),this._wsClient.onopen=t=>ne(e.SwEvent.SocketOpen,t,this.session.uuid),this._wsClient.onclose=t=>ne(e.SwEvent.SocketClose,t,this.session.uuid),this._wsClient.onerror=t=>ne(e.SwEvent.SocketError,{error:t,sessionId:this.session.sessionid},this.session.uuid),this._wsClient.onmessage=t=>{var i,n;const s=T(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),w.debug("RECV: \n",JSON.stringify(s,null,2),"\n"),z[`${null===(n=null===(i=null==s?void 0:s.result)||void 0===i?void 0:i.params)||void 0===n?void 0:n.state}`]||!ne(s.id,s)){const t=M(s);ne(e.SwEvent.SocketMessage,s,this.session.uuid),Boolean(t)&&(this.previousGatewayState=t)}}else this._handleStringResponse(s)}}sendRawText(e){this._wsClient.send(e)}send(e){const{request:t}=e,i=new Promise(((e,i)=>{if(t.hasOwnProperty("result"))return e();te(t.id,(t=>{const{result:n,error:s}=O(t);return s?i(s):e(n)}))}));return w.debug("SEND: \n",JSON.stringify(t,null,2),"\n"),this._wsClient.send(JSON.stringify(t)),i}close(){this._wsClient&&(R(this._wsClient._beginClose)?this._wsClient._beginClose():this._wsClient.close()),this._wsClient=null}_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)),ne(e.SwEvent.SpeedTest,{upDur:this.upDur,downDur:this.downDur},this.session.uuid)}else w.warn("Unknown message from socket",t)}}class ue{buildRequest(e){this.request=Object.assign({jsonrpc:"2.0",id:c()},e)}}const he={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 pe extends ue{constructor(e={}){if(super(),e.hasOwnProperty("dialogParams")){const i=t(e.dialogParams,["remoteSdp","localStream","remoteStream","onNotification","camId","micId","speakerId"]);for(const e in he)e&&i.hasOwnProperty(e)&&(i[he[e]]=i[e],delete i[e]);e.dialogParams=i}this.buildRequest({method:this.toString(),params:e})}}class ge extends pe{constructor(e){super(),this.method=V.GatewayState;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}class ve{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 ge(U());this.pendingRequestId=e.request.id,this.gatewayStateTask=N({}),this.session.execute(e);const t=yield this.gatewayStateTask.promise;return!!t&&[z.REGISTER,z.REGED].includes(t)})),this.session=e,this.gatewayStateTask=N({}),this.session.on("telnyx.socket.message",this.onSocketMessage)}}class fe extends pe{constructor(e){super(),this.method=V.Ping;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}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");w.setLevel(e.debug?"debug":"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 le(this),this.registerAgent=new ve(this)}get __logger(){return w}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*L(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}),this.connect()}))}executeRaw(e){this._idle?this._executeQueue.push({msg:e}):this.connection.sendRawText(e)}validateOptions(){return P(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(),w.debug("Session disconnected. Cleaned up all listeners and subscriptions, closed connection, disabled auto-reconnect.")}))}on(e,t){return ee(e,t,this.uuid),this}off(e,t){return ie(e,t,this.uuid),this}connect(){return i(this,void 0,void 0,(function*(){this.connection||(this.connection=new le(this)),this._attachListeners(),this._autoReconnect=!0,this.connection.isAlive||this.connection.connect(),w.debug("Session connected. Connection initiated if not already alive. Auto-reconnect enabled.")}))}_handleLoginError(t){ne(e.SwEvent.Error,{error:t,sessionId:this.sessionid},this.uuid)}_onSocketOpen(){return i(this,void 0,void 0,(function*(){}))}onNetworkClose(){this.relayProtocol&&se(this.relayProtocol);for(const e in this.subscriptions)se(e);this.subscriptions={},this.contexts=[],clearTimeout(this._keepAliveTimeout),this._autoReconnect&&(this._reconnectTimeout=setTimeout((()=>this.connect()),this.reconnectDelay))}_onSocketMessage(e){}_removeSubscription(e,t){this._existsSubscription(e,t)&&(t?(delete this.subscriptions[e][t],ie(e,null,t)):(delete this.subscriptions[e],se(e)))}_addSubscription(e,t=null,i){this._existsSubscription(e,i)||(this._existsSubscription(e)||(this.subscriptions[e]={}),this.subscriptions[e][i]={},R(t)&&ee(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&&(w.warn("No ping/pong received, forcing PING ACK to keep alive"),this.execute(new fe(U()))),clearTimeout(this._keepAliveTimeout),this._triggerKeepAliveTimeoutCheck()}_triggerKeepAliveTimeoutCheck(){this._pong=!1,this._keepAliveTimeout=setTimeout((()=>this._resetKeepAlive()),35e3)}setPingReceived(){w.debug("Ping received"),this._pong=!0}static on(e,t){ee(e,t)}static off(e){ie(e)}static uuid(){return c()}clearConnection(){this.connection=null}hasAutoReconnect(){return this._autoReconnect}}const be=e=>navigator.mediaDevices.getUserMedia(e),Se=e=>e&&e instanceof MediaStream,ye=(e,t)=>{const i=x(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=x(e);if(null===i)return w.info("No HTMLMediaElement to attach the speakerId"),!1;if("string"!=typeof t)return w.info(`Invalid speaker deviceId: '${t}'`),!1;try{return yield i.setSinkId(t),!0}catch(e){return!1}})),we=e=>{e&&"live"===e.readyState&&e.stop()},Ce=e=>{Se(e)&&e.getTracks().forEach(we),e=null},Ie=e=>i(void 0,void 0,void 0,(function*(){w.info("RTCService.getUserMedia",e);const{audio:i,video:n}=e;if(!i&&!n)return null;try{return yield be(e)}catch(i){if(w.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){w.warn("Device not found or not readable, falling back to default device");try{return yield be(n)}catch(e){throw w.error("Fallback getUserMedia also failed: ",e),i}}}throw i}})),ke=(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===K.AudioIn||e===K.AudioOut,video:!e||e===K.Video}))(e)).catch((e=>(w.error(e),null)));if(n){if(Ce(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})),Ee=[[320,240],[640,360],[640,480],[1280,720],[1920,1080]],Te=(e,t,n)=>i(void 0,void 0,void 0,(function*(){const i=yield ke(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})),Re=e=>{const t=navigator.mediaDevices.getSupportedConstraints();Object.keys(e).map((i=>{t.hasOwnProperty(i)&&null!==e[i]&&void 0!==e[i]||delete e[i]}))},xe=(e,t)=>{if(!e)return!1;const{subscribed:i,alreadySubscribed:n}=Ae(e);return i.includes(t)||n.includes(t)},Ae=e=>{const t={subscribed:[],alreadySubscribed:[],unauthorized:[],unsubscribed:[],notSubscribed:[]};return Object.keys(t).forEach((i=>{t[i]=e[`${i}Channels`]||[]})),t},Oe=(e,t=null,i=null)=>{if(!Se(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}}))},Le=e=>{Oe(e,"audio",!0)},Pe=e=>{Oe(e,"audio",!1)},De=e=>{Oe(e,"audio",null)},Me=e=>((e,t=null)=>{if(!Se(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 Ne(){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:!!Ie}}catch(e){return e.message}}var je;function $e(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 Ue(e){e&&(e._playFulfilled=!1,e._promise=e.play(),e._promise.then((()=>{e._playFulfilled=!0})).catch((t=>{w.error("playAudio",t),e._playFulfilled=!0})))}function Fe(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"}(je||(je={}));var Be="2.25.17-beta.2",Ve=Be;class Ge extends pe{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:Ve,data:navigator.userAgent}};n&&(r.sessid=n),this.buildRequest({method:this.method,params:r})}}class He extends pe{constructor(e,t){super(),this.buildRequest({id:e,result:{method:t}})}}class qe extends pe{toString(){return V.Invite}}class We extends pe{toString(){return V.Answer}}class Je extends pe{toString(){return V.Attach}}class Ke extends pe{toString(){return V.Bye}}class ze extends pe{toString(){return V.Candidate}}class Qe extends pe{toString(){return V.EndOfCandidates}}class Ye extends pe{toString(){return V.Modify}}class Xe extends pe{toString(){return V.Info}}class Ze extends pe{toString(){return V.Broadcast}}class et extends pe{toString(){return V.Subscribe}}class tt extends pe{toString(){return V.Unsubscribe}}class it extends ue{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 nt{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.options=e,this.logCollectorOptions=t||{enabled:!1,level:"debug",maxEntries:1e3},this.callStartTime=new Date,this.logCollectorOptions.enabled&&(this.logCollector=function(e){return new b(e)}(this.logCollectorOptions),this.logCollector.start(),_(this.logCollector))}start(e){var t,i;this.options.enabled&&(this.peerConnection=e,this.intervalStartTime=new Date,w.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(),w.info("CallReportCollector: Stopped stats collection",{totalIntervals:this.statsBuffer.length,totalLogs:i,duration:this.callEndTime.getTime()-this.callStartTime.getTime()})}postReport(e,t,n,s){var o,r,a;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(),c=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}:{});try{const o=new URL(n),r=`${o.protocol.replace(/^ws/,"http")}//${o.host}/call_report`;w.info("CallReportCollector: Posting report",{endpoint:r,intervals:this.statsBuffer.length,logEntries:null!==(a=null==i?void 0:i.length)&&void 0!==a?a:0,callId:e.callId});const d={"Content-Type":"application/json","x-call-report-id":t,"x-call-id":e.callId};s&&(d["x-voice-sdk-id"]=s);const l=yield fetch(r,{method:"POST",headers:d,body:JSON.stringify(c)});if(l.ok)w.info("CallReportCollector: Successfully posted report");else{const e=yield l.text();w.error("CallReportCollector: Failed to post report",{status:l.status,error:e})}}catch(e){w.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(),y()===this.logCollector&&_(null),this.logCollector=null)}_collectStats(){return i(this,void 0,void 0,(function*(){if(this.peerConnection&&this.intervalStartTime)try{const e=yield this.peerConnection.getStats(),t=new Date;let i=null,n=null,s=null;if(e.forEach((e=>{switch(e.type){case"outbound-rtp":"audio"===e.kind&&"audio"===e.mediaType&&(i=e);break;case"inbound-rtp":"audio"===e.kind&&"audio"===e.mediaType&&(n=e);break;case"candidate-pair":(e.nominated||"succeeded"===e.state)&&(s=e)}})),i){const n=this._getTrackAudioLevel(e,i.trackId);if(null!==n&&this.intervalAudioLevels.outbound.push(n),void 0!==this.previousStats.outboundBytes&&void 0!==this.previousStats.timestamp){const e=(i.bytesSent||0)-this.previousStats.outboundBytes,n=(i.timestamp||t.getTime())-this.previousStats.timestamp;if(n>0){const t=8*e*1e3/n;this.intervalBitrates.outbound.push(t)}}this.previousStats.outboundBytes=i.bytesSent}if(n){const i=this._getTrackAudioLevel(e,n.trackId);if(null!==i&&this.intervalAudioLevels.inbound.push(i),void 0!==n.jitter&&this.intervalJitters.push(1e3*n.jitter),void 0!==this.previousStats.inboundBytes&&void 0!==this.previousStats.timestamp){const e=(n.bytesReceived||0)-this.previousStats.inboundBytes,i=(n.timestamp||t.getTime())-this.previousStats.timestamp;if(i>0){const t=8*e*1e3/i;this.intervalBitrates.inbound.push(t)}}this.previousStats.inboundBytes=n.bytesReceived}s&&void 0!==s.currentRoundTripTime&&this.intervalRTTs.push(s.currentRoundTripTime),this.previousStats.timestamp=t.getTime();if(t.getTime()-this.intervalStartTime.getTime()>=this.options.interval){const e=this._createStatsEntry(this.intervalStartTime,t,i,n,s);this.statsBuffer.push(e),this.statsBuffer.length>this.MAX_BUFFER_SIZE&&(this.statsBuffer.shift(),w.warn("CallReportCollector: Buffer size limit reached, removing oldest entry")),this.intervalStartTime=t,this._resetIntervalAccumulators()}}catch(e){w.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:[]}}}var st,ot=v((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 S(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 y(e){if(!e.entries)return e;const t={};return e.forEach((function(e,i){t[i]=e})),t}function _(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=S(e,i,"bytesReceived"),e.packetRate=S(e,i,"packetsReceived")})),e.audio.outbound.map((e=>{let i=t.audio.outbound.find((t=>t.id===e.id));e.bitrate=S(e,i,"bytesSent"),e.packetRate=S(e,i,"packetsSent")})),e.video.inbound.map((e=>{let i=t.video.inbound.find((t=>t.id===e.id));e.bitrate=S(e,i,"bytesReceived"),e.packetRate=S(e,i,"packetsReceived")})),e.video.outbound.map((e=>{let i=t.video.outbound.find((t=>t.id===e.id));e.bitrate=S(e,i,"bytesSent"),e.packetRate=S(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=y(o),d={remote:s.options.remote},l=_(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)}}}}));(st=ot)&&st.__esModule&&Object.prototype.hasOwnProperty.call(st,"default")&&st.default;var rt=ot.WebRTCStats;function at(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 ct(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 dt extends ue{constructor(e,t){super(),this.buildRequest({type:"debug_report_start",debug_report_id:e,debug_report_version:1,call_id:t})}}class lt extends ue{constructor(e,t){super(),this.buildRequest({type:"debug_report_stop",debug_report_id:e,debug_report_version:1,call_id:t})}}class ut extends ue{constructor(e,t){super(),this.buildRequest({type:"debug_report_data",debug_report_id:e,debug_report_version:1,debug_report_data:t})}}function ht(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 pt(t,n){const s=c();let o=!1;const r=new rt({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&&ne(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=at({jitter:1e3*h,rtt:1e3*p,packetsLost:v,packetsReceived:g});return{jitter:h,rtt:p,mos:f,quality:ct(f),inboundAudio:d.inbound[0],outboundAudio:d.outbound[0],remoteInboundAudio:u.inbound[0],remoteOutboundAudio:u.outbound[0]}}(n),t.uuid),yield t.execute(new ut(s,n))}));return{get isRunning(){return o},start:(e,c,d)=>i(this,void 0,void 0,(function*(){o?w.debug(`[${n}] Stats reporter already running, skipping start`):(yield t.execute(new dt(s,n)),r.on("timeline",a),yield new Promise((e=>setTimeout(e,500))),r.addConnection({pc:e,peerId:c,connectionId:d}),o=!0)})),stop:a=>i(this,void 0,void 0,(function*(){if(!o)return void w.debug(`[${n}] Stats reporter already stopped, skipping stop`);const i=r.getTimeline();if(ne(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 lt(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 gt=(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:G.conferenceUpdate,call:t.calls[o],canvasInfo:vt(r),currentLayerIdx:a};switch(n){case"layer-info":{const i=Object.assign({action:J.LayerInfo},c);ne(e.SwEvent.Notification,i,t.uuid);break}case"layout-info":{const i=Object.assign({action:J.LayoutInfo},c);ne(e.SwEvent.Notification,i,t.uuid);break}}},vt=e=>{const t=JSON.stringify(e).replace(/memberID/g,"participantId").replace(/ID"/g,'Id"').replace(/POS"/g,'Pos"');return T(t)};class ft{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=t=>i(this,void 0,void 0,(function*(){const{connectionState:t}=this.instance;if(w.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){w.error("Error gathering connection state details:",e)}return i}))}(this.instance,this._prevConnectionState);this.statsReporter.reportConnectionStateChange(e)}!this._restartedIceOnConnectionStateFailed&&"failed"===t&&this._session.hasAutoReconnect()&&(yield this.instance.restartIce(),this._restartedIceOnConnectionStateFailed=!0,w.debug("Peer connection state failed. ICE restarted.")),window.removeEventListener("online",e)}));navigator.onLine?e():window.addEventListener("online",e)}"failed"===t&&ne(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=e=>{w.debug(`[${(new Date).toISOString()}] ICE Connection State`,this.instance.iceConnectionState)},this._handleIceGatheringStateChange=e=>{w.debug(`[${(new Date).toISOString()}] ICE Gathering State`,this.instance.iceGatheringState)},this._setCodecs=(e,t)=>{if(e.setCodecPreferences)return e.setCodecPreferences(t)},w.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===F.Offer}get isAnswer(){return this.type===F.Answer}get isDebugEnabled(){return this.options.debug||this._session.options.debug}get debugOutput(){return this.options.debugOutput||this._session.options.debugOutput}get keepConnectionAliveOnSocketClose(){return this.options.keepConnectionAliveOnSocketClose||this._session.options.keepConnectionAliveOnSocketClose}get restartedIceOnConnectionStateFailed(){return this._restartedIceOnConnectionStateFailed}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(){w.info("Number of transceivers:",this.instance.getTransceivers().length),this.instance.getTransceivers().forEach(((e,t)=>{w.info(`>> Transceiver [${t}]:`,e.mid,e.direction,e.stopped),w.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(t){switch(w.info("signalingState:",this.instance.signalingState),this.instance.signalingState){case"stable":this._negotiating=!1;break;case"closed":ne(e.SwEvent.PeerConnectionSignalingStateClosed,{sessionId:this._session.sessionid},this.options.id),this.instance&&(w.debug(`[${this.options.id}] Closing peer due to signalingState closed`),this.close());break;default:this._negotiating=!0}}handleNegotiationNeededEvent(){w.info("Negotiation needed event"),"stable"!==this.instance.signalingState||this._negotiating?w.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&&ye(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:F.Offer})),this.options.localStream=yield this._retrieveLocalStream().catch((t=>(ne(e.SwEvent.MediaError,t,this.options.id),null))),this.options.mutedMicOnStart&&Se(this.options.localStream)&&(w.info("Muting local audio tracks on start"),Pe(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=pt(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(Se(i)){const e=i.getAudioTracks();let s=[...e];if(w.info("Local audio tracks: ",e),"object"==typeof this.options.audio&&e.forEach((e=>{w.info("Local audio tracks constraints: ",e.getConstraints())})),this.options.video){const t=i.getVideoTracks();s=[...e,...t],w.info("Local video tracks: ",t),"object"==typeof this.options.video&&t.forEach((e=>{w.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&&ye(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);w.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),w.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){w.error("Peer _createOffer error:",e)}}}))}_setRemoteDescription(e){return i(this,void 0,void 0,(function*(){w.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 w.debug("Skipping negotiation, state:",this.instance.signalingState),w.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:F.Offer})]));this._logTransceivers();try{const e=yield this.instance.createAnswer();return yield this._setLocalDescription(e),e}catch(e){w.error("Peer _createAnswer error:",e)}}}))}_setLocalDescription(e){return i(this,void 0,void 0,(function*(){yield this.instance.setLocalDescription(e)}))}_sdpReady(){R(this.onSdpReadyTwice)&&this.onSdpReadyTwice(this.instance.localDescription)}_retrieveLocalStream(){return i(this,void 0,void 0,(function*(){if(Se(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 Te(i,o,K.AudioIn).catch((e=>null)),i&&("boolean"==typeof e&&(e={}),e.deviceId={exact:i})),s&&(s=yield Te(s,r,K.Video).catch((e=>null)),s&&("boolean"==typeof n&&(n={}),n.deviceId={exact:s})),{audio:e,video:n}})));var t;return Ie(e)}))}_isOffer(){return this.type===F.Offer}_isAnswer(){return this.type===F.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 w.info("RTC config",n),n}restartStatsReporter(){return i(this,void 0,void 0,(function*(){this.isDebugEnabled&&this.statsReporter&&(this.instance?this.statsReporter.isRunning?w.debug(`[${this.options.id}] Stats reporter already running, skipping restart`):(w.debug(`[${this.options.id}] Restarting stats reporter after reconnect`),yield this.statsReporter.start(this.instance,this._session.sessionid,this._session.sessionid)):w.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 mt=Ve;class bt{constructor(e,t){this.session=e,this._callReportCollector=null,this.id="",this.state=q[q.New],this.prevState="",this.channels=[],this.role=W.Participant,this.extension=null,this._state=q.New,this._prevState=q.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(var i in t.constraints)if(t.constraints.hasOwnProperty(i)&&t.constraints[i]!==e[i])return;t.callback(e)}}))}))}))};const{iceServers:i,speaker:n,micId:s,micLabel:o,camId:r,camLabel:a,localElement:c,remoteElement:d,options:l,mediaConstraints:{audio:u,video:h},ringtoneFile:p,ringbackFile:g}=e;this.options=Object.assign({},H,{audio:u,video:h,iceServers:(null==t?void 0:t.iceServers)&&Array.isArray(t.iceServers)?t.iceServers:i,localElement:c,remoteElement:d,micId:s,micLabel:o,camId:r,camLabel:a,speakerId:n,ringtoneFile:p,ringbackFile:g,debug:l.debug,debugOutput:l.debugOutput,trickleIce:l.trickleIce,prefetchIceCandidates:l.prefetchIceCandidates,forceRelayCandidate:l.forceRelayCandidate,keepConnectionAliveOnSocketClose:l.keepConnectionAliveOnSocketClose,mutedMicOnStart:l.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=$e(this.options.ringtoneFile,"_ringtone"),this._ringback=$e(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!Me(this.options.localStream)}invite(){return i(this,void 0,void 0,(function*(){this._creatingPeer=!0,this.direction=B.Outbound,this.options.trickleIce&&this._resetTrickleIceCandidateState(),performance.mark("peer-creation-start"),this.peer=new ft(F.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=B.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 ft(F.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(){Ue(this._ringtone)}stopRingtone(){Fe(this._ringtone)}playRingback(){Ue(this._ringback)}stopRingback(){Fe(this._ringback)}hangup(t,i){var n,s,o;let r=t||{},a=!1!==i;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:[]],this.setState(q.Hangup);const c=()=>{var e;return w.debug(`[${this.id}] Closing peer from hangup`),null===(e=this.peer)||void 0===e||e.close(),this.setState(q.Destroy)};if(this.stopRingtone(),this.stopRingback(),a){const t=new Ke({sipCode:this.sipCode,sip_call_id:this.sipCallId,sessid:this.session.sessionid,dialogParams:this.options,cause:"USER_BUSY",causeCode:17});this._execute(t).catch((t=>{w.error("telnyx_rtc.bye failed!",t),ne(e.SwEvent.Error,{error:t,sessionId:this.session.sessionid},this.session.uuid)})).then(c.bind(this))}else c()}hold(){const e=new Ye({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 Ye({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 Ye({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 Xe({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 Xe({sessid:this.session.sessionid,msg:i,dialogParams:this.options});this._execute(n)}muteAudio(){Pe(this.options.localStream)}unmuteAudio(){Le(this.options.localStream)}toggleAudioMute(){De(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 be({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,Oe(e,"video",!1)}unmuteVideo(){var e;e=this.options.localStream,Oe(e,"video",!0)}toggleVideoMute(){var e;e=this.options.localStream,Oe(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 be({video:{deviceId:{exact:e}}}),n=t.getVideoTracks()[0];i.replaceTrack(n);const{localElement:s,localStream:o}=this.options;ye(s,t),this.options.camId=e,o.getAudioTracks().forEach((e=>t.addTrack(e))),o.getVideoTracks().forEach((e=>e.stop())),this.options.localStream=t}}))}deaf(){Pe(this.options.remoteStream)}undeaf(){Le(this.options.remoteStream)}toggleDeaf(){De(this.options.remoteStream)}setBandwidthEncodingsMaxBps(e,t){return i(this,void 0,void 0,(function*(){if(!this||!this.peer)return void w.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 w.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"}]),w.info("Parameters: ",i),w.info("Setting max ","audio"===t?"audio":"video"," bandwidth to: ",e," [bps]"),i.encodings[0].maxBitrate=e,yield s.setParameters(i).then((()=>{w.info("audio"===t?"New audio":"New video"," bandwidth settings in use: ",s.getParameters())})).catch((e=>w.error(e)))}else w.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=q[this._state].toLowerCase(),this.prevState=q[this._prevState].toLowerCase(),w.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this._dispatchNotification({type:G.callUpdate,call:this}),e){case q.Purge:w.debug(`Call ${this.id} hangup call due to purge state`),this.hangup({cause:"PURGE",causeCode:"01"},!1);break;case q.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._callReportCollector.start(this.peer.instance);break;case q.Destroy:this._finalize()}}handleMessage(t){const{method:i,params:n}=t;switch(i){case V.Answer:if(this.gotAnswer=!0,this._state>=q.Active)return;this._state>=q.Early&&this.setState(q.Active),this.gotEarly||this._onRemoteSdp(n.sdp),this.stopRingback(),this.stopRingtone();break;case V.Media:if(this._state>=q.Early)return;this.gotEarly=!0,this._onRemoteSdp(n.sdp);break;case V.Display:case V.Attach:{const{display_name:t,display_number:s,display_direction:o}=n;this.extension=s;const r=o===B.Inbound?B.Outbound:B.Inbound,a={type:G[i],call:this,displayName:t,displayNumber:s,displayDirection:r};ne(e.SwEvent.Notification,a,this.id)||ne(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:G.generic,call:this});ne(e.SwEvent.Notification,t,this.id)||ne(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 w.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:J.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)},E(n[e][1])));this._dispatchConferenceUpdate({action:J.Bootstrap,participants:c});break}case"add":this._dispatchConferenceUpdate(Object.assign({action:J.Add,callId:s,index:o},E(n)));break;case"modify":this._dispatchConferenceUpdate(Object.assign({action:J.Modify,callId:s,index:o},E(n)));break;case"del":this._dispatchConferenceUpdate(Object.assign({action:J.Delete,callId:s,index:o},E(n)));break;case"clear":this._dispatchConferenceUpdate({action:J.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:J.ChatMessage,direction:t,participantNumber:i,participantName:n,messageText:s,messageType:o,messageId:e.eventSerno})}},i=yield this.session.vertoSubscribe(t).catch((e=>{w.error("ConfChat subscription error:",e)}));xe(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,gt(this.session,t);else w.error("Conference-Info unknown contentType",e)}},i=yield this.session.vertoSubscribe(t).catch((e=>{w.error("ConfInfo subscription error:",e)}));xe(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(q.Active):this.setState(q.Held),!0}_handleChangeHoldStateError(e){return w.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:F.Answer});yield this.peer.instance.setRemoteDescription(t).then((()=>{this.options.trickleIce&&(this._isRemoteDescriptionSet=!0,this._flushPendingTrickleIceCandidates()),this.gotEarly&&this.setState(q.Early),this.gotAnswer&&this.setState(q.Active)})).catch((e=>{w.error("Call setRemoteDescription Error: ",e),this.hangup()}))}))}_requestAnotherLocalDescription(){R(this.peer.onSdpReadyTwice)?ne(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 w.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-${mt}`};switch(s){case F.Offer:this.setState(q.Requesting),o=new qe(r);break;case F.Answer:this.setState(q.Answering),o=!0===this.options.attach?new Je(r):new We(r);break;default:return w.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===F.Offer?this.setState(q.Trying):this.setState(q.Active)})).catch((e=>{w.error(`${this.id} - Sending ${s} error:`,e),this.hangup()})).finally((()=>{performance.mark("sdp-send-end"),console.group("Performance Metrics"),console.table(this.performanceMetrics),console.groupEnd(),performance.clearMarks()}))}_onTrickleIceSdp(e){if(!e)return w.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-${mt}`};switch(i){case F.Offer:this.setState(q.Requesting),n=new qe(s);break;case F.Answer:this.setState(q.Answering),n=!0===this.options.attach?new Je(s):new We(s);break;default:return w.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===F.Offer?this.setState(q.Trying):this.setState(q.Active)})).catch((e=>{w.error(`${this.id} - Sending ${i} error:`,e),this.hangup()})).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?w.debug("RTCPeer Candidate:",e.candidate):this._onIceSdp(t.localDescription)}_onTrickleIce(e){e.candidate&&e.candidate.candidate?(w.debug("RTCPeer Candidate:",e.candidate),this._sendIceCandidate(e.candidate)):this._sendEndOfCandidates()}_sendIceCandidate(e){const t=new ze({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 w.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((()=>{w.debug("Successfully added ICE candidate:",e)})).catch((t=>{w.error("Failed to add ICE candidate:",t,e)}))}_sendEndOfCandidates(){const e=new Qe({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(w.debug("ICE candidate error:",t),null===(i=this.peer)||void 0===i?void 0:i.statsReporter){const i=ht(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&&ye(t,i)}))}_registerTrickleIcePeerEvents(e){e.onicecandidate=e=>{this._onTrickleIce(e)},e.onicegatheringstatechange=t=>{w.debug("ICE gathering state changed:",e.iceGatheringState),"complete"===e.iceGatheringState&&w.debug("Finished gathering candidates")},e.onicecandidateerror=t=>{var i;if(w.debug("ICE candidate error:",t),null===(i=this.peer)||void 0===i?void 0:i.statsReporter){const i=ht(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&&ye(t,i)}))}_onMediaError(e){this._dispatchNotification({type:G.userMediaError,error:e}),w.error("Media error, hanging up call",e),this.hangup({},!1)}_onPeerConnectionFailureError(e){this._dispatchNotification({type:G.peerConnectionFailureError,error:e}),w.error("Peer connection failure error, call is not recoverable. Handling reconnection according to keepConnectionAliveOnSocketClose option")}_onPeerConnectionSignalingStateClosed(e){this._signalingStateClosed=!0,this._dispatchNotification(Object.assign({type:G.signalingStateClosed},e)),w.debug("Peer connection signaling state closed, call is not recoverable")}_dispatchConferenceUpdate(e){this._dispatchNotification(Object.assign({type:G.conferenceUpdate,call:this},e))}_dispatchNotification(t){!0!==this.options.screenShare&&(ne(e.SwEvent.Notification,t,this.id,!1)||ne(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,ee(e.SwEvent.MediaError,this._onMediaError,this.id),ee(e.SwEvent.PeerConnectionFailureError,this._onPeerConnectionFailureError,this.id),ee(e.SwEvent.PeerConnectionSignalingStateClosed,this._onPeerConnectionSignalingStateClosed,this.id),R(s)&&ee(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 nt({enabled:!0,interval:a},{enabled:!0,level:d,maxEntries:l})),this.setState(q.New),w.info("New Call with Options:",this.options)}_finalize(){var t;this._stopStats(),w.debug(`[${this.id}] Closing peer from _finalize`),null===(t=this.peer)||void 0===t||t.close();const{remoteStream:i,localStream:n}=this.options;Ce(i),Ce(n),ie(e.SwEvent.MediaError,null,this.id),ie(e.SwEvent.PeerConnectionFailureError,null,this.id),ie(e.SwEvent.PeerConnectionSignalingStateClosed,null,this.id),this.session.calls[this.id]=null,delete this.session.calls[this.id],this._postCallReport()}_postCallReport(){var e;if(!this._callReportCollector)return void w.warn("Call report collector not initialized");this._callReportCollector.stop();const t=this.session.callReportId;if(!t)return void w.debug("Cannot post call report: call_report_id not available");const i={callId:this.id,destinationNumber:this.options.destinationNumber,callerNumber:this.options.callerNumber,direction:this.direction===B.Inbound?"inbound":"outbound",state:this.state,telnyxSessionId:this.options.telnyxSessionId,telnyxLegId:this.options.telnyxLegId,sdkVersion:mt},n=null===(e=this.session.connection)||void 0===e?void 0:e.host;if(!n)return void w.error("Cannot post call report: connection host not available");const s=U()||void 0;this._callReportCollector.postReport(i,t,n,s).catch((e=>{w.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),w.info("Stats started")}_stopStats(){this._statsIntervalId&&(clearInterval(this._statsIntervalId),this._statsIntervalId=null),w.debug("Stats stopped")}}bt.setStateTelnyx=e=>{if(e){switch(e._state){case q.Requesting:case q.Recovering:case q.Trying:case q.Early:e.state="connecting";break;case q.Active:e.state="active";break;case q.Held:e.state="held";break;case q.Hangup:case q.Destroy:e.state="done";break;case q.Answering:e.state="ringing";break;case q.New:e.state="new"}return e}};class St extends bt{constructor(){super(...arguments),this._statsInterval=null,this.sendConversationMessage=(e,t)=>this.session.execute(new it(e,t))}hangup(e={},t=!0){this.screenShare instanceof St&&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 St(this.session,a),this.screenShare.invite(),this.screenShare}))}stopScreenShare(){this.screenShare instanceof St&&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);w.setLevel(2),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`)})))})),w.info(t)}))),2e3)}}class yt 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 Ie({audio:e,video:t});return Ce(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(q.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(te(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 ke().catch((t=>(ne(e.SwEvent.MediaError,t,this.uuid),[])))}getVideoDevices(){return ke(K.Video).catch((t=>(ne(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioInDevices(){return ke(K.AudioIn).catch((t=>(ne(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioOutDevices(){return ke(K.AudioOut).catch((t=>(w.error("getAudioOutDevices",t),ne(e.SwEvent.MediaError,t,this.uuid),[])))}validateDeviceId(e,t,i){return Te(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 Ie({video:{deviceId:{exact:e}}}),n=i.getVideoTracks()[0];for(let e=0;e<Ee.length;e++){const[i,s]=Ee[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 Ce(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 Re(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 Te(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?h:u}}get iceServers(){return this._iceServers}set speaker(e){this._speaker=e}get speaker(){return this._speaker}set localElement(e){this._localElement=x(e)}get localElement(){return this._localElement}set remoteElement(e){this._remoteElement=x(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 Ze({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 et({sessid:this.sessionid,eventChannel:t});e&&(i.targetNodeId=e);const s=yield this.execute(i),{unauthorized:o=[],subscribed:r=[]}=Ae(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 tt({sessid:this.sessionid,eventChannel:t});e&&(i.targetNodeId=e);const n=yield this.execute(i),{unsubscribed:s=[],notSubscribed:o=[]}=Ae(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&&(w.debug(`Network connectivity restored for session ${this.sessionid}. Reconnecting...`),this.socketDisconnect(),this.connect()),this._wasOffline=!1},this._offlineHandler=()=>{this._wasOffline=!0,w.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 St.setStateTelnyx(e)}}class _t{constructor(e,t){this.code=t,this.message=e}}class wt extends pe{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:Ve,data:navigator.userAgent}};o&&(a.sessid=o),n&&(a.target_version_id=n),this.buildRequest({method:this.method,params:a})}}const Ct=Ve;class It{constructor(e){this.session=e,this.handleLogin=()=>i(this,void 0,void 0,(function*(){const{login:e,password:t,passwd:i,login_token:n,userVariables:s}=this.session.options,o=new Ge(e,t||i,n,this.session.sessionid,s,!!U()),r=yield this.session.execute(o).catch(this.session.handleLoginError);r&&(this.session.sessionid=r.sessid)})),this.handleAnonymousLogin=()=>i(this,void 0,void 0,(function*(){const{anonymous_login:e}=this.session.options,t=new wt({target_id:e.target_id,target_type:e.target_type,target_version_id:e.target_version_id,sessionId:this.session.sessionid,userVariables:this.session.options.userVariables,reconnection:!!U()}),i=yield this.session.execute(t).catch(this.session.handleLoginError);i&&(this.session.sessionid=i.sessid)}))}_ack(e,t){const i=new He(e,t);this.nodeId&&(i.targetNodeId=this.nodeId),this.session.execute(i)}reconnectDelay(){return 1e3*L(2,6)}handleMessage(t){var n,s,o,r,a,c;const{session:d}=this,{id:l,method:u,params:h={},voice_sdk_id:p}=t,g=null==h?void 0:h.callID,v=null==h?void 0:h.eventChannel,f=null==h?void 0:h.eventType,m=u===V.Attach,b=u===V.Punt;let S=!1,y=!1;if("channelPvtData"===f)return this._handlePvtEvent(h.pvtData);if(g&&d.calls.hasOwnProperty(g)){if(!m)return d.calls[g].handleMessage(t),void this._ack(l,u);{const e=d.calls[g];y=null===(n=e.peer)||void 0===n?void 0:n.restartedIceOnConnectionStateFailed,S=(d.options.keepConnectionAliveOnSocketClose||e.options.keepConnectionAliveOnSocketClose)&&Boolean(null===(s=e.peer)||void 0===s?void 0:s.instance)&&!e.signalingStateClosed&&!y,S?w.info(`[${(new Date).toISOString()}][${g}] re-attaching call due to ATTACH and keepConnectionAliveOnSocketClose`):(e.signalingStateClosed?w.info(`[${(new Date).toISOString()}][${g}] Hanging up the and recreating call due to ATTACH - signalingState is closed`):y&&w.info(`[${(new Date).toISOString()}][${g}] Hanging up the call due to ATTACH - connection had restarted ICE on connection state failed`),e.hangup({},y),w.debug(`[${(new Date).toISOString()}][${g}] Call hangup bye message ${y?"executed":"not executed"}`))}}if(b&&d.options.keepConnectionAliveOnSocketClose)return w.info(`[${(new Date).toISOString()}][${g}] keeping session calls alive due to PUNT and keepConnectionAliveOnSocketClose. Disconnecting base session...`),this.session.socketDisconnect(),void this._ack(l,u);const _=(e=!0)=>{var t,i,n,s,o,r;const a={audio:!0,video:d.options.video,remoteSdp:h.sdp,destinationNumber:h.callee_id_number,remoteCallerName:h.caller_id_name,remoteCallerNumber:h.caller_id_number,callerName:h.callee_id_name,callerNumber:h.callee_id_number,attach:m,mediaSettings:h.mediaSettings,debug:null!==(t=d.options.debug)&&void 0!==t&&t,debugOutput:null!==(i=d.options.debugOutput)&&void 0!==i?i:"socket",trickleIce:null!==(n=d.options.trickleIce)&&void 0!==n&&n,prefetchIceCandidates:null!==(s=d.options.prefetchIceCandidates)&&void 0!==s&&s,forceRelayCandidate:null!==(o=d.options.forceRelayCandidate)&&void 0!==o&&o,keepConnectionAliveOnSocketClose:null!==(r=d.options.keepConnectionAliveOnSocketClose)&&void 0!==r&&r};e&&(a.id=g),h.telnyx_call_control_id&&(a.telnyxCallControlId=h.telnyx_call_control_id),h.telnyx_session_id&&(a.telnyxSessionId=h.telnyx_session_id),h.telnyx_leg_id&&(a.telnyxLegId=h.telnyx_leg_id),h.client_state&&(a.clientState=h.client_state),h.dialogParams&&h.dialogParams.custom_headers&&h.dialogParams.custom_headers.length&&(a.customHeaders=h.dialogParams.custom_headers);const c=new St(d,a);return c.nodeId=this.nodeId,c},C=new ge(p),I=new fe(p);switch(u){case V.Ping:this.session.setPingReceived(),this.session.execute(I).then((()=>{It.receivedAuthenticationRequired=0})).catch((e=>i(this,void 0,void 0,(function*(){e.code===this.session.authenticationRequiredErrorCode&&It.receivedAuthenticationRequired>=0&&(It.receivedAuthenticationRequired+=1,It.receivedAuthenticationRequired>1&&this.session.hasAutoReconnect()&&(w.warn("Ping failed twice with Authentication Required. Re-logging in..."),P(this.session.options)?this.handleLogin():D(this.session.options)&&this.handleAnonymousLogin(),It.receivedAuthenticationRequired=-1))}))));break;case V.Punt:d.disconnect();break;case V.Invite:{const e=_();e.playRingtone(),e.setState(q.Ringing),e.direction=B.Inbound,this._ack(l,u);break}case V.Attach:{if(S)return this.session.execute(new Je({sessid:this.session.sessionid,sdp:this.session.calls[g].peer.instance.localDescription.sdp,dialogParams:this.session.calls[g].options,"User-Agent":`Web-${Ct}`})),void(null===(o=this.session.calls[g].peer)||void 0===o||o.restartStatsReporter());if(w.info(`[${(new Date).toISOString()}][${g}] Re-creating call instance.`),null===(r=this.session.calls[g])||void 0===r?void 0:r.creatingPeer)return void w.debug(`[${(new Date).toISOString()}][${g}] Call is already creating a peer, skip recreating call instance.`);let e;this.session.autoRecoverCalls?y?(w.debug(`[${(new Date).toISOString()}][${g}] Call had restarted ICE on connection state failed. Re-inviting to become active leg. due to keepConnectionAliveOnSocketClose.`),e=_(!1),e.invite()):(w.debug(`[${(new Date).toISOString()}][${g}] Call is not in an unrecoverable state. Answering.`),e=_(),e.answer()):(e=_(),e.setState(q.Recovering)),e.handleMessage(t);break}case V.Event:case"webrtc.event":if(!v)return void w.error("Verto received an unknown event:",h);const n=d.relayProtocol,s=v.split(".")[0];d._existsSubscription(n,v)?ne(n,h,v):v===d.sessionid?this._handleSessionEvent(h.eventData):d._existsSubscription(n,s)?ne(n,h,s):d.calls.hasOwnProperty(v)?d.calls[v].handleMessage(t):ne(e.SwEvent.Notification,h,d.uuid);break;case V.Info:h.type=G.generic,ne(e.SwEvent.Notification,h,d.uuid);break;case V.ClientReady:this.session.execute(C);break;default:{const i=M(t);if(i){switch(i){case z.REGISTER:case z.REGED:if(d.connection.previousGatewayState!==z.REGED&&d.connection.previousGatewayState!==z.REGISTER){this.session._triggerKeepAliveTimeoutCheck(),It.retriedRegister=0;const i=null===(c=null===(a=null==t?void 0:t.result)||void 0===a?void 0:a.params)||void 0===c?void 0:c.call_report_id;i&&(d.callReportId=i,w.debug("Captured call_report_id from REGED:",i)),h.type=G.vertoClientReady,ne(e.SwEvent.Ready,h,d.uuid),d.options.trickleIce&&(w.debug("Trickle ICE is enabled. Checking Gateway support"),this.session.execute(new ze({candidate:""})).catch((e=>{e.code===this.session.invalidMethodErrorCode?(w.warn("Trickle ICE is not supported by the server, disabling it."),w.debug("Trickle ICE check error:",JSON.stringify(e,null,2)),d.options.trickleIce=!1):w.debug("Trickle ICE check:",JSON.stringify(e,null,2))})))}break;case z.UNREGED:case z.NOREG:if(It.retriedRegister+=1,5===It.retriedRegister){It.retriedRegister=0,ne(e.SwEvent.Error,{error:new _t("Fail to register the user, the server tried 5 times","UNREGED|NOREG"),sessionId:d.sessionid},d.uuid);break}setTimeout((()=>{this.session.execute(C)}),this.reconnectDelay());break;case z.FAILED:case z.FAIL_WAIT:if(d.connection.previousGatewayState!==z.FAILED&&d.connection.previousGatewayState!==z.FAIL_WAIT){if(!this.session.hasAutoReconnect()){It.retriedConnect=0,ne(e.SwEvent.Error,{error:new _t("Fail to connect the server, the server tried 5 times","FAILED|FAIL_WAIT"),sessionId:d.sessionid},d.uuid);break}if(It.retriedConnect+=1,5===It.retriedConnect){It.retriedConnect=0,ne(e.SwEvent.Error,{error:new Error("Connection Retry Failed"),sessionId:d.sessionid},d.uuid);break}setTimeout((()=>{if(w.debug(`Reconnecting... Retry ${It.retriedConnect} of 5`),this.session.options.keepConnectionAliveOnSocketClose){const e=Object.values(d.calls).some((e=>{var t;return(null===(t=e.peer)||void 0===t?void 0:t.instance)&&!e.signalingStateClosed}));if(e)return w.debug("Reconnecting by keeping the existing session due to keepConnectionAliveOnSocketClose option being set."),this.session.socketDisconnect(),void this.session.connect();w.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:w.warn("GatewayState message unknown method:",t)}break}w.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=>{w.error("liveArray subscription error:",e)}));xe(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:G.conferenceUpdate,action:J.Leave,conferenceName:r,participantId:Number(l),role:u};ne(e.SwEvent.Notification,n,s,!1)||ne(e.SwEvent.Notification,n,i.uuid),null===t&&ie(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=>{w.error("liveArray unsubscribe error:",e)}));break}}}))}_handleSessionEvent(t){switch(t.contentType){case"layout-info":case"layer-info":gt(this.session,t);break;case"logo-info":{const i={type:G.conferenceUpdate,action:J.LogoInfo,logo:t.logoURL};ne(e.SwEvent.Notification,i,this.session.uuid);break}}}}It.retriedConnect=0,It.retriedRegister=0,It.receivedAuthenticationRequired=0;class kt extends yt{constructor(e){super(e),this.relayProtocol="verto-protocol",this.timeoutErrorCode=-329990,this.handleLoginOnSocketOpen=()=>i(this,void 0,void 0,(function*(){this._idle=!1;const{login:e,password:t,passwd:i,login_token:n,userVariables:s,autoReconnect:o=!0}=this.options,r=new Ge(e,t||i,n,this.sessionid,s,!!U()),a=yield this.execute(r).catch(this._handleLoginError);a&&(this._autoReconnect=o,this.sessionid=a.sessid)})),this.handleAnonymousLoginOnSocketOpen=()=>i(this,void 0,void 0,(function*(){this._idle=!1;const{anonymous_login:e}=this.options,t=new wt({target_id:e.target_id,target_type:e.target_type,target_version_id:e.target_version_id,sessionId:this.sessionid,userVariables:this.options.userVariables,reconnection:!!U()}),i=yield this.execute(t).catch(this._handleLoginError);i&&(this.sessionid=i.sessid)})),window.addEventListener("beforeunload",(e=>{this.calls&&Object.keys(this.calls).forEach((e=>{this.calls[e]&&(w.info(`Hanging up call due to window unload: ${e}`),this.calls[e].hangup({},!0))}))}))}validateOptions(){return P(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 St(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 P(this.options)?this.handleLoginOnSocketOpen():D(this.options)?this.handleAnonymousLoginOnSocketOpen():void 0}))}_onSocketMessage(e){new It(this).handleMessage(e)}}class Et extends kt{constructor(e){super(e),w.info(`SDK version: ${Be}`)}newCall(e){return super.newCall(e)}static webRTCInfo(){return Ne()}static webRTCSupportedBrowserList(){return[{operationSystem:"Android",supported:[{browserName:"Chrome",features:["audio"],supported:je.full},{browserName:"Firefox",features:["audio"],supported:je.partial},{browserName:"Safari",supported:je.not_supported},{browserName:"Edge",supported:je.not_supported}]},{operationSystem:"iOS",supported:[{browserName:"Chrome",supported:je.not_supported},{browserName:"Firefox",supported:je.not_supported},{browserName:"Safari",features:["video","audio"],supported:je.full},{browserName:"Edge",supported:je.not_supported}]},{operationSystem:"Linux",supported:[{browserName:"Chrome",features:["video","audio"],supported:je.full},{browserName:"Firefox",features:["audio"],supported:je.partial},{browserName:"Safari",supported:je.not_supported},{browserName:"Edge",supported:je.not_supported}]},{operationSystem:"MacOS",supported:[{browserName:"Chrome",features:["video","audio"],supported:je.full},{browserName:"Firefox",features:["audio"],supported:je.partial},{browserName:"Safari",features:["video","audio"],supported:je.full},{browserName:"Edge",features:["audio"],supported:je.partial}]},{operationSystem:"Windows",supported:[{browserName:"Chrome",features:["video","audio"],supported:je.full},{browserName:"Firefox",features:["audio"],supported:je.partial},{browserName:"Safari",supported:je.not_supported},{browserName:"Edge",features:["audio"],supported:je.partial}]}]}}class Tt{static run(t){return i(this,void 0,void 0,(function*(){const i=N({}),n=N({}),s=new Et(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))})),ee(e.SwEvent.StatsReport,(e=>{n.resolve(Tt.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,S=0,y=1/0,_=-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;S+=s,w+=o,b=Math.max(b,s),m=Math.min(m,s),_=Math.max(_,o),y=Math.min(y,o)}));const C=w/f,I=S/f,k=v[v.length-1],E=at({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:_,min:y},quality:ct(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=St,e.PreCallDiagnosis=Tt,e.TelnyxRTC=Et,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 n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(i=Object.getOwnPropertySymbols(e);s<i.length;s++)t.indexOf(i[s])<0&&Object.prototype.propertyIsEnumerable.call(e,i[s])&&(n[i[s]]=e[i[s]])}return n}function n(e,t,n,i){return new(n||(n=Promise))((function(s,o){function r(e){try{c(i.next(e))}catch(e){o(e)}}function a(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;var i="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(!i)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return i(s)}for(var r=[],a=0;a<256;++a)r[a]=(a+256).toString(16).substr(1);function c(e,t,n){var i=t&&n||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[i+a]=s[a];return t||function(e,t){var n=t||0,i=r;return[i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],"-",i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]],i[e[n++]]].join("")}(s)}const d="wss://rtc.telnyx.com",l={urls:"stun:stun.l.google.com:19302"},u=[{urls:"stun:stun.telnyx.com:3478"},l,{urls:"turn:turn.telnyx.com:3478?transport=udp",username:"testuser",credential:"testpassword"},{urls:"turn:turn.telnyx.com:3478?transport=tcp",username:"testuser",credential:"testpassword"}],h=[{urls:"stun:stundev.telnyx.com:3478"},l,{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 p;(p=e.SwEvent||(e.SwEvent={})).SocketOpen="telnyx.socket.open",p.SocketClose="telnyx.socket.close",p.SocketError="telnyx.socket.error",p.SocketMessage="telnyx.socket.message",p.SpeedTest="telnyx.internal.speedtest",p.Ready="telnyx.ready",p.Error="telnyx.error",p.Notification="telnyx.notification",p.StatsFrame="telnyx.stats.frame",p.StatsReport="telnyx.stats.report",p.Messages="telnyx.messages",p.Calls="telnyx.calls",p.MediaError="telnyx.rtc.mediaError",p.PeerConnectionFailureError="telnyx.rtc.peerConnectionFailureError",p.PeerConnectionSignalingStateClosed="telnyx.rtc.peerConnectionSignalingStateClosed";var g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function v(e,t){return e(t={exports:{}},t.exports),t.exports}var f=v((function(e){var t,n;t=g,n=function(){var e=function(){},t="undefined",n=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),i=["trace","debug","info","warn","error"];function s(e,t){var n=e[t];if("function"==typeof n.bind)return n.bind(e);try{return Function.prototype.bind.call(n,e)}catch(t){return function(){return Function.prototype.apply.apply(n,[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,n){for(var s=0;s<i.length;s++){var o=i[s];this[o]=s<t?e:this.methodFactory(o,t,n)}this.log=this.debug}function a(e,n,i){return function(){typeof console!==t&&(r.call(this,n,i),this[e].apply(this,arguments))}}function c(i,r,c){return function(i){return"debug"===i&&(i="log"),typeof console!==t&&("trace"===i&&n?o:void 0!==console[i]?s(console,i):void 0!==console.log?s(console,"log"):e)}(i)||a.apply(this,arguments)}function d(e,n,s){var o,a=this;n=null==n?"WARN":n;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 n=window.document.cookie,i=n.indexOf(encodeURIComponent(d)+"=");-1!==i&&(e=/^([^;]+)/.exec(n.slice(i))[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(n,s){if("string"==typeof n&&void 0!==a.levels[n.toUpperCase()]&&(n=a.levels[n.toUpperCase()]),!("number"==typeof n&&n>=0&&n<=a.levels.SILENT))throw"log.setLevel() called with invalid level: "+n;if(o=n,!1!==s&&function(e){var n=(i[e]||"silent").toUpperCase();if(typeof window!==t&&d){try{return void(window.localStorage[d]=n)}catch(e){}try{window.document.cookie=encodeURIComponent(d)+"="+n+";"}catch(e){}}}(n),r.call(a,n,e),typeof console===t&&n<a.levels.SILENT)return"No console available for logging"},a.setDefaultLevel=function(e){n=e,l()||a.setLevel(e,!1)},a.resetLevel=function(){a.setLevel(n,!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=n),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=n():t.log=n()}));const m=f.getLogger("telnyx"),b=m.methodFactory;m.methodFactory=(e,t,n)=>{const i=b(e,t,n);return function(){const e=[(new Date).toISOString().replace("T"," ").replace("Z",""),"-"];for(let t=0;t<arguments.length;t++)e.push(arguments[t]);i.apply(void 0,e)}},m.setLevel("info");const y=e=>{const[t,n,i,s,o,r]=e;let a={};try{a=JSON.parse(o.replace(/ID"/g,'Id"'))}catch(e){m.warn("Verto LA invalid media JSON string:",o)}return{participantId:Number(t),participantNumber:n,participantName:i,codec:s,media:a,participantData:r}},_=e=>{if("string"!=typeof e)return e;try{return JSON.parse(e)}catch(t){return e}},S=e=>e instanceof Function||"function"==typeof e,w=e=>"object"==typeof document&&"getElementById"in document?"string"==typeof e?document.getElementById(e)||null:"function"==typeof e?e():e instanceof HTMLMediaElement?e:null:null,C=/^(ws|wss):\/\//,I=(e,t=null)=>{const{result:n={},error:i}=e;if(i)return{error:i};const{result:s=null}=n;if(null===s)return null!==t&&(n.node_id=t),{result:n};const{code:o=null,node_id:r=null,result:a=null}=s;return o&&"200"!==o?{error:s}:a?I(a,r):{result:s}},k=(e,t)=>Math.floor(Math.random()*(t-e+1)+e),E=({login:e,passwd:t,password:n,login_token:i})=>Boolean(e&&(t||n)||i),T=({anonymous_login:e})=>Boolean(e)&&Boolean(e.target_id)&&Boolean(e.target_type),R=e=>{var t,n,i,s,o,r;let a="",c="";(null===(n=null===(t=null==e?void 0:e.result)||void 0===t?void 0:t.params)||void 0===n?void 0:n.state)&&(a=null===(s=null===(i=null==e?void 0:e.result)||void 0===i?void 0:i.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 x({debounceTime:e}){let t,n;return{promise:new Promise(((i,s)=>{t=e?O(i,e):i,n=s})),resolve:t,reject:n}}const O=(e,t)=>{let n;return(...i)=>{clearTimeout(n),n=window.setTimeout((()=>{e(...i)}),t)}},P="telnyx-voice-sdk-id";function A(){return sessionStorage.getItem(P)}var L,M,D;"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{sessionStorage.removeItem(P)})),function(e){e.Offer="offer",e.Answer="answer"}(L||(L={})),function(e){e.Inbound="inbound",e.Outbound="outbound"}(M||(M={})),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"}(D||(D={}));const N={generic:"event",[D.Display]:"participantData",[D.Attach]:"participantData",conferenceUpdate:"conferenceUpdate",callUpdate:"callUpdate",vertoClientReady:"vertoClientReady",userMediaError:"userMediaError",peerConnectionFailureError:"peerConnectionFailureError",signalingStateClosed:"signalingStateClosed"},U={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};var $,F,V,G,B;!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"}($||($={})),function(e){e.Participant="participant",e.Moderator="moderator"}(F||(F={})),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"}(V||(V={})),function(e){e.Video="videoinput",e.AudioIn="audioinput",e.AudioOut="audiooutput"}(G||(G={})),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"}(B||(B={}));const H="GLOBAL",q={},W=(e,t)=>`${e}|${t}`,K=(e,t=H)=>W(e,t)in q,J=(e,t,n=H)=>{const i=W(e,n);i in q||(q[i]=[]),q[i].push(t)},Y=(e,t,n=H)=>{const i=function(s){z(e,i,n),t(s)};return i.prototype.targetRef=t,J(e,i,n)},z=(e,t,n=H)=>{if(!K(e,n))return!1;const i=W(e,n);if(S(t)){for(let e=q[i].length-1;e>=0;e--){const n=q[i][e];(t===n||n.prototype&&t===n.prototype.targetRef)&&q[i].splice(e,1)}}else q[i]=[];return 0===q[i].length&&delete q[i],!0},Q=(e,t,n=H,i=!0)=>{const s=i&&n!==H;if(!K(e,n))return s&&Q(e,t),!1;const o=W(e,n),r=q[o].length;if(!r)return s&&Q(e,t),!1;for(let e=r-1;e>=0;e--)q[o][e](t);return s&&Q(e,t),!0},X=e=>{const t=W(e,"");Object.keys(q).filter((e=>0===e.indexOf(t))).forEach((e=>delete q[e]))};let Z="undefined"!=typeof WebSocket?WebSocket:null;const ee=0,te=1,ne=2,ie=3;class se{constructor(e){this.session=e,this.previousGatewayState="",this._wsClient=null,this._host=d,this._timers={},this._useCanaryRtcServer=!1,this._hasCanaryBeenUsed=!1,this.upDur=null,this.downDur=null;const{host:t,env:n,region:i,useCanaryRtcServer:s}=e.options;n&&(this._host="development"===n?"wss://rtcdev.telnyx.com":d),t&&(this._host=(e=>`${C.test(e)?"":"wss://"}${e}`)(t)),i&&(this._host=this._host.replace(/rtc(dev)?/,`${i}.rtc$1`)),s&&(this._useCanaryRtcServer=!0)}get connected(){return this._wsClient&&this._wsClient.readyState===te}get connecting(){return this._wsClient&&this._wsClient.readyState===ee}get closing(){return this._wsClient&&this._wsClient.readyState===ne}get closed(){return this._wsClient&&this._wsClient.readyState===ie}get isAlive(){return this.connecting||this.connected}get isDead(){return this.closing||this.closed}connect(){const t=new URL(this._host);let n=A();this.session.options.rtcIp&&this.session.options.rtcPort&&(n=null,this._useCanaryRtcServer=!1,t.searchParams.set("rtc_ip",this.session.options.rtcIp),t.searchParams.set("rtc_port",this.session.options.rtcPort.toString())),n&&t.searchParams.set("voice_sdk_id",n),this._useCanaryRtcServer&&(t.searchParams.set("canary","true"),n&&!this._hasCanaryBeenUsed&&(t.searchParams.delete("voice_sdk_id"),m.debug("first canary connection. Refreshing voice_sdk_id")),this._hasCanaryBeenUsed=!0),this._wsClient=new Z(t.toString()),this._wsClient.onopen=t=>Q(e.SwEvent.SocketOpen,t,this.session.uuid),this._wsClient.onclose=t=>Q(e.SwEvent.SocketClose,t,this.session.uuid),this._wsClient.onerror=t=>Q(e.SwEvent.SocketError,{error:t,sessionId:this.session.sessionid},this.session.uuid),this._wsClient.onmessage=t=>{var n,i;const s=_(t.data);var o;if("string"!=typeof s){if(s.voice_sdk_id&&(o=s.voice_sdk_id,sessionStorage.setItem(P,o)),this._unsetTimer(s.id),m.debug("RECV: \n",JSON.stringify(s,null,2),"\n"),B[`${null===(i=null===(n=null==s?void 0:s.result)||void 0===n?void 0:n.params)||void 0===i?void 0:i.state}`]||!Q(s.id,s)){const t=R(s);Q(e.SwEvent.SocketMessage,s,this.session.uuid),Boolean(t)&&(this.previousGatewayState=t)}}else this._handleStringResponse(s)}}sendRawText(e){this._wsClient.send(e)}send(e){const{request:t}=e,n=new Promise(((e,n)=>{if(t.hasOwnProperty("result"))return e();Y(t.id,(t=>{const{result:i,error:s}=I(t);return s?n(s):e(i)}))}));return m.debug("SEND: \n",JSON.stringify(t,null,2),"\n"),this._wsClient.send(JSON.stringify(t)),n}close(){this._wsClient&&(S(this._wsClient._beginClose)?this._wsClient._beginClose():this._wsClient.close()),this._wsClient=null}_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)),Q(e.SwEvent.SpeedTest,{upDur:this.upDur,downDur:this.downDur},this.session.uuid)}else m.warn("Unknown message from socket",t)}}class oe{buildRequest(e){this.request=Object.assign({jsonrpc:"2.0",id:c()},e)}}const re={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 ae extends oe{constructor(e={}){if(super(),e.hasOwnProperty("dialogParams")){const n=t(e.dialogParams,["remoteSdp","localStream","remoteStream","onNotification","camId","micId","speakerId"]);for(const e in re)e&&n.hasOwnProperty(e)&&(n[re[e]]=n[e],delete n[e]);e.dialogParams=n}this.buildRequest({method:this.toString(),params:e})}}class ce extends ae{constructor(e){super(),this.method=D.GatewayState;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}class de{constructor(e){this.pendingRequestId=null,this.onSocketMessage=e=>n(this,void 0,void 0,(function*(){e.id===this.pendingRequestId&&this.gatewayStateTask.resolve(R(e))})),this.getIsRegistered=()=>n(this,void 0,void 0,(function*(){const e=new ce(A());this.pendingRequestId=e.request.id,this.gatewayStateTask=x({}),this.session.execute(e);const t=yield this.gatewayStateTask.promise;return!!t&&[B.REGISTER,B.REGED].includes(t)})),this.session=e,this.gatewayStateTask=x({}),this.session.on("telnyx.socket.message",this.onSocketMessage)}}class le extends ae{constructor(e){super(),this.method=D.Ping;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}var ue="2.25.18",he=ue;class pe extends ae{constructor(e,t,n,i,s={},o){super(),this.method="login";const r={login:e,passwd:t,login_token:n,userVariables:s,reconnection:o,loginParams:{},"User-Agent":{sdkVersion:he,data:navigator.userAgent}};i&&(r.sessid=i),this.buildRequest({method:this.method,params:r})}}class ge extends ae{constructor(e,t){super(),this.buildRequest({id:e,result:{method:t}})}}class ve extends ae{toString(){return D.Invite}}class fe extends ae{toString(){return D.Answer}}class me extends ae{toString(){return D.Attach}}class be extends ae{toString(){return D.Bye}}class ye extends ae{toString(){return D.Candidate}}class _e extends ae{toString(){return D.EndOfCandidates}}class Se extends ae{toString(){return D.Modify}}class we extends ae{toString(){return D.Info}}class Ce extends ae{toString(){return D.Broadcast}}class Ie extends ae{toString(){return D.Subscribe}}class ke extends ae{toString(){return D.Unsubscribe}}class Ee extends ae{constructor(e){super(),this.method="anonymous_login";const{target_type:t,target_id:n,target_version_id:i,userVariables:s,sessionId:o,reconnection:r}=e,a={target_type:t,target_id:n,userVariables:s,reconnection:r,"User-Agent":{sdkVersion:he,data:navigator.userAgent}};o&&(a.sessid=o),i&&(a.target_version_id=i),this.buildRequest({method:this.method,params:a})}}class Te{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.connection=null,this._jwtAuth=!1,this._autoReconnect=!0,this._idle=!1,this._executeQueue=[],!this.validateOptions())throw new Error("Invalid init options");m.setLevel(e.debug?"debug":"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 se(this),this.registerAgent=new de(this)}get __logger(){return m}get connected(){return this.connection&&this.connection.connected}getIsRegistered(){return n(this,void 0,void 0,(function*(){return this.registerAgent.getIsRegistered()}))}get reconnectDelay(){return 1e3*k(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}),m.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 E(this.options)||T(this.options)}broadcast(e){}disconnect(){return n(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(),m.debug("Session disconnected. Cleaned up all listeners and subscriptions, closed connection, disabled auto-reconnect.")}))}on(e,t){return J(e,t,this.uuid),this}off(e,t){return z(e,t,this.uuid),this}connect(){return n(this,void 0,void 0,(function*(){this.connection||(m.debug("No existing connection found, creating a new one."),this.connection=new se(this)),this._attachListeners(),this._autoReconnect=!0,this.connection.isAlive||(m.debug("Initiating connection to the server..."),this.connection.connect()),m.debug("Connect method called. Connection initiated.")}))}_handleLoginError(t){Q(e.SwEvent.Error,{error:t,sessionId:this.sessionid},this.uuid)}login({creds:t,onSuccess:i,onError:s}={}){return n(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)),E(this.options))return this._login({type:"login",onSuccess:i,onError:s});if(T(this.options))return this._login({type:"anonymous_login",onSuccess:i,onError:s});{const t="Invalid login options provided for authentication.";return m.error(t),void Q(e.SwEvent.Error,{error:new Error(t),type:U.invalidCredentialsOptions,sessionId:this.sessionid},this.uuid)}}}))}_login({type:e,onSuccess:t,onError:i}){return n(this,void 0,void 0,(function*(){let n;n="login"===e?new pe(this.options.login,this.options.password||this.options.passwd,this.options.login_token,this.sessionid,this.options.userVariables,!!A()):new Ee({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:!!A()});const s=yield this.execute(n).catch((e=>{this._handleLoginError(e),i&&i(e)}));s&&(this.sessionid=s.sessid,t&&t())}))}_onSocketOpen(){return n(this,void 0,void 0,(function*(){}))}onNetworkClose(){this.relayProtocol&&X(this.relayProtocol);for(const e in this.subscriptions)X(e);this.subscriptions={},this.contexts=[],clearTimeout(this._keepAliveTimeout),this._autoReconnect&&(this._reconnectTimeout=setTimeout((()=>{m.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],z(e,null,t)):(delete this.subscriptions[e],X(e)))}_addSubscription(e,t=null,n){this._existsSubscription(e,n)||(this._existsSubscription(e)||(this.subscriptions[e]={}),this.subscriptions[e][n]={},S(t)&&J(e,t,n))}_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&&(m.warn("No ping/pong received, forcing PING ACK to keep alive"),this.execute(new le(A()))),clearTimeout(this._keepAliveTimeout),this._triggerKeepAliveTimeoutCheck()}_triggerKeepAliveTimeoutCheck(){this._pong=!1,this._keepAliveTimeout=setTimeout((()=>this._resetKeepAlive()),35e3)}setPingReceived(){m.debug("Ping received"),this._pong=!0}static on(e,t){J(e,t)}static off(e){z(e)}static uuid(){return c()}clearConnection(){this.connection=null}hasAutoReconnect(){return this._autoReconnect}}const Re=e=>navigator.mediaDevices.getUserMedia(e),xe=e=>e&&e instanceof MediaStream,Oe=(e,t)=>{const n=w(e);null!==n&&(n.getAttribute("autoplay")||n.setAttribute("autoplay","autoplay"),n.getAttribute("playsinline")||n.setAttribute("playsinline","playsinline"),n.srcObject=t)},Pe=(e,t)=>n(void 0,void 0,void 0,(function*(){const n=w(e);if(null===n)return m.info("No HTMLMediaElement to attach the speakerId"),!1;if("string"!=typeof t)return m.info(`Invalid speaker deviceId: '${t}'`),!1;try{return yield n.setSinkId(t),!0}catch(e){return!1}})),Ae=e=>{e&&"live"===e.readyState&&e.stop()},Le=e=>{xe(e)&&e.getTracks().forEach(Ae),e=null},Me=e=>n(void 0,void 0,void 0,(function*(){m.info("RTCService.getUserMedia",e);const{audio:n,video:i}=e;if(!n&&!i)return null;try{return yield Re(e)}catch(n){if(m.error("getUserMedia error: ",n),(e=>"NotReadableError"===e.name||"NotFoundError"===e.name||"OverconstrainedError"===e.name)(n)){const i=(e=>{const{audio:n,video:i}=e;let s=!1,o=n,r=i;if("object"==typeof n&&null!==n&&"deviceId"in n){s=!0;const e=t(n,["deviceId"]);o=0===Object.keys(e).length||e}if("object"==typeof i&&null!==i&&"deviceId"in i){s=!0;const e=t(i,["deviceId"]);r=0===Object.keys(e).length||e}return s?{audio:o,video:r}:null})(e);if(i){m.warn("Device not found or not readable, falling back to default device");try{return yield Re(i)}catch(e){throw m.error("Fallback getUserMedia also failed: ",e),n}}}throw n}})),De=(e=null,t=!1)=>n(void 0,void 0,void 0,(function*(){let n=[];const i=yield navigator.mediaDevices.getUserMedia(((e=null)=>({audio:!e||e===G.AudioIn||e===G.AudioOut,video:!e||e===G.Video}))(e)).catch((e=>(m.error(e),null)));if(i){if(Le(i),n=yield navigator.mediaDevices.enumerateDevices(),e&&(n=n.filter((t=>t.kind===e))),!0===t)return n;const s=[];n=n.filter((e=>{if(!e.groupId)return!0;const t=`${e.kind}-${e.groupId}`;return!s.includes(t)&&(s.push(t),!0)}))}return n})),Ne=[[320,240],[640,360],[640,480],[1280,720],[1920,1080]],Ue=(e,t,i)=>n(void 0,void 0,void 0,(function*(){const n=yield De(i,!0);for(let i=0;i<n.length;i++){const{deviceId:s,label:o}=n[i];if(e===s||t===o)return s}return null})),je=e=>{const t=navigator.mediaDevices.getSupportedConstraints();Object.keys(e).map((n=>{t.hasOwnProperty(n)&&null!==e[n]&&void 0!==e[n]||delete e[n]}))},$e=(e,t)=>{if(!e)return!1;const{subscribed:n,alreadySubscribed:i}=Fe(e);return n.includes(t)||i.includes(t)},Fe=e=>{const t={subscribed:[],alreadySubscribed:[],unauthorized:[],unsubscribed:[],notSubscribed:[]};return Object.keys(t).forEach((n=>{t[n]=e[`${n}Channels`]||[]})),t},Ve=(e,t=null,n=null)=>{if(!xe(e))return null;let i=[];switch(t){case"audio":i=e.getAudioTracks();break;case"video":i=e.getVideoTracks();break;default:i=e.getTracks()}i.forEach((e=>{switch(n){case"on":case!0:e.enabled=!0;break;case"off":case!1:e.enabled=!1;break;default:e.enabled=!e.enabled}}))},Ge=e=>{Ve(e,"audio",!0)},Be=e=>{Ve(e,"audio",!1)},He=e=>{Ve(e,"audio",null)},qe=e=>((e,t=null)=>{if(!xe(e))return null;let n=[];switch(t){case"audio":n=e.getAudioTracks();break;case"video":n=e.getVideoTracks();break;default:n=e.getTracks()}return n.some((e=>e.enabled))})(e,"audio");function We(){try{const{browserInfo:e,name:t,version:n,supportAudio:i,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],n=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:n,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],n=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:n,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("/"),n=parseInt(t[1],10);return{browserInfo:navigator.userAgent,name:e,version:n,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],n=parseInt(e[1],10);return{browserInfo:navigator.userAgent,name:t,version:n,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:n,supportWebRTC:!!(o&&r&&a&&c&&d),supportWebRTCAudio:i,supportWebRTCVideo:s,supportRTCPeerConnection:!!o,supportSessionDescription:!!r,supportIceCandidate:!!a,supportMediaDevices:!!c,supportGetUserMedia:!!Me}}catch(e){return e.message}}var Ke;function Je(e,t){const n=document.getElementById(t);if(n)return n;if(e&&t){const n=document.createElement("audio");return n.id=t,n.loop=!0,n.src=e,n.preload="auto",n.load(),document.body.appendChild(n),n}return null}function Ye(e){e&&(e._playFulfilled=!1,e._promise=e.play(),e._promise.then((()=>{e._playFulfilled=!0})).catch((t=>{m.error("playAudio",t),e._playFulfilled=!0})))}function ze(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"}(Ke||(Ke={}));class Qe extends oe{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}})))]}}})}}var Xe,Ze=v((function(e,t){var n;function i(){}function s(){s.init.call(this)}function o(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function r(e,t,n,s){var r,a,c;if("function"!=typeof n)throw new TypeError('"listener" argument must be a function');if((a=e._events)?(a.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),a=e._events),c=a[t]):(a=e._events=new i,e._eventsCount=0),c){if("function"==typeof c?c=a[t]=s?[n,c]:[c,n]:s?c.unshift(n):c.push(n),!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]=n,++e._eventsCount;return e}function a(e,t,n){function i(){e.removeListener(t,i),s||(s=!0,n.apply(e,arguments))}var s=!1;return i.listener=n,i}function c(e){var t=this._events;if(t){var n=t[e];if("function"==typeof n)return 1;if(n)return n.length}return 0}function d(e,t){for(var n=Array(t);t--;)n[t]=e[t];return n}Object.defineProperty(t,"__esModule",{value:!0}),i.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&&n.active&&!(this instanceof n.Domain)&&(this.domain=n.active),this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new i,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,n,i,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(!(n=r[e]))return!1;var u="function"==typeof n;switch(i=arguments.length){case 1:!function(e,t,n){if(t)e.call(n);else for(var i=e.length,s=d(e,i),o=0;o<i;++o)s[o].call(n)}(n,u,this);break;case 2:!function(e,t,n,i){if(t)e.call(n,i);else for(var s=e.length,o=d(e,s),r=0;r<s;++r)o[r].call(n,i)}(n,u,this,arguments[1]);break;case 3:!function(e,t,n,i,s){if(t)e.call(n,i,s);else for(var o=e.length,r=d(e,o),a=0;a<o;++a)r[a].call(n,i,s)}(n,u,this,arguments[1],arguments[2]);break;case 4:!function(e,t,n,i,s,o){if(t)e.call(n,i,s,o);else for(var r=e.length,a=d(e,r),c=0;c<r;++c)a[c].call(n,i,s,o)}(n,u,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=Array(i-1),o=1;o<i;o++)s[o-1]=arguments[o];!function(e,t,n,i){if(t)e.apply(n,i);else for(var s=e.length,o=d(e,s),r=0;r<s;++r)o[r].apply(n,i)}(n,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 n,s,o,r,a;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(s=this._events))return this;if(!(n=s[e]))return this;if(n===t||n.listener&&n.listener===t)0==--this._eventsCount?this._events=new i:(delete s[e],s.removeListener&&this.emit("removeListener",e,n.listener||t));else if("function"!=typeof n){for(o=-1,r=n.length;0<r--;)if(n[r]===t||n[r].listener&&n[r].listener===t){a=n[r].listener,o=r;break}if(0>o)return this;if(1===n.length){if(n[0]=void 0,0==--this._eventsCount)return this._events=new i,this;delete s[e]}else!function(e,t){for(var n=t,i=n+1,s=e.length;i<s;n+=1,i+=1)e[n]=e[i];e.pop()}(n,o);s.removeListener&&this.emit("removeListener",e,a||t)}return this},s.prototype.removeAllListeners=function(e){var t,n;if(!(n=this._events))return this;if(!n.removeListener)return 0===arguments.length?(this._events=new i,this._eventsCount=0):n[e]&&(0==--this._eventsCount?this._events=new i:delete n[e]),this;if(0===arguments.length){for(var s,o=Object.keys(n),r=0;r<o.length;++r)"removeListener"!==(s=o[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=new i,this._eventsCount=0,this}if("function"==typeof(t=n[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,n,i=this._events;return i?n=(t=i[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(t):[]:n=[],n},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,n=(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)}(n))throw TypeError("Stringified UUID is invalid");return n}function m(e,t,n){var i=(e=e||{}).random||(e.rng||h)();if(i[6]=64|15&i[6],i[8]=128|63&i[8],t){n=n||0;for(var s=0;16>s;++s)t[n+s]=i[s];return t}return f(i)}function b(e,t){if(!e||!t)return{};const n={...e};if(n.localCandidateId){const e=t.get(n.localCandidateId);n.local={...e}}if(n.remoteCandidateId){const e=t.get(n.remoteCandidateId);n.remote={...e}}return n}function y(e,t,n){return 8*function(e,t,n){const i=e[n],s=t?t[n]:null;return null===i||null===s?null:(i-s)/(e.timestamp-t.timestamp)*1e3}(e,t,n)}function _(e){if(!e.entries)return e;const t={};return e.forEach((function(e,n){t[n]=e})),t}function S(e,t,n={}){if(!e)return null;let i={audio:{inbound:[],outbound:[]},video:{inbound:[],outbound:[]},connection:{inbound:[],outbound:[]}};n.remote&&(i.remote={audio:{inbound:[],outbound:[]},video:{inbound:[],outbound:[]}});for(const t of e.values())switch(t.type){case"outbound-rtp":{const n=t.mediaType||t.kind,s={};let o={};if(!["audio","video"].includes(n))continue;if(t.codecId){const n=e.get(t.codecId);n&&(s.clockRate=n.clockRate,s.mimeType=n.mimeType,s.payloadType=n.payloadType)}o=e.get(t.mediaSourceId)||e.get(t.trackId)||{},i[n].outbound.push({...t,...s,track:{...o}});break}case"inbound-rtp":{let n=t.mediaType||t.kind,s={};const o={};if(!["audio","video"].includes(n))if(t.id.includes("Video"))n="video";else{if(!t.id.includes("Audio"))continue;n="audio"}if(t.codecId){const n=e.get(t.codecId);n&&(o.clockRate=n.clockRate,o.mimeType=n.mimeType,o.payloadType=n.payloadType)}if(!i.connection.id&&t.transportId){const n=e.get(t.transportId);if(n&&n.selectedCandidatePairId){const t=e.get(n.selectedCandidatePairId);i.connection=b(t,e)}}s=e.get(t.mediaSourceId)||e.get(t.trackId)||{},i[n].inbound.push({...t,...o,track:{...s}});break}case"peer-connection":i.connection.dataChannelsClosed=t.dataChannelsClosed,i.connection.dataChannelsOpened=t.dataChannelsOpened;break;case"remote-inbound-rtp":{if(!n.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 n=e.get(t.codecId);n&&(o.clockRate=n.clockRate,o.mimeType=n.mimeType,o.payloadType=n.payloadType)}if(!i.connection.id&&t.transportId){const n=e.get(t.transportId);if(n&&n.selectedCandidatePairId){const t=e.get(n.selectedCandidatePairId);i.connection=b(t,e)}}i.remote[s].inbound.push({...t,...o});break}case"remote-outbound-rtp":{if(!n.remote)break;const s=t.mediaType||t.kind,o={};if(!["audio","video"].includes(s))continue;if(t.codecId){const n=e.get(t.codecId);n&&(o.clockRate=n.clockRate,o.mimeType=n.mimeType,o.payloadType=n.payloadType)}i.remote[s].outbound.push({...t,...o});break}}if(!i.connection.id)for(const t of e.values())"candidate-pair"===t.type&&t.nominated&&"succeeded"===t.state&&(i.connection=b(t,e));return i=function(e,t){return t?(e.audio.inbound.map((e=>{let n=t.audio.inbound.find((t=>t.id===e.id));e.bitrate=y(e,n,"bytesReceived"),e.packetRate=y(e,n,"packetsReceived")})),e.audio.outbound.map((e=>{let n=t.audio.outbound.find((t=>t.id===e.id));e.bitrate=y(e,n,"bytesSent"),e.packetRate=y(e,n,"packetsSent")})),e.video.inbound.map((e=>{let n=t.video.inbound.find((t=>t.id===e.id));e.bitrate=y(e,n,"bytesReceived"),e.packetRate=y(e,n,"packetsReceived")})),e.video.outbound.map((e=>{let n=t.video.outbound.find((t=>t.id===e.id));e.bitrate=y(e,n,"bytesSent"),e.packetRate=y(e,n,"packetsSent")})),e):e}(i,t),i}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:n}=e;let{connectionId:i,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(!n)throw new Error("Missing argument peerId");if(this.isEdge)throw new Error("Can't monitor peers in Edge at this time.");if(this.peersToMonitor[n]){if(i&&i in this.peersToMonitor[n])throw new Error(`We are already monitoring connection with id ${i}.`);for(let e in this.peersToMonitor[n]){const i=this.peersToMonitor[n][e];if(i.pc===t)throw new Error(`We are already monitoring peer with id ${n}.`);"closed"===i.pc.connectionState&&this.removeConnection({pc:i.pc})}}const o=t.getConfiguration();return o.iceServers&&o.iceServers.forEach((function(e){delete e.credential})),i||(i=m()),this.emitEvent({event:"addConnection",tag:"peer",peerId:n,connectionId:i,data:{options:e,peerConfiguration:o}}),this.monitorPeer({peerId:n,connectionId:i,pc:t,remote:s}),{connectionId:i}}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:n,pc:i}=e;if(!i&&!n)throw new Error("Missing arguments. You need to either send pc or a connectionId.");if(n){if("string"!=typeof n)throw new Error("connectionId must be a string.");for(let e in this.peersToMonitor)n in this.peersToMonitor[e]&&(i=this.peersToMonitor[e][n].pc,t=e)}else if(i){if(!(i 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===i&&(n=s,t=e)}if(!i||!n)throw new Error("Could not find the desired connection.");return this.removePeerConnectionEventListeners(n,i),delete this.peersToMonitor[t][n],0===Object.values(this.peersToMonitor[t]).length&&delete this.peersToMonitor[t],{connectionId:n}}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 n=this.peersToMonitor[e][t].pc;this.removePeerConnectionEventListeners(t,n)}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:n,pc:i,remote:s}=e;if(!i)return void this.logger.warn("Did not receive pc argument when calling monitorPeer()");const o={pc:i,connectionId:n,stream:null,stats:{parsed:null,raw:null},options:{remote:s}};if(this.peersToMonitor[t]){if(n in this.peersToMonitor[t])return void this.logger.warn(`Already watching connection with ID ${n}`);this.peersToMonitor[t][n]=o}else this.peersToMonitor[t]={[n]:o};this.addPeerConnectionEventListeners(t,n,i),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 n=[];for(const e in t)for(const i in t[e]){const s=t[e][i],o=s.pc;if(o&&!this.checkIfConnectionIsClosed(e,i,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:i,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)),n.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 n}startConnectionStateMonitoring(){this.connectionMonitoringSetInterval=window.setInterval((()=>{this.numberOfMonitoredPeers||this.stopConnectionStateMonitoring();for(const e in this.peersToMonitor)for(const t in this.peersToMonitor[e]){const n=this.peersToMonitor[e][t].pc;this.checkIfConnectionIsClosed(e,t,n)}}),this.connectionMonitoringInterval)}checkIfConnectionIsClosed(e,t,n){const i=this.isConnectionClosed(n);if(i){this.removeConnection({pc:n});let i="closed"===n.connectionState?"onconnectionstatechange":"oniceconnectionstatechange";this.emitEvent({event:i,peerId:e,connectionId:t,tag:"connection",data:"closed"})}return i}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 n=t[e];this.statsToMonitor.includes(n.type)||delete t[e]}return t}get peerConnectionListeners(){return{icecandidate:(e,t,n,i)=>{this.logger.debug("[pc-event] icecandidate | peerId: ${peerId}",i),this.emitEvent({event:"onicecandidate",tag:"connection",peerId:e,connectionId:t,data:i.candidate})},track:(e,t,n,i)=>{this.logger.debug(`[pc-event] track | peerId: ${e}`,i);const s=i.track,o=i.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:i.track.kind+":"+i.track.id+" "+i.streams.map((function(e){return"stream:"+e.id}))}})},signalingstatechange:(e,t,n)=>{this.logger.debug(`[pc-event] signalingstatechange | peerId: ${e}`),this.emitEvent({event:"onsignalingstatechange",tag:"connection",peerId:e,connectionId:t,data:{signalingState:n.signalingState,localDescription:n.localDescription,remoteDescription:n.remoteDescription}})},iceconnectionstatechange:(e,t,n)=>{this.logger.debug(`[pc-event] iceconnectionstatechange | peerId: ${e}`),this.emitEvent({event:"oniceconnectionstatechange",tag:"connection",peerId:e,connectionId:t,data:n.iceConnectionState})},icegatheringstatechange:(e,t,n)=>{this.logger.debug(`[pc-event] icegatheringstatechange | peerId: ${e}`),this.emitEvent({event:"onicegatheringstatechange",tag:"connection",peerId:e,connectionId:t,data:n.iceGatheringState})},icecandidateerror:(e,t,n,i)=>{this.logger.debug(`[pc-event] icecandidateerror | peerId: ${e}`),this.emitEvent({event:"onicecandidateerror",tag:"connection",peerId:e,connectionId:t,error:{errorCode:i.errorCode}})},connectionstatechange:(e,t,n)=>{this.logger.debug(`[pc-event] connectionstatechange | peerId: ${e}`),this.emitEvent({event:"onconnectionstatechange",tag:"connection",peerId:e,connectionId:t,data:n.connectionState})},negotiationneeded:(e,t,n)=>{this.logger.debug(`[pc-event] negotiationneeded | peerId: ${e}`),this.emitEvent({event:"onnegotiationneeded",tag:"connection",peerId:e,connectionId:t})},datachannel:(e,t,n,i)=>{this.logger.debug(`[pc-event] datachannel | peerId: ${e}`,i),this.emitEvent({event:"ondatachannel",tag:"datachannel",peerId:e,connectionId:t,data:i.channel})}}}addPeerConnectionEventListeners(e,t,n){this.logger.debug(`Adding event listeners for peer ${e} and connection ${t}.`),C[t]={},Object.keys(this.peerConnectionListeners).forEach((i=>{C[t][i]=this.peerConnectionListeners[i].bind(this,e,t,n),n.addEventListener(i,C[t][i],!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 n=this.getTrackEventObject(t);Object.keys(n).forEach((t=>{C[e.id][t]=n[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((n=>{t.removeEventListener(n,C[e][n],!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),n=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=n.bind(navigator.mediaDevices)}}}}));(Xe=Ze)&&Xe.__esModule&&Object.prototype.hasOwnProperty.call(Xe,"default")&&Xe.default;var et=Ze.WebRTCStats;function tt(e){const{packetsLost:t,packetsReceived:n,jitter:i,rtt:s}=e,o=function(e){const{jitter:t,rtt:n}=e,i=t+n/2;return.024*i+.11*(i-177.3)*(i>177.3?1:0)}({rtt:s,jitter:i}),r=function(e){const{packetsLost:t,packetsReceived:n}=e,i=t/(n+t)*100;return 20*Math.log(1+i)}({packetsLost:t,packetsReceived:n}),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 nt(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 it extends oe{constructor(e,t){super(),this.buildRequest({type:"debug_report_start",debug_report_id:e,debug_report_version:1,call_id:t})}}class st extends oe{constructor(e,t){super(),this.buildRequest({type:"debug_report_stop",debug_report_id:e,debug_report_version:1,call_id:t})}}class ot extends oe{constructor(e,t){super(),this.buildRequest({type:"debug_report_data",debug_report_id:e,debug_report_version:1,debug_report_data:t})}}function rt(e,t){var n,i;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===(n=t.localDescription)||void 0===n?void 0:n.type,remoteDescriptionType:null===(i=t.remoteDescription)||void 0===i?void 0:i.type}}function at(t,i){const s=c();let o=!1;const r=new et({getStatsInterval:1e3,rawStats:!1,statsObject:!0,filteredStats:!1,remote:!0,debug:!1,logLevel:"warn"}),a=i=>n(this,void 0,void 0,(function*(){"stats"===i.event&&Q(e.SwEvent.StatsFrame,function({data:e}){var t,n,i,s,o,r,a,c;const{audio:d,remote:l}=e,{audio:u}=l,h=null!==(n=null===(t=u.inbound[0])||void 0===t?void 0:t.jitter)&&void 0!==n?n:1/0,p=null!==(s=null===(i=u.inbound[0])||void 0===i?void 0:i.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=tt({jitter:1e3*h,rtt:1e3*p,packetsLost:v,packetsReceived:g});return{jitter:h,rtt:p,mos:f,quality:nt(f),inboundAudio:d.inbound[0],outboundAudio:d.outbound[0],remoteInboundAudio:u.inbound[0],remoteOutboundAudio:u.outbound[0]}}(i),t.uuid),yield t.execute(new ot(s,i))}));return{get isRunning(){return o},start:(e,c,d)=>n(this,void 0,void 0,(function*(){if(o)m.debug(`[${i}] Stats reporter already running, skipping start`);else{yield t.execute(new it(s,i)),r.on("timeline",a);try{yield r.addConnection({pc:e,peerId:c,connectionId:d}),o=!0}catch(e){m.error(`[${i}] Failed to start stats reporter:`,e),r.removeAllPeers(),r.destroy()}}})),stop:a=>n(this,void 0,void 0,(function*(){const n=r.getTimeline();if(Q(e.SwEvent.StatsReport,n,t.uuid),"file"===a){!function(e,t){const n=new Blob([JSON.stringify(e)],{type:"application/json"}),i=URL.createObjectURL(n),s=document.createElement("a");s.href=i,s.download=`${t}.json`,s.click(),URL.revokeObjectURL(i)}(n,`webrtc-stats-${s}-${Date.now()}`)}yield t.execute(new st(s,i)),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 ct=(t,n)=>{const{contentType:i,canvasType:s,callID:o,canvasInfo:r=null,currentLayerIdx:a=-1}=n;r&&"mcu-personal-canvas"!==s&&delete r.memberID;const c={type:N.conferenceUpdate,call:t.calls[o],canvasInfo:dt(r),currentLayerIdx:a};switch(i){case"layer-info":{const n=Object.assign({action:V.LayerInfo},c);Q(e.SwEvent.Notification,n,t.uuid);break}case"layout-info":{const n=Object.assign({action:V.LayoutInfo},c);Q(e.SwEvent.Notification,n,t.uuid);break}}},dt=e=>{const t=JSON.stringify(e).replace(/memberID/g,"participantId").replace(/ID"/g,'Id"').replace(/POS"/g,'Pos"');return _(t)};class lt{constructor(t,i,s,o,r){this.type=t,this.options=i,this.onSdpReadyTwice=null,this.statsReporter=null,this._negotiating=!1,this._prevConnectionState=null,this._restartedIceOnConnectionStateFailed=!1,this._sleepWakeupIntervalId=null,this.handleConnectionStateChange=()=>n(this,void 0,void 0,(function*(){const{connectionState:t}=this.instance;if(m.info(`[${(new Date).toISOString()}] Connection State changed: ${this._prevConnectionState} -> ${t}`),"failed"===t||"disconnected"===t){const e=()=>n(this,void 0,void 0,(function*(){if(this.isDebugEnabled&&this.statsReporter){const e=yield function(e,t){return n(this,void 0,void 0,(function*(){const n={connectionState:e.connectionState,previousConnectionState:t,iceConnectionState:e.iceConnectionState,iceGatheringState:e.iceGatheringState,signalingState:e.signalingState},i=e.getTransceivers();if(i.length>0){const e=i[0].sender,t=null==e?void 0:e.transport;t&&(n.dtlsState=t.state)}e.sctp&&(n.sctpState=e.sctp.state);try{const t=yield e.getStats();t.forEach((e=>{"candidate-pair"===e.type&&"succeeded"===e.state&&(n.candidatePairState=e.state,t.forEach((t=>{"local-candidate"===t.type&&t.id===e.localCandidateId&&(n.localCandidateType=t.candidateType,n.selectedCandidatePair=n.selectedCandidatePair||{local:{},remote:{}},n.selectedCandidatePair.local={address:t.address,port:t.port,protocol:t.protocol,candidateType:t.candidateType}),"remote-candidate"===t.type&&t.id===e.remoteCandidateId&&(n.remoteCandidateType=t.candidateType,n.selectedCandidatePair=n.selectedCandidatePair||{local:{},remote:{}},n.selectedCandidatePair.remote={address:t.address,port:t.port,protocol:t.protocol,candidateType:t.candidateType})}))),"transport"===e.type&&(n.dtlsCipher=e.dtlsCipher,n.srtpCipher=e.srtpCipher,n.tlsVersion=e.tlsVersion,e.dtlsState&&(n.dtlsState=e.dtlsState))}))}catch(e){m.error("Error gathering connection state details:",e)}return n}))}(this.instance,this._prevConnectionState);this.statsReporter.reportConnectionStateChange(e)}window.removeEventListener("online",e)}));navigator.onLine?e():window.addEventListener("online",e)}"failed"===t&&Q(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=()=>{m.debug(`[${(new Date).toISOString()}] ICE Connection State`,this.instance.iceConnectionState)},this._handleIceGatheringStateChange=()=>{m.debug(`[${(new Date).toISOString()}] ICE Gathering State`,this.instance.iceGatheringState)},this._setCodecs=(e,t)=>{if(e.setCodecPreferences)return e.setCodecPreferences(t)},m.debug("New Peer with type:",this.type,"Options:",this.options),this._constraints={offerToReceiveAudio:!0,offerToReceiveVideo:!!i.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===L.Offer}get isAnswer(){return this.type===L.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 n(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(){m.info("Number of transceivers:",this.instance.getTransceivers().length),this.instance.getTransceivers().forEach(((e,t)=>{m.info(`>> Transceiver [${t}]:`,e.mid,e.direction,e.stopped),m.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"),n=performance.measure("ice-gathering","ice-gathering-start","ice-gathering-end"),i=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(n.duration)},[this._isOffer()?"Invite Send":"Answer Send"]:{duration:r(s.duration)},"SDP Send":{duration:r(i.duration)},"Total Duration":{duration:r(o.duration)}}}handleSignalingStateChangeEvent(){switch(m.info("signalingState:",this.instance.signalingState),this.instance.signalingState){case"stable":this._negotiating=!1;break;case"closed":Q(e.SwEvent.PeerConnectionSignalingStateClosed,{sessionId:this._session.sessionid},this.options.id),this.instance&&(m.debug(`[${this.options.id}] Closing peer due to signalingState closed`),this.close());break;default:this._negotiating=!0}}handleNegotiationNeededEvent(){m.info("Negotiation needed event"),"stable"!==this.instance.signalingState||this._negotiating?m.debug("Skipping negotiation, state:",this.instance.signalingState,"negotiating:",this._negotiating):this._isTrickleIce()?this.startTrickleIceNegotiation():this.startNegotiation()}handleTrackEvent(e){const{streams:[t]}=e,{remoteElement:n,screenShare:i}=this.options;this.options.remoteStream=t,!1===i&&Oe(n,this.options.remoteStream)}createPeerConnection(){return n(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:L.Offer})),this.options.localStream=yield this._retrieveLocalStream().catch((t=>(Q(e.SwEvent.MediaError,t,this.options.id),null))),this.options.mutedMicOnStart&&xe(this.options.localStream)&&(m.info("Muting local audio tracks on start"),Be(this.options.localStream)),performance.mark("peer-creation-end")}))}init(){var e;return n(this,void 0,void 0,(function*(){yield this.createPeerConnection(),this.isDebugEnabled&&(this.statsReporter=at(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:n=null,screenShare:i=!1}=this.options;if(xe(n)){const e=n.getAudioTracks();let s=[...e];if(m.info("Local audio tracks: ",e),"object"==typeof this.options.audio&&e.forEach((e=>{m.info("Local audio tracks constraints: ",e.getConstraints())})),this.options.video){const t=n.getVideoTracks();s=[...e,...t],m.info("Local video tracks: ",t),"object"==typeof this.options.video&&t.forEach((e=>{m.info("Local video tracks constraints: ",e.getConstraints())}))}const{audioCodecs:o,videoCodecs:r}=(e=>{const t=[],n=[];return e&&0!==e.length?(e.forEach((e=>{const i=e.mimeType.toLocaleLowerCase();i.startsWith("audio/")?t.push(e):i.startsWith("video/")&&n.push(e)})),{audioCodecs:t,videoCodecs:n}):{audioCodecs:t,videoCodecs:n}})(this.options.preferred_codecs);if(this.isOffer&&"function"==typeof this.instance.addTransceiver){const e={direction:"sendrecv",streams:[n]};s.forEach((t=>{"audio"===t.kind&&(this.options.userVariables.microphoneLabel=t.label),"video"===t.kind&&(this.options.userVariables.cameraLabel=t.label);const n=this.instance.addTransceiver(t,e);"audio"===t.kind&&o.length>0&&this._setCodecs(n,o),"video"===t.kind&&r.length>0&&this._setCodecs(n,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,n)})),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(n);!1===i&&Oe(t,n)}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);m.info("Add transceiver",e,t)}}_createOffer(){return n(this,void 0,void 0,(function*(){if(this._isOffer()){this._constraints.offerToReceiveAudio=!1!==this.options.audio,this._constraints.offerToReceiveVideo=Boolean(this.options.video),m.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){m.error("Peer _createOffer error:",e)}}}))}_setRemoteDescription(e){return n(this,void 0,void 0,(function*(){m.debug("Setting remote description",e),yield this.instance.setRemoteDescription(e)}))}_createAnswer(){return n(this,void 0,void 0,(function*(){if(this._isAnswer()){if("stable"!==this.instance.signalingState&&"have-remote-offer"!==this.instance.signalingState)return m.debug("Skipping negotiation, state:",this.instance.signalingState),m.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:L.Offer})]));this._logTransceivers();try{const e=yield this.instance.createAnswer();return yield this._setLocalDescription(e),e}catch(e){m.error("Peer _createAnswer error:",e)}}}))}_setLocalDescription(e){return n(this,void 0,void 0,(function*(){yield this.instance.setLocalDescription(e)}))}_sdpReady(){S(this.onSdpReadyTwice)&&this.onSdpReadyTwice(this.instance.localDescription)}_retrieveLocalStream(){return n(this,void 0,void 0,(function*(){if(xe(this.options.localStream))return this.options.localStream;const e=yield(t=this.options,n(void 0,void 0,void 0,(function*(){let{audio:e=!0,micId:n,video:i=!1,camId:s}=t;const{micLabel:o="",camLabel:r=""}=t;return n&&(n=yield Ue(n,o,G.AudioIn).catch((e=>null)),n&&("boolean"==typeof e&&(e={}),e.deviceId={exact:n})),s&&(s=yield Ue(s,r,G.Video).catch((e=>null)),s&&("boolean"==typeof i&&(i={}),i.deviceId={exact:s})),{audio:e,video:i}})));var t;return Me(e)}))}_isOffer(){return this.type===L.Offer}_isAnswer(){return this.type===L.Answer}_isTrickleIce(){return!0===this.options.trickleIce}_config(){const{prefetchIceCandidates:e,forceRelayCandidate:t,iceServers:n}=this.options,i={bundlePolicy:"balanced",iceCandidatePoolSize:e?10:0,iceServers:n,iceTransportPolicy:t?"relay":"all"};return m.info("RTC config",i),i}restartStatsReporter(){return n(this,void 0,void 0,(function*(){this.isDebugEnabled&&this.statsReporter&&(this.instance?this.statsReporter.isRunning?m.debug(`[${this.options.id}] Stats reporter already running, skipping restart`):(m.debug(`[${this.options.id}] Restarting stats reporter after reconnect`),yield this.statsReporter.start(this.instance,this._session.sessionid,this._session.sessionid)):m.debug(`[${this.options.id}] Cannot restart stats reporter - no peer connection instance`))}))}close(){return n(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 ut=he;class ht{constructor(e,t,n=!1){this.session=e,this._isRecovering=n,this.id="",this.state=$[$.New],this.prevState="",this.channels=[],this.role=F.Participant,this.extension=null,this._state=$.New,this._prevState=$.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 n in t.constraints)if(t.constraints.hasOwnProperty(n)&&t.constraints[n]!==e[n])return;t.callback(e)}}))}))}))};const{iceServers:i,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:i,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=Je(this.options.ringtoneFile,"_ringtone"),this._ringback=Je(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"),n=performance.measure("sdp-send","sdp-send-start","sdp-send-end"),i=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(n.duration)},"Total Duration":{duration:s(i.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!qe(this.options.localStream)}invite(){return n(this,void 0,void 0,(function*(){this._creatingPeer=!0,this.direction=M.Outbound,this.options.trickleIce&&this._resetTrickleIceCandidateState(),performance.mark("peer-creation-start"),this.peer=new lt(L.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 n(this,void 0,void 0,(function*(){this._creatingPeer=!0,performance.mark("new-call-start"),this.stopRingtone(),this.direction=M.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 lt(L.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(){Ye(this._ringtone)}stopRingtone(){ze(this._ringtone)}playRingback(){Ye(this._ringback)}stopRingback(){ze(this._ringback)}hangup(t,n){var i,s,o;const r=t||{},a=!1!==n;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!==(i=this.options.customHeaders)&&void 0!==i?i:[],...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($.Recovering),void this._finalize();this.setState($.Hangup);const c=()=>{var e;m.debug(`[${this.id}] Closing peer from hangup`),null===(e=this.peer)||void 0===e||e.close(),this.setState($.Destroy)};if(this.stopRingtone(),this.stopRingback(),a){const t=new be({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=>{m.error("telnyx_rtc.bye failed!",t),Q(e.SwEvent.Error,{error:t,sessionId:this.session.sessionid},this.session.uuid)})).then(c.bind(this))}else c()}hold(){const e=new Se({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 Se({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 Se({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 we({sessid:this.session.sessionid,dtmf:e,dialogParams:this.options});this._execute(t)}message(e,t){const n={from:this.session.options.login,to:e,body:t},i=new we({sessid:this.session.sessionid,msg:n,dialogParams:this.options});this._execute(i)}muteAudio(){Be(this.options.localStream)}unmuteAudio(){Ge(this.options.localStream)}toggleAudioMute(){He(this.options.localStream)}setAudioInDevice(e,t=this.options.mutedMicOnStart){return n(this,void 0,void 0,(function*(){const{instance:n}=this.peer,i=n.getSenders().find((({track:{kind:e}})=>"audio"===e));if(i){const n=yield Re({audio:{deviceId:{exact:e}}}),s=n.getAudioTracks()[0];s.enabled=!t,i.replaceTrack(s),this.options.micId=e;const{localStream:o}=this.options;o.getAudioTracks().forEach((e=>e.stop())),o.getVideoTracks().forEach((e=>n.addTrack(e))),this.options.localStream=n}}))}muteVideo(){var e;e=this.options.localStream,Ve(e,"video",!1)}unmuteVideo(){var e;e=this.options.localStream,Ve(e,"video",!0)}toggleVideoMute(){var e;e=this.options.localStream,Ve(e,"video",null)}setVideoDevice(e){return n(this,void 0,void 0,(function*(){const{instance:t}=this.peer,n=t.getSenders().find((({track:{kind:e}})=>"video"===e));if(n){const t=yield Re({video:{deviceId:{exact:e}}}),i=t.getVideoTracks()[0];n.replaceTrack(i);const{localElement:s,localStream:o}=this.options;Oe(s,t),this.options.camId=e,o.getAudioTracks().forEach((e=>t.addTrack(e))),o.getVideoTracks().forEach((e=>e.stop())),this.options.localStream=t}}))}deaf(){Be(this.options.remoteStream)}undeaf(){Ge(this.options.remoteStream)}toggleDeaf(){He(this.options.remoteStream)}setBandwidthEncodingsMaxBps(e,t){return n(this,void 0,void 0,(function*(){if(!this||!this.peer)return void m.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:n}=this.peer,i=n.getSenders();if(!i)return void m.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=i.find((({track:{kind:e}})=>e===t));if(s){const n=s.getParameters();n.encodings||(n.encodings=[{rid:"h"}]),m.info("Parameters: ",n),m.info("Setting max ","audio"===t?"audio":"video"," bandwidth to: ",e," [bps]"),n.encodings[0].maxBitrate=e,yield s.setParameters(n).then((()=>{m.info("audio"===t?"New audio":"New video"," bandwidth settings in use: ",s.getParameters())})).catch((e=>m.error(e)))}else m.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 n={callback:e,constraints:t};if(this._statsBindings.push(n),!this._statsIntervalId){const e=2e3;this._startStats(e)}}setState(e){switch(this._prevState=this._state,this._state=e,this.state=$[this._state].toLowerCase(),this.prevState=$[this._prevState].toLowerCase(),m.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this._dispatchNotification({type:N.callUpdate,call:this}),e){case $.Purge:m.debug(`Call ${this.id} hangup call due to purge state`),this.hangup({cause:"PURGE",causeCode:1},!1);break;case $.Active:this._isRecovering&&(this._isRecovering=!1,m.debug(`[${this.id}] Recovery complete, call is active`)),setTimeout((()=>{const{remoteElement:e,speakerId:t}=this.options;e&&t&&Pe(e,t)}),0);break;case $.Destroy:this._finalize()}}handleMessage(t){const{method:n,params:i}=t;switch(n){case D.Answer:if(this.gotAnswer=!0,this._state>=$.Active)return;this._state>=$.Early&&this.setState($.Active),this.gotEarly||this._onRemoteSdp(i.sdp),this.stopRingback(),this.stopRingtone();break;case D.Media:if(this._state>=$.Early)return;this.gotEarly=!0,this._onRemoteSdp(i.sdp);break;case D.Display:{const{display_name:t,display_number:s,display_direction:o}=i;this.extension=s;const r=o===M.Inbound?M.Outbound:M.Inbound,a={type:N[n],call:this,displayName:t,displayNumber:s,displayDirection:r};Q(e.SwEvent.Notification,a,this.id)||Q(e.SwEvent.Notification,a,this.session.uuid);break}case D.Candidate:this._addIceCandidate(i);break;case D.Info:case D.Event:{const t=Object.assign(Object.assign({},i),{type:N.generic,call:this});Q(e.SwEvent.Notification,t,this.id)||Q(e.SwEvent.Notification,t,this.session.uuid);break}case D.Ringing:this.playRingback(),i.telnyx_call_control_id&&(this.options.telnyxCallControlId=i.telnyx_call_control_id),i.telnyx_session_id&&(this.options.telnyxSessionId=i.telnyx_session_id),i.telnyx_leg_id&&(this.options.telnyxLegId=i.telnyx_leg_id);break;case D.Bye:const t=i.client_state||i.clientState;t&&(this.options.clientState=t),this.stopRingback(),this.stopRingtone(),this.hangup(i,!1)}}handleConferenceUpdate(e,t){return n(this,void 0,void 0,(function*(){if(!this._checkConferenceSerno(e.wireSerno)&&e.name!==t.laName)return m.error("ConferenceUpdate invalid wireSerno or packet name:",e),"INVALID_PACKET";const{action:n,data:i,hashKey:s=String(this._lastSerno),arrIndex:o}=e;switch(n){case"bootObj":{this._lastSerno=0;const{chatChannel:e,infoChannel:n,modChannel:s,laName:o,conferenceMemberID:r,role:a}=t;this._dispatchConferenceUpdate({action:V.Join,conferenceName:o,participantId:Number(r),role:a}),e&&(yield this._subscribeConferenceChat(e)),n&&(yield this._subscribeConferenceInfo(n));const c=[];for(const e in i)c.push(Object.assign({callId:i[e][0],index:Number(e)},y(i[e][1])));this._dispatchConferenceUpdate({action:V.Bootstrap,participants:c});break}case"add":this._dispatchConferenceUpdate(Object.assign({action:V.Add,callId:s,index:o},y(i)));break;case"modify":this._dispatchConferenceUpdate(Object.assign({action:V.Modify,callId:s,index:o},y(i)));break;case"del":this._dispatchConferenceUpdate(Object.assign({action:V.Delete,callId:s,index:o},y(i)));break;case"clear":this._dispatchConferenceUpdate({action:V.Clear});break;default:this._dispatchConferenceUpdate({action:n,data:i,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 n(this,void 0,void 0,(function*(){const t={nodeId:this.nodeId,channels:[e],handler:e=>{const{direction:t,from:n,fromDisplay:i,message:s,type:o}=e.data;this._dispatchConferenceUpdate({action:V.ChatMessage,direction:t,participantNumber:n,participantName:i,messageText:s,messageType:o,messageId:e.eventSerno})}},n=yield this.session.vertoSubscribe(t).catch((e=>{m.error("ConfChat subscription error:",e)}));$e(n,e)&&(this._addChannel(e),Object.defineProperties(this,{sendChatMessage:{configurable:!0,value:(t,n)=>{this.session.vertoBroadcast({nodeId:this.nodeId,channel:e,data:{action:"send",message:t,type:n}})}}}))}))}_subscribeConferenceInfo(e){return n(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,ct(this.session,t);else m.error("Conference-Info unknown contentType",e)}},n=yield this.session.vertoSubscribe(t).catch((e=>{m.error("ConfInfo subscription error:",e)}));$e(n,e)&&this._addChannel(e)}))}_confControl(e,t={}){const n=Object.assign({application:"conf-control",callID:this.id,value:null},t);this.session.vertoBroadcast({nodeId:this.nodeId,channel:e,data:n})}_handleChangeHoldStateSuccess(e){return"active"===e.holdState?this.setState($.Active):this.setState($.Held),!0}_handleChangeHoldStateError(e){return m.error(`Failed to ${e.action} on call ${this.id}`),!1}_onRemoteSdp(e){return n(this,void 0,void 0,(function*(){const t=new RTCSessionDescription({sdp:e,type:L.Answer});yield this.peer.instance.setRemoteDescription(t).then((()=>{this.options.trickleIce&&(this._isRemoteDescriptionSet=!0,this._flushPendingTrickleIceCandidates()),this.gotEarly&&this.setState($.Early),this.gotAnswer&&this.setState($.Active)})).catch((e=>{m.error("Call setRemoteDescription Error: ",e),this.hangup({cause:"USER_BUSY",causeCode:17},!0)}))}))}_requestAnotherLocalDescription(){S(this.peer.onSdpReadyTwice)?Q(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,n;this._iceTimeout&&clearTimeout(this._iceTimeout),this._iceTimeout=null,this._iceDone=!0;const{sdp:i,type:s}=e;if(-1===i.indexOf("candidate"))return m.info("No candidate - retry \n"),void this._requestAnotherLocalDescription();null===(n=null===(t=this.peer)||void 0===t?void 0:t.instance)||void 0===n||n.removeEventListener("icecandidate",this._onIce),performance.mark("ice-gathering-end");let o=null;const r={sessid:this.session.sessionid,sdp:i,dialogParams:this.options,"User-Agent":`Web-${ut}`};switch(s){case L.Offer:this.setState($.Requesting),o=new ve(r);break;case L.Answer:this._isRecovering||this.setState($.Answering),o=!0===this.options.attach?new me(r):new fe(r);break;default:return m.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===L.Offer?this.setState($.Trying):this.setState($.Active)})).catch((e=>{m.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 m.error("No SDP data provided"),this.hangup({},!1);const{sdp:t,type:n}=e;let i=null;const s={sessid:this.session.sessionid,sdp:t,dialogParams:this.options,trickle:!0,"User-Agent":`Web-${ut}`};switch(n){case L.Offer:this.setState($.Requesting),i=new ve(s);break;case L.Answer:this._isRecovering||this.setState($.Answering),i=!0===this.options.attach?new me(s):new fe(s);break;default:return m.error(`${this.id} - Unknown local SDP type:`,e),this.hangup({},!1)}performance.mark("sdp-send-start"),this._execute(i).then((e=>{const{node_id:t=null}=e;this._targetNodeId=t,n===L.Offer?this.setState($.Trying):this.setState($.Active)})).catch((e=>{m.error(`${this.id} - Sending ${n} 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?m.debug("RTCPeer Candidate:",e.candidate):this._onIceSdp(t.localDescription)}_onTrickleIce(e){e.candidate&&e.candidate.candidate?(m.debug("RTCPeer Candidate:",e.candidate),this._sendIceCandidate(e.candidate)):this._sendEndOfCandidates()}_sendIceCandidate(e){const t=new ye({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 m.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((()=>{m.debug("Successfully added ICE candidate:",e)})).catch((t=>{m.error("Failed to add ICE candidate:",t,e)}))}_sendEndOfCandidates(){const e=new _e({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 n;if(m.debug("ICE candidate error:",t),null===(n=this.peer)||void 0===n?void 0:n.statsReporter){const n=rt(t,e);this.peer.statsReporter.reportIceCandidateError(n)}},e.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),e.addEventListener("track",(e=>{this.options.remoteStream=e.streams[0];const{remoteElement:t,remoteStream:n,screenShare:i}=this.options;!1===i&&Oe(t,n)}))}_registerTrickleIcePeerEvents(e){e.onicecandidate=e=>{this._onTrickleIce(e)},e.onicegatheringstatechange=t=>{m.debug("ICE gathering state changed:",e.iceGatheringState),"complete"===e.iceGatheringState&&m.debug("Finished gathering candidates")},e.onicecandidateerror=t=>{var n;if(m.debug("ICE candidate error:",t),null===(n=this.peer)||void 0===n?void 0:n.statsReporter){const n=rt(t,e);this.peer.statsReporter.reportIceCandidateError(n)}},e.addEventListener("addstream",(e=>{this.options.remoteStream=e.stream})),e.addEventListener("track",(e=>{this.options.remoteStream=e.streams[0];const{remoteElement:t,remoteStream:n,screenShare:i}=this.options;!1===i&&Oe(t,n)}))}_onMediaError(e){this._dispatchNotification({type:N.userMediaError,error:e}),m.error("Media error, hanging up call",e),this.hangup({},!1)}_onPeerConnectionFailureError(e){this._dispatchNotification({type:N.peerConnectionFailureError,error:e}),m.error("Peer connection failure error")}_onPeerConnectionSignalingStateClosed(e){this._signalingStateClosed=!0,this._dispatchNotification(Object.assign({type:N.signalingStateClosed},e)),m.debug("Peer connection signaling state closed, call is not recoverable")}_dispatchConferenceUpdate(e){this._dispatchNotification(Object.assign({type:N.conferenceUpdate,call:this},e))}_dispatchNotification(t){!0!==this.options.screenShare&&(Q(e.SwEvent.Notification,t,this.id,!1)||Q(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:n,remoteCallerNumber:i,onNotification:s}=this.options;var o;this.options.id=t?t.toString():c(),this.id=this.options.id,n&&(o=n,0!==Object.keys(o).length)||(this.options.userVariables=this.session.options.userVariables||{}),i||(this.options.remoteCallerNumber=this.options.destinationNumber),this.session.calls[this.id]=this,J(e.SwEvent.MediaError,this._onMediaError,this.id),J(e.SwEvent.PeerConnectionFailureError,this._onPeerConnectionFailureError,this.id),J(e.SwEvent.PeerConnectionSignalingStateClosed,this._onPeerConnectionSignalingStateClosed,this.id),S(s)&&J(e.SwEvent.Notification,s.bind(this),this.id),this._isRecovering?this.setState($.Recovering):this.setState($.New),m.info("New Call with Options:",this.options)}_finalize(){var t;this._stopStats(),m.debug(`[${this.id}] Closing peer from _finalize`),null===(t=this.peer)||void 0===t||t.close();const{remoteStream:n,localStream:i}=this.options;Le(n),Le(i),z(e.SwEvent.MediaError,null,this.id),z(e.SwEvent.PeerConnectionFailureError,null,this.id),z(e.SwEvent.PeerConnectionSignalingStateClosed,null,this.id),this.session.calls[this.id]=null,delete this.session.calls[this.id]}_startStats(e){this._statsIntervalId=setInterval(this._doStats,e),m.info("Stats started")}_stopStats(){this._statsIntervalId&&(clearInterval(this._statsIntervalId),this._statsIntervalId=null),m.debug("Stats stopped")}}ht.setStateTelnyx=e=>{if(e){switch(e._state){case $.Recovering:e.state="recovering";break;case $.Requesting:case $.Trying:case $.Early:e.state="connecting";break;case $.Active:e.state="active";break;case $.Held:e.state="held";break;case $.Hangup:case $.Destroy:e.state="done";break;case $.Answering:e.state="ringing";break;case $.New:e.state="new"}return e}};class pt extends ht{constructor(){super(...arguments),this._statsInterval=null,this.sendConversationMessage=(e,t)=>this.session.execute(new Qe(e,t))}hangup(e={},t=!0){this.screenShare instanceof pt&&this.screenShare.hangup(e,t),super.hangup(e,t)}startScreenShare(e){return n(this,void 0,void 0,(function*(){const t=yield(n={video:!0},navigator.mediaDevices.getDisplayMedia(n));var n;t.getTracks().forEach((e=>{e.addEventListener("ended",(()=>{this.screenShare&&this.screenShare.hangup()}))}));const{remoteCallerName:i,remoteCallerNumber:s,callerName:o,callerNumber:r}=this.options,a=Object.assign({screenShare:!0,localStream:t,destinationNumber:`${this.extension}-screen`,remoteCallerName:i,remoteCallerNumber:`${s}-screen`,callerName:`${o} (Screen)`,callerNumber:`${r} (Screen)`},e);return this.screenShare=new pt(this.session,a),this.screenShare.invite(),this.screenShare}))}stopScreenShare(){this.screenShare instanceof pt&&this.screenShare.hangup()}setAudioOutDevice(e){return n(this,void 0,void 0,(function*(){this.options.speakerId=e;const{remoteElement:t,speakerId:n}=this.options;return!(!t||!n)&&Pe(t,n)}))}_finalize(){this._stats(!1),super._finalize()}_stats(e=!0){if(!1===e)return clearInterval(this._statsInterval);m.setLevel(2),this._statsInterval=window.setInterval((()=>n(this,void 0,void 0,(function*(){const e=yield this.peer.instance.getStats(null);let t="";const n=["certificate","codec","peer-connection","stream","local-candidate","remote-candidate"],i=["id","type","timestamp"];e.forEach((e=>{n.includes(e.type)||(t+=`\n${e.type}\n`,Object.keys(e).forEach((n=>{i.includes(n)||(t+=`\t${n}: ${e[n]}\n`)})))})),m.info(t)}))),2e3)}}class gt extends Te{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 n(this,void 0,void 0,(function*(){return e.getIsRegistered.call(this)}))}connect(){const e=Object.create(null,{connect:{get:()=>super.connect}});return n(this,void 0,void 0,(function*(){e.connect.call(this)}))}checkPermissions(e=!0,t=!0){return n(this,void 0,void 0,(function*(){try{const n=yield Me({audio:e,video:t});return Le(n),!0}catch(e){return!1}}))}logout(){this.disconnect()}disconnect(){const e=Object.create(null,{disconnect:{get:()=>super.disconnect}});return n(this,void 0,void 0,(function*(){Object.keys(this.calls).forEach((e=>this.calls[e].setState($.Purge))),this.calls={},this._cleanupNetworkListeners(),yield e.disconnect.call(this)}))}socketDisconnect(){this._closeConnection()}handleLoginError(e){super._handleLoginError(e)}speedTest(t){return new Promise(((n,i)=>{if(Y(e.SwEvent.SpeedTest,(e=>{const{upDur:i,downDur:s}=e,o=s?8*t/(s/1e3)/1024:0;n({upDur:i,downDur:s,upKps:(i?8*t/(i/1e3)/1024:0).toFixed(0),downKps:o.toFixed(0)})}),this.uuid),!(t=Number(t)))return i(`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 De().catch((t=>(Q(e.SwEvent.MediaError,t,this.uuid),[])))}getVideoDevices(){return De(G.Video).catch((t=>(Q(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioInDevices(){return De(G.AudioIn).catch((t=>(Q(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioOutDevices(){return De(G.AudioOut).catch((t=>(m.error("getAudioOutDevices",t),Q(e.SwEvent.MediaError,t,this.uuid),[])))}validateDeviceId(e,t,n){return Ue(e,t,n)}getDeviceResolutions(e){return n(this,void 0,void 0,(function*(){try{return yield(e=>n(void 0,void 0,void 0,(function*(){const t=[],n=yield Me({video:{deviceId:{exact:e}}}),i=n.getVideoTracks()[0];for(let e=0;e<Ne.length;e++){const[n,s]=Ne[e];(yield i.applyConstraints({width:{exact:n},height:{exact:s}}).then((()=>!0)).catch((()=>!1)))&&t.push({resolution:`${n}x${s}`,width:n,height:s})}return Le(n),t})))(e)}catch(e){throw e}}))}get mediaConstraints(){return{audio:this._audioConstraints,video:this._videoConstraints}}setAudioSettings(e){return n(this,void 0,void 0,(function*(){if(!e)throw new Error("You need to provide the settings object");const{micId:i,micLabel:s}=e,o=t(e,["micId","micLabel"]);return je(o),this._audioConstraints=yield((e,t,i,s)=>n(void 0,void 0,void 0,(function*(){const{deviceId:n}=s;if(void 0===n&&(e||t)){const n=yield Ue(e,t,i).catch((e=>null));n&&(s.deviceId={exact:n})}return s})))(i,s,"audioinput",o),this.micId=i,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?h:u}}get iceServers(){return this._iceServers}set speaker(e){this._speaker=e}get speaker(){return this._speaker}set localElement(e){this._localElement=w(e)}get localElement(){return this._localElement}set remoteElement(e){this._remoteElement=w(e)}get remoteElement(){return this._remoteElement}vertoBroadcast({nodeId:e,channel:t="",data:n}){if(!t)throw new Error(`Invalid channel for broadcast: ${t}`);const i=new Ce({sessid:this.sessionid,eventChannel:t,data:n});e&&(i.targetNodeId=e),this.execute(i).catch((e=>e))}vertoSubscribe({nodeId:e,channels:t=[],handler:i}){return n(this,void 0,void 0,(function*(){if(!(t=t.filter((e=>e&&!this._existsSubscription(this.relayProtocol,e)))).length)return{};const n=new Ie({sessid:this.sessionid,eventChannel:t});e&&(n.targetNodeId=e);const s=yield this.execute(n),{unauthorized:o=[],subscribed:r=[]}=Fe(s);return o.length&&o.forEach((e=>this._removeSubscription(this.relayProtocol,e))),r.forEach((e=>this._addSubscription(this.relayProtocol,i,e))),s}))}vertoUnsubscribe({nodeId:e,channels:t=[]}){return n(this,void 0,void 0,(function*(){if(!(t=t.filter((e=>e&&this._existsSubscription(this.relayProtocol,e)))).length)return{};const n=new ke({sessid:this.sessionid,eventChannel:t});e&&(n.targetNodeId=e);const i=yield this.execute(n),{unsubscribed:s=[],notSubscribed:o=[]}=Fe(i);return s.forEach((e=>this._removeSubscription(this.relayProtocol,e))),o.forEach((e=>this._removeSubscription(this.relayProtocol,e))),i}))}_setupNetworkListeners(){"undefined"!=typeof window&&(this._onlineHandler=()=>{this._wasOffline&&(m.debug(`Network connectivity restored for session ${this.sessionid}. Reconnecting...`),this.socketDisconnect(),this.connect()),this._wasOffline=!1},this._offlineHandler=()=>{this._wasOffline=!0,m.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 pt.setStateTelnyx(e)}}class vt{constructor(e,t){this.code=t,this.message=e}}class ft{constructor(e){this.session=e}_ack(e,t){const n=new ge(e,t);this.nodeId&&(n.targetNodeId=this.nodeId),this.session.execute(n)}reconnectDelay(){return 1e3*k(2,6)}handleMessage(t){var i;const{session:s}=this,{id:o,method:r,params:a={},voice_sdk_id:c}=t,d=null==a?void 0:a.callID,l=null==a?void 0:a.eventChannel,u=null==a?void 0:a.eventType,h=s.calls[d],p=null===(i=null==h?void 0:h.peer)||void 0===i?void 0:i.isConnectionHealthy();if("channelPvtData"===u)return this._handlePvtEvent(a.pvtData);const g=(e=!1)=>{var t,n,i,o,c,l;const u={audio:!0,video:s.options.video,remoteSdp:a.sdp,destinationNumber:a.callee_id_number,remoteCallerName:a.caller_id_name,remoteCallerNumber:a.caller_id_number,callerName:a.callee_id_name,callerNumber:a.callee_id_number,attach:r===D.Attach,mediaSettings:a.mediaSettings,debug:null!==(t=s.options.debug)&&void 0!==t&&t,debugOutput:null!==(n=s.options.debugOutput)&&void 0!==n?n:"socket",trickleIce:null!==(i=s.options.trickleIce)&&void 0!==i&&i,prefetchIceCandidates:null!==(o=s.options.prefetchIceCandidates)&&void 0!==o&&o,forceRelayCandidate:null!==(c=s.options.forceRelayCandidate)&&void 0!==c&&c,keepConnectionAliveOnSocketClose:null!==(l=s.options.keepConnectionAliveOnSocketClose)&&void 0!==l&&l};d&&(u.id=d),a.telnyx_call_control_id&&(u.telnyxCallControlId=a.telnyx_call_control_id),a.telnyx_session_id&&(u.telnyxSessionId=a.telnyx_session_id),a.telnyx_leg_id&&(u.telnyxLegId=a.telnyx_leg_id),a.client_state&&(u.clientState=a.client_state),a.dialogParams&&a.dialogParams.custom_headers&&a.dialogParams.custom_headers.length&&(u.customHeaders=a.dialogParams.custom_headers);const h=new pt(s,u,e);return h.nodeId=this.nodeId,h},v=new ce(c),f=new le(c);switch(r){case D.Answer:case D.Display:case D.Candidate:case D.Ringing:case D.Bye:case D.Media:if(!d||!h)return void m.error(`Received ${r} for non existing call:`,a);h.handleMessage(t),this._ack(o,r);break;case D.Ping:this.session.setPingReceived(),this.session.execute(f).then((()=>{ft.receivedAuthenticationRequired=0})).catch((e=>n(this,void 0,void 0,(function*(){e.code===this.session.authenticationRequiredErrorCode&&ft.receivedAuthenticationRequired>=0&&(ft.receivedAuthenticationRequired+=1,ft.receivedAuthenticationRequired>1&&this.session.hasAutoReconnect()&&(m.warn("Ping failed twice with Authentication Required. Re-logging in..."),this.session.login(),ft.receivedAuthenticationRequired=-1))}))));break;case D.Punt:s.options.keepConnectionAliveOnSocketClose&&p?(m.info(`[${(new Date).toISOString()}][${d}] keeping session calls alive due to PUNT and keepConnectionAliveOnSocketClose. Disconnecting base session...`),s.socketDisconnect(),this._ack(o,r)):s.disconnect();break;case D.Invite:{const e=g();e.playRingtone(),e.setState($.Ringing),e.direction=M.Inbound,this._ack(o,r);break}case D.Attach:{if(!h){return g().answer(),void this._ack(o,r)}const e=!!h;m.info(`[${(new Date).toISOString()}][${d}] closing existing call on ATTACH.`),h.hangup({isRecovering:e},!1),m.info(`[${(new Date).toISOString()}][${d}] Attach: Creating new call for recovery`);g(e).answer(),this._ack(o,r);break}case D.Event:case"webrtc.event":if(!l)return void m.error("Verto received an unknown event:",a);const i=s.relayProtocol,c=l.split(".")[0];s._existsSubscription(i,l)?Q(i,a,l):l===s.sessionid?this._handleSessionEvent(a.eventData):s._existsSubscription(i,c)?Q(i,a,c):s.calls.hasOwnProperty(l)?s.calls[l].handleMessage(t):Q(e.SwEvent.Notification,a,s.uuid);break;case D.Info:a.type=N.generic,Q(e.SwEvent.Notification,a,s.uuid);break;case D.ClientReady:this.session.execute(v);break;default:{const n=R(t);if(n){switch(n){case B.REGISTER:case B.REGED:s.connection.previousGatewayState!==B.REGED&&s.connection.previousGatewayState!==B.REGISTER&&(this.session._triggerKeepAliveTimeoutCheck(),ft.retriedRegister=0,a.type=N.vertoClientReady,Q(e.SwEvent.Ready,a,s.uuid));break;case B.UNREGED:case B.NOREG:if(ft.retriedRegister+=1,5===ft.retriedRegister){ft.retriedRegister=0,Q(e.SwEvent.Error,{error:new vt("Fail to register the user, the server tried 5 times","UNREGED|NOREG"),sessionId:s.sessionid},s.uuid);break}setTimeout((()=>{this.session.execute(v)}),this.reconnectDelay());break;case B.FAILED:case B.FAIL_WAIT:if(s.connection.previousGatewayState!==B.FAILED&&s.connection.previousGatewayState!==B.FAIL_WAIT){if(!this.session.hasAutoReconnect()){ft.retriedConnect=0,Q(e.SwEvent.Error,{error:new vt("Fail to connect the server, the server tried 5 times","FAILED|FAIL_WAIT"),sessionId:s.sessionid},s.uuid);break}if(ft.retriedConnect+=1,5===ft.retriedConnect){ft.retriedConnect=0,Q(e.SwEvent.Error,{error:new Error("Connection Retry Failed"),sessionId:s.sessionid},s.uuid);break}setTimeout((()=>{if(m.debug(`Reconnecting... Retry ${ft.retriedConnect} of 5`),this.session.options.keepConnectionAliveOnSocketClose){const e=Object.values(s.calls).some((e=>{var t;return(null===(t=e.peer)||void 0===t?void 0:t.instance)&&!e.signalingStateClosed}));if(e)return m.debug("Reconnecting by keeping the existing session due to keepConnectionAliveOnSocketClose option being set."),this.session.socketDisconnect(),void this.session.connect();m.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:m.warn("GatewayState message unknown method:",t)}break}m.debug("Verto message unknown method:",t);break}}}_retrieveCallId(e,t){const n=Object.keys(this.session.calls);if("bootObj"!==e.action)return n.find((e=>this.session.calls[e].channels.includes(t)));{const t=e.data.find((e=>n.includes(e[0])));if(t instanceof Array)return t[0]}}_handlePvtEvent(t){return n(this,void 0,void 0,(function*(){const{session:n}=this,i=n.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=()=>{n.vertoBroadcast({nodeId:this.nodeId,channel:o,data:{liveArray:{command:"bootstrap",context:o,name:r}}})},i={nodeId:this.nodeId,channels:[o],handler:({data:i})=>{const s=h||this._retrieveCallId(i,o);if(s&&n.calls.hasOwnProperty(s)){const a=n.calls[s];a._addChannel(o),a.extension=r,a.handleConferenceUpdate(i,t).then((t=>{"INVALID_PACKET"===t&&e()}))}}},s=yield n.vertoSubscribe(i).catch((e=>{m.error("liveArray subscription error:",e)}));$e(s,o)&&e();break}case"conference-liveArray-part":{let t=null;if(o&&n._existsSubscription(i,o)){const{callId:s=null}=n.subscriptions[i][o];if(t=n.calls[s]||null,null!==s){const i={type:N.conferenceUpdate,action:V.Leave,conferenceName:r,participantId:Number(l),role:u};Q(e.SwEvent.Notification,i,s,!1)||Q(e.SwEvent.Notification,i,n.uuid),null===t&&z(e.SwEvent.Notification,null,s)}}const s=[o,a,c,d];n.vertoUnsubscribe({nodeId:this.nodeId,channels:s}).then((({unsubscribedChannels:e=[]})=>{t&&(t.channels=t.channels.filter((t=>!e.includes(t))))})).catch((e=>{m.error("liveArray unsubscribe error:",e)}));break}}}))}_handleSessionEvent(t){switch(t.contentType){case"layout-info":case"layer-info":ct(this.session,t);break;case"logo-info":{const n={type:N.conferenceUpdate,action:V.LogoInfo,logo:t.logoURL};Q(e.SwEvent.Notification,n,this.session.uuid);break}}}}ft.retriedConnect=0,ft.retriedRegister=0,ft.receivedAuthenticationRequired=0;class mt extends gt{constructor(e){super(e),this.relayProtocol="verto-protocol",this.timeoutErrorCode=-329990,this.handleLoginOnSocketOpen=()=>n(this,void 0,void 0,(function*(){this._idle=!1;const{autoReconnect:e=!0}=this.options;yield this.login({onSuccess:()=>{this._autoReconnect=e}})})),this.handleAnonymousLoginOnSocketOpen=()=>n(this,void 0,void 0,(function*(){this._idle=!1,yield this.login()})),window.addEventListener("beforeunload",(e=>{this.calls&&Object.keys(this.calls).forEach((e=>{this.calls[e]&&(m.info(`Hanging up call due to window unload: ${e}`),this.calls[e].hangup({},!0))}))}))}validateOptions(){return E(this.options)||T(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 pt(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!!T(this.options)||Boolean(e.destinationNumber)}_onSocketOpen(){return n(this,void 0,void 0,(function*(){return E(this.options)?this.handleLoginOnSocketOpen():T(this.options)?this.handleAnonymousLoginOnSocketOpen():void 0}))}_onSocketMessage(e){new ft(this).handleMessage(e)}}class bt extends mt{constructor(e){super(e),m.info(`SDK version: ${ue}`)}newCall(e){return super.newCall(e)}static webRTCInfo(){return We()}static webRTCSupportedBrowserList(){return[{operationSystem:"Android",supported:[{browserName:"Chrome",features:["audio"],supported:Ke.full},{browserName:"Firefox",features:["audio"],supported:Ke.partial},{browserName:"Safari",supported:Ke.not_supported},{browserName:"Edge",supported:Ke.not_supported}]},{operationSystem:"iOS",supported:[{browserName:"Chrome",supported:Ke.not_supported},{browserName:"Firefox",supported:Ke.not_supported},{browserName:"Safari",features:["video","audio"],supported:Ke.full},{browserName:"Edge",supported:Ke.not_supported}]},{operationSystem:"Linux",supported:[{browserName:"Chrome",features:["video","audio"],supported:Ke.full},{browserName:"Firefox",features:["audio"],supported:Ke.partial},{browserName:"Safari",supported:Ke.not_supported},{browserName:"Edge",supported:Ke.not_supported}]},{operationSystem:"MacOS",supported:[{browserName:"Chrome",features:["video","audio"],supported:Ke.full},{browserName:"Firefox",features:["audio"],supported:Ke.partial},{browserName:"Safari",features:["video","audio"],supported:Ke.full},{browserName:"Edge",features:["audio"],supported:Ke.partial}]},{operationSystem:"Windows",supported:[{browserName:"Chrome",features:["video","audio"],supported:Ke.full},{browserName:"Firefox",features:["audio"],supported:Ke.partial},{browserName:"Safari",supported:Ke.not_supported},{browserName:"Edge",features:["audio"],supported:Ke.partial}]}]}}class yt{static run(t){return n(this,void 0,void 0,(function*(){const n=x({}),i=x({}),s=new bt(t.credentials);yield s.connect(),s.on(e.SwEvent.Ready,n.resolve),s.on(e.SwEvent.Error,n.reject),s.on(e.SwEvent.MediaError,n.reject),s.on(e.SwEvent.MediaError,n.reject),s.on(e.SwEvent.Notification,(e=>{e.call&&e.call.sipCode>=400&&i.reject(new Error(e.call.sipReason))})),J(e.SwEvent.StatsReport,(e=>{i.resolve(yt.mapReport(e))})),yield n.promise,yield s.newCall({destinationNumber:t.texMLApplicationNumber,debug:!0});const o=yield i.promise;return yield s.disconnect(),o}))}static mapReport(e){var t,n,i,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,n,i;if(!(null===(t=e.remote.audio.inbound)||void 0===t?void 0:t[0]))return;f+=1;const s=null!==(n=e.remote.audio.inbound[0].jitter)&&void 0!==n?n:0,o=null!==(i=e.remote.audio.inbound[0].roundTripTime)&&void 0!==i?i: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=tt({jitter:1e3*I,rtt:1e3*C,packetsReceived:null!==(i=null===(n=null===(t=k.audio.inbound)||void 0===t?void 0:t[0])||void 0===n?void 0:n.packetsReceived)&&void 0!==i?i: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:nt(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=pt,e.ERROR_TYPE=U,e.NOTIFICATION_TYPE=N,e.PreCallDiagnosis=yt,e.TelnyxRTC=bt,Object.defineProperty(e,"__esModule",{value:!0})}));
|