@telnyx/webrtc 2.25.15 → 2.25.17
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 -1
- 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/util/interfaces.d.ts +13 -1
- package/lib/packages/js/src/Modules/Verto/webrtc/BaseCall.d.ts +4 -3
- 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/helpers.d.ts +3 -1
- package/lib/packages/js/src/Modules/Verto/webrtc/interfaces.d.ts +20 -5
- package/lib/packages/js/src/index.d.ts +2 -1
- package/package.json +2 -2
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 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=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,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)}},A="telnyx-voice-sdk-id";function P(){return sessionStorage.getItem(A)}var L,M,D;"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{sessionStorage.removeItem(A)})),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"},$={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 U,j,F,V,G;!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"}(U||(U={})),function(e){e.Participant="participant",e.Moderator="moderator"}(j||(j={})),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"}(F||(F={})),function(e){e.Video="videoinput",e.AudioIn="audioinput",e.AudioOut="audiooutput"}(V||(V={})),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"}(G||(G={}));const B="GLOBAL",H={},q=(e,t)=>`${e}|${t}`,W=(e,t=B)=>q(e,t)in H,K=(e,t,n=B)=>{const i=q(e,n);i in H||(H[i]=[]),H[i].push(t)},J=(e,t,n=B)=>{const i=function(s){z(e,i,n),t(s)};return i.prototype.targetRef=t,K(e,i,n)},z=(e,t,n=B)=>{if(!W(e,n))return!1;const i=q(e,n);if(S(t)){for(let e=H[i].length-1;e>=0;e--){const n=H[i][e];(t===n||n.prototype&&t===n.prototype.targetRef)&&H[i].splice(e,1)}}else H[i]=[];return 0===H[i].length&&delete H[i],!0},Q=(e,t,n=B,i=!0)=>{const s=i&&n!==B;if(!W(e,n))return s&&Q(e,t),!1;const o=q(e,n),r=H[o].length;if(!r)return s&&Q(e,t),!1;for(let e=r-1;e>=0;e--)H[o][e](t);return s&&Q(e,t),!0},Y=e=>{const t=q(e,"");Object.keys(H).filter((e=>0===e.indexOf(t))).forEach((e=>delete H[e]))};let X="undefined"!=typeof WebSocket?WebSocket:null;const Z=0,ee=1,te=2,ne=3;class ie{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,trickleIce:s,useCanaryRtcServer:o}=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||o)&&(this._useCanaryRtcServer=!0)}get connected(){return this._wsClient&&this._wsClient.readyState===ee}get connecting(){return this._wsClient&&this._wsClient.readyState===Z}get closing(){return this._wsClient&&this._wsClient.readyState===te}get closed(){return this._wsClient&&this._wsClient.readyState===ne}get isAlive(){return this.connecting||this.connected}get isDead(){return this.closing||this.closed}connect(){const t=new URL(this._host);let n=P();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 X(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(A,o)),this._unsetTimer(s.id),m.debug("RECV: \n",JSON.stringify(s,null,2),"\n"),G[`${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();J(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 se{buildRequest(e){this.request=Object.assign({jsonrpc:"2.0",id:c()},e)}}const oe={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 re extends se{constructor(e={}){if(super(),e.hasOwnProperty("dialogParams")){const n=t(e.dialogParams,["remoteSdp","localStream","remoteStream","onNotification","camId","micId","speakerId"]);for(const e in oe)e&&n.hasOwnProperty(e)&&(n[oe[e]]=n[e],delete n[e]);e.dialogParams=n}this.buildRequest({method:this.toString(),params:e})}}class ae extends re{constructor(e){super(),this.method=D.GatewayState;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}class ce{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 ae(P());this.pendingRequestId=e.request.id,this.gatewayStateTask=x({}),this.session.execute(e);const t=yield this.gatewayStateTask.promise;return!!t&&[G.REGISTER,G.REGED].includes(t)})),this.session=e,this.gatewayStateTask=x({}),this.session.on("telnyx.socket.message",this.onSocketMessage)}}class de extends re{constructor(e){super(),this.method=D.Ping;this.buildRequest({method:this.method,voice_sdk_id:e,params:{}})}}class le{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 ie(this),this.registerAgent=new ce(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}),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 K(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||(this.connection=new ie(this)),this._attachListeners(),this._autoReconnect=!0,this.connection.isAlive||this.connection.connect(),m.debug("Session connected. Connection initiated if not already alive. Auto-reconnect enabled.")}))}_handleLoginError(t){Q(e.SwEvent.Error,{error:t,sessionId:this.sessionid},this.uuid)}_onSocketOpen(){return n(this,void 0,void 0,(function*(){}))}onNetworkClose(){this.relayProtocol&&Y(this.relayProtocol);for(const e in this.subscriptions)Y(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],z(e,null,t)):(delete this.subscriptions[e],Y(e)))}_addSubscription(e,t=null,n){this._existsSubscription(e,n)||(this._existsSubscription(e)||(this.subscriptions[e]={}),this.subscriptions[e][n]={},S(t)&&K(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 de(P()))),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){K(e,t)}static off(e){z(e)}static uuid(){return c()}clearConnection(){this.connection=null}hasAutoReconnect(){return this._autoReconnect}}const ue=e=>navigator.mediaDevices.getUserMedia(e),he=e=>e&&e instanceof MediaStream,pe=(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)},ge=(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}})),ve=e=>{e&&"live"===e.readyState&&e.stop()},fe=e=>{he(e)&&e.getTracks().forEach(ve),e=null},me=e=>n(void 0,void 0,void 0,(function*(){m.info("RTCService.getUserMedia",e);const{audio:t,video:n}=e;if(!t&&!n)return null;try{return yield ue(e)}catch(e){throw m.error("getUserMedia error: ",e),e}})),be=(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===V.AudioIn||e===V.AudioOut,video:!e||e===V.Video}))(e)).catch((e=>(m.error(e),null)));if(i){if(fe(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})),ye=[[320,240],[640,360],[640,480],[1280,720],[1920,1080]],_e=(e,t,i)=>n(void 0,void 0,void 0,(function*(){const n=yield be(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})),Se=e=>{const t=navigator.mediaDevices.getSupportedConstraints();Object.keys(e).map((n=>{t.hasOwnProperty(n)&&null!==e[n]&&void 0!==e[n]||delete e[n]}))},we=(e,t)=>{if(!e)return!1;const{subscribed:n,alreadySubscribed:i}=Ce(e);return n.includes(t)||i.includes(t)},Ce=e=>{const t={subscribed:[],alreadySubscribed:[],unauthorized:[],unsubscribed:[],notSubscribed:[]};return Object.keys(t).forEach((n=>{t[n]=e[`${n}Channels`]||[]})),t},Ie=(e,t=null,n=null)=>{if(!he(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}}))},ke=e=>{Ie(e,"audio",!0)},Ee=e=>{Ie(e,"audio",!1)},Te=e=>{Ie(e,"audio",null)},Re=e=>((e,t=null)=>{if(!he(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 xe(){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 Oe;function Ae(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 Pe(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 Le(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"}(Oe||(Oe={}));var Me="2.25.15",De=Me;class Ne extends re{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:De,data:navigator.userAgent}};i&&(r.sessid=i),this.buildRequest({method:this.method,params:r})}}class $e extends re{constructor(e,t){super(),this.buildRequest({id:e,result:{method:t}})}}class Ue extends re{toString(){return D.Invite}}class je extends re{toString(){return D.Answer}}class Fe extends re{toString(){return D.Attach}}class Ve extends re{toString(){return D.Bye}}class Ge extends re{toString(){return D.Candidate}}class Be extends re{toString(){return D.EndOfCandidates}}class He extends re{toString(){return D.Modify}}class qe extends re{toString(){return D.Info}}class We extends re{toString(){return D.Broadcast}}class Ke extends re{toString(){return D.Subscribe}}class Je extends re{toString(){return D.Unsubscribe}}class ze extends se{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 Qe,Ye=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)}}}}));(Qe=Ye)&&Qe.__esModule&&Object.prototype.hasOwnProperty.call(Qe,"default")&&Qe.default;var Xe=Ye.WebRTCStats;function Ze(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 et(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 tt extends se{constructor(e,t){super(),this.buildRequest({type:"debug_report_start",debug_report_id:e,debug_report_version:1,call_id:t})}}class nt extends se{constructor(e,t){super(),this.buildRequest({type:"debug_report_stop",debug_report_id:e,debug_report_version:1,call_id:t})}}class it extends se{constructor(e,t){super(),this.buildRequest({type:"debug_report_data",debug_report_id:e,debug_report_version:1,debug_report_data:t})}}function st(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 ot(t,i){const s=c();let o=!1;const r=new Xe({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=Ze({jitter:1e3*h,rtt:1e3*p,packetsLost:v,packetsReceived:g});return{jitter:h,rtt:p,mos:f,quality:et(f),inboundAudio:d.inbound[0],outboundAudio:d.outbound[0],remoteInboundAudio:u.inbound[0],remoteOutboundAudio:u.outbound[0]}}(i),t.uuid),yield t.execute(new it(s,i))}));return{get isRunning(){return o},start:(e,c,d)=>n(this,void 0,void 0,(function*(){o?m.debug(`[${i}] Stats reporter already running, skipping start`):(yield t.execute(new tt(s,i)),r.on("timeline",a),yield new Promise((e=>setTimeout(e,500))),r.addConnection({pc:e,peerId:c,connectionId:d}),o=!0)})),stop:a=>n(this,void 0,void 0,(function*(){if(!o)return void m.debug(`[${i}] Stats reporter already stopped, skipping stop`);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 nt(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 rt=(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:at(r),currentLayerIdx:a};switch(i){case"layer-info":{const n=Object.assign({action:F.LayerInfo},c);Q(e.SwEvent.Notification,n,t.uuid);break}case"layout-info":{const n=Object.assign({action:F.LayoutInfo},c);Q(e.SwEvent.Notification,n,t.uuid);break}}},at=e=>{const t=JSON.stringify(e).replace(/memberID/g,"participantId").replace(/ID"/g,'Id"').replace(/POS"/g,'Pos"');return _(t)};class ct{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=t=>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)}!this._restartedIceOnConnectionStateFailed&&"failed"===t&&this._session.hasAutoReconnect()&&(yield this.instance.restartIce(),this._restartedIceOnConnectionStateFailed=!0,m.debug("Peer connection state failed. ICE restarted.")),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=e=>{m.debug(`[${(new Date).toISOString()}] ICE Connection State`,this.instance.iceConnectionState)},this._handleIceGatheringStateChange=e=>{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 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 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(t){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&&pe(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&&he(this.options.localStream)&&(m.info("Muting local audio tracks on start"),Ee(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=ot(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(he(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&&pe(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(he(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 _e(n,o,V.AudioIn).catch((e=>null)),n&&("boolean"==typeof e&&(e={}),e.deviceId={exact:n})),s&&(s=yield _e(s,r,V.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 dt=De;class lt{constructor(e,t){this.session=e,this.id="",this.state=U[U.New],this.prevState="",this.channels=[],this.role=j.Participant,this.extension=null,this._state=U.New,this._prevState=U.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 n in t.constraints)if(t.constraints.hasOwnProperty(n)&&t.constraints[n]!==e[n])return;t.callback(e)}}))}))}))};const{iceServers:n,speaker:i,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({},$,{audio:u,video:h,iceServers:(null==t?void 0:t.iceServers)&&Array.isArray(t.iceServers)?t.iceServers:n,localElement:c,remoteElement:d,micId:s,micLabel:o,camId:r,camLabel:a,speakerId:i,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=Ae(this.options.ringtoneFile,"_ringtone"),this._ringback=Ae(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!Re(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 ct(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 ct(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(){Pe(this._ringtone)}stopRingtone(){Le(this._ringtone)}playRingback(){Pe(this._ringback)}stopRingback(){Le(this._ringback)}hangup(t,n){var i,s,o;let r=t||{},a=!1!==n;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:[]],this.setState(U.Hangup);const c=()=>{var e;return m.debug(`[${this.id}] Closing peer from hangup`),null===(e=this.peer)||void 0===e||e.close(),this.setState(U.Destroy)};if(this.stopRingtone(),this.stopRingback(),a){const t=new Ve({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=>{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 He({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 He({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 He({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 qe({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 qe({sessid:this.session.sessionid,msg:n,dialogParams:this.options});this._execute(i)}muteAudio(){Ee(this.options.localStream)}unmuteAudio(){ke(this.options.localStream)}toggleAudioMute(){Te(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 ue({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,Ie(e,"video",!1)}unmuteVideo(){var e;e=this.options.localStream,Ie(e,"video",!0)}toggleVideoMute(){var e;e=this.options.localStream,Ie(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 ue({video:{deviceId:{exact:e}}}),i=t.getVideoTracks()[0];n.replaceTrack(i);const{localElement:s,localStream:o}=this.options;pe(s,t),this.options.camId=e,o.getAudioTracks().forEach((e=>t.addTrack(e))),o.getVideoTracks().forEach((e=>e.stop())),this.options.localStream=t}}))}deaf(){Ee(this.options.remoteStream)}undeaf(){ke(this.options.remoteStream)}toggleDeaf(){Te(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=U[this._state].toLowerCase(),this.prevState=U[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 U.Purge:m.debug(`Call ${this.id} hangup call due to purge state`),this.hangup({cause:"PURGE",causeCode:"01"},!1);break;case U.Active:setTimeout((()=>{const{remoteElement:e,speakerId:t}=this.options;e&&t&&ge(e,t)}),0);break;case U.Destroy:this._finalize()}}handleMessage(t){const{method:n,params:i}=t;switch(n){case D.Answer:if(this.gotAnswer=!0,this._state>=U.Active)return;this._state>=U.Early&&this.setState(U.Active),this.gotEarly||this._onRemoteSdp(i.sdp),this.stopRingback(),this.stopRingtone();break;case D.Media:if(this._state>=U.Early)return;this.gotEarly=!0,this._onRemoteSdp(i.sdp);break;case D.Display:case D.Attach:{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:F.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:F.Bootstrap,participants:c});break}case"add":this._dispatchConferenceUpdate(Object.assign({action:F.Add,callId:s,index:o},y(i)));break;case"modify":this._dispatchConferenceUpdate(Object.assign({action:F.Modify,callId:s,index:o},y(i)));break;case"del":this._dispatchConferenceUpdate(Object.assign({action:F.Delete,callId:s,index:o},y(i)));break;case"clear":this._dispatchConferenceUpdate({action:F.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:F.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)}));we(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,rt(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)}));we(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(U.Active):this.setState(U.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(U.Early),this.gotAnswer&&this.setState(U.Active)})).catch((e=>{m.error("Call setRemoteDescription Error: ",e),this.hangup()}))}))}_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-${dt}`};switch(s){case L.Offer:this.setState(U.Requesting),o=new Ue(r);break;case L.Answer:this.setState(U.Answering),o=!0===this.options.attach?new Fe(r):new je(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(U.Trying):this.setState(U.Active)})).catch((e=>{m.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 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-${dt}`};switch(n){case L.Offer:this.setState(U.Requesting),i=new Ue(s);break;case L.Answer:this.setState(U.Answering),i=!0===this.options.attach?new Fe(s):new je(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(U.Trying):this.setState(U.Active)})).catch((e=>{m.error(`${this.id} - Sending ${n} 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?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 Ge({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 Be({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=st(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&&pe(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=st(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&&pe(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, call is not recoverable. Handling reconnection according to keepConnectionAliveOnSocketClose option")}_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,K(e.SwEvent.MediaError,this._onMediaError,this.id),K(e.SwEvent.PeerConnectionFailureError,this._onPeerConnectionFailureError,this.id),K(e.SwEvent.PeerConnectionSignalingStateClosed,this._onPeerConnectionSignalingStateClosed,this.id),S(s)&&K(e.SwEvent.Notification,s.bind(this),this.id),this.setState(U.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;fe(n),fe(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")}}lt.setStateTelnyx=e=>{if(e){switch(e._state){case U.Requesting:case U.Recovering:case U.Trying:case U.Early:e.state="connecting";break;case U.Active:e.state="active";break;case U.Held:e.state="held";break;case U.Hangup:case U.Destroy:e.state="done";break;case U.Answering:e.state="ringing";break;case U.New:e.state="new"}return e}};class ut extends lt{constructor(){super(...arguments),this._statsInterval=null,this.sendConversationMessage=(e,t)=>this.session.execute(new ze(e,t))}hangup(e={},t=!0){this.screenShare instanceof ut&&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 ut(this.session,a),this.screenShare.invite(),this.screenShare}))}stopScreenShare(){this.screenShare instanceof ut&&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)&&ge(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 ht extends le{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 fe(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(U.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(J(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 be().catch((t=>(Q(e.SwEvent.MediaError,t,this.uuid),[])))}getVideoDevices(){return be(V.Video).catch((t=>(Q(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioInDevices(){return be(V.AudioIn).catch((t=>(Q(e.SwEvent.MediaError,t,this.uuid),[])))}getAudioOutDevices(){return be(V.AudioOut).catch((t=>(m.error("getAudioOutDevices",t),Q(e.SwEvent.MediaError,t,this.uuid),[])))}validateDeviceId(e,t,n){return _e(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<ye.length;e++){const[n,s]=ye[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 fe(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 Se(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 _e(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 We({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 Ke({sessid:this.sessionid,eventChannel:t});e&&(n.targetNodeId=e);const s=yield this.execute(n),{unauthorized:o=[],subscribed:r=[]}=Ce(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 Je({sessid:this.sessionid,eventChannel:t});e&&(n.targetNodeId=e);const i=yield this.execute(n),{unsubscribed:s=[],notSubscribed:o=[]}=Ce(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 ut.setStateTelnyx(e)}}class pt{constructor(e,t){this.code=t,this.message=e}}class gt extends re{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:De,data:navigator.userAgent}};o&&(a.sessid=o),i&&(a.target_version_id=i),this.buildRequest({method:this.method,params:a})}}const vt=De;class ft{constructor(e){this.session=e,this.handleLogin=()=>n(this,void 0,void 0,(function*(){const{login:e,password:t,passwd:n,login_token:i,userVariables:s}=this.session.options,o=new Ne(e,t||n,i,this.session.sessionid,s,!!P()),r=yield this.session.execute(o).catch(this.session.handleLoginError);r&&(this.session.sessionid=r.sessid)})),this.handleAnonymousLogin=()=>n(this,void 0,void 0,(function*(){const{anonymous_login:e}=this.session.options,t=new gt({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:!!P()}),n=yield this.session.execute(t).catch(this.session.handleLoginError);n&&(this.session.sessionid=n.sessid)}))}_ack(e,t){const n=new $e(e,t);this.nodeId&&(n.targetNodeId=this.nodeId),this.session.execute(n)}reconnectDelay(){return 1e3*k(2,6)}handleMessage(t){var i,s,o,r;const{session:a}=this,{id:c,method:d,params:l={},voice_sdk_id:u}=t,h=null==l?void 0:l.callID,p=null==l?void 0:l.eventChannel,g=null==l?void 0:l.eventType,v=d===D.Attach,f=d===D.Punt;let b=!1,y=!1;if("channelPvtData"===g)return this._handlePvtEvent(l.pvtData);if(h&&a.calls.hasOwnProperty(h)){if(!v)return a.calls[h].handleMessage(t),void this._ack(c,d);{const e=a.calls[h];y=null===(i=e.peer)||void 0===i?void 0:i.restartedIceOnConnectionStateFailed,b=(a.options.keepConnectionAliveOnSocketClose||e.options.keepConnectionAliveOnSocketClose)&&Boolean(null===(s=e.peer)||void 0===s?void 0:s.instance)&&!e.signalingStateClosed&&!y,b?m.info(`[${(new Date).toISOString()}][${h}] re-attaching call due to ATTACH and keepConnectionAliveOnSocketClose`):(e.signalingStateClosed?m.info(`[${(new Date).toISOString()}][${h}] Hanging up the and recreating call due to ATTACH - signalingState is closed`):y&&m.info(`[${(new Date).toISOString()}][${h}] Hanging up the call due to ATTACH - connection had restarted ICE on connection state failed`),e.hangup({},y),m.debug(`[${(new Date).toISOString()}][${h}] Call hangup bye message ${y?"executed":"not executed"}`))}}if(f&&a.options.keepConnectionAliveOnSocketClose)return m.info(`[${(new Date).toISOString()}][${h}] keeping session calls alive due to PUNT and keepConnectionAliveOnSocketClose. Disconnecting base session...`),this.session.socketDisconnect(),void this._ack(c,d);const _=(e=!0)=>{var t,n,i,s,o,r;const c={audio:!0,video:a.options.video,remoteSdp:l.sdp,destinationNumber:l.callee_id_number,remoteCallerName:l.caller_id_name,remoteCallerNumber:l.caller_id_number,callerName:l.callee_id_name,callerNumber:l.callee_id_number,attach:v,mediaSettings:l.mediaSettings,debug:null!==(t=a.options.debug)&&void 0!==t&&t,debugOutput:null!==(n=a.options.debugOutput)&&void 0!==n?n:"socket",trickleIce:null!==(i=a.options.trickleIce)&&void 0!==i&&i,prefetchIceCandidates:null!==(s=a.options.prefetchIceCandidates)&&void 0!==s&&s,forceRelayCandidate:null!==(o=a.options.forceRelayCandidate)&&void 0!==o&&o,keepConnectionAliveOnSocketClose:null!==(r=a.options.keepConnectionAliveOnSocketClose)&&void 0!==r&&r};e&&(c.id=h),l.telnyx_call_control_id&&(c.telnyxCallControlId=l.telnyx_call_control_id),l.telnyx_session_id&&(c.telnyxSessionId=l.telnyx_session_id),l.telnyx_leg_id&&(c.telnyxLegId=l.telnyx_leg_id),l.client_state&&(c.clientState=l.client_state),l.dialogParams&&l.dialogParams.custom_headers&&l.dialogParams.custom_headers.length&&(c.customHeaders=l.dialogParams.custom_headers);const d=new ut(a,c);return d.nodeId=this.nodeId,d},S=new ae(u),w=new de(u);switch(d){case D.Ping:this.session.setPingReceived(),this.session.execute(w).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..."),E(this.session.options)?this.handleLogin():T(this.session.options)&&this.handleAnonymousLogin(),ft.receivedAuthenticationRequired=-1))}))));break;case D.Punt:a.disconnect();break;case D.Invite:{const e=_();e.playRingtone(),e.setState(U.Ringing),e.direction=M.Inbound,this._ack(c,d);break}case D.Attach:{if(b)return this.session.execute(new Fe({sessid:this.session.sessionid,sdp:this.session.calls[h].peer.instance.localDescription.sdp,dialogParams:this.session.calls[h].options,"User-Agent":`Web-${vt}`})),void(null===(o=this.session.calls[h].peer)||void 0===o||o.restartStatsReporter());if(m.info(`[${(new Date).toISOString()}][${h}] Re-creating call instance.`),null===(r=this.session.calls[h])||void 0===r?void 0:r.creatingPeer)return void m.debug(`[${(new Date).toISOString()}][${h}] Call is already creating a peer, skip recreating call instance.`);let e;this.session.autoRecoverCalls?y?(m.debug(`[${(new Date).toISOString()}][${h}] Call had restarted ICE on connection state failed. Re-inviting to become active leg. due to keepConnectionAliveOnSocketClose.`),e=_(!1),e.invite()):(m.debug(`[${(new Date).toISOString()}][${h}] Call is not in an unrecoverable state. Answering.`),e=_(),e.answer()):(e=_(),e.setState(U.Recovering)),e.handleMessage(t);break}case D.Event:case"webrtc.event":if(!p)return void m.error("Verto received an unknown event:",l);const i=a.relayProtocol,s=p.split(".")[0];a._existsSubscription(i,p)?Q(i,l,p):p===a.sessionid?this._handleSessionEvent(l.eventData):a._existsSubscription(i,s)?Q(i,l,s):a.calls.hasOwnProperty(p)?a.calls[p].handleMessage(t):Q(e.SwEvent.Notification,l,a.uuid);break;case D.Info:l.type=N.generic,Q(e.SwEvent.Notification,l,a.uuid);break;case D.ClientReady:this.session.execute(S);break;default:{const n=R(t);if(n){switch(n){case G.REGISTER:case G.REGED:a.connection.previousGatewayState!==G.REGED&&a.connection.previousGatewayState!==G.REGISTER&&(this.session._triggerKeepAliveTimeoutCheck(),ft.retriedRegister=0,l.type=N.vertoClientReady,Q(e.SwEvent.Ready,l,a.uuid),a.options.trickleIce&&(m.debug("Trickle ICE is enabled. Checking Gateway support"),this.session.execute(new Ge({candidate:""})).catch((e=>{e.code===this.session.invalidMethodErrorCode?(m.warn("Trickle ICE is not supported by the server, disabling it."),m.debug("Trickle ICE check error:",JSON.stringify(e,null,2)),a.options.trickleIce=!1):m.debug("Trickle ICE check:",JSON.stringify(e,null,2))}))));break;case G.UNREGED:case G.NOREG:if(ft.retriedRegister+=1,5===ft.retriedRegister){ft.retriedRegister=0,Q(e.SwEvent.Error,{error:new pt("Fail to register the user, the server tried 5 times","UNREGED|NOREG"),sessionId:a.sessionid},a.uuid);break}setTimeout((()=>{this.session.execute(S)}),this.reconnectDelay());break;case G.FAILED:case G.FAIL_WAIT:if(a.connection.previousGatewayState!==G.FAILED&&a.connection.previousGatewayState!==G.FAIL_WAIT){if(!this.session.hasAutoReconnect()){ft.retriedConnect=0,Q(e.SwEvent.Error,{error:new pt("Fail to connect the server, the server tried 5 times","FAILED|FAIL_WAIT"),sessionId:a.sessionid},a.uuid);break}if(ft.retriedConnect+=1,5===ft.retriedConnect){ft.retriedConnect=0,Q(e.SwEvent.Error,{error:new Error("Connection Retry Failed"),sessionId:a.sessionid},a.uuid);break}setTimeout((()=>{if(m.debug(`Reconnecting... Retry ${ft.retriedConnect} of 5`),this.session.options.keepConnectionAliveOnSocketClose){const e=Object.values(a.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)}));we(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:F.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":rt(this.session,t);break;case"logo-info":{const n={type:N.conferenceUpdate,action:F.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 ht{constructor(e){super(e),this.relayProtocol="verto-protocol",this.timeoutErrorCode=-329990,this.handleLoginOnSocketOpen=()=>n(this,void 0,void 0,(function*(){this._idle=!1;const{login:e,password:t,passwd:n,login_token:i,userVariables:s,autoReconnect:o=!0}=this.options,r=new Ne(e,t||n,i,this.sessionid,s,!!P()),a=yield this.execute(r).catch(this._handleLoginError);a&&(this._autoReconnect=o,this.sessionid=a.sessid)})),this.handleAnonymousLoginOnSocketOpen=()=>n(this,void 0,void 0,(function*(){this._idle=!1;const{anonymous_login:e}=this.options,t=new gt({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:!!P()}),n=yield this.execute(t).catch(this._handleLoginError);n&&(this.sessionid=n.sessid)})),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 ut(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: ${Me}`)}newCall(e){return super.newCall(e)}static webRTCInfo(){return xe()}static webRTCSupportedBrowserList(){return[{operationSystem:"Android",supported:[{browserName:"Chrome",features:["audio"],supported:Oe.full},{browserName:"Firefox",features:["audio"],supported:Oe.partial},{browserName:"Safari",supported:Oe.not_supported},{browserName:"Edge",supported:Oe.not_supported}]},{operationSystem:"iOS",supported:[{browserName:"Chrome",supported:Oe.not_supported},{browserName:"Firefox",supported:Oe.not_supported},{browserName:"Safari",features:["video","audio"],supported:Oe.full},{browserName:"Edge",supported:Oe.not_supported}]},{operationSystem:"Linux",supported:[{browserName:"Chrome",features:["video","audio"],supported:Oe.full},{browserName:"Firefox",features:["audio"],supported:Oe.partial},{browserName:"Safari",supported:Oe.not_supported},{browserName:"Edge",supported:Oe.not_supported}]},{operationSystem:"MacOS",supported:[{browserName:"Chrome",features:["video","audio"],supported:Oe.full},{browserName:"Firefox",features:["audio"],supported:Oe.partial},{browserName:"Safari",features:["video","audio"],supported:Oe.full},{browserName:"Edge",features:["audio"],supported:Oe.partial}]},{operationSystem:"Windows",supported:[{browserName:"Chrome",features:["video","audio"],supported:Oe.full},{browserName:"Firefox",features:["audio"],supported:Oe.partial},{browserName:"Safari",supported:Oe.not_supported},{browserName:"Edge",features:["audio"],supported:Oe.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))})),K(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=Ze({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:et(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=ut,e.PreCallDiagnosis=yt,e.TelnyxRTC=bt,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=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,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 M,L,D;"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{sessionStorage.removeItem(P)})),function(e){e.Offer="offer",e.Answer="answer"}(M||(M={})),function(e){e.Inbound="inbound",e.Outbound="outbound"}(L||(L={})),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)},z=(e,t,n=H)=>{const i=function(s){Y(e,i,n),t(s)};return i.prototype.targetRef=t,J(e,i,n)},Y=(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,trickleIce:s,useCanaryRtcServer:o}=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||o)&&(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();z(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.17",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}),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 Y(e,t,this.uuid),this}connect(){return n(this,void 0,void 0,(function*(){this.connection||(this.connection=new se(this)),this._attachListeners(),this._autoReconnect=!0,this.connection.isAlive||this.connection.connect(),m.debug("Session connected. Connection initiated if not already alive. Auto-reconnect enabled.")}))}_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((()=>this.connect()),this.reconnectDelay))}_onSocketMessage(e){}_removeSubscription(e,t){this._existsSubscription(e,t)&&(t?(delete this.subscriptions[e][t],Y(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){Y(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()},Me=e=>{xe(e)&&e.getTracks().forEach(Ae),e=null},Le=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(Me(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:!!Le}}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 ze(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 Ye(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*(){o?m.debug(`[${i}] Stats reporter already running, skipping start`):(yield t.execute(new it(s,i)),r.on("timeline",a),yield new Promise((e=>setTimeout(e,500))),r.addConnection({pc:e,peerId:c,connectionId:d}),o=!0)})),stop:a=>n(this,void 0,void 0,(function*(){if(!o)return void m.debug(`[${i}] Stats reporter already stopped, skipping stop`);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===M.Offer}get isAnswer(){return this.type===M.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:M.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:M.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 Le(e)}))}_isOffer(){return this.type===M.Offer}_isAnswer(){return this.type===M.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=L.Outbound,this.options.trickleIce&&this._resetTrickleIceCandidateState(),performance.mark("peer-creation-start"),this.peer=new lt(M.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=L.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(M.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(){ze(this._ringtone)}stopRingtone(){Ye(this._ringtone)}playRingback(){ze(this._ringback)}stopRingback(){Ye(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:"USER_BUSY",causeCode:17});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){var n,i,s,o;const{method:r,params:a}=t;switch(r){case D.Answer:if(this.gotAnswer=!0,this._state>=$.Active)return;this._state>=$.Early&&this.setState($.Active),this.gotEarly||this._onRemoteSdp(a.sdp),this.stopRingback(),this.stopRingtone();break;case D.Media:if(this._state>=$.Early)return;this.gotEarly=!0,this._onRemoteSdp(a.sdp);break;case D.Attach:if(null===(n=this.peer)||void 0===n?void 0:n.isConnectionHealthy()){const e=null===(s=null===(i=this.peer)||void 0===i?void 0:i.instance)||void 0===s?void 0:s.localDescription,t=new me({sessid:this.session.sessionid,sdp:e,dialogParams:this.options,"User-Agent":`Web-${ut}`});return this.session.execute(t),void(null===(o=this.peer)||void 0===o||o.restartStatsReporter())}break;case D.Display:{const{display_name:t,display_number:n,display_direction:i}=a;this.extension=n;const s=i===L.Inbound?L.Outbound:L.Inbound,o={type:N[r],call:this,displayName:t,displayNumber:n,displayDirection:s};Q(e.SwEvent.Notification,o,this.id)||Q(e.SwEvent.Notification,o,this.session.uuid);break}case D.Candidate:this._addIceCandidate(a);break;case D.Info:case D.Event:{const t=Object.assign(Object.assign({},a),{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(),a.telnyx_call_control_id&&(this.options.telnyxCallControlId=a.telnyx_call_control_id),a.telnyx_session_id&&(this.options.telnyxSessionId=a.telnyx_session_id),a.telnyx_leg_id&&(this.options.telnyxLegId=a.telnyx_leg_id);break;case D.Bye:const t=a.client_state||a.clientState;t&&(this.options.clientState=t),this.stopRingback(),this.stopRingtone(),this.hangup(a,!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:M.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()}))}))}_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 M.Offer:this.setState($.Requesting),o=new ve(r);break;case M.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===M.Offer?this.setState($.Trying):this.setState($.Active)})).catch((e=>{m.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 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 M.Offer:this.setState($.Requesting),i=new ve(s);break;case M.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===M.Offer?this.setState($.Trying):this.setState($.Active)})).catch((e=>{m.error(`${this.id} - Sending ${n} 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?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;Me(n),Me(i),Y(e.SwEvent.MediaError,null,this.id),Y(e.SwEvent.PeerConnectionFailureError,null,this.id),Y(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 Le({audio:e,video:t});return Me(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(z(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 Le({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 Me(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.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=L.Inbound,this._ack(o,r);break}case D.Attach:{if(!h){return g().answer(),void this._ack(o,r)}if(p)return m.info(`[${(new Date).toISOString()}][${d}] keeping existing call alive on ATTACH due to healthy peer connection.`),h.handleMessage(t),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:{if(d&&s.calls.hasOwnProperty(d))return s.calls[d].handleMessage(t),void this._ack(o,r);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),s.options.trickleIce&&(m.debug("Trickle ICE is enabled. Checking Gateway support"),this.session.execute(new ye({candidate:""})).catch((e=>{e.code===this.session.invalidMethodErrorCode?(m.warn("Trickle ICE is not supported by the server, disabling it."),m.debug("Trickle ICE check error:",JSON.stringify(e,null,2)),s.options.trickleIce=!1):m.debug("Trickle ICE check:",JSON.stringify(e,null,2))}))));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&&Y(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})}));
|