@voicenter-team/opensips-js 1.0.86 → 1.0.87
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.d.ts +7 -0
- package/dist/opensips-js.cjs.js +10 -10
- package/dist/opensips-js.es.js +71 -53
- package/dist/opensips-js.iife.js +18 -18
- package/dist/opensips-js.umd.js +18 -18
- package/package.json +1 -1
- package/src/types/listeners.d.ts +4 -0
package/dist/opensips-js.cjs.js
CHANGED
@@ -69,10 +69,10 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
69
69
|
`),o+="CSeq: ".concat(He.cseq," ").concat(He.method,`\r
|
70
70
|
`),o+=`\r
|
71
71
|
`,t_.send(o)}var Ou={};function kc(c,s){var r;if(typeof Symbol>"u"||c[Symbol.iterator]==null){if(Array.isArray(c)||(r=tm(c))||s&&c&&typeof c.length=="number"){r&&(c=r);var o=0,a=function(){};return{s:a,n:function(){return o>=c.length?{done:!0}:{done:!1,value:c[o++]}},e:function(d){throw d},f:a}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
72
|
-
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var t=!0,n=!1,p;return{s:function(){r=c[Symbol.iterator]()},n:function(){var d=r.next();return t=d.done,d},e:function(d){n=!0,p=d},f:function(){try{!t&&r.return!=null&&r.return()}finally{if(n)throw p}}}}function tm(c,s){if(c){if(typeof c=="string")return Lc(c,s);var r=Object.prototype.toString.call(c).slice(8,-1);if(r==="Object"&&c.constructor&&(r=c.constructor.name),r==="Map"||r==="Set")return Array.from(c);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Lc(c,s)}}function Lc(c,s){(s==null||s>c.length)&&(s=c.length);for(var r=0,o=new Array(s);r<s;r++)o[r]=c[r];return o}var or=It(),vn=it,Sa=is(),$c=Bs(),ya=Iu,Aa=qs;Ou.settings={authorization_user:null,password:null,realm:null,ha1:null,authorization_jwt:null,display_name:null,uri:null,contact_uri:null,instance_id:null,use_preloaded_route:!1,session_timers:!0,session_timers_refresh_method:vn.UPDATE,session_timers_force_refresher:!1,no_answer_timeout:60,register:!0,register_expires:600,registrar_server:null,sockets:null,connection_recovery_max_interval:vn.CONNECTION_RECOVERY_MAX_INTERVAL,connection_recovery_min_interval:vn.CONNECTION_RECOVERY_MIN_INTERVAL,extra_headers:null,via_host:"".concat(or.createRandomToken(12),".invalid")};var ql={mandatory:{sockets:function(s){var r=[];if(ya.isSocket(s))r.push({socket:s});else if(Array.isArray(s)&&s.length){var o=kc(s),a;try{for(o.s();!(a=o.n()).done;){var t=a.value;Object.prototype.hasOwnProperty.call(t,"socket")&&ya.isSocket(t.socket)?r.push(t):ya.isSocket(t)&&r.push({socket:t})}}catch(n){o.e(n)}finally{o.f()}}else return;return r},uri:function(s){/^sip:/i.test(s)||(s="".concat(vn.SIP,":").concat(s));var r=$c.parse(s);if(r)return r.user?r:void 0}},optional:{authorization_user:function(s){if(Sa.parse('"'.concat(s,'"'),"quoted_string")!==-1)return s},authorization_jwt:function(s){if(typeof s=="string")return s},user_agent:function(s){if(typeof s=="string")return s},connection_recovery_max_interval:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},connection_recovery_min_interval:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},contact_uri:function(s){if(typeof s=="string"){var r=Sa.parse(s,"SIP_URI");if(r!==-1)return r}},display_name:function(s){return s},instance_id:function(s){if(/^uuid:/i.test(s)&&(s=s.substr(5)),Sa.parse(s,"uuid")!==-1)return s},no_answer_timeout:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},session_timers:function(s){if(typeof s=="boolean")return s},session_timers_refresh_method:function(s){if(typeof s=="string"&&(s=s.toUpperCase(),s===vn.INVITE||s===vn.UPDATE))return s},session_timers_force_refresher:function(s){if(typeof s=="boolean")return s},password:function(s){return String(s)},realm:function(s){return String(s)},ha1:function(s){return String(s)},register:function(s){if(typeof s=="boolean")return s},register_expires:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},registrar_server:function(s){/^sip:/i.test(s)||(s="".concat(vn.SIP,":").concat(s));var r=$c.parse(s);if(r)return r.user?void 0:r},use_preloaded_route:function(s){if(typeof s=="boolean")return s},extra_headers:function(s){var r=[];if(Array.isArray(s)&&s.length){var o=kc(s),a;try{for(o.s();!(a=o.n()).done;){var t=a.value;typeof t=="string"&&r.push(t)}}catch(n){o.e(n)}finally{o.f()}}else return;return r}}};Ou.load=function(c,s){for(var r in ql.mandatory)if(s.hasOwnProperty(r)){var o=s[r],a=ql.mandatory[r](o);if(a!==void 0)c[r]=a;else throw new Aa.ConfigurationError(r,o)}else throw new Aa.ConfigurationError(r);for(var t in ql.optional)if(s.hasOwnProperty(t)){var n=s[t];if(or.isEmpty(n))continue;var p=ql.optional[t](n);if(p!==void 0)c[t]=p;else throw new Aa.ConfigurationError(t,n)}};function yo(c){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?yo=function(r){return typeof r}:yo=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},yo(c)}function sm(c,s){if(!(c instanceof s))throw new TypeError("Cannot call a class as a function")}function Hc(c,s){for(var r=0;r<s.length;r++){var o=s[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(c,o.key,o)}}function Fc(c,s,r){return s&&Hc(c.prototype,s),r&&Hc(c,r),c}function nm(c,s){if(typeof s!="function"&&s!==null)throw new TypeError("Super expression must either be null or a function");c.prototype=Object.create(s&&s.prototype,{constructor:{value:c,writable:!0,configurable:!0}}),s&&hu(c,s)}function hu(c,s){return hu=Object.setPrototypeOf||function(o,a){return o.__proto__=a,o},hu(c,s)}function rm(c){var s=lm();return function(){var o=Uo(c),a;if(s){var t=Uo(this).constructor;a=Reflect.construct(o,arguments,t)}else a=o.apply(this,arguments);return im(this,a)}}function im(c,s){return s&&(yo(s)==="object"||typeof s=="function")?s:s_(c)}function s_(c){if(c===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return c}function lm(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch{return!1}}function Uo(c){return Uo=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Uo(c)}var om=ft.EventEmitter,am=_t,pt=it,um=Jh,jc=ip,Vc=Tp,qc=Dp,Ca=ol,cm=Lp,Bl=It(),fm=qs,_m=Bs(),hm=Zf,Ra=Ts,dm=Kp,Ia=Ou,je=new am("UA"),Tt={STATUS_INIT:0,STATUS_READY:1,STATUS_USER_CLOSED:2,STATUS_NOT_READY:3,CONFIGURATION_ERROR:1,NETWORK_ERROR:2},pm=function(c){nm(r,c);var s=rm(r);Fc(r,null,[{key:"C",get:function(){return Tt}}]);function r(o){var a;if(sm(this,r),je.debug("new() [configuration:%o]",o),a=s.call(this),a._cache={credentials:{}},a._configuration=Object.assign({},Ia.settings),a._dynConfiguration={},a._dialogs={},a._applicants={},a._sessions={},a._transport=null,a._contact=null,a._status=Tt.STATUS_INIT,a._error=null,a._transactions={nist:{},nict:{},ist:{},ict:{}},a._data={},a._closeTimer=null,o===void 0)throw new TypeError("Not enough arguments");try{a._loadConfig(o)}catch(t){throw a._status=Tt.STATUS_NOT_READY,a._error=Tt.CONFIGURATION_ERROR,t}return a._registrator=new um(s_(a)),a}return Fc(r,[{key:"start",value:function(){je.debug("start()"),this._status===Tt.STATUS_INIT?this._transport.connect():this._status===Tt.STATUS_USER_CLOSED?(je.debug("restarting UA"),this._closeTimer!==null&&(clearTimeout(this._closeTimer),this._closeTimer=null,this._transport.disconnect()),this._status=Tt.STATUS_INIT,this._transport.connect()):this._status===Tt.STATUS_READY?je.debug("UA is in READY status, not restarted"):je.debug("ERROR: connection is down, Auto-Recovery system is trying to reconnect"),this._dynConfiguration.register=this._configuration.register}},{key:"register",value:function(){je.debug("register()"),this._dynConfiguration.register=!0,this._registrator.register()}},{key:"unregister",value:function(a){je.debug("unregister()"),this._dynConfiguration.register=!1,this._registrator.unregister(a)}},{key:"registrator",value:function(){return this._registrator}},{key:"isRegistered",value:function(){return this._registrator.registered}},{key:"isConnected",value:function(){return this._transport.isConnected()}},{key:"call",value:function(a,t){je.debug("call()");var n=new jc(this);return n.connect(a,t),n}},{key:"sendMessage",value:function(a,t,n){je.debug("sendMessage()");var p=new Vc(this);return p.send(a,t,n),p}},{key:"sendOptions",value:function(a,t,n){je.debug("sendOptions()");var p=new qc(this);return p.send(a,t,n),p}},{key:"terminateSessions",value:function(a){je.debug("terminateSessions()");for(var t in this._sessions)this._sessions[t].isEnded()||this._sessions[t].terminate(a)}},{key:"stop",value:function(){var a=this;if(je.debug("stop()"),this._dynConfiguration={},this._status===Tt.STATUS_USER_CLOSED){je.debug("UA already closed");return}this._registrator.close();var t=Object.keys(this._sessions).length;for(var n in this._sessions)if(Object.prototype.hasOwnProperty.call(this._sessions,n)){je.debug("closing session ".concat(n));try{this._sessions[n].terminate()}catch{}}for(var p in this._applicants)if(Object.prototype.hasOwnProperty.call(this._applicants,p))try{this._applicants[p].close()}catch{}this._status=Tt.STATUS_USER_CLOSED;var _=Object.keys(this._transactions.nict).length+Object.keys(this._transactions.nist).length+Object.keys(this._transactions.ict).length+Object.keys(this._transactions.ist).length;_===0&&t===0?this._transport.disconnect():this._closeTimer=setTimeout(function(){a._closeTimer=null,a._transport.disconnect()},2e3)}},{key:"normalizeTarget",value:function(a){return Bl.normalizeTarget(a,this._configuration.hostport_params)}},{key:"get",value:function(a){switch(a){case"authorization_user":return this._configuration.authorization_user;case"realm":return this._configuration.realm;case"ha1":return this._configuration.ha1;case"authorization_jwt":return this._configuration.authorization_jwt;default:je.warn('get() | cannot get "%s" parameter in runtime',a);return}}},{key:"set",value:function(a,t){switch(a){case"authorization_user":{this._configuration.authorization_user=String(t);break}case"password":{this._configuration.password=String(t);break}case"realm":{this._configuration.realm=String(t);break}case"ha1":{this._configuration.ha1=String(t),this._configuration.password=null;break}case"authorization_jwt":{this._configuration.authorization_jwt=String(t);break}case"display_name":{this._configuration.display_name=t;break}default:return je.warn('set() | cannot set "%s" parameter in runtime',a),!1}return!0}},{key:"newTransaction",value:function(a){this._transactions[a.type][a.id]=a,this.emit("newTransaction",{transaction:a})}},{key:"destroyTransaction",value:function(a){delete this._transactions[a.type][a.id],this.emit("transactionDestroyed",{transaction:a})}},{key:"newDialog",value:function(a){this._dialogs[a.id]=a}},{key:"destroyDialog",value:function(a){delete this._dialogs[a.id]}},{key:"newMessage",value:function(a,t){this._applicants[a]=a,this.emit("newMessage",t)}},{key:"newOptions",value:function(a,t){this._applicants[a]=a,this.emit("newOptions",t)}},{key:"destroyMessage",value:function(a){delete this._applicants[a]}},{key:"newRTCSession",value:function(a,t){this._sessions[a.id]=a,this.emit("newRTCSession",t)}},{key:"destroyRTCSession",value:function(a){delete this._sessions[a.id]}},{key:"registered",value:function(a){this.emit("registered",a)}},{key:"unregistered",value:function(a){this.emit("unregistered",a)}},{key:"registrationFailed",value:function(a){this.emit("registrationFailed",a)}},{key:"receiveRequest",value:function(a){var t=a.method;if(a.ruri.user!==this._configuration.uri.user&&a.ruri.user!==this._contact.uri.user){je.debug("Request-URI does not point to us"),a.method!==pt.ACK&&a.reply_sl(404);return}if(a.ruri.scheme===pt.SIPS){a.reply_sl(416);return}if(!Ca.checkTransaction(this,a)){if(t===pt.INVITE?new Ca.InviteServerTransaction(this,this._transport,a):t!==pt.ACK&&t!==pt.CANCEL&&new Ca.NonInviteServerTransaction(this,this._transport,a),t===pt.OPTIONS){if(this.listeners("newOptions").length===0){a.reply(200);return}var n=new qc(this);n.init_incoming(a)}else if(t===pt.MESSAGE){if(this.listeners("newMessage").length===0){a.reply(405);return}var p=new Vc(this);p.init_incoming(a)}else if(t===pt.INVITE&&!a.to_tag&&this.listeners("newRTCSession").length===0){a.reply(405);return}var _,d;if(a.to_tag)_=this._findDialog(a.call_id,a.from_tag,a.to_tag),_?_.receiveRequest(a):t===pt.NOTIFY?(d=this._findSession(a),d?d.receiveRequest(a):(je.debug("received NOTIFY request for a non existent subscription"),a.reply(481,"Subscription does not exist"))):t!==pt.ACK&&a.reply(481);else switch(t){case pt.INVITE:if(window.RTCPeerConnection)if(a.hasHeader("replaces")){var g=a.replaces;_=this._findDialog(g.call_id,g.from_tag,g.to_tag),_?(d=_.owner,d.isEnded()?a.reply(603):d.receiveRequest(a)):a.reply(481)}else d=new jc(this),d.init_incoming(a);else je.warn("INVITE received but WebRTC is not supported"),a.reply(488);break;case pt.BYE:a.reply(481);break;case pt.CANCEL:d=this._findSession(a),d?d.receiveRequest(a):je.debug("received CANCEL request for a non existent session");break;case pt.ACK:break;case pt.NOTIFY:this.emit("sipEvent",{event:a.event,request:a}),a.reply(200);break;default:a.reply(405);break}}}},{key:"_findSession",value:function(a){var t=a.call_id,n=a.from_tag,p=a.to_tag,_=t+n,d=this._sessions[_],g=t+p,T=this._sessions[g];return d||T||null}},{key:"_findDialog",value:function(a,t,n){var p=a+t+n,_=this._dialogs[p];return _||(p=a+n+t,_=this._dialogs[p],_||null)}},{key:"_loadConfig",value:function(a){try{Ia.load(this._configuration,a)}catch(g){throw g}this._configuration.display_name===0&&(this._configuration.display_name="0"),this._configuration.instance_id||(this._configuration.instance_id=Bl.newUUID()),this._configuration.jssip_id=Bl.createRandomToken(5);var t=this._configuration.uri.clone();t.user=null,this._configuration.hostport_params=t.toString().replace(/^sip:/i,"");try{this._transport=new cm(this._configuration.sockets,{max_interval:this._configuration.connection_recovery_max_interval,min_interval:this._configuration.connection_recovery_min_interval}),this._transport.onconnecting=mm.bind(this),this._transport.onconnect=gm.bind(this),this._transport.ondisconnect=Tm.bind(this),this._transport.ondata=vm.bind(this)}catch(g){throw je.warn(g),new fm.ConfigurationError("sockets",this._configuration.sockets)}if(delete this._configuration.sockets,this._configuration.authorization_user||(this._configuration.authorization_user=this._configuration.uri.user),!this._configuration.registrar_server){var n=this._configuration.uri.clone();n.user=null,n.clearParams(),n.clearHeaders(),this._configuration.registrar_server=n}this._configuration.no_answer_timeout*=1e3,this._configuration.contact_uri?this._configuration.via_host=this._configuration.contact_uri.host:this._configuration.contact_uri=new _m("sip",Bl.createRandomToken(8),this._configuration.via_host,null,{transport:"ws"}),this._contact={pub_gruu:null,temp_gruu:null,uri:this._configuration.contact_uri,toString:function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.anonymous||null,y=T.outbound||null,A="<";return E?A+=this.temp_gruu||"sip:anonymous@anonymous.invalid;transport=ws":A+=this.pub_gruu||this.uri.toString(),y&&(E?!this.temp_gruu:!this.pub_gruu)&&(A+=";ob"),A+=">",A}};var p=["authorization_user","password","realm","ha1","authorization_jwt","display_name","register"];for(var _ in this._configuration)Object.prototype.hasOwnProperty.call(this._configuration,_)&&(p.indexOf(_)!==-1?Object.defineProperty(this._configuration,_,{writable:!0,configurable:!1}):Object.defineProperty(this._configuration,_,{writable:!1,configurable:!1}));je.debug("configuration parameters after validation:");for(var d in this._configuration)if(Object.prototype.hasOwnProperty.call(Ia.settings,d))switch(d){case"uri":case"registrar_server":je.debug("- ".concat(d,": ").concat(this._configuration[d]));break;case"password":case"ha1":case"authorization_jwt":je.debug("- ".concat(d,": NOT SHOWN"));break;default:je.debug("- ".concat(d,": ").concat(JSON.stringify(this._configuration[d])))}}},{key:"C",get:function(){return Tt}},{key:"status",get:function(){return this._status}},{key:"contact",get:function(){return this._contact}},{key:"configuration",get:function(){return this._configuration}},{key:"transport",get:function(){return this._transport}}]),r}(om);function mm(c){this.emit("connecting",c)}function gm(c){this._status!==Tt.STATUS_USER_CLOSED&&(this._status=Tt.STATUS_READY,this._error=null,this.emit("connected",c),this._dynConfiguration.register&&this._registrator.register())}function Tm(c){for(var s=["nict","ict","nist","ist"],r=0,o=s;r<o.length;r++){var a=o[r];for(var t in this._transactions[a])Object.prototype.hasOwnProperty.call(this._transactions[a],t)&&this._transactions[a][t].onTransportError()}this.emit("disconnected",c),this._registrator.onTransportClosed(),this._status!==Tt.STATUS_USER_CLOSED&&(this._status=Tt.STATUS_NOT_READY,this._error=Tt.NETWORK_ERROR)}function vm(c){var s=c.transport,r=c.message;if(r=hm.parseMessage(r,this),!!r&&!(this._status===Tt.STATUS_USER_CLOSED&&r instanceof Ra.IncomingRequest)&&dm(r,this,s)){if(r instanceof Ra.IncomingRequest)r.transport=s,this.receiveRequest(r);else if(r instanceof Ra.IncomingResponse){var o;switch(r.method){case pt.INVITE:o=this._transactions.ict[r.via_branch],o&&o.receiveResponse(r);break;case pt.ACK:break;default:o=this._transactions.nict[r.via_branch],o&&o.receiveResponse(r);break}}}}function Em(c,s){if(!(c instanceof s))throw new TypeError("Cannot call a class as a function")}function Bc(c,s){for(var r=0;r<s.length;r++){var o=s[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(c,o.key,o)}}function Sm(c,s,r){return s&&Bc(c.prototype,s),r&&Bc(c,r),c}var ym=_t,Am=is(),wt=new ym("WebSocketInterface"),Cm=function(){function c(s){Em(this,c),wt.debug('new() [url:"%s"]',s),this._url=s,this._sip_uri=null,this._via_transport=null,this._ws=null;var r=Am.parse(s,"absoluteURI");if(r===-1)throw wt.warn("invalid WebSocket URI: ".concat(s)),new TypeError("Invalid argument: ".concat(s));if(r.scheme!=="wss"&&r.scheme!=="ws")throw wt.warn("invalid WebSocket URI scheme: ".concat(r.scheme)),new TypeError("Invalid argument: ".concat(s));this._sip_uri="sip:".concat(r.host).concat(r.port?":".concat(r.port):"",";transport=ws"),this._via_transport=r.scheme.toUpperCase()}return Sm(c,[{key:"connect",value:function(){if(wt.debug("connect()"),this.isConnected()){wt.debug("WebSocket ".concat(this._url," is already connected"));return}else if(this.isConnecting()){wt.debug("WebSocket ".concat(this._url," is connecting"));return}this._ws&&this.disconnect(),wt.debug("connecting to WebSocket ".concat(this._url));try{this._ws=new WebSocket(this._url,"sip"),this._ws.binaryType="arraybuffer",this._ws.onopen=this._onOpen.bind(this),this._ws.onclose=this._onClose.bind(this),this._ws.onmessage=this._onMessage.bind(this),this._ws.onerror=this._onError.bind(this)}catch(r){this._onError(r)}}},{key:"disconnect",value:function(){wt.debug("disconnect()"),this._ws&&(this._ws.onopen=function(){},this._ws.onclose=function(){},this._ws.onmessage=function(){},this._ws.onerror=function(){},this._ws.close(),this._ws=null)}},{key:"send",value:function(r){return wt.debug("send()"),this.isConnected()?(this._ws.send(r),!0):(wt.warn("unable to send message, WebSocket is not open"),!1)}},{key:"isConnected",value:function(){return this._ws&&this._ws.readyState===this._ws.OPEN}},{key:"isConnecting",value:function(){return this._ws&&this._ws.readyState===this._ws.CONNECTING}},{key:"_onOpen",value:function(){wt.debug("WebSocket ".concat(this._url," connected")),this.onconnect()}},{key:"_onClose",value:function(r){var o=r.wasClean,a=r.code,t=r.reason;wt.debug("WebSocket ".concat(this._url," closed")),o===!1&&wt.debug("WebSocket abrupt disconnection"),this.ondisconnect(!o,a,t)}},{key:"_onMessage",value:function(r){var o=r.data;wt.debug("received WebSocket message"),this.ondata(o)}},{key:"_onError",value:function(r){wt.warn("WebSocket ".concat(this._url," error: "),r)}},{key:"via_transport",get:function(){return this._via_transport},set:function(r){this._via_transport=r.toUpperCase()}},{key:"sip_uri",get:function(){return this._sip_uri}},{key:"url",get:function(){return this._url}}]),c}(),du=xo,Rm=it,Im=qs,bm=It(),wm=pm,Om=Bs(),Dm=Su(),Nm=is(),Um=Cm,Pm=dr("JsSIP");Pm("version %s",du.version);var Gc={C:Rm,Exceptions:Im,Utils:bm,UA:wm,URI:Om,NameAddrHeader:Dm,WebSocketInterface:Um,Grammar:Nm,debug:dr,get name(){return du.title},get version(){return du.version}};const rr=dr,ir="JsSIP";var ut=class{constructor(s){s?(this._debug=rr.default(`${ir}:${s}`),this._warn=rr.default(`${ir}:WARN:${s}`),this._error=rr.default(`${ir}:ERROR:${s}`)):(this._debug=rr.default(ir),this._warn=rr.default(`${ir}:WARN`),this._error=rr.default(`${ir}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}};const n_=Xe(ut),Wc=xo;var De={USER_AGENT:`${Wc.title} ${Wc.version}`,SIP:"sip",SIPS:"sips",causes:{CONNECTION_ERROR:"Connection Error",REQUEST_TIMEOUT:"Request Timeout",SIP_FAILURE_CODE:"SIP Failure Code",INTERNAL_ERROR:"Internal Error",BUSY:"Busy",REJECTED:"Rejected",REDIRECTED:"Redirected",UNAVAILABLE:"Unavailable",NOT_FOUND:"Not Found",ADDRESS_INCOMPLETE:"Address Incomplete",INCOMPATIBLE_SDP:"Incompatible SDP",MISSING_SDP:"Missing SDP",AUTHENTICATION_ERROR:"Authentication Error",BYE:"Terminated",WEBRTC_ERROR:"WebRTC Error",CANCELED:"Canceled",NO_ANSWER:"No Answer",EXPIRES:"Expires",NO_ACK:"No ACK",DIALOG_ERROR:"Dialog Error",USER_DENIED_MEDIA_ACCESS:"User Denied Media Access",BAD_MEDIA_DESCRIPTION:"Bad Media Description",RTP_TIMEOUT:"RTP Timeout"},SIP_ERROR_CAUSES:{REDIRECTED:[300,301,302,305,380],BUSY:[486,600],REJECTED:[403,603],NOT_FOUND:[404,604],UNAVAILABLE:[480,410,408,430],ADDRESS_INCOMPLETE:[484,424],INCOMPATIBLE_SDP:[488,606],AUTHENTICATION_ERROR:[401,407]},ACK:"ACK",BYE:"BYE",CANCEL:"CANCEL",INFO:"INFO",INVITE:"INVITE",MESSAGE:"MESSAGE",NOTIFY:"NOTIFY",OPTIONS:"OPTIONS",REGISTER:"REGISTER",REFER:"REFER",UPDATE:"UPDATE",SUBSCRIBE:"SUBSCRIBE",DTMF_TRANSPORT:{INFO:"INFO",RFC2833:"RFC2833"},REASON_PHRASE:{100:"Trying",180:"Ringing",181:"Call Is Being Forwarded",182:"Queued",183:"Session Progress",199:"Early Dialog Terminated",200:"OK",202:"Accepted",204:"No Notification",300:"Multiple Choices",301:"Moved Permanently",302:"Moved Temporarily",305:"Use Proxy",380:"Alternative Service",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",410:"Gone",412:"Conditional Request Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Unsupported URI Scheme",417:"Unknown Resource-Priority",420:"Bad Extension",421:"Extension Required",422:"Session Interval Too Small",423:"Interval Too Brief",424:"Bad Location Information",428:"Use Identity Header",429:"Provide Referrer Identity",430:"Flow Failed",433:"Anonymity Disallowed",436:"Bad Identity-Info",437:"Unsupported Certificate",438:"Invalid Identity Header",439:"First Hop Lacks Outbound Support",440:"Max-Breadth Exceeded",469:"Bad Info Package",470:"Consent Needed",478:"Unresolvable Destination",480:"Temporarily Unavailable",481:"Call/Transaction Does Not Exist",482:"Loop Detected",483:"Too Many Hops",484:"Address Incomplete",485:"Ambiguous",486:"Busy Here",487:"Request Terminated",488:"Not Acceptable Here",489:"Bad Event",491:"Request Pending",493:"Undecipherable",494:"Security Agreement Required",500:"JsSIP Internal Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Server Time-out",505:"Version Not Supported",513:"Message Too Large",580:"Precondition Failure",600:"Busy Everywhere",603:"Decline",604:"Does Not Exist Anywhere",606:"Not Acceptable"},ALLOWED_METHODS:"INVITE,ACK,CANCEL,BYE,UPDATE,MESSAGE,OPTIONS,REFER,INFO,NOTIFY",ACCEPTED_BODY_TYPES:"application/sdp, application/dtmf-relay",MAX_FORWARDS:69,SESSION_EXPIRES:90,MIN_SESSION_EXPIRES:60,CONNECTION_RECOVERY_MAX_INTERVAL:30,CONNECTION_RECOVERY_MIN_INTERVAL:2};const j=Xe(De);var et={},ba,Kc;function Du(){if(Kc)return ba;Kc=1;const c=vs(),s=ls();return ba=class r_{static parse(o){if(o=s.parse(o,"Name_Addr_Header"),o!==-1)return o}constructor(o,a,t){if(!o||!(o instanceof c))throw new TypeError('missing or invalid "uri" parameter');this._uri=o,this._parameters={},this.display_name=a;for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&this.setParam(n,t[n])}get uri(){return this._uri}get display_name(){return this._display_name}set display_name(o){this._display_name=o===0?"0":o}setParam(o,a){o&&(this._parameters[o.toLowerCase()]=typeof a>"u"||a===null?null:a.toString())}getParam(o){if(o)return this._parameters[o.toLowerCase()]}hasParam(o){if(o)return this._parameters.hasOwnProperty(o.toLowerCase())&&!0||!1}deleteParam(o){if(o=o.toLowerCase(),this._parameters.hasOwnProperty(o)){const a=this._parameters[o];return delete this._parameters[o],a}}clearParams(){this._parameters={}}clone(){return new r_(this._uri.clone(),this._display_name,JSON.parse(JSON.stringify(this._parameters)))}_quote(o){return o.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}toString(){let o=this._display_name?`"${this._quote(this._display_name)}" `:"";o+=`<${this._uri.toString()}>`;for(const a in this._parameters)Object.prototype.hasOwnProperty.call(this._parameters,a)&&(o+=`;${a}`,this._parameters[a]!==null&&(o+=`=${this._parameters[a]}`));return o}},ba}var wa,Yc;function ls(){return Yc||(Yc=1,wa=function(){function c(r){return'"'+r.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g,escape)+'"'}var s={parse:function(r,o){var a={CRLF:d,DIGIT:g,ALPHA:T,HEXDIG:E,WSP:y,OCTET:A,DQUOTE:C,SP:I,HTAB:$,alphanum:L,reserved:ae,unreserved:N,mark:F,escaped:Se,LWS:ve,SWS:M,HCOLON:D,TEXT_UTF8_TRIM:B,TEXT_UTF8char:q,UTF8_NONASCII:z,UTF8_CONT:H,LHEX:X,token:U,token_nodot:P,separators:se,word:tt,STAR:ee,SLASH:W,EQUAL:G,LPAREN:re,RPAREN:ge,RAQUOT:be,LAQUOT:xe,COMMA:Ce,SEMI:le,COLON:ye,LDQUOT:st,RDQUOT:lt,comment:Ee,ctext:Ae,quoted_string:Ie,quoted_string_clean:Oe,qdtext:pe,quoted_pair:ue,SIP_URI_noparams:de,SIP_URI:we,uri_scheme:Ne,uri_scheme_sips:Qe,uri_scheme_sip:Le,userinfo:kt,user:ht,user_unreserved:Cn,password:Rn,hostport:Gs,host:Xt,hostname:os,domainlabel:Ws,toplabel:In,IPv6reference:bn,IPv6address:Ks,h16:me,ls32:oe,IPv4address:ot,dec_octet:Gt,port:Ss,uri_parameters:gr,uri_parameter:wn,transport_param:On,user_param:Tr,method_param:vr,ttl_param:Er,maddr_param:Sr,lr_param:yr,other_param:Ar,pname:Cr,pvalue:Rr,paramchar:ys,param_unreserved:As,headers:Ir,header:Ys,hname:zs,hvalue:br,hnv_unreserved:Cs,Request_Response:Js,Request_Line:_l,Request_URI:wr,absoluteURI:Dn,hier_part:Nn,net_path:Or,abs_path:Xs,opaque_part:Qs,uric:Rs,uric_no_slash:Is,path_segments:Dr,segment:Zs,param:bs,pchar:as,scheme:ws,authority:Nr,srvr:Ur,reg_name:Pr,query:xr,SIP_Version:Un,INVITEm:Pn,ACKm:Mr,OPTIONSm:kr,BYEm:Lr,CANCELm:$r,REGISTERm:Hr,SUBSCRIBEm:Fr,NOTIFYm:jr,REFERm:Vr,Method:en,Status_Line:tn,Status_Code:qr,extension_code:Br,Reason_Phrase:Gr,Allow_Events:hl,Call_ID:Vo,Contact:qo,contact_param:xn,name_addr:Lt,display_name:$t,contact_params:Os,c_p_q:Mn,c_p_expires:Wr,delta_seconds:Qt,qvalue:Zt,generic_param:Ge,gen_value:We,Content_Disposition:dl,disp_type:pl,disp_param:kn,handling_param:Ln,Content_Encoding:ml,Content_Length:Bo,Content_Type:Go,media_type:gl,m_type:Kr,discrete_type:Yr,composite_type:zr,extension_token:sn,x_token:nn,m_subtype:Jr,m_parameter:$n,m_value:Hn,CSeq:Tl,CSeq_value:vl,Expires:El,Event:Wo,event_type:rn,From:ln,from_param:Xr,tag_param:on,Max_Forwards:Qr,Min_Expires:Ko,Name_Addr_Header:Yo,Proxy_Authenticate:zo,challenge:Zr,other_challenge:Fn,auth_param:Ds,digest_cln:es,realm:an,realm_value:ei,domain:ti,URI:un,nonce:cn,nonce_value:si,opaque:ni,stale:ri,algorithm:ii,qop_options:li,qop_value:fn,Proxy_Require:jn,Record_Route:Jo,rec_route:Vn,Reason:qn,reason_param:oi,reason_cause:Bn,Require:Sl,Route:Xo,route_param:Gn,Subscription_State:Wn,substate_value:yl,subexp_params:Kn,event_reason_value:Yn,Subject:Al,Supported:Qo,To:Zo,to_param:ai,Via:ui,via_param:zn,via_params:Ns,via_ttl:Jn,via_maddr:ci,via_received:fi,via_branch:_i,response_port:hi,rport:di,sent_protocol:pi,protocol_name:mi,transport:gi,sent_by:Ti,via_host:vi,via_port:Ei,ttl:Xn,WWW_Authenticate:Si,Session_Expires:ea,s_e_expires:Cl,s_e_params:Qn,s_e_refresher:Zn,extension_header:Rl,header_value:Il,message_body:bl,uuid_URI:ta,uuid:wl,hex4:Ht,hex8:Ft,hex12:yi,Refer_To:Ol,Replaces:sa,call_id:Dl,replaces_param:er,to_tag:tr,from_tag:Ai,early_flag:Ci};if(o!==void 0){if(a[o]===void 0)throw new Error("Invalid rule name: "+c(o)+".")}else o="CRLF";var t=0,n=0,p=[];function _(i){t<n||(t>n&&(n=t,p=[]),p.push(i))}function d(){var i;return r.substr(t,2)===`\r
|
72
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var t=!0,n=!1,p;return{s:function(){r=c[Symbol.iterator]()},n:function(){var d=r.next();return t=d.done,d},e:function(d){n=!0,p=d},f:function(){try{!t&&r.return!=null&&r.return()}finally{if(n)throw p}}}}function tm(c,s){if(c){if(typeof c=="string")return Lc(c,s);var r=Object.prototype.toString.call(c).slice(8,-1);if(r==="Object"&&c.constructor&&(r=c.constructor.name),r==="Map"||r==="Set")return Array.from(c);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Lc(c,s)}}function Lc(c,s){(s==null||s>c.length)&&(s=c.length);for(var r=0,o=new Array(s);r<s;r++)o[r]=c[r];return o}var or=It(),vn=it,Sa=is(),$c=Bs(),ya=Iu,Aa=qs;Ou.settings={authorization_user:null,password:null,realm:null,ha1:null,authorization_jwt:null,display_name:null,uri:null,contact_uri:null,instance_id:null,use_preloaded_route:!1,session_timers:!0,session_timers_refresh_method:vn.UPDATE,session_timers_force_refresher:!1,no_answer_timeout:60,register:!0,register_expires:600,registrar_server:null,sockets:null,connection_recovery_max_interval:vn.CONNECTION_RECOVERY_MAX_INTERVAL,connection_recovery_min_interval:vn.CONNECTION_RECOVERY_MIN_INTERVAL,extra_headers:null,via_host:"".concat(or.createRandomToken(12),".invalid")};var ql={mandatory:{sockets:function(s){var r=[];if(ya.isSocket(s))r.push({socket:s});else if(Array.isArray(s)&&s.length){var o=kc(s),a;try{for(o.s();!(a=o.n()).done;){var t=a.value;Object.prototype.hasOwnProperty.call(t,"socket")&&ya.isSocket(t.socket)?r.push(t):ya.isSocket(t)&&r.push({socket:t})}}catch(n){o.e(n)}finally{o.f()}}else return;return r},uri:function(s){/^sip:/i.test(s)||(s="".concat(vn.SIP,":").concat(s));var r=$c.parse(s);if(r)return r.user?r:void 0}},optional:{authorization_user:function(s){if(Sa.parse('"'.concat(s,'"'),"quoted_string")!==-1)return s},authorization_jwt:function(s){if(typeof s=="string")return s},user_agent:function(s){if(typeof s=="string")return s},connection_recovery_max_interval:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},connection_recovery_min_interval:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},contact_uri:function(s){if(typeof s=="string"){var r=Sa.parse(s,"SIP_URI");if(r!==-1)return r}},display_name:function(s){return s},instance_id:function(s){if(/^uuid:/i.test(s)&&(s=s.substr(5)),Sa.parse(s,"uuid")!==-1)return s},no_answer_timeout:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},session_timers:function(s){if(typeof s=="boolean")return s},session_timers_refresh_method:function(s){if(typeof s=="string"&&(s=s.toUpperCase(),s===vn.INVITE||s===vn.UPDATE))return s},session_timers_force_refresher:function(s){if(typeof s=="boolean")return s},password:function(s){return String(s)},realm:function(s){return String(s)},ha1:function(s){return String(s)},register:function(s){if(typeof s=="boolean")return s},register_expires:function(s){if(or.isDecimal(s)){var r=Number(s);if(r>0)return r}},registrar_server:function(s){/^sip:/i.test(s)||(s="".concat(vn.SIP,":").concat(s));var r=$c.parse(s);if(r)return r.user?void 0:r},use_preloaded_route:function(s){if(typeof s=="boolean")return s},extra_headers:function(s){var r=[];if(Array.isArray(s)&&s.length){var o=kc(s),a;try{for(o.s();!(a=o.n()).done;){var t=a.value;typeof t=="string"&&r.push(t)}}catch(n){o.e(n)}finally{o.f()}}else return;return r}}};Ou.load=function(c,s){for(var r in ql.mandatory)if(s.hasOwnProperty(r)){var o=s[r],a=ql.mandatory[r](o);if(a!==void 0)c[r]=a;else throw new Aa.ConfigurationError(r,o)}else throw new Aa.ConfigurationError(r);for(var t in ql.optional)if(s.hasOwnProperty(t)){var n=s[t];if(or.isEmpty(n))continue;var p=ql.optional[t](n);if(p!==void 0)c[t]=p;else throw new Aa.ConfigurationError(t,n)}};function yo(c){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?yo=function(r){return typeof r}:yo=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},yo(c)}function sm(c,s){if(!(c instanceof s))throw new TypeError("Cannot call a class as a function")}function Hc(c,s){for(var r=0;r<s.length;r++){var o=s[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(c,o.key,o)}}function Fc(c,s,r){return s&&Hc(c.prototype,s),r&&Hc(c,r),c}function nm(c,s){if(typeof s!="function"&&s!==null)throw new TypeError("Super expression must either be null or a function");c.prototype=Object.create(s&&s.prototype,{constructor:{value:c,writable:!0,configurable:!0}}),s&&hu(c,s)}function hu(c,s){return hu=Object.setPrototypeOf||function(o,a){return o.__proto__=a,o},hu(c,s)}function rm(c){var s=lm();return function(){var o=Uo(c),a;if(s){var t=Uo(this).constructor;a=Reflect.construct(o,arguments,t)}else a=o.apply(this,arguments);return im(this,a)}}function im(c,s){return s&&(yo(s)==="object"||typeof s=="function")?s:s_(c)}function s_(c){if(c===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return c}function lm(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch{return!1}}function Uo(c){return Uo=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Uo(c)}var om=ft.EventEmitter,am=_t,pt=it,um=Jh,jc=ip,Vc=Tp,qc=Dp,Ca=ol,cm=Lp,Bl=It(),fm=qs,_m=Bs(),hm=Zf,Ra=Ts,dm=Kp,Ia=Ou,je=new am("UA"),Tt={STATUS_INIT:0,STATUS_READY:1,STATUS_USER_CLOSED:2,STATUS_NOT_READY:3,CONFIGURATION_ERROR:1,NETWORK_ERROR:2},pm=function(c){nm(r,c);var s=rm(r);Fc(r,null,[{key:"C",get:function(){return Tt}}]);function r(o){var a;if(sm(this,r),je.debug("new() [configuration:%o]",o),a=s.call(this),a._cache={credentials:{}},a._configuration=Object.assign({},Ia.settings),a._dynConfiguration={},a._dialogs={},a._applicants={},a._sessions={},a._transport=null,a._contact=null,a._status=Tt.STATUS_INIT,a._error=null,a._transactions={nist:{},nict:{},ist:{},ict:{}},a._data={},a._closeTimer=null,o===void 0)throw new TypeError("Not enough arguments");try{a._loadConfig(o)}catch(t){throw a._status=Tt.STATUS_NOT_READY,a._error=Tt.CONFIGURATION_ERROR,t}return a._registrator=new um(s_(a)),a}return Fc(r,[{key:"start",value:function(){je.debug("start()"),this._status===Tt.STATUS_INIT?this._transport.connect():this._status===Tt.STATUS_USER_CLOSED?(je.debug("restarting UA"),this._closeTimer!==null&&(clearTimeout(this._closeTimer),this._closeTimer=null,this._transport.disconnect()),this._status=Tt.STATUS_INIT,this._transport.connect()):this._status===Tt.STATUS_READY?je.debug("UA is in READY status, not restarted"):je.debug("ERROR: connection is down, Auto-Recovery system is trying to reconnect"),this._dynConfiguration.register=this._configuration.register}},{key:"register",value:function(){je.debug("register()"),this._dynConfiguration.register=!0,this._registrator.register()}},{key:"unregister",value:function(a){je.debug("unregister()"),this._dynConfiguration.register=!1,this._registrator.unregister(a)}},{key:"registrator",value:function(){return this._registrator}},{key:"isRegistered",value:function(){return this._registrator.registered}},{key:"isConnected",value:function(){return this._transport.isConnected()}},{key:"call",value:function(a,t){je.debug("call()");var n=new jc(this);return n.connect(a,t),n}},{key:"sendMessage",value:function(a,t,n){je.debug("sendMessage()");var p=new Vc(this);return p.send(a,t,n),p}},{key:"sendOptions",value:function(a,t,n){je.debug("sendOptions()");var p=new qc(this);return p.send(a,t,n),p}},{key:"terminateSessions",value:function(a){je.debug("terminateSessions()");for(var t in this._sessions)this._sessions[t].isEnded()||this._sessions[t].terminate(a)}},{key:"stop",value:function(){var a=this;if(je.debug("stop()"),this._dynConfiguration={},this._status===Tt.STATUS_USER_CLOSED){je.debug("UA already closed");return}this._registrator.close();var t=Object.keys(this._sessions).length;for(var n in this._sessions)if(Object.prototype.hasOwnProperty.call(this._sessions,n)){je.debug("closing session ".concat(n));try{this._sessions[n].terminate()}catch{}}for(var p in this._applicants)if(Object.prototype.hasOwnProperty.call(this._applicants,p))try{this._applicants[p].close()}catch{}this._status=Tt.STATUS_USER_CLOSED;var _=Object.keys(this._transactions.nict).length+Object.keys(this._transactions.nist).length+Object.keys(this._transactions.ict).length+Object.keys(this._transactions.ist).length;_===0&&t===0?this._transport.disconnect():this._closeTimer=setTimeout(function(){a._closeTimer=null,a._transport.disconnect()},2e3)}},{key:"normalizeTarget",value:function(a){return Bl.normalizeTarget(a,this._configuration.hostport_params)}},{key:"get",value:function(a){switch(a){case"authorization_user":return this._configuration.authorization_user;case"realm":return this._configuration.realm;case"ha1":return this._configuration.ha1;case"authorization_jwt":return this._configuration.authorization_jwt;default:je.warn('get() | cannot get "%s" parameter in runtime',a);return}}},{key:"set",value:function(a,t){switch(a){case"authorization_user":{this._configuration.authorization_user=String(t);break}case"password":{this._configuration.password=String(t);break}case"realm":{this._configuration.realm=String(t);break}case"ha1":{this._configuration.ha1=String(t),this._configuration.password=null;break}case"authorization_jwt":{this._configuration.authorization_jwt=String(t);break}case"display_name":{this._configuration.display_name=t;break}default:return je.warn('set() | cannot set "%s" parameter in runtime',a),!1}return!0}},{key:"newTransaction",value:function(a){this._transactions[a.type][a.id]=a,this.emit("newTransaction",{transaction:a})}},{key:"destroyTransaction",value:function(a){delete this._transactions[a.type][a.id],this.emit("transactionDestroyed",{transaction:a})}},{key:"newDialog",value:function(a){this._dialogs[a.id]=a}},{key:"destroyDialog",value:function(a){delete this._dialogs[a.id]}},{key:"newMessage",value:function(a,t){this._applicants[a]=a,this.emit("newMessage",t)}},{key:"newOptions",value:function(a,t){this._applicants[a]=a,this.emit("newOptions",t)}},{key:"destroyMessage",value:function(a){delete this._applicants[a]}},{key:"newRTCSession",value:function(a,t){this._sessions[a.id]=a,this.emit("newRTCSession",t)}},{key:"destroyRTCSession",value:function(a){delete this._sessions[a.id]}},{key:"registered",value:function(a){this.emit("registered",a)}},{key:"unregistered",value:function(a){this.emit("unregistered",a)}},{key:"registrationFailed",value:function(a){this.emit("registrationFailed",a)}},{key:"receiveRequest",value:function(a){var t=a.method;if(a.ruri.user!==this._configuration.uri.user&&a.ruri.user!==this._contact.uri.user){je.debug("Request-URI does not point to us"),a.method!==pt.ACK&&a.reply_sl(404);return}if(a.ruri.scheme===pt.SIPS){a.reply_sl(416);return}if(!Ca.checkTransaction(this,a)){if(t===pt.INVITE?new Ca.InviteServerTransaction(this,this._transport,a):t!==pt.ACK&&t!==pt.CANCEL&&new Ca.NonInviteServerTransaction(this,this._transport,a),t===pt.OPTIONS){if(this.listeners("newOptions").length===0){a.reply(200);return}var n=new qc(this);n.init_incoming(a)}else if(t===pt.MESSAGE){if(this.listeners("newMessage").length===0){a.reply(405);return}var p=new Vc(this);p.init_incoming(a)}else if(t===pt.INVITE&&!a.to_tag&&this.listeners("newRTCSession").length===0){a.reply(405);return}var _,d;if(a.to_tag)_=this._findDialog(a.call_id,a.from_tag,a.to_tag),_?_.receiveRequest(a):t===pt.NOTIFY?(d=this._findSession(a),d?d.receiveRequest(a):(je.debug("received NOTIFY request for a non existent subscription"),a.reply(481,"Subscription does not exist"))):t!==pt.ACK&&a.reply(481);else switch(t){case pt.INVITE:if(window.RTCPeerConnection)if(a.hasHeader("replaces")){var g=a.replaces;_=this._findDialog(g.call_id,g.from_tag,g.to_tag),_?(d=_.owner,d.isEnded()?a.reply(603):d.receiveRequest(a)):a.reply(481)}else d=new jc(this),d.init_incoming(a);else je.warn("INVITE received but WebRTC is not supported"),a.reply(488);break;case pt.BYE:a.reply(481);break;case pt.CANCEL:d=this._findSession(a),d?d.receiveRequest(a):je.debug("received CANCEL request for a non existent session");break;case pt.ACK:break;case pt.NOTIFY:this.emit("sipEvent",{event:a.event,request:a}),a.reply(200);break;default:a.reply(405);break}}}},{key:"_findSession",value:function(a){var t=a.call_id,n=a.from_tag,p=a.to_tag,_=t+n,d=this._sessions[_],g=t+p,T=this._sessions[g];return d||T||null}},{key:"_findDialog",value:function(a,t,n){var p=a+t+n,_=this._dialogs[p];return _||(p=a+n+t,_=this._dialogs[p],_||null)}},{key:"_loadConfig",value:function(a){try{Ia.load(this._configuration,a)}catch(g){throw g}this._configuration.display_name===0&&(this._configuration.display_name="0"),this._configuration.instance_id||(this._configuration.instance_id=Bl.newUUID()),this._configuration.jssip_id=Bl.createRandomToken(5);var t=this._configuration.uri.clone();t.user=null,this._configuration.hostport_params=t.toString().replace(/^sip:/i,"");try{this._transport=new cm(this._configuration.sockets,{max_interval:this._configuration.connection_recovery_max_interval,min_interval:this._configuration.connection_recovery_min_interval}),this._transport.onconnecting=mm.bind(this),this._transport.onconnect=gm.bind(this),this._transport.ondisconnect=Tm.bind(this),this._transport.ondata=vm.bind(this)}catch(g){throw je.warn(g),new fm.ConfigurationError("sockets",this._configuration.sockets)}if(delete this._configuration.sockets,this._configuration.authorization_user||(this._configuration.authorization_user=this._configuration.uri.user),!this._configuration.registrar_server){var n=this._configuration.uri.clone();n.user=null,n.clearParams(),n.clearHeaders(),this._configuration.registrar_server=n}this._configuration.no_answer_timeout*=1e3,this._configuration.contact_uri?this._configuration.via_host=this._configuration.contact_uri.host:this._configuration.contact_uri=new _m("sip",Bl.createRandomToken(8),this._configuration.via_host,null,{transport:"ws"}),this._contact={pub_gruu:null,temp_gruu:null,uri:this._configuration.contact_uri,toString:function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.anonymous||null,y=T.outbound||null,A="<";return E?A+=this.temp_gruu||"sip:anonymous@anonymous.invalid;transport=ws":A+=this.pub_gruu||this.uri.toString(),y&&(E?!this.temp_gruu:!this.pub_gruu)&&(A+=";ob"),A+=">",A}};var p=["authorization_user","password","realm","ha1","authorization_jwt","display_name","register"];for(var _ in this._configuration)Object.prototype.hasOwnProperty.call(this._configuration,_)&&(p.indexOf(_)!==-1?Object.defineProperty(this._configuration,_,{writable:!0,configurable:!1}):Object.defineProperty(this._configuration,_,{writable:!1,configurable:!1}));je.debug("configuration parameters after validation:");for(var d in this._configuration)if(Object.prototype.hasOwnProperty.call(Ia.settings,d))switch(d){case"uri":case"registrar_server":je.debug("- ".concat(d,": ").concat(this._configuration[d]));break;case"password":case"ha1":case"authorization_jwt":je.debug("- ".concat(d,": NOT SHOWN"));break;default:je.debug("- ".concat(d,": ").concat(JSON.stringify(this._configuration[d])))}}},{key:"C",get:function(){return Tt}},{key:"status",get:function(){return this._status}},{key:"contact",get:function(){return this._contact}},{key:"configuration",get:function(){return this._configuration}},{key:"transport",get:function(){return this._transport}}]),r}(om);function mm(c){this.emit("connecting",c)}function gm(c){this._status!==Tt.STATUS_USER_CLOSED&&(this._status=Tt.STATUS_READY,this._error=null,this.emit("connected",c),this._dynConfiguration.register&&this._registrator.register())}function Tm(c){for(var s=["nict","ict","nist","ist"],r=0,o=s;r<o.length;r++){var a=o[r];for(var t in this._transactions[a])Object.prototype.hasOwnProperty.call(this._transactions[a],t)&&this._transactions[a][t].onTransportError()}this.emit("disconnected",c),this._registrator.onTransportClosed(),this._status!==Tt.STATUS_USER_CLOSED&&(this._status=Tt.STATUS_NOT_READY,this._error=Tt.NETWORK_ERROR)}function vm(c){var s=c.transport,r=c.message;if(r=hm.parseMessage(r,this),!!r&&!(this._status===Tt.STATUS_USER_CLOSED&&r instanceof Ra.IncomingRequest)&&dm(r,this,s)){if(r instanceof Ra.IncomingRequest)r.transport=s,this.receiveRequest(r);else if(r instanceof Ra.IncomingResponse){var o;switch(r.method){case pt.INVITE:o=this._transactions.ict[r.via_branch],o&&o.receiveResponse(r);break;case pt.ACK:break;default:o=this._transactions.nict[r.via_branch],o&&o.receiveResponse(r);break}}}}function Em(c,s){if(!(c instanceof s))throw new TypeError("Cannot call a class as a function")}function Bc(c,s){for(var r=0;r<s.length;r++){var o=s[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(c,o.key,o)}}function Sm(c,s,r){return s&&Bc(c.prototype,s),r&&Bc(c,r),c}var ym=_t,Am=is(),wt=new ym("WebSocketInterface"),Cm=function(){function c(s){Em(this,c),wt.debug('new() [url:"%s"]',s),this._url=s,this._sip_uri=null,this._via_transport=null,this._ws=null;var r=Am.parse(s,"absoluteURI");if(r===-1)throw wt.warn("invalid WebSocket URI: ".concat(s)),new TypeError("Invalid argument: ".concat(s));if(r.scheme!=="wss"&&r.scheme!=="ws")throw wt.warn("invalid WebSocket URI scheme: ".concat(r.scheme)),new TypeError("Invalid argument: ".concat(s));this._sip_uri="sip:".concat(r.host).concat(r.port?":".concat(r.port):"",";transport=ws"),this._via_transport=r.scheme.toUpperCase()}return Sm(c,[{key:"connect",value:function(){if(wt.debug("connect()"),this.isConnected()){wt.debug("WebSocket ".concat(this._url," is already connected"));return}else if(this.isConnecting()){wt.debug("WebSocket ".concat(this._url," is connecting"));return}this._ws&&this.disconnect(),wt.debug("connecting to WebSocket ".concat(this._url));try{this._ws=new WebSocket(this._url,"sip"),this._ws.binaryType="arraybuffer",this._ws.onopen=this._onOpen.bind(this),this._ws.onclose=this._onClose.bind(this),this._ws.onmessage=this._onMessage.bind(this),this._ws.onerror=this._onError.bind(this)}catch(r){this._onError(r)}}},{key:"disconnect",value:function(){wt.debug("disconnect()"),this._ws&&(this._ws.onopen=function(){},this._ws.onclose=function(){},this._ws.onmessage=function(){},this._ws.onerror=function(){},this._ws.close(),this._ws=null)}},{key:"send",value:function(r){return wt.debug("send()"),this.isConnected()?(this._ws.send(r),!0):(wt.warn("unable to send message, WebSocket is not open"),!1)}},{key:"isConnected",value:function(){return this._ws&&this._ws.readyState===this._ws.OPEN}},{key:"isConnecting",value:function(){return this._ws&&this._ws.readyState===this._ws.CONNECTING}},{key:"_onOpen",value:function(){wt.debug("WebSocket ".concat(this._url," connected")),this.onconnect()}},{key:"_onClose",value:function(r){var o=r.wasClean,a=r.code,t=r.reason;wt.debug("WebSocket ".concat(this._url," closed")),o===!1&&wt.debug("WebSocket abrupt disconnection"),this.ondisconnect(!o,a,t)}},{key:"_onMessage",value:function(r){var o=r.data;wt.debug("received WebSocket message"),this.ondata(o)}},{key:"_onError",value:function(r){wt.warn("WebSocket ".concat(this._url," error: "),r)}},{key:"via_transport",get:function(){return this._via_transport},set:function(r){this._via_transport=r.toUpperCase()}},{key:"sip_uri",get:function(){return this._sip_uri}},{key:"url",get:function(){return this._url}}]),c}(),du=xo,Rm=it,Im=qs,bm=It(),wm=pm,Om=Bs(),Dm=Su(),Nm=is(),Um=Cm,Pm=dr("JsSIP");Pm("version %s",du.version);var Gc={C:Rm,Exceptions:Im,Utils:bm,UA:wm,URI:Om,NameAddrHeader:Dm,WebSocketInterface:Um,Grammar:Nm,debug:dr,get name(){return du.title},get version(){return du.version}};const rr=dr,ir="JsSIP";var at=class{constructor(s){s?(this._debug=rr.default(`${ir}:${s}`),this._warn=rr.default(`${ir}:WARN:${s}`),this._error=rr.default(`${ir}:ERROR:${s}`)):(this._debug=rr.default(ir),this._warn=rr.default(`${ir}:WARN`),this._error=rr.default(`${ir}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}};const n_=Xe(at),Wc=xo;var De={USER_AGENT:`${Wc.title} ${Wc.version}`,SIP:"sip",SIPS:"sips",causes:{CONNECTION_ERROR:"Connection Error",REQUEST_TIMEOUT:"Request Timeout",SIP_FAILURE_CODE:"SIP Failure Code",INTERNAL_ERROR:"Internal Error",BUSY:"Busy",REJECTED:"Rejected",REDIRECTED:"Redirected",UNAVAILABLE:"Unavailable",NOT_FOUND:"Not Found",ADDRESS_INCOMPLETE:"Address Incomplete",INCOMPATIBLE_SDP:"Incompatible SDP",MISSING_SDP:"Missing SDP",AUTHENTICATION_ERROR:"Authentication Error",BYE:"Terminated",WEBRTC_ERROR:"WebRTC Error",CANCELED:"Canceled",NO_ANSWER:"No Answer",EXPIRES:"Expires",NO_ACK:"No ACK",DIALOG_ERROR:"Dialog Error",USER_DENIED_MEDIA_ACCESS:"User Denied Media Access",BAD_MEDIA_DESCRIPTION:"Bad Media Description",RTP_TIMEOUT:"RTP Timeout"},SIP_ERROR_CAUSES:{REDIRECTED:[300,301,302,305,380],BUSY:[486,600],REJECTED:[403,603],NOT_FOUND:[404,604],UNAVAILABLE:[480,410,408,430],ADDRESS_INCOMPLETE:[484,424],INCOMPATIBLE_SDP:[488,606],AUTHENTICATION_ERROR:[401,407]},ACK:"ACK",BYE:"BYE",CANCEL:"CANCEL",INFO:"INFO",INVITE:"INVITE",MESSAGE:"MESSAGE",NOTIFY:"NOTIFY",OPTIONS:"OPTIONS",REGISTER:"REGISTER",REFER:"REFER",UPDATE:"UPDATE",SUBSCRIBE:"SUBSCRIBE",DTMF_TRANSPORT:{INFO:"INFO",RFC2833:"RFC2833"},REASON_PHRASE:{100:"Trying",180:"Ringing",181:"Call Is Being Forwarded",182:"Queued",183:"Session Progress",199:"Early Dialog Terminated",200:"OK",202:"Accepted",204:"No Notification",300:"Multiple Choices",301:"Moved Permanently",302:"Moved Temporarily",305:"Use Proxy",380:"Alternative Service",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",410:"Gone",412:"Conditional Request Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Unsupported URI Scheme",417:"Unknown Resource-Priority",420:"Bad Extension",421:"Extension Required",422:"Session Interval Too Small",423:"Interval Too Brief",424:"Bad Location Information",428:"Use Identity Header",429:"Provide Referrer Identity",430:"Flow Failed",433:"Anonymity Disallowed",436:"Bad Identity-Info",437:"Unsupported Certificate",438:"Invalid Identity Header",439:"First Hop Lacks Outbound Support",440:"Max-Breadth Exceeded",469:"Bad Info Package",470:"Consent Needed",478:"Unresolvable Destination",480:"Temporarily Unavailable",481:"Call/Transaction Does Not Exist",482:"Loop Detected",483:"Too Many Hops",484:"Address Incomplete",485:"Ambiguous",486:"Busy Here",487:"Request Terminated",488:"Not Acceptable Here",489:"Bad Event",491:"Request Pending",493:"Undecipherable",494:"Security Agreement Required",500:"JsSIP Internal Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Server Time-out",505:"Version Not Supported",513:"Message Too Large",580:"Precondition Failure",600:"Busy Everywhere",603:"Decline",604:"Does Not Exist Anywhere",606:"Not Acceptable"},ALLOWED_METHODS:"INVITE,ACK,CANCEL,BYE,UPDATE,MESSAGE,OPTIONS,REFER,INFO,NOTIFY",ACCEPTED_BODY_TYPES:"application/sdp, application/dtmf-relay",MAX_FORWARDS:69,SESSION_EXPIRES:90,MIN_SESSION_EXPIRES:60,CONNECTION_RECOVERY_MAX_INTERVAL:30,CONNECTION_RECOVERY_MIN_INTERVAL:2};const j=Xe(De);var et={},ba,Kc;function Du(){if(Kc)return ba;Kc=1;const c=vs(),s=ls();return ba=class r_{static parse(o){if(o=s.parse(o,"Name_Addr_Header"),o!==-1)return o}constructor(o,a,t){if(!o||!(o instanceof c))throw new TypeError('missing or invalid "uri" parameter');this._uri=o,this._parameters={},this.display_name=a;for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&this.setParam(n,t[n])}get uri(){return this._uri}get display_name(){return this._display_name}set display_name(o){this._display_name=o===0?"0":o}setParam(o,a){o&&(this._parameters[o.toLowerCase()]=typeof a>"u"||a===null?null:a.toString())}getParam(o){if(o)return this._parameters[o.toLowerCase()]}hasParam(o){if(o)return this._parameters.hasOwnProperty(o.toLowerCase())&&!0||!1}deleteParam(o){if(o=o.toLowerCase(),this._parameters.hasOwnProperty(o)){const a=this._parameters[o];return delete this._parameters[o],a}}clearParams(){this._parameters={}}clone(){return new r_(this._uri.clone(),this._display_name,JSON.parse(JSON.stringify(this._parameters)))}_quote(o){return o.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}toString(){let o=this._display_name?`"${this._quote(this._display_name)}" `:"";o+=`<${this._uri.toString()}>`;for(const a in this._parameters)Object.prototype.hasOwnProperty.call(this._parameters,a)&&(o+=`;${a}`,this._parameters[a]!==null&&(o+=`=${this._parameters[a]}`));return o}},ba}var wa,Yc;function ls(){return Yc||(Yc=1,wa=function(){function c(r){return'"'+r.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g,escape)+'"'}var s={parse:function(r,o){var a={CRLF:d,DIGIT:g,ALPHA:T,HEXDIG:E,WSP:y,OCTET:A,DQUOTE:C,SP:I,HTAB:$,alphanum:L,reserved:ae,unreserved:N,mark:F,escaped:Se,LWS:ve,SWS:M,HCOLON:D,TEXT_UTF8_TRIM:B,TEXT_UTF8char:q,UTF8_NONASCII:z,UTF8_CONT:H,LHEX:X,token:U,token_nodot:P,separators:se,word:tt,STAR:ee,SLASH:W,EQUAL:G,LPAREN:re,RPAREN:ge,RAQUOT:be,LAQUOT:xe,COMMA:Ce,SEMI:le,COLON:ye,LDQUOT:st,RDQUOT:lt,comment:Ee,ctext:Ae,quoted_string:Ie,quoted_string_clean:Oe,qdtext:pe,quoted_pair:ue,SIP_URI_noparams:de,SIP_URI:we,uri_scheme:Ne,uri_scheme_sips:Qe,uri_scheme_sip:Le,userinfo:kt,user:ht,user_unreserved:Cn,password:Rn,hostport:Gs,host:Xt,hostname:os,domainlabel:Ws,toplabel:In,IPv6reference:bn,IPv6address:Ks,h16:me,ls32:oe,IPv4address:ot,dec_octet:Gt,port:Ss,uri_parameters:gr,uri_parameter:wn,transport_param:On,user_param:Tr,method_param:vr,ttl_param:Er,maddr_param:Sr,lr_param:yr,other_param:Ar,pname:Cr,pvalue:Rr,paramchar:ys,param_unreserved:As,headers:Ir,header:Ys,hname:zs,hvalue:br,hnv_unreserved:Cs,Request_Response:Js,Request_Line:_l,Request_URI:wr,absoluteURI:Dn,hier_part:Nn,net_path:Or,abs_path:Xs,opaque_part:Qs,uric:Rs,uric_no_slash:Is,path_segments:Dr,segment:Zs,param:bs,pchar:as,scheme:ws,authority:Nr,srvr:Ur,reg_name:Pr,query:xr,SIP_Version:Un,INVITEm:Pn,ACKm:Mr,OPTIONSm:kr,BYEm:Lr,CANCELm:$r,REGISTERm:Hr,SUBSCRIBEm:Fr,NOTIFYm:jr,REFERm:Vr,Method:en,Status_Line:tn,Status_Code:qr,extension_code:Br,Reason_Phrase:Gr,Allow_Events:hl,Call_ID:Vo,Contact:qo,contact_param:xn,name_addr:Lt,display_name:$t,contact_params:Os,c_p_q:Mn,c_p_expires:Wr,delta_seconds:Qt,qvalue:Zt,generic_param:Ge,gen_value:We,Content_Disposition:dl,disp_type:pl,disp_param:kn,handling_param:Ln,Content_Encoding:ml,Content_Length:Bo,Content_Type:Go,media_type:gl,m_type:Kr,discrete_type:Yr,composite_type:zr,extension_token:sn,x_token:nn,m_subtype:Jr,m_parameter:$n,m_value:Hn,CSeq:Tl,CSeq_value:vl,Expires:El,Event:Wo,event_type:rn,From:ln,from_param:Xr,tag_param:on,Max_Forwards:Qr,Min_Expires:Ko,Name_Addr_Header:Yo,Proxy_Authenticate:zo,challenge:Zr,other_challenge:Fn,auth_param:Ds,digest_cln:es,realm:an,realm_value:ei,domain:ti,URI:un,nonce:cn,nonce_value:si,opaque:ni,stale:ri,algorithm:ii,qop_options:li,qop_value:fn,Proxy_Require:jn,Record_Route:Jo,rec_route:Vn,Reason:qn,reason_param:oi,reason_cause:Bn,Require:Sl,Route:Xo,route_param:Gn,Subscription_State:Wn,substate_value:yl,subexp_params:Kn,event_reason_value:Yn,Subject:Al,Supported:Qo,To:Zo,to_param:ai,Via:ui,via_param:zn,via_params:Ns,via_ttl:Jn,via_maddr:ci,via_received:fi,via_branch:_i,response_port:hi,rport:di,sent_protocol:pi,protocol_name:mi,transport:gi,sent_by:Ti,via_host:vi,via_port:Ei,ttl:Xn,WWW_Authenticate:Si,Session_Expires:ea,s_e_expires:Cl,s_e_params:Qn,s_e_refresher:Zn,extension_header:Rl,header_value:Il,message_body:bl,uuid_URI:ta,uuid:wl,hex4:Ht,hex8:Ft,hex12:yi,Refer_To:Ol,Replaces:sa,call_id:Dl,replaces_param:er,to_tag:tr,from_tag:Ai,early_flag:Ci};if(o!==void 0){if(a[o]===void 0)throw new Error("Invalid rule name: "+c(o)+".")}else o="CRLF";var t=0,n=0,p=[];function _(i){t<n||(t>n&&(n=t,p=[]),p.push(i))}function d(){var i;return r.substr(t,2)===`\r
|
73
73
|
`?(i=`\r
|
74
74
|
`,t+=2):(i=null,_('"\\r\\n"')),i}function g(){var i;return/^[0-9]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[0-9]")),i}function T(){var i;return/^[a-zA-Z]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[a-zA-Z]")),i}function E(){var i;return/^[0-9a-fA-F]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[0-9a-fA-F]")),i}function y(){var i;return i=I(),i===null&&(i=$()),i}function A(){var i;return/^[\0-\xFF]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[\\0-\\xFF]")),i}function C(){var i;return/^["]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_('["]')),i}function I(){var i;return r.charCodeAt(t)===32?(i=" ",t++):(i=null,_('" "')),i}function $(){var i;return r.charCodeAt(t)===9?(i=" ",t++):(i=null,_('"\\t"')),i}function L(){var i;return/^[a-zA-Z0-9]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[a-zA-Z0-9]")),i}function ae(){var i;return r.charCodeAt(t)===59?(i=";",t++):(i=null,_('";"')),i===null&&(r.charCodeAt(t)===47?(i="/",t++):(i=null,_('"/"')),i===null&&(r.charCodeAt(t)===63?(i="?",t++):(i=null,_('"?"')),i===null&&(r.charCodeAt(t)===58?(i=":",t++):(i=null,_('":"')),i===null&&(r.charCodeAt(t)===64?(i="@",t++):(i=null,_('"@"')),i===null&&(r.charCodeAt(t)===38?(i="&",t++):(i=null,_('"&"')),i===null&&(r.charCodeAt(t)===61?(i="=",t++):(i=null,_('"="')),i===null&&(r.charCodeAt(t)===43?(i="+",t++):(i=null,_('"+"')),i===null&&(r.charCodeAt(t)===36?(i="$",t++):(i=null,_('"$"')),i===null&&(r.charCodeAt(t)===44?(i=",",t++):(i=null,_('","'))))))))))),i}function N(){var i;return i=L(),i===null&&(i=F()),i}function F(){var i;return r.charCodeAt(t)===45?(i="-",t++):(i=null,_('"-"')),i===null&&(r.charCodeAt(t)===95?(i="_",t++):(i=null,_('"_"')),i===null&&(r.charCodeAt(t)===46?(i=".",t++):(i=null,_('"."')),i===null&&(r.charCodeAt(t)===33?(i="!",t++):(i=null,_('"!"')),i===null&&(r.charCodeAt(t)===126?(i="~",t++):(i=null,_('"~"')),i===null&&(r.charCodeAt(t)===42?(i="*",t++):(i=null,_('"*"')),i===null&&(r.charCodeAt(t)===39?(i="'",t++):(i=null,_(`"'"`)),i===null&&(r.charCodeAt(t)===40?(i="(",t++):(i=null,_('"("')),i===null&&(r.charCodeAt(t)===41?(i=")",t++):(i=null,_('")"')))))))))),i}function Se(){var i,e,l,u,f;return u=t,f=t,r.charCodeAt(t)===37?(i="%",t++):(i=null,_('"%"')),i!==null?(e=E(),e!==null?(l=E(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){return m.join("")}(u,i)),i===null&&(t=u),i}function ve(){var i,e,l,u,f,h;for(u=t,f=t,h=t,i=[],e=y();e!==null;)i.push(e),e=y();if(i!==null?(e=d(),e!==null?i=[i,e]:(i=null,t=h)):(i=null,t=h),i=i!==null?i:"",i!==null){if(l=y(),l!==null)for(e=[];l!==null;)e.push(l),l=y();else e=null;e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i!==null&&(i=function(m){return" "}()),i===null&&(t=u),i}function M(){var i;return i=ve(),i=i!==null?i:"",i}function D(){var i,e,l,u,f;for(u=t,f=t,i=[],e=I(),e===null&&(e=$());e!==null;)i.push(e),e=I(),e===null&&(e=$());return i!==null?(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return":"}()),i===null&&(t=u),i}function B(){var i,e,l,u,f,h,m;if(f=t,h=t,e=q(),e!==null)for(i=[];e!==null;)i.push(e),e=q();else i=null;if(i!==null){for(e=[],m=t,l=[],u=ve();u!==null;)l.push(u),u=ve();for(l!==null?(u=q(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;){for(e.push(l),m=t,l=[],u=ve();u!==null;)l.push(u),u=ve();l!==null?(u=q(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m)}e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){return r.substring(t,v)}(f)),i===null&&(t=f),i}function q(){var i;return/^[!-~]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[!-~]")),i===null&&(i=z()),i}function z(){var i;return/^[\x80-\uFFFF]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[\\x80-\\uFFFF]")),i}function H(){var i;return/^[\x80-\xBF]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[\\x80-\\xBF]")),i}function X(){var i;return i=g(),i===null&&(/^[a-f]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[a-f]"))),i}function U(){var i,e,l;if(l=t,e=L(),e===null&&(r.charCodeAt(t)===45?(e="-",t++):(e=null,_('"-"')),e===null&&(r.charCodeAt(t)===46?(e=".",t++):(e=null,_('"."')),e===null&&(r.charCodeAt(t)===33?(e="!",t++):(e=null,_('"!"')),e===null&&(r.charCodeAt(t)===37?(e="%",t++):(e=null,_('"%"')),e===null&&(r.charCodeAt(t)===42?(e="*",t++):(e=null,_('"*"')),e===null&&(r.charCodeAt(t)===95?(e="_",t++):(e=null,_('"_"')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===96?(e="`",t++):(e=null,_('"`"')),e===null&&(r.charCodeAt(t)===39?(e="'",t++):(e=null,_(`"'"`)),e===null&&(r.charCodeAt(t)===126?(e="~",t++):(e=null,_('"~"')))))))))))),e!==null)for(i=[];e!==null;)i.push(e),e=L(),e===null&&(r.charCodeAt(t)===45?(e="-",t++):(e=null,_('"-"')),e===null&&(r.charCodeAt(t)===46?(e=".",t++):(e=null,_('"."')),e===null&&(r.charCodeAt(t)===33?(e="!",t++):(e=null,_('"!"')),e===null&&(r.charCodeAt(t)===37?(e="%",t++):(e=null,_('"%"')),e===null&&(r.charCodeAt(t)===42?(e="*",t++):(e=null,_('"*"')),e===null&&(r.charCodeAt(t)===95?(e="_",t++):(e=null,_('"_"')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===96?(e="`",t++):(e=null,_('"`"')),e===null&&(r.charCodeAt(t)===39?(e="'",t++):(e=null,_(`"'"`)),e===null&&(r.charCodeAt(t)===126?(e="~",t++):(e=null,_('"~"'))))))))))));else i=null;return i!==null&&(i=function(u){return r.substring(t,u)}(l)),i===null&&(t=l),i}function P(){var i,e,l;if(l=t,e=L(),e===null&&(r.charCodeAt(t)===45?(e="-",t++):(e=null,_('"-"')),e===null&&(r.charCodeAt(t)===33?(e="!",t++):(e=null,_('"!"')),e===null&&(r.charCodeAt(t)===37?(e="%",t++):(e=null,_('"%"')),e===null&&(r.charCodeAt(t)===42?(e="*",t++):(e=null,_('"*"')),e===null&&(r.charCodeAt(t)===95?(e="_",t++):(e=null,_('"_"')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===96?(e="`",t++):(e=null,_('"`"')),e===null&&(r.charCodeAt(t)===39?(e="'",t++):(e=null,_(`"'"`)),e===null&&(r.charCodeAt(t)===126?(e="~",t++):(e=null,_('"~"'))))))))))),e!==null)for(i=[];e!==null;)i.push(e),e=L(),e===null&&(r.charCodeAt(t)===45?(e="-",t++):(e=null,_('"-"')),e===null&&(r.charCodeAt(t)===33?(e="!",t++):(e=null,_('"!"')),e===null&&(r.charCodeAt(t)===37?(e="%",t++):(e=null,_('"%"')),e===null&&(r.charCodeAt(t)===42?(e="*",t++):(e=null,_('"*"')),e===null&&(r.charCodeAt(t)===95?(e="_",t++):(e=null,_('"_"')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===96?(e="`",t++):(e=null,_('"`"')),e===null&&(r.charCodeAt(t)===39?(e="'",t++):(e=null,_(`"'"`)),e===null&&(r.charCodeAt(t)===126?(e="~",t++):(e=null,_('"~"')))))))))));else i=null;return i!==null&&(i=function(u){return r.substring(t,u)}(l)),i===null&&(t=l),i}function se(){var i;return r.charCodeAt(t)===40?(i="(",t++):(i=null,_('"("')),i===null&&(r.charCodeAt(t)===41?(i=")",t++):(i=null,_('")"')),i===null&&(r.charCodeAt(t)===60?(i="<",t++):(i=null,_('"<"')),i===null&&(r.charCodeAt(t)===62?(i=">",t++):(i=null,_('">"')),i===null&&(r.charCodeAt(t)===64?(i="@",t++):(i=null,_('"@"')),i===null&&(r.charCodeAt(t)===44?(i=",",t++):(i=null,_('","')),i===null&&(r.charCodeAt(t)===59?(i=";",t++):(i=null,_('";"')),i===null&&(r.charCodeAt(t)===58?(i=":",t++):(i=null,_('":"')),i===null&&(r.charCodeAt(t)===92?(i="\\",t++):(i=null,_('"\\\\"')),i===null&&(i=C(),i===null&&(r.charCodeAt(t)===47?(i="/",t++):(i=null,_('"/"')),i===null&&(r.charCodeAt(t)===91?(i="[",t++):(i=null,_('"["')),i===null&&(r.charCodeAt(t)===93?(i="]",t++):(i=null,_('"]"')),i===null&&(r.charCodeAt(t)===63?(i="?",t++):(i=null,_('"?"')),i===null&&(r.charCodeAt(t)===61?(i="=",t++):(i=null,_('"="')),i===null&&(r.charCodeAt(t)===123?(i="{",t++):(i=null,_('"{"')),i===null&&(r.charCodeAt(t)===125?(i="}",t++):(i=null,_('"}"')),i===null&&(i=I(),i===null&&(i=$())))))))))))))))))),i}function tt(){var i,e,l;if(l=t,e=L(),e===null&&(r.charCodeAt(t)===45?(e="-",t++):(e=null,_('"-"')),e===null&&(r.charCodeAt(t)===46?(e=".",t++):(e=null,_('"."')),e===null&&(r.charCodeAt(t)===33?(e="!",t++):(e=null,_('"!"')),e===null&&(r.charCodeAt(t)===37?(e="%",t++):(e=null,_('"%"')),e===null&&(r.charCodeAt(t)===42?(e="*",t++):(e=null,_('"*"')),e===null&&(r.charCodeAt(t)===95?(e="_",t++):(e=null,_('"_"')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===96?(e="`",t++):(e=null,_('"`"')),e===null&&(r.charCodeAt(t)===39?(e="'",t++):(e=null,_(`"'"`)),e===null&&(r.charCodeAt(t)===126?(e="~",t++):(e=null,_('"~"')),e===null&&(r.charCodeAt(t)===40?(e="(",t++):(e=null,_('"("')),e===null&&(r.charCodeAt(t)===41?(e=")",t++):(e=null,_('")"')),e===null&&(r.charCodeAt(t)===60?(e="<",t++):(e=null,_('"<"')),e===null&&(r.charCodeAt(t)===62?(e=">",t++):(e=null,_('">"')),e===null&&(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e===null&&(r.charCodeAt(t)===92?(e="\\",t++):(e=null,_('"\\\\"')),e===null&&(e=C(),e===null&&(r.charCodeAt(t)===47?(e="/",t++):(e=null,_('"/"')),e===null&&(r.charCodeAt(t)===91?(e="[",t++):(e=null,_('"["')),e===null&&(r.charCodeAt(t)===93?(e="]",t++):(e=null,_('"]"')),e===null&&(r.charCodeAt(t)===63?(e="?",t++):(e=null,_('"?"')),e===null&&(r.charCodeAt(t)===123?(e="{",t++):(e=null,_('"{"')),e===null&&(r.charCodeAt(t)===125?(e="}",t++):(e=null,_('"}"'))))))))))))))))))))))))),e!==null)for(i=[];e!==null;)i.push(e),e=L(),e===null&&(r.charCodeAt(t)===45?(e="-",t++):(e=null,_('"-"')),e===null&&(r.charCodeAt(t)===46?(e=".",t++):(e=null,_('"."')),e===null&&(r.charCodeAt(t)===33?(e="!",t++):(e=null,_('"!"')),e===null&&(r.charCodeAt(t)===37?(e="%",t++):(e=null,_('"%"')),e===null&&(r.charCodeAt(t)===42?(e="*",t++):(e=null,_('"*"')),e===null&&(r.charCodeAt(t)===95?(e="_",t++):(e=null,_('"_"')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===96?(e="`",t++):(e=null,_('"`"')),e===null&&(r.charCodeAt(t)===39?(e="'",t++):(e=null,_(`"'"`)),e===null&&(r.charCodeAt(t)===126?(e="~",t++):(e=null,_('"~"')),e===null&&(r.charCodeAt(t)===40?(e="(",t++):(e=null,_('"("')),e===null&&(r.charCodeAt(t)===41?(e=")",t++):(e=null,_('")"')),e===null&&(r.charCodeAt(t)===60?(e="<",t++):(e=null,_('"<"')),e===null&&(r.charCodeAt(t)===62?(e=">",t++):(e=null,_('">"')),e===null&&(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e===null&&(r.charCodeAt(t)===92?(e="\\",t++):(e=null,_('"\\\\"')),e===null&&(e=C(),e===null&&(r.charCodeAt(t)===47?(e="/",t++):(e=null,_('"/"')),e===null&&(r.charCodeAt(t)===91?(e="[",t++):(e=null,_('"["')),e===null&&(r.charCodeAt(t)===93?(e="]",t++):(e=null,_('"]"')),e===null&&(r.charCodeAt(t)===63?(e="?",t++):(e=null,_('"?"')),e===null&&(r.charCodeAt(t)===123?(e="{",t++):(e=null,_('"{"')),e===null&&(r.charCodeAt(t)===125?(e="}",t++):(e=null,_('"}"')))))))))))))))))))))))));else i=null;return i!==null&&(i=function(u){return r.substring(t,u)}(l)),i===null&&(t=l),i}function ee(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===42?(e="*",t++):(e=null,_('"*"')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return"*"}()),i===null&&(t=u),i}function W(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===47?(e="/",t++):(e=null,_('"/"')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return"/"}()),i===null&&(t=u),i}function G(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return"="}()),i===null&&(t=u),i}function re(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===40?(e="(",t++):(e=null,_('"("')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return"("}()),i===null&&(t=u),i}function ge(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===41?(e=")",t++):(e=null,_('")"')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return")"}()),i===null&&(t=u),i}function be(){var i,e,l,u;return l=t,u=t,r.charCodeAt(t)===62?(i=">",t++):(i=null,_('">"')),i!==null?(e=M(),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f){return">"}()),i===null&&(t=l),i}function xe(){var i,e,l,u;return l=t,u=t,i=M(),i!==null?(r.charCodeAt(t)===60?(e="<",t++):(e=null,_('"<"')),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f){return"<"}()),i===null&&(t=l),i}function Ce(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===44?(e=",",t++):(e=null,_('","')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return","}()),i===null&&(t=u),i}function le(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===59?(e=";",t++):(e=null,_('";"')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return";"}()),i===null&&(t=u),i}function ye(){var i,e,l,u,f;return u=t,f=t,i=M(),i!==null?(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=M(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return":"}()),i===null&&(t=u),i}function st(){var i,e,l,u;return l=t,u=t,i=M(),i!==null?(e=C(),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f){return'"'}()),i===null&&(t=l),i}function lt(){var i,e,l,u;return l=t,u=t,i=C(),i!==null?(e=M(),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f){return'"'}()),i===null&&(t=l),i}function Ee(){var i,e,l,u;if(u=t,i=re(),i!==null){for(e=[],l=Ae(),l===null&&(l=ue(),l===null&&(l=Ee()));l!==null;)e.push(l),l=Ae(),l===null&&(l=ue(),l===null&&(l=Ee()));e!==null?(l=ge(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)}else i=null,t=u;return i}function Ae(){var i;return/^[!-']/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[!-']")),i===null&&(/^[*-[]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[*-[]")),i===null&&(/^[\]-~]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[\\]-~]")),i===null&&(i=z(),i===null&&(i=ve())))),i}function Ie(){var i,e,l,u,f,h;if(f=t,h=t,i=M(),i!==null)if(e=C(),e!==null){for(l=[],u=pe(),u===null&&(u=ue());u!==null;)l.push(u),u=pe(),u===null&&(u=ue());l!==null?(u=C(),u!==null?i=[i,e,l,u]:(i=null,t=h)):(i=null,t=h)}else i=null,t=h;else i=null,t=h;return i!==null&&(i=function(m){return r.substring(t,m)}(f)),i===null&&(t=f),i}function Oe(){var i,e,l,u,f,h;if(f=t,h=t,i=M(),i!==null)if(e=C(),e!==null){for(l=[],u=pe(),u===null&&(u=ue());u!==null;)l.push(u),u=pe(),u===null&&(u=ue());l!==null?(u=C(),u!==null?i=[i,e,l,u]:(i=null,t=h)):(i=null,t=h)}else i=null,t=h;else i=null,t=h;return i!==null&&(i=function(m){var v=r.substring(t,m).trim();return v.substring(1,v.length-1).replace(/\\([\x00-\x09\x0b-\x0c\x0e-\x7f])/g,"$1")}(f)),i===null&&(t=f),i}function pe(){var i;return i=ve(),i===null&&(r.charCodeAt(t)===33?(i="!",t++):(i=null,_('"!"')),i===null&&(/^[#-[]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[#-[]")),i===null&&(/^[\]-~]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[\\]-~]")),i===null&&(i=z())))),i}function ue(){var i,e,l;return l=t,r.charCodeAt(t)===92?(i="\\",t++):(i=null,_('"\\\\"')),i!==null?(/^[\0-\t]/.test(r.charAt(t))?(e=r.charAt(t),t++):(e=null,_("[\\0-\\t]")),e===null&&(/^[\x0B-\f]/.test(r.charAt(t))?(e=r.charAt(t),t++):(e=null,_("[\\x0B-\\f]")),e===null&&(/^[\x0E-]/.test(r.charAt(t))?(e=r.charAt(t),t++):(e=null,_("[\\x0E-]")))),e!==null?i=[i,e]:(i=null,t=l)):(i=null,t=l),i}function de(){var i,e,l,u,f,h;return f=t,h=t,i=Ne(),i!==null?(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=kt(),l=l!==null?l:"",l!==null?(u=Gs(),u!==null?i=[i,e,l,u]:(i=null,t=h)):(i=null,t=h)):(i=null,t=h)):(i=null,t=h),i!==null&&(i=function(m){try{b.uri=new Ul(b.scheme,b.user,b.host,b.port),delete b.scheme,delete b.user,delete b.host,delete b.host_type,delete b.port}catch{b=-1}}()),i===null&&(t=f),i}function we(){var i,e,l,u,f,h,m,v;return m=t,v=t,i=Ne(),i!==null?(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=kt(),l=l!==null?l:"",l!==null?(u=Gs(),u!==null?(f=gr(),f!==null?(h=Ir(),h=h!==null?h:"",h!==null?i=[i,e,l,u,f,h]:(i=null,t=v)):(i=null,t=v)):(i=null,t=v)):(i=null,t=v)):(i=null,t=v)):(i=null,t=v),i!==null&&(i=function(S){try{b.uri=new Ul(b.scheme,b.user,b.host,b.port,b.uri_params,b.uri_headers),delete b.scheme,delete b.user,delete b.host,delete b.host_type,delete b.port,delete b.uri_params,o==="SIP_URI"&&(b=b.uri)}catch{b=-1}}()),i===null&&(t=m),i}function Ne(){var i;return i=Qe(),i===null&&(i=Le()),i}function Qe(){var i,e;return e=t,r.substr(t,4).toLowerCase()==="sips"?(i=r.substr(t,4),t+=4):(i=null,_('"sips"')),i!==null&&(i=function(l,u){b.scheme=u.toLowerCase()}(e,i)),i===null&&(t=e),i}function Le(){var i,e;return e=t,r.substr(t,3).toLowerCase()==="sip"?(i=r.substr(t,3),t+=3):(i=null,_('"sip"')),i!==null&&(i=function(l,u){b.scheme=u.toLowerCase()}(e,i)),i===null&&(t=e),i}function kt(){var i,e,l,u,f,h;return u=t,f=t,i=ht(),i!==null?(h=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=Rn(),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h),e=e!==null?e:"",e!==null?(r.charCodeAt(t)===64?(l="@",t++):(l=null,_('"@"')),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(m){b.user=decodeURIComponent(r.substring(t-1,m))}(u)),i===null&&(t=u),i}function ht(){var i,e;if(e=N(),e===null&&(e=Se(),e===null&&(e=Cn())),e!==null)for(i=[];e!==null;)i.push(e),e=N(),e===null&&(e=Se(),e===null&&(e=Cn()));else i=null;return i}function Cn(){var i;return r.charCodeAt(t)===38?(i="&",t++):(i=null,_('"&"')),i===null&&(r.charCodeAt(t)===61?(i="=",t++):(i=null,_('"="')),i===null&&(r.charCodeAt(t)===43?(i="+",t++):(i=null,_('"+"')),i===null&&(r.charCodeAt(t)===36?(i="$",t++):(i=null,_('"$"')),i===null&&(r.charCodeAt(t)===44?(i=",",t++):(i=null,_('","')),i===null&&(r.charCodeAt(t)===59?(i=";",t++):(i=null,_('";"')),i===null&&(r.charCodeAt(t)===63?(i="?",t++):(i=null,_('"?"')),i===null&&(r.charCodeAt(t)===47?(i="/",t++):(i=null,_('"/"'))))))))),i}function Rn(){var i,e,l;for(l=t,i=[],e=N(),e===null&&(e=Se(),e===null&&(r.charCodeAt(t)===38?(e="&",t++):(e=null,_('"&"')),e===null&&(r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===36?(e="$",t++):(e=null,_('"$"')),e===null&&(r.charCodeAt(t)===44?(e=",",t++):(e=null,_('","'))))))));e!==null;)i.push(e),e=N(),e===null&&(e=Se(),e===null&&(r.charCodeAt(t)===38?(e="&",t++):(e=null,_('"&"')),e===null&&(r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')),e===null&&(r.charCodeAt(t)===36?(e="$",t++):(e=null,_('"$"')),e===null&&(r.charCodeAt(t)===44?(e=",",t++):(e=null,_('","'))))))));return i!==null&&(i=function(u){b.password=r.substring(t,u)}(l)),i===null&&(t=l),i}function Gs(){var i,e,l,u,f;return u=t,i=Xt(),i!==null?(f=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=Ss(),l!==null?e=[e,l]:(e=null,t=f)):(e=null,t=f),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i}function Xt(){var i,e;return e=t,i=os(),i===null&&(i=ot(),i===null&&(i=bn())),i!==null&&(i=function(l){return b.host=r.substring(t,l).toLowerCase(),b.host}(e)),i===null&&(t=e),i}function os(){var i,e,l,u,f,h;for(u=t,f=t,i=[],h=t,e=Ws(),e!==null?(r.charCodeAt(t)===46?(l=".",t++):(l=null,_('"."')),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h);e!==null;)i.push(e),h=t,e=Ws(),e!==null?(r.charCodeAt(t)===46?(l=".",t++):(l=null,_('"."')),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h);return i!==null?(e=In(),e!==null?(r.charCodeAt(t)===46?(l=".",t++):(l=null,_('"."')),l=l!==null?l:"",l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(m){return b.host_type="domain",r.substring(t,m)}(u)),i===null&&(t=u),i}function Ws(){var i,e,l,u;if(u=t,i=L(),i!==null){for(e=[],l=L(),l===null&&(r.charCodeAt(t)===45?(l="-",t++):(l=null,_('"-"')),l===null&&(r.charCodeAt(t)===95?(l="_",t++):(l=null,_('"_"'))));l!==null;)e.push(l),l=L(),l===null&&(r.charCodeAt(t)===45?(l="-",t++):(l=null,_('"-"')),l===null&&(r.charCodeAt(t)===95?(l="_",t++):(l=null,_('"_"'))));e!==null?i=[i,e]:(i=null,t=u)}else i=null,t=u;return i}function In(){var i,e,l,u;if(u=t,i=T(),i!==null){for(e=[],l=L(),l===null&&(r.charCodeAt(t)===45?(l="-",t++):(l=null,_('"-"')),l===null&&(r.charCodeAt(t)===95?(l="_",t++):(l=null,_('"_"'))));l!==null;)e.push(l),l=L(),l===null&&(r.charCodeAt(t)===45?(l="-",t++):(l=null,_('"-"')),l===null&&(r.charCodeAt(t)===95?(l="_",t++):(l=null,_('"_"'))));e!==null?i=[i,e]:(i=null,t=u)}else i=null,t=u;return i}function bn(){var i,e,l,u,f;return u=t,f=t,r.charCodeAt(t)===91?(i="[",t++):(i=null,_('"["')),i!==null?(e=Ks(),e!==null?(r.charCodeAt(t)===93?(l="]",t++):(l=null,_('"]"')),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h){return b.host_type="IPv6",r.substring(t,h)}(u)),i===null&&(t=u),i}function Ks(){var i,e,l,u,f,h,m,v,S,O,ie,Ue,bt,Us,k,R;return Us=t,k=t,i=me(),i!==null?(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?(r.charCodeAt(t)===58?(u=":",t++):(u=null,_('":"')),u!==null?(f=me(),f!==null?(r.charCodeAt(t)===58?(h=":",t++):(h=null,_('":"')),h!==null?(m=me(),m!==null?(r.charCodeAt(t)===58?(v=":",t++):(v=null,_('":"')),v!==null?(S=me(),S!==null?(r.charCodeAt(t)===58?(O=":",t++):(O=null,_('":"')),O!==null?(ie=me(),ie!==null?(r.charCodeAt(t)===58?(Ue=":",t++):(Ue=null,_('":"')),Ue!==null?(bt=oe(),bt!==null?i=[i,e,l,u,f,h,m,v,S,O,ie,Ue,bt]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,r.substr(t,2)==="::"?(i="::",t+=2):(i=null,_('"::"')),i!==null?(e=me(),e!==null?(r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?(r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=me(),h!==null?(r.charCodeAt(t)===58?(m=":",t++):(m=null,_('":"')),m!==null?(v=me(),v!==null?(r.charCodeAt(t)===58?(S=":",t++):(S=null,_('":"')),S!==null?(O=me(),O!==null?(r.charCodeAt(t)===58?(ie=":",t++):(ie=null,_('":"')),ie!==null?(Ue=oe(),Ue!==null?i=[i,e,l,u,f,h,m,v,S,O,ie,Ue]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,r.substr(t,2)==="::"?(i="::",t+=2):(i=null,_('"::"')),i!==null?(e=me(),e!==null?(r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?(r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=me(),h!==null?(r.charCodeAt(t)===58?(m=":",t++):(m=null,_('":"')),m!==null?(v=me(),v!==null?(r.charCodeAt(t)===58?(S=":",t++):(S=null,_('":"')),S!==null?(O=oe(),O!==null?i=[i,e,l,u,f,h,m,v,S,O]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,r.substr(t,2)==="::"?(i="::",t+=2):(i=null,_('"::"')),i!==null?(e=me(),e!==null?(r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?(r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=me(),h!==null?(r.charCodeAt(t)===58?(m=":",t++):(m=null,_('":"')),m!==null?(v=oe(),v!==null?i=[i,e,l,u,f,h,m,v]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,r.substr(t,2)==="::"?(i="::",t+=2):(i=null,_('"::"')),i!==null?(e=me(),e!==null?(r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?(r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=oe(),h!==null?i=[i,e,l,u,f,h]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,r.substr(t,2)==="::"?(i="::",t+=2):(i=null,_('"::"')),i!==null?(e=me(),e!==null?(r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=oe(),u!==null?i=[i,e,l,u]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,r.substr(t,2)==="::"?(i="::",t+=2):(i=null,_('"::"')),i!==null?(e=oe(),e!==null?i=[i,e]:(i=null,t=k)):(i=null,t=k),i===null&&(k=t,r.substr(t,2)==="::"?(i="::",t+=2):(i=null,_('"::"')),i!==null?(e=me(),e!==null?i=[i,e]:(i=null,t=k)):(i=null,t=k),i===null&&(k=t,i=me(),i!==null?(r.substr(t,2)==="::"?(e="::",t+=2):(e=null,_('"::"')),e!==null?(l=me(),l!==null?(r.charCodeAt(t)===58?(u=":",t++):(u=null,_('":"')),u!==null?(f=me(),f!==null?(r.charCodeAt(t)===58?(h=":",t++):(h=null,_('":"')),h!==null?(m=me(),m!==null?(r.charCodeAt(t)===58?(v=":",t++):(v=null,_('":"')),v!==null?(S=me(),S!==null?(r.charCodeAt(t)===58?(O=":",t++):(O=null,_('":"')),O!==null?(ie=oe(),ie!==null?i=[i,e,l,u,f,h,m,v,S,O,ie]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,i=me(),i!==null?(R=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?e=[e,l]:(e=null,t=R)):(e=null,t=R),e=e!==null?e:"",e!==null?(r.substr(t,2)==="::"?(l="::",t+=2):(l=null,_('"::"')),l!==null?(u=me(),u!==null?(r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=me(),h!==null?(r.charCodeAt(t)===58?(m=":",t++):(m=null,_('":"')),m!==null?(v=me(),v!==null?(r.charCodeAt(t)===58?(S=":",t++):(S=null,_('":"')),S!==null?(O=oe(),O!==null?i=[i,e,l,u,f,h,m,v,S,O]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,i=me(),i!==null?(R=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?e=[e,l]:(e=null,t=R)):(e=null,t=R),e=e!==null?e:"",e!==null?(R=t,r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?l=[l,u]:(l=null,t=R)):(l=null,t=R),l=l!==null?l:"",l!==null?(r.substr(t,2)==="::"?(u="::",t+=2):(u=null,_('"::"')),u!==null?(f=me(),f!==null?(r.charCodeAt(t)===58?(h=":",t++):(h=null,_('":"')),h!==null?(m=me(),m!==null?(r.charCodeAt(t)===58?(v=":",t++):(v=null,_('":"')),v!==null?(S=oe(),S!==null?i=[i,e,l,u,f,h,m,v,S]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,i=me(),i!==null?(R=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?e=[e,l]:(e=null,t=R)):(e=null,t=R),e=e!==null?e:"",e!==null?(R=t,r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?l=[l,u]:(l=null,t=R)):(l=null,t=R),l=l!==null?l:"",l!==null?(R=t,r.charCodeAt(t)===58?(u=":",t++):(u=null,_('":"')),u!==null?(f=me(),f!==null?u=[u,f]:(u=null,t=R)):(u=null,t=R),u=u!==null?u:"",u!==null?(r.substr(t,2)==="::"?(f="::",t+=2):(f=null,_('"::"')),f!==null?(h=me(),h!==null?(r.charCodeAt(t)===58?(m=":",t++):(m=null,_('":"')),m!==null?(v=oe(),v!==null?i=[i,e,l,u,f,h,m,v]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,i=me(),i!==null?(R=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?e=[e,l]:(e=null,t=R)):(e=null,t=R),e=e!==null?e:"",e!==null?(R=t,r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?l=[l,u]:(l=null,t=R)):(l=null,t=R),l=l!==null?l:"",l!==null?(R=t,r.charCodeAt(t)===58?(u=":",t++):(u=null,_('":"')),u!==null?(f=me(),f!==null?u=[u,f]:(u=null,t=R)):(u=null,t=R),u=u!==null?u:"",u!==null?(R=t,r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=me(),h!==null?f=[f,h]:(f=null,t=R)):(f=null,t=R),f=f!==null?f:"",f!==null?(r.substr(t,2)==="::"?(h="::",t+=2):(h=null,_('"::"')),h!==null?(m=oe(),m!==null?i=[i,e,l,u,f,h,m]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,i=me(),i!==null?(R=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?e=[e,l]:(e=null,t=R)):(e=null,t=R),e=e!==null?e:"",e!==null?(R=t,r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?l=[l,u]:(l=null,t=R)):(l=null,t=R),l=l!==null?l:"",l!==null?(R=t,r.charCodeAt(t)===58?(u=":",t++):(u=null,_('":"')),u!==null?(f=me(),f!==null?u=[u,f]:(u=null,t=R)):(u=null,t=R),u=u!==null?u:"",u!==null?(R=t,r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=me(),h!==null?f=[f,h]:(f=null,t=R)):(f=null,t=R),f=f!==null?f:"",f!==null?(R=t,r.charCodeAt(t)===58?(h=":",t++):(h=null,_('":"')),h!==null?(m=me(),m!==null?h=[h,m]:(h=null,t=R)):(h=null,t=R),h=h!==null?h:"",h!==null?(r.substr(t,2)==="::"?(m="::",t+=2):(m=null,_('"::"')),m!==null?(v=me(),v!==null?i=[i,e,l,u,f,h,m,v]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k),i===null&&(k=t,i=me(),i!==null?(R=t,r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?e=[e,l]:(e=null,t=R)):(e=null,t=R),e=e!==null?e:"",e!==null?(R=t,r.charCodeAt(t)===58?(l=":",t++):(l=null,_('":"')),l!==null?(u=me(),u!==null?l=[l,u]:(l=null,t=R)):(l=null,t=R),l=l!==null?l:"",l!==null?(R=t,r.charCodeAt(t)===58?(u=":",t++):(u=null,_('":"')),u!==null?(f=me(),f!==null?u=[u,f]:(u=null,t=R)):(u=null,t=R),u=u!==null?u:"",u!==null?(R=t,r.charCodeAt(t)===58?(f=":",t++):(f=null,_('":"')),f!==null?(h=me(),h!==null?f=[f,h]:(f=null,t=R)):(f=null,t=R),f=f!==null?f:"",f!==null?(R=t,r.charCodeAt(t)===58?(h=":",t++):(h=null,_('":"')),h!==null?(m=me(),m!==null?h=[h,m]:(h=null,t=R)):(h=null,t=R),h=h!==null?h:"",h!==null?(R=t,r.charCodeAt(t)===58?(m=":",t++):(m=null,_('":"')),m!==null?(v=me(),v!==null?m=[m,v]:(m=null,t=R)):(m=null,t=R),m=m!==null?m:"",m!==null?(r.substr(t,2)==="::"?(v="::",t+=2):(v=null,_('"::"')),v!==null?i=[i,e,l,u,f,h,m,v]:(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k)):(i=null,t=k))))))))))))))),i!==null&&(i=function(Te){return b.host_type="IPv6",r.substring(t,Te)}(Us)),i===null&&(t=Us),i}function me(){var i,e,l,u,f;return f=t,i=E(),i!==null?(e=E(),e=e!==null?e:"",e!==null?(l=E(),l=l!==null?l:"",l!==null?(u=E(),u=u!==null?u:"",u!==null?i=[i,e,l,u]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i}function oe(){var i,e,l,u;return u=t,i=me(),i!==null?(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=me(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i===null&&(i=ot()),i}function ot(){var i,e,l,u,f,h,m,v,S;return v=t,S=t,i=Gt(),i!==null?(r.charCodeAt(t)===46?(e=".",t++):(e=null,_('"."')),e!==null?(l=Gt(),l!==null?(r.charCodeAt(t)===46?(u=".",t++):(u=null,_('"."')),u!==null?(f=Gt(),f!==null?(r.charCodeAt(t)===46?(h=".",t++):(h=null,_('"."')),h!==null?(m=Gt(),m!==null?i=[i,e,l,u,f,h,m]:(i=null,t=S)):(i=null,t=S)):(i=null,t=S)):(i=null,t=S)):(i=null,t=S)):(i=null,t=S)):(i=null,t=S),i!==null&&(i=function(O){return b.host_type="IPv4",r.substring(t,O)}(v)),i===null&&(t=v),i}function Gt(){var i,e,l,u;return u=t,r.substr(t,2)==="25"?(i="25",t+=2):(i=null,_('"25"')),i!==null?(/^[0-5]/.test(r.charAt(t))?(e=r.charAt(t),t++):(e=null,_("[0-5]")),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i===null&&(u=t,r.charCodeAt(t)===50?(i="2",t++):(i=null,_('"2"')),i!==null?(/^[0-4]/.test(r.charAt(t))?(e=r.charAt(t),t++):(e=null,_("[0-4]")),e!==null?(l=g(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i===null&&(u=t,r.charCodeAt(t)===49?(i="1",t++):(i=null,_('"1"')),i!==null?(e=g(),e!==null?(l=g(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i===null&&(u=t,/^[1-9]/.test(r.charAt(t))?(i=r.charAt(t),t++):(i=null,_("[1-9]")),i!==null?(e=g(),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i===null&&(i=g())))),i}function Ss(){var i,e,l,u,f,h,m;return h=t,m=t,i=g(),i=i!==null?i:"",i!==null?(e=g(),e=e!==null?e:"",e!==null?(l=g(),l=l!==null?l:"",l!==null?(u=g(),u=u!==null?u:"",u!==null?(f=g(),f=f!==null?f:"",f!==null?i=[i,e,l,u,f]:(i=null,t=m)):(i=null,t=m)):(i=null,t=m)):(i=null,t=m)):(i=null,t=m),i!==null&&(i=function(v,S){return S=parseInt(S.join("")),b.port=S,S}(h,i)),i===null&&(t=h),i}function gr(){var i,e,l,u;for(i=[],u=t,r.charCodeAt(t)===59?(e=";",t++):(e=null,_('";"')),e!==null?(l=wn(),l!==null?e=[e,l]:(e=null,t=u)):(e=null,t=u);e!==null;)i.push(e),u=t,r.charCodeAt(t)===59?(e=";",t++):(e=null,_('";"')),e!==null?(l=wn(),l!==null?e=[e,l]:(e=null,t=u)):(e=null,t=u);return i}function wn(){var i;return i=On(),i===null&&(i=Tr(),i===null&&(i=vr(),i===null&&(i=Er(),i===null&&(i=Sr(),i===null&&(i=yr(),i===null&&(i=Ar())))))),i}function On(){var i,e,l,u;return l=t,u=t,r.substr(t,10).toLowerCase()==="transport="?(i=r.substr(t,10),t+=10):(i=null,_('"transport="')),i!==null?(r.substr(t,3).toLowerCase()==="udp"?(e=r.substr(t,3),t+=3):(e=null,_('"udp"')),e===null&&(r.substr(t,3).toLowerCase()==="tcp"?(e=r.substr(t,3),t+=3):(e=null,_('"tcp"')),e===null&&(r.substr(t,4).toLowerCase()==="sctp"?(e=r.substr(t,4),t+=4):(e=null,_('"sctp"')),e===null&&(r.substr(t,3).toLowerCase()==="tls"?(e=r.substr(t,3),t+=3):(e=null,_('"tls"')),e===null&&(e=U())))),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f,h){b.uri_params||(b.uri_params={}),b.uri_params.transport=h.toLowerCase()}(l,i[1])),i===null&&(t=l),i}function Tr(){var i,e,l,u;return l=t,u=t,r.substr(t,5).toLowerCase()==="user="?(i=r.substr(t,5),t+=5):(i=null,_('"user="')),i!==null?(r.substr(t,5).toLowerCase()==="phone"?(e=r.substr(t,5),t+=5):(e=null,_('"phone"')),e===null&&(r.substr(t,2).toLowerCase()==="ip"?(e=r.substr(t,2),t+=2):(e=null,_('"ip"')),e===null&&(e=U())),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f,h){b.uri_params||(b.uri_params={}),b.uri_params.user=h.toLowerCase()}(l,i[1])),i===null&&(t=l),i}function vr(){var i,e,l,u;return l=t,u=t,r.substr(t,7).toLowerCase()==="method="?(i=r.substr(t,7),t+=7):(i=null,_('"method="')),i!==null?(e=en(),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f,h){b.uri_params||(b.uri_params={}),b.uri_params.method=h}(l,i[1])),i===null&&(t=l),i}function Er(){var i,e,l,u;return l=t,u=t,r.substr(t,4).toLowerCase()==="ttl="?(i=r.substr(t,4),t+=4):(i=null,_('"ttl="')),i!==null?(e=Xn(),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f,h){b.params||(b.params={}),b.params.ttl=h}(l,i[1])),i===null&&(t=l),i}function Sr(){var i,e,l,u;return l=t,u=t,r.substr(t,6).toLowerCase()==="maddr="?(i=r.substr(t,6),t+=6):(i=null,_('"maddr="')),i!==null?(e=Xt(),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i!==null&&(i=function(f,h){b.uri_params||(b.uri_params={}),b.uri_params.maddr=h}(l,i[1])),i===null&&(t=l),i}function yr(){var i,e,l,u,f,h;return u=t,f=t,r.substr(t,2).toLowerCase()==="lr"?(i=r.substr(t,2),t+=2):(i=null,_('"lr"')),i!==null?(h=t,r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e!==null?(l=U(),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(m){b.uri_params||(b.uri_params={}),b.uri_params.lr=void 0}()),i===null&&(t=u),i}function Ar(){var i,e,l,u,f,h;return u=t,f=t,i=Cr(),i!==null?(h=t,r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e!==null?(l=Rr(),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(m,v,S){b.uri_params||(b.uri_params={}),typeof S>"u"?S=void 0:S=S[1],b.uri_params[v.toLowerCase()]=S}(u,i[0],i[1])),i===null&&(t=u),i}function Cr(){var i,e,l;if(l=t,e=ys(),e!==null)for(i=[];e!==null;)i.push(e),e=ys();else i=null;return i!==null&&(i=function(u,f){return f.join("")}(l,i)),i===null&&(t=l),i}function Rr(){var i,e,l;if(l=t,e=ys(),e!==null)for(i=[];e!==null;)i.push(e),e=ys();else i=null;return i!==null&&(i=function(u,f){return f.join("")}(l,i)),i===null&&(t=l),i}function ys(){var i;return i=As(),i===null&&(i=N(),i===null&&(i=Se())),i}function As(){var i;return r.charCodeAt(t)===91?(i="[",t++):(i=null,_('"["')),i===null&&(r.charCodeAt(t)===93?(i="]",t++):(i=null,_('"]"')),i===null&&(r.charCodeAt(t)===47?(i="/",t++):(i=null,_('"/"')),i===null&&(r.charCodeAt(t)===58?(i=":",t++):(i=null,_('":"')),i===null&&(r.charCodeAt(t)===38?(i="&",t++):(i=null,_('"&"')),i===null&&(r.charCodeAt(t)===43?(i="+",t++):(i=null,_('"+"')),i===null&&(r.charCodeAt(t)===36?(i="$",t++):(i=null,_('"$"')))))))),i}function Ir(){var i,e,l,u,f,h,m;if(h=t,r.charCodeAt(t)===63?(i="?",t++):(i=null,_('"?"')),i!==null)if(e=Ys(),e!==null){for(l=[],m=t,r.charCodeAt(t)===38?(u="&",t++):(u=null,_('"&"')),u!==null?(f=Ys(),f!==null?u=[u,f]:(u=null,t=m)):(u=null,t=m);u!==null;)l.push(u),m=t,r.charCodeAt(t)===38?(u="&",t++):(u=null,_('"&"')),u!==null?(f=Ys(),f!==null?u=[u,f]:(u=null,t=m)):(u=null,t=m);l!==null?i=[i,e,l]:(i=null,t=h)}else i=null,t=h;else i=null,t=h;return i}function Ys(){var i,e,l,u,f;return u=t,f=t,i=zs(),i!==null?(r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e!==null?(l=br(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m,v){m=m.join("").toLowerCase(),v=v.join(""),b.uri_headers||(b.uri_headers={}),b.uri_headers[m]?b.uri_headers[m].push(v):b.uri_headers[m]=[v]}(u,i[0],i[2])),i===null&&(t=u),i}function zs(){var i,e;if(e=Cs(),e===null&&(e=N(),e===null&&(e=Se())),e!==null)for(i=[];e!==null;)i.push(e),e=Cs(),e===null&&(e=N(),e===null&&(e=Se()));else i=null;return i}function br(){var i,e;for(i=[],e=Cs(),e===null&&(e=N(),e===null&&(e=Se()));e!==null;)i.push(e),e=Cs(),e===null&&(e=N(),e===null&&(e=Se()));return i}function Cs(){var i;return r.charCodeAt(t)===91?(i="[",t++):(i=null,_('"["')),i===null&&(r.charCodeAt(t)===93?(i="]",t++):(i=null,_('"]"')),i===null&&(r.charCodeAt(t)===47?(i="/",t++):(i=null,_('"/"')),i===null&&(r.charCodeAt(t)===63?(i="?",t++):(i=null,_('"?"')),i===null&&(r.charCodeAt(t)===58?(i=":",t++):(i=null,_('":"')),i===null&&(r.charCodeAt(t)===43?(i="+",t++):(i=null,_('"+"')),i===null&&(r.charCodeAt(t)===36?(i="$",t++):(i=null,_('"$"')))))))),i}function Js(){var i;return i=tn(),i===null&&(i=_l()),i}function _l(){var i,e,l,u,f,h;return h=t,i=en(),i!==null?(e=I(),e!==null?(l=wr(),l!==null?(u=I(),u!==null?(f=Un(),f!==null?i=[i,e,l,u,f]:(i=null,t=h)):(i=null,t=h)):(i=null,t=h)):(i=null,t=h)):(i=null,t=h),i}function wr(){var i;return i=we(),i===null&&(i=Dn()),i}function Dn(){var i,e,l,u;return u=t,i=ws(),i!==null?(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e!==null?(l=Nn(),l===null&&(l=Qs()),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function Nn(){var i,e,l,u,f;return u=t,i=Or(),i===null&&(i=Xs()),i!==null?(f=t,r.charCodeAt(t)===63?(e="?",t++):(e=null,_('"?"')),e!==null?(l=xr(),l!==null?e=[e,l]:(e=null,t=f)):(e=null,t=f),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i}function Or(){var i,e,l,u;return u=t,r.substr(t,2)==="//"?(i="//",t+=2):(i=null,_('"//"')),i!==null?(e=Nr(),e!==null?(l=Xs(),l=l!==null?l:"",l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function Xs(){var i,e,l;return l=t,r.charCodeAt(t)===47?(i="/",t++):(i=null,_('"/"')),i!==null?(e=Dr(),e!==null?i=[i,e]:(i=null,t=l)):(i=null,t=l),i}function Qs(){var i,e,l,u;if(u=t,i=Is(),i!==null){for(e=[],l=Rs();l!==null;)e.push(l),l=Rs();e!==null?i=[i,e]:(i=null,t=u)}else i=null,t=u;return i}function Rs(){var i;return i=ae(),i===null&&(i=N(),i===null&&(i=Se())),i}function Is(){var i;return i=N(),i===null&&(i=Se(),i===null&&(r.charCodeAt(t)===59?(i=";",t++):(i=null,_('";"')),i===null&&(r.charCodeAt(t)===63?(i="?",t++):(i=null,_('"?"')),i===null&&(r.charCodeAt(t)===58?(i=":",t++):(i=null,_('":"')),i===null&&(r.charCodeAt(t)===64?(i="@",t++):(i=null,_('"@"')),i===null&&(r.charCodeAt(t)===38?(i="&",t++):(i=null,_('"&"')),i===null&&(r.charCodeAt(t)===61?(i="=",t++):(i=null,_('"="')),i===null&&(r.charCodeAt(t)===43?(i="+",t++):(i=null,_('"+"')),i===null&&(r.charCodeAt(t)===36?(i="$",t++):(i=null,_('"$"')),i===null&&(r.charCodeAt(t)===44?(i=",",t++):(i=null,_('","')))))))))))),i}function Dr(){var i,e,l,u,f,h;if(f=t,i=Zs(),i!==null){for(e=[],h=t,r.charCodeAt(t)===47?(l="/",t++):(l=null,_('"/"')),l!==null?(u=Zs(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,r.charCodeAt(t)===47?(l="/",t++):(l=null,_('"/"')),l!==null?(u=Zs(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Zs(){var i,e,l,u,f,h;for(f=t,i=[],e=as();e!==null;)i.push(e),e=as();if(i!==null){for(e=[],h=t,r.charCodeAt(t)===59?(l=";",t++):(l=null,_('";"')),l!==null?(u=bs(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,r.charCodeAt(t)===59?(l=";",t++):(l=null,_('";"')),l!==null?(u=bs(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function bs(){var i,e;for(i=[],e=as();e!==null;)i.push(e),e=as();return i}function as(){var i;return i=N(),i===null&&(i=Se(),i===null&&(r.charCodeAt(t)===58?(i=":",t++):(i=null,_('":"')),i===null&&(r.charCodeAt(t)===64?(i="@",t++):(i=null,_('"@"')),i===null&&(r.charCodeAt(t)===38?(i="&",t++):(i=null,_('"&"')),i===null&&(r.charCodeAt(t)===61?(i="=",t++):(i=null,_('"="')),i===null&&(r.charCodeAt(t)===43?(i="+",t++):(i=null,_('"+"')),i===null&&(r.charCodeAt(t)===36?(i="$",t++):(i=null,_('"$"')),i===null&&(r.charCodeAt(t)===44?(i=",",t++):(i=null,_('","')))))))))),i}function ws(){var i,e,l,u,f;if(u=t,f=t,i=T(),i!==null){for(e=[],l=T(),l===null&&(l=g(),l===null&&(r.charCodeAt(t)===43?(l="+",t++):(l=null,_('"+"')),l===null&&(r.charCodeAt(t)===45?(l="-",t++):(l=null,_('"-"')),l===null&&(r.charCodeAt(t)===46?(l=".",t++):(l=null,_('"."'))))));l!==null;)e.push(l),l=T(),l===null&&(l=g(),l===null&&(r.charCodeAt(t)===43?(l="+",t++):(l=null,_('"+"')),l===null&&(r.charCodeAt(t)===45?(l="-",t++):(l=null,_('"-"')),l===null&&(r.charCodeAt(t)===46?(l=".",t++):(l=null,_('"."'))))));e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i!==null&&(i=function(h){b.scheme=r.substring(t,h)}(u)),i===null&&(t=u),i}function Nr(){var i;return i=Ur(),i===null&&(i=Pr()),i}function Ur(){var i,e,l,u;return l=t,u=t,i=kt(),i!==null?(r.charCodeAt(t)===64?(e="@",t++):(e=null,_('"@"')),e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i=i!==null?i:"",i!==null?(e=Gs(),e!==null?i=[i,e]:(i=null,t=l)):(i=null,t=l),i=i!==null?i:"",i}function Pr(){var i,e;if(e=N(),e===null&&(e=Se(),e===null&&(r.charCodeAt(t)===36?(e="$",t++):(e=null,_('"$"')),e===null&&(r.charCodeAt(t)===44?(e=",",t++):(e=null,_('","')),e===null&&(r.charCodeAt(t)===59?(e=";",t++):(e=null,_('";"')),e===null&&(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e===null&&(r.charCodeAt(t)===64?(e="@",t++):(e=null,_('"@"')),e===null&&(r.charCodeAt(t)===38?(e="&",t++):(e=null,_('"&"')),e===null&&(r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"'))))))))))),e!==null)for(i=[];e!==null;)i.push(e),e=N(),e===null&&(e=Se(),e===null&&(r.charCodeAt(t)===36?(e="$",t++):(e=null,_('"$"')),e===null&&(r.charCodeAt(t)===44?(e=",",t++):(e=null,_('","')),e===null&&(r.charCodeAt(t)===59?(e=";",t++):(e=null,_('";"')),e===null&&(r.charCodeAt(t)===58?(e=":",t++):(e=null,_('":"')),e===null&&(r.charCodeAt(t)===64?(e="@",t++):(e=null,_('"@"')),e===null&&(r.charCodeAt(t)===38?(e="&",t++):(e=null,_('"&"')),e===null&&(r.charCodeAt(t)===61?(e="=",t++):(e=null,_('"="')),e===null&&(r.charCodeAt(t)===43?(e="+",t++):(e=null,_('"+"')))))))))));else i=null;return i}function xr(){var i,e;for(i=[],e=Rs();e!==null;)i.push(e),e=Rs();return i}function Un(){var i,e,l,u,f,h,m,v;if(m=t,v=t,r.substr(t,3).toLowerCase()==="sip"?(i=r.substr(t,3),t+=3):(i=null,_('"SIP"')),i!==null)if(r.charCodeAt(t)===47?(e="/",t++):(e=null,_('"/"')),e!==null){if(u=g(),u!==null)for(l=[];u!==null;)l.push(u),u=g();else l=null;if(l!==null)if(r.charCodeAt(t)===46?(u=".",t++):(u=null,_('"."')),u!==null){if(h=g(),h!==null)for(f=[];h!==null;)f.push(h),h=g();else f=null;f!==null?i=[i,e,l,u,f]:(i=null,t=v)}else i=null,t=v;else i=null,t=v}else i=null,t=v;else i=null,t=v;return i!==null&&(i=function(S){b.sip_version=r.substring(t,S)}(m)),i===null&&(t=m),i}function Pn(){var i;return r.substr(t,6)==="INVITE"?(i="INVITE",t+=6):(i=null,_('"INVITE"')),i}function Mr(){var i;return r.substr(t,3)==="ACK"?(i="ACK",t+=3):(i=null,_('"ACK"')),i}function kr(){var i;return r.substr(t,7)==="OPTIONS"?(i="OPTIONS",t+=7):(i=null,_('"OPTIONS"')),i}function Lr(){var i;return r.substr(t,3)==="BYE"?(i="BYE",t+=3):(i=null,_('"BYE"')),i}function $r(){var i;return r.substr(t,6)==="CANCEL"?(i="CANCEL",t+=6):(i=null,_('"CANCEL"')),i}function Hr(){var i;return r.substr(t,8)==="REGISTER"?(i="REGISTER",t+=8):(i=null,_('"REGISTER"')),i}function Fr(){var i;return r.substr(t,9)==="SUBSCRIBE"?(i="SUBSCRIBE",t+=9):(i=null,_('"SUBSCRIBE"')),i}function jr(){var i;return r.substr(t,6)==="NOTIFY"?(i="NOTIFY",t+=6):(i=null,_('"NOTIFY"')),i}function Vr(){var i;return r.substr(t,5)==="REFER"?(i="REFER",t+=5):(i=null,_('"REFER"')),i}function en(){var i,e;return e=t,i=Pn(),i===null&&(i=Mr(),i===null&&(i=kr(),i===null&&(i=Lr(),i===null&&(i=$r(),i===null&&(i=Hr(),i===null&&(i=Fr(),i===null&&(i=jr(),i===null&&(i=Vr(),i===null&&(i=U()))))))))),i!==null&&(i=function(l){return b.method=r.substring(t,l),b.method}(e)),i===null&&(t=e),i}function tn(){var i,e,l,u,f,h;return h=t,i=Un(),i!==null?(e=I(),e!==null?(l=qr(),l!==null?(u=I(),u!==null?(f=Gr(),f!==null?i=[i,e,l,u,f]:(i=null,t=h)):(i=null,t=h)):(i=null,t=h)):(i=null,t=h)):(i=null,t=h),i}function qr(){var i,e;return e=t,i=Br(),i!==null&&(i=function(l,u){b.status_code=parseInt(u.join(""))}(e,i)),i===null&&(t=e),i}function Br(){var i,e,l,u;return u=t,i=g(),i!==null?(e=g(),e!==null?(l=g(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function Gr(){var i,e,l;for(l=t,i=[],e=ae(),e===null&&(e=N(),e===null&&(e=Se(),e===null&&(e=z(),e===null&&(e=H(),e===null&&(e=I(),e===null&&(e=$()))))));e!==null;)i.push(e),e=ae(),e===null&&(e=N(),e===null&&(e=Se(),e===null&&(e=z(),e===null&&(e=H(),e===null&&(e=I(),e===null&&(e=$()))))));return i!==null&&(i=function(u){b.reason_phrase=r.substring(t,u)}(l)),i===null&&(t=l),i}function hl(){var i,e,l,u,f,h;if(f=t,i=rn(),i!==null){for(e=[],h=t,l=Ce(),l!==null?(u=rn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=Ce(),l!==null?(u=rn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Vo(){var i,e,l,u,f,h;return u=t,f=t,i=tt(),i!==null?(h=t,r.charCodeAt(t)===64?(e="@",t++):(e=null,_('"@"')),e!==null?(l=tt(),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(m){b=r.substring(t,m)}(u)),i===null&&(t=u),i}function qo(){var i,e,l,u,f,h,m;if(f=t,i=ee(),i===null)if(h=t,i=xn(),i!==null){for(e=[],m=t,l=Ce(),l!==null?(u=xn(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=Ce(),l!==null?(u=xn(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){var S,O;for(O=b.multi_header.length,S=0;S<O;S++)if(b.multi_header[S].parsed===null){b=null;break}b!==null?b=b.multi_header:b=-1}()),i===null&&(t=f),i}function xn(){var i,e,l,u,f,h,m;if(f=t,h=t,i=de(),i===null&&(i=Lt()),i!==null){for(e=[],m=t,l=le(),l!==null?(u=Os(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=le(),l!==null?(u=Os(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){var S;b.multi_header||(b.multi_header=[]);try{S=new us(b.uri,b.display_name,b.params),delete b.uri,delete b.display_name,delete b.params}catch{S=null}b.multi_header.push({possition:t,offset:v,parsed:S})}(f)),i===null&&(t=f),i}function Lt(){var i,e,l,u,f;return f=t,i=$t(),i=i!==null?i:"",i!==null?(e=xe(),e!==null?(l=we(),l!==null?(u=be(),u!==null?i=[i,e,l,u]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i}function $t(){var i,e,l,u,f,h,m;if(f=t,h=t,i=U(),i!==null){for(e=[],m=t,l=ve(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=ve(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i===null&&(i=Oe()),i!==null&&(i=function(v,S){typeof S=="string"?b.display_name=S:b.display_name=S[1].reduce(function(O,ie){return O+ie[0]+ie[1]},S[0])}(f,i)),i===null&&(t=f),i}function Os(){var i;return i=Mn(),i===null&&(i=Wr(),i===null&&(i=Ge())),i}function Mn(){var i,e,l,u,f;return u=t,f=t,r.substr(t,1).toLowerCase()==="q"?(i=r.substr(t,1),t++):(i=null,_('"q"')),i!==null?(e=G(),e!==null?(l=Zt(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.params||(b.params={}),b.params.q=m}(u,i[2])),i===null&&(t=u),i}function Wr(){var i,e,l,u,f;return u=t,f=t,r.substr(t,7).toLowerCase()==="expires"?(i=r.substr(t,7),t+=7):(i=null,_('"expires"')),i!==null?(e=G(),e!==null?(l=Qt(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.params||(b.params={}),b.params.expires=m}(u,i[2])),i===null&&(t=u),i}function Qt(){var i,e,l;if(l=t,e=g(),e!==null)for(i=[];e!==null;)i.push(e),e=g();else i=null;return i!==null&&(i=function(u,f){return parseInt(f.join(""))}(l,i)),i===null&&(t=l),i}function Zt(){var i,e,l,u,f,h,m,v;return h=t,m=t,r.charCodeAt(t)===48?(i="0",t++):(i=null,_('"0"')),i!==null?(v=t,r.charCodeAt(t)===46?(e=".",t++):(e=null,_('"."')),e!==null?(l=g(),l=l!==null?l:"",l!==null?(u=g(),u=u!==null?u:"",u!==null?(f=g(),f=f!==null?f:"",f!==null?e=[e,l,u,f]:(e=null,t=v)):(e=null,t=v)):(e=null,t=v)):(e=null,t=v),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=m)):(i=null,t=m),i!==null&&(i=function(S){return parseFloat(r.substring(t,S))}(h)),i===null&&(t=h),i}function Ge(){var i,e,l,u,f,h;return u=t,f=t,i=U(),i!==null?(h=t,e=G(),e!==null?(l=We(),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(m,v,S){b.params||(b.params={}),typeof S>"u"?S=void 0:S=S[1],b.params[v.toLowerCase()]=S}(u,i[0],i[1])),i===null&&(t=u),i}function We(){var i;return i=U(),i===null&&(i=Xt(),i===null&&(i=Ie())),i}function dl(){var i,e,l,u,f,h;if(f=t,i=pl(),i!==null){for(e=[],h=t,l=le(),l!==null?(u=kn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=le(),l!==null?(u=kn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function pl(){var i;return r.substr(t,6).toLowerCase()==="render"?(i=r.substr(t,6),t+=6):(i=null,_('"render"')),i===null&&(r.substr(t,7).toLowerCase()==="session"?(i=r.substr(t,7),t+=7):(i=null,_('"session"')),i===null&&(r.substr(t,4).toLowerCase()==="icon"?(i=r.substr(t,4),t+=4):(i=null,_('"icon"')),i===null&&(r.substr(t,5).toLowerCase()==="alert"?(i=r.substr(t,5),t+=5):(i=null,_('"alert"')),i===null&&(i=U())))),i}function kn(){var i;return i=Ln(),i===null&&(i=Ge()),i}function Ln(){var i,e,l,u;return u=t,r.substr(t,8).toLowerCase()==="handling"?(i=r.substr(t,8),t+=8):(i=null,_('"handling"')),i!==null?(e=G(),e!==null?(r.substr(t,8).toLowerCase()==="optional"?(l=r.substr(t,8),t+=8):(l=null,_('"optional"')),l===null&&(r.substr(t,8).toLowerCase()==="required"?(l=r.substr(t,8),t+=8):(l=null,_('"required"')),l===null&&(l=U())),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function ml(){var i,e,l,u,f,h;if(f=t,i=U(),i!==null){for(e=[],h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Bo(){var i,e,l;if(l=t,e=g(),e!==null)for(i=[];e!==null;)i.push(e),e=g();else i=null;return i!==null&&(i=function(u,f){b=parseInt(f.join(""))}(l,i)),i===null&&(t=l),i}function Go(){var i,e;return e=t,i=gl(),i!==null&&(i=function(l){b=r.substring(t,l)}(e)),i===null&&(t=e),i}function gl(){var i,e,l,u,f,h,m,v;if(m=t,i=Kr(),i!==null)if(e=W(),e!==null)if(l=Jr(),l!==null){for(u=[],v=t,f=le(),f!==null?(h=$n(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);f!==null;)u.push(f),v=t,f=le(),f!==null?(h=$n(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);u!==null?i=[i,e,l,u]:(i=null,t=m)}else i=null,t=m;else i=null,t=m;else i=null,t=m;return i}function Kr(){var i;return i=Yr(),i===null&&(i=zr()),i}function Yr(){var i;return r.substr(t,4).toLowerCase()==="text"?(i=r.substr(t,4),t+=4):(i=null,_('"text"')),i===null&&(r.substr(t,5).toLowerCase()==="image"?(i=r.substr(t,5),t+=5):(i=null,_('"image"')),i===null&&(r.substr(t,5).toLowerCase()==="audio"?(i=r.substr(t,5),t+=5):(i=null,_('"audio"')),i===null&&(r.substr(t,5).toLowerCase()==="video"?(i=r.substr(t,5),t+=5):(i=null,_('"video"')),i===null&&(r.substr(t,11).toLowerCase()==="application"?(i=r.substr(t,11),t+=11):(i=null,_('"application"')),i===null&&(i=sn()))))),i}function zr(){var i;return r.substr(t,7).toLowerCase()==="message"?(i=r.substr(t,7),t+=7):(i=null,_('"message"')),i===null&&(r.substr(t,9).toLowerCase()==="multipart"?(i=r.substr(t,9),t+=9):(i=null,_('"multipart"')),i===null&&(i=sn())),i}function sn(){var i;return i=U(),i===null&&(i=nn()),i}function nn(){var i,e,l;return l=t,r.substr(t,2).toLowerCase()==="x-"?(i=r.substr(t,2),t+=2):(i=null,_('"x-"')),i!==null?(e=U(),e!==null?i=[i,e]:(i=null,t=l)):(i=null,t=l),i}function Jr(){var i;return i=sn(),i===null&&(i=U()),i}function $n(){var i,e,l,u;return u=t,i=U(),i!==null?(e=G(),e!==null?(l=Hn(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function Hn(){var i;return i=U(),i===null&&(i=Ie()),i}function Tl(){var i,e,l,u;return u=t,i=vl(),i!==null?(e=ve(),e!==null?(l=en(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function vl(){var i,e,l;if(l=t,e=g(),e!==null)for(i=[];e!==null;)i.push(e),e=g();else i=null;return i!==null&&(i=function(u,f){b.value=parseInt(f.join(""))}(l,i)),i===null&&(t=l),i}function El(){var i,e;return e=t,i=Qt(),i!==null&&(i=function(l,u){b=u}(e,i)),i===null&&(t=e),i}function Wo(){var i,e,l,u,f,h,m;if(f=t,h=t,i=rn(),i!==null){for(e=[],m=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v,S){b.event=S.join("").toLowerCase()}(f,i[0])),i===null&&(t=f),i}function rn(){var i,e,l,u,f,h;if(f=t,i=P(),i!==null){for(e=[],h=t,r.charCodeAt(t)===46?(l=".",t++):(l=null,_('"."')),l!==null?(u=P(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,r.charCodeAt(t)===46?(l=".",t++):(l=null,_('"."')),l!==null?(u=P(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function ln(){var i,e,l,u,f,h,m;if(f=t,h=t,i=de(),i===null&&(i=Lt()),i!==null){for(e=[],m=t,l=le(),l!==null?(u=Xr(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=le(),l!==null?(u=Xr(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){var S=b.tag;try{b=new us(b.uri,b.display_name,b.params),S&&b.setParam("tag",S)}catch{b=-1}}()),i===null&&(t=f),i}function Xr(){var i;return i=on(),i===null&&(i=Ge()),i}function on(){var i,e,l,u,f;return u=t,f=t,r.substr(t,3).toLowerCase()==="tag"?(i=r.substr(t,3),t+=3):(i=null,_('"tag"')),i!==null?(e=G(),e!==null?(l=U(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.tag=m}(u,i[2])),i===null&&(t=u),i}function Qr(){var i,e,l;if(l=t,e=g(),e!==null)for(i=[];e!==null;)i.push(e),e=g();else i=null;return i!==null&&(i=function(u,f){b=parseInt(f.join(""))}(l,i)),i===null&&(t=l),i}function Ko(){var i,e;return e=t,i=Qt(),i!==null&&(i=function(l,u){b=u}(e,i)),i===null&&(t=e),i}function Yo(){var i,e,l,u,f,h,m,v,S,O;for(v=t,S=t,i=[],e=$t();e!==null;)i.push(e),e=$t();if(i!==null)if(e=xe(),e!==null)if(l=we(),l!==null)if(u=be(),u!==null){for(f=[],O=t,h=le(),h!==null?(m=Ge(),m!==null?h=[h,m]:(h=null,t=O)):(h=null,t=O);h!==null;)f.push(h),O=t,h=le(),h!==null?(m=Ge(),m!==null?h=[h,m]:(h=null,t=O)):(h=null,t=O);f!==null?i=[i,e,l,u,f]:(i=null,t=S)}else i=null,t=S;else i=null,t=S;else i=null,t=S;else i=null,t=S;return i!==null&&(i=function(ie){try{b=new us(b.uri,b.display_name,b.params)}catch{b=-1}}()),i===null&&(t=v),i}function zo(){var i;return i=Zr(),i}function Zr(){var i,e,l,u,f,h,m,v;if(m=t,r.substr(t,6).toLowerCase()==="digest"?(i=r.substr(t,6),t+=6):(i=null,_('"Digest"')),i!==null)if(e=ve(),e!==null)if(l=es(),l!==null){for(u=[],v=t,f=Ce(),f!==null?(h=es(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);f!==null;)u.push(f),v=t,f=Ce(),f!==null?(h=es(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);u!==null?i=[i,e,l,u]:(i=null,t=m)}else i=null,t=m;else i=null,t=m;else i=null,t=m;return i===null&&(i=Fn()),i}function Fn(){var i,e,l,u,f,h,m,v;if(m=t,i=U(),i!==null)if(e=ve(),e!==null)if(l=Ds(),l!==null){for(u=[],v=t,f=Ce(),f!==null?(h=Ds(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);f!==null;)u.push(f),v=t,f=Ce(),f!==null?(h=Ds(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);u!==null?i=[i,e,l,u]:(i=null,t=m)}else i=null,t=m;else i=null,t=m;else i=null,t=m;return i}function Ds(){var i,e,l,u;return u=t,i=U(),i!==null?(e=G(),e!==null?(l=U(),l===null&&(l=Ie()),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function es(){var i;return i=an(),i===null&&(i=ti(),i===null&&(i=cn(),i===null&&(i=ni(),i===null&&(i=ri(),i===null&&(i=ii(),i===null&&(i=li(),i===null&&(i=Ds()))))))),i}function an(){var i,e,l,u;return u=t,r.substr(t,5).toLowerCase()==="realm"?(i=r.substr(t,5),t+=5):(i=null,_('"realm"')),i!==null?(e=G(),e!==null?(l=ei(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function ei(){var i,e;return e=t,i=Oe(),i!==null&&(i=function(l,u){b.realm=u}(e,i)),i===null&&(t=e),i}function ti(){var i,e,l,u,f,h,m,v,S;if(v=t,r.substr(t,6).toLowerCase()==="domain"?(i=r.substr(t,6),t+=6):(i=null,_('"domain"')),i!==null)if(e=G(),e!==null)if(l=st(),l!==null)if(u=un(),u!==null){if(f=[],S=t,m=I(),m!==null)for(h=[];m!==null;)h.push(m),m=I();else h=null;for(h!==null?(m=un(),m!==null?h=[h,m]:(h=null,t=S)):(h=null,t=S);h!==null;){if(f.push(h),S=t,m=I(),m!==null)for(h=[];m!==null;)h.push(m),m=I();else h=null;h!==null?(m=un(),m!==null?h=[h,m]:(h=null,t=S)):(h=null,t=S)}f!==null?(h=lt(),h!==null?i=[i,e,l,u,f,h]:(i=null,t=v)):(i=null,t=v)}else i=null,t=v;else i=null,t=v;else i=null,t=v;else i=null,t=v;return i}function un(){var i;return i=Dn(),i===null&&(i=Xs()),i}function cn(){var i,e,l,u;return u=t,r.substr(t,5).toLowerCase()==="nonce"?(i=r.substr(t,5),t+=5):(i=null,_('"nonce"')),i!==null?(e=G(),e!==null?(l=si(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function si(){var i,e;return e=t,i=Oe(),i!==null&&(i=function(l,u){b.nonce=u}(e,i)),i===null&&(t=e),i}function ni(){var i,e,l,u,f;return u=t,f=t,r.substr(t,6).toLowerCase()==="opaque"?(i=r.substr(t,6),t+=6):(i=null,_('"opaque"')),i!==null?(e=G(),e!==null?(l=Oe(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.opaque=m}(u,i[2])),i===null&&(t=u),i}function ri(){var i,e,l,u,f;return u=t,r.substr(t,5).toLowerCase()==="stale"?(i=r.substr(t,5),t+=5):(i=null,_('"stale"')),i!==null?(e=G(),e!==null?(f=t,r.substr(t,4).toLowerCase()==="true"?(l=r.substr(t,4),t+=4):(l=null,_('"true"')),l!==null&&(l=function(h){b.stale=!0}()),l===null&&(t=f),l===null&&(f=t,r.substr(t,5).toLowerCase()==="false"?(l=r.substr(t,5),t+=5):(l=null,_('"false"')),l!==null&&(l=function(h){b.stale=!1}()),l===null&&(t=f)),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function ii(){var i,e,l,u,f;return u=t,f=t,r.substr(t,9).toLowerCase()==="algorithm"?(i=r.substr(t,9),t+=9):(i=null,_('"algorithm"')),i!==null?(e=G(),e!==null?(r.substr(t,3).toLowerCase()==="md5"?(l=r.substr(t,3),t+=3):(l=null,_('"MD5"')),l===null&&(r.substr(t,8).toLowerCase()==="md5-sess"?(l=r.substr(t,8),t+=8):(l=null,_('"MD5-sess"')),l===null&&(l=U())),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.algorithm=m.toUpperCase()}(u,i[2])),i===null&&(t=u),i}function li(){var i,e,l,u,f,h,m,v,S,O;if(v=t,r.substr(t,3).toLowerCase()==="qop"?(i=r.substr(t,3),t+=3):(i=null,_('"qop"')),i!==null)if(e=G(),e!==null)if(l=st(),l!==null){if(S=t,u=fn(),u!==null){for(f=[],O=t,r.charCodeAt(t)===44?(h=",",t++):(h=null,_('","')),h!==null?(m=fn(),m!==null?h=[h,m]:(h=null,t=O)):(h=null,t=O);h!==null;)f.push(h),O=t,r.charCodeAt(t)===44?(h=",",t++):(h=null,_('","')),h!==null?(m=fn(),m!==null?h=[h,m]:(h=null,t=O)):(h=null,t=O);f!==null?u=[u,f]:(u=null,t=S)}else u=null,t=S;u!==null?(f=lt(),f!==null?i=[i,e,l,u,f]:(i=null,t=v)):(i=null,t=v)}else i=null,t=v;else i=null,t=v;else i=null,t=v;return i}function fn(){var i,e;return e=t,r.substr(t,8).toLowerCase()==="auth-int"?(i=r.substr(t,8),t+=8):(i=null,_('"auth-int"')),i===null&&(r.substr(t,4).toLowerCase()==="auth"?(i=r.substr(t,4),t+=4):(i=null,_('"auth"')),i===null&&(i=U())),i!==null&&(i=function(l,u){b.qop||(b.qop=[]),b.qop.push(u.toLowerCase())}(e,i)),i===null&&(t=e),i}function jn(){var i,e,l,u,f,h;if(f=t,i=U(),i!==null){for(e=[],h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Jo(){var i,e,l,u,f,h,m;if(f=t,h=t,i=Vn(),i!==null){for(e=[],m=t,l=Ce(),l!==null?(u=Vn(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=Ce(),l!==null?(u=Vn(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){var S,O;for(O=b.multi_header.length,S=0;S<O;S++)if(b.multi_header[S].parsed===null){b=null;break}b!==null?b=b.multi_header:b=-1}()),i===null&&(t=f),i}function Vn(){var i,e,l,u,f,h,m;if(f=t,h=t,i=Lt(),i!==null){for(e=[],m=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){var S;b.multi_header||(b.multi_header=[]);try{S=new us(b.uri,b.display_name,b.params),delete b.uri,delete b.display_name,delete b.params}catch{S=null}b.multi_header.push({possition:t,offset:v,parsed:S})}(f)),i===null&&(t=f),i}function qn(){var i,e,l,u,f,h,m;if(f=t,h=t,r.substr(t,3).toLowerCase()==="sip"?(i=r.substr(t,3),t+=3):(i=null,_('"SIP"')),i===null&&(i=U()),i!==null){for(e=[],m=t,l=le(),l!==null?(u=oi(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=le(),l!==null?(u=oi(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v,S){if(b.protocol=S.toLowerCase(),b.params||(b.params={}),b.params.text&&b.params.text[0]==='"'){var O=b.params.text;b.text=O.substring(1,O.length-1),delete b.params.text}}(f,i[0])),i===null&&(t=f),i}function oi(){var i;return i=Bn(),i===null&&(i=Ge()),i}function Bn(){var i,e,l,u,f,h;if(f=t,h=t,r.substr(t,5).toLowerCase()==="cause"?(i=r.substr(t,5),t+=5):(i=null,_('"cause"')),i!==null)if(e=G(),e!==null){if(u=g(),u!==null)for(l=[];u!==null;)l.push(u),u=g();else l=null;l!==null?i=[i,e,l]:(i=null,t=h)}else i=null,t=h;else i=null,t=h;return i!==null&&(i=function(m,v){b.cause=parseInt(v.join(""))}(f,i[2])),i===null&&(t=f),i}function Sl(){var i,e,l,u,f,h;if(f=t,i=U(),i!==null){for(e=[],h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Xo(){var i,e,l,u,f,h;if(f=t,i=Gn(),i!==null){for(e=[],h=t,l=Ce(),l!==null?(u=Gn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=Ce(),l!==null?(u=Gn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Gn(){var i,e,l,u,f,h;if(f=t,i=Lt(),i!==null){for(e=[],h=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Wn(){var i,e,l,u,f,h;if(f=t,i=yl(),i!==null){for(e=[],h=t,l=le(),l!==null?(u=Kn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=le(),l!==null?(u=Kn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function yl(){var i,e;return e=t,r.substr(t,6).toLowerCase()==="active"?(i=r.substr(t,6),t+=6):(i=null,_('"active"')),i===null&&(r.substr(t,7).toLowerCase()==="pending"?(i=r.substr(t,7),t+=7):(i=null,_('"pending"')),i===null&&(r.substr(t,10).toLowerCase()==="terminated"?(i=r.substr(t,10),t+=10):(i=null,_('"terminated"')),i===null&&(i=U()))),i!==null&&(i=function(l){b.state=r.substring(t,l)}(e)),i===null&&(t=e),i}function Kn(){var i,e,l,u,f;return u=t,f=t,r.substr(t,6).toLowerCase()==="reason"?(i=r.substr(t,6),t+=6):(i=null,_('"reason"')),i!==null?(e=G(),e!==null?(l=Yn(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){typeof m<"u"&&(b.reason=m)}(u,i[2])),i===null&&(t=u),i===null&&(u=t,f=t,r.substr(t,7).toLowerCase()==="expires"?(i=r.substr(t,7),t+=7):(i=null,_('"expires"')),i!==null?(e=G(),e!==null?(l=Qt(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){typeof m<"u"&&(b.expires=m)}(u,i[2])),i===null&&(t=u),i===null&&(u=t,f=t,r.substr(t,11).toLowerCase()==="retry_after"?(i=r.substr(t,11),t+=11):(i=null,_('"retry_after"')),i!==null?(e=G(),e!==null?(l=Qt(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){typeof m<"u"&&(b.retry_after=m)}(u,i[2])),i===null&&(t=u),i===null&&(i=Ge()))),i}function Yn(){var i;return r.substr(t,11).toLowerCase()==="deactivated"?(i=r.substr(t,11),t+=11):(i=null,_('"deactivated"')),i===null&&(r.substr(t,9).toLowerCase()==="probation"?(i=r.substr(t,9),t+=9):(i=null,_('"probation"')),i===null&&(r.substr(t,8).toLowerCase()==="rejected"?(i=r.substr(t,8),t+=8):(i=null,_('"rejected"')),i===null&&(r.substr(t,7).toLowerCase()==="timeout"?(i=r.substr(t,7),t+=7):(i=null,_('"timeout"')),i===null&&(r.substr(t,6).toLowerCase()==="giveup"?(i=r.substr(t,6),t+=6):(i=null,_('"giveup"')),i===null&&(r.substr(t,10).toLowerCase()==="noresource"?(i=r.substr(t,10),t+=10):(i=null,_('"noresource"')),i===null&&(r.substr(t,9).toLowerCase()==="invariant"?(i=r.substr(t,9),t+=9):(i=null,_('"invariant"')),i===null&&(i=U()))))))),i}function Al(){var i;return i=B(),i=i!==null?i:"",i}function Qo(){var i,e,l,u,f,h;if(f=t,i=U(),i!==null){for(e=[],h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=Ce(),l!==null?(u=U(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i=i!==null?i:"",i}function Zo(){var i,e,l,u,f,h,m;if(f=t,h=t,i=de(),i===null&&(i=Lt()),i!==null){for(e=[],m=t,l=le(),l!==null?(u=ai(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=le(),l!==null?(u=ai(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){var S=b.tag;try{b=new us(b.uri,b.display_name,b.params),S&&b.setParam("tag",S)}catch{b=-1}}()),i===null&&(t=f),i}function ai(){var i;return i=on(),i===null&&(i=Ge()),i}function ui(){var i,e,l,u,f,h;if(f=t,i=zn(),i!==null){for(e=[],h=t,l=Ce(),l!==null?(u=zn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=Ce(),l!==null?(u=zn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function zn(){var i,e,l,u,f,h,m,v;if(m=t,i=pi(),i!==null)if(e=ve(),e!==null)if(l=Ti(),l!==null){for(u=[],v=t,f=le(),f!==null?(h=Ns(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);f!==null;)u.push(f),v=t,f=le(),f!==null?(h=Ns(),h!==null?f=[f,h]:(f=null,t=v)):(f=null,t=v);u!==null?i=[i,e,l,u]:(i=null,t=m)}else i=null,t=m;else i=null,t=m;else i=null,t=m;return i}function Ns(){var i;return i=Jn(),i===null&&(i=ci(),i===null&&(i=fi(),i===null&&(i=_i(),i===null&&(i=hi(),i===null&&(i=Ge()))))),i}function Jn(){var i,e,l,u,f;return u=t,f=t,r.substr(t,3).toLowerCase()==="ttl"?(i=r.substr(t,3),t+=3):(i=null,_('"ttl"')),i!==null?(e=G(),e!==null?(l=Xn(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.ttl=m}(u,i[2])),i===null&&(t=u),i}function ci(){var i,e,l,u,f;return u=t,f=t,r.substr(t,5).toLowerCase()==="maddr"?(i=r.substr(t,5),t+=5):(i=null,_('"maddr"')),i!==null?(e=G(),e!==null?(l=Xt(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.maddr=m}(u,i[2])),i===null&&(t=u),i}function fi(){var i,e,l,u,f;return u=t,f=t,r.substr(t,8).toLowerCase()==="received"?(i=r.substr(t,8),t+=8):(i=null,_('"received"')),i!==null?(e=G(),e!==null?(l=ot(),l===null&&(l=Ks()),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.received=m}(u,i[2])),i===null&&(t=u),i}function _i(){var i,e,l,u,f;return u=t,f=t,r.substr(t,6).toLowerCase()==="branch"?(i=r.substr(t,6),t+=6):(i=null,_('"branch"')),i!==null?(e=G(),e!==null?(l=U(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.branch=m}(u,i[2])),i===null&&(t=u),i}function hi(){var i,e,l,u,f;return u=t,r.substr(t,5).toLowerCase()==="rport"?(i=r.substr(t,5),t+=5):(i=null,_('"rport"')),i!==null?(f=t,e=G(),e!==null?(l=di(),l!==null?e=[e,l]:(e=null,t=f)):(e=null,t=f),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i}function di(){var i,e,l,u,f,h,m;return h=t,m=t,i=g(),i=i!==null?i:"",i!==null?(e=g(),e=e!==null?e:"",e!==null?(l=g(),l=l!==null?l:"",l!==null?(u=g(),u=u!==null?u:"",u!==null?(f=g(),f=f!==null?f:"",f!==null?i=[i,e,l,u,f]:(i=null,t=m)):(i=null,t=m)):(i=null,t=m)):(i=null,t=m)):(i=null,t=m),i!==null&&(i=function(v,S){b.rport=parseInt(S.join(""))}(h,i)),i===null&&(t=h),i}function pi(){var i,e,l,u,f,h;return h=t,i=mi(),i!==null?(e=W(),e!==null?(l=U(),l!==null?(u=W(),u!==null?(f=gi(),f!==null?i=[i,e,l,u,f]:(i=null,t=h)):(i=null,t=h)):(i=null,t=h)):(i=null,t=h)):(i=null,t=h),i}function mi(){var i,e;return e=t,r.substr(t,3).toLowerCase()==="sip"?(i=r.substr(t,3),t+=3):(i=null,_('"SIP"')),i===null&&(i=U()),i!==null&&(i=function(l,u){b.protocol=u}(e,i)),i===null&&(t=e),i}function gi(){var i,e;return e=t,r.substr(t,3).toLowerCase()==="udp"?(i=r.substr(t,3),t+=3):(i=null,_('"UDP"')),i===null&&(r.substr(t,3).toLowerCase()==="tcp"?(i=r.substr(t,3),t+=3):(i=null,_('"TCP"')),i===null&&(r.substr(t,3).toLowerCase()==="tls"?(i=r.substr(t,3),t+=3):(i=null,_('"TLS"')),i===null&&(r.substr(t,4).toLowerCase()==="sctp"?(i=r.substr(t,4),t+=4):(i=null,_('"SCTP"')),i===null&&(i=U())))),i!==null&&(i=function(l,u){b.transport=u}(e,i)),i===null&&(t=e),i}function Ti(){var i,e,l,u,f;return u=t,i=vi(),i!==null?(f=t,e=ye(),e!==null?(l=Ei(),l!==null?e=[e,l]:(e=null,t=f)):(e=null,t=f),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=u)):(i=null,t=u),i}function vi(){var i,e;return e=t,i=ot(),i===null&&(i=bn(),i===null&&(i=os())),i!==null&&(i=function(l){b.host=r.substring(t,l)}(e)),i===null&&(t=e),i}function Ei(){var i,e,l,u,f,h,m;return h=t,m=t,i=g(),i=i!==null?i:"",i!==null?(e=g(),e=e!==null?e:"",e!==null?(l=g(),l=l!==null?l:"",l!==null?(u=g(),u=u!==null?u:"",u!==null?(f=g(),f=f!==null?f:"",f!==null?i=[i,e,l,u,f]:(i=null,t=m)):(i=null,t=m)):(i=null,t=m)):(i=null,t=m)):(i=null,t=m),i!==null&&(i=function(v,S){b.port=parseInt(S.join(""))}(h,i)),i===null&&(t=h),i}function Xn(){var i,e,l,u,f;return u=t,f=t,i=g(),i!==null?(e=g(),e=e!==null?e:"",e!==null?(l=g(),l=l!==null?l:"",l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){return parseInt(m.join(""))}(u,i)),i===null&&(t=u),i}function Si(){var i;return i=Zr(),i}function ea(){var i,e,l,u,f,h;if(f=t,i=Cl(),i!==null){for(e=[],h=t,l=le(),l!==null?(u=Qn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=le(),l!==null?(u=Qn(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Cl(){var i,e;return e=t,i=Qt(),i!==null&&(i=function(l,u){b.expires=u}(e,i)),i===null&&(t=e),i}function Qn(){var i;return i=Zn(),i===null&&(i=Ge()),i}function Zn(){var i,e,l,u,f;return u=t,f=t,r.substr(t,9).toLowerCase()==="refresher"?(i=r.substr(t,9),t+=9):(i=null,_('"refresher"')),i!==null?(e=G(),e!==null?(r.substr(t,3).toLowerCase()==="uac"?(l=r.substr(t,3),t+=3):(l=null,_('"uac"')),l===null&&(r.substr(t,3).toLowerCase()==="uas"?(l=r.substr(t,3),t+=3):(l=null,_('"uas"'))),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.refresher=m.toLowerCase()}(u,i[2])),i===null&&(t=u),i}function Rl(){var i,e,l,u;return u=t,i=U(),i!==null?(e=D(),e!==null?(l=Il(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function Il(){var i,e;for(i=[],e=q(),e===null&&(e=H(),e===null&&(e=ve()));e!==null;)i.push(e),e=q(),e===null&&(e=H(),e===null&&(e=ve()));return i}function bl(){var i,e;for(i=[],e=A();e!==null;)i.push(e),e=A();return i}function ta(){var i,e,l;return l=t,r.substr(t,5)==="uuid:"?(i="uuid:",t+=5):(i=null,_('"uuid:"')),i!==null?(e=wl(),e!==null?i=[i,e]:(i=null,t=l)):(i=null,t=l),i}function wl(){var i,e,l,u,f,h,m,v,S,O,ie;return O=t,ie=t,i=Ft(),i!==null?(r.charCodeAt(t)===45?(e="-",t++):(e=null,_('"-"')),e!==null?(l=Ht(),l!==null?(r.charCodeAt(t)===45?(u="-",t++):(u=null,_('"-"')),u!==null?(f=Ht(),f!==null?(r.charCodeAt(t)===45?(h="-",t++):(h=null,_('"-"')),h!==null?(m=Ht(),m!==null?(r.charCodeAt(t)===45?(v="-",t++):(v=null,_('"-"')),v!==null?(S=yi(),S!==null?i=[i,e,l,u,f,h,m,v,S]:(i=null,t=ie)):(i=null,t=ie)):(i=null,t=ie)):(i=null,t=ie)):(i=null,t=ie)):(i=null,t=ie)):(i=null,t=ie)):(i=null,t=ie)):(i=null,t=ie),i!==null&&(i=function(Ue,bt){b=r.substring(t+5,Ue)}(O,i[0])),i===null&&(t=O),i}function Ht(){var i,e,l,u,f;return f=t,i=E(),i!==null?(e=E(),e!==null?(l=E(),l!==null?(u=E(),u!==null?i=[i,e,l,u]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i}function Ft(){var i,e,l;return l=t,i=Ht(),i!==null?(e=Ht(),e!==null?i=[i,e]:(i=null,t=l)):(i=null,t=l),i}function yi(){var i,e,l,u;return u=t,i=Ht(),i!==null?(e=Ht(),e!==null?(l=Ht(),l!==null?i=[i,e,l]:(i=null,t=u)):(i=null,t=u)):(i=null,t=u),i}function Ol(){var i,e,l,u,f,h,m;if(f=t,h=t,i=de(),i===null&&(i=Lt()),i!==null){for(e=[],m=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);l!==null;)e.push(l),m=t,l=le(),l!==null?(u=Ge(),u!==null?l=[l,u]:(l=null,t=m)):(l=null,t=m);e!==null?i=[i,e]:(i=null,t=h)}else i=null,t=h;return i!==null&&(i=function(v){try{b=new us(b.uri,b.display_name,b.params)}catch{b=-1}}()),i===null&&(t=f),i}function sa(){var i,e,l,u,f,h;if(f=t,i=Dl(),i!==null){for(e=[],h=t,l=le(),l!==null?(u=er(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);l!==null;)e.push(l),h=t,l=le(),l!==null?(u=er(),u!==null?l=[l,u]:(l=null,t=h)):(l=null,t=h);e!==null?i=[i,e]:(i=null,t=f)}else i=null,t=f;return i}function Dl(){var i,e,l,u,f,h;return u=t,f=t,i=tt(),i!==null?(h=t,r.charCodeAt(t)===64?(e="@",t++):(e=null,_('"@"')),e!==null?(l=tt(),l!==null?e=[e,l]:(e=null,t=h)):(e=null,t=h),e=e!==null?e:"",e!==null?i=[i,e]:(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(m){b.call_id=r.substring(t,m)}(u)),i===null&&(t=u),i}function er(){var i;return i=tr(),i===null&&(i=Ai(),i===null&&(i=Ci(),i===null&&(i=Ge()))),i}function tr(){var i,e,l,u,f;return u=t,f=t,r.substr(t,6)==="to-tag"?(i="to-tag",t+=6):(i=null,_('"to-tag"')),i!==null?(e=G(),e!==null?(l=U(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.to_tag=m}(u,i[2])),i===null&&(t=u),i}function Ai(){var i,e,l,u,f;return u=t,f=t,r.substr(t,8)==="from-tag"?(i="from-tag",t+=8):(i=null,_('"from-tag"')),i!==null?(e=G(),e!==null?(l=U(),l!==null?i=[i,e,l]:(i=null,t=f)):(i=null,t=f)):(i=null,t=f),i!==null&&(i=function(h,m){b.from_tag=m}(u,i[2])),i===null&&(t=u),i}function Ci(){var i,e;return e=t,r.substr(t,10)==="early-only"?(i="early-only",t+=10):(i=null,_('"early-only"')),i!==null&&(i=function(l){b.early_only=!0}()),i===null&&(t=e),i}function Nl(i){i.sort();for(var e=null,l=[],u=0;u<i.length;u++)i[u]!==e&&(l.push(i[u]),e=i[u]);return l}function na(){for(var i=1,e=1,l=!1,u=0;u<Math.max(t,n);u++){var f=r.charAt(u);f===`
|
75
|
-
`?(l||i++,e=1,l=!1):f==="\r"||f==="\u2028"||f==="\u2029"?(i++,e=1,l=!0):(e++,l=!1)}return{line:i,column:e}}var Ul=vs(),us=Du(),b={},w=a[o]();if(w===null||t!==r.length){var Ri=Math.max(t,n),Ii=Ri<r.length?r.charAt(Ri):null,Pl=na();return new this.SyntaxError(Nl(p),Ii,Ri,Pl.line,Pl.column),-1}return b},toSource:function(){return this._source}};return s.SyntaxError=function(r,o,a,t,n){function p(_,d){var g,T;switch(_.length){case 0:g="end of input";break;case 1:g=_[0];break;default:g=_.slice(0,_.length-1).join(", ")+" or "+_[_.length-1]}return T=d?c(d):"end of input","Expected "+g+" but "+T+" found."}this.name="SyntaxError",this.expected=r,this.found=o,this.message=p(r,o),this.offset=a,this.line=t,this.column=n},s.SyntaxError.prototype=Error.prototype,s}()),wa}var Oa,zc;function vs(){if(zc)return Oa;zc=1;const c=De,s=yt(),r=ls();return Oa=class i_{static parse(a){if(a=r.parse(a,"SIP_URI"),a!==-1)return a}constructor(a,t,n,p,_={},d={}){if(!n)throw new TypeError('missing or invalid "host" parameter');this._parameters={},this._headers={},this._scheme=a||c.SIP,this._user=t,this._host=n,this._port=p;for(const g in _)Object.prototype.hasOwnProperty.call(_,g)&&this.setParam(g,_[g]);for(const g in d)Object.prototype.hasOwnProperty.call(d,g)&&this.setHeader(g,d[g])}get scheme(){return this._scheme}set scheme(a){this._scheme=a.toLowerCase()}get user(){return this._user}set user(a){this._user=a}get host(){return this._host}set host(a){this._host=a.toLowerCase()}get port(){return this._port}set port(a){this._port=a===0?a:parseInt(a,10)||null}setParam(a,t){a&&(this._parameters[a.toLowerCase()]=typeof t>"u"||t===null?null:t.toString())}getParam(a){if(a)return this._parameters[a.toLowerCase()]}hasParam(a){if(a)return this._parameters.hasOwnProperty(a.toLowerCase())&&!0||!1}deleteParam(a){if(a=a.toLowerCase(),this._parameters.hasOwnProperty(a)){const t=this._parameters[a];return delete this._parameters[a],t}}clearParams(){this._parameters={}}setHeader(a,t){this._headers[s.headerize(a)]=Array.isArray(t)?t:[t]}getHeader(a){if(a)return this._headers[s.headerize(a)]}hasHeader(a){if(a)return this._headers.hasOwnProperty(s.headerize(a))&&!0||!1}deleteHeader(a){if(a=s.headerize(a),this._headers.hasOwnProperty(a)){const t=this._headers[a];return delete this._headers[a],t}}clearHeaders(){this._headers={}}clone(){return new i_(this._scheme,this._user,this._host,this._port,JSON.parse(JSON.stringify(this._parameters)),JSON.parse(JSON.stringify(this._headers)))}toString(){const a=[];let t=`${this._scheme}:`;this._user&&(t+=`${s.escapeUser(this._user)}@`),t+=this._host,(this._port||this._port===0)&&(t+=`:${this._port}`);for(const n in this._parameters)Object.prototype.hasOwnProperty.call(this._parameters,n)&&(t+=`;${n}`,this._parameters[n]!==null&&(t+=`=${this._parameters[n]}`));for(const n in this._headers)if(Object.prototype.hasOwnProperty.call(this._headers,n))for(const p of this._headers[n])a.push(`${n}=${p}`);return a.length>0&&(t+=`?${a.join("&")}`),t}toAor(a){let t=`${this._scheme}:`;return this._user&&(t+=`${s.escapeUser(this._user)}@`),t+=this._host,a&&(this._port||this._port===0)&&(t+=`:${this._port}`),t}},Oa}var Jc;function yt(){if(Jc)return et;Jc=1;const c=De,s=vs(),r=ls();et.str_utf8_length=n=>unescape(encodeURIComponent(n)).length;const o=et.isFunction=n=>n!==void 0?Object.prototype.toString.call(n)==="[object Function]":!1;et.isString=n=>n!==void 0?Object.prototype.toString.call(n)==="[object String]":!1,et.isDecimal=n=>!isNaN(n)&&parseFloat(n)===parseInt(n,10),et.isEmpty=n=>n===null||n===""||n===void 0||Array.isArray(n)&&n.length===0||typeof n=="number"&&isNaN(n),et.hasMethods=function(n,...p){for(const _ of p)if(o(n[_]))return!1;return!0};const a=et.createRandomToken=(n,p=32)=>{let _,d,g="";for(_=0;_<n;_++)d=Math.random()*p|0,g+=d.toString(p);return g};et.newTag=()=>a(10),et.newUUID=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,p=>{const _=Math.random()*16|0;return(p==="x"?_:_&3|8).toString(16)}),et.hostType=n=>{if(n){if(n=r.parse(n,"host"),n!==-1)return n.host_type}else return};const t=et.escapeUser=n=>encodeURIComponent(decodeURIComponent(n)).replace(/%3A/ig,":").replace(/%2B/ig,"+").replace(/%3F/ig,"?").replace(/%2F/ig,"/");return et.normalizeTarget=(n,p)=>{if(n){if(n instanceof s)return n;if(typeof n=="string"){const _=n.split("@");let d,g;switch(_.length){case 1:if(!p)return;d=n,g=p;break;case 2:d=_[0],g=_[1];break;default:d=_.slice(0,_.length-1).join("@"),g=_[_.length-1]}d=d.replace(/^(sips?|tel):/i,""),/^[-.()]*\+?[0-9\-.()]+$/.test(d)&&(d=d.replace(/[-.()]/g,"")),n=`${c.SIP}:${t(d)}@${g}`;let T;return(T=s.parse(n))?T:void 0}else return}else return},et.headerize=n=>{const p={"Call-Id":"Call-ID",Cseq:"CSeq","Www-Authenticate":"WWW-Authenticate"},_=n.toLowerCase().replace(/_/g,"-").split("-");let d="";const g=_.length;let T;for(T=0;T<g;T++)T!==0&&(d+="-"),d+=_[T].charAt(0).toUpperCase()+_[T].substring(1);return p[d]&&(d=p[d]),d},et.sipErrorCause=n=>{for(const p in c.SIP_ERROR_CAUSES)if(c.SIP_ERROR_CAUSES[p].indexOf(n)!==-1)return c.causes[p];return c.causes.SIP_FAILURE_CODE},et.getRandomTestNetIP=()=>{function n(p,_){return Math.floor(Math.random()*(_-p+1)+p)}return`192.0.2.${n(1,254)}`},et.calculateMD5=n=>{function p(Ee,Ae){return Ee<<Ae|Ee>>>32-Ae}function _(Ee,Ae){const Ie=Ee&2147483648,Oe=Ae&2147483648,pe=Ee&1073741824,ue=Ae&1073741824,de=(Ee&1073741823)+(Ae&1073741823);return pe&ue?de^2147483648^Ie^Oe:pe|ue?de&1073741824?de^3221225472^Ie^Oe:de^1073741824^Ie^Oe:de^Ie^Oe}function d(Ee,Ae,Ie){return Ee&Ae|~Ee&Ie}function g(Ee,Ae,Ie){return Ee&Ie|Ae&~Ie}function T(Ee,Ae,Ie){return Ee^Ae^Ie}function E(Ee,Ae,Ie){return Ae^(Ee|~Ie)}function y(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(d(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function A(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(g(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function C(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(T(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function I(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(E(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function $(Ee){let Ae;const Ie=Ee.length,Oe=Ie+8,ue=((Oe-Oe%64)/64+1)*16,de=new Array(ue-1);let we=0,Ne=0;for(;Ne<Ie;)Ae=(Ne-Ne%4)/4,we=Ne%4*8,de[Ae]=de[Ae]|Ee.charCodeAt(Ne)<<we,Ne++;return Ae=(Ne-Ne%4)/4,we=Ne%4*8,de[Ae]=de[Ae]|128<<we,de[ue-2]=Ie<<3,de[ue-1]=Ie>>>29,de}function L(Ee){let Ae="",Ie="",Oe,pe;for(pe=0;pe<=3;pe++)Oe=Ee>>>pe*8&255,Ie=`0${Oe.toString(16)}`,Ae=Ae+Ie.substr(Ie.length-2,2);return Ae}function ae(Ee){let Ae="";for(let Ie=0;Ie<Ee.length;Ie++){const Oe=Ee.charCodeAt(Ie);Oe<128?Ae+=String.fromCharCode(Oe):Oe>127&&Oe<2048?(Ae+=String.fromCharCode(Oe>>6|192),Ae+=String.fromCharCode(Oe&63|128)):(Ae+=String.fromCharCode(Oe>>12|224),Ae+=String.fromCharCode(Oe>>6&63|128),Ae+=String.fromCharCode(Oe&63|128))}return Ae}let N=[],F,Se,ve,M,D,B,q,z,H;const X=7,U=12,P=17,se=22,tt=5,ee=9,W=14,G=20,re=4,ge=11,be=16,xe=23,Ce=6,le=10,ye=15,st=21;for(n=ae(n),N=$(n),B=1732584193,q=4023233417,z=2562383102,H=271733878,F=0;F<N.length;F+=16)Se=B,ve=q,M=z,D=H,B=y(B,q,z,H,N[F+0],X,3614090360),H=y(H,B,q,z,N[F+1],U,3905402710),z=y(z,H,B,q,N[F+2],P,606105819),q=y(q,z,H,B,N[F+3],se,3250441966),B=y(B,q,z,H,N[F+4],X,4118548399),H=y(H,B,q,z,N[F+5],U,1200080426),z=y(z,H,B,q,N[F+6],P,2821735955),q=y(q,z,H,B,N[F+7],se,4249261313),B=y(B,q,z,H,N[F+8],X,1770035416),H=y(H,B,q,z,N[F+9],U,2336552879),z=y(z,H,B,q,N[F+10],P,4294925233),q=y(q,z,H,B,N[F+11],se,2304563134),B=y(B,q,z,H,N[F+12],X,1804603682),H=y(H,B,q,z,N[F+13],U,4254626195),z=y(z,H,B,q,N[F+14],P,2792965006),q=y(q,z,H,B,N[F+15],se,1236535329),B=A(B,q,z,H,N[F+1],tt,4129170786),H=A(H,B,q,z,N[F+6],ee,3225465664),z=A(z,H,B,q,N[F+11],W,643717713),q=A(q,z,H,B,N[F+0],G,3921069994),B=A(B,q,z,H,N[F+5],tt,3593408605),H=A(H,B,q,z,N[F+10],ee,38016083),z=A(z,H,B,q,N[F+15],W,3634488961),q=A(q,z,H,B,N[F+4],G,3889429448),B=A(B,q,z,H,N[F+9],tt,568446438),H=A(H,B,q,z,N[F+14],ee,3275163606),z=A(z,H,B,q,N[F+3],W,4107603335),q=A(q,z,H,B,N[F+8],G,1163531501),B=A(B,q,z,H,N[F+13],tt,2850285829),H=A(H,B,q,z,N[F+2],ee,4243563512),z=A(z,H,B,q,N[F+7],W,1735328473),q=A(q,z,H,B,N[F+12],G,2368359562),B=C(B,q,z,H,N[F+5],re,4294588738),H=C(H,B,q,z,N[F+8],ge,2272392833),z=C(z,H,B,q,N[F+11],be,1839030562),q=C(q,z,H,B,N[F+14],xe,4259657740),B=C(B,q,z,H,N[F+1],re,2763975236),H=C(H,B,q,z,N[F+4],ge,1272893353),z=C(z,H,B,q,N[F+7],be,4139469664),q=C(q,z,H,B,N[F+10],xe,3200236656),B=C(B,q,z,H,N[F+13],re,681279174),H=C(H,B,q,z,N[F+0],ge,3936430074),z=C(z,H,B,q,N[F+3],be,3572445317),q=C(q,z,H,B,N[F+6],xe,76029189),B=C(B,q,z,H,N[F+9],re,3654602809),H=C(H,B,q,z,N[F+12],ge,3873151461),z=C(z,H,B,q,N[F+15],be,530742520),q=C(q,z,H,B,N[F+2],xe,3299628645),B=I(B,q,z,H,N[F+0],Ce,4096336452),H=I(H,B,q,z,N[F+7],le,1126891415),z=I(z,H,B,q,N[F+14],ye,2878612391),q=I(q,z,H,B,N[F+5],st,4237533241),B=I(B,q,z,H,N[F+12],Ce,1700485571),H=I(H,B,q,z,N[F+3],le,2399980690),z=I(z,H,B,q,N[F+10],ye,4293915773),q=I(q,z,H,B,N[F+1],st,2240044497),B=I(B,q,z,H,N[F+8],Ce,1873313359),H=I(H,B,q,z,N[F+15],le,4264355552),z=I(z,H,B,q,N[F+6],ye,2734768916),q=I(q,z,H,B,N[F+13],st,1309151649),B=I(B,q,z,H,N[F+4],Ce,4149444226),H=I(H,B,q,z,N[F+11],le,3174756917),z=I(z,H,B,q,N[F+2],ye,718787259),q=I(q,z,H,B,N[F+9],st,3951481745),B=_(B,Se),q=_(q,ve),z=_(z,M),H=_(H,D);return(L(B)+L(q)+L(z)+L(H)).toLowerCase()},et.closeMediaStream=n=>{if(n)try{let p;if(n.getTracks){p=n.getTracks();for(const _ of p)_.stop()}else{p=n.getAudioTracks();for(const _ of p)_.stop();p=n.getVideoTracks();for(const _ of p)_.stop()}}catch{(typeof n.stop=="function"||typeof n.stop=="object")&&n.stop()}},et.cloneArray=n=>n&&n.slice()||[],et.cloneObject=(n,p={})=>n&&Object.assign({},n)||p,et}const l_=Ut,xm=ut,St=De,rt=yt(),Xc=Du(),Mm=ls(),Da=new xm("SIPMessage");class Fo{constructor(s,r,o,a,t,n){if(!s||!r||!o)return null;a=a||{},this.ua=o,this.headers={},this.method=s,this.ruri=r,this.body=n,this.extraHeaders=rt.cloneArray(t),this.ua.configuration.extra_headers&&(this.extraHeaders=this.extraHeaders.concat(this.ua.configuration.extra_headers)),a.route_set?this.setHeader("route",a.route_set):o.configuration.use_preloaded_route&&this.setHeader("route",`<${o.transport.sip_uri};lr>`),this.setHeader("via",""),this.setHeader("max-forwards",St.MAX_FORWARDS);const p=a.to_uri||r,_=a.to_tag?{tag:a.to_tag}:null,d=typeof a.to_display_name<"u"?a.to_display_name:null;this.to=new Xc(p,d,_),this.setHeader("to",this.to.toString());const g=a.from_uri||o.configuration.uri,T={tag:a.from_tag||rt.newTag()};let E;typeof a.from_display_name<"u"?E=a.from_display_name:o.configuration.display_name?E=o.configuration.display_name:E=null,this.from=new Xc(g,E,T),this.setHeader("from",this.from.toString());const y=a.call_id||o.configuration.jssip_id+rt.createRandomToken(15);this.call_id=y,this.setHeader("call-id",y);const A=a.cseq||Math.floor(Math.random()*1e4);this.cseq=A,this.setHeader("cseq",`${A} ${s}`)}setHeader(s,r){const o=new RegExp(`^\\s*${s}\\s*:`,"i");for(let a=0;a<this.extraHeaders.length;a++)o.test(this.extraHeaders[a])&&this.extraHeaders.splice(a,1);this.headers[rt.headerize(s)]=Array.isArray(r)?r:[r]}getHeader(s){const r=this.headers[rt.headerize(s)];if(r){if(r[0])return r[0]}else{const o=new RegExp(`^\\s*${s}\\s*:`,"i");for(const a of this.extraHeaders)if(o.test(a))return a.substring(a.indexOf(":")+1).trim()}}getHeaders(s){const r=this.headers[rt.headerize(s)],o=[];if(r){for(const a of r)o.push(a);return o}else{const a=new RegExp(`^\\s*${s}\\s*:`,"i");for(const t of this.extraHeaders)a.test(t)&&o.push(t.substring(t.indexOf(":")+1).trim());return o}}hasHeader(s){if(this.headers[rt.headerize(s)])return!0;{const r=new RegExp(`^\\s*${s}\\s*:`,"i");for(const o of this.extraHeaders)if(r.test(o))return!0}return!1}parseSDP(s){return!s&&this.sdp?this.sdp:(this.sdp=l_.parse(this.body||""),this.sdp)}toString(){let s=`${this.method} ${this.ruri} SIP/2.0\r
|
75
|
+
`?(l||i++,e=1,l=!1):f==="\r"||f==="\u2028"||f==="\u2029"?(i++,e=1,l=!0):(e++,l=!1)}return{line:i,column:e}}var Ul=vs(),us=Du(),b={},w=a[o]();if(w===null||t!==r.length){var Ri=Math.max(t,n),Ii=Ri<r.length?r.charAt(Ri):null,Pl=na();return new this.SyntaxError(Nl(p),Ii,Ri,Pl.line,Pl.column),-1}return b},toSource:function(){return this._source}};return s.SyntaxError=function(r,o,a,t,n){function p(_,d){var g,T;switch(_.length){case 0:g="end of input";break;case 1:g=_[0];break;default:g=_.slice(0,_.length-1).join(", ")+" or "+_[_.length-1]}return T=d?c(d):"end of input","Expected "+g+" but "+T+" found."}this.name="SyntaxError",this.expected=r,this.found=o,this.message=p(r,o),this.offset=a,this.line=t,this.column=n},s.SyntaxError.prototype=Error.prototype,s}()),wa}var Oa,zc;function vs(){if(zc)return Oa;zc=1;const c=De,s=yt(),r=ls();return Oa=class i_{static parse(a){if(a=r.parse(a,"SIP_URI"),a!==-1)return a}constructor(a,t,n,p,_={},d={}){if(!n)throw new TypeError('missing or invalid "host" parameter');this._parameters={},this._headers={},this._scheme=a||c.SIP,this._user=t,this._host=n,this._port=p;for(const g in _)Object.prototype.hasOwnProperty.call(_,g)&&this.setParam(g,_[g]);for(const g in d)Object.prototype.hasOwnProperty.call(d,g)&&this.setHeader(g,d[g])}get scheme(){return this._scheme}set scheme(a){this._scheme=a.toLowerCase()}get user(){return this._user}set user(a){this._user=a}get host(){return this._host}set host(a){this._host=a.toLowerCase()}get port(){return this._port}set port(a){this._port=a===0?a:parseInt(a,10)||null}setParam(a,t){a&&(this._parameters[a.toLowerCase()]=typeof t>"u"||t===null?null:t.toString())}getParam(a){if(a)return this._parameters[a.toLowerCase()]}hasParam(a){if(a)return this._parameters.hasOwnProperty(a.toLowerCase())&&!0||!1}deleteParam(a){if(a=a.toLowerCase(),this._parameters.hasOwnProperty(a)){const t=this._parameters[a];return delete this._parameters[a],t}}clearParams(){this._parameters={}}setHeader(a,t){this._headers[s.headerize(a)]=Array.isArray(t)?t:[t]}getHeader(a){if(a)return this._headers[s.headerize(a)]}hasHeader(a){if(a)return this._headers.hasOwnProperty(s.headerize(a))&&!0||!1}deleteHeader(a){if(a=s.headerize(a),this._headers.hasOwnProperty(a)){const t=this._headers[a];return delete this._headers[a],t}}clearHeaders(){this._headers={}}clone(){return new i_(this._scheme,this._user,this._host,this._port,JSON.parse(JSON.stringify(this._parameters)),JSON.parse(JSON.stringify(this._headers)))}toString(){const a=[];let t=`${this._scheme}:`;this._user&&(t+=`${s.escapeUser(this._user)}@`),t+=this._host,(this._port||this._port===0)&&(t+=`:${this._port}`);for(const n in this._parameters)Object.prototype.hasOwnProperty.call(this._parameters,n)&&(t+=`;${n}`,this._parameters[n]!==null&&(t+=`=${this._parameters[n]}`));for(const n in this._headers)if(Object.prototype.hasOwnProperty.call(this._headers,n))for(const p of this._headers[n])a.push(`${n}=${p}`);return a.length>0&&(t+=`?${a.join("&")}`),t}toAor(a){let t=`${this._scheme}:`;return this._user&&(t+=`${s.escapeUser(this._user)}@`),t+=this._host,a&&(this._port||this._port===0)&&(t+=`:${this._port}`),t}},Oa}var Jc;function yt(){if(Jc)return et;Jc=1;const c=De,s=vs(),r=ls();et.str_utf8_length=n=>unescape(encodeURIComponent(n)).length;const o=et.isFunction=n=>n!==void 0?Object.prototype.toString.call(n)==="[object Function]":!1;et.isString=n=>n!==void 0?Object.prototype.toString.call(n)==="[object String]":!1,et.isDecimal=n=>!isNaN(n)&&parseFloat(n)===parseInt(n,10),et.isEmpty=n=>n===null||n===""||n===void 0||Array.isArray(n)&&n.length===0||typeof n=="number"&&isNaN(n),et.hasMethods=function(n,...p){for(const _ of p)if(o(n[_]))return!1;return!0};const a=et.createRandomToken=(n,p=32)=>{let _,d,g="";for(_=0;_<n;_++)d=Math.random()*p|0,g+=d.toString(p);return g};et.newTag=()=>a(10),et.newUUID=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,p=>{const _=Math.random()*16|0;return(p==="x"?_:_&3|8).toString(16)}),et.hostType=n=>{if(n){if(n=r.parse(n,"host"),n!==-1)return n.host_type}else return};const t=et.escapeUser=n=>encodeURIComponent(decodeURIComponent(n)).replace(/%3A/ig,":").replace(/%2B/ig,"+").replace(/%3F/ig,"?").replace(/%2F/ig,"/");return et.normalizeTarget=(n,p)=>{if(n){if(n instanceof s)return n;if(typeof n=="string"){const _=n.split("@");let d,g;switch(_.length){case 1:if(!p)return;d=n,g=p;break;case 2:d=_[0],g=_[1];break;default:d=_.slice(0,_.length-1).join("@"),g=_[_.length-1]}d=d.replace(/^(sips?|tel):/i,""),/^[-.()]*\+?[0-9\-.()]+$/.test(d)&&(d=d.replace(/[-.()]/g,"")),n=`${c.SIP}:${t(d)}@${g}`;let T;return(T=s.parse(n))?T:void 0}else return}else return},et.headerize=n=>{const p={"Call-Id":"Call-ID",Cseq:"CSeq","Www-Authenticate":"WWW-Authenticate"},_=n.toLowerCase().replace(/_/g,"-").split("-");let d="";const g=_.length;let T;for(T=0;T<g;T++)T!==0&&(d+="-"),d+=_[T].charAt(0).toUpperCase()+_[T].substring(1);return p[d]&&(d=p[d]),d},et.sipErrorCause=n=>{for(const p in c.SIP_ERROR_CAUSES)if(c.SIP_ERROR_CAUSES[p].indexOf(n)!==-1)return c.causes[p];return c.causes.SIP_FAILURE_CODE},et.getRandomTestNetIP=()=>{function n(p,_){return Math.floor(Math.random()*(_-p+1)+p)}return`192.0.2.${n(1,254)}`},et.calculateMD5=n=>{function p(Ee,Ae){return Ee<<Ae|Ee>>>32-Ae}function _(Ee,Ae){const Ie=Ee&2147483648,Oe=Ae&2147483648,pe=Ee&1073741824,ue=Ae&1073741824,de=(Ee&1073741823)+(Ae&1073741823);return pe&ue?de^2147483648^Ie^Oe:pe|ue?de&1073741824?de^3221225472^Ie^Oe:de^1073741824^Ie^Oe:de^Ie^Oe}function d(Ee,Ae,Ie){return Ee&Ae|~Ee&Ie}function g(Ee,Ae,Ie){return Ee&Ie|Ae&~Ie}function T(Ee,Ae,Ie){return Ee^Ae^Ie}function E(Ee,Ae,Ie){return Ae^(Ee|~Ie)}function y(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(d(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function A(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(g(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function C(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(T(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function I(Ee,Ae,Ie,Oe,pe,ue,de){return Ee=_(Ee,_(_(E(Ae,Ie,Oe),pe),de)),_(p(Ee,ue),Ae)}function $(Ee){let Ae;const Ie=Ee.length,Oe=Ie+8,ue=((Oe-Oe%64)/64+1)*16,de=new Array(ue-1);let we=0,Ne=0;for(;Ne<Ie;)Ae=(Ne-Ne%4)/4,we=Ne%4*8,de[Ae]=de[Ae]|Ee.charCodeAt(Ne)<<we,Ne++;return Ae=(Ne-Ne%4)/4,we=Ne%4*8,de[Ae]=de[Ae]|128<<we,de[ue-2]=Ie<<3,de[ue-1]=Ie>>>29,de}function L(Ee){let Ae="",Ie="",Oe,pe;for(pe=0;pe<=3;pe++)Oe=Ee>>>pe*8&255,Ie=`0${Oe.toString(16)}`,Ae=Ae+Ie.substr(Ie.length-2,2);return Ae}function ae(Ee){let Ae="";for(let Ie=0;Ie<Ee.length;Ie++){const Oe=Ee.charCodeAt(Ie);Oe<128?Ae+=String.fromCharCode(Oe):Oe>127&&Oe<2048?(Ae+=String.fromCharCode(Oe>>6|192),Ae+=String.fromCharCode(Oe&63|128)):(Ae+=String.fromCharCode(Oe>>12|224),Ae+=String.fromCharCode(Oe>>6&63|128),Ae+=String.fromCharCode(Oe&63|128))}return Ae}let N=[],F,Se,ve,M,D,B,q,z,H;const X=7,U=12,P=17,se=22,tt=5,ee=9,W=14,G=20,re=4,ge=11,be=16,xe=23,Ce=6,le=10,ye=15,st=21;for(n=ae(n),N=$(n),B=1732584193,q=4023233417,z=2562383102,H=271733878,F=0;F<N.length;F+=16)Se=B,ve=q,M=z,D=H,B=y(B,q,z,H,N[F+0],X,3614090360),H=y(H,B,q,z,N[F+1],U,3905402710),z=y(z,H,B,q,N[F+2],P,606105819),q=y(q,z,H,B,N[F+3],se,3250441966),B=y(B,q,z,H,N[F+4],X,4118548399),H=y(H,B,q,z,N[F+5],U,1200080426),z=y(z,H,B,q,N[F+6],P,2821735955),q=y(q,z,H,B,N[F+7],se,4249261313),B=y(B,q,z,H,N[F+8],X,1770035416),H=y(H,B,q,z,N[F+9],U,2336552879),z=y(z,H,B,q,N[F+10],P,4294925233),q=y(q,z,H,B,N[F+11],se,2304563134),B=y(B,q,z,H,N[F+12],X,1804603682),H=y(H,B,q,z,N[F+13],U,4254626195),z=y(z,H,B,q,N[F+14],P,2792965006),q=y(q,z,H,B,N[F+15],se,1236535329),B=A(B,q,z,H,N[F+1],tt,4129170786),H=A(H,B,q,z,N[F+6],ee,3225465664),z=A(z,H,B,q,N[F+11],W,643717713),q=A(q,z,H,B,N[F+0],G,3921069994),B=A(B,q,z,H,N[F+5],tt,3593408605),H=A(H,B,q,z,N[F+10],ee,38016083),z=A(z,H,B,q,N[F+15],W,3634488961),q=A(q,z,H,B,N[F+4],G,3889429448),B=A(B,q,z,H,N[F+9],tt,568446438),H=A(H,B,q,z,N[F+14],ee,3275163606),z=A(z,H,B,q,N[F+3],W,4107603335),q=A(q,z,H,B,N[F+8],G,1163531501),B=A(B,q,z,H,N[F+13],tt,2850285829),H=A(H,B,q,z,N[F+2],ee,4243563512),z=A(z,H,B,q,N[F+7],W,1735328473),q=A(q,z,H,B,N[F+12],G,2368359562),B=C(B,q,z,H,N[F+5],re,4294588738),H=C(H,B,q,z,N[F+8],ge,2272392833),z=C(z,H,B,q,N[F+11],be,1839030562),q=C(q,z,H,B,N[F+14],xe,4259657740),B=C(B,q,z,H,N[F+1],re,2763975236),H=C(H,B,q,z,N[F+4],ge,1272893353),z=C(z,H,B,q,N[F+7],be,4139469664),q=C(q,z,H,B,N[F+10],xe,3200236656),B=C(B,q,z,H,N[F+13],re,681279174),H=C(H,B,q,z,N[F+0],ge,3936430074),z=C(z,H,B,q,N[F+3],be,3572445317),q=C(q,z,H,B,N[F+6],xe,76029189),B=C(B,q,z,H,N[F+9],re,3654602809),H=C(H,B,q,z,N[F+12],ge,3873151461),z=C(z,H,B,q,N[F+15],be,530742520),q=C(q,z,H,B,N[F+2],xe,3299628645),B=I(B,q,z,H,N[F+0],Ce,4096336452),H=I(H,B,q,z,N[F+7],le,1126891415),z=I(z,H,B,q,N[F+14],ye,2878612391),q=I(q,z,H,B,N[F+5],st,4237533241),B=I(B,q,z,H,N[F+12],Ce,1700485571),H=I(H,B,q,z,N[F+3],le,2399980690),z=I(z,H,B,q,N[F+10],ye,4293915773),q=I(q,z,H,B,N[F+1],st,2240044497),B=I(B,q,z,H,N[F+8],Ce,1873313359),H=I(H,B,q,z,N[F+15],le,4264355552),z=I(z,H,B,q,N[F+6],ye,2734768916),q=I(q,z,H,B,N[F+13],st,1309151649),B=I(B,q,z,H,N[F+4],Ce,4149444226),H=I(H,B,q,z,N[F+11],le,3174756917),z=I(z,H,B,q,N[F+2],ye,718787259),q=I(q,z,H,B,N[F+9],st,3951481745),B=_(B,Se),q=_(q,ve),z=_(z,M),H=_(H,D);return(L(B)+L(q)+L(z)+L(H)).toLowerCase()},et.closeMediaStream=n=>{if(n)try{let p;if(n.getTracks){p=n.getTracks();for(const _ of p)_.stop()}else{p=n.getAudioTracks();for(const _ of p)_.stop();p=n.getVideoTracks();for(const _ of p)_.stop()}}catch{(typeof n.stop=="function"||typeof n.stop=="object")&&n.stop()}},et.cloneArray=n=>n&&n.slice()||[],et.cloneObject=(n,p={})=>n&&Object.assign({},n)||p,et}const l_=Ut,xm=at,St=De,rt=yt(),Xc=Du(),Mm=ls(),Da=new xm("SIPMessage");class Fo{constructor(s,r,o,a,t,n){if(!s||!r||!o)return null;a=a||{},this.ua=o,this.headers={},this.method=s,this.ruri=r,this.body=n,this.extraHeaders=rt.cloneArray(t),this.ua.configuration.extra_headers&&(this.extraHeaders=this.extraHeaders.concat(this.ua.configuration.extra_headers)),a.route_set?this.setHeader("route",a.route_set):o.configuration.use_preloaded_route&&this.setHeader("route",`<${o.transport.sip_uri};lr>`),this.setHeader("via",""),this.setHeader("max-forwards",St.MAX_FORWARDS);const p=a.to_uri||r,_=a.to_tag?{tag:a.to_tag}:null,d=typeof a.to_display_name<"u"?a.to_display_name:null;this.to=new Xc(p,d,_),this.setHeader("to",this.to.toString());const g=a.from_uri||o.configuration.uri,T={tag:a.from_tag||rt.newTag()};let E;typeof a.from_display_name<"u"?E=a.from_display_name:o.configuration.display_name?E=o.configuration.display_name:E=null,this.from=new Xc(g,E,T),this.setHeader("from",this.from.toString());const y=a.call_id||o.configuration.jssip_id+rt.createRandomToken(15);this.call_id=y,this.setHeader("call-id",y);const A=a.cseq||Math.floor(Math.random()*1e4);this.cseq=A,this.setHeader("cseq",`${A} ${s}`)}setHeader(s,r){const o=new RegExp(`^\\s*${s}\\s*:`,"i");for(let a=0;a<this.extraHeaders.length;a++)o.test(this.extraHeaders[a])&&this.extraHeaders.splice(a,1);this.headers[rt.headerize(s)]=Array.isArray(r)?r:[r]}getHeader(s){const r=this.headers[rt.headerize(s)];if(r){if(r[0])return r[0]}else{const o=new RegExp(`^\\s*${s}\\s*:`,"i");for(const a of this.extraHeaders)if(o.test(a))return a.substring(a.indexOf(":")+1).trim()}}getHeaders(s){const r=this.headers[rt.headerize(s)],o=[];if(r){for(const a of r)o.push(a);return o}else{const a=new RegExp(`^\\s*${s}\\s*:`,"i");for(const t of this.extraHeaders)a.test(t)&&o.push(t.substring(t.indexOf(":")+1).trim());return o}}hasHeader(s){if(this.headers[rt.headerize(s)])return!0;{const r=new RegExp(`^\\s*${s}\\s*:`,"i");for(const o of this.extraHeaders)if(r.test(o))return!0}return!1}parseSDP(s){return!s&&this.sdp?this.sdp:(this.sdp=l_.parse(this.body||""),this.sdp)}toString(){let s=`${this.method} ${this.ruri} SIP/2.0\r
|
76
76
|
`;for(const a in this.headers)if(Object.prototype.hasOwnProperty.call(this.headers,a))for(const t of this.headers[a])s+=`${a}: ${t}\r
|
77
77
|
`;for(const a of this.extraHeaders)s+=`${a.trim()}\r
|
78
78
|
`;const r=[];switch(this.method){case St.REGISTER:r.push("path","gruu");break;case St.INVITE:this.ua.configuration.session_timers&&r.push("timer"),(this.ua.contact.pub_gruu||this.ua.contact.temp_gruu)&&r.push("gruu"),r.push("ice","replaces");break;case St.UPDATE:this.ua.configuration.session_timers&&r.push("timer"),r.push("ice");break}r.push("outbound");const o=this.ua.configuration.user_agent||St.USER_AGENT;if(s+=`Allow: ${St.ALLOWED_METHODS}\r
|
@@ -109,10 +109,10 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
109
109
|
`,this.ua.configuration.extra_headers)for(const n of this.ua.configuration.extra_headers)a+=`${n.trim()}\r
|
110
110
|
`;a+=`Content-Length: 0\r
|
111
111
|
\r
|
112
|
-
`,this.transport.send(a)}}class Lm extends o_{constructor(){super(),this.headers={},this.status_code=null,this.reason_phrase=null}}var Pt={OutgoingRequest:Fo,InitialOutgoingInviteRequest:Nu,IncomingRequest:km,IncomingResponse:Lm};const Gl=Xe(Pt),$m=ut,hs=yt(),Yt=new $m("DigestAuthentication");var a_=class{constructor(s){this._credentials=s,this._cnonce=null,this._nc=0,this._ncHex="00000000",this._algorithm=null,this._realm=null,this._nonce=null,this._opaque=null,this._stale=null,this._qop=null,this._method=null,this._uri=null,this._ha1=null,this._response=null}get(s){switch(s){case"realm":return this._realm;case"ha1":return this._ha1;default:Yt.warn('get() | cannot get "%s" parameter',s);return}}authenticate({method:s,ruri:r,body:o},a,t=null){if(this._algorithm=a.algorithm,this._realm=a.realm,this._nonce=a.nonce,this._opaque=a.opaque,this._stale=a.stale,this._algorithm){if(this._algorithm!=="MD5")return Yt.warn('authenticate() | challenge with Digest algorithm different than "MD5", authentication aborted'),!1}else this._algorithm="MD5";if(!this._nonce)return Yt.warn("authenticate() | challenge without Digest nonce, authentication aborted"),!1;if(!this._realm)return Yt.warn("authenticate() | challenge without Digest realm, authentication aborted"),!1;if(!this._credentials.password){if(!this._credentials.ha1)return Yt.warn("authenticate() | no plain SIP password nor ha1 provided, authentication aborted"),!1;if(this._credentials.realm!==this._realm)return Yt.warn('authenticate() | no plain SIP password, and stored `realm` does not match the given `realm`, cannot authenticate [stored:"%s", given:"%s"]',this._credentials.realm,this._realm),!1}if(a.qop)if(a.qop.indexOf("auth-int")>-1)this._qop="auth-int";else if(a.qop.indexOf("auth")>-1)this._qop="auth";else return Yt.warn('authenticate() | challenge without Digest qop different than "auth" or "auth-int", authentication aborted'),!1;else this._qop=null;this._method=s,this._uri=r,this._cnonce=t||hs.createRandomToken(12),this._nc+=1;const n=Number(this._nc).toString(16);this._ncHex="00000000".substr(0,8-n.length)+n,this._nc===4294967296&&(this._nc=1,this._ncHex="00000001"),this._credentials.password?this._ha1=hs.calculateMD5(`${this._credentials.username}:${this._realm}:${this._credentials.password}`):this._ha1=this._credentials.ha1;let p,_;return this._qop==="auth"?(p=`${this._method}:${this._uri}`,_=hs.calculateMD5(p),Yt.debug('authenticate() | using qop=auth [a2:"%s"]',p),this._response=hs.calculateMD5(`${this._ha1}:${this._nonce}:${this._ncHex}:${this._cnonce}:auth:${_}`)):this._qop==="auth-int"?(p=`${this._method}:${this._uri}:${hs.calculateMD5(o||"")}`,_=hs.calculateMD5(p),Yt.debug('authenticate() | using qop=auth-int [a2:"%s"]',p),this._response=hs.calculateMD5(`${this._ha1}:${this._nonce}:${this._ncHex}:${this._cnonce}:auth-int:${_}`)):this._qop===null&&(p=`${this._method}:${this._uri}`,_=hs.calculateMD5(p),Yt.debug('authenticate() | using qop=null [a2:"%s"]',p),this._response=hs.calculateMD5(`${this._ha1}:${this._nonce}:${_}`)),Yt.debug("authenticate() | response generated"),!0}toString(){const s=[];if(!this._response)throw new Error("response field does not exist, cannot generate Authorization header");return s.push(`algorithm=${this._algorithm}`),s.push(`username="${this._credentials.username}"`),s.push(`realm="${this._realm}"`),s.push(`nonce="${this._nonce}"`),s.push(`uri="${this._uri}"`),s.push(`response="${this._response}"`),this._opaque&&s.push(`opaque="${this._opaque}"`),this._qop&&(s.push(`qop=${this._qop}`),s.push(`cnonce="${this._cnonce}"`),s.push(`nc=${this._ncHex}`)),`Digest ${s.join(", ")}`}};const Hm=Xe(a_),ds=500,Fm=4e3,Qc=5e3;var Uu={T1:ds,T2:Fm,T4:Qc,TIMER_B:64*ds,TIMER_D:0*ds,TIMER_F:64*ds,TIMER_H:64*ds,TIMER_I:0*ds,TIMER_J:0*ds,TIMER_K:0*Qc,TIMER_L:64*ds,TIMER_M:64*ds,PROVISIONAL_RESPONSE_INTERVAL:6e4};const Mi=Xe(Uu),ul=ft.EventEmitter,cl=ut,Ki=De,Zc=Pt,rs=Uu,ef=new cl("NonInviteClientTransaction"),Wl=new cl("InviteClientTransaction"),jm=new cl("AckClientTransaction"),tf=new cl("NonInviteServerTransaction"),Kl=new cl("InviteServerTransaction"),he={STATUS_TRYING:1,STATUS_PROCEEDING:2,STATUS_CALLING:3,STATUS_ACCEPTED:4,STATUS_COMPLETED:5,STATUS_TERMINATED:6,STATUS_CONFIRMED:7,NON_INVITE_CLIENT:"nict",NON_INVITE_SERVER:"nist",INVITE_CLIENT:"ict",INVITE_SERVER:"ist"};class Vm extends ul{constructor(s,r,o,a){super(),this.type=he.NON_INVITE_CLIENT,this.id=`z9hG4bK${Math.floor(Math.random()*1e7)}`,this.ua=s,this.transport=r,this.request=o,this.eventHandlers=a;let t=`SIP/2.0/${r.via_transport}`;t+=` ${s.configuration.via_host};branch=${this.id}`,this.request.setHeader("via",t),this.ua.newTransaction(this)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}send(){this.stateChanged(he.STATUS_TRYING),this.F=setTimeout(()=>{this.timer_F()},rs.TIMER_F),this.transport.send(this.request)||this.onTransportError()}onTransportError(){ef.debug(`transport error occurred, deleting transaction ${this.id}`),clearTimeout(this.F),clearTimeout(this.K),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this),this.eventHandlers.onTransportError()}timer_F(){ef.debug(`Timer F expired for transaction ${this.id}`),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this),this.eventHandlers.onRequestTimeout()}timer_K(){this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}receiveResponse(s){const r=s.status_code;if(r<200)switch(this.state){case he.STATUS_TRYING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_PROCEEDING),this.eventHandlers.onReceiveResponse(s);break}else switch(this.state){case he.STATUS_TRYING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_COMPLETED),clearTimeout(this.F),r===408?this.eventHandlers.onRequestTimeout():this.eventHandlers.onReceiveResponse(s),this.K=setTimeout(()=>{this.timer_K()},rs.TIMER_K);break;case he.STATUS_COMPLETED:break}}}class qm extends ul{constructor(s,r,o,a){super(),this.type=he.INVITE_CLIENT,this.id=`z9hG4bK${Math.floor(Math.random()*1e7)}`,this.ua=s,this.transport=r,this.request=o,this.eventHandlers=a,o.transaction=this;let t=`SIP/2.0/${r.via_transport}`;t+=` ${s.configuration.via_host};branch=${this.id}`,this.request.setHeader("via",t),this.ua.newTransaction(this)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}send(){this.stateChanged(he.STATUS_CALLING),this.B=setTimeout(()=>{this.timer_B()},rs.TIMER_B),this.transport.send(this.request)||this.onTransportError()}onTransportError(){clearTimeout(this.B),clearTimeout(this.D),clearTimeout(this.M),this.state!==he.STATUS_ACCEPTED&&(Wl.debug(`transport error occurred, deleting transaction ${this.id}`),this.eventHandlers.onTransportError()),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}timer_M(){Wl.debug(`Timer M expired for transaction ${this.id}`),this.state===he.STATUS_ACCEPTED&&(clearTimeout(this.B),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}timer_B(){Wl.debug(`Timer B expired for transaction ${this.id}`),this.state===he.STATUS_CALLING&&(this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this),this.eventHandlers.onRequestTimeout())}timer_D(){Wl.debug(`Timer D expired for transaction ${this.id}`),clearTimeout(this.B),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}sendACK(s){const r=new Zc.OutgoingRequest(Ki.ACK,this.request.ruri,this.ua,{route_set:this.request.getHeaders("route"),call_id:this.request.getHeader("call-id"),cseq:this.request.cseq});r.setHeader("from",this.request.getHeader("from")),r.setHeader("via",this.request.getHeader("via")),r.setHeader("to",s.getHeader("to")),this.D=setTimeout(()=>{this.timer_D()},rs.TIMER_D),this.transport.send(r)}cancel(s){if(this.state!==he.STATUS_PROCEEDING)return;const r=new Zc.OutgoingRequest(Ki.CANCEL,this.request.ruri,this.ua,{route_set:this.request.getHeaders("route"),call_id:this.request.getHeader("call-id"),cseq:this.request.cseq});r.setHeader("from",this.request.getHeader("from")),r.setHeader("via",this.request.getHeader("via")),r.setHeader("to",this.request.getHeader("to")),s&&r.setHeader("reason",s),this.transport.send(r)}receiveResponse(s){const r=s.status_code;if(r>=100&&r<=199)switch(this.state){case he.STATUS_CALLING:this.stateChanged(he.STATUS_PROCEEDING),this.eventHandlers.onReceiveResponse(s);break;case he.STATUS_PROCEEDING:this.eventHandlers.onReceiveResponse(s);break}else if(r>=200&&r<=299)switch(this.state){case he.STATUS_CALLING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_ACCEPTED),this.M=setTimeout(()=>{this.timer_M()},rs.TIMER_M),this.eventHandlers.onReceiveResponse(s);break;case he.STATUS_ACCEPTED:this.eventHandlers.onReceiveResponse(s);break}else if(r>=300&&r<=699)switch(this.state){case he.STATUS_CALLING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_COMPLETED),this.sendACK(s),this.eventHandlers.onReceiveResponse(s);break;case he.STATUS_COMPLETED:this.sendACK(s);break}}}class Bm extends ul{constructor(s,r,o,a){super(),this.id=`z9hG4bK${Math.floor(Math.random()*1e7)}`,this.transport=r,this.request=o,this.eventHandlers=a;let t=`SIP/2.0/${r.via_transport}`;t+=` ${s.configuration.via_host};branch=${this.id}`,this.request.setHeader("via",t)}get C(){return he}send(){this.transport.send(this.request)||this.onTransportError()}onTransportError(){jm.debug(`transport error occurred for transaction ${this.id}`),this.eventHandlers.onTransportError()}}class Gm extends ul{constructor(s,r,o){super(),this.type=he.NON_INVITE_SERVER,this.id=o.via_branch,this.ua=s,this.transport=r,this.request=o,this.last_response="",o.server_transaction=this,this.state=he.STATUS_TRYING,s.newTransaction(this)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}timer_J(){tf.debug(`Timer J expired for transaction ${this.id}`),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}onTransportError(){this.transportError||(this.transportError=!0,tf.debug(`transport error occurred, deleting transaction ${this.id}`),clearTimeout(this.J),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}receiveResponse(s,r,o,a){if(s===100)switch(this.state){case he.STATUS_TRYING:this.stateChanged(he.STATUS_PROCEEDING),this.transport.send(r)||this.onTransportError();break;case he.STATUS_PROCEEDING:this.last_response=r,this.transport.send(r)?o&&o():(this.onTransportError(),a&&a());break}else if(s>=200&&s<=699)switch(this.state){case he.STATUS_TRYING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_COMPLETED),this.last_response=r,this.J=setTimeout(()=>{this.timer_J()},rs.TIMER_J),this.transport.send(r)?o&&o():(this.onTransportError(),a&&a());break;case he.STATUS_COMPLETED:break}}}class Wm extends ul{constructor(s,r,o){super(),this.type=he.INVITE_SERVER,this.id=o.via_branch,this.ua=s,this.transport=r,this.request=o,this.last_response="",o.server_transaction=this,this.state=he.STATUS_PROCEEDING,s.newTransaction(this),this.resendProvisionalTimer=null,o.reply(100)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}timer_H(){Kl.debug(`Timer H expired for transaction ${this.id}`),this.state===he.STATUS_COMPLETED&&Kl.debug("ACK not received, dialog will be terminated"),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}timer_I(){this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}timer_L(){Kl.debug(`Timer L expired for transaction ${this.id}`),this.state===he.STATUS_ACCEPTED&&(this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}onTransportError(){this.transportError||(this.transportError=!0,Kl.debug(`transport error occurred, deleting transaction ${this.id}`),this.resendProvisionalTimer!==null&&(clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),clearTimeout(this.L),clearTimeout(this.H),clearTimeout(this.I),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}resend_provisional(){this.transport.send(this.last_response)||this.onTransportError()}receiveResponse(s,r,o,a){if(s>=100&&s<=199)switch(this.state){case he.STATUS_PROCEEDING:this.transport.send(r)||this.onTransportError(),this.last_response=r;break}if(s>100&&s<=199&&this.state===he.STATUS_PROCEEDING)this.resendProvisionalTimer===null&&(this.resendProvisionalTimer=setInterval(()=>{this.resend_provisional()},rs.PROVISIONAL_RESPONSE_INTERVAL));else if(s>=200&&s<=299)switch(this.state){case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_ACCEPTED),this.last_response=r,this.L=setTimeout(()=>{this.timer_L()},rs.TIMER_L),this.resendProvisionalTimer!==null&&(clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null);case he.STATUS_ACCEPTED:this.transport.send(r)?o&&o():(this.onTransportError(),a&&a());break}else if(s>=300&&s<=699)switch(this.state){case he.STATUS_PROCEEDING:this.resendProvisionalTimer!==null&&(clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),this.transport.send(r)?(this.stateChanged(he.STATUS_COMPLETED),this.H=setTimeout(()=>{this.timer_H()},rs.TIMER_H),o&&o()):(this.onTransportError(),a&&a());break}}}function Km({_transactions:c},s){let r;switch(s.method){case Ki.INVITE:if(r=c.ist[s.via_branch],r){switch(r.state){case he.STATUS_PROCEEDING:r.transport.send(r.last_response);break;case he.STATUS_ACCEPTED:break}return!0}break;case Ki.ACK:if(r=c.ist[s.via_branch],r){if(r.state===he.STATUS_ACCEPTED)return!1;if(r.state===he.STATUS_COMPLETED)return r.state=he.STATUS_CONFIRMED,r.I=setTimeout(()=>{r.timer_I()},rs.TIMER_I),!0}else return!1;break;case Ki.CANCEL:return r=c.ist[s.via_branch],r?(s.reply_sl(200),r.state!==he.STATUS_PROCEEDING):(s.reply_sl(481),!0);default:if(r=c.nist[s.via_branch],r){switch(r.state){case he.STATUS_TRYING:break;case he.STATUS_PROCEEDING:case he.STATUS_COMPLETED:r.transport.send(r.last_response);break}return!0}break}}var pr={C:he,NonInviteClientTransaction:Vm,InviteClientTransaction:qm,AckClientTransaction:Bm,NonInviteServerTransaction:Gm,InviteServerTransaction:Wm,checkTransaction:Km};const Bt=Xe(pr),Ym=ut,sf=De,zm=a_,Na=pr,Jm=new Ym("RequestSender"),Ua={onRequestTimeout:()=>{},onTransportError:()=>{},onReceiveResponse:()=>{},onAuthenticated:()=>{}};var mr=class{constructor(s,r,o){this._ua=s,this._eventHandlers=o,this._method=r.method,this._request=r,this._auth=null,this._challenged=!1,this._staled=!1;for(const a in Ua)Object.prototype.hasOwnProperty.call(Ua,a)&&(this._eventHandlers[a]||(this._eventHandlers[a]=Ua[a]));s.status===s.C.STATUS_USER_CLOSED&&(this._method!==sf.BYE||this._method!==sf.ACK)&&this._eventHandlers.onTransportError()}send(){const s={onRequestTimeout:()=>{this._eventHandlers.onRequestTimeout()},onTransportError:()=>{this._eventHandlers.onTransportError()},onReceiveResponse:r=>{this._receiveResponse(r)}};switch(this._method){case"INVITE":this.clientTransaction=new Na.InviteClientTransaction(this._ua,this._ua.transport,this._request,s);break;case"ACK":this.clientTransaction=new Na.AckClientTransaction(this._ua,this._ua.transport,this._request,s);break;default:this.clientTransaction=new Na.NonInviteClientTransaction(this._ua,this._ua.transport,this._request,s)}this._ua._configuration.authorization_jwt&&this._request.setHeader("Authorization",this._ua._configuration.authorization_jwt),this.clientTransaction.send()}_receiveResponse(s){let r,o;const a=s.status_code;if((a===401||a===407)&&(this._ua.configuration.password!==null||this._ua.configuration.ha1!==null)){if(s.status_code===401?(r=s.parseHeader("www-authenticate"),o="authorization"):(r=s.parseHeader("proxy-authenticate"),o="proxy-authorization"),!r){Jm.debug(`${s.status_code} with wrong or missing challenge, cannot authenticate`),this._eventHandlers.onReceiveResponse(s);return}if(!this._challenged||!this._staled&&r.stale===!0){if(this._auth||(this._auth=new zm({username:this._ua.configuration.authorization_user,password:this._ua.configuration.password,realm:this._ua.configuration.realm,ha1:this._ua.configuration.ha1})),!this._auth.authenticate(this._request,r)){this._eventHandlers.onReceiveResponse(s);return}this._challenged=!0,this._ua.set("realm",this._auth.get("realm")),this._ua.set("ha1",this._auth.get("ha1")),r.stale&&(this._staled=!0),this._request=this._request.clone(),this._request.cseq+=1,this._request.setHeader("cseq",`${this._request.cseq} ${this._method}`),this._request.setHeader(o,this._auth.toString()),this._eventHandlers.onAuthenticated(this._request),this.send()}else this._eventHandlers.onReceiveResponse(s)}else this._eventHandlers.onReceiveResponse(s)}};const u_=Xe(mr),Xm=ut,Pa=yt(),pn=De,nf=Pt,rf=mr,ki=new Xm("Registrator"),Yl=10;var Qm=class{constructor(s,r){this._reg_id=1,this._ua=s,this._transport=r,this._registrar=s.configuration.registrar_server,this._expires=s.configuration.register_expires,this._call_id=Pa.createRandomToken(22),this._cseq=0,this._to_uri=s.configuration.uri,this._registrationTimer=null,this._registering=!1,this._registered=!1,this._contact=this._ua.contact.toString(),this._contact+=";+sip.ice",this._extraHeaders=[],this._extraContactParams="",this._sipInstance=`"<urn:uuid:${this._ua.configuration.instance_id}>"`,this._contact+=`;reg-id=${this._reg_id}`,this._contact+=`;+sip.instance=${this._sipInstance}`}get registered(){return this._registered}setExtraHeaders(s){Array.isArray(s)||(s=[]),this._extraHeaders=s.slice()}setExtraContactParams(s){s instanceof Object||(s={}),this._extraContactParams="";for(const r in s)if(Object.prototype.hasOwnProperty.call(s,r)){const o=s[r];this._extraContactParams+=`;${r}`,o&&(this._extraContactParams+=`=${o}`)}}register(){if(this._registering){ki.debug("Register request in progress...");return}const s=this._extraHeaders.slice();s.push(`Contact: ${this._contact};expires=${this._expires}${this._extraContactParams}`),s.push(`Expires: ${this._expires}`);const r=new nf.OutgoingRequest(pn.REGISTER,this._registrar,this._ua,{to_uri:this._to_uri,call_id:this._call_id,cseq:this._cseq+=1},s),o=new rf(this._ua,r,{onRequestTimeout:()=>{this._registrationFailure(null,pn.causes.REQUEST_TIMEOUT)},onTransportError:()=>{this._registrationFailure(null,pn.causes.CONNECTION_ERROR)},onAuthenticated:()=>{this._cseq+=1},onReceiveResponse:a=>{if(a.cseq===this._cseq)switch(this._registrationTimer!==null&&(clearTimeout(this._registrationTimer),this._registrationTimer=null),!0){case/^1[0-9]{2}$/.test(a.status_code):break;case/^2[0-9]{2}$/.test(a.status_code):{if(this._registering=!1,!a.hasHeader("Contact")){ki.debug("no Contact header in response to REGISTER, response ignored");break}const t=a.headers.Contact.reduce((d,g)=>d.concat(g.parsed),[]);let n=t.find(d=>this._sipInstance===d.getParam("+sip.instance")&&this._reg_id===parseInt(d.getParam("reg-id")));if(n||(n=t.find(d=>d.uri.user===this._ua.contact.uri.user)),!n){ki.debug("no Contact header pointing to us, response ignored");break}let p=n.getParam("expires");!p&&a.hasHeader("expires")&&(p=a.getHeader("expires")),p||(p=this._expires),p=Number(p),p<Yl&&(p=Yl);const _=p>64?p*1e3/2+Math.floor((p/2-32)*1e3*Math.random()):p*1e3-5e3;this._registrationTimer=setTimeout(()=>{this._registrationTimer=null,this._ua.listeners("registrationExpiring").length===0?this.register():this._ua.emit("registrationExpiring")},_),n.hasParam("temp-gruu")&&(this._ua.contact.temp_gruu=n.getParam("temp-gruu").replace(/"/g,"")),n.hasParam("pub-gruu")&&(this._ua.contact.pub_gruu=n.getParam("pub-gruu").replace(/"/g,"")),this._registered||(this._registered=!0,this._ua.registered({response:a}));break}case/^423$/.test(a.status_code):{a.hasHeader("min-expires")?(this._expires=Number(a.getHeader("min-expires")),this._expires<Yl&&(this._expires=Yl),this.register()):(ki.debug("423 response received for REGISTER without Min-Expires"),this._registrationFailure(a,pn.causes.SIP_FAILURE_CODE));break}default:{const t=Pa.sipErrorCause(a.status_code);this._registrationFailure(a,t)}}}});this._registering=!0,o.send()}unregister(s={}){if(!this._registered){ki.debug("already unregistered");return}this._registered=!1,this._registrationTimer!==null&&(clearTimeout(this._registrationTimer),this._registrationTimer=null);const r=this._extraHeaders.slice();s.all?r.push(`Contact: *${this._extraContactParams}`):r.push(`Contact: ${this._contact};expires=0${this._extraContactParams}`),r.push("Expires: 0");const o=new nf.OutgoingRequest(pn.REGISTER,this._registrar,this._ua,{to_uri:this._to_uri,call_id:this._call_id,cseq:this._cseq+=1},r);new rf(this._ua,o,{onRequestTimeout:()=>{this._unregistered(null,pn.causes.REQUEST_TIMEOUT)},onTransportError:()=>{this._unregistered(null,pn.causes.CONNECTION_ERROR)},onAuthenticated:()=>{this._cseq+=1},onReceiveResponse:t=>{switch(!0){case/^1[0-9]{2}$/.test(t.status_code):break;case/^2[0-9]{2}$/.test(t.status_code):this._unregistered(t);break;default:{const n=Pa.sipErrorCause(t.status_code);this._unregistered(t,n)}}}}).send()}close(){this._registered&&this.unregister()}onTransportClosed(){this._registering=!1,this._registrationTimer!==null&&(clearTimeout(this._registrationTimer),this._registrationTimer=null),this._registered&&(this._registered=!1,this._ua.unregistered({}))}_registrationFailure(s,r){this._registering=!1,this._ua.registrationFailed({response:s||null,cause:r}),this._registered&&(this._registered=!1,this._ua.unregistered({response:s||null,cause:r}))}_unregistered(s,r){this._registering=!1,this._registered=!1,this._ua.unregistered({response:s||null,cause:r||null})}};class Zm extends Error{constructor(s,r){super(),this.code=1,this.name="CONFIGURATION_ERROR",this.parameter=s,this.value=r,this.message=this.value?`Invalid value ${JSON.stringify(this.value)} for parameter "${this.parameter}"`:`Missing parameter: ${this.parameter}`}}class eg extends Error{constructor(s){super(),this.code=2,this.name="INVALID_STATE_ERROR",this.status=s,this.message=`Invalid status: ${s}`}}class tg extends Error{constructor(s){super(),this.code=3,this.name="NOT_SUPPORTED_ERROR",this.message=s}}class sg extends Error{constructor(s){super(),this.code=4,this.name="NOT_READY_ERROR",this.message=s}}var Es={ConfigurationError:Zm,InvalidStateError:eg,NotSupportedError:tg,NotReadyError:sg};const Hs=Xe(Es),xa=De,zl=pr,ng=mr,Ma={onRequestTimeout:()=>{},onTransportError:()=>{},onSuccessResponse:()=>{},onErrorResponse:()=>{},onAuthenticated:()=>{},onDialogError:()=>{}};var c_=class{constructor(s,r,o){this._dialog=s,this._ua=s._ua,this._request=r,this._eventHandlers=o,this._reattempt=!1,this._reattemptTimer=null;for(const a in Ma)Object.prototype.hasOwnProperty.call(Ma,a)&&(this._eventHandlers[a]||(this._eventHandlers[a]=Ma[a]))}get request(){return this._request}send(){const s=new ng(this._ua,this._request,{onRequestTimeout:()=>{this._eventHandlers.onRequestTimeout()},onTransportError:()=>{this._eventHandlers.onTransportError()},onAuthenticated:r=>{this._eventHandlers.onAuthenticated(r)},onReceiveResponse:r=>{this._receiveResponse(r)}});if(s.send(),(this._request.method===xa.INVITE||this._request.method===xa.UPDATE&&this._request.body)&&s.clientTransaction.state!==zl.C.STATUS_TERMINATED){this._dialog.uac_pending_reply=!0;const r=()=>{(s.clientTransaction.state===zl.C.STATUS_ACCEPTED||s.clientTransaction.state===zl.C.STATUS_COMPLETED||s.clientTransaction.state===zl.C.STATUS_TERMINATED)&&(s.clientTransaction.removeListener("stateChanged",r),this._dialog.uac_pending_reply=!1)};s.clientTransaction.on("stateChanged",r)}}_receiveResponse(s){s.status_code===408||s.status_code===481?this._eventHandlers.onDialogError(s):s.method===xa.INVITE&&s.status_code===491?this._reattempt?s.status_code>=200&&s.status_code<300?this._eventHandlers.onSuccessResponse(s):s.status_code>=300&&this._eventHandlers.onErrorResponse(s):(this._request.cseq=this._dialog.local_seqnum+=1,this._reattemptTimer=setTimeout(()=>{this._dialog.isTerminated()||(this._reattempt=!0,this.send())},1e3)):s.status_code>=200&&s.status_code<300?this._eventHandlers.onSuccessResponse(s):s.status_code>=300&&this._eventHandlers.onErrorResponse(s)}};const rg=Xe(c_),ig=ut,lf=Pt,Ms=De,Li=pr,lg=c_,ka=yt(),La=new ig("Dialog"),ks={STATUS_EARLY:1,STATUS_CONFIRMED:2,STATUS_TERMINATED:3};var f_=class{static get C(){return ks}constructor(s,r,o,a=ks.STATUS_CONFIRMED){if(this._owner=s,this._ua=s._ua,this._uac_pending_reply=!1,this._uas_pending_reply=!1,!r.hasHeader("contact"))return{error:"unable to create a Dialog without Contact header field"};r instanceof lf.IncomingResponse&&(a=r.status_code<200?ks.STATUS_EARLY:ks.STATUS_CONFIRMED);const t=r.parseHeader("contact");o==="UAS"?(this._id={call_id:r.call_id,local_tag:r.to_tag,remote_tag:r.from_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._remote_seqnum=r.cseq,this._local_uri=r.parseHeader("to").uri,this._remote_uri=r.parseHeader("from").uri,this._remote_target=t.uri,this._route_set=r.getHeaders("record-route"),this._ack_seqnum=this._remote_seqnum):o==="UAC"&&(this._id={call_id:r.call_id,local_tag:r.from_tag,remote_tag:r.to_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._local_seqnum=r.cseq,this._local_uri=r.parseHeader("from").uri,this._remote_uri=r.parseHeader("to").uri,this._remote_target=t.uri,this._route_set=r.getHeaders("record-route").reverse(),this._ack_seqnum=null),this._ua.newDialog(this),La.debug(`new ${o} dialog created with status ${this._state===ks.STATUS_EARLY?"EARLY":"CONFIRMED"}`)}get id(){return this._id}get local_seqnum(){return this._local_seqnum}set local_seqnum(s){this._local_seqnum=s}get owner(){return this._owner}get uac_pending_reply(){return this._uac_pending_reply}set uac_pending_reply(s){this._uac_pending_reply=s}get uas_pending_reply(){return this._uas_pending_reply}isTerminated(){return this._status===ks.STATUS_TERMINATED}update(s,r){this._state=ks.STATUS_CONFIRMED,La.debug(`dialog ${this._id.toString()} changed to CONFIRMED state`),r==="UAC"&&(this._route_set=s.getHeaders("record-route").reverse())}terminate(){La.debug(`dialog ${this._id.toString()} deleted`),this._ua.destroyDialog(this),this._state=ks.STATUS_TERMINATED}sendRequest(s,r={}){const o=ka.cloneArray(r.extraHeaders),a=ka.cloneObject(r.eventHandlers),t=r.body||null,n=this._createRequest(s,o,t);return a.onAuthenticated=()=>{this._local_seqnum+=1},new lg(this,n,a).send(),n}receiveRequest(s){this._checkInDialogRequest(s)&&(s.method===Ms.ACK&&this._ack_seqnum!==null?this._ack_seqnum=null:s.method===Ms.INVITE&&(this._ack_seqnum=s.cseq),this._owner.receiveRequest(s))}_createRequest(s,r,o){r=ka.cloneArray(r),this._local_seqnum||(this._local_seqnum=Math.floor(Math.random()*1e4));const a=s===Ms.CANCEL||s===Ms.ACK?this._local_seqnum:this._local_seqnum+=1;return new lf.OutgoingRequest(s,this._remote_target,this._ua,{cseq:a,call_id:this._id.call_id,from_uri:this._local_uri,from_tag:this._id.local_tag,to_uri:this._remote_uri,to_tag:this._id.remote_tag,route_set:this._route_set},r,o)}_checkInDialogRequest(s){if(!this._remote_seqnum)this._remote_seqnum=s.cseq;else if(s.cseq<this._remote_seqnum)if(s.method===Ms.ACK){if(this._ack_seqnum===null||s.cseq!==this._ack_seqnum)return!1}else return s.reply(500),!1;else s.cseq>this._remote_seqnum&&(this._remote_seqnum=s.cseq);if(s.method===Ms.INVITE||s.method===Ms.UPDATE&&s.body){if(this._uac_pending_reply===!0)s.reply(491);else if(this._uas_pending_reply===!0){const r=(Math.random()*10|0)+1;return s.reply(500,null,[`Retry-After:${r}`]),!1}else{this._uas_pending_reply=!0;const r=()=>{(s.server_transaction.state===Li.C.STATUS_ACCEPTED||s.server_transaction.state===Li.C.STATUS_COMPLETED||s.server_transaction.state===Li.C.STATUS_TERMINATED)&&(s.server_transaction.removeListener("stateChanged",r),this._uas_pending_reply=!1)};s.server_transaction.on("stateChanged",r)}s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Li.C.STATUS_ACCEPTED&&(this._remote_target=s.parseHeader("contact").uri)})}else s.method===Ms.NOTIFY&&s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Li.C.STATUS_COMPLETED&&(this._remote_target=s.parseHeader("contact").uri)});return!0}};const Jl=Xe(f_);var Pu={exports:{}};const og=ft.EventEmitter,ag=ut,ug=De,cg=Es,of=yt(),fg=new ag("RTCSession:DTMF"),__={MIN_DURATION:70,MAX_DURATION:6e3,DEFAULT_DURATION:100,MIN_INTER_TONE_GAP:50,DEFAULT_INTER_TONE_GAP:500};Pu.exports=class extends og{constructor(s){super(),this._session=s,this._direction=null,this._tone=null,this._duration=null,this._request=null}get tone(){return this._tone}get duration(){return this._duration}send(s,r={}){if(s===void 0)throw new TypeError("Not enough arguments");if(this._direction="outgoing",this._session.status!==this._session.C.STATUS_CONFIRMED&&this._session.status!==this._session.C.STATUS_WAITING_FOR_ACK)throw new cg.InvalidStateError(this._session.status);const o=of.cloneArray(r.extraHeaders);if(this.eventHandlers=of.cloneObject(r.eventHandlers),typeof s=="string")s=s.toUpperCase();else if(typeof s=="number")s=s.toString();else throw new TypeError(`Invalid tone: ${s}`);if(s.match(/^[0-9A-DR#*]$/))this._tone=s;else throw new TypeError(`Invalid tone: ${s}`);this._duration=r.duration,o.push("Content-Type: application/dtmf-relay");let a=`Signal=${this._tone}\r
|
112
|
+
`,this.transport.send(a)}}class Lm extends o_{constructor(){super(),this.headers={},this.status_code=null,this.reason_phrase=null}}var Pt={OutgoingRequest:Fo,InitialOutgoingInviteRequest:Nu,IncomingRequest:km,IncomingResponse:Lm};const Gl=Xe(Pt),$m=at,hs=yt(),Yt=new $m("DigestAuthentication");var a_=class{constructor(s){this._credentials=s,this._cnonce=null,this._nc=0,this._ncHex="00000000",this._algorithm=null,this._realm=null,this._nonce=null,this._opaque=null,this._stale=null,this._qop=null,this._method=null,this._uri=null,this._ha1=null,this._response=null}get(s){switch(s){case"realm":return this._realm;case"ha1":return this._ha1;default:Yt.warn('get() | cannot get "%s" parameter',s);return}}authenticate({method:s,ruri:r,body:o},a,t=null){if(this._algorithm=a.algorithm,this._realm=a.realm,this._nonce=a.nonce,this._opaque=a.opaque,this._stale=a.stale,this._algorithm){if(this._algorithm!=="MD5")return Yt.warn('authenticate() | challenge with Digest algorithm different than "MD5", authentication aborted'),!1}else this._algorithm="MD5";if(!this._nonce)return Yt.warn("authenticate() | challenge without Digest nonce, authentication aborted"),!1;if(!this._realm)return Yt.warn("authenticate() | challenge without Digest realm, authentication aborted"),!1;if(!this._credentials.password){if(!this._credentials.ha1)return Yt.warn("authenticate() | no plain SIP password nor ha1 provided, authentication aborted"),!1;if(this._credentials.realm!==this._realm)return Yt.warn('authenticate() | no plain SIP password, and stored `realm` does not match the given `realm`, cannot authenticate [stored:"%s", given:"%s"]',this._credentials.realm,this._realm),!1}if(a.qop)if(a.qop.indexOf("auth-int")>-1)this._qop="auth-int";else if(a.qop.indexOf("auth")>-1)this._qop="auth";else return Yt.warn('authenticate() | challenge without Digest qop different than "auth" or "auth-int", authentication aborted'),!1;else this._qop=null;this._method=s,this._uri=r,this._cnonce=t||hs.createRandomToken(12),this._nc+=1;const n=Number(this._nc).toString(16);this._ncHex="00000000".substr(0,8-n.length)+n,this._nc===4294967296&&(this._nc=1,this._ncHex="00000001"),this._credentials.password?this._ha1=hs.calculateMD5(`${this._credentials.username}:${this._realm}:${this._credentials.password}`):this._ha1=this._credentials.ha1;let p,_;return this._qop==="auth"?(p=`${this._method}:${this._uri}`,_=hs.calculateMD5(p),Yt.debug('authenticate() | using qop=auth [a2:"%s"]',p),this._response=hs.calculateMD5(`${this._ha1}:${this._nonce}:${this._ncHex}:${this._cnonce}:auth:${_}`)):this._qop==="auth-int"?(p=`${this._method}:${this._uri}:${hs.calculateMD5(o||"")}`,_=hs.calculateMD5(p),Yt.debug('authenticate() | using qop=auth-int [a2:"%s"]',p),this._response=hs.calculateMD5(`${this._ha1}:${this._nonce}:${this._ncHex}:${this._cnonce}:auth-int:${_}`)):this._qop===null&&(p=`${this._method}:${this._uri}`,_=hs.calculateMD5(p),Yt.debug('authenticate() | using qop=null [a2:"%s"]',p),this._response=hs.calculateMD5(`${this._ha1}:${this._nonce}:${_}`)),Yt.debug("authenticate() | response generated"),!0}toString(){const s=[];if(!this._response)throw new Error("response field does not exist, cannot generate Authorization header");return s.push(`algorithm=${this._algorithm}`),s.push(`username="${this._credentials.username}"`),s.push(`realm="${this._realm}"`),s.push(`nonce="${this._nonce}"`),s.push(`uri="${this._uri}"`),s.push(`response="${this._response}"`),this._opaque&&s.push(`opaque="${this._opaque}"`),this._qop&&(s.push(`qop=${this._qop}`),s.push(`cnonce="${this._cnonce}"`),s.push(`nc=${this._ncHex}`)),`Digest ${s.join(", ")}`}};const Hm=Xe(a_),ds=500,Fm=4e3,Qc=5e3;var Uu={T1:ds,T2:Fm,T4:Qc,TIMER_B:64*ds,TIMER_D:0*ds,TIMER_F:64*ds,TIMER_H:64*ds,TIMER_I:0*ds,TIMER_J:0*ds,TIMER_K:0*Qc,TIMER_L:64*ds,TIMER_M:64*ds,PROVISIONAL_RESPONSE_INTERVAL:6e4};const Mi=Xe(Uu),ul=ft.EventEmitter,cl=at,Ki=De,Zc=Pt,rs=Uu,ef=new cl("NonInviteClientTransaction"),Wl=new cl("InviteClientTransaction"),jm=new cl("AckClientTransaction"),tf=new cl("NonInviteServerTransaction"),Kl=new cl("InviteServerTransaction"),he={STATUS_TRYING:1,STATUS_PROCEEDING:2,STATUS_CALLING:3,STATUS_ACCEPTED:4,STATUS_COMPLETED:5,STATUS_TERMINATED:6,STATUS_CONFIRMED:7,NON_INVITE_CLIENT:"nict",NON_INVITE_SERVER:"nist",INVITE_CLIENT:"ict",INVITE_SERVER:"ist"};class Vm extends ul{constructor(s,r,o,a){super(),this.type=he.NON_INVITE_CLIENT,this.id=`z9hG4bK${Math.floor(Math.random()*1e7)}`,this.ua=s,this.transport=r,this.request=o,this.eventHandlers=a;let t=`SIP/2.0/${r.via_transport}`;t+=` ${s.configuration.via_host};branch=${this.id}`,this.request.setHeader("via",t),this.ua.newTransaction(this)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}send(){this.stateChanged(he.STATUS_TRYING),this.F=setTimeout(()=>{this.timer_F()},rs.TIMER_F),this.transport.send(this.request)||this.onTransportError()}onTransportError(){ef.debug(`transport error occurred, deleting transaction ${this.id}`),clearTimeout(this.F),clearTimeout(this.K),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this),this.eventHandlers.onTransportError()}timer_F(){ef.debug(`Timer F expired for transaction ${this.id}`),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this),this.eventHandlers.onRequestTimeout()}timer_K(){this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}receiveResponse(s){const r=s.status_code;if(r<200)switch(this.state){case he.STATUS_TRYING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_PROCEEDING),this.eventHandlers.onReceiveResponse(s);break}else switch(this.state){case he.STATUS_TRYING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_COMPLETED),clearTimeout(this.F),r===408?this.eventHandlers.onRequestTimeout():this.eventHandlers.onReceiveResponse(s),this.K=setTimeout(()=>{this.timer_K()},rs.TIMER_K);break;case he.STATUS_COMPLETED:break}}}class qm extends ul{constructor(s,r,o,a){super(),this.type=he.INVITE_CLIENT,this.id=`z9hG4bK${Math.floor(Math.random()*1e7)}`,this.ua=s,this.transport=r,this.request=o,this.eventHandlers=a,o.transaction=this;let t=`SIP/2.0/${r.via_transport}`;t+=` ${s.configuration.via_host};branch=${this.id}`,this.request.setHeader("via",t),this.ua.newTransaction(this)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}send(){this.stateChanged(he.STATUS_CALLING),this.B=setTimeout(()=>{this.timer_B()},rs.TIMER_B),this.transport.send(this.request)||this.onTransportError()}onTransportError(){clearTimeout(this.B),clearTimeout(this.D),clearTimeout(this.M),this.state!==he.STATUS_ACCEPTED&&(Wl.debug(`transport error occurred, deleting transaction ${this.id}`),this.eventHandlers.onTransportError()),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}timer_M(){Wl.debug(`Timer M expired for transaction ${this.id}`),this.state===he.STATUS_ACCEPTED&&(clearTimeout(this.B),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}timer_B(){Wl.debug(`Timer B expired for transaction ${this.id}`),this.state===he.STATUS_CALLING&&(this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this),this.eventHandlers.onRequestTimeout())}timer_D(){Wl.debug(`Timer D expired for transaction ${this.id}`),clearTimeout(this.B),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}sendACK(s){const r=new Zc.OutgoingRequest(Ki.ACK,this.request.ruri,this.ua,{route_set:this.request.getHeaders("route"),call_id:this.request.getHeader("call-id"),cseq:this.request.cseq});r.setHeader("from",this.request.getHeader("from")),r.setHeader("via",this.request.getHeader("via")),r.setHeader("to",s.getHeader("to")),this.D=setTimeout(()=>{this.timer_D()},rs.TIMER_D),this.transport.send(r)}cancel(s){if(this.state!==he.STATUS_PROCEEDING)return;const r=new Zc.OutgoingRequest(Ki.CANCEL,this.request.ruri,this.ua,{route_set:this.request.getHeaders("route"),call_id:this.request.getHeader("call-id"),cseq:this.request.cseq});r.setHeader("from",this.request.getHeader("from")),r.setHeader("via",this.request.getHeader("via")),r.setHeader("to",this.request.getHeader("to")),s&&r.setHeader("reason",s),this.transport.send(r)}receiveResponse(s){const r=s.status_code;if(r>=100&&r<=199)switch(this.state){case he.STATUS_CALLING:this.stateChanged(he.STATUS_PROCEEDING),this.eventHandlers.onReceiveResponse(s);break;case he.STATUS_PROCEEDING:this.eventHandlers.onReceiveResponse(s);break}else if(r>=200&&r<=299)switch(this.state){case he.STATUS_CALLING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_ACCEPTED),this.M=setTimeout(()=>{this.timer_M()},rs.TIMER_M),this.eventHandlers.onReceiveResponse(s);break;case he.STATUS_ACCEPTED:this.eventHandlers.onReceiveResponse(s);break}else if(r>=300&&r<=699)switch(this.state){case he.STATUS_CALLING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_COMPLETED),this.sendACK(s),this.eventHandlers.onReceiveResponse(s);break;case he.STATUS_COMPLETED:this.sendACK(s);break}}}class Bm extends ul{constructor(s,r,o,a){super(),this.id=`z9hG4bK${Math.floor(Math.random()*1e7)}`,this.transport=r,this.request=o,this.eventHandlers=a;let t=`SIP/2.0/${r.via_transport}`;t+=` ${s.configuration.via_host};branch=${this.id}`,this.request.setHeader("via",t)}get C(){return he}send(){this.transport.send(this.request)||this.onTransportError()}onTransportError(){jm.debug(`transport error occurred for transaction ${this.id}`),this.eventHandlers.onTransportError()}}class Gm extends ul{constructor(s,r,o){super(),this.type=he.NON_INVITE_SERVER,this.id=o.via_branch,this.ua=s,this.transport=r,this.request=o,this.last_response="",o.server_transaction=this,this.state=he.STATUS_TRYING,s.newTransaction(this)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}timer_J(){tf.debug(`Timer J expired for transaction ${this.id}`),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}onTransportError(){this.transportError||(this.transportError=!0,tf.debug(`transport error occurred, deleting transaction ${this.id}`),clearTimeout(this.J),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}receiveResponse(s,r,o,a){if(s===100)switch(this.state){case he.STATUS_TRYING:this.stateChanged(he.STATUS_PROCEEDING),this.transport.send(r)||this.onTransportError();break;case he.STATUS_PROCEEDING:this.last_response=r,this.transport.send(r)?o&&o():(this.onTransportError(),a&&a());break}else if(s>=200&&s<=699)switch(this.state){case he.STATUS_TRYING:case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_COMPLETED),this.last_response=r,this.J=setTimeout(()=>{this.timer_J()},rs.TIMER_J),this.transport.send(r)?o&&o():(this.onTransportError(),a&&a());break;case he.STATUS_COMPLETED:break}}}class Wm extends ul{constructor(s,r,o){super(),this.type=he.INVITE_SERVER,this.id=o.via_branch,this.ua=s,this.transport=r,this.request=o,this.last_response="",o.server_transaction=this,this.state=he.STATUS_PROCEEDING,s.newTransaction(this),this.resendProvisionalTimer=null,o.reply(100)}get C(){return he}stateChanged(s){this.state=s,this.emit("stateChanged")}timer_H(){Kl.debug(`Timer H expired for transaction ${this.id}`),this.state===he.STATUS_COMPLETED&&Kl.debug("ACK not received, dialog will be terminated"),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}timer_I(){this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this)}timer_L(){Kl.debug(`Timer L expired for transaction ${this.id}`),this.state===he.STATUS_ACCEPTED&&(this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}onTransportError(){this.transportError||(this.transportError=!0,Kl.debug(`transport error occurred, deleting transaction ${this.id}`),this.resendProvisionalTimer!==null&&(clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),clearTimeout(this.L),clearTimeout(this.H),clearTimeout(this.I),this.stateChanged(he.STATUS_TERMINATED),this.ua.destroyTransaction(this))}resend_provisional(){this.transport.send(this.last_response)||this.onTransportError()}receiveResponse(s,r,o,a){if(s>=100&&s<=199)switch(this.state){case he.STATUS_PROCEEDING:this.transport.send(r)||this.onTransportError(),this.last_response=r;break}if(s>100&&s<=199&&this.state===he.STATUS_PROCEEDING)this.resendProvisionalTimer===null&&(this.resendProvisionalTimer=setInterval(()=>{this.resend_provisional()},rs.PROVISIONAL_RESPONSE_INTERVAL));else if(s>=200&&s<=299)switch(this.state){case he.STATUS_PROCEEDING:this.stateChanged(he.STATUS_ACCEPTED),this.last_response=r,this.L=setTimeout(()=>{this.timer_L()},rs.TIMER_L),this.resendProvisionalTimer!==null&&(clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null);case he.STATUS_ACCEPTED:this.transport.send(r)?o&&o():(this.onTransportError(),a&&a());break}else if(s>=300&&s<=699)switch(this.state){case he.STATUS_PROCEEDING:this.resendProvisionalTimer!==null&&(clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),this.transport.send(r)?(this.stateChanged(he.STATUS_COMPLETED),this.H=setTimeout(()=>{this.timer_H()},rs.TIMER_H),o&&o()):(this.onTransportError(),a&&a());break}}}function Km({_transactions:c},s){let r;switch(s.method){case Ki.INVITE:if(r=c.ist[s.via_branch],r){switch(r.state){case he.STATUS_PROCEEDING:r.transport.send(r.last_response);break;case he.STATUS_ACCEPTED:break}return!0}break;case Ki.ACK:if(r=c.ist[s.via_branch],r){if(r.state===he.STATUS_ACCEPTED)return!1;if(r.state===he.STATUS_COMPLETED)return r.state=he.STATUS_CONFIRMED,r.I=setTimeout(()=>{r.timer_I()},rs.TIMER_I),!0}else return!1;break;case Ki.CANCEL:return r=c.ist[s.via_branch],r?(s.reply_sl(200),r.state!==he.STATUS_PROCEEDING):(s.reply_sl(481),!0);default:if(r=c.nist[s.via_branch],r){switch(r.state){case he.STATUS_TRYING:break;case he.STATUS_PROCEEDING:case he.STATUS_COMPLETED:r.transport.send(r.last_response);break}return!0}break}}var pr={C:he,NonInviteClientTransaction:Vm,InviteClientTransaction:qm,AckClientTransaction:Bm,NonInviteServerTransaction:Gm,InviteServerTransaction:Wm,checkTransaction:Km};const Bt=Xe(pr),Ym=at,sf=De,zm=a_,Na=pr,Jm=new Ym("RequestSender"),Ua={onRequestTimeout:()=>{},onTransportError:()=>{},onReceiveResponse:()=>{},onAuthenticated:()=>{}};var mr=class{constructor(s,r,o){this._ua=s,this._eventHandlers=o,this._method=r.method,this._request=r,this._auth=null,this._challenged=!1,this._staled=!1;for(const a in Ua)Object.prototype.hasOwnProperty.call(Ua,a)&&(this._eventHandlers[a]||(this._eventHandlers[a]=Ua[a]));s.status===s.C.STATUS_USER_CLOSED&&(this._method!==sf.BYE||this._method!==sf.ACK)&&this._eventHandlers.onTransportError()}send(){const s={onRequestTimeout:()=>{this._eventHandlers.onRequestTimeout()},onTransportError:()=>{this._eventHandlers.onTransportError()},onReceiveResponse:r=>{this._receiveResponse(r)}};switch(this._method){case"INVITE":this.clientTransaction=new Na.InviteClientTransaction(this._ua,this._ua.transport,this._request,s);break;case"ACK":this.clientTransaction=new Na.AckClientTransaction(this._ua,this._ua.transport,this._request,s);break;default:this.clientTransaction=new Na.NonInviteClientTransaction(this._ua,this._ua.transport,this._request,s)}this._ua._configuration.authorization_jwt&&this._request.setHeader("Authorization",this._ua._configuration.authorization_jwt),this.clientTransaction.send()}_receiveResponse(s){let r,o;const a=s.status_code;if((a===401||a===407)&&(this._ua.configuration.password!==null||this._ua.configuration.ha1!==null)){if(s.status_code===401?(r=s.parseHeader("www-authenticate"),o="authorization"):(r=s.parseHeader("proxy-authenticate"),o="proxy-authorization"),!r){Jm.debug(`${s.status_code} with wrong or missing challenge, cannot authenticate`),this._eventHandlers.onReceiveResponse(s);return}if(!this._challenged||!this._staled&&r.stale===!0){if(this._auth||(this._auth=new zm({username:this._ua.configuration.authorization_user,password:this._ua.configuration.password,realm:this._ua.configuration.realm,ha1:this._ua.configuration.ha1})),!this._auth.authenticate(this._request,r)){this._eventHandlers.onReceiveResponse(s);return}this._challenged=!0,this._ua.set("realm",this._auth.get("realm")),this._ua.set("ha1",this._auth.get("ha1")),r.stale&&(this._staled=!0),this._request=this._request.clone(),this._request.cseq+=1,this._request.setHeader("cseq",`${this._request.cseq} ${this._method}`),this._request.setHeader(o,this._auth.toString()),this._eventHandlers.onAuthenticated(this._request),this.send()}else this._eventHandlers.onReceiveResponse(s)}else this._eventHandlers.onReceiveResponse(s)}};const u_=Xe(mr),Xm=at,Pa=yt(),pn=De,nf=Pt,rf=mr,ki=new Xm("Registrator"),Yl=10;var Qm=class{constructor(s,r){this._reg_id=1,this._ua=s,this._transport=r,this._registrar=s.configuration.registrar_server,this._expires=s.configuration.register_expires,this._call_id=Pa.createRandomToken(22),this._cseq=0,this._to_uri=s.configuration.uri,this._registrationTimer=null,this._registering=!1,this._registered=!1,this._contact=this._ua.contact.toString(),this._contact+=";+sip.ice",this._extraHeaders=[],this._extraContactParams="",this._sipInstance=`"<urn:uuid:${this._ua.configuration.instance_id}>"`,this._contact+=`;reg-id=${this._reg_id}`,this._contact+=`;+sip.instance=${this._sipInstance}`}get registered(){return this._registered}setExtraHeaders(s){Array.isArray(s)||(s=[]),this._extraHeaders=s.slice()}setExtraContactParams(s){s instanceof Object||(s={}),this._extraContactParams="";for(const r in s)if(Object.prototype.hasOwnProperty.call(s,r)){const o=s[r];this._extraContactParams+=`;${r}`,o&&(this._extraContactParams+=`=${o}`)}}register(){if(this._registering){ki.debug("Register request in progress...");return}const s=this._extraHeaders.slice();s.push(`Contact: ${this._contact};expires=${this._expires}${this._extraContactParams}`),s.push(`Expires: ${this._expires}`);const r=new nf.OutgoingRequest(pn.REGISTER,this._registrar,this._ua,{to_uri:this._to_uri,call_id:this._call_id,cseq:this._cseq+=1},s),o=new rf(this._ua,r,{onRequestTimeout:()=>{this._registrationFailure(null,pn.causes.REQUEST_TIMEOUT)},onTransportError:()=>{this._registrationFailure(null,pn.causes.CONNECTION_ERROR)},onAuthenticated:()=>{this._cseq+=1},onReceiveResponse:a=>{if(a.cseq===this._cseq)switch(this._registrationTimer!==null&&(clearTimeout(this._registrationTimer),this._registrationTimer=null),!0){case/^1[0-9]{2}$/.test(a.status_code):break;case/^2[0-9]{2}$/.test(a.status_code):{if(this._registering=!1,!a.hasHeader("Contact")){ki.debug("no Contact header in response to REGISTER, response ignored");break}const t=a.headers.Contact.reduce((d,g)=>d.concat(g.parsed),[]);let n=t.find(d=>this._sipInstance===d.getParam("+sip.instance")&&this._reg_id===parseInt(d.getParam("reg-id")));if(n||(n=t.find(d=>d.uri.user===this._ua.contact.uri.user)),!n){ki.debug("no Contact header pointing to us, response ignored");break}let p=n.getParam("expires");!p&&a.hasHeader("expires")&&(p=a.getHeader("expires")),p||(p=this._expires),p=Number(p),p<Yl&&(p=Yl);const _=p>64?p*1e3/2+Math.floor((p/2-32)*1e3*Math.random()):p*1e3-5e3;this._registrationTimer=setTimeout(()=>{this._registrationTimer=null,this._ua.listeners("registrationExpiring").length===0?this.register():this._ua.emit("registrationExpiring")},_),n.hasParam("temp-gruu")&&(this._ua.contact.temp_gruu=n.getParam("temp-gruu").replace(/"/g,"")),n.hasParam("pub-gruu")&&(this._ua.contact.pub_gruu=n.getParam("pub-gruu").replace(/"/g,"")),this._registered||(this._registered=!0,this._ua.registered({response:a}));break}case/^423$/.test(a.status_code):{a.hasHeader("min-expires")?(this._expires=Number(a.getHeader("min-expires")),this._expires<Yl&&(this._expires=Yl),this.register()):(ki.debug("423 response received for REGISTER without Min-Expires"),this._registrationFailure(a,pn.causes.SIP_FAILURE_CODE));break}default:{const t=Pa.sipErrorCause(a.status_code);this._registrationFailure(a,t)}}}});this._registering=!0,o.send()}unregister(s={}){if(!this._registered){ki.debug("already unregistered");return}this._registered=!1,this._registrationTimer!==null&&(clearTimeout(this._registrationTimer),this._registrationTimer=null);const r=this._extraHeaders.slice();s.all?r.push(`Contact: *${this._extraContactParams}`):r.push(`Contact: ${this._contact};expires=0${this._extraContactParams}`),r.push("Expires: 0");const o=new nf.OutgoingRequest(pn.REGISTER,this._registrar,this._ua,{to_uri:this._to_uri,call_id:this._call_id,cseq:this._cseq+=1},r);new rf(this._ua,o,{onRequestTimeout:()=>{this._unregistered(null,pn.causes.REQUEST_TIMEOUT)},onTransportError:()=>{this._unregistered(null,pn.causes.CONNECTION_ERROR)},onAuthenticated:()=>{this._cseq+=1},onReceiveResponse:t=>{switch(!0){case/^1[0-9]{2}$/.test(t.status_code):break;case/^2[0-9]{2}$/.test(t.status_code):this._unregistered(t);break;default:{const n=Pa.sipErrorCause(t.status_code);this._unregistered(t,n)}}}}).send()}close(){this._registered&&this.unregister()}onTransportClosed(){this._registering=!1,this._registrationTimer!==null&&(clearTimeout(this._registrationTimer),this._registrationTimer=null),this._registered&&(this._registered=!1,this._ua.unregistered({}))}_registrationFailure(s,r){this._registering=!1,this._ua.registrationFailed({response:s||null,cause:r}),this._registered&&(this._registered=!1,this._ua.unregistered({response:s||null,cause:r}))}_unregistered(s,r){this._registering=!1,this._registered=!1,this._ua.unregistered({response:s||null,cause:r||null})}};class Zm extends Error{constructor(s,r){super(),this.code=1,this.name="CONFIGURATION_ERROR",this.parameter=s,this.value=r,this.message=this.value?`Invalid value ${JSON.stringify(this.value)} for parameter "${this.parameter}"`:`Missing parameter: ${this.parameter}`}}class eg extends Error{constructor(s){super(),this.code=2,this.name="INVALID_STATE_ERROR",this.status=s,this.message=`Invalid status: ${s}`}}class tg extends Error{constructor(s){super(),this.code=3,this.name="NOT_SUPPORTED_ERROR",this.message=s}}class sg extends Error{constructor(s){super(),this.code=4,this.name="NOT_READY_ERROR",this.message=s}}var Es={ConfigurationError:Zm,InvalidStateError:eg,NotSupportedError:tg,NotReadyError:sg};const Hs=Xe(Es),xa=De,zl=pr,ng=mr,Ma={onRequestTimeout:()=>{},onTransportError:()=>{},onSuccessResponse:()=>{},onErrorResponse:()=>{},onAuthenticated:()=>{},onDialogError:()=>{}};var c_=class{constructor(s,r,o){this._dialog=s,this._ua=s._ua,this._request=r,this._eventHandlers=o,this._reattempt=!1,this._reattemptTimer=null;for(const a in Ma)Object.prototype.hasOwnProperty.call(Ma,a)&&(this._eventHandlers[a]||(this._eventHandlers[a]=Ma[a]))}get request(){return this._request}send(){const s=new ng(this._ua,this._request,{onRequestTimeout:()=>{this._eventHandlers.onRequestTimeout()},onTransportError:()=>{this._eventHandlers.onTransportError()},onAuthenticated:r=>{this._eventHandlers.onAuthenticated(r)},onReceiveResponse:r=>{this._receiveResponse(r)}});if(s.send(),(this._request.method===xa.INVITE||this._request.method===xa.UPDATE&&this._request.body)&&s.clientTransaction.state!==zl.C.STATUS_TERMINATED){this._dialog.uac_pending_reply=!0;const r=()=>{(s.clientTransaction.state===zl.C.STATUS_ACCEPTED||s.clientTransaction.state===zl.C.STATUS_COMPLETED||s.clientTransaction.state===zl.C.STATUS_TERMINATED)&&(s.clientTransaction.removeListener("stateChanged",r),this._dialog.uac_pending_reply=!1)};s.clientTransaction.on("stateChanged",r)}}_receiveResponse(s){s.status_code===408||s.status_code===481?this._eventHandlers.onDialogError(s):s.method===xa.INVITE&&s.status_code===491?this._reattempt?s.status_code>=200&&s.status_code<300?this._eventHandlers.onSuccessResponse(s):s.status_code>=300&&this._eventHandlers.onErrorResponse(s):(this._request.cseq=this._dialog.local_seqnum+=1,this._reattemptTimer=setTimeout(()=>{this._dialog.isTerminated()||(this._reattempt=!0,this.send())},1e3)):s.status_code>=200&&s.status_code<300?this._eventHandlers.onSuccessResponse(s):s.status_code>=300&&this._eventHandlers.onErrorResponse(s)}};const rg=Xe(c_),ig=at,lf=Pt,Ms=De,Li=pr,lg=c_,ka=yt(),La=new ig("Dialog"),ks={STATUS_EARLY:1,STATUS_CONFIRMED:2,STATUS_TERMINATED:3};var f_=class{static get C(){return ks}constructor(s,r,o,a=ks.STATUS_CONFIRMED){if(this._owner=s,this._ua=s._ua,this._uac_pending_reply=!1,this._uas_pending_reply=!1,!r.hasHeader("contact"))return{error:"unable to create a Dialog without Contact header field"};r instanceof lf.IncomingResponse&&(a=r.status_code<200?ks.STATUS_EARLY:ks.STATUS_CONFIRMED);const t=r.parseHeader("contact");o==="UAS"?(this._id={call_id:r.call_id,local_tag:r.to_tag,remote_tag:r.from_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._remote_seqnum=r.cseq,this._local_uri=r.parseHeader("to").uri,this._remote_uri=r.parseHeader("from").uri,this._remote_target=t.uri,this._route_set=r.getHeaders("record-route"),this._ack_seqnum=this._remote_seqnum):o==="UAC"&&(this._id={call_id:r.call_id,local_tag:r.from_tag,remote_tag:r.to_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._local_seqnum=r.cseq,this._local_uri=r.parseHeader("from").uri,this._remote_uri=r.parseHeader("to").uri,this._remote_target=t.uri,this._route_set=r.getHeaders("record-route").reverse(),this._ack_seqnum=null),this._ua.newDialog(this),La.debug(`new ${o} dialog created with status ${this._state===ks.STATUS_EARLY?"EARLY":"CONFIRMED"}`)}get id(){return this._id}get local_seqnum(){return this._local_seqnum}set local_seqnum(s){this._local_seqnum=s}get owner(){return this._owner}get uac_pending_reply(){return this._uac_pending_reply}set uac_pending_reply(s){this._uac_pending_reply=s}get uas_pending_reply(){return this._uas_pending_reply}isTerminated(){return this._status===ks.STATUS_TERMINATED}update(s,r){this._state=ks.STATUS_CONFIRMED,La.debug(`dialog ${this._id.toString()} changed to CONFIRMED state`),r==="UAC"&&(this._route_set=s.getHeaders("record-route").reverse())}terminate(){La.debug(`dialog ${this._id.toString()} deleted`),this._ua.destroyDialog(this),this._state=ks.STATUS_TERMINATED}sendRequest(s,r={}){const o=ka.cloneArray(r.extraHeaders),a=ka.cloneObject(r.eventHandlers),t=r.body||null,n=this._createRequest(s,o,t);return a.onAuthenticated=()=>{this._local_seqnum+=1},new lg(this,n,a).send(),n}receiveRequest(s){this._checkInDialogRequest(s)&&(s.method===Ms.ACK&&this._ack_seqnum!==null?this._ack_seqnum=null:s.method===Ms.INVITE&&(this._ack_seqnum=s.cseq),this._owner.receiveRequest(s))}_createRequest(s,r,o){r=ka.cloneArray(r),this._local_seqnum||(this._local_seqnum=Math.floor(Math.random()*1e4));const a=s===Ms.CANCEL||s===Ms.ACK?this._local_seqnum:this._local_seqnum+=1;return new lf.OutgoingRequest(s,this._remote_target,this._ua,{cseq:a,call_id:this._id.call_id,from_uri:this._local_uri,from_tag:this._id.local_tag,to_uri:this._remote_uri,to_tag:this._id.remote_tag,route_set:this._route_set},r,o)}_checkInDialogRequest(s){if(!this._remote_seqnum)this._remote_seqnum=s.cseq;else if(s.cseq<this._remote_seqnum)if(s.method===Ms.ACK){if(this._ack_seqnum===null||s.cseq!==this._ack_seqnum)return!1}else return s.reply(500),!1;else s.cseq>this._remote_seqnum&&(this._remote_seqnum=s.cseq);if(s.method===Ms.INVITE||s.method===Ms.UPDATE&&s.body){if(this._uac_pending_reply===!0)s.reply(491);else if(this._uas_pending_reply===!0){const r=(Math.random()*10|0)+1;return s.reply(500,null,[`Retry-After:${r}`]),!1}else{this._uas_pending_reply=!0;const r=()=>{(s.server_transaction.state===Li.C.STATUS_ACCEPTED||s.server_transaction.state===Li.C.STATUS_COMPLETED||s.server_transaction.state===Li.C.STATUS_TERMINATED)&&(s.server_transaction.removeListener("stateChanged",r),this._uas_pending_reply=!1)};s.server_transaction.on("stateChanged",r)}s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Li.C.STATUS_ACCEPTED&&(this._remote_target=s.parseHeader("contact").uri)})}else s.method===Ms.NOTIFY&&s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Li.C.STATUS_COMPLETED&&(this._remote_target=s.parseHeader("contact").uri)});return!0}};const Jl=Xe(f_);var Pu={exports:{}};const og=ft.EventEmitter,ag=at,ug=De,cg=Es,of=yt(),fg=new ag("RTCSession:DTMF"),__={MIN_DURATION:70,MAX_DURATION:6e3,DEFAULT_DURATION:100,MIN_INTER_TONE_GAP:50,DEFAULT_INTER_TONE_GAP:500};Pu.exports=class extends og{constructor(s){super(),this._session=s,this._direction=null,this._tone=null,this._duration=null,this._request=null}get tone(){return this._tone}get duration(){return this._duration}send(s,r={}){if(s===void 0)throw new TypeError("Not enough arguments");if(this._direction="outgoing",this._session.status!==this._session.C.STATUS_CONFIRMED&&this._session.status!==this._session.C.STATUS_WAITING_FOR_ACK)throw new cg.InvalidStateError(this._session.status);const o=of.cloneArray(r.extraHeaders);if(this.eventHandlers=of.cloneObject(r.eventHandlers),typeof s=="string")s=s.toUpperCase();else if(typeof s=="number")s=s.toString();else throw new TypeError(`Invalid tone: ${s}`);if(s.match(/^[0-9A-DR#*]$/))this._tone=s;else throw new TypeError(`Invalid tone: ${s}`);this._duration=r.duration,o.push("Content-Type: application/dtmf-relay");let a=`Signal=${this._tone}\r
|
113
113
|
`;a+=`Duration=${this._duration}`,this._session.newDTMF({originator:"local",dtmf:this,request:this._request}),this._session.sendRequest(ug.INFO,{extraHeaders:o,eventHandlers:{onSuccessResponse:t=>{this.emit("succeeded",{originator:"remote",response:t})},onErrorResponse:t=>{this.eventHandlers.onFailed&&this.eventHandlers.onFailed(),this.emit("failed",{originator:"remote",response:t})},onRequestTimeout:()=>{this._session.onRequestTimeout()},onTransportError:()=>{this._session.onTransportError()},onDialogError:()=>{this._session.onDialogError()}},body:a})}init_incoming(s){const r=/^(Signal\s*?=\s*?)([0-9A-D#*]{1})(\s)?.*/,o=/^(Duration\s?=\s?)([0-9]{1,4})(\s)?.*/;if(this._direction="incoming",this._request=s,s.reply(200),s.body){const a=s.body.split(`
|
114
|
-
`);a.length>=1&&r.test(a[0])&&(this._tone=a[0].replace(r,"$2")),a.length>=2&&o.test(a[1])&&(this._duration=parseInt(a[1].replace(o,"$2"),10))}this._duration||(this._duration=__.DEFAULT_DURATION),this._tone?this._session.newDTMF({originator:"remote",dtmf:this,request:s}):fg.debug("invalid INFO DTMF received, discarded")}};Pu.exports.C=__;var h_=Pu.exports;const _g=Xe(h_),hg=ft.EventEmitter,dg=De,pg=Es,mg=yt();var d_=class extends hg{constructor(s){super(),this._session=s,this._direction=null,this._contentType=null,this._body=null}get contentType(){return this._contentType}get body(){return this._body}send(s,r,o={}){if(this._direction="outgoing",s===void 0)throw new TypeError("Not enough arguments");if(this._session.status!==this._session.C.STATUS_CONFIRMED&&this._session.status!==this._session.C.STATUS_WAITING_FOR_ACK)throw new pg.InvalidStateError(this._session.status);this._contentType=s,this._body=r;const a=mg.cloneArray(o.extraHeaders);a.push(`Content-Type: ${s}`),this._session.newInfo({originator:"local",info:this,request:this.request}),this._session.sendRequest(dg.INFO,{extraHeaders:a,eventHandlers:{onSuccessResponse:t=>{this.emit("succeeded",{originator:"remote",response:t})},onErrorResponse:t=>{this.emit("failed",{originator:"remote",response:t})},onTransportError:()=>{this._session.onTransportError()},onRequestTimeout:()=>{this._session.onRequestTimeout()},onDialogError:()=>{this._session.onDialogError()}},body:r})}init_incoming(s){this._direction="incoming",this.request=s,s.reply(200),this._contentType=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,this._body=s.body,this._session.newInfo({originator:"remote",info:this,request:s})}};const pu=Xe(d_),gg=
|
115
|
-
`,1)[0],"Status_Line");if(r===-1){mn.debug(`receiveNotify() | error parsing NOTIFY body: "${s.body}"`);return}switch(!0){case/^100$/.test(r.status_code):this.emit("trying",{request:s,status_line:r});break;case/^1[0-9]{2}$/.test(r.status_code):this.emit("progress",{request:s,status_line:r});break;case/^2[0-9]{2}$/.test(r.status_code):this.emit("accepted",{request:s,status_line:r});break;default:this.emit("failed",{request:s,status_line:r});break}}_requestSucceeded(s){mn.debug("REFER succeeded"),mn.debug('emit "requestSucceeded"'),this.emit("requestSucceeded",{response:s})}_requestFailed(s,r){mn.debug("REFER failed"),mn.debug('emit "requestFailed"'),this.emit("requestFailed",{response:s||null,cause:r})}};const Ag=Xe(m_),Cg=ft.EventEmitter,cf=Ut,Rg=ut,fe=De,gn=Es,ff=pr,Be=yt(),Hi=Uu,Ig=Pt,Xl=f_,bg=mr,Mt=h_,_f=d_,wg=p_,Og=m_,hf=vs(),Y=new Rg("RTCSession"),Z={STATUS_NULL:0,STATUS_INVITE_SENT:1,STATUS_1XX_RECEIVED:2,STATUS_INVITE_RECEIVED:3,STATUS_WAITING_FOR_ANSWER:4,STATUS_ANSWERED:5,STATUS_WAITING_FOR_ACK:6,STATUS_CANCELED:7,STATUS_TERMINATED:8,STATUS_CONFIRMED:9},Ql=["audio","video"];var g_=class mu extends Cg{static get C(){return Z}constructor(s){Y.debug("new"),super(),this._id=null,this._ua=s,this._status=Z.STATUS_NULL,this._dialog=null,this._earlyDialogs={},this._contact=null,this._from_tag=null,this._to_tag=null,this._connection=null,this._connectionPromiseQueue=Promise.resolve(),this._request=null,this._is_canceled=!1,this._cancel_reason="",this._is_confirmed=!1,this._late_sdp=!1,this._rtcOfferConstraints=null,this._rtcAnswerConstraints=null,this._localMediaStream=null,this._localMediaStreamLocallyGenerated=!1,this._rtcReady=!0,this._iceReady=!1,this._timers={ackTimer:null,expiresTimer:null,invite2xxTimer:null,userNoAnswerTimer:null},this._direction=null,this._local_identity=null,this._remote_identity=null,this._start_time=null,this._end_time=null,this._tones=null,this._audioMuted=!1,this._videoMuted=!1,this._localHold=!1,this._remoteHold=!1,this._sessionTimers={enabled:this._ua.configuration.session_timers,refreshMethod:this._ua.configuration.session_timers_refresh_method,defaultExpires:fe.SESSION_EXPIRES,currentExpires:null,running:!1,refresher:!1,timer:null},this._referSubscribers={},this._data={}}get C(){return Z}get causes(){return fe.causes}get id(){return this._id}get connection(){return this._connection}get contact(){return this._contact}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}get start_time(){return this._start_time}get end_time(){return this._end_time}get data(){return this._data}set data(s){this._data=s}get status(){return this._status}isInProgress(){switch(this._status){case Z.STATUS_NULL:case Z.STATUS_INVITE_SENT:case Z.STATUS_1XX_RECEIVED:case Z.STATUS_INVITE_RECEIVED:case Z.STATUS_WAITING_FOR_ANSWER:return!0;default:return!1}}isEstablished(){switch(this._status){case Z.STATUS_ANSWERED:case Z.STATUS_WAITING_FOR_ACK:case Z.STATUS_CONFIRMED:return!0;default:return!1}}isEnded(){switch(this._status){case Z.STATUS_CANCELED:case Z.STATUS_TERMINATED:return!0;default:return!1}}isMuted(){return{audio:this._audioMuted,video:this._videoMuted}}isOnHold(){return{local:this._localHold,remote:this._remoteHold}}connect(s,r={},o){Y.debug("connect()");const a=s,t=Be.cloneObject(r.eventHandlers),n=Be.cloneArray(r.extraHeaders),p=Be.cloneObject(r.mediaConstraints,{audio:!0,video:!0}),_=r.mediaStream||null,d=Be.cloneObject(r.pcConfig,{iceServers:[]}),g=r.rtcConstraints||null,T=r.rtcOfferConstraints||null;if(this._rtcOfferConstraints=T,this._rtcAnswerConstraints=r.rtcAnswerConstraints||null,this._data=r.data||this._data,s===void 0)throw new TypeError("Not enough arguments");if(this._status!==Z.STATUS_NULL)throw new gn.InvalidStateError(this._status);if(!window.RTCPeerConnection)throw new gn.NotSupportedError("WebRTC not supported");if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${a}`);this._sessionTimers.enabled&&Be.isDecimal(r.sessionTimersExpires)&&(r.sessionTimersExpires>=fe.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=r.sessionTimersExpires:this._sessionTimers.defaultExpires=fe.SESSION_EXPIRES);for(const A in t)Object.prototype.hasOwnProperty.call(t,A)&&this.on(A,t[A]);this._from_tag=Be.newTag();const E=r.anonymous||!1,y={from_tag:this._from_tag};this._contact=this._ua.contact.toString({anonymous:E,outbound:!0}),E?(y.from_display_name="Anonymous",y.from_uri=new hf("sip","anonymous","anonymous.invalid"),n.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`),n.push("Privacy: id")):r.fromUserName&&(y.from_uri=new hf("sip",r.fromUserName,this._ua.configuration.uri.host),n.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`)),r.fromDisplayName&&(y.from_display_name=r.fromDisplayName),n.push(`Contact: ${this._contact}`),n.push("Content-Type: application/sdp"),this._sessionTimers.enabled&&n.push(`Session-Expires: ${this._sessionTimers.defaultExpires}${this._ua.configuration.session_timers_force_refresher?";refresher=uac":""}`),this._request=new Ig.InitialOutgoingInviteRequest(s,this._ua,y,n),this._id=this._request.call_id+this._from_tag,this._createRTCConnection(d,g),this._direction="outgoing",this._local_identity=this._request.from,this._remote_identity=this._request.to,o&&o(this),this._newRTCSession("local",this._request),this._sendInitialRequest(p,T,_)}init_incoming(s,r){Y.debug("init_incoming()");let o;const a=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;if(s.body&&a!=="application/sdp"){s.reply(415);return}if(this._status=Z.STATUS_INVITE_RECEIVED,this._from_tag=s.from_tag,this._id=s.call_id+this._from_tag,this._request=s,this._contact=this._ua.contact.toString(),s.hasHeader("expires")&&(o=s.getHeader("expires")*1e3),s.to_tag=Be.newTag(),!this._createDialog(s,"UAS",!0)){s.reply(500,"Missing Contact header field");return}s.body?this._late_sdp=!1:this._late_sdp=!0,this._status=Z.STATUS_WAITING_FOR_ANSWER,this._timers.userNoAnswerTimer=setTimeout(()=>{s.reply(408),this._failed("local",null,fe.causes.NO_ANSWER)},this._ua.configuration.no_answer_timeout),o&&(this._timers.expiresTimer=setTimeout(()=>{this._status===Z.STATUS_WAITING_FOR_ANSWER&&(s.reply(487),this._failed("system",null,fe.causes.EXPIRES))},o)),this._direction="incoming",this._local_identity=s.to,this._remote_identity=s.from,r&&r(this),this._newRTCSession("remote",s),this._status!==Z.STATUS_TERMINATED&&(s.reply(180,null,[`Contact: ${this._contact}`]),this._progress("local",null))}answer(s={}){Y.debug("answer()");const r=this._request,o=Be.cloneArray(s.extraHeaders),a=Be.cloneObject(s.mediaConstraints),t=s.mediaStream||null,n=Be.cloneObject(s.pcConfig,{iceServers:[]}),p=s.rtcConstraints||null,_=s.rtcAnswerConstraints||null,d=Be.cloneObject(s.rtcOfferConstraints);let g,T=!1,E=!1,y=!1,A=!1;if(this._rtcAnswerConstraints=_,this._rtcOfferConstraints=s.rtcOfferConstraints||null,this._data=s.data||this._data,this._direction!=="incoming")throw new gn.NotSupportedError('"answer" not supported for outgoing RTCSession');if(this._status!==Z.STATUS_WAITING_FOR_ANSWER)throw new gn.InvalidStateError(this._status);if(this._sessionTimers.enabled&&Be.isDecimal(s.sessionTimersExpires)&&(s.sessionTimersExpires>=fe.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=s.sessionTimersExpires:this._sessionTimers.defaultExpires=fe.SESSION_EXPIRES),this._status=Z.STATUS_ANSWERED,!this._createDialog(r,"UAS")){r.reply(500,"Error creating dialog");return}clearTimeout(this._timers.userNoAnswerTimer),o.unshift(`Contact: ${this._contact}`);const C=r.parseSDP();Array.isArray(C.media)||(C.media=[C.media]);for(const I of C.media)I.type==="audio"&&(T=!0,(!I.direction||I.direction==="sendrecv")&&(y=!0)),I.type==="video"&&(E=!0,(!I.direction||I.direction==="sendrecv")&&(A=!0));if(t&&a.audio===!1){g=t.getAudioTracks();for(const I of g)t.removeTrack(I)}if(t&&a.video===!1){g=t.getVideoTracks();for(const I of g)t.removeTrack(I)}!t&&a.audio===void 0&&(a.audio=y),!t&&a.video===void 0&&(a.video=A),!t&&!T&&!d.offerToReceiveAudio&&(a.audio=!1),!t&&!E&&!d.offerToReceiveVideo&&(a.video=!1),this._createRTCConnection(n,p),Promise.resolve().then(()=>{if(t)return t;if(a.audio||a.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(a).catch(I=>{throw this._status===Z.STATUS_TERMINATED?new Error("terminated"):(r.reply(480),this._failed("local",null,fe.causes.USER_DENIED_MEDIA_ACCESS),Y.warn('emit "getusermediafailed" [error:%o]',I),this.emit("getusermediafailed",I),new Error("getUserMedia() failed"))})}).then(I=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._localMediaStream=I,I&&I.getTracks().forEach($=>{this._connection.addTrack($,I)})}).then(()=>{if(this._late_sdp)return;const I={originator:"remote",type:"offer",sdp:r.body};Y.debug('emit "sdp"'),this.emit("sdp",I);const $=new RTCSessionDescription({type:"offer",sdp:I.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription($)).catch(L=>{throw r.reply(488),this._failed("system",null,fe.causes.WEBRTC_ERROR),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',L),this.emit("peerconnection:setremotedescriptionfailed",L),new Error("peerconnection.setRemoteDescription() failed")}),this._connectionPromiseQueue}).then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._connecting(r),this._late_sdp?this._createLocalDescription("offer",this._rtcOfferConstraints).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")}):this._createLocalDescription("answer",_).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")})}).then(I=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._handleSessionTimersInIncomingRequest(r,o),r.reply(200,null,o,I,()=>{this._status=Z.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(r,I),this._setACKTimer(),this._accepted("local")},()=>{this._failed("system",null,fe.causes.CONNECTION_ERROR)})}).catch(I=>{this._status!==Z.STATUS_TERMINATED&&Y.warn(I)})}terminate(s={}){Y.debug("terminate()");const r=s.cause||fe.causes.BYE,o=Be.cloneArray(s.extraHeaders),a=s.body;let t,n=s.status_code,p=s.reason_phrase;if(this._status===Z.STATUS_TERMINATED)throw new gn.InvalidStateError(this._status);switch(this._status){case Z.STATUS_NULL:case Z.STATUS_INVITE_SENT:case Z.STATUS_1XX_RECEIVED:if(Y.debug("canceling session"),n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);n&&(p=p||fe.REASON_PHRASE[n]||"",t=`SIP ;cause=${n} ;text="${p}"`),this._status===Z.STATUS_NULL||this._status===Z.STATUS_INVITE_SENT?(this._is_canceled=!0,this._cancel_reason=t):this._status===Z.STATUS_1XX_RECEIVED&&this._request.cancel(t),this._status=Z.STATUS_CANCELED,this._failed("local",null,fe.causes.CANCELED);break;case Z.STATUS_WAITING_FOR_ANSWER:case Z.STATUS_ANSWERED:if(Y.debug("rejecting session"),n=n||480,n<300||n>=700)throw new TypeError(`Invalid status_code: ${n}`);this._request.reply(n,p,o,a),this._failed("local",null,fe.causes.REJECTED);break;case Z.STATUS_WAITING_FOR_ACK:case Z.STATUS_CONFIRMED:if(Y.debug("terminating session"),p=s.reason_phrase||fe.REASON_PHRASE[n]||"",n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);if(n&&o.push(`Reason: SIP ;cause=${n}; text="${p}"`),this._status===Z.STATUS_WAITING_FOR_ACK&&this._direction==="incoming"&&this._request.server_transaction.state!==ff.C.STATUS_TERMINATED){const _=this._dialog;this.receiveRequest=({method:d})=>{d===fe.ACK&&(this.sendRequest(fe.BYE,{extraHeaders:o,body:a}),_.terminate())},this._request.server_transaction.on("stateChanged",()=>{this._request.server_transaction.state===ff.C.STATUS_TERMINATED&&(this.sendRequest(fe.BYE,{extraHeaders:o,body:a}),_.terminate())}),this._ended("local",null,r),this._dialog=_,this._ua.newDialog(_)}else this.sendRequest(fe.BYE,{extraHeaders:o,body:a}),this._ended("local",null,r)}}sendDTMF(s,r={}){Y.debug("sendDTMF() | tones: %s",s);let o=0,a=r.duration||null,t=r.interToneGap||null;const n=r.transportType||fe.DTMF_TRANSPORT.INFO;if(s===void 0)throw new TypeError("Not enough arguments");if(this._status!==Z.STATUS_CONFIRMED&&this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_1XX_RECEIVED)throw new gn.InvalidStateError(this._status);if(n!==fe.DTMF_TRANSPORT.INFO&&n!==fe.DTMF_TRANSPORT.RFC2833)throw new TypeError(`invalid transportType: ${n}`);if(typeof s=="number"&&(s=s.toString()),!s||typeof s!="string"||!s.match(/^[0-9A-DR#*,]+$/i))throw new TypeError(`Invalid tones: ${s}`);if(a&&!Be.isDecimal(a))throw new TypeError(`Invalid tone duration: ${a}`);if(a?a<Mt.C.MIN_DURATION?(Y.debug(`"duration" value is lower than the minimum allowed, setting it to ${Mt.C.MIN_DURATION} milliseconds`),a=Mt.C.MIN_DURATION):a>Mt.C.MAX_DURATION?(Y.debug(`"duration" value is greater than the maximum allowed, setting it to ${Mt.C.MAX_DURATION} milliseconds`),a=Mt.C.MAX_DURATION):a=Math.abs(a):a=Mt.C.DEFAULT_DURATION,r.duration=a,t&&!Be.isDecimal(t))throw new TypeError(`Invalid interToneGap: ${t}`);if(t?t<Mt.C.MIN_INTER_TONE_GAP?(Y.debug(`"interToneGap" value is lower than the minimum allowed, setting it to ${Mt.C.MIN_INTER_TONE_GAP} milliseconds`),t=Mt.C.MIN_INTER_TONE_GAP):t=Math.abs(t):t=Mt.C.DEFAULT_INTER_TONE_GAP,n===fe.DTMF_TRANSPORT.RFC2833){const _=this._getDTMFRTPSender();_&&(s=_.toneBuffer+s,_.insertDTMF(s,a,t));return}if(this._tones){this._tones+=s;return}this._tones=s,p.call(this);function p(){let _;if(this._status===Z.STATUS_TERMINATED||!this._tones||o>=this._tones.length){this._tones=null;return}const d=this._tones[o];if(o+=1,d===",")_=2e3;else{const g=new Mt(this);r.eventHandlers={onFailed:()=>{this._tones=null}},g.send(d,r),_=a+t}setTimeout(p.bind(this),_)}}sendInfo(s,r,o={}){if(Y.debug("sendInfo()"),this._status!==Z.STATUS_CONFIRMED&&this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_1XX_RECEIVED)throw new gn.InvalidStateError(this._status);new _f(this).send(s,r,o)}mute(s={audio:!0,video:!1}){Y.debug("mute()");let r=!1,o=!1;this._audioMuted===!1&&s.audio&&(r=!0,this._audioMuted=!0,this._toggleMuteAudio(!0)),this._videoMuted===!1&&s.video&&(o=!0,this._videoMuted=!0,this._toggleMuteVideo(!0)),(r===!0||o===!0)&&this._onmute({audio:r,video:o})}unmute(s={audio:!0,video:!0}){Y.debug("unmute()");let r=!1,o=!1;this._audioMuted===!0&&s.audio&&(r=!0,this._audioMuted=!1,this._localHold===!1&&this._toggleMuteAudio(!1)),this._videoMuted===!0&&s.video&&(o=!0,this._videoMuted=!1,this._localHold===!1&&this._toggleMuteVideo(!1)),(r===!0||o===!0)&&this._onunmute({audio:r,video:o})}hold(s={},r){if(Y.debug("hold()"),this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED||this._localHold===!0||!this._isReadyToReOffer())return!1;this._localHold=!0,this._onhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:fe.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Hold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}unhold(s={},r){if(Y.debug("unhold()"),this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED||this._localHold===!1||!this._isReadyToReOffer())return!1;this._localHold=!1,this._onunhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:fe.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Unhold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}renegotiate(s={},r){Y.debug("renegotiate()");const o=s.rtcOfferConstraints||null;if(this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED||!this._isReadyToReOffer())return!1;const a={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:fe.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Media Renegotiation Failed"})}};return this._setLocalMediaStatus(),s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}),!0}refer(s,r){Y.debug("refer()");const o=s;if(this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED)return!1;if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${o}`);const a=new Og(this);a.sendRefer(s,r);const t=a.id;return this._referSubscribers[t]=a,a.on("requestFailed",()=>{delete this._referSubscribers[t]}),a.on("accepted",()=>{delete this._referSubscribers[t]}),a.on("failed",()=>{delete this._referSubscribers[t]}),a}sendRequest(s,r){return Y.debug("sendRequest()"),this._dialog.sendRequest(s,r)}receiveRequest(s){if(Y.debug("receiveRequest()"),s.method===fe.CANCEL)(this._status===Z.STATUS_WAITING_FOR_ANSWER||this._status===Z.STATUS_ANSWERED)&&(this._status=Z.STATUS_CANCELED,this._request.reply(487),this._failed("remote",s,fe.causes.CANCELED));else switch(s.method){case fe.ACK:if(this._status!==Z.STATUS_WAITING_FOR_ACK)return;if(this._status=Z.STATUS_CONFIRMED,clearTimeout(this._timers.ackTimer),clearTimeout(this._timers.invite2xxTimer),this._late_sdp){if(!s.body){this.terminate({cause:fe.causes.MISSING_SDP,status_code:400});break}const r={originator:"remote",type:"answer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>{this._is_confirmed||this._confirmed("remote",s)}).catch(a=>{this.terminate({cause:fe.causes.BAD_MEDIA_DESCRIPTION,status_code:488}),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})}else this._is_confirmed||this._confirmed("remote",s);break;case fe.BYE:this._status===Z.STATUS_CONFIRMED||this._status===Z.STATUS_WAITING_FOR_ACK?(s.reply(200),this._ended("remote",s,fe.causes.BYE)):this._status===Z.STATUS_INVITE_RECEIVED||this._status===Z.STATUS_WAITING_FOR_ANSWER?(s.reply(200),this._request.reply(487,"BYE Received"),this._ended("remote",s,fe.causes.BYE)):s.reply(403,"Wrong Status");break;case fe.INVITE:this._status===Z.STATUS_CONFIRMED?s.hasHeader("replaces")?this._receiveReplaces(s):this._receiveReinvite(s):s.reply(403,"Wrong Status");break;case fe.INFO:if(this._status===Z.STATUS_1XX_RECEIVED||this._status===Z.STATUS_WAITING_FOR_ANSWER||this._status===Z.STATUS_ANSWERED||this._status===Z.STATUS_WAITING_FOR_ACK||this._status===Z.STATUS_CONFIRMED){const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;r&&r.match(/^application\/dtmf-relay/i)?new Mt(this).init_incoming(s):r!==void 0?new _f(this).init_incoming(s):s.reply(415)}else s.reply(403,"Wrong Status");break;case fe.UPDATE:this._status===Z.STATUS_CONFIRMED?this._receiveUpdate(s):s.reply(403,"Wrong Status");break;case fe.REFER:this._status===Z.STATUS_CONFIRMED?this._receiveRefer(s):s.reply(403,"Wrong Status");break;case fe.NOTIFY:this._status===Z.STATUS_CONFIRMED?this._receiveNotify(s):s.reply(403,"Wrong Status");break;default:s.reply(501)}}onTransportError(){Y.warn("onTransportError()"),this._status!==Z.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:fe.causes.CONNECTION_ERROR,cause:fe.causes.CONNECTION_ERROR})}onRequestTimeout(){Y.warn("onRequestTimeout()"),this._status!==Z.STATUS_TERMINATED&&this.terminate({status_code:408,reason_phrase:fe.causes.REQUEST_TIMEOUT,cause:fe.causes.REQUEST_TIMEOUT})}onDialogError(){Y.warn("onDialogError()"),this._status!==Z.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:fe.causes.DIALOG_ERROR,cause:fe.causes.DIALOG_ERROR})}newDTMF(s){Y.debug("newDTMF()"),this.emit("newDTMF",s)}newInfo(s){Y.debug("newInfo()"),this.emit("newInfo",s)}_isReadyToReOffer(){return this._rtcReady?this._dialog?this._dialog.uac_pending_reply===!0||this._dialog.uas_pending_reply===!0?(Y.debug("_isReadyToReOffer() | there is another INVITE/UPDATE transaction in progress"),!1):!0:(Y.debug("_isReadyToReOffer() | session not established yet"),!1):(Y.debug("_isReadyToReOffer() | internal WebRTC status not ready"),!1)}_close(){if(Y.debug("close()"),this._localMediaStream&&this._localMediaStreamLocallyGenerated&&(Y.debug("close() | closing local MediaStream"),Be.closeMediaStream(this._localMediaStream)),this._status!==Z.STATUS_TERMINATED){if(this._status=Z.STATUS_TERMINATED,this._connection)try{this._connection.close()}catch(s){Y.warn("close() | error closing the RTCPeerConnection: %o",s)}for(const s in this._timers)Object.prototype.hasOwnProperty.call(this._timers,s)&&clearTimeout(this._timers[s]);clearTimeout(this._sessionTimers.timer),this._dialog&&(this._dialog.terminate(),delete this._dialog);for(const s in this._earlyDialogs)Object.prototype.hasOwnProperty.call(this._earlyDialogs,s)&&(this._earlyDialogs[s].terminate(),delete this._earlyDialogs[s]);for(const s in this._referSubscribers)Object.prototype.hasOwnProperty.call(this._referSubscribers,s)&&delete this._referSubscribers[s];this._ua.destroyRTCSession(this)}}_setInvite2xxTimer(s,r){let o=Hi.T1;function a(){this._status===Z.STATUS_WAITING_FOR_ACK&&(s.reply(200,null,[`Contact: ${this._contact}`],r),o<Hi.T2&&(o=o*2,o>Hi.T2&&(o=Hi.T2)),this._timers.invite2xxTimer=setTimeout(a.bind(this),o))}this._timers.invite2xxTimer=setTimeout(a.bind(this),o)}_setACKTimer(){this._timers.ackTimer=setTimeout(()=>{this._status===Z.STATUS_WAITING_FOR_ACK&&(Y.debug("no ACK received, terminating the session"),clearTimeout(this._timers.invite2xxTimer),this.sendRequest(fe.BYE),this._ended("remote",null,fe.causes.NO_ACK))},Hi.TIMER_H)}_createRTCConnection(s,r){this._connection=new RTCPeerConnection(s,r),this._connection.addEventListener("iceconnectionstatechange",()=>{this._connection.iceConnectionState==="failed"&&this.terminate({cause:fe.causes.RTP_TIMEOUT,status_code:408,reason_phrase:fe.causes.RTP_TIMEOUT})}),Y.debug('emit "peerconnection"'),this.emit("peerconnection",{peerconnection:this._connection})}_createLocalDescription(s,r){if(Y.debug("createLocalDescription()"),s!=="offer"&&s!=="answer")throw new Error(`createLocalDescription() | invalid type "${s}"`);const o=this._connection;return this._rtcReady=!1,Promise.resolve().then(()=>s==="offer"?o.createOffer(r).catch(a=>(Y.warn('emit "peerconnection:createofferfailed" [error:%o]',a),this.emit("peerconnection:createofferfailed",a),Promise.reject(a))):o.createAnswer(r).catch(a=>(Y.warn('emit "peerconnection:createanswerfailed" [error:%o]',a),this.emit("peerconnection:createanswerfailed",a),Promise.reject(a)))).then(a=>o.setLocalDescription(a).catch(t=>(this._rtcReady=!0,Y.warn('emit "peerconnection:setlocaldescriptionfailed" [error:%o]',t),this.emit("peerconnection:setlocaldescriptionfailed",t),Promise.reject(t)))).then(()=>{const a=r&&r.iceRestart;if(o.iceGatheringState==="complete"&&!a||o.iceGatheringState==="gathering"&&this._iceReady){this._rtcReady=!0;const t={originator:"local",type:s,sdp:o.localDescription.sdp};return Y.debug('emit "sdp"'),this.emit("sdp",t),Promise.resolve(t.sdp)}return new Promise(t=>{let n=!1,p,_;this._iceReady=!1;const d=()=>{o.removeEventListener("icecandidate",p),o.removeEventListener("icegatheringstatechange",_),n=!0,this._rtcReady=!0,this._iceReady=!0;const g={originator:"local",type:s,sdp:o.localDescription.sdp};Y.debug('emit "sdp"'),this.emit("sdp",g),t(g.sdp)};o.addEventListener("icecandidate",p=g=>{const T=g.candidate;T?this.emit("icecandidate",{candidate:T,ready:d}):n||d()}),o.addEventListener("icegatheringstatechange",_=()=>{o.iceGatheringState==="complete"&&!n&&d()})})})}_createDialog(s,r,o){const a=r==="UAS"?s.to_tag:s.from_tag,t=r==="UAS"?s.from_tag:s.to_tag,n=s.call_id+a+t;let p=this._earlyDialogs[n];if(o)return p?!0:(p=new Xl(this,s,r,Xl.C.STATUS_EARLY),p.error?(Y.debug(p.error),this._failed("remote",s,fe.causes.INTERNAL_ERROR),!1):(this._earlyDialogs[n]=p,!0));{if(this._from_tag=s.from_tag,this._to_tag=s.to_tag,p)return p.update(s,r),this._dialog=p,delete this._earlyDialogs[n],!0;const _=new Xl(this,s,r);return _.error?(Y.debug(_.error),this._failed("remote",s,fe.causes.INTERNAL_ERROR),!1):(this._dialog=_,!0)}}_receiveReinvite(s){Y.debug("receiveReinvite()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Be.cloneArray(p.extraHeaders);if(this._status!==Z.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("reinvite",o),a)return;if(this._late_sdp=!1,!s.body){this._late_sdp=!0,this._remoteHold&&(this._remoteHold=!1,this._onunhold("remote")),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",this._rtcOfferConstraints)).then(p=>{n.call(this,p)}).catch(()=>{s.reply(500)});return}if(r!=="application/sdp"){Y.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==Z.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{Y.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),this._late_sdp&&(p=this._mangleOffer(p)),s.reply(200,null,_,p,()=>{this._status=Z.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(s,p),this._setACKTimer()}),typeof o.callback=="function"&&o.callback()}}_receiveUpdate(s){Y.debug("receiveUpdate()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Be.cloneArray(p.extraHeaders);if(this._status!==Z.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("update",o),a)return;if(!s.body){n.call(this,null);return}if(r!=="application/sdp"){Y.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==Z.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{Y.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),s.reply(200,null,_,p),typeof o.callback=="function"&&o.callback()}}_processInDialogSdpOffer(s){Y.debug("_processInDialogSdpOffer()");const r=s.parseSDP();let o=!1;for(const n of r.media){if(Ql.indexOf(n.type)===-1)continue;const p=n.direction||r.direction||"sendrecv";if(p==="sendonly"||p==="inactive")o=!0;else{o=!1;break}}const a={originator:"remote",type:"offer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",a);const t=new RTCSessionDescription({type:"offer",sdp:a.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._connection.setRemoteDescription(t).catch(n=>{throw s.reply(488),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',n),this.emit("peerconnection:setremotedescriptionfailed",n),n})}).then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._remoteHold===!0&&o===!1?(this._remoteHold=!1,this._onunhold("remote")):this._remoteHold===!1&&o===!0&&(this._remoteHold=!0,this._onhold("remote"))}).then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._createLocalDescription("answer",this._rtcAnswerConstraints).catch(n=>{throw s.reply(500),Y.warn('emit "peerconnection:createtelocaldescriptionfailed" [error:%o]',n),n})}).catch(n=>{Y.warn("_processInDialogSdpOffer() failed [error: %o]",n)}),this._connectionPromiseQueue}_receiveRefer(s){if(Y.debug("receiveRefer()"),!s.refer_to){Y.debug("no Refer-To header field present in REFER"),s.reply(400);return}if(s.refer_to.uri.scheme!==fe.SIP){Y.debug("Refer-To header field points to a non-SIP URI scheme"),s.reply(416);return}s.reply(202);const r=new wg(this,s.cseq);Y.debug('emit "refer"'),this.emit("refer",{request:s,accept:(t,n)=>{o.call(this,t,n)},reject:()=>{a.call(this)}});function o(t,n={}){if(t=typeof t=="function"?t:null,this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED)return!1;const p=new mu(this._ua);if(p.on("progress",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("accepted",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("_failed",({message:_,cause:d})=>{_?r.notify(_.status_code,_.reason_phrase):r.notify(487,d)}),s.refer_to.uri.hasHeader("replaces")){const _=decodeURIComponent(s.refer_to.uri.getHeader("replaces"));n.extraHeaders=Be.cloneArray(n.extraHeaders),n.extraHeaders.push(`Replaces: ${_}`)}p.connect(s.refer_to.uri.toAor(),n,t)}function a(){r.notify(603)}}_receiveNotify(s){switch(Y.debug("receiveNotify()"),s.event||s.reply(400),s.event.event){case"refer":{let r,o;if(s.event.params&&s.event.params.id)r=s.event.params.id,o=this._referSubscribers[r];else if(Object.keys(this._referSubscribers).length===1)o=this._referSubscribers[Object.keys(this._referSubscribers)[0]];else{s.reply(400,"Missing event id parameter");return}if(!o){s.reply(481,"Subscription does not exist");return}o.receiveNotify(s),s.reply(200);break}default:s.reply(489)}}_receiveReplaces(s){Y.debug("receiveReplaces()");function r(a){if(this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED)return!1;const t=new mu(this._ua);t.on("confirmed",()=>{this.terminate()}),t.init_incoming(s,a)}function o(){Y.debug("Replaced INVITE rejected by the user"),s.reply(486)}this.emit("replaces",{request:s,accept:a=>{r.call(this,a)},reject:()=>{o.call(this)}})}_sendInitialRequest(s,r,o){const a=new bg(this._ua,this._request,{onRequestTimeout:()=>{this.onRequestTimeout()},onTransportError:()=>{this.onTransportError()},onAuthenticated:t=>{this._request=t},onReceiveResponse:t=>{this._receiveInviteResponse(t)}});Promise.resolve().then(()=>{if(o)return o;if(s.audio||s.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(s).catch(t=>{throw this._status===Z.STATUS_TERMINATED?new Error("terminated"):(this._failed("local",null,fe.causes.USER_DENIED_MEDIA_ACCESS),Y.warn('emit "getusermediafailed" [error:%o]',t),this.emit("getusermediafailed",t),t)})}).then(t=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._localMediaStream=t,t&&t.getTracks().forEach(n=>{this._connection.addTrack(n,t)}),this._connecting(this._request),this._createLocalDescription("offer",r).catch(n=>{throw this._failed("local",null,fe.causes.WEBRTC_ERROR),n})}).then(t=>{if(this._is_canceled||this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._request.body=t,this._status=Z.STATUS_INVITE_SENT,Y.debug('emit "sending" [request:%o]',this._request),this.emit("sending",{request:this._request}),a.send()}).catch(t=>{this._status!==Z.STATUS_TERMINATED&&Y.warn(t)})}_getDTMFRTPSender(){const s=this._connection.getSenders().find(r=>r.track&&r.track.kind==="audio");if(!(s&&s.dtmf)){Y.warn("sendDTMF() | no local audio track to send DTMF with");return}return s.dtmf}_receiveInviteResponse(s){if(Y.debug("receiveInviteResponse()"),this._dialog&&s.status_code>=200&&s.status_code<=299)if(this._dialog.id.call_id===s.call_id&&this._dialog.id.local_tag===s.from_tag&&this._dialog.id.remote_tag===s.to_tag){this.sendRequest(fe.ACK);return}else{const r=new Xl(this,s,"UAC");if(r.error!==void 0){Y.debug(r.error);return}this.sendRequest(fe.ACK),this.sendRequest(fe.BYE);return}if(this._is_canceled){s.status_code>=100&&s.status_code<200?this._request.cancel(this._cancel_reason):s.status_code>=200&&s.status_code<299&&this._acceptAndTerminate(s);return}if(!(this._status!==Z.STATUS_INVITE_SENT&&this._status!==Z.STATUS_1XX_RECEIVED))switch(!0){case/^100$/.test(s.status_code):this._status=Z.STATUS_1XX_RECEIVED;break;case/^1[0-9]{2}$/.test(s.status_code):{if(!s.to_tag){Y.debug("1xx response received without to tag");break}if(s.hasHeader("contact")&&!this._createDialog(s,"UAC",!0))break;if(this._status=Z.STATUS_1XX_RECEIVED,!s.body){this._progress("remote",s);break}const r={originator:"remote",type:"answer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>this._progress("remote",s)).catch(a=>{Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)});break}case/^2[0-9]{2}$/.test(s.status_code):{if(this._status=Z.STATUS_CONFIRMED,!s.body){this._acceptAndTerminate(s,400,fe.causes.MISSING_SDP),this._failed("remote",s,fe.causes.BAD_MEDIA_DESCRIPTION);break}if(!this._createDialog(s,"UAC"))break;const r={originator:"remote",type:"answer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._connection.signalingState==="stable")return this._connection.createOffer(this._rtcOfferConstraints).then(a=>this._connection.setLocalDescription(a)).catch(a=>{this._acceptAndTerminate(s,500,a.toString()),this._failed("local",s,fe.causes.WEBRTC_ERROR)})}).then(()=>{this._connection.setRemoteDescription(o).then(()=>{this._handleSessionTimersInIncomingResponse(s),this._accepted("remote",s),this.sendRequest(fe.ACK),this._confirmed("local",null)}).catch(a=>{this._acceptAndTerminate(s,488,"Not Acceptable Here"),this._failed("remote",s,fe.causes.BAD_MEDIA_DESCRIPTION),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})});break}default:{const r=Be.sipErrorCause(s.status_code);this._failed("remote",s,r)}}}_sendReinvite(s={}){Y.debug("sendReinvite()");const r=Be.cloneArray(s.extraHeaders),o=Be.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null;let t=!1;r.push(`Contact: ${this._contact}`),r.push("Content-Type: application/sdp"),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(_=>{_=this._mangleOffer(_);const d={originator:"local",type:"offer",sdp:_};Y.debug('emit "sdp"'),this.emit("sdp",d),this.sendRequest(fe.INVITE,{extraHeaders:r,body:_,eventHandlers:{onSuccessResponse:g=>{n.call(this,g),t=!0},onErrorResponse:g=>{p.call(this,g)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{p()});function n(_){if(this._status===Z.STATUS_TERMINATED||(this.sendRequest(fe.ACK),t))return;if(this._handleSessionTimersInIncomingResponse(_),_.body){if(!_.hasHeader("Content-Type")||_.getHeader("Content-Type").toLowerCase()!=="application/sdp"){p.call(this);return}}else{p.call(this);return}const d={originator:"remote",type:"answer",sdp:_.body};Y.debug('emit "sdp"'),this.emit("sdp",d);const g=new RTCSessionDescription({type:"answer",sdp:d.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(g)).then(()=>{o.succeeded&&o.succeeded(_)}).catch(T=>{p.call(this),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',T),this.emit("peerconnection:setremotedescriptionfailed",T)})}function p(_){o.failed&&o.failed(_)}}_sendUpdate(s={}){Y.debug("sendUpdate()");const r=Be.cloneArray(s.extraHeaders),o=Be.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null,t=s.sdpOffer||!1;let n=!1;r.push(`Contact: ${this._contact}`),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),t?(r.push("Content-Type: application/sdp"),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(d=>{d=this._mangleOffer(d);const g={originator:"local",type:"offer",sdp:d};Y.debug('emit "sdp"'),this.emit("sdp",g),this.sendRequest(fe.UPDATE,{extraHeaders:r,body:d,eventHandlers:{onSuccessResponse:T=>{p.call(this,T),n=!0},onErrorResponse:T=>{_.call(this,T)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{_.call(this)})):this.sendRequest(fe.UPDATE,{extraHeaders:r,eventHandlers:{onSuccessResponse:d=>{p.call(this,d)},onErrorResponse:d=>{_.call(this,d)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}});function p(d){if(this._status!==Z.STATUS_TERMINATED&&!n)if(this._handleSessionTimersInIncomingResponse(d),t){if(d.body){if(!d.hasHeader("Content-Type")||d.getHeader("Content-Type").toLowerCase()!=="application/sdp"){_.call(this);return}}else{_.call(this);return}const g={originator:"remote",type:"answer",sdp:d.body};Y.debug('emit "sdp"'),this.emit("sdp",g);const T=new RTCSessionDescription({type:"answer",sdp:g.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(T)).then(()=>{o.succeeded&&o.succeeded(d)}).catch(E=>{_.call(this),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',E),this.emit("peerconnection:setremotedescriptionfailed",E)})}else o.succeeded&&o.succeeded(d)}function _(d){o.failed&&o.failed(d)}}_acceptAndTerminate(s,r,o){Y.debug("acceptAndTerminate()");const a=[];r&&(o=o||fe.REASON_PHRASE[r]||"",a.push(`Reason: SIP ;cause=${r}; text="${o}"`)),(this._dialog||this._createDialog(s,"UAC"))&&(this.sendRequest(fe.ACK),this.sendRequest(fe.BYE,{extraHeaders:a})),this._status=Z.STATUS_TERMINATED}_mangleOffer(s){if(!this._localHold&&!this._remoteHold)return s;if(s=cf.parse(s),this._localHold&&!this._remoteHold){Y.debug("mangleOffer() | me on hold, mangling offer");for(const r of s.media)Ql.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="sendonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="sendonly")}else if(this._localHold&&this._remoteHold){Y.debug("mangleOffer() | both on hold, mangling offer");for(const r of s.media)Ql.indexOf(r.type)!==-1&&(r.direction="inactive")}else if(this._remoteHold){Y.debug("mangleOffer() | remote on hold, mangling offer");for(const r of s.media)Ql.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="recvonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="recvonly")}return cf.write(s)}_setLocalMediaStatus(){let s=!0,r=!0;(this._localHold||this._remoteHold)&&(s=!1,r=!1),this._audioMuted&&(s=!1),this._videoMuted&&(r=!1),this._toggleMuteAudio(!s),this._toggleMuteVideo(!r)}_handleSessionTimersInIncomingRequest(s,r){if(!this._sessionTimers.enabled)return;let o;s.session_expires&&s.session_expires>=fe.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,o=s.session_expires_refresher||"uas"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,o="uas"),r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${o}`),this._sessionTimers.refresher=o==="uas",this._runSessionTimer()}_handleSessionTimersInIncomingResponse(s){if(!this._sessionTimers.enabled)return;let r;s.session_expires&&s.session_expires>=fe.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,r=s.session_expires_refresher||"uac"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,r="uac"),this._sessionTimers.refresher=r==="uac",this._runSessionTimer()}_runSessionTimer(){const s=this._sessionTimers.currentExpires;this._sessionTimers.running=!0,clearTimeout(this._sessionTimers.timer),this._sessionTimers.refresher?this._sessionTimers.timer=setTimeout(()=>{this._status!==Z.STATUS_TERMINATED&&this._isReadyToReOffer()&&(Y.debug("runSessionTimer() | sending session refresh request"),this._sessionTimers.refreshMethod===fe.UPDATE?this._sendUpdate():this._sendReinvite())},s*500):this._sessionTimers.timer=setTimeout(()=>{this._status!==Z.STATUS_TERMINATED&&(Y.warn("runSessionTimer() | timer expired, terminating the session"),this.terminate({cause:fe.causes.REQUEST_TIMEOUT,status_code:408,reason_phrase:"Session Timer Expired"}))},s*1100)}_toggleMuteAudio(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="audio");for(const o of r)o.track.enabled=!s}_toggleMuteVideo(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="video");for(const o of r)o.track.enabled=!s}_newRTCSession(s,r){Y.debug("newRTCSession()"),this._ua.newRTCSession(this,{originator:s,session:this,request:r})}_connecting(s){Y.debug("session connecting"),Y.debug('emit "connecting"'),this.emit("connecting",{request:s})}_progress(s,r){Y.debug("session progress"),Y.debug('emit "progress"'),this.emit("progress",{originator:s,response:r||null})}_accepted(s,r){Y.debug("session accepted"),this._start_time=new Date,Y.debug('emit "accepted"'),this.emit("accepted",{originator:s,response:r||null})}_confirmed(s,r){Y.debug("session confirmed"),this._is_confirmed=!0,Y.debug('emit "confirmed"'),this.emit("confirmed",{originator:s,ack:r||null})}_ended(s,r,o){Y.debug("session ended"),this._end_time=new Date,this._close(),Y.debug('emit "ended"'),this.emit("ended",{originator:s,message:r||null,cause:o})}_failed(s,r,o){Y.debug("session failed"),Y.debug('emit "_failed"'),this.emit("_failed",{originator:s,message:r||null,cause:o}),this._close(),Y.debug('emit "failed"'),this.emit("failed",{originator:s,message:r||null,cause:o})}_onhold(s){Y.debug("session onhold"),this._setLocalMediaStatus(),Y.debug('emit "hold"'),this.emit("hold",{originator:s})}_onunhold(s){Y.debug("session onunhold"),this._setLocalMediaStatus(),Y.debug('emit "unhold"'),this.emit("unhold",{originator:s})}_onmute({audio:s,video:r}){Y.debug("session onmute"),this._setLocalMediaStatus(),Y.debug('emit "muted"'),this.emit("muted",{audio:s,video:r})}_onunmute({audio:s,video:r}){Y.debug("session onunmute"),this._setLocalMediaStatus(),Y.debug('emit "unmuted"'),this.emit("unmuted",{audio:s,video:r})}};const Dg=Xe(g_),Ng=ft.EventEmitter,Ug=ut,Ha=De,Pg=Pt,Fi=yt(),xg=mr,df=Es,Mg=vs(),Zl=new Ug("Message");var kg=class extends Ng{constructor(s){super(),this._ua=s,this._request=null,this._closed=!1,this._direction=null,this._local_identity=null,this._remote_identity=null,this._is_replied=!1,this._data={}}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}send(s,r,o={}){const a=s;if(s===void 0||r===void 0)throw new TypeError("Not enough arguments");if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${a}`);const t=Fi.cloneArray(o.extraHeaders),n=Fi.cloneObject(o.eventHandlers),p=o.contentType||"text/plain",_={};o.fromUserName&&(_.from_uri=new Mg("sip",o.fromUserName,this._ua.configuration.uri.host),t.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`)),o.fromDisplayName&&(_.from_display_name=o.fromDisplayName);for(const g in n)Object.prototype.hasOwnProperty.call(n,g)&&this.on(g,n[g]);t.push(`Content-Type: ${p}`),this._request=new Pg.OutgoingRequest(Ha.MESSAGE,s,this._ua,_,t),r&&(this._request.body=r);const d=new xg(this._ua,this._request,{onRequestTimeout:()=>{this._onRequestTimeout()},onTransportError:()=>{this._onTransportError()},onReceiveResponse:g=>{this._receiveResponse(g)}});this._newMessage("local",this._request),d.send()}init_incoming(s){this._request=s,this._newMessage("remote",s),this._is_replied||(this._is_replied=!0,s.reply(200)),this._close()}accept(s={}){const r=Fi.cloneArray(s.extraHeaders),o=s.body;if(this._direction!=="incoming")throw new df.NotSupportedError('"accept" not supported for outgoing Message');if(this._is_replied)throw new Error("incoming Message already replied");this._is_replied=!0,this._request.reply(200,null,r,o)}reject(s={}){const r=s.status_code||480,o=s.reason_phrase,a=Fi.cloneArray(s.extraHeaders),t=s.body;if(this._direction!=="incoming")throw new df.NotSupportedError('"reject" not supported for outgoing Message');if(this._is_replied)throw new Error("incoming Message already replied");if(r<300||r>=700)throw new TypeError(`Invalid status_code: ${r}`);this._is_replied=!0,this._request.reply(r,o,a,t)}_receiveResponse(s){if(!this._closed)switch(!0){case/^1[0-9]{2}$/.test(s.status_code):break;case/^2[0-9]{2}$/.test(s.status_code):this._succeeded("remote",s);break;default:{const r=Fi.sipErrorCause(s.status_code);this._failed("remote",s,r);break}}}_onRequestTimeout(){this._closed||this._failed("system",null,Ha.causes.REQUEST_TIMEOUT)}_onTransportError(){this._closed||this._failed("system",null,Ha.causes.CONNECTION_ERROR)}_close(){this._closed=!0,this._ua.destroyMessage(this)}_newMessage(s,r){s==="remote"?(this._direction="incoming",this._local_identity=r.to,this._remote_identity=r.from):s==="local"&&(this._direction="outgoing",this._local_identity=r.from,this._remote_identity=r.to),this._ua.newMessage(this,{originator:s,message:this,request:r})}_failed(s,r,o){Zl.debug("MESSAGE failed"),this._close(),Zl.debug('emit "failed"'),this.emit("failed",{originator:s,response:r||null,cause:o})}_succeeded(s,r){Zl.debug("MESSAGE succeeded"),this._close(),Zl.debug('emit "succeeded"'),this.emit("succeeded",{originator:s,response:r})}};const Lg=ft.EventEmitter,$g=ut,Fa=De,Hg=Pt,ji=yt(),Fg=mr,pf=Es,eo=new $g("Options");var jg=class extends Lg{constructor(s){super(),this._ua=s,this._request=null,this._closed=!1,this._direction=null,this._local_identity=null,this._remote_identity=null,this._is_replied=!1,this._data={}}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}send(s,r,o={}){const a=s;if(s===void 0)throw new TypeError("A target is required for OPTIONS");if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${a}`);const t=ji.cloneArray(o.extraHeaders),n=ji.cloneObject(o.eventHandlers),p=o.contentType||"application/sdp";for(const d in n)Object.prototype.hasOwnProperty.call(n,d)&&this.on(d,n[d]);t.push(`Content-Type: ${p}`),this._request=new Hg.OutgoingRequest(Fa.OPTIONS,s,this._ua,null,t),r&&(this._request.body=r);const _=new Fg(this._ua,this._request,{onRequestTimeout:()=>{this._onRequestTimeout()},onTransportError:()=>{this._onTransportError()},onReceiveResponse:d=>{this._receiveResponse(d)}});this._newOptions("local",this._request),_.send()}init_incoming(s){this._request=s,this._newOptions("remote",s),this._is_replied||(this._is_replied=!0,s.reply(200)),this._close()}accept(s={}){const r=ji.cloneArray(s.extraHeaders),o=s.body;if(this._direction!=="incoming")throw new pf.NotSupportedError('"accept" not supported for outgoing Options');if(this._is_replied)throw new Error("incoming Options already replied");this._is_replied=!0,this._request.reply(200,null,r,o)}reject(s={}){const r=s.status_code||480,o=s.reason_phrase,a=ji.cloneArray(s.extraHeaders),t=s.body;if(this._direction!=="incoming")throw new pf.NotSupportedError('"reject" not supported for outgoing Options');if(this._is_replied)throw new Error("incoming Options already replied");if(r<300||r>=700)throw new TypeError(`Invalid status_code: ${r}`);this._is_replied=!0,this._request.reply(r,o,a,t)}_receiveResponse(s){if(!this._closed)switch(!0){case/^1[0-9]{2}$/.test(s.status_code):break;case/^2[0-9]{2}$/.test(s.status_code):this._succeeded("remote",s);break;default:{const r=ji.sipErrorCause(s.status_code);this._failed("remote",s,r);break}}}_onRequestTimeout(){this._closed||this._failed("system",null,Fa.causes.REQUEST_TIMEOUT)}_onTransportError(){this._closed||this._failed("system",null,Fa.causes.CONNECTION_ERROR)}_close(){this._closed=!0,this._ua.destroyMessage(this)}_newOptions(s,r){s==="remote"?(this._direction="incoming",this._local_identity=r.to,this._remote_identity=r.from):s==="local"&&(this._direction="outgoing",this._local_identity=r.from,this._remote_identity=r.to),this._ua.newOptions(this,{originator:s,message:this,request:r})}_failed(s,r,o){eo.debug("OPTIONS failed"),this._close(),eo.debug('emit "failed"'),this.emit("failed",{originator:s,response:r||null,cause:o})}_succeeded(s,r){eo.debug("OPTIONS succeeded"),this._close(),eo.debug('emit "succeeded"'),this.emit("succeeded",{originator:s,response:r})}},xu={};const Vg=ut,ja=yt(),qg=ls(),Vi=new Vg("Socket");xu.isSocket=c=>{if(Array.isArray(c))return!1;if(typeof c>"u")return Vi.warn("undefined JsSIP.Socket instance"),!1;try{if(!ja.isString(c.url))throw Vi.warn("missing or invalid JsSIP.Socket url property"),new Error("Missing or invalid JsSIP.Socket url property");if(!ja.isString(c.via_transport))throw Vi.warn("missing or invalid JsSIP.Socket via_transport property"),new Error("Missing or invalid JsSIP.Socket via_transport property");if(qg.parse(c.sip_uri,"SIP_URI")===-1)throw Vi.warn("missing or invalid JsSIP.Socket sip_uri property"),new Error("missing or invalid JsSIP.Socket sip_uri property")}catch{return!1}try{["connect","disconnect","send"].forEach(s=>{if(!ja.isFunction(c[s]))throw Vi.warn(`missing or invalid JsSIP.Socket method: ${s}`),new Error(`Missing or invalid JsSIP.Socket method: ${s}`)})}catch{return!1}return!0};const Bg=ut,Gg=xu,mf=De,Nt=new Bg("Transport"),Vt={STATUS_CONNECTED:0,STATUS_CONNECTING:1,STATUS_DISCONNECTED:2,SOCKET_STATUS_READY:0,SOCKET_STATUS_ERROR:1,recovery_options:{min_interval:mf.CONNECTION_RECOVERY_MIN_INTERVAL,max_interval:mf.CONNECTION_RECOVERY_MAX_INTERVAL}};var T_=class{constructor(s,r=Vt.recovery_options){Nt.debug("new()"),this.status=Vt.STATUS_DISCONNECTED,this.socket=null,this.sockets=[],this.recovery_options=r,this.recover_attempts=0,this.recovery_timer=null,this.close_requested=!1;try{this.textDecoder=new TextDecoder("utf8")}catch(o){Nt.warn(`cannot use TextDecoder: ${o}`)}if(typeof s>"u")throw new TypeError("Invalid argument. undefined 'sockets' argument");s instanceof Array||(s=[s]),s.forEach(function(o){if(!Gg.isSocket(o.socket))throw new TypeError("Invalid argument. invalid 'JsSIP.Socket' instance");if(o.weight&&!Number(o.weight))throw new TypeError("Invalid argument. 'weight' attribute is not a number");this.sockets.push({socket:o.socket,weight:o.weight||0,status:Vt.SOCKET_STATUS_READY})},this),this._getSocket()}get via_transport(){return this.socket.via_transport}get url(){return this.socket.url}get sip_uri(){return this.socket.sip_uri}connect(){if(Nt.debug("connect()"),this.isConnected()){Nt.debug("Transport is already connected");return}else if(this.isConnecting()){Nt.debug("Transport is connecting");return}this.close_requested=!1,this.status=Vt.STATUS_CONNECTING,this.onconnecting({socket:this.socket,attempts:this.recover_attempts}),this.close_requested||(this.socket.onconnect=this._onConnect.bind(this),this.socket.ondisconnect=this._onDisconnect.bind(this),this.socket.ondata=this._onData.bind(this),this.socket.connect())}disconnect(){Nt.debug("close()"),this.close_requested=!0,this.recover_attempts=0,this.status=Vt.STATUS_DISCONNECTED,this.recovery_timer!==null&&(clearTimeout(this.recovery_timer),this.recovery_timer=null),this.socket.onconnect=()=>{},this.socket.ondisconnect=()=>{},this.socket.ondata=()=>{},this.socket.disconnect(),this.ondisconnect({socket:this.socket,error:!1})}send(s){if(Nt.debug("send()"),!this.isConnected())return Nt.warn("unable to send message, transport is not connected"),!1;const r=s.toString();return Nt.debug(`sending message:
|
114
|
+
`);a.length>=1&&r.test(a[0])&&(this._tone=a[0].replace(r,"$2")),a.length>=2&&o.test(a[1])&&(this._duration=parseInt(a[1].replace(o,"$2"),10))}this._duration||(this._duration=__.DEFAULT_DURATION),this._tone?this._session.newDTMF({originator:"remote",dtmf:this,request:s}):fg.debug("invalid INFO DTMF received, discarded")}};Pu.exports.C=__;var h_=Pu.exports;const _g=Xe(h_),hg=ft.EventEmitter,dg=De,pg=Es,mg=yt();var d_=class extends hg{constructor(s){super(),this._session=s,this._direction=null,this._contentType=null,this._body=null}get contentType(){return this._contentType}get body(){return this._body}send(s,r,o={}){if(this._direction="outgoing",s===void 0)throw new TypeError("Not enough arguments");if(this._session.status!==this._session.C.STATUS_CONFIRMED&&this._session.status!==this._session.C.STATUS_WAITING_FOR_ACK)throw new pg.InvalidStateError(this._session.status);this._contentType=s,this._body=r;const a=mg.cloneArray(o.extraHeaders);a.push(`Content-Type: ${s}`),this._session.newInfo({originator:"local",info:this,request:this.request}),this._session.sendRequest(dg.INFO,{extraHeaders:a,eventHandlers:{onSuccessResponse:t=>{this.emit("succeeded",{originator:"remote",response:t})},onErrorResponse:t=>{this.emit("failed",{originator:"remote",response:t})},onTransportError:()=>{this._session.onTransportError()},onRequestTimeout:()=>{this._session.onRequestTimeout()},onDialogError:()=>{this._session.onDialogError()}},body:r})}init_incoming(s){this._direction="incoming",this.request=s,s.reply(200),this._contentType=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,this._body=s.body,this._session.newInfo({originator:"remote",info:this,request:s})}};const pu=Xe(d_),gg=at,af=De,Tg=new gg("RTCSession:ReferNotifier"),$a={event_type:"refer",body_type:"message/sipfrag;version=2.0",expires:300};var p_=class{constructor(s,r,o){this._session=s,this._id=r,this._expires=o||$a.expires,this._active=!0,this.notify(100)}notify(s,r){if(Tg.debug("notify()"),this._active===!1)return;r=r||af.REASON_PHRASE[s]||"";let o;s>=200?o="terminated;reason=noresource":o=`active;expires=${this._expires}`,this._session.sendRequest(af.NOTIFY,{extraHeaders:[`Event: ${$a.event_type};id=${this._id}`,`Subscription-State: ${o}`,`Content-Type: ${$a.body_type}`],body:`SIP/2.0 ${s} ${r}`,eventHandlers:{onErrorResponse(){this._active=!1}}})}};const vg=Xe(p_),Eg=ft.EventEmitter,Sg=at,$i=De,yg=ls(),uf=yt(),mn=new Sg("RTCSession:ReferSubscriber");var m_=class extends Eg{constructor(s){super(),this._id=null,this._session=s}get id(){return this._id}sendRefer(s,r={}){mn.debug("sendRefer()");const o=uf.cloneArray(r.extraHeaders),a=uf.cloneObject(r.eventHandlers);for(const _ in a)Object.prototype.hasOwnProperty.call(a,_)&&this.on(_,a[_]);let t=null;r.replaces&&(t=r.replaces._request.call_id,t+=`;to-tag=${r.replaces._to_tag}`,t+=`;from-tag=${r.replaces._from_tag}`,t=encodeURIComponent(t));const n=`Refer-To: <${s}${t?`?Replaces=${t}`:""}>`;if(o.push(n),!o.some(_=>_.toLowerCase().startsWith("referred-by:"))){const _=`Referred-By: <${this._session._ua._configuration.uri._scheme}:${this._session._ua._configuration.uri._user}@${this._session._ua._configuration.uri._host}>`;o.push(_)}o.push(`Contact: ${this._session.contact}`);const p=this._session.sendRequest($i.REFER,{extraHeaders:o,eventHandlers:{onSuccessResponse:_=>{this._requestSucceeded(_)},onErrorResponse:_=>{this._requestFailed(_,$i.causes.REJECTED)},onTransportError:()=>{this._requestFailed(null,$i.causes.CONNECTION_ERROR)},onRequestTimeout:()=>{this._requestFailed(null,$i.causes.REQUEST_TIMEOUT)},onDialogError:()=>{this._requestFailed(null,$i.causes.DIALOG_ERROR)}}});this._id=p.cseq}receiveNotify(s){if(mn.debug("receiveNotify()"),!s.body)return;const r=yg.parse(s.body.trim().split(`\r
|
115
|
+
`,1)[0],"Status_Line");if(r===-1){mn.debug(`receiveNotify() | error parsing NOTIFY body: "${s.body}"`);return}switch(!0){case/^100$/.test(r.status_code):this.emit("trying",{request:s,status_line:r});break;case/^1[0-9]{2}$/.test(r.status_code):this.emit("progress",{request:s,status_line:r});break;case/^2[0-9]{2}$/.test(r.status_code):this.emit("accepted",{request:s,status_line:r});break;default:this.emit("failed",{request:s,status_line:r});break}}_requestSucceeded(s){mn.debug("REFER succeeded"),mn.debug('emit "requestSucceeded"'),this.emit("requestSucceeded",{response:s})}_requestFailed(s,r){mn.debug("REFER failed"),mn.debug('emit "requestFailed"'),this.emit("requestFailed",{response:s||null,cause:r})}};const Ag=Xe(m_),Cg=ft.EventEmitter,cf=Ut,Rg=at,fe=De,gn=Es,ff=pr,Be=yt(),Hi=Uu,Ig=Pt,Xl=f_,bg=mr,Mt=h_,_f=d_,wg=p_,Og=m_,hf=vs(),Y=new Rg("RTCSession"),Z={STATUS_NULL:0,STATUS_INVITE_SENT:1,STATUS_1XX_RECEIVED:2,STATUS_INVITE_RECEIVED:3,STATUS_WAITING_FOR_ANSWER:4,STATUS_ANSWERED:5,STATUS_WAITING_FOR_ACK:6,STATUS_CANCELED:7,STATUS_TERMINATED:8,STATUS_CONFIRMED:9},Ql=["audio","video"];var g_=class mu extends Cg{static get C(){return Z}constructor(s){Y.debug("new"),super(),this._id=null,this._ua=s,this._status=Z.STATUS_NULL,this._dialog=null,this._earlyDialogs={},this._contact=null,this._from_tag=null,this._to_tag=null,this._connection=null,this._connectionPromiseQueue=Promise.resolve(),this._request=null,this._is_canceled=!1,this._cancel_reason="",this._is_confirmed=!1,this._late_sdp=!1,this._rtcOfferConstraints=null,this._rtcAnswerConstraints=null,this._localMediaStream=null,this._localMediaStreamLocallyGenerated=!1,this._rtcReady=!0,this._iceReady=!1,this._timers={ackTimer:null,expiresTimer:null,invite2xxTimer:null,userNoAnswerTimer:null},this._direction=null,this._local_identity=null,this._remote_identity=null,this._start_time=null,this._end_time=null,this._tones=null,this._audioMuted=!1,this._videoMuted=!1,this._localHold=!1,this._remoteHold=!1,this._sessionTimers={enabled:this._ua.configuration.session_timers,refreshMethod:this._ua.configuration.session_timers_refresh_method,defaultExpires:fe.SESSION_EXPIRES,currentExpires:null,running:!1,refresher:!1,timer:null},this._referSubscribers={},this._data={}}get C(){return Z}get causes(){return fe.causes}get id(){return this._id}get connection(){return this._connection}get contact(){return this._contact}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}get start_time(){return this._start_time}get end_time(){return this._end_time}get data(){return this._data}set data(s){this._data=s}get status(){return this._status}isInProgress(){switch(this._status){case Z.STATUS_NULL:case Z.STATUS_INVITE_SENT:case Z.STATUS_1XX_RECEIVED:case Z.STATUS_INVITE_RECEIVED:case Z.STATUS_WAITING_FOR_ANSWER:return!0;default:return!1}}isEstablished(){switch(this._status){case Z.STATUS_ANSWERED:case Z.STATUS_WAITING_FOR_ACK:case Z.STATUS_CONFIRMED:return!0;default:return!1}}isEnded(){switch(this._status){case Z.STATUS_CANCELED:case Z.STATUS_TERMINATED:return!0;default:return!1}}isMuted(){return{audio:this._audioMuted,video:this._videoMuted}}isOnHold(){return{local:this._localHold,remote:this._remoteHold}}connect(s,r={},o){Y.debug("connect()");const a=s,t=Be.cloneObject(r.eventHandlers),n=Be.cloneArray(r.extraHeaders),p=Be.cloneObject(r.mediaConstraints,{audio:!0,video:!0}),_=r.mediaStream||null,d=Be.cloneObject(r.pcConfig,{iceServers:[]}),g=r.rtcConstraints||null,T=r.rtcOfferConstraints||null;if(this._rtcOfferConstraints=T,this._rtcAnswerConstraints=r.rtcAnswerConstraints||null,this._data=r.data||this._data,s===void 0)throw new TypeError("Not enough arguments");if(this._status!==Z.STATUS_NULL)throw new gn.InvalidStateError(this._status);if(!window.RTCPeerConnection)throw new gn.NotSupportedError("WebRTC not supported");if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${a}`);this._sessionTimers.enabled&&Be.isDecimal(r.sessionTimersExpires)&&(r.sessionTimersExpires>=fe.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=r.sessionTimersExpires:this._sessionTimers.defaultExpires=fe.SESSION_EXPIRES);for(const A in t)Object.prototype.hasOwnProperty.call(t,A)&&this.on(A,t[A]);this._from_tag=Be.newTag();const E=r.anonymous||!1,y={from_tag:this._from_tag};this._contact=this._ua.contact.toString({anonymous:E,outbound:!0}),E?(y.from_display_name="Anonymous",y.from_uri=new hf("sip","anonymous","anonymous.invalid"),n.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`),n.push("Privacy: id")):r.fromUserName&&(y.from_uri=new hf("sip",r.fromUserName,this._ua.configuration.uri.host),n.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`)),r.fromDisplayName&&(y.from_display_name=r.fromDisplayName),n.push(`Contact: ${this._contact}`),n.push("Content-Type: application/sdp"),this._sessionTimers.enabled&&n.push(`Session-Expires: ${this._sessionTimers.defaultExpires}${this._ua.configuration.session_timers_force_refresher?";refresher=uac":""}`),this._request=new Ig.InitialOutgoingInviteRequest(s,this._ua,y,n),this._id=this._request.call_id+this._from_tag,this._createRTCConnection(d,g),this._direction="outgoing",this._local_identity=this._request.from,this._remote_identity=this._request.to,o&&o(this),this._newRTCSession("local",this._request),this._sendInitialRequest(p,T,_)}init_incoming(s,r){Y.debug("init_incoming()");let o;const a=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;if(s.body&&a!=="application/sdp"){s.reply(415);return}if(this._status=Z.STATUS_INVITE_RECEIVED,this._from_tag=s.from_tag,this._id=s.call_id+this._from_tag,this._request=s,this._contact=this._ua.contact.toString(),s.hasHeader("expires")&&(o=s.getHeader("expires")*1e3),s.to_tag=Be.newTag(),!this._createDialog(s,"UAS",!0)){s.reply(500,"Missing Contact header field");return}s.body?this._late_sdp=!1:this._late_sdp=!0,this._status=Z.STATUS_WAITING_FOR_ANSWER,this._timers.userNoAnswerTimer=setTimeout(()=>{s.reply(408),this._failed("local",null,fe.causes.NO_ANSWER)},this._ua.configuration.no_answer_timeout),o&&(this._timers.expiresTimer=setTimeout(()=>{this._status===Z.STATUS_WAITING_FOR_ANSWER&&(s.reply(487),this._failed("system",null,fe.causes.EXPIRES))},o)),this._direction="incoming",this._local_identity=s.to,this._remote_identity=s.from,r&&r(this),this._newRTCSession("remote",s),this._status!==Z.STATUS_TERMINATED&&(s.reply(180,null,[`Contact: ${this._contact}`]),this._progress("local",null))}answer(s={}){Y.debug("answer()");const r=this._request,o=Be.cloneArray(s.extraHeaders),a=Be.cloneObject(s.mediaConstraints),t=s.mediaStream||null,n=Be.cloneObject(s.pcConfig,{iceServers:[]}),p=s.rtcConstraints||null,_=s.rtcAnswerConstraints||null,d=Be.cloneObject(s.rtcOfferConstraints);let g,T=!1,E=!1,y=!1,A=!1;if(this._rtcAnswerConstraints=_,this._rtcOfferConstraints=s.rtcOfferConstraints||null,this._data=s.data||this._data,this._direction!=="incoming")throw new gn.NotSupportedError('"answer" not supported for outgoing RTCSession');if(this._status!==Z.STATUS_WAITING_FOR_ANSWER)throw new gn.InvalidStateError(this._status);if(this._sessionTimers.enabled&&Be.isDecimal(s.sessionTimersExpires)&&(s.sessionTimersExpires>=fe.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=s.sessionTimersExpires:this._sessionTimers.defaultExpires=fe.SESSION_EXPIRES),this._status=Z.STATUS_ANSWERED,!this._createDialog(r,"UAS")){r.reply(500,"Error creating dialog");return}clearTimeout(this._timers.userNoAnswerTimer),o.unshift(`Contact: ${this._contact}`);const C=r.parseSDP();Array.isArray(C.media)||(C.media=[C.media]);for(const I of C.media)I.type==="audio"&&(T=!0,(!I.direction||I.direction==="sendrecv")&&(y=!0)),I.type==="video"&&(E=!0,(!I.direction||I.direction==="sendrecv")&&(A=!0));if(t&&a.audio===!1){g=t.getAudioTracks();for(const I of g)t.removeTrack(I)}if(t&&a.video===!1){g=t.getVideoTracks();for(const I of g)t.removeTrack(I)}!t&&a.audio===void 0&&(a.audio=y),!t&&a.video===void 0&&(a.video=A),!t&&!T&&!d.offerToReceiveAudio&&(a.audio=!1),!t&&!E&&!d.offerToReceiveVideo&&(a.video=!1),this._createRTCConnection(n,p),Promise.resolve().then(()=>{if(t)return t;if(a.audio||a.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(a).catch(I=>{throw this._status===Z.STATUS_TERMINATED?new Error("terminated"):(r.reply(480),this._failed("local",null,fe.causes.USER_DENIED_MEDIA_ACCESS),Y.warn('emit "getusermediafailed" [error:%o]',I),this.emit("getusermediafailed",I),new Error("getUserMedia() failed"))})}).then(I=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._localMediaStream=I,I&&I.getTracks().forEach($=>{this._connection.addTrack($,I)})}).then(()=>{if(this._late_sdp)return;const I={originator:"remote",type:"offer",sdp:r.body};Y.debug('emit "sdp"'),this.emit("sdp",I);const $=new RTCSessionDescription({type:"offer",sdp:I.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription($)).catch(L=>{throw r.reply(488),this._failed("system",null,fe.causes.WEBRTC_ERROR),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',L),this.emit("peerconnection:setremotedescriptionfailed",L),new Error("peerconnection.setRemoteDescription() failed")}),this._connectionPromiseQueue}).then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._connecting(r),this._late_sdp?this._createLocalDescription("offer",this._rtcOfferConstraints).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")}):this._createLocalDescription("answer",_).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")})}).then(I=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._handleSessionTimersInIncomingRequest(r,o),r.reply(200,null,o,I,()=>{this._status=Z.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(r,I),this._setACKTimer(),this._accepted("local")},()=>{this._failed("system",null,fe.causes.CONNECTION_ERROR)})}).catch(I=>{this._status!==Z.STATUS_TERMINATED&&Y.warn(I)})}terminate(s={}){Y.debug("terminate()");const r=s.cause||fe.causes.BYE,o=Be.cloneArray(s.extraHeaders),a=s.body;let t,n=s.status_code,p=s.reason_phrase;if(this._status===Z.STATUS_TERMINATED)throw new gn.InvalidStateError(this._status);switch(this._status){case Z.STATUS_NULL:case Z.STATUS_INVITE_SENT:case Z.STATUS_1XX_RECEIVED:if(Y.debug("canceling session"),n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);n&&(p=p||fe.REASON_PHRASE[n]||"",t=`SIP ;cause=${n} ;text="${p}"`),this._status===Z.STATUS_NULL||this._status===Z.STATUS_INVITE_SENT?(this._is_canceled=!0,this._cancel_reason=t):this._status===Z.STATUS_1XX_RECEIVED&&this._request.cancel(t),this._status=Z.STATUS_CANCELED,this._failed("local",null,fe.causes.CANCELED);break;case Z.STATUS_WAITING_FOR_ANSWER:case Z.STATUS_ANSWERED:if(Y.debug("rejecting session"),n=n||480,n<300||n>=700)throw new TypeError(`Invalid status_code: ${n}`);this._request.reply(n,p,o,a),this._failed("local",null,fe.causes.REJECTED);break;case Z.STATUS_WAITING_FOR_ACK:case Z.STATUS_CONFIRMED:if(Y.debug("terminating session"),p=s.reason_phrase||fe.REASON_PHRASE[n]||"",n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);if(n&&o.push(`Reason: SIP ;cause=${n}; text="${p}"`),this._status===Z.STATUS_WAITING_FOR_ACK&&this._direction==="incoming"&&this._request.server_transaction.state!==ff.C.STATUS_TERMINATED){const _=this._dialog;this.receiveRequest=({method:d})=>{d===fe.ACK&&(this.sendRequest(fe.BYE,{extraHeaders:o,body:a}),_.terminate())},this._request.server_transaction.on("stateChanged",()=>{this._request.server_transaction.state===ff.C.STATUS_TERMINATED&&(this.sendRequest(fe.BYE,{extraHeaders:o,body:a}),_.terminate())}),this._ended("local",null,r),this._dialog=_,this._ua.newDialog(_)}else this.sendRequest(fe.BYE,{extraHeaders:o,body:a}),this._ended("local",null,r)}}sendDTMF(s,r={}){Y.debug("sendDTMF() | tones: %s",s);let o=0,a=r.duration||null,t=r.interToneGap||null;const n=r.transportType||fe.DTMF_TRANSPORT.INFO;if(s===void 0)throw new TypeError("Not enough arguments");if(this._status!==Z.STATUS_CONFIRMED&&this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_1XX_RECEIVED)throw new gn.InvalidStateError(this._status);if(n!==fe.DTMF_TRANSPORT.INFO&&n!==fe.DTMF_TRANSPORT.RFC2833)throw new TypeError(`invalid transportType: ${n}`);if(typeof s=="number"&&(s=s.toString()),!s||typeof s!="string"||!s.match(/^[0-9A-DR#*,]+$/i))throw new TypeError(`Invalid tones: ${s}`);if(a&&!Be.isDecimal(a))throw new TypeError(`Invalid tone duration: ${a}`);if(a?a<Mt.C.MIN_DURATION?(Y.debug(`"duration" value is lower than the minimum allowed, setting it to ${Mt.C.MIN_DURATION} milliseconds`),a=Mt.C.MIN_DURATION):a>Mt.C.MAX_DURATION?(Y.debug(`"duration" value is greater than the maximum allowed, setting it to ${Mt.C.MAX_DURATION} milliseconds`),a=Mt.C.MAX_DURATION):a=Math.abs(a):a=Mt.C.DEFAULT_DURATION,r.duration=a,t&&!Be.isDecimal(t))throw new TypeError(`Invalid interToneGap: ${t}`);if(t?t<Mt.C.MIN_INTER_TONE_GAP?(Y.debug(`"interToneGap" value is lower than the minimum allowed, setting it to ${Mt.C.MIN_INTER_TONE_GAP} milliseconds`),t=Mt.C.MIN_INTER_TONE_GAP):t=Math.abs(t):t=Mt.C.DEFAULT_INTER_TONE_GAP,n===fe.DTMF_TRANSPORT.RFC2833){const _=this._getDTMFRTPSender();_&&(s=_.toneBuffer+s,_.insertDTMF(s,a,t));return}if(this._tones){this._tones+=s;return}this._tones=s,p.call(this);function p(){let _;if(this._status===Z.STATUS_TERMINATED||!this._tones||o>=this._tones.length){this._tones=null;return}const d=this._tones[o];if(o+=1,d===",")_=2e3;else{const g=new Mt(this);r.eventHandlers={onFailed:()=>{this._tones=null}},g.send(d,r),_=a+t}setTimeout(p.bind(this),_)}}sendInfo(s,r,o={}){if(Y.debug("sendInfo()"),this._status!==Z.STATUS_CONFIRMED&&this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_1XX_RECEIVED)throw new gn.InvalidStateError(this._status);new _f(this).send(s,r,o)}mute(s={audio:!0,video:!1}){Y.debug("mute()");let r=!1,o=!1;this._audioMuted===!1&&s.audio&&(r=!0,this._audioMuted=!0,this._toggleMuteAudio(!0)),this._videoMuted===!1&&s.video&&(o=!0,this._videoMuted=!0,this._toggleMuteVideo(!0)),(r===!0||o===!0)&&this._onmute({audio:r,video:o})}unmute(s={audio:!0,video:!0}){Y.debug("unmute()");let r=!1,o=!1;this._audioMuted===!0&&s.audio&&(r=!0,this._audioMuted=!1,this._localHold===!1&&this._toggleMuteAudio(!1)),this._videoMuted===!0&&s.video&&(o=!0,this._videoMuted=!1,this._localHold===!1&&this._toggleMuteVideo(!1)),(r===!0||o===!0)&&this._onunmute({audio:r,video:o})}hold(s={},r){if(Y.debug("hold()"),this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED||this._localHold===!0||!this._isReadyToReOffer())return!1;this._localHold=!0,this._onhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:fe.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Hold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}unhold(s={},r){if(Y.debug("unhold()"),this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED||this._localHold===!1||!this._isReadyToReOffer())return!1;this._localHold=!1,this._onunhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:fe.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Unhold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}renegotiate(s={},r){Y.debug("renegotiate()");const o=s.rtcOfferConstraints||null;if(this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED||!this._isReadyToReOffer())return!1;const a={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:fe.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Media Renegotiation Failed"})}};return this._setLocalMediaStatus(),s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}),!0}refer(s,r){Y.debug("refer()");const o=s;if(this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED)return!1;if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${o}`);const a=new Og(this);a.sendRefer(s,r);const t=a.id;return this._referSubscribers[t]=a,a.on("requestFailed",()=>{delete this._referSubscribers[t]}),a.on("accepted",()=>{delete this._referSubscribers[t]}),a.on("failed",()=>{delete this._referSubscribers[t]}),a}sendRequest(s,r){return Y.debug("sendRequest()"),this._dialog.sendRequest(s,r)}receiveRequest(s){if(Y.debug("receiveRequest()"),s.method===fe.CANCEL)(this._status===Z.STATUS_WAITING_FOR_ANSWER||this._status===Z.STATUS_ANSWERED)&&(this._status=Z.STATUS_CANCELED,this._request.reply(487),this._failed("remote",s,fe.causes.CANCELED));else switch(s.method){case fe.ACK:if(this._status!==Z.STATUS_WAITING_FOR_ACK)return;if(this._status=Z.STATUS_CONFIRMED,clearTimeout(this._timers.ackTimer),clearTimeout(this._timers.invite2xxTimer),this._late_sdp){if(!s.body){this.terminate({cause:fe.causes.MISSING_SDP,status_code:400});break}const r={originator:"remote",type:"answer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>{this._is_confirmed||this._confirmed("remote",s)}).catch(a=>{this.terminate({cause:fe.causes.BAD_MEDIA_DESCRIPTION,status_code:488}),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})}else this._is_confirmed||this._confirmed("remote",s);break;case fe.BYE:this._status===Z.STATUS_CONFIRMED||this._status===Z.STATUS_WAITING_FOR_ACK?(s.reply(200),this._ended("remote",s,fe.causes.BYE)):this._status===Z.STATUS_INVITE_RECEIVED||this._status===Z.STATUS_WAITING_FOR_ANSWER?(s.reply(200),this._request.reply(487,"BYE Received"),this._ended("remote",s,fe.causes.BYE)):s.reply(403,"Wrong Status");break;case fe.INVITE:this._status===Z.STATUS_CONFIRMED?s.hasHeader("replaces")?this._receiveReplaces(s):this._receiveReinvite(s):s.reply(403,"Wrong Status");break;case fe.INFO:if(this._status===Z.STATUS_1XX_RECEIVED||this._status===Z.STATUS_WAITING_FOR_ANSWER||this._status===Z.STATUS_ANSWERED||this._status===Z.STATUS_WAITING_FOR_ACK||this._status===Z.STATUS_CONFIRMED){const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;r&&r.match(/^application\/dtmf-relay/i)?new Mt(this).init_incoming(s):r!==void 0?new _f(this).init_incoming(s):s.reply(415)}else s.reply(403,"Wrong Status");break;case fe.UPDATE:this._status===Z.STATUS_CONFIRMED?this._receiveUpdate(s):s.reply(403,"Wrong Status");break;case fe.REFER:this._status===Z.STATUS_CONFIRMED?this._receiveRefer(s):s.reply(403,"Wrong Status");break;case fe.NOTIFY:this._status===Z.STATUS_CONFIRMED?this._receiveNotify(s):s.reply(403,"Wrong Status");break;default:s.reply(501)}}onTransportError(){Y.warn("onTransportError()"),this._status!==Z.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:fe.causes.CONNECTION_ERROR,cause:fe.causes.CONNECTION_ERROR})}onRequestTimeout(){Y.warn("onRequestTimeout()"),this._status!==Z.STATUS_TERMINATED&&this.terminate({status_code:408,reason_phrase:fe.causes.REQUEST_TIMEOUT,cause:fe.causes.REQUEST_TIMEOUT})}onDialogError(){Y.warn("onDialogError()"),this._status!==Z.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:fe.causes.DIALOG_ERROR,cause:fe.causes.DIALOG_ERROR})}newDTMF(s){Y.debug("newDTMF()"),this.emit("newDTMF",s)}newInfo(s){Y.debug("newInfo()"),this.emit("newInfo",s)}_isReadyToReOffer(){return this._rtcReady?this._dialog?this._dialog.uac_pending_reply===!0||this._dialog.uas_pending_reply===!0?(Y.debug("_isReadyToReOffer() | there is another INVITE/UPDATE transaction in progress"),!1):!0:(Y.debug("_isReadyToReOffer() | session not established yet"),!1):(Y.debug("_isReadyToReOffer() | internal WebRTC status not ready"),!1)}_close(){if(Y.debug("close()"),this._localMediaStream&&this._localMediaStreamLocallyGenerated&&(Y.debug("close() | closing local MediaStream"),Be.closeMediaStream(this._localMediaStream)),this._status!==Z.STATUS_TERMINATED){if(this._status=Z.STATUS_TERMINATED,this._connection)try{this._connection.close()}catch(s){Y.warn("close() | error closing the RTCPeerConnection: %o",s)}for(const s in this._timers)Object.prototype.hasOwnProperty.call(this._timers,s)&&clearTimeout(this._timers[s]);clearTimeout(this._sessionTimers.timer),this._dialog&&(this._dialog.terminate(),delete this._dialog);for(const s in this._earlyDialogs)Object.prototype.hasOwnProperty.call(this._earlyDialogs,s)&&(this._earlyDialogs[s].terminate(),delete this._earlyDialogs[s]);for(const s in this._referSubscribers)Object.prototype.hasOwnProperty.call(this._referSubscribers,s)&&delete this._referSubscribers[s];this._ua.destroyRTCSession(this)}}_setInvite2xxTimer(s,r){let o=Hi.T1;function a(){this._status===Z.STATUS_WAITING_FOR_ACK&&(s.reply(200,null,[`Contact: ${this._contact}`],r),o<Hi.T2&&(o=o*2,o>Hi.T2&&(o=Hi.T2)),this._timers.invite2xxTimer=setTimeout(a.bind(this),o))}this._timers.invite2xxTimer=setTimeout(a.bind(this),o)}_setACKTimer(){this._timers.ackTimer=setTimeout(()=>{this._status===Z.STATUS_WAITING_FOR_ACK&&(Y.debug("no ACK received, terminating the session"),clearTimeout(this._timers.invite2xxTimer),this.sendRequest(fe.BYE),this._ended("remote",null,fe.causes.NO_ACK))},Hi.TIMER_H)}_createRTCConnection(s,r){this._connection=new RTCPeerConnection(s,r),this._connection.addEventListener("iceconnectionstatechange",()=>{this._connection.iceConnectionState==="failed"&&this.terminate({cause:fe.causes.RTP_TIMEOUT,status_code:408,reason_phrase:fe.causes.RTP_TIMEOUT})}),Y.debug('emit "peerconnection"'),this.emit("peerconnection",{peerconnection:this._connection})}_createLocalDescription(s,r){if(Y.debug("createLocalDescription()"),s!=="offer"&&s!=="answer")throw new Error(`createLocalDescription() | invalid type "${s}"`);const o=this._connection;return this._rtcReady=!1,Promise.resolve().then(()=>s==="offer"?o.createOffer(r).catch(a=>(Y.warn('emit "peerconnection:createofferfailed" [error:%o]',a),this.emit("peerconnection:createofferfailed",a),Promise.reject(a))):o.createAnswer(r).catch(a=>(Y.warn('emit "peerconnection:createanswerfailed" [error:%o]',a),this.emit("peerconnection:createanswerfailed",a),Promise.reject(a)))).then(a=>o.setLocalDescription(a).catch(t=>(this._rtcReady=!0,Y.warn('emit "peerconnection:setlocaldescriptionfailed" [error:%o]',t),this.emit("peerconnection:setlocaldescriptionfailed",t),Promise.reject(t)))).then(()=>{const a=r&&r.iceRestart;if(o.iceGatheringState==="complete"&&!a||o.iceGatheringState==="gathering"&&this._iceReady){this._rtcReady=!0;const t={originator:"local",type:s,sdp:o.localDescription.sdp};return Y.debug('emit "sdp"'),this.emit("sdp",t),Promise.resolve(t.sdp)}return new Promise(t=>{let n=!1,p,_;this._iceReady=!1;const d=()=>{o.removeEventListener("icecandidate",p),o.removeEventListener("icegatheringstatechange",_),n=!0,this._rtcReady=!0,this._iceReady=!0;const g={originator:"local",type:s,sdp:o.localDescription.sdp};Y.debug('emit "sdp"'),this.emit("sdp",g),t(g.sdp)};o.addEventListener("icecandidate",p=g=>{const T=g.candidate;T?this.emit("icecandidate",{candidate:T,ready:d}):n||d()}),o.addEventListener("icegatheringstatechange",_=()=>{o.iceGatheringState==="complete"&&!n&&d()})})})}_createDialog(s,r,o){const a=r==="UAS"?s.to_tag:s.from_tag,t=r==="UAS"?s.from_tag:s.to_tag,n=s.call_id+a+t;let p=this._earlyDialogs[n];if(o)return p?!0:(p=new Xl(this,s,r,Xl.C.STATUS_EARLY),p.error?(Y.debug(p.error),this._failed("remote",s,fe.causes.INTERNAL_ERROR),!1):(this._earlyDialogs[n]=p,!0));{if(this._from_tag=s.from_tag,this._to_tag=s.to_tag,p)return p.update(s,r),this._dialog=p,delete this._earlyDialogs[n],!0;const _=new Xl(this,s,r);return _.error?(Y.debug(_.error),this._failed("remote",s,fe.causes.INTERNAL_ERROR),!1):(this._dialog=_,!0)}}_receiveReinvite(s){Y.debug("receiveReinvite()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Be.cloneArray(p.extraHeaders);if(this._status!==Z.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("reinvite",o),a)return;if(this._late_sdp=!1,!s.body){this._late_sdp=!0,this._remoteHold&&(this._remoteHold=!1,this._onunhold("remote")),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",this._rtcOfferConstraints)).then(p=>{n.call(this,p)}).catch(()=>{s.reply(500)});return}if(r!=="application/sdp"){Y.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==Z.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{Y.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),this._late_sdp&&(p=this._mangleOffer(p)),s.reply(200,null,_,p,()=>{this._status=Z.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(s,p),this._setACKTimer()}),typeof o.callback=="function"&&o.callback()}}_receiveUpdate(s){Y.debug("receiveUpdate()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Be.cloneArray(p.extraHeaders);if(this._status!==Z.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("update",o),a)return;if(!s.body){n.call(this,null);return}if(r!=="application/sdp"){Y.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==Z.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{Y.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),s.reply(200,null,_,p),typeof o.callback=="function"&&o.callback()}}_processInDialogSdpOffer(s){Y.debug("_processInDialogSdpOffer()");const r=s.parseSDP();let o=!1;for(const n of r.media){if(Ql.indexOf(n.type)===-1)continue;const p=n.direction||r.direction||"sendrecv";if(p==="sendonly"||p==="inactive")o=!0;else{o=!1;break}}const a={originator:"remote",type:"offer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",a);const t=new RTCSessionDescription({type:"offer",sdp:a.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._connection.setRemoteDescription(t).catch(n=>{throw s.reply(488),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',n),this.emit("peerconnection:setremotedescriptionfailed",n),n})}).then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._remoteHold===!0&&o===!1?(this._remoteHold=!1,this._onunhold("remote")):this._remoteHold===!1&&o===!0&&(this._remoteHold=!0,this._onhold("remote"))}).then(()=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._createLocalDescription("answer",this._rtcAnswerConstraints).catch(n=>{throw s.reply(500),Y.warn('emit "peerconnection:createtelocaldescriptionfailed" [error:%o]',n),n})}).catch(n=>{Y.warn("_processInDialogSdpOffer() failed [error: %o]",n)}),this._connectionPromiseQueue}_receiveRefer(s){if(Y.debug("receiveRefer()"),!s.refer_to){Y.debug("no Refer-To header field present in REFER"),s.reply(400);return}if(s.refer_to.uri.scheme!==fe.SIP){Y.debug("Refer-To header field points to a non-SIP URI scheme"),s.reply(416);return}s.reply(202);const r=new wg(this,s.cseq);Y.debug('emit "refer"'),this.emit("refer",{request:s,accept:(t,n)=>{o.call(this,t,n)},reject:()=>{a.call(this)}});function o(t,n={}){if(t=typeof t=="function"?t:null,this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED)return!1;const p=new mu(this._ua);if(p.on("progress",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("accepted",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("_failed",({message:_,cause:d})=>{_?r.notify(_.status_code,_.reason_phrase):r.notify(487,d)}),s.refer_to.uri.hasHeader("replaces")){const _=decodeURIComponent(s.refer_to.uri.getHeader("replaces"));n.extraHeaders=Be.cloneArray(n.extraHeaders),n.extraHeaders.push(`Replaces: ${_}`)}p.connect(s.refer_to.uri.toAor(),n,t)}function a(){r.notify(603)}}_receiveNotify(s){switch(Y.debug("receiveNotify()"),s.event||s.reply(400),s.event.event){case"refer":{let r,o;if(s.event.params&&s.event.params.id)r=s.event.params.id,o=this._referSubscribers[r];else if(Object.keys(this._referSubscribers).length===1)o=this._referSubscribers[Object.keys(this._referSubscribers)[0]];else{s.reply(400,"Missing event id parameter");return}if(!o){s.reply(481,"Subscription does not exist");return}o.receiveNotify(s),s.reply(200);break}default:s.reply(489)}}_receiveReplaces(s){Y.debug("receiveReplaces()");function r(a){if(this._status!==Z.STATUS_WAITING_FOR_ACK&&this._status!==Z.STATUS_CONFIRMED)return!1;const t=new mu(this._ua);t.on("confirmed",()=>{this.terminate()}),t.init_incoming(s,a)}function o(){Y.debug("Replaced INVITE rejected by the user"),s.reply(486)}this.emit("replaces",{request:s,accept:a=>{r.call(this,a)},reject:()=>{o.call(this)}})}_sendInitialRequest(s,r,o){const a=new bg(this._ua,this._request,{onRequestTimeout:()=>{this.onRequestTimeout()},onTransportError:()=>{this.onTransportError()},onAuthenticated:t=>{this._request=t},onReceiveResponse:t=>{this._receiveInviteResponse(t)}});Promise.resolve().then(()=>{if(o)return o;if(s.audio||s.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(s).catch(t=>{throw this._status===Z.STATUS_TERMINATED?new Error("terminated"):(this._failed("local",null,fe.causes.USER_DENIED_MEDIA_ACCESS),Y.warn('emit "getusermediafailed" [error:%o]',t),this.emit("getusermediafailed",t),t)})}).then(t=>{if(this._status===Z.STATUS_TERMINATED)throw new Error("terminated");return this._localMediaStream=t,t&&t.getTracks().forEach(n=>{this._connection.addTrack(n,t)}),this._connecting(this._request),this._createLocalDescription("offer",r).catch(n=>{throw this._failed("local",null,fe.causes.WEBRTC_ERROR),n})}).then(t=>{if(this._is_canceled||this._status===Z.STATUS_TERMINATED)throw new Error("terminated");this._request.body=t,this._status=Z.STATUS_INVITE_SENT,Y.debug('emit "sending" [request:%o]',this._request),this.emit("sending",{request:this._request}),a.send()}).catch(t=>{this._status!==Z.STATUS_TERMINATED&&Y.warn(t)})}_getDTMFRTPSender(){const s=this._connection.getSenders().find(r=>r.track&&r.track.kind==="audio");if(!(s&&s.dtmf)){Y.warn("sendDTMF() | no local audio track to send DTMF with");return}return s.dtmf}_receiveInviteResponse(s){if(Y.debug("receiveInviteResponse()"),this._dialog&&s.status_code>=200&&s.status_code<=299)if(this._dialog.id.call_id===s.call_id&&this._dialog.id.local_tag===s.from_tag&&this._dialog.id.remote_tag===s.to_tag){this.sendRequest(fe.ACK);return}else{const r=new Xl(this,s,"UAC");if(r.error!==void 0){Y.debug(r.error);return}this.sendRequest(fe.ACK),this.sendRequest(fe.BYE);return}if(this._is_canceled){s.status_code>=100&&s.status_code<200?this._request.cancel(this._cancel_reason):s.status_code>=200&&s.status_code<299&&this._acceptAndTerminate(s);return}if(!(this._status!==Z.STATUS_INVITE_SENT&&this._status!==Z.STATUS_1XX_RECEIVED))switch(!0){case/^100$/.test(s.status_code):this._status=Z.STATUS_1XX_RECEIVED;break;case/^1[0-9]{2}$/.test(s.status_code):{if(!s.to_tag){Y.debug("1xx response received without to tag");break}if(s.hasHeader("contact")&&!this._createDialog(s,"UAC",!0))break;if(this._status=Z.STATUS_1XX_RECEIVED,!s.body){this._progress("remote",s);break}const r={originator:"remote",type:"answer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>this._progress("remote",s)).catch(a=>{Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)});break}case/^2[0-9]{2}$/.test(s.status_code):{if(this._status=Z.STATUS_CONFIRMED,!s.body){this._acceptAndTerminate(s,400,fe.causes.MISSING_SDP),this._failed("remote",s,fe.causes.BAD_MEDIA_DESCRIPTION);break}if(!this._createDialog(s,"UAC"))break;const r={originator:"remote",type:"answer",sdp:s.body};Y.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._connection.signalingState==="stable")return this._connection.createOffer(this._rtcOfferConstraints).then(a=>this._connection.setLocalDescription(a)).catch(a=>{this._acceptAndTerminate(s,500,a.toString()),this._failed("local",s,fe.causes.WEBRTC_ERROR)})}).then(()=>{this._connection.setRemoteDescription(o).then(()=>{this._handleSessionTimersInIncomingResponse(s),this._accepted("remote",s),this.sendRequest(fe.ACK),this._confirmed("local",null)}).catch(a=>{this._acceptAndTerminate(s,488,"Not Acceptable Here"),this._failed("remote",s,fe.causes.BAD_MEDIA_DESCRIPTION),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})});break}default:{const r=Be.sipErrorCause(s.status_code);this._failed("remote",s,r)}}}_sendReinvite(s={}){Y.debug("sendReinvite()");const r=Be.cloneArray(s.extraHeaders),o=Be.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null;let t=!1;r.push(`Contact: ${this._contact}`),r.push("Content-Type: application/sdp"),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(_=>{_=this._mangleOffer(_);const d={originator:"local",type:"offer",sdp:_};Y.debug('emit "sdp"'),this.emit("sdp",d),this.sendRequest(fe.INVITE,{extraHeaders:r,body:_,eventHandlers:{onSuccessResponse:g=>{n.call(this,g),t=!0},onErrorResponse:g=>{p.call(this,g)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{p()});function n(_){if(this._status===Z.STATUS_TERMINATED||(this.sendRequest(fe.ACK),t))return;if(this._handleSessionTimersInIncomingResponse(_),_.body){if(!_.hasHeader("Content-Type")||_.getHeader("Content-Type").toLowerCase()!=="application/sdp"){p.call(this);return}}else{p.call(this);return}const d={originator:"remote",type:"answer",sdp:_.body};Y.debug('emit "sdp"'),this.emit("sdp",d);const g=new RTCSessionDescription({type:"answer",sdp:d.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(g)).then(()=>{o.succeeded&&o.succeeded(_)}).catch(T=>{p.call(this),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',T),this.emit("peerconnection:setremotedescriptionfailed",T)})}function p(_){o.failed&&o.failed(_)}}_sendUpdate(s={}){Y.debug("sendUpdate()");const r=Be.cloneArray(s.extraHeaders),o=Be.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null,t=s.sdpOffer||!1;let n=!1;r.push(`Contact: ${this._contact}`),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),t?(r.push("Content-Type: application/sdp"),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(d=>{d=this._mangleOffer(d);const g={originator:"local",type:"offer",sdp:d};Y.debug('emit "sdp"'),this.emit("sdp",g),this.sendRequest(fe.UPDATE,{extraHeaders:r,body:d,eventHandlers:{onSuccessResponse:T=>{p.call(this,T),n=!0},onErrorResponse:T=>{_.call(this,T)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{_.call(this)})):this.sendRequest(fe.UPDATE,{extraHeaders:r,eventHandlers:{onSuccessResponse:d=>{p.call(this,d)},onErrorResponse:d=>{_.call(this,d)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}});function p(d){if(this._status!==Z.STATUS_TERMINATED&&!n)if(this._handleSessionTimersInIncomingResponse(d),t){if(d.body){if(!d.hasHeader("Content-Type")||d.getHeader("Content-Type").toLowerCase()!=="application/sdp"){_.call(this);return}}else{_.call(this);return}const g={originator:"remote",type:"answer",sdp:d.body};Y.debug('emit "sdp"'),this.emit("sdp",g);const T=new RTCSessionDescription({type:"answer",sdp:g.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(T)).then(()=>{o.succeeded&&o.succeeded(d)}).catch(E=>{_.call(this),Y.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',E),this.emit("peerconnection:setremotedescriptionfailed",E)})}else o.succeeded&&o.succeeded(d)}function _(d){o.failed&&o.failed(d)}}_acceptAndTerminate(s,r,o){Y.debug("acceptAndTerminate()");const a=[];r&&(o=o||fe.REASON_PHRASE[r]||"",a.push(`Reason: SIP ;cause=${r}; text="${o}"`)),(this._dialog||this._createDialog(s,"UAC"))&&(this.sendRequest(fe.ACK),this.sendRequest(fe.BYE,{extraHeaders:a})),this._status=Z.STATUS_TERMINATED}_mangleOffer(s){if(!this._localHold&&!this._remoteHold)return s;if(s=cf.parse(s),this._localHold&&!this._remoteHold){Y.debug("mangleOffer() | me on hold, mangling offer");for(const r of s.media)Ql.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="sendonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="sendonly")}else if(this._localHold&&this._remoteHold){Y.debug("mangleOffer() | both on hold, mangling offer");for(const r of s.media)Ql.indexOf(r.type)!==-1&&(r.direction="inactive")}else if(this._remoteHold){Y.debug("mangleOffer() | remote on hold, mangling offer");for(const r of s.media)Ql.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="recvonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="recvonly")}return cf.write(s)}_setLocalMediaStatus(){let s=!0,r=!0;(this._localHold||this._remoteHold)&&(s=!1,r=!1),this._audioMuted&&(s=!1),this._videoMuted&&(r=!1),this._toggleMuteAudio(!s),this._toggleMuteVideo(!r)}_handleSessionTimersInIncomingRequest(s,r){if(!this._sessionTimers.enabled)return;let o;s.session_expires&&s.session_expires>=fe.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,o=s.session_expires_refresher||"uas"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,o="uas"),r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${o}`),this._sessionTimers.refresher=o==="uas",this._runSessionTimer()}_handleSessionTimersInIncomingResponse(s){if(!this._sessionTimers.enabled)return;let r;s.session_expires&&s.session_expires>=fe.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,r=s.session_expires_refresher||"uac"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,r="uac"),this._sessionTimers.refresher=r==="uac",this._runSessionTimer()}_runSessionTimer(){const s=this._sessionTimers.currentExpires;this._sessionTimers.running=!0,clearTimeout(this._sessionTimers.timer),this._sessionTimers.refresher?this._sessionTimers.timer=setTimeout(()=>{this._status!==Z.STATUS_TERMINATED&&this._isReadyToReOffer()&&(Y.debug("runSessionTimer() | sending session refresh request"),this._sessionTimers.refreshMethod===fe.UPDATE?this._sendUpdate():this._sendReinvite())},s*500):this._sessionTimers.timer=setTimeout(()=>{this._status!==Z.STATUS_TERMINATED&&(Y.warn("runSessionTimer() | timer expired, terminating the session"),this.terminate({cause:fe.causes.REQUEST_TIMEOUT,status_code:408,reason_phrase:"Session Timer Expired"}))},s*1100)}_toggleMuteAudio(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="audio");for(const o of r)o.track.enabled=!s}_toggleMuteVideo(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="video");for(const o of r)o.track.enabled=!s}_newRTCSession(s,r){Y.debug("newRTCSession()"),this._ua.newRTCSession(this,{originator:s,session:this,request:r})}_connecting(s){Y.debug("session connecting"),Y.debug('emit "connecting"'),this.emit("connecting",{request:s})}_progress(s,r){Y.debug("session progress"),Y.debug('emit "progress"'),this.emit("progress",{originator:s,response:r||null})}_accepted(s,r){Y.debug("session accepted"),this._start_time=new Date,Y.debug('emit "accepted"'),this.emit("accepted",{originator:s,response:r||null})}_confirmed(s,r){Y.debug("session confirmed"),this._is_confirmed=!0,Y.debug('emit "confirmed"'),this.emit("confirmed",{originator:s,ack:r||null})}_ended(s,r,o){Y.debug("session ended"),this._end_time=new Date,this._close(),Y.debug('emit "ended"'),this.emit("ended",{originator:s,message:r||null,cause:o})}_failed(s,r,o){Y.debug("session failed"),Y.debug('emit "_failed"'),this.emit("_failed",{originator:s,message:r||null,cause:o}),this._close(),Y.debug('emit "failed"'),this.emit("failed",{originator:s,message:r||null,cause:o})}_onhold(s){Y.debug("session onhold"),this._setLocalMediaStatus(),Y.debug('emit "hold"'),this.emit("hold",{originator:s})}_onunhold(s){Y.debug("session onunhold"),this._setLocalMediaStatus(),Y.debug('emit "unhold"'),this.emit("unhold",{originator:s})}_onmute({audio:s,video:r}){Y.debug("session onmute"),this._setLocalMediaStatus(),Y.debug('emit "muted"'),this.emit("muted",{audio:s,video:r})}_onunmute({audio:s,video:r}){Y.debug("session onunmute"),this._setLocalMediaStatus(),Y.debug('emit "unmuted"'),this.emit("unmuted",{audio:s,video:r})}};const Dg=Xe(g_),Ng=ft.EventEmitter,Ug=at,Ha=De,Pg=Pt,Fi=yt(),xg=mr,df=Es,Mg=vs(),Zl=new Ug("Message");var kg=class extends Ng{constructor(s){super(),this._ua=s,this._request=null,this._closed=!1,this._direction=null,this._local_identity=null,this._remote_identity=null,this._is_replied=!1,this._data={}}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}send(s,r,o={}){const a=s;if(s===void 0||r===void 0)throw new TypeError("Not enough arguments");if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${a}`);const t=Fi.cloneArray(o.extraHeaders),n=Fi.cloneObject(o.eventHandlers),p=o.contentType||"text/plain",_={};o.fromUserName&&(_.from_uri=new Mg("sip",o.fromUserName,this._ua.configuration.uri.host),t.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`)),o.fromDisplayName&&(_.from_display_name=o.fromDisplayName);for(const g in n)Object.prototype.hasOwnProperty.call(n,g)&&this.on(g,n[g]);t.push(`Content-Type: ${p}`),this._request=new Pg.OutgoingRequest(Ha.MESSAGE,s,this._ua,_,t),r&&(this._request.body=r);const d=new xg(this._ua,this._request,{onRequestTimeout:()=>{this._onRequestTimeout()},onTransportError:()=>{this._onTransportError()},onReceiveResponse:g=>{this._receiveResponse(g)}});this._newMessage("local",this._request),d.send()}init_incoming(s){this._request=s,this._newMessage("remote",s),this._is_replied||(this._is_replied=!0,s.reply(200)),this._close()}accept(s={}){const r=Fi.cloneArray(s.extraHeaders),o=s.body;if(this._direction!=="incoming")throw new df.NotSupportedError('"accept" not supported for outgoing Message');if(this._is_replied)throw new Error("incoming Message already replied");this._is_replied=!0,this._request.reply(200,null,r,o)}reject(s={}){const r=s.status_code||480,o=s.reason_phrase,a=Fi.cloneArray(s.extraHeaders),t=s.body;if(this._direction!=="incoming")throw new df.NotSupportedError('"reject" not supported for outgoing Message');if(this._is_replied)throw new Error("incoming Message already replied");if(r<300||r>=700)throw new TypeError(`Invalid status_code: ${r}`);this._is_replied=!0,this._request.reply(r,o,a,t)}_receiveResponse(s){if(!this._closed)switch(!0){case/^1[0-9]{2}$/.test(s.status_code):break;case/^2[0-9]{2}$/.test(s.status_code):this._succeeded("remote",s);break;default:{const r=Fi.sipErrorCause(s.status_code);this._failed("remote",s,r);break}}}_onRequestTimeout(){this._closed||this._failed("system",null,Ha.causes.REQUEST_TIMEOUT)}_onTransportError(){this._closed||this._failed("system",null,Ha.causes.CONNECTION_ERROR)}_close(){this._closed=!0,this._ua.destroyMessage(this)}_newMessage(s,r){s==="remote"?(this._direction="incoming",this._local_identity=r.to,this._remote_identity=r.from):s==="local"&&(this._direction="outgoing",this._local_identity=r.from,this._remote_identity=r.to),this._ua.newMessage(this,{originator:s,message:this,request:r})}_failed(s,r,o){Zl.debug("MESSAGE failed"),this._close(),Zl.debug('emit "failed"'),this.emit("failed",{originator:s,response:r||null,cause:o})}_succeeded(s,r){Zl.debug("MESSAGE succeeded"),this._close(),Zl.debug('emit "succeeded"'),this.emit("succeeded",{originator:s,response:r})}};const Lg=ft.EventEmitter,$g=at,Fa=De,Hg=Pt,ji=yt(),Fg=mr,pf=Es,eo=new $g("Options");var jg=class extends Lg{constructor(s){super(),this._ua=s,this._request=null,this._closed=!1,this._direction=null,this._local_identity=null,this._remote_identity=null,this._is_replied=!1,this._data={}}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}send(s,r,o={}){const a=s;if(s===void 0)throw new TypeError("A target is required for OPTIONS");if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${a}`);const t=ji.cloneArray(o.extraHeaders),n=ji.cloneObject(o.eventHandlers),p=o.contentType||"application/sdp";for(const d in n)Object.prototype.hasOwnProperty.call(n,d)&&this.on(d,n[d]);t.push(`Content-Type: ${p}`),this._request=new Hg.OutgoingRequest(Fa.OPTIONS,s,this._ua,null,t),r&&(this._request.body=r);const _=new Fg(this._ua,this._request,{onRequestTimeout:()=>{this._onRequestTimeout()},onTransportError:()=>{this._onTransportError()},onReceiveResponse:d=>{this._receiveResponse(d)}});this._newOptions("local",this._request),_.send()}init_incoming(s){this._request=s,this._newOptions("remote",s),this._is_replied||(this._is_replied=!0,s.reply(200)),this._close()}accept(s={}){const r=ji.cloneArray(s.extraHeaders),o=s.body;if(this._direction!=="incoming")throw new pf.NotSupportedError('"accept" not supported for outgoing Options');if(this._is_replied)throw new Error("incoming Options already replied");this._is_replied=!0,this._request.reply(200,null,r,o)}reject(s={}){const r=s.status_code||480,o=s.reason_phrase,a=ji.cloneArray(s.extraHeaders),t=s.body;if(this._direction!=="incoming")throw new pf.NotSupportedError('"reject" not supported for outgoing Options');if(this._is_replied)throw new Error("incoming Options already replied");if(r<300||r>=700)throw new TypeError(`Invalid status_code: ${r}`);this._is_replied=!0,this._request.reply(r,o,a,t)}_receiveResponse(s){if(!this._closed)switch(!0){case/^1[0-9]{2}$/.test(s.status_code):break;case/^2[0-9]{2}$/.test(s.status_code):this._succeeded("remote",s);break;default:{const r=ji.sipErrorCause(s.status_code);this._failed("remote",s,r);break}}}_onRequestTimeout(){this._closed||this._failed("system",null,Fa.causes.REQUEST_TIMEOUT)}_onTransportError(){this._closed||this._failed("system",null,Fa.causes.CONNECTION_ERROR)}_close(){this._closed=!0,this._ua.destroyMessage(this)}_newOptions(s,r){s==="remote"?(this._direction="incoming",this._local_identity=r.to,this._remote_identity=r.from):s==="local"&&(this._direction="outgoing",this._local_identity=r.from,this._remote_identity=r.to),this._ua.newOptions(this,{originator:s,message:this,request:r})}_failed(s,r,o){eo.debug("OPTIONS failed"),this._close(),eo.debug('emit "failed"'),this.emit("failed",{originator:s,response:r||null,cause:o})}_succeeded(s,r){eo.debug("OPTIONS succeeded"),this._close(),eo.debug('emit "succeeded"'),this.emit("succeeded",{originator:s,response:r})}},xu={};const Vg=at,ja=yt(),qg=ls(),Vi=new Vg("Socket");xu.isSocket=c=>{if(Array.isArray(c))return!1;if(typeof c>"u")return Vi.warn("undefined JsSIP.Socket instance"),!1;try{if(!ja.isString(c.url))throw Vi.warn("missing or invalid JsSIP.Socket url property"),new Error("Missing or invalid JsSIP.Socket url property");if(!ja.isString(c.via_transport))throw Vi.warn("missing or invalid JsSIP.Socket via_transport property"),new Error("Missing or invalid JsSIP.Socket via_transport property");if(qg.parse(c.sip_uri,"SIP_URI")===-1)throw Vi.warn("missing or invalid JsSIP.Socket sip_uri property"),new Error("missing or invalid JsSIP.Socket sip_uri property")}catch{return!1}try{["connect","disconnect","send"].forEach(s=>{if(!ja.isFunction(c[s]))throw Vi.warn(`missing or invalid JsSIP.Socket method: ${s}`),new Error(`Missing or invalid JsSIP.Socket method: ${s}`)})}catch{return!1}return!0};const Bg=at,Gg=xu,mf=De,Nt=new Bg("Transport"),Vt={STATUS_CONNECTED:0,STATUS_CONNECTING:1,STATUS_DISCONNECTED:2,SOCKET_STATUS_READY:0,SOCKET_STATUS_ERROR:1,recovery_options:{min_interval:mf.CONNECTION_RECOVERY_MIN_INTERVAL,max_interval:mf.CONNECTION_RECOVERY_MAX_INTERVAL}};var T_=class{constructor(s,r=Vt.recovery_options){Nt.debug("new()"),this.status=Vt.STATUS_DISCONNECTED,this.socket=null,this.sockets=[],this.recovery_options=r,this.recover_attempts=0,this.recovery_timer=null,this.close_requested=!1;try{this.textDecoder=new TextDecoder("utf8")}catch(o){Nt.warn(`cannot use TextDecoder: ${o}`)}if(typeof s>"u")throw new TypeError("Invalid argument. undefined 'sockets' argument");s instanceof Array||(s=[s]),s.forEach(function(o){if(!Gg.isSocket(o.socket))throw new TypeError("Invalid argument. invalid 'JsSIP.Socket' instance");if(o.weight&&!Number(o.weight))throw new TypeError("Invalid argument. 'weight' attribute is not a number");this.sockets.push({socket:o.socket,weight:o.weight||0,status:Vt.SOCKET_STATUS_READY})},this),this._getSocket()}get via_transport(){return this.socket.via_transport}get url(){return this.socket.url}get sip_uri(){return this.socket.sip_uri}connect(){if(Nt.debug("connect()"),this.isConnected()){Nt.debug("Transport is already connected");return}else if(this.isConnecting()){Nt.debug("Transport is connecting");return}this.close_requested=!1,this.status=Vt.STATUS_CONNECTING,this.onconnecting({socket:this.socket,attempts:this.recover_attempts}),this.close_requested||(this.socket.onconnect=this._onConnect.bind(this),this.socket.ondisconnect=this._onDisconnect.bind(this),this.socket.ondata=this._onData.bind(this),this.socket.connect())}disconnect(){Nt.debug("close()"),this.close_requested=!0,this.recover_attempts=0,this.status=Vt.STATUS_DISCONNECTED,this.recovery_timer!==null&&(clearTimeout(this.recovery_timer),this.recovery_timer=null),this.socket.onconnect=()=>{},this.socket.ondisconnect=()=>{},this.socket.ondata=()=>{},this.socket.disconnect(),this.ondisconnect({socket:this.socket,error:!1})}send(s){if(Nt.debug("send()"),!this.isConnected())return Nt.warn("unable to send message, transport is not connected"),!1;const r=s.toString();return Nt.debug(`sending message:
|
116
116
|
|
117
117
|
${r}
|
118
118
|
`),this.socket.send(r)}isConnected(){return this.status===Vt.STATUS_CONNECTED}isConnecting(){return this.status===Vt.STATUS_CONNECTING}_reconnect(){this.recover_attempts+=1;let s=Math.floor(Math.random()*Math.pow(2,this.recover_attempts)+1);s<this.recovery_options.min_interval?s=this.recovery_options.min_interval:s>this.recovery_options.max_interval&&(s=this.recovery_options.max_interval),Nt.debug(`reconnection attempt: ${this.recover_attempts}. next connection attempt in ${s} seconds`),this.recovery_timer=setTimeout(()=>{!this.close_requested&&!(this.isConnected()||this.isConnecting())&&(this._getSocket(),this.connect())},s*1e3)}_getSocket(){let s=[];if(this.sockets.forEach(o=>{o.status!==Vt.SOCKET_STATUS_ERROR&&(s.length===0?s.push(o):o.weight>s[0].weight?s=[o]:o.weight===s[0].weight&&s.push(o))}),s.length===0){this.sockets.forEach(o=>{o.status=Vt.SOCKET_STATUS_READY}),this._getSocket();return}const r=Math.floor(Math.random()*s.length);this.socket=s[r].socket}_onConnect(){this.recover_attempts=0,this.status=Vt.STATUS_CONNECTED,this.recovery_timer!==null&&(clearTimeout(this.recovery_timer),this.recovery_timer=null),this.onconnect({socket:this})}_onDisconnect(s,r,o){this.status=Vt.STATUS_DISCONNECTED,this.ondisconnect({socket:this.socket,error:s,code:r,reason:o}),!this.close_requested&&(this.sockets.forEach(function(a){this.socket===a.socket&&(a.status=Vt.SOCKET_STATUS_ERROR)},this),this._reconnect(s))}_onData(s){if(s===`\r
|
@@ -122,17 +122,17 @@ ${s}
|
|
122
122
|
`)}else Nt.debug(`received text message:
|
123
123
|
|
124
124
|
${s}
|
125
|
-
`);this.ondata({transport:this,message:s})}};const Wg=Xe(T_);var Mu={};const Kg=
|
125
|
+
`);this.ondata({transport:this,message:s})}};const Wg=Xe(T_);var Mu={};const Kg=at,gu=ls(),Tu=Pt,to=new Kg("Parser");Mu.parseMessage=(c,s)=>{let r,o,a=c.indexOf(`\r
|
126
126
|
`);if(a===-1){to.warn("parseMessage() | no CRLF found, not a SIP message");return}const t=c.substring(0,a);let n=gu.parse(t,"Request_Response");if(n===-1){to.warn(`parseMessage() | error parsing first line of SIP message: "${t}"`);return}else n.status_code?(r=new Tu.IncomingResponse,r.status_code=n.status_code,r.reason_phrase=n.reason_phrase):(r=new Tu.IncomingRequest(s),r.method=n.method,r.ruri=n.uri);r.data=c;let p=a+2;for(;;){if(a=Yg(c,p),a===-2){o=p+2;break}else if(a===-1){to.warn("parseMessage() | malformed message");return}if(n=zg(r,c,p,a),n!==!0){to.warn("parseMessage() |",n.error);return}p=a+2}if(r.hasHeader("content-length")){const _=r.getHeader("content-length");r.body=c.substr(o,_)}else r.body=c.substring(o);return r};function Yg(c,s){let r=s,o=0,a=0;if(c.substring(r,r+2).match(/(^\r\n)/))return-2;for(;o===0;){if(a=c.indexOf(`\r
|
127
|
-
`,r),a===-1)return a;!c.substring(a+2,a+4).match(/(^\r\n)/)&&c.charAt(a+2).match(/(^\s+)/)?r=a+2:o=a}return o}function zg(c,s,r,o){let a;const t=s.indexOf(":",r),n=s.substring(r,t).trim(),p=s.substring(t+1,o).trim();switch(n.toLowerCase()){case"via":case"v":c.addHeader("via",p),c.getHeaders("via").length===1?(a=c.parseHeader("Via"),a&&(c.via=a,c.via_branch=a.branch)):a=0;break;case"from":case"f":c.setHeader("from",p),a=c.parseHeader("from"),a&&(c.from=a,c.from_tag=a.getParam("tag"));break;case"to":case"t":c.setHeader("to",p),a=c.parseHeader("to"),a&&(c.to=a,c.to_tag=a.getParam("tag"));break;case"record-route":if(a=gu.parse(p,"Record_Route"),a===-1)a=void 0;else for(const _ of a)c.addHeader("record-route",p.substring(_.possition,_.offset)),c.headers["Record-Route"][c.getHeaders("record-route").length-1].parsed=_.parsed;break;case"call-id":case"i":c.setHeader("call-id",p),a=c.parseHeader("call-id"),a&&(c.call_id=p);break;case"contact":case"m":if(a=gu.parse(p,"Contact"),a===-1)a=void 0;else for(const _ of a)c.addHeader("contact",p.substring(_.possition,_.offset)),c.headers.Contact[c.getHeaders("contact").length-1].parsed=_.parsed;break;case"content-length":case"l":c.setHeader("content-length",p),a=c.parseHeader("content-length");break;case"content-type":case"c":c.setHeader("content-type",p),a=c.parseHeader("content-type");break;case"cseq":c.setHeader("cseq",p),a=c.parseHeader("cseq"),a&&(c.cseq=a.value),c instanceof Tu.IncomingResponse&&(c.method=a.method);break;case"max-forwards":c.setHeader("max-forwards",p),a=c.parseHeader("max-forwards");break;case"www-authenticate":c.setHeader("www-authenticate",p),a=c.parseHeader("www-authenticate");break;case"proxy-authenticate":c.setHeader("proxy-authenticate",p),a=c.parseHeader("proxy-authenticate");break;case"session-expires":case"x":c.setHeader("session-expires",p),a=c.parseHeader("session-expires"),a&&(c.session_expires=a.expires,c.session_expires_refresher=a.refresher);break;case"refer-to":case"r":c.setHeader("refer-to",p),a=c.parseHeader("refer-to"),a&&(c.refer_to=a);break;case"replaces":c.setHeader("replaces",p),a=c.parseHeader("replaces"),a&&(c.replaces=a);break;case"event":case"o":c.setHeader("event",p),a=c.parseHeader("event"),a&&(c.event=a);break;default:c.addHeader(n,p),a=0}return a===void 0?{error:`error parsing header "${n}"`}:!0}const Jg=
|
127
|
+
`,r),a===-1)return a;!c.substring(a+2,a+4).match(/(^\r\n)/)&&c.charAt(a+2).match(/(^\s+)/)?r=a+2:o=a}return o}function zg(c,s,r,o){let a;const t=s.indexOf(":",r),n=s.substring(r,t).trim(),p=s.substring(t+1,o).trim();switch(n.toLowerCase()){case"via":case"v":c.addHeader("via",p),c.getHeaders("via").length===1?(a=c.parseHeader("Via"),a&&(c.via=a,c.via_branch=a.branch)):a=0;break;case"from":case"f":c.setHeader("from",p),a=c.parseHeader("from"),a&&(c.from=a,c.from_tag=a.getParam("tag"));break;case"to":case"t":c.setHeader("to",p),a=c.parseHeader("to"),a&&(c.to=a,c.to_tag=a.getParam("tag"));break;case"record-route":if(a=gu.parse(p,"Record_Route"),a===-1)a=void 0;else for(const _ of a)c.addHeader("record-route",p.substring(_.possition,_.offset)),c.headers["Record-Route"][c.getHeaders("record-route").length-1].parsed=_.parsed;break;case"call-id":case"i":c.setHeader("call-id",p),a=c.parseHeader("call-id"),a&&(c.call_id=p);break;case"contact":case"m":if(a=gu.parse(p,"Contact"),a===-1)a=void 0;else for(const _ of a)c.addHeader("contact",p.substring(_.possition,_.offset)),c.headers.Contact[c.getHeaders("contact").length-1].parsed=_.parsed;break;case"content-length":case"l":c.setHeader("content-length",p),a=c.parseHeader("content-length");break;case"content-type":case"c":c.setHeader("content-type",p),a=c.parseHeader("content-type");break;case"cseq":c.setHeader("cseq",p),a=c.parseHeader("cseq"),a&&(c.cseq=a.value),c instanceof Tu.IncomingResponse&&(c.method=a.method);break;case"max-forwards":c.setHeader("max-forwards",p),a=c.parseHeader("max-forwards");break;case"www-authenticate":c.setHeader("www-authenticate",p),a=c.parseHeader("www-authenticate");break;case"proxy-authenticate":c.setHeader("proxy-authenticate",p),a=c.parseHeader("proxy-authenticate");break;case"session-expires":case"x":c.setHeader("session-expires",p),a=c.parseHeader("session-expires"),a&&(c.session_expires=a.expires,c.session_expires_refresher=a.refresher);break;case"refer-to":case"r":c.setHeader("refer-to",p),a=c.parseHeader("refer-to"),a&&(c.refer_to=a);break;case"replaces":c.setHeader("replaces",p),a=c.parseHeader("replaces"),a&&(c.replaces=a);break;case"event":case"o":c.setHeader("event",p),a=c.parseHeader("event"),a&&(c.event=a);break;default:c.addHeader(n,p),a=0}return a===void 0?{error:`error parsing header "${n}"`}:!0}const Jg=at,v_=De,gf=Pt,ku=yt(),Lu=new Jg("sanityCheck"),Xg=[lT],Qg=[eT,tT,sT,nT],Zg=[rT,iT];let Fe,ss,E_;var S_=(c,s,r)=>{Fe=c,ss=s,E_=r;for(const o of Xg)if(o()===!1)return!1;if(Fe instanceof gf.IncomingRequest){for(const o of Qg)if(o()===!1)return!1}else if(Fe instanceof gf.IncomingResponse){for(const o of Zg)if(o()===!1)return!1}return!0};function eT(){if(Fe.s("to").uri.scheme!=="sip")return Qi(416),!1}function tT(){if(!Fe.to_tag&&Fe.call_id.substr(0,5)===ss.configuration.jssip_id)return Qi(482),!1}function sT(){const c=ku.str_utf8_length(Fe.body),s=Fe.getHeader("content-length");if(c<s)return Qi(400),!1}function nT(){const c=Fe.from_tag,s=Fe.call_id,r=Fe.cseq;let o;if(!Fe.to_tag)if(Fe.method===v_.INVITE){if(ss._transactions.ist[Fe.via_branch])return!1;for(const a in ss._transactions.ist)if(Object.prototype.hasOwnProperty.call(ss._transactions.ist,a)&&(o=ss._transactions.ist[a],o.request.from_tag===c&&o.request.call_id===s&&o.request.cseq===r))return Qi(482),!1}else{if(ss._transactions.nist[Fe.via_branch])return!1;for(const a in ss._transactions.nist)if(Object.prototype.hasOwnProperty.call(ss._transactions.nist,a)&&(o=ss._transactions.nist[a],o.request.from_tag===c&&o.request.call_id===s&&o.request.cseq===r))return Qi(482),!1}}function rT(){if(Fe.getHeaders("via").length>1)return Lu.debug("more than one Via header field present in the response, dropping the response"),!1}function iT(){const c=ku.str_utf8_length(Fe.body),s=Fe.getHeader("content-length");if(c<s)return Lu.debug("message body length is lower than the value in Content-Length header field, dropping the response"),!1}function lT(){const c=["from","to","call_id","cseq","via"];for(const s of c)if(!Fe.hasHeader(s))return Lu.debug(`missing mandatory header field : ${s}, dropping the response`),!1}function Qi(c){const s=Fe.getHeaders("via");let r,o=`SIP/2.0 ${c} ${v_.REASON_PHRASE[c]}\r
|
128
128
|
`;for(const a of s)o+=`Via: ${a}\r
|
129
129
|
`;r=Fe.getHeader("To"),Fe.to_tag||(r+=`;tag=${ku.newTag()}`),o+=`To: ${r}\r
|
130
130
|
`,o+=`From: ${Fe.getHeader("From")}\r
|
131
131
|
`,o+=`Call-ID: ${Fe.call_id}\r
|
132
132
|
`,o+=`CSeq: ${Fe.cseq} ${Fe.method}\r
|
133
133
|
`,o+=`\r
|
134
|
-
`,E_.send(o)}const oT=Xe(S_);var Zi={};const ar=yt(),En=De,Va=ls(),Tf=vs(),qa=xu,Ba=Es;Zi.settings={authorization_user:null,password:null,realm:null,ha1:null,authorization_jwt:null,display_name:null,uri:null,contact_uri:null,instance_id:null,use_preloaded_route:!1,session_timers:!0,session_timers_refresh_method:En.UPDATE,session_timers_force_refresher:!1,no_answer_timeout:60,register:!0,register_expires:600,registrar_server:null,sockets:null,connection_recovery_max_interval:En.CONNECTION_RECOVERY_MAX_INTERVAL,connection_recovery_min_interval:En.CONNECTION_RECOVERY_MIN_INTERVAL,extra_headers:null,via_host:`${ar.createRandomToken(12)}.invalid`};const so={mandatory:{sockets(c){const s=[];if(qa.isSocket(c))s.push({socket:c});else if(Array.isArray(c)&&c.length)for(const r of c)Object.prototype.hasOwnProperty.call(r,"socket")&&qa.isSocket(r.socket)?s.push(r):qa.isSocket(r)&&s.push({socket:r});else return;return s},uri(c){/^sip:/i.test(c)||(c=`${En.SIP}:${c}`);const s=Tf.parse(c);if(s)return s.user?s:void 0}},optional:{authorization_user(c){if(Va.parse(`"${c}"`,"quoted_string")!==-1)return c},authorization_jwt(c){if(typeof c=="string")return c},user_agent(c){if(typeof c=="string")return c},connection_recovery_max_interval(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},connection_recovery_min_interval(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},contact_uri(c){if(typeof c=="string"){const s=Va.parse(c,"SIP_URI");if(s!==-1)return s}},display_name(c){return c},instance_id(c){if(/^uuid:/i.test(c)&&(c=c.substr(5)),Va.parse(c,"uuid")!==-1)return c},no_answer_timeout(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},session_timers(c){if(typeof c=="boolean")return c},session_timers_refresh_method(c){if(typeof c=="string"&&(c=c.toUpperCase(),c===En.INVITE||c===En.UPDATE))return c},session_timers_force_refresher(c){if(typeof c=="boolean")return c},password(c){return String(c)},realm(c){return String(c)},ha1(c){return String(c)},register(c){if(typeof c=="boolean")return c},register_expires(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},registrar_server(c){/^sip:/i.test(c)||(c=`${En.SIP}:${c}`);const s=Tf.parse(c);if(s)return s.user?void 0:s},use_preloaded_route(c){if(typeof c=="boolean")return c},extra_headers(c){const s=[];if(Array.isArray(c)&&c.length)for(const r of c)typeof r=="string"&&s.push(r);else return;return s}}};Zi.load=(c,s)=>{for(const r in so.mandatory)if(s.hasOwnProperty(r)){const o=s[r],a=so.mandatory[r](o);if(a!==void 0)c[r]=a;else throw new Ba.ConfigurationError(r,o)}else throw new Ba.ConfigurationError(r);for(const r in so.optional)if(s.hasOwnProperty(r)){const o=s[r];if(ar.isEmpty(o))continue;const a=so.optional[r](o);if(a!==void 0)c[r]=a;else throw new Ba.ConfigurationError(r,o)}};const aT=ft.EventEmitter,uT=ut,mt=De,cT=Qm,vf=g_,Ef=kg,Sf=jg,Ga=pr,fT=T_,no=yt(),_T=Es,hT=vs(),dT=Mu,Wa=Pt,pT=S_,Ka=Zi,Ve=new uT("UA"),vt={STATUS_INIT:0,STATUS_READY:1,STATUS_USER_CLOSED:2,STATUS_NOT_READY:3,CONFIGURATION_ERROR:1,NETWORK_ERROR:2};var y_=class extends aT{static get C(){return vt}constructor(s){if(Ve.debug("new() [configuration:%o]",s),super(),this._cache={credentials:{}},this._configuration=Object.assign({},Ka.settings),this._dynConfiguration={},this._dialogs={},this._applicants={},this._sessions={},this._transport=null,this._contact=null,this._status=vt.STATUS_INIT,this._error=null,this._transactions={nist:{},nict:{},ist:{},ict:{}},this._data={},this._closeTimer=null,s===void 0)throw new TypeError("Not enough arguments");try{this._loadConfig(s)}catch(r){throw this._status=vt.STATUS_NOT_READY,this._error=vt.CONFIGURATION_ERROR,r}this._registrator=new cT(this)}get C(){return vt}get status(){return this._status}get contact(){return this._contact}get configuration(){return this._configuration}get transport(){return this._transport}start(){Ve.debug("start()"),this._status===vt.STATUS_INIT?this._transport.connect():this._status===vt.STATUS_USER_CLOSED?(Ve.debug("restarting UA"),this._closeTimer!==null&&(clearTimeout(this._closeTimer),this._closeTimer=null,this._transport.disconnect()),this._status=vt.STATUS_INIT,this._transport.connect()):this._status===vt.STATUS_READY?Ve.debug("UA is in READY status, not restarted"):Ve.debug("ERROR: connection is down, Auto-Recovery system is trying to reconnect"),this._dynConfiguration.register=this._configuration.register}register(){Ve.debug("register()"),this._dynConfiguration.register=!0,this._registrator.register()}unregister(s){Ve.debug("unregister()"),this._dynConfiguration.register=!1,this._registrator.unregister(s)}registrator(){return this._registrator}isRegistered(){return this._registrator.registered}isConnected(){return this._transport.isConnected()}call(s,r){Ve.debug("call()");const o=new vf(this);return o.connect(s,r),o}sendMessage(s,r,o){Ve.debug("sendMessage()");const a=new Ef(this);return a.send(s,r,o),a}sendOptions(s,r,o){Ve.debug("sendOptions()");const a=new Sf(this);return a.send(s,r,o),a}terminateSessions(s){Ve.debug("terminateSessions()");for(const r in this._sessions)this._sessions[r].isEnded()||this._sessions[r].terminate(s)}stop(){if(Ve.debug("stop()"),this._dynConfiguration={},this._status===vt.STATUS_USER_CLOSED){Ve.debug("UA already closed");return}this._registrator.close();const s=Object.keys(this._sessions).length;for(const o in this._sessions)if(Object.prototype.hasOwnProperty.call(this._sessions,o)){Ve.debug(`closing session ${o}`);try{this._sessions[o].terminate()}catch{}}for(const o in this._applicants)if(Object.prototype.hasOwnProperty.call(this._applicants,o))try{this._applicants[o].close()}catch{}this._status=vt.STATUS_USER_CLOSED,Object.keys(this._transactions.nict).length+Object.keys(this._transactions.nist).length+Object.keys(this._transactions.ict).length+Object.keys(this._transactions.ist).length===0&&s===0?this._transport.disconnect():this._closeTimer=setTimeout(()=>{this._closeTimer=null,this._transport.disconnect()},2e3)}normalizeTarget(s){return no.normalizeTarget(s,this._configuration.hostport_params)}get(s){switch(s){case"authorization_user":return this._configuration.authorization_user;case"realm":return this._configuration.realm;case"ha1":return this._configuration.ha1;case"authorization_jwt":return this._configuration.authorization_jwt;default:Ve.warn('get() | cannot get "%s" parameter in runtime',s);return}}set(s,r){switch(s){case"authorization_user":{this._configuration.authorization_user=String(r);break}case"password":{this._configuration.password=String(r);break}case"realm":{this._configuration.realm=String(r);break}case"ha1":{this._configuration.ha1=String(r),this._configuration.password=null;break}case"authorization_jwt":{this._configuration.authorization_jwt=String(r);break}case"display_name":{this._configuration.display_name=r;break}default:return Ve.warn('set() | cannot set "%s" parameter in runtime',s),!1}return!0}newTransaction(s){this._transactions[s.type][s.id]=s,this.emit("newTransaction",{transaction:s})}destroyTransaction(s){delete this._transactions[s.type][s.id],this.emit("transactionDestroyed",{transaction:s})}newDialog(s){this._dialogs[s.id]=s}destroyDialog(s){delete this._dialogs[s.id]}newMessage(s,r){this._applicants[s]=s,this.emit("newMessage",r)}newOptions(s,r){this._applicants[s]=s,this.emit("newOptions",r)}destroyMessage(s){delete this._applicants[s]}newRTCSession(s,r){this._sessions[s.id]=s,this.emit("newRTCSession",r)}destroyRTCSession(s){delete this._sessions[s.id]}registered(s){this.emit("registered",s)}unregistered(s){this.emit("unregistered",s)}registrationFailed(s){this.emit("registrationFailed",s)}receiveRequest(s){const r=s.method;if(s.ruri.user!==this._configuration.uri.user&&s.ruri.user!==this._contact.uri.user){Ve.debug("Request-URI does not point to us"),s.method!==mt.ACK&&s.reply_sl(404);return}if(s.ruri.scheme===mt.SIPS){s.reply_sl(416);return}if(Ga.checkTransaction(this,s))return;if(r===mt.INVITE?new Ga.InviteServerTransaction(this,this._transport,s):r!==mt.ACK&&r!==mt.CANCEL&&new Ga.NonInviteServerTransaction(this,this._transport,s),r===mt.OPTIONS){if(this.listeners("newOptions").length===0){s.reply(200);return}new Sf(this).init_incoming(s)}else if(r===mt.MESSAGE){if(this.listeners("newMessage").length===0){s.reply(405);return}new Ef(this).init_incoming(s)}else if(r===mt.INVITE&&!s.to_tag&&this.listeners("newRTCSession").length===0){s.reply(405);return}let o,a;if(s.to_tag)o=this._findDialog(s.call_id,s.from_tag,s.to_tag),o?o.receiveRequest(s):r===mt.NOTIFY?(a=this._findSession(s),a?a.receiveRequest(s):(Ve.debug("received NOTIFY request for a non existent subscription"),s.reply(481,"Subscription does not exist"))):r!==mt.ACK&&s.reply(481);else switch(r){case mt.INVITE:if(window.RTCPeerConnection)if(s.hasHeader("replaces")){const t=s.replaces;o=this._findDialog(t.call_id,t.from_tag,t.to_tag),o?(a=o.owner,a.isEnded()?s.reply(603):a.receiveRequest(s)):s.reply(481)}else a=new vf(this),a.init_incoming(s);else Ve.warn("INVITE received but WebRTC is not supported"),s.reply(488);break;case mt.BYE:s.reply(481);break;case mt.CANCEL:a=this._findSession(s),a?a.receiveRequest(s):Ve.debug("received CANCEL request for a non existent session");break;case mt.ACK:break;case mt.NOTIFY:this.emit("sipEvent",{event:s.event,request:s}),s.reply(200);break;default:s.reply(405);break}}_findSession({call_id:s,from_tag:r,to_tag:o}){const a=s+r,t=this._sessions[a],n=s+o,p=this._sessions[n];return t||p||null}_findDialog(s,r,o){let a=s+r+o,t=this._dialogs[a];return t||(a=s+o+r,t=this._dialogs[a],t||null)}_loadConfig(s){try{Ka.load(this._configuration,s)}catch(a){throw a}this._configuration.display_name===0&&(this._configuration.display_name="0"),this._configuration.instance_id||(this._configuration.instance_id=no.newUUID()),this._configuration.jssip_id=no.createRandomToken(5);const r=this._configuration.uri.clone();r.user=null,this._configuration.hostport_params=r.toString().replace(/^sip:/i,"");try{this._transport=new fT(this._configuration.sockets,{max_interval:this._configuration.connection_recovery_max_interval,min_interval:this._configuration.connection_recovery_min_interval}),this._transport.onconnecting=mT.bind(this),this._transport.onconnect=gT.bind(this),this._transport.ondisconnect=TT.bind(this),this._transport.ondata=vT.bind(this)}catch(a){throw Ve.warn(a),new _T.ConfigurationError("sockets",this._configuration.sockets)}if(delete this._configuration.sockets,this._configuration.authorization_user||(this._configuration.authorization_user=this._configuration.uri.user),!this._configuration.registrar_server){const a=this._configuration.uri.clone();a.user=null,a.clearParams(),a.clearHeaders(),this._configuration.registrar_server=a}this._configuration.no_answer_timeout*=1e3,this._configuration.contact_uri?this._configuration.via_host=this._configuration.contact_uri.host:this._configuration.contact_uri=new hT("sip",no.createRandomToken(8),this._configuration.via_host,null,{transport:"ws"}),this._contact={pub_gruu:null,temp_gruu:null,uri:this._configuration.contact_uri,toString(a={}){const t=a.anonymous||null,n=a.outbound||null;let p="<";return t?p+=this.temp_gruu||"sip:anonymous@anonymous.invalid;transport=ws":p+=this.pub_gruu||this.uri.toString(),n&&(t?!this.temp_gruu:!this.pub_gruu)&&(p+=";ob"),p+=">",p}};const o=["authorization_user","password","realm","ha1","authorization_jwt","display_name","register"];for(const a in this._configuration)Object.prototype.hasOwnProperty.call(this._configuration,a)&&(o.indexOf(a)!==-1?Object.defineProperty(this._configuration,a,{writable:!0,configurable:!1}):Object.defineProperty(this._configuration,a,{writable:!1,configurable:!1}));Ve.debug("configuration parameters after validation:");for(const a in this._configuration)if(Object.prototype.hasOwnProperty.call(Ka.settings,a))switch(a){case"uri":case"registrar_server":Ve.debug(`- ${a}: ${this._configuration[a]}`);break;case"password":case"ha1":case"authorization_jwt":Ve.debug(`- ${a}: NOT SHOWN`);break;default:Ve.debug(`- ${a}: ${JSON.stringify(this._configuration[a])}`)}}};function mT(c){this.emit("connecting",c)}function gT(c){this._status!==vt.STATUS_USER_CLOSED&&(this._status=vt.STATUS_READY,this._error=null,this.emit("connected",c),this._dynConfiguration.register&&this._registrator.register())}function TT(c){const s=["nict","ict","nist","ist"];for(const r of s)for(const o in this._transactions[r])Object.prototype.hasOwnProperty.call(this._transactions[r],o)&&this._transactions[r][o].onTransportError();this.emit("disconnected",c),this._registrator.onTransportClosed(),this._status!==vt.STATUS_USER_CLOSED&&(this._status=vt.STATUS_NOT_READY,this._error=vt.NETWORK_ERROR)}function vT(c){console.log("onTransportData",c);const s=c.transport;let r=c.message;if(r=dT.parseMessage(r,this),!!r&&!(this._status===vt.STATUS_USER_CLOSED&&r instanceof Wa.IncomingRequest)&&pT(r,this,s)){if(r instanceof Wa.IncomingRequest)r.transport=s,this.receiveRequest(r);else if(r instanceof Wa.IncomingResponse){let o;switch(r.method){case mt.INVITE:o=this._transactions.ict[r.via_branch],o&&o.receiveResponse(r);break;case mt.ACK:break;default:o=this._transactions.nict[r.via_branch],o&&o.receiveResponse(r);break}}}}const ET=Xe(y_);var dt=[];for(var Ya=0;Ya<256;++Ya)dt.push((Ya+256).toString(16).slice(1));function ST(c,s=0){return(dt[c[s+0]]+dt[c[s+1]]+dt[c[s+2]]+dt[c[s+3]]+"-"+dt[c[s+4]]+dt[c[s+5]]+"-"+dt[c[s+6]]+dt[c[s+7]]+"-"+dt[c[s+8]]+dt[c[s+9]]+"-"+dt[c[s+10]]+dt[c[s+11]]+dt[c[s+12]]+dt[c[s+13]]+dt[c[s+14]]+dt[c[s+15]]).toLowerCase()}var ro,yT=new Uint8Array(16);function AT(){if(!ro&&(ro=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!ro))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ro(yT)}var CT=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);const yf={randomUUID:CT};function Af(c,s,r){if(yf.randomUUID&&!s&&!c)return yf.randomUUID();c=c||{};var o=c.random||(c.rng||AT)();if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,s){r=r||0;for(var a=0;a<16;++a)s[r+a]=o[a];return s}return ST(o)}var Me=yt();const fr=Xe(Me),za=new n_("Dialog"),Ls={STATUS_EARLY:1,STATUS_CONFIRMED:2,STATUS_TERMINATED:3};class io{static get C(){return Ls}constructor(s,r,o,a=Ls.STATUS_CONFIRMED){if(this._owner=s,this._ua=s._ua,this._uac_pending_reply=!1,this._uas_pending_reply=!1,r instanceof Pt.IncomingResponse&&(a=r.status_code<200?Ls.STATUS_EARLY:Ls.STATUS_CONFIRMED),o==="UAS"){this._id={call_id:r.call_id,local_tag:r.to_tag,remote_tag:r.from_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._remote_seqnum=r.cseq,this._local_uri=r.parseHeader("to").uri,this._remote_uri=r.parseHeader("from").uri;let t=r.getHeaders("to")[0].split(";")[0];t=t.match(/<([^>]*)>/)[1],this._remote_target=t,this._route_set=r.getHeaders("record-route"),this._ack_seqnum=this._remote_seqnum}else if(o==="UAC"){this._id={call_id:r.call_id,local_tag:r.from_tag,remote_tag:r.to_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._local_seqnum=r.cseq,this._local_uri=r.parseHeader("from").uri,this._remote_uri=r.parseHeader("to").uri;let t=r.getHeaders("to")[0].split(";")[0];t=t.match(/<([^>]*)>/)[1],this._remote_target=t,this._route_set=r.getHeaders("record-route").reverse(),this._ack_seqnum=null}this._ua.newDialog(this),za.debug(`new ${o} dialog created with status ${this._state===Ls.STATUS_EARLY?"EARLY":"CONFIRMED"}`)}get id(){return this._id}get local_seqnum(){return this._local_seqnum}set local_seqnum(s){this._local_seqnum=s}get owner(){return this._owner}get uac_pending_reply(){return this._uac_pending_reply}set uac_pending_reply(s){this._uac_pending_reply=s}get uas_pending_reply(){return this._uas_pending_reply}isTerminated(){return this._status===Ls.STATUS_TERMINATED}update(s,r){this._state=Ls.STATUS_CONFIRMED,za.debug(`dialog ${this._id.toString()} changed to CONFIRMED state`),r==="UAC"&&(this._route_set=s.getHeaders("record-route").reverse())}terminate(){za.debug(`dialog ${this._id.toString()} deleted`),this._ua.destroyDialog(this),this._state=Ls.STATUS_TERMINATED}sendRequest(s,r={}){const o=fr.cloneArray(r.extraHeaders),a=fr.cloneObject(r.eventHandlers),t=r.body||null,n=this._createRequest(s,o,t);return a.onAuthenticated=()=>{this._local_seqnum+=1},new rg(this,n,a).send(),n}receiveRequest(s){this._checkInDialogRequest(s)&&(s.method===j.ACK&&this._ack_seqnum!==null?this._ack_seqnum=null:s.method===j.INVITE&&(this._ack_seqnum=s.cseq),this._owner.receiveRequest(s))}_createRequest(s,r,o){r=fr.cloneArray(r),this._local_seqnum||(this._local_seqnum=Math.floor(Math.random()*1e4));const a=s===j.CANCEL||s===j.ACK?this._local_seqnum:this._local_seqnum+=1;return new Pt.OutgoingRequest(s,this._remote_target,this._ua,{cseq:a,call_id:this._id.call_id,from_uri:this._local_uri,from_tag:this._id.local_tag,to_uri:this._remote_uri,to_tag:this._id.remote_tag,route_set:this._route_set},r,o)}_checkInDialogRequest(s){if(!this._remote_seqnum)this._remote_seqnum=s.cseq;else if(s.cseq<this._remote_seqnum)if(s.method===j.ACK){if(this._ack_seqnum===null||s.cseq!==this._ack_seqnum)return!1}else return s.reply(500),!1;else s.cseq>this._remote_seqnum&&(this._remote_seqnum=s.cseq);if(s.method===j.INVITE||s.method===j.UPDATE&&s.body){if(this._uac_pending_reply===!0)s.reply(491);else if(this._uas_pending_reply===!0){const r=(Math.random()*10|0)+1;return s.reply(500,null,[`Retry-After:${r}`]),!1}else{this._uas_pending_reply=!0;const r=()=>{(s.server_transaction.state===Bt.C.STATUS_ACCEPTED||s.server_transaction.state===Bt.C.STATUS_COMPLETED||s.server_transaction.state===Bt.C.STATUS_TERMINATED)&&(s.server_transaction.removeListener("stateChanged",r),this._uas_pending_reply=!1)};s.server_transaction.on("stateChanged",r)}s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Bt.C.STATUS_ACCEPTED&&(this._remote_target=s.parseHeader("contact").uri)})}else s.method===j.NOTIFY&&s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Bt.C.STATUS_COMPLETED&&(this._remote_target=s.parseHeader("contact").uri)});return!0}}class RT{constructor(s,r){Wt(this,"plugin",null);Wt(this,"rtcpPeer",null);Wt(this,"handleId",0);Wt(this,"info",null);Wt(this,"joinResult",null);Wt(this,"state",{});Wt(this,"stream",null);Wt(this,"loaded",!1);Wt(this,"aTracks",[]);Wt(this,"vTracks",[]);this.info=s,this.plugin=r,this.rtcpPeer=new RTCPeerConnection({iceServers:[]})}get memberInfo(){return{stream:this.stream,joinResult:this.joinResult,sender:this.handleId,type:"subscriber",name:this.info.display,state:this.state,id:this.handleId}}updateMemberState(s){var r;this.state={...this.state,...s||{}},(r=this.plugin)==null||r.session.emit("member:update",this.memberInfo)}updateMemberStateFromMessage(s){var t,n,p,_;const r=(n=(t=s==null?void 0:s.plugindata)==null?void 0:t.data)==null?void 0:n.newStatePublisher,a=((_=(p=s==null?void 0:s.plugindata)==null?void 0:p.data)==null?void 0:_.publisher_state).find(d=>d.id===r);this.updateMemberState(a==null?void 0:a.state)}hangup(){this.rtcpPeer&&(this.rtcpPeer.close(),this.rtcpPeer=null),this.plugin.session.emit("member:hangup",{info:this.info,sender:this.handleId}),this.plugin.send({janus:"detach"},{handle_id:this.handleId}).catch(console.log)}}var IT=vs();const _r=Xe(IT),J=new n_("JanusSession"),bT="/opt/recordings/",te={STATUS_NULL:0,STATUS_INVITE_SENT:1,STATUS_1XX_RECEIVED:2,STATUS_INVITE_RECEIVED:3,STATUS_WAITING_FOR_ANSWER:4,STATUS_ANSWERED:5,STATUS_WAITING_FOR_ACK:6,STATUS_CANCELED:7,STATUS_TERMINATED:8,STATUS_CONFIRMED:9},lo=["audio","video"];class Po extends ft.EventEmitter{static get C(){return te}constructor(s){J.debug("new"),super(),console.log("constructor call"),this._id=null,this._ua=s,this._status=te.STATUS_NULL,this._dialog=null,this._earlyDialogs={},this._contact=null,this._from_tag=null,this._to_tag=null,this.lastTransaction=0,this._connection=null,this._connectionPromiseQueue=Promise.resolve(),this._request=null,this._is_canceled=!1,this._cancel_reason="",this._is_confirmed=!1,this._late_sdp=!1,this._rtcOfferConstraints=null,this._rtcAnswerConstraints=null,this._localMediaStream=null,this._localMediaStreamLocallyGenerated=!1,this._rtcReady=!0,this._iceReady=!1,this._timers={ackTimer:null,expiresTimer:null,invite2xxTimer:null,userNoAnswerTimer:null},this._direction=null,this._local_identity=null,this._remote_identity=null,this._start_time=null,this._end_time=null,this._audioMuted=!1,this._videoMuted=!1,this._localHold=!1,this._remoteHold=!1,this._sessionTimers={enabled:this._ua.configuration.session_timers,refreshMethod:this._ua.configuration.session_timers_refresh_method,defaultExpires:j.SESSION_EXPIRES,currentExpires:null,running:!1,refresher:!1,timer:null},this._referSubscribers={},this._candidates=[],this.publishers=[],this.private_id=null,this.memberList={},this.myFeedList=[],this.display_name="",this.stunServers=[{urls:"stun:turn.voicenter.co",credential:"kxsjahnsdjns3eds23esd",username:"turn2es21e"}];const r=Af().replace(/-/g,"").slice(0,12);this.opaque_id=`videoroomtest-${r}`,this._data={}}get C(){return te}get causes(){return j.causes}get id(){return this._id}get connection(){return this._connection}get contact(){return this._contact}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}get start_time(){return this._start_time}get end_time(){return this._end_time}get data(){return this._data}set data(s){this._data=s}get status(){return this._status}isInProgress(){switch(this._status){case te.STATUS_NULL:case te.STATUS_INVITE_SENT:case te.STATUS_1XX_RECEIVED:case te.STATUS_INVITE_RECEIVED:case te.STATUS_WAITING_FOR_ANSWER:return!0;default:return!1}}isEstablished(){switch(this._status){case te.STATUS_ANSWERED:case te.STATUS_WAITING_FOR_ACK:case te.STATUS_CONFIRMED:return!0;default:return!1}}isEnded(){switch(this._status){case te.STATUS_CANCELED:case te.STATUS_TERMINATED:return!0;default:return!1}}isMuted(){return{audio:this._audioMuted,video:this._videoMuted}}isOnHold(){return{local:this._localHold,remote:this._remoteHold}}connect(s,r,o={},a){J.debug("connect()"),this.display_name=r;const t=s,n=Me.cloneObject(o.eventHandlers),p=Me.cloneArray(o.extraHeaders),_=Me.cloneObject(o.mediaConstraints,{audio:!0,video:!0}),d=o.mediaStream||null,g=Me.cloneObject(o.pcConfig,{iceServers:[]}),T=o.rtcConstraints||null,E=o.rtcOfferConstraints||null;if(this._rtcOfferConstraints=E,this._rtcAnswerConstraints=o.rtcAnswerConstraints||null,this._data=o.data||this._data,s===void 0)throw new TypeError("Not enough arguments");if(this._status!==te.STATUS_NULL)throw new Hs.InvalidStateError(this._status);if(!window.RTCPeerConnection)throw new Hs.NotSupportedError("WebRTC not supported");if(console.log("target",s),s=this._ua.normalizeTarget(s),console.log("normalizeTarget target",s),this.room_id=s.user,!s)throw new TypeError(`Invalid target: ${t}`);this._sessionTimers.enabled&&Me.isDecimal(o.sessionTimersExpires)&&(o.sessionTimersExpires>=j.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=o.sessionTimersExpires:this._sessionTimers.defaultExpires=j.SESSION_EXPIRES);for(const C in n)Object.prototype.hasOwnProperty.call(n,C)&&this.on(C,n[C]);this._from_tag=Me.newTag();const y=o.anonymous||!1,A={from_tag:this._from_tag};this._contact=this._ua.contact.toString({anonymous:y,outbound:!0}),y?(A.from_display_name="Anonymous",A.from_uri=new _r("sip","anonymous","anonymous.invalid"),p.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`),p.push("Privacy: id")):o.fromUserName&&(A.from_uri=new _r("sip",o.fromUserName,this._ua.configuration.uri.host),p.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`)),o.fromDisplayName&&(A.from_display_name=o.fromDisplayName),p.push(`Contact: ${this._contact}`),p.push("Content-Type: application/json"),this._sessionTimers.enabled&&p.push(`Session-Expires: ${this._sessionTimers.defaultExpires}${this._ua.configuration.session_timers_force_refresher?";refresher=uac":""}`),this._request=new Pt.InitialOutgoingInviteRequest(s,this._ua,A,p),this._id=this._request.call_id+this._from_tag,this._createRTCConnection(g,T),this._direction="outgoing",this._local_identity=this._request.from,this._remote_identity=this._request.to,console.log("this._remote_identity",this._remote_identity),a&&a(this),this._newJanusSession("local",this._request),this._sendInitialRequest(_,E,d)}init_incoming(s,r){J.debug("init_incoming()");let o;const a=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;if(s.body&&a!=="application/sdp"){s.reply(415);return}if(this._status=te.STATUS_INVITE_RECEIVED,this._from_tag=s.from_tag,this._id=s.call_id+this._from_tag,this._request=s,this._contact=this._ua.contact.toString(),s.hasHeader("expires")&&(o=s.getHeader("expires")*1e3),s.to_tag=Me.newTag(),!this._createDialog(s,"UAS",!0)){s.reply(500,"Missing Contact header field");return}s.body?this._late_sdp=!1:this._late_sdp=!0,this._status=te.STATUS_WAITING_FOR_ANSWER,this._timers.userNoAnswerTimer=setTimeout(()=>{s.reply(408),this._failed("local",null,j.causes.NO_ANSWER)},this._ua.configuration.no_answer_timeout),o&&(this._timers.expiresTimer=setTimeout(()=>{this._status===te.STATUS_WAITING_FOR_ANSWER&&(s.reply(487),this._failed("system",null,j.causes.EXPIRES))},o)),this._direction="incoming",this._local_identity=s.to,this._remote_identity=s.from,r&&r(this),this._newJanusSession("remote",s),this._status!==te.STATUS_TERMINATED&&(s.reply(180,null,[`Contact: ${this._contact}`]),this._progress("local",null))}answer(s={}){J.debug("answer()");const r=this._request,o=Me.cloneArray(s.extraHeaders),a=Me.cloneObject(s.mediaConstraints),t=s.mediaStream||null,n=Me.cloneObject(s.pcConfig,{iceServers:[]}),p=s.rtcConstraints||null,_=s.rtcAnswerConstraints||null,d=Me.cloneObject(s.rtcOfferConstraints);let g,T=!1,E=!1,y=!1,A=!1;if(this._rtcAnswerConstraints=_,this._rtcOfferConstraints=s.rtcOfferConstraints||null,this._data=s.data||this._data,this._direction!=="incoming")throw new Hs.NotSupportedError('"answer" not supported for outgoing RTCSession');if(this._status!==te.STATUS_WAITING_FOR_ANSWER)throw new Hs.InvalidStateError(this._status);if(this._sessionTimers.enabled&&Me.isDecimal(s.sessionTimersExpires)&&(s.sessionTimersExpires>=j.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=s.sessionTimersExpires:this._sessionTimers.defaultExpires=j.SESSION_EXPIRES),this._status=te.STATUS_ANSWERED,!this._createDialog(r,"UAS")){r.reply(500,"Error creating dialog");return}clearTimeout(this._timers.userNoAnswerTimer),o.unshift(`Contact: ${this._contact}`);const C=r.parseSDP();Array.isArray(C.media)||(C.media=[C.media]);for(const I of C.media)I.type==="audio"&&(T=!0,(!I.direction||I.direction==="sendrecv")&&(y=!0)),I.type==="video"&&(E=!0,(!I.direction||I.direction==="sendrecv")&&(A=!0));if(t&&a.audio===!1){g=t.getAudioTracks();for(const I of g)t.removeTrack(I)}if(t&&a.video===!1){g=t.getVideoTracks();for(const I of g)t.removeTrack(I)}!t&&a.audio===void 0&&(a.audio=y),!t&&a.video===void 0&&(a.video=A),!t&&!T&&!d.offerToReceiveAudio&&(a.audio=!1),!t&&!E&&!d.offerToReceiveVideo&&(a.video=!1),this._createRTCConnection(n,p),Promise.resolve().then(()=>{if(t)return t;if(a.audio||a.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(a).catch(I=>{throw this._status===te.STATUS_TERMINATED?new Error("terminated"):(r.reply(480),this._failed("local",null,j.causes.USER_DENIED_MEDIA_ACCESS),J.warn('emit "getusermediafailed" [error:%o]',I),this.emit("getusermediafailed",I),new Error("getUserMedia() failed"))})}).then(I=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");this._localMediaStream=I,I&&I.getTracks().forEach($=>{this._connection.addTrack($,I)})}).then(()=>{if(this._late_sdp)return;const I={originator:"remote",type:"offer",sdp:r.body};J.debug('emit "sdp"'),this.emit("sdp",I);const $=new RTCSessionDescription({type:"offer",sdp:I.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription($)).catch(L=>{throw r.reply(488),this._failed("system",null,j.causes.WEBRTC_ERROR),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',L),this.emit("peerconnection:setremotedescriptionfailed",L),new Error("peerconnection.setRemoteDescription() failed")}),this._connectionPromiseQueue}).then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._connecting(r),this._late_sdp?this._createLocalDescription("offer",this._rtcOfferConstraints).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")}):this._createLocalDescription("answer",_).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")})}).then(I=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");this._handleSessionTimersInIncomingRequest(r,o),r.reply(200,null,o,I,()=>{this._status=te.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(r,I),this._setACKTimer(),this._accepted("local")},()=>{this._failed("system",null,j.causes.CONNECTION_ERROR)})}).catch(I=>{this._status!==te.STATUS_TERMINATED&&J.warn(I)})}terminate(s={}){J.debug("terminate()");const r=s.cause||j.causes.BYE,o=Me.cloneArray(s.extraHeaders),a=s.body;let t,n=s.status_code,p=s.reason_phrase;if(this._status===te.STATUS_TERMINATED)throw new Hs.InvalidStateError(this._status);switch(this._status){case te.STATUS_NULL:case te.STATUS_INVITE_SENT:case te.STATUS_1XX_RECEIVED:if(J.debug("canceling session"),n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);n&&(p=p||j.REASON_PHRASE[n]||"",t=`SIP ;cause=${n} ;text="${p}"`),this._status===te.STATUS_NULL||this._status===te.STATUS_INVITE_SENT?(this._is_canceled=!0,this._cancel_reason=t):this._status===te.STATUS_1XX_RECEIVED&&this._request.cancel(t),this._status=te.STATUS_CANCELED,this._failed("local",null,j.causes.CANCELED);break;case te.STATUS_WAITING_FOR_ANSWER:case te.STATUS_ANSWERED:if(J.debug("rejecting session"),n=n||480,n<300||n>=700)throw new TypeError(`Invalid status_code: ${n}`);this._request.reply(n,p,o,a),this._failed("local",null,j.causes.REJECTED);break;case te.STATUS_WAITING_FOR_ACK:case te.STATUS_CONFIRMED:if(J.debug("terminating session"),p=s.reason_phrase||j.REASON_PHRASE[n]||"",n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);if(n&&o.push(`Reason: SIP ;cause=${n}; text="${p}"`),this._status===te.STATUS_WAITING_FOR_ACK&&this._direction==="incoming"&&this._request.server_transaction.state!==Bt.C.STATUS_TERMINATED){const _=this._dialog;this.receiveRequest=({method:d})=>{d===j.ACK&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())},this._request.server_transaction.on("stateChanged",()=>{this._request.server_transaction.state===Bt.C.STATUS_TERMINATED&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())}),this._ended("local",null,r),this._dialog=_,console.log("SET DIALOG terminate"),this._ua.newDialog(_)}else this.sendRequest(j.BYE,{extraHeaders:o,body:a}),this._ended("local",null,r)}}sendInfo(s,r,o={}){if(J.debug("sendInfo()"),this._status!==te.STATUS_CONFIRMED&&this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_1XX_RECEIVED)throw new Hs.InvalidStateError(this._status);new pu(this).send(s,r,o)}mute(s={audio:!0,video:!1}){J.debug("mute()");let r=!1,o=!1;this._audioMuted===!1&&s.audio&&(r=!0,this._audioMuted=!0,this._toggleMuteAudio(!0)),this._videoMuted===!1&&s.video&&(o=!0,this._videoMuted=!0,this._toggleMuteVideo(!0)),(r===!0||o===!0)&&this._onmute({audio:r,video:o})}unmute(s={audio:!0,video:!0}){J.debug("unmute()");let r=!1,o=!1;this._audioMuted===!0&&s.audio&&(r=!0,this._audioMuted=!1,this._localHold===!1&&this._toggleMuteAudio(!1)),this._videoMuted===!0&&s.video&&(o=!0,this._videoMuted=!1,this._localHold===!1&&this._toggleMuteVideo(!1)),(r===!0||o===!0)&&this._onunmute({audio:r,video:o})}hold(s={},r){if(J.debug("hold()"),this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED||this._localHold===!0||!this._isReadyToReOffer())return!1;this._localHold=!0,this._onhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:j.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Hold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}unhold(s={},r){if(J.debug("unhold()"),this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED||this._localHold===!1||!this._isReadyToReOffer())return!1;this._localHold=!1,this._onunhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:j.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Unhold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}renegotiate(s={},r){J.debug("renegotiate()");const o=s.rtcOfferConstraints||null;if(this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED||!this._isReadyToReOffer())return!1;const a={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:j.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Media Renegotiation Failed"})}};return this._setLocalMediaStatus(),s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}),!0}refer(s,r){J.debug("refer()");const o=s;if(this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED)return!1;if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${o}`);const a=new Ag(this);a.sendRefer(s,r);const t=a.id;return this._referSubscribers[t]=a,a.on("requestFailed",()=>{delete this._referSubscribers[t]}),a.on("accepted",()=>{delete this._referSubscribers[t]}),a.on("failed",()=>{delete this._referSubscribers[t]}),a}sendRequest(s,r){return J.debug("sendRequest()"),this._dialog.sendRequest(s,r)}receiveNotify(s){J.debug("receiveRequest()")}receiveRequest(s){if(J.debug("receiveRequest()"),s.method===j.CANCEL)(this._status===te.STATUS_WAITING_FOR_ANSWER||this._status===te.STATUS_ANSWERED)&&(this._status=te.STATUS_CANCELED,this._request.reply(487),this._failed("remote",s,j.causes.CANCELED));else switch(s.method){case j.ACK:if(this._status!==te.STATUS_WAITING_FOR_ACK)return;if(this._status=te.STATUS_CONFIRMED,clearTimeout(this._timers.ackTimer),clearTimeout(this._timers.invite2xxTimer),this._late_sdp){if(!s.body){this.terminate({cause:j.causes.MISSING_SDP,status_code:400});break}const r={originator:"remote",type:"answer",sdp:s.body};J.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>{this._is_confirmed||this._confirmed("remote",s)}).catch(a=>{this.terminate({cause:j.causes.BAD_MEDIA_DESCRIPTION,status_code:488}),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})}else this._is_confirmed||this._confirmed("remote",s);break;case j.BYE:this._status===te.STATUS_CONFIRMED||this._status===te.STATUS_WAITING_FOR_ACK?(s.reply(200),this._ended("remote",s,j.causes.BYE)):this._status===te.STATUS_INVITE_RECEIVED||this._status===te.STATUS_WAITING_FOR_ANSWER?(s.reply(200),this._request.reply(487,"BYE Received"),this._ended("remote",s,j.causes.BYE)):s.reply(403,"Wrong Status");break;case j.INVITE:this._status===te.STATUS_CONFIRMED?s.hasHeader("replaces")?this._receiveReplaces(s):this._receiveReinvite(s):s.reply(403,"Wrong Status");break;case j.INFO:if(this._status===te.STATUS_1XX_RECEIVED||this._status===te.STATUS_WAITING_FOR_ANSWER||this._status===te.STATUS_ANSWERED||this._status===te.STATUS_WAITING_FOR_ACK||this._status===te.STATUS_CONFIRMED){const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;r&&r.match(/^application\/dtmf-relay/i)?new _g(this).init_incoming(s):r!==void 0?new pu(this).init_incoming(s):s.reply(415)}else s.reply(403,"Wrong Status");break;case j.UPDATE:this._status===te.STATUS_CONFIRMED?this._receiveUpdate(s):s.reply(403,"Wrong Status");break;case j.REFER:this._status===te.STATUS_CONFIRMED?this._receiveRefer(s):s.reply(403,"Wrong Status");break;case j.NOTIFY:this._status===te.STATUS_CONFIRMED?this._receiveNotify(s):s.reply(403,"Wrong Status");break;default:s.reply(501)}}onTransportError(){J.warn("onTransportError()"),this._status!==te.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.CONNECTION_ERROR,cause:j.causes.CONNECTION_ERROR})}onRequestTimeout(){J.warn("onRequestTimeout()"),this._status!==te.STATUS_TERMINATED&&this.terminate({status_code:408,reason_phrase:j.causes.REQUEST_TIMEOUT,cause:j.causes.REQUEST_TIMEOUT})}onDialogError(){J.warn("onDialogError()"),this._status!==te.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.DIALOG_ERROR,cause:j.causes.DIALOG_ERROR})}newDTMF(s){J.debug("newDTMF()"),this.emit("newDTMF",s)}newInfo(s){J.debug("newInfo()"),this.emit("newInfo",s)}_isReadyToReOffer(){return this._rtcReady?this._dialog?this._dialog.uac_pending_reply===!0||this._dialog.uas_pending_reply===!0?(J.debug("_isReadyToReOffer() | there is another INVITE/UPDATE transaction in progress"),!1):!0:(J.debug("_isReadyToReOffer() | session not established yet"),!1):(J.debug("_isReadyToReOffer() | internal WebRTC status not ready"),!1)}_close(){if(J.debug("close()"),this._localMediaStream&&this._localMediaStreamLocallyGenerated&&(J.debug("close() | closing local MediaStream"),Me.closeMediaStream(this._localMediaStream)),this._status!==te.STATUS_TERMINATED){if(this._status=te.STATUS_TERMINATED,this._connection)try{this._connection.close()}catch(s){J.warn("close() | error closing the RTCPeerConnection: %o",s)}for(const s in this._timers)Object.prototype.hasOwnProperty.call(this._timers,s)&&clearTimeout(this._timers[s]);clearTimeout(this._sessionTimers.timer),this._dialog&&(this._dialog.terminate(),delete this._dialog);for(const s in this._earlyDialogs)Object.prototype.hasOwnProperty.call(this._earlyDialogs,s)&&(this._earlyDialogs[s].terminate(),delete this._earlyDialogs[s]);for(const s in this._referSubscribers)Object.prototype.hasOwnProperty.call(this._referSubscribers,s)&&delete this._referSubscribers[s];this._ua.destroyRTCSession(this)}}_setInvite2xxTimer(s,r){let o=Mi.T1;function a(){this._status===te.STATUS_WAITING_FOR_ACK&&(s.reply(200,null,[`Contact: ${this._contact}`],r),o<Mi.T2&&(o=o*2,o>Mi.T2&&(o=Mi.T2)),this._timers.invite2xxTimer=setTimeout(a.bind(this),o))}this._timers.invite2xxTimer=setTimeout(a.bind(this),o)}_setACKTimer(){this._timers.ackTimer=setTimeout(()=>{this._status===te.STATUS_WAITING_FOR_ACK&&(J.debug("no ACK received, terminating the session"),clearTimeout(this._timers.invite2xxTimer),this.sendRequest(j.BYE),this._ended("remote",null,j.causes.NO_ACK))},Mi.TIMER_H)}_createRTCConnection(s,r){this.stunServers,this._connection=new RTCPeerConnection(s,r),this._connection.addEventListener("iceconnectionstatechange",()=>{this._connection.iceConnectionState==="failed"&&this.terminate({cause:j.causes.RTP_TIMEOUT,status_code:408,reason_phrase:j.causes.RTP_TIMEOUT})});let o;const a=t=>{this._connection.signalingState!=="stable"&&this._connection.signalingState!=="have-local-offer"||t.candidate&&(this._candidates.push(t.candidate),clearTimeout(o),o=setTimeout(()=>{this.lastTrickleReceived=!0,this.subscribeSent&&!this.isConfigureSent&&this._sendConfigureMessage({audio:!0,video:!0}).then(()=>{})},500))};this._connection.onicecandidate=a,J.debug('emit "peerconnection"'),this.emit("peerconnection",{peerconnection:this._connection})}_createLocalDescription(s,r){if(J.debug("createLocalDescription()"),s!=="offer"&&s!=="answer")throw new Error(`createLocalDescription() | invalid type "${s}"`);const o=this._connection;return this._rtcReady=!1,Promise.resolve().then(()=>s==="offer"?o.createOffer(r).catch(a=>(J.warn('emit "peerconnection:createofferfailed" [error:%o]',a),this.emit("peerconnection:createofferfailed",a),Promise.reject(a))):o.createAnswer(r).catch(a=>(J.warn('emit "peerconnection:createanswerfailed" [error:%o]',a),this.emit("peerconnection:createanswerfailed",a),Promise.reject(a)))).then(a=>o.setLocalDescription(a).catch(t=>(this._rtcReady=!0,J.warn('emit "peerconnection:setlocaldescriptionfailed" [error:%o]',t),this.emit("peerconnection:setlocaldescriptionfailed",t),Promise.reject(t)))).then(()=>{const a=r&&r.iceRestart;if(o.iceGatheringState==="complete"&&!a||o.iceGatheringState==="gathering"&&this._iceReady){this._rtcReady=!0;const t={originator:"local",type:s,sdp:o.localDescription.sdp};return J.debug('emit "sdp"'),this.emit("sdp",t),Promise.resolve(t.sdp)}return new Promise(t=>{let n=!1,p,_;this._iceReady=!1;const d=()=>{o.removeEventListener("icecandidate",p),o.removeEventListener("icegatheringstatechange",_),n=!0,this._rtcReady=!0,this._iceReady=!0;const g={originator:"local",type:s,sdp:o.localDescription.sdp};J.debug('emit "sdp"'),this.emit("sdp",g),t(g.sdp)};o.addEventListener("icecandidate",p=g=>{const T=g.candidate;T?this.emit("icecandidate",{candidate:T,ready:d}):n||d()}),o.addEventListener("icegatheringstatechange",_=()=>{o.iceGatheringState==="complete"&&!n&&d()})})})}_createDialog(s,r,o){console.log("_createDialog",s);const a=r==="UAS"?s.to_tag:s.from_tag,t=r==="UAS"?s.from_tag:s.to_tag,n=s.call_id+a+t;console.log("remote_tag",t);let p=this._earlyDialogs[n];if(o)return p?!0:(p=new io(this,s,r,io.C.STATUS_EARLY),console.log("SET DIALOG early"),p.error?(console.log("early_dialog error",p.error),J.debug(p.error),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(this._earlyDialogs[n]=p,!0));{if(this._from_tag=s.from_tag,this._to_tag=s.to_tag,p)return p.update(s,r),console.log("SET DIALOG 1"),this._dialog=p,delete this._earlyDialogs[n],!0;const _=new io(this,s,r);return _.error?(console.log("dialog.error",_.error),J.debug(_.error),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(console.log("AAA SET DIALOG 2"),this._dialog=_,!0)}}_receiveReinvite(s){J.debug("receiveReinvite()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Me.cloneArray(p.extraHeaders);if(this._status!==te.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("reinvite",o),a)return;if(this._late_sdp=!1,!s.body){this._late_sdp=!0,this._remoteHold&&(this._remoteHold=!1,this._onunhold("remote")),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",this._rtcOfferConstraints)).then(p=>{n.call(this,p)}).catch(()=>{s.reply(500)});return}if(r!=="application/sdp"){J.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==te.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{J.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),this._late_sdp&&(p=this._mangleOffer(p)),s.reply(200,null,_,p,()=>{this._status=te.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(s,p),this._setACKTimer()}),typeof o.callback=="function"&&o.callback()}}_receiveUpdate(s){J.debug("receiveUpdate()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Me.cloneArray(p.extraHeaders);if(this._status!==te.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("update",o),a)return;if(!s.body){n.call(this,null);return}if(r!=="application/sdp"){J.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==te.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{J.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),s.reply(200,null,_,p),typeof o.callback=="function"&&o.callback()}}_processInDialogSdpOffer(s){J.debug("_processInDialogSdpOffer()");const r=s.parseSDP();let o=!1;for(const n of r.media){if(lo.indexOf(n.type)===-1)continue;const p=n.direction||r.direction||"sendrecv";if(p==="sendonly"||p==="inactive")o=!0;else{o=!1;break}}const a={originator:"remote",type:"offer",sdp:s.body};J.debug('emit "sdp"'),this.emit("sdp",a);const t=new RTCSessionDescription({type:"offer",sdp:a.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._connection.setRemoteDescription(t).catch(n=>{throw s.reply(488),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',n),this.emit("peerconnection:setremotedescriptionfailed",n),n})}).then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");this._remoteHold===!0&&o===!1?(this._remoteHold=!1,this._onunhold("remote")):this._remoteHold===!1&&o===!0&&(this._remoteHold=!0,this._onhold("remote"))}).then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._createLocalDescription("answer",this._rtcAnswerConstraints).catch(n=>{throw s.reply(500),J.warn('emit "peerconnection:createtelocaldescriptionfailed" [error:%o]',n),n})}).catch(n=>{J.warn("_processInDialogSdpOffer() failed [error: %o]",n)}),this._connectionPromiseQueue}_receiveRefer(s){if(J.debug("receiveRefer()"),!s.refer_to){J.debug("no Refer-To header field present in REFER"),s.reply(400);return}if(s.refer_to.uri.scheme!==j.SIP){J.debug("Refer-To header field points to a non-SIP URI scheme"),s.reply(416);return}s.reply(202);const r=new vg(this,s.cseq);J.debug('emit "refer"'),this.emit("refer",{request:s,accept:(t,n)=>{o.call(this,t,n)},reject:()=>{a.call(this)}});function o(t,n={}){if(t=typeof t=="function"?t:null,this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED)return!1;const p=new Po(this._ua);if(p.on("progress",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("accepted",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("_failed",({message:_,cause:d})=>{_?r.notify(_.status_code,_.reason_phrase):r.notify(487,d)}),s.refer_to.uri.hasHeader("replaces")){const _=decodeURIComponent(s.refer_to.uri.getHeader("replaces"));n.extraHeaders=Me.cloneArray(n.extraHeaders),n.extraHeaders.push(`Replaces: ${_}`)}p.connect(s.refer_to.uri.toAor(),n,t)}function a(){r.notify(603)}}_receiveNotify(s){switch(J.debug("receiveNotify()"),s.event||s.reply(400),s.event.event){case"refer":{let r,o;if(s.event.params&&s.event.params.id)r=s.event.params.id,o=this._referSubscribers[r];else if(Object.keys(this._referSubscribers).length===1)o=this._referSubscribers[Object.keys(this._referSubscribers)[0]];else{s.reply(400,"Missing event id parameter");return}if(!o){s.reply(481,"Subscription does not exist");return}o.receiveNotify(s),s.reply(200);break}default:s.reply(489)}}_receiveReplaces(s){J.debug("receiveReplaces()");function r(a){if(this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED)return!1;const t=new Po(this._ua);t.on("confirmed",()=>{this.terminate()}),t.init_incoming(s,a)}function o(){J.debug("Replaced INVITE rejected by the user"),s.reply(486)}this.emit("replaces",{request:s,accept:a=>{r.call(this,a)},reject:()=>{o.call(this)}})}_getNextTransactionId(){return(this.lastTransaction+1).toString()}_sendInitialRequest(s,r,o){this.ackSent=!1,this.publisherSubscribeSent=!1;const a=new u_(this._ua,this._request,{onRequestTimeout:()=>{this.onRequestTimeout()},onTransportError:()=>{this.onTransportError()},onAuthenticated:t=>{this._request=t},onReceiveResponse:t=>{this._receiveInviteResponse(t)}});Promise.resolve().then(()=>{if(o)return o;if(s.audio||s.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(s).catch(t=>{throw this._status===te.STATUS_TERMINATED?new Error("terminated"):(this._failed("local",null,j.causes.USER_DENIED_MEDIA_ACCESS),J.warn('emit "getusermediafailed" [error:%o]',t),this.emit("getusermediafailed",t),t)})}).then(t=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._localMediaStream=t,t&&t.getTracks().forEach(n=>{this._connection.addTrack(n,t)}),this._connecting(this._request),this._createLocalDescription("offer",r).catch(n=>{throw this._failed("local",null,j.causes.WEBRTC_ERROR),n})}).then(t=>{if(this._is_canceled||this._status===te.STATUS_TERMINATED)throw new Error("terminated");const n={janus:"attach",plugin:"janus.plugin.videoroom",opaque_id:this.opaque_id},p=JSON.stringify(n);this._request.body=p,this._status=te.STATUS_INVITE_SENT,J.debug('emit "sending" [request:%o]',this._request),this.emit("sending",{request:this._request}),a.send()}).catch(t=>{this._status!==te.STATUS_TERMINATED&&J.warn(t)})}requestAudioAndVideoPermissions(){return this.loadStream()}async loadStream(){const s={audio:!0,video:!0};try{this.stream=await navigator.mediaDevices.getUserMedia(s),J.info("Got local user media.")}catch{try{s.video=!1,this.stream=await navigator.mediaDevices.getUserMedia(s)}catch{s.audio=!1,s.video=!1,this.stream=await navigator.mediaDevices.getUserMedia(s)}}return{stream:this.stream,options:s}}addTracks(s){s.forEach(r=>{this._connection.addTrack(r)})}getRecordFileName(){return bT+this.room_id+btoa(unescape(encodeURIComponent(this.displayName)))+Date.now()}async processIceCandidates(){for(let s=0;s<this.iceCandidates.length;s++)await this._connection.addIceCandidate(this.iceCandidates[s]);this.iceCandidates=[]}async _sendConfigureMessage(s){const r={offerToReceiveAudio:!1,offerToReceiveVideo:!1},o=await this._connection.createOffer(r);await this._connection.setLocalDescription(o);const a=this._candidates.map(_=>({janus:"trickle",candidate:_,handle_id:this.handle_id,session_id:this.session_id})),n={configure:{janus:"message",body:{request:"configure",record:!0,filename:this.getRecordFileName(),...s},jsep:o,handle_id:this.handle_id,session_id:this.session_id},trickles:[...a]},p=["Content-Type: application/json","PTYPE: Ice"];this.sendRequest(j.INFO,{extraHeaders:p,body:JSON.stringify(n),eventHandlers:{onSuccessResponse:async _=>{this.isConfigureSent=!0;const g=_.data.split(`\r
|
135
|
-
`),T=g[g.length-1],E=JSON.parse(T);await this._connection.setRemoteDescription(E.jsep),this._candidates=[]}}})}_sendMemberStartMessage(s,r){const o={janus:"message",body:{request:"start",room:this.room_id},handle_id:s.handleId,session_id:this.session_id,jsep:r},a=["Content-Type: application/json","PTYPE: Configure"];this.sendRequest(j.INFO,{extraHeaders:a,body:JSON.stringify(o),eventHandlers:{onSuccessResponse:async t=>{t.status_code===200&&await s.rtcpPeer.setLocalDescription(r)}}})}_sendTrickleMessage(s){const o={trickles:[...s.map(t=>({janus:"trickle",candidate:t,handle_id:this.handle_id,session_id:this.session_id}))]},a=["PTYPE: Trickle"];this.sendRequest(j.INFO,{extraHeaders:a,body:JSON.stringify(o),eventHandlers:{onSuccessResponse:async t=>{console.log("_sendTrickleMessage",t)}}})}async _answerAttachedStream(s,r){let o=null;const a=async _=>{if(!s.rtcpPeer||s.loaded)return;{s.loaded=!0;const y={audio:!0,video:!0};await new Promise(A=>{setTimeout(A,100)}),o=await s.rtcpPeer.createAnswer(y),this._sendMemberStartMessage(s,o)}const d=_.streams[0].getAudioTracks(),g=_.streams[0].getVideoTracks(),T=[];d[0]&&T.push(d[0]),g[0]&&T.push(g[0]);const E=new MediaStream(T);s.stream=E};let t,n=[];const p=_=>{s.rtcpPeer.signalingState!=="stable"&&s.rtcpPeer.signalingState!=="have-local-offer"||(n.push(_.candidate||null),clearTimeout(t),t=setTimeout(()=>{this._sendTrickleMessage(n)},500))};s.rtcpPeer=new RTCPeerConnection,s.rtcpPeer.ontrack=a,s.rtcpPeer.onicecandidate=p,s.rtcpPeer.sender=r.sender,await s.rtcpPeer.setRemoteDescription(r.jsep)}_sendJoinMemberRequest(s){const r={janus:"message",body:{request:"join",room:this.room_id,feed:s.info.id,ptype:"subscriber"},handle_id:s.handleId,session_id:this.session_id},o=["PTYPE: Subscriber"];this.sendRequest(j.SUBSCRIBE,{extraHeaders:o,body:JSON.stringify(r),eventHandlers:{onSuccessResponse:async a=>{var t,n;if(a.status_code===200){const p=JSON.parse(a.body);(n=(t=p==null?void 0:p.plugindata)==null?void 0:t.data)!=null&&n.id&&await this._answerAttachedStream(s,p)}}}})}_attachMember(s){const r={janus:"attach",opaque_id:this.opaque_id,plugin:"janus.plugin.videoroom",session_id:this.session_id},o=["PTYPE: Subscriber"];this.sendRequest(j.INFO,{extraHeaders:o,body:JSON.stringify(r),eventHandlers:{onSuccessResponse:async a=>{if(a.status_code===200){const n=JSON.parse(a.body).data.id;s.handleId=n,this._sendJoinMemberRequest(s)}}}})}receivePublishers(s){var o,a,t,n,p,_,d,g;const r={...this.memberList};(a=(o=s==null?void 0:s.plugindata)==null?void 0:o.data)==null||a.publishers.forEach(T=>{delete r[T.id],!this.memberList[T.id]&&!this.myFeedList.includes(T.id)&&T.clientID!==this.client_id&&(this.memberList[T.id]=new RT(T,this),this._attachMember(this.memberList[T.id]))}),((n=(t=s==null?void 0:s.plugindata)==null?void 0:t.data)==null?void 0:n.videoroom)==="synced"&&Object.keys(r).forEach(T=>{r[T].hangup(),delete this.memberList[T]}),this.publishers=(_=(p=s==null?void 0:s.plugindata)==null?void 0:p.data)==null?void 0:_.publishers,this.private_id=(g=(d=s==null?void 0:s.plugindata)==null?void 0:d.data)==null?void 0:g.private_id}_receiveInviteResponse(s){if(J.debug("receiveInviteResponse()"),console.log("_receiveInviteResponse response",s),console.log("dialog",this._dialog),this._dialog&&s.status_code>=200&&s.status_code<=299&&!this.ackSent)if(console.log("IF 1 dialog"),this._dialog.id.call_id===s.call_id&&this._dialog.id.local_tag===s.from_tag&&this._dialog.id.remote_tag===s.to_tag){this.ackSent=!0,this.sendRequest(j.ACK);return}else{const r=new io(this,s,"UAC");if(r.error!==void 0){J.debug(r.error);return}this.sendRequest(j.ACK),this.sendRequest(j.BYE);return}if(this.ackSent&&!this.publisherSubscribeSent){const r=JSON.parse(s.body);this.requestAudioAndVideoPermissions().then(()=>{this.session_id=r.session_id,this.handle_id=r.data.id,this.client_id=Af();const o={janus:"message",body:{request:"join",room:this.room_id,ptype:"publisher",display:this.display_name,clientID:this.client_id,opaque_id:this.opaque_id},handle_id:this.handle_id},a=["PTYPE: Publisher"];this.sendRequest(j.SUBSCRIBE,{extraHeaders:a,body:JSON.stringify(o),eventHandlers:{onSuccessResponse:async t=>{t.status_code===200&&(this.subscribeSent=!0,this.lastTrickleReceived&&!this.isConfigureSent&&this._sendConfigureMessage({audio:!0,video:!0}).then(()=>{}))}}}),this.publisherSubscribeSent=!0,this.addTracks(this.stream.getTracks())})}if(this._is_canceled){s.status_code>=100&&s.status_code<200?this._request.cancel(this._cancel_reason):s.status_code>=200&&s.status_code<299&&this._acceptAndTerminate(s);return}if(!(this._status!==te.STATUS_INVITE_SENT&&this._status!==te.STATUS_1XX_RECEIVED))switch(!0){case/^100$/.test(s.status_code):this._status=te.STATUS_1XX_RECEIVED;break;case/^1[0-9]{2}$/.test(s.status_code):{if(!s.to_tag){J.debug("1xx response received without to tag");break}if(s.hasHeader("contact")&&!this._createDialog(s,"UAC",!0))break;if(this._status=te.STATUS_1XX_RECEIVED,!s.body){this._progress("remote",s);break}const r={originator:"remote",type:"answer",sdp:s.body};J.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>this._progress("remote",s)).catch(a=>{J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)});break}case/^2[0-9]{2}$/.test(s.status_code):{if(this._status=te.STATUS_CONFIRMED,!s.body){this._acceptAndTerminate(s,400,j.causes.MISSING_SDP),this._failed("remote",s,j.causes.BAD_MEDIA_DESCRIPTION);break}if(!this._createDialog(s,"UAC"))break;break}default:{const r=Me.sipErrorCause(s.status_code);this._failed("remote",s,r)}}}_sendReinvite(s={}){J.debug("sendReinvite()");const r=Me.cloneArray(s.extraHeaders),o=Me.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null;let t=!1;r.push(`Contact: ${this._contact}`),r.push("Content-Type: application/sdp"),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(_=>{_=this._mangleOffer(_);const d={originator:"local",type:"offer",sdp:_};J.debug('emit "sdp"'),this.emit("sdp",d),this.sendRequest(j.INVITE,{extraHeaders:r,body:_,eventHandlers:{onSuccessResponse:g=>{n.call(this,g),t=!0},onErrorResponse:g=>{p.call(this,g)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{p()});function n(_){if(this._status===te.STATUS_TERMINATED||(this.sendRequest(j.ACK),t))return;if(this._handleSessionTimersInIncomingResponse(_),_.body){if(!_.hasHeader("Content-Type")||_.getHeader("Content-Type").toLowerCase()!=="application/sdp"){p.call(this);return}}else{p.call(this);return}const d={originator:"remote",type:"answer",sdp:_.body};J.debug('emit "sdp"'),this.emit("sdp",d);const g=new RTCSessionDescription({type:"answer",sdp:d.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(g)).then(()=>{o.succeeded&&o.succeeded(_)}).catch(T=>{p.call(this),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',T),this.emit("peerconnection:setremotedescriptionfailed",T)})}function p(_){o.failed&&o.failed(_)}}_sendUpdate(s={}){J.debug("sendUpdate()");const r=Me.cloneArray(s.extraHeaders),o=Me.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null,t=s.sdpOffer||!1;let n=!1;r.push(`Contact: ${this._contact}`),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),t?(r.push("Content-Type: application/sdp"),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(d=>{d=this._mangleOffer(d);const g={originator:"local",type:"offer",sdp:d};J.debug('emit "sdp"'),this.emit("sdp",g),this.sendRequest(j.UPDATE,{extraHeaders:r,body:d,eventHandlers:{onSuccessResponse:T=>{p.call(this,T),n=!0},onErrorResponse:T=>{_.call(this,T)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{_.call(this)})):this.sendRequest(j.UPDATE,{extraHeaders:r,eventHandlers:{onSuccessResponse:d=>{p.call(this,d)},onErrorResponse:d=>{_.call(this,d)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}});function p(d){if(this._status!==te.STATUS_TERMINATED&&!n)if(this._handleSessionTimersInIncomingResponse(d),t){if(d.body){if(!d.hasHeader("Content-Type")||d.getHeader("Content-Type").toLowerCase()!=="application/sdp"){_.call(this);return}}else{_.call(this);return}const g={originator:"remote",type:"answer",sdp:d.body};J.debug('emit "sdp"'),this.emit("sdp",g);const T=new RTCSessionDescription({type:"answer",sdp:g.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(T)).then(()=>{o.succeeded&&o.succeeded(d)}).catch(E=>{_.call(this),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',E),this.emit("peerconnection:setremotedescriptionfailed",E)})}else o.succeeded&&o.succeeded(d)}function _(d){o.failed&&o.failed(d)}}_acceptAndTerminate(s,r,o){J.debug("acceptAndTerminate()");const a=[];r&&(o=o||j.REASON_PHRASE[r]||"",a.push(`Reason: SIP ;cause=${r}; text="${o}"`)),(this._dialog||this._createDialog(s,"UAC"))&&(this.sendRequest(j.ACK),this.sendRequest(j.BYE,{extraHeaders:a})),this._status=te.STATUS_TERMINATED}_mangleOffer(s){if(!this._localHold&&!this._remoteHold)return s;if(s=Ut.parse(s),this._localHold&&!this._remoteHold){J.debug("mangleOffer() | me on hold, mangling offer");for(const r of s.media)lo.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="sendonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="sendonly")}else if(this._localHold&&this._remoteHold){J.debug("mangleOffer() | both on hold, mangling offer");for(const r of s.media)lo.indexOf(r.type)!==-1&&(r.direction="inactive")}else if(this._remoteHold){J.debug("mangleOffer() | remote on hold, mangling offer");for(const r of s.media)lo.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="recvonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="recvonly")}return Ut.write(s)}_setLocalMediaStatus(){let s=!0,r=!0;(this._localHold||this._remoteHold)&&(s=!1,r=!1),this._audioMuted&&(s=!1),this._videoMuted&&(r=!1),this._toggleMuteAudio(!s),this._toggleMuteVideo(!r)}_handleSessionTimersInIncomingRequest(s,r){if(!this._sessionTimers.enabled)return;let o;s.session_expires&&s.session_expires>=j.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,o=s.session_expires_refresher||"uas"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,o="uas"),r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${o}`),this._sessionTimers.refresher=o==="uas",this._runSessionTimer()}_handleSessionTimersInIncomingResponse(s){if(!this._sessionTimers.enabled)return;let r;s.session_expires&&s.session_expires>=j.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,r=s.session_expires_refresher||"uac"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,r="uac"),this._sessionTimers.refresher=r==="uac",this._runSessionTimer()}_runSessionTimer(){const s=this._sessionTimers.currentExpires;this._sessionTimers.running=!0,clearTimeout(this._sessionTimers.timer),this._sessionTimers.refresher?this._sessionTimers.timer=setTimeout(()=>{this._status!==te.STATUS_TERMINATED&&this._isReadyToReOffer()&&(J.debug("runSessionTimer() | sending session refresh request"),this._sessionTimers.refreshMethod===j.UPDATE?this._sendUpdate():this._sendReinvite())},s*500):this._sessionTimers.timer=setTimeout(()=>{this._status!==te.STATUS_TERMINATED&&(J.warn("runSessionTimer() | timer expired, terminating the session"),this.terminate({cause:j.causes.REQUEST_TIMEOUT,status_code:408,reason_phrase:"Session Timer Expired"}))},s*1100)}_toggleMuteAudio(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="audio");for(const o of r)o.track.enabled=!s}_toggleMuteVideo(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="video");for(const o of r)o.track.enabled=!s}_newJanusSession(s,r){J.debug("newRTCSession()"),this._ua.newJanusSession(this,{originator:s,session:this,request:r})}_connecting(s){J.debug("session connecting"),J.debug('emit "connecting"'),this.emit("connecting",{request:s})}_progress(s,r){J.debug("session progress"),J.debug('emit "progress"'),this.emit("progress",{originator:s,response:r||null})}_accepted(s,r){J.debug("session accepted"),this._start_time=new Date,J.debug('emit "accepted"'),this.emit("accepted",{originator:s,response:r||null})}_confirmed(s,r){J.debug("session confirmed"),this._is_confirmed=!0,J.debug('emit "confirmed"'),this.emit("confirmed",{originator:s,ack:r||null})}_ended(s,r,o){J.debug("session ended"),this._end_time=new Date,this._close(),J.debug('emit "ended"'),this.emit("ended",{originator:s,message:r||null,cause:o})}_failed(s,r,o){J.debug("session failed"),J.debug('emit "_failed"'),this.emit("_failed",{originator:s,message:r||null,cause:o}),this._close(),J.debug('emit "failed"'),this.emit("failed",{originator:s,message:r||null,cause:o})}_onhold(s){J.debug("session onhold"),this._setLocalMediaStatus(),J.debug('emit "hold"'),this.emit("hold",{originator:s})}_onunhold(s){J.debug("session onunhold"),this._setLocalMediaStatus(),J.debug('emit "unhold"'),this.emit("unhold",{originator:s})}_onmute({audio:s,video:r}){J.debug("session onmute"),this._setLocalMediaStatus(),J.debug('emit "muted"'),this.emit("muted",{audio:s,video:r})}_onunmute({audio:s,video:r}){J.debug("session onunmute"),this._setLocalMediaStatus(),J.debug('emit "unmuted"'),this.emit("unmuted",{audio:s,video:r})}}class lr{constructor(s){if(this.headers={},s.length>0){let r=!1;const o=s.split(`\r
|
134
|
+
`,E_.send(o)}const oT=Xe(S_);var Zi={};const ar=yt(),En=De,Va=ls(),Tf=vs(),qa=xu,Ba=Es;Zi.settings={authorization_user:null,password:null,realm:null,ha1:null,authorization_jwt:null,display_name:null,uri:null,contact_uri:null,instance_id:null,use_preloaded_route:!1,session_timers:!0,session_timers_refresh_method:En.UPDATE,session_timers_force_refresher:!1,no_answer_timeout:60,register:!0,register_expires:600,registrar_server:null,sockets:null,connection_recovery_max_interval:En.CONNECTION_RECOVERY_MAX_INTERVAL,connection_recovery_min_interval:En.CONNECTION_RECOVERY_MIN_INTERVAL,extra_headers:null,via_host:`${ar.createRandomToken(12)}.invalid`};const so={mandatory:{sockets(c){const s=[];if(qa.isSocket(c))s.push({socket:c});else if(Array.isArray(c)&&c.length)for(const r of c)Object.prototype.hasOwnProperty.call(r,"socket")&&qa.isSocket(r.socket)?s.push(r):qa.isSocket(r)&&s.push({socket:r});else return;return s},uri(c){/^sip:/i.test(c)||(c=`${En.SIP}:${c}`);const s=Tf.parse(c);if(s)return s.user?s:void 0}},optional:{authorization_user(c){if(Va.parse(`"${c}"`,"quoted_string")!==-1)return c},authorization_jwt(c){if(typeof c=="string")return c},user_agent(c){if(typeof c=="string")return c},connection_recovery_max_interval(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},connection_recovery_min_interval(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},contact_uri(c){if(typeof c=="string"){const s=Va.parse(c,"SIP_URI");if(s!==-1)return s}},display_name(c){return c},instance_id(c){if(/^uuid:/i.test(c)&&(c=c.substr(5)),Va.parse(c,"uuid")!==-1)return c},no_answer_timeout(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},session_timers(c){if(typeof c=="boolean")return c},session_timers_refresh_method(c){if(typeof c=="string"&&(c=c.toUpperCase(),c===En.INVITE||c===En.UPDATE))return c},session_timers_force_refresher(c){if(typeof c=="boolean")return c},password(c){return String(c)},realm(c){return String(c)},ha1(c){return String(c)},register(c){if(typeof c=="boolean")return c},register_expires(c){if(ar.isDecimal(c)){const s=Number(c);if(s>0)return s}},registrar_server(c){/^sip:/i.test(c)||(c=`${En.SIP}:${c}`);const s=Tf.parse(c);if(s)return s.user?void 0:s},use_preloaded_route(c){if(typeof c=="boolean")return c},extra_headers(c){const s=[];if(Array.isArray(c)&&c.length)for(const r of c)typeof r=="string"&&s.push(r);else return;return s}}};Zi.load=(c,s)=>{for(const r in so.mandatory)if(s.hasOwnProperty(r)){const o=s[r],a=so.mandatory[r](o);if(a!==void 0)c[r]=a;else throw new Ba.ConfigurationError(r,o)}else throw new Ba.ConfigurationError(r);for(const r in so.optional)if(s.hasOwnProperty(r)){const o=s[r];if(ar.isEmpty(o))continue;const a=so.optional[r](o);if(a!==void 0)c[r]=a;else throw new Ba.ConfigurationError(r,o)}};const aT=ft.EventEmitter,uT=at,mt=De,cT=Qm,vf=g_,Ef=kg,Sf=jg,Ga=pr,fT=T_,no=yt(),_T=Es,hT=vs(),dT=Mu,Wa=Pt,pT=S_,Ka=Zi,Ve=new uT("UA"),vt={STATUS_INIT:0,STATUS_READY:1,STATUS_USER_CLOSED:2,STATUS_NOT_READY:3,CONFIGURATION_ERROR:1,NETWORK_ERROR:2};var y_=class extends aT{static get C(){return vt}constructor(s){if(Ve.debug("new() [configuration:%o]",s),super(),this._cache={credentials:{}},this._configuration=Object.assign({},Ka.settings),this._dynConfiguration={},this._dialogs={},this._applicants={},this._sessions={},this._transport=null,this._contact=null,this._status=vt.STATUS_INIT,this._error=null,this._transactions={nist:{},nict:{},ist:{},ict:{}},this._data={},this._closeTimer=null,s===void 0)throw new TypeError("Not enough arguments");try{this._loadConfig(s)}catch(r){throw this._status=vt.STATUS_NOT_READY,this._error=vt.CONFIGURATION_ERROR,r}this._registrator=new cT(this)}get C(){return vt}get status(){return this._status}get contact(){return this._contact}get configuration(){return this._configuration}get transport(){return this._transport}start(){Ve.debug("start()"),this._status===vt.STATUS_INIT?this._transport.connect():this._status===vt.STATUS_USER_CLOSED?(Ve.debug("restarting UA"),this._closeTimer!==null&&(clearTimeout(this._closeTimer),this._closeTimer=null,this._transport.disconnect()),this._status=vt.STATUS_INIT,this._transport.connect()):this._status===vt.STATUS_READY?Ve.debug("UA is in READY status, not restarted"):Ve.debug("ERROR: connection is down, Auto-Recovery system is trying to reconnect"),this._dynConfiguration.register=this._configuration.register}register(){Ve.debug("register()"),this._dynConfiguration.register=!0,this._registrator.register()}unregister(s){Ve.debug("unregister()"),this._dynConfiguration.register=!1,this._registrator.unregister(s)}registrator(){return this._registrator}isRegistered(){return this._registrator.registered}isConnected(){return this._transport.isConnected()}call(s,r){Ve.debug("call()");const o=new vf(this);return o.connect(s,r),o}sendMessage(s,r,o){Ve.debug("sendMessage()");const a=new Ef(this);return a.send(s,r,o),a}sendOptions(s,r,o){Ve.debug("sendOptions()");const a=new Sf(this);return a.send(s,r,o),a}terminateSessions(s){Ve.debug("terminateSessions()");for(const r in this._sessions)this._sessions[r].isEnded()||this._sessions[r].terminate(s)}stop(){if(Ve.debug("stop()"),this._dynConfiguration={},this._status===vt.STATUS_USER_CLOSED){Ve.debug("UA already closed");return}this._registrator.close();const s=Object.keys(this._sessions).length;for(const o in this._sessions)if(Object.prototype.hasOwnProperty.call(this._sessions,o)){Ve.debug(`closing session ${o}`);try{this._sessions[o].terminate()}catch{}}for(const o in this._applicants)if(Object.prototype.hasOwnProperty.call(this._applicants,o))try{this._applicants[o].close()}catch{}this._status=vt.STATUS_USER_CLOSED,Object.keys(this._transactions.nict).length+Object.keys(this._transactions.nist).length+Object.keys(this._transactions.ict).length+Object.keys(this._transactions.ist).length===0&&s===0?this._transport.disconnect():this._closeTimer=setTimeout(()=>{this._closeTimer=null,this._transport.disconnect()},2e3)}normalizeTarget(s){return no.normalizeTarget(s,this._configuration.hostport_params)}get(s){switch(s){case"authorization_user":return this._configuration.authorization_user;case"realm":return this._configuration.realm;case"ha1":return this._configuration.ha1;case"authorization_jwt":return this._configuration.authorization_jwt;default:Ve.warn('get() | cannot get "%s" parameter in runtime',s);return}}set(s,r){switch(s){case"authorization_user":{this._configuration.authorization_user=String(r);break}case"password":{this._configuration.password=String(r);break}case"realm":{this._configuration.realm=String(r);break}case"ha1":{this._configuration.ha1=String(r),this._configuration.password=null;break}case"authorization_jwt":{this._configuration.authorization_jwt=String(r);break}case"display_name":{this._configuration.display_name=r;break}default:return Ve.warn('set() | cannot set "%s" parameter in runtime',s),!1}return!0}newTransaction(s){this._transactions[s.type][s.id]=s,this.emit("newTransaction",{transaction:s})}destroyTransaction(s){delete this._transactions[s.type][s.id],this.emit("transactionDestroyed",{transaction:s})}newDialog(s){this._dialogs[s.id]=s}destroyDialog(s){delete this._dialogs[s.id]}newMessage(s,r){this._applicants[s]=s,this.emit("newMessage",r)}newOptions(s,r){this._applicants[s]=s,this.emit("newOptions",r)}destroyMessage(s){delete this._applicants[s]}newRTCSession(s,r){this._sessions[s.id]=s,this.emit("newRTCSession",r)}destroyRTCSession(s){delete this._sessions[s.id]}registered(s){this.emit("registered",s)}unregistered(s){this.emit("unregistered",s)}registrationFailed(s){this.emit("registrationFailed",s)}receiveRequest(s){const r=s.method;if(s.ruri.user!==this._configuration.uri.user&&s.ruri.user!==this._contact.uri.user){Ve.debug("Request-URI does not point to us"),s.method!==mt.ACK&&s.reply_sl(404);return}if(s.ruri.scheme===mt.SIPS){s.reply_sl(416);return}if(Ga.checkTransaction(this,s))return;if(r===mt.INVITE?new Ga.InviteServerTransaction(this,this._transport,s):r!==mt.ACK&&r!==mt.CANCEL&&new Ga.NonInviteServerTransaction(this,this._transport,s),r===mt.OPTIONS){if(this.listeners("newOptions").length===0){s.reply(200);return}new Sf(this).init_incoming(s)}else if(r===mt.MESSAGE){if(this.listeners("newMessage").length===0){s.reply(405);return}new Ef(this).init_incoming(s)}else if(r===mt.INVITE&&!s.to_tag&&this.listeners("newRTCSession").length===0){s.reply(405);return}let o,a;if(s.to_tag)o=this._findDialog(s.call_id,s.from_tag,s.to_tag),o?o.receiveRequest(s):r===mt.NOTIFY?(a=this._findSession(s),a?a.receiveRequest(s):(Ve.debug("received NOTIFY request for a non existent subscription"),s.reply(481,"Subscription does not exist"))):r!==mt.ACK&&s.reply(481);else switch(r){case mt.INVITE:if(window.RTCPeerConnection)if(s.hasHeader("replaces")){const t=s.replaces;o=this._findDialog(t.call_id,t.from_tag,t.to_tag),o?(a=o.owner,a.isEnded()?s.reply(603):a.receiveRequest(s)):s.reply(481)}else a=new vf(this),a.init_incoming(s);else Ve.warn("INVITE received but WebRTC is not supported"),s.reply(488);break;case mt.BYE:s.reply(481);break;case mt.CANCEL:a=this._findSession(s),a?a.receiveRequest(s):Ve.debug("received CANCEL request for a non existent session");break;case mt.ACK:break;case mt.NOTIFY:this.emit("sipEvent",{event:s.event,request:s}),s.reply(200);break;default:s.reply(405);break}}_findSession({call_id:s,from_tag:r,to_tag:o}){const a=s+r,t=this._sessions[a],n=s+o,p=this._sessions[n];return t||p||null}_findDialog(s,r,o){let a=s+r+o,t=this._dialogs[a];return t||(a=s+o+r,t=this._dialogs[a],t||null)}_loadConfig(s){try{Ka.load(this._configuration,s)}catch(a){throw a}this._configuration.display_name===0&&(this._configuration.display_name="0"),this._configuration.instance_id||(this._configuration.instance_id=no.newUUID()),this._configuration.jssip_id=no.createRandomToken(5);const r=this._configuration.uri.clone();r.user=null,this._configuration.hostport_params=r.toString().replace(/^sip:/i,"");try{this._transport=new fT(this._configuration.sockets,{max_interval:this._configuration.connection_recovery_max_interval,min_interval:this._configuration.connection_recovery_min_interval}),this._transport.onconnecting=mT.bind(this),this._transport.onconnect=gT.bind(this),this._transport.ondisconnect=TT.bind(this),this._transport.ondata=vT.bind(this)}catch(a){throw Ve.warn(a),new _T.ConfigurationError("sockets",this._configuration.sockets)}if(delete this._configuration.sockets,this._configuration.authorization_user||(this._configuration.authorization_user=this._configuration.uri.user),!this._configuration.registrar_server){const a=this._configuration.uri.clone();a.user=null,a.clearParams(),a.clearHeaders(),this._configuration.registrar_server=a}this._configuration.no_answer_timeout*=1e3,this._configuration.contact_uri?this._configuration.via_host=this._configuration.contact_uri.host:this._configuration.contact_uri=new hT("sip",no.createRandomToken(8),this._configuration.via_host,null,{transport:"ws"}),this._contact={pub_gruu:null,temp_gruu:null,uri:this._configuration.contact_uri,toString(a={}){const t=a.anonymous||null,n=a.outbound||null;let p="<";return t?p+=this.temp_gruu||"sip:anonymous@anonymous.invalid;transport=ws":p+=this.pub_gruu||this.uri.toString(),n&&(t?!this.temp_gruu:!this.pub_gruu)&&(p+=";ob"),p+=">",p}};const o=["authorization_user","password","realm","ha1","authorization_jwt","display_name","register"];for(const a in this._configuration)Object.prototype.hasOwnProperty.call(this._configuration,a)&&(o.indexOf(a)!==-1?Object.defineProperty(this._configuration,a,{writable:!0,configurable:!1}):Object.defineProperty(this._configuration,a,{writable:!1,configurable:!1}));Ve.debug("configuration parameters after validation:");for(const a in this._configuration)if(Object.prototype.hasOwnProperty.call(Ka.settings,a))switch(a){case"uri":case"registrar_server":Ve.debug(`- ${a}: ${this._configuration[a]}`);break;case"password":case"ha1":case"authorization_jwt":Ve.debug(`- ${a}: NOT SHOWN`);break;default:Ve.debug(`- ${a}: ${JSON.stringify(this._configuration[a])}`)}}};function mT(c){this.emit("connecting",c)}function gT(c){this._status!==vt.STATUS_USER_CLOSED&&(this._status=vt.STATUS_READY,this._error=null,this.emit("connected",c),this._dynConfiguration.register&&this._registrator.register())}function TT(c){const s=["nict","ict","nist","ist"];for(const r of s)for(const o in this._transactions[r])Object.prototype.hasOwnProperty.call(this._transactions[r],o)&&this._transactions[r][o].onTransportError();this.emit("disconnected",c),this._registrator.onTransportClosed(),this._status!==vt.STATUS_USER_CLOSED&&(this._status=vt.STATUS_NOT_READY,this._error=vt.NETWORK_ERROR)}function vT(c){console.log("onTransportData",c);const s=c.transport;let r=c.message;if(r=dT.parseMessage(r,this),!!r&&!(this._status===vt.STATUS_USER_CLOSED&&r instanceof Wa.IncomingRequest)&&pT(r,this,s)){if(r instanceof Wa.IncomingRequest)r.transport=s,this.receiveRequest(r);else if(r instanceof Wa.IncomingResponse){let o;switch(r.method){case mt.INVITE:o=this._transactions.ict[r.via_branch],o&&o.receiveResponse(r);break;case mt.ACK:break;default:o=this._transactions.nict[r.via_branch],o&&o.receiveResponse(r);break}}}}const ET=Xe(y_);var dt=[];for(var Ya=0;Ya<256;++Ya)dt.push((Ya+256).toString(16).slice(1));function ST(c,s=0){return(dt[c[s+0]]+dt[c[s+1]]+dt[c[s+2]]+dt[c[s+3]]+"-"+dt[c[s+4]]+dt[c[s+5]]+"-"+dt[c[s+6]]+dt[c[s+7]]+"-"+dt[c[s+8]]+dt[c[s+9]]+"-"+dt[c[s+10]]+dt[c[s+11]]+dt[c[s+12]]+dt[c[s+13]]+dt[c[s+14]]+dt[c[s+15]]).toLowerCase()}var ro,yT=new Uint8Array(16);function AT(){if(!ro&&(ro=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!ro))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ro(yT)}var CT=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);const yf={randomUUID:CT};function Af(c,s,r){if(yf.randomUUID&&!s&&!c)return yf.randomUUID();c=c||{};var o=c.random||(c.rng||AT)();if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,s){r=r||0;for(var a=0;a<16;++a)s[r+a]=o[a];return s}return ST(o)}var Me=yt();const fr=Xe(Me),za=new n_("Dialog"),Ls={STATUS_EARLY:1,STATUS_CONFIRMED:2,STATUS_TERMINATED:3};class io{static get C(){return Ls}constructor(s,r,o,a=Ls.STATUS_CONFIRMED){if(this._owner=s,this._ua=s._ua,this._uac_pending_reply=!1,this._uas_pending_reply=!1,r instanceof Pt.IncomingResponse&&(a=r.status_code<200?Ls.STATUS_EARLY:Ls.STATUS_CONFIRMED),o==="UAS"){this._id={call_id:r.call_id,local_tag:r.to_tag,remote_tag:r.from_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._remote_seqnum=r.cseq,this._local_uri=r.parseHeader("to").uri,this._remote_uri=r.parseHeader("from").uri;let t=r.getHeaders("to")[0].split(";")[0];t=t.match(/<([^>]*)>/)[1],this._remote_target=t,this._route_set=r.getHeaders("record-route"),this._ack_seqnum=this._remote_seqnum}else if(o==="UAC"){this._id={call_id:r.call_id,local_tag:r.from_tag,remote_tag:r.to_tag,toString(){return this.call_id+this.local_tag+this.remote_tag}},this._state=a,this._local_seqnum=r.cseq,this._local_uri=r.parseHeader("from").uri,this._remote_uri=r.parseHeader("to").uri;let t=r.getHeaders("to")[0].split(";")[0];t=t.match(/<([^>]*)>/)[1],this._remote_target=t,this._route_set=r.getHeaders("record-route").reverse(),this._ack_seqnum=null}this._ua.newDialog(this),za.debug(`new ${o} dialog created with status ${this._state===Ls.STATUS_EARLY?"EARLY":"CONFIRMED"}`)}get id(){return this._id}get local_seqnum(){return this._local_seqnum}set local_seqnum(s){this._local_seqnum=s}get owner(){return this._owner}get uac_pending_reply(){return this._uac_pending_reply}set uac_pending_reply(s){this._uac_pending_reply=s}get uas_pending_reply(){return this._uas_pending_reply}isTerminated(){return this._status===Ls.STATUS_TERMINATED}update(s,r){this._state=Ls.STATUS_CONFIRMED,za.debug(`dialog ${this._id.toString()} changed to CONFIRMED state`),r==="UAC"&&(this._route_set=s.getHeaders("record-route").reverse())}terminate(){za.debug(`dialog ${this._id.toString()} deleted`),this._ua.destroyDialog(this),this._state=Ls.STATUS_TERMINATED}sendRequest(s,r={}){const o=fr.cloneArray(r.extraHeaders),a=fr.cloneObject(r.eventHandlers),t=r.body||null,n=this._createRequest(s,o,t);return a.onAuthenticated=()=>{this._local_seqnum+=1},new rg(this,n,a).send(),n}receiveRequest(s){this._checkInDialogRequest(s)&&(s.method===j.ACK&&this._ack_seqnum!==null?this._ack_seqnum=null:s.method===j.INVITE&&(this._ack_seqnum=s.cseq),this._owner.receiveRequest(s))}_createRequest(s,r,o){r=fr.cloneArray(r),this._local_seqnum||(this._local_seqnum=Math.floor(Math.random()*1e4));const a=s===j.CANCEL||s===j.ACK?this._local_seqnum:this._local_seqnum+=1;return new Pt.OutgoingRequest(s,this._remote_target,this._ua,{cseq:a,call_id:this._id.call_id,from_uri:this._local_uri,from_tag:this._id.local_tag,to_uri:this._remote_uri,to_tag:this._id.remote_tag,route_set:this._route_set},r,o)}_checkInDialogRequest(s){if(!this._remote_seqnum)this._remote_seqnum=s.cseq;else if(s.cseq<this._remote_seqnum)if(s.method===j.ACK){if(this._ack_seqnum===null||s.cseq!==this._ack_seqnum)return!1}else return s.reply(500),!1;else s.cseq>this._remote_seqnum&&(this._remote_seqnum=s.cseq);if(s.method===j.INVITE||s.method===j.UPDATE&&s.body){if(this._uac_pending_reply===!0)s.reply(491);else if(this._uas_pending_reply===!0){const r=(Math.random()*10|0)+1;return s.reply(500,null,[`Retry-After:${r}`]),!1}else{this._uas_pending_reply=!0;const r=()=>{(s.server_transaction.state===Bt.C.STATUS_ACCEPTED||s.server_transaction.state===Bt.C.STATUS_COMPLETED||s.server_transaction.state===Bt.C.STATUS_TERMINATED)&&(s.server_transaction.removeListener("stateChanged",r),this._uas_pending_reply=!1)};s.server_transaction.on("stateChanged",r)}s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Bt.C.STATUS_ACCEPTED&&(this._remote_target=s.parseHeader("contact").uri)})}else s.method===j.NOTIFY&&s.hasHeader("contact")&&s.server_transaction.on("stateChanged",()=>{s.server_transaction.state===Bt.C.STATUS_COMPLETED&&(this._remote_target=s.parseHeader("contact").uri)});return!0}}class RT{constructor(s,r){Wt(this,"plugin",null);Wt(this,"rtcpPeer",null);Wt(this,"handleId",0);Wt(this,"info",null);Wt(this,"joinResult",null);Wt(this,"state",{});Wt(this,"stream",null);Wt(this,"loaded",!1);Wt(this,"aTracks",[]);Wt(this,"vTracks",[]);this.info=s,this.plugin=r,this.rtcpPeer=new RTCPeerConnection({iceServers:[]})}get memberInfo(){return{stream:this.stream,joinResult:this.joinResult,sender:this.handleId,type:"subscriber",name:this.info.display,state:this.state,id:this.handleId}}updateMemberState(s){var r;this.state={...this.state,...s||{}},(r=this.plugin)==null||r.session.emit("member:update",this.memberInfo)}updateMemberStateFromMessage(s){var t,n,p,_;const r=(n=(t=s==null?void 0:s.plugindata)==null?void 0:t.data)==null?void 0:n.newStatePublisher,a=((_=(p=s==null?void 0:s.plugindata)==null?void 0:p.data)==null?void 0:_.publisher_state).find(d=>d.id===r);this.updateMemberState(a==null?void 0:a.state)}hangup(){this.rtcpPeer&&(this.rtcpPeer.close(),this.rtcpPeer=null),this.plugin.session.emit("member:hangup",{info:this.info,sender:this.handleId}),this.plugin.send({janus:"detach"},{handle_id:this.handleId}).catch(console.log)}}var IT=vs();const _r=Xe(IT),J=new n_("JanusSession"),bT="/opt/recordings/",te={STATUS_NULL:0,STATUS_INVITE_SENT:1,STATUS_1XX_RECEIVED:2,STATUS_INVITE_RECEIVED:3,STATUS_WAITING_FOR_ANSWER:4,STATUS_ANSWERED:5,STATUS_WAITING_FOR_ACK:6,STATUS_CANCELED:7,STATUS_TERMINATED:8,STATUS_CONFIRMED:9},lo=["audio","video"];class Po extends ft.EventEmitter{static get C(){return te}constructor(s){J.debug("new"),super(),console.log("constructor call"),this._id=null,this._ua=s,this._status=te.STATUS_NULL,this._dialog=null,this._earlyDialogs={},this._contact=null,this._from_tag=null,this._to_tag=null,this.lastTransaction=0,this._connection=null,this._connectionPromiseQueue=Promise.resolve(),this._request=null,this._is_canceled=!1,this._cancel_reason="",this._is_confirmed=!1,this._late_sdp=!1,this._rtcOfferConstraints=null,this._rtcAnswerConstraints=null,this._localMediaStream=null,this._localMediaStreamLocallyGenerated=!1,this._rtcReady=!0,this._iceReady=!1,this._timers={ackTimer:null,expiresTimer:null,invite2xxTimer:null,userNoAnswerTimer:null},this._direction=null,this._local_identity=null,this._remote_identity=null,this._start_time=null,this._end_time=null,this._audioMuted=!1,this._videoMuted=!1,this._localHold=!1,this._remoteHold=!1,this._sessionTimers={enabled:this._ua.configuration.session_timers,refreshMethod:this._ua.configuration.session_timers_refresh_method,defaultExpires:j.SESSION_EXPIRES,currentExpires:null,running:!1,refresher:!1,timer:null},this._referSubscribers={},this._candidates=[],this.publishers=[],this.private_id=null,this.memberList={},this.myFeedList=[],this.display_name="",this.stunServers=[{urls:"stun:turn.voicenter.co",credential:"kxsjahnsdjns3eds23esd",username:"turn2es21e"}];const r=Af().replace(/-/g,"").slice(0,12);this.opaque_id=`videoroomtest-${r}`,this._data={}}get C(){return te}get causes(){return j.causes}get id(){return this._id}get connection(){return this._connection}get contact(){return this._contact}get direction(){return this._direction}get local_identity(){return this._local_identity}get remote_identity(){return this._remote_identity}get start_time(){return this._start_time}get end_time(){return this._end_time}get data(){return this._data}set data(s){this._data=s}get status(){return this._status}isInProgress(){switch(this._status){case te.STATUS_NULL:case te.STATUS_INVITE_SENT:case te.STATUS_1XX_RECEIVED:case te.STATUS_INVITE_RECEIVED:case te.STATUS_WAITING_FOR_ANSWER:return!0;default:return!1}}isEstablished(){switch(this._status){case te.STATUS_ANSWERED:case te.STATUS_WAITING_FOR_ACK:case te.STATUS_CONFIRMED:return!0;default:return!1}}isEnded(){switch(this._status){case te.STATUS_CANCELED:case te.STATUS_TERMINATED:return!0;default:return!1}}isMuted(){return{audio:this._audioMuted,video:this._videoMuted}}isOnHold(){return{local:this._localHold,remote:this._remoteHold}}connect(s,r,o={},a){J.debug("connect()"),this.display_name=r;const t=s,n=Me.cloneObject(o.eventHandlers),p=Me.cloneArray(o.extraHeaders),_=Me.cloneObject(o.mediaConstraints,{audio:!0,video:!0}),d=o.mediaStream||null,g=Me.cloneObject(o.pcConfig,{iceServers:[]}),T=o.rtcConstraints||null,E=o.rtcOfferConstraints||null;if(this._rtcOfferConstraints=E,this._rtcAnswerConstraints=o.rtcAnswerConstraints||null,this._data=o.data||this._data,s===void 0)throw new TypeError("Not enough arguments");if(this._status!==te.STATUS_NULL)throw new Hs.InvalidStateError(this._status);if(!window.RTCPeerConnection)throw new Hs.NotSupportedError("WebRTC not supported");if(console.log("target",s),s=this._ua.normalizeTarget(s),console.log("normalizeTarget target",s),this.room_id=s.user,!s)throw new TypeError(`Invalid target: ${t}`);this._sessionTimers.enabled&&Me.isDecimal(o.sessionTimersExpires)&&(o.sessionTimersExpires>=j.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=o.sessionTimersExpires:this._sessionTimers.defaultExpires=j.SESSION_EXPIRES);for(const C in n)Object.prototype.hasOwnProperty.call(n,C)&&this.on(C,n[C]);this._from_tag=Me.newTag();const y=o.anonymous||!1,A={from_tag:this._from_tag};this._contact=this._ua.contact.toString({anonymous:y,outbound:!0}),y?(A.from_display_name="Anonymous",A.from_uri=new _r("sip","anonymous","anonymous.invalid"),p.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`),p.push("Privacy: id")):o.fromUserName&&(A.from_uri=new _r("sip",o.fromUserName,this._ua.configuration.uri.host),p.push(`P-Preferred-Identity: ${this._ua.configuration.uri.toString()}`)),o.fromDisplayName&&(A.from_display_name=o.fromDisplayName),p.push(`Contact: ${this._contact}`),p.push("Content-Type: application/json"),this._sessionTimers.enabled&&p.push(`Session-Expires: ${this._sessionTimers.defaultExpires}${this._ua.configuration.session_timers_force_refresher?";refresher=uac":""}`),this._request=new Pt.InitialOutgoingInviteRequest(s,this._ua,A,p),this._id=this._request.call_id+this._from_tag,this._createRTCConnection(g,T),this._direction="outgoing",this._local_identity=this._request.from,this._remote_identity=this._request.to,console.log("this._remote_identity",this._remote_identity),a&&a(this),this._newJanusSession("local",this._request),this._sendInitialRequest(_,E,d)}init_incoming(s,r){J.debug("init_incoming()");let o;const a=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;if(s.body&&a!=="application/sdp"){s.reply(415);return}if(this._status=te.STATUS_INVITE_RECEIVED,this._from_tag=s.from_tag,this._id=s.call_id+this._from_tag,this._request=s,this._contact=this._ua.contact.toString(),s.hasHeader("expires")&&(o=s.getHeader("expires")*1e3),s.to_tag=Me.newTag(),!this._createDialog(s,"UAS",!0)){s.reply(500,"Missing Contact header field");return}s.body?this._late_sdp=!1:this._late_sdp=!0,this._status=te.STATUS_WAITING_FOR_ANSWER,this._timers.userNoAnswerTimer=setTimeout(()=>{s.reply(408),this._failed("local",null,j.causes.NO_ANSWER)},this._ua.configuration.no_answer_timeout),o&&(this._timers.expiresTimer=setTimeout(()=>{this._status===te.STATUS_WAITING_FOR_ANSWER&&(s.reply(487),this._failed("system",null,j.causes.EXPIRES))},o)),this._direction="incoming",this._local_identity=s.to,this._remote_identity=s.from,r&&r(this),this._newJanusSession("remote",s),this._status!==te.STATUS_TERMINATED&&(s.reply(180,null,[`Contact: ${this._contact}`]),this._progress("local",null))}answer(s={}){J.debug("answer()");const r=this._request,o=Me.cloneArray(s.extraHeaders),a=Me.cloneObject(s.mediaConstraints),t=s.mediaStream||null,n=Me.cloneObject(s.pcConfig,{iceServers:[]}),p=s.rtcConstraints||null,_=s.rtcAnswerConstraints||null,d=Me.cloneObject(s.rtcOfferConstraints);let g,T=!1,E=!1,y=!1,A=!1;if(this._rtcAnswerConstraints=_,this._rtcOfferConstraints=s.rtcOfferConstraints||null,this._data=s.data||this._data,this._direction!=="incoming")throw new Hs.NotSupportedError('"answer" not supported for outgoing RTCSession');if(this._status!==te.STATUS_WAITING_FOR_ANSWER)throw new Hs.InvalidStateError(this._status);if(this._sessionTimers.enabled&&Me.isDecimal(s.sessionTimersExpires)&&(s.sessionTimersExpires>=j.MIN_SESSION_EXPIRES?this._sessionTimers.defaultExpires=s.sessionTimersExpires:this._sessionTimers.defaultExpires=j.SESSION_EXPIRES),this._status=te.STATUS_ANSWERED,!this._createDialog(r,"UAS")){r.reply(500,"Error creating dialog");return}clearTimeout(this._timers.userNoAnswerTimer),o.unshift(`Contact: ${this._contact}`);const C=r.parseSDP();Array.isArray(C.media)||(C.media=[C.media]);for(const I of C.media)I.type==="audio"&&(T=!0,(!I.direction||I.direction==="sendrecv")&&(y=!0)),I.type==="video"&&(E=!0,(!I.direction||I.direction==="sendrecv")&&(A=!0));if(t&&a.audio===!1){g=t.getAudioTracks();for(const I of g)t.removeTrack(I)}if(t&&a.video===!1){g=t.getVideoTracks();for(const I of g)t.removeTrack(I)}!t&&a.audio===void 0&&(a.audio=y),!t&&a.video===void 0&&(a.video=A),!t&&!T&&!d.offerToReceiveAudio&&(a.audio=!1),!t&&!E&&!d.offerToReceiveVideo&&(a.video=!1),this._createRTCConnection(n,p),Promise.resolve().then(()=>{if(t)return t;if(a.audio||a.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(a).catch(I=>{throw this._status===te.STATUS_TERMINATED?new Error("terminated"):(r.reply(480),this._failed("local",null,j.causes.USER_DENIED_MEDIA_ACCESS),J.warn('emit "getusermediafailed" [error:%o]',I),this.emit("getusermediafailed",I),new Error("getUserMedia() failed"))})}).then(I=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");this._localMediaStream=I,I&&I.getTracks().forEach($=>{this._connection.addTrack($,I)})}).then(()=>{if(this._late_sdp)return;const I={originator:"remote",type:"offer",sdp:r.body};J.debug('emit "sdp"'),this.emit("sdp",I);const $=new RTCSessionDescription({type:"offer",sdp:I.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription($)).catch(L=>{throw r.reply(488),this._failed("system",null,j.causes.WEBRTC_ERROR),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',L),this.emit("peerconnection:setremotedescriptionfailed",L),new Error("peerconnection.setRemoteDescription() failed")}),this._connectionPromiseQueue}).then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._connecting(r),this._late_sdp?this._createLocalDescription("offer",this._rtcOfferConstraints).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")}):this._createLocalDescription("answer",_).catch(()=>{throw r.reply(500),new Error("_createLocalDescription() failed")})}).then(I=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");this._handleSessionTimersInIncomingRequest(r,o),r.reply(200,null,o,I,()=>{this._status=te.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(r,I),this._setACKTimer(),this._accepted("local")},()=>{this._failed("system",null,j.causes.CONNECTION_ERROR)})}).catch(I=>{this._status!==te.STATUS_TERMINATED&&J.warn(I)})}terminate(s={}){J.debug("terminate()");const r=s.cause||j.causes.BYE,o=Me.cloneArray(s.extraHeaders),a=s.body;let t,n=s.status_code,p=s.reason_phrase;if(this._status===te.STATUS_TERMINATED)throw new Hs.InvalidStateError(this._status);switch(this._status){case te.STATUS_NULL:case te.STATUS_INVITE_SENT:case te.STATUS_1XX_RECEIVED:if(J.debug("canceling session"),n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);n&&(p=p||j.REASON_PHRASE[n]||"",t=`SIP ;cause=${n} ;text="${p}"`),this._status===te.STATUS_NULL||this._status===te.STATUS_INVITE_SENT?(this._is_canceled=!0,this._cancel_reason=t):this._status===te.STATUS_1XX_RECEIVED&&this._request.cancel(t),this._status=te.STATUS_CANCELED,this._failed("local",null,j.causes.CANCELED);break;case te.STATUS_WAITING_FOR_ANSWER:case te.STATUS_ANSWERED:if(J.debug("rejecting session"),n=n||480,n<300||n>=700)throw new TypeError(`Invalid status_code: ${n}`);this._request.reply(n,p,o,a),this._failed("local",null,j.causes.REJECTED);break;case te.STATUS_WAITING_FOR_ACK:case te.STATUS_CONFIRMED:if(J.debug("terminating session"),p=s.reason_phrase||j.REASON_PHRASE[n]||"",n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);if(n&&o.push(`Reason: SIP ;cause=${n}; text="${p}"`),this._status===te.STATUS_WAITING_FOR_ACK&&this._direction==="incoming"&&this._request.server_transaction.state!==Bt.C.STATUS_TERMINATED){const _=this._dialog;this.receiveRequest=({method:d})=>{d===j.ACK&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())},this._request.server_transaction.on("stateChanged",()=>{this._request.server_transaction.state===Bt.C.STATUS_TERMINATED&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())}),this._ended("local",null,r),this._dialog=_,console.log("SET DIALOG terminate"),this._ua.newDialog(_)}else this.sendRequest(j.BYE,{extraHeaders:o,body:a}),this._ended("local",null,r)}}sendInfo(s,r,o={}){if(J.debug("sendInfo()"),this._status!==te.STATUS_CONFIRMED&&this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_1XX_RECEIVED)throw new Hs.InvalidStateError(this._status);new pu(this).send(s,r,o)}mute(s={audio:!0,video:!1}){J.debug("mute()");let r=!1,o=!1;this._audioMuted===!1&&s.audio&&(r=!0,this._audioMuted=!0,this._toggleMuteAudio(!0)),this._videoMuted===!1&&s.video&&(o=!0,this._videoMuted=!0,this._toggleMuteVideo(!0)),(r===!0||o===!0)&&this._onmute({audio:r,video:o})}unmute(s={audio:!0,video:!0}){J.debug("unmute()");let r=!1,o=!1;this._audioMuted===!0&&s.audio&&(r=!0,this._audioMuted=!1,this._localHold===!1&&this._toggleMuteAudio(!1)),this._videoMuted===!0&&s.video&&(o=!0,this._videoMuted=!1,this._localHold===!1&&this._toggleMuteVideo(!1)),(r===!0||o===!0)&&this._onunmute({audio:r,video:o})}hold(s={},r){if(J.debug("hold()"),this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED||this._localHold===!0||!this._isReadyToReOffer())return!1;this._localHold=!0,this._onhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:j.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Hold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}unhold(s={},r){if(J.debug("unhold()"),this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED||this._localHold===!1||!this._isReadyToReOffer())return!1;this._localHold=!1,this._onunhold("local");const o={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:j.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Unhold Failed"})}};return s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:o,extraHeaders:s.extraHeaders}),!0}renegotiate(s={},r){J.debug("renegotiate()");const o=s.rtcOfferConstraints||null;if(this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED||!this._isReadyToReOffer())return!1;const a={succeeded:()=>{r&&r()},failed:()=>{this.terminate({cause:j.causes.WEBRTC_ERROR,status_code:500,reason_phrase:"Media Renegotiation Failed"})}};return this._setLocalMediaStatus(),s.useUpdate?this._sendUpdate({sdpOffer:!0,eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}):this._sendReinvite({eventHandlers:a,rtcOfferConstraints:o,extraHeaders:s.extraHeaders}),!0}refer(s,r){J.debug("refer()");const o=s;if(this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED)return!1;if(s=this._ua.normalizeTarget(s),!s)throw new TypeError(`Invalid target: ${o}`);const a=new Ag(this);a.sendRefer(s,r);const t=a.id;return this._referSubscribers[t]=a,a.on("requestFailed",()=>{delete this._referSubscribers[t]}),a.on("accepted",()=>{delete this._referSubscribers[t]}),a.on("failed",()=>{delete this._referSubscribers[t]}),a}sendRequest(s,r){return J.debug("sendRequest()"),this._dialog.sendRequest(s,r)}receiveNotify(s){J.debug("receiveRequest()")}receiveRequest(s){if(J.debug("receiveRequest()"),s.method===j.CANCEL)(this._status===te.STATUS_WAITING_FOR_ANSWER||this._status===te.STATUS_ANSWERED)&&(this._status=te.STATUS_CANCELED,this._request.reply(487),this._failed("remote",s,j.causes.CANCELED));else switch(s.method){case j.ACK:if(this._status!==te.STATUS_WAITING_FOR_ACK)return;if(this._status=te.STATUS_CONFIRMED,clearTimeout(this._timers.ackTimer),clearTimeout(this._timers.invite2xxTimer),this._late_sdp){if(!s.body){this.terminate({cause:j.causes.MISSING_SDP,status_code:400});break}const r={originator:"remote",type:"answer",sdp:s.body};J.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>{this._is_confirmed||this._confirmed("remote",s)}).catch(a=>{this.terminate({cause:j.causes.BAD_MEDIA_DESCRIPTION,status_code:488}),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})}else this._is_confirmed||this._confirmed("remote",s);break;case j.BYE:this._status===te.STATUS_CONFIRMED||this._status===te.STATUS_WAITING_FOR_ACK?(s.reply(200),this._ended("remote",s,j.causes.BYE)):this._status===te.STATUS_INVITE_RECEIVED||this._status===te.STATUS_WAITING_FOR_ANSWER?(s.reply(200),this._request.reply(487,"BYE Received"),this._ended("remote",s,j.causes.BYE)):s.reply(403,"Wrong Status");break;case j.INVITE:this._status===te.STATUS_CONFIRMED?s.hasHeader("replaces")?this._receiveReplaces(s):this._receiveReinvite(s):s.reply(403,"Wrong Status");break;case j.INFO:if(this._status===te.STATUS_1XX_RECEIVED||this._status===te.STATUS_WAITING_FOR_ANSWER||this._status===te.STATUS_ANSWERED||this._status===te.STATUS_WAITING_FOR_ACK||this._status===te.STATUS_CONFIRMED){const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;r&&r.match(/^application\/dtmf-relay/i)?new _g(this).init_incoming(s):r!==void 0?new pu(this).init_incoming(s):s.reply(415)}else s.reply(403,"Wrong Status");break;case j.UPDATE:this._status===te.STATUS_CONFIRMED?this._receiveUpdate(s):s.reply(403,"Wrong Status");break;case j.REFER:this._status===te.STATUS_CONFIRMED?this._receiveRefer(s):s.reply(403,"Wrong Status");break;case j.NOTIFY:this._status===te.STATUS_CONFIRMED?this._receiveNotify(s):s.reply(403,"Wrong Status");break;default:s.reply(501)}}onTransportError(){J.warn("onTransportError()"),this._status!==te.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.CONNECTION_ERROR,cause:j.causes.CONNECTION_ERROR})}onRequestTimeout(){J.warn("onRequestTimeout()"),this._status!==te.STATUS_TERMINATED&&this.terminate({status_code:408,reason_phrase:j.causes.REQUEST_TIMEOUT,cause:j.causes.REQUEST_TIMEOUT})}onDialogError(){J.warn("onDialogError()"),this._status!==te.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.DIALOG_ERROR,cause:j.causes.DIALOG_ERROR})}newDTMF(s){J.debug("newDTMF()"),this.emit("newDTMF",s)}newInfo(s){J.debug("newInfo()"),this.emit("newInfo",s)}_isReadyToReOffer(){return this._rtcReady?this._dialog?this._dialog.uac_pending_reply===!0||this._dialog.uas_pending_reply===!0?(J.debug("_isReadyToReOffer() | there is another INVITE/UPDATE transaction in progress"),!1):!0:(J.debug("_isReadyToReOffer() | session not established yet"),!1):(J.debug("_isReadyToReOffer() | internal WebRTC status not ready"),!1)}_close(){if(J.debug("close()"),this._localMediaStream&&this._localMediaStreamLocallyGenerated&&(J.debug("close() | closing local MediaStream"),Me.closeMediaStream(this._localMediaStream)),this._status!==te.STATUS_TERMINATED){if(this._status=te.STATUS_TERMINATED,this._connection)try{this._connection.close()}catch(s){J.warn("close() | error closing the RTCPeerConnection: %o",s)}for(const s in this._timers)Object.prototype.hasOwnProperty.call(this._timers,s)&&clearTimeout(this._timers[s]);clearTimeout(this._sessionTimers.timer),this._dialog&&(this._dialog.terminate(),delete this._dialog);for(const s in this._earlyDialogs)Object.prototype.hasOwnProperty.call(this._earlyDialogs,s)&&(this._earlyDialogs[s].terminate(),delete this._earlyDialogs[s]);for(const s in this._referSubscribers)Object.prototype.hasOwnProperty.call(this._referSubscribers,s)&&delete this._referSubscribers[s];this._ua.destroyRTCSession(this)}}_setInvite2xxTimer(s,r){let o=Mi.T1;function a(){this._status===te.STATUS_WAITING_FOR_ACK&&(s.reply(200,null,[`Contact: ${this._contact}`],r),o<Mi.T2&&(o=o*2,o>Mi.T2&&(o=Mi.T2)),this._timers.invite2xxTimer=setTimeout(a.bind(this),o))}this._timers.invite2xxTimer=setTimeout(a.bind(this),o)}_setACKTimer(){this._timers.ackTimer=setTimeout(()=>{this._status===te.STATUS_WAITING_FOR_ACK&&(J.debug("no ACK received, terminating the session"),clearTimeout(this._timers.invite2xxTimer),this.sendRequest(j.BYE),this._ended("remote",null,j.causes.NO_ACK))},Mi.TIMER_H)}_createRTCConnection(s,r){this.stunServers,this._connection=new RTCPeerConnection(s,r),this._connection.addEventListener("iceconnectionstatechange",()=>{this._connection.iceConnectionState==="failed"&&this.terminate({cause:j.causes.RTP_TIMEOUT,status_code:408,reason_phrase:j.causes.RTP_TIMEOUT})});let o;const a=t=>{this._connection.signalingState!=="stable"&&this._connection.signalingState!=="have-local-offer"||t.candidate&&(this._candidates.push(t.candidate),clearTimeout(o),o=setTimeout(()=>{this.lastTrickleReceived=!0,this.subscribeSent&&!this.isConfigureSent&&this._sendConfigureMessage({audio:!0,video:!0}).then(()=>{})},500))};this._connection.onicecandidate=a,J.debug('emit "peerconnection"'),this.emit("peerconnection",{peerconnection:this._connection})}_createLocalDescription(s,r){if(J.debug("createLocalDescription()"),s!=="offer"&&s!=="answer")throw new Error(`createLocalDescription() | invalid type "${s}"`);const o=this._connection;return this._rtcReady=!1,Promise.resolve().then(()=>s==="offer"?o.createOffer(r).catch(a=>(J.warn('emit "peerconnection:createofferfailed" [error:%o]',a),this.emit("peerconnection:createofferfailed",a),Promise.reject(a))):o.createAnswer(r).catch(a=>(J.warn('emit "peerconnection:createanswerfailed" [error:%o]',a),this.emit("peerconnection:createanswerfailed",a),Promise.reject(a)))).then(a=>o.setLocalDescription(a).catch(t=>(this._rtcReady=!0,J.warn('emit "peerconnection:setlocaldescriptionfailed" [error:%o]',t),this.emit("peerconnection:setlocaldescriptionfailed",t),Promise.reject(t)))).then(()=>{const a=r&&r.iceRestart;if(o.iceGatheringState==="complete"&&!a||o.iceGatheringState==="gathering"&&this._iceReady){this._rtcReady=!0;const t={originator:"local",type:s,sdp:o.localDescription.sdp};return J.debug('emit "sdp"'),this.emit("sdp",t),Promise.resolve(t.sdp)}return new Promise(t=>{let n=!1,p,_;this._iceReady=!1;const d=()=>{o.removeEventListener("icecandidate",p),o.removeEventListener("icegatheringstatechange",_),n=!0,this._rtcReady=!0,this._iceReady=!0;const g={originator:"local",type:s,sdp:o.localDescription.sdp};J.debug('emit "sdp"'),this.emit("sdp",g),t(g.sdp)};o.addEventListener("icecandidate",p=g=>{const T=g.candidate;T?this.emit("icecandidate",{candidate:T,ready:d}):n||d()}),o.addEventListener("icegatheringstatechange",_=()=>{o.iceGatheringState==="complete"&&!n&&d()})})})}_createDialog(s,r,o){console.log("_createDialog",s);const a=r==="UAS"?s.to_tag:s.from_tag,t=r==="UAS"?s.from_tag:s.to_tag,n=s.call_id+a+t;console.log("remote_tag",t);let p=this._earlyDialogs[n];if(o)return p?!0:(p=new io(this,s,r,io.C.STATUS_EARLY),console.log("SET DIALOG early"),p.error?(console.log("early_dialog error",p.error),J.debug(p.error),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(this._earlyDialogs[n]=p,!0));{if(this._from_tag=s.from_tag,this._to_tag=s.to_tag,p)return p.update(s,r),console.log("SET DIALOG 1"),this._dialog=p,delete this._earlyDialogs[n],!0;const _=new io(this,s,r);return _.error?(console.log("dialog.error",_.error),J.debug(_.error),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(console.log("AAA SET DIALOG 2"),this._dialog=_,!0)}}_receiveReinvite(s){J.debug("receiveReinvite()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Me.cloneArray(p.extraHeaders);if(this._status!==te.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("reinvite",o),a)return;if(this._late_sdp=!1,!s.body){this._late_sdp=!0,this._remoteHold&&(this._remoteHold=!1,this._onunhold("remote")),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",this._rtcOfferConstraints)).then(p=>{n.call(this,p)}).catch(()=>{s.reply(500)});return}if(r!=="application/sdp"){J.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==te.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{J.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),this._late_sdp&&(p=this._mangleOffer(p)),s.reply(200,null,_,p,()=>{this._status=te.STATUS_WAITING_FOR_ACK,this._setInvite2xxTimer(s,p),this._setACKTimer()}),typeof o.callback=="function"&&o.callback()}}_receiveUpdate(s){J.debug("receiveUpdate()");const r=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0,o={request:s,callback:void 0,reject:t.bind(this)};let a=!1;function t(p={}){a=!0;const _=p.status_code||403,d=p.reason_phrase||"",g=Me.cloneArray(p.extraHeaders);if(this._status!==te.STATUS_CONFIRMED)return!1;if(_<300||_>=700)throw new TypeError(`Invalid status_code: ${_}`);s.reply(_,d,g)}if(this.emit("update",o),a)return;if(!s.body){n.call(this,null);return}if(r!=="application/sdp"){J.debug("invalid Content-Type"),s.reply(415);return}this._processInDialogSdpOffer(s).then(p=>{this._status!==te.STATUS_TERMINATED&&n.call(this,p)}).catch(p=>{J.warn(p)});function n(p){const _=[`Contact: ${this._contact}`];this._handleSessionTimersInIncomingRequest(s,_),s.reply(200,null,_,p),typeof o.callback=="function"&&o.callback()}}_processInDialogSdpOffer(s){J.debug("_processInDialogSdpOffer()");const r=s.parseSDP();let o=!1;for(const n of r.media){if(lo.indexOf(n.type)===-1)continue;const p=n.direction||r.direction||"sendrecv";if(p==="sendonly"||p==="inactive")o=!0;else{o=!1;break}}const a={originator:"remote",type:"offer",sdp:s.body};J.debug('emit "sdp"'),this.emit("sdp",a);const t=new RTCSessionDescription({type:"offer",sdp:a.sdp});return this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._connection.setRemoteDescription(t).catch(n=>{throw s.reply(488),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',n),this.emit("peerconnection:setremotedescriptionfailed",n),n})}).then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");this._remoteHold===!0&&o===!1?(this._remoteHold=!1,this._onunhold("remote")):this._remoteHold===!1&&o===!0&&(this._remoteHold=!0,this._onhold("remote"))}).then(()=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._createLocalDescription("answer",this._rtcAnswerConstraints).catch(n=>{throw s.reply(500),J.warn('emit "peerconnection:createtelocaldescriptionfailed" [error:%o]',n),n})}).catch(n=>{J.warn("_processInDialogSdpOffer() failed [error: %o]",n)}),this._connectionPromiseQueue}_receiveRefer(s){if(J.debug("receiveRefer()"),!s.refer_to){J.debug("no Refer-To header field present in REFER"),s.reply(400);return}if(s.refer_to.uri.scheme!==j.SIP){J.debug("Refer-To header field points to a non-SIP URI scheme"),s.reply(416);return}s.reply(202);const r=new vg(this,s.cseq);J.debug('emit "refer"'),this.emit("refer",{request:s,accept:(t,n)=>{o.call(this,t,n)},reject:()=>{a.call(this)}});function o(t,n={}){if(t=typeof t=="function"?t:null,this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED)return!1;const p=new Po(this._ua);if(p.on("progress",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("accepted",({response:_})=>{r.notify(_.status_code,_.reason_phrase)}),p.on("_failed",({message:_,cause:d})=>{_?r.notify(_.status_code,_.reason_phrase):r.notify(487,d)}),s.refer_to.uri.hasHeader("replaces")){const _=decodeURIComponent(s.refer_to.uri.getHeader("replaces"));n.extraHeaders=Me.cloneArray(n.extraHeaders),n.extraHeaders.push(`Replaces: ${_}`)}p.connect(s.refer_to.uri.toAor(),n,t)}function a(){r.notify(603)}}_receiveNotify(s){switch(J.debug("receiveNotify()"),s.event||s.reply(400),s.event.event){case"refer":{let r,o;if(s.event.params&&s.event.params.id)r=s.event.params.id,o=this._referSubscribers[r];else if(Object.keys(this._referSubscribers).length===1)o=this._referSubscribers[Object.keys(this._referSubscribers)[0]];else{s.reply(400,"Missing event id parameter");return}if(!o){s.reply(481,"Subscription does not exist");return}o.receiveNotify(s),s.reply(200);break}default:s.reply(489)}}_receiveReplaces(s){J.debug("receiveReplaces()");function r(a){if(this._status!==te.STATUS_WAITING_FOR_ACK&&this._status!==te.STATUS_CONFIRMED)return!1;const t=new Po(this._ua);t.on("confirmed",()=>{this.terminate()}),t.init_incoming(s,a)}function o(){J.debug("Replaced INVITE rejected by the user"),s.reply(486)}this.emit("replaces",{request:s,accept:a=>{r.call(this,a)},reject:()=>{o.call(this)}})}_getNextTransactionId(){return(this.lastTransaction+1).toString()}_sendInitialRequest(s,r,o){this.ackSent=!1,this.publisherSubscribeSent=!1;const a=new u_(this._ua,this._request,{onRequestTimeout:()=>{this.onRequestTimeout()},onTransportError:()=>{this.onTransportError()},onAuthenticated:t=>{this._request=t},onReceiveResponse:t=>{this._receiveInviteResponse(t)}});Promise.resolve().then(()=>{if(o)return o;if(s.audio||s.video)return this._localMediaStreamLocallyGenerated=!0,navigator.mediaDevices.getUserMedia(s).catch(t=>{throw this._status===te.STATUS_TERMINATED?new Error("terminated"):(this._failed("local",null,j.causes.USER_DENIED_MEDIA_ACCESS),J.warn('emit "getusermediafailed" [error:%o]',t),this.emit("getusermediafailed",t),t)})}).then(t=>{if(this._status===te.STATUS_TERMINATED)throw new Error("terminated");return this._localMediaStream=t,t&&t.getTracks().forEach(n=>{this._connection.addTrack(n,t)}),this._connecting(this._request),this._createLocalDescription("offer",r).catch(n=>{throw this._failed("local",null,j.causes.WEBRTC_ERROR),n})}).then(t=>{if(this._is_canceled||this._status===te.STATUS_TERMINATED)throw new Error("terminated");const n={janus:"attach",plugin:"janus.plugin.videoroom",opaque_id:this.opaque_id},p=JSON.stringify(n);this._request.body=p,this._status=te.STATUS_INVITE_SENT,J.debug('emit "sending" [request:%o]',this._request),this.emit("sending",{request:this._request}),a.send()}).catch(t=>{this._status!==te.STATUS_TERMINATED&&J.warn(t)})}requestAudioAndVideoPermissions(){return console.log("MMM requestAudioAndVideoPermissions"),this.loadStream()}async loadStream(){const s={audio:!0,video:!0};try{this.stream=await navigator.mediaDevices.getUserMedia(s)}catch{try{s.video=!1,this.stream=await navigator.mediaDevices.getUserMedia(s)}catch{s.audio=!1,s.video=!1,this.stream=await navigator.mediaDevices.getUserMedia(s)}}return{stream:this.stream,options:s}}addTracks(s){s.forEach(r=>{this._connection.addTrack(r)})}getRecordFileName(){return bT+this.room_id+btoa(unescape(encodeURIComponent(this.displayName)))+Date.now()}async processIceCandidates(){for(let s=0;s<this.iceCandidates.length;s++)await this._connection.addIceCandidate(this.iceCandidates[s]);this.iceCandidates=[]}async _sendConfigureMessage(s){const r={offerToReceiveAudio:!1,offerToReceiveVideo:!1},o=await this._connection.createOffer(r);await this._connection.setLocalDescription(o);const a=this._candidates.map(_=>({janus:"trickle",candidate:_,handle_id:this.handle_id,session_id:this.session_id})),n={configure:{janus:"message",body:{request:"configure",record:!0,filename:this.getRecordFileName(),...s},jsep:o,handle_id:this.handle_id,session_id:this.session_id},trickles:[...a]},p=["Content-Type: application/json","PTYPE: Ice"];this.sendRequest(j.INFO,{extraHeaders:p,body:JSON.stringify(n),eventHandlers:{onSuccessResponse:async _=>{this.isConfigureSent=!0;const g=_.data.split(`\r
|
135
|
+
`),T=g[g.length-1],E=JSON.parse(T);await this._connection.setRemoteDescription(E.jsep),this._candidates=[]}}})}_sendMemberStartMessage(s,r){const o={janus:"message",body:{request:"start",room:this.room_id},handle_id:s.handleId,session_id:this.session_id,jsep:r},a=["Content-Type: application/json","PTYPE: Configure"];this.sendRequest(j.INFO,{extraHeaders:a,body:JSON.stringify(o),eventHandlers:{onSuccessResponse:async t=>{t.status_code===200&&await s.rtcpPeer.setLocalDescription(r)}}})}_sendTrickleMessage(s){const o={trickles:[...s.map(t=>({janus:"trickle",candidate:t,handle_id:this.handle_id,session_id:this.session_id}))]},a=["PTYPE: Trickle"];this.sendRequest(j.INFO,{extraHeaders:a,body:JSON.stringify(o),eventHandlers:{onSuccessResponse:async t=>{console.log("_sendTrickleMessage",t)}}})}async _answerAttachedStream(s,r){let o=null;const a=async _=>{if(!s.rtcpPeer||s.loaded)return;{s.loaded=!0;const y={audio:!0,video:!0};await new Promise(A=>{setTimeout(A,100)}),o=await s.rtcpPeer.createAnswer(y),this._sendMemberStartMessage(s,o)}const d=_.streams[0].getAudioTracks(),g=_.streams[0].getVideoTracks(),T=[];d[0]&&T.push(d[0]),g[0]&&T.push(g[0]);const E=new MediaStream(T);s.stream=E,this._ua.emit("memberJoin",s.memberInfo)};let t,n=[];const p=_=>{s.rtcpPeer.signalingState!=="stable"&&s.rtcpPeer.signalingState!=="have-local-offer"||(n.push(_.candidate||null),clearTimeout(t),t=setTimeout(()=>{this._sendTrickleMessage(n)},500))};s.rtcpPeer=new RTCPeerConnection,s.rtcpPeer.ontrack=a,s.rtcpPeer.onicecandidate=p,s.rtcpPeer.sender=r.sender,await s.rtcpPeer.setRemoteDescription(r.jsep)}_sendJoinMemberRequest(s){const r={janus:"message",body:{request:"join",room:this.room_id,feed:s.info.id,ptype:"subscriber"},handle_id:s.handleId,session_id:this.session_id},o=["PTYPE: Subscriber"];this.sendRequest(j.SUBSCRIBE,{extraHeaders:o,body:JSON.stringify(r),eventHandlers:{onSuccessResponse:async a=>{var t,n;if(a.status_code===200){const p=JSON.parse(a.body);(n=(t=p==null?void 0:p.plugindata)==null?void 0:t.data)!=null&&n.id&&await this._answerAttachedStream(s,p)}}}})}_attachMember(s){const r={janus:"attach",opaque_id:this.opaque_id,plugin:"janus.plugin.videoroom",session_id:this.session_id},o=["PTYPE: Subscriber"];this.sendRequest(j.INFO,{extraHeaders:o,body:JSON.stringify(r),eventHandlers:{onSuccessResponse:async a=>{if(a.status_code===200){const n=JSON.parse(a.body).data.id;s.handleId=n,this._sendJoinMemberRequest(s)}}}})}receivePublishers(s){var o,a,t,n,p,_,d,g;const r={...this.memberList};(a=(o=s==null?void 0:s.plugindata)==null?void 0:o.data)==null||a.publishers.forEach(T=>{delete r[T.id],!this.memberList[T.id]&&!this.myFeedList.includes(T.id)&&T.clientID!==this.client_id&&(this.memberList[T.id]=new RT(T,this),this._attachMember(this.memberList[T.id]))}),((n=(t=s==null?void 0:s.plugindata)==null?void 0:t.data)==null?void 0:n.videoroom)==="synced"&&Object.keys(r).forEach(T=>{r[T].hangup(),delete this.memberList[T]}),this.publishers=(_=(p=s==null?void 0:s.plugindata)==null?void 0:p.data)==null?void 0:_.publishers,this.private_id=(g=(d=s==null?void 0:s.plugindata)==null?void 0:d.data)==null?void 0:g.private_id}_receiveInviteResponse(s){if(J.debug("receiveInviteResponse()"),console.log("_receiveInviteResponse response",s),console.log("dialog",this._dialog),this._dialog&&s.status_code>=200&&s.status_code<=299&&!this.ackSent)if(console.log("IF 1 dialog"),this._dialog.id.call_id===s.call_id&&this._dialog.id.local_tag===s.from_tag&&this._dialog.id.remote_tag===s.to_tag){this.ackSent=!0,this.sendRequest(j.ACK);return}else{const r=new io(this,s,"UAC");if(r.error!==void 0){J.debug(r.error);return}this.sendRequest(j.ACK),this.sendRequest(j.BYE);return}if(this.ackSent&&!this.publisherSubscribeSent){const r=JSON.parse(s.body);this.requestAudioAndVideoPermissions().then(()=>{this.session_id=r.session_id,this.handle_id=r.data.id,this.client_id=Af();const o={janus:"message",body:{request:"join",room:this.room_id,ptype:"publisher",display:this.display_name,clientID:this.client_id,opaque_id:this.opaque_id},handle_id:this.handle_id},a=["PTYPE: Publisher"];this.sendRequest(j.SUBSCRIBE,{extraHeaders:a,body:JSON.stringify(o),eventHandlers:{onSuccessResponse:async t=>{t.status_code===200&&(this.subscribeSent=!0,this.lastTrickleReceived&&!this.isConfigureSent&&(this.addTracks(this.stream.getTracks()),this._ua.emit("changeMainVideoStream",{name:this.display_name,stream:this.stream}),this._sendConfigureMessage({audio:!0,video:!0}).then(()=>{})))}}}),this.publisherSubscribeSent=!0})}if(this._is_canceled){s.status_code>=100&&s.status_code<200?this._request.cancel(this._cancel_reason):s.status_code>=200&&s.status_code<299&&this._acceptAndTerminate(s);return}if(!(this._status!==te.STATUS_INVITE_SENT&&this._status!==te.STATUS_1XX_RECEIVED))switch(!0){case/^100$/.test(s.status_code):this._status=te.STATUS_1XX_RECEIVED;break;case/^1[0-9]{2}$/.test(s.status_code):{if(!s.to_tag){J.debug("1xx response received without to tag");break}if(s.hasHeader("contact")&&!this._createDialog(s,"UAC",!0))break;if(this._status=te.STATUS_1XX_RECEIVED,!s.body){this._progress("remote",s);break}const r={originator:"remote",type:"answer",sdp:s.body};J.debug('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>this._progress("remote",s)).catch(a=>{J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)});break}case/^2[0-9]{2}$/.test(s.status_code):{if(this._status=te.STATUS_CONFIRMED,!s.body){this._acceptAndTerminate(s,400,j.causes.MISSING_SDP),this._failed("remote",s,j.causes.BAD_MEDIA_DESCRIPTION);break}if(!this._createDialog(s,"UAC"))break;break}default:{const r=Me.sipErrorCause(s.status_code);this._failed("remote",s,r)}}}_sendReinvite(s={}){J.debug("sendReinvite()");const r=Me.cloneArray(s.extraHeaders),o=Me.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null;let t=!1;r.push(`Contact: ${this._contact}`),r.push("Content-Type: application/sdp"),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(_=>{_=this._mangleOffer(_);const d={originator:"local",type:"offer",sdp:_};J.debug('emit "sdp"'),this.emit("sdp",d),this.sendRequest(j.INVITE,{extraHeaders:r,body:_,eventHandlers:{onSuccessResponse:g=>{n.call(this,g),t=!0},onErrorResponse:g=>{p.call(this,g)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{p()});function n(_){if(this._status===te.STATUS_TERMINATED||(this.sendRequest(j.ACK),t))return;if(this._handleSessionTimersInIncomingResponse(_),_.body){if(!_.hasHeader("Content-Type")||_.getHeader("Content-Type").toLowerCase()!=="application/sdp"){p.call(this);return}}else{p.call(this);return}const d={originator:"remote",type:"answer",sdp:_.body};J.debug('emit "sdp"'),this.emit("sdp",d);const g=new RTCSessionDescription({type:"answer",sdp:d.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(g)).then(()=>{o.succeeded&&o.succeeded(_)}).catch(T=>{p.call(this),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',T),this.emit("peerconnection:setremotedescriptionfailed",T)})}function p(_){o.failed&&o.failed(_)}}_sendUpdate(s={}){J.debug("sendUpdate()");const r=Me.cloneArray(s.extraHeaders),o=Me.cloneObject(s.eventHandlers),a=s.rtcOfferConstraints||this._rtcOfferConstraints||null,t=s.sdpOffer||!1;let n=!1;r.push(`Contact: ${this._contact}`),this._sessionTimers.running&&r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${this._sessionTimers.refresher?"uac":"uas"}`),t?(r.push("Content-Type: application/sdp"),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._createLocalDescription("offer",a)).then(d=>{d=this._mangleOffer(d);const g={originator:"local",type:"offer",sdp:d};J.debug('emit "sdp"'),this.emit("sdp",g),this.sendRequest(j.UPDATE,{extraHeaders:r,body:d,eventHandlers:{onSuccessResponse:T=>{p.call(this,T),n=!0},onErrorResponse:T=>{_.call(this,T)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}})}).catch(()=>{_.call(this)})):this.sendRequest(j.UPDATE,{extraHeaders:r,eventHandlers:{onSuccessResponse:d=>{p.call(this,d)},onErrorResponse:d=>{_.call(this,d)},onTransportError:()=>{this.onTransportError()},onRequestTimeout:()=>{this.onRequestTimeout()},onDialogError:()=>{this.onDialogError()}}});function p(d){if(this._status!==te.STATUS_TERMINATED&&!n)if(this._handleSessionTimersInIncomingResponse(d),t){if(d.body){if(!d.hasHeader("Content-Type")||d.getHeader("Content-Type").toLowerCase()!=="application/sdp"){_.call(this);return}}else{_.call(this);return}const g={originator:"remote",type:"answer",sdp:d.body};J.debug('emit "sdp"'),this.emit("sdp",g);const T=new RTCSessionDescription({type:"answer",sdp:g.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(T)).then(()=>{o.succeeded&&o.succeeded(d)}).catch(E=>{_.call(this),J.warn('emit "peerconnection:setremotedescriptionfailed" [error:%o]',E),this.emit("peerconnection:setremotedescriptionfailed",E)})}else o.succeeded&&o.succeeded(d)}function _(d){o.failed&&o.failed(d)}}_acceptAndTerminate(s,r,o){J.debug("acceptAndTerminate()");const a=[];r&&(o=o||j.REASON_PHRASE[r]||"",a.push(`Reason: SIP ;cause=${r}; text="${o}"`)),(this._dialog||this._createDialog(s,"UAC"))&&(this.sendRequest(j.ACK),this.sendRequest(j.BYE,{extraHeaders:a})),this._status=te.STATUS_TERMINATED}_mangleOffer(s){if(!this._localHold&&!this._remoteHold)return s;if(s=Ut.parse(s),this._localHold&&!this._remoteHold){J.debug("mangleOffer() | me on hold, mangling offer");for(const r of s.media)lo.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="sendonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="sendonly")}else if(this._localHold&&this._remoteHold){J.debug("mangleOffer() | both on hold, mangling offer");for(const r of s.media)lo.indexOf(r.type)!==-1&&(r.direction="inactive")}else if(this._remoteHold){J.debug("mangleOffer() | remote on hold, mangling offer");for(const r of s.media)lo.indexOf(r.type)!==-1&&(r.direction?r.direction==="sendrecv"?r.direction="recvonly":r.direction==="recvonly"&&(r.direction="inactive"):r.direction="recvonly")}return Ut.write(s)}_setLocalMediaStatus(){let s=!0,r=!0;(this._localHold||this._remoteHold)&&(s=!1,r=!1),this._audioMuted&&(s=!1),this._videoMuted&&(r=!1),this._toggleMuteAudio(!s),this._toggleMuteVideo(!r)}_handleSessionTimersInIncomingRequest(s,r){if(!this._sessionTimers.enabled)return;let o;s.session_expires&&s.session_expires>=j.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,o=s.session_expires_refresher||"uas"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,o="uas"),r.push(`Session-Expires: ${this._sessionTimers.currentExpires};refresher=${o}`),this._sessionTimers.refresher=o==="uas",this._runSessionTimer()}_handleSessionTimersInIncomingResponse(s){if(!this._sessionTimers.enabled)return;let r;s.session_expires&&s.session_expires>=j.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,r=s.session_expires_refresher||"uac"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,r="uac"),this._sessionTimers.refresher=r==="uac",this._runSessionTimer()}_runSessionTimer(){const s=this._sessionTimers.currentExpires;this._sessionTimers.running=!0,clearTimeout(this._sessionTimers.timer),this._sessionTimers.refresher?this._sessionTimers.timer=setTimeout(()=>{this._status!==te.STATUS_TERMINATED&&this._isReadyToReOffer()&&(J.debug("runSessionTimer() | sending session refresh request"),this._sessionTimers.refreshMethod===j.UPDATE?this._sendUpdate():this._sendReinvite())},s*500):this._sessionTimers.timer=setTimeout(()=>{this._status!==te.STATUS_TERMINATED&&(J.warn("runSessionTimer() | timer expired, terminating the session"),this.terminate({cause:j.causes.REQUEST_TIMEOUT,status_code:408,reason_phrase:"Session Timer Expired"}))},s*1100)}_toggleMuteAudio(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="audio");for(const o of r)o.track.enabled=!s}_toggleMuteVideo(s){const r=this._connection.getSenders().filter(o=>o.track&&o.track.kind==="video");for(const o of r)o.track.enabled=!s}_newJanusSession(s,r){J.debug("newRTCSession()"),this._ua.newJanusSession(this,{originator:s,session:this,request:r})}_connecting(s){J.debug("session connecting"),J.debug('emit "connecting"'),this.emit("connecting",{request:s})}_progress(s,r){J.debug("session progress"),J.debug('emit "progress"'),this.emit("progress",{originator:s,response:r||null})}_accepted(s,r){J.debug("session accepted"),this._start_time=new Date,J.debug('emit "accepted"'),this.emit("accepted",{originator:s,response:r||null})}_confirmed(s,r){J.debug("session confirmed"),this._is_confirmed=!0,J.debug('emit "confirmed"'),this.emit("confirmed",{originator:s,ack:r||null})}_ended(s,r,o){J.debug("session ended"),this._end_time=new Date,this._close(),J.debug('emit "ended"'),this.emit("ended",{originator:s,message:r||null,cause:o})}_failed(s,r,o){J.debug("session failed"),J.debug('emit "_failed"'),this.emit("_failed",{originator:s,message:r||null,cause:o}),this._close(),J.debug('emit "failed"'),this.emit("failed",{originator:s,message:r||null,cause:o})}_onhold(s){J.debug("session onhold"),this._setLocalMediaStatus(),J.debug('emit "hold"'),this.emit("hold",{originator:s})}_onunhold(s){J.debug("session onunhold"),this._setLocalMediaStatus(),J.debug('emit "unhold"'),this.emit("unhold",{originator:s})}_onmute({audio:s,video:r}){J.debug("session onmute"),this._setLocalMediaStatus(),J.debug('emit "muted"'),this.emit("muted",{audio:s,video:r})}_onunmute({audio:s,video:r}){J.debug("session onunmute"),this._setLocalMediaStatus(),J.debug('emit "unmuted"'),this.emit("unmuted",{audio:s,video:r})}}class lr{constructor(s){if(this.headers={},s.length>0){let r=!1;const o=s.split(`\r
|
136
136
|
`),a=o.shift().split(/\s/);this.protocol=a[0],this.ident=a[1],this.code=a.length>3?parseInt(a[2]):0,this.method=a.length>3?a[3]:a[2],this.body="";for(const t of o){if(t==`-------${this.ident}$`)break;if(t===""){r=!0;continue}if(t&&r)this.body+=`${t}\r
|
137
137
|
`;else{const n=t.split(": ");this.addHeader(n[0],n[1].trim())}}}else this.ident=Me.createRandomToken(12),this.protocol="MSRP"}addHeader(s,r){this.headers[s]=r}getHeader(s){return this.headers[s]}toString(){let s=`${this.protocol} ${this.ident} ${this.code} ${this.method}`.replaceAll(/null\s|undefined\s/ig,"")+`\r
|
138
138
|
`;for(const r in this.headers)s+=`${r}: ${this.headers[r]}\r
|
@@ -153,4 +153,4 @@ t=0 0
|
|
153
153
|
m=message 2856 TCP/TLS/MSRP *
|
154
154
|
a=accept-types:text/plain text/html
|
155
155
|
a=path:${s.getHeader("Use-Path")} msrp://${this._ua._configuration.authorization_user}.${this._ua._configuration.realm}:2856/${this.auth_id};ws
|
156
|
-
`),this._newMSRPSession("local",this._request),this._id=this._request.call_id+this._from_tag,console.log("dialog be",this._dialog),new u_(this._ua,this._request,{onRequestTimeout:()=>{this.onRequestTimeout(),console.log("to")},onTransportError:t=>{this.onTransportError(),console.log(t)},onAuthenticated:t=>{this._request=t},onReceiveResponse:t=>{this._receiveInviteResponse(t),console.log("dialog af",this._dialog),t.status_code===200&&(t.parseSDP(!0),this._status=Re.STATUS_CONFIRMED,this.target_addr=t.sdp.media[0].invalid[1].value.replaceAll("path:","").split(" ").reverse(),this.status="active",this.emit("active"),this.emit("confirmed"))}}).send(),this._status=Re.STATUS_INVITE_SENT}terminate(s={}){console.log("terminate",this);const r=s.cause||j.causes.BYE,o=Me.cloneArray(s.extraHeaders),a=s.body;let t,n=s.status_code,p=s.reason_phrase;if(this._status===Re.STATUS_TERMINATED)throw new Hs.InvalidStateError(this._status);switch(this.status="terminated",this._status){case Re.STATUS_NULL:case Re.STATUS_INVITE_SENT:case Re.STATUS_1XX_RECEIVED:if(n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);n&&(p=p||j.REASON_PHRASE[n]||"",t=`SIP ;cause=${n} ;text="${p}"`),this._status===Re.STATUS_NULL||this._status===Re.STATUS_INVITE_SENT?(this._is_canceled=!0,this._cancel_reason=t):this._status===Re.STATUS_1XX_RECEIVED&&this._request.cancel(t),this._status=Re.STATUS_CANCELED,console.log("failed 1"),this._failed("local",null,j.causes.CANCELED);break;case Re.STATUS_WAITING_FOR_ANSWER:case Re.STATUS_ANSWERED:if(n=n||480,console.log("REPLY 480"),n<300||n>=700)throw new TypeError(`Invalid status_code: ${n}`);this._request.reply(n,p,o,a),console.log("failed 2"),this._failed("local",null,j.causes.REJECTED);break;case Re.STATUS_WAITING_FOR_ACK:case Re.STATUS_CONFIRMED:if(p=s.reason_phrase||j.REASON_PHRASE[n]||"",n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);if(n&&o.push(`Reason: SIP ;cause=${n}; text="${p}"`),this._status===Re.STATUS_WAITING_FOR_ACK&&this._direction==="incoming"&&this._request.server_transaction.state!==Bt.C.STATUS_TERMINATED){const _=this._dialog;this.receiveRequest=({method:d})=>{d===j.ACK&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())},this._request.server_transaction.on("stateChanged",()=>{this._request.server_transaction.state===Bt.C.STATUS_TERMINATED&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())}),this._ended("local",null,r),this._dialog=_,this._ua.newDialog(_)}else console.log("here it is"),this.sendRequest(j.BYE,{extraHeaders:o,body:a}),this._ended("local",null,r)}}sendRequest(s,r){return this._dialog.sendRequest(s,r)}authenticate(s){this.status="auth";let r=new lr("");r.method="AUTH",r.addHeader("To-Path",`msrp://${this._ua._configuration.realm}:2856;ws`),r.addHeader("From-Path",`msrp://${this.credentials.username}.${this.credentials.realm}:2856/${this.auth_id};ws`),s&&r.addHeader("Authorization",s.toString());let o=r.toString();console.log(o);let a=[];for(var t=0;t<o.length;t++)a.push(o.charCodeAt(t).toString(16));console.log(a),this._connection.send(r.toString())}onmessage(s){console.log("onmessage",s);const r=new lr(s.data);if(this.status==="auth"&&r.code===401){const o=this.parseAuth(r.getHeader("WWW-Authenticate")),a=new Hm(this.credentials);a.authenticate({method:"AUTH",ruri:`msrp://${this._ua._configuration.realm}:2856;ws`,body:null},o,Me.createRandomToken(12)),this.authenticate(a)}this.status==="auth"&&r.code===200&&this._direction==="outgoing"?(this.my_addr.push(r.getHeader("To-Path")),this.my_addr.push(r.getHeader("Use-Path")),this.status="active",this.inviteParty(r)):this.status==="auth"&&r.code===200&&this._direction==="incoming"?(this.my_addr.push(r.getHeader("To-Path")),this.my_addr.push(r.getHeader("Use-Path")),this.status="active",this.acceptParty(r),this.emit("confirmed")):r.method==="SEND"&&(this._sendOk(r),this._sendReport(r),r.direction="incoming",this.emit("newMessage",r),this._msgHistory.push(r),this.emit("msgHistoryUpdate",this._msgHistory),console.log("======================================================================")),r.code===480&&this._close()}onclose(){console.log("close")}onopen(){const s=new RTCPeerConnection({iceServers:[]});s.createDataChannel(""),s.createOffer().then(s.setLocalDescription.bind(s)),s.onicecandidate=r=>{if(!r||!r.candidate||!r.candidate.candidate)return;const o=/([0-9]{1,3}(\.[0-9]{1,3}){3})/,a=r.candidate.candidate.match(o);this.my_ip=a&&a[1],s.onicecandidate=()=>{},this.authenticate(null)}}onerror(s){console.log(s)}_receiveInviteResponse(s){if(console.log("resp0000000000000",s),this._dialog&&s.status_code>=200&&s.status_code<=299)if(console.log("200000000000000"),this._dialog.id.call_id===s.call_id&&this._dialog.id.local_tag===s.from_tag&&this._dialog.id.remote_tag===s.to_tag){this.sendRequest(j.ACK);return}else{const r=new Jl(this,s,"UAC");if(r.error!==void 0){console.log(r.error);return}this.sendRequest(j.ACK),this.sendRequest(j.BYE);return}if(this._is_canceled){s.status_code>=100&&s.status_code<200?this._request.cancel(this._cancel_reason):s.status_code>=200&&s.status_code<299&&this._acceptAndTerminate(s);return}if(!(this._status!==Re.STATUS_INVITE_SENT&&this._status!==Re.STATUS_1XX_RECEIVED))switch(console.log("start Switch"),!0){case/^100$/.test(s.status_code):this._status=Re.STATUS_1XX_RECEIVED;break;case/^1[0-9]{2}$/.test(s.status_code):{if(!s.to_tag){console.log("1xx response received without to tag");break}if(s.hasHeader("contact")&&!this._createDialog(s,"UAC",!0))break;if(this._status=Re.STATUS_1XX_RECEIVED,!s.body){this._progress("remote",s);break}const r={originator:"remote",type:"answer",sdp:s.body};console.log('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>this._progress("remote",s)).catch(a=>{console.log('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)});break}case/^2[0-9]{2}$/.test(s.status_code):{if(console.log("maybe here???"),this._status=Re.STATUS_CONFIRMED,!s.body){this._acceptAndTerminate(s,400,j.causes.MISSING_SDP),console.log("failed 3"),this._failed("remote",s,j.causes.BAD_MEDIA_DESCRIPTION);break}if(!this._createDialog(s,"UAC"))break;const r={originator:"remote",type:"answer",sdp:s.body};console.log('emit "sdp"'),this.emit("sdp",r),new RTCSessionDescription({type:"answer",sdp:r.sdp}),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._connection.signalingState==="stable")return this._connection.createOffer(this._rtcOfferConstraints).then(o=>this._connection.setLocalDescription(o)).catch(o=>{this._acceptAndTerminate(s,500,o.toString()),console.log("failed 4"),this._failed("local",s,j.causes.WEBRTC_ERROR)})}).then(()=>{this._handleSessionTimersInIncomingResponse(s),this._accepted("remote",s),this.sendRequest(j.ACK),this._confirmed("local",null)});break}default:{const r=Me.sipErrorCause(s.status_code);console.log("failed 5"),this._failed("remote",s,r)}}}sendMSRP(s){const r=new lr("");r.method="SEND",r.addHeader("To-Path",`${this.my_addr[1]} ${this.target_addr[1]} ${this.target_addr[0]}`),r.addHeader("From-Path",`${this.my_addr[0]}`),r.addHeader("Message-ID",Me.createRandomToken(10)),r.addHeader("Byte-Range","1-25/25"),r.addHeader("Content-Type","text/plain"),r.addHeader("Success-Report","yes"),r.addHeader("Failure-Report","yes"),r.body=s;let o=r.toString();console.log(o);let a=[];for(var t=0;t<o.length;t++)a.push(o.charCodeAt(t).toString(16));console.log(a),this._connection.send(r.toString()),r.direction="outgoing",this.emit("newMessage",r),this._msgHistory.push(r),this.emit("msgHistoryUpdate",this._msgHistory)}_sendOk(s){let r=s.ident,o=s.getHeader("Message-ID"),a=new lr("");a.method="200 OK",a.addHeader("To-Path",`${this.my_addr[1]}`),a.addHeader("From-Path",`${this.my_addr[0]}`),a.addHeader("Message-ID",o),a.ident=r;let t=a.toString();console.log(t);let n=[];for(var p=0;p<t.length;p++)n.push(t.charCodeAt(p).toString(16));console.log(n),this._connection.send(a.toString())}_sendReport(s){let r=s.ident,o=s.getHeader("Message-ID"),a=new lr("");a.method="REPORT",a.addHeader("To-Path",`${s.getHeader("From-Path")}`),a.addHeader("From-Path",`${this.my_addr[0]}`),a.addHeader("Message-ID",o),a.addHeader("Byte-Range","1-25/25"),a.addHeader("Status","000 200 OK"),a.ident=r;let t=a.toString();console.log(t);let n=[];for(var p=0;p<t.length;p++)n.push(t.charCodeAt(p).toString(16));console.log(n),this._connection.send(a.toString())}parseAuth(s){const r={},o=s.replace("Digest","").split(",");for(const a of o){const t=a.trim().split("=");r[t[0]]=t[1].match('^"(.+)"$')[1]}return r}init_incoming(s,r){let o;const a=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;if(s.body&&a!=="application/sdp"){s.reply(415);return}if(this._status=Re.STATUS_INVITE_RECEIVED,this._from_tag=s.from_tag,this._id=s.call_id+this._from_tag,this._request=s,this._contact=this._ua.contact.toString(),s.hasHeader("expires")&&(o=s.getHeader("expires")*1e3),s.to_tag=Me.newTag(),!this._createDialog(s,"UAS",!0)){s.reply(500,"Missing Contact header field");return}s.body?this._late_sdp=!1:this._late_sdp=!0,this._status=Re.STATUS_WAITING_FOR_ANSWER,this._timers.userNoAnswerTimer=setTimeout(()=>{s.reply(408),console.log("failed 6"),this._failed("local",null,j.causes.NO_ANSWER)},this._ua.configuration.no_answer_timeout),o&&(this._timers.expiresTimer=setTimeout(()=>{this._status===Re.STATUS_WAITING_FOR_ANSWER&&(s.reply(487),console.log("failed 7"),this._failed("system",null,j.causes.EXPIRES))},o)),this._direction="incoming",this._local_identity=s.to,this._remote_identity=s.from,r&&r(this),s.parseSDP(!0),this.target_addr=s.sdp.media[0].invalid[1].value.replaceAll("path:","").split(" ").reverse(),this._newMSRPSession("remote",s),this._status!==Re.STATUS_TERMINATED&&(s.reply(180,null,[`Contact: ${this._ua._contact}`]),this._progress("local",null))}_failed(s,r,o){this.emit("_failed",{originator:s,message:r||null,cause:o}),this._close(),this.emit("failed",{originator:s,message:r||null,cause:o})}_close(){if(console.log("CLOSE SESSION"),this._status!==Re.STATUS_TERMINATED){if(this._status=Re.STATUS_TERMINATED,this._connection)try{this._connection.close()}catch(s){console.log("close() | error closing the RTCPeerConnection: %o",s)}for(const s in this._timers)Object.prototype.hasOwnProperty.call(this._timers,s)&&clearTimeout(this._timers[s]);clearTimeout(this._sessionTimers.timer),this._dialog&&(this._dialog.terminate(),delete this._dialog);for(const s in this._earlyDialogs)Object.prototype.hasOwnProperty.call(this._earlyDialogs,s)&&(this._earlyDialogs[s].terminate(),delete this._earlyDialogs[s]);for(const s in this._referSubscribers)Object.prototype.hasOwnProperty.call(this._referSubscribers,s)&&delete this._referSubscribers[s];this._ua.destroyMSRPSession(this)}}_createDialog(s,r,o){const a=r==="UAS"?s.to_tag:s.from_tag,t=r==="UAS"?s.from_tag:s.to_tag,n=s.call_id+a+t;let p=this._earlyDialogs[n];if(o)return p?!0:(p=new Jl(this,s,r,Jl.C.STATUS_EARLY),p.error?(console.log("failed 8"),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(this._earlyDialogs[n]=p,!0));{if(this._from_tag=s.from_tag,this._to_tag=s.to_tag,p)return p.update(s,r),this._dialog=p,delete this._earlyDialogs[n],!0;const _=new Jl(this,s,r);return _.error?(console.log("failed 9"),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(this._dialog=_,!0)}}_newMSRPSession(s,r){this._ua.newMSRPSession(this,{originator:s,session:this,request:r})}_progress(s,r){this.emit("progress",{originator:s,response:r||null})}isEnded(){switch(this._status){case Re.STATUS_CANCELED:case Re.STATUS_TERMINATED:return!0;default:return!1}}_accepted(s,r){console.log("session accepted"),this._start_time=new Date,console.log('emit "accepted"'),this.emit("accepted",{originator:s,response:r||null})}_confirmed(s,r){console.log("session confirmed"),this._is_confirmed=!0,console.log('emit "confirmed"'),this.emit("confirmed",{originator:s,ack:r||null})}_ended(s,r,o){console.log("session ended"),this._end_time=new Date,this._close(),console.log('emit "ended"'),this.emit("ended",{originator:s,message:r||null,cause:o})}_handleSessionTimersInIncomingResponse(s){if(!this._sessionTimers.enabled)return;let r;s.session_expires&&s.session_expires>=j.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,r=s.session_expires_refresher||"uac"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,r="uac"),this._sessionTimers.refresher=r==="uac",this._runSessionTimer()}receiveRequest(s){if(console.log("receiveRequest()"),s.method===j.CANCEL)(this._status===Re.STATUS_WAITING_FOR_ANSWER||this._status===Re.STATUS_ANSWERED)&&(this._status=Re.STATUS_CANCELED,this._request.reply(487),console.log("failed 10"),this._failed("remote",s,j.causes.CANCELED));else switch(s.method){case j.ACK:if(this._status!==Re.STATUS_WAITING_FOR_ACK)return;if(this._status=Re.STATUS_CONFIRMED,clearTimeout(this._timers.ackTimer),clearTimeout(this._timers.invite2xxTimer),this._late_sdp){if(!s.body){this.terminate({cause:j.causes.MISSING_SDP,status_code:400});break}const r={originator:"remote",type:"answer",sdp:s.body};console.log('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>{this._is_confirmed||this._confirmed("remote",s)}).catch(a=>{this.terminate({cause:j.causes.BAD_MEDIA_DESCRIPTION,status_code:488}),console.log('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})}else this._is_confirmed||this._confirmed("remote",s);break;case j.BYE:this._status===Re.STATUS_CONFIRMED||this._status===Re.STATUS_WAITING_FOR_ACK?(s.reply(200),this._ended("remote",s,j.causes.BYE)):this._status===Re.STATUS_INVITE_RECEIVED||this._status===Re.STATUS_WAITING_FOR_ANSWER?(s.reply(200),this._request.reply(487,"BYE Received"),this._ended("remote",s,j.causes.BYE)):s.reply(403,"Wrong Status");break;case j.INVITE:this._status===Re.STATUS_CONFIRMED?s.hasHeader("replaces")?this._receiveReplaces(s):this._receiveReinvite(s):s.reply(403,"Wrong Status");break;case j.INFO:this._status===Re.STATUS_1XX_RECEIVED||this._status===Re.STATUS_WAITING_FOR_ANSWER||this._status===Re.STATUS_ANSWERED||this._status===Re.STATUS_WAITING_FOR_ACK||this._status===Re.STATUS_CONFIRMED?(s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0)!==void 0?new pu(this).init_incoming(s):s.reply(415):s.reply(403,"Wrong Status");break;case j.UPDATE:this._status===Re.STATUS_CONFIRMED?this._receiveUpdate(s):s.reply(403,"Wrong Status");break;case j.REFER:this._status===Re.STATUS_CONFIRMED?this._receiveRefer(s):s.reply(403,"Wrong Status");break;case j.NOTIFY:this._status===Re.STATUS_CONFIRMED?this._receiveNotify(s):s.reply(403,"Wrong Status");break;default:s.reply(501)}}onTransportError(){console.log("onTransportError()"),this._status!==Re.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.CONNECTION_ERROR,cause:j.causes.CONNECTION_ERROR})}onRequestTimeout(){console.log("onRequestTimeout()"),this._status!==Re.STATUS_TERMINATED&&this.terminate({status_code:408,reason_phrase:j.causes.REQUEST_TIMEOUT,cause:j.causes.REQUEST_TIMEOUT})}onDialogError(){console.log("onDialogError()"),this._status!==Re.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.DIALOG_ERROR,cause:j.causes.DIALOG_ERROR})}}const at=console,Fs={STATUS_INIT:0,STATUS_READY:1,STATUS_USER_CLOSED:2,STATUS_NOT_READY:3,CONFIGURATION_ERROR:1,NETWORK_ERROR:2},wT=ET;class OT extends wT{constructor(s){super(s),this._msrp_sessions=[],this._transactions={nist:{},nict:{},ist:{},ict:{}},this._janus_sessions=[]}call(s,r){return super.call(s,r)}joinVideoCall(s,r,o){at.debug("call()");const a=new Po(this);return a.connect(s,r,o),a}_loadConfig(s){try{Zi.load(this._configuration,s)}catch(a){throw a}this._configuration.display_name===0&&(this._configuration.display_name="0"),this._configuration.instance_id||(this._configuration.instance_id=fr.newUUID()),this._configuration.jssip_id=fr.createRandomToken(5);const r=this._configuration.uri.clone();r.user=null,this._configuration.hostport_params=r.toString().replace(/^sip:/i,"");try{this._transport=new Wg(this._configuration.sockets,{max_interval:this._configuration.connection_recovery_max_interval,min_interval:this._configuration.connection_recovery_min_interval}),this._transport.onconnecting=DT.bind(this),this._transport.onconnect=NT.bind(this),this._transport.ondisconnect=UT.bind(this),this._transport.ondata=PT.bind(this)}catch(a){throw at.warn(a),new Hs.ConfigurationError("sockets",this._configuration.sockets)}if(delete this._configuration.sockets,this._configuration.authorization_user||(this._configuration.authorization_user=this._configuration.uri.user),!this._configuration.registrar_server){const a=this._configuration.uri.clone();a.user=null,a.clearParams(),a.clearHeaders(),this._configuration.registrar_server=a}this._configuration.no_answer_timeout*=1e3,this._configuration.contact_uri?this._configuration.via_host=this._configuration.contact_uri.host:this._configuration.contact_uri=new _r("sip",fr.createRandomToken(8),this._configuration.via_host,null,{transport:"ws"}),this._contact={pub_gruu:null,temp_gruu:null,uri:this._configuration.contact_uri,toString(a={}){const t=a.anonymous||null,n=a.outbound||null;let p="<";return t?p+=this.temp_gruu||"sip:anonymous@anonymous.invalid;transport=ws":p+=this.pub_gruu||this.uri.toString(),n&&(t?!this.temp_gruu:!this.pub_gruu)&&(p+=";ob"),p+=">",p}};const o=["authorization_user","password","realm","ha1","authorization_jwt","display_name","register"];for(const a in this._configuration)Object.prototype.hasOwnProperty.call(this._configuration,a)&&(o.indexOf(a)!==-1?Object.defineProperty(this._configuration,a,{writable:!0,configurable:!1}):Object.defineProperty(this._configuration,a,{writable:!1,configurable:!1}));at.debug("configuration parameters after validation:");for(const a in this._configuration)if(Object.prototype.hasOwnProperty.call(Zi.settings,a))switch(a){case"uri":case"registrar_server":at.debug(`- ${a}: ${this._configuration[a]}`);break;case"password":case"ha1":case"authorization_jwt":at.debug(`- ${a}: NOT SHOWN`);break;default:at.debug(`- ${a}: ${JSON.stringify(this._configuration[a])}`)}}newMSRPSession(s,r){s.on("msgHistoryUpdate",o=>{console.log(o)}),this._msrp_sessions[s.id]=s,this.emit("newMSRPSession",r)}newJanusSession(s,r){this._janus_sessions[s.id]=s,this.emit("newJanusSession",r)}destroyMSRPSession(s){delete this._msrp_sessions[s.id]}destroyJanusSession(s){delete this._janus_sessions[s.id]}receiveRequest(s){var n,p;const r=s.method;if(console.log("-----------"),s.ruri.user!==this._configuration.uri.user&&s.ruri.user!==this._contact.uri.user){at.debug("Request-URI does not point to us"),s.method!==De.ACK&&s.reply_sl(404);return}if(s.ruri.scheme===De.SIPS){s.reply_sl(416);return}if(Bt.checkTransaction(this,s))return;if(r===De.INVITE?new Bt.InviteServerTransaction(this,this._transport,s):r!==De.ACK&&r!==De.CANCEL&&new Bt.NonInviteServerTransaction(this,this._transport,s),r===De.OPTIONS){if(this.listeners("newOptions").length===0){s.reply(200);return}new Gc.Options(this).init_incoming(s)}else if(r===De.MESSAGE){if(this.listeners("newMessage").length===0){s.reply(405);return}new Gc.Message(this).init_incoming(s)}else if(r===De.INVITE&&!s.to_tag&&this.listeners("newRTCSession").length===0){s.reply(405);return}let o,a;const t=JSON.parse(s.body)||{};if((p=(n=t.plugindata)==null?void 0:n.data)!=null&&p.publishers&&Object.values(this._janus_sessions)[0].receivePublishers(t),s.to_tag)o=this._findDialog(s.call_id,s.from_tag,s.to_tag),o?o.receiveRequest(s):r===De.NOTIFY?(a=this._findSession(s),a?a.receiveRequest(s):(at.debug("received NOTIFY request for a non existent subscription"),s.reply(200))):r!==De.ACK&&s.reply(481);else switch(r){case De.INVITE:if(window.RTCPeerConnection)if(s.hasHeader("replaces")){const _=s.replaces;o=this._findDialog(_.call_id,_.from_tag,_.to_tag),o?(a=o.owner,a.isEnded()?s.reply(603):a.receiveRequest(s)):s.reply(481)}else s.body.search(/MSRP/ig)>-1?(a=new Ja(this),a.init_incoming(s)):s.body.search(/JANUS/ig)>-1||(a=new Dg(this),a.init_incoming(s));else at.warn("INVITE received but WebRTC is not supported"),s.reply(488);break;case De.BYE:s.reply(481);break;case De.CANCEL:a=this._findSession(s),a?a.receiveRequest(s):at.debug("received CANCEL request for a non existent session");break;case De.ACK:break;case De.NOTIFY:this.emit("sipEvent",{event:s.event,request:s}),s.reply(200);break;default:s.reply(405);break}}startMSRP(s,r){at.debug("startMSRP()",r);const o=new Ja(this);return o.connect(s),o}startJanus(s,r){at.debug("startJanus()",r);const o=new Ja(this);return o.connect(s),o}terminateMSRPSessions(s){at.debug("terminateSessions()");for(const r in this._msrp_sessions)this._msrp_sessions[r].isEnded()||this._msrp_sessions[r].terminate(s)}terminateJanusSessions(s){at.debug("terminateSessions()");for(const r in this._janus_sessions)this._janus_sessions[r].isEnded()||this._janus_sessions[r].terminate(s)}stop(){if(at.debug("stop()"),this._dynConfiguration={},this._status===Fs.STATUS_USER_CLOSED){at.debug("UA already closed");return}this._registrator.close();const s=Object.keys(this._sessions).length;for(const o in this._sessions)if(Object.prototype.hasOwnProperty.call(this._sessions,o)){at.debug(`closing session ${o}`);try{this._sessions[o].terminate()}catch(a){console.error(a)}}for(const o in this._msrp_sessions)if(Object.prototype.hasOwnProperty.call(this._msrp_sessions,o)){at.debug(`closing session ${o}`);try{this._msrp_sessions[o].terminate()}catch(a){console.error(a)}}for(const o in this._janus_sessions)if(Object.prototype.hasOwnProperty.call(this._janus_sessions,o)){at.debug(`closing session ${o}`);try{this._janus_sessions[o].terminate()}catch(a){console.error(a)}}for(const o in this._applicants)if(Object.prototype.hasOwnProperty.call(this._applicants,o))try{this._applicants[o].close()}catch(a){console.error(a)}this._status=Fs.STATUS_USER_CLOSED,Object.keys(this._transactions.nict).length+Object.keys(this._transactions.nist).length+Object.keys(this._transactions.ict).length+Object.keys(this._transactions.ist).length===0&&s===0?this._transport.disconnect():this._closeTimer=setTimeout(()=>{this._closeTimer=null,this._transport.disconnect()},2e3)}}function DT(c){this.emit("connecting",c)}function NT(c){this._status!==Fs.STATUS_USER_CLOSED&&(this._status=Fs.STATUS_READY,this._error=null,this.emit("connected",c),this._dynConfiguration.register&&this._registrator.register())}function UT(c){const s=["nict","ict","nist","ist"];for(const r of s)for(const o in this._transactions[r])Object.prototype.hasOwnProperty.call(this._transactions[r],o)&&this._transactions[r][o].onTransportError();this.emit("disconnected",c),this._registrator.onTransportClosed(),this._status!==Fs.STATUS_USER_CLOSED&&(this._status=Fs.STATUS_NOT_READY,this._error=Fs.NETWORK_ERROR)}function PT(c){console.log("onTransportData",c);const s=c.transport;let r=c.message;if(r=Mu.parseMessage(r,this),!r){console.log("if 1 return");return}if(this._status===Fs.STATUS_USER_CLOSED&&r instanceof Gl.IncomingRequest){console.log("if 2 return");return}if(!oT(r,this,s)){console.log("if 3 return");return}if(console.log("onTransportData message",r),console.log("onTransportData instanceof",r instanceof Gl.IncomingRequest),r instanceof Gl.IncomingRequest)r.transport=s,console.log("onTransportData receiveRequest"),this.receiveRequest(r);else if(r instanceof Gl.IncomingResponse){let o;switch(r.method){case De.INVITE:o=this._transactions.ict[r.via_branch],o&&o.receiveResponse(r);break;case De.ACK:break;default:o=this._transactions.nict[r.via_branch],o&&o.receiveResponse(r);break}}}const xT=["roomId","_audioMuted","_cancel_reason","_contact","direction","_end_time","_eventsCount","_from_tag","_id","_is_canceled","_is_confirmed","_late_sdp","_localHold","_videoMuted","status","start_time","_remote_identity","audioTag","isOnHold","localMuted","autoAnswer"],MT=["_cancel_reason","_contact","direction","_end_time","_eventsCount","_from_tag","_id","_is_canceled","_is_confirmed","_late_sdp","status","start_time","_remote_identity","target_addr"];function Cf(c){const s={};return xT.forEach(r=>{c[r]!==void 0&&(s[r]=c[r])}),s.localHold=c._localHold,s}function Rf(c){const s={};return MT.forEach(r=>{c[r]!==void 0&&(s[r]=c[r])}),s}function If(c,s){const r=new AudioContext,o=r.createMediaStreamSource(c),a=r.createMediaStreamDestination(),t=r.createGain();return o.connect(t),t.connect(a),t.gain.value=s,a.stream}function kT(c,s,r,o){const a=document.createElement("audio");a.id=s._id,a.className="audioTag",a.srcObject=c,A_()||(a.setSinkId(r),a.volume=o),a.play(),s.audioTag=a}function LT(c){if(c&&typeof c.log=="function"&&typeof c.warn=="function"&&typeof c.error=="function")return!0}function A_(){return/Mobi|Android|iPhone/i.test(navigator.userAgent)}const $T=ut,HT=ls(),Ot=new $T("WebSocketInterface");var FT=class{constructor(s){Ot.debug('new() [url:"%s"]',s),this._url=s,this._sip_uri=null,this._via_transport=null,this._ws=null;const r=HT.parse(s,"absoluteURI");if(r===-1)throw Ot.warn(`invalid WebSocket URI: ${s}`),new TypeError(`Invalid argument: ${s}`);if(r.scheme!=="wss"&&r.scheme!=="ws")throw Ot.warn(`invalid WebSocket URI scheme: ${r.scheme}`),new TypeError(`Invalid argument: ${s}`);this._sip_uri=`sip:${r.host}${r.port?`:${r.port}`:""};transport=ws`,this._via_transport=r.scheme.toUpperCase()}get via_transport(){return this._via_transport}set via_transport(s){this._via_transport=s.toUpperCase()}get sip_uri(){return this._sip_uri}get url(){return this._url}connect(){if(Ot.debug("connect()"),this.isConnected()){Ot.debug(`WebSocket ${this._url} is already connected`);return}else if(this.isConnecting()){Ot.debug(`WebSocket ${this._url} is connecting`);return}this._ws&&this.disconnect(),Ot.debug(`connecting to WebSocket ${this._url}`);try{this._ws=new WebSocket(this._url,"sip"),this._ws.binaryType="arraybuffer",this._ws.onopen=this._onOpen.bind(this),this._ws.onclose=this._onClose.bind(this),this._ws.onmessage=this._onMessage.bind(this),this._ws.onerror=this._onError.bind(this)}catch(s){this._onError(s)}}disconnect(){Ot.debug("disconnect()"),this._ws&&(this._ws.onopen=()=>{},this._ws.onclose=()=>{},this._ws.onmessage=()=>{},this._ws.onerror=()=>{},this._ws.close(),this._ws=null)}send(s){return Ot.debug("send()"),this.isConnected()?(this._ws.send(s),!0):(Ot.warn("unable to send message, WebSocket is not open"),!1)}isConnected(){return this._ws&&this._ws.readyState===this._ws.OPEN}isConnecting(){return this._ws&&this._ws.readyState===this._ws.CONNECTING}_onOpen(){Ot.debug(`WebSocket ${this._url} connected`),this.onconnect()}_onClose({wasClean:s,code:r,reason:o}){Ot.debug(`WebSocket ${this._url} closed`),s===!1&&Ot.debug("WebSocket abrupt disconnection"),this.ondisconnect(!s,r,o)}_onMessage({data:s}){Ot.debug("received WebSocket message"),this.ondata(s)}_onError(s){Ot.warn(`WebSocket ${this._url} error: `,s)}};const vu=xo,jT=De,VT=Es,qT=yt(),BT=y_,GT=vs(),WT=Du(),KT=ls(),YT=FT,zT=dr("JsSIP");zT("version %s",vu.version);var JT={C:jT,Exceptions:VT,Utils:qT,UA:BT,URI:GT,NameAddrHeader:WT,WebSocketInterface:YT,Grammar:KT,debug:dr,get name(){return vu.title},get version(){return vu.version}};const XT=Xe(JT);function Xa(c){return c<10?`0${c}`:`${c}`}function QT(c){let s=c.hours||0,r=c.minutes||0,o=c.seconds||0;o++,o===60&&(o=0,r++,r===60&&(r=0,s++));const a=`${Xa(s)}:${Xa(r)}:${Xa(o)}`;return{seconds:o,minutes:r,hours:s,formatted:a}}var At={};At.forEach=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)if(a in c){const t=Promise.resolve(c[a]).then(n=>s.call(r||globalThis,n,a,c));o.push(t)}await Promise.all(o)};At.forEachSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)o in c&&await s.call(r||globalThis,await c[o],o,c)};At.map=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)a in c&&(o[a]=Promise.resolve(c[a]).then(t=>s.call(r||globalThis,t,a,c)));return Promise.all(o)};At.mapSeries=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)a in c&&(o[a]=await s.call(r||globalThis,await c[a],a,c));return o};At.find=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o();let t=1;for(let n=0;n<c.length;n++){const p=_=>{_?o(c[n]):t===c.length&&o(),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.findSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(await s.call(r||globalThis,await c[o],o,c))return c[o]};At.findIndex=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o(-1);let t=1;for(let n=0;n<c.length;n++){const p=_=>{_?o(n):t===c.length&&o(-1),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.findIndexSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(await s.call(r||globalThis,await c[o],o,c))return o};At.some=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o(!1);let t=1;for(let n=0;n<c.length;n++){if(!(n in c)){t++;continue}const p=_=>{_?o(!0):t===c.length&&o(!1),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.someSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(o in c&&await s.call(r||globalThis,await c[o],o,c))return!0;return!1};At.every=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o(!0);let t=1;for(let n=0;n<c.length;n++){if(!(n in c)){t++;continue}const p=_=>{_?t===c.length&&o(!0):o(!1),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.everySeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(o in c&&!await s.call(r||globalThis,await c[o],o,c))return!1;return!0};At.filter=(c,s,r)=>new Promise(async(o,a)=>{const t=[];for(let p=0;p<c.length;p++)p in c&&(t[p]=Promise.resolve(c[p]).then(_=>s.call(r||globalThis,_,p,c)).catch(a));const n=[];for(let p=0;p<t.length;p++)await t[p]&&n.push(await c[p]);o(n)});At.filterSeries=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)a in c&&await s.call(r||globalThis,await c[a],a,c)&&o.push(await c[a]);return o};At.reduce=async(c,s,r)=>{if(c.length===0&&r===void 0)throw TypeError("Reduce of empty array with no initial value");let o,a;for(r!==void 0?(a=r,o=0):(a=c[0],o=1),o;o<c.length;o++)o in c&&(a=await s(await a,await c[o],o,c));return a};var C_={};(function(c){const s=At;Object.keys(s).forEach(r=>{const o=r.charAt(0).toUpperCase()+r.slice(1);c[`async${o}`]=async function(...a){return s[r](this,...a)}})})(C_);const ZT=At,ev=C_;var bf=Object.assign(ZT,{instanceMethods:ev});const Sn=new AudioContext,Jt={NEW_CALL:"new_call",CALL_CONFIRMED:"confirmed",CALL_FAILED:"failed",CALL_PROGRESS:"progress",CALL_ENDED:"ended"};var tv={exports:{}};(function(c){var s=function(r){var o=Object.prototype,a=o.hasOwnProperty,t=Object.defineProperty||function(ee,W,G){ee[W]=G.value},n,p=typeof Symbol=="function"?Symbol:{},_=p.iterator||"@@iterator",d=p.asyncIterator||"@@asyncIterator",g=p.toStringTag||"@@toStringTag";function T(ee,W,G){return Object.defineProperty(ee,W,{value:G,enumerable:!0,configurable:!0,writable:!0}),ee[W]}try{T({},"")}catch{T=function(W,G,re){return W[G]=re}}function E(ee,W,G,re){var ge=W&&W.prototype instanceof ae?W:ae,be=Object.create(ge.prototype),xe=new P(re||[]);return t(be,"_invoke",{value:z(ee,G,xe)}),be}r.wrap=E;function y(ee,W,G){try{return{type:"normal",arg:ee.call(W,G)}}catch(re){return{type:"throw",arg:re}}}var A="suspendedStart",C="suspendedYield",I="executing",$="completed",L={};function ae(){}function N(){}function F(){}var Se={};T(Se,_,function(){return this});var ve=Object.getPrototypeOf,M=ve&&ve(ve(se([])));M&&M!==o&&a.call(M,_)&&(Se=M);var D=F.prototype=ae.prototype=Object.create(Se);N.prototype=F,t(D,"constructor",{value:F,configurable:!0}),t(F,"constructor",{value:N,configurable:!0}),N.displayName=T(F,g,"GeneratorFunction");function B(ee){["next","throw","return"].forEach(function(W){T(ee,W,function(G){return this._invoke(W,G)})})}r.isGeneratorFunction=function(ee){var W=typeof ee=="function"&&ee.constructor;return W?W===N||(W.displayName||W.name)==="GeneratorFunction":!1},r.mark=function(ee){return Object.setPrototypeOf?Object.setPrototypeOf(ee,F):(ee.__proto__=F,T(ee,g,"GeneratorFunction")),ee.prototype=Object.create(D),ee},r.awrap=function(ee){return{__await:ee}};function q(ee,W){function G(be,xe,Ce,le){var ye=y(ee[be],ee,xe);if(ye.type==="throw")le(ye.arg);else{var st=ye.arg,lt=st.value;return lt&&typeof lt=="object"&&a.call(lt,"__await")?W.resolve(lt.__await).then(function(Ee){G("next",Ee,Ce,le)},function(Ee){G("throw",Ee,Ce,le)}):W.resolve(lt).then(function(Ee){st.value=Ee,Ce(st)},function(Ee){return G("throw",Ee,Ce,le)})}}var re;function ge(be,xe){function Ce(){return new W(function(le,ye){G(be,xe,le,ye)})}return re=re?re.then(Ce,Ce):Ce()}t(this,"_invoke",{value:ge})}B(q.prototype),T(q.prototype,d,function(){return this}),r.AsyncIterator=q,r.async=function(ee,W,G,re,ge){ge===void 0&&(ge=Promise);var be=new q(E(ee,W,G,re),ge);return r.isGeneratorFunction(W)?be:be.next().then(function(xe){return xe.done?xe.value:be.next()})};function z(ee,W,G){var re=A;return function(be,xe){if(re===I)throw new Error("Generator is already running");if(re===$){if(be==="throw")throw xe;return tt()}for(G.method=be,G.arg=xe;;){var Ce=G.delegate;if(Ce){var le=H(Ce,G);if(le){if(le===L)continue;return le}}if(G.method==="next")G.sent=G._sent=G.arg;else if(G.method==="throw"){if(re===A)throw re=$,G.arg;G.dispatchException(G.arg)}else G.method==="return"&&G.abrupt("return",G.arg);re=I;var ye=y(ee,W,G);if(ye.type==="normal"){if(re=G.done?$:C,ye.arg===L)continue;return{value:ye.arg,done:G.done}}else ye.type==="throw"&&(re=$,G.method="throw",G.arg=ye.arg)}}}function H(ee,W){var G=W.method,re=ee.iterator[G];if(re===n)return W.delegate=null,G==="throw"&&ee.iterator.return&&(W.method="return",W.arg=n,H(ee,W),W.method==="throw")||G!=="return"&&(W.method="throw",W.arg=new TypeError("The iterator does not provide a '"+G+"' method")),L;var ge=y(re,ee.iterator,W.arg);if(ge.type==="throw")return W.method="throw",W.arg=ge.arg,W.delegate=null,L;var be=ge.arg;if(!be)return W.method="throw",W.arg=new TypeError("iterator result is not an object"),W.delegate=null,L;if(be.done)W[ee.resultName]=be.value,W.next=ee.nextLoc,W.method!=="return"&&(W.method="next",W.arg=n);else return be;return W.delegate=null,L}B(D),T(D,g,"Generator"),T(D,_,function(){return this}),T(D,"toString",function(){return"[object Generator]"});function X(ee){var W={tryLoc:ee[0]};1 in ee&&(W.catchLoc=ee[1]),2 in ee&&(W.finallyLoc=ee[2],W.afterLoc=ee[3]),this.tryEntries.push(W)}function U(ee){var W=ee.completion||{};W.type="normal",delete W.arg,ee.completion=W}function P(ee){this.tryEntries=[{tryLoc:"root"}],ee.forEach(X,this),this.reset(!0)}r.keys=function(ee){var W=Object(ee),G=[];for(var re in W)G.push(re);return G.reverse(),function ge(){for(;G.length;){var be=G.pop();if(be in W)return ge.value=be,ge.done=!1,ge}return ge.done=!0,ge}};function se(ee){if(ee){var W=ee[_];if(W)return W.call(ee);if(typeof ee.next=="function")return ee;if(!isNaN(ee.length)){var G=-1,re=function ge(){for(;++G<ee.length;)if(a.call(ee,G))return ge.value=ee[G],ge.done=!1,ge;return ge.value=n,ge.done=!0,ge};return re.next=re}}return{next:tt}}r.values=se;function tt(){return{value:n,done:!0}}return P.prototype={constructor:P,reset:function(ee){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(U),!ee)for(var W in this)W.charAt(0)==="t"&&a.call(this,W)&&!isNaN(+W.slice(1))&&(this[W]=n)},stop:function(){this.done=!0;var ee=this.tryEntries[0],W=ee.completion;if(W.type==="throw")throw W.arg;return this.rval},dispatchException:function(ee){if(this.done)throw ee;var W=this;function G(le,ye){return be.type="throw",be.arg=ee,W.next=le,ye&&(W.method="next",W.arg=n),!!ye}for(var re=this.tryEntries.length-1;re>=0;--re){var ge=this.tryEntries[re],be=ge.completion;if(ge.tryLoc==="root")return G("end");if(ge.tryLoc<=this.prev){var xe=a.call(ge,"catchLoc"),Ce=a.call(ge,"finallyLoc");if(xe&&Ce){if(this.prev<ge.catchLoc)return G(ge.catchLoc,!0);if(this.prev<ge.finallyLoc)return G(ge.finallyLoc)}else if(xe){if(this.prev<ge.catchLoc)return G(ge.catchLoc,!0)}else if(Ce){if(this.prev<ge.finallyLoc)return G(ge.finallyLoc)}else throw new Error("try statement without catch or finally")}}},abrupt:function(ee,W){for(var G=this.tryEntries.length-1;G>=0;--G){var re=this.tryEntries[G];if(re.tryLoc<=this.prev&&a.call(re,"finallyLoc")&&this.prev<re.finallyLoc){var ge=re;break}}ge&&(ee==="break"||ee==="continue")&&ge.tryLoc<=W&&W<=ge.finallyLoc&&(ge=null);var be=ge?ge.completion:{};return be.type=ee,be.arg=W,ge?(this.method="next",this.next=ge.finallyLoc,L):this.complete(be)},complete:function(ee,W){if(ee.type==="throw")throw ee.arg;return ee.type==="break"||ee.type==="continue"?this.next=ee.arg:ee.type==="return"?(this.rval=this.arg=ee.arg,this.method="return",this.next="end"):ee.type==="normal"&&W&&(this.next=W),L},finish:function(ee){for(var W=this.tryEntries.length-1;W>=0;--W){var G=this.tryEntries[W];if(G.finallyLoc===ee)return this.complete(G.completion,G.afterLoc),U(G),L}},catch:function(ee){for(var W=this.tryEntries.length-1;W>=0;--W){var G=this.tryEntries[W];if(G.tryLoc===ee){var re=G.completion;if(re.type==="throw"){var ge=re.arg;U(G)}return ge}}throw new Error("illegal catch attempt")},delegateYield:function(ee,W,G){return this.delegate={iterator:se(ee),resultName:W,nextLoc:G},this.method==="next"&&(this.arg=n),L}},r}(c.exports);try{regeneratorRuntime=s}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=s:Function("r","regeneratorRuntime = r")(s)}})(tv);var R_={exports:{}};(function(c){(function(s,r){c.exports?c.exports=r():s.log=r()})(P_,function(){var s=function(){},r="undefined",o=typeof window!==r&&typeof window.navigator!==r&&/Trident\/|MSIE /.test(window.navigator.userAgent),a=["trace","debug","info","warn","error"];function t(C,I){var $=C[I];if(typeof $.bind=="function")return $.bind(C);try{return Function.prototype.bind.call($,C)}catch{return function(){return Function.prototype.apply.apply($,[C,arguments])}}}function n(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function p(C){return C==="debug"&&(C="log"),typeof console===r?!1:C==="trace"&&o?n:console[C]!==void 0?t(console,C):console.log!==void 0?t(console,"log"):s}function _(C,I){for(var $=0;$<a.length;$++){var L=a[$];this[L]=$<C?s:this.methodFactory(L,C,I)}this.log=this.debug}function d(C,I,$){return function(){typeof console!==r&&(_.call(this,I,$),this[C].apply(this,arguments))}}function g(C,I,$){return p(C)||d.apply(this,arguments)}function T(C,I,$){var L=this,ae;I=I??"WARN";var N="loglevel";typeof C=="string"?N+=":"+C:typeof C=="symbol"&&(N=void 0);function F(D){var B=(a[D]||"silent").toUpperCase();if(!(typeof window===r||!N)){try{window.localStorage[N]=B;return}catch{}try{window.document.cookie=encodeURIComponent(N)+"="+B+";"}catch{}}}function Se(){var D;if(!(typeof window===r||!N)){try{D=window.localStorage[N]}catch{}if(typeof D===r)try{var B=window.document.cookie,q=B.indexOf(encodeURIComponent(N)+"=");q!==-1&&(D=/^([^;]+)/.exec(B.slice(q))[1])}catch{}return L.levels[D]===void 0&&(D=void 0),D}}function ve(){if(!(typeof window===r||!N)){try{window.localStorage.removeItem(N);return}catch{}try{window.document.cookie=encodeURIComponent(N)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}L.name=C,L.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},L.methodFactory=$||g,L.getLevel=function(){return ae},L.setLevel=function(D,B){if(typeof D=="string"&&L.levels[D.toUpperCase()]!==void 0&&(D=L.levels[D.toUpperCase()]),typeof D=="number"&&D>=0&&D<=L.levels.SILENT){if(ae=D,B!==!1&&F(D),_.call(L,D,C),typeof console===r&&D<L.levels.SILENT)return"No console available for logging"}else throw"log.setLevel() called with invalid level: "+D},L.setDefaultLevel=function(D){I=D,Se()||L.setLevel(D,!1)},L.resetLevel=function(){L.setLevel(I,!1),ve()},L.enableAll=function(D){L.setLevel(L.levels.TRACE,D)},L.disableAll=function(D){L.setLevel(L.levels.SILENT,D)};var M=Se();M==null&&(M=I),L.setLevel(M,!1)}var E=new T,y={};E.getLogger=function(I){if(typeof I!="symbol"&&typeof I!="string"||I==="")throw new TypeError("You must supply a name when creating a logger.");var $=y[I];return $||($=y[I]=new T(I,E.getLevel(),E.methodFactory)),$};var A=typeof window!==r?window.log:void 0;return E.noConflict=function(){return typeof window!==r&&window.log===E&&(window.log=A),E},E.getLoggers=function(){return y},E.default=E,E})})(R_);var Rt=R_.exports;const ms=()=>`${new Date().toISOString()} | metrics`,gs=(c,s,r)=>`${c} | ${s} | ${r}`;Rt.setDefaultLevel(Rt.levels.TRACE);const sv=c=>{Rt.info(gs(ms(),"log ",`set log level to ${c?"verbose":"info"}`)),Rt.setLevel(c?Rt.levels.TRACE:Rt.levels.INFO)},nv=c=>{const s=[...Object.keys(Rt.levels)];s.includes(c)?(Rt.info(gs(ms(),"log ",`update log level to ${c.toLowerCase()}`)),Rt.setLevel(c)):Rt.warn(gs(ms(),"log ","Incorrect log level please choose one of "),s)},Pe=(c,s,r)=>{r?Rt.debug(gs(ms(),c,s),r):Rt.debug(gs(ms(),c,s))},Qa=(c,s)=>{Rt.info(gs(ms(),c,s))},yn=(c,s)=>{Rt.info(gs(ms(),c,s))},Ao=(c,s)=>{Rt.warn(gs(ms(),c,s))},ur=(c,s)=>{Rt.error(gs(ms(),c,s))};function rv(c){return Math.floor(Math.random()*c).toString()}function wf(c,s){let r=s;return c.forEach(o=>{r=r.replace(o,"")}),r}function iv(c,s){let r="";for(let o=0;o<s;o+=1)r+=c[rv(c.length)];return r}function lv({length:c=20,useLetters:s=!0,useNumbers:r=!0,includeSymbols:o=[],excludeSymbols:a=[]}={}){let t="abcdefghijklmnopqrstuvwxyz",n="0123456789",p=[],_=[],d=[];return s&&(a.length&&(t=wf(a,t)),_=t.split("")),r&&(a.length&&(n=wf(a,n)),d=n.split("")),p=[..._,...d,...o],iv(p,c)}var ov=lv;const Yi=Xe(ov),av=()=>"WebRTCMetrics",uv=()=>"5.0.3",$e={INBOUND:"inbound",OUTBOUND:"outbound"},ps={IDLE:"idle",RUNNING:"running",MUTED:"muted"},qi={NEW:"new",CHECKING:"checking",CONNECTED:"connected",COMPLETED:"completed",DISCONNECTED:"disconnected",FAILED:"failed",CLOSED:"closed"},cv=()=>({...{delta_time_to_measure_probes_ms:0,delta_time_consumed_to_measure_ms:0,delta_KBytes_in:0,delta_KBytes_out:0,delta_kbs_in:0,delta_kbs_out:0,total_time_decoded_in:0,total_time_encoded_out:0,probes:[]}}),I_={level_in:0,codec_id_in:"",codec_in:{mime_type:null,clock_rate:null,sdp_fmtp_line:null},delta_jitter_ms_in:0,percent_packets_lost_in:0,delta_packets_in:0,delta_packets_lost_in:0,total_packets_in:0,total_packets_lost_in:0,total_KBytes_in:0,delta_KBytes_in:0,delta_kbs_in:0,mos_in:0,mos_emodel_in:0,ssrc:"",direction:$e.INBOUND},b_={level_out:0,codec_id_out:"",codec_out:{mime_type:null,clock_rate:null,sdp_fmtp_line:null},delta_jitter_ms_out:0,delta_rtt_ms_out:null,total_rtt_ms_out:0,total_rtt_measure_out:0,percent_packets_lost_out:0,delta_packets_out:0,delta_packets_lost_out:0,total_packets_out:0,total_packets_lost_out:0,total_KBytes_out:0,delta_KBytes_out:0,delta_kbs_out:0,timestamp_out:null,mos_out:0,mos_emodel_out:0,ssrc:"",direction:$e.OUTBOUND},w_={codec_id_in:"",size_in:{width:null,height:null,framerate:null},codec_in:{mime_type:null,clock_rate:null},delta_jitter_ms_in:0,percent_packets_lost_in:0,delta_packets_in:0,delta_packets_lost_in:0,total_packets_in:0,total_packets_lost_in:0,total_KBytes_in:0,delta_KBytes_in:0,delta_kbs_in:0,decoder_in:null,delta_ms_decode_frame_in:0,total_frames_decoded_in:0,total_time_decoded_in:0,delta_nack_sent_in:0,delta_pli_sent_in:0,total_nack_sent_in:0,total_pli_sent_in:0,ssrc:"",direction:$e.INBOUND},O_={codec_id_out:"",size_out:{width:null,height:null,framerate:null},codec_out:{mime_type:null,clock_rate:null},delta_jitter_ms_out:0,delta_rtt_ms_out:null,total_rtt_ms_out:0,total_rtt_measure_out:0,percent_packets_lost_out:0,delta_packets_out:0,delta_packets_lost_out:0,total_packets_out:0,total_packets_lost_out:0,total_KBytes_out:0,delta_KBytes_out:0,delta_kbs_out:0,encoder_out:null,delta_ms_encode_frame_out:0,total_time_encoded_out:0,total_frames_encoded_out:0,delta_nack_received_out:0,delta_pli_received_out:0,total_nack_received_out:0,total_pli_received_out:0,limitation_out:{reason:null,durations:null,resolutionChanges:0},timestamp_out:null,ssrc:"",direction:$e.OUTBOUND},fv=c=>{const s={pname:"",call_id:"",user_id:"",timestamp:null,count:0,audio:{},video:{},network:{infrastructure:3,local_candidate_id:"",local_candidate_type:"",local_candidate_protocol:"",local_candidate_relay_protocol:"",remote_candidate_id:"",remote_candidate_type:"",remote_candidate_protocol:""},data:{total_KBytes_in:0,total_KBytes_out:0,delta_KBytes_in:0,delta_KBytes_out:0,delta_kbs_in:0,delta_kbs_out:0,delta_kbs_bandwidth_in:0,delta_kbs_bandwidth_out:0,delta_rtt_connectivity_ms:null,total_rtt_connectivity_ms:0,total_rtt_connectivity_measure:0},experimental:{time_to_measure_ms:0}};if(c){const r={...c,audio:{},video:{},data:{...c.data},network:{...c.network},experimental:{...c.experimental}};return Object.keys(c.audio).forEach(o=>{r.audio[o]={...c.audio[o]}}),Object.keys(c.video).forEach(o=>{r.video[o]={...c.video[o]}}),r}return{...s,audio:{},video:{},data:{...s.data},network:{...s.network},experimental:{...s.experimental}}},_v={refreshEvery:2e3,startAfter:0,stopAfter:-1,verbose:!1,pname:`p-${Yi()}`,cid:`c-${Yi()}`,uid:`u-${Yi()}`,record:!1,ticket:!0},zt={CANDIDATE_PAIR:"candidate-pair",CODEC:"codec",INBOUND_RTP:"inbound-rtp",LOCAL_CANDIDATE:"local-candidate",MEDIA_SOURCE:"media-source",OUTBOUND_RTP:"outbound-rtp",REMOTE_CANDIDATE:"remote-candidate",REMOTE_INBOUND_RTP:"remote-inbound-rtp",TRACK:"track"},V={AUDIO_LEVEL:"audioLevel",AVAILABLE_OUTGOING_BITRATE:"availableOutgoingBitrate",AVAILABLE_INCOMING_BITRATE:"availableIncomingBitrate",BYTES_RECEIVED:"bytesReceived",BYTES_SENT:"bytesSent",CANDIDATE_TYPE:"candidateType",CHANNELS:"channels",CLOCK_RATE:"clockRate",CODEC_ID:"codecId",CURRENT_ROUND_TRIP_TIME:"currentRoundTripTime",ROUND_TRIP_TIME:"roundTripTime",FRACTION_LOST:"fractionLost",FRAME_HEIGHT:"frameHeight",FRAME_WIDTH:"frameWidth",QUALITY_LIMITATION_REASON:"qualityLimitationReason",QUALITY_LIMITATION_DURATIONS:"qualityLimitationDurations",QUALITY_LIMITATION_RESOLUTION_CHANGES:"qualityLimitationResolutionChanges",ID:"id",JITTER:"jitter",KIND:"kind",MEDIA_TYPE:"mediaType",MIME_TYPE:"mimeType",LOCAL_CANDIDATE_ID:"localCandidateId",NETWORK_TYPE:"networkType",RELAY_PROTOCOL:"relayProtocol",NOMINATED:"nominated",PACKETS_LOST:"packetsLost",PACKETS_RECEIVED:"packetsReceived",PACKETS_SENT:"packetsSent",PROTOCOL:"protocol",PORT:"port",REMOTE_CANDIDATE_ID:"remoteCandidateId",REMOTE_SOURCE:"remoteSource",RESPONSES_RECEIVED:"responsesReceived",SDP_FMTP_LINE:"sdpFmtpLine",SSRC:"ssrc",SELECTED:"selected",STATE:"state",TIMESTAMP:"timestamp",TOTAL_ROUND_TRIP_TIME:"totalRoundTripTime",TOTAL_ROUND_TRIP_TIME_MEASUREMENTS:"roundTripTimeMeasurements",TYPE:"type",DECODER_IMPLEMENTATION:"decoderImplementation",ENCODER_IMPLEMENTATION:"encoderImplementation",FRAMES_DECODED:"framesDecoded",FRAMES_ENCODED:"framesEncoded",FRAMES_PER_SECOND:"framesPerSecond",TOTAL_DECODE_TIME:"totalDecodeTime",TOTAL_ENCODE_TIME:"totalEncodeTime",PLI:"pliCount",NACK:"nackCount"},x={SUCCEEDED:"succeeded",AUDIO:"audio",VIDEO:"video"},Bi={ETHERNET:0,CELLULAR_5G:2,WIFI:3,CELLULAR_4G:5,CELLULAR:10},Za={ETHERNET:"ethernet",CELLULAR_4G:"cellular",WIFI:"wifi"},ne={AUDIO:"audio",VIDEO:"video",NETWORK:"network",DATA:"data"},eu="config ",hv=(c,s={},r)=>{const o={...r,...s};return s.pname||Ao(eu,`Argument [String] 'cfg.pname' for the peerConnection name or id is missing - use generated '${r.pname}'`),s.cid||Ao(eu,`Argument [String] 'cfg.cid' for the call name or id is missing - use generated '${r.cid}'`),s.uid||Ao(eu,`Argument [String] 'cfg.uid' for the user name or id is missing - use generated '${r.uid}'`),o.pc=c,o},dv=(c={})=>{const s={..._v,...c};return s.name=av(),s.version=uv(),s},fl=(c,s,r,o=!1,a)=>{let t=c.map(n=>{if(!r)return n[s];if(!a)return n[s][r];const p=n[s][a];return p?p[r]:null});return t=t.filter(n=>o?Number.isFinite(n)&&n>0:Number.isFinite(n)),t.length===0?[]:t},Vs=c=>c.reduce((s,r)=>s+r,0)/c.length,pv=()=>`probe-${Yi()}`,mv=()=>`coltr-${Yi()}`,Of=c=>new Promise(s=>setTimeout(s,c)),Eu=(c,s,r)=>{s?c.call(s,r):c(r)},Ke=(c,s,r,o)=>{const a=fl(c,s,r,!0,o);if(a.length===0)return null;const t=a.reduce((d,g)=>d+g,0)/a.length;return t===0?null:a.map(d=>Math.abs(t-d)).reduce((d,g)=>d+g,0)/a.length*100/t},Je=(c,s,r,o=!1,a)=>{const t=fl(c,s,r,o,a);return t.length===0?null:t.reduce((n,p)=>n+p,0)/t.length},Tn=(c,s,r)=>fl(c,s,r).reduce((a,t)=>a+t,0),Ye=(c,s,r,o)=>{const a=fl(c,s,r,!0,o);return a.length===0?null:Math.min(...a)},ze=(c,s,r,o)=>{const a=fl(c,s,r,!1,o);return a.length===0?null:Math.max(...a)},gt=(c,s,r,o)=>{const a=c.slice().pop();if(!a)return null;if(!r)return a[s];if(!o)return a[s][r];const t=a[s][o];return t?t[r]:null},gv=c=>c.slice().pop(),ct=(c,s,r)=>{if(!s)return null;const o={};let a=s[x.AUDIO][c];a||(a=r===$e.INBOUND?{...I_}:{...b_}),o[x.AUDIO]=a;let t=s[x.VIDEO][c];return t||(t=r===$e.INBOUND?{...w_}:{...O_}),o[x.VIDEO]=t,o},Gi="exporter ",Tv="2.0",Df=(c,s,r)=>{if(!c||c.length===0)return 0;const o=c[c.length-1];if(!o)return 0;const a=o[s][r];if(a){const t=a.total_rtt_ms_out,n=a.total_rtt_measure_out;return!n||!t?Je(c,s,"delta_rtt_ms_out",!1,r):Number(t/n)}return null},vv=(c,s)=>{if(!c||c.length===0)return 0;const r=c[c.length-1];if(!r)return 0;const o=r[s].total_rtt_connectivity_ms,a=r[s].total_rtt_connectivity_measure;return!a||!o?Je(c,s,"delta_rtt_connectivity_ms"):Number(o/a)},Ev=c=>gt(c,"network","local_candidate_type")!=="relay"?`direct/${gt(c,"network","local_candidate_protocol")}`:`turn/${gt(c,"network","local_candidate_relay_protocol")}`,Sv=c=>{const s=gt(c,"network","remote_candidate_type"),r=gt(c,"network","remote_candidate_protocol");return s!=="relay"?`direct/${r}`:`turn/${r}`};class yv{constructor(s){this._start=null,this._end=null,this._cfg=s,this._referenceReport=null,this._reports=[],this._events=[]}start(){Qa(Gi,"start() - start exporter...");const s=new Date;return this._start=s.toJSON(),s}stop(){Qa(Gi,"stop() - stop exporter...");const s=new Date;return this._end=s.toJSON(),s}saveReferenceReport(s){this._referenceReport=s}getReferenceReport(){return this._referenceReport}addReport(s){this._cfg.ticket&&(Pe(Gi,`addReport() - add report to exporter at ${s.timestamp}`),this._reports.push(s))}addCustomEvent(s){this._events.push(s)}reset(){Qa(Gi,"resetReports() - reset reports"),this._reports=[],this._referenceReport=null,this._start=null,this._end=null}get ticket(){Pe(Gi,"ticket() - generate ticket");const s=gt(this._reports,"audio","total_packets_lost_in"),r=gt(this._reports,"audio","total_packets_in"),o=gt(this._reports,"video","total_packets_lost_in"),a=gt(this._reports,"video","total_packets_in"),t={},n=gv(this._reports);return n&&(Object.keys(n[x.AUDIO]).forEach(p=>{const _=n[x.AUDIO][p];if(t[_.ssrc]={type:x.AUDIO,direction:_.direction},_.direction===$e.INBOUND){const d={avg:Je(this._reports,x.AUDIO,"delta_jitter_ms_in",!1,p),min:Ye(this._reports,x.AUDIO,"delta_jitter_ms_in",p),max:ze(this._reports,x.AUDIO,"delta_jitter_ms_in",p),volatility:Ke(this._reports,x.AUDIO,"delta_jitter_ms_in",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.AUDIO,"delta_kbs_in",!1,p),min:Ye(this._reports,x.AUDIO,"delta_kbs_in",p),max:ze(this._reports,x.AUDIO,"delta_kbs_in",p),volatility:Ke(this._reports,x.AUDIO,"delta_kbs_in",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.AUDIO,"delta_KBytes_in",!1,p),min:Ye(this._reports,x.AUDIO,"delta_KBytes_in",p),max:ze(this._reports,x.AUDIO,"delta_KBytes_in",p),volatility:Ke(this._reports,x.AUDIO,"delta_KBytes_in",p),_unit:{avg:"KB",min:"KB",max:"KB",volatility:"percent"}},E={emodel:{avg:Je(this._reports,x.AUDIO,"mos_emodel_in",!1,p),min:Ye(this._reports,x.AUDIO,"mos_emodel_in",p),max:ze(this._reports,x.AUDIO,"mos_emodel_in",p),volatility:Ke(this._reports,x.AUDIO,"mos_emodel_in",p)},effective:{avg:Je(this._reports,x.AUDIO,"mos_in",!1,p),min:Ye(this._reports,x.AUDIO,"mos_in",p),max:ze(this._reports,x.AUDIO,"mos_in",p),volatility:Ke(this._reports,x.AUDIO,"mos_in",p)},_unit:{avg:"number (1-5)",min:"number (1-5)",max:"number (1-5)",volatility:"percent"}},y=gt(this._reports,x.AUDIO,"total_packets_lost_in",p),A=gt(this._reports,x.AUDIO,"total_packets_in",p),C={lost:y,avg:Math.round((y/(y+A)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}};t[p].jitter=d,t[p].mos=E,t[p].traffic=T,t[p].bitrate=g,t[p].loss=C}else{const d={avg:Je(this._reports,x.AUDIO,"delta_jitter_ms_out",!1,p),min:Ye(this._reports,x.AUDIO,"delta_jitter_ms_out",p),max:ze(this._reports,x.AUDIO,"delta_jitter_ms_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_jitter_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.AUDIO,"delta_kbs_out",!1,p),min:Ye(this._reports,x.AUDIO,"delta_kbs_out",p),max:ze(this._reports,x.AUDIO,"delta_kbs_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_kbs_out",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.AUDIO,"delta_KBytes_out",!1,p),min:Ye(this._reports,x.AUDIO,"delta_KBytes_out",p),max:ze(this._reports,x.AUDIO,"delta_KBytes_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_KBytes_out",p),_unit:{avg:"KB",min:"KB",max:"KB",bitrate:"kbs",volatility:"percent"}},E={avg:Df(this._reports,x.AUDIO,p),min:Ye(this._reports,x.AUDIO,"delta_rtt_ms_out",p),max:ze(this._reports,x.AUDIO,"delta_rtt_ms_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_rtt_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},y=gt(this._reports,x.AUDIO,"total_packets_lost_out",p),A=gt(this._reports,x.AUDIO,"total_packets_out",p),C={lost:y,avg:Math.round((y/(y+A)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}},I={emodel:{avg:Je(this._reports,x.AUDIO,"mos_emodel_out",!1,p),min:Ye(this._reports,x.AUDIO,"mos_emodel_out",p),max:ze(this._reports,x.AUDIO,"mos_emodel_out",p),volatility:Ke(this._reports,x.AUDIO,"mos_emodel_out",p)},effective:{avg:Je(this._reports,x.AUDIO,"mos_out",!1,p),min:Ye(this._reports,x.AUDIO,"mos_out",p),max:ze(this._reports,x.AUDIO,"mos_out",p),volatility:Ke(this._reports,x.AUDIO,"mos_out",p)},_unit:{avg:"number (1-5)",min:"number (1-5)",max:"number (1-5)",volatility:"percent"}};t[p].jitter=d,t[p].rtt=E,t[p].traffic=T,t[p].bitrate=g,t[p].loss=C,t[p].mos=I}}),Object.keys(n[x.VIDEO]).forEach(p=>{const _=n[x.VIDEO][p];if(t[p]={type:x.VIDEO,direction:_.direction},_.direction===$e.INBOUND){const d={avg:Je(this._reports,x.VIDEO,"delta_jitter_ms_in",!1,p),min:Ye(this._reports,x.VIDEO,"delta_jitter_ms_in",p),max:ze(this._reports,x.VIDEO,"delta_jitter_ms_in",p),volatility:Ke(this._reports,x.VIDEO,"delta_jitter_ms_in",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.VIDEO,"delta_kbs_in",!1,p),min:Ye(this._reports,x.VIDEO,"delta_kbs_in",p),max:ze(this._reports,x.VIDEO,"delta_kbs_in",p),volatility:Ke(this._reports,x.VIDEO,"delta_kbs_in",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.VIDEO,"delta_KBytes_in",!1,p),min:Ye(this._reports,x.VIDEO,"delta_KBytes_in",p),max:ze(this._reports,x.VIDEO,"delta_KBytes_in",p),volatility:Ke(this._reports,x.VIDEO,"delta_KBytes_in",p),_unit:{avg:"KB",min:"KB",max:"KB",volatility:"percent"}},E=gt(this._reports,x.VIDEO,"total_packets_lost_in",p),y=gt(this._reports,x.VIDEO,"total_packets_in",p),A={lost:E,avg:Math.round((E/(E+y)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}};t[p].jitter=d,t[p].traffic=T,t[p].bitrate=g,t[p].loss=A}else{const d={avg:Je(this._reports,x.VIDEO,"delta_jitter_ms_out",!1,p),min:Ye(this._reports,x.VIDEO,"delta_jitter_ms_out",p),max:ze(this._reports,x.VIDEO,"delta_jitter_ms_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_jitter_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.VIDEO,"delta_kbs_out",!1,p),min:Ye(this._reports,x.VIDEO,"delta_kbs_out",p),max:ze(this._reports,x.VIDEO,"delta_kbs_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_kbs_out",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.VIDEO,"delta_KBytes_out",!1,p),min:Ye(this._reports,x.VIDEO,"delta_KBytes_out",p),max:ze(this._reports,x.VIDEO,"delta_KBytes_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_KBytes_out",p),_unit:{avg:"KB",min:"KB",max:"KB",volatility:"percent"}},E={avg:Df(this._reports,x.VIDEO,p),min:Ye(this._reports,x.VIDEO,"delta_rtt_ms_out",p),max:ze(this._reports,x.VIDEO,"delta_rtt_ms_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_rtt_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},y=gt(this._reports,x.VIDEO,"total_packets_lost_out",p),A=gt(this._reports,x.VIDEO,"total_packets_out",p),C={lost:y,avg:Math.round((y/(y+A)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}};t[p].jitter=d,t[p].rtt=E,t[p].traffic=T,t[p].bitrate=g,t[p].loss=C}})),{version:Tv,configuration:{frequency:this._cfg.refreshEvery},started:this._start,ended:this._end,ua:{agent:navigator.userAgent,pname:this._cfg.pname,user_id:this._cfg.uid},call:{call_id:this._cfg.cid,events:this._events},details:{count:this._reports.length,reports:this._cfg.record?this._reports:[],reference:this._referenceReport||null},ssrc:t,data:{rtt:{avg:vv(this._reports,"data"),min:Ye(this._reports,"data","delta_rtt_connectivity_ms"),max:ze(this._reports,"data","delta_rtt_connectivity_ms"),volatility:Ke(this._reports,"data","delta_rtt_connectivity_ms"),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},packetsLost:{audio:{in:{avg:Math.round((s/(s+r)*100||0)*100)/100}},video:{in:{avg:Math.round((o/(o+a)*100||0)*100)/100}},unit:{avg:"percent"}},bitrate:{in:{avg:Je(this._reports,"data","delta_kbs_in"),min:Ye(this._reports,"data","delta_kbs_in"),max:ze(this._reports,"data","delta_kbs_in"),volatility:Ke(this._reports,"data","delta_kbs_in")},out:{avg:Je(this._reports,"data","delta_kbs_out"),min:Ye(this._reports,"data","delta_kbs_out"),max:ze(this._reports,"data","delta_kbs_out"),volatility:Ke(this._reports,"data","delta_kbs_out")},unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},traffic:{in:{avg:Je(this._reports,"data","delta_KBytes_in"),min:Ye(this._reports,"data","delta_KBytes_in"),max:ze(this._reports,"data","delta_KBytes_in"),volatility:Ke(this._reports,"data","delta_KBytes_in")},out:{avg:Je(this._reports,"data","delta_KBytes_out"),min:Ye(this._reports,"data","delta_KBytes_out"),max:ze(this._reports,"data","delta_KBytes_out"),volatility:Ke(this._reports,"data","delta_KBytes_out")},unit:{avg:"KBytes",min:"KBytes",max:"KBytes",volatility:"percent"}},network:{localConnection:Ev(this._reports),remoteConnection:Sv(this._reports)}}}}updateConfig(s){this._cfg=s}getLastReport(){return this._reports.slice().pop()||null}getBeforeLastReport(){const s=this._reports.slice();return s.pop(),s.pop()||null}getReportsNumber(){return this._reports.length}}const $s="extractor ",Nf=(c,s,r,o)=>{let a=!1;const t=o[s].total_rtt_ms_out,n=o[s].total_rtt_measure_out,p=r?r[s].total_rtt_ms_out:0,_=r?r[s].total_rtt_measure_out:0,d={rtt:null,totalRTT:t,totalRTTMeasurements:n};if(c[V.TIMESTAMP]===o[s].timestamp_out||!Object.prototype.hasOwnProperty.call(c,V.ROUND_TRIP_TIME)||Object.prototype.hasOwnProperty.call(c,V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS)&&(a=!0,Number(c[V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS])===0||Number(c[V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS])-_===n))return d;const g=1e3*Number(c[V.ROUND_TRIP_TIME]);let T=t+g,E=n+1;return a&&(T=1e3*Number(c[V.TOTAL_ROUND_TRIP_TIME])-p,E=Number(c[V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS])-_),{rtt:g,totalRTT:T,totalRTTMeasurements:E}},Av=(c,s,r,o)=>{if(!Object.prototype.hasOwnProperty.call(c,V.CURRENT_ROUND_TRIP_TIME))return{rtt:null,totalRTT:o[s].total_rtt_connectivity_ms,totalRTTMeasurements:o[s].total_rtt_connectivity_measure};const a=1e3*Number(c[V.CURRENT_ROUND_TRIP_TIME]);let t=o[s].total_rtt_connectivity_ms+a,n=o[s].total_rtt_connectivity_measure+1;return Object.prototype.hasOwnProperty.call(c,V.TOTAL_ROUND_TRIP_TIME)&&(t=1e3*Number(c[V.TOTAL_ROUND_TRIP_TIME])-(r?r[s].total_rtt_connectivity_ms:0)),Object.prototype.hasOwnProperty.call(c,V.RESPONSES_RECEIVED)&&(n=Number(c[V.RESPONSES_RECEIVED])-(r?r[s].total_rtt_connectivity_measure:0)),{rtt:a,totalRTT:t,totalRTTMeasurements:n}},oo=(c,s,r)=>c[V.TIMESTAMP]===r[s].timestamp_out||!Object.prototype.hasOwnProperty.call(c,V.JITTER)?null:1e3*(Number(c[V.JITTER])||0),Cv=(c,s)=>{if(!Object.prototype.hasOwnProperty.call(c,V.FRAMES_DECODED)||!Object.prototype.hasOwnProperty.call(c,V.TOTAL_DECODE_TIME))return{delta_ms_decode_frame:s[x.VIDEO].delta_ms_decode_frame_in,frames_decoded:s[x.VIDEO].total_frames_decoded_in,total_decode_time:s[x.VIDEO].total_time_decoded_in};const r=c[V.FRAMES_DECODED],o=c[V.TOTAL_DECODE_TIME],a=o-s[x.VIDEO].total_time_decoded_in,t=r-s[x.VIDEO].total_frames_decoded_in;return{delta_ms_decode_frame:t>0?a*1e3/t:0,frames_decoded:r,total_decode_time:o}},Rv=(c,s)=>{if(!Object.prototype.hasOwnProperty.call(c,V.FRAMES_ENCODED)||!Object.prototype.hasOwnProperty.call(c,V.TOTAL_ENCODE_TIME))return{delta_ms_encode_frame:s[x.VIDEO].delta_ms_encode_frame_out,frames_encoded:s[x.VIDEO].total_frames_encoded_out,total_encode_time:s[x.VIDEO].total_time_encoded_out};const r=c[V.FRAMES_ENCODED],o=c[V.TOTAL_ENCODE_TIME],a=o-s[x.VIDEO].total_time_encoded_out,t=r-s[x.VIDEO].total_frames_encoded_out;return{delta_ms_encode_frame:t>0&&a?a*1e3/t:0,frames_encoded:r,total_encode_time:o}},Uf=(c,s,r,o)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PACKETS_SENT)||!Object.prototype.hasOwnProperty.call(c,V.BYTES_SENT))return{packetsSent:r[s].total_packets_out,packetsLost:r[s].total_packets_lost_out,bytesSent:r[s].total_KBytes_out};const a=Number(c[V.PACKETS_SENT])||0-(o?o[s].total_packets_out:0),t=a-r[s].total_packets_out,n=Number(c[V.BYTES_SENT])/1024-(o?o[s].total_KBytes_out:0),p=n-r[s].total_KBytes_out,_=c[V.TIMESTAMP]||Date.now(),d=o?o.timestamp:null;let g=r.timestamp;!g&&d&&(g=d);const T=g?_-g:0,E=T>0?p*.008*1024/T*1e3:0;return{packetsSent:a,deltaPacketsSent:t,KBytesSent:n,deltaKBytesSent:p,kbsSent:E}},Pf=(c,s,r,o)=>{let a=r[s].total_packets_lost_out,t=0,n=0;return Object.prototype.hasOwnProperty.call(c,V.PACKETS_LOST)&&(a=Number(c[V.PACKETS_LOST])||0-(o?o[s].total_packets_lost_out:0),t=a-r[s].total_packets_lost_out),Object.prototype.hasOwnProperty.call(c,V.FRACTION_LOST)&&(n=Number(100*c[V.FRACTION_LOST])),{packetsLost:a,deltaPacketsLost:t,fractionLost:n}},xf=(c,s,r,o)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PACKETS_RECEIVED)||!Object.prototype.hasOwnProperty.call(c,V.PACKETS_LOST)||!Object.prototype.hasOwnProperty.call(c,V.BYTES_RECEIVED))return{percent_packets_lost:r[s].percent_packets_lost_in,packetsReceived:r[s].total_packets_in,packetsLost:r[s].total_packets_lost_in,bytesReceived:r[s].total_KBytes_in};const a=Number(c[V.PACKETS_RECEIVED])||0-(o?o[s].total_packets_in:0),t=Number(c[V.PACKETS_LOST])||0-(o?o[s].total_packets_lost_in:0),n=t-r[s].total_packets_lost_in,p=a-r[s].total_packets_in,_=a!==r[s].total_packets_in?n*100/(n+p):0,d=Number(c[V.BYTES_RECEIVED])/1024-(o?o[s].total_KBytes_in:0),g=d-r[s].total_KBytes_in,T=c[V.TIMESTAMP]||Date.now(),E=o?o.timestamp:null;let y=r.timestamp;!y&&E&&(y=E);const A=y?T-y:0,C=A>0?g*.008*1024/A*1e3:0;return{percentPacketsLost:_,packetsReceived:a,deltaPacketsReceived:p,packetsLost:t,deltaPacketsLost:n,KBytesReceived:d,deltaKBytesReceived:g,kbsReceived:C}},Iv=c=>c[V.CANDIDATE_TYPE]!=="relay"?"":c[V.RELAY_PROTOCOL]||"",bv=c=>{if(!Object.prototype.hasOwnProperty.call(c,V.NETWORK_TYPE))return Bi.WIFI;switch(c[V.NETWORK_TYPE]){case Za.ETHERNET:return Bi.ETHERNET;case Za.CELLULAR_4G:return Bi.CELLULAR_4G;case Za.WIFI:return Bi.WIFI;default:return Bi.CELLULAR}},Mf=c=>!Object.prototype.hasOwnProperty.call(c,V.FRAME_HEIGHT)||!Object.prototype.hasOwnProperty.call(c,V.FRAME_WIDTH)?{width:null,height:null,framerate:null}:{width:c[V.FRAME_WIDTH]||null,height:c[V.FRAME_HEIGHT]||null,framerate:c[V.FRAMES_PER_SECOND]},wv=c=>{const s=Object.prototype.hasOwnProperty.call(c,V.QUALITY_LIMITATION_REASON)?c[V.QUALITY_LIMITATION_REASON]:null,r=Object.prototype.hasOwnProperty.call(c,V.QUALITY_LIMITATION_RESOLUTION_CHANGES)?c[V.QUALITY_LIMITATION_RESOLUTION_CHANGES]:null,o=Object.prototype.hasOwnProperty.call(c,V.QUALITY_LIMITATION_DURATIONS)?c[V.QUALITY_LIMITATION_DURATIONS]:null;return o&&Object.keys(o).forEach(a=>{o[a]>1e3&&(o[a]=Number(o[a]/1e3))}),{reason:s,durations:o,resolutionChanges:r}},Ov=(c,s,r)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PLI)||!Object.prototype.hasOwnProperty.call(c,V.NACK))return{pliCount:s.total_pli_sent_in,nackCount:s.total_nack_sent_in,deltaPliCount:0,deltaNackCount:0};const o=(c[V.PLI]||0)-(r?r[x.VIDEO].total_pli_sent_in:0),a=(c[V.NACK]||0)-(r?r[x.VIDEO].total_nack_sent_in:0);return{pliCount:o,nackCount:a,deltaPliCount:o-s[x.VIDEO].total_pli_sent_in,deltaNackCount:a-s[x.VIDEO].total_nack_sent_in}},Dv=(c,s,r)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PLI)||!Object.prototype.hasOwnProperty.call(c,V.NACK))return{pliCount:s.total_pli_received_out,nackCount:s.total_nack_received_out,deltaPliCount:0,deltaNackCount:0};const o=(c[V.PLI]||0)-(r?r[x.VIDEO].total_pli_received_out:0),a=(c[V.NACK]||0)-(r?r[x.VIDEO].total_nack_received_out:0);return{pliCount:o,nackCount:a,deltaPliCount:o-s[x.VIDEO].total_pli_received_out,deltaNackCount:a-s[x.VIDEO].total_nack_received_out}},Nv=c=>({channels:c[V.CHANNELS]||null,clock_rate:c[V.CLOCK_RATE]||null,mime_type:c[V.MIME_TYPE]||null,sdp_fmtp_line:c[V.SDP_FMTP_LINE]||null}),Uv=c=>({clock_rate:c[V.CLOCK_RATE]||null,mime_type:c[V.MIME_TYPE]||null}),Pv=(c,s,r)=>{const o=(c[V.BYTES_RECEIVED]||0)/1024-(r?r.data.total_KBytes_in:0),a=(c[V.BYTES_SENT]||0)/1024-(r?r.data.total_KBytes_out:0),t=c[V.TIMESTAMP]||Date.now(),n=o-s.data.total_KBytes_in,p=a-s.data.total_KBytes_out,_=r?r.timestamp:null;let d=s.timestamp;!d&&_&&(d=_);const g=d?t-d:0,T=g>0?n*.008*1024/g*1e3:0,E=g>0?p*.008*1024/g*1e3:0;return{total_KBytes_received:o,total_KBytes_sent:a,delta_KBytes_received:n,delta_KBytes_sent:p,kbs_speed_received:T,kbs_speed_sent:E}},xv=c=>{const s=c[V.AVAILABLE_INCOMING_BITRATE]/1024||0,r=c[V.AVAILABLE_OUTGOING_BITRATE]/1024||0;return{kbs_incoming_bandwidth:s,kbs_outgoing_bandwidth:r}},Mv=(c,s,r,o)=>{if(!c)return[];switch(c[V.TYPE]){case zt.CANDIDATE_PAIR:let a=!1;if(c[V.NOMINATED]&&c[V.STATE]===x.SUCCEEDED&&(a=!0,Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c),V.SELECTED in c&&!c[V.SELECTED]&&(a=!1)),a){const n=c[V.LOCAL_CANDIDATE_ID],p=c[V.REMOTE_CANDIDATE_ID],_=Pv(c,s,o),d=xv(c),g=Av(c,"data",o,s);return[{type:ne.NETWORK,value:{local_candidate_id:n}},{type:ne.NETWORK,value:{remote_candidate_id:p}},{type:ne.DATA,value:{total_KBytes_in:_.total_KBytes_received}},{type:ne.DATA,value:{total_KBytes_out:_.total_KBytes_sent}},{type:ne.DATA,value:{delta_KBytes_in:_.delta_KBytes_received}},{type:ne.DATA,value:{delta_KBytes_out:_.delta_KBytes_sent}},{type:ne.DATA,value:{delta_kbs_in:_.kbs_speed_received}},{type:ne.DATA,value:{delta_kbs_out:_.kbs_speed_sent}},{type:ne.DATA,value:{delta_kbs_bandwidth_in:d.kbs_incoming_bandwidth}},{type:ne.DATA,value:{delta_kbs_bandwidth_out:d.kbs_outgoing_bandwidth}},{type:ne.DATA,value:{delta_rtt_connectivity_ms:g.rtt}},{type:ne.DATA,value:{total_rtt_connectivity_ms:g.totalRTT}},{type:ne.DATA,value:{total_rtt_connectivity_measure:g.totalRTTMeasurements}}]}break;case zt.LOCAL_CANDIDATE:if(c[V.ID]===s.network.local_candidate_id)return[{type:ne.NETWORK,value:{infrastructure:bv(c)}},{type:ne.NETWORK,value:{local_candidate_type:c[V.CANDIDATE_TYPE]||""}},{type:ne.NETWORK,value:{local_candidate_protocol:c[V.PROTOCOL]||""}},{type:ne.NETWORK,value:{local_candidate_relay_protocol:Iv(c)}}];break;case zt.REMOTE_CANDIDATE:if(c[V.ID]===s.network.remote_candidate_id)return[{type:ne.NETWORK,value:{remote_candidate_type:c[V.CANDIDATE_TYPE]||""}},{type:ne.NETWORK,value:{remote_candidate_protocol:c[V.PROTOCOL]||""}}];break;case zt.INBOUND_RTP:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const n=c[V.SSRC],p=ct(n,s,$e.INBOUND);p&&(p.timestamp=s.timestamp);const _=ct(n,o,$e.INBOUND);if(_&&(_.timestamp=o.timestamp),c[V.MEDIA_TYPE]===x.AUDIO){const d=xf(c,x.AUDIO,p,_),g=oo(c,x.AUDIO,p),T=c[V.CODEC_ID]||"";return[{ssrc:n,type:ne.AUDIO,value:{codec_id_in:T}},{ssrc:n,type:ne.AUDIO,value:{total_packets_in:d.packetsReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_in:d.deltaPacketsReceived}},{ssrc:n,type:ne.AUDIO,value:{total_packets_lost_in:d.packetsLost}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_lost_in:d.deltaPacketsLost}},{ssrc:n,type:ne.AUDIO,value:{percent_packets_lost_in:d.percentPacketsLost}},{ssrc:n,type:ne.AUDIO,value:{total_KBytes_in:d.KBytesReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_KBytes_in:d.deltaKBytesReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_kbs_in:d.kbsReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_jitter_ms_in:g}}]}if(c[V.MEDIA_TYPE]===x.VIDEO){const d=Cv(c,p),g=xf(c,x.VIDEO,p,_),T=oo(c,x.VIDEO,p),E=c[V.DECODER_IMPLEMENTATION]||null,y=c[V.CODEC_ID]||null,A=Mf(c),C=Ov(c,p,_);return[{ssrc:n,type:ne.VIDEO,value:{codec_id_in:y}},{ssrc:n,type:ne.VIDEO,value:{total_packets_in:g.packetsReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_in:g.deltaPacketsReceived}},{ssrc:n,type:ne.VIDEO,value:{total_packets_lost_in:g.packetsLost}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_lost_in:g.deltaPacketsLost}},{ssrc:n,type:ne.VIDEO,value:{percent_packets_lost_in:g.percentPacketsLost}},{ssrc:n,type:ne.VIDEO,value:{total_KBytes_in:g.KBytesReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_KBytes_in:g.deltaKBytesReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_kbs_in:g.kbsReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_jitter_ms_in:T}},{ssrc:n,type:ne.VIDEO,value:{decoder_in:E}},{ssrc:n,type:ne.VIDEO,value:{delta_ms_decode_frame_in:d.delta_ms_decode_frame}},{ssrc:n,type:ne.VIDEO,value:{total_frames_decoded_in:d.frames_decoded}},{ssrc:n,type:ne.VIDEO,value:{total_time_decoded_in:d.total_decode_time}},{ssrc:n,type:ne.VIDEO,value:{total_nack_sent_in:C.nackCount}},{ssrc:n,type:ne.VIDEO,value:{delta_nack_sent_in:C.deltaNackCount}},{ssrc:n,type:ne.VIDEO,value:{total_pli_sent_in:C.pliCount}},{ssrc:n,type:ne.VIDEO,value:{delta_pli_sent_in:C.deltaPliCount}},{ssrc:n,type:ne.VIDEO,value:{size_in:A}}]}break}case zt.OUTBOUND_RTP:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const n=c[V.SSRC],p=ct(n,s,$e.OUTBOUND);p&&(p.timestamp=s.timestamp);const _=ct(n,o,$e.OUTBOUND);if(_&&(_.timestamp=o.timestamp),c[V.MEDIA_TYPE]===x.AUDIO){const d=c[V.CODEC_ID]||null,g=Uf(c,x.AUDIO,p,_);return[{ssrc:n,type:ne.AUDIO,value:{codec_id_out:d}},{ssrc:n,type:ne.AUDIO,value:{total_packets_out:g.packetsSent}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_out:g.deltaPacketsSent}},{ssrc:n,type:ne.AUDIO,value:{total_KBytes_out:g.KBytesSent}},{ssrc:n,type:ne.AUDIO,value:{delta_KBytes_out:g.deltaKBytesSent}},{ssrc:n,type:ne.AUDIO,value:{delta_kbs_out:g.kbsSent}}]}if(c[V.MEDIA_TYPE]===x.VIDEO){const d=c[V.ENCODER_IMPLEMENTATION]||null,g=c[V.CODEC_ID]||null,T=Rv(c,p),E=Mf(c),y=wv(c),A=Dv(c,p,_),C=Uf(c,x.VIDEO,p,_);return[{ssrc:n,type:ne.VIDEO,value:{codec_id_out:g}},{ssrc:n,type:ne.VIDEO,value:{total_packets_out:C.packetsSent}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_out:C.deltaPacketsSent}},{ssrc:n,type:ne.VIDEO,value:{total_KBytes_out:C.KBytesSent}},{ssrc:n,type:ne.VIDEO,value:{delta_KBytes_out:C.deltaKBytesSent}},{ssrc:n,type:ne.VIDEO,value:{delta_kbs_out:C.kbsSent}},{ssrc:n,type:ne.VIDEO,value:{encoder_out:d}},{ssrc:n,type:ne.VIDEO,value:{delta_ms_encode_frame_out:T.delta_ms_encode_frame}},{ssrc:n,type:ne.VIDEO,value:{total_frames_encoded_out:T.frames_encoded}},{ssrc:n,type:ne.VIDEO,value:{total_time_encoded_out:T.total_encode_time}},{ssrc:n,type:ne.VIDEO,value:{total_nack_received_out:A.nackCount}},{ssrc:n,type:ne.VIDEO,value:{delta_nack_received_out:A.deltaNackCount}},{ssrc:n,type:ne.VIDEO,value:{total_pli_received_out:A.pliCount}},{ssrc:n,type:ne.VIDEO,value:{delta_pli_received_out:A.deltaPliCount}},{ssrc:n,type:ne.VIDEO,value:{size_out:E}},{ssrc:n,type:ne.VIDEO,value:{limitation_out:y}}]}break}case zt.MEDIA_SOURCE:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);break}case zt.TRACK:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);break}case zt.CODEC:const t=[];return Object.keys(s[x.AUDIO]).forEach(n=>{const p=s[x.AUDIO][n];if(p.codec_id_in===c[V.ID]||p.codec_id_out===c[V.ID]){Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const _=Nv(c);c[V.ID]===p.codec_id_in?t.push({ssrc:p.ssrc,type:ne.AUDIO,value:{codec_in:_}}):t.push({ssrc:p.ssrc,type:ne.AUDIO,value:{codec_out:_}})}}),Object.keys(s[x.VIDEO]).forEach(n=>{const p=s[x.VIDEO][n];if(p.codec_id_in===c[V.ID]||p.codec_id_out===c[V.ID]){Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const _=Uv(c);c[V.ID]===p.codec_id_in?t.push({ssrc:p.ssrc,type:ne.VIDEO,value:{codec_in:_}}):t.push({ssrc:p.ssrc,type:ne.VIDEO,value:{codec_out:_}})}}),t;case zt.REMOTE_INBOUND_RTP:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const n=c[V.SSRC],p=ct(n,s,$e.OUTBOUND),_=ct(n,o,$e.OUTBOUND);if(c[V.KIND]===x.AUDIO){const d=Nf(c,x.AUDIO,_,p),g=oo(c,x.AUDIO,p),T=Pf(c,x.AUDIO,p,_);return[{ssrc:n,type:ne.AUDIO,value:{delta_rtt_ms_out:d.rtt}},{ssrc:n,type:ne.AUDIO,value:{total_rtt_ms_out:d.totalRTT}},{ssrc:n,type:ne.AUDIO,value:{total_rtt_measure_out:d.totalRTTMeasurements}},{ssrc:n,type:ne.AUDIO,value:{delta_jitter_ms_out:g}},{ssrc:n,type:ne.AUDIO,value:{timestamp_out:c[V.TIMESTAMP]}},{ssrc:n,type:ne.AUDIO,value:{total_packets_lost_out:T.packetsLost}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_lost_out:T.deltaPacketsLost}},{ssrc:n,type:ne.AUDIO,value:{percent_packets_lost_out:T.fractionLost}}]}if(c[V.KIND]===x.VIDEO){const d=Nf(c,x.VIDEO,_,p),g=oo(c,x.VIDEO,p),T=Pf(c,x.VIDEO,p,_);return[{ssrc:n,type:ne.VIDEO,value:{delta_rtt_ms_out:d.rtt}},{ssrc:n,type:ne.VIDEO,value:{total_rtt_ms_out:d.totalRTT}},{ssrc:n,type:ne.VIDEO,value:{total_rtt_measure_out:d.totalRTTMeasurements}},{ssrc:n,type:ne.VIDEO,value:{delta_jitter_ms_out:g}},{ssrc:n,type:ne.VIDEO,value:{timestamp_out:c[V.TIMESTAMP]}},{ssrc:n,type:ne.VIDEO,value:{total_packets_lost_out:T.packetsLost}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_lost_out:T.deltaPacketsLost}},{ssrc:n,type:ne.VIDEO,value:{percent_packets_lost_out:T.fractionLost}}]}break}}return[]},jo=c=>c<0?1:c>100?4.5:1+.035*c+7/1e6*c*(c-60)*(100-c),kv=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.INBOUND),n=ct(a,r,$e.INBOUND),p=ct(a,o,$e.INBOUND),_=[],d=[],g=t[s].percent_packets_lost_in,T=t[s].delta_jitter_ms_in,E=n&&n[s].delta_jitter_ms_in||null,y=p&&p[s].delta_jitter_ms_in||null,A=c.data.delta_rtt_connectivity_ms,C=r&&r.data.delta_rtt_connectivity_ms||null,I=o&&o.data.delta_rtt_connectivity_ms||null;A&&_.push(A),C&&_.push(C),I&&_.push(I),T&&d.push(T),r&&E&&d.push(E),o&&y&&d.push(y);const $=_.length>0?Vs(_):100,L=d.length>0?Vs(d):10,ae=93.2-g,N=.18*ae*ae-27.9*ae+1126.62,F=($+L)/2,Se=F-177.3<0?0:1,ve=.024*F+.11*(F-177.3)*Se,M=N-ve;return jo(M)},Lv=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.OUTBOUND),n=ct(a,r,$e.OUTBOUND),p=ct(a,o,$e.OUTBOUND),_=[],d=[],g=t[s].percent_packets_lost_out,T=t[s].delta_rtt_ms_out,E=n&&n[s].delta_rtt_ms_out||null,y=p&&p[s].delta_rtt_ms_out||null,A=t[s].delta_jitter_ms_out,C=n&&n[s].delta_jitter_ms_out||null,I=p&&p[s].delta_jitter_ms_out||null,$=c.data.delta_rtt_connectivity_ms,L=r&&r.data.delta_rtt_connectivity_ms||null,ae=o&&o.data.delta_rtt_connectivity_ms||null;T?_.push(T):$&&_.push($),E?_.push(E):L&&_.push(L),y?_.push(y):ae&&_.push(ae),A&&d.push(A),r&&C&&d.push(C),o&&I&&d.push(I);const N=_.length>0?Vs(_):100,F=d.length>0?Vs(d):10,Se=93.2-g,ve=.18*Se*Se-27.9*Se+1126.62,M=(N+F)/2,D=M-177.3<0?0:1,B=.024*M+.11*(M-177.3)*D,q=ve-B;return jo(q)},$v=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.INBOUND),n=ct(a,r,$e.INBOUND),p=ct(a,o,$e.INBOUND),_=[],d=[],g=t[s].percent_packets_lost_in/100,T=t[s].delta_jitter_ms_in,E=n&&n[s].delta_jitter_ms_in||null,y=p&&p[s].delta_jitter_ms_in||null,A=c.data.delta_rtt_connectivity_ms,C=r&&r.data.delta_rtt_connectivity_ms||null,I=o&&o.data.delta_rtt_connectivity_ms||null;A&&_.push(A),C&&_.push(C),I&&_.push(I),T&&d.push(T),n&&E&&d.push(E),p&&y&&d.push(y);const $=_.length>0?Vs(_):100,L=d.length>0?Vs(d):10,ae=0,N=19.8,F=29.7,Se=30,ve=($+L)/2+Se,M=ve-177.3<0?0:1,D=.024*ve+.11*(ve-177.3)*M,q=93.2-(ae+N*Math.log(1+F*g)+D);return jo(q)},Hv=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.OUTBOUND),n=ct(a,r,$e.OUTBOUND),p=ct(a,o,$e.OUTBOUND),_=[],d=[],g=t[s].percent_packets_lost_out/100,T=t[s].delta_rtt_ms_out,E=n&&n[s].delta_rtt_ms_out||null,y=p&&p[s].delta_rtt_ms_out||null,A=t[s].delta_jitter_ms_out,C=n&&n[s].delta_jitter_ms_out||null,I=p&&p[s].delta_jitter_ms_out||null,$=c.data.delta_rtt_connectivity_ms,L=r&&r.data.delta_rtt_connectivity_ms||null,ae=o&&o.data.delta_rtt_connectivity_ms||null;T?_.push(T):$&&_.push($),E?_.push(E):L&&_.push(L),y?_.push(y):ae&&_.push(ae),A&&d.push(A),n&&C&&d.push(C),p&&I&&d.push(I);const N=_.length>0?Vs(_):100,F=d.length>0?Vs(d):10,Se=0,ve=19.8,M=29.7,D=30,B=(N+F)/2+D,q=B-177.3<0?0:1,z=.024*B+.11*(B-177.3)*q,X=93.2-(Se+ve*Math.log(1+M*g)+z);return jo(X)};class Fv{constructor(s,r){this._callbacks={onreport:null,onticket:null},this._id=mv(),this._moduleName=this._id,this._probeId=r,this._config=s,this._exporter=new yv(s),this._state=ps.IDLE,this.registerToPCEvents(),yn(this._moduleName,`new collector created for probe ${this._probeId}`)}analyze(s,r,o,a){const t=(_,d)=>_===x.AUDIO?d===zt.INBOUND_RTP?{...I_}:{...b_}:d===zt.INBOUND_RTP?{...w_}:{...O_},n=fv(r);n.pname=this._config.pname,n.call_id=this._config.cid,n.user_id=this._config.uid,n.count=r?r.count+1:1;let p=null;return s.forEach(_=>{!p&&_.timestamp&&(p=_.timestamp),Mv(_,n,n.pname,a).forEach(g=>{if(g.value&&g.type)if(g.ssrc){let T=n[g.type][g.ssrc];T||(T=t(g.type,_.type),T.ssrc=g.ssrc,n[g.type][g.ssrc]=T),Object.keys(g.value).forEach(E=>{T[E]=g.value[E]})}else Object.keys(g.value).forEach(T=>{n[g.type][T]=g.value[T]})})}),n.timestamp=p,Object.keys(n[x.AUDIO]).forEach(_=>{const d=n[x.AUDIO][_];d.direction===$e.INBOUND?(d.mos_emodel_in=kv(n,x.AUDIO,r,o,d.ssrc),d.mos_in=$v(n,x.AUDIO,r,o,d.ssrc)):(d.mos_emodel_out=Lv(n,x.AUDIO,r,o,d.ssrc),d.mos_out=Hv(n,x.AUDIO,r,o,d.ssrc))}),n}async takeReferenceStats(){return new Promise((s,r)=>{const o=Date.now();setTimeout(async()=>{try{const a=Date.now()-o,t=Date.now(),n=await this._config.pc.getStats(),p=this.analyze(n,null,null,null),_=Date.now();p.experimental.time_to_measure_ms=_-t,p.experimental.time_to_wait_ms=a,this._exporter.saveReferenceReport(p),Pe(this._moduleName,`got reference report for probe ${this._probeId}`),s()}catch(a){r(a)}},this._config.startAfter)})}async collectStats(){try{if(this._state!==ps.RUNNING||!this._config.pc)return Pe(this._moduleName,`report discarded (too late) for probe ${this._probeId}`),null;const s=Date.now(),r=await this._config.pc.getStats(),o=this.analyze(r,this._exporter.getLastReport(),this._exporter.getBeforeLastReport(),this._exporter.getReferenceReport()),a=Date.now();return o.experimental.time_to_measure_ms=a-s,this._exporter.addReport(o),Pe(this._moduleName,`got report for probe ${this._probeId}#${this._exporter.getReportsNumber()+1}`),this.fireOnReport(o),o}catch(s){return ur(this._moduleName,`got error ${s}`),null}}async start(){Pe(this._moduleName,"starting"),this.state=ps.RUNNING,this._startedTime=this._exporter.start(),Pe(this._moduleName,"started")}async mute(){this.state=ps.MUTED,Pe(this._moduleName,"muted")}async unmute(){this.state=ps.RUNNING,Pe(this._moduleName,"unmuted")}async stop(s){if(Pe(this._moduleName,`stopping${s?" by watchdog":""}...`),this._stoppedTime=this._exporter.stop(),this.state=ps.IDLE,this._config.ticket){const{ticket:r}=this._exporter;this.fireOnTicket(r)}this._exporter.reset(),Pe(this._moduleName,"stopped")}registerCallback(s,r,o){s in this._callbacks?(this._callbacks[s]={callback:r,context:o},Pe(this._moduleName,`registered callback '${s}'`)):ur(this._moduleName,`can't register callback for '${s}' - not found`)}unregisterCallback(s){s in this._callbacks?(this._callbacks[s]=null,delete this._callbacks[s],Pe(this._moduleName,`unregistered callback '${s}'`)):ur(this._moduleName,`can't unregister callback for '${s}' - not found`)}fireOnReport(s){this._callbacks.onreport&&Eu(this._callbacks.onreport.callback,this._callbacks.onreport.context,s)}fireOnTicket(s){this._callbacks.onticket&&Eu(this._callbacks.onticket.callback,this._callbacks.onticket.context,s)}updateConfig(s){this._config=s,this._exporter.updateConfig(s)}get state(){return this._state}set state(s){this._state=s,Pe(this._moduleName,`state changed to ${s}`)}addCustomEvent(s,r,o,a){this._exporter.addCustomEvent({at:typeof s=="object"?s.toJSON():s,category:r,name:o,description:a})}async registerToPCEvents(){const{pc:s}=this._config;if(navigator.mediaDevices.ondevicechange=async()=>{try{const r=await navigator.mediaDevices.enumerateDevices();this.addCustomEvent(new Date().toJSON(),"device",`${r.length} devices found`,"Media Devices state")}catch{ur(this._moduleName,"can't get devices")}},s){s.oniceconnectionstatechange=()=>{const o=s.iceConnectionState;o===qi.CONNECTED||o===qi.COMPLETED?this.addCustomEvent(new Date().toJSON(),"call",o,"ICE connection state"):o===qi.DISCONNECTED||o===qi.FAILED?this.addCustomEvent(new Date().toJSON(),"call",o,"ICE connection state"):o===qi.CLOSED&&this.addCustomEvent(new Date().toJSON(),"call","ended","ICE connection state")},s.onicegatheringstatechange=()=>{const o=s.iceGatheringState;this.addCustomEvent(new Date().toJSON(),"call",o,"ICE gathering state")},s.ontrack=o=>{this.addCustomEvent(new Date().toJSON(),"call",`${o.track.kind}track`,"MediaStreamTrack received")},s.onnegotiationneeded=()=>{this.addCustomEvent(new Date().toJSON(),"call","negotiation","Media changed")};const r=s.getReceivers();if(r&&r.length>0){const o=r[0],{transport:a}=o;if(a){const{iceTransport:t}=a;t&&(t.onselectedcandidatepairchange=()=>{this.addCustomEvent(new Date().toJSON(),"call","transport","Candidates Pair changed")})}}}}}class jv{constructor(s){this._id=s.pname&&s.pname.substr(0,12).padEnd(12," ")||pv(),this._moduleName=this._id,yn(this._moduleName,"probe created"),this._config=s,this._collector=new Fv(this._config,this._id)}set onreport(s){s?this._collector.registerCallback("onreport",s):this._collector.unregisterCallback("onreport")}set onticket(s){s?this._collector.registerCallback("onticket",s):this._collector.unregisterCallback("onticket")}get id(){return this._id}get pname(){return this._config.pname}get cid(){return this._config.cid}get uid(){return this._config.uid}get state(){return this._collector.state}set state(s){this._collector.state=s}addCustomEvent(s,r,o,a=new Date().toJSON()){this._collector.addCustomEvent(a,r,s,o)}get isRunning(){return this._collector.state===ps.RUNNING}get isIdle(){return this._collector.state===ps.IDLE}updateUserId(s){this._config.uid=s,this._collector.updateConfig(this._config)}updateCallId(s){this._config.cid=s,this._collector.updateConfig(this._config)}start(){if(!this.isIdle){Ao(this._moduleName,"probe is already running");return}this._collector.start()}stop(s=!1){this.isRunning&&this._collector.stop(s)}async takeReferenceStats(){return this._collector.takeReferenceStats()}async collectStats(){return this._collector.collectStats()}}const Ct="engine ";class Vv{constructor(s){this._config=s,this._probes=[],this._startedTime=null,this._callbacks={onresult:null},yn(Ct,`configured for probing every ${this._config.refreshEvery}ms`),yn(Ct,`configured for starting after ${this._config.startAfter}ms`),yn(Ct,`${!this._config.stopAfter||this._config.stopAfter!==-1?`configured for stopped after ${this._config.stopAfter}ms`:"configured for never stopped"}`),Pe(Ct,"engine initialized")}get probes(){return this._probes}get isRunning(){return this._probes.some(s=>s.isRunning)}get isIdle(){return this._probes.every(s=>s.isIdle)}addNewProbe(s,r){if(!s)throw new Error("undefined peer connection");const o=hv(s,r,this._config),a=new jv(o);return this._probes.push(a),Pe(Ct,`${this._probes.length} probes registered`),a}removeExistingProbe(s){if(!s)throw new Error("undefined probe");s.state===ps.RUNNING&&s.stop(),this._probes=this._probes.filter(r=>s.id!==r.id)}async start(){const s=()=>{this._probes.forEach(t=>t.start())},r=async()=>Promise.all(this._probes.map(t=>t.takeReferenceStats())),o=()=>this.isIdle?!1:!this._config.stopAfter||this._config.stopAfter<0?!0:Date.now()<this._startedTime+this._config.stopAfter,a=async()=>{const t=cv(),n=this._probes.filter(p=>p.isRunning);for(const p of n){const _=await p.collectStats();_&&t.probes.push(_),Pe(Ct,`got probe ${p.id}`),await Of(0)}return t.delta_time_to_measure_probes_ms=Tn(t.probes,"experimental","time_to_measure_ms"),t.delta_KBytes_in=Tn(t.probes,"data","delta_KBytes_in"),t.delta_KBytes_out=Tn(t.probes,"data","delta_KBytes_out"),t.delta_kbs_in=Tn(t.probes,"data","delta_kbs_in"),t.delta_kbs_out=Tn(t.probes,"data","delta_kbs_out"),t.total_time_decoded_in=Tn(t.probes,"video","total_time_decoded_in"),t.total_time_encoded_out=Tn(t.probes,"video","total_time_encoded_out"),t};for(Pe(Ct,"starting to collect"),s(),Pe(Ct,"generating reference reports..."),await r(),Pe(Ct,"reference reports generated"),this._startedTime=Date.now();o();)if(Pe(Ct,`wait ${this._config.refreshEvery}ms before collecting`),await Of(this._config.refreshEvery),o()){Pe(Ct,"collecting...");const t=Date.now(),n=await a(),p=Date.now();n.delta_time_consumed_to_measure_ms=p-t,this.fireOnReports(n),Pe(Ct,"collected")}Pe(Ct,"reaching end of the collecting period..."),this.isRunning&&setTimeout(()=>{this.stop()},0)}stop(s){const r=o=>{this._probes.forEach(a=>{a.stop(o)})};yn(Ct,"stop collecting"),r(s)}registerCallback(s,r,o){s in this._callbacks?(this._callbacks[s]={callback:r,context:o},Pe(Ct,`registered callback '${s}'`)):ur(Ct,`can't register callback for '${s}' - not found`)}unregisterCallback(s){s in this._callbacks?(this._callbacks[s]=null,delete this._callbacks[s],Pe(this._moduleName,`unregistered callback '${s}'`)):ur(this._moduleName,`can't unregister callback for '${s}' - not found`)}fireOnReports(s){this._callbacks.onresult&&s.probes.length>0&&Eu(this._callbacks.onresult.callback,this._callbacks.onresult.context,s)}}const qv="interface ";class Bv{constructor(s){this._config=dv(s),yn(qv,`welcome to ${this._config.name} version ${this._config.version}`),sv(this._config.verbose||!1),this._engine=new Vv(this._config)}setupLogLevel(s){nv(s)}get version(){return this._config.version}get name(){return this._config.name}get probes(){return this._engine.probes}createProbe(s,r){return this._engine.addNewProbe(s,r)}startAllProbes(){this._engine.start()}stopAllProbes(){this._engine.stop()}get running(){return this._engine.isRunning}get idle(){return this._engine.isIdle}removeProbe(s){this._engine.removeExistingProbe(s)}set onresult(s){s?this._engine.registerCallback("onresult",s):this._engine.unregisterCallback("onresult")}}function Gv(c,s){return Object.keys(c).filter(r=>s.includes(r)).reduce((r,o)=>{const a=o;return{...r,[a]:c[a]}},{})}const Wv=["mos_in","codec_in","delta_KBytes_in","delta_kbs_in","delta_jitter_ms_in","delta_packets_lost_in"];class Kv{constructor(s){this.intervals={},this.emitInterval=s.emitInterval||200,this.onChangeFunction=s.onChangeFunction}start(s,r){s&&s.getTracks().length&&requestAnimationFrame(()=>this.beginCalculation(s,r))}stop(s){this.clearVolumeInterval(s)}clearVolumeInterval(s){console.log("clearVolumeInterval",s),clearInterval(this.intervals[s]),delete this.intervals[s]}clearAllIntervals(){Object.keys(this.intervals).forEach(s=>{clearInterval(this.intervals[s])}),this.intervals={}}beginCalculation(s,r){this.clearVolumeInterval(r);const o=Sn.createAnalyser(),a=Sn.createMediaStreamSource(s),t=Sn.createScriptProcessor(2048,1,1);o.smoothingTimeConstant=.8,o.fftSize=1024,a.connect(o),o.connect(t),t.connect(Sn.destination),this.intervals[r]=setInterval(()=>{const n=new Uint8Array(o.frequencyBinCount);o.getByteFrequencyData(n);let p=0;const _=n.length;for(let g=0;g<_;g++)p+=n[g];const d=p/_;this.onChangeFunction(r,d)},this.emitInterval)}}const ao={SELECTED_INPUT_DEVICE:"OpensipsJSInputDevice",SELECTED_OUTPUT_DEVICE:"OpensipsJSOutputDevice"},Yv=0;class zv{constructor(s){this.isAutoAnswer=!1,this.muteWhenJoinEnabled=!1,this.isDNDEnabled=!1,this.muted=!1,this.microphoneInputLevelValue=1,this.speakerVolumeValue=1,this.activeRooms={},this.activeCalls={},this.extendedCalls={},this.availableMediaDevices=[],this.selectedMediaDevices={input:"default",output:"default"},this.callStatus={},this.callTime={},this.callMetrics={},this.timeIntervals={},this.metricConfig={refreshEvery:1e3},this.activeStreamValue=null,this.initialStreamValue=null,this.context=s,this.context.on(this.context.newRTCSessionEventName,this.newRTCSessionCallback.bind(this)),this.VUMeter=new Kv({onChangeFunction:this.emitVolumeChange.bind(this)}),this.initializeMediaDevices()}get sipOptions(){return{...this.context.options.sipOptions,mediaConstraints:this.getUserMediaConstraints}}get currentActiveRoomId(){return this.currentActiveRoomIdValue}set currentActiveRoomId(s){this.currentActiveRoomIdValue=s,this.context.emit("currentActiveRoomChanged",s)}get autoAnswer(){return this.isAutoAnswer}get callAddingInProgress(){return this.isCallAddingInProgress}set callAddingInProgress(s){this.isCallAddingInProgress=s,this.context.emit("callAddingInProgressChanged",s)}get muteWhenJoin(){return this.muteWhenJoinEnabled}get isDND(){return this.isDNDEnabled}get speakerVolume(){return this.speakerVolumeValue}get microphoneInputLevel(){return this.microphoneInputLevelValue}get getActiveCalls(){return this.activeCalls}get hasActiveCalls(){return Object.values(this.extendedCalls).length>0}get getActiveRooms(){return this.activeRooms}get isMuted(){return this.muted}get getInputDeviceList(){return this.availableMediaDevices.filter(s=>s.kind==="audioinput")}get getOutputDeviceList(){return this.availableMediaDevices.filter(s=>s.kind==="audiooutput")}get getUserMediaConstraints(){return A_()?{video:!1,audio:!0}:{audio:{deviceId:{exact:this.selectedMediaDevices.input}},video:!1}}get selectedInputDevice(){return this.selectedMediaDevices.input}get selectedOutputDevice(){return this.selectedMediaDevices.output}get activeStream(){return this.activeStreamValue}setAvailableMediaDevices(s){this.availableMediaDevices=s,this.context.emit("changeAvailableDeviceList",s)}async updateDeviceList(){await navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);const s=await navigator.mediaDevices.enumerateDevices();this.setAvailableMediaDevices(s)}async initializeMediaDevices(){const s=localStorage.getItem(ao.SELECTED_INPUT_DEVICE)||"default",r=localStorage.getItem(ao.SELECTED_OUTPUT_DEVICE)||"default";try{const o=await navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints),a=await navigator.mediaDevices.enumerateDevices();this.setAvailableMediaDevices(a),await this.setMicrophone(s),await this.setSpeaker(r),navigator.mediaDevices.addEventListener("devicechange",async()=>{const t=await navigator.mediaDevices.enumerateDevices();this.setAvailableMediaDevices(t)}),o.getTracks().forEach(t=>t.stop())}catch(o){console.error(o)}}setCallTime(s){const r={...s};delete r.callId,this.callTime={...this.callTime,[s.callId]:r},this.context.emit("changeCallTime",this.callTime)}removeCallTime(s){const r={...this.callTime};delete r[s],this.callTime={...r},this.context.emit("changeCallTime",this.callTime)}setTimeInterval(s,r){this.timeIntervals={...this.timeIntervals,[s]:r}}removeTimeInterval(s){const r={...this.timeIntervals};r[s]&&(clearInterval(r[s]),delete r[s],this.timeIntervals={...r})}stopCallTimer(s){this.removeTimeInterval(s),this.removeCallTime(s)}emitVolumeChange(s,r){this.context.emit("changeCallVolume",{callId:s,volume:r})}setMetricsConfig(s){this.metricConfig={...this.metricConfig,...s}}sendDTMF(s,r){if(!/^[A-D0-9]+$/g.test(r))throw new Error("Not allowed character in DTMF input");this.extendedCalls[s].sendDTMF(r)}setIsMuted(s){this.muted=s,this.context.emit("changeIsMuted",s)}processMute(s){const r=this.currentActiveRoomId;this.setIsMuted(s),this.initialStreamValue.getTracks().forEach(o=>o.enabled=!s),this.roomReconfigure(r)}mute(){this.processMute(!0)}unmute(){this.processMute(!1)}async processHold({callId:s,toHold:r,automatic:o}){const a=this.extendedCalls[s];a._automaticHold=o??!1,await new Promise(p=>{const _=()=>{p()};r?a.hold({},_):a.unhold({},_)}),this.updateCall(a);const n=Object.values(this.extendedCalls).filter(p=>p.roomId===this.currentActiveRoomId&&(r?s!==p._id:!0));n.length>1&&await this.doConference(n)}holdCall(s,r=!1){return this.processHold({callId:s,automatic:r,toHold:!0})}unholdCall(s){return this.processHold({callId:s,toHold:!1})}cancelAllOutgoingUnanswered(){Object.values(this.getActiveCalls).filter(s=>s.direction==="outgoing"&&s.status===Yv).forEach(s=>this.terminateCall(s._id))}answerCall(s){const r=this.extendedCalls[s];this.cancelAllOutgoingUnanswered(),r.answer(this.sipOptions),this.updateCall(r),this.setActiveRoom(r.roomId),r.connection.addEventListener("track",o=>{this.triggerAddStream(o,r)})}async moveCall(s,r){this.updateCallStatus({callId:s,isMoving:!0}),await this.processRoomChange({callId:s,roomId:r}),this.updateCallStatus({callId:s,isMoving:!1})}updateCall(s){this.activeCalls[s._id]=Cf(s),this.context.emit("changeActiveCalls",this.activeCalls)}updateRoom(s){const o={...this.activeRooms[s.roomId],...s};this.activeRooms={...this.activeRooms,[s.roomId]:{...o}},this.context.emit("updateRoom",{room:o,roomList:this.activeRooms})}hasAutoAnswerHeaders(s){const r=/answer-after=0/,a=s.request.getHeader("Call-Info");return a&&r.test(a)}addCall(s,r=!0){this.activeCalls={...this.activeCalls,[s._id]:Cf(s)},this.extendedCalls[s._id]=s,r&&this.context.emit("changeActiveCalls",this.activeCalls)}addCallStatus(s){this.callStatus={...this.callStatus,[s]:{isMoving:!1,isTransferring:!1,isMerging:!1}},this.context.emit("changeCallStatus",this.callStatus)}updateCallStatus(s){const o={...{...this.callStatus[s.callId]}};s.isMoving!==void 0&&(o.isMoving=s.isMoving),s.isTransferring!==void 0&&(o.isTransferring=s.isTransferring),s.isMerging!==void 0&&(o.isMerging=s.isMerging),this.callStatus={...this.callStatus,[s.callId]:{...o}},this.context.emit("changeCallStatus",this.callStatus)}removeCallStatus(s){const r={...this.callStatus};delete r[s],this.callStatus={...r},this.context.emit("changeCallStatus",this.callStatus)}addRoom(s){this.activeRooms={...this.activeRooms,[s.roomId]:s},this.context.emit("addRoom",{room:s,roomList:this.activeRooms})}getActiveStream(){const s=If(this.initialStreamValue,this.microphoneInputLevel*2);return s.getTracks().forEach(r=>r.enabled=!this.isMuted),this.setActiveStream(s),s}async setMicrophone(s){if(!this.getInputDeviceList.find(({deviceId:o})=>o===s)||(this.setSelectedInputDevice(s),Object.keys(this.getActiveCalls).length===0))return;await this.setupStream();const r=Object.values(this.extendedCalls).filter(o=>o.roomId===this.currentActiveRoomId);r.length===1?Object.values(r).forEach(async o=>{const a=this.getActiveStream();o.connection.getSenders()[0].replaceTrack(a.getTracks()[0]),this.updateCall(o)}):await this.doConference(r)}setActiveStream(s){this.activeStream&&this.stopVUMeter("origin"),this.setupVUMeter(s,"origin"),this.activeStreamValue=s,this.context.emit("changeActiveStream",s)}async setSpeaker(s){if(!this.getOutputDeviceList.find(({deviceId:a})=>a===s))return;this.setSelectedOutputDevice(s);const r=Object.values(this.extendedCalls);if(r.length===0)return;const o=r.filter(a=>a.roomId===this.currentActiveRoomId);o.length===1?r.forEach(a=>{var t;(t=a.audioTag)==null||t.setSinkId(s),this.updateCall(a)}):await this.doConference(o)}removeRoom(s){const r={...this.activeRooms},o={...r[s]};delete r[s],this.activeRooms={...r},this.context.emit("removeRoom",{room:o,roomList:this.activeRooms})}deleteRoomIfEmpty(s){s!==void 0&&Object.values(this.extendedCalls).filter(r=>r.roomId===s).length===0&&(this.removeRoom(s),this.currentActiveRoomId===s&&(this.currentActiveRoomId=void 0))}checkInitialized(){if(!this.context.initialized)throw new Error("[OpenSIPSJS] You must call `start` method first!")}muteReconfigure(s){this.muted?s.mute({audio:!0}):s.unmute({audio:!0})}async roomReconfigure(s){var o;if(s===void 0)return;const r=Object.values(this.extendedCalls).filter(a=>a.roomId===s);if(this.currentActiveRoomId===s?r.forEach(a=>{a.audioTag&&(this.muteReconfigure(a),a.audioTag.muted=!1,this.updateCall(a))}):r.forEach(a=>{a.audioTag&&(a.audioTag.muted=!0,this.updateCall(a))}),r.length===0)this.deleteRoomIfEmpty(s);else if(r.length===1&&this.currentActiveRoomId!==s)r[0].isOnHold().local||await this.holdCall(r[0].id,!0);else if(r.length===1&&this.currentActiveRoomId===s){if(r[0].isOnHold().local&&r[0]._automaticHold&&await this.unholdCall(r[0].id),r[0].connection&&((o=r[0].connection)!=null&&o.getSenders()[0])){const a=this.getActiveStream();await r[0].connection.getSenders()[0].replaceTrack(a.getTracks()[0]),this.muteReconfigure(r[0])}}else r.length>1&&await this.doConference(r)}async doConference(s){await bf.forEach(s,async o=>{o._localHold&&await this.unholdCall(o._id)});const r=[];s.forEach(o=>{o!=null&&o.connection.getReceivers().forEach(a=>{r.push(a.track)})}),await bf.forEach(s,async o=>{var n;if(o==null)return;const a=new MediaStream,t=Sn.createMediaStreamDestination();if(o.connection.getReceivers().forEach(p=>{r.forEach(_=>{a.addTrack(p.track),p.track.id!==_.id&&Sn.createMediaStreamSource(new MediaStream([_])).connect(t)})}),s[0].roomId===this.currentActiveRoomId){const p=this.getActiveStream();Sn.createMediaStreamSource(p).connect(t)}(n=o.connection)!=null&&n.getSenders()[0]&&(await o.connection.getSenders()[0].replaceTrack(t.stream.getTracks()[0]),this.muteReconfigure(o))})}processCallerMute(s,r){const o=this.extendedCalls[s];o&&o.connection.getReceivers().length&&(o.localMuted=r,o.connection.getReceivers().forEach(a=>{a.track.enabled=!r}),this.updateCall(o))}muteCaller(s){this.processCallerMute(s,!0)}unmuteCaller(s){this.processCallerMute(s,!1)}terminateCall(s){const r=this.extendedCalls[s];r._status!==8&&r.terminate()}transferCall(s,r){if(r.toString().length===0)return new Error("Target must be passed");const o=this.extendedCalls[s];if(!o._is_confirmed&&!o._is_canceled){const a=`sip:${r}@${this.context.sipDomain}`;o.terminate({status_code:302,reason_phrase:"Moved Temporarily",extraHeaders:[`Contact: ${a}`]});return}this.updateCallStatus({callId:s,isTransferring:!0}),o.refer(`sip:${r}@${this.context.sipDomain}`),this.updateCall(o)}mergeCall(s){const r=Object.values(this.extendedCalls).filter(t=>t.roomId===s);if(r.length!==2)return;const o=r[0],a=r[1];!o||!a||(this.updateCallStatus({callId:o._id,isMerging:!0}),this.updateCallStatus({callId:a._id,isMerging:!0}),o.refer(a.remote_identity.uri.toString(),{replaces:a}),this.updateCall(o))}setDND(s){this.isDNDEnabled=s,this.context.emit("changeIsDND",s)}startCallTimer(s){this.removeTimeInterval(s);const r={callId:s,hours:0,minutes:0,seconds:0,formatted:""};this.setCallTime(r);const o=setInterval(()=>{const a={...this.callTime[s]},t=QT(a);this.setCallTime({callId:s,...t})},1e3);this.setTimeInterval(s,o)}async setActiveRoom(s){const r=this.currentActiveRoomId;s!==r&&(this.currentActiveRoomId=s,await this.roomReconfigure(r),await this.roomReconfigure(s))}getNewRoomId(){const s=Object.keys(this.activeRooms);return s.length===0?1:parseInt(s.sort()[s.length-1])+1}async setupCall(s){var d,g;const r=s.session;if(this.getActiveCalls[r.id]!==void 0)return;const a=this.getNewRoomId(),t={started:new Date,incomingInProgress:!1,roomId:a};r.direction==="incoming"?(this.context.logger.log("New incoming call from",(g=(d=r._remote_identity)==null?void 0:d._uri)==null?void 0:g._user),t.incomingInProgress=!0,this.context.subscribe(Jt.CALL_CONFIRMED,T=>{r.id===T.id&&(this.updateRoom({incomingInProgress:!1,roomId:a}),this.startCallTimer(r.id))}),this.context.subscribe(Jt.CALL_FAILED,T=>{r.id===T.id&&(this.updateRoom({incomingInProgress:!1,roomId:a}),this.deleteRoomIfEmpty(a))})):r.direction==="outgoing"&&(r.once("confirmed",()=>{this.startCallTimer(r.id)}),this.startCallTimer(r.id));const n=r,p=this.hasAutoAnswerHeaders(s),_=n.direction==="incoming"&&!this.hasActiveCalls&&(p||this.autoAnswer);n.roomId=a,n.localMuted=!1,n.autoAnswer=_,_?this.addCall(n,!1):this.addCall(n),this.addCallStatus(r.id),this.addRoom(t),_&&this.answerCall(n._id)}removeCall(s){const r={...this.activeCalls};delete r[s],this.activeCalls={...r};const o={...this.extendedCalls};delete o[s],this.extendedCalls={...o},this.context.emit("changeActiveCalls",this.activeCalls)}activeCallListRemove(s){var a;const r=this.extendedCalls[s._id];this.stopVUMeter("origin"),(a=r.connection)==null||a.getSenders().forEach(t=>{t.track.stop()});const o=r.roomId;this.removeCall(s._id),this.roomReconfigure(o)}async newRTCSessionCallback(s){const r=s.session;if(this.isDND){r.terminate({status_code:486,reason_phrase:"Do Not Disturb"});return}if(this.context.triggerListener({listenerType:Jt.NEW_CALL,session:r,event:s}),r.on("ended",o=>{var t,n,p;this.stopVUMeter(r.id),this.context.logger.log("Session ended for",(n=(t=r._remote_identity)==null?void 0:t._uri)==null?void 0:n._user),this.context.triggerListener({listenerType:Jt.CALL_ENDED,session:r,event:o});const a=this.getActiveCalls[r.id];a&&this.activeCallListRemove(a),this.stopCallTimer(r.id),this.removeCallStatus(r.id),this.removeCallMetrics(r.id),Object.keys(this.extendedCalls).length||(this.setIsMuted(!1),(p=this.initialStreamValue)==null||p.getTracks().forEach(_=>_.stop()),this.initialStreamValue=null)}),r.on("progress",o=>{var a,t;this.context.logger.log("Session in progress for",(t=(a=r._remote_identity)==null?void 0:a._uri)==null?void 0:t._user),this.context.triggerListener({listenerType:Jt.CALL_PROGRESS,session:r,event:o})}),r.on("failed",o=>{var t,n,p;this.stopVUMeter(r.id),this.context.logger.log("Session failed for",(n=(t=r._remote_identity)==null?void 0:t._uri)==null?void 0:n._user),this.context.triggerListener({listenerType:Jt.CALL_FAILED,session:r,event:o}),r.id===this.callAddingInProgress&&(this.callAddingInProgress=void 0);const a=this.getActiveCalls[r.id];a&&this.activeCallListRemove(a),this.stopCallTimer(r.id),this.removeCallStatus(r.id),this.removeCallMetrics(r.id),Object.keys(this.extendedCalls).length||(this.setIsMuted(!1),(p=this.initialStreamValue)==null||p.getTracks().forEach(_=>_.stop()),this.initialStreamValue=null)}),r.on("confirmed",o=>{var a,t;this.context.logger.log("Session confirmed for",(t=(a=r._remote_identity)==null?void 0:a._uri)==null?void 0:t._user),this.context.triggerListener({listenerType:Jt.CALL_CONFIRMED,session:r,event:o}),this.updateCall(r),r.id===this.callAddingInProgress&&(this.callAddingInProgress=void 0)}),await this.setupCall(s),r.direction==="outgoing"){const o=this.getActiveCalls[r.id].roomId;this.setActiveRoom(o)}}setMuteWhenJoin(s){this.muteWhenJoinEnabled=s,this.context.emit("changeMuteWhenJoin",s)}setMicrophoneSensitivity(s){if(s<0||s>1)throw new Error("Value should be in range from 0 to 1!");this.microphoneInputLevelValue=s,this.roomReconfigure(this.currentActiveRoomId)}setSpeakerVolume(s){this.speakerVolumeValue=s,Object.values(this.extendedCalls).forEach(r=>{r.audioTag&&(r.audioTag.volume=s,this.updateCall(r))})}setAutoAnswer(s){this.isAutoAnswer=s}setSelectedInputDevice(s){localStorage.setItem(ao.SELECTED_INPUT_DEVICE,s),this.selectedMediaDevices.input=s,this.context.emit("changeActiveInputMediaDevice",s)}setSelectedOutputDevice(s){localStorage.setItem(ao.SELECTED_OUTPUT_DEVICE,s),this.selectedMediaDevices.output=s,this.context.emit("changeActiveOutputMediaDevice",s)}setCallMetrics(s){const r={...s};delete r.callId,this.callMetrics={...this.callMetrics,[s.callId]:r},this.context.emit("changeCallMetrics",this.callMetrics)}removeCallMetrics(s){const r={...this.callMetrics};delete r[s],this.callMetrics={...r},this.context.emit("changeCallMetrics",this.callMetrics)}getCallQuality(s){const r=new Bv(this.metricConfig),o=r.createProbe(s.connection,{cid:s._id}),a=[];let t;o.onreport=n=>{Object.entries(n.audio).forEach(([d,g])=>{g.direction==="inbound"&&!a.includes(d)&&(a.push(d),t=d)});const p=n.audio[t];if(!p)return;const _=Gv(p,Wv);_.callId=s._id,this.setCallMetrics(_)},this.context.subscribe(Jt.CALL_ENDED,n=>{n._id===s._id&&r.stopAllProbes()}),r.startAllProbes()}setupVUMeter(s,r){this.VUMeter.start(s,r)}stopVUMeter(s){this.VUMeter.stop(s)}async setupStream(){const s=await navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);this.initialStreamValue&&(this.initialStreamValue.getTracks().forEach(r=>r.stop()),this.initialStreamValue=null),this.initialStreamValue=s}async triggerAddStream(s,r){this.setIsMuted(this.muteWhenJoin||this.isMuted),this.initialStreamValue||await this.setupStream();const o=If(this.initialStreamValue,this.microphoneInputLevel*2),a=this.isMuted||this.muteWhenJoin;o.getTracks().forEach(n=>n.enabled=!a),this.setActiveStream(o),await r.connection.getSenders()[0].replaceTrack(o.getTracks()[0]);const t=new MediaStream([s.track]);kT(t,r,this.selectedOutputDevice,this.speakerVolume),this.setupVUMeter(t,r._id),this.getCallQuality(r),this.updateCall(r)}initCall(s,r){if(this.checkInitialized(),s.length===0)return console.error("Target must be a valid string");this.context.logger.log(`Calling sip:${s}@${this.context.sipDomain}...`);const o=this.context.call(`sip:${s}@${this.context.sipDomain}`,this.sipOptions);this.callAddingInProgress=o.id,r&&this.currentActiveRoomId!==void 0&&this.processRoomChange({callId:o.id,roomId:this.currentActiveRoomId}),o.connection.addEventListener("track",a=>{this.triggerAddStream(a,o)})}async processRoomChange({callId:s,roomId:r}){const o=this.extendedCalls[s].roomId;this.extendedCalls[s].roomId=r;const a=this.extendedCalls[s];return this.updateCall(a),await this.setActiveRoom(r),Promise.all([this.roomReconfigure(o),this.roomReconfigure(r)]).then(()=>{this.deleteRoomIfEmpty(o),this.deleteRoomIfEmpty(r)})}}class Jv{constructor(s){this.context=s}get sipOptions(){return{...this.context.options.sipOptions}}initCall(s,r){if(s.length===0)return console.error("Target must be a valid string");this.context.logger.log(`Calling sip:${s}@${this.context.sipDomain}...`),this.context.joinVideoCall(`sip:${s}@${this.context.sipDomain}`,r,this.sipOptions),console.log("video call")}}class Xv{constructor(s){this.activeMessages={},this.extendedMessages={},this.msrpHistory={},this.context=s,this.context.on(this.context.newMSRPSessionEventName,this.newMSRPSessionCallback.bind(this.context))}get isMSRPInitializing(){return this.isMSRPInitializingValue}get getActiveMessages(){return this.activeMessages}msrpAnswer(s){const r=this.extendedMessages[s];this.updateMSRPSession(r)}updateMSRPSession(s){this.activeMessages[s._id]=Rf(s),this.context.emit("changeActiveMessages",this.activeMessages)}addMMSRPSession(s){this.activeMessages={...this.activeMessages,[s._id]:Rf(s)},this.extendedMessages[s._id]=s,this.context.emit("changeActiveMessages",this.activeMessages)}addMSRPMessage(s,r){const o=this.msrpHistory[r.id]||[];o.push(s),this.msrpHistory={...this.msrpHistory,[r.id]:[...o]},this.context.emit("newMSRPMessage",{message:s,session:r})}messageTerminate(s){const r=this.extendedMessages[s];r._status!==8&&r.terminate()}addMessageSession(s){if(!s._id||this.getActiveMessages[s._id]!==void 0)return;const o=s;this.addMMSRPSession(o)}triggerMSRPListener({listenerType:s,session:r,event:o}){const a=this.context.listenersList[s];!a||!a.length||a.forEach(t=>{t(r,o)})}removeMMSRPSession(s){const r={...this.activeMessages};delete r[s],this.activeMessages={...r};const o={...this.extendedMessages};delete o[s],this.extendedMessages={...o},this.context.emit("changeActiveMessages",this.activeMessages)}activeMessageListRemove(s){this.removeMMSRPSession(s._id)}newMSRPSessionCallback(s){const r=s.session;r.on("ended",o=>{this.triggerMSRPListener({listenerType:Jt.CALL_ENDED,session:r,event:o});const a=this.getActiveMessages[r.id];this.activeMessageListRemove(a)}),r.on("failed",o=>{this.triggerMSRPListener({listenerType:Jt.CALL_FAILED,session:r,event:o});const a=this.getActiveMessages[r.id];this.activeMessageListRemove(a)}),r.on("confirmed",o=>{this.triggerMSRPListener({listenerType:Jt.CALL_CONFIRMED,session:r,event:o}),this.updateMSRPSession(r)}),r.on("newMessage",o=>{this.addMSRPMessage(o,r)}),this.addMessageSession(r)}setIsMSRPInitializing(s){this.isMSRPInitializingValue=s,this.context.emit("isMSRPInitializingChanged",s)}initMSRP(s,r,o){if(s.length===0)return console.error("Target must be a valid string");const a=this.context.startMSRP(s,o);a.on("active",()=>{this.addMessageSession(a),a.sendMSRP(r),this.setIsMSRPInitializing(!1)}),this.setIsMSRPInitializing(!0)}sendMSRP(s,r){const o=this.extendedMessages[s];if(!o)throw new Error(`MSRP session with id ${s} doesn't exist!`);o.sendMSRP(r)}}const tu={AUDIO:"audio",VIDEO:"video",MSRP:"msrp"};class Qv extends OT{constructor(s,r){if(!s.modules.length)throw new Error("options.modules should include at least 1 module");const o={...s.configuration,sockets:s.socketInterfaces.map(a=>new XT.WebSocketInterface(a))};super(o),this.initialized=!1,this.logger=console,this.newRTCSessionEventName="newRTCSession",this.registeredEventName="registered",this.unregisteredEventName="unregistered",this.disconnectedEventName="disconnected",this.connectedEventName="connected",this.newMSRPSessionEventName="newMSRPSession",this.isReconnecting=!1,this.audio=null,this.msrp=null,this.video=null,this.listenersList={},this.modules=[],s.pnExtraHeaders&&Object.keys(s.pnExtraHeaders).length&&this.registrator().setExtraContactParams(s.pnExtraHeaders),this.options=s,this.modules=s.modules,r&<(r)&&(this.logger=r)}on(s,r){return super.on(s,r)}off(s,r){return super.off(s,r)}emit(s,r){return super.emit(s,r)}get sipDomain(){return this.options.sipDomain}begin(){if(this.isConnected()){console.error("Connection is already established");return}return this.modules.includes(tu.AUDIO)&&(this.audio=new zv(this)),this.modules.includes(tu.MSRP)&&(this.msrp=new Xv(this)),this.modules.includes(tu.VIDEO)&&(this.video=new Jv(this)),this.on(this.registeredEventName,()=>{this.logger.log("Successfully registered to",this.options.socketInterfaces[0]),this.setInitialized(!0)}),this.on(this.unregisteredEventName,()=>{this.logger.log("Unregistered from",this.options.socketInterfaces[0]),this.setInitialized(!1)}),this.on(this.connectedEventName,()=>{this.logger.log("Connected to",this.options.socketInterfaces[0]),this.isReconnecting=!1}),this.on(this.disconnectedEventName,()=>{this.isReconnecting||(this.logger.log("Disconnected from",this.options.socketInterfaces[0]),this.logger.log("Reconnecting to",this.options.socketInterfaces[0]),this.isReconnecting=!0,this.stop(),this.setInitialized(!1),setTimeout(this.start.bind(this),5e3))}),this.logger.log("Connecting to",this.options.socketInterfaces[0]),this.start(),this}subscribe(s,r){const a=!this.listenersList[s]||!this.listenersList[s].length?[r]:[...this.listenersList[s],r];this.listenersList={...this.listenersList,[s]:a}}removeIListener(s){const r={...this.listenersList};delete r[s],this.listenersList={...r}}triggerListener({listenerType:s,session:r,event:o}){const a=this.listenersList[s];!a||!a.length||a.forEach(t=>{t(r,o)})}setInitialized(s){this.initialized=s,this.emit("ready",s)}}module.exports=Qv;
|
156
|
+
`),this._newMSRPSession("local",this._request),this._id=this._request.call_id+this._from_tag,console.log("dialog be",this._dialog),new u_(this._ua,this._request,{onRequestTimeout:()=>{this.onRequestTimeout(),console.log("to")},onTransportError:t=>{this.onTransportError(),console.log(t)},onAuthenticated:t=>{this._request=t},onReceiveResponse:t=>{this._receiveInviteResponse(t),console.log("dialog af",this._dialog),t.status_code===200&&(t.parseSDP(!0),this._status=Re.STATUS_CONFIRMED,this.target_addr=t.sdp.media[0].invalid[1].value.replaceAll("path:","").split(" ").reverse(),this.status="active",this.emit("active"),this.emit("confirmed"))}}).send(),this._status=Re.STATUS_INVITE_SENT}terminate(s={}){console.log("terminate",this);const r=s.cause||j.causes.BYE,o=Me.cloneArray(s.extraHeaders),a=s.body;let t,n=s.status_code,p=s.reason_phrase;if(this._status===Re.STATUS_TERMINATED)throw new Hs.InvalidStateError(this._status);switch(this.status="terminated",this._status){case Re.STATUS_NULL:case Re.STATUS_INVITE_SENT:case Re.STATUS_1XX_RECEIVED:if(n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);n&&(p=p||j.REASON_PHRASE[n]||"",t=`SIP ;cause=${n} ;text="${p}"`),this._status===Re.STATUS_NULL||this._status===Re.STATUS_INVITE_SENT?(this._is_canceled=!0,this._cancel_reason=t):this._status===Re.STATUS_1XX_RECEIVED&&this._request.cancel(t),this._status=Re.STATUS_CANCELED,console.log("failed 1"),this._failed("local",null,j.causes.CANCELED);break;case Re.STATUS_WAITING_FOR_ANSWER:case Re.STATUS_ANSWERED:if(n=n||480,console.log("REPLY 480"),n<300||n>=700)throw new TypeError(`Invalid status_code: ${n}`);this._request.reply(n,p,o,a),console.log("failed 2"),this._failed("local",null,j.causes.REJECTED);break;case Re.STATUS_WAITING_FOR_ACK:case Re.STATUS_CONFIRMED:if(p=s.reason_phrase||j.REASON_PHRASE[n]||"",n&&(n<200||n>=700))throw new TypeError(`Invalid status_code: ${n}`);if(n&&o.push(`Reason: SIP ;cause=${n}; text="${p}"`),this._status===Re.STATUS_WAITING_FOR_ACK&&this._direction==="incoming"&&this._request.server_transaction.state!==Bt.C.STATUS_TERMINATED){const _=this._dialog;this.receiveRequest=({method:d})=>{d===j.ACK&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())},this._request.server_transaction.on("stateChanged",()=>{this._request.server_transaction.state===Bt.C.STATUS_TERMINATED&&(this.sendRequest(j.BYE,{extraHeaders:o,body:a}),_.terminate())}),this._ended("local",null,r),this._dialog=_,this._ua.newDialog(_)}else console.log("here it is"),this.sendRequest(j.BYE,{extraHeaders:o,body:a}),this._ended("local",null,r)}}sendRequest(s,r){return this._dialog.sendRequest(s,r)}authenticate(s){this.status="auth";let r=new lr("");r.method="AUTH",r.addHeader("To-Path",`msrp://${this._ua._configuration.realm}:2856;ws`),r.addHeader("From-Path",`msrp://${this.credentials.username}.${this.credentials.realm}:2856/${this.auth_id};ws`),s&&r.addHeader("Authorization",s.toString());let o=r.toString();console.log(o);let a=[];for(var t=0;t<o.length;t++)a.push(o.charCodeAt(t).toString(16));console.log(a),this._connection.send(r.toString())}onmessage(s){console.log("onmessage",s);const r=new lr(s.data);if(this.status==="auth"&&r.code===401){const o=this.parseAuth(r.getHeader("WWW-Authenticate")),a=new Hm(this.credentials);a.authenticate({method:"AUTH",ruri:`msrp://${this._ua._configuration.realm}:2856;ws`,body:null},o,Me.createRandomToken(12)),this.authenticate(a)}this.status==="auth"&&r.code===200&&this._direction==="outgoing"?(this.my_addr.push(r.getHeader("To-Path")),this.my_addr.push(r.getHeader("Use-Path")),this.status="active",this.inviteParty(r)):this.status==="auth"&&r.code===200&&this._direction==="incoming"?(this.my_addr.push(r.getHeader("To-Path")),this.my_addr.push(r.getHeader("Use-Path")),this.status="active",this.acceptParty(r),this.emit("confirmed")):r.method==="SEND"&&(this._sendOk(r),this._sendReport(r),r.direction="incoming",this.emit("newMessage",r),this._msgHistory.push(r),this.emit("msgHistoryUpdate",this._msgHistory),console.log("======================================================================")),r.code===480&&this._close()}onclose(){console.log("close")}onopen(){const s=new RTCPeerConnection({iceServers:[]});s.createDataChannel(""),s.createOffer().then(s.setLocalDescription.bind(s)),s.onicecandidate=r=>{if(!r||!r.candidate||!r.candidate.candidate)return;const o=/([0-9]{1,3}(\.[0-9]{1,3}){3})/,a=r.candidate.candidate.match(o);this.my_ip=a&&a[1],s.onicecandidate=()=>{},this.authenticate(null)}}onerror(s){console.log(s)}_receiveInviteResponse(s){if(console.log("resp0000000000000",s),this._dialog&&s.status_code>=200&&s.status_code<=299)if(console.log("200000000000000"),this._dialog.id.call_id===s.call_id&&this._dialog.id.local_tag===s.from_tag&&this._dialog.id.remote_tag===s.to_tag){this.sendRequest(j.ACK);return}else{const r=new Jl(this,s,"UAC");if(r.error!==void 0){console.log(r.error);return}this.sendRequest(j.ACK),this.sendRequest(j.BYE);return}if(this._is_canceled){s.status_code>=100&&s.status_code<200?this._request.cancel(this._cancel_reason):s.status_code>=200&&s.status_code<299&&this._acceptAndTerminate(s);return}if(!(this._status!==Re.STATUS_INVITE_SENT&&this._status!==Re.STATUS_1XX_RECEIVED))switch(console.log("start Switch"),!0){case/^100$/.test(s.status_code):this._status=Re.STATUS_1XX_RECEIVED;break;case/^1[0-9]{2}$/.test(s.status_code):{if(!s.to_tag){console.log("1xx response received without to tag");break}if(s.hasHeader("contact")&&!this._createDialog(s,"UAC",!0))break;if(this._status=Re.STATUS_1XX_RECEIVED,!s.body){this._progress("remote",s);break}const r={originator:"remote",type:"answer",sdp:s.body};console.log('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>this._progress("remote",s)).catch(a=>{console.log('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)});break}case/^2[0-9]{2}$/.test(s.status_code):{if(console.log("maybe here???"),this._status=Re.STATUS_CONFIRMED,!s.body){this._acceptAndTerminate(s,400,j.causes.MISSING_SDP),console.log("failed 3"),this._failed("remote",s,j.causes.BAD_MEDIA_DESCRIPTION);break}if(!this._createDialog(s,"UAC"))break;const r={originator:"remote",type:"answer",sdp:s.body};console.log('emit "sdp"'),this.emit("sdp",r),new RTCSessionDescription({type:"answer",sdp:r.sdp}),this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>{if(this._connection.signalingState==="stable")return this._connection.createOffer(this._rtcOfferConstraints).then(o=>this._connection.setLocalDescription(o)).catch(o=>{this._acceptAndTerminate(s,500,o.toString()),console.log("failed 4"),this._failed("local",s,j.causes.WEBRTC_ERROR)})}).then(()=>{this._handleSessionTimersInIncomingResponse(s),this._accepted("remote",s),this.sendRequest(j.ACK),this._confirmed("local",null)});break}default:{const r=Me.sipErrorCause(s.status_code);console.log("failed 5"),this._failed("remote",s,r)}}}sendMSRP(s){const r=new lr("");r.method="SEND",r.addHeader("To-Path",`${this.my_addr[1]} ${this.target_addr[1]} ${this.target_addr[0]}`),r.addHeader("From-Path",`${this.my_addr[0]}`),r.addHeader("Message-ID",Me.createRandomToken(10)),r.addHeader("Byte-Range","1-25/25"),r.addHeader("Content-Type","text/plain"),r.addHeader("Success-Report","yes"),r.addHeader("Failure-Report","yes"),r.body=s;let o=r.toString();console.log(o);let a=[];for(var t=0;t<o.length;t++)a.push(o.charCodeAt(t).toString(16));console.log(a),this._connection.send(r.toString()),r.direction="outgoing",this.emit("newMessage",r),this._msgHistory.push(r),this.emit("msgHistoryUpdate",this._msgHistory)}_sendOk(s){let r=s.ident,o=s.getHeader("Message-ID"),a=new lr("");a.method="200 OK",a.addHeader("To-Path",`${this.my_addr[1]}`),a.addHeader("From-Path",`${this.my_addr[0]}`),a.addHeader("Message-ID",o),a.ident=r;let t=a.toString();console.log(t);let n=[];for(var p=0;p<t.length;p++)n.push(t.charCodeAt(p).toString(16));console.log(n),this._connection.send(a.toString())}_sendReport(s){let r=s.ident,o=s.getHeader("Message-ID"),a=new lr("");a.method="REPORT",a.addHeader("To-Path",`${s.getHeader("From-Path")}`),a.addHeader("From-Path",`${this.my_addr[0]}`),a.addHeader("Message-ID",o),a.addHeader("Byte-Range","1-25/25"),a.addHeader("Status","000 200 OK"),a.ident=r;let t=a.toString();console.log(t);let n=[];for(var p=0;p<t.length;p++)n.push(t.charCodeAt(p).toString(16));console.log(n),this._connection.send(a.toString())}parseAuth(s){const r={},o=s.replace("Digest","").split(",");for(const a of o){const t=a.trim().split("=");r[t[0]]=t[1].match('^"(.+)"$')[1]}return r}init_incoming(s,r){let o;const a=s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0;if(s.body&&a!=="application/sdp"){s.reply(415);return}if(this._status=Re.STATUS_INVITE_RECEIVED,this._from_tag=s.from_tag,this._id=s.call_id+this._from_tag,this._request=s,this._contact=this._ua.contact.toString(),s.hasHeader("expires")&&(o=s.getHeader("expires")*1e3),s.to_tag=Me.newTag(),!this._createDialog(s,"UAS",!0)){s.reply(500,"Missing Contact header field");return}s.body?this._late_sdp=!1:this._late_sdp=!0,this._status=Re.STATUS_WAITING_FOR_ANSWER,this._timers.userNoAnswerTimer=setTimeout(()=>{s.reply(408),console.log("failed 6"),this._failed("local",null,j.causes.NO_ANSWER)},this._ua.configuration.no_answer_timeout),o&&(this._timers.expiresTimer=setTimeout(()=>{this._status===Re.STATUS_WAITING_FOR_ANSWER&&(s.reply(487),console.log("failed 7"),this._failed("system",null,j.causes.EXPIRES))},o)),this._direction="incoming",this._local_identity=s.to,this._remote_identity=s.from,r&&r(this),s.parseSDP(!0),this.target_addr=s.sdp.media[0].invalid[1].value.replaceAll("path:","").split(" ").reverse(),this._newMSRPSession("remote",s),this._status!==Re.STATUS_TERMINATED&&(s.reply(180,null,[`Contact: ${this._ua._contact}`]),this._progress("local",null))}_failed(s,r,o){this.emit("_failed",{originator:s,message:r||null,cause:o}),this._close(),this.emit("failed",{originator:s,message:r||null,cause:o})}_close(){if(console.log("CLOSE SESSION"),this._status!==Re.STATUS_TERMINATED){if(this._status=Re.STATUS_TERMINATED,this._connection)try{this._connection.close()}catch(s){console.log("close() | error closing the RTCPeerConnection: %o",s)}for(const s in this._timers)Object.prototype.hasOwnProperty.call(this._timers,s)&&clearTimeout(this._timers[s]);clearTimeout(this._sessionTimers.timer),this._dialog&&(this._dialog.terminate(),delete this._dialog);for(const s in this._earlyDialogs)Object.prototype.hasOwnProperty.call(this._earlyDialogs,s)&&(this._earlyDialogs[s].terminate(),delete this._earlyDialogs[s]);for(const s in this._referSubscribers)Object.prototype.hasOwnProperty.call(this._referSubscribers,s)&&delete this._referSubscribers[s];this._ua.destroyMSRPSession(this)}}_createDialog(s,r,o){const a=r==="UAS"?s.to_tag:s.from_tag,t=r==="UAS"?s.from_tag:s.to_tag,n=s.call_id+a+t;let p=this._earlyDialogs[n];if(o)return p?!0:(p=new Jl(this,s,r,Jl.C.STATUS_EARLY),p.error?(console.log("failed 8"),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(this._earlyDialogs[n]=p,!0));{if(this._from_tag=s.from_tag,this._to_tag=s.to_tag,p)return p.update(s,r),this._dialog=p,delete this._earlyDialogs[n],!0;const _=new Jl(this,s,r);return _.error?(console.log("failed 9"),this._failed("remote",s,j.causes.INTERNAL_ERROR),!1):(this._dialog=_,!0)}}_newMSRPSession(s,r){this._ua.newMSRPSession(this,{originator:s,session:this,request:r})}_progress(s,r){this.emit("progress",{originator:s,response:r||null})}isEnded(){switch(this._status){case Re.STATUS_CANCELED:case Re.STATUS_TERMINATED:return!0;default:return!1}}_accepted(s,r){console.log("session accepted"),this._start_time=new Date,console.log('emit "accepted"'),this.emit("accepted",{originator:s,response:r||null})}_confirmed(s,r){console.log("session confirmed"),this._is_confirmed=!0,console.log('emit "confirmed"'),this.emit("confirmed",{originator:s,ack:r||null})}_ended(s,r,o){console.log("session ended"),this._end_time=new Date,this._close(),console.log('emit "ended"'),this.emit("ended",{originator:s,message:r||null,cause:o})}_handleSessionTimersInIncomingResponse(s){if(!this._sessionTimers.enabled)return;let r;s.session_expires&&s.session_expires>=j.MIN_SESSION_EXPIRES?(this._sessionTimers.currentExpires=s.session_expires,r=s.session_expires_refresher||"uac"):(this._sessionTimers.currentExpires=this._sessionTimers.defaultExpires,r="uac"),this._sessionTimers.refresher=r==="uac",this._runSessionTimer()}receiveRequest(s){if(console.log("receiveRequest()"),s.method===j.CANCEL)(this._status===Re.STATUS_WAITING_FOR_ANSWER||this._status===Re.STATUS_ANSWERED)&&(this._status=Re.STATUS_CANCELED,this._request.reply(487),console.log("failed 10"),this._failed("remote",s,j.causes.CANCELED));else switch(s.method){case j.ACK:if(this._status!==Re.STATUS_WAITING_FOR_ACK)return;if(this._status=Re.STATUS_CONFIRMED,clearTimeout(this._timers.ackTimer),clearTimeout(this._timers.invite2xxTimer),this._late_sdp){if(!s.body){this.terminate({cause:j.causes.MISSING_SDP,status_code:400});break}const r={originator:"remote",type:"answer",sdp:s.body};console.log('emit "sdp"'),this.emit("sdp",r);const o=new RTCSessionDescription({type:"answer",sdp:r.sdp});this._connectionPromiseQueue=this._connectionPromiseQueue.then(()=>this._connection.setRemoteDescription(o)).then(()=>{this._is_confirmed||this._confirmed("remote",s)}).catch(a=>{this.terminate({cause:j.causes.BAD_MEDIA_DESCRIPTION,status_code:488}),console.log('emit "peerconnection:setremotedescriptionfailed" [error:%o]',a),this.emit("peerconnection:setremotedescriptionfailed",a)})}else this._is_confirmed||this._confirmed("remote",s);break;case j.BYE:this._status===Re.STATUS_CONFIRMED||this._status===Re.STATUS_WAITING_FOR_ACK?(s.reply(200),this._ended("remote",s,j.causes.BYE)):this._status===Re.STATUS_INVITE_RECEIVED||this._status===Re.STATUS_WAITING_FOR_ANSWER?(s.reply(200),this._request.reply(487,"BYE Received"),this._ended("remote",s,j.causes.BYE)):s.reply(403,"Wrong Status");break;case j.INVITE:this._status===Re.STATUS_CONFIRMED?s.hasHeader("replaces")?this._receiveReplaces(s):this._receiveReinvite(s):s.reply(403,"Wrong Status");break;case j.INFO:this._status===Re.STATUS_1XX_RECEIVED||this._status===Re.STATUS_WAITING_FOR_ANSWER||this._status===Re.STATUS_ANSWERED||this._status===Re.STATUS_WAITING_FOR_ACK||this._status===Re.STATUS_CONFIRMED?(s.hasHeader("Content-Type")?s.getHeader("Content-Type").toLowerCase():void 0)!==void 0?new pu(this).init_incoming(s):s.reply(415):s.reply(403,"Wrong Status");break;case j.UPDATE:this._status===Re.STATUS_CONFIRMED?this._receiveUpdate(s):s.reply(403,"Wrong Status");break;case j.REFER:this._status===Re.STATUS_CONFIRMED?this._receiveRefer(s):s.reply(403,"Wrong Status");break;case j.NOTIFY:this._status===Re.STATUS_CONFIRMED?this._receiveNotify(s):s.reply(403,"Wrong Status");break;default:s.reply(501)}}onTransportError(){console.log("onTransportError()"),this._status!==Re.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.CONNECTION_ERROR,cause:j.causes.CONNECTION_ERROR})}onRequestTimeout(){console.log("onRequestTimeout()"),this._status!==Re.STATUS_TERMINATED&&this.terminate({status_code:408,reason_phrase:j.causes.REQUEST_TIMEOUT,cause:j.causes.REQUEST_TIMEOUT})}onDialogError(){console.log("onDialogError()"),this._status!==Re.STATUS_TERMINATED&&this.terminate({status_code:500,reason_phrase:j.causes.DIALOG_ERROR,cause:j.causes.DIALOG_ERROR})}}const ut=console,Fs={STATUS_INIT:0,STATUS_READY:1,STATUS_USER_CLOSED:2,STATUS_NOT_READY:3,CONFIGURATION_ERROR:1,NETWORK_ERROR:2},wT=ET;class OT extends wT{constructor(s){super(s),this._msrp_sessions=[],this._transactions={nist:{},nict:{},ist:{},ict:{}},this._janus_sessions=[]}call(s,r){return super.call(s,r)}joinVideoCall(s,r,o){ut.debug("call()");const a=new Po(this);return a.connect(s,r,o),a}_loadConfig(s){try{Zi.load(this._configuration,s)}catch(a){throw a}this._configuration.display_name===0&&(this._configuration.display_name="0"),this._configuration.instance_id||(this._configuration.instance_id=fr.newUUID()),this._configuration.jssip_id=fr.createRandomToken(5);const r=this._configuration.uri.clone();r.user=null,this._configuration.hostport_params=r.toString().replace(/^sip:/i,"");try{this._transport=new Wg(this._configuration.sockets,{max_interval:this._configuration.connection_recovery_max_interval,min_interval:this._configuration.connection_recovery_min_interval}),this._transport.onconnecting=DT.bind(this),this._transport.onconnect=NT.bind(this),this._transport.ondisconnect=UT.bind(this),this._transport.ondata=PT.bind(this)}catch(a){throw ut.warn(a),new Hs.ConfigurationError("sockets",this._configuration.sockets)}if(delete this._configuration.sockets,this._configuration.authorization_user||(this._configuration.authorization_user=this._configuration.uri.user),!this._configuration.registrar_server){const a=this._configuration.uri.clone();a.user=null,a.clearParams(),a.clearHeaders(),this._configuration.registrar_server=a}this._configuration.no_answer_timeout*=1e3,this._configuration.contact_uri?this._configuration.via_host=this._configuration.contact_uri.host:this._configuration.contact_uri=new _r("sip",fr.createRandomToken(8),this._configuration.via_host,null,{transport:"ws"}),this._contact={pub_gruu:null,temp_gruu:null,uri:this._configuration.contact_uri,toString(a={}){const t=a.anonymous||null,n=a.outbound||null;let p="<";return t?p+=this.temp_gruu||"sip:anonymous@anonymous.invalid;transport=ws":p+=this.pub_gruu||this.uri.toString(),n&&(t?!this.temp_gruu:!this.pub_gruu)&&(p+=";ob"),p+=">",p}};const o=["authorization_user","password","realm","ha1","authorization_jwt","display_name","register"];for(const a in this._configuration)Object.prototype.hasOwnProperty.call(this._configuration,a)&&(o.indexOf(a)!==-1?Object.defineProperty(this._configuration,a,{writable:!0,configurable:!1}):Object.defineProperty(this._configuration,a,{writable:!1,configurable:!1}));ut.debug("configuration parameters after validation:");for(const a in this._configuration)if(Object.prototype.hasOwnProperty.call(Zi.settings,a))switch(a){case"uri":case"registrar_server":ut.debug(`- ${a}: ${this._configuration[a]}`);break;case"password":case"ha1":case"authorization_jwt":ut.debug(`- ${a}: NOT SHOWN`);break;default:ut.debug(`- ${a}: ${JSON.stringify(this._configuration[a])}`)}}newMSRPSession(s,r){s.on("msgHistoryUpdate",o=>{console.log(o)}),this._msrp_sessions[s.id]=s,this.emit("newMSRPSession",r)}newJanusSession(s,r){this._janus_sessions[s.id]=s,this.emit("newJanusSession",r)}destroyMSRPSession(s){delete this._msrp_sessions[s.id]}destroyJanusSession(s){delete this._janus_sessions[s.id]}receiveRequest(s){var t,n;const r=s.method;if(console.log("-----------"),s.ruri.user!==this._configuration.uri.user&&s.ruri.user!==this._contact.uri.user){ut.debug("Request-URI does not point to us"),s.method!==De.ACK&&s.reply_sl(404);return}if(s.ruri.scheme===De.SIPS){s.reply_sl(416);return}if(Bt.checkTransaction(this,s))return;if(r===De.INVITE?new Bt.InviteServerTransaction(this,this._transport,s):r!==De.ACK&&r!==De.CANCEL&&new Bt.NonInviteServerTransaction(this,this._transport,s),r===De.OPTIONS){if(this.listeners("newOptions").length===0){s.reply(200);return}new Gc.Options(this).init_incoming(s)}else if(r===De.MESSAGE){if(this.listeners("newMessage").length===0){s.reply(405);return}new Gc.Message(this).init_incoming(s)}else if(r===De.INVITE&&!s.to_tag&&this.listeners("newRTCSession").length===0){s.reply(405);return}let o,a;if(s.to_tag)if(o=this._findDialog(s.call_id,s.from_tag,s.to_tag),o)o.receiveRequest(s);else if(r===De.NOTIFY)if(a=this._findSession(s),a)a.receiveRequest(s);else{if(s.body){const p=JSON.parse(s.body)||{};(n=(t=p.plugindata)==null?void 0:t.data)!=null&&n.publishers&&Object.values(this._janus_sessions)[0].receivePublishers(p)}s.reply(200)}else r!==De.ACK&&s.reply(481);else switch(r){case De.INVITE:if(window.RTCPeerConnection)if(s.hasHeader("replaces")){const p=s.replaces;o=this._findDialog(p.call_id,p.from_tag,p.to_tag),o?(a=o.owner,a.isEnded()?s.reply(603):a.receiveRequest(s)):s.reply(481)}else s.body.search(/MSRP/ig)>-1?(a=new Ja(this),a.init_incoming(s)):s.body.search(/JANUS/ig)>-1||(a=new Dg(this),a.init_incoming(s));else ut.warn("INVITE received but WebRTC is not supported"),s.reply(488);break;case De.BYE:s.reply(481);break;case De.CANCEL:a=this._findSession(s),a?a.receiveRequest(s):ut.debug("received CANCEL request for a non existent session");break;case De.ACK:break;case De.NOTIFY:this.emit("sipEvent",{event:s.event,request:s}),s.reply(200);break;default:s.reply(405);break}}startMSRP(s,r){ut.debug("startMSRP()",r);const o=new Ja(this);return o.connect(s),o}startJanus(s,r){ut.debug("startJanus()",r);const o=new Ja(this);return o.connect(s),o}terminateMSRPSessions(s){ut.debug("terminateSessions()");for(const r in this._msrp_sessions)this._msrp_sessions[r].isEnded()||this._msrp_sessions[r].terminate(s)}terminateJanusSessions(s){ut.debug("terminateSessions()");for(const r in this._janus_sessions)this._janus_sessions[r].isEnded()||this._janus_sessions[r].terminate(s)}stop(){if(ut.debug("stop()"),this._dynConfiguration={},this._status===Fs.STATUS_USER_CLOSED){ut.debug("UA already closed");return}this._registrator.close();const s=Object.keys(this._sessions).length;for(const o in this._sessions)if(Object.prototype.hasOwnProperty.call(this._sessions,o)){ut.debug(`closing session ${o}`);try{this._sessions[o].terminate()}catch(a){console.error(a)}}for(const o in this._msrp_sessions)if(Object.prototype.hasOwnProperty.call(this._msrp_sessions,o)){ut.debug(`closing session ${o}`);try{this._msrp_sessions[o].terminate()}catch(a){console.error(a)}}for(const o in this._janus_sessions)if(Object.prototype.hasOwnProperty.call(this._janus_sessions,o)){ut.debug(`closing session ${o}`);try{this._janus_sessions[o].terminate()}catch(a){console.error(a)}}for(const o in this._applicants)if(Object.prototype.hasOwnProperty.call(this._applicants,o))try{this._applicants[o].close()}catch(a){console.error(a)}this._status=Fs.STATUS_USER_CLOSED,Object.keys(this._transactions.nict).length+Object.keys(this._transactions.nist).length+Object.keys(this._transactions.ict).length+Object.keys(this._transactions.ist).length===0&&s===0?this._transport.disconnect():this._closeTimer=setTimeout(()=>{this._closeTimer=null,this._transport.disconnect()},2e3)}}function DT(c){this.emit("connecting",c)}function NT(c){this._status!==Fs.STATUS_USER_CLOSED&&(this._status=Fs.STATUS_READY,this._error=null,this.emit("connected",c),this._dynConfiguration.register&&this._registrator.register())}function UT(c){const s=["nict","ict","nist","ist"];for(const r of s)for(const o in this._transactions[r])Object.prototype.hasOwnProperty.call(this._transactions[r],o)&&this._transactions[r][o].onTransportError();this.emit("disconnected",c),this._registrator.onTransportClosed(),this._status!==Fs.STATUS_USER_CLOSED&&(this._status=Fs.STATUS_NOT_READY,this._error=Fs.NETWORK_ERROR)}function PT(c){console.log("onTransportData",c);const s=c.transport;let r=c.message;if(r=Mu.parseMessage(r,this),!r){console.log("if 1 return");return}if(this._status===Fs.STATUS_USER_CLOSED&&r instanceof Gl.IncomingRequest){console.log("if 2 return");return}if(!oT(r,this,s)){console.log("if 3 return");return}if(console.log("onTransportData message",r),console.log("onTransportData instanceof",r instanceof Gl.IncomingRequest),r instanceof Gl.IncomingRequest)r.transport=s,console.log("onTransportData receiveRequest"),this.receiveRequest(r);else if(r instanceof Gl.IncomingResponse){let o;switch(r.method){case De.INVITE:o=this._transactions.ict[r.via_branch],o&&o.receiveResponse(r);break;case De.ACK:break;default:o=this._transactions.nict[r.via_branch],o&&o.receiveResponse(r);break}}}const xT=["roomId","_audioMuted","_cancel_reason","_contact","direction","_end_time","_eventsCount","_from_tag","_id","_is_canceled","_is_confirmed","_late_sdp","_localHold","_videoMuted","status","start_time","_remote_identity","audioTag","isOnHold","localMuted","autoAnswer"],MT=["_cancel_reason","_contact","direction","_end_time","_eventsCount","_from_tag","_id","_is_canceled","_is_confirmed","_late_sdp","status","start_time","_remote_identity","target_addr"];function Cf(c){const s={};return xT.forEach(r=>{c[r]!==void 0&&(s[r]=c[r])}),s.localHold=c._localHold,s}function Rf(c){const s={};return MT.forEach(r=>{c[r]!==void 0&&(s[r]=c[r])}),s}function If(c,s){const r=new AudioContext,o=r.createMediaStreamSource(c),a=r.createMediaStreamDestination(),t=r.createGain();return o.connect(t),t.connect(a),t.gain.value=s,a.stream}function kT(c,s,r,o){const a=document.createElement("audio");a.id=s._id,a.className="audioTag",a.srcObject=c,A_()||(a.setSinkId(r),a.volume=o),a.play(),s.audioTag=a}function LT(c){if(c&&typeof c.log=="function"&&typeof c.warn=="function"&&typeof c.error=="function")return!0}function A_(){return/Mobi|Android|iPhone/i.test(navigator.userAgent)}const $T=at,HT=ls(),Ot=new $T("WebSocketInterface");var FT=class{constructor(s){Ot.debug('new() [url:"%s"]',s),this._url=s,this._sip_uri=null,this._via_transport=null,this._ws=null;const r=HT.parse(s,"absoluteURI");if(r===-1)throw Ot.warn(`invalid WebSocket URI: ${s}`),new TypeError(`Invalid argument: ${s}`);if(r.scheme!=="wss"&&r.scheme!=="ws")throw Ot.warn(`invalid WebSocket URI scheme: ${r.scheme}`),new TypeError(`Invalid argument: ${s}`);this._sip_uri=`sip:${r.host}${r.port?`:${r.port}`:""};transport=ws`,this._via_transport=r.scheme.toUpperCase()}get via_transport(){return this._via_transport}set via_transport(s){this._via_transport=s.toUpperCase()}get sip_uri(){return this._sip_uri}get url(){return this._url}connect(){if(Ot.debug("connect()"),this.isConnected()){Ot.debug(`WebSocket ${this._url} is already connected`);return}else if(this.isConnecting()){Ot.debug(`WebSocket ${this._url} is connecting`);return}this._ws&&this.disconnect(),Ot.debug(`connecting to WebSocket ${this._url}`);try{this._ws=new WebSocket(this._url,"sip"),this._ws.binaryType="arraybuffer",this._ws.onopen=this._onOpen.bind(this),this._ws.onclose=this._onClose.bind(this),this._ws.onmessage=this._onMessage.bind(this),this._ws.onerror=this._onError.bind(this)}catch(s){this._onError(s)}}disconnect(){Ot.debug("disconnect()"),this._ws&&(this._ws.onopen=()=>{},this._ws.onclose=()=>{},this._ws.onmessage=()=>{},this._ws.onerror=()=>{},this._ws.close(),this._ws=null)}send(s){return Ot.debug("send()"),this.isConnected()?(this._ws.send(s),!0):(Ot.warn("unable to send message, WebSocket is not open"),!1)}isConnected(){return this._ws&&this._ws.readyState===this._ws.OPEN}isConnecting(){return this._ws&&this._ws.readyState===this._ws.CONNECTING}_onOpen(){Ot.debug(`WebSocket ${this._url} connected`),this.onconnect()}_onClose({wasClean:s,code:r,reason:o}){Ot.debug(`WebSocket ${this._url} closed`),s===!1&&Ot.debug("WebSocket abrupt disconnection"),this.ondisconnect(!s,r,o)}_onMessage({data:s}){Ot.debug("received WebSocket message"),this.ondata(s)}_onError(s){Ot.warn(`WebSocket ${this._url} error: `,s)}};const vu=xo,jT=De,VT=Es,qT=yt(),BT=y_,GT=vs(),WT=Du(),KT=ls(),YT=FT,zT=dr("JsSIP");zT("version %s",vu.version);var JT={C:jT,Exceptions:VT,Utils:qT,UA:BT,URI:GT,NameAddrHeader:WT,WebSocketInterface:YT,Grammar:KT,debug:dr,get name(){return vu.title},get version(){return vu.version}};const XT=Xe(JT);function Xa(c){return c<10?`0${c}`:`${c}`}function QT(c){let s=c.hours||0,r=c.minutes||0,o=c.seconds||0;o++,o===60&&(o=0,r++,r===60&&(r=0,s++));const a=`${Xa(s)}:${Xa(r)}:${Xa(o)}`;return{seconds:o,minutes:r,hours:s,formatted:a}}var At={};At.forEach=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)if(a in c){const t=Promise.resolve(c[a]).then(n=>s.call(r||globalThis,n,a,c));o.push(t)}await Promise.all(o)};At.forEachSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)o in c&&await s.call(r||globalThis,await c[o],o,c)};At.map=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)a in c&&(o[a]=Promise.resolve(c[a]).then(t=>s.call(r||globalThis,t,a,c)));return Promise.all(o)};At.mapSeries=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)a in c&&(o[a]=await s.call(r||globalThis,await c[a],a,c));return o};At.find=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o();let t=1;for(let n=0;n<c.length;n++){const p=_=>{_?o(c[n]):t===c.length&&o(),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.findSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(await s.call(r||globalThis,await c[o],o,c))return c[o]};At.findIndex=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o(-1);let t=1;for(let n=0;n<c.length;n++){const p=_=>{_?o(n):t===c.length&&o(-1),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.findIndexSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(await s.call(r||globalThis,await c[o],o,c))return o};At.some=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o(!1);let t=1;for(let n=0;n<c.length;n++){if(!(n in c)){t++;continue}const p=_=>{_?o(!0):t===c.length&&o(!1),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.someSeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(o in c&&await s.call(r||globalThis,await c[o],o,c))return!0;return!1};At.every=(c,s,r)=>new Promise((o,a)=>{if(c.length===0)return o(!0);let t=1;for(let n=0;n<c.length;n++){if(!(n in c)){t++;continue}const p=_=>{_?t===c.length&&o(!0):o(!1),t++};Promise.resolve(c[n]).then(_=>s.call(r||globalThis,_,n,c)).then(p).catch(a)}});At.everySeries=async(c,s,r)=>{for(let o=0;o<c.length;o++)if(o in c&&!await s.call(r||globalThis,await c[o],o,c))return!1;return!0};At.filter=(c,s,r)=>new Promise(async(o,a)=>{const t=[];for(let p=0;p<c.length;p++)p in c&&(t[p]=Promise.resolve(c[p]).then(_=>s.call(r||globalThis,_,p,c)).catch(a));const n=[];for(let p=0;p<t.length;p++)await t[p]&&n.push(await c[p]);o(n)});At.filterSeries=async(c,s,r)=>{const o=[];for(let a=0;a<c.length;a++)a in c&&await s.call(r||globalThis,await c[a],a,c)&&o.push(await c[a]);return o};At.reduce=async(c,s,r)=>{if(c.length===0&&r===void 0)throw TypeError("Reduce of empty array with no initial value");let o,a;for(r!==void 0?(a=r,o=0):(a=c[0],o=1),o;o<c.length;o++)o in c&&(a=await s(await a,await c[o],o,c));return a};var C_={};(function(c){const s=At;Object.keys(s).forEach(r=>{const o=r.charAt(0).toUpperCase()+r.slice(1);c[`async${o}`]=async function(...a){return s[r](this,...a)}})})(C_);const ZT=At,ev=C_;var bf=Object.assign(ZT,{instanceMethods:ev});const Sn=new AudioContext,Jt={NEW_CALL:"new_call",CALL_CONFIRMED:"confirmed",CALL_FAILED:"failed",CALL_PROGRESS:"progress",CALL_ENDED:"ended"};var tv={exports:{}};(function(c){var s=function(r){var o=Object.prototype,a=o.hasOwnProperty,t=Object.defineProperty||function(ee,W,G){ee[W]=G.value},n,p=typeof Symbol=="function"?Symbol:{},_=p.iterator||"@@iterator",d=p.asyncIterator||"@@asyncIterator",g=p.toStringTag||"@@toStringTag";function T(ee,W,G){return Object.defineProperty(ee,W,{value:G,enumerable:!0,configurable:!0,writable:!0}),ee[W]}try{T({},"")}catch{T=function(W,G,re){return W[G]=re}}function E(ee,W,G,re){var ge=W&&W.prototype instanceof ae?W:ae,be=Object.create(ge.prototype),xe=new P(re||[]);return t(be,"_invoke",{value:z(ee,G,xe)}),be}r.wrap=E;function y(ee,W,G){try{return{type:"normal",arg:ee.call(W,G)}}catch(re){return{type:"throw",arg:re}}}var A="suspendedStart",C="suspendedYield",I="executing",$="completed",L={};function ae(){}function N(){}function F(){}var Se={};T(Se,_,function(){return this});var ve=Object.getPrototypeOf,M=ve&&ve(ve(se([])));M&&M!==o&&a.call(M,_)&&(Se=M);var D=F.prototype=ae.prototype=Object.create(Se);N.prototype=F,t(D,"constructor",{value:F,configurable:!0}),t(F,"constructor",{value:N,configurable:!0}),N.displayName=T(F,g,"GeneratorFunction");function B(ee){["next","throw","return"].forEach(function(W){T(ee,W,function(G){return this._invoke(W,G)})})}r.isGeneratorFunction=function(ee){var W=typeof ee=="function"&&ee.constructor;return W?W===N||(W.displayName||W.name)==="GeneratorFunction":!1},r.mark=function(ee){return Object.setPrototypeOf?Object.setPrototypeOf(ee,F):(ee.__proto__=F,T(ee,g,"GeneratorFunction")),ee.prototype=Object.create(D),ee},r.awrap=function(ee){return{__await:ee}};function q(ee,W){function G(be,xe,Ce,le){var ye=y(ee[be],ee,xe);if(ye.type==="throw")le(ye.arg);else{var st=ye.arg,lt=st.value;return lt&&typeof lt=="object"&&a.call(lt,"__await")?W.resolve(lt.__await).then(function(Ee){G("next",Ee,Ce,le)},function(Ee){G("throw",Ee,Ce,le)}):W.resolve(lt).then(function(Ee){st.value=Ee,Ce(st)},function(Ee){return G("throw",Ee,Ce,le)})}}var re;function ge(be,xe){function Ce(){return new W(function(le,ye){G(be,xe,le,ye)})}return re=re?re.then(Ce,Ce):Ce()}t(this,"_invoke",{value:ge})}B(q.prototype),T(q.prototype,d,function(){return this}),r.AsyncIterator=q,r.async=function(ee,W,G,re,ge){ge===void 0&&(ge=Promise);var be=new q(E(ee,W,G,re),ge);return r.isGeneratorFunction(W)?be:be.next().then(function(xe){return xe.done?xe.value:be.next()})};function z(ee,W,G){var re=A;return function(be,xe){if(re===I)throw new Error("Generator is already running");if(re===$){if(be==="throw")throw xe;return tt()}for(G.method=be,G.arg=xe;;){var Ce=G.delegate;if(Ce){var le=H(Ce,G);if(le){if(le===L)continue;return le}}if(G.method==="next")G.sent=G._sent=G.arg;else if(G.method==="throw"){if(re===A)throw re=$,G.arg;G.dispatchException(G.arg)}else G.method==="return"&&G.abrupt("return",G.arg);re=I;var ye=y(ee,W,G);if(ye.type==="normal"){if(re=G.done?$:C,ye.arg===L)continue;return{value:ye.arg,done:G.done}}else ye.type==="throw"&&(re=$,G.method="throw",G.arg=ye.arg)}}}function H(ee,W){var G=W.method,re=ee.iterator[G];if(re===n)return W.delegate=null,G==="throw"&&ee.iterator.return&&(W.method="return",W.arg=n,H(ee,W),W.method==="throw")||G!=="return"&&(W.method="throw",W.arg=new TypeError("The iterator does not provide a '"+G+"' method")),L;var ge=y(re,ee.iterator,W.arg);if(ge.type==="throw")return W.method="throw",W.arg=ge.arg,W.delegate=null,L;var be=ge.arg;if(!be)return W.method="throw",W.arg=new TypeError("iterator result is not an object"),W.delegate=null,L;if(be.done)W[ee.resultName]=be.value,W.next=ee.nextLoc,W.method!=="return"&&(W.method="next",W.arg=n);else return be;return W.delegate=null,L}B(D),T(D,g,"Generator"),T(D,_,function(){return this}),T(D,"toString",function(){return"[object Generator]"});function X(ee){var W={tryLoc:ee[0]};1 in ee&&(W.catchLoc=ee[1]),2 in ee&&(W.finallyLoc=ee[2],W.afterLoc=ee[3]),this.tryEntries.push(W)}function U(ee){var W=ee.completion||{};W.type="normal",delete W.arg,ee.completion=W}function P(ee){this.tryEntries=[{tryLoc:"root"}],ee.forEach(X,this),this.reset(!0)}r.keys=function(ee){var W=Object(ee),G=[];for(var re in W)G.push(re);return G.reverse(),function ge(){for(;G.length;){var be=G.pop();if(be in W)return ge.value=be,ge.done=!1,ge}return ge.done=!0,ge}};function se(ee){if(ee){var W=ee[_];if(W)return W.call(ee);if(typeof ee.next=="function")return ee;if(!isNaN(ee.length)){var G=-1,re=function ge(){for(;++G<ee.length;)if(a.call(ee,G))return ge.value=ee[G],ge.done=!1,ge;return ge.value=n,ge.done=!0,ge};return re.next=re}}return{next:tt}}r.values=se;function tt(){return{value:n,done:!0}}return P.prototype={constructor:P,reset:function(ee){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(U),!ee)for(var W in this)W.charAt(0)==="t"&&a.call(this,W)&&!isNaN(+W.slice(1))&&(this[W]=n)},stop:function(){this.done=!0;var ee=this.tryEntries[0],W=ee.completion;if(W.type==="throw")throw W.arg;return this.rval},dispatchException:function(ee){if(this.done)throw ee;var W=this;function G(le,ye){return be.type="throw",be.arg=ee,W.next=le,ye&&(W.method="next",W.arg=n),!!ye}for(var re=this.tryEntries.length-1;re>=0;--re){var ge=this.tryEntries[re],be=ge.completion;if(ge.tryLoc==="root")return G("end");if(ge.tryLoc<=this.prev){var xe=a.call(ge,"catchLoc"),Ce=a.call(ge,"finallyLoc");if(xe&&Ce){if(this.prev<ge.catchLoc)return G(ge.catchLoc,!0);if(this.prev<ge.finallyLoc)return G(ge.finallyLoc)}else if(xe){if(this.prev<ge.catchLoc)return G(ge.catchLoc,!0)}else if(Ce){if(this.prev<ge.finallyLoc)return G(ge.finallyLoc)}else throw new Error("try statement without catch or finally")}}},abrupt:function(ee,W){for(var G=this.tryEntries.length-1;G>=0;--G){var re=this.tryEntries[G];if(re.tryLoc<=this.prev&&a.call(re,"finallyLoc")&&this.prev<re.finallyLoc){var ge=re;break}}ge&&(ee==="break"||ee==="continue")&&ge.tryLoc<=W&&W<=ge.finallyLoc&&(ge=null);var be=ge?ge.completion:{};return be.type=ee,be.arg=W,ge?(this.method="next",this.next=ge.finallyLoc,L):this.complete(be)},complete:function(ee,W){if(ee.type==="throw")throw ee.arg;return ee.type==="break"||ee.type==="continue"?this.next=ee.arg:ee.type==="return"?(this.rval=this.arg=ee.arg,this.method="return",this.next="end"):ee.type==="normal"&&W&&(this.next=W),L},finish:function(ee){for(var W=this.tryEntries.length-1;W>=0;--W){var G=this.tryEntries[W];if(G.finallyLoc===ee)return this.complete(G.completion,G.afterLoc),U(G),L}},catch:function(ee){for(var W=this.tryEntries.length-1;W>=0;--W){var G=this.tryEntries[W];if(G.tryLoc===ee){var re=G.completion;if(re.type==="throw"){var ge=re.arg;U(G)}return ge}}throw new Error("illegal catch attempt")},delegateYield:function(ee,W,G){return this.delegate={iterator:se(ee),resultName:W,nextLoc:G},this.method==="next"&&(this.arg=n),L}},r}(c.exports);try{regeneratorRuntime=s}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=s:Function("r","regeneratorRuntime = r")(s)}})(tv);var R_={exports:{}};(function(c){(function(s,r){c.exports?c.exports=r():s.log=r()})(P_,function(){var s=function(){},r="undefined",o=typeof window!==r&&typeof window.navigator!==r&&/Trident\/|MSIE /.test(window.navigator.userAgent),a=["trace","debug","info","warn","error"];function t(C,I){var $=C[I];if(typeof $.bind=="function")return $.bind(C);try{return Function.prototype.bind.call($,C)}catch{return function(){return Function.prototype.apply.apply($,[C,arguments])}}}function n(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function p(C){return C==="debug"&&(C="log"),typeof console===r?!1:C==="trace"&&o?n:console[C]!==void 0?t(console,C):console.log!==void 0?t(console,"log"):s}function _(C,I){for(var $=0;$<a.length;$++){var L=a[$];this[L]=$<C?s:this.methodFactory(L,C,I)}this.log=this.debug}function d(C,I,$){return function(){typeof console!==r&&(_.call(this,I,$),this[C].apply(this,arguments))}}function g(C,I,$){return p(C)||d.apply(this,arguments)}function T(C,I,$){var L=this,ae;I=I??"WARN";var N="loglevel";typeof C=="string"?N+=":"+C:typeof C=="symbol"&&(N=void 0);function F(D){var B=(a[D]||"silent").toUpperCase();if(!(typeof window===r||!N)){try{window.localStorage[N]=B;return}catch{}try{window.document.cookie=encodeURIComponent(N)+"="+B+";"}catch{}}}function Se(){var D;if(!(typeof window===r||!N)){try{D=window.localStorage[N]}catch{}if(typeof D===r)try{var B=window.document.cookie,q=B.indexOf(encodeURIComponent(N)+"=");q!==-1&&(D=/^([^;]+)/.exec(B.slice(q))[1])}catch{}return L.levels[D]===void 0&&(D=void 0),D}}function ve(){if(!(typeof window===r||!N)){try{window.localStorage.removeItem(N);return}catch{}try{window.document.cookie=encodeURIComponent(N)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}L.name=C,L.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},L.methodFactory=$||g,L.getLevel=function(){return ae},L.setLevel=function(D,B){if(typeof D=="string"&&L.levels[D.toUpperCase()]!==void 0&&(D=L.levels[D.toUpperCase()]),typeof D=="number"&&D>=0&&D<=L.levels.SILENT){if(ae=D,B!==!1&&F(D),_.call(L,D,C),typeof console===r&&D<L.levels.SILENT)return"No console available for logging"}else throw"log.setLevel() called with invalid level: "+D},L.setDefaultLevel=function(D){I=D,Se()||L.setLevel(D,!1)},L.resetLevel=function(){L.setLevel(I,!1),ve()},L.enableAll=function(D){L.setLevel(L.levels.TRACE,D)},L.disableAll=function(D){L.setLevel(L.levels.SILENT,D)};var M=Se();M==null&&(M=I),L.setLevel(M,!1)}var E=new T,y={};E.getLogger=function(I){if(typeof I!="symbol"&&typeof I!="string"||I==="")throw new TypeError("You must supply a name when creating a logger.");var $=y[I];return $||($=y[I]=new T(I,E.getLevel(),E.methodFactory)),$};var A=typeof window!==r?window.log:void 0;return E.noConflict=function(){return typeof window!==r&&window.log===E&&(window.log=A),E},E.getLoggers=function(){return y},E.default=E,E})})(R_);var Rt=R_.exports;const ms=()=>`${new Date().toISOString()} | metrics`,gs=(c,s,r)=>`${c} | ${s} | ${r}`;Rt.setDefaultLevel(Rt.levels.TRACE);const sv=c=>{Rt.info(gs(ms(),"log ",`set log level to ${c?"verbose":"info"}`)),Rt.setLevel(c?Rt.levels.TRACE:Rt.levels.INFO)},nv=c=>{const s=[...Object.keys(Rt.levels)];s.includes(c)?(Rt.info(gs(ms(),"log ",`update log level to ${c.toLowerCase()}`)),Rt.setLevel(c)):Rt.warn(gs(ms(),"log ","Incorrect log level please choose one of "),s)},Pe=(c,s,r)=>{r?Rt.debug(gs(ms(),c,s),r):Rt.debug(gs(ms(),c,s))},Qa=(c,s)=>{Rt.info(gs(ms(),c,s))},yn=(c,s)=>{Rt.info(gs(ms(),c,s))},Ao=(c,s)=>{Rt.warn(gs(ms(),c,s))},ur=(c,s)=>{Rt.error(gs(ms(),c,s))};function rv(c){return Math.floor(Math.random()*c).toString()}function wf(c,s){let r=s;return c.forEach(o=>{r=r.replace(o,"")}),r}function iv(c,s){let r="";for(let o=0;o<s;o+=1)r+=c[rv(c.length)];return r}function lv({length:c=20,useLetters:s=!0,useNumbers:r=!0,includeSymbols:o=[],excludeSymbols:a=[]}={}){let t="abcdefghijklmnopqrstuvwxyz",n="0123456789",p=[],_=[],d=[];return s&&(a.length&&(t=wf(a,t)),_=t.split("")),r&&(a.length&&(n=wf(a,n)),d=n.split("")),p=[..._,...d,...o],iv(p,c)}var ov=lv;const Yi=Xe(ov),av=()=>"WebRTCMetrics",uv=()=>"5.0.3",$e={INBOUND:"inbound",OUTBOUND:"outbound"},ps={IDLE:"idle",RUNNING:"running",MUTED:"muted"},qi={NEW:"new",CHECKING:"checking",CONNECTED:"connected",COMPLETED:"completed",DISCONNECTED:"disconnected",FAILED:"failed",CLOSED:"closed"},cv=()=>({...{delta_time_to_measure_probes_ms:0,delta_time_consumed_to_measure_ms:0,delta_KBytes_in:0,delta_KBytes_out:0,delta_kbs_in:0,delta_kbs_out:0,total_time_decoded_in:0,total_time_encoded_out:0,probes:[]}}),I_={level_in:0,codec_id_in:"",codec_in:{mime_type:null,clock_rate:null,sdp_fmtp_line:null},delta_jitter_ms_in:0,percent_packets_lost_in:0,delta_packets_in:0,delta_packets_lost_in:0,total_packets_in:0,total_packets_lost_in:0,total_KBytes_in:0,delta_KBytes_in:0,delta_kbs_in:0,mos_in:0,mos_emodel_in:0,ssrc:"",direction:$e.INBOUND},b_={level_out:0,codec_id_out:"",codec_out:{mime_type:null,clock_rate:null,sdp_fmtp_line:null},delta_jitter_ms_out:0,delta_rtt_ms_out:null,total_rtt_ms_out:0,total_rtt_measure_out:0,percent_packets_lost_out:0,delta_packets_out:0,delta_packets_lost_out:0,total_packets_out:0,total_packets_lost_out:0,total_KBytes_out:0,delta_KBytes_out:0,delta_kbs_out:0,timestamp_out:null,mos_out:0,mos_emodel_out:0,ssrc:"",direction:$e.OUTBOUND},w_={codec_id_in:"",size_in:{width:null,height:null,framerate:null},codec_in:{mime_type:null,clock_rate:null},delta_jitter_ms_in:0,percent_packets_lost_in:0,delta_packets_in:0,delta_packets_lost_in:0,total_packets_in:0,total_packets_lost_in:0,total_KBytes_in:0,delta_KBytes_in:0,delta_kbs_in:0,decoder_in:null,delta_ms_decode_frame_in:0,total_frames_decoded_in:0,total_time_decoded_in:0,delta_nack_sent_in:0,delta_pli_sent_in:0,total_nack_sent_in:0,total_pli_sent_in:0,ssrc:"",direction:$e.INBOUND},O_={codec_id_out:"",size_out:{width:null,height:null,framerate:null},codec_out:{mime_type:null,clock_rate:null},delta_jitter_ms_out:0,delta_rtt_ms_out:null,total_rtt_ms_out:0,total_rtt_measure_out:0,percent_packets_lost_out:0,delta_packets_out:0,delta_packets_lost_out:0,total_packets_out:0,total_packets_lost_out:0,total_KBytes_out:0,delta_KBytes_out:0,delta_kbs_out:0,encoder_out:null,delta_ms_encode_frame_out:0,total_time_encoded_out:0,total_frames_encoded_out:0,delta_nack_received_out:0,delta_pli_received_out:0,total_nack_received_out:0,total_pli_received_out:0,limitation_out:{reason:null,durations:null,resolutionChanges:0},timestamp_out:null,ssrc:"",direction:$e.OUTBOUND},fv=c=>{const s={pname:"",call_id:"",user_id:"",timestamp:null,count:0,audio:{},video:{},network:{infrastructure:3,local_candidate_id:"",local_candidate_type:"",local_candidate_protocol:"",local_candidate_relay_protocol:"",remote_candidate_id:"",remote_candidate_type:"",remote_candidate_protocol:""},data:{total_KBytes_in:0,total_KBytes_out:0,delta_KBytes_in:0,delta_KBytes_out:0,delta_kbs_in:0,delta_kbs_out:0,delta_kbs_bandwidth_in:0,delta_kbs_bandwidth_out:0,delta_rtt_connectivity_ms:null,total_rtt_connectivity_ms:0,total_rtt_connectivity_measure:0},experimental:{time_to_measure_ms:0}};if(c){const r={...c,audio:{},video:{},data:{...c.data},network:{...c.network},experimental:{...c.experimental}};return Object.keys(c.audio).forEach(o=>{r.audio[o]={...c.audio[o]}}),Object.keys(c.video).forEach(o=>{r.video[o]={...c.video[o]}}),r}return{...s,audio:{},video:{},data:{...s.data},network:{...s.network},experimental:{...s.experimental}}},_v={refreshEvery:2e3,startAfter:0,stopAfter:-1,verbose:!1,pname:`p-${Yi()}`,cid:`c-${Yi()}`,uid:`u-${Yi()}`,record:!1,ticket:!0},zt={CANDIDATE_PAIR:"candidate-pair",CODEC:"codec",INBOUND_RTP:"inbound-rtp",LOCAL_CANDIDATE:"local-candidate",MEDIA_SOURCE:"media-source",OUTBOUND_RTP:"outbound-rtp",REMOTE_CANDIDATE:"remote-candidate",REMOTE_INBOUND_RTP:"remote-inbound-rtp",TRACK:"track"},V={AUDIO_LEVEL:"audioLevel",AVAILABLE_OUTGOING_BITRATE:"availableOutgoingBitrate",AVAILABLE_INCOMING_BITRATE:"availableIncomingBitrate",BYTES_RECEIVED:"bytesReceived",BYTES_SENT:"bytesSent",CANDIDATE_TYPE:"candidateType",CHANNELS:"channels",CLOCK_RATE:"clockRate",CODEC_ID:"codecId",CURRENT_ROUND_TRIP_TIME:"currentRoundTripTime",ROUND_TRIP_TIME:"roundTripTime",FRACTION_LOST:"fractionLost",FRAME_HEIGHT:"frameHeight",FRAME_WIDTH:"frameWidth",QUALITY_LIMITATION_REASON:"qualityLimitationReason",QUALITY_LIMITATION_DURATIONS:"qualityLimitationDurations",QUALITY_LIMITATION_RESOLUTION_CHANGES:"qualityLimitationResolutionChanges",ID:"id",JITTER:"jitter",KIND:"kind",MEDIA_TYPE:"mediaType",MIME_TYPE:"mimeType",LOCAL_CANDIDATE_ID:"localCandidateId",NETWORK_TYPE:"networkType",RELAY_PROTOCOL:"relayProtocol",NOMINATED:"nominated",PACKETS_LOST:"packetsLost",PACKETS_RECEIVED:"packetsReceived",PACKETS_SENT:"packetsSent",PROTOCOL:"protocol",PORT:"port",REMOTE_CANDIDATE_ID:"remoteCandidateId",REMOTE_SOURCE:"remoteSource",RESPONSES_RECEIVED:"responsesReceived",SDP_FMTP_LINE:"sdpFmtpLine",SSRC:"ssrc",SELECTED:"selected",STATE:"state",TIMESTAMP:"timestamp",TOTAL_ROUND_TRIP_TIME:"totalRoundTripTime",TOTAL_ROUND_TRIP_TIME_MEASUREMENTS:"roundTripTimeMeasurements",TYPE:"type",DECODER_IMPLEMENTATION:"decoderImplementation",ENCODER_IMPLEMENTATION:"encoderImplementation",FRAMES_DECODED:"framesDecoded",FRAMES_ENCODED:"framesEncoded",FRAMES_PER_SECOND:"framesPerSecond",TOTAL_DECODE_TIME:"totalDecodeTime",TOTAL_ENCODE_TIME:"totalEncodeTime",PLI:"pliCount",NACK:"nackCount"},x={SUCCEEDED:"succeeded",AUDIO:"audio",VIDEO:"video"},Bi={ETHERNET:0,CELLULAR_5G:2,WIFI:3,CELLULAR_4G:5,CELLULAR:10},Za={ETHERNET:"ethernet",CELLULAR_4G:"cellular",WIFI:"wifi"},ne={AUDIO:"audio",VIDEO:"video",NETWORK:"network",DATA:"data"},eu="config ",hv=(c,s={},r)=>{const o={...r,...s};return s.pname||Ao(eu,`Argument [String] 'cfg.pname' for the peerConnection name or id is missing - use generated '${r.pname}'`),s.cid||Ao(eu,`Argument [String] 'cfg.cid' for the call name or id is missing - use generated '${r.cid}'`),s.uid||Ao(eu,`Argument [String] 'cfg.uid' for the user name or id is missing - use generated '${r.uid}'`),o.pc=c,o},dv=(c={})=>{const s={..._v,...c};return s.name=av(),s.version=uv(),s},fl=(c,s,r,o=!1,a)=>{let t=c.map(n=>{if(!r)return n[s];if(!a)return n[s][r];const p=n[s][a];return p?p[r]:null});return t=t.filter(n=>o?Number.isFinite(n)&&n>0:Number.isFinite(n)),t.length===0?[]:t},Vs=c=>c.reduce((s,r)=>s+r,0)/c.length,pv=()=>`probe-${Yi()}`,mv=()=>`coltr-${Yi()}`,Of=c=>new Promise(s=>setTimeout(s,c)),Eu=(c,s,r)=>{s?c.call(s,r):c(r)},Ke=(c,s,r,o)=>{const a=fl(c,s,r,!0,o);if(a.length===0)return null;const t=a.reduce((d,g)=>d+g,0)/a.length;return t===0?null:a.map(d=>Math.abs(t-d)).reduce((d,g)=>d+g,0)/a.length*100/t},Je=(c,s,r,o=!1,a)=>{const t=fl(c,s,r,o,a);return t.length===0?null:t.reduce((n,p)=>n+p,0)/t.length},Tn=(c,s,r)=>fl(c,s,r).reduce((a,t)=>a+t,0),Ye=(c,s,r,o)=>{const a=fl(c,s,r,!0,o);return a.length===0?null:Math.min(...a)},ze=(c,s,r,o)=>{const a=fl(c,s,r,!1,o);return a.length===0?null:Math.max(...a)},gt=(c,s,r,o)=>{const a=c.slice().pop();if(!a)return null;if(!r)return a[s];if(!o)return a[s][r];const t=a[s][o];return t?t[r]:null},gv=c=>c.slice().pop(),ct=(c,s,r)=>{if(!s)return null;const o={};let a=s[x.AUDIO][c];a||(a=r===$e.INBOUND?{...I_}:{...b_}),o[x.AUDIO]=a;let t=s[x.VIDEO][c];return t||(t=r===$e.INBOUND?{...w_}:{...O_}),o[x.VIDEO]=t,o},Gi="exporter ",Tv="2.0",Df=(c,s,r)=>{if(!c||c.length===0)return 0;const o=c[c.length-1];if(!o)return 0;const a=o[s][r];if(a){const t=a.total_rtt_ms_out,n=a.total_rtt_measure_out;return!n||!t?Je(c,s,"delta_rtt_ms_out",!1,r):Number(t/n)}return null},vv=(c,s)=>{if(!c||c.length===0)return 0;const r=c[c.length-1];if(!r)return 0;const o=r[s].total_rtt_connectivity_ms,a=r[s].total_rtt_connectivity_measure;return!a||!o?Je(c,s,"delta_rtt_connectivity_ms"):Number(o/a)},Ev=c=>gt(c,"network","local_candidate_type")!=="relay"?`direct/${gt(c,"network","local_candidate_protocol")}`:`turn/${gt(c,"network","local_candidate_relay_protocol")}`,Sv=c=>{const s=gt(c,"network","remote_candidate_type"),r=gt(c,"network","remote_candidate_protocol");return s!=="relay"?`direct/${r}`:`turn/${r}`};class yv{constructor(s){this._start=null,this._end=null,this._cfg=s,this._referenceReport=null,this._reports=[],this._events=[]}start(){Qa(Gi,"start() - start exporter...");const s=new Date;return this._start=s.toJSON(),s}stop(){Qa(Gi,"stop() - stop exporter...");const s=new Date;return this._end=s.toJSON(),s}saveReferenceReport(s){this._referenceReport=s}getReferenceReport(){return this._referenceReport}addReport(s){this._cfg.ticket&&(Pe(Gi,`addReport() - add report to exporter at ${s.timestamp}`),this._reports.push(s))}addCustomEvent(s){this._events.push(s)}reset(){Qa(Gi,"resetReports() - reset reports"),this._reports=[],this._referenceReport=null,this._start=null,this._end=null}get ticket(){Pe(Gi,"ticket() - generate ticket");const s=gt(this._reports,"audio","total_packets_lost_in"),r=gt(this._reports,"audio","total_packets_in"),o=gt(this._reports,"video","total_packets_lost_in"),a=gt(this._reports,"video","total_packets_in"),t={},n=gv(this._reports);return n&&(Object.keys(n[x.AUDIO]).forEach(p=>{const _=n[x.AUDIO][p];if(t[_.ssrc]={type:x.AUDIO,direction:_.direction},_.direction===$e.INBOUND){const d={avg:Je(this._reports,x.AUDIO,"delta_jitter_ms_in",!1,p),min:Ye(this._reports,x.AUDIO,"delta_jitter_ms_in",p),max:ze(this._reports,x.AUDIO,"delta_jitter_ms_in",p),volatility:Ke(this._reports,x.AUDIO,"delta_jitter_ms_in",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.AUDIO,"delta_kbs_in",!1,p),min:Ye(this._reports,x.AUDIO,"delta_kbs_in",p),max:ze(this._reports,x.AUDIO,"delta_kbs_in",p),volatility:Ke(this._reports,x.AUDIO,"delta_kbs_in",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.AUDIO,"delta_KBytes_in",!1,p),min:Ye(this._reports,x.AUDIO,"delta_KBytes_in",p),max:ze(this._reports,x.AUDIO,"delta_KBytes_in",p),volatility:Ke(this._reports,x.AUDIO,"delta_KBytes_in",p),_unit:{avg:"KB",min:"KB",max:"KB",volatility:"percent"}},E={emodel:{avg:Je(this._reports,x.AUDIO,"mos_emodel_in",!1,p),min:Ye(this._reports,x.AUDIO,"mos_emodel_in",p),max:ze(this._reports,x.AUDIO,"mos_emodel_in",p),volatility:Ke(this._reports,x.AUDIO,"mos_emodel_in",p)},effective:{avg:Je(this._reports,x.AUDIO,"mos_in",!1,p),min:Ye(this._reports,x.AUDIO,"mos_in",p),max:ze(this._reports,x.AUDIO,"mos_in",p),volatility:Ke(this._reports,x.AUDIO,"mos_in",p)},_unit:{avg:"number (1-5)",min:"number (1-5)",max:"number (1-5)",volatility:"percent"}},y=gt(this._reports,x.AUDIO,"total_packets_lost_in",p),A=gt(this._reports,x.AUDIO,"total_packets_in",p),C={lost:y,avg:Math.round((y/(y+A)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}};t[p].jitter=d,t[p].mos=E,t[p].traffic=T,t[p].bitrate=g,t[p].loss=C}else{const d={avg:Je(this._reports,x.AUDIO,"delta_jitter_ms_out",!1,p),min:Ye(this._reports,x.AUDIO,"delta_jitter_ms_out",p),max:ze(this._reports,x.AUDIO,"delta_jitter_ms_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_jitter_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.AUDIO,"delta_kbs_out",!1,p),min:Ye(this._reports,x.AUDIO,"delta_kbs_out",p),max:ze(this._reports,x.AUDIO,"delta_kbs_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_kbs_out",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.AUDIO,"delta_KBytes_out",!1,p),min:Ye(this._reports,x.AUDIO,"delta_KBytes_out",p),max:ze(this._reports,x.AUDIO,"delta_KBytes_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_KBytes_out",p),_unit:{avg:"KB",min:"KB",max:"KB",bitrate:"kbs",volatility:"percent"}},E={avg:Df(this._reports,x.AUDIO,p),min:Ye(this._reports,x.AUDIO,"delta_rtt_ms_out",p),max:ze(this._reports,x.AUDIO,"delta_rtt_ms_out",p),volatility:Ke(this._reports,x.AUDIO,"delta_rtt_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},y=gt(this._reports,x.AUDIO,"total_packets_lost_out",p),A=gt(this._reports,x.AUDIO,"total_packets_out",p),C={lost:y,avg:Math.round((y/(y+A)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}},I={emodel:{avg:Je(this._reports,x.AUDIO,"mos_emodel_out",!1,p),min:Ye(this._reports,x.AUDIO,"mos_emodel_out",p),max:ze(this._reports,x.AUDIO,"mos_emodel_out",p),volatility:Ke(this._reports,x.AUDIO,"mos_emodel_out",p)},effective:{avg:Je(this._reports,x.AUDIO,"mos_out",!1,p),min:Ye(this._reports,x.AUDIO,"mos_out",p),max:ze(this._reports,x.AUDIO,"mos_out",p),volatility:Ke(this._reports,x.AUDIO,"mos_out",p)},_unit:{avg:"number (1-5)",min:"number (1-5)",max:"number (1-5)",volatility:"percent"}};t[p].jitter=d,t[p].rtt=E,t[p].traffic=T,t[p].bitrate=g,t[p].loss=C,t[p].mos=I}}),Object.keys(n[x.VIDEO]).forEach(p=>{const _=n[x.VIDEO][p];if(t[p]={type:x.VIDEO,direction:_.direction},_.direction===$e.INBOUND){const d={avg:Je(this._reports,x.VIDEO,"delta_jitter_ms_in",!1,p),min:Ye(this._reports,x.VIDEO,"delta_jitter_ms_in",p),max:ze(this._reports,x.VIDEO,"delta_jitter_ms_in",p),volatility:Ke(this._reports,x.VIDEO,"delta_jitter_ms_in",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.VIDEO,"delta_kbs_in",!1,p),min:Ye(this._reports,x.VIDEO,"delta_kbs_in",p),max:ze(this._reports,x.VIDEO,"delta_kbs_in",p),volatility:Ke(this._reports,x.VIDEO,"delta_kbs_in",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.VIDEO,"delta_KBytes_in",!1,p),min:Ye(this._reports,x.VIDEO,"delta_KBytes_in",p),max:ze(this._reports,x.VIDEO,"delta_KBytes_in",p),volatility:Ke(this._reports,x.VIDEO,"delta_KBytes_in",p),_unit:{avg:"KB",min:"KB",max:"KB",volatility:"percent"}},E=gt(this._reports,x.VIDEO,"total_packets_lost_in",p),y=gt(this._reports,x.VIDEO,"total_packets_in",p),A={lost:E,avg:Math.round((E/(E+y)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}};t[p].jitter=d,t[p].traffic=T,t[p].bitrate=g,t[p].loss=A}else{const d={avg:Je(this._reports,x.VIDEO,"delta_jitter_ms_out",!1,p),min:Ye(this._reports,x.VIDEO,"delta_jitter_ms_out",p),max:ze(this._reports,x.VIDEO,"delta_jitter_ms_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_jitter_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},g={avg:Je(this._reports,x.VIDEO,"delta_kbs_out",!1,p),min:Ye(this._reports,x.VIDEO,"delta_kbs_out",p),max:ze(this._reports,x.VIDEO,"delta_kbs_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_kbs_out",p),_unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},T={avg:Je(this._reports,x.VIDEO,"delta_KBytes_out",!1,p),min:Ye(this._reports,x.VIDEO,"delta_KBytes_out",p),max:ze(this._reports,x.VIDEO,"delta_KBytes_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_KBytes_out",p),_unit:{avg:"KB",min:"KB",max:"KB",volatility:"percent"}},E={avg:Df(this._reports,x.VIDEO,p),min:Ye(this._reports,x.VIDEO,"delta_rtt_ms_out",p),max:ze(this._reports,x.VIDEO,"delta_rtt_ms_out",p),volatility:Ke(this._reports,x.VIDEO,"delta_rtt_ms_out",p),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},y=gt(this._reports,x.VIDEO,"total_packets_lost_out",p),A=gt(this._reports,x.VIDEO,"total_packets_out",p),C={lost:y,avg:Math.round((y/(y+A)*100||0)*100)/100,_unit:{avg:"percent",lost:"number"}};t[p].jitter=d,t[p].rtt=E,t[p].traffic=T,t[p].bitrate=g,t[p].loss=C}})),{version:Tv,configuration:{frequency:this._cfg.refreshEvery},started:this._start,ended:this._end,ua:{agent:navigator.userAgent,pname:this._cfg.pname,user_id:this._cfg.uid},call:{call_id:this._cfg.cid,events:this._events},details:{count:this._reports.length,reports:this._cfg.record?this._reports:[],reference:this._referenceReport||null},ssrc:t,data:{rtt:{avg:vv(this._reports,"data"),min:Ye(this._reports,"data","delta_rtt_connectivity_ms"),max:ze(this._reports,"data","delta_rtt_connectivity_ms"),volatility:Ke(this._reports,"data","delta_rtt_connectivity_ms"),_unit:{avg:"ms",min:"ms",max:"ms",volatility:"percent"}},packetsLost:{audio:{in:{avg:Math.round((s/(s+r)*100||0)*100)/100}},video:{in:{avg:Math.round((o/(o+a)*100||0)*100)/100}},unit:{avg:"percent"}},bitrate:{in:{avg:Je(this._reports,"data","delta_kbs_in"),min:Ye(this._reports,"data","delta_kbs_in"),max:ze(this._reports,"data","delta_kbs_in"),volatility:Ke(this._reports,"data","delta_kbs_in")},out:{avg:Je(this._reports,"data","delta_kbs_out"),min:Ye(this._reports,"data","delta_kbs_out"),max:ze(this._reports,"data","delta_kbs_out"),volatility:Ke(this._reports,"data","delta_kbs_out")},unit:{avg:"kbs",min:"kbs",max:"kbs",volatility:"percent"}},traffic:{in:{avg:Je(this._reports,"data","delta_KBytes_in"),min:Ye(this._reports,"data","delta_KBytes_in"),max:ze(this._reports,"data","delta_KBytes_in"),volatility:Ke(this._reports,"data","delta_KBytes_in")},out:{avg:Je(this._reports,"data","delta_KBytes_out"),min:Ye(this._reports,"data","delta_KBytes_out"),max:ze(this._reports,"data","delta_KBytes_out"),volatility:Ke(this._reports,"data","delta_KBytes_out")},unit:{avg:"KBytes",min:"KBytes",max:"KBytes",volatility:"percent"}},network:{localConnection:Ev(this._reports),remoteConnection:Sv(this._reports)}}}}updateConfig(s){this._cfg=s}getLastReport(){return this._reports.slice().pop()||null}getBeforeLastReport(){const s=this._reports.slice();return s.pop(),s.pop()||null}getReportsNumber(){return this._reports.length}}const $s="extractor ",Nf=(c,s,r,o)=>{let a=!1;const t=o[s].total_rtt_ms_out,n=o[s].total_rtt_measure_out,p=r?r[s].total_rtt_ms_out:0,_=r?r[s].total_rtt_measure_out:0,d={rtt:null,totalRTT:t,totalRTTMeasurements:n};if(c[V.TIMESTAMP]===o[s].timestamp_out||!Object.prototype.hasOwnProperty.call(c,V.ROUND_TRIP_TIME)||Object.prototype.hasOwnProperty.call(c,V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS)&&(a=!0,Number(c[V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS])===0||Number(c[V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS])-_===n))return d;const g=1e3*Number(c[V.ROUND_TRIP_TIME]);let T=t+g,E=n+1;return a&&(T=1e3*Number(c[V.TOTAL_ROUND_TRIP_TIME])-p,E=Number(c[V.TOTAL_ROUND_TRIP_TIME_MEASUREMENTS])-_),{rtt:g,totalRTT:T,totalRTTMeasurements:E}},Av=(c,s,r,o)=>{if(!Object.prototype.hasOwnProperty.call(c,V.CURRENT_ROUND_TRIP_TIME))return{rtt:null,totalRTT:o[s].total_rtt_connectivity_ms,totalRTTMeasurements:o[s].total_rtt_connectivity_measure};const a=1e3*Number(c[V.CURRENT_ROUND_TRIP_TIME]);let t=o[s].total_rtt_connectivity_ms+a,n=o[s].total_rtt_connectivity_measure+1;return Object.prototype.hasOwnProperty.call(c,V.TOTAL_ROUND_TRIP_TIME)&&(t=1e3*Number(c[V.TOTAL_ROUND_TRIP_TIME])-(r?r[s].total_rtt_connectivity_ms:0)),Object.prototype.hasOwnProperty.call(c,V.RESPONSES_RECEIVED)&&(n=Number(c[V.RESPONSES_RECEIVED])-(r?r[s].total_rtt_connectivity_measure:0)),{rtt:a,totalRTT:t,totalRTTMeasurements:n}},oo=(c,s,r)=>c[V.TIMESTAMP]===r[s].timestamp_out||!Object.prototype.hasOwnProperty.call(c,V.JITTER)?null:1e3*(Number(c[V.JITTER])||0),Cv=(c,s)=>{if(!Object.prototype.hasOwnProperty.call(c,V.FRAMES_DECODED)||!Object.prototype.hasOwnProperty.call(c,V.TOTAL_DECODE_TIME))return{delta_ms_decode_frame:s[x.VIDEO].delta_ms_decode_frame_in,frames_decoded:s[x.VIDEO].total_frames_decoded_in,total_decode_time:s[x.VIDEO].total_time_decoded_in};const r=c[V.FRAMES_DECODED],o=c[V.TOTAL_DECODE_TIME],a=o-s[x.VIDEO].total_time_decoded_in,t=r-s[x.VIDEO].total_frames_decoded_in;return{delta_ms_decode_frame:t>0?a*1e3/t:0,frames_decoded:r,total_decode_time:o}},Rv=(c,s)=>{if(!Object.prototype.hasOwnProperty.call(c,V.FRAMES_ENCODED)||!Object.prototype.hasOwnProperty.call(c,V.TOTAL_ENCODE_TIME))return{delta_ms_encode_frame:s[x.VIDEO].delta_ms_encode_frame_out,frames_encoded:s[x.VIDEO].total_frames_encoded_out,total_encode_time:s[x.VIDEO].total_time_encoded_out};const r=c[V.FRAMES_ENCODED],o=c[V.TOTAL_ENCODE_TIME],a=o-s[x.VIDEO].total_time_encoded_out,t=r-s[x.VIDEO].total_frames_encoded_out;return{delta_ms_encode_frame:t>0&&a?a*1e3/t:0,frames_encoded:r,total_encode_time:o}},Uf=(c,s,r,o)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PACKETS_SENT)||!Object.prototype.hasOwnProperty.call(c,V.BYTES_SENT))return{packetsSent:r[s].total_packets_out,packetsLost:r[s].total_packets_lost_out,bytesSent:r[s].total_KBytes_out};const a=Number(c[V.PACKETS_SENT])||0-(o?o[s].total_packets_out:0),t=a-r[s].total_packets_out,n=Number(c[V.BYTES_SENT])/1024-(o?o[s].total_KBytes_out:0),p=n-r[s].total_KBytes_out,_=c[V.TIMESTAMP]||Date.now(),d=o?o.timestamp:null;let g=r.timestamp;!g&&d&&(g=d);const T=g?_-g:0,E=T>0?p*.008*1024/T*1e3:0;return{packetsSent:a,deltaPacketsSent:t,KBytesSent:n,deltaKBytesSent:p,kbsSent:E}},Pf=(c,s,r,o)=>{let a=r[s].total_packets_lost_out,t=0,n=0;return Object.prototype.hasOwnProperty.call(c,V.PACKETS_LOST)&&(a=Number(c[V.PACKETS_LOST])||0-(o?o[s].total_packets_lost_out:0),t=a-r[s].total_packets_lost_out),Object.prototype.hasOwnProperty.call(c,V.FRACTION_LOST)&&(n=Number(100*c[V.FRACTION_LOST])),{packetsLost:a,deltaPacketsLost:t,fractionLost:n}},xf=(c,s,r,o)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PACKETS_RECEIVED)||!Object.prototype.hasOwnProperty.call(c,V.PACKETS_LOST)||!Object.prototype.hasOwnProperty.call(c,V.BYTES_RECEIVED))return{percent_packets_lost:r[s].percent_packets_lost_in,packetsReceived:r[s].total_packets_in,packetsLost:r[s].total_packets_lost_in,bytesReceived:r[s].total_KBytes_in};const a=Number(c[V.PACKETS_RECEIVED])||0-(o?o[s].total_packets_in:0),t=Number(c[V.PACKETS_LOST])||0-(o?o[s].total_packets_lost_in:0),n=t-r[s].total_packets_lost_in,p=a-r[s].total_packets_in,_=a!==r[s].total_packets_in?n*100/(n+p):0,d=Number(c[V.BYTES_RECEIVED])/1024-(o?o[s].total_KBytes_in:0),g=d-r[s].total_KBytes_in,T=c[V.TIMESTAMP]||Date.now(),E=o?o.timestamp:null;let y=r.timestamp;!y&&E&&(y=E);const A=y?T-y:0,C=A>0?g*.008*1024/A*1e3:0;return{percentPacketsLost:_,packetsReceived:a,deltaPacketsReceived:p,packetsLost:t,deltaPacketsLost:n,KBytesReceived:d,deltaKBytesReceived:g,kbsReceived:C}},Iv=c=>c[V.CANDIDATE_TYPE]!=="relay"?"":c[V.RELAY_PROTOCOL]||"",bv=c=>{if(!Object.prototype.hasOwnProperty.call(c,V.NETWORK_TYPE))return Bi.WIFI;switch(c[V.NETWORK_TYPE]){case Za.ETHERNET:return Bi.ETHERNET;case Za.CELLULAR_4G:return Bi.CELLULAR_4G;case Za.WIFI:return Bi.WIFI;default:return Bi.CELLULAR}},Mf=c=>!Object.prototype.hasOwnProperty.call(c,V.FRAME_HEIGHT)||!Object.prototype.hasOwnProperty.call(c,V.FRAME_WIDTH)?{width:null,height:null,framerate:null}:{width:c[V.FRAME_WIDTH]||null,height:c[V.FRAME_HEIGHT]||null,framerate:c[V.FRAMES_PER_SECOND]},wv=c=>{const s=Object.prototype.hasOwnProperty.call(c,V.QUALITY_LIMITATION_REASON)?c[V.QUALITY_LIMITATION_REASON]:null,r=Object.prototype.hasOwnProperty.call(c,V.QUALITY_LIMITATION_RESOLUTION_CHANGES)?c[V.QUALITY_LIMITATION_RESOLUTION_CHANGES]:null,o=Object.prototype.hasOwnProperty.call(c,V.QUALITY_LIMITATION_DURATIONS)?c[V.QUALITY_LIMITATION_DURATIONS]:null;return o&&Object.keys(o).forEach(a=>{o[a]>1e3&&(o[a]=Number(o[a]/1e3))}),{reason:s,durations:o,resolutionChanges:r}},Ov=(c,s,r)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PLI)||!Object.prototype.hasOwnProperty.call(c,V.NACK))return{pliCount:s.total_pli_sent_in,nackCount:s.total_nack_sent_in,deltaPliCount:0,deltaNackCount:0};const o=(c[V.PLI]||0)-(r?r[x.VIDEO].total_pli_sent_in:0),a=(c[V.NACK]||0)-(r?r[x.VIDEO].total_nack_sent_in:0);return{pliCount:o,nackCount:a,deltaPliCount:o-s[x.VIDEO].total_pli_sent_in,deltaNackCount:a-s[x.VIDEO].total_nack_sent_in}},Dv=(c,s,r)=>{if(!Object.prototype.hasOwnProperty.call(c,V.PLI)||!Object.prototype.hasOwnProperty.call(c,V.NACK))return{pliCount:s.total_pli_received_out,nackCount:s.total_nack_received_out,deltaPliCount:0,deltaNackCount:0};const o=(c[V.PLI]||0)-(r?r[x.VIDEO].total_pli_received_out:0),a=(c[V.NACK]||0)-(r?r[x.VIDEO].total_nack_received_out:0);return{pliCount:o,nackCount:a,deltaPliCount:o-s[x.VIDEO].total_pli_received_out,deltaNackCount:a-s[x.VIDEO].total_nack_received_out}},Nv=c=>({channels:c[V.CHANNELS]||null,clock_rate:c[V.CLOCK_RATE]||null,mime_type:c[V.MIME_TYPE]||null,sdp_fmtp_line:c[V.SDP_FMTP_LINE]||null}),Uv=c=>({clock_rate:c[V.CLOCK_RATE]||null,mime_type:c[V.MIME_TYPE]||null}),Pv=(c,s,r)=>{const o=(c[V.BYTES_RECEIVED]||0)/1024-(r?r.data.total_KBytes_in:0),a=(c[V.BYTES_SENT]||0)/1024-(r?r.data.total_KBytes_out:0),t=c[V.TIMESTAMP]||Date.now(),n=o-s.data.total_KBytes_in,p=a-s.data.total_KBytes_out,_=r?r.timestamp:null;let d=s.timestamp;!d&&_&&(d=_);const g=d?t-d:0,T=g>0?n*.008*1024/g*1e3:0,E=g>0?p*.008*1024/g*1e3:0;return{total_KBytes_received:o,total_KBytes_sent:a,delta_KBytes_received:n,delta_KBytes_sent:p,kbs_speed_received:T,kbs_speed_sent:E}},xv=c=>{const s=c[V.AVAILABLE_INCOMING_BITRATE]/1024||0,r=c[V.AVAILABLE_OUTGOING_BITRATE]/1024||0;return{kbs_incoming_bandwidth:s,kbs_outgoing_bandwidth:r}},Mv=(c,s,r,o)=>{if(!c)return[];switch(c[V.TYPE]){case zt.CANDIDATE_PAIR:let a=!1;if(c[V.NOMINATED]&&c[V.STATE]===x.SUCCEEDED&&(a=!0,Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c),V.SELECTED in c&&!c[V.SELECTED]&&(a=!1)),a){const n=c[V.LOCAL_CANDIDATE_ID],p=c[V.REMOTE_CANDIDATE_ID],_=Pv(c,s,o),d=xv(c),g=Av(c,"data",o,s);return[{type:ne.NETWORK,value:{local_candidate_id:n}},{type:ne.NETWORK,value:{remote_candidate_id:p}},{type:ne.DATA,value:{total_KBytes_in:_.total_KBytes_received}},{type:ne.DATA,value:{total_KBytes_out:_.total_KBytes_sent}},{type:ne.DATA,value:{delta_KBytes_in:_.delta_KBytes_received}},{type:ne.DATA,value:{delta_KBytes_out:_.delta_KBytes_sent}},{type:ne.DATA,value:{delta_kbs_in:_.kbs_speed_received}},{type:ne.DATA,value:{delta_kbs_out:_.kbs_speed_sent}},{type:ne.DATA,value:{delta_kbs_bandwidth_in:d.kbs_incoming_bandwidth}},{type:ne.DATA,value:{delta_kbs_bandwidth_out:d.kbs_outgoing_bandwidth}},{type:ne.DATA,value:{delta_rtt_connectivity_ms:g.rtt}},{type:ne.DATA,value:{total_rtt_connectivity_ms:g.totalRTT}},{type:ne.DATA,value:{total_rtt_connectivity_measure:g.totalRTTMeasurements}}]}break;case zt.LOCAL_CANDIDATE:if(c[V.ID]===s.network.local_candidate_id)return[{type:ne.NETWORK,value:{infrastructure:bv(c)}},{type:ne.NETWORK,value:{local_candidate_type:c[V.CANDIDATE_TYPE]||""}},{type:ne.NETWORK,value:{local_candidate_protocol:c[V.PROTOCOL]||""}},{type:ne.NETWORK,value:{local_candidate_relay_protocol:Iv(c)}}];break;case zt.REMOTE_CANDIDATE:if(c[V.ID]===s.network.remote_candidate_id)return[{type:ne.NETWORK,value:{remote_candidate_type:c[V.CANDIDATE_TYPE]||""}},{type:ne.NETWORK,value:{remote_candidate_protocol:c[V.PROTOCOL]||""}}];break;case zt.INBOUND_RTP:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const n=c[V.SSRC],p=ct(n,s,$e.INBOUND);p&&(p.timestamp=s.timestamp);const _=ct(n,o,$e.INBOUND);if(_&&(_.timestamp=o.timestamp),c[V.MEDIA_TYPE]===x.AUDIO){const d=xf(c,x.AUDIO,p,_),g=oo(c,x.AUDIO,p),T=c[V.CODEC_ID]||"";return[{ssrc:n,type:ne.AUDIO,value:{codec_id_in:T}},{ssrc:n,type:ne.AUDIO,value:{total_packets_in:d.packetsReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_in:d.deltaPacketsReceived}},{ssrc:n,type:ne.AUDIO,value:{total_packets_lost_in:d.packetsLost}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_lost_in:d.deltaPacketsLost}},{ssrc:n,type:ne.AUDIO,value:{percent_packets_lost_in:d.percentPacketsLost}},{ssrc:n,type:ne.AUDIO,value:{total_KBytes_in:d.KBytesReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_KBytes_in:d.deltaKBytesReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_kbs_in:d.kbsReceived}},{ssrc:n,type:ne.AUDIO,value:{delta_jitter_ms_in:g}}]}if(c[V.MEDIA_TYPE]===x.VIDEO){const d=Cv(c,p),g=xf(c,x.VIDEO,p,_),T=oo(c,x.VIDEO,p),E=c[V.DECODER_IMPLEMENTATION]||null,y=c[V.CODEC_ID]||null,A=Mf(c),C=Ov(c,p,_);return[{ssrc:n,type:ne.VIDEO,value:{codec_id_in:y}},{ssrc:n,type:ne.VIDEO,value:{total_packets_in:g.packetsReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_in:g.deltaPacketsReceived}},{ssrc:n,type:ne.VIDEO,value:{total_packets_lost_in:g.packetsLost}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_lost_in:g.deltaPacketsLost}},{ssrc:n,type:ne.VIDEO,value:{percent_packets_lost_in:g.percentPacketsLost}},{ssrc:n,type:ne.VIDEO,value:{total_KBytes_in:g.KBytesReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_KBytes_in:g.deltaKBytesReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_kbs_in:g.kbsReceived}},{ssrc:n,type:ne.VIDEO,value:{delta_jitter_ms_in:T}},{ssrc:n,type:ne.VIDEO,value:{decoder_in:E}},{ssrc:n,type:ne.VIDEO,value:{delta_ms_decode_frame_in:d.delta_ms_decode_frame}},{ssrc:n,type:ne.VIDEO,value:{total_frames_decoded_in:d.frames_decoded}},{ssrc:n,type:ne.VIDEO,value:{total_time_decoded_in:d.total_decode_time}},{ssrc:n,type:ne.VIDEO,value:{total_nack_sent_in:C.nackCount}},{ssrc:n,type:ne.VIDEO,value:{delta_nack_sent_in:C.deltaNackCount}},{ssrc:n,type:ne.VIDEO,value:{total_pli_sent_in:C.pliCount}},{ssrc:n,type:ne.VIDEO,value:{delta_pli_sent_in:C.deltaPliCount}},{ssrc:n,type:ne.VIDEO,value:{size_in:A}}]}break}case zt.OUTBOUND_RTP:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const n=c[V.SSRC],p=ct(n,s,$e.OUTBOUND);p&&(p.timestamp=s.timestamp);const _=ct(n,o,$e.OUTBOUND);if(_&&(_.timestamp=o.timestamp),c[V.MEDIA_TYPE]===x.AUDIO){const d=c[V.CODEC_ID]||null,g=Uf(c,x.AUDIO,p,_);return[{ssrc:n,type:ne.AUDIO,value:{codec_id_out:d}},{ssrc:n,type:ne.AUDIO,value:{total_packets_out:g.packetsSent}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_out:g.deltaPacketsSent}},{ssrc:n,type:ne.AUDIO,value:{total_KBytes_out:g.KBytesSent}},{ssrc:n,type:ne.AUDIO,value:{delta_KBytes_out:g.deltaKBytesSent}},{ssrc:n,type:ne.AUDIO,value:{delta_kbs_out:g.kbsSent}}]}if(c[V.MEDIA_TYPE]===x.VIDEO){const d=c[V.ENCODER_IMPLEMENTATION]||null,g=c[V.CODEC_ID]||null,T=Rv(c,p),E=Mf(c),y=wv(c),A=Dv(c,p,_),C=Uf(c,x.VIDEO,p,_);return[{ssrc:n,type:ne.VIDEO,value:{codec_id_out:g}},{ssrc:n,type:ne.VIDEO,value:{total_packets_out:C.packetsSent}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_out:C.deltaPacketsSent}},{ssrc:n,type:ne.VIDEO,value:{total_KBytes_out:C.KBytesSent}},{ssrc:n,type:ne.VIDEO,value:{delta_KBytes_out:C.deltaKBytesSent}},{ssrc:n,type:ne.VIDEO,value:{delta_kbs_out:C.kbsSent}},{ssrc:n,type:ne.VIDEO,value:{encoder_out:d}},{ssrc:n,type:ne.VIDEO,value:{delta_ms_encode_frame_out:T.delta_ms_encode_frame}},{ssrc:n,type:ne.VIDEO,value:{total_frames_encoded_out:T.frames_encoded}},{ssrc:n,type:ne.VIDEO,value:{total_time_encoded_out:T.total_encode_time}},{ssrc:n,type:ne.VIDEO,value:{total_nack_received_out:A.nackCount}},{ssrc:n,type:ne.VIDEO,value:{delta_nack_received_out:A.deltaNackCount}},{ssrc:n,type:ne.VIDEO,value:{total_pli_received_out:A.pliCount}},{ssrc:n,type:ne.VIDEO,value:{delta_pli_received_out:A.deltaPliCount}},{ssrc:n,type:ne.VIDEO,value:{size_out:E}},{ssrc:n,type:ne.VIDEO,value:{limitation_out:y}}]}break}case zt.MEDIA_SOURCE:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);break}case zt.TRACK:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);break}case zt.CODEC:const t=[];return Object.keys(s[x.AUDIO]).forEach(n=>{const p=s[x.AUDIO][n];if(p.codec_id_in===c[V.ID]||p.codec_id_out===c[V.ID]){Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const _=Nv(c);c[V.ID]===p.codec_id_in?t.push({ssrc:p.ssrc,type:ne.AUDIO,value:{codec_in:_}}):t.push({ssrc:p.ssrc,type:ne.AUDIO,value:{codec_out:_}})}}),Object.keys(s[x.VIDEO]).forEach(n=>{const p=s[x.VIDEO][n];if(p.codec_id_in===c[V.ID]||p.codec_id_out===c[V.ID]){Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const _=Uv(c);c[V.ID]===p.codec_id_in?t.push({ssrc:p.ssrc,type:ne.VIDEO,value:{codec_in:_}}):t.push({ssrc:p.ssrc,type:ne.VIDEO,value:{codec_out:_}})}}),t;case zt.REMOTE_INBOUND_RTP:{Pe($s,`analyze() - got stats ${c[V.TYPE]} for ${r}`,c);const n=c[V.SSRC],p=ct(n,s,$e.OUTBOUND),_=ct(n,o,$e.OUTBOUND);if(c[V.KIND]===x.AUDIO){const d=Nf(c,x.AUDIO,_,p),g=oo(c,x.AUDIO,p),T=Pf(c,x.AUDIO,p,_);return[{ssrc:n,type:ne.AUDIO,value:{delta_rtt_ms_out:d.rtt}},{ssrc:n,type:ne.AUDIO,value:{total_rtt_ms_out:d.totalRTT}},{ssrc:n,type:ne.AUDIO,value:{total_rtt_measure_out:d.totalRTTMeasurements}},{ssrc:n,type:ne.AUDIO,value:{delta_jitter_ms_out:g}},{ssrc:n,type:ne.AUDIO,value:{timestamp_out:c[V.TIMESTAMP]}},{ssrc:n,type:ne.AUDIO,value:{total_packets_lost_out:T.packetsLost}},{ssrc:n,type:ne.AUDIO,value:{delta_packets_lost_out:T.deltaPacketsLost}},{ssrc:n,type:ne.AUDIO,value:{percent_packets_lost_out:T.fractionLost}}]}if(c[V.KIND]===x.VIDEO){const d=Nf(c,x.VIDEO,_,p),g=oo(c,x.VIDEO,p),T=Pf(c,x.VIDEO,p,_);return[{ssrc:n,type:ne.VIDEO,value:{delta_rtt_ms_out:d.rtt}},{ssrc:n,type:ne.VIDEO,value:{total_rtt_ms_out:d.totalRTT}},{ssrc:n,type:ne.VIDEO,value:{total_rtt_measure_out:d.totalRTTMeasurements}},{ssrc:n,type:ne.VIDEO,value:{delta_jitter_ms_out:g}},{ssrc:n,type:ne.VIDEO,value:{timestamp_out:c[V.TIMESTAMP]}},{ssrc:n,type:ne.VIDEO,value:{total_packets_lost_out:T.packetsLost}},{ssrc:n,type:ne.VIDEO,value:{delta_packets_lost_out:T.deltaPacketsLost}},{ssrc:n,type:ne.VIDEO,value:{percent_packets_lost_out:T.fractionLost}}]}break}}return[]},jo=c=>c<0?1:c>100?4.5:1+.035*c+7/1e6*c*(c-60)*(100-c),kv=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.INBOUND),n=ct(a,r,$e.INBOUND),p=ct(a,o,$e.INBOUND),_=[],d=[],g=t[s].percent_packets_lost_in,T=t[s].delta_jitter_ms_in,E=n&&n[s].delta_jitter_ms_in||null,y=p&&p[s].delta_jitter_ms_in||null,A=c.data.delta_rtt_connectivity_ms,C=r&&r.data.delta_rtt_connectivity_ms||null,I=o&&o.data.delta_rtt_connectivity_ms||null;A&&_.push(A),C&&_.push(C),I&&_.push(I),T&&d.push(T),r&&E&&d.push(E),o&&y&&d.push(y);const $=_.length>0?Vs(_):100,L=d.length>0?Vs(d):10,ae=93.2-g,N=.18*ae*ae-27.9*ae+1126.62,F=($+L)/2,Se=F-177.3<0?0:1,ve=.024*F+.11*(F-177.3)*Se,M=N-ve;return jo(M)},Lv=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.OUTBOUND),n=ct(a,r,$e.OUTBOUND),p=ct(a,o,$e.OUTBOUND),_=[],d=[],g=t[s].percent_packets_lost_out,T=t[s].delta_rtt_ms_out,E=n&&n[s].delta_rtt_ms_out||null,y=p&&p[s].delta_rtt_ms_out||null,A=t[s].delta_jitter_ms_out,C=n&&n[s].delta_jitter_ms_out||null,I=p&&p[s].delta_jitter_ms_out||null,$=c.data.delta_rtt_connectivity_ms,L=r&&r.data.delta_rtt_connectivity_ms||null,ae=o&&o.data.delta_rtt_connectivity_ms||null;T?_.push(T):$&&_.push($),E?_.push(E):L&&_.push(L),y?_.push(y):ae&&_.push(ae),A&&d.push(A),r&&C&&d.push(C),o&&I&&d.push(I);const N=_.length>0?Vs(_):100,F=d.length>0?Vs(d):10,Se=93.2-g,ve=.18*Se*Se-27.9*Se+1126.62,M=(N+F)/2,D=M-177.3<0?0:1,B=.024*M+.11*(M-177.3)*D,q=ve-B;return jo(q)},$v=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.INBOUND),n=ct(a,r,$e.INBOUND),p=ct(a,o,$e.INBOUND),_=[],d=[],g=t[s].percent_packets_lost_in/100,T=t[s].delta_jitter_ms_in,E=n&&n[s].delta_jitter_ms_in||null,y=p&&p[s].delta_jitter_ms_in||null,A=c.data.delta_rtt_connectivity_ms,C=r&&r.data.delta_rtt_connectivity_ms||null,I=o&&o.data.delta_rtt_connectivity_ms||null;A&&_.push(A),C&&_.push(C),I&&_.push(I),T&&d.push(T),n&&E&&d.push(E),p&&y&&d.push(y);const $=_.length>0?Vs(_):100,L=d.length>0?Vs(d):10,ae=0,N=19.8,F=29.7,Se=30,ve=($+L)/2+Se,M=ve-177.3<0?0:1,D=.024*ve+.11*(ve-177.3)*M,q=93.2-(ae+N*Math.log(1+F*g)+D);return jo(q)},Hv=(c,s=x.AUDIO,r,o,a)=>{const t=ct(a,c,$e.OUTBOUND),n=ct(a,r,$e.OUTBOUND),p=ct(a,o,$e.OUTBOUND),_=[],d=[],g=t[s].percent_packets_lost_out/100,T=t[s].delta_rtt_ms_out,E=n&&n[s].delta_rtt_ms_out||null,y=p&&p[s].delta_rtt_ms_out||null,A=t[s].delta_jitter_ms_out,C=n&&n[s].delta_jitter_ms_out||null,I=p&&p[s].delta_jitter_ms_out||null,$=c.data.delta_rtt_connectivity_ms,L=r&&r.data.delta_rtt_connectivity_ms||null,ae=o&&o.data.delta_rtt_connectivity_ms||null;T?_.push(T):$&&_.push($),E?_.push(E):L&&_.push(L),y?_.push(y):ae&&_.push(ae),A&&d.push(A),n&&C&&d.push(C),p&&I&&d.push(I);const N=_.length>0?Vs(_):100,F=d.length>0?Vs(d):10,Se=0,ve=19.8,M=29.7,D=30,B=(N+F)/2+D,q=B-177.3<0?0:1,z=.024*B+.11*(B-177.3)*q,X=93.2-(Se+ve*Math.log(1+M*g)+z);return jo(X)};class Fv{constructor(s,r){this._callbacks={onreport:null,onticket:null},this._id=mv(),this._moduleName=this._id,this._probeId=r,this._config=s,this._exporter=new yv(s),this._state=ps.IDLE,this.registerToPCEvents(),yn(this._moduleName,`new collector created for probe ${this._probeId}`)}analyze(s,r,o,a){const t=(_,d)=>_===x.AUDIO?d===zt.INBOUND_RTP?{...I_}:{...b_}:d===zt.INBOUND_RTP?{...w_}:{...O_},n=fv(r);n.pname=this._config.pname,n.call_id=this._config.cid,n.user_id=this._config.uid,n.count=r?r.count+1:1;let p=null;return s.forEach(_=>{!p&&_.timestamp&&(p=_.timestamp),Mv(_,n,n.pname,a).forEach(g=>{if(g.value&&g.type)if(g.ssrc){let T=n[g.type][g.ssrc];T||(T=t(g.type,_.type),T.ssrc=g.ssrc,n[g.type][g.ssrc]=T),Object.keys(g.value).forEach(E=>{T[E]=g.value[E]})}else Object.keys(g.value).forEach(T=>{n[g.type][T]=g.value[T]})})}),n.timestamp=p,Object.keys(n[x.AUDIO]).forEach(_=>{const d=n[x.AUDIO][_];d.direction===$e.INBOUND?(d.mos_emodel_in=kv(n,x.AUDIO,r,o,d.ssrc),d.mos_in=$v(n,x.AUDIO,r,o,d.ssrc)):(d.mos_emodel_out=Lv(n,x.AUDIO,r,o,d.ssrc),d.mos_out=Hv(n,x.AUDIO,r,o,d.ssrc))}),n}async takeReferenceStats(){return new Promise((s,r)=>{const o=Date.now();setTimeout(async()=>{try{const a=Date.now()-o,t=Date.now(),n=await this._config.pc.getStats(),p=this.analyze(n,null,null,null),_=Date.now();p.experimental.time_to_measure_ms=_-t,p.experimental.time_to_wait_ms=a,this._exporter.saveReferenceReport(p),Pe(this._moduleName,`got reference report for probe ${this._probeId}`),s()}catch(a){r(a)}},this._config.startAfter)})}async collectStats(){try{if(this._state!==ps.RUNNING||!this._config.pc)return Pe(this._moduleName,`report discarded (too late) for probe ${this._probeId}`),null;const s=Date.now(),r=await this._config.pc.getStats(),o=this.analyze(r,this._exporter.getLastReport(),this._exporter.getBeforeLastReport(),this._exporter.getReferenceReport()),a=Date.now();return o.experimental.time_to_measure_ms=a-s,this._exporter.addReport(o),Pe(this._moduleName,`got report for probe ${this._probeId}#${this._exporter.getReportsNumber()+1}`),this.fireOnReport(o),o}catch(s){return ur(this._moduleName,`got error ${s}`),null}}async start(){Pe(this._moduleName,"starting"),this.state=ps.RUNNING,this._startedTime=this._exporter.start(),Pe(this._moduleName,"started")}async mute(){this.state=ps.MUTED,Pe(this._moduleName,"muted")}async unmute(){this.state=ps.RUNNING,Pe(this._moduleName,"unmuted")}async stop(s){if(Pe(this._moduleName,`stopping${s?" by watchdog":""}...`),this._stoppedTime=this._exporter.stop(),this.state=ps.IDLE,this._config.ticket){const{ticket:r}=this._exporter;this.fireOnTicket(r)}this._exporter.reset(),Pe(this._moduleName,"stopped")}registerCallback(s,r,o){s in this._callbacks?(this._callbacks[s]={callback:r,context:o},Pe(this._moduleName,`registered callback '${s}'`)):ur(this._moduleName,`can't register callback for '${s}' - not found`)}unregisterCallback(s){s in this._callbacks?(this._callbacks[s]=null,delete this._callbacks[s],Pe(this._moduleName,`unregistered callback '${s}'`)):ur(this._moduleName,`can't unregister callback for '${s}' - not found`)}fireOnReport(s){this._callbacks.onreport&&Eu(this._callbacks.onreport.callback,this._callbacks.onreport.context,s)}fireOnTicket(s){this._callbacks.onticket&&Eu(this._callbacks.onticket.callback,this._callbacks.onticket.context,s)}updateConfig(s){this._config=s,this._exporter.updateConfig(s)}get state(){return this._state}set state(s){this._state=s,Pe(this._moduleName,`state changed to ${s}`)}addCustomEvent(s,r,o,a){this._exporter.addCustomEvent({at:typeof s=="object"?s.toJSON():s,category:r,name:o,description:a})}async registerToPCEvents(){const{pc:s}=this._config;if(navigator.mediaDevices.ondevicechange=async()=>{try{const r=await navigator.mediaDevices.enumerateDevices();this.addCustomEvent(new Date().toJSON(),"device",`${r.length} devices found`,"Media Devices state")}catch{ur(this._moduleName,"can't get devices")}},s){s.oniceconnectionstatechange=()=>{const o=s.iceConnectionState;o===qi.CONNECTED||o===qi.COMPLETED?this.addCustomEvent(new Date().toJSON(),"call",o,"ICE connection state"):o===qi.DISCONNECTED||o===qi.FAILED?this.addCustomEvent(new Date().toJSON(),"call",o,"ICE connection state"):o===qi.CLOSED&&this.addCustomEvent(new Date().toJSON(),"call","ended","ICE connection state")},s.onicegatheringstatechange=()=>{const o=s.iceGatheringState;this.addCustomEvent(new Date().toJSON(),"call",o,"ICE gathering state")},s.ontrack=o=>{this.addCustomEvent(new Date().toJSON(),"call",`${o.track.kind}track`,"MediaStreamTrack received")},s.onnegotiationneeded=()=>{this.addCustomEvent(new Date().toJSON(),"call","negotiation","Media changed")};const r=s.getReceivers();if(r&&r.length>0){const o=r[0],{transport:a}=o;if(a){const{iceTransport:t}=a;t&&(t.onselectedcandidatepairchange=()=>{this.addCustomEvent(new Date().toJSON(),"call","transport","Candidates Pair changed")})}}}}}class jv{constructor(s){this._id=s.pname&&s.pname.substr(0,12).padEnd(12," ")||pv(),this._moduleName=this._id,yn(this._moduleName,"probe created"),this._config=s,this._collector=new Fv(this._config,this._id)}set onreport(s){s?this._collector.registerCallback("onreport",s):this._collector.unregisterCallback("onreport")}set onticket(s){s?this._collector.registerCallback("onticket",s):this._collector.unregisterCallback("onticket")}get id(){return this._id}get pname(){return this._config.pname}get cid(){return this._config.cid}get uid(){return this._config.uid}get state(){return this._collector.state}set state(s){this._collector.state=s}addCustomEvent(s,r,o,a=new Date().toJSON()){this._collector.addCustomEvent(a,r,s,o)}get isRunning(){return this._collector.state===ps.RUNNING}get isIdle(){return this._collector.state===ps.IDLE}updateUserId(s){this._config.uid=s,this._collector.updateConfig(this._config)}updateCallId(s){this._config.cid=s,this._collector.updateConfig(this._config)}start(){if(!this.isIdle){Ao(this._moduleName,"probe is already running");return}this._collector.start()}stop(s=!1){this.isRunning&&this._collector.stop(s)}async takeReferenceStats(){return this._collector.takeReferenceStats()}async collectStats(){return this._collector.collectStats()}}const Ct="engine ";class Vv{constructor(s){this._config=s,this._probes=[],this._startedTime=null,this._callbacks={onresult:null},yn(Ct,`configured for probing every ${this._config.refreshEvery}ms`),yn(Ct,`configured for starting after ${this._config.startAfter}ms`),yn(Ct,`${!this._config.stopAfter||this._config.stopAfter!==-1?`configured for stopped after ${this._config.stopAfter}ms`:"configured for never stopped"}`),Pe(Ct,"engine initialized")}get probes(){return this._probes}get isRunning(){return this._probes.some(s=>s.isRunning)}get isIdle(){return this._probes.every(s=>s.isIdle)}addNewProbe(s,r){if(!s)throw new Error("undefined peer connection");const o=hv(s,r,this._config),a=new jv(o);return this._probes.push(a),Pe(Ct,`${this._probes.length} probes registered`),a}removeExistingProbe(s){if(!s)throw new Error("undefined probe");s.state===ps.RUNNING&&s.stop(),this._probes=this._probes.filter(r=>s.id!==r.id)}async start(){const s=()=>{this._probes.forEach(t=>t.start())},r=async()=>Promise.all(this._probes.map(t=>t.takeReferenceStats())),o=()=>this.isIdle?!1:!this._config.stopAfter||this._config.stopAfter<0?!0:Date.now()<this._startedTime+this._config.stopAfter,a=async()=>{const t=cv(),n=this._probes.filter(p=>p.isRunning);for(const p of n){const _=await p.collectStats();_&&t.probes.push(_),Pe(Ct,`got probe ${p.id}`),await Of(0)}return t.delta_time_to_measure_probes_ms=Tn(t.probes,"experimental","time_to_measure_ms"),t.delta_KBytes_in=Tn(t.probes,"data","delta_KBytes_in"),t.delta_KBytes_out=Tn(t.probes,"data","delta_KBytes_out"),t.delta_kbs_in=Tn(t.probes,"data","delta_kbs_in"),t.delta_kbs_out=Tn(t.probes,"data","delta_kbs_out"),t.total_time_decoded_in=Tn(t.probes,"video","total_time_decoded_in"),t.total_time_encoded_out=Tn(t.probes,"video","total_time_encoded_out"),t};for(Pe(Ct,"starting to collect"),s(),Pe(Ct,"generating reference reports..."),await r(),Pe(Ct,"reference reports generated"),this._startedTime=Date.now();o();)if(Pe(Ct,`wait ${this._config.refreshEvery}ms before collecting`),await Of(this._config.refreshEvery),o()){Pe(Ct,"collecting...");const t=Date.now(),n=await a(),p=Date.now();n.delta_time_consumed_to_measure_ms=p-t,this.fireOnReports(n),Pe(Ct,"collected")}Pe(Ct,"reaching end of the collecting period..."),this.isRunning&&setTimeout(()=>{this.stop()},0)}stop(s){const r=o=>{this._probes.forEach(a=>{a.stop(o)})};yn(Ct,"stop collecting"),r(s)}registerCallback(s,r,o){s in this._callbacks?(this._callbacks[s]={callback:r,context:o},Pe(Ct,`registered callback '${s}'`)):ur(Ct,`can't register callback for '${s}' - not found`)}unregisterCallback(s){s in this._callbacks?(this._callbacks[s]=null,delete this._callbacks[s],Pe(this._moduleName,`unregistered callback '${s}'`)):ur(this._moduleName,`can't unregister callback for '${s}' - not found`)}fireOnReports(s){this._callbacks.onresult&&s.probes.length>0&&Eu(this._callbacks.onresult.callback,this._callbacks.onresult.context,s)}}const qv="interface ";class Bv{constructor(s){this._config=dv(s),yn(qv,`welcome to ${this._config.name} version ${this._config.version}`),sv(this._config.verbose||!1),this._engine=new Vv(this._config)}setupLogLevel(s){nv(s)}get version(){return this._config.version}get name(){return this._config.name}get probes(){return this._engine.probes}createProbe(s,r){return this._engine.addNewProbe(s,r)}startAllProbes(){this._engine.start()}stopAllProbes(){this._engine.stop()}get running(){return this._engine.isRunning}get idle(){return this._engine.isIdle}removeProbe(s){this._engine.removeExistingProbe(s)}set onresult(s){s?this._engine.registerCallback("onresult",s):this._engine.unregisterCallback("onresult")}}function Gv(c,s){return Object.keys(c).filter(r=>s.includes(r)).reduce((r,o)=>{const a=o;return{...r,[a]:c[a]}},{})}const Wv=["mos_in","codec_in","delta_KBytes_in","delta_kbs_in","delta_jitter_ms_in","delta_packets_lost_in"];class Kv{constructor(s){this.intervals={},this.emitInterval=s.emitInterval||200,this.onChangeFunction=s.onChangeFunction}start(s,r){s&&s.getTracks().length&&requestAnimationFrame(()=>this.beginCalculation(s,r))}stop(s){this.clearVolumeInterval(s)}clearVolumeInterval(s){console.log("clearVolumeInterval",s),clearInterval(this.intervals[s]),delete this.intervals[s]}clearAllIntervals(){Object.keys(this.intervals).forEach(s=>{clearInterval(this.intervals[s])}),this.intervals={}}beginCalculation(s,r){this.clearVolumeInterval(r);const o=Sn.createAnalyser(),a=Sn.createMediaStreamSource(s),t=Sn.createScriptProcessor(2048,1,1);o.smoothingTimeConstant=.8,o.fftSize=1024,a.connect(o),o.connect(t),t.connect(Sn.destination),this.intervals[r]=setInterval(()=>{const n=new Uint8Array(o.frequencyBinCount);o.getByteFrequencyData(n);let p=0;const _=n.length;for(let g=0;g<_;g++)p+=n[g];const d=p/_;this.onChangeFunction(r,d)},this.emitInterval)}}const ao={SELECTED_INPUT_DEVICE:"OpensipsJSInputDevice",SELECTED_OUTPUT_DEVICE:"OpensipsJSOutputDevice"},Yv=0;class zv{constructor(s){this.isAutoAnswer=!1,this.muteWhenJoinEnabled=!1,this.isDNDEnabled=!1,this.muted=!1,this.microphoneInputLevelValue=1,this.speakerVolumeValue=1,this.activeRooms={},this.activeCalls={},this.extendedCalls={},this.availableMediaDevices=[],this.selectedMediaDevices={input:"default",output:"default"},this.callStatus={},this.callTime={},this.callMetrics={},this.timeIntervals={},this.metricConfig={refreshEvery:1e3},this.activeStreamValue=null,this.initialStreamValue=null,this.context=s,this.context.on(this.context.newRTCSessionEventName,this.newRTCSessionCallback.bind(this)),this.VUMeter=new Kv({onChangeFunction:this.emitVolumeChange.bind(this)}),this.initializeMediaDevices()}get sipOptions(){return{...this.context.options.sipOptions,mediaConstraints:this.getUserMediaConstraints}}get currentActiveRoomId(){return this.currentActiveRoomIdValue}set currentActiveRoomId(s){this.currentActiveRoomIdValue=s,this.context.emit("currentActiveRoomChanged",s)}get autoAnswer(){return this.isAutoAnswer}get callAddingInProgress(){return this.isCallAddingInProgress}set callAddingInProgress(s){this.isCallAddingInProgress=s,this.context.emit("callAddingInProgressChanged",s)}get muteWhenJoin(){return this.muteWhenJoinEnabled}get isDND(){return this.isDNDEnabled}get speakerVolume(){return this.speakerVolumeValue}get microphoneInputLevel(){return this.microphoneInputLevelValue}get getActiveCalls(){return this.activeCalls}get hasActiveCalls(){return Object.values(this.extendedCalls).length>0}get getActiveRooms(){return this.activeRooms}get isMuted(){return this.muted}get getInputDeviceList(){return this.availableMediaDevices.filter(s=>s.kind==="audioinput")}get getOutputDeviceList(){return this.availableMediaDevices.filter(s=>s.kind==="audiooutput")}get getUserMediaConstraints(){return A_()?{video:!1,audio:!0}:{audio:{deviceId:{exact:this.selectedMediaDevices.input}},video:!1}}get selectedInputDevice(){return this.selectedMediaDevices.input}get selectedOutputDevice(){return this.selectedMediaDevices.output}get activeStream(){return this.activeStreamValue}setAvailableMediaDevices(s){this.availableMediaDevices=s,this.context.emit("changeAvailableDeviceList",s)}async updateDeviceList(){await navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);const s=await navigator.mediaDevices.enumerateDevices();this.setAvailableMediaDevices(s)}async initializeMediaDevices(){const s=localStorage.getItem(ao.SELECTED_INPUT_DEVICE)||"default",r=localStorage.getItem(ao.SELECTED_OUTPUT_DEVICE)||"default";try{const o=await navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints),a=await navigator.mediaDevices.enumerateDevices();this.setAvailableMediaDevices(a),await this.setMicrophone(s),await this.setSpeaker(r),navigator.mediaDevices.addEventListener("devicechange",async()=>{const t=await navigator.mediaDevices.enumerateDevices();this.setAvailableMediaDevices(t)}),o.getTracks().forEach(t=>t.stop())}catch(o){console.error(o)}}setCallTime(s){const r={...s};delete r.callId,this.callTime={...this.callTime,[s.callId]:r},this.context.emit("changeCallTime",this.callTime)}removeCallTime(s){const r={...this.callTime};delete r[s],this.callTime={...r},this.context.emit("changeCallTime",this.callTime)}setTimeInterval(s,r){this.timeIntervals={...this.timeIntervals,[s]:r}}removeTimeInterval(s){const r={...this.timeIntervals};r[s]&&(clearInterval(r[s]),delete r[s],this.timeIntervals={...r})}stopCallTimer(s){this.removeTimeInterval(s),this.removeCallTime(s)}emitVolumeChange(s,r){this.context.emit("changeCallVolume",{callId:s,volume:r})}setMetricsConfig(s){this.metricConfig={...this.metricConfig,...s}}sendDTMF(s,r){if(!/^[A-D0-9]+$/g.test(r))throw new Error("Not allowed character in DTMF input");this.extendedCalls[s].sendDTMF(r)}setIsMuted(s){this.muted=s,this.context.emit("changeIsMuted",s)}processMute(s){const r=this.currentActiveRoomId;this.setIsMuted(s),this.initialStreamValue.getTracks().forEach(o=>o.enabled=!s),this.roomReconfigure(r)}mute(){this.processMute(!0)}unmute(){this.processMute(!1)}async processHold({callId:s,toHold:r,automatic:o}){const a=this.extendedCalls[s];a._automaticHold=o??!1,await new Promise(p=>{const _=()=>{p()};r?a.hold({},_):a.unhold({},_)}),this.updateCall(a);const n=Object.values(this.extendedCalls).filter(p=>p.roomId===this.currentActiveRoomId&&(r?s!==p._id:!0));n.length>1&&await this.doConference(n)}holdCall(s,r=!1){return this.processHold({callId:s,automatic:r,toHold:!0})}unholdCall(s){return this.processHold({callId:s,toHold:!1})}cancelAllOutgoingUnanswered(){Object.values(this.getActiveCalls).filter(s=>s.direction==="outgoing"&&s.status===Yv).forEach(s=>this.terminateCall(s._id))}answerCall(s){const r=this.extendedCalls[s];this.cancelAllOutgoingUnanswered(),r.answer(this.sipOptions),this.updateCall(r),this.setActiveRoom(r.roomId),r.connection.addEventListener("track",o=>{this.triggerAddStream(o,r)})}async moveCall(s,r){this.updateCallStatus({callId:s,isMoving:!0}),await this.processRoomChange({callId:s,roomId:r}),this.updateCallStatus({callId:s,isMoving:!1})}updateCall(s){this.activeCalls[s._id]=Cf(s),this.context.emit("changeActiveCalls",this.activeCalls)}updateRoom(s){const o={...this.activeRooms[s.roomId],...s};this.activeRooms={...this.activeRooms,[s.roomId]:{...o}},this.context.emit("updateRoom",{room:o,roomList:this.activeRooms})}hasAutoAnswerHeaders(s){const r=/answer-after=0/,a=s.request.getHeader("Call-Info");return a&&r.test(a)}addCall(s,r=!0){this.activeCalls={...this.activeCalls,[s._id]:Cf(s)},this.extendedCalls[s._id]=s,r&&this.context.emit("changeActiveCalls",this.activeCalls)}addCallStatus(s){this.callStatus={...this.callStatus,[s]:{isMoving:!1,isTransferring:!1,isMerging:!1}},this.context.emit("changeCallStatus",this.callStatus)}updateCallStatus(s){const o={...{...this.callStatus[s.callId]}};s.isMoving!==void 0&&(o.isMoving=s.isMoving),s.isTransferring!==void 0&&(o.isTransferring=s.isTransferring),s.isMerging!==void 0&&(o.isMerging=s.isMerging),this.callStatus={...this.callStatus,[s.callId]:{...o}},this.context.emit("changeCallStatus",this.callStatus)}removeCallStatus(s){const r={...this.callStatus};delete r[s],this.callStatus={...r},this.context.emit("changeCallStatus",this.callStatus)}addRoom(s){this.activeRooms={...this.activeRooms,[s.roomId]:s},this.context.emit("addRoom",{room:s,roomList:this.activeRooms})}getActiveStream(){const s=If(this.initialStreamValue,this.microphoneInputLevel*2);return s.getTracks().forEach(r=>r.enabled=!this.isMuted),this.setActiveStream(s),s}async setMicrophone(s){if(!this.getInputDeviceList.find(({deviceId:o})=>o===s)||(this.setSelectedInputDevice(s),Object.keys(this.getActiveCalls).length===0))return;await this.setupStream();const r=Object.values(this.extendedCalls).filter(o=>o.roomId===this.currentActiveRoomId);r.length===1?Object.values(r).forEach(async o=>{const a=this.getActiveStream();o.connection.getSenders()[0].replaceTrack(a.getTracks()[0]),this.updateCall(o)}):await this.doConference(r)}setActiveStream(s){this.activeStream&&this.stopVUMeter("origin"),this.setupVUMeter(s,"origin"),this.activeStreamValue=s,this.context.emit("changeActiveStream",s)}async setSpeaker(s){if(!this.getOutputDeviceList.find(({deviceId:a})=>a===s))return;this.setSelectedOutputDevice(s);const r=Object.values(this.extendedCalls);if(r.length===0)return;const o=r.filter(a=>a.roomId===this.currentActiveRoomId);o.length===1?r.forEach(a=>{var t;(t=a.audioTag)==null||t.setSinkId(s),this.updateCall(a)}):await this.doConference(o)}removeRoom(s){const r={...this.activeRooms},o={...r[s]};delete r[s],this.activeRooms={...r},this.context.emit("removeRoom",{room:o,roomList:this.activeRooms})}deleteRoomIfEmpty(s){s!==void 0&&Object.values(this.extendedCalls).filter(r=>r.roomId===s).length===0&&(this.removeRoom(s),this.currentActiveRoomId===s&&(this.currentActiveRoomId=void 0))}checkInitialized(){if(!this.context.initialized)throw new Error("[OpenSIPSJS] You must call `start` method first!")}muteReconfigure(s){this.muted?s.mute({audio:!0}):s.unmute({audio:!0})}async roomReconfigure(s){var o;if(s===void 0)return;const r=Object.values(this.extendedCalls).filter(a=>a.roomId===s);if(this.currentActiveRoomId===s?r.forEach(a=>{a.audioTag&&(this.muteReconfigure(a),a.audioTag.muted=!1,this.updateCall(a))}):r.forEach(a=>{a.audioTag&&(a.audioTag.muted=!0,this.updateCall(a))}),r.length===0)this.deleteRoomIfEmpty(s);else if(r.length===1&&this.currentActiveRoomId!==s)r[0].isOnHold().local||await this.holdCall(r[0].id,!0);else if(r.length===1&&this.currentActiveRoomId===s){if(r[0].isOnHold().local&&r[0]._automaticHold&&await this.unholdCall(r[0].id),r[0].connection&&((o=r[0].connection)!=null&&o.getSenders()[0])){const a=this.getActiveStream();await r[0].connection.getSenders()[0].replaceTrack(a.getTracks()[0]),this.muteReconfigure(r[0])}}else r.length>1&&await this.doConference(r)}async doConference(s){await bf.forEach(s,async o=>{o._localHold&&await this.unholdCall(o._id)});const r=[];s.forEach(o=>{o!=null&&o.connection.getReceivers().forEach(a=>{r.push(a.track)})}),await bf.forEach(s,async o=>{var n;if(o==null)return;const a=new MediaStream,t=Sn.createMediaStreamDestination();if(o.connection.getReceivers().forEach(p=>{r.forEach(_=>{a.addTrack(p.track),p.track.id!==_.id&&Sn.createMediaStreamSource(new MediaStream([_])).connect(t)})}),s[0].roomId===this.currentActiveRoomId){const p=this.getActiveStream();Sn.createMediaStreamSource(p).connect(t)}(n=o.connection)!=null&&n.getSenders()[0]&&(await o.connection.getSenders()[0].replaceTrack(t.stream.getTracks()[0]),this.muteReconfigure(o))})}processCallerMute(s,r){const o=this.extendedCalls[s];o&&o.connection.getReceivers().length&&(o.localMuted=r,o.connection.getReceivers().forEach(a=>{a.track.enabled=!r}),this.updateCall(o))}muteCaller(s){this.processCallerMute(s,!0)}unmuteCaller(s){this.processCallerMute(s,!1)}terminateCall(s){const r=this.extendedCalls[s];r._status!==8&&r.terminate()}transferCall(s,r){if(r.toString().length===0)return new Error("Target must be passed");const o=this.extendedCalls[s];if(!o._is_confirmed&&!o._is_canceled){const a=`sip:${r}@${this.context.sipDomain}`;o.terminate({status_code:302,reason_phrase:"Moved Temporarily",extraHeaders:[`Contact: ${a}`]});return}this.updateCallStatus({callId:s,isTransferring:!0}),o.refer(`sip:${r}@${this.context.sipDomain}`),this.updateCall(o)}mergeCall(s){const r=Object.values(this.extendedCalls).filter(t=>t.roomId===s);if(r.length!==2)return;const o=r[0],a=r[1];!o||!a||(this.updateCallStatus({callId:o._id,isMerging:!0}),this.updateCallStatus({callId:a._id,isMerging:!0}),o.refer(a.remote_identity.uri.toString(),{replaces:a}),this.updateCall(o))}setDND(s){this.isDNDEnabled=s,this.context.emit("changeIsDND",s)}startCallTimer(s){this.removeTimeInterval(s);const r={callId:s,hours:0,minutes:0,seconds:0,formatted:""};this.setCallTime(r);const o=setInterval(()=>{const a={...this.callTime[s]},t=QT(a);this.setCallTime({callId:s,...t})},1e3);this.setTimeInterval(s,o)}async setActiveRoom(s){const r=this.currentActiveRoomId;s!==r&&(this.currentActiveRoomId=s,await this.roomReconfigure(r),await this.roomReconfigure(s))}getNewRoomId(){const s=Object.keys(this.activeRooms);return s.length===0?1:parseInt(s.sort()[s.length-1])+1}async setupCall(s){var d,g;const r=s.session;if(this.getActiveCalls[r.id]!==void 0)return;const a=this.getNewRoomId(),t={started:new Date,incomingInProgress:!1,roomId:a};r.direction==="incoming"?(this.context.logger.log("New incoming call from",(g=(d=r._remote_identity)==null?void 0:d._uri)==null?void 0:g._user),t.incomingInProgress=!0,this.context.subscribe(Jt.CALL_CONFIRMED,T=>{r.id===T.id&&(this.updateRoom({incomingInProgress:!1,roomId:a}),this.startCallTimer(r.id))}),this.context.subscribe(Jt.CALL_FAILED,T=>{r.id===T.id&&(this.updateRoom({incomingInProgress:!1,roomId:a}),this.deleteRoomIfEmpty(a))})):r.direction==="outgoing"&&(r.once("confirmed",()=>{this.startCallTimer(r.id)}),this.startCallTimer(r.id));const n=r,p=this.hasAutoAnswerHeaders(s),_=n.direction==="incoming"&&!this.hasActiveCalls&&(p||this.autoAnswer);n.roomId=a,n.localMuted=!1,n.autoAnswer=_,_?this.addCall(n,!1):this.addCall(n),this.addCallStatus(r.id),this.addRoom(t),_&&this.answerCall(n._id)}removeCall(s){const r={...this.activeCalls};delete r[s],this.activeCalls={...r};const o={...this.extendedCalls};delete o[s],this.extendedCalls={...o},this.context.emit("changeActiveCalls",this.activeCalls)}activeCallListRemove(s){var a;const r=this.extendedCalls[s._id];this.stopVUMeter("origin"),(a=r.connection)==null||a.getSenders().forEach(t=>{t.track.stop()});const o=r.roomId;this.removeCall(s._id),this.roomReconfigure(o)}async newRTCSessionCallback(s){const r=s.session;if(this.isDND){r.terminate({status_code:486,reason_phrase:"Do Not Disturb"});return}if(this.context.triggerListener({listenerType:Jt.NEW_CALL,session:r,event:s}),r.on("ended",o=>{var t,n,p;this.stopVUMeter(r.id),this.context.logger.log("Session ended for",(n=(t=r._remote_identity)==null?void 0:t._uri)==null?void 0:n._user),this.context.triggerListener({listenerType:Jt.CALL_ENDED,session:r,event:o});const a=this.getActiveCalls[r.id];a&&this.activeCallListRemove(a),this.stopCallTimer(r.id),this.removeCallStatus(r.id),this.removeCallMetrics(r.id),Object.keys(this.extendedCalls).length||(this.setIsMuted(!1),(p=this.initialStreamValue)==null||p.getTracks().forEach(_=>_.stop()),this.initialStreamValue=null)}),r.on("progress",o=>{var a,t;this.context.logger.log("Session in progress for",(t=(a=r._remote_identity)==null?void 0:a._uri)==null?void 0:t._user),this.context.triggerListener({listenerType:Jt.CALL_PROGRESS,session:r,event:o})}),r.on("failed",o=>{var t,n,p;this.stopVUMeter(r.id),this.context.logger.log("Session failed for",(n=(t=r._remote_identity)==null?void 0:t._uri)==null?void 0:n._user),this.context.triggerListener({listenerType:Jt.CALL_FAILED,session:r,event:o}),r.id===this.callAddingInProgress&&(this.callAddingInProgress=void 0);const a=this.getActiveCalls[r.id];a&&this.activeCallListRemove(a),this.stopCallTimer(r.id),this.removeCallStatus(r.id),this.removeCallMetrics(r.id),Object.keys(this.extendedCalls).length||(this.setIsMuted(!1),(p=this.initialStreamValue)==null||p.getTracks().forEach(_=>_.stop()),this.initialStreamValue=null)}),r.on("confirmed",o=>{var a,t;this.context.logger.log("Session confirmed for",(t=(a=r._remote_identity)==null?void 0:a._uri)==null?void 0:t._user),this.context.triggerListener({listenerType:Jt.CALL_CONFIRMED,session:r,event:o}),this.updateCall(r),r.id===this.callAddingInProgress&&(this.callAddingInProgress=void 0)}),await this.setupCall(s),r.direction==="outgoing"){const o=this.getActiveCalls[r.id].roomId;this.setActiveRoom(o)}}setMuteWhenJoin(s){this.muteWhenJoinEnabled=s,this.context.emit("changeMuteWhenJoin",s)}setMicrophoneSensitivity(s){if(s<0||s>1)throw new Error("Value should be in range from 0 to 1!");this.microphoneInputLevelValue=s,this.roomReconfigure(this.currentActiveRoomId)}setSpeakerVolume(s){this.speakerVolumeValue=s,Object.values(this.extendedCalls).forEach(r=>{r.audioTag&&(r.audioTag.volume=s,this.updateCall(r))})}setAutoAnswer(s){this.isAutoAnswer=s}setSelectedInputDevice(s){localStorage.setItem(ao.SELECTED_INPUT_DEVICE,s),this.selectedMediaDevices.input=s,this.context.emit("changeActiveInputMediaDevice",s)}setSelectedOutputDevice(s){localStorage.setItem(ao.SELECTED_OUTPUT_DEVICE,s),this.selectedMediaDevices.output=s,this.context.emit("changeActiveOutputMediaDevice",s)}setCallMetrics(s){const r={...s};delete r.callId,this.callMetrics={...this.callMetrics,[s.callId]:r},this.context.emit("changeCallMetrics",this.callMetrics)}removeCallMetrics(s){const r={...this.callMetrics};delete r[s],this.callMetrics={...r},this.context.emit("changeCallMetrics",this.callMetrics)}getCallQuality(s){const r=new Bv(this.metricConfig),o=r.createProbe(s.connection,{cid:s._id}),a=[];let t;o.onreport=n=>{Object.entries(n.audio).forEach(([d,g])=>{g.direction==="inbound"&&!a.includes(d)&&(a.push(d),t=d)});const p=n.audio[t];if(!p)return;const _=Gv(p,Wv);_.callId=s._id,this.setCallMetrics(_)},this.context.subscribe(Jt.CALL_ENDED,n=>{n._id===s._id&&r.stopAllProbes()}),r.startAllProbes()}setupVUMeter(s,r){this.VUMeter.start(s,r)}stopVUMeter(s){this.VUMeter.stop(s)}async setupStream(){const s=await navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);this.initialStreamValue&&(this.initialStreamValue.getTracks().forEach(r=>r.stop()),this.initialStreamValue=null),this.initialStreamValue=s}async triggerAddStream(s,r){this.setIsMuted(this.muteWhenJoin||this.isMuted),this.initialStreamValue||await this.setupStream();const o=If(this.initialStreamValue,this.microphoneInputLevel*2),a=this.isMuted||this.muteWhenJoin;o.getTracks().forEach(n=>n.enabled=!a),this.setActiveStream(o),await r.connection.getSenders()[0].replaceTrack(o.getTracks()[0]);const t=new MediaStream([s.track]);kT(t,r,this.selectedOutputDevice,this.speakerVolume),this.setupVUMeter(t,r._id),this.getCallQuality(r),this.updateCall(r)}initCall(s,r){if(this.checkInitialized(),s.length===0)return console.error("Target must be a valid string");this.context.logger.log(`Calling sip:${s}@${this.context.sipDomain}...`);const o=this.context.call(`sip:${s}@${this.context.sipDomain}`,this.sipOptions);this.callAddingInProgress=o.id,r&&this.currentActiveRoomId!==void 0&&this.processRoomChange({callId:o.id,roomId:this.currentActiveRoomId}),o.connection.addEventListener("track",a=>{this.triggerAddStream(a,o)})}async processRoomChange({callId:s,roomId:r}){const o=this.extendedCalls[s].roomId;this.extendedCalls[s].roomId=r;const a=this.extendedCalls[s];return this.updateCall(a),await this.setActiveRoom(r),Promise.all([this.roomReconfigure(o),this.roomReconfigure(r)]).then(()=>{this.deleteRoomIfEmpty(o),this.deleteRoomIfEmpty(r)})}}class Jv{constructor(s){this.context=s}get sipOptions(){return{...this.context.options.sipOptions}}initCall(s,r){if(s.length===0)return console.error("Target must be a valid string");this.context.logger.log(`Calling sip:${s}@${this.context.sipDomain}...`),this.context.joinVideoCall(`sip:${s}@${this.context.sipDomain}`,r,this.sipOptions),console.log("video call")}stop(s={}){this.context.terminateJanusSessions(s)}}class Xv{constructor(s){this.activeMessages={},this.extendedMessages={},this.msrpHistory={},this.context=s,this.context.on(this.context.newMSRPSessionEventName,this.newMSRPSessionCallback.bind(this.context))}get isMSRPInitializing(){return this.isMSRPInitializingValue}get getActiveMessages(){return this.activeMessages}msrpAnswer(s){const r=this.extendedMessages[s];this.updateMSRPSession(r)}updateMSRPSession(s){this.activeMessages[s._id]=Rf(s),this.context.emit("changeActiveMessages",this.activeMessages)}addMMSRPSession(s){this.activeMessages={...this.activeMessages,[s._id]:Rf(s)},this.extendedMessages[s._id]=s,this.context.emit("changeActiveMessages",this.activeMessages)}addMSRPMessage(s,r){const o=this.msrpHistory[r.id]||[];o.push(s),this.msrpHistory={...this.msrpHistory,[r.id]:[...o]},this.context.emit("newMSRPMessage",{message:s,session:r})}messageTerminate(s){const r=this.extendedMessages[s];r._status!==8&&r.terminate()}addMessageSession(s){if(!s._id||this.getActiveMessages[s._id]!==void 0)return;const o=s;this.addMMSRPSession(o)}triggerMSRPListener({listenerType:s,session:r,event:o}){const a=this.context.listenersList[s];!a||!a.length||a.forEach(t=>{t(r,o)})}removeMMSRPSession(s){const r={...this.activeMessages};delete r[s],this.activeMessages={...r};const o={...this.extendedMessages};delete o[s],this.extendedMessages={...o},this.context.emit("changeActiveMessages",this.activeMessages)}activeMessageListRemove(s){this.removeMMSRPSession(s._id)}newMSRPSessionCallback(s){const r=s.session;r.on("ended",o=>{this.triggerMSRPListener({listenerType:Jt.CALL_ENDED,session:r,event:o});const a=this.getActiveMessages[r.id];this.activeMessageListRemove(a)}),r.on("failed",o=>{this.triggerMSRPListener({listenerType:Jt.CALL_FAILED,session:r,event:o});const a=this.getActiveMessages[r.id];this.activeMessageListRemove(a)}),r.on("confirmed",o=>{this.triggerMSRPListener({listenerType:Jt.CALL_CONFIRMED,session:r,event:o}),this.updateMSRPSession(r)}),r.on("newMessage",o=>{this.addMSRPMessage(o,r)}),this.addMessageSession(r)}setIsMSRPInitializing(s){this.isMSRPInitializingValue=s,this.context.emit("isMSRPInitializingChanged",s)}initMSRP(s,r,o){if(s.length===0)return console.error("Target must be a valid string");const a=this.context.startMSRP(s,o);a.on("active",()=>{this.addMessageSession(a),a.sendMSRP(r),this.setIsMSRPInitializing(!1)}),this.setIsMSRPInitializing(!0)}sendMSRP(s,r){const o=this.extendedMessages[s];if(!o)throw new Error(`MSRP session with id ${s} doesn't exist!`);o.sendMSRP(r)}}const tu={AUDIO:"audio",VIDEO:"video",MSRP:"msrp"};class Qv extends OT{constructor(s,r){if(!s.modules.length)throw new Error("options.modules should include at least 1 module");const o={...s.configuration,sockets:s.socketInterfaces.map(a=>new XT.WebSocketInterface(a))};super(o),this.initialized=!1,this.logger=console,this.newRTCSessionEventName="newRTCSession",this.registeredEventName="registered",this.unregisteredEventName="unregistered",this.disconnectedEventName="disconnected",this.connectedEventName="connected",this.newMSRPSessionEventName="newMSRPSession",this.isReconnecting=!1,this.audio=null,this.msrp=null,this.video=null,this.listenersList={},this.modules=[],s.pnExtraHeaders&&Object.keys(s.pnExtraHeaders).length&&this.registrator().setExtraContactParams(s.pnExtraHeaders),this.options=s,this.modules=s.modules,r&<(r)&&(this.logger=r)}on(s,r){return super.on(s,r)}off(s,r){return super.off(s,r)}emit(s,r){return super.emit(s,r)}get sipDomain(){return this.options.sipDomain}begin(){if(this.isConnected()){console.error("Connection is already established");return}return this.modules.includes(tu.AUDIO)&&(this.audio=new zv(this)),this.modules.includes(tu.MSRP)&&(this.msrp=new Xv(this)),this.modules.includes(tu.VIDEO)&&(this.video=new Jv(this)),this.on(this.registeredEventName,()=>{this.logger.log("Successfully registered to",this.options.socketInterfaces[0]),this.setInitialized(!0)}),this.on(this.unregisteredEventName,()=>{this.logger.log("Unregistered from",this.options.socketInterfaces[0]),this.setInitialized(!1)}),this.on(this.connectedEventName,()=>{this.logger.log("Connected to",this.options.socketInterfaces[0]),this.isReconnecting=!1}),this.on(this.disconnectedEventName,()=>{this.isReconnecting||(this.logger.log("Disconnected from",this.options.socketInterfaces[0]),this.logger.log("Reconnecting to",this.options.socketInterfaces[0]),this.isReconnecting=!0,this.stop(),this.setInitialized(!1),setTimeout(this.start.bind(this),5e3))}),this.logger.log("Connecting to",this.options.socketInterfaces[0]),this.start(),this}subscribe(s,r){const a=!this.listenersList[s]||!this.listenersList[s].length?[r]:[...this.listenersList[s],r];this.listenersList={...this.listenersList,[s]:a}}removeIListener(s){const r={...this.listenersList};delete r[s],this.listenersList={...r}}triggerListener({listenerType:s,session:r,event:o}){const a=this.listenersList[s];!a||!a.length||a.forEach(t=>{t(r,o)})}setInitialized(s){this.initialized=s,this.emit("ready",s)}}module.exports=Qv;
|